pax_global_header00006660000000000000000000000064144667543750014537gustar00rootroot0000000000000052 comment=f86e0df198d6ee53421e9c1dadc46dc805f53370 pydicom-2.4.3/000077500000000000000000000000001446675437500132115ustar00rootroot00000000000000pydicom-2.4.3/.circleci/000077500000000000000000000000001446675437500150445ustar00rootroot00000000000000pydicom-2.4.3/.circleci/config.yml000066400000000000000000000011141446675437500170310ustar00rootroot00000000000000version: 2 jobs: build: docker: - image: python:3.8 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" - deploy: name: Deploy documentation environment: USERNAME: darcymason EMAIL: darcymason@gmail.com command: ./build_tools/circle/push_doc.sh pydicom-2.4.3/.codespellrc000066400000000000000000000001621446675437500155100ustar00rootroot00000000000000[codespell] skip = _private_dict.py,_concepts_dict.py,test1.json ignore-words = .github/codespell_ignore_words.txtpydicom-2.4.3/.coveragerc000066400000000000000000000000721446675437500153310ustar00rootroot00000000000000[run] omit = pydicom/tests/* pydicom/benchmarks/* pydicom-2.4.3/.github/000077500000000000000000000000001446675437500145515ustar00rootroot00000000000000pydicom-2.4.3/.github/FUNDING.yml000066400000000000000000000000221446675437500163600ustar00rootroot00000000000000github: darcymasonpydicom-2.4.3/.github/ISSUE_TEMPLATE/000077500000000000000000000000001446675437500167345ustar00rootroot00000000000000pydicom-2.4.3/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000012461446675437500214310ustar00rootroot00000000000000--- 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-2.4.3/.github/ISSUE_TEMPLATE/documentation.md000066400000000000000000000006031446675437500221260ustar00rootroot00000000000000--- 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-2.4.3/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000010071446675437500224570ustar00rootroot00000000000000--- 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-2.4.3/.github/ISSUE_TEMPLATE/other_issues.md000066400000000000000000000003031446675437500217660ustar00rootroot00000000000000--- 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-2.4.3/.github/ISSUE_TEMPLATE/pixel_issue.md000066400000000000000000000025661446675437500216200ustar00rootroot00000000000000--- 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-2.4.3/.github/PULL_REQUEST_TEMPLATE.md000066400000000000000000000011621446675437500203520ustar00rootroot00000000000000 #### 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-2.4.3/.github/codespell_ignore_words.txt000066400000000000000000000000231446675437500220400ustar00rootroot00000000000000ba complies ot siz pydicom-2.4.3/.github/workflows/000077500000000000000000000000001446675437500166065ustar00rootroot00000000000000pydicom-2.4.3/.github/workflows/merge-pytest.yml000066400000000000000000000064271446675437500217670ustar00rootroot00000000000000name: unit-tests on: push: branches: - master jobs: test-all: runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] python-version: ['3.7', '3.8', '3.9', '3.10', '3.11'] include: - os: ubuntu-latest python-version: '3.10' send-coverage: true pytest-args: --cov=pydicom --cov-append steps: - uses: actions/checkout@v3 with: fetch-depth: 2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Get pip cache dir id: pip-cache run: | python -m pip install --upgrade pip echo "::set-output name=dir::$(pip cache dir)" - name: pip cache uses: actions/cache@v3 with: path: ${{ steps.pip-cache.outputs.dir }} key: py${{ matrix.python-version }}-${{ matrix.os }}-pip - name: Cache pydicom test data id: cache-testdata uses: actions/cache@v3 with: path: ${{ env.HOME }}/.pydicom key: pydicom-testdata - name: Initial test environment setup run: | python -m pip install --editable . python -m pip install --upgrade wheel pytest pytest-cov # Core library tests - name: Test core library run: | pytest ${{ matrix.pytest-args }} - name: Test external sources using pydicom-data run: | python -m pip install git+https://github.com/pydicom/pydicom-data pytest ${{ matrix.pytest-args}} pydicom/tests/test_data_manager.py # Pixel data tests - name: Install and test with numpy run: | python -m pip install --upgrade numpy pytest ${{ matrix.pytest-args }} - name: Install and test Pillow run: | python -m pip install --upgrade pillow pytest ${{ matrix.pytest-args }} pydicom/tests/test_pillow_pixel_data.py python -m pip uninstall -y pillow - name: Install and test jpeg_ls run: | python -m pip install pyjpegls pytest ${{ matrix.pytest-args }} pydicom/tests/test_jpeg_ls_pixel_data.py pydicom/tests/test_JPEG_LS_transfer_syntax.py python -m pip uninstall -y pyjpegls - name: Install and test GDCM run: | python -m pip install python-gdcm python -c 'import gdcm; print(gdcm.GDCM_VERSION)' pytest ${{ matrix.pytest-args }} pydicom/tests/test_gdcm_pixel_data.py pytest ${{ matrix.pytest-args }} pydicom/tests/test_encoders_gdcm.py python -m pip uninstall -y python-gdcm - name: Install and test pylibjpeg run: | python -m pip install pylibjpeg python -m pip uninstall -y pylibjpeg-openjpeg pylibjpeg-rle pytest ${{ matrix.pytest-args }} pydicom/tests/test_pylibjpeg.py python -m pip install pylibjpeg-openjpeg pylibjpeg-libjpeg pylibjpeg-rle pytest ${{ matrix.pytest-args }} pydicom/tests/test_pylibjpeg.py - name: Test all pixel handling run: | python -m pip install pillow python-gdcm pyjpegls pytest ${{ matrix.pytest-args }} - name: Send coverage results if: ${{ success() && matrix.send-coverage }} uses: codecov/codecov-action@v3 pydicom-2.4.3/.github/workflows/merge-typing.yml000066400000000000000000000013471446675437500217450ustar00rootroot00000000000000name: type-hints on: push: branches: [ master ] jobs: check-typing: runs-on: ubuntu-latest timeout-minutes: 30 strategy: fail-fast: false matrix: python-version: [ '3.7', '3.8', '3.9', '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==0.971 python -m pip install --upgrade types-requests types-pkg_resources types-setuptools - name: Run typing check with mypy run: | mypy pydicom-2.4.3/.github/workflows/pr-pytest.yml000066400000000000000000000125751446675437500213120ustar00rootroot00000000000000name: pr-unit-tests on: pull_request: branches: [ master ] jobs: test-pypy: runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest] python-version: [pypy-3.7] steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Initial test environment setup run: | python -m pip install --editable . python -m pip install --upgrade wheel pytest - name: Test with no external libraries run: | pytest - name: Install and test with numpy run: | python -m pip install --upgrade numpy pytest test-core-only: runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] python-version: ['3.7', '3.8', '3.9', '3.10', '3.11'] include: - os: 'ubuntu-latest' pytest-args: --cov=pydicom --cov-append send-coverage: true steps: - uses: actions/checkout@v3 with: fetch-depth: 2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Get pip cache dir id: pip-cache run: | python -m pip install --upgrade pip echo "::set-output name=dir::$(pip cache dir)" - name: pip cache uses: actions/cache@v3 with: path: ${{ steps.pip-cache.outputs.dir }} key: py${{ matrix.python-version }}-${{ matrix.os }}-pip - name: Cache pydicom test data id: cache-testdata uses: actions/cache@v3 with: path: ${{ env.HOME }}/.pydicom key: pydicom-testdata - name: Initial test environment setup run: | python -m pip install --editable . python -m pip install wheel pytest pytest-cov - name: Test core library run: | pytest ${{ matrix.pytest-args }} - name: Send coverage results if: ${{ success() && matrix.send-coverage }} uses: codecov/codecov-action@v3 test-core-extras: runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] python-version: ['3.11'] include: - os: 'ubuntu-latest' send-coverage: true pytest-args: --cov=pydicom --cov-append steps: - uses: actions/checkout@v3 with: fetch-depth: 2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Get pip cache dir id: pip-cache run: | python -m pip install --upgrade pip echo "::set-output name=dir::$(pip cache dir)" - name: pip cache uses: actions/cache@v3 with: path: ${{ steps.pip-cache.outputs.dir }} key: py${{ matrix.python-version }}-${{ matrix.os }}-pip - name: Cache pydicom test data id: cache-testdata uses: actions/cache@v3 with: path: ${{ env.HOME }}/.pydicom key: pydicom-testdata - name: Initial test environment setup run: | python -m pip install --editable . python -m pip install wheel pytest pytest-cov # Core library tests - name: Test core library run: | pytest ${{ matrix.pytest-args }} - name: Test external sources using pydicom-data run: | python -m pip install git+https://github.com/pydicom/pydicom-data pytest ${{ matrix.pytest-args}} pydicom/tests/test_data_manager.py # Pixel data decoding and encoding - name: Install and test with numpy run: | python -m pip install --upgrade numpy pytest ${{ matrix.pytest-args }} - name: Install and test Pillow run: | python -m pip install --upgrade pillow pytest ${{ matrix.pytest-args }} pydicom/tests/test_pillow_pixel_data.py python -m pip uninstall -y pillow - name: Install and test jpeg_ls run: | python -m pip install pyjpegls pytest ${{ matrix.pytest-args }} pydicom/tests/test_JPEG_LS_transfer_syntax.py pydicom/tests/test_jpeg_ls_pixel_data.py python -m pip uninstall -y pyjpegls - name: Install and test GDCM run: | python -m pip install --upgrade python-gdcm python -c 'import gdcm; print(gdcm.GDCM_VERSION)' pytest ${{ matrix.pytest-args }} pydicom/tests/test_gdcm_pixel_data.py pytest ${{ matrix.pytest-args }} pydicom/tests/test_encoders_gdcm.py python -m pip uninstall -y python-gdcm - name: Install and test pylibjpeg run: | python -m pip install --upgrade pylibjpeg python -m pip uninstall -y pylibjpeg-openjpeg pylibjpeg-rle pytest ${{ matrix.pytest-args }} pydicom/tests/test_pylibjpeg.py python -m pip install --upgrade pylibjpeg-openjpeg pylibjpeg-libjpeg pylibjpeg-rle pytest ${{ matrix.pytest-args }} pydicom/tests/test_pylibjpeg.py - name: Test all pixel handling run: | python -m pip install --upgrade pillow python-gdcm pyjpegls pytest ${{ matrix.pytest-args }} - name: Send coverage results if: ${{ success() && matrix.send-coverage }} uses: codecov/codecov-action@v3 pydicom-2.4.3/.github/workflows/pr-run-linters.yml000066400000000000000000000005501446675437500222320ustar00rootroot00000000000000name: Linter on: pull_request jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - run: pip install --user ruff - run: ruff --format=github . - name: black uses: reviewdog/action-black@v2 with: github_token: ${{ secrets.GITHUB_TOKEN }} level: warning filter_mode: diff_context pydicom-2.4.3/.github/workflows/pr-type-spell.yml000066400000000000000000000016241446675437500220510ustar00rootroot00000000000000name: pr-type-lint-spell on: pull_request: branches: [ master ] jobs: check-typing: runs-on: ubuntu-latest timeout-minutes: 30 strategy: fail-fast: false matrix: python-version: [ '3.7', '3.10' ] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - name: Install typing dependencies run: | python -m pip install --upgrade pip python -m pip install mypy==0.971 python -m pip install -U types-requests types-pkg_resources types-setuptools - name: Run typing check with mypy run: | mypy check-spelling: name: Check for spelling errors runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: codespell-project/actions-codespell@master pydicom-2.4.3/.github/workflows/publish-pypi-deploy.yml000066400000000000000000000023041446675437500232470ustar00rootroot00000000000000name: publish-pypi-deploy on: release: types: [ published ] workflow_dispatch: jobs: deploy: runs-on: ubuntu-latest strategy: fail-fast: true matrix: python-version: [ '3.10' ] environment: name: testpypi # pypi url: https://test.pypi.org/legacy/ # 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-2.4.3/.gitignore000066400000000000000000000013121446675437500151760ustar00rootroot00000000000000# .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-2.4.3/.lgtm.yml000066400000000000000000000003051446675437500147530ustar00rootroot00000000000000--- queries: # https://lgtm.com/rules/1510014536001/ - exclude: py/clear-text-logging-sensitive-data # https://lgtm.com/rules/1510006386081/ - exclude: py/clear-text-storage-sensitive-data pydicom-2.4.3/.pep8speaks.yml000066400000000000000000000000761446675437500161000ustar00rootroot00000000000000pycodestyle: max-line-length: 79 # Default is 79 in PEP8 pydicom-2.4.3/CONTRIBUTING.md000066400000000000000000000217331446675437500154500ustar00rootroot00000000000000 Contributing to pydicom ======================= This is the guide for contributing code, documentation and tests, and for 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. _Note:_ If you want to contribute new functionality, you may first consider if this functionality belongs to the pydicom core, or is better suited for [contrib-pydicom](https://github.com/pydicom/contrib-pydicom). contrib-pydicom collects some convenient functionality that uses pydicom, but doesn't belong to the pydicom core. If you're not sure where your contribution belongs, create an issue where you can discuss this before creating a pull request. 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 git@github.com:YourLogin/pydicom.git $ cd pydicom ``` 3. 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 ``master`` branch! 4. 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 ``` 5. 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 ``` 6. To record your changes in Git, push the changes to your GitHub account with: ```bash $ git push -u origin my-feature ``` 7. 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 [Google style](https://github.com/google/styleguide/blob/gh-pages/pyguide.md#38-comments-and-docstrings) 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: - Code with good unittest **coverage** (current coverage or better), check with: ```bash $ pip install pytest pytest-cov $ py.test --cov=pydicom path/to/test_for_package ``` - No pyflakes warnings, check with: ```bash $ pip install pyflakes $ pyflakes path/to/module.py ``` - No PEP8 warnings, check with: ```bash $ pip install pycodestyle # formerly called pep8 $ pycodestyle path/to/module.py ``` - AutoPEP8 can help you fix some of the easy redundant errors: ```bash $ pip install autopep8 $ autopep8 path/to/pep8.py ``` Filing bugs ----------- 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. If you're using **pydicom 2 or later**, please use the `pydicom_env_info` module to gather this information : ```bash $ python -m pydicom.env_info ``` For **pydicom 1.x**, please run the following code snippet instead. ```python import platform, sys, pydicom print(platform.platform(), "\nPython", sys.version, "\npydicom", pydicom.__version__) ``` - please include a [reproducible](http://stackoverflow.com/help/mcve) code snippet or link to a [gist](https://gist.github.com). If an exception is raised, please provide the 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. For building the documentation, you will need [sphinx](https://www.sphinx-doc.org/), [numpy](http://numpy.org/), [matplotlib](http://matplotlib.org/), and [pillow](http://pillow.readthedocs.io/en/latest/). 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-2.4.3/LICENSE000066400000000000000000000061741446675437500142260ustar00rootroot00000000000000License 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 Module: http://gdcm.sourceforge.net/Copyright.html Copyright (c) 2006-2010 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-2.4.3/MANIFEST.in000066400000000000000000000002431446675437500147460ustar00rootroot00000000000000 recursive-include doc * recursive-include examples * recursive-include pydicom/data * include pydicom/* include CONTRIBUTING.md include LICENSE include README.md pydicom-2.4.3/Makefile000066400000000000000000000012541446675437500146530ustar00rootroot00000000000000# 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-2.4.3/README.md000066400000000000000000000136471446675437500145030ustar00rootroot00000000000000[![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/master.svg?style=shield)](https://circleci.com/gh/pydicom/pydicom/tree/master) [![test-coverage](https://codecov.io/gh/pydicom/pydicom/branch/master/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.6394735.svg)](https://doi.org/10.5281/zenodo.6394735) # *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](http://www.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/old/pydicom_user_guide.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](http://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) ``` ### Compressed *Pixel Data* #### JPEG, JPEG-LS and JPEG 2000 Converting JPEG 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/old/image_data_handlers.html#guide-compressed). Compressing data into one of the JPEG formats is not currently supported. #### RLE Encoding and decoding 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/old/image_data_compression.html) to speed up the process. ## 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](http://www.numpy.org) and [matplotlib](https://matplotlib.org/) ```python import matplotlib.pyplot as plt from pydicom import dcmread from pydicom.data import get_testdata_file # The path to a pydicom test dataset path = get_testdata_file("CT_small.dcm") 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/master/CONTRIBUTING.md). If you have examples or extensions of *pydicom* that don't belong with the core software, but that you deem useful to others, you can add them to our contribution repository: [contrib-pydicom](https://www.github.com/pydicom/contrib-pydicom). pydicom-2.4.3/asv.conf.json000066400000000000000000000046701446675437500156300ustar00rootroot00000000000000{ "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 "master" // (for git) or "default" (for mercurial). "branches": ["nested-seq-speed", "master"], "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-2.4.3/benchmarks/000077500000000000000000000000001446675437500153265ustar00rootroot00000000000000pydicom-2.4.3/benchmarks/__init__.py000066400000000000000000000000001446675437500174250ustar00rootroot00000000000000pydicom-2.4.3/benchmarks/bench_encaps.py000066400000000000000000000056221446675437500203150ustar00rootroot00000000000000# 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-2.4.3/benchmarks/bench_handler_numpy.py000066400000000000000000000174071446675437500217150ustar00rootroot00000000000000# 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='uint{}'.format(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-2.4.3/benchmarks/bench_nested_seq.py000066400000000000000000000056551446675437500212040ustar00rootroot00000000000000from 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-2.4.3/benchmarks/bench_pixel_util.py000066400000000000000000000040401446675437500212130ustar00rootroot00000000000000# 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-2.4.3/benchmarks/bench_rle_decode.py000066400000000000000000000101001446675437500211140ustar00rootroot00000000000000# 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-2.4.3/benchmarks/bench_rle_encode.py000066400000000000000000000063561446675437500211500ustar00rootroot00000000000000# 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-2.4.3/build_tools/000077500000000000000000000000001446675437500155305ustar00rootroot00000000000000pydicom-2.4.3/build_tools/circle/000077500000000000000000000000001446675437500167715ustar00rootroot00000000000000pydicom-2.4.3/build_tools/circle/build_doc.sh000077500000000000000000000057511446675437500212640ustar00rootroot00000000000000#!/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 master 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/master...$CIRCLE_SHA1" git fetch origin master >&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" =~ ^master$|^[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-2.4.3/build_tools/circle/push_doc.sh000077500000000000000000000067001446675437500211370ustar00rootroot00000000000000#!/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 'master' 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" = "master" ] then # build of current master 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-2.4.3/build_tools/sphinx/000077500000000000000000000000001446675437500170415ustar00rootroot00000000000000pydicom-2.4.3/build_tools/sphinx/github_link.py000066400000000000000000000053731446675437500217220ustar00rootroot00000000000000from 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 type(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 as exc: # 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-2.4.3/dicom.py000066400000000000000000000007221446675437500146570ustar00rootroot00000000000000msg = """ Pydicom via 'import dicom' has been removed in pydicom version 1.0. Please install the `dicom` package to restore function of code relying on pydicom 0.9.9 or earlier. E.g. `pip install dicom`. Alternatively, most code can easily be converted to pydicom > 1.0 by changing import lines from 'import dicom' to 'import pydicom'. See the Transition Guide at https://pydicom.github.io/pydicom/stable/old/transition_to_pydicom1.html. """ raise ImportError(msg) pydicom-2.4.3/doc/000077500000000000000000000000001446675437500137565ustar00rootroot00000000000000pydicom-2.4.3/doc/Makefile000066400000000000000000000157611446675437500154300ustar00rootroot00000000000000# 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 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-2.4.3/doc/README.md000066400000000000000000000022711446675437500152370ustar00rootroot00000000000000# 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-2.4.3/doc/_static/000077500000000000000000000000001446675437500154045ustar00rootroot00000000000000pydicom-2.4.3/doc/_static/css/000077500000000000000000000000001446675437500161745ustar00rootroot00000000000000pydicom-2.4.3/doc/_static/css/pydicom.css000066400000000000000000000033271446675437500203570ustar00rootroot00000000000000@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-2.4.3/doc/_templates/000077500000000000000000000000001446675437500161135ustar00rootroot00000000000000pydicom-2.4.3/doc/_templates/class.rst000066400000000000000000000004421446675437500177520ustar00rootroot00000000000000:mod:`{{module}}`.{{objname}} {{ underline }}============== .. currentmodule:: {{ module }} .. autoclass:: {{ objname }} {% block methods %} .. automethod:: __init__ {% endblock %} .. include:: {{module}}.{{objname}}.examples .. raw:: html
pydicom-2.4.3/doc/_templates/function.rst000066400000000000000000000003451446675437500204740ustar00rootroot00000000000000:mod:`{{module}}`.{{objname}} {{ underline }}==================== .. currentmodule:: {{ module }} .. autofunction:: {{ objname }} .. include:: {{module}}.{{objname}}.examples .. raw:: html
pydicom-2.4.3/doc/assets/000077500000000000000000000000001446675437500152605ustar00rootroot00000000000000pydicom-2.4.3/doc/assets/img/000077500000000000000000000000001446675437500160345ustar00rootroot00000000000000pydicom-2.4.3/doc/assets/img/favicon.ico000066400000000000000000000021761446675437500201630ustar00rootroot00000000000000 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-2.4.3/doc/assets/img/logo.png000066400000000000000000000130751446675437500175100ustar00rootroot00000000000000PNG  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-2.4.3/doc/assets/img/pydicom_flat_black.png000066400000000000000000001010031446675437500223430ustar00rootroot00000000000000PNG  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-2.4.3/doc/assets/img/pydicom_flat_black.svg000066400000000000000000000276151446675437500223760ustar00rootroot00000000000000 image/svg+xml pydicom-2.4.3/doc/assets/img/pydicom_flat_black_alpha.png000066400000000000000000000710311446675437500235170ustar00rootroot00000000000000PNG  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-2.4.3/doc/conf.py000066400000000000000000000244411446675437500152620ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # 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 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')) # noqa 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', # Custom 'sphinx_copybutton', ] autosummary_generate = True autodoc_default_options = { 'members': None, 'no-inherited-members': None, } # 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': ('https://docs.python.org/{.major}'.format( sys.version_info), None), 'numpy': ('https://docs.scipy.org/doc/numpy/', None), 'scipy': ('https://docs.scipy.org/doc/scipy/reference', None), 'matplotlib': ('http://matplotlib.org', 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 master 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", "%s.examples" % name) 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 = {'http://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}' # noqa ) 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-2.4.3/doc/faq/000077500000000000000000000000001446675437500145255ustar00rootroot00000000000000pydicom-2.4.3/doc/faq/index.rst000066400000000000000000000062761446675437500164010ustar00rootroot00000000000000.. _faq: ========================== Frequently asked questions ========================== .. _faq_general: General ======= What happened to import dicom? ------------------------------ Starting in version 1.0, *pydicom* changed the library import from ``import dicom`` to ``import pydicom``. If you're used to using the earlier versions of *pydicom* see the :doc:`transitioning guide <../old/transition_to_pydicom1>` on how to make the change. 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 JPEG 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 | ~September 2022 | 3.7, 3.8, 3.9, 3.10, 3.11 | +-----------------+------------------+---------------------------+ What about support for Python 2.7? ---------------------------------- Python 2.7 reached `end of life `_ on 1st January, 2020 and is no longer supported by *pydicom*. More information is available :doc:`here`. pydicom-2.4.3/doc/guides/000077500000000000000000000000001446675437500152365ustar00rootroot00000000000000pydicom-2.4.3/doc/guides/cli/000077500000000000000000000000001446675437500160055ustar00rootroot00000000000000pydicom-2.4.3/doc/guides/cli/cli_codify.rst000066400000000000000000000116271446675437500206520ustar00rootroot00000000000000 ``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-2.4.3/doc/guides/cli/cli_dev.rst000066400000000000000000000055061446675437500201520ustar00rootroot00000000000000 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-2.4.3/doc/guides/cli/cli_guide.rst000066400000000000000000000006321446675437500204640ustar00rootroot00000000000000: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-2.4.3/doc/guides/cli/cli_intro.rst000066400000000000000000000170611446675437500205260ustar00rootroot00000000000000 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-2.4.3/doc/guides/cli/cli_show.rst000066400000000000000000000133341446675437500203520ustar00rootroot00000000000000 ``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-2.4.3/doc/guides/element_value_types.rst000066400000000000000000000262411446675437500220460ustar00rootroot00000000000000============================ 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` | Union[None, T, | | | Entity | | | MutableSequence[T]] | +----+------------------+-----------------+-----------------------------------+ | | AS | Age String | :class:`str` | :class:`str` | | +----+------------------+-----------------+-----------------------------------+ | | AT | Attribute Tag | Tag | :class:`~tag.BaseTag` | | | | | :sup:`1` | | | +----+------------------+-----------------+-----------------------------------+ | | 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 | :class:`float` | :class:`float` | | | | 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` | Optional[T] | +----+------------------+-----------------+-----------------------------------+ | | OB | Other Byte | :class:`bytes` | :class:`bytes` | | +----+------------------+-----------------+-----------------------------------+ | | OD | Other Double | :class:`bytes` | :class:`bytes` | | +----+------------------+-----------------+-----------------------------------+ | | OF | Other Float | :class:`bytes` | :class:`bytes` | | +----+------------------+-----------------+-----------------------------------+ | | OL | Other Long | :class:`bytes` | :class:`bytes` | | +----+------------------+-----------------+-----------------------------------+ | | OV | Other 64-bit | :class:`bytes` | :class:`bytes` | | | | Very Long | | | | +----+------------------+-----------------+-----------------------------------+ | | OW | Other Word | :class:`bytes` | :class:`bytes` | | +----+------------------+-----------------+-----------------------------------+-----------------------------+ | PN | Person Name | :class:`str` | :class:`~valuerep.PersonName` | Union[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` | Union[None, T, | | | | | | MutableSequence[T]] | +----+------------------+-----------------+-----------------------------------+-----------------------------+ | ST | Short Text | :class:`str` | :class:`str` | Optional[T] | +----+------------------+-----------------+-----------------------------------+-----------------------------+ | SV | Signed 64-bit | :class:`int` | :class:`int` | Union[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` | Optional[T] | +----+------------------+-----------------+-----------------------------------+ | | UR | URI/URL | :class:`str` | :class:`str` | | +----+------------------+-----------------+-----------------------------------+-----------------------------+ | US | Unsigned Short | :class:`int` | :class:`int` | Union[None, T, | | | | | | MutableSequence[T]] | +----+------------------+-----------------+-----------------------------------+-----------------------------+ | UT | Unlimited Text | :class:`str` | :class:`str` | Optional[T] | +----+------------------+-----------------+-----------------------------------+-----------------------------+ | UV | Unsigned 64-bit | :class:`int` | :class:`int` | Union[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``) pydicom-2.4.3/doc/guides/encoding/000077500000000000000000000000001446675437500170245ustar00rootroot00000000000000pydicom-2.4.3/doc/guides/encoding/encoder_plugin_options.rst000066400000000000000000000036141446675437500243320ustar00rootroot00000000000000.. _guide_encoder_plugin_opts: ======================= Encoder Plugins Options ======================= .. currentmodule:: pydicom.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:`RLELosslessEncoder`| ``'byteorder'`` | ``'<'``, ``'>'`` | The byte order of `src` may | | | | | be little- or big-endian | +--------------------------+-----------------+------------------+-----------------------------+ pydicom-2.4.3/doc/guides/encoding/encoder_plugins.rst000066400000000000000000000120211446675437500227320ustar00rootroot00000000000000.. _guide_encoder_plugins: ========================== Pixel Data Encoder Plugins ========================== *Pixel Data* encoding in *pydicom* uses an :class:`~pydicom.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, **kwargs: Any) -> bytes: 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. * `kwargs` is a :class:`dict` which at a minimum contains the following required keys: * ``'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'`` `kwargs` may also contain optional parameters intended to be used with the encoder function to allow customization of the encoding process or to provide additional functionality. Support for these optional parameters is not required, however. 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`. * 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.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.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-2.4.3/doc/guides/encoding/index.rst000066400000000000000000000004161446675437500206660ustar00rootroot00000000000000 =================== Pixel Data Encoding =================== *Transfer Syntax UID* specific encoding information: .. toctree:: :maxdepth: 1 rle_lossless Encoding plugin information: .. toctree:: :maxdepth: 1 encoder_plugin_options encoder_plugins pydicom-2.4.3/doc/guides/encoding/rle_lossless.rst000066400000000000000000000161631446675437500222760ustar00rootroot00000000000000 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 *RLE Lossless* encoding. 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.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.data import get_testdata_file >>> from pydicom.uid import RLELossless >>> ds = get_testdata_file("CT_small.dcm", read=True) >>> ds.SamplesPerPixel 1 >>> ds.PhotometricInterpretation 'MONOCHROME2' >>> ds.BitsAllocated 16 >>> ds.PixelRepresentation 1 >>> ds.compress(RLELossless) Compressing RGB pixel data in-place: .. code-block:: python >>> ds = get_testdata_file("US1_UNCR.dcm", read=True) >>> 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.pixel_data_handlers import convert_color_space >>> from pydicom.uid import generate_uid >>> ds = get_testdata_file("US1_UNCR.dcm", read=True) >>> 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-2.4.3/doc/guides/glossary.rst000066400000000000000000000122431446675437500176350ustar00rootroot00000000000000 ======== Glossary ======== .. _glossary_image_pixel: :dcm:`Image Pixel Module` =================================================== **(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 `. **(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 multiple component transformation. 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 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`. **(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`` **(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. **(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) **(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 **(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-2.4.3/doc/guides/index.rst000066400000000000000000000003651446675437500171030ustar00rootroot00000000000000:orphan: ====== Guides ====== These guides contain higher-level information for those already familiar with pydicom: .. toctree:: :maxdepth: 1 element_value_types encoding/index cli/cli_guide glossary writing_documentation pydicom-2.4.3/doc/guides/writing_documentation.rst000066400000000000000000000076361446675437500224200ustar00rootroot00000000000000: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-2.4.3/doc/index.rst000066400000000000000000000033161446675437500156220ustar00rootroot00000000000000 ===================== pydicom documentation ===================== .. toctree:: :maxdepth: 2 :hidden: :caption: Getting started tutorials/installation old/getting_started .. toctree:: :maxdepth: 2 :hidden: :caption: Documentation old/pydicom_user_guide old/ref_guide 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:`Introduction to pydicom` | :doc:`What Python types do I use for each VR` * **Basics**: :doc:`Read, access, modify, write` * **Intermediate**: :doc:`Compressing Pixel Data ` | :doc:`Waveform decoding and encoding ` | :doc:`DICOM File-sets and DICOMDIR` :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-2.4.3/doc/make.bat000066400000000000000000000060011446675437500153600ustar00rootroot00000000000000@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-2.4.3/doc/old/000077500000000000000000000000001446675437500145345ustar00rootroot00000000000000pydicom-2.4.3/doc/old/base_element.rst000066400000000000000000000255111446675437500177150ustar00rootroot00000000000000Core elements in pydicom ======================== .. rubric:: pydicom object model, description of classes, examples Dataset ------- .. currentmodule:: pydicom :class:`~dataset.Dataset` is the main object you will work with directly. :class:`~dataset.Dataset` wraps a dictionary, where the key is the DICOM tag (as a :class:`~pydicom.tag.BaseTag` object, described below), and the value is the corresponding :class:`~dataelem.DataElement` instance (also described below). It implements most of the methods of :class:`dict`, so that it mostly behaves like a wrapped :class:`dict`. This allows direct access to the data elements via their tags, as shown below. .. 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` could be created directly, but you will usually get one by reading an existing DICOM file:: >>> import pydicom >>> from pydicom.data import get_testdata_file >>> # get some test data >>> filename = get_testdata_file("rtplan.dcm") >>> ds = pydicom.dcmread(filename) You can display the entire dataset by simply printing its string (:class:`str()` or :func:`repr`) value:: >>> 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' ... .. note:: You can also view DICOM files in a collapsible tree using the example program :gh:`dcm_qt_tree.py `. You can access specific elements by their DICOM keyword or tag number:: >>> ds.PatientName 'Last^First^mid^pre' >>> ds[0x10,0x10].value 'Last^First^mid^pre' When using the tag number 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 names 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` (wraps 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(filename) >>> 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:: >>> # read data with actual pixel data >>> filename = get_testdata_file("CT_small.dcm") >>> ds = pydicom.dcmread(filename) >>> 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 is 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-2.4.3/doc/old/best_practices.rst000066400000000000000000000107671446675437500202730ustar00rootroot00000000000000.. _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 `~pydicom.config.IGNORE`, `~pydicom.config.WARN` and `~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` 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-2.4.3/doc/old/getting_started.rst000066400000000000000000000054461446675437500204660ustar00rootroot00000000000000.. _getting_started: ======================= Introduction to pydicom ======================= .. rubric:: Brief overview of pydicom. Introduction ============ *pydicom* is a pure Python package for working with `DICOM `_ files such as medical images, reports, and radiotherapy objects. *pydicom* makes it easy to read these complex files into natural pythonic structures for easy manipulation. Modified datasets can be written again to DICOM format files. Here is a simple example of using *pydicom* in an interactive session, to read a radiotherapy plan file, change the patient setup from head-first-supine to head-first-prone, and save to a new file:: >>> import pydicom >>> from pydicom.data import get_testdata_file >>> filename = get_testdata_file("rtplan.dcm") >>> ds = pydicom.dcmread(filename) # plan dataset >>> ds.PatientName 'Last^First^mid^pre' >>> ds.dir("setup") # get a list of tags with "setup" somewhere in the name ['PatientSetupSequence'] >>> ds.PatientSetupSequence[0] (0018, 5100) Patient Position CS: 'HFS' (300a, 0182) Patient Setup Number IS: '1' (300a, 01b2) Setup Technique Description ST: '' >>> ds.PatientSetupSequence[0].PatientPosition = "HFP" >>> ds.save_as("rtplan2.dcm") .. >>> os.remove("rtplan2.dcm") *pydicom* is not a DICOM server (see :gh:`pynetdicom ` instead), and is not primarily about viewing images. It is designed to let you manipulate data elements in DICOM files with Python code. *pydicom* is easy to install and use, and because it is a pure Python package, it should run wherever Python runs. One limitation is that compressed pixel data (e.g. JPEG) can only be altered in an intelligent way if :doc:`decompressing ` it first. Once decompressed, it can be altered and written back to a DICOM file the same way as initially uncompressed data. License ======= *pydicom* has an MIT-based :gh:`license `. Installing ========== See the :doc:`installation guide<../tutorials/installation>`. Using pydicom ============= Once installed, the package can be imported at a Python command line or used in your own Python program with ``import pydicom``. See the :gh:`examples directory ` for both kinds of uses. Also see the :doc:`User Guide ` for more details of how to use the package. Support ======= Please join the `pydicom discussion group `_ to ask questions or give feedback. Bugs can be submitted through the :gh:`issue tracker `. New versions, major bug fixes, etc. will also be announced through the group. Next Steps ========== To start learning how to use *pydicom*, see the :doc:`pydicom_user_guide`. pydicom-2.4.3/doc/old/image_data_compression.rst000066400000000000000000000127541446675437500217730ustar00rootroot00000000000000.. _guide_compression: Compressing *Pixel Data* ======================== .. currentmodule:: pydicom .. rubric:: How to compress Pixel Data Compressing using third-party packages -------------------------------------- Because *pydicom* currently offers limited support for compressing *Pixel Data* you'll have to rely on third-party packages to perform the actual compression. *pydicom* can then be used to take that compressed data and add it to the dataset. The requirements for compressed *Pixel Data* in the DICOM Standard are: * 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 dcmread from pydicom.data import get_testdata_file from pydicom.encaps import encapsulate, encapsulate_extended from pydicom.uid import JPEG2000Lossless path = get_testdata_file("CT_small.dcm") ds = dcmread(path) # Use third-party package to compress # Let's assume it compresses to JPEG 2000 (lossless) frames: List[bytes] = third_party_compression_func(...) # Set the *Transfer Syntax UID* appropriately ds.file_meta.TransferSyntaxUID = JPEG2000Lossless # For *Samples per Pixel* 1 the *Photometric Interpretation* is unchanged # Basic encapsulation ds.PixelData = encapsulate(frames) # Set the dataset encoding ds.is_little_endian = True ds.is_implicit_VR = False # Save! ds.save_as("CT_small_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_small_compressed_ext.dcm") Compressing using pydicom ------------------------- .. _guide_compression_supported: Supported Transfer Syntaxes ........................... *Pixel Data* can be compressed natively using *pydicom* for the following transfer syntaxes: .. _np: http://numpy.org/ .. _pylj: https://github.com/pydicom/pylibjpeg .. _rle: https://github.com/pydicom/pylibjpeg-rle .. _gdcm: http://gdcm.sourceforge.net/ +------------------------------------+------------------+-------------------------+ | Transfer Syntax | Plugin names | Dependencies | +--------------+---------------------+ | | | Name | UID | | | +==============+=====================+==================+=========================+ | 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* Compressing with ``Dataset.compress()`` ....................................... The :meth:`Dataset.compress()` method can be used to compress an uncompressed dataset in-place: .. code-block:: python from pydicom.data import get_testdata_file from pydicom.uid import RLELossless ds = get_testdata_file("CT_small.dcm", read=True) ds.compress(RLELossless) ds.save_as("CT_small_rle.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_small_rle.dcm") Implicitly changing the compression on an already compressed dataset is not currently supported, however it can still be done explicitly 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 = get_testdata_file("US1_J2KR.dcm", read=True) arr = ds.pixel_array ds.PhotometricInterpretation = 'RGB' ds.compress(RLELossless, arr) ds.save_as("US1_RLE.dcm") Note that the *Photometric Interpretation* in this case has been changed from ``'YBR_RCT'``, which is the value for when it's J2K compressed, to ``'RGB'`` which is the correct value for this particular dataset once the *Pixel Data* is RLE compressed. It's up to you to ensure that the the correct *Photometric Interpretation* has been set and that the decompressed pixel data is in the correct color space prior to actually calling :meth:`~pydicom.dataset.Dataset.compress`. pydicom-2.4.3/doc/old/image_data_handlers.rst000066400000000000000000000162751446675437500212340ustar00rootroot00000000000000.. _guide_compressed: Handling of compressed pixel data --------------------------------- .. currentmodule:: pydicom .. rubric:: How to get compressed pixel data .. |chk| unicode:: U+02713 .. CHECK MARK Preconditions ............. 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*: * `GDCM `_ - this is the package that supports most compressed formats * `Pillow `_, ideally with ``jpeg`` and ``jpeg2000`` plugins * `jpeg_ls `_ * :gh:`pylibjpeg `, with the ``-libjpeg``, ``-openjpeg`` and ``-rle`` plugins Note that you always need the `NumPy `_ package to be able to handle pixel data. .. 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 for medical purposes. 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` | +------------------------------------+------------------------+-------+-------------+----------+-----------------+-----------------+ | JPEG2000 Lossless | 1.2.840.10008.1.2.4.90 | | | |chk| | |chk|\ :sup:`2` | |chk|\ :sup:`6` | +------------------------------------+------------------------+-------+-------------+----------+-----------------+-----------------+ | JPEG2000 | 1.2.840.10008.1.2.4.91 | | | |chk| | |chk|\ :sup:`2` | |chk|\ :sup:`6` | +------------------------------------+------------------------+-------+-------------+----------+-----------------+-----------------+ | JPEG2000 Multi-component Lossless | 1.2.840.10008.1.2.4.92 | | | | | | +------------------------------------+------------------------+-------+-------------+----------+-----------------+-----------------+ | JPEG2000 Multi-component | 1.2.840.10008.1.2.4.93 | | | | | | +------------------------------------+------------------------+-------+-------------+----------+-----------------+-----------------+ | :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 and using the* :meth:`~pydicom.dataset.Dataset.decompress` *method, 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 you have two options: * use :meth:`~pydicom.dataset.Dataset.decompress` on the dataset to convert it in-place and work with the pixel data as described before * get an uncompressed copy of the pixel data as a NumPy ``ndarray`` using :attr:`Dataset.pixel_array` without changing the original dataset .. note:: Using :meth:`~pydicom.dataset.Dataset.decompress` adapts the transfer syntax of the data set, but not the *Photometric Interpretation*. The *Photometric Interpretation* may not match the pixel data, depending on the used decompression handler. pydicom-2.4.3/doc/old/private_data_elements.rst000066400000000000000000000120701446675437500216250ustar00rootroot00000000000000.. _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 Datasets 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 (since v1.3) 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 test file 'CT_small.dcm':: >>> from pydicom import dcmread >>> from pydicom.data import get_testdata_file >>> ct_filename = get_testdata_file("CT_small.dcm") >>> ds = dcmread(ct_filename) >>> 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', 'AX IAL'] ... ... (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 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 (since v1.3) provides convenient 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 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 convenient 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. pydicom-2.4.3/doc/old/pydicom_user_guide.rst000066400000000000000000000005211446675437500211430ustar00rootroot00000000000000.. _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 python2_support pydicom-2.4.3/doc/old/python2_support.rst000066400000000000000000000010141446675437500204610ustar00rootroot00000000000000.. _Python2_support: Python 2 Support ================ .. rubric:: Python 2 and *pydicom* *pydicom* dropped support for Python 2 following the 1.4.X versions. * pydicom v2.0 (planned for ~April 2020) will be Python 3.5+ only * pydicom v2.1 (no date set) will be Python 3.6+ We may consider the possibility of backporting some fixes to *pydicom* v1.4 for very serious issues, if users make the case for it. Generally speaking, however, we encourage all *pydicom* users to make the transition to Python 3 by early 2020. pydicom-2.4.3/doc/old/ref_guide.rst000066400000000000000000000021021446675437500172120ustar00rootroot00000000000000.. _api_filereader: =============================== Reading and writing DICOM files =============================== .. rubric:: Common pydicom functions called by user code .. currentmodule:: pydicom File Reading/Parsing ==================== The main function to read and parse DICOM files using *pydicom* is :func:`~filereader.dcmread`. It's part of the :ref:`pydicom.filereader` module, but is also imported when the ``pydicom`` package is imported :: >>> import pydicom >>> dataset = pydicom.dcmread('path/to/file') If you need fine control over the reading, you can either call :func:`~filereader.read_partial` or use :func:`~filereader.dcmread`. File Writing ============ DICOM files can also be written using *pydicom*. There are two ways to do this. * The first is to use :func:`~filewriter.dcmwrite` with a preexisting :class:`~dataset.FileDataset` (derived from :class:`~dataset.Dataset`) instance. * The second is to use the :meth:`Dataset.save_as()` method on a ``FileDataset`` or ``Dataset`` instance. pydicom-2.4.3/doc/old/transition_to_pydicom1.rst000066400000000000000000000116711446675437500217750ustar00rootroot00000000000000:orphan: .. _transition_to_pydicom1: Transition to pydicom 1.x ========================= .. rubric:: Important information on differences in pydicom post 1.0 vs pre-1.0 Introduction ------------ As is often the case for major software version number changes, pydicom 1.0 breaks with the previous release of pydicom (0.9.9) in several ways. These require changes to user code to target the pydicom >= 1.0 package, or to check and deal with the differences between the versions. Backwards-incompatible changes post 1.0 * the library is no longer ``dicom`` but is ``pydicom``, to match the package name * short-form names such as ``Beams`` are no longer allowed; use the full keyword e.g. ``BeamSequence`` * some less-used modules within pydicom have been renamed, e.g. ``dicom.UID`` is now ``pydicom.uid`` Why was the package name changed? There are several reasons for this change: * it is standard Python practice for the package and the installed library to have the same name * first-time users expect to be able to type ``import pydicom`` rather than ``import dicom``, which has caused confusion * it makes sense for search engines - with the correct name it is much easier to find relevant questions and example code online The decision wasn't taken lightly, but with a great deal of discussion on the GitHub issues list. Having made the leap, the rest of this guide should help smooth the way... For authors of packages requiring pydicom < 1.0 ----------------------------------------------- The old pydicom releases have been split off into their own package, called ``dicom``, which is now hosted on PyPI. This allows the old library ``dicom`` to co-exist alongside the new library ``pydicom``. The main things to do, to ensure your old pydicom code will remain functional, are: (a) you should ``pip uninstall pydicom`` and ``pip install dicom`` in your existing pydicom installs (b) If you have ``requirements.txt`` files, change the pydicom line from "pydicom" to "dicom" e.g. ``pydicom==0.9.9`` becomes ``dicom==0.9.9`` (c) Change your instructions to users to ``pip install dicom`` rather than ``pip install pydicom`` Error messages relating to the pydicom transition ------------------------------------------------- This section is here in the hopes of people getting directed to this page on searches. If that's you, then welcome! Hopefully the information here can get things going quickly for you. For those with pydicom < 1.0 installed, on trying to import pydicom, they will get an ImportError message:: >>> import pydicom # doctest: +SKIP Traceback (most recent call last): File "", line 1, in ImportError: No module named pydicom Your choice then is to update to pydicom >=1.0 (see Installing pydicom section), or to instead use ``import dicom`` and follow the old-style pydicom syntax. Conversely, if pydicom >= 1.0 is installed, the error message for ``import dicom`` will look like:: >>> import dicom # doctest: +SKIP Traceback (most recent call last): File "", line 1, in ImportError: No module named dicom In this case you likely have installed pydicom >= 1.0, and so the ``dicom`` library does not exist. You can simply ``import pydicom`` instead, and continue with the new pydicom, or, if you really need the old pydicom, then you should:: pip install dicom and you should be good to go. API Changes in version 1.0 ========================== Apart from the change of the package name, there are some changes in module names, class names, and behavior that may require some code changes. Changed module names -------------------- * module ``UID`` is now ``uid`` Changed function and variable names ----------------------------------- * in module ``datadict``: * ``dictionaryVM()`` -> ``dictionary_VM`` * ``dictionaryVR()`` -> ``dictionary_VR`` * ``private_dictionaryVM()`` -> ``private_dictionary_VM`` * ``private_dictionaryVR()`` -> ``private_dictionary_VR`` * in module ``filereader``: * ``read_file()`` -> ``dcmread()`` (but old name remains for compatibility) * in module ``filewriter``: * ``write_file()`` -> ``dcmwrite()`` (but old name remains for compatibility) * module ``tagtools``: * ``tag_in_exception()`` has been moved to ``tag`` module * module ``uid``: * ``UID.is_valid()`` is now a property * ``NotCompressedPixelTransferSyntaxes`` -> ``UncompressedPixelTransferSyntaxes`` * ``pydicom_root_UID`` -> ``PYDICOM_ROOT_UID`` Removed functions and names --------------------------- * support for old names (before DICOM keywords) in module ``datadict`` is gone (``CleanName()``, ``short_name()``, ``long_name()``, ``all_names_for_tag()`` * ``filereader.not_group2()`` is no longer available * ``uid.pydicom_UIDs`` has been removed Changed behavior ---------------- * ``dataset.save_as()``: ``TransferSyntaxUID`` not added automatically to ``dataset.file_meta`` if missing pydicom-2.4.3/doc/old/viewing_images.rst000066400000000000000000000051241446675437500202650ustar00rootroot00000000000000.. _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 the `Python Imaging Library (PIL) `_ * use pydicom with `wxPython `_ Using pydicom with matplotlib ----------------------------- Matplotlib is available at https://matplotlib.org/. It can take 2D image information from ``Dataset.pixel_array`` and display it. Here is an example:: >>> import matplotlib.pyplot as plt >>> import pydicom >>> from pydicom.data import get_testdata_files >>> filename = get_testdata_files("CT_small.dcm")[0] >>> ds = pydicom.dcmread(filename) >>> plt.imshow(ds.pixel_array, cmap=plt.cm.bone) # 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 Thanks to Roy Keyes for pointing out how to do this. Using pydicom with Tkinter -------------------------- The program :gh:`pydicom_Tkinter.py ` in the ``contrib-pydicom`` repository demonstrates how to show an image using the Tkinter graphics system, which comes by default with most Python installations. It creates a Tkinter PhotoImage in a Label widget or a user-supplied widget. Using pydicom with Python Imaging Library (PIL) ----------------------------------------------- The module :gh:`pydicom_PIL.py ` in the ``contrib-pydicom`` repository uses PIL's ``Image.show()`` method after creating an Image instance from the pixel data and some basic information about it (bit depth, LUTs, etc). Using pydicom with wxPython --------------------------- The module :gh:`imViewer-Simple.py ` in the ``contrib-pydicom`` repository uses wxPython (also PIL, but it notes that it may not be strictly necessary) to display an image from a pydicom dataset. pydicom-2.4.3/doc/old/working_with_overlays.rst000066400000000000000000000070361446675437500217330ustar00rootroot00000000000000.. _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: >>> import pydicom >>> from pydicom.data import get_testdata_files >>> fpath = get_testdata_files("MR-SIEMENS-DICOM-WithOverlays.dcm")[0] >>> ds = pydicom.dcmread(fpath) >>> 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 simply 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.pixel_data_handlers.numpy_handler.pack_bits`) and written back to the correct element: .. code-block:: python # Add a line arr[10, :] = 1 # Pack the data from pydicom.pixel_data_handlers.numpy_handler 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 collapsed to 256x256) then the corresponding (60xx,0010) *Overlay Rows* and (60xx,0011) *Overlay Columns* should be set appropriately. You must explicitly set these yourself; pydicom does not do so automatically. pydicom-2.4.3/doc/old/working_with_pixel_data.rst000066400000000000000000000200351446675437500221730ustar00rootroot00000000000000.. _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 >>> from pydicom.data import get_testdata_file >>> filename = get_testdata_file("MR_small.dcm") >>> ds = dcmread(filename) >>> 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:: >>> ds.pixel_array # doctest: +NORMALIZE_WHITESPACE 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) >>> ds.pixel_array.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 :ref:`pixel data handler ` are available. 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.pixel_data_handlers.util.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.pixel_data_handlers.util.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.pixel_data_handlers.util import apply_color_lut fname = get_testdata_file("OBXXXX1A.dcm") ds = dcmread(fname) 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.pixel_data_handlers.util import apply_color_lut fname = get_testdata_file("OBXXXX1A.dcm") ds = dcmread(fname) 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.pixel_data_handlers.util.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.pixel_data_handlers.util import apply_modality_lut fname = get_testdata_file("CT_small.dcm") ds = dcmread(fname) 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.pixel_data_handlers.util.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.pixel_data_handlers.util import apply_voi_lut fname = get_testdata_file("MR-SIEMENS-DICOM-WithOverlays.dcm") ds = dcmread(fname) arr = ds.pixel_array out = apply_voi_lut(arr, ds, index=0) pydicom-2.4.3/doc/old/working_with_waveforms.rst000066400000000000000000000062431446675437500220770ustar00rootroot00000000000000.. _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 dcmread >>> from pydicom.data import get_testdata_file >>> fpath = get_testdata_file("waveform_ecg.dcm") >>> ds = dcmread(fpath) >>> 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:`~pydicom.dataset.Dataset.waveform_array` method to return a 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-2.4.3/doc/old/writing_files.rst000066400000000000000000000073031446675437500201360ustar00rootroot00000000000000.. _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 first example in :doc:`getting_started` shows how to do this. If you need to create a DICOM file from scratch, there are a couple of ways of going about this: using the "codify" script, or creating a Dataset directly and populating 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. The Python code uses pydicom to produce a copy of the original file again, when the code is run. 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-2.4.3/doc/reference/000077500000000000000000000000001446675437500157145ustar00rootroot00000000000000pydicom-2.4.3/doc/reference/charset.rst000066400000000000000000000005071446675437500201010ustar00rootroot00000000000000.. _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-2.4.3/doc/reference/config.rst000066400000000000000000000014061446675437500177140ustar00rootroot00000000000000.. _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 overlay_data_handlers 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-2.4.3/doc/reference/data.rst000066400000000000000000000004721446675437500173620ustar00rootroot00000000000000.. _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-2.4.3/doc/reference/datadict.rst000066400000000000000000000014421446675437500202240ustar00rootroot00000000000000.. _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-2.4.3/doc/reference/dataset.rst000066400000000000000000000005251446675437500200750ustar00rootroot00000000000000.. _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-2.4.3/doc/reference/dicomdir.rst000066400000000000000000000003511446675437500202370ustar00rootroot00000000000000.. _api_dicomdir: DICOMDIR (:mod:`pydicom.dicomdir`) ================================================ .. currentmodule:: pydicom.dicomdir Representation of DICOMDIR datasets. .. autosummary:: :toctree: generated/ DicomDir pydicom-2.4.3/doc/reference/elem.dataelem.rst000066400000000000000000000004301446675437500211400ustar00rootroot00000000000000.. _api_elem_dataelem: Data Elements (:mod:`pydicom.dataelem`) ======================================= .. currentmodule:: pydicom.dataelem Representation of DICOM data elements .. autosummary:: :toctree: generated/ DataElement DataElement_from_raw RawDataElement pydicom-2.4.3/doc/reference/elem.multival.rst000066400000000000000000000004551446675437500212300ustar00rootroot00000000000000.. _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-2.4.3/doc/reference/elem.rst000066400000000000000000000003401446675437500173650ustar00rootroot00000000000000.. _api_elem: Representation of Data Elements =============================== .. toctree:: :maxdepth: 2 :includehidden: elem.dataelem elem.tag elem.values elem.multival elem.sequence elem.valuerep pydicom-2.4.3/doc/reference/elem.sequence.rst000066400000000000000000000005171446675437500212020ustar00rootroot00000000000000.. _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 validate_dataset pydicom-2.4.3/doc/reference/elem.tag.rst000066400000000000000000000004131446675437500201400ustar00rootroot00000000000000.. _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-2.4.3/doc/reference/elem.valuerep.rst000066400000000000000000000007571446675437500212230ustar00rootroot00000000000000.. _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 MultiString PersonName PersonNameUnicode TM VR pydicom-2.4.3/doc/reference/elem.values.rst000066400000000000000000000011151446675437500206640ustar00rootroot00000000000000.. _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 pydicom-2.4.3/doc/reference/encaps.rst000066400000000000000000000013231446675437500177160ustar00rootroot00000000000000.. _api_encaps: Bulk Data Encapsulation Utilities (:mod:`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 Creating Encapsulated Data -------------------------- .. autosummary:: :toctree: generated/ encapsulate encapsulate_extended fragment_frame itemize_fragment itemize_frame pydicom-2.4.3/doc/reference/encoders.rst000066400000000000000000000010761446675437500202540ustar00rootroot00000000000000.. _api_encoders: Pixel Data Encoders (:mod:`pydicom.encoders`) ============================================= :class:`~pydicom.encoders.base.Encoder` class instances for compressing (7FE0,0010) *Pixel Data*. .. currentmodule:: pydicom.encoders .. autosummary:: :toctree: generated/ RLELosslessEncoder Encoder utilities .. autosummary:: :toctree: generated/ get_encoder Base encoder class used by all encoders .. currentmodule:: pydicom.encoders.base .. autosummary:: :toctree: generated/ Encoder .. automodule:: pydicom.encoders :members: pydicom-2.4.3/doc/reference/errors.rst000066400000000000000000000002721446675437500177630ustar00rootroot00000000000000.. _api_errors: Exceptions (:mod:`pydicom.errors`) ================================== .. currentmodule:: pydicom.errors .. autosummary:: :toctree: generated/ InvalidDicomError pydicom-2.4.3/doc/reference/fileio.base.rst000066400000000000000000000004231446675437500206250ustar00rootroot00000000000000.. _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-2.4.3/doc/reference/fileio.read.rst000066400000000000000000000007401446675437500206300ustar00rootroot00000000000000.. _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_dicomdir read_file_meta_info read_partial read_preamble read_sequence read_sequence_item pydicom-2.4.3/doc/reference/fileio.rst000066400000000000000000000003351446675437500177160ustar00rootroot00000000000000.. _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-2.4.3/doc/reference/fileio.util.rst000066400000000000000000000005131446675437500206700ustar00rootroot00000000000000.. _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-2.4.3/doc/reference/fileio.write.rst000066400000000000000000000011701446675437500210450ustar00rootroot00000000000000.. _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-2.4.3/doc/reference/fileset.rst000066400000000000000000000005051446675437500201010ustar00rootroot00000000000000.. _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-2.4.3/doc/reference/handlers.overlay_data.rst000066400000000000000000000004351446675437500227210ustar00rootroot00000000000000.. _api_handlers_overlaydata: Overlay Data Handlers (:mod:`pydicom.overlays`) ============================================================ .. currentmodule:: pydicom.overlays .. autosummary:: :toctree: generated/ numpy_handler .. automodule:: pydicom.overlays :members: pydicom-2.4.3/doc/reference/handlers.pixel_data.rst000066400000000000000000000006161446675437500223620ustar00rootroot00000000000000.. _api_handlers_pixeldata: Pixel Data Handlers (:mod:`pydicom.pixel_data_handlers`) ======================================================== .. 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-2.4.3/doc/reference/handlers.rst000066400000000000000000000011471446675437500202510ustar00rootroot00000000000000.. _api_handlers: Bulk Data Handlers ================== Functions for handling bulk data elements such as (7FE0,0010) *Pixel Data* and (60xx,3000) *Overlay Data*. .. toctree:: :maxdepth: 1 :includehidden: handlers.overlay_data handlers.pixel_data handlers.waveform_data Pixel Data Utilities ==================== Functions for manipulating (7FE0,0010) *Pixel Data*. .. currentmodule:: pydicom.pixel_data_handlers .. autosummary:: :toctree: generated/ apply_color_lut apply_modality_lut apply_rescale apply_windowing apply_voi apply_voi_lut convert_color_space util pydicom-2.4.3/doc/reference/handlers.waveform_data.rst000066400000000000000000000004241446675437500230640ustar00rootroot00000000000000.. _api_handlers_waveforms: Waveform Data Handlers (:mod:`pydicom.waveforms`) ================================================= .. currentmodule:: pydicom.waveforms .. autosummary:: :toctree: generated/ numpy_handler .. automodule:: pydicom.waveforms :members: pydicom-2.4.3/doc/reference/index.rst000066400000000000000000000006171446675437500175610ustar00rootroot00000000000000.. _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 elem dataset handlers encoders fileset dicomdir encaps errors fileio misc uid pydicom-2.4.3/doc/reference/misc.rst000066400000000000000000000003321446675437500173770ustar00rootroot00000000000000.. _api_misc: Miscellaneous (:mod:`pydicom.misc`) =================================== .. currentmodule:: pydicom.misc Miscellaneous functions. .. autosummary:: :toctree: generated/ is_dicom size_in_bytes pydicom-2.4.3/doc/reference/uid.rst000066400000000000000000000165451446675437500172420ustar00rootroot00000000000000.. _api_uid: UID Definitions and Utilities (:mod:`pydicom.uid`) ================================================== .. currentmodule:: pydicom.uid Transfer Syntax UIDs -------------------- .. autosummary:: :toctree: generated/ ImplicitVRLittleEndian ExplicitVRLittleEndian DeflatedExplicitVRLittleEndian ExplicitVRBigEndian JPEGBaseline8Bit JPEGExtended12Bit JPEGLosslessP14 JPEGLosslessSV1 JPEGLSLossless JPEGLSNearLossless JPEG2000Lossless JPEG2000 JPEG2000MCLossless JPEG2000MC MPEG2MPML MPEG2MPHL MPEG4HP41 MPEG4HP41BD MPEG4HP422D MPEG4HP423D MPEG4HP42STEREO HEVCMP51 HEVCM10P51 RLELossless Transfer Syntax Lists --------------------- .. autosummary:: :toctree: generated/ AllTransferSyntaxes JPEGTransferSyntaxes JPEGLSTransferSyntaxes JPEG2000TransferSyntaxes MPEGTransferSyntaxes RLETransferSyntaxes UncompressedTransferSyntaxes UID Utilities ------------- .. autosummary:: :toctree: generated/ generate_uid 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 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 EnhancedMRColorImageStorage EnhancedMRImageStorage EnhancedPETImageStorage EnhancedSRStorage EnhancedUSVolumeStorage EnhancedXAImageStorage EnhancedXRFImageStorage EnhancedXRayRadiationDoseSRStorage ExtensibleSRStorage GeneralAudioWaveformStorage GeneralECGWaveformStorage GenericImplantTemplateStorage GrayscalePlanarMPRVolumetricPresentationStateStorage GrayscaleSoftcopyPresentationStateStorage HangingProtocolStorage HemodynamicWaveformStorage ImplantAssemblyTemplateStorage ImplantTemplateGroupStorage ImplantationPlanSRStorage IntraocularLensCalculationsStorage IntravascularOpticalCoherenceTomographyImageStorageForPresentation IntravascularOpticalCoherenceTomographyImageStorageForProcessing 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 PlannedImagingAgentAdministrationSRStorage PositronEmissionTomographyImageStorage ProcedureLogStorage ProtocolApprovalStorage PseudoColorSoftcopyPresentationStateStorage RTBeamsDeliveryInstructionStorage RTBeamsTreatmentRecordStorage RTBrachyApplicationSetupDeliveryInstructionStorage RTBrachyTreatmentRecordStorage RTDoseStorage RTImageStorage RTIonBeamsTreatmentRecordStorage RTIonPlanStorage 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 VideoEndoscopicImageStorage VideoMicroscopicImageStorage VideoPhotographicImageStorage VisualAcuityMeasurementsStorage VolumeRenderingVolumetricPresentationStateStorage WideFieldOphthalmicPhotography3DCoordinatesImageStorage WideFieldOphthalmicPhotographyStereographicProjectionImageStorage XADefinedProcedureProtocolStorage XAPerformedProcedureProtocolStorage XAXRFGrayscaleSoftcopyPresentationStateStorage XRay3DAngiographicImageStorage XRay3DCraniofacialImageStorage XRayAngiographicImageStorage XRayRadiationDoseSRStorage XRayRadiofluoroscopicImageStorage pydicom-2.4.3/doc/release_notes/000077500000000000000000000000001446675437500166065ustar00rootroot00000000000000pydicom-2.4.3/doc/release_notes/index.rst000066400000000000000000000010431446675437500204450ustar00rootroot00000000000000============= Release notes ============= .. include:: v2.4.3.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-2.4.3/doc/release_notes/v0.9.2.rst000066400000000000000000000036471446675437500202060ustar00rootroot00000000000000Version 0.9.2 ============= Changelog --------- 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-2.4.3/doc/release_notes/v0.9.3.rst000066400000000000000000000031311446675437500201730ustar00rootroot00000000000000Version 0.9.3 ============= Changelog --------- 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-2.4.3/doc/release_notes/v0.9.4.rst000066400000000000000000000060741446675437500202050ustar00rootroot00000000000000Version 0.9.4 ============= Changelog --------- .. 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-2.4.3/doc/release_notes/v0.9.5.rst000066400000000000000000000024501446675437500202000ustar00rootroot00000000000000Version 0.9.5 ============= Changelog --------- 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-2.4.3/doc/release_notes/v0.9.6.rst000066400000000000000000000013041446675437500201760ustar00rootroot00000000000000Version 0.9.6 ============= Changelog --------- 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-2.4.3/doc/release_notes/v0.9.7.rst000066400000000000000000000047321446675437500202070ustar00rootroot00000000000000Version 0.9.7 ============= Changelog --------- 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-2.4.3/doc/release_notes/v0.9.8.rst000066400000000000000000000033101446675437500201770ustar00rootroot00000000000000Version 0.9.8 ============= Changelog --------- 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-2.4.3/doc/release_notes/v0.9.9.rst000066400000000000000000000023551446675437500202100ustar00rootroot00000000000000Version 0.9.9 ============= Changelog --------- 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-2.4.3/doc/release_notes/v1.0.0.rst000066400000000000000000000065701446675437500201720ustar00rootroot00000000000000 Version 1.0.0 ============= This is a major release, with major changes, including backwards-incompatible changes. Changelog --------- 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-2.4.3/doc/release_notes/v1.1.0.rst000066400000000000000000000037731446675437500201750ustar00rootroot00000000000000Version 1.1.0 ================================= Changelog --------- 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-2.4.3/doc/release_notes/v1.2.0.rst000066400000000000000000000067621446675437500201770ustar00rootroot00000000000000Version 1.2.0 ================================= Changelog --------- 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-2.4.3/doc/release_notes/v1.3.0.rst000066400000000000000000000057751446675437500202030ustar00rootroot00000000000000Version 1.3.0 ================================= Changelog --------- 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-2.4.3/doc/release_notes/v1.4.0.rst000066400000000000000000000104231446675437500201660ustar00rootroot00000000000000Version 1.4.0 ================================= Changelog --------- 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-2.4.3/doc/release_notes/v1.4.1.rst000066400000000000000000000005461446675437500201740ustar00rootroot00000000000000Version 1.4.1 ================================= Changelog --------- 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-2.4.3/doc/release_notes/v2.0.0.rst000066400000000000000000000053661446675437500201750ustar00rootroot00000000000000Version 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-2.4.3/doc/release_notes/v2.1.0.rst000066400000000000000000000165661446675437500202020ustar00rootroot00000000000000Version 2.1.0 ================================= Changelog --------- * Dropped support for Python 3.5 (only Python 3.6+ supported) 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 ....... * 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-2.4.3/doc/release_notes/v2.1.1.rst000066400000000000000000000003331446675437500201640ustar00rootroot00000000000000Version 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-2.4.3/doc/release_notes/v2.2.0.rst000066400000000000000000000145571446675437500202010ustar00rootroot00000000000000Version 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-2.4.3/doc/release_notes/v2.3.0.rst000066400000000000000000000055151446675437500201740ustar00rootroot00000000000000Version 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-2.4.3/doc/release_notes/v2.4.0.rst000066400000000000000000000041531446675437500201720ustar00rootroot00000000000000Version 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-2.4.3/doc/release_notes/v2.4.3.rst000066400000000000000000000001501446675437500201660ustar00rootroot00000000000000Version 2.4.3 ============== Fixes ----- * Fixed pydicom codify error when relative path did not existpydicom-2.4.3/doc/tutorials/000077500000000000000000000000001446675437500160045ustar00rootroot00000000000000pydicom-2.4.3/doc/tutorials/contributing.rst000066400000000000000000000020711446675437500212450ustar00rootroot00000000000000 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 `. * Submitting useful scripts, tutorials or plugins to the :gh:`contrib-pydicom ` project If it's your first time contributing to *pydicom* then we have tutorials for: * :doc:`Contributing a source code patch ` * :doc:`Contributing a documentation change ` pydicom-2.4.3/doc/tutorials/contributing_code.rst000066400000000000000000000245571446675437500222540ustar00rootroot00000000000000================================= 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. (Optional) We recommend that you install your development copy of *pydicom* in a virtual environment as this allows you to test different combinations of Python and installed packages. See the :doc:`virtual environments` tutorial for more information. Create a new virtualenv ``pydX.Y``, where ``X.Y`` is an installed Python version such as 3.7 and ``/path/to/pythonX.Y`` is the path to the corresponding Python executable:: $ mkvirtualenv -p /path/to/pythonX.Y pydX.Y 5. 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/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 ``master`` 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 ``master`` 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 ``master`` branch:: $ git checkout master 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-2.4.3/doc/tutorials/contributing_docs.rst000066400000000000000000000225401446675437500222600ustar00rootroot00000000000000=================================== 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. (Optional) We recommend that you install your development copy of *pydicom* in a virtual environment. See the :doc:`virtual environments` tutorial for more information. Create a new virtualenv ``pyd-doc``, using a Python 3.X version such as 3.10, then activate it:: python3.10 -m venv pyd-doc source pyd-doc/bin/activate 5. 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 ``master`` 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 >>> fpath = get_testdata_file("CT_small.dcm") >>> fpath '[path/to]/pydicom/data/test_files/CT_small.dcm' >>> ds = dcmread(fpath) 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 ``master`` 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 ``master`` branch:: git checkout master 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-2.4.3/doc/tutorials/dataset_basics.rst000066400000000000000000000547221446675437500215210ustar00rootroot00000000000000=========================================== 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 our example dataset =========================== In the tutorial we're going to be using a DICOM dataset included with *pydicom*: :gh:`CT_small.dcm `. Starting with version 1.4 you can get the path to the file by using the :func:`~pydicom.data.get_testdata_file` function to return the path as a :class:`str` (your path may vary):: >>> from pydicom.data import get_testdata_file >>> fpath = get_testdata_file("CT_small.dcm") >>> fpath '/home/user/env/pyd/lib/python3.7/site-packages/pydicom/data/test_files/CT_small.dcm' If you're using an earlier version then you'll have to use :func:`~pydicom.data.get_testdata_files` instead, which returns a list containing matching paths:: >>> from pydicom.data import get_testdata_files >>> fpath = get_testdata_files("CT_small.dcm")[0] >>> fpath '/home/user/env/pyd/lib/python3.7/site-packages/pydicom/data/test_files/CT_small.dcm' To get the version of *pydicom* you're using you can do the following:: >>> import pydicom >>> pydicom.__version__ '1.3.0' Reading ======= To read the DICOM dataset at a given file path we use :func:`~pydicom.filereader.dcmread`, which returns a :class:`~pydicom.dataset.FileDataset` instance:: >>> from pydicom import dcmread >>> from pydicom.data import get_testdata_file >>> fpath = get_testdata_file("CT_small.dcm") >>> ds = dcmread(fpath) :func:`~pydicom.filereader.dcmread` can also handle file-likes:: >>> with open(fpath, 'rb') as infile: ... ds = dcmread(infile) And can even be used as a context manager:: >>> with dcmread(fpath) 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 = get_testdata_file('no_meta.dcm') >>> ds = dcmread(no_meta) 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, 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 ===================== Let's go back to our ``CT_small.dcm`` dataset:: >>> fpath = get_testdata_file("CT_small.dcm") >>> ds = dcmread(fpath) 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 `write_like_original` keyword parameter:: >>> ds.save_as('out.dcm', write_like_original=False) 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', write_like_original=False) Traceback (most recent call last): File "", line 1, in File ".../pydicom/dataset.py", line 1794, in save_as pydicom.dcmwrite(filename, self, write_like_original) File ".../pydicom/filewriter.py", line 925, in dcmwrite enforce_standard=not write_like_original) File ".../pydicom/filewriter.py", line 712, in write_file_meta_info validate_file_meta(file_meta, enforce_standard) File ".../pydicom/dataset.py", line 2372, in validate_file_meta raise ValueError(msg[:-1]) # Remove final newline ValueError: Missing required File Meta Information elements from 'file_meta': (0002, 0010) TransferSyntaxUID 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', write_like_original=False) 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-2.4.3/doc/tutorials/dicom_json.rst000066400000000000000000000104461446675437500206670ustar00rootroot00000000000000============================ Introduction to JSON support ============================ .. versionadded:: 1.3 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 >>> from pydicom.data import get_testdata_file >>> filename = get_testdata_file("CT_small.dcm") >>> ds = pydicom.dcmread(filename) >>> 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 >>> filename = pydicom.data.get_testdata_file("CT_small.dcm") >>> ds = pydicom.dcmread(filename) >>> 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 >>> >>> filename = pydicom.data.get_testdata_file("CT_small.dcm") >>> ds = pydicom.dcmread(filename) >>> 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-2.4.3/doc/tutorials/filesets.rst000066400000000000000000000461031446675437500203600ustar00rootroot00000000000000============================ 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 dcmread >>> from pydicom.data import get_testdata_file >>> path = get_testdata_file("DICOMDIR") >>> ds = dcmread(path) >>> 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.fileset import FileSet >>> path = get_testdata_file("DICOMDIR") >>> 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. 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 >>> path = get_testdata_file("CT_small.dcm") >>> instance = fs.add(path) >>> instance.is_staged True >>> instance.for_addition True >>> instance.path '/tmp/tmp0aalrzir/1.3.6.1.4.1.5962.1.1.1.1.1.20040119072730.12322' >>> 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 >>> path = get_testdata_file("rtdose.dcm") >>> fs.add(path) 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 >>> ds = dcmread(path) >>> ds.InstanceNumber = "1" >>> fs.add(ds) 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(get_testdata_file("CT_small.dcm")) >>> fs.add(get_testdata_file("MR_small.dcm")) 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 = Path(get_testdata_file("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-2.4.3/doc/tutorials/index.rst000066400000000000000000000004671446675437500176540ustar00rootroot00000000000000:orphan: ========= Tutorials ========= New to *pydicom*? Then these tutorials should get you up and running. .. toctree:: :maxdepth: 1 installation virtualenvs dataset_basics pixel_data/compressing waveforms filesets sr_basics dicom_json contributing_code contributing_docs pydicom-2.4.3/doc/tutorials/installation.rst000066400000000000000000000125571446675437500212510ustar00rootroot00000000000000====================== 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. See the :doc:`virtual environments tutorial` on how to create and manage virtual environments. .. _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 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 ``master`` branch) from :gh:`GitHub `:: pip install git+https://github.com/pydicom/pydicom The ``master`` 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 ``master`` 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-2.4.3/doc/tutorials/pixel_data/000077500000000000000000000000001446675437500201165ustar00rootroot00000000000000pydicom-2.4.3/doc/tutorials/pixel_data/compressing.rst000066400000000000000000000171031446675437500232030ustar00rootroot00000000000000======================== Compressing *Pixel Data* ======================== .. currentmodule:: pydicom This tutorial is about compressing a dataset's *Pixel Data* and covers * An introduction to compression * Using data compressed by third-party packages * Compressing data using *pydicom* It's assumed that you're already familiar with the :doc:`dataset basics <../dataset_basics>`. **Prerequisites** This tutorial uses packages in addition to *pydicom* that are not installed by default, but are required for *RLE Lossless* compression of *Pixel Data*. For more information on what packages are available to compress a given transfer syntax see the :ref:`image compression guide `. Installing using pip: .. code-block:: bash python -m pip install -U pydicom>=2.2 numpy pylibjpeg Installing on conda: .. code-block:: bash conda install numpy conda install -c conda-forge pydicom>=2.2 pip install pylibjpeg Introduction ------------ DICOM conformant applications are usually required to support the *Little Endian Implicit VR* transfer syntax, which is an uncompressed (native) transfer syntax. This means that datasets using *Little Endian Implicit VR* have no compression of their *Pixel Data*. So if applications are required to support it, why do we need *Pixel Data* compression? The answer, of course, is file size. A *CT Image* instance typically consists of 1024 x 1024 16-bit pixels, and a CT scan may have hundreds of instances, giving a total series size of hundreds of megabytes. When you factor in other SOP Classes such as *Whole Slide Microscopy* which uses even larger full color images, the size of the uncompressed *Pixel Data* may get into the gigabyte territory. Being able to compress these images can result in significantly reduced file sizes. However, with the exception of *RLE Lossless*, *pydicom* doesn't currently offer any native support for compression of *Pixel Data*. This means that it's entirely up to you to compress the *Pixel Data* in a manner conformant to the :dcm:`requirements of the DICOM Standard`. .. note:: We recommend that you use `GDCM `_ for *Pixel Data* compression as it provides support for all the most commonly used *Transfer Syntaxes* and being another DICOM library, should do so in a conformant manner. The general requirements for compressed *Pixel Data* in the DICOM Standard are: * Each frame of pixel data must be encoded separately * All the encoded frames must then be :dcm:`encapsulated `. * When the amount of encoded frame data is very large then it's recommended (but not required) that an :dcm:`extended offset table ` also be included with the dataset Each *Transfer Syntax* has it's own specific requirements, found in :dcm:`Part 5 of the DICOM Standard`. Encapsulating data compressed by third-party packages ----------------------------------------------------- Once you've used a third-party package to compress the *Pixel Data*, *pydicom* can be used to encapsulate and add it to the dataset, with either the :func:`~pydicom.encaps.encapsulate` or :func:`~pydicom.encaps.encapsulate_extended` functions: .. code-block:: python from typing import List, Tuple from pydicom import dcmread from pydicom.data import get_testdata_file from pydicom.encaps import encapsulate, encapsulate_extended from pydicom.uid import JPEG2000Lossless path = get_testdata_file("CT_small.dcm") ds = dcmread(path) # Use third-party package to compress # Let's assume it compresses to JPEG 2000 (lossless) frames: List[bytes] = third_party_compression_func(...) # Set the *Transfer Syntax UID* appropriately ds.file_meta.TransferSyntaxUID = JPEG2000Lossless # For *Samples per Pixel* 1 the *Photometric Interpretation* is unchanged # Basic encapsulation ds.PixelData = encapsulate(frames) ds.save_as("CT_small_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_small_compressed_ext.dcm") Compressing using pydicom ------------------------- Currently, only the *RLE Lossless* transfer syntax is supported for compressing *Pixel Data* natively using *pydicom*. The easiest method is to pass the UID for *RLE Lossless* to :func:`Dataset.compress() `: .. code-block:: python >>> from pydicom import dcmread >>> from pydicom.data import get_testdata_file >>> from pydicom.uid import RLELossless >>> path = get_testdata_file("CT_small.dcm") >>> ds = dcmread(path) >>> ds.compress(RLELossless) >>> ds.save_as("CT_small_rle.dcm") This will compress the existing *Pixel Data* and update the *Transfer Syntax UID* before saving the dataset to file as ``CT_small_rle.dcm``. If you're creating a dataset from scratch you can instead pass a :class:`~numpy.ndarray` to be compressed and used as the *Pixel Data*: .. code-block:: python >>> import numpy as np >>> arr = np.zeros((ds.Rows, ds.Columns), dtype='>> ds.compress(RLELossless, arr) Note that the :attr:`~numpy.ndarray.shape`, :class:`~numpy.dtype` and contents of `arr` must match the corresponding 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 >>> arr = np.zeros((ds.Rows, ds.Columns + 1), dtype='>> ds.compress(RLELossless, arr) Traceback (most recent call last): File "", line 1, in File ".../pydicom/dataset.py", line 1697, in compress encoded = [f for f in frame_iterator] File ".../pydicom/dataset.py", line 1697, in encoded = [f for f in frame_iterator] File ".../pydicom/encoders/base.py", line 382, in iter_encode yield self._encode_array(src, idx, encoding_plugin, **kwargs) File ".../pydicom/encoders/base.py", line 209, in _encode_array src = self._preprocess(arr, **kwargs) File ".../pydicom/encoders/base.py", line 533, in _preprocess raise ValueError( ValueError: Unable to encode as the shape of the ndarray (128, 129) doesn't match the values for the rows, columns and samples per pixel A 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 plugins available for each encoder are listed in the :mod:`API reference` for the encoder type. Implicitly changing the compression on an already compressed dataset is not currently supported, however it can still be done explicitly 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 >>> ds = get_testdata_file("US1_J2KR.dcm", read=True) >>> ds.SamplesPerPixel 3 >>> ds.PhotometricInterpretation 'YBR_RCT' >>> ds.PhotometricInterpretation = "RGB" >>> ds.compress(RLELossless) Note that in this case we also needed to change the *Photometric Interpretation*, from the original value of ``'YBR_RCT'`` when the dataset was using *JPEG 2000 Lossless* compression to ``'RGB'``, which for this dataset will be the correct value after recompressing using *RLE Lossless*. pydicom-2.4.3/doc/tutorials/sr_basics.rst000066400000000000000000000041511446675437500205070ustar00rootroot00000000000000==================== Structured Reporting ==================== .. versionadded:: 1.4 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-2.4.3/doc/tutorials/virtualenvs.rst000066400000000000000000000225551446675437500211310ustar00rootroot00000000000000========================================== Creating and managing virtual environments ========================================== When it comes to the management of third-party packages, Python has some complications: * By default, every third-party package will be installed to same directory. * Python is unable to differentiate between different versions of the same package installed to that directory This means: * If you're working on a project and you make a backwards incompatible change, then other projects that depend on it may be broken until you go through and update them all with the necessary changes. * If you have two projects that depend on different version of the same package then it becomes impossible for both to function simultaneously. In order to deal with these problems (and others) it's recommended that you work within a Python `virtual environment `_, which is an isolated environment with its own set of installed system and third-party packages. Because these are maintained separately from both the system installation of Python and other virtual environments we no longer have to worry about the issues mentioned above. In this tutorial you will: * (pip only) Install a couple of packages that make using virtual environments easier * Create new virtual environments and learn how to delete them * Learn how to activate, deactivate and switch between environments * Learn how to manage packages in a virtual environment By the end of the tutorial you should have a fully functioning virtual environment ready for installing *pydicom*. If you're using pip as your package manager then continue reading. If you're using conda then :ref:`start here` .. _tut_venv_pip: Using pip ========= Install packages ---------------- First up, we're going to install a couple of packages that make managing virtual environments a lot easier: `virtualenv `_ and `virtualenvwrapper `_:: $ pip install virtualenv virtualenvwrapper Create new virtual environments ------------------------------- To create a new environment run:: $ mkvirtualenv test-env This should produce output similar to the following: .. code-block:: text Using base prefix '/usr/local' New python executable in /home/user/env/test-env/bin/python3.5 Also creating executable in /home/user/env/test-env/bin/python Installing setuptools, pip, wheel...done. virtualenvwrapper.user_scripts creating /home/user/env/test-env/bin/predeactivate virtualenvwrapper.user_scripts creating /home/user/env/test-env/bin/postdeactivate virtualenvwrapper.user_scripts creating /home/user/env/test-env/bin/preactivate virtualenvwrapper.user_scripts creating /home/user/env/test-env/bin/postactivate virtualenvwrapper.user_scripts creating /home/user/env/test-env/bin/get_env_details The output includes the location where the new environment will be created, in this case at ``/home/user/env/test-env``. By default, new environments will be created in the location specified by the ``WORKON_HOME`` environmental variable. After creation, the new environment will be activated and ready to use, as shown by the ``(test-env)`` before the prompt:: (test-env) $ By default, a new virtual environment will be creating using the version of Python you get from running the system's (not the virtual environment's) ``python`` command:: $ python --version # system Python Python 2.7.17 $ mkvirtualenv default-env # environment Python (default-env) $ python --version Python 2.7.17 You can use a different version of Python (as long as one's installed) by passing the ``-p path`` option, where ``path`` is the path to a Python executable:: $ mkvirtualenv -p /usr/bin/python3.7 py37-env (py37-env) $ python --version Python 3.7.5 Deleting environments --------------------- Environments can be deleted from the ``WORKON_HOME`` directory by using ``rmvirtualenv [env name]``:: (py37-env) $ rmvirtualenv default-env However environments must be deactivated first: .. code-block:: text (py37-env) $ rmvirtualenv py37-env Removing py37-env... ERROR: You cannot remove the active environment ('py37-env'). Either switch to another environment, or run 'deactivate'. Activating and deactivating --------------------------- Environments can be deactivated with the ``deactivate`` command, which will return you to the system:: (py37-env) $ deactivate $ python --version Python 2.7.17 And activated with the ``workon`` command:: $ workon test-env (test-env) $ You can switch between environments without needing to deactivate them first:: (test-env) $ workon py37-env (py37-env) $ Managing packages ----------------- Packages within the environment can be managed normally, just remember to activate the environment first:: (py37-env) $ pip install antigravity (py37-env) $ pip uninstall antigravity And given it's one of the reasons we're using virtual environments, it's not surprising that different environments can have different versions of the same package installed:: (py37-env) $ mkvirtualenv old (old) $ pip install pydicom==1.2 (old) $ python -c "import pydicom; print(pydicom.__version__)" 1.2.0 (old) $ mkvirtualenv current (current) $ pip install pydicom (current) $ python -c "import pydicom; print(pydicom.__version__)" 1.4.0 Final steps ----------- Let's clean up the environments we created. First we'll take a look to see what environments are available, then we'll delete them all:: (current) $ deactivate $ lsvirtualenv -b current old py37-env test-env $ rmvirtualenv current $ rmvirtualenv old $ rmvirtualenv py37-env $ rmvirtualenv test-env And finally, let's create a fresh virtual environment ready for installing *pydicom*:: $ mkvirtualenv pydicom (pydicom) $ If you want more information on using the ``virtualenvwrapper`` package, take a look at the `command reference `_. If you're using Python 3.3 or higher you may also be interested in the Python `venv `_ module which also allows the creation virtual environments, but without the need for extra packages. .. _tut_venv_conda: Using conda =========== Create a new virtual environment -------------------------------- To create a new virtual environment we use the ``conda create`` command with the ``-n [env name]`` flag:: $ conda create -n test-env When asked if you want to proceed, enter ``y``. This creates a new environment ``test-env`` in ``[path/to/conda]/envs/`` with the default version of Python used by the system. To use Python version ``X.Y``, you can use the ``python=X.Y`` option:: $ conda create -n py37-env python=3.7 Activating and deactivating environments ---------------------------------------- Environments must be activated before they can be used:: $ conda activate py37-env (py37-env) $ python --version Python 3.7.5 (py37-env) $ conda activate test-env (test-env) $ Deactivating the environment will return you to the previous environment:: (test-env) $ conda deactivate (py37-env) $ To return to the base conda environment it's recommended you just use ``conda activate``:: (py35-env) $ conda activate $ You can switch between environments without needing to deactivate them first:: $ conda activate test-env (test-env) $ conda activate py37-env (py37-env) $ Deleting environments --------------------- Environments can be deleted with the ``conda remove`` command:: $ conda remove -n test-env --all However environments must be deactivate first:: (py37-env) $ conda remove -n py37-env --all CondaEnvironmentError: cannot remove current environment. deactivate and run conda remove again Managing installed packages --------------------------- Packages within the environment can be managed normally, just remember to activate the environment first:: (py37-env) $ pip install antigravity (py37-env) $ pip uninstall antigravity (py37-env) $ conda install numpy (py37-env) $ conda uninstall numpy Different virtual environments can have different versions of the same package installed:: (py37-env) $ conda create -n old && conda activate old (old) $ pip install pydicom==1.2 (old) $ python -c "import pydicom; print(pydicom.__version__)" 1.2.0 (old) $ conda create -n current && conda activate current (current) $ pip install pydicom==1.4 (current) $ python -c "import pydicom; print(pydicom.__version__)" 1.4.0 Final steps ----------- Let's clean up the environments we created. First we'll take a look to see what environments are available, then we'll delete them all:: (current) $ conda activate $ conda env list # conda environments: # base * /home/user/conda current /home/user/conda/envs/current old /home/user/conda/envs/old py37-env /home/user/conda/envs/py37-env $ conda remove -n current --all $ conda remove -n old --all $ conda remove -n py37-env --all And finally, let's create a fresh virtual environment ready for installing *pydicom*:: $ conda create -n pydicom $ conda activate pydicom (pydicom) $ If you want more information on using virtual environments in conda, take a look at `managing conda environments `_. pydicom-2.4.3/doc/tutorials/waveforms.rst000066400000000000000000000217531446675437500205570ustar00rootroot00000000000000========= 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 dcmread >>> from pydicom.data import get_testdata_file >>> fpath = get_testdata_file("waveform_ecg.dcm") >>> ds = dcmread(fpath) >>> 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 >>> 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-2.4.3/doc/tutorials/waveforms_assets/000077500000000000000000000000001446675437500213775ustar00rootroot00000000000000pydicom-2.4.3/doc/tutorials/waveforms_assets/waveforms_decode.png000066400000000000000000004102441446675437500254260ustar00rootroot00000000000000PNG  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-2.4.3/doc/tutorials/waveforms_assets/waveforms_encode.png000066400000000000000000002600121446675437500254340ustar00rootroot00000000000000PNG  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-2.4.3/examples/000077500000000000000000000000001446675437500150275ustar00rootroot00000000000000pydicom-2.4.3/examples/README.txt000066400000000000000000000001151446675437500165220ustar00rootroot00000000000000.. _general_examples: General examples ---------------- Somewhere to start pydicom-2.4.3/examples/dicomtree.py000066400000000000000000000066311446675437500173620ustar00rootroot00000000000000# 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. sudo apt install tix-dev sudo pip install -U pydicom python3 dicomtree.py file.dcm Or in file browser, right click on file.dcm, open with custom command: python3 dicomtree.py """ import tkinter.tix as tkinter_tix print(__doc__) usage = "Usage: python dicomtree.py dicom_filename" def RunTree(w, filename): top = tkinter_tix.Frame(w, relief=tkinter_tix.RAISED, bd=1) tree = tkinter_tix.Tree(top, options="hlist.columns 2") tree.pack(expand=1, fill=tkinter_tix.BOTH, padx=10, pady=10, side=tkinter_tix.LEFT) # print(tree.hlist.keys()) # use to see the available configure() options tree.hlist.configure(bg='white', font='Courier 10', indent=30) tree.hlist.configure(selectbackground='light yellow', gap=150) box = tkinter_tix.ButtonBox(w, orientation=tkinter_tix.HORIZONTAL) # box.add('ok', text='Ok', underline=0, command=w.destroy, width=6) box.add('exit', text='Exit', underline=0, command=w.destroy, width=6) box.pack(side=tkinter_tix.BOTTOM, fill=tkinter_tix.X) top.pack(side=tkinter_tix.TOP, fill=tkinter_tix.BOTH, expand=1) # https://stackoverflow.com/questions/17355902/python-tkinter-binding-mousewheel-to-scrollbar tree.bind_all('', lambda event: # Wheel in Windows tree.hlist.yview_scroll(int(-1 * event.delta / 120.), "units")) tree.bind_all('', lambda event: # Wheel up in Linux tree.hlist.yview_scroll(int(-1), "units")) tree.bind_all('', lambda event: # Wheel down in Linux tree.hlist.yview_scroll(int(+1), "units")) show_file(filename, tree) def show_file(filename, tree): tree.hlist.add("root", text=filename) ds = pydicom.dcmread(filename) ds.decode() # change strings to unicode recurse_tree(tree, ds, "root", False) tree.autosetmode() def recurse_tree(tree, dataset, parent, hide=False): # order the dicom tags for data_element in dataset: node_id = parent + "." + hex(id(data_element)) if isinstance(data_element.value, str): tree.hlist.add(node_id, text=str(data_element)) else: tree.hlist.add(node_id, text=str(data_element)) if hide: tree.hlist.hide_entry(node_id) if data_element.VR == "SQ": # a sequence for i, dataset in enumerate(data_element.value): item_id = node_id + "." + str(i + 1) sq_item_description = data_element.name.replace( " Sequence", "") # XXX not i18n item_text = "{0:s} {1:d}".format(sq_item_description, i + 1) tree.hlist.add(item_id, text=item_text) tree.hlist.hide_entry(item_id) recurse_tree(tree, dataset, item_id, hide=True) if __name__ == '__main__': import sys import pydicom if len(sys.argv) != 2: print("Please supply a dicom file name:\n") print(usage) sys.exit(-1) root = tkinter_tix.Tk() root.geometry("{0:d}x{1:d}+{2:d}+{3:d}".format(1200, 900, 0, 0)) root.title("DICOM tree viewer - " + sys.argv[1]) RunTree(root, sys.argv[1]) root.mainloop() pydicom-2.4.3/examples/image_processing/000077500000000000000000000000001446675437500203455ustar00rootroot00000000000000pydicom-2.4.3/examples/image_processing/README.txt000066400000000000000000000002551446675437500220450ustar00rootroot00000000000000.. _image_processing_examples: Image processing ---------------- These examples illustrate the image processing available in pydicom which can be applied to DICOM images. pydicom-2.4.3/examples/image_processing/plot_downsize_image.py000066400000000000000000000025411446675437500247630ustar00rootroot00000000000000""" ================================ 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 import pydicom from pydicom.data import get_testdata_file print(__doc__) # FIXME: add a full-sized MR image in the testing data filename = get_testdata_file('MR_small.dcm') ds = pydicom.dcmread(filename) # get the pixel information into a numpy array data = ds.pixel_array print('The image has {} x {} voxels'.format(data.shape[0], data.shape[1])) data_downsampling = data[::8, ::8] print('The downsampled image has {} x {} voxels'.format( data_downsampling.shape[0], data_downsampling.shape[1])) # copy the data back to the original data set ds.PixelData = data_downsampling.tobytes() # update the information regarding the shape of the data array ds.Rows, ds.Columns = data_downsampling.shape # print the image information given in the dataset print('The information of the data set after downsampling: \n') print(ds) pydicom-2.4.3/examples/image_processing/plot_waveforms.py000066400000000000000000000030051446675437500237640ustar00rootroot00000000000000""" ============================= 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 dcmread from pydicom.data import get_testdata_file from pydicom.waveforms import generate_multiplex fpath = get_testdata_file("waveform_ecg.dcm") ds = dcmread(fpath) # 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-2.4.3/examples/image_processing/reslice.py000066400000000000000000000041161446675437500223470ustar00rootroot00000000000000""" ========================================================== 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 http://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('glob: {}'.format(sys.argv[1])) for fname in glob.glob(sys.argv[1], recursive=False): print("loading: {}".format(fname)) files.append(pydicom.dcmread(fname)) print("file count: {}".format(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("skipped, no SliceLocation: {}".format(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-2.4.3/examples/input_output/000077500000000000000000000000001446675437500176065ustar00rootroot00000000000000pydicom-2.4.3/examples/input_output/README.txt000066400000000000000000000001671446675437500213100ustar00rootroot00000000000000.. _input_ouput_examples: Input-output ------------ These examples illustrate the use of pydicom to read DICOM data. pydicom-2.4.3/examples/input_output/plot_printing_dataset.py000066400000000000000000000030331446675437500245540ustar00rootroot00000000000000""" ========================================== 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 import pydicom from pydicom.data import get_testdata_file print(__doc__) def myprint(dataset, 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 data_element in dataset: if data_element.VR == "SQ": # a sequence print(indent_string, data_element.name) for sequence_item in data_element.value: myprint(sequence_item, indent + 1) print(next_indent_string + "---------") else: if data_element.name in dont_print: print("""""") else: repr_value = repr(data_element.value) if len(repr_value) > 50: repr_value = repr_value[:50] + "..." print("{0:s} {1:s} = {2:s}".format(indent_string, data_element.name, repr_value)) filename = get_testdata_file('MR_small.dcm') ds = pydicom.dcmread(filename) myprint(ds) pydicom-2.4.3/examples/input_output/plot_read_dicom.py000066400000000000000000000022151446675437500233040ustar00rootroot00000000000000""" ================================== 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 fpath = get_testdata_file('CT_small.dcm') ds = dcmread(fpath) # Normal mode: print() print(f"File path........: {fpath}") 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-2.4.3/examples/input_output/plot_read_dicom_directory.py000066400000000000000000000053521446675437500253750ustar00rootroot00000000000000""" ======================= Read a DICOMDIR dataset ======================= This example shows how to read a DICOM :File-set's DICOMDIR dataset. .. note:: The :class:`~pydicom.fileset.FileSet` class is a much better way of working with DICOM File-sets and allows creation and modification of DICOMDIR files. See the :doc:`DICOM File-set example` or the `File-set tutorial <../../tutorials/filesets.html>`_. """ import os from pathlib import Path from pydicom import dcmread from pydicom.data import get_testdata_file # fetch the path to the test data path = get_testdata_file('DICOMDIR') ds = dcmread(path) root_dir = Path(ds.filename).resolve().parent print(f'Root directory: {root_dir}\n') # Iterate through the PATIENT records for patient in ds.patient_records: print( f"PATIENT: PatientID={patient.PatientID}, " f"PatientName={patient.PatientName}" ) # Find all the STUDY records for the patient studies = [ ii for ii in patient.children if ii.DirectoryRecordType == "STUDY" ] for study in studies: descr = study.StudyDescription or "(no value available)" print( f"{' ' * 1}STUDY: StudyID={study.StudyID}, " f"StudyDate={study.StudyDate}, StudyDescription={descr}" ) # Find all the SERIES records in the study all_series = [ ii for ii in study.children if ii.DirectoryRecordType == "SERIES" ] for series in all_series: # Find all the IMAGE records in the series images = [ ii for ii in series.children if ii.DirectoryRecordType == "IMAGE" ] plural = ('', 's')[len(images) > 1] descr = getattr( series, "SeriesDescription", "(no value available)" ) print( f"{' ' * 2}SERIES: SeriesNumber={series.SeriesNumber}, " f"Modality={series.Modality}, SeriesDescription={descr} - " f"{len(images)} SOP Instance{plural}" ) # Get the absolute file path to each instance # Each IMAGE contains a relative file path to the root directory elems = [ii["ReferencedFileID"] for ii in images] # Make sure the relative file path is always a list of str paths = [[ee.value] if ee.VM == 1 else ee.value for ee in elems] paths = [Path(*p) for p in paths] # List the instance file paths for p in paths: print(f"{' ' * 3}IMAGE: Path={os.fspath(p)}") # Optionally read the corresponding SOP Instance # instance = dcmread(Path(root_dir) / p) # print(instance.PatientName) pydicom-2.4.3/examples/input_output/plot_read_fileset.py000066400000000000000000000105611446675437500236470ustar00rootroot00000000000000""" ===================== 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 import warnings from pydicom import dcmread from pydicom.data import get_testdata_file from pydicom.fileset import FileSet from pydicom.uid import generate_uid warnings.filterwarnings("ignore") 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(get_testdata_file("CT_small.dcm")) fs.add(get_testdata_file("MR_small.dcm")) 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-2.4.3/examples/input_output/plot_read_rtplan.py000066400000000000000000000021431446675437500235110ustar00rootroot00000000000000""" ====================================== Read RTPLAN DICOM and list information ====================================== Given an RTPLAN DICOM file, list basic info for the beams in it. """ # authors : Guillaume Lemaitre # license : MIT import pydicom from pydicom.data import get_testdata_file print(__doc__) def list_beams(plan_dataset): """Summarizes the RTPLAN beam information in the dataset.""" lines = ["{name:^13s} {num:^8s} {gantry:^8s} {ssd:^11s}".format( name="Beam name", num="Number", gantry="Gantry", ssd="SSD (cm)")] for beam in plan_dataset.BeamSequence: cp0 = beam.ControlPointSequence[0] SSD = float(cp0.SourceToSurfaceDistance / 10) lines.append("{b.BeamName:^13s} {b.BeamNumber:8d} " "{gantry:8.1f} {ssd:8.1f}".format(b=beam, gantry=cp0.GantryAngle, ssd=SSD)) return "\n".join(lines) filename = get_testdata_file('rtplan.dcm') dataset = pydicom.dcmread(filename) print(list_beams(dataset)) pydicom-2.4.3/examples/input_output/plot_write_dicom.py000066400000000000000000000045411446675437500235270ustar00rootroot00000000000000""" ================ 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 : Guillaume Lemaitre # license : MIT import datetime import os import tempfile import pydicom from pydicom.dataset import FileDataset, FileMetaDataset from pydicom.uid import UID # Create some temporary filenames suffix = '.dcm' filename_little_endian = tempfile.NamedTemporaryFile(suffix=suffix).name filename_big_endian = tempfile.NamedTemporaryFile(suffix=suffix).name 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") print("Setting dataset values...") # Create the FileDataset instance (initially no data elements, but file_meta # supplied) ds = FileDataset(filename_little_endian, {}, file_meta=file_meta, preamble=b"\0" * 128) # Add the data elements -- not trying to set all required here. Check DICOM # standard ds.PatientName = "Test^Firstname" ds.PatientID = "123456" # Set the transfer syntax ds.is_little_endian = True ds.is_implicit_VR = True # Set creation date/time dt = datetime.datetime.now() ds.ContentDate = dt.strftime('%Y%m%d') timeStr = dt.strftime('%H%M%S.%f') # long format with micro seconds ds.ContentTime = timeStr print("Writing test file", filename_little_endian) ds.save_as(filename_little_endian) print("File saved.") # Write as a different transfer syntax XXX shouldn't need this but pydicom # 0.9.5 bug not recognizing transfer syntax ds.file_meta.TransferSyntaxUID = pydicom.uid.ExplicitVRBigEndian ds.is_little_endian = False ds.is_implicit_VR = False print("Writing test file as Big Endian Explicit VR", filename_big_endian) ds.save_as(filename_big_endian) # reopen the data just for checking for filename in (filename_little_endian, filename_big_endian): print('Load file {} ...'.format(filename)) ds = pydicom.dcmread(filename) print(ds) # remove the created file print('Remove file {} ...'.format(filename)) os.remove(filename) pydicom-2.4.3/examples/memory_dataset.py000066400000000000000000000045301446675437500204200ustar00rootroot00000000000000# 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 from pydicom.filebase import DicomFileLike print(__doc__) usage = "Usage: python memory_dataset.py dicom_filename" def write_dataset_to_bytes(dataset): # 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, dataset) # 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): # 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): self._blobs = {} def save(self, name, blob): self._blobs[name] = blob def load(self, name): 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') # - 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-2.4.3/examples/metadata_processing/000077500000000000000000000000001446675437500210435ustar00rootroot00000000000000pydicom-2.4.3/examples/metadata_processing/README.txt000066400000000000000000000002611446675437500225400ustar00rootroot00000000000000.. _metadata_processing_examples: Metadata processing ------------------- These examples illustrates the processing available in pydicom to modify the metadata of DICOM data. pydicom-2.4.3/examples/metadata_processing/plot_add_dict_entries.py000066400000000000000000000026021446675437500257370ustar00rootroot00000000000000""" ===================================================== Add dictionary items in the standard DICOM dictionary ===================================================== This examples illustrates how to add dictionary items to the 'standard' DICOM dictionary dynamically. .. warning:: Note that this is not a recommended solution in general but it is useful as a demonstration or for in-house programs only, or to get around elements missing from pydicom's DICOM dictionaries. """ # authors : Darcy Mason # Guillaume Lemaitre # license : MIT from pydicom.datadict import DicomDictionary, keyword_dict from pydicom.dataset import Dataset print(__doc__) # Define items as (VR, VM, description, is_retired flag, keyword) # Leave is_retired flag blank. new_dict_items = { 0x10011001: ('UL', '1', "Test One", '', 'TestOne'), 0x10011002: ('OB', '1', "Test Two", '', 'TestTwo'), 0x10011003: ('UI', '1', "Test Three", '', 'TestThree'), } # Update the dictionary itself DicomDictionary.update(new_dict_items) # Update the reverse mapping from name to tag new_names_dict = dict([(val[4], tag) for tag, val in new_dict_items.items()]) keyword_dict.update(new_names_dict) # Test that it is working ds = Dataset() # or could get one from dcmread, etc ds.TestOne = 42 ds.TestTwo = '12345' ds.TestThree = '1.2.3.4.5' print(ds.top()) pydicom-2.4.3/examples/metadata_processing/plot_anonymize.py000066400000000000000000000053431446675437500244710ustar00rootroot00000000000000""" ==================== 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. """ # authors : Guillaume Lemaitre # license : MIT import tempfile import pydicom from pydicom.data import get_testdata_file print(__doc__) ############################################################################### # Anonymize a single file ############################################################################### filename = get_testdata_file('MR_small.dcm') dataset = pydicom.dcmread(filename) data_elements = ['PatientID', 'PatientBirthDate'] for de in data_elements: print(dataset.data_element(de)) ############################################################################### # 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(dataset, data_element): if data_element.VR == "PN": data_element.value = "anonymous" def curves_callback(dataset, data_element): if data_element.tag.group & 0xFF00 == 0x5000: del dataset[data_element.tag] ############################################################################### # We can use the different callback function to iterate through the dataset but # also some other tags such that patient ID, etc. dataset.PatientID = "id" dataset.walk(person_names_callback) dataset.walk(curves_callback) ############################################################################### # pydicom allows to remove private tags using ``remove_private_tags`` method dataset.remove_private_tags() ############################################################################### # Data elements of type 3 (optional) can be easily deleted using ``del`` or # ``delattr``. if 'OtherPatientIDs' in dataset: delattr(dataset, 'OtherPatientIDs') if 'OtherPatientIDsSequence' in dataset: del dataset.OtherPatientIDsSequence ############################################################################### # For data elements of type 2, this is possible to blank it by assigning a # blank string. tag = 'PatientBirthDate' if tag in dataset: dataset.data_element(tag).value = '19000101' ############################################################################## # Finally, this is possible to store the image data_elements = ['PatientID', 'PatientBirthDate'] for de in data_elements: print(dataset.data_element(de)) output_filename = tempfile.NamedTemporaryFile().name dataset.save_as(output_filename) pydicom-2.4.3/examples/metadata_processing/plot_sequences.py000066400000000000000000000020571446675437500244520ustar00rootroot00000000000000""" ====================== 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('Number of blocks: {}'.format(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-2.4.3/examples/plot_dicom_difference.py000066400000000000000000000020111446675437500216760ustar00rootroot00000000000000""" ======================================= Analyse differences between DICOM files ======================================= This examples illustrates how to find the differences between two DICOM files. """ # authors : Guillaume Lemaitre # license : MIT import difflib import pydicom from pydicom.data import get_testdata_file print(__doc__) filename_mr = get_testdata_file('MR_small.dcm') filename_ct = get_testdata_file('CT_small.dcm') datasets = tuple([pydicom.dcmread(filename, force=True) for filename in (filename_mr, filename_ct)]) # 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 dataset in datasets: lines = str(dataset).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-2.4.3/examples/show_charset_name.py000066400000000000000000000024061446675437500210740ustar00rootroot00000000000000""" ============================ Display unicode person names ============================ Very simple app to display unicode person names. """ # authors : Guillaume Lemaitre # license : MIT from pydicom.valuerep import PersonNameUnicode import tkinter print(__doc__) default_encoding = 'iso8859' root = tkinter.Tk() # root.geometry("%dx%d%+d%+d" % (800, 600, 0, 0)) person_names = [ PersonNameUnicode( 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 H.3 p98 PersonNameUnicode( b"Wang^XiaoDong=\xcd\xf5\x5e\xd0\xa1\xb6\xab=", [default_encoding, 'GB18030']), # DICOM standard 2008-PS3.5 J.3 p 105 PersonNameUnicode( b"Wang^XiaoDong=\xe7\x8e\x8b\x5e\xe5\xb0\x8f\xe6\x9d\xb1=", [default_encoding, 'UTF-8']), # DICOM standard 2008-PS3.5 J.1 p 104 PersonNameUnicode( 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']), # DICOM standard 2008-PS3.5 I.2 p 101 ] for person_name in person_names: label = tkinter.Label(text=person_name) label.pack() root.mainloop() pydicom-2.4.3/mypy.ini000066400000000000000000000005121446675437500147060ustar00rootroot00000000000000[mypy] python_version = 3.9 exclude = pydicom/(tests|benchmarks) files = pydicom/ show_error_codes = True warn_redundant_casts = True warn_unused_ignores = True warn_return_any = True warn_unreachable = False ignore_missing_imports = True disallow_untyped_calls = True disallow_untyped_defs = True disallow_incomplete_defs = True pydicom-2.4.3/pydicom/000077500000000000000000000000001446675437500146555ustar00rootroot00000000000000pydicom-2.4.3/pydicom/__init__.py000066400000000000000000000030511446675437500167650ustar00rootroot00000000000000# 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: http://groups.google.com/group/pydicom 5. Bugs and other issues can be reported in the issue tracker: https://www.github.com/pydicom/pydicom """ import warnings from pydicom.dataelem import DataElement from pydicom.dataset import Dataset, FileDataset with warnings.catch_warnings(): warnings.simplefilter("ignore") from pydicom.filereader import read_file from pydicom.filewriter import write_file from pydicom.filereader import dcmread from pydicom.filewriter import dcmwrite from pydicom.sequence import Sequence from ._version import __version__, __version_info__, __dicom_version__ __all__ = ['DataElement', 'Dataset', 'FileDataset', 'Sequence', 'dcmread', 'dcmwrite', 'read_file', 'write_file', '__version__', '__version_info__'] pydicom-2.4.3/pydicom/_dicom_dict.py000066400000000000000000017427731446675437500175110ustar00rootroot00000000000000"""DICOM data dictionary auto-generated by generate_dicom_dict.py""" from typing import Dict, Tuple # 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'), # noqa 0x00000001: ('UL', '1', "Command Length to End", 'Retired', 'CommandLengthToEnd'), # noqa 0x00000002: ('UI', '1', "Affected SOP Class UID", '', 'AffectedSOPClassUID'), # noqa 0x00000003: ('UI', '1', "Requested SOP Class UID", '', 'RequestedSOPClassUID'), # noqa 0x00000010: ('SH', '1', "Command Recognition Code", 'Retired', 'CommandRecognitionCode'), # noqa 0x00000100: ('US', '1', "Command Field", '', 'CommandField'), # noqa 0x00000110: ('US', '1', "Message ID", '', 'MessageID'), # noqa 0x00000120: ('US', '1', "Message ID Being Responded To", '', 'MessageIDBeingRespondedTo'), # noqa 0x00000200: ('AE', '1', "Initiator", 'Retired', 'Initiator'), # noqa 0x00000300: ('AE', '1', "Receiver", 'Retired', 'Receiver'), # noqa 0x00000400: ('AE', '1', "Find Location", 'Retired', 'FindLocation'), # noqa 0x00000600: ('AE', '1', "Move Destination", '', 'MoveDestination'), # noqa 0x00000700: ('US', '1', "Priority", '', 'Priority'), # noqa 0x00000800: ('US', '1', "Command Data Set Type", '', 'CommandDataSetType'), # noqa 0x00000850: ('US', '1', "Number of Matches", 'Retired', 'NumberOfMatches'), # noqa 0x00000860: ('US', '1', "Response Sequence Number", 'Retired', 'ResponseSequenceNumber'), # noqa 0x00000900: ('US', '1', "Status", '', 'Status'), # noqa 0x00000901: ('AT', '1-n', "Offending Element", '', 'OffendingElement'), # noqa 0x00000902: ('LO', '1', "Error Comment", '', 'ErrorComment'), # noqa 0x00000903: ('US', '1', "Error ID", '', 'ErrorID'), # noqa 0x00001000: ('UI', '1', "Affected SOP Instance UID", '', 'AffectedSOPInstanceUID'), # noqa 0x00001001: ('UI', '1', "Requested SOP Instance UID", '', 'RequestedSOPInstanceUID'), # noqa 0x00001002: ('US', '1', "Event Type ID", '', 'EventTypeID'), # noqa 0x00001005: ('AT', '1-n', "Attribute Identifier List", '', 'AttributeIdentifierList'), # noqa 0x00001008: ('US', '1', "Action Type ID", '', 'ActionTypeID'), # noqa 0x00001020: ('US', '1', "Number of Remaining Sub-operations", '', 'NumberOfRemainingSuboperations'), # noqa 0x00001021: ('US', '1', "Number of Completed Sub-operations", '', 'NumberOfCompletedSuboperations'), # noqa 0x00001022: ('US', '1', "Number of Failed Sub-operations", '', 'NumberOfFailedSuboperations'), # noqa 0x00001023: ('US', '1', "Number of Warning Sub-operations", '', 'NumberOfWarningSuboperations'), # noqa 0x00001030: ('AE', '1', "Move Originator Application Entity Title", '', 'MoveOriginatorApplicationEntityTitle'), # noqa 0x00001031: ('US', '1', "Move Originator Message ID", '', 'MoveOriginatorMessageID'), # noqa 0x00004000: ('LT', '1', "Dialog Receiver", 'Retired', 'DialogReceiver'), # noqa 0x00004010: ('LT', '1', "Terminal Type", 'Retired', 'TerminalType'), # noqa 0x00005010: ('SH', '1', "Message Set ID", 'Retired', 'MessageSetID'), # noqa 0x00005020: ('SH', '1', "End Message ID", 'Retired', 'EndMessageID'), # noqa 0x00005110: ('LT', '1', "Display Format", 'Retired', 'DisplayFormat'), # noqa 0x00005120: ('LT', '1', "Page Position ID", 'Retired', 'PagePositionID'), # noqa 0x00005130: ('CS', '1', "Text Format ID", 'Retired', 'TextFormatID'), # noqa 0x00005140: ('CS', '1', "Normal/Reverse", 'Retired', 'NormalReverse'), # noqa 0x00005150: ('CS', '1', "Add Gray Scale", 'Retired', 'AddGrayScale'), # noqa 0x00005160: ('CS', '1', "Borders", 'Retired', 'Borders'), # noqa 0x00005170: ('IS', '1', "Copies", 'Retired', 'Copies'), # noqa 0x00005180: ('CS', '1', "Command Magnification Type", 'Retired', 'CommandMagnificationType'), # noqa 0x00005190: ('CS', '1', "Erase", 'Retired', 'Erase'), # noqa 0x000051A0: ('CS', '1', "Print", 'Retired', 'Print'), # noqa 0x000051B0: ('US', '1-n', "Overlays", 'Retired', 'Overlays'), # noqa 0x00020000: ('UL', '1', "File Meta Information Group Length", '', 'FileMetaInformationGroupLength'), # noqa 0x00020001: ('OB', '1', "File Meta Information Version", '', 'FileMetaInformationVersion'), # noqa 0x00020002: ('UI', '1', "Media Storage SOP Class UID", '', 'MediaStorageSOPClassUID'), # noqa 0x00020003: ('UI', '1', "Media Storage SOP Instance UID", '', 'MediaStorageSOPInstanceUID'), # noqa 0x00020010: ('UI', '1', "Transfer Syntax UID", '', 'TransferSyntaxUID'), # noqa 0x00020012: ('UI', '1', "Implementation Class UID", '', 'ImplementationClassUID'), # noqa 0x00020013: ('SH', '1', "Implementation Version Name", '', 'ImplementationVersionName'), # noqa 0x00020016: ('AE', '1', "Source Application Entity Title", '', 'SourceApplicationEntityTitle'), # noqa 0x00020017: ('AE', '1', "Sending Application Entity Title", '', 'SendingApplicationEntityTitle'), # noqa 0x00020018: ('AE', '1', "Receiving Application Entity Title", '', 'ReceivingApplicationEntityTitle'), # noqa 0x00020026: ('UR', '1', "Source Presentation Address", '', 'SourcePresentationAddress'), # noqa 0x00020027: ('UR', '1', "Sending Presentation Address", '', 'SendingPresentationAddress'), # noqa 0x00020028: ('UR', '1', "Receiving Presentation Address", '', 'ReceivingPresentationAddress'), # noqa 0x00020031: ('OB', '1', "RTV Meta Information Version", '', 'RTVMetaInformationVersion'), # noqa 0x00020032: ('UI', '1', "RTV Communication SOP Class UID", '', 'RTVCommunicationSOPClassUID'), # noqa 0x00020033: ('UI', '1', "RTV Communication SOP Instance UID", '', 'RTVCommunicationSOPInstanceUID'), # noqa 0x00020035: ('OB', '1', "RTV Source Identifier", '', 'RTVSourceIdentifier'), # noqa 0x00020036: ('OB', '1', "RTV Flow Identifier", '', 'RTVFlowIdentifier'), # noqa 0x00020037: ('UL', '1', "RTV Flow RTP Sampling Rate", '', 'RTVFlowRTPSamplingRate'), # noqa 0x00020038: ('FD', '1', "RTV Flow Actual Frame Duration", '', 'RTVFlowActualFrameDuration'), # noqa 0x00020100: ('UI', '1', "Private Information Creator UID", '', 'PrivateInformationCreatorUID'), # noqa 0x00020102: ('OB', '1', "Private Information", '', 'PrivateInformation'), # noqa 0x00041130: ('CS', '1', "File-set ID", '', 'FileSetID'), # noqa 0x00041141: ('CS', '1-8', "File-set Descriptor File ID", '', 'FileSetDescriptorFileID'), # noqa 0x00041142: ('CS', '1', "Specific Character Set of File-set Descriptor File", '', 'SpecificCharacterSetOfFileSetDescriptorFile'), # noqa 0x00041200: ('UL', '1', "Offset of the First Directory Record of the Root Directory Entity", '', 'OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity'), # noqa 0x00041202: ('UL', '1', "Offset of the Last Directory Record of the Root Directory Entity", '', 'OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity'), # noqa 0x00041212: ('US', '1', "File-set Consistency Flag", '', 'FileSetConsistencyFlag'), # noqa 0x00041220: ('SQ', '1', "Directory Record Sequence", '', 'DirectoryRecordSequence'), # noqa 0x00041400: ('UL', '1', "Offset of the Next Directory Record", '', 'OffsetOfTheNextDirectoryRecord'), # noqa 0x00041410: ('US', '1', "Record In-use Flag", '', 'RecordInUseFlag'), # noqa 0x00041420: ('UL', '1', "Offset of Referenced Lower-Level Directory Entity", '', 'OffsetOfReferencedLowerLevelDirectoryEntity'), # noqa 0x00041430: ('CS', '1', "Directory Record Type", '', 'DirectoryRecordType'), # noqa 0x00041432: ('UI', '1', "Private Record UID", '', 'PrivateRecordUID'), # noqa 0x00041500: ('CS', '1-8', "Referenced File ID", '', 'ReferencedFileID'), # noqa 0x00041504: ('UL', '1', "MRDR Directory Record Offset", 'Retired', 'MRDRDirectoryRecordOffset'), # noqa 0x00041510: ('UI', '1', "Referenced SOP Class UID in File", '', 'ReferencedSOPClassUIDInFile'), # noqa 0x00041511: ('UI', '1', "Referenced SOP Instance UID in File", '', 'ReferencedSOPInstanceUIDInFile'), # noqa 0x00041512: ('UI', '1', "Referenced Transfer Syntax UID in File", '', 'ReferencedTransferSyntaxUIDInFile'), # noqa 0x0004151A: ('UI', '1-n', "Referenced Related General SOP Class UID in File", '', 'ReferencedRelatedGeneralSOPClassUIDInFile'), # noqa 0x00041600: ('UL', '1', "Number of References", 'Retired', 'NumberOfReferences'), # noqa 0x00080001: ('UL', '1', "Length to End", 'Retired', 'LengthToEnd'), # noqa 0x00080005: ('CS', '1-n', "Specific Character Set", '', 'SpecificCharacterSet'), # noqa 0x00080006: ('SQ', '1', "Language Code Sequence", '', 'LanguageCodeSequence'), # noqa 0x00080008: ('CS', '2-n', "Image Type", '', 'ImageType'), # noqa 0x00080010: ('SH', '1', "Recognition Code", 'Retired', 'RecognitionCode'), # noqa 0x00080012: ('DA', '1', "Instance Creation Date", '', 'InstanceCreationDate'), # noqa 0x00080013: ('TM', '1', "Instance Creation Time", '', 'InstanceCreationTime'), # noqa 0x00080014: ('UI', '1', "Instance Creator UID", '', 'InstanceCreatorUID'), # noqa 0x00080015: ('DT', '1', "Instance Coercion DateTime", '', 'InstanceCoercionDateTime'), # noqa 0x00080016: ('UI', '1', "SOP Class UID", '', 'SOPClassUID'), # noqa 0x00080017: ('UI', '1', "Acquisition UID", '', 'AcquisitionUID'), # noqa 0x00080018: ('UI', '1', "SOP Instance UID", '', 'SOPInstanceUID'), # noqa 0x00080019: ('UI', '1', "Pyramid UID", '', 'PyramidUID'), # noqa 0x0008001A: ('UI', '1-n', "Related General SOP Class UID", '', 'RelatedGeneralSOPClassUID'), # noqa 0x0008001B: ('UI', '1', "Original Specialized SOP Class UID", '', 'OriginalSpecializedSOPClassUID'), # noqa 0x00080020: ('DA', '1', "Study Date", '', 'StudyDate'), # noqa 0x00080021: ('DA', '1', "Series Date", '', 'SeriesDate'), # noqa 0x00080022: ('DA', '1', "Acquisition Date", '', 'AcquisitionDate'), # noqa 0x00080023: ('DA', '1', "Content Date", '', 'ContentDate'), # noqa 0x00080024: ('DA', '1', "Overlay Date", 'Retired', 'OverlayDate'), # noqa 0x00080025: ('DA', '1', "Curve Date", 'Retired', 'CurveDate'), # noqa 0x0008002A: ('DT', '1', "Acquisition DateTime", '', 'AcquisitionDateTime'), # noqa 0x00080030: ('TM', '1', "Study Time", '', 'StudyTime'), # noqa 0x00080031: ('TM', '1', "Series Time", '', 'SeriesTime'), # noqa 0x00080032: ('TM', '1', "Acquisition Time", '', 'AcquisitionTime'), # noqa 0x00080033: ('TM', '1', "Content Time", '', 'ContentTime'), # noqa 0x00080034: ('TM', '1', "Overlay Time", 'Retired', 'OverlayTime'), # noqa 0x00080035: ('TM', '1', "Curve Time", 'Retired', 'CurveTime'), # noqa 0x00080040: ('US', '1', "Data Set Type", 'Retired', 'DataSetType'), # noqa 0x00080041: ('LO', '1', "Data Set Subtype", 'Retired', 'DataSetSubtype'), # noqa 0x00080042: ('CS', '1', "Nuclear Medicine Series Type", 'Retired', 'NuclearMedicineSeriesType'), # noqa 0x00080050: ('SH', '1', "Accession Number", '', 'AccessionNumber'), # noqa 0x00080051: ('SQ', '1', "Issuer of Accession Number Sequence", '', 'IssuerOfAccessionNumberSequence'), # noqa 0x00080052: ('CS', '1', "Query/Retrieve Level", '', 'QueryRetrieveLevel'), # noqa 0x00080053: ('CS', '1', "Query/Retrieve View", '', 'QueryRetrieveView'), # noqa 0x00080054: ('AE', '1-n', "Retrieve AE Title", '', 'RetrieveAETitle'), # noqa 0x00080055: ('AE', '1', "Station AE Title", '', 'StationAETitle'), # noqa 0x00080056: ('CS', '1', "Instance Availability", '', 'InstanceAvailability'), # noqa 0x00080058: ('UI', '1-n', "Failed SOP Instance UID List", '', 'FailedSOPInstanceUIDList'), # noqa 0x00080060: ('CS', '1', "Modality", '', 'Modality'), # noqa 0x00080061: ('CS', '1-n', "Modalities in Study", '', 'ModalitiesInStudy'), # noqa 0x00080062: ('UI', '1-n', "SOP Classes in Study", '', 'SOPClassesInStudy'), # noqa 0x00080063: ('SQ', '1', "Anatomic Regions in Study Code Sequence", '', 'AnatomicRegionsInStudyCodeSequence'), # noqa 0x00080064: ('CS', '1', "Conversion Type", '', 'ConversionType'), # noqa 0x00080068: ('CS', '1', "Presentation Intent Type", '', 'PresentationIntentType'), # noqa 0x00080070: ('LO', '1', "Manufacturer", '', 'Manufacturer'), # noqa 0x00080080: ('LO', '1', "Institution Name", '', 'InstitutionName'), # noqa 0x00080081: ('ST', '1', "Institution Address", '', 'InstitutionAddress'), # noqa 0x00080082: ('SQ', '1', "Institution Code Sequence", '', 'InstitutionCodeSequence'), # noqa 0x00080090: ('PN', '1', "Referring Physician's Name", '', 'ReferringPhysicianName'), # noqa 0x00080092: ('ST', '1', "Referring Physician's Address", '', 'ReferringPhysicianAddress'), # noqa 0x00080094: ('SH', '1-n', "Referring Physician's Telephone Numbers", '', 'ReferringPhysicianTelephoneNumbers'), # noqa 0x00080096: ('SQ', '1', "Referring Physician Identification Sequence", '', 'ReferringPhysicianIdentificationSequence'), # noqa 0x0008009C: ('PN', '1-n', "Consulting Physician's Name", '', 'ConsultingPhysicianName'), # noqa 0x0008009D: ('SQ', '1', "Consulting Physician Identification Sequence", '', 'ConsultingPhysicianIdentificationSequence'), # noqa 0x00080100: ('SH', '1', "Code Value", '', 'CodeValue'), # noqa 0x00080101: ('LO', '1', "Extended Code Value", '', 'ExtendedCodeValue'), # noqa 0x00080102: ('SH', '1', "Coding Scheme Designator", '', 'CodingSchemeDesignator'), # noqa 0x00080103: ('SH', '1', "Coding Scheme Version", '', 'CodingSchemeVersion'), # noqa 0x00080104: ('LO', '1', "Code Meaning", '', 'CodeMeaning'), # noqa 0x00080105: ('CS', '1', "Mapping Resource", '', 'MappingResource'), # noqa 0x00080106: ('DT', '1', "Context Group Version", '', 'ContextGroupVersion'), # noqa 0x00080107: ('DT', '1', "Context Group Local Version", '', 'ContextGroupLocalVersion'), # noqa 0x00080108: ('LT', '1', "Extended Code Meaning", '', 'ExtendedCodeMeaning'), # noqa 0x00080109: ('SQ', '1', "Coding Scheme Resources Sequence", '', 'CodingSchemeResourcesSequence'), # noqa 0x0008010A: ('CS', '1', "Coding Scheme URL Type", '', 'CodingSchemeURLType'), # noqa 0x0008010B: ('CS', '1', "Context Group Extension Flag", '', 'ContextGroupExtensionFlag'), # noqa 0x0008010C: ('UI', '1', "Coding Scheme UID", '', 'CodingSchemeUID'), # noqa 0x0008010D: ('UI', '1', "Context Group Extension Creator UID", '', 'ContextGroupExtensionCreatorUID'), # noqa 0x0008010E: ('UR', '1', "Coding Scheme URL", '', 'CodingSchemeURL'), # noqa 0x0008010F: ('CS', '1', "Context Identifier", '', 'ContextIdentifier'), # noqa 0x00080110: ('SQ', '1', "Coding Scheme Identification Sequence", '', 'CodingSchemeIdentificationSequence'), # noqa 0x00080112: ('LO', '1', "Coding Scheme Registry", '', 'CodingSchemeRegistry'), # noqa 0x00080114: ('ST', '1', "Coding Scheme External ID", '', 'CodingSchemeExternalID'), # noqa 0x00080115: ('ST', '1', "Coding Scheme Name", '', 'CodingSchemeName'), # noqa 0x00080116: ('ST', '1', "Coding Scheme Responsible Organization", '', 'CodingSchemeResponsibleOrganization'), # noqa 0x00080117: ('UI', '1', "Context UID", '', 'ContextUID'), # noqa 0x00080118: ('UI', '1', "Mapping Resource UID", '', 'MappingResourceUID'), # noqa 0x00080119: ('UC', '1', "Long Code Value", '', 'LongCodeValue'), # noqa 0x00080120: ('UR', '1', "URN Code Value", '', 'URNCodeValue'), # noqa 0x00080121: ('SQ', '1', "Equivalent Code Sequence", '', 'EquivalentCodeSequence'), # noqa 0x00080122: ('LO', '1', "Mapping Resource Name", '', 'MappingResourceName'), # noqa 0x00080123: ('SQ', '1', "Context Group Identification Sequence", '', 'ContextGroupIdentificationSequence'), # noqa 0x00080124: ('SQ', '1', "Mapping Resource Identification Sequence", '', 'MappingResourceIdentificationSequence'), # noqa 0x00080201: ('SH', '1', "Timezone Offset From UTC", '', 'TimezoneOffsetFromUTC'), # noqa 0x00080202: ('OB', '1', "Retired-blank", 'Retired', ''), # noqa 0x00080220: ('SQ', '1', "Responsible Group Code Sequence", '', 'ResponsibleGroupCodeSequence'), # noqa 0x00080221: ('CS', '1', "Equipment Modality", '', 'EquipmentModality'), # noqa 0x00080222: ('LO', '1', "Manufacturer's Related Model Group", '', 'ManufacturerRelatedModelGroup'), # noqa 0x00080300: ('SQ', '1', "Private Data Element Characteristics Sequence", '', 'PrivateDataElementCharacteristicsSequence'), # noqa 0x00080301: ('US', '1', "Private Group Reference", '', 'PrivateGroupReference'), # noqa 0x00080302: ('LO', '1', "Private Creator Reference", '', 'PrivateCreatorReference'), # noqa 0x00080303: ('CS', '1', "Block Identifying Information Status", '', 'BlockIdentifyingInformationStatus'), # noqa 0x00080304: ('US', '1-n', "Nonidentifying Private Elements", '', 'NonidentifyingPrivateElements'), # noqa 0x00080305: ('SQ', '1', "Deidentification Action Sequence", '', 'DeidentificationActionSequence'), # noqa 0x00080306: ('US', '1-n', "Identifying Private Elements", '', 'IdentifyingPrivateElements'), # noqa 0x00080307: ('CS', '1', "Deidentification Action", '', 'DeidentificationAction'), # noqa 0x00080308: ('US', '1', "Private Data Element", '', 'PrivateDataElement'), # noqa 0x00080309: ('UL', '1-3', "Private Data Element Value Multiplicity", '', 'PrivateDataElementValueMultiplicity'), # noqa 0x0008030A: ('CS', '1', "Private Data Element Value Representation", '', 'PrivateDataElementValueRepresentation'), # noqa 0x0008030B: ('UL', '1-2', "Private Data Element Number of Items", '', 'PrivateDataElementNumberOfItems'), # noqa 0x0008030C: ('UC', '1', "Private Data Element Name", '', 'PrivateDataElementName'), # noqa 0x0008030D: ('UC', '1', "Private Data Element Keyword", '', 'PrivateDataElementKeyword'), # noqa 0x0008030E: ('UT', '1', "Private Data Element Description", '', 'PrivateDataElementDescription'), # noqa 0x0008030F: ('UT', '1', "Private Data Element Encoding", '', 'PrivateDataElementEncoding'), # noqa 0x00080310: ('SQ', '1', "Private Data Element Definition Sequence", '', 'PrivateDataElementDefinitionSequence'), # noqa 0x00080400: ('SQ', '1', "Scope of Inventory Sequence", '', 'ScopeOfInventorySequence'), # noqa 0x00080401: ('LT', '1', "Inventory Purpose", '', 'InventoryPurpose'), # noqa 0x00080402: ('LT', '1', "Inventory Instance Description", '', 'InventoryInstanceDescription'), # noqa 0x00080403: ('CS', '1', "Inventory Level", '', 'InventoryLevel'), # noqa 0x00080404: ('DT', '1', "Item Inventory DateTime", '', 'ItemInventoryDateTime'), # noqa 0x00080405: ('CS', '1', "Removed from Operational Use", '', 'RemovedFromOperationalUse'), # noqa 0x00080406: ('SQ', '1', "Reason for Removal Code Sequence", '', 'ReasonForRemovalCodeSequence'), # noqa 0x00080407: ('UR', '1', "Stored Instance Base URI", '', 'StoredInstanceBaseURI'), # noqa 0x00080408: ('UR', '1', "Folder Access URI", '', 'FolderAccessURI'), # noqa 0x00080409: ('UR', '1', "File Access URI", '', 'FileAccessURI'), # noqa 0x0008040A: ('CS', '1', "Container File Type", '', 'ContainerFileType'), # noqa 0x0008040B: ('UR', '1', "Filename in Container", '', 'FilenameInContainer'), # noqa 0x0008040C: ('UV', '1', "File Offset in Container", '', 'FileOffsetInContainer'), # noqa 0x0008040D: ('UV', '1', "File Length in Container", '', 'FileLengthInContainer'), # noqa 0x0008040E: ('UI', '1', "Stored Instance Transfer Syntax UID", '', 'StoredInstanceTransferSyntaxUID'), # noqa 0x0008040F: ('CS', '1-n', "Extended Matching Mechanisms", '', 'ExtendedMatchingMechanisms'), # noqa 0x00080410: ('SQ', '1', "Range Matching Sequence", '', 'RangeMatchingSequence'), # noqa 0x00080411: ('SQ', '1', "List of UID Matching Sequence", '', 'ListOfUIDMatchingSequence'), # noqa 0x00080412: ('SQ', '1', "Empty Value Matching Sequence", '', 'EmptyValueMatchingSequence'), # noqa 0x00080413: ('SQ', '1', "General Matching Sequence", '', 'GeneralMatchingSequence'), # noqa 0x00080414: ('US', '1', "Requested Status Interval", '', 'RequestedStatusInterval'), # noqa 0x00080415: ('CS', '1', "Retain Instances", '', 'RetainInstances'), # noqa 0x00080416: ('DT', '1', "Expiration DateTime", '', 'ExpirationDateTime'), # noqa 0x00080417: ('CS', '1', "Transaction Status", '', 'TransactionStatus'), # noqa 0x00080418: ('LT', '1', "Transaction Status Comment", '', 'TransactionStatusComment'), # noqa 0x00080419: ('SQ', '1', "File Set Access Sequence", '', 'FileSetAccessSequence'), # noqa 0x0008041A: ('SQ', '1', "File Access Sequence", '', 'FileAccessSequence'), # noqa 0x0008041B: ('OB', '1', "Record Key", '', 'RecordKey'), # noqa 0x0008041C: ('OB', '1', "Prior Record Key", '', 'PriorRecordKey'), # noqa 0x0008041D: ('SQ', '1', "Metadata Sequence", '', 'MetadataSequence'), # noqa 0x0008041E: ('SQ', '1', "Updated Metadata Sequence", '', 'UpdatedMetadataSequence'), # noqa 0x0008041F: ('DT', '1', "Study Update DateTime", '', 'StudyUpdateDateTime'), # noqa 0x00080420: ('SQ', '1', "Inventory Access End Points Sequence", '', 'InventoryAccessEndPointsSequence'), # noqa 0x00080421: ('SQ', '1', "Study Access End Points Sequence", '', 'StudyAccessEndPointsSequence'), # noqa 0x00080422: ('SQ', '1', "Incorporated Inventory Instance Sequence", '', 'IncorporatedInventoryInstanceSequence'), # noqa 0x00080423: ('SQ', '1', "Inventoried Studies Sequence", '', 'InventoriedStudiesSequence'), # noqa 0x00080424: ('SQ', '1', "Inventoried Series Sequence", '', 'InventoriedSeriesSequence'), # noqa 0x00080425: ('SQ', '1', "Inventoried Instances Sequence", '', 'InventoriedInstancesSequence'), # noqa 0x00080426: ('CS', '1', "Inventory Completion Status", '', 'InventoryCompletionStatus'), # noqa 0x00080427: ('UL', '1', "Number of Study Records in Instance", '', 'NumberOfStudyRecordsInInstance'), # noqa 0x00080428: ('UV', '1', "Total Number of Study Records", '', 'TotalNumberOfStudyRecords'), # noqa 0x00080429: ('UV', '1', "Maximum Number of Records", '', 'MaximumNumberOfRecords'), # noqa 0x00081000: ('AE', '1', "Network ID", 'Retired', 'NetworkID'), # noqa 0x00081010: ('SH', '1', "Station Name", '', 'StationName'), # noqa 0x00081030: ('LO', '1', "Study Description", '', 'StudyDescription'), # noqa 0x00081032: ('SQ', '1', "Procedure Code Sequence", '', 'ProcedureCodeSequence'), # noqa 0x0008103E: ('LO', '1', "Series Description", '', 'SeriesDescription'), # noqa 0x0008103F: ('SQ', '1', "Series Description Code Sequence", '', 'SeriesDescriptionCodeSequence'), # noqa 0x00081040: ('LO', '1', "Institutional Department Name", '', 'InstitutionalDepartmentName'), # noqa 0x00081041: ('SQ', '1', "Institutional Department Type Code Sequence", '', 'InstitutionalDepartmentTypeCodeSequence'), # noqa 0x00081048: ('PN', '1-n', "Physician(s) of Record", '', 'PhysiciansOfRecord'), # noqa 0x00081049: ('SQ', '1', "Physician(s) of Record Identification Sequence", '', 'PhysiciansOfRecordIdentificationSequence'), # noqa 0x00081050: ('PN', '1-n', "Performing Physician's Name", '', 'PerformingPhysicianName'), # noqa 0x00081052: ('SQ', '1', "Performing Physician Identification Sequence", '', 'PerformingPhysicianIdentificationSequence'), # noqa 0x00081060: ('PN', '1-n', "Name of Physician(s) Reading Study", '', 'NameOfPhysiciansReadingStudy'), # noqa 0x00081062: ('SQ', '1', "Physician(s) Reading Study Identification Sequence", '', 'PhysiciansReadingStudyIdentificationSequence'), # noqa 0x00081070: ('PN', '1-n', "Operators' Name", '', 'OperatorsName'), # noqa 0x00081072: ('SQ', '1', "Operator Identification Sequence", '', 'OperatorIdentificationSequence'), # noqa 0x00081080: ('LO', '1-n', "Admitting Diagnoses Description", '', 'AdmittingDiagnosesDescription'), # noqa 0x00081084: ('SQ', '1', "Admitting Diagnoses Code Sequence", '', 'AdmittingDiagnosesCodeSequence'), # noqa 0x00081088: ('LO', '1', "Pyramid Description", '', 'PyramidDescription'), # noqa 0x00081090: ('LO', '1', "Manufacturer's Model Name", '', 'ManufacturerModelName'), # noqa 0x00081100: ('SQ', '1', "Referenced Results Sequence", 'Retired', 'ReferencedResultsSequence'), # noqa 0x00081110: ('SQ', '1', "Referenced Study Sequence", '', 'ReferencedStudySequence'), # noqa 0x00081111: ('SQ', '1', "Referenced Performed Procedure Step Sequence", '', 'ReferencedPerformedProcedureStepSequence'), # noqa 0x00081115: ('SQ', '1', "Referenced Series Sequence", '', 'ReferencedSeriesSequence'), # noqa 0x00081120: ('SQ', '1', "Referenced Patient Sequence", '', 'ReferencedPatientSequence'), # noqa 0x00081125: ('SQ', '1', "Referenced Visit Sequence", '', 'ReferencedVisitSequence'), # noqa 0x00081130: ('SQ', '1', "Referenced Overlay Sequence", 'Retired', 'ReferencedOverlaySequence'), # noqa 0x00081134: ('SQ', '1', "Referenced Stereometric Instance Sequence", '', 'ReferencedStereometricInstanceSequence'), # noqa 0x0008113A: ('SQ', '1', "Referenced Waveform Sequence", '', 'ReferencedWaveformSequence'), # noqa 0x00081140: ('SQ', '1', "Referenced Image Sequence", '', 'ReferencedImageSequence'), # noqa 0x00081145: ('SQ', '1', "Referenced Curve Sequence", 'Retired', 'ReferencedCurveSequence'), # noqa 0x0008114A: ('SQ', '1', "Referenced Instance Sequence", '', 'ReferencedInstanceSequence'), # noqa 0x0008114B: ('SQ', '1', "Referenced Real World Value Mapping Instance Sequence", '', 'ReferencedRealWorldValueMappingInstanceSequence'), # noqa 0x00081150: ('UI', '1', "Referenced SOP Class UID", '', 'ReferencedSOPClassUID'), # noqa 0x00081155: ('UI', '1', "Referenced SOP Instance UID", '', 'ReferencedSOPInstanceUID'), # noqa 0x00081156: ('SQ', '1', "Definition Source Sequence", '', 'DefinitionSourceSequence'), # noqa 0x0008115A: ('UI', '1-n', "SOP Classes Supported", '', 'SOPClassesSupported'), # noqa 0x00081160: ('IS', '1-n', "Referenced Frame Number", '', 'ReferencedFrameNumber'), # noqa 0x00081161: ('UL', '1-n', "Simple Frame List", '', 'SimpleFrameList'), # noqa 0x00081162: ('UL', '3-3n', "Calculated Frame List", '', 'CalculatedFrameList'), # noqa 0x00081163: ('FD', '2', "Time Range", '', 'TimeRange'), # noqa 0x00081164: ('SQ', '1', "Frame Extraction Sequence", '', 'FrameExtractionSequence'), # noqa 0x00081167: ('UI', '1', "Multi-frame Source SOP Instance UID", '', 'MultiFrameSourceSOPInstanceUID'), # noqa 0x00081190: ('UR', '1', "Retrieve URL", '', 'RetrieveURL'), # noqa 0x00081195: ('UI', '1', "Transaction UID", '', 'TransactionUID'), # noqa 0x00081196: ('US', '1', "Warning Reason", '', 'WarningReason'), # noqa 0x00081197: ('US', '1', "Failure Reason", '', 'FailureReason'), # noqa 0x00081198: ('SQ', '1', "Failed SOP Sequence", '', 'FailedSOPSequence'), # noqa 0x00081199: ('SQ', '1', "Referenced SOP Sequence", '', 'ReferencedSOPSequence'), # noqa 0x0008119A: ('SQ', '1', "Other Failures Sequence", '', 'OtherFailuresSequence'), # noqa 0x00081200: ('SQ', '1', "Studies Containing Other Referenced Instances Sequence", '', 'StudiesContainingOtherReferencedInstancesSequence'), # noqa 0x00081250: ('SQ', '1', "Related Series Sequence", '', 'RelatedSeriesSequence'), # noqa 0x00082110: ('CS', '1', "Lossy Image Compression (Retired)", 'Retired', 'LossyImageCompressionRetired'), # noqa 0x00082111: ('ST', '1', "Derivation Description", '', 'DerivationDescription'), # noqa 0x00082112: ('SQ', '1', "Source Image Sequence", '', 'SourceImageSequence'), # noqa 0x00082120: ('SH', '1', "Stage Name", '', 'StageName'), # noqa 0x00082122: ('IS', '1', "Stage Number", '', 'StageNumber'), # noqa 0x00082124: ('IS', '1', "Number of Stages", '', 'NumberOfStages'), # noqa 0x00082127: ('SH', '1', "View Name", '', 'ViewName'), # noqa 0x00082128: ('IS', '1', "View Number", '', 'ViewNumber'), # noqa 0x00082129: ('IS', '1', "Number of Event Timers", '', 'NumberOfEventTimers'), # noqa 0x0008212A: ('IS', '1', "Number of Views in Stage", '', 'NumberOfViewsInStage'), # noqa 0x00082130: ('DS', '1-n', "Event Elapsed Time(s)", '', 'EventElapsedTimes'), # noqa 0x00082132: ('LO', '1-n', "Event Timer Name(s)", '', 'EventTimerNames'), # noqa 0x00082133: ('SQ', '1', "Event Timer Sequence", '', 'EventTimerSequence'), # noqa 0x00082134: ('FD', '1', "Event Time Offset", '', 'EventTimeOffset'), # noqa 0x00082135: ('SQ', '1', "Event Code Sequence", '', 'EventCodeSequence'), # noqa 0x00082142: ('IS', '1', "Start Trim", '', 'StartTrim'), # noqa 0x00082143: ('IS', '1', "Stop Trim", '', 'StopTrim'), # noqa 0x00082144: ('IS', '1', "Recommended Display Frame Rate", '', 'RecommendedDisplayFrameRate'), # noqa 0x00082200: ('CS', '1', "Transducer Position", 'Retired', 'TransducerPosition'), # noqa 0x00082204: ('CS', '1', "Transducer Orientation", 'Retired', 'TransducerOrientation'), # noqa 0x00082208: ('CS', '1', "Anatomic Structure", 'Retired', 'AnatomicStructure'), # noqa 0x00082218: ('SQ', '1', "Anatomic Region Sequence", '', 'AnatomicRegionSequence'), # noqa 0x00082220: ('SQ', '1', "Anatomic Region Modifier Sequence", '', 'AnatomicRegionModifierSequence'), # noqa 0x00082228: ('SQ', '1', "Primary Anatomic Structure Sequence", '', 'PrimaryAnatomicStructureSequence'), # noqa 0x00082229: ('SQ', '1', "Anatomic Structure, Space or Region Sequence", 'Retired', 'AnatomicStructureSpaceOrRegionSequence'), # noqa 0x00082230: ('SQ', '1', "Primary Anatomic Structure Modifier Sequence", '', 'PrimaryAnatomicStructureModifierSequence'), # noqa 0x00082240: ('SQ', '1', "Transducer Position Sequence", 'Retired', 'TransducerPositionSequence'), # noqa 0x00082242: ('SQ', '1', "Transducer Position Modifier Sequence", 'Retired', 'TransducerPositionModifierSequence'), # noqa 0x00082244: ('SQ', '1', "Transducer Orientation Sequence", 'Retired', 'TransducerOrientationSequence'), # noqa 0x00082246: ('SQ', '1', "Transducer Orientation Modifier Sequence", 'Retired', 'TransducerOrientationModifierSequence'), # noqa 0x00082251: ('SQ', '1', "Anatomic Structure Space Or Region Code Sequence (Trial)", 'Retired', 'AnatomicStructureSpaceOrRegionCodeSequenceTrial'), # noqa 0x00082253: ('SQ', '1', "Anatomic Portal Of Entrance Code Sequence (Trial)", 'Retired', 'AnatomicPortalOfEntranceCodeSequenceTrial'), # noqa 0x00082255: ('SQ', '1', "Anatomic Approach Direction Code Sequence (Trial)", 'Retired', 'AnatomicApproachDirectionCodeSequenceTrial'), # noqa 0x00082256: ('ST', '1', "Anatomic Perspective Description (Trial)", 'Retired', 'AnatomicPerspectiveDescriptionTrial'), # noqa 0x00082257: ('SQ', '1', "Anatomic Perspective Code Sequence (Trial)", 'Retired', 'AnatomicPerspectiveCodeSequenceTrial'), # noqa 0x00082258: ('ST', '1', "Anatomic Location Of Examining Instrument Description (Trial)", 'Retired', 'AnatomicLocationOfExaminingInstrumentDescriptionTrial'), # noqa 0x00082259: ('SQ', '1', "Anatomic Location Of Examining Instrument Code Sequence (Trial)", 'Retired', 'AnatomicLocationOfExaminingInstrumentCodeSequenceTrial'), # noqa 0x0008225A: ('SQ', '1', "Anatomic Structure Space Or Region Modifier Code Sequence (Trial)", 'Retired', 'AnatomicStructureSpaceOrRegionModifierCodeSequenceTrial'), # noqa 0x0008225C: ('SQ', '1', "On Axis Background Anatomic Structure Code Sequence (Trial)", 'Retired', 'OnAxisBackgroundAnatomicStructureCodeSequenceTrial'), # noqa 0x00083001: ('SQ', '1', "Alternate Representation Sequence", '', 'AlternateRepresentationSequence'), # noqa 0x00083002: ('UI', '1-n', "Available Transfer Syntax UID", '', 'AvailableTransferSyntaxUID'), # noqa 0x00083010: ('UI', '1-n', "Irradiation Event UID", '', 'IrradiationEventUID'), # noqa 0x00083011: ('SQ', '1', "Source Irradiation Event Sequence", '', 'SourceIrradiationEventSequence'), # noqa 0x00083012: ('UI', '1', "Radiopharmaceutical Administration Event UID", '', 'RadiopharmaceuticalAdministrationEventUID'), # noqa 0x00084000: ('LT', '1', "Identifying Comments", 'Retired', 'IdentifyingComments'), # noqa 0x00089007: ('CS', '4-5', "Frame Type", '', 'FrameType'), # noqa 0x00089092: ('SQ', '1', "Referenced Image Evidence Sequence", '', 'ReferencedImageEvidenceSequence'), # noqa 0x00089121: ('SQ', '1', "Referenced Raw Data Sequence", '', 'ReferencedRawDataSequence'), # noqa 0x00089123: ('UI', '1', "Creator-Version UID", '', 'CreatorVersionUID'), # noqa 0x00089124: ('SQ', '1', "Derivation Image Sequence", '', 'DerivationImageSequence'), # noqa 0x00089154: ('SQ', '1', "Source Image Evidence Sequence", '', 'SourceImageEvidenceSequence'), # noqa 0x00089205: ('CS', '1', "Pixel Presentation", '', 'PixelPresentation'), # noqa 0x00089206: ('CS', '1', "Volumetric Properties", '', 'VolumetricProperties'), # noqa 0x00089207: ('CS', '1', "Volume Based Calculation Technique", '', 'VolumeBasedCalculationTechnique'), # noqa 0x00089208: ('CS', '1', "Complex Image Component", '', 'ComplexImageComponent'), # noqa 0x00089209: ('CS', '1', "Acquisition Contrast", '', 'AcquisitionContrast'), # noqa 0x00089215: ('SQ', '1', "Derivation Code Sequence", '', 'DerivationCodeSequence'), # noqa 0x00089237: ('SQ', '1', "Referenced Presentation State Sequence", '', 'ReferencedPresentationStateSequence'), # noqa 0x00089410: ('SQ', '1', "Referenced Other Plane Sequence", '', 'ReferencedOtherPlaneSequence'), # noqa 0x00089458: ('SQ', '1', "Frame Display Sequence", '', 'FrameDisplaySequence'), # noqa 0x00089459: ('FL', '1', "Recommended Display Frame Rate in Float", '', 'RecommendedDisplayFrameRateInFloat'), # noqa 0x00089460: ('CS', '1', "Skip Frame Range Flag", '', 'SkipFrameRangeFlag'), # noqa 0x00100010: ('PN', '1', "Patient's Name", '', 'PatientName'), # noqa 0x00100020: ('LO', '1', "Patient ID", '', 'PatientID'), # noqa 0x00100021: ('LO', '1', "Issuer of Patient ID", '', 'IssuerOfPatientID'), # noqa 0x00100022: ('CS', '1', "Type of Patient ID", '', 'TypeOfPatientID'), # noqa 0x00100024: ('SQ', '1', "Issuer of Patient ID Qualifiers Sequence", '', 'IssuerOfPatientIDQualifiersSequence'), # noqa 0x00100026: ('SQ', '1', "Source Patient Group Identification Sequence", '', 'SourcePatientGroupIdentificationSequence'), # noqa 0x00100027: ('SQ', '1', "Group of Patients Identification Sequence", '', 'GroupOfPatientsIdentificationSequence'), # noqa 0x00100028: ('US', '3', "Subject Relative Position in Image", '', 'SubjectRelativePositionInImage'), # noqa 0x00100030: ('DA', '1', "Patient's Birth Date", '', 'PatientBirthDate'), # noqa 0x00100032: ('TM', '1', "Patient's Birth Time", '', 'PatientBirthTime'), # noqa 0x00100033: ('LO', '1', "Patient's Birth Date in Alternative Calendar", '', 'PatientBirthDateInAlternativeCalendar'), # noqa 0x00100034: ('LO', '1', "Patient's Death Date in Alternative Calendar", '', 'PatientDeathDateInAlternativeCalendar'), # noqa 0x00100035: ('CS', '1', "Patient's Alternative Calendar", '', 'PatientAlternativeCalendar'), # noqa 0x00100040: ('CS', '1', "Patient's Sex", '', 'PatientSex'), # noqa 0x00100050: ('SQ', '1', "Patient's Insurance Plan Code Sequence", '', 'PatientInsurancePlanCodeSequence'), # noqa 0x00100101: ('SQ', '1', "Patient's Primary Language Code Sequence", '', 'PatientPrimaryLanguageCodeSequence'), # noqa 0x00100102: ('SQ', '1', "Patient's Primary Language Modifier Code Sequence", '', 'PatientPrimaryLanguageModifierCodeSequence'), # noqa 0x00100200: ('CS', '1', "Quality Control Subject", '', 'QualityControlSubject'), # noqa 0x00100201: ('SQ', '1', "Quality Control Subject Type Code Sequence", '', 'QualityControlSubjectTypeCodeSequence'), # noqa 0x00100212: ('UC', '1', "Strain Description", '', 'StrainDescription'), # noqa 0x00100213: ('LO', '1', "Strain Nomenclature", '', 'StrainNomenclature'), # noqa 0x00100214: ('LO', '1', "Strain Stock Number", '', 'StrainStockNumber'), # noqa 0x00100215: ('SQ', '1', "Strain Source Registry Code Sequence", '', 'StrainSourceRegistryCodeSequence'), # noqa 0x00100216: ('SQ', '1', "Strain Stock Sequence", '', 'StrainStockSequence'), # noqa 0x00100217: ('LO', '1', "Strain Source", '', 'StrainSource'), # noqa 0x00100218: ('UT', '1', "Strain Additional Information", '', 'StrainAdditionalInformation'), # noqa 0x00100219: ('SQ', '1', "Strain Code Sequence", '', 'StrainCodeSequence'), # noqa 0x00100221: ('SQ', '1', "Genetic Modifications Sequence", '', 'GeneticModificationsSequence'), # noqa 0x00100222: ('UC', '1', "Genetic Modifications Description", '', 'GeneticModificationsDescription'), # noqa 0x00100223: ('LO', '1', "Genetic Modifications Nomenclature", '', 'GeneticModificationsNomenclature'), # noqa 0x00100229: ('SQ', '1', "Genetic Modifications Code Sequence", '', 'GeneticModificationsCodeSequence'), # noqa 0x00101000: ('LO', '1-n', "Other Patient IDs", 'Retired', 'OtherPatientIDs'), # noqa 0x00101001: ('PN', '1-n', "Other Patient Names", '', 'OtherPatientNames'), # noqa 0x00101002: ('SQ', '1', "Other Patient IDs Sequence", '', 'OtherPatientIDsSequence'), # noqa 0x00101005: ('PN', '1', "Patient's Birth Name", '', 'PatientBirthName'), # noqa 0x00101010: ('AS', '1', "Patient's Age", '', 'PatientAge'), # noqa 0x00101020: ('DS', '1', "Patient's Size", '', 'PatientSize'), # noqa 0x00101021: ('SQ', '1', "Patient's Size Code Sequence", '', 'PatientSizeCodeSequence'), # noqa 0x00101022: ('DS', '1', "Patient's Body Mass Index", '', 'PatientBodyMassIndex'), # noqa 0x00101023: ('DS', '1', "Measured AP Dimension", '', 'MeasuredAPDimension'), # noqa 0x00101024: ('DS', '1', "Measured Lateral Dimension", '', 'MeasuredLateralDimension'), # noqa 0x00101030: ('DS', '1', "Patient's Weight", '', 'PatientWeight'), # noqa 0x00101040: ('LO', '1', "Patient's Address", '', 'PatientAddress'), # noqa 0x00101050: ('LO', '1-n', "Insurance Plan Identification", 'Retired', 'InsurancePlanIdentification'), # noqa 0x00101060: ('PN', '1', "Patient's Mother's Birth Name", '', 'PatientMotherBirthName'), # noqa 0x00101080: ('LO', '1', "Military Rank", '', 'MilitaryRank'), # noqa 0x00101081: ('LO', '1', "Branch of Service", '', 'BranchOfService'), # noqa 0x00101090: ('LO', '1', "Medical Record Locator", 'Retired', 'MedicalRecordLocator'), # noqa 0x00101100: ('SQ', '1', "Referenced Patient Photo Sequence", '', 'ReferencedPatientPhotoSequence'), # noqa 0x00102000: ('LO', '1-n', "Medical Alerts", '', 'MedicalAlerts'), # noqa 0x00102110: ('LO', '1-n', "Allergies", '', 'Allergies'), # noqa 0x00102150: ('LO', '1', "Country of Residence", '', 'CountryOfResidence'), # noqa 0x00102152: ('LO', '1', "Region of Residence", '', 'RegionOfResidence'), # noqa 0x00102154: ('SH', '1-n', "Patient's Telephone Numbers", '', 'PatientTelephoneNumbers'), # noqa 0x00102155: ('LT', '1', "Patient's Telecom Information", '', 'PatientTelecomInformation'), # noqa 0x00102160: ('SH', '1', "Ethnic Group", '', 'EthnicGroup'), # noqa 0x00102180: ('SH', '1', "Occupation", '', 'Occupation'), # noqa 0x001021A0: ('CS', '1', "Smoking Status", '', 'SmokingStatus'), # noqa 0x001021B0: ('LT', '1', "Additional Patient History", '', 'AdditionalPatientHistory'), # noqa 0x001021C0: ('US', '1', "Pregnancy Status", '', 'PregnancyStatus'), # noqa 0x001021D0: ('DA', '1', "Last Menstrual Date", '', 'LastMenstrualDate'), # noqa 0x001021F0: ('LO', '1', "Patient's Religious Preference", '', 'PatientReligiousPreference'), # noqa 0x00102201: ('LO', '1', "Patient Species Description", '', 'PatientSpeciesDescription'), # noqa 0x00102202: ('SQ', '1', "Patient Species Code Sequence", '', 'PatientSpeciesCodeSequence'), # noqa 0x00102203: ('CS', '1', "Patient's Sex Neutered", '', 'PatientSexNeutered'), # noqa 0x00102210: ('CS', '1', "Anatomical Orientation Type", '', 'AnatomicalOrientationType'), # noqa 0x00102292: ('LO', '1', "Patient Breed Description", '', 'PatientBreedDescription'), # noqa 0x00102293: ('SQ', '1', "Patient Breed Code Sequence", '', 'PatientBreedCodeSequence'), # noqa 0x00102294: ('SQ', '1', "Breed Registration Sequence", '', 'BreedRegistrationSequence'), # noqa 0x00102295: ('LO', '1', "Breed Registration Number", '', 'BreedRegistrationNumber'), # noqa 0x00102296: ('SQ', '1', "Breed Registry Code Sequence", '', 'BreedRegistryCodeSequence'), # noqa 0x00102297: ('PN', '1', "Responsible Person", '', 'ResponsiblePerson'), # noqa 0x00102298: ('CS', '1', "Responsible Person Role", '', 'ResponsiblePersonRole'), # noqa 0x00102299: ('LO', '1', "Responsible Organization", '', 'ResponsibleOrganization'), # noqa 0x00104000: ('LT', '1', "Patient Comments", '', 'PatientComments'), # noqa 0x00109431: ('FL', '1', "Examined Body Thickness", '', 'ExaminedBodyThickness'), # noqa 0x00120010: ('LO', '1', "Clinical Trial Sponsor Name", '', 'ClinicalTrialSponsorName'), # noqa 0x00120020: ('LO', '1', "Clinical Trial Protocol ID", '', 'ClinicalTrialProtocolID'), # noqa 0x00120021: ('LO', '1', "Clinical Trial Protocol Name", '', 'ClinicalTrialProtocolName'), # noqa 0x00120030: ('LO', '1', "Clinical Trial Site ID", '', 'ClinicalTrialSiteID'), # noqa 0x00120031: ('LO', '1', "Clinical Trial Site Name", '', 'ClinicalTrialSiteName'), # noqa 0x00120040: ('LO', '1', "Clinical Trial Subject ID", '', 'ClinicalTrialSubjectID'), # noqa 0x00120042: ('LO', '1', "Clinical Trial Subject Reading ID", '', 'ClinicalTrialSubjectReadingID'), # noqa 0x00120050: ('LO', '1', "Clinical Trial Time Point ID", '', 'ClinicalTrialTimePointID'), # noqa 0x00120051: ('ST', '1', "Clinical Trial Time Point Description", '', 'ClinicalTrialTimePointDescription'), # noqa 0x00120052: ('FD', '1', "Longitudinal Temporal Offset from Event", '', 'LongitudinalTemporalOffsetFromEvent'), # noqa 0x00120053: ('CS', '1', "Longitudinal Temporal Event Type", '', 'LongitudinalTemporalEventType'), # noqa 0x00120054: ('SQ', '1', "Clinical Trial Time Point Type Code Sequence", '', 'ClinicalTrialTimePointTypeCodeSequence'), # noqa 0x00120060: ('LO', '1', "Clinical Trial Coordinating Center Name", '', 'ClinicalTrialCoordinatingCenterName'), # noqa 0x00120062: ('CS', '1', "Patient Identity Removed", '', 'PatientIdentityRemoved'), # noqa 0x00120063: ('LO', '1-n', "De-identification Method", '', 'DeidentificationMethod'), # noqa 0x00120064: ('SQ', '1', "De-identification Method Code Sequence", '', 'DeidentificationMethodCodeSequence'), # noqa 0x00120071: ('LO', '1', "Clinical Trial Series ID", '', 'ClinicalTrialSeriesID'), # noqa 0x00120072: ('LO', '1', "Clinical Trial Series Description", '', 'ClinicalTrialSeriesDescription'), # noqa 0x00120081: ('LO', '1', "Clinical Trial Protocol Ethics Committee Name", '', 'ClinicalTrialProtocolEthicsCommitteeName'), # noqa 0x00120082: ('LO', '1', "Clinical Trial Protocol Ethics Committee Approval Number", '', 'ClinicalTrialProtocolEthicsCommitteeApprovalNumber'), # noqa 0x00120083: ('SQ', '1', "Consent for Clinical Trial Use Sequence", '', 'ConsentForClinicalTrialUseSequence'), # noqa 0x00120084: ('CS', '1', "Distribution Type", '', 'DistributionType'), # noqa 0x00120085: ('CS', '1', "Consent for Distribution Flag", '', 'ConsentForDistributionFlag'), # noqa 0x00120086: ('DA', '1', "Ethics Committee Approval Effectiveness Start Date", '', 'EthicsCommitteeApprovalEffectivenessStartDate'), # noqa 0x00120087: ('DA', '1', "Ethics Committee Approval Effectiveness End Date", '', 'EthicsCommitteeApprovalEffectivenessEndDate'), # noqa 0x00140023: ('ST', '1', "CAD File Format", 'Retired', 'CADFileFormat'), # noqa 0x00140024: ('ST', '1', "Component Reference System", 'Retired', 'ComponentReferenceSystem'), # noqa 0x00140025: ('ST', '1', "Component Manufacturing Procedure", '', 'ComponentManufacturingProcedure'), # noqa 0x00140028: ('ST', '1', "Component Manufacturer", '', 'ComponentManufacturer'), # noqa 0x00140030: ('DS', '1-n', "Material Thickness", '', 'MaterialThickness'), # noqa 0x00140032: ('DS', '1-n', "Material Pipe Diameter", '', 'MaterialPipeDiameter'), # noqa 0x00140034: ('DS', '1-n', "Material Isolation Diameter", '', 'MaterialIsolationDiameter'), # noqa 0x00140042: ('ST', '1', "Material Grade", '', 'MaterialGrade'), # noqa 0x00140044: ('ST', '1', "Material Properties Description", '', 'MaterialPropertiesDescription'), # noqa 0x00140045: ('ST', '1', "Material Properties File Format (Retired)", 'Retired', 'MaterialPropertiesFileFormatRetired'), # noqa 0x00140046: ('LT', '1', "Material Notes", '', 'MaterialNotes'), # noqa 0x00140050: ('CS', '1', "Component Shape", '', 'ComponentShape'), # noqa 0x00140052: ('CS', '1', "Curvature Type", '', 'CurvatureType'), # noqa 0x00140054: ('DS', '1', "Outer Diameter", '', 'OuterDiameter'), # noqa 0x00140056: ('DS', '1', "Inner Diameter", '', 'InnerDiameter'), # noqa 0x00140100: ('LO', '1-n', "Component Welder IDs", '', 'ComponentWelderIDs'), # noqa 0x00140101: ('CS', '1', "Secondary Approval Status", '', 'SecondaryApprovalStatus'), # noqa 0x00140102: ('DA', '1', "Secondary Review Date", '', 'SecondaryReviewDate'), # noqa 0x00140103: ('TM', '1', "Secondary Review Time", '', 'SecondaryReviewTime'), # noqa 0x00140104: ('PN', '1', "Secondary Reviewer Name", '', 'SecondaryReviewerName'), # noqa 0x00140105: ('ST', '1', "Repair ID", '', 'RepairID'), # noqa 0x00140106: ('SQ', '1', "Multiple Component Approval Sequence", '', 'MultipleComponentApprovalSequence'), # noqa 0x00140107: ('CS', '1-n', "Other Approval Status", '', 'OtherApprovalStatus'), # noqa 0x00140108: ('CS', '1-n', "Other Secondary Approval Status", '', 'OtherSecondaryApprovalStatus'), # noqa 0x00140200: ('SQ', '1', "Data Element Label Sequence", '', 'DataElementLabelSequence'), # noqa 0x00140201: ('SQ', '1', "Data Element Label Item Sequence", '', 'DataElementLabelItemSequence'), # noqa 0x00140202: ('AT', '1', "Data Element", '', 'DataElement'), # noqa 0x00140203: ('LO', '1', "Data Element Name", '', 'DataElementName'), # noqa 0x00140204: ('LO', '1', "Data Element Description", '', 'DataElementDescription'), # noqa 0x00140205: ('CS', '1', "Data Element Conditionality", '', 'DataElementConditionality'), # noqa 0x00140206: ('IS', '1', "Data Element Minimum Characters", '', 'DataElementMinimumCharacters'), # noqa 0x00140207: ('IS', '1', "Data Element Maximum Characters", '', 'DataElementMaximumCharacters'), # noqa 0x00141010: ('ST', '1', "Actual Environmental Conditions", '', 'ActualEnvironmentalConditions'), # noqa 0x00141020: ('DA', '1', "Expiry Date", '', 'ExpiryDate'), # noqa 0x00141040: ('ST', '1', "Environmental Conditions", '', 'EnvironmentalConditions'), # noqa 0x00142002: ('SQ', '1', "Evaluator Sequence", '', 'EvaluatorSequence'), # noqa 0x00142004: ('IS', '1', "Evaluator Number", '', 'EvaluatorNumber'), # noqa 0x00142006: ('PN', '1', "Evaluator Name", '', 'EvaluatorName'), # noqa 0x00142008: ('IS', '1', "Evaluation Attempt", '', 'EvaluationAttempt'), # noqa 0x00142012: ('SQ', '1', "Indication Sequence", '', 'IndicationSequence'), # noqa 0x00142014: ('IS', '1', "Indication Number", '', 'IndicationNumber'), # noqa 0x00142016: ('SH', '1', "Indication Label", '', 'IndicationLabel'), # noqa 0x00142018: ('ST', '1', "Indication Description", '', 'IndicationDescription'), # noqa 0x0014201A: ('CS', '1-n', "Indication Type", '', 'IndicationType'), # noqa 0x0014201C: ('CS', '1', "Indication Disposition", '', 'IndicationDisposition'), # noqa 0x0014201E: ('SQ', '1', "Indication ROI Sequence", '', 'IndicationROISequence'), # noqa 0x00142030: ('SQ', '1', "Indication Physical Property Sequence", '', 'IndicationPhysicalPropertySequence'), # noqa 0x00142032: ('SH', '1', "Property Label", '', 'PropertyLabel'), # noqa 0x00142202: ('IS', '1', "Coordinate System Number of Axes", '', 'CoordinateSystemNumberOfAxes'), # noqa 0x00142204: ('SQ', '1', "Coordinate System Axes Sequence", '', 'CoordinateSystemAxesSequence'), # noqa 0x00142206: ('ST', '1', "Coordinate System Axis Description", '', 'CoordinateSystemAxisDescription'), # noqa 0x00142208: ('CS', '1', "Coordinate System Data Set Mapping", '', 'CoordinateSystemDataSetMapping'), # noqa 0x0014220A: ('IS', '1', "Coordinate System Axis Number", '', 'CoordinateSystemAxisNumber'), # noqa 0x0014220C: ('CS', '1', "Coordinate System Axis Type", '', 'CoordinateSystemAxisType'), # noqa 0x0014220E: ('CS', '1', "Coordinate System Axis Units", '', 'CoordinateSystemAxisUnits'), # noqa 0x00142210: ('OB', '1', "Coordinate System Axis Values", '', 'CoordinateSystemAxisValues'), # noqa 0x00142220: ('SQ', '1', "Coordinate System Transform Sequence", '', 'CoordinateSystemTransformSequence'), # noqa 0x00142222: ('ST', '1', "Transform Description", '', 'TransformDescription'), # noqa 0x00142224: ('IS', '1', "Transform Number of Axes", '', 'TransformNumberOfAxes'), # noqa 0x00142226: ('IS', '1-n', "Transform Order of Axes", '', 'TransformOrderOfAxes'), # noqa 0x00142228: ('CS', '1', "Transformed Axis Units", '', 'TransformedAxisUnits'), # noqa 0x0014222A: ('DS', '1-n', "Coordinate System Transform Rotation and Scale Matrix", '', 'CoordinateSystemTransformRotationAndScaleMatrix'), # noqa 0x0014222C: ('DS', '1-n', "Coordinate System Transform Translation Matrix", '', 'CoordinateSystemTransformTranslationMatrix'), # noqa 0x00143011: ('DS', '1', "Internal Detector Frame Time", '', 'InternalDetectorFrameTime'), # noqa 0x00143012: ('DS', '1', "Number of Frames Integrated", '', 'NumberOfFramesIntegrated'), # noqa 0x00143020: ('SQ', '1', "Detector Temperature Sequence", '', 'DetectorTemperatureSequence'), # noqa 0x00143022: ('ST', '1', "Sensor Name", '', 'SensorName'), # noqa 0x00143024: ('DS', '1', "Horizontal Offset of Sensor", '', 'HorizontalOffsetOfSensor'), # noqa 0x00143026: ('DS', '1', "Vertical Offset of Sensor", '', 'VerticalOffsetOfSensor'), # noqa 0x00143028: ('DS', '1', "Sensor Temperature", '', 'SensorTemperature'), # noqa 0x00143040: ('SQ', '1', "Dark Current Sequence", '', 'DarkCurrentSequence'), # noqa 0x00143050: ('OB or OW', '1', "Dark Current Counts", '', 'DarkCurrentCounts'), # noqa 0x00143060: ('SQ', '1', "Gain Correction Reference Sequence", '', 'GainCorrectionReferenceSequence'), # noqa 0x00143070: ('OB or OW', '1', "Air Counts", '', 'AirCounts'), # noqa 0x00143071: ('DS', '1', "KV Used in Gain Calibration", '', 'KVUsedInGainCalibration'), # noqa 0x00143072: ('DS', '1', "MA Used in Gain Calibration", '', 'MAUsedInGainCalibration'), # noqa 0x00143073: ('DS', '1', "Number of Frames Used for Integration", '', 'NumberOfFramesUsedForIntegration'), # noqa 0x00143074: ('LO', '1', "Filter Material Used in Gain Calibration", '', 'FilterMaterialUsedInGainCalibration'), # noqa 0x00143075: ('DS', '1', "Filter Thickness Used in Gain Calibration", '', 'FilterThicknessUsedInGainCalibration'), # noqa 0x00143076: ('DA', '1', "Date of Gain Calibration", '', 'DateOfGainCalibration'), # noqa 0x00143077: ('TM', '1', "Time of Gain Calibration", '', 'TimeOfGainCalibration'), # noqa 0x00143080: ('OB', '1', "Bad Pixel Image", '', 'BadPixelImage'), # noqa 0x00143099: ('LT', '1', "Calibration Notes", '', 'CalibrationNotes'), # noqa 0x00143100: ('LT', '1', "Linearity Correction Technique", '', 'LinearityCorrectionTechnique'), # noqa 0x00143101: ('LT', '1', "Beam Hardening Correction Technique", '', 'BeamHardeningCorrectionTechnique'), # noqa 0x00144002: ('SQ', '1', "Pulser Equipment Sequence", '', 'PulserEquipmentSequence'), # noqa 0x00144004: ('CS', '1', "Pulser Type", '', 'PulserType'), # noqa 0x00144006: ('LT', '1', "Pulser Notes", '', 'PulserNotes'), # noqa 0x00144008: ('SQ', '1', "Receiver Equipment Sequence", '', 'ReceiverEquipmentSequence'), # noqa 0x0014400A: ('CS', '1', "Amplifier Type", '', 'AmplifierType'), # noqa 0x0014400C: ('LT', '1', "Receiver Notes", '', 'ReceiverNotes'), # noqa 0x0014400E: ('SQ', '1', "Pre-Amplifier Equipment Sequence", '', 'PreAmplifierEquipmentSequence'), # noqa 0x0014400F: ('LT', '1', "Pre-Amplifier Notes", '', 'PreAmplifierNotes'), # noqa 0x00144010: ('SQ', '1', "Transmit Transducer Sequence", '', 'TransmitTransducerSequence'), # noqa 0x00144011: ('SQ', '1', "Receive Transducer Sequence", '', 'ReceiveTransducerSequence'), # noqa 0x00144012: ('US', '1', "Number of Elements", '', 'NumberOfElements'), # noqa 0x00144013: ('CS', '1', "Element Shape", '', 'ElementShape'), # noqa 0x00144014: ('DS', '1', "Element Dimension A", '', 'ElementDimensionA'), # noqa 0x00144015: ('DS', '1', "Element Dimension B", '', 'ElementDimensionB'), # noqa 0x00144016: ('DS', '1', "Element Pitch A", '', 'ElementPitchA'), # noqa 0x00144017: ('DS', '1', "Measured Beam Dimension A", '', 'MeasuredBeamDimensionA'), # noqa 0x00144018: ('DS', '1', "Measured Beam Dimension B", '', 'MeasuredBeamDimensionB'), # noqa 0x00144019: ('DS', '1', "Location of Measured Beam Diameter", '', 'LocationOfMeasuredBeamDiameter'), # noqa 0x0014401A: ('DS', '1', "Nominal Frequency", '', 'NominalFrequency'), # noqa 0x0014401B: ('DS', '1', "Measured Center Frequency", '', 'MeasuredCenterFrequency'), # noqa 0x0014401C: ('DS', '1', "Measured Bandwidth", '', 'MeasuredBandwidth'), # noqa 0x0014401D: ('DS', '1', "Element Pitch B", '', 'ElementPitchB'), # noqa 0x00144020: ('SQ', '1', "Pulser Settings Sequence", '', 'PulserSettingsSequence'), # noqa 0x00144022: ('DS', '1', "Pulse Width", '', 'PulseWidth'), # noqa 0x00144024: ('DS', '1', "Excitation Frequency", '', 'ExcitationFrequency'), # noqa 0x00144026: ('CS', '1', "Modulation Type", '', 'ModulationType'), # noqa 0x00144028: ('DS', '1', "Damping", '', 'Damping'), # noqa 0x00144030: ('SQ', '1', "Receiver Settings Sequence", '', 'ReceiverSettingsSequence'), # noqa 0x00144031: ('DS', '1', "Acquired Soundpath Length", '', 'AcquiredSoundpathLength'), # noqa 0x00144032: ('CS', '1', "Acquisition Compression Type", '', 'AcquisitionCompressionType'), # noqa 0x00144033: ('IS', '1', "Acquisition Sample Size", '', 'AcquisitionSampleSize'), # noqa 0x00144034: ('DS', '1', "Rectifier Smoothing", '', 'RectifierSmoothing'), # noqa 0x00144035: ('SQ', '1', "DAC Sequence", '', 'DACSequence'), # noqa 0x00144036: ('CS', '1', "DAC Type", '', 'DACType'), # noqa 0x00144038: ('DS', '1-n', "DAC Gain Points", '', 'DACGainPoints'), # noqa 0x0014403A: ('DS', '1-n', "DAC Time Points", '', 'DACTimePoints'), # noqa 0x0014403C: ('DS', '1-n', "DAC Amplitude", '', 'DACAmplitude'), # noqa 0x00144040: ('SQ', '1', "Pre-Amplifier Settings Sequence", '', 'PreAmplifierSettingsSequence'), # noqa 0x00144050: ('SQ', '1', "Transmit Transducer Settings Sequence", '', 'TransmitTransducerSettingsSequence'), # noqa 0x00144051: ('SQ', '1', "Receive Transducer Settings Sequence", '', 'ReceiveTransducerSettingsSequence'), # noqa 0x00144052: ('DS', '1', "Incident Angle", '', 'IncidentAngle'), # noqa 0x00144054: ('ST', '1', "Coupling Technique", '', 'CouplingTechnique'), # noqa 0x00144056: ('ST', '1', "Coupling Medium", '', 'CouplingMedium'), # noqa 0x00144057: ('DS', '1', "Coupling Velocity", '', 'CouplingVelocity'), # noqa 0x00144058: ('DS', '1', "Probe Center Location X", '', 'ProbeCenterLocationX'), # noqa 0x00144059: ('DS', '1', "Probe Center Location Z", '', 'ProbeCenterLocationZ'), # noqa 0x0014405A: ('DS', '1', "Sound Path Length", '', 'SoundPathLength'), # noqa 0x0014405C: ('ST', '1', "Delay Law Identifier", '', 'DelayLawIdentifier'), # noqa 0x00144060: ('SQ', '1', "Gate Settings Sequence", '', 'GateSettingsSequence'), # noqa 0x00144062: ('DS', '1', "Gate Threshold", '', 'GateThreshold'), # noqa 0x00144064: ('DS', '1', "Velocity of Sound", '', 'VelocityOfSound'), # noqa 0x00144070: ('SQ', '1', "Calibration Settings Sequence", '', 'CalibrationSettingsSequence'), # noqa 0x00144072: ('ST', '1', "Calibration Procedure", '', 'CalibrationProcedure'), # noqa 0x00144074: ('SH', '1', "Procedure Version", '', 'ProcedureVersion'), # noqa 0x00144076: ('DA', '1', "Procedure Creation Date", '', 'ProcedureCreationDate'), # noqa 0x00144078: ('DA', '1', "Procedure Expiration Date", '', 'ProcedureExpirationDate'), # noqa 0x0014407A: ('DA', '1', "Procedure Last Modified Date", '', 'ProcedureLastModifiedDate'), # noqa 0x0014407C: ('TM', '1-n', "Calibration Time", '', 'CalibrationTime'), # noqa 0x0014407E: ('DA', '1-n', "Calibration Date", '', 'CalibrationDate'), # noqa 0x00144080: ('SQ', '1', "Probe Drive Equipment Sequence", '', 'ProbeDriveEquipmentSequence'), # noqa 0x00144081: ('CS', '1', "Drive Type", '', 'DriveType'), # noqa 0x00144082: ('LT', '1', "Probe Drive Notes", '', 'ProbeDriveNotes'), # noqa 0x00144083: ('SQ', '1', "Drive Probe Sequence", '', 'DriveProbeSequence'), # noqa 0x00144084: ('DS', '1', "Probe Inductance", '', 'ProbeInductance'), # noqa 0x00144085: ('DS', '1', "Probe Resistance", '', 'ProbeResistance'), # noqa 0x00144086: ('SQ', '1', "Receive Probe Sequence", '', 'ReceiveProbeSequence'), # noqa 0x00144087: ('SQ', '1', "Probe Drive Settings Sequence", '', 'ProbeDriveSettingsSequence'), # noqa 0x00144088: ('DS', '1', "Bridge Resistors", '', 'BridgeResistors'), # noqa 0x00144089: ('DS', '1', "Probe Orientation Angle", '', 'ProbeOrientationAngle'), # noqa 0x0014408B: ('DS', '1', "User Selected Gain Y", '', 'UserSelectedGainY'), # noqa 0x0014408C: ('DS', '1', "User Selected Phase", '', 'UserSelectedPhase'), # noqa 0x0014408D: ('DS', '1', "User Selected Offset X", '', 'UserSelectedOffsetX'), # noqa 0x0014408E: ('DS', '1', "User Selected Offset Y", '', 'UserSelectedOffsetY'), # noqa 0x00144091: ('SQ', '1', "Channel Settings Sequence", '', 'ChannelSettingsSequence'), # noqa 0x00144092: ('DS', '1', "Channel Threshold", '', 'ChannelThreshold'), # noqa 0x0014409A: ('SQ', '1', "Scanner Settings Sequence", '', 'ScannerSettingsSequence'), # noqa 0x0014409B: ('ST', '1', "Scan Procedure", '', 'ScanProcedure'), # noqa 0x0014409C: ('DS', '1', "Translation Rate X", '', 'TranslationRateX'), # noqa 0x0014409D: ('DS', '1', "Translation Rate Y", '', 'TranslationRateY'), # noqa 0x0014409F: ('DS', '1', "Channel Overlap", '', 'ChannelOverlap'), # noqa 0x001440A0: ('LO', '1-n', "Image Quality Indicator Type", '', 'ImageQualityIndicatorType'), # noqa 0x001440A1: ('LO', '1-n', "Image Quality Indicator Material", '', 'ImageQualityIndicatorMaterial'), # noqa 0x001440A2: ('LO', '1-n', "Image Quality Indicator Size", '', 'ImageQualityIndicatorSize'), # noqa 0x00145002: ('IS', '1', "LINAC Energy", '', 'LINACEnergy'), # noqa 0x00145004: ('IS', '1', "LINAC Output", '', 'LINACOutput'), # noqa 0x00145100: ('US', '1', "Active Aperture", '', 'ActiveAperture'), # noqa 0x00145101: ('DS', '1', "Total Aperture", '', 'TotalAperture'), # noqa 0x00145102: ('DS', '1', "Aperture Elevation", '', 'ApertureElevation'), # noqa 0x00145103: ('DS', '1', "Main Lobe Angle", '', 'MainLobeAngle'), # noqa 0x00145104: ('DS', '1', "Main Roof Angle", '', 'MainRoofAngle'), # noqa 0x00145105: ('CS', '1', "Connector Type", '', 'ConnectorType'), # noqa 0x00145106: ('SH', '1', "Wedge Model Number", '', 'WedgeModelNumber'), # noqa 0x00145107: ('DS', '1', "Wedge Angle Float", '', 'WedgeAngleFloat'), # noqa 0x00145108: ('DS', '1', "Wedge Roof Angle", '', 'WedgeRoofAngle'), # noqa 0x00145109: ('CS', '1', "Wedge Element 1 Position", '', 'WedgeElement1Position'), # noqa 0x0014510A: ('DS', '1', "Wedge Material Velocity", '', 'WedgeMaterialVelocity'), # noqa 0x0014510B: ('SH', '1', "Wedge Material", '', 'WedgeMaterial'), # noqa 0x0014510C: ('DS', '1', "Wedge Offset Z", '', 'WedgeOffsetZ'), # noqa 0x0014510D: ('DS', '1', "Wedge Origin Offset X", '', 'WedgeOriginOffsetX'), # noqa 0x0014510E: ('DS', '1', "Wedge Time Delay", '', 'WedgeTimeDelay'), # noqa 0x0014510F: ('SH', '1', "Wedge Name", '', 'WedgeName'), # noqa 0x00145110: ('SH', '1', "Wedge Manufacturer Name", '', 'WedgeManufacturerName'), # noqa 0x00145111: ('LO', '1', "Wedge Description", '', 'WedgeDescription'), # noqa 0x00145112: ('DS', '1', "Nominal Beam Angle", '', 'NominalBeamAngle'), # noqa 0x00145113: ('DS', '1', "Wedge Offset X", '', 'WedgeOffsetX'), # noqa 0x00145114: ('DS', '1', "Wedge Offset Y", '', 'WedgeOffsetY'), # noqa 0x00145115: ('DS', '1', "Wedge Total Length", '', 'WedgeTotalLength'), # noqa 0x00145116: ('DS', '1', "Wedge In Contact Length", '', 'WedgeInContactLength'), # noqa 0x00145117: ('DS', '1', "Wedge Front Gap", '', 'WedgeFrontGap'), # noqa 0x00145118: ('DS', '1', "Wedge Total Height", '', 'WedgeTotalHeight'), # noqa 0x00145119: ('DS', '1', "Wedge Front Height", '', 'WedgeFrontHeight'), # noqa 0x0014511A: ('DS', '1', "Wedge Rear Height", '', 'WedgeRearHeight'), # noqa 0x0014511B: ('DS', '1', "Wedge Total Width", '', 'WedgeTotalWidth'), # noqa 0x0014511C: ('DS', '1', "Wedge In Contact Width", '', 'WedgeInContactWidth'), # noqa 0x0014511D: ('DS', '1', "Wedge Chamfer Height", '', 'WedgeChamferHeight'), # noqa 0x0014511E: ('CS', '1', "Wedge Curve", '', 'WedgeCurve'), # noqa 0x0014511F: ('DS', '1', "Radius Along the Wedge", '', 'RadiusAlongWedge'), # noqa 0x00160001: ('DS', '1', "White Point", '', 'WhitePoint'), # noqa 0x00160002: ('DS', '3', "Primary Chromaticities", '', 'PrimaryChromaticities'), # noqa 0x00160003: ('UT', '1', "Battery Level", '', 'BatteryLevel'), # noqa 0x00160004: ('DS', '1', "Exposure Time in Seconds", '', 'ExposureTimeInSeconds'), # noqa 0x00160005: ('DS', '1', "F-Number", '', 'FNumber'), # noqa 0x00160006: ('IS', '1', "OECF Rows", '', 'OECFRows'), # noqa 0x00160007: ('IS', '1', "OECF Columns", '', 'OECFColumns'), # noqa 0x00160008: ('UC', '1-n', "OECF Column Names", '', 'OECFColumnNames'), # noqa 0x00160009: ('DS', '1-n', "OECF Values", '', 'OECFValues'), # noqa 0x0016000A: ('IS', '1', "Spatial Frequency Response Rows", '', 'SpatialFrequencyResponseRows'), # noqa 0x0016000B: ('IS', '1', "Spatial Frequency Response Columns", '', 'SpatialFrequencyResponseColumns'), # noqa 0x0016000C: ('UC', '1-n', "Spatial Frequency Response Column Names", '', 'SpatialFrequencyResponseColumnNames'), # noqa 0x0016000D: ('DS', '1-n', "Spatial Frequency Response Values", '', 'SpatialFrequencyResponseValues'), # noqa 0x0016000E: ('IS', '1', "Color Filter Array Pattern Rows", '', 'ColorFilterArrayPatternRows'), # noqa 0x0016000F: ('IS', '1', "Color Filter Array Pattern Columns", '', 'ColorFilterArrayPatternColumns'), # noqa 0x00160010: ('DS', '1-n', "Color Filter Array Pattern Values", '', 'ColorFilterArrayPatternValues'), # noqa 0x00160011: ('US', '1', "Flash Firing Status", '', 'FlashFiringStatus'), # noqa 0x00160012: ('US', '1', "Flash Return Status", '', 'FlashReturnStatus'), # noqa 0x00160013: ('US', '1', "Flash Mode", '', 'FlashMode'), # noqa 0x00160014: ('US', '1', "Flash Function Present", '', 'FlashFunctionPresent'), # noqa 0x00160015: ('US', '1', "Flash Red Eye Mode", '', 'FlashRedEyeMode'), # noqa 0x00160016: ('US', '1', "Exposure Program", '', 'ExposureProgram'), # noqa 0x00160017: ('UT', '1', "Spectral Sensitivity", '', 'SpectralSensitivity'), # noqa 0x00160018: ('IS', '1', "Photographic Sensitivity", '', 'PhotographicSensitivity'), # noqa 0x00160019: ('IS', '1', "Self Timer Mode", '', 'SelfTimerMode'), # noqa 0x0016001A: ('US', '1', "Sensitivity Type", '', 'SensitivityType'), # noqa 0x0016001B: ('IS', '1', "Standard Output Sensitivity", '', 'StandardOutputSensitivity'), # noqa 0x0016001C: ('IS', '1', "Recommended Exposure Index", '', 'RecommendedExposureIndex'), # noqa 0x0016001D: ('IS', '1', "ISO Speed", '', 'ISOSpeed'), # noqa 0x0016001E: ('IS', '1', "ISO Speed Latitude yyy", '', 'ISOSpeedLatitudeyyy'), # noqa 0x0016001F: ('IS', '1', "ISO Speed Latitude zzz", '', 'ISOSpeedLatitudezzz'), # noqa 0x00160020: ('UT', '1', "EXIF Version", '', 'EXIFVersion'), # noqa 0x00160021: ('DS', '1', "Shutter Speed Value", '', 'ShutterSpeedValue'), # noqa 0x00160022: ('DS', '1', "Aperture Value", '', 'ApertureValue'), # noqa 0x00160023: ('DS', '1', "Brightness Value", '', 'BrightnessValue'), # noqa 0x00160024: ('DS', '1', "Exposure Bias Value", '', 'ExposureBiasValue'), # noqa 0x00160025: ('DS', '1', "Max Aperture Value", '', 'MaxApertureValue'), # noqa 0x00160026: ('DS', '1', "Subject Distance", '', 'SubjectDistance'), # noqa 0x00160027: ('US', '1', "Metering Mode", '', 'MeteringMode'), # noqa 0x00160028: ('US', '1', "Light Source", '', 'LightSource'), # noqa 0x00160029: ('DS', '1', "Focal Length", '', 'FocalLength'), # noqa 0x0016002A: ('IS', '2-4', "Subject Area", '', 'SubjectArea'), # noqa 0x0016002B: ('OB', '1', "Maker Note", '', 'MakerNote'), # noqa 0x00160030: ('DS', '1', "Temperature", '', 'Temperature'), # noqa 0x00160031: ('DS', '1', "Humidity", '', 'Humidity'), # noqa 0x00160032: ('DS', '1', "Pressure", '', 'Pressure'), # noqa 0x00160033: ('DS', '1', "Water Depth", '', 'WaterDepth'), # noqa 0x00160034: ('DS', '1', "Acceleration", '', 'Acceleration'), # noqa 0x00160035: ('DS', '1', "Camera Elevation Angle", '', 'CameraElevationAngle'), # noqa 0x00160036: ('DS', '1-2', "Flash Energy", '', 'FlashEnergy'), # noqa 0x00160037: ('IS', '2', "Subject Location", '', 'SubjectLocation'), # noqa 0x00160038: ('DS', '1', "Photographic Exposure Index", '', 'PhotographicExposureIndex'), # noqa 0x00160039: ('US', '1', "Sensing Method", '', 'SensingMethod'), # noqa 0x0016003A: ('US', '1', "File Source", '', 'FileSource'), # noqa 0x0016003B: ('US', '1', "Scene Type", '', 'SceneType'), # noqa 0x00160041: ('US', '1', "Custom Rendered", '', 'CustomRendered'), # noqa 0x00160042: ('US', '1', "Exposure Mode", '', 'ExposureMode'), # noqa 0x00160043: ('US', '1', "White Balance", '', 'WhiteBalance'), # noqa 0x00160044: ('DS', '1', "Digital Zoom Ratio", '', 'DigitalZoomRatio'), # noqa 0x00160045: ('IS', '1', "Focal Length In 35mm Film", '', 'FocalLengthIn35mmFilm'), # noqa 0x00160046: ('US', '1', "Scene Capture Type", '', 'SceneCaptureType'), # noqa 0x00160047: ('US', '1', "Gain Control", '', 'GainControl'), # noqa 0x00160048: ('US', '1', "Contrast", '', 'Contrast'), # noqa 0x00160049: ('US', '1', "Saturation", '', 'Saturation'), # noqa 0x0016004A: ('US', '1', "Sharpness", '', 'Sharpness'), # noqa 0x0016004B: ('OB', '1', "Device Setting Description", '', 'DeviceSettingDescription'), # noqa 0x0016004C: ('US', '1', "Subject Distance Range", '', 'SubjectDistanceRange'), # noqa 0x0016004D: ('UT', '1', "Camera Owner Name", '', 'CameraOwnerName'), # noqa 0x0016004E: ('DS', '4', "Lens Specification", '', 'LensSpecification'), # noqa 0x0016004F: ('UT', '1', "Lens Make", '', 'LensMake'), # noqa 0x00160050: ('UT', '1', "Lens Model", '', 'LensModel'), # noqa 0x00160051: ('UT', '1', "Lens Serial Number", '', 'LensSerialNumber'), # noqa 0x00160061: ('CS', '1', "Interoperability Index", '', 'InteroperabilityIndex'), # noqa 0x00160062: ('OB', '1', "Interoperability Version", '', 'InteroperabilityVersion'), # noqa 0x00160070: ('OB', '1', "GPS Version ID", '', 'GPSVersionID'), # noqa 0x00160071: ('CS', '1', "GPS Latitude Ref", '', 'GPSLatitudeRef'), # noqa 0x00160072: ('DS', '3', "GPS Latitude", '', 'GPSLatitude'), # noqa 0x00160073: ('CS', '1', "GPS Longitude Ref", '', 'GPSLongitudeRef'), # noqa 0x00160074: ('DS', '3', "GPS Longitude", '', 'GPSLongitude'), # noqa 0x00160075: ('US', '1', "GPS Altitude Ref", '', 'GPSAltitudeRef'), # noqa 0x00160076: ('DS', '1', "GPS Altitude", '', 'GPSAltitude'), # noqa 0x00160077: ('DT', '1', "GPS Time Stamp", '', 'GPSTimeStamp'), # noqa 0x00160078: ('UT', '1', "GPS Satellites", '', 'GPSSatellites'), # noqa 0x00160079: ('CS', '1', "GPS Status", '', 'GPSStatus'), # noqa 0x0016007A: ('CS', '1', "GPS Measure Mode", '', 'GPSMeasureMode'), # noqa 0x0016007B: ('DS', '1', "GPS DOP", '', 'GPSDOP'), # noqa 0x0016007C: ('CS', '1', "GPS Speed Ref", '', 'GPSSpeedRef'), # noqa 0x0016007D: ('DS', '1', "GPS Speed", '', 'GPSSpeed'), # noqa 0x0016007E: ('CS', '1', "GPS Track Ref", '', 'GPSTrackRef'), # noqa 0x0016007F: ('DS', '1', "GPS Track", '', 'GPSTrack'), # noqa 0x00160080: ('CS', '1', "GPS Img Direction Ref", '', 'GPSImgDirectionRef'), # noqa 0x00160081: ('DS', '1', "GPS Img Direction", '', 'GPSImgDirection'), # noqa 0x00160082: ('UT', '1', "GPS Map Datum", '', 'GPSMapDatum'), # noqa 0x00160083: ('CS', '1', "GPS Dest Latitude Ref", '', 'GPSDestLatitudeRef'), # noqa 0x00160084: ('DS', '3', "GPS Dest Latitude", '', 'GPSDestLatitude'), # noqa 0x00160085: ('CS', '1', "GPS Dest Longitude Ref", '', 'GPSDestLongitudeRef'), # noqa 0x00160086: ('DS', '3', "GPS Dest Longitude", '', 'GPSDestLongitude'), # noqa 0x00160087: ('CS', '1', "GPS Dest Bearing Ref", '', 'GPSDestBearingRef'), # noqa 0x00160088: ('DS', '1', "GPS Dest Bearing", '', 'GPSDestBearing'), # noqa 0x00160089: ('CS', '1', "GPS Dest Distance Ref", '', 'GPSDestDistanceRef'), # noqa 0x0016008A: ('DS', '1', "GPS Dest Distance", '', 'GPSDestDistance'), # noqa 0x0016008B: ('OB', '1', "GPS Processing Method", '', 'GPSProcessingMethod'), # noqa 0x0016008C: ('OB', '1', "GPS Area Information", '', 'GPSAreaInformation'), # noqa 0x0016008D: ('DT', '1', "GPS Date Stamp", '', 'GPSDateStamp'), # noqa 0x0016008E: ('IS', '1', "GPS Differential", '', 'GPSDifferential'), # noqa 0x00161001: ('CS', '1', "Light Source Polarization", '', 'LightSourcePolarization'), # noqa 0x00161002: ('DS', '1', "Emitter Color Temperature", '', 'EmitterColorTemperature'), # noqa 0x00161003: ('CS', '1', "Contact Method", '', 'ContactMethod'), # noqa 0x00161004: ('CS', '1-n', "Immersion Media", '', 'ImmersionMedia'), # noqa 0x00161005: ('DS', '1', "Optical Magnification Factor", '', 'OpticalMagnificationFactor'), # noqa 0x00180010: ('LO', '1', "Contrast/Bolus Agent", '', 'ContrastBolusAgent'), # noqa 0x00180012: ('SQ', '1', "Contrast/Bolus Agent Sequence", '', 'ContrastBolusAgentSequence'), # noqa 0x00180013: ('FL', '1', "Contrast/Bolus T1 Relaxivity", '', 'ContrastBolusT1Relaxivity'), # noqa 0x00180014: ('SQ', '1', "Contrast/Bolus Administration Route Sequence", '', 'ContrastBolusAdministrationRouteSequence'), # noqa 0x00180015: ('CS', '1', "Body Part Examined", '', 'BodyPartExamined'), # noqa 0x00180020: ('CS', '1-n', "Scanning Sequence", '', 'ScanningSequence'), # noqa 0x00180021: ('CS', '1-n', "Sequence Variant", '', 'SequenceVariant'), # noqa 0x00180022: ('CS', '1-n', "Scan Options", '', 'ScanOptions'), # noqa 0x00180023: ('CS', '1', "MR Acquisition Type", '', 'MRAcquisitionType'), # noqa 0x00180024: ('SH', '1', "Sequence Name", '', 'SequenceName'), # noqa 0x00180025: ('CS', '1', "Angio Flag", '', 'AngioFlag'), # noqa 0x00180026: ('SQ', '1', "Intervention Drug Information Sequence", '', 'InterventionDrugInformationSequence'), # noqa 0x00180027: ('TM', '1', "Intervention Drug Stop Time", '', 'InterventionDrugStopTime'), # noqa 0x00180028: ('DS', '1', "Intervention Drug Dose", '', 'InterventionDrugDose'), # noqa 0x00180029: ('SQ', '1', "Intervention Drug Code Sequence", '', 'InterventionDrugCodeSequence'), # noqa 0x0018002A: ('SQ', '1', "Additional Drug Sequence", '', 'AdditionalDrugSequence'), # noqa 0x00180030: ('LO', '1-n', "Radionuclide", 'Retired', 'Radionuclide'), # noqa 0x00180031: ('LO', '1', "Radiopharmaceutical", '', 'Radiopharmaceutical'), # noqa 0x00180032: ('DS', '1', "Energy Window Centerline", 'Retired', 'EnergyWindowCenterline'), # noqa 0x00180033: ('DS', '1-n', "Energy Window Total Width", 'Retired', 'EnergyWindowTotalWidth'), # noqa 0x00180034: ('LO', '1', "Intervention Drug Name", '', 'InterventionDrugName'), # noqa 0x00180035: ('TM', '1', "Intervention Drug Start Time", '', 'InterventionDrugStartTime'), # noqa 0x00180036: ('SQ', '1', "Intervention Sequence", '', 'InterventionSequence'), # noqa 0x00180037: ('CS', '1', "Therapy Type", 'Retired', 'TherapyType'), # noqa 0x00180038: ('CS', '1', "Intervention Status", '', 'InterventionStatus'), # noqa 0x00180039: ('CS', '1', "Therapy Description", 'Retired', 'TherapyDescription'), # noqa 0x0018003A: ('ST', '1', "Intervention Description", '', 'InterventionDescription'), # noqa 0x00180040: ('IS', '1', "Cine Rate", '', 'CineRate'), # noqa 0x00180042: ('CS', '1', "Initial Cine Run State", '', 'InitialCineRunState'), # noqa 0x00180050: ('DS', '1', "Slice Thickness", '', 'SliceThickness'), # noqa 0x00180060: ('DS', '1', "KVP", '', 'KVP'), # noqa 0x00180061: ('DS', '1', "", 'Retired', ''), # noqa 0x00180070: ('IS', '1', "Counts Accumulated", '', 'CountsAccumulated'), # noqa 0x00180071: ('CS', '1', "Acquisition Termination Condition", '', 'AcquisitionTerminationCondition'), # noqa 0x00180072: ('DS', '1', "Effective Duration", '', 'EffectiveDuration'), # noqa 0x00180073: ('CS', '1', "Acquisition Start Condition", '', 'AcquisitionStartCondition'), # noqa 0x00180074: ('IS', '1', "Acquisition Start Condition Data", '', 'AcquisitionStartConditionData'), # noqa 0x00180075: ('IS', '1', "Acquisition Termination Condition Data", '', 'AcquisitionTerminationConditionData'), # noqa 0x00180080: ('DS', '1', "Repetition Time", '', 'RepetitionTime'), # noqa 0x00180081: ('DS', '1', "Echo Time", '', 'EchoTime'), # noqa 0x00180082: ('DS', '1', "Inversion Time", '', 'InversionTime'), # noqa 0x00180083: ('DS', '1', "Number of Averages", '', 'NumberOfAverages'), # noqa 0x00180084: ('DS', '1', "Imaging Frequency", '', 'ImagingFrequency'), # noqa 0x00180085: ('SH', '1', "Imaged Nucleus", '', 'ImagedNucleus'), # noqa 0x00180086: ('IS', '1-n', "Echo Number(s)", '', 'EchoNumbers'), # noqa 0x00180087: ('DS', '1', "Magnetic Field Strength", '', 'MagneticFieldStrength'), # noqa 0x00180088: ('DS', '1', "Spacing Between Slices", '', 'SpacingBetweenSlices'), # noqa 0x00180089: ('IS', '1', "Number of Phase Encoding Steps", '', 'NumberOfPhaseEncodingSteps'), # noqa 0x00180090: ('DS', '1', "Data Collection Diameter", '', 'DataCollectionDiameter'), # noqa 0x00180091: ('IS', '1', "Echo Train Length", '', 'EchoTrainLength'), # noqa 0x00180093: ('DS', '1', "Percent Sampling", '', 'PercentSampling'), # noqa 0x00180094: ('DS', '1', "Percent Phase Field of View", '', 'PercentPhaseFieldOfView'), # noqa 0x00180095: ('DS', '1', "Pixel Bandwidth", '', 'PixelBandwidth'), # noqa 0x00181000: ('LO', '1', "Device Serial Number", '', 'DeviceSerialNumber'), # noqa 0x00181002: ('UI', '1', "Device UID", '', 'DeviceUID'), # noqa 0x00181003: ('LO', '1', "Device ID", '', 'DeviceID'), # noqa 0x00181004: ('LO', '1', "Plate ID", '', 'PlateID'), # noqa 0x00181005: ('LO', '1', "Generator ID", '', 'GeneratorID'), # noqa 0x00181006: ('LO', '1', "Grid ID", '', 'GridID'), # noqa 0x00181007: ('LO', '1', "Cassette ID", '', 'CassetteID'), # noqa 0x00181008: ('LO', '1', "Gantry ID", '', 'GantryID'), # noqa 0x00181009: ('UT', '1', "Unique Device Identifier", '', 'UniqueDeviceIdentifier'), # noqa 0x0018100A: ('SQ', '1', "UDI Sequence", '', 'UDISequence'), # noqa 0x0018100B: ('UI', '1-n', "Manufacturer's Device Class UID", '', 'ManufacturerDeviceClassUID'), # noqa 0x00181010: ('LO', '1', "Secondary Capture Device ID", '', 'SecondaryCaptureDeviceID'), # noqa 0x00181011: ('LO', '1', "Hardcopy Creation Device ID", 'Retired', 'HardcopyCreationDeviceID'), # noqa 0x00181012: ('DA', '1', "Date of Secondary Capture", '', 'DateOfSecondaryCapture'), # noqa 0x00181014: ('TM', '1', "Time of Secondary Capture", '', 'TimeOfSecondaryCapture'), # noqa 0x00181016: ('LO', '1', "Secondary Capture Device Manufacturer", '', 'SecondaryCaptureDeviceManufacturer'), # noqa 0x00181017: ('LO', '1', "Hardcopy Device Manufacturer", 'Retired', 'HardcopyDeviceManufacturer'), # noqa 0x00181018: ('LO', '1', "Secondary Capture Device Manufacturer's Model Name", '', 'SecondaryCaptureDeviceManufacturerModelName'), # noqa 0x00181019: ('LO', '1-n', "Secondary Capture Device Software Versions", '', 'SecondaryCaptureDeviceSoftwareVersions'), # noqa 0x0018101A: ('LO', '1-n', "Hardcopy Device Software Version", 'Retired', 'HardcopyDeviceSoftwareVersion'), # noqa 0x0018101B: ('LO', '1', "Hardcopy Device Manufacturer's Model Name", 'Retired', 'HardcopyDeviceManufacturerModelName'), # noqa 0x00181020: ('LO', '1-n', "Software Versions", '', 'SoftwareVersions'), # noqa 0x00181022: ('SH', '1', "Video Image Format Acquired", '', 'VideoImageFormatAcquired'), # noqa 0x00181023: ('LO', '1', "Digital Image Format Acquired", '', 'DigitalImageFormatAcquired'), # noqa 0x00181030: ('LO', '1', "Protocol Name", '', 'ProtocolName'), # noqa 0x00181040: ('LO', '1', "Contrast/Bolus Route", '', 'ContrastBolusRoute'), # noqa 0x00181041: ('DS', '1', "Contrast/Bolus Volume", '', 'ContrastBolusVolume'), # noqa 0x00181042: ('TM', '1', "Contrast/Bolus Start Time", '', 'ContrastBolusStartTime'), # noqa 0x00181043: ('TM', '1', "Contrast/Bolus Stop Time", '', 'ContrastBolusStopTime'), # noqa 0x00181044: ('DS', '1', "Contrast/Bolus Total Dose", '', 'ContrastBolusTotalDose'), # noqa 0x00181045: ('IS', '1', "Syringe Counts", '', 'SyringeCounts'), # noqa 0x00181046: ('DS', '1-n', "Contrast Flow Rate", '', 'ContrastFlowRate'), # noqa 0x00181047: ('DS', '1-n', "Contrast Flow Duration", '', 'ContrastFlowDuration'), # noqa 0x00181048: ('CS', '1', "Contrast/Bolus Ingredient", '', 'ContrastBolusIngredient'), # noqa 0x00181049: ('DS', '1', "Contrast/Bolus Ingredient Concentration", '', 'ContrastBolusIngredientConcentration'), # noqa 0x00181050: ('DS', '1', "Spatial Resolution", '', 'SpatialResolution'), # noqa 0x00181060: ('DS', '1', "Trigger Time", '', 'TriggerTime'), # noqa 0x00181061: ('LO', '1', "Trigger Source or Type", '', 'TriggerSourceOrType'), # noqa 0x00181062: ('IS', '1', "Nominal Interval", '', 'NominalInterval'), # noqa 0x00181063: ('DS', '1', "Frame Time", '', 'FrameTime'), # noqa 0x00181064: ('LO', '1', "Cardiac Framing Type", '', 'CardiacFramingType'), # noqa 0x00181065: ('DS', '1-n', "Frame Time Vector", '', 'FrameTimeVector'), # noqa 0x00181066: ('DS', '1', "Frame Delay", '', 'FrameDelay'), # noqa 0x00181067: ('DS', '1', "Image Trigger Delay", '', 'ImageTriggerDelay'), # noqa 0x00181068: ('DS', '1', "Multiplex Group Time Offset", '', 'MultiplexGroupTimeOffset'), # noqa 0x00181069: ('DS', '1', "Trigger Time Offset", '', 'TriggerTimeOffset'), # noqa 0x0018106A: ('CS', '1', "Synchronization Trigger", '', 'SynchronizationTrigger'), # noqa 0x0018106C: ('US', '2', "Synchronization Channel", '', 'SynchronizationChannel'), # noqa 0x0018106E: ('UL', '1', "Trigger Sample Position", '', 'TriggerSamplePosition'), # noqa 0x00181070: ('LO', '1', "Radiopharmaceutical Route", '', 'RadiopharmaceuticalRoute'), # noqa 0x00181071: ('DS', '1', "Radiopharmaceutical Volume", '', 'RadiopharmaceuticalVolume'), # noqa 0x00181072: ('TM', '1', "Radiopharmaceutical Start Time", '', 'RadiopharmaceuticalStartTime'), # noqa 0x00181073: ('TM', '1', "Radiopharmaceutical Stop Time", '', 'RadiopharmaceuticalStopTime'), # noqa 0x00181074: ('DS', '1', "Radionuclide Total Dose", '', 'RadionuclideTotalDose'), # noqa 0x00181075: ('DS', '1', "Radionuclide Half Life", '', 'RadionuclideHalfLife'), # noqa 0x00181076: ('DS', '1', "Radionuclide Positron Fraction", '', 'RadionuclidePositronFraction'), # noqa 0x00181077: ('DS', '1', "Radiopharmaceutical Specific Activity", '', 'RadiopharmaceuticalSpecificActivity'), # noqa 0x00181078: ('DT', '1', "Radiopharmaceutical Start DateTime", '', 'RadiopharmaceuticalStartDateTime'), # noqa 0x00181079: ('DT', '1', "Radiopharmaceutical Stop DateTime", '', 'RadiopharmaceuticalStopDateTime'), # noqa 0x00181080: ('CS', '1', "Beat Rejection Flag", '', 'BeatRejectionFlag'), # noqa 0x00181081: ('IS', '1', "Low R-R Value", '', 'LowRRValue'), # noqa 0x00181082: ('IS', '1', "High R-R Value", '', 'HighRRValue'), # noqa 0x00181083: ('IS', '1', "Intervals Acquired", '', 'IntervalsAcquired'), # noqa 0x00181084: ('IS', '1', "Intervals Rejected", '', 'IntervalsRejected'), # noqa 0x00181085: ('LO', '1', "PVC Rejection", '', 'PVCRejection'), # noqa 0x00181086: ('IS', '1', "Skip Beats", '', 'SkipBeats'), # noqa 0x00181088: ('IS', '1', "Heart Rate", '', 'HeartRate'), # noqa 0x00181090: ('IS', '1', "Cardiac Number of Images", '', 'CardiacNumberOfImages'), # noqa 0x00181094: ('IS', '1', "Trigger Window", '', 'TriggerWindow'), # noqa 0x00181100: ('DS', '1', "Reconstruction Diameter", '', 'ReconstructionDiameter'), # noqa 0x00181110: ('DS', '1', "Distance Source to Detector", '', 'DistanceSourceToDetector'), # noqa 0x00181111: ('DS', '1', "Distance Source to Patient", '', 'DistanceSourceToPatient'), # noqa 0x00181114: ('DS', '1', "Estimated Radiographic Magnification Factor", '', 'EstimatedRadiographicMagnificationFactor'), # noqa 0x00181120: ('DS', '1', "Gantry/Detector Tilt", '', 'GantryDetectorTilt'), # noqa 0x00181121: ('DS', '1', "Gantry/Detector Slew", '', 'GantryDetectorSlew'), # noqa 0x00181130: ('DS', '1', "Table Height", '', 'TableHeight'), # noqa 0x00181131: ('DS', '1', "Table Traverse", '', 'TableTraverse'), # noqa 0x00181134: ('CS', '1', "Table Motion", '', 'TableMotion'), # noqa 0x00181135: ('DS', '1-n', "Table Vertical Increment", '', 'TableVerticalIncrement'), # noqa 0x00181136: ('DS', '1-n', "Table Lateral Increment", '', 'TableLateralIncrement'), # noqa 0x00181137: ('DS', '1-n', "Table Longitudinal Increment", '', 'TableLongitudinalIncrement'), # noqa 0x00181138: ('DS', '1', "Table Angle", '', 'TableAngle'), # noqa 0x0018113A: ('CS', '1', "Table Type", '', 'TableType'), # noqa 0x00181140: ('CS', '1', "Rotation Direction", '', 'RotationDirection'), # noqa 0x00181141: ('DS', '1', "Angular Position", 'Retired', 'AngularPosition'), # noqa 0x00181142: ('DS', '1-n', "Radial Position", '', 'RadialPosition'), # noqa 0x00181143: ('DS', '1', "Scan Arc", '', 'ScanArc'), # noqa 0x00181144: ('DS', '1', "Angular Step", '', 'AngularStep'), # noqa 0x00181145: ('DS', '1', "Center of Rotation Offset", '', 'CenterOfRotationOffset'), # noqa 0x00181146: ('DS', '1-n', "Rotation Offset", 'Retired', 'RotationOffset'), # noqa 0x00181147: ('CS', '1', "Field of View Shape", '', 'FieldOfViewShape'), # noqa 0x00181149: ('IS', '1-2', "Field of View Dimension(s)", '', 'FieldOfViewDimensions'), # noqa 0x00181150: ('IS', '1', "Exposure Time", '', 'ExposureTime'), # noqa 0x00181151: ('IS', '1', "X-Ray Tube Current", '', 'XRayTubeCurrent'), # noqa 0x00181152: ('IS', '1', "Exposure", '', 'Exposure'), # noqa 0x00181153: ('IS', '1', "Exposure in uAs", '', 'ExposureInuAs'), # noqa 0x00181154: ('DS', '1', "Average Pulse Width", '', 'AveragePulseWidth'), # noqa 0x00181155: ('CS', '1', "Radiation Setting", '', 'RadiationSetting'), # noqa 0x00181156: ('CS', '1', "Rectification Type", '', 'RectificationType'), # noqa 0x0018115A: ('CS', '1', "Radiation Mode", '', 'RadiationMode'), # noqa 0x0018115E: ('DS', '1', "Image and Fluoroscopy Area Dose Product", '', 'ImageAndFluoroscopyAreaDoseProduct'), # noqa 0x00181160: ('SH', '1', "Filter Type", '', 'FilterType'), # noqa 0x00181161: ('LO', '1-n', "Type of Filters", '', 'TypeOfFilters'), # noqa 0x00181162: ('DS', '1', "Intensifier Size", '', 'IntensifierSize'), # noqa 0x00181164: ('DS', '2', "Imager Pixel Spacing", '', 'ImagerPixelSpacing'), # noqa 0x00181166: ('CS', '1-n', "Grid", '', 'Grid'), # noqa 0x00181170: ('IS', '1', "Generator Power", '', 'GeneratorPower'), # noqa 0x00181180: ('SH', '1', "Collimator/grid Name", '', 'CollimatorGridName'), # noqa 0x00181181: ('CS', '1', "Collimator Type", '', 'CollimatorType'), # noqa 0x00181182: ('IS', '1-2', "Focal Distance", '', 'FocalDistance'), # noqa 0x00181183: ('DS', '1-2', "X Focus Center", '', 'XFocusCenter'), # noqa 0x00181184: ('DS', '1-2', "Y Focus Center", '', 'YFocusCenter'), # noqa 0x00181190: ('DS', '1-n', "Focal Spot(s)", '', 'FocalSpots'), # noqa 0x00181191: ('CS', '1', "Anode Target Material", '', 'AnodeTargetMaterial'), # noqa 0x001811A0: ('DS', '1', "Body Part Thickness", '', 'BodyPartThickness'), # noqa 0x001811A2: ('DS', '1', "Compression Force", '', 'CompressionForce'), # noqa 0x001811A3: ('DS', '1', "Compression Pressure", '', 'CompressionPressure'), # noqa 0x001811A4: ('LO', '1', "Paddle Description", '', 'PaddleDescription'), # noqa 0x001811A5: ('DS', '1', "Compression Contact Area", '', 'CompressionContactArea'), # noqa 0x001811B0: ('LO', '1', "Acquisition Mode", '', 'AcquisitionMode'), # noqa 0x001811B1: ('LO', '1', "Dose Mode Name", '', 'DoseModeName'), # noqa 0x001811B2: ('CS', '1', "Acquired Subtraction Mask Flag", '', 'AcquiredSubtractionMaskFlag'), # noqa 0x001811B3: ('CS', '1', "Fluoroscopy Persistence Flag", '', 'FluoroscopyPersistenceFlag'), # noqa 0x001811B4: ('CS', '1', "Fluoroscopy Last Image Hold Persistence Flag", '', 'FluoroscopyLastImageHoldPersistenceFlag'), # noqa 0x001811B5: ('IS', '1', "Upper Limit Number Of Persistent Fluoroscopy Frames", '', 'UpperLimitNumberOfPersistentFluoroscopyFrames'), # noqa 0x001811B6: ('CS', '1', "Contrast/Bolus Auto Injection Trigger Flag", '', 'ContrastBolusAutoInjectionTriggerFlag'), # noqa 0x001811B7: ('FD', '1', "Contrast/Bolus Injection Delay", '', 'ContrastBolusInjectionDelay'), # noqa 0x001811B8: ('SQ', '1', "XA Acquisition Phase Details Sequence", '', 'XAAcquisitionPhaseDetailsSequence'), # noqa 0x001811B9: ('FD', '1', "XA Acquisition Frame Rate", '', 'XAAcquisitionFrameRate'), # noqa 0x001811BA: ('SQ', '1', "XA Plane Details Sequence", '', 'XAPlaneDetailsSequence'), # noqa 0x001811BB: ('LO', '1', "Acquisition Field of View Label", '', 'AcquisitionFieldOfViewLabel'), # noqa 0x001811BC: ('SQ', '1', "X-Ray Filter Details Sequence", '', 'XRayFilterDetailsSequence'), # noqa 0x001811BD: ('FD', '1', "XA Acquisition Duration", '', 'XAAcquisitionDuration'), # noqa 0x001811BE: ('CS', '1', "Reconstruction Pipeline Type", '', 'ReconstructionPipelineType'), # noqa 0x001811BF: ('SQ', '1', "Image Filter Details Sequence", '', 'ImageFilterDetailsSequence'), # noqa 0x001811C0: ('CS', '1', "Applied Mask Subtraction Flag", '', 'AppliedMaskSubtractionFlag'), # noqa 0x001811C1: ('SQ', '1', "Requested Series Description Code Sequence", '', 'RequestedSeriesDescriptionCodeSequence'), # noqa 0x00181200: ('DA', '1-n', "Date of Last Calibration", '', 'DateOfLastCalibration'), # noqa 0x00181201: ('TM', '1-n', "Time of Last Calibration", '', 'TimeOfLastCalibration'), # noqa 0x00181202: ('DT', '1', "DateTime of Last Calibration", '', 'DateTimeOfLastCalibration'), # noqa 0x00181203: ('DT', '1', "Calibration DateTime", '', 'CalibrationDateTime'), # noqa 0x00181210: ('SH', '1-n', "Convolution Kernel", '', 'ConvolutionKernel'), # noqa 0x00181240: ('IS', '1-n', "Upper/Lower Pixel Values", 'Retired', 'UpperLowerPixelValues'), # noqa 0x00181242: ('IS', '1', "Actual Frame Duration", '', 'ActualFrameDuration'), # noqa 0x00181243: ('IS', '1', "Count Rate", '', 'CountRate'), # noqa 0x00181244: ('US', '1', "Preferred Playback Sequencing", '', 'PreferredPlaybackSequencing'), # noqa 0x00181250: ('SH', '1', "Receive Coil Name", '', 'ReceiveCoilName'), # noqa 0x00181251: ('SH', '1', "Transmit Coil Name", '', 'TransmitCoilName'), # noqa 0x00181260: ('SH', '1', "Plate Type", '', 'PlateType'), # noqa 0x00181261: ('LO', '1', "Phosphor Type", '', 'PhosphorType'), # noqa 0x00181271: ('FD', '1', "Water Equivalent Diameter", '', 'WaterEquivalentDiameter'), # noqa 0x00181272: ('SQ', '1', "Water Equivalent Diameter Calculation Method Code Sequence", '', 'WaterEquivalentDiameterCalculationMethodCodeSequence'), # noqa 0x00181300: ('DS', '1', "Scan Velocity", '', 'ScanVelocity'), # noqa 0x00181301: ('CS', '1-n', "Whole Body Technique", '', 'WholeBodyTechnique'), # noqa 0x00181302: ('IS', '1', "Scan Length", '', 'ScanLength'), # noqa 0x00181310: ('US', '4', "Acquisition Matrix", '', 'AcquisitionMatrix'), # noqa 0x00181312: ('CS', '1', "In-plane Phase Encoding Direction", '', 'InPlanePhaseEncodingDirection'), # noqa 0x00181314: ('DS', '1', "Flip Angle", '', 'FlipAngle'), # noqa 0x00181315: ('CS', '1', "Variable Flip Angle Flag", '', 'VariableFlipAngleFlag'), # noqa 0x00181316: ('DS', '1', "SAR", '', 'SAR'), # noqa 0x00181318: ('DS', '1', "dB/dt", '', 'dBdt'), # noqa 0x00181320: ('FL', '1', "B1rms", '', 'B1rms'), # noqa 0x00181400: ('LO', '1', "Acquisition Device Processing Description", '', 'AcquisitionDeviceProcessingDescription'), # noqa 0x00181401: ('LO', '1', "Acquisition Device Processing Code", '', 'AcquisitionDeviceProcessingCode'), # noqa 0x00181402: ('CS', '1', "Cassette Orientation", '', 'CassetteOrientation'), # noqa 0x00181403: ('CS', '1', "Cassette Size", '', 'CassetteSize'), # noqa 0x00181404: ('US', '1', "Exposures on Plate", '', 'ExposuresOnPlate'), # noqa 0x00181405: ('IS', '1', "Relative X-Ray Exposure", '', 'RelativeXRayExposure'), # noqa 0x00181411: ('DS', '1', "Exposure Index", '', 'ExposureIndex'), # noqa 0x00181412: ('DS', '1', "Target Exposure Index", '', 'TargetExposureIndex'), # noqa 0x00181413: ('DS', '1', "Deviation Index", '', 'DeviationIndex'), # noqa 0x00181450: ('DS', '1', "Column Angulation", '', 'ColumnAngulation'), # noqa 0x00181460: ('DS', '1', "Tomo Layer Height", '', 'TomoLayerHeight'), # noqa 0x00181470: ('DS', '1', "Tomo Angle", '', 'TomoAngle'), # noqa 0x00181480: ('DS', '1', "Tomo Time", '', 'TomoTime'), # noqa 0x00181490: ('CS', '1', "Tomo Type", '', 'TomoType'), # noqa 0x00181491: ('CS', '1', "Tomo Class", '', 'TomoClass'), # noqa 0x00181495: ('IS', '1', "Number of Tomosynthesis Source Images", '', 'NumberOfTomosynthesisSourceImages'), # noqa 0x00181500: ('CS', '1', "Positioner Motion", '', 'PositionerMotion'), # noqa 0x00181508: ('CS', '1', "Positioner Type", '', 'PositionerType'), # noqa 0x00181510: ('DS', '1', "Positioner Primary Angle", '', 'PositionerPrimaryAngle'), # noqa 0x00181511: ('DS', '1', "Positioner Secondary Angle", '', 'PositionerSecondaryAngle'), # noqa 0x00181520: ('DS', '1-n', "Positioner Primary Angle Increment", '', 'PositionerPrimaryAngleIncrement'), # noqa 0x00181521: ('DS', '1-n', "Positioner Secondary Angle Increment", '', 'PositionerSecondaryAngleIncrement'), # noqa 0x00181530: ('DS', '1', "Detector Primary Angle", '', 'DetectorPrimaryAngle'), # noqa 0x00181531: ('DS', '1', "Detector Secondary Angle", '', 'DetectorSecondaryAngle'), # noqa 0x00181600: ('CS', '1-3', "Shutter Shape", '', 'ShutterShape'), # noqa 0x00181602: ('IS', '1', "Shutter Left Vertical Edge", '', 'ShutterLeftVerticalEdge'), # noqa 0x00181604: ('IS', '1', "Shutter Right Vertical Edge", '', 'ShutterRightVerticalEdge'), # noqa 0x00181606: ('IS', '1', "Shutter Upper Horizontal Edge", '', 'ShutterUpperHorizontalEdge'), # noqa 0x00181608: ('IS', '1', "Shutter Lower Horizontal Edge", '', 'ShutterLowerHorizontalEdge'), # noqa 0x00181610: ('IS', '2', "Center of Circular Shutter", '', 'CenterOfCircularShutter'), # noqa 0x00181612: ('IS', '1', "Radius of Circular Shutter", '', 'RadiusOfCircularShutter'), # noqa 0x00181620: ('IS', '2-2n', "Vertices of the Polygonal Shutter", '', 'VerticesOfThePolygonalShutter'), # noqa 0x00181622: ('US', '1', "Shutter Presentation Value", '', 'ShutterPresentationValue'), # noqa 0x00181623: ('US', '1', "Shutter Overlay Group", '', 'ShutterOverlayGroup'), # noqa 0x00181624: ('US', '3', "Shutter Presentation Color CIELab Value", '', 'ShutterPresentationColorCIELabValue'), # noqa 0x00181630: ('CS', '1', "Outline Shape Type", '', 'OutlineShapeType'), # noqa 0x00181631: ('FD', '1', "Outline Left Vertical Edge", '', 'OutlineLeftVerticalEdge'), # noqa 0x00181632: ('FD', '1', "Outline Right Vertical Edge", '', 'OutlineRightVerticalEdge'), # noqa 0x00181633: ('FD', '1', "Outline Upper Horizontal Edge", '', 'OutlineUpperHorizontalEdge'), # noqa 0x00181634: ('FD', '1', "Outline Lower Horizontal Edge", '', 'OutlineLowerHorizontalEdge'), # noqa 0x00181635: ('FD', '2', "Center of Circular Outline", '', 'CenterOfCircularOutline'), # noqa 0x00181636: ('FD', '1', "Diameter of Circular Outline", '', 'DiameterOfCircularOutline'), # noqa 0x00181637: ('UL', '1', "Number of Polygonal Vertices", '', 'NumberOfPolygonalVertices'), # noqa 0x00181638: ('OF', '1', "Vertices of the Polygonal Outline", '', 'VerticesOfThePolygonalOutline'), # noqa 0x00181700: ('CS', '1-3', "Collimator Shape", '', 'CollimatorShape'), # noqa 0x00181702: ('IS', '1', "Collimator Left Vertical Edge", '', 'CollimatorLeftVerticalEdge'), # noqa 0x00181704: ('IS', '1', "Collimator Right Vertical Edge", '', 'CollimatorRightVerticalEdge'), # noqa 0x00181706: ('IS', '1', "Collimator Upper Horizontal Edge", '', 'CollimatorUpperHorizontalEdge'), # noqa 0x00181708: ('IS', '1', "Collimator Lower Horizontal Edge", '', 'CollimatorLowerHorizontalEdge'), # noqa 0x00181710: ('IS', '2', "Center of Circular Collimator", '', 'CenterOfCircularCollimator'), # noqa 0x00181712: ('IS', '1', "Radius of Circular Collimator", '', 'RadiusOfCircularCollimator'), # noqa 0x00181720: ('IS', '2-2n', "Vertices of the Polygonal Collimator", '', 'VerticesOfThePolygonalCollimator'), # noqa 0x00181800: ('CS', '1', "Acquisition Time Synchronized", '', 'AcquisitionTimeSynchronized'), # noqa 0x00181801: ('SH', '1', "Time Source", '', 'TimeSource'), # noqa 0x00181802: ('CS', '1', "Time Distribution Protocol", '', 'TimeDistributionProtocol'), # noqa 0x00181803: ('LO', '1', "NTP Source Address", '', 'NTPSourceAddress'), # noqa 0x00182001: ('IS', '1-n', "Page Number Vector", '', 'PageNumberVector'), # noqa 0x00182002: ('SH', '1-n', "Frame Label Vector", '', 'FrameLabelVector'), # noqa 0x00182003: ('DS', '1-n', "Frame Primary Angle Vector", '', 'FramePrimaryAngleVector'), # noqa 0x00182004: ('DS', '1-n', "Frame Secondary Angle Vector", '', 'FrameSecondaryAngleVector'), # noqa 0x00182005: ('DS', '1-n', "Slice Location Vector", '', 'SliceLocationVector'), # noqa 0x00182006: ('SH', '1-n', "Display Window Label Vector", '', 'DisplayWindowLabelVector'), # noqa 0x00182010: ('DS', '2', "Nominal Scanned Pixel Spacing", '', 'NominalScannedPixelSpacing'), # noqa 0x00182020: ('CS', '1', "Digitizing Device Transport Direction", '', 'DigitizingDeviceTransportDirection'), # noqa 0x00182030: ('DS', '1', "Rotation of Scanned Film", '', 'RotationOfScannedFilm'), # noqa 0x00182041: ('SQ', '1', "Biopsy Target Sequence", '', 'BiopsyTargetSequence'), # noqa 0x00182042: ('UI', '1', "Target UID", '', 'TargetUID'), # noqa 0x00182043: ('FL', '2', "Localizing Cursor Position", '', 'LocalizingCursorPosition'), # noqa 0x00182044: ('FL', '3', "Calculated Target Position", '', 'CalculatedTargetPosition'), # noqa 0x00182045: ('SH', '1', "Target Label", '', 'TargetLabel'), # noqa 0x00182046: ('FL', '1', "Displayed Z Value", '', 'DisplayedZValue'), # noqa 0x00183100: ('CS', '1', "IVUS Acquisition", '', 'IVUSAcquisition'), # noqa 0x00183101: ('DS', '1', "IVUS Pullback Rate", '', 'IVUSPullbackRate'), # noqa 0x00183102: ('DS', '1', "IVUS Gated Rate", '', 'IVUSGatedRate'), # noqa 0x00183103: ('IS', '1', "IVUS Pullback Start Frame Number", '', 'IVUSPullbackStartFrameNumber'), # noqa 0x00183104: ('IS', '1', "IVUS Pullback Stop Frame Number", '', 'IVUSPullbackStopFrameNumber'), # noqa 0x00183105: ('IS', '1-n', "Lesion Number", '', 'LesionNumber'), # noqa 0x00184000: ('LT', '1', "Acquisition Comments", 'Retired', 'AcquisitionComments'), # noqa 0x00185000: ('SH', '1-n', "Output Power", '', 'OutputPower'), # noqa 0x00185010: ('LO', '1-n', "Transducer Data", '', 'TransducerData'), # noqa 0x00185011: ('SQ', '1', "Transducer Identification Sequence", '', 'TransducerIdentificationSequence'), # noqa 0x00185012: ('DS', '1', "Focus Depth", '', 'FocusDepth'), # noqa 0x00185020: ('LO', '1', "Processing Function", '', 'ProcessingFunction'), # noqa 0x00185021: ('LO', '1', "Postprocessing Function", 'Retired', 'PostprocessingFunction'), # noqa 0x00185022: ('DS', '1', "Mechanical Index", '', 'MechanicalIndex'), # noqa 0x00185024: ('DS', '1', "Bone Thermal Index", '', 'BoneThermalIndex'), # noqa 0x00185026: ('DS', '1', "Cranial Thermal Index", '', 'CranialThermalIndex'), # noqa 0x00185027: ('DS', '1', "Soft Tissue Thermal Index", '', 'SoftTissueThermalIndex'), # noqa 0x00185028: ('DS', '1', "Soft Tissue-focus Thermal Index", '', 'SoftTissueFocusThermalIndex'), # noqa 0x00185029: ('DS', '1', "Soft Tissue-surface Thermal Index", '', 'SoftTissueSurfaceThermalIndex'), # noqa 0x00185030: ('DS', '1', "Dynamic Range", 'Retired', 'DynamicRange'), # noqa 0x00185040: ('DS', '1', "Total Gain", 'Retired', 'TotalGain'), # noqa 0x00185050: ('IS', '1', "Depth of Scan Field", '', 'DepthOfScanField'), # noqa 0x00185100: ('CS', '1', "Patient Position", '', 'PatientPosition'), # noqa 0x00185101: ('CS', '1', "View Position", '', 'ViewPosition'), # noqa 0x00185104: ('SQ', '1', "Projection Eponymous Name Code Sequence", '', 'ProjectionEponymousNameCodeSequence'), # noqa 0x00185210: ('DS', '6', "Image Transformation Matrix", 'Retired', 'ImageTransformationMatrix'), # noqa 0x00185212: ('DS', '3', "Image Translation Vector", 'Retired', 'ImageTranslationVector'), # noqa 0x00186000: ('DS', '1', "Sensitivity", '', 'Sensitivity'), # noqa 0x00186011: ('SQ', '1', "Sequence of Ultrasound Regions", '', 'SequenceOfUltrasoundRegions'), # noqa 0x00186012: ('US', '1', "Region Spatial Format", '', 'RegionSpatialFormat'), # noqa 0x00186014: ('US', '1', "Region Data Type", '', 'RegionDataType'), # noqa 0x00186016: ('UL', '1', "Region Flags", '', 'RegionFlags'), # noqa 0x00186018: ('UL', '1', "Region Location Min X0", '', 'RegionLocationMinX0'), # noqa 0x0018601A: ('UL', '1', "Region Location Min Y0", '', 'RegionLocationMinY0'), # noqa 0x0018601C: ('UL', '1', "Region Location Max X1", '', 'RegionLocationMaxX1'), # noqa 0x0018601E: ('UL', '1', "Region Location Max Y1", '', 'RegionLocationMaxY1'), # noqa 0x00186020: ('SL', '1', "Reference Pixel X0", '', 'ReferencePixelX0'), # noqa 0x00186022: ('SL', '1', "Reference Pixel Y0", '', 'ReferencePixelY0'), # noqa 0x00186024: ('US', '1', "Physical Units X Direction", '', 'PhysicalUnitsXDirection'), # noqa 0x00186026: ('US', '1', "Physical Units Y Direction", '', 'PhysicalUnitsYDirection'), # noqa 0x00186028: ('FD', '1', "Reference Pixel Physical Value X", '', 'ReferencePixelPhysicalValueX'), # noqa 0x0018602A: ('FD', '1', "Reference Pixel Physical Value Y", '', 'ReferencePixelPhysicalValueY'), # noqa 0x0018602C: ('FD', '1', "Physical Delta X", '', 'PhysicalDeltaX'), # noqa 0x0018602E: ('FD', '1', "Physical Delta Y", '', 'PhysicalDeltaY'), # noqa 0x00186030: ('UL', '1', "Transducer Frequency", '', 'TransducerFrequency'), # noqa 0x00186031: ('CS', '1', "Transducer Type", '', 'TransducerType'), # noqa 0x00186032: ('UL', '1', "Pulse Repetition Frequency", '', 'PulseRepetitionFrequency'), # noqa 0x00186034: ('FD', '1', "Doppler Correction Angle", '', 'DopplerCorrectionAngle'), # noqa 0x00186036: ('FD', '1', "Steering Angle", '', 'SteeringAngle'), # noqa 0x00186038: ('UL', '1', "Doppler Sample Volume X Position (Retired)", 'Retired', 'DopplerSampleVolumeXPositionRetired'), # noqa 0x00186039: ('SL', '1', "Doppler Sample Volume X Position", '', 'DopplerSampleVolumeXPosition'), # noqa 0x0018603A: ('UL', '1', "Doppler Sample Volume Y Position (Retired)", 'Retired', 'DopplerSampleVolumeYPositionRetired'), # noqa 0x0018603B: ('SL', '1', "Doppler Sample Volume Y Position", '', 'DopplerSampleVolumeYPosition'), # noqa 0x0018603C: ('UL', '1', "TM-Line Position X0 (Retired)", 'Retired', 'TMLinePositionX0Retired'), # noqa 0x0018603D: ('SL', '1', "TM-Line Position X0", '', 'TMLinePositionX0'), # noqa 0x0018603E: ('UL', '1', "TM-Line Position Y0 (Retired)", 'Retired', 'TMLinePositionY0Retired'), # noqa 0x0018603F: ('SL', '1', "TM-Line Position Y0", '', 'TMLinePositionY0'), # noqa 0x00186040: ('UL', '1', "TM-Line Position X1 (Retired)", 'Retired', 'TMLinePositionX1Retired'), # noqa 0x00186041: ('SL', '1', "TM-Line Position X1", '', 'TMLinePositionX1'), # noqa 0x00186042: ('UL', '1', "TM-Line Position Y1 (Retired)", 'Retired', 'TMLinePositionY1Retired'), # noqa 0x00186043: ('SL', '1', "TM-Line Position Y1", '', 'TMLinePositionY1'), # noqa 0x00186044: ('US', '1', "Pixel Component Organization", '', 'PixelComponentOrganization'), # noqa 0x00186046: ('UL', '1', "Pixel Component Mask", '', 'PixelComponentMask'), # noqa 0x00186048: ('UL', '1', "Pixel Component Range Start", '', 'PixelComponentRangeStart'), # noqa 0x0018604A: ('UL', '1', "Pixel Component Range Stop", '', 'PixelComponentRangeStop'), # noqa 0x0018604C: ('US', '1', "Pixel Component Physical Units", '', 'PixelComponentPhysicalUnits'), # noqa 0x0018604E: ('US', '1', "Pixel Component Data Type", '', 'PixelComponentDataType'), # noqa 0x00186050: ('UL', '1', "Number of Table Break Points", '', 'NumberOfTableBreakPoints'), # noqa 0x00186052: ('UL', '1-n', "Table of X Break Points", '', 'TableOfXBreakPoints'), # noqa 0x00186054: ('FD', '1-n', "Table of Y Break Points", '', 'TableOfYBreakPoints'), # noqa 0x00186056: ('UL', '1', "Number of Table Entries", '', 'NumberOfTableEntries'), # noqa 0x00186058: ('UL', '1-n', "Table of Pixel Values", '', 'TableOfPixelValues'), # noqa 0x0018605A: ('FL', '1-n', "Table of Parameter Values", '', 'TableOfParameterValues'), # noqa 0x00186060: ('FL', '1-n', "R Wave Time Vector", '', 'RWaveTimeVector'), # noqa 0x00186070: ('US', '1', "Active Image Area Overlay Group", '', 'ActiveImageAreaOverlayGroup'), # noqa 0x00187000: ('CS', '1', "Detector Conditions Nominal Flag", '', 'DetectorConditionsNominalFlag'), # noqa 0x00187001: ('DS', '1', "Detector Temperature", '', 'DetectorTemperature'), # noqa 0x00187004: ('CS', '1', "Detector Type", '', 'DetectorType'), # noqa 0x00187005: ('CS', '1', "Detector Configuration", '', 'DetectorConfiguration'), # noqa 0x00187006: ('LT', '1', "Detector Description", '', 'DetectorDescription'), # noqa 0x00187008: ('LT', '1', "Detector Mode", '', 'DetectorMode'), # noqa 0x0018700A: ('SH', '1', "Detector ID", '', 'DetectorID'), # noqa 0x0018700C: ('DA', '1', "Date of Last Detector Calibration", '', 'DateOfLastDetectorCalibration'), # noqa 0x0018700E: ('TM', '1', "Time of Last Detector Calibration", '', 'TimeOfLastDetectorCalibration'), # noqa 0x00187010: ('IS', '1', "Exposures on Detector Since Last Calibration", '', 'ExposuresOnDetectorSinceLastCalibration'), # noqa 0x00187011: ('IS', '1', "Exposures on Detector Since Manufactured", '', 'ExposuresOnDetectorSinceManufactured'), # noqa 0x00187012: ('DS', '1', "Detector Time Since Last Exposure", '', 'DetectorTimeSinceLastExposure'), # noqa 0x00187014: ('DS', '1', "Detector Active Time", '', 'DetectorActiveTime'), # noqa 0x00187016: ('DS', '1', "Detector Activation Offset From Exposure", '', 'DetectorActivationOffsetFromExposure'), # noqa 0x0018701A: ('DS', '2', "Detector Binning", '', 'DetectorBinning'), # noqa 0x00187020: ('DS', '2', "Detector Element Physical Size", '', 'DetectorElementPhysicalSize'), # noqa 0x00187022: ('DS', '2', "Detector Element Spacing", '', 'DetectorElementSpacing'), # noqa 0x00187024: ('CS', '1', "Detector Active Shape", '', 'DetectorActiveShape'), # noqa 0x00187026: ('DS', '1-2', "Detector Active Dimension(s)", '', 'DetectorActiveDimensions'), # noqa 0x00187028: ('DS', '2', "Detector Active Origin", '', 'DetectorActiveOrigin'), # noqa 0x0018702A: ('LO', '1', "Detector Manufacturer Name", '', 'DetectorManufacturerName'), # noqa 0x0018702B: ('LO', '1', "Detector Manufacturer's Model Name", '', 'DetectorManufacturerModelName'), # noqa 0x00187030: ('DS', '2', "Field of View Origin", '', 'FieldOfViewOrigin'), # noqa 0x00187032: ('DS', '1', "Field of View Rotation", '', 'FieldOfViewRotation'), # noqa 0x00187034: ('CS', '1', "Field of View Horizontal Flip", '', 'FieldOfViewHorizontalFlip'), # noqa 0x00187036: ('FL', '2', "Pixel Data Area Origin Relative To FOV", '', 'PixelDataAreaOriginRelativeToFOV'), # noqa 0x00187038: ('FL', '1', "Pixel Data Area Rotation Angle Relative To FOV", '', 'PixelDataAreaRotationAngleRelativeToFOV'), # noqa 0x00187040: ('LT', '1', "Grid Absorbing Material", '', 'GridAbsorbingMaterial'), # noqa 0x00187041: ('LT', '1', "Grid Spacing Material", '', 'GridSpacingMaterial'), # noqa 0x00187042: ('DS', '1', "Grid Thickness", '', 'GridThickness'), # noqa 0x00187044: ('DS', '1', "Grid Pitch", '', 'GridPitch'), # noqa 0x00187046: ('IS', '2', "Grid Aspect Ratio", '', 'GridAspectRatio'), # noqa 0x00187048: ('DS', '1', "Grid Period", '', 'GridPeriod'), # noqa 0x0018704C: ('DS', '1', "Grid Focal Distance", '', 'GridFocalDistance'), # noqa 0x00187050: ('CS', '1-n', "Filter Material", '', 'FilterMaterial'), # noqa 0x00187052: ('DS', '1-n', "Filter Thickness Minimum", '', 'FilterThicknessMinimum'), # noqa 0x00187054: ('DS', '1-n', "Filter Thickness Maximum", '', 'FilterThicknessMaximum'), # noqa 0x00187056: ('FL', '1-n', "Filter Beam Path Length Minimum", '', 'FilterBeamPathLengthMinimum'), # noqa 0x00187058: ('FL', '1-n', "Filter Beam Path Length Maximum", '', 'FilterBeamPathLengthMaximum'), # noqa 0x00187060: ('CS', '1', "Exposure Control Mode", '', 'ExposureControlMode'), # noqa 0x00187062: ('LT', '1', "Exposure Control Mode Description", '', 'ExposureControlModeDescription'), # noqa 0x00187064: ('CS', '1', "Exposure Status", '', 'ExposureStatus'), # noqa 0x00187065: ('DS', '1', "Phototimer Setting", '', 'PhototimerSetting'), # noqa 0x00188150: ('DS', '1', "Exposure Time in uS", '', 'ExposureTimeInuS'), # noqa 0x00188151: ('DS', '1', "X-Ray Tube Current in uA", '', 'XRayTubeCurrentInuA'), # noqa 0x00189004: ('CS', '1', "Content Qualification", '', 'ContentQualification'), # noqa 0x00189005: ('SH', '1', "Pulse Sequence Name", '', 'PulseSequenceName'), # noqa 0x00189006: ('SQ', '1', "MR Imaging Modifier Sequence", '', 'MRImagingModifierSequence'), # noqa 0x00189008: ('CS', '1', "Echo Pulse Sequence", '', 'EchoPulseSequence'), # noqa 0x00189009: ('CS', '1', "Inversion Recovery", '', 'InversionRecovery'), # noqa 0x00189010: ('CS', '1', "Flow Compensation", '', 'FlowCompensation'), # noqa 0x00189011: ('CS', '1', "Multiple Spin Echo", '', 'MultipleSpinEcho'), # noqa 0x00189012: ('CS', '1', "Multi-planar Excitation", '', 'MultiPlanarExcitation'), # noqa 0x00189014: ('CS', '1', "Phase Contrast", '', 'PhaseContrast'), # noqa 0x00189015: ('CS', '1', "Time of Flight Contrast", '', 'TimeOfFlightContrast'), # noqa 0x00189016: ('CS', '1', "Spoiling", '', 'Spoiling'), # noqa 0x00189017: ('CS', '1', "Steady State Pulse Sequence", '', 'SteadyStatePulseSequence'), # noqa 0x00189018: ('CS', '1', "Echo Planar Pulse Sequence", '', 'EchoPlanarPulseSequence'), # noqa 0x00189019: ('FD', '1', "Tag Angle First Axis", '', 'TagAngleFirstAxis'), # noqa 0x00189020: ('CS', '1', "Magnetization Transfer", '', 'MagnetizationTransfer'), # noqa 0x00189021: ('CS', '1', "T2 Preparation", '', 'T2Preparation'), # noqa 0x00189022: ('CS', '1', "Blood Signal Nulling", '', 'BloodSignalNulling'), # noqa 0x00189024: ('CS', '1', "Saturation Recovery", '', 'SaturationRecovery'), # noqa 0x00189025: ('CS', '1', "Spectrally Selected Suppression", '', 'SpectrallySelectedSuppression'), # noqa 0x00189026: ('CS', '1', "Spectrally Selected Excitation", '', 'SpectrallySelectedExcitation'), # noqa 0x00189027: ('CS', '1', "Spatial Pre-saturation", '', 'SpatialPresaturation'), # noqa 0x00189028: ('CS', '1', "Tagging", '', 'Tagging'), # noqa 0x00189029: ('CS', '1', "Oversampling Phase", '', 'OversamplingPhase'), # noqa 0x00189030: ('FD', '1', "Tag Spacing First Dimension", '', 'TagSpacingFirstDimension'), # noqa 0x00189032: ('CS', '1', "Geometry of k-Space Traversal", '', 'GeometryOfKSpaceTraversal'), # noqa 0x00189033: ('CS', '1', "Segmented k-Space Traversal", '', 'SegmentedKSpaceTraversal'), # noqa 0x00189034: ('CS', '1', "Rectilinear Phase Encode Reordering", '', 'RectilinearPhaseEncodeReordering'), # noqa 0x00189035: ('FD', '1', "Tag Thickness", '', 'TagThickness'), # noqa 0x00189036: ('CS', '1', "Partial Fourier Direction", '', 'PartialFourierDirection'), # noqa 0x00189037: ('CS', '1', "Cardiac Synchronization Technique", '', 'CardiacSynchronizationTechnique'), # noqa 0x00189041: ('LO', '1', "Receive Coil Manufacturer Name", '', 'ReceiveCoilManufacturerName'), # noqa 0x00189042: ('SQ', '1', "MR Receive Coil Sequence", '', 'MRReceiveCoilSequence'), # noqa 0x00189043: ('CS', '1', "Receive Coil Type", '', 'ReceiveCoilType'), # noqa 0x00189044: ('CS', '1', "Quadrature Receive Coil", '', 'QuadratureReceiveCoil'), # noqa 0x00189045: ('SQ', '1', "Multi-Coil Definition Sequence", '', 'MultiCoilDefinitionSequence'), # noqa 0x00189046: ('LO', '1', "Multi-Coil Configuration", '', 'MultiCoilConfiguration'), # noqa 0x00189047: ('SH', '1', "Multi-Coil Element Name", '', 'MultiCoilElementName'), # noqa 0x00189048: ('CS', '1', "Multi-Coil Element Used", '', 'MultiCoilElementUsed'), # noqa 0x00189049: ('SQ', '1', "MR Transmit Coil Sequence", '', 'MRTransmitCoilSequence'), # noqa 0x00189050: ('LO', '1', "Transmit Coil Manufacturer Name", '', 'TransmitCoilManufacturerName'), # noqa 0x00189051: ('CS', '1', "Transmit Coil Type", '', 'TransmitCoilType'), # noqa 0x00189052: ('FD', '1-2', "Spectral Width", '', 'SpectralWidth'), # noqa 0x00189053: ('FD', '1-2', "Chemical Shift Reference", '', 'ChemicalShiftReference'), # noqa 0x00189054: ('CS', '1', "Volume Localization Technique", '', 'VolumeLocalizationTechnique'), # noqa 0x00189058: ('US', '1', "MR Acquisition Frequency Encoding Steps", '', 'MRAcquisitionFrequencyEncodingSteps'), # noqa 0x00189059: ('CS', '1', "De-coupling", '', 'Decoupling'), # noqa 0x00189060: ('CS', '1-2', "De-coupled Nucleus", '', 'DecoupledNucleus'), # noqa 0x00189061: ('FD', '1-2', "De-coupling Frequency", '', 'DecouplingFrequency'), # noqa 0x00189062: ('CS', '1', "De-coupling Method", '', 'DecouplingMethod'), # noqa 0x00189063: ('FD', '1-2', "De-coupling Chemical Shift Reference", '', 'DecouplingChemicalShiftReference'), # noqa 0x00189064: ('CS', '1', "k-space Filtering", '', 'KSpaceFiltering'), # noqa 0x00189065: ('CS', '1-2', "Time Domain Filtering", '', 'TimeDomainFiltering'), # noqa 0x00189066: ('US', '1-2', "Number of Zero Fills", '', 'NumberOfZeroFills'), # noqa 0x00189067: ('CS', '1', "Baseline Correction", '', 'BaselineCorrection'), # noqa 0x00189069: ('FD', '1', "Parallel Reduction Factor In-plane", '', 'ParallelReductionFactorInPlane'), # noqa 0x00189070: ('FD', '1', "Cardiac R-R Interval Specified", '', 'CardiacRRIntervalSpecified'), # noqa 0x00189073: ('FD', '1', "Acquisition Duration", '', 'AcquisitionDuration'), # noqa 0x00189074: ('DT', '1', "Frame Acquisition DateTime", '', 'FrameAcquisitionDateTime'), # noqa 0x00189075: ('CS', '1', "Diffusion Directionality", '', 'DiffusionDirectionality'), # noqa 0x00189076: ('SQ', '1', "Diffusion Gradient Direction Sequence", '', 'DiffusionGradientDirectionSequence'), # noqa 0x00189077: ('CS', '1', "Parallel Acquisition", '', 'ParallelAcquisition'), # noqa 0x00189078: ('CS', '1', "Parallel Acquisition Technique", '', 'ParallelAcquisitionTechnique'), # noqa 0x00189079: ('FD', '1-n', "Inversion Times", '', 'InversionTimes'), # noqa 0x00189080: ('ST', '1', "Metabolite Map Description", '', 'MetaboliteMapDescription'), # noqa 0x00189081: ('CS', '1', "Partial Fourier", '', 'PartialFourier'), # noqa 0x00189082: ('FD', '1', "Effective Echo Time", '', 'EffectiveEchoTime'), # noqa 0x00189083: ('SQ', '1', "Metabolite Map Code Sequence", '', 'MetaboliteMapCodeSequence'), # noqa 0x00189084: ('SQ', '1', "Chemical Shift Sequence", '', 'ChemicalShiftSequence'), # noqa 0x00189085: ('CS', '1', "Cardiac Signal Source", '', 'CardiacSignalSource'), # noqa 0x00189087: ('FD', '1', "Diffusion b-value", '', 'DiffusionBValue'), # noqa 0x00189089: ('FD', '3', "Diffusion Gradient Orientation", '', 'DiffusionGradientOrientation'), # noqa 0x00189090: ('FD', '3', "Velocity Encoding Direction", '', 'VelocityEncodingDirection'), # noqa 0x00189091: ('FD', '1', "Velocity Encoding Minimum Value", '', 'VelocityEncodingMinimumValue'), # noqa 0x00189092: ('SQ', '1', "Velocity Encoding Acquisition Sequence", '', 'VelocityEncodingAcquisitionSequence'), # noqa 0x00189093: ('US', '1', "Number of k-Space Trajectories", '', 'NumberOfKSpaceTrajectories'), # noqa 0x00189094: ('CS', '1', "Coverage of k-Space", '', 'CoverageOfKSpace'), # noqa 0x00189095: ('UL', '1', "Spectroscopy Acquisition Phase Rows", '', 'SpectroscopyAcquisitionPhaseRows'), # noqa 0x00189096: ('FD', '1', "Parallel Reduction Factor In-plane (Retired)", 'Retired', 'ParallelReductionFactorInPlaneRetired'), # noqa 0x00189098: ('FD', '1-2', "Transmitter Frequency", '', 'TransmitterFrequency'), # noqa 0x00189100: ('CS', '1-2', "Resonant Nucleus", '', 'ResonantNucleus'), # noqa 0x00189101: ('CS', '1', "Frequency Correction", '', 'FrequencyCorrection'), # noqa 0x00189103: ('SQ', '1', "MR Spectroscopy FOV/Geometry Sequence", '', 'MRSpectroscopyFOVGeometrySequence'), # noqa 0x00189104: ('FD', '1', "Slab Thickness", '', 'SlabThickness'), # noqa 0x00189105: ('FD', '3', "Slab Orientation", '', 'SlabOrientation'), # noqa 0x00189106: ('FD', '3', "Mid Slab Position", '', 'MidSlabPosition'), # noqa 0x00189107: ('SQ', '1', "MR Spatial Saturation Sequence", '', 'MRSpatialSaturationSequence'), # noqa 0x00189112: ('SQ', '1', "MR Timing and Related Parameters Sequence", '', 'MRTimingAndRelatedParametersSequence'), # noqa 0x00189114: ('SQ', '1', "MR Echo Sequence", '', 'MREchoSequence'), # noqa 0x00189115: ('SQ', '1', "MR Modifier Sequence", '', 'MRModifierSequence'), # noqa 0x00189117: ('SQ', '1', "MR Diffusion Sequence", '', 'MRDiffusionSequence'), # noqa 0x00189118: ('SQ', '1', "Cardiac Synchronization Sequence", '', 'CardiacSynchronizationSequence'), # noqa 0x00189119: ('SQ', '1', "MR Averages Sequence", '', 'MRAveragesSequence'), # noqa 0x00189125: ('SQ', '1', "MR FOV/Geometry Sequence", '', 'MRFOVGeometrySequence'), # noqa 0x00189126: ('SQ', '1', "Volume Localization Sequence", '', 'VolumeLocalizationSequence'), # noqa 0x00189127: ('UL', '1', "Spectroscopy Acquisition Data Columns", '', 'SpectroscopyAcquisitionDataColumns'), # noqa 0x00189147: ('CS', '1', "Diffusion Anisotropy Type", '', 'DiffusionAnisotropyType'), # noqa 0x00189151: ('DT', '1', "Frame Reference DateTime", '', 'FrameReferenceDateTime'), # noqa 0x00189152: ('SQ', '1', "MR Metabolite Map Sequence", '', 'MRMetaboliteMapSequence'), # noqa 0x00189155: ('FD', '1', "Parallel Reduction Factor out-of-plane", '', 'ParallelReductionFactorOutOfPlane'), # noqa 0x00189159: ('UL', '1', "Spectroscopy Acquisition Out-of-plane Phase Steps", '', 'SpectroscopyAcquisitionOutOfPlanePhaseSteps'), # noqa 0x00189166: ('CS', '1', "Bulk Motion Status", 'Retired', 'BulkMotionStatus'), # noqa 0x00189168: ('FD', '1', "Parallel Reduction Factor Second In-plane", '', 'ParallelReductionFactorSecondInPlane'), # noqa 0x00189169: ('CS', '1', "Cardiac Beat Rejection Technique", '', 'CardiacBeatRejectionTechnique'), # noqa 0x00189170: ('CS', '1', "Respiratory Motion Compensation Technique", '', 'RespiratoryMotionCompensationTechnique'), # noqa 0x00189171: ('CS', '1', "Respiratory Signal Source", '', 'RespiratorySignalSource'), # noqa 0x00189172: ('CS', '1', "Bulk Motion Compensation Technique", '', 'BulkMotionCompensationTechnique'), # noqa 0x00189173: ('CS', '1', "Bulk Motion Signal Source", '', 'BulkMotionSignalSource'), # noqa 0x00189174: ('CS', '1', "Applicable Safety Standard Agency", '', 'ApplicableSafetyStandardAgency'), # noqa 0x00189175: ('LO', '1', "Applicable Safety Standard Description", '', 'ApplicableSafetyStandardDescription'), # noqa 0x00189176: ('SQ', '1', "Operating Mode Sequence", '', 'OperatingModeSequence'), # noqa 0x00189177: ('CS', '1', "Operating Mode Type", '', 'OperatingModeType'), # noqa 0x00189178: ('CS', '1', "Operating Mode", '', 'OperatingMode'), # noqa 0x00189179: ('CS', '1', "Specific Absorption Rate Definition", '', 'SpecificAbsorptionRateDefinition'), # noqa 0x00189180: ('CS', '1', "Gradient Output Type", '', 'GradientOutputType'), # noqa 0x00189181: ('FD', '1', "Specific Absorption Rate Value", '', 'SpecificAbsorptionRateValue'), # noqa 0x00189182: ('FD', '1', "Gradient Output", '', 'GradientOutput'), # noqa 0x00189183: ('CS', '1', "Flow Compensation Direction", '', 'FlowCompensationDirection'), # noqa 0x00189184: ('FD', '1', "Tagging Delay", '', 'TaggingDelay'), # noqa 0x00189185: ('ST', '1', "Respiratory Motion Compensation Technique Description", '', 'RespiratoryMotionCompensationTechniqueDescription'), # noqa 0x00189186: ('SH', '1', "Respiratory Signal Source ID", '', 'RespiratorySignalSourceID'), # noqa 0x00189195: ('FD', '1', "Chemical Shift Minimum Integration Limit in Hz", 'Retired', 'ChemicalShiftMinimumIntegrationLimitInHz'), # noqa 0x00189196: ('FD', '1', "Chemical Shift Maximum Integration Limit in Hz", 'Retired', 'ChemicalShiftMaximumIntegrationLimitInHz'), # noqa 0x00189197: ('SQ', '1', "MR Velocity Encoding Sequence", '', 'MRVelocityEncodingSequence'), # noqa 0x00189198: ('CS', '1', "First Order Phase Correction", '', 'FirstOrderPhaseCorrection'), # noqa 0x00189199: ('CS', '1', "Water Referenced Phase Correction", '', 'WaterReferencedPhaseCorrection'), # noqa 0x00189200: ('CS', '1', "MR Spectroscopy Acquisition Type", '', 'MRSpectroscopyAcquisitionType'), # noqa 0x00189214: ('CS', '1', "Respiratory Cycle Position", '', 'RespiratoryCyclePosition'), # noqa 0x00189217: ('FD', '1', "Velocity Encoding Maximum Value", '', 'VelocityEncodingMaximumValue'), # noqa 0x00189218: ('FD', '1', "Tag Spacing Second Dimension", '', 'TagSpacingSecondDimension'), # noqa 0x00189219: ('SS', '1', "Tag Angle Second Axis", '', 'TagAngleSecondAxis'), # noqa 0x00189220: ('FD', '1', "Frame Acquisition Duration", '', 'FrameAcquisitionDuration'), # noqa 0x00189226: ('SQ', '1', "MR Image Frame Type Sequence", '', 'MRImageFrameTypeSequence'), # noqa 0x00189227: ('SQ', '1', "MR Spectroscopy Frame Type Sequence", '', 'MRSpectroscopyFrameTypeSequence'), # noqa 0x00189231: ('US', '1', "MR Acquisition Phase Encoding Steps in-plane", '', 'MRAcquisitionPhaseEncodingStepsInPlane'), # noqa 0x00189232: ('US', '1', "MR Acquisition Phase Encoding Steps out-of-plane", '', 'MRAcquisitionPhaseEncodingStepsOutOfPlane'), # noqa 0x00189234: ('UL', '1', "Spectroscopy Acquisition Phase Columns", '', 'SpectroscopyAcquisitionPhaseColumns'), # noqa 0x00189236: ('CS', '1', "Cardiac Cycle Position", '', 'CardiacCyclePosition'), # noqa 0x00189239: ('SQ', '1', "Specific Absorption Rate Sequence", '', 'SpecificAbsorptionRateSequence'), # noqa 0x00189240: ('US', '1', "RF Echo Train Length", '', 'RFEchoTrainLength'), # noqa 0x00189241: ('US', '1', "Gradient Echo Train Length", '', 'GradientEchoTrainLength'), # noqa 0x00189250: ('CS', '1', "Arterial Spin Labeling Contrast", '', 'ArterialSpinLabelingContrast'), # noqa 0x00189251: ('SQ', '1', "MR Arterial Spin Labeling Sequence", '', 'MRArterialSpinLabelingSequence'), # noqa 0x00189252: ('LO', '1', "ASL Technique Description", '', 'ASLTechniqueDescription'), # noqa 0x00189253: ('US', '1', "ASL Slab Number", '', 'ASLSlabNumber'), # noqa 0x00189254: ('FD', '1', "ASL Slab Thickness", '', 'ASLSlabThickness'), # noqa 0x00189255: ('FD', '3', "ASL Slab Orientation", '', 'ASLSlabOrientation'), # noqa 0x00189256: ('FD', '3', "ASL Mid Slab Position", '', 'ASLMidSlabPosition'), # noqa 0x00189257: ('CS', '1', "ASL Context", '', 'ASLContext'), # noqa 0x00189258: ('UL', '1', "ASL Pulse Train Duration", '', 'ASLPulseTrainDuration'), # noqa 0x00189259: ('CS', '1', "ASL Crusher Flag", '', 'ASLCrusherFlag'), # noqa 0x0018925A: ('FD', '1', "ASL Crusher Flow Limit", '', 'ASLCrusherFlowLimit'), # noqa 0x0018925B: ('LO', '1', "ASL Crusher Description", '', 'ASLCrusherDescription'), # noqa 0x0018925C: ('CS', '1', "ASL Bolus Cut-off Flag", '', 'ASLBolusCutoffFlag'), # noqa 0x0018925D: ('SQ', '1', "ASL Bolus Cut-off Timing Sequence", '', 'ASLBolusCutoffTimingSequence'), # noqa 0x0018925E: ('LO', '1', "ASL Bolus Cut-off Technique", '', 'ASLBolusCutoffTechnique'), # noqa 0x0018925F: ('UL', '1', "ASL Bolus Cut-off Delay Time", '', 'ASLBolusCutoffDelayTime'), # noqa 0x00189260: ('SQ', '1', "ASL Slab Sequence", '', 'ASLSlabSequence'), # noqa 0x00189295: ('FD', '1', "Chemical Shift Minimum Integration Limit in ppm", '', 'ChemicalShiftMinimumIntegrationLimitInppm'), # noqa 0x00189296: ('FD', '1', "Chemical Shift Maximum Integration Limit in ppm", '', 'ChemicalShiftMaximumIntegrationLimitInppm'), # noqa 0x00189297: ('CS', '1', "Water Reference Acquisition", '', 'WaterReferenceAcquisition'), # noqa 0x00189298: ('IS', '1', "Echo Peak Position", '', 'EchoPeakPosition'), # noqa 0x00189301: ('SQ', '1', "CT Acquisition Type Sequence", '', 'CTAcquisitionTypeSequence'), # noqa 0x00189302: ('CS', '1', "Acquisition Type", '', 'AcquisitionType'), # noqa 0x00189303: ('FD', '1', "Tube Angle", '', 'TubeAngle'), # noqa 0x00189304: ('SQ', '1', "CT Acquisition Details Sequence", '', 'CTAcquisitionDetailsSequence'), # noqa 0x00189305: ('FD', '1', "Revolution Time", '', 'RevolutionTime'), # noqa 0x00189306: ('FD', '1', "Single Collimation Width", '', 'SingleCollimationWidth'), # noqa 0x00189307: ('FD', '1', "Total Collimation Width", '', 'TotalCollimationWidth'), # noqa 0x00189308: ('SQ', '1', "CT Table Dynamics Sequence", '', 'CTTableDynamicsSequence'), # noqa 0x00189309: ('FD', '1', "Table Speed", '', 'TableSpeed'), # noqa 0x00189310: ('FD', '1', "Table Feed per Rotation", '', 'TableFeedPerRotation'), # noqa 0x00189311: ('FD', '1', "Spiral Pitch Factor", '', 'SpiralPitchFactor'), # noqa 0x00189312: ('SQ', '1', "CT Geometry Sequence", '', 'CTGeometrySequence'), # noqa 0x00189313: ('FD', '3', "Data Collection Center (Patient)", '', 'DataCollectionCenterPatient'), # noqa 0x00189314: ('SQ', '1', "CT Reconstruction Sequence", '', 'CTReconstructionSequence'), # noqa 0x00189315: ('CS', '1', "Reconstruction Algorithm", '', 'ReconstructionAlgorithm'), # noqa 0x00189316: ('CS', '1', "Convolution Kernel Group", '', 'ConvolutionKernelGroup'), # noqa 0x00189317: ('FD', '2', "Reconstruction Field of View", '', 'ReconstructionFieldOfView'), # noqa 0x00189318: ('FD', '3', "Reconstruction Target Center (Patient)", '', 'ReconstructionTargetCenterPatient'), # noqa 0x00189319: ('FD', '1', "Reconstruction Angle", '', 'ReconstructionAngle'), # noqa 0x00189320: ('SH', '1', "Image Filter", '', 'ImageFilter'), # noqa 0x00189321: ('SQ', '1', "CT Exposure Sequence", '', 'CTExposureSequence'), # noqa 0x00189322: ('FD', '2', "Reconstruction Pixel Spacing", '', 'ReconstructionPixelSpacing'), # noqa 0x00189323: ('CS', '1-n', "Exposure Modulation Type", '', 'ExposureModulationType'), # noqa 0x00189324: ('FD', '1', "Estimated Dose Saving", 'Retired', 'EstimatedDoseSaving'), # noqa 0x00189325: ('SQ', '1', "CT X-Ray Details Sequence", '', 'CTXRayDetailsSequence'), # noqa 0x00189326: ('SQ', '1', "CT Position Sequence", '', 'CTPositionSequence'), # noqa 0x00189327: ('FD', '1', "Table Position", '', 'TablePosition'), # noqa 0x00189328: ('FD', '1', "Exposure Time in ms", '', 'ExposureTimeInms'), # noqa 0x00189329: ('SQ', '1', "CT Image Frame Type Sequence", '', 'CTImageFrameTypeSequence'), # noqa 0x00189330: ('FD', '1', "X-Ray Tube Current in mA", '', 'XRayTubeCurrentInmA'), # noqa 0x00189332: ('FD', '1', "Exposure in mAs", '', 'ExposureInmAs'), # noqa 0x00189333: ('CS', '1', "Constant Volume Flag", '', 'ConstantVolumeFlag'), # noqa 0x00189334: ('CS', '1', "Fluoroscopy Flag", '', 'FluoroscopyFlag'), # noqa 0x00189335: ('FD', '1', "Distance Source to Data Collection Center", '', 'DistanceSourceToDataCollectionCenter'), # noqa 0x00189337: ('US', '1', "Contrast/Bolus Agent Number", '', 'ContrastBolusAgentNumber'), # noqa 0x00189338: ('SQ', '1', "Contrast/Bolus Ingredient Code Sequence", '', 'ContrastBolusIngredientCodeSequence'), # noqa 0x00189340: ('SQ', '1', "Contrast Administration Profile Sequence", '', 'ContrastAdministrationProfileSequence'), # noqa 0x00189341: ('SQ', '1', "Contrast/Bolus Usage Sequence", '', 'ContrastBolusUsageSequence'), # noqa 0x00189342: ('CS', '1', "Contrast/Bolus Agent Administered", '', 'ContrastBolusAgentAdministered'), # noqa 0x00189343: ('CS', '1', "Contrast/Bolus Agent Detected", '', 'ContrastBolusAgentDetected'), # noqa 0x00189344: ('CS', '1', "Contrast/Bolus Agent Phase", '', 'ContrastBolusAgentPhase'), # noqa 0x00189345: ('FD', '1', "CTDIvol", '', 'CTDIvol'), # noqa 0x00189346: ('SQ', '1', "CTDI Phantom Type Code Sequence", '', 'CTDIPhantomTypeCodeSequence'), # noqa 0x00189351: ('FL', '1', "Calcium Scoring Mass Factor Patient", '', 'CalciumScoringMassFactorPatient'), # noqa 0x00189352: ('FL', '3', "Calcium Scoring Mass Factor Device", '', 'CalciumScoringMassFactorDevice'), # noqa 0x00189353: ('FL', '1', "Energy Weighting Factor", '', 'EnergyWeightingFactor'), # noqa 0x00189360: ('SQ', '1', "CT Additional X-Ray Source Sequence", '', 'CTAdditionalXRaySourceSequence'), # noqa 0x00189361: ('CS', '1', "Multi-energy CT Acquisition", '', 'MultienergyCTAcquisition'), # noqa 0x00189362: ('SQ', '1', "Multi-energy CT Acquisition Sequence", '', 'MultienergyCTAcquisitionSequence'), # noqa 0x00189363: ('SQ', '1', "Multi-energy CT Processing Sequence", '', 'MultienergyCTProcessingSequence'), # noqa 0x00189364: ('SQ', '1', "Multi-energy CT Characteristics Sequence", '', 'MultienergyCTCharacteristicsSequence'), # noqa 0x00189365: ('SQ', '1', "Multi-energy CT X-Ray Source Sequence", '', 'MultienergyCTXRaySourceSequence'), # noqa 0x00189366: ('US', '1', "X-Ray Source Index", '', 'XRaySourceIndex'), # noqa 0x00189367: ('UC', '1', "X-Ray Source ID", '', 'XRaySourceID'), # noqa 0x00189368: ('CS', '1', "Multi-energy Source Technique", '', 'MultienergySourceTechnique'), # noqa 0x00189369: ('DT', '1', "Source Start DateTime", '', 'SourceStartDateTime'), # noqa 0x0018936A: ('DT', '1', "Source End DateTime", '', 'SourceEndDateTime'), # noqa 0x0018936B: ('US', '1', "Switching Phase Number", '', 'SwitchingPhaseNumber'), # noqa 0x0018936C: ('DS', '1', "Switching Phase Nominal Duration", '', 'SwitchingPhaseNominalDuration'), # noqa 0x0018936D: ('DS', '1', "Switching Phase Transition Duration", '', 'SwitchingPhaseTransitionDuration'), # noqa 0x0018936E: ('DS', '1', "Effective Bin Energy", '', 'EffectiveBinEnergy'), # noqa 0x0018936F: ('SQ', '1', "Multi-energy CT X-Ray Detector Sequence", '', 'MultienergyCTXRayDetectorSequence'), # noqa 0x00189370: ('US', '1', "X-Ray Detector Index", '', 'XRayDetectorIndex'), # noqa 0x00189371: ('UC', '1', "X-Ray Detector ID", '', 'XRayDetectorID'), # noqa 0x00189372: ('CS', '1', "Multi-energy Detector Type", '', 'MultienergyDetectorType'), # noqa 0x00189373: ('ST', '1', "X-Ray Detector Label", '', 'XRayDetectorLabel'), # noqa 0x00189374: ('DS', '1', "Nominal Max Energy", '', 'NominalMaxEnergy'), # noqa 0x00189375: ('DS', '1', "Nominal Min Energy", '', 'NominalMinEnergy'), # noqa 0x00189376: ('US', '1-n', "Referenced X-Ray Detector Index", '', 'ReferencedXRayDetectorIndex'), # noqa 0x00189377: ('US', '1-n', "Referenced X-Ray Source Index", '', 'ReferencedXRaySourceIndex'), # noqa 0x00189378: ('US', '1-n', "Referenced Path Index", '', 'ReferencedPathIndex'), # noqa 0x00189379: ('SQ', '1', "Multi-energy CT Path Sequence", '', 'MultienergyCTPathSequence'), # noqa 0x0018937A: ('US', '1', "Multi-energy CT Path Index", '', 'MultienergyCTPathIndex'), # noqa 0x0018937B: ('UT', '1', "Multi-energy Acquisition Description", '', 'MultienergyAcquisitionDescription'), # noqa 0x0018937C: ('FD', '1', "Monoenergetic Energy Equivalent", '', 'MonoenergeticEnergyEquivalent'), # noqa 0x0018937D: ('SQ', '1', "Material Code Sequence", '', 'MaterialCodeSequence'), # noqa 0x0018937E: ('CS', '1', "Decomposition Method", '', 'DecompositionMethod'), # noqa 0x0018937F: ('UT', '1', "Decomposition Description", '', 'DecompositionDescription'), # noqa 0x00189380: ('SQ', '1', "Decomposition Algorithm Identification Sequence", '', 'DecompositionAlgorithmIdentificationSequence'), # noqa 0x00189381: ('SQ', '1', "Decomposition Material Sequence", '', 'DecompositionMaterialSequence'), # noqa 0x00189382: ('SQ', '1', "Material Attenuation Sequence", '', 'MaterialAttenuationSequence'), # noqa 0x00189383: ('DS', '1', "Photon Energy", '', 'PhotonEnergy'), # noqa 0x00189384: ('DS', '1', "X-Ray Mass Attenuation Coefficient", '', 'XRayMassAttenuationCoefficient'), # noqa 0x00189401: ('SQ', '1', "Projection Pixel Calibration Sequence", '', 'ProjectionPixelCalibrationSequence'), # noqa 0x00189402: ('FL', '1', "Distance Source to Isocenter", '', 'DistanceSourceToIsocenter'), # noqa 0x00189403: ('FL', '1', "Distance Object to Table Top", '', 'DistanceObjectToTableTop'), # noqa 0x00189404: ('FL', '2', "Object Pixel Spacing in Center of Beam", '', 'ObjectPixelSpacingInCenterOfBeam'), # noqa 0x00189405: ('SQ', '1', "Positioner Position Sequence", '', 'PositionerPositionSequence'), # noqa 0x00189406: ('SQ', '1', "Table Position Sequence", '', 'TablePositionSequence'), # noqa 0x00189407: ('SQ', '1', "Collimator Shape Sequence", '', 'CollimatorShapeSequence'), # noqa 0x00189410: ('CS', '1', "Planes in Acquisition", '', 'PlanesInAcquisition'), # noqa 0x00189412: ('SQ', '1', "XA/XRF Frame Characteristics Sequence", '', 'XAXRFFrameCharacteristicsSequence'), # noqa 0x00189417: ('SQ', '1', "Frame Acquisition Sequence", '', 'FrameAcquisitionSequence'), # noqa 0x00189420: ('CS', '1', "X-Ray Receptor Type", '', 'XRayReceptorType'), # noqa 0x00189423: ('LO', '1', "Acquisition Protocol Name", '', 'AcquisitionProtocolName'), # noqa 0x00189424: ('LT', '1', "Acquisition Protocol Description", '', 'AcquisitionProtocolDescription'), # noqa 0x00189425: ('CS', '1', "Contrast/Bolus Ingredient Opaque", '', 'ContrastBolusIngredientOpaque'), # noqa 0x00189426: ('FL', '1', "Distance Receptor Plane to Detector Housing", '', 'DistanceReceptorPlaneToDetectorHousing'), # noqa 0x00189427: ('CS', '1', "Intensifier Active Shape", '', 'IntensifierActiveShape'), # noqa 0x00189428: ('FL', '1-2', "Intensifier Active Dimension(s)", '', 'IntensifierActiveDimensions'), # noqa 0x00189429: ('FL', '2', "Physical Detector Size", '', 'PhysicalDetectorSize'), # noqa 0x00189430: ('FL', '2', "Position of Isocenter Projection", '', 'PositionOfIsocenterProjection'), # noqa 0x00189432: ('SQ', '1', "Field of View Sequence", '', 'FieldOfViewSequence'), # noqa 0x00189433: ('LO', '1', "Field of View Description", '', 'FieldOfViewDescription'), # noqa 0x00189434: ('SQ', '1', "Exposure Control Sensing Regions Sequence", '', 'ExposureControlSensingRegionsSequence'), # noqa 0x00189435: ('CS', '1', "Exposure Control Sensing Region Shape", '', 'ExposureControlSensingRegionShape'), # noqa 0x00189436: ('SS', '1', "Exposure Control Sensing Region Left Vertical Edge", '', 'ExposureControlSensingRegionLeftVerticalEdge'), # noqa 0x00189437: ('SS', '1', "Exposure Control Sensing Region Right Vertical Edge", '', 'ExposureControlSensingRegionRightVerticalEdge'), # noqa 0x00189438: ('SS', '1', "Exposure Control Sensing Region Upper Horizontal Edge", '', 'ExposureControlSensingRegionUpperHorizontalEdge'), # noqa 0x00189439: ('SS', '1', "Exposure Control Sensing Region Lower Horizontal Edge", '', 'ExposureControlSensingRegionLowerHorizontalEdge'), # noqa 0x00189440: ('SS', '2', "Center of Circular Exposure Control Sensing Region", '', 'CenterOfCircularExposureControlSensingRegion'), # noqa 0x00189441: ('US', '1', "Radius of Circular Exposure Control Sensing Region", '', 'RadiusOfCircularExposureControlSensingRegion'), # noqa 0x00189442: ('SS', '2-n', "Vertices of the Polygonal Exposure Control Sensing Region", '', 'VerticesOfThePolygonalExposureControlSensingRegion'), # noqa 0x00189445: ('OB', '1', "Retired-blank", 'Retired', ''), # noqa 0x00189447: ('FL', '1', "Column Angulation (Patient)", '', 'ColumnAngulationPatient'), # noqa 0x00189449: ('FL', '1', "Beam Angle", '', 'BeamAngle'), # noqa 0x00189451: ('SQ', '1', "Frame Detector Parameters Sequence", '', 'FrameDetectorParametersSequence'), # noqa 0x00189452: ('FL', '1', "Calculated Anatomy Thickness", '', 'CalculatedAnatomyThickness'), # noqa 0x00189455: ('SQ', '1', "Calibration Sequence", '', 'CalibrationSequence'), # noqa 0x00189456: ('SQ', '1', "Object Thickness Sequence", '', 'ObjectThicknessSequence'), # noqa 0x00189457: ('CS', '1', "Plane Identification", '', 'PlaneIdentification'), # noqa 0x00189461: ('FL', '1-2', "Field of View Dimension(s) in Float", '', 'FieldOfViewDimensionsInFloat'), # noqa 0x00189462: ('SQ', '1', "Isocenter Reference System Sequence", '', 'IsocenterReferenceSystemSequence'), # noqa 0x00189463: ('FL', '1', "Positioner Isocenter Primary Angle", '', 'PositionerIsocenterPrimaryAngle'), # noqa 0x00189464: ('FL', '1', "Positioner Isocenter Secondary Angle", '', 'PositionerIsocenterSecondaryAngle'), # noqa 0x00189465: ('FL', '1', "Positioner Isocenter Detector Rotation Angle", '', 'PositionerIsocenterDetectorRotationAngle'), # noqa 0x00189466: ('FL', '1', "Table X Position to Isocenter", '', 'TableXPositionToIsocenter'), # noqa 0x00189467: ('FL', '1', "Table Y Position to Isocenter", '', 'TableYPositionToIsocenter'), # noqa 0x00189468: ('FL', '1', "Table Z Position to Isocenter", '', 'TableZPositionToIsocenter'), # noqa 0x00189469: ('FL', '1', "Table Horizontal Rotation Angle", '', 'TableHorizontalRotationAngle'), # noqa 0x00189470: ('FL', '1', "Table Head Tilt Angle", '', 'TableHeadTiltAngle'), # noqa 0x00189471: ('FL', '1', "Table Cradle Tilt Angle", '', 'TableCradleTiltAngle'), # noqa 0x00189472: ('SQ', '1', "Frame Display Shutter Sequence", '', 'FrameDisplayShutterSequence'), # noqa 0x00189473: ('FL', '1', "Acquired Image Area Dose Product", '', 'AcquiredImageAreaDoseProduct'), # noqa 0x00189474: ('CS', '1', "C-arm Positioner Tabletop Relationship", '', 'CArmPositionerTabletopRelationship'), # noqa 0x00189476: ('SQ', '1', "X-Ray Geometry Sequence", '', 'XRayGeometrySequence'), # noqa 0x00189477: ('SQ', '1', "Irradiation Event Identification Sequence", '', 'IrradiationEventIdentificationSequence'), # noqa 0x00189504: ('SQ', '1', "X-Ray 3D Frame Type Sequence", '', 'XRay3DFrameTypeSequence'), # noqa 0x00189506: ('SQ', '1', "Contributing Sources Sequence", '', 'ContributingSourcesSequence'), # noqa 0x00189507: ('SQ', '1', "X-Ray 3D Acquisition Sequence", '', 'XRay3DAcquisitionSequence'), # noqa 0x00189508: ('FL', '1', "Primary Positioner Scan Arc", '', 'PrimaryPositionerScanArc'), # noqa 0x00189509: ('FL', '1', "Secondary Positioner Scan Arc", '', 'SecondaryPositionerScanArc'), # noqa 0x00189510: ('FL', '1', "Primary Positioner Scan Start Angle", '', 'PrimaryPositionerScanStartAngle'), # noqa 0x00189511: ('FL', '1', "Secondary Positioner Scan Start Angle", '', 'SecondaryPositionerScanStartAngle'), # noqa 0x00189514: ('FL', '1', "Primary Positioner Increment", '', 'PrimaryPositionerIncrement'), # noqa 0x00189515: ('FL', '1', "Secondary Positioner Increment", '', 'SecondaryPositionerIncrement'), # noqa 0x00189516: ('DT', '1', "Start Acquisition DateTime", '', 'StartAcquisitionDateTime'), # noqa 0x00189517: ('DT', '1', "End Acquisition DateTime", '', 'EndAcquisitionDateTime'), # noqa 0x00189518: ('SS', '1', "Primary Positioner Increment Sign", '', 'PrimaryPositionerIncrementSign'), # noqa 0x00189519: ('SS', '1', "Secondary Positioner Increment Sign", '', 'SecondaryPositionerIncrementSign'), # noqa 0x00189524: ('LO', '1', "Application Name", '', 'ApplicationName'), # noqa 0x00189525: ('LO', '1', "Application Version", '', 'ApplicationVersion'), # noqa 0x00189526: ('LO', '1', "Application Manufacturer", '', 'ApplicationManufacturer'), # noqa 0x00189527: ('CS', '1', "Algorithm Type", '', 'AlgorithmType'), # noqa 0x00189528: ('LO', '1', "Algorithm Description", '', 'AlgorithmDescription'), # noqa 0x00189530: ('SQ', '1', "X-Ray 3D Reconstruction Sequence", '', 'XRay3DReconstructionSequence'), # noqa 0x00189531: ('LO', '1', "Reconstruction Description", '', 'ReconstructionDescription'), # noqa 0x00189538: ('SQ', '1', "Per Projection Acquisition Sequence", '', 'PerProjectionAcquisitionSequence'), # noqa 0x00189541: ('SQ', '1', "Detector Position Sequence", '', 'DetectorPositionSequence'), # noqa 0x00189542: ('SQ', '1', "X-Ray Acquisition Dose Sequence", '', 'XRayAcquisitionDoseSequence'), # noqa 0x00189543: ('FD', '1', "X-Ray Source Isocenter Primary Angle", '', 'XRaySourceIsocenterPrimaryAngle'), # noqa 0x00189544: ('FD', '1', "X-Ray Source Isocenter Secondary Angle", '', 'XRaySourceIsocenterSecondaryAngle'), # noqa 0x00189545: ('FD', '1', "Breast Support Isocenter Primary Angle", '', 'BreastSupportIsocenterPrimaryAngle'), # noqa 0x00189546: ('FD', '1', "Breast Support Isocenter Secondary Angle", '', 'BreastSupportIsocenterSecondaryAngle'), # noqa 0x00189547: ('FD', '1', "Breast Support X Position to Isocenter", '', 'BreastSupportXPositionToIsocenter'), # noqa 0x00189548: ('FD', '1', "Breast Support Y Position to Isocenter", '', 'BreastSupportYPositionToIsocenter'), # noqa 0x00189549: ('FD', '1', "Breast Support Z Position to Isocenter", '', 'BreastSupportZPositionToIsocenter'), # noqa 0x00189550: ('FD', '1', "Detector Isocenter Primary Angle", '', 'DetectorIsocenterPrimaryAngle'), # noqa 0x00189551: ('FD', '1', "Detector Isocenter Secondary Angle", '', 'DetectorIsocenterSecondaryAngle'), # noqa 0x00189552: ('FD', '1', "Detector X Position to Isocenter", '', 'DetectorXPositionToIsocenter'), # noqa 0x00189553: ('FD', '1', "Detector Y Position to Isocenter", '', 'DetectorYPositionToIsocenter'), # noqa 0x00189554: ('FD', '1', "Detector Z Position to Isocenter", '', 'DetectorZPositionToIsocenter'), # noqa 0x00189555: ('SQ', '1', "X-Ray Grid Sequence", '', 'XRayGridSequence'), # noqa 0x00189556: ('SQ', '1', "X-Ray Filter Sequence", '', 'XRayFilterSequence'), # noqa 0x00189557: ('FD', '3', "Detector Active Area TLHC Position", '', 'DetectorActiveAreaTLHCPosition'), # noqa 0x00189558: ('FD', '6', "Detector Active Area Orientation", '', 'DetectorActiveAreaOrientation'), # noqa 0x00189559: ('CS', '1', "Positioner Primary Angle Direction", '', 'PositionerPrimaryAngleDirection'), # noqa 0x00189601: ('SQ', '1', "Diffusion b-matrix Sequence", '', 'DiffusionBMatrixSequence'), # noqa 0x00189602: ('FD', '1', "Diffusion b-value XX", '', 'DiffusionBValueXX'), # noqa 0x00189603: ('FD', '1', "Diffusion b-value XY", '', 'DiffusionBValueXY'), # noqa 0x00189604: ('FD', '1', "Diffusion b-value XZ", '', 'DiffusionBValueXZ'), # noqa 0x00189605: ('FD', '1', "Diffusion b-value YY", '', 'DiffusionBValueYY'), # noqa 0x00189606: ('FD', '1', "Diffusion b-value YZ", '', 'DiffusionBValueYZ'), # noqa 0x00189607: ('FD', '1', "Diffusion b-value ZZ", '', 'DiffusionBValueZZ'), # noqa 0x00189621: ('SQ', '1', "Functional MR Sequence", '', 'FunctionalMRSequence'), # noqa 0x00189622: ('CS', '1', "Functional Settling Phase Frames Present", '', 'FunctionalSettlingPhaseFramesPresent'), # noqa 0x00189623: ('DT', '1', "Functional Sync Pulse", '', 'FunctionalSyncPulse'), # noqa 0x00189624: ('CS', '1', "Settling Phase Frame", '', 'SettlingPhaseFrame'), # noqa 0x00189701: ('DT', '1', "Decay Correction DateTime", '', 'DecayCorrectionDateTime'), # noqa 0x00189715: ('FD', '1', "Start Density Threshold", '', 'StartDensityThreshold'), # noqa 0x00189716: ('FD', '1', "Start Relative Density Difference Threshold", '', 'StartRelativeDensityDifferenceThreshold'), # noqa 0x00189717: ('FD', '1', "Start Cardiac Trigger Count Threshold", '', 'StartCardiacTriggerCountThreshold'), # noqa 0x00189718: ('FD', '1', "Start Respiratory Trigger Count Threshold", '', 'StartRespiratoryTriggerCountThreshold'), # noqa 0x00189719: ('FD', '1', "Termination Counts Threshold", '', 'TerminationCountsThreshold'), # noqa 0x00189720: ('FD', '1', "Termination Density Threshold", '', 'TerminationDensityThreshold'), # noqa 0x00189721: ('FD', '1', "Termination Relative Density Threshold", '', 'TerminationRelativeDensityThreshold'), # noqa 0x00189722: ('FD', '1', "Termination Time Threshold", '', 'TerminationTimeThreshold'), # noqa 0x00189723: ('FD', '1', "Termination Cardiac Trigger Count Threshold", '', 'TerminationCardiacTriggerCountThreshold'), # noqa 0x00189724: ('FD', '1', "Termination Respiratory Trigger Count Threshold", '', 'TerminationRespiratoryTriggerCountThreshold'), # noqa 0x00189725: ('CS', '1', "Detector Geometry", '', 'DetectorGeometry'), # noqa 0x00189726: ('FD', '1', "Transverse Detector Separation", '', 'TransverseDetectorSeparation'), # noqa 0x00189727: ('FD', '1', "Axial Detector Dimension", '', 'AxialDetectorDimension'), # noqa 0x00189729: ('US', '1', "Radiopharmaceutical Agent Number", '', 'RadiopharmaceuticalAgentNumber'), # noqa 0x00189732: ('SQ', '1', "PET Frame Acquisition Sequence", '', 'PETFrameAcquisitionSequence'), # noqa 0x00189733: ('SQ', '1', "PET Detector Motion Details Sequence", '', 'PETDetectorMotionDetailsSequence'), # noqa 0x00189734: ('SQ', '1', "PET Table Dynamics Sequence", '', 'PETTableDynamicsSequence'), # noqa 0x00189735: ('SQ', '1', "PET Position Sequence", '', 'PETPositionSequence'), # noqa 0x00189736: ('SQ', '1', "PET Frame Correction Factors Sequence", '', 'PETFrameCorrectionFactorsSequence'), # noqa 0x00189737: ('SQ', '1', "Radiopharmaceutical Usage Sequence", '', 'RadiopharmaceuticalUsageSequence'), # noqa 0x00189738: ('CS', '1', "Attenuation Correction Source", '', 'AttenuationCorrectionSource'), # noqa 0x00189739: ('US', '1', "Number of Iterations", '', 'NumberOfIterations'), # noqa 0x00189740: ('US', '1', "Number of Subsets", '', 'NumberOfSubsets'), # noqa 0x00189749: ('SQ', '1', "PET Reconstruction Sequence", '', 'PETReconstructionSequence'), # noqa 0x00189751: ('SQ', '1', "PET Frame Type Sequence", '', 'PETFrameTypeSequence'), # noqa 0x00189755: ('CS', '1', "Time of Flight Information Used", '', 'TimeOfFlightInformationUsed'), # noqa 0x00189756: ('CS', '1', "Reconstruction Type", '', 'ReconstructionType'), # noqa 0x00189758: ('CS', '1', "Decay Corrected", '', 'DecayCorrected'), # noqa 0x00189759: ('CS', '1', "Attenuation Corrected", '', 'AttenuationCorrected'), # noqa 0x00189760: ('CS', '1', "Scatter Corrected", '', 'ScatterCorrected'), # noqa 0x00189761: ('CS', '1', "Dead Time Corrected", '', 'DeadTimeCorrected'), # noqa 0x00189762: ('CS', '1', "Gantry Motion Corrected", '', 'GantryMotionCorrected'), # noqa 0x00189763: ('CS', '1', "Patient Motion Corrected", '', 'PatientMotionCorrected'), # noqa 0x00189764: ('CS', '1', "Count Loss Normalization Corrected", '', 'CountLossNormalizationCorrected'), # noqa 0x00189765: ('CS', '1', "Randoms Corrected", '', 'RandomsCorrected'), # noqa 0x00189766: ('CS', '1', "Non-uniform Radial Sampling Corrected", '', 'NonUniformRadialSamplingCorrected'), # noqa 0x00189767: ('CS', '1', "Sensitivity Calibrated", '', 'SensitivityCalibrated'), # noqa 0x00189768: ('CS', '1', "Detector Normalization Correction", '', 'DetectorNormalizationCorrection'), # noqa 0x00189769: ('CS', '1', "Iterative Reconstruction Method", '', 'IterativeReconstructionMethod'), # noqa 0x00189770: ('CS', '1', "Attenuation Correction Temporal Relationship", '', 'AttenuationCorrectionTemporalRelationship'), # noqa 0x00189771: ('SQ', '1', "Patient Physiological State Sequence", '', 'PatientPhysiologicalStateSequence'), # noqa 0x00189772: ('SQ', '1', "Patient Physiological State Code Sequence", '', 'PatientPhysiologicalStateCodeSequence'), # noqa 0x00189801: ('FD', '1-n', "Depth(s) of Focus", '', 'DepthsOfFocus'), # noqa 0x00189803: ('SQ', '1', "Excluded Intervals Sequence", '', 'ExcludedIntervalsSequence'), # noqa 0x00189804: ('DT', '1', "Exclusion Start DateTime", '', 'ExclusionStartDateTime'), # noqa 0x00189805: ('FD', '1', "Exclusion Duration", '', 'ExclusionDuration'), # noqa 0x00189806: ('SQ', '1', "US Image Description Sequence", '', 'USImageDescriptionSequence'), # noqa 0x00189807: ('SQ', '1', "Image Data Type Sequence", '', 'ImageDataTypeSequence'), # noqa 0x00189808: ('CS', '1', "Data Type", '', 'DataType'), # noqa 0x00189809: ('SQ', '1', "Transducer Scan Pattern Code Sequence", '', 'TransducerScanPatternCodeSequence'), # noqa 0x0018980B: ('CS', '1', "Aliased Data Type", '', 'AliasedDataType'), # noqa 0x0018980C: ('CS', '1', "Position Measuring Device Used", '', 'PositionMeasuringDeviceUsed'), # noqa 0x0018980D: ('SQ', '1', "Transducer Geometry Code Sequence", '', 'TransducerGeometryCodeSequence'), # noqa 0x0018980E: ('SQ', '1', "Transducer Beam Steering Code Sequence", '', 'TransducerBeamSteeringCodeSequence'), # noqa 0x0018980F: ('SQ', '1', "Transducer Application Code Sequence", '', 'TransducerApplicationCodeSequence'), # noqa 0x00189810: ('US or SS', '1', "Zero Velocity Pixel Value", '', 'ZeroVelocityPixelValue'), # noqa 0x00189900: ('LO', '1', "Reference Location Label", '', 'ReferenceLocationLabel'), # noqa 0x00189901: ('UT', '1', "Reference Location Description", '', 'ReferenceLocationDescription'), # noqa 0x00189902: ('SQ', '1', "Reference Basis Code Sequence", '', 'ReferenceBasisCodeSequence'), # noqa 0x00189903: ('SQ', '1', "Reference Geometry Code Sequence", '', 'ReferenceGeometryCodeSequence'), # noqa 0x00189904: ('DS', '1', "Offset Distance", '', 'OffsetDistance'), # noqa 0x00189905: ('CS', '1', "Offset Direction", '', 'OffsetDirection'), # noqa 0x00189906: ('SQ', '1', "Potential Scheduled Protocol Code Sequence", '', 'PotentialScheduledProtocolCodeSequence'), # noqa 0x00189907: ('SQ', '1', "Potential Requested Procedure Code Sequence", '', 'PotentialRequestedProcedureCodeSequence'), # noqa 0x00189908: ('UC', '1-n', "Potential Reasons for Procedure", '', 'PotentialReasonsForProcedure'), # noqa 0x00189909: ('SQ', '1', "Potential Reasons for Procedure Code Sequence", '', 'PotentialReasonsForProcedureCodeSequence'), # noqa 0x0018990A: ('UC', '1-n', "Potential Diagnostic Tasks", '', 'PotentialDiagnosticTasks'), # noqa 0x0018990B: ('SQ', '1', "Contraindications Code Sequence", '', 'ContraindicationsCodeSequence'), # noqa 0x0018990C: ('SQ', '1', "Referenced Defined Protocol Sequence", '', 'ReferencedDefinedProtocolSequence'), # noqa 0x0018990D: ('SQ', '1', "Referenced Performed Protocol Sequence", '', 'ReferencedPerformedProtocolSequence'), # noqa 0x0018990E: ('SQ', '1', "Predecessor Protocol Sequence", '', 'PredecessorProtocolSequence'), # noqa 0x0018990F: ('UT', '1', "Protocol Planning Information", '', 'ProtocolPlanningInformation'), # noqa 0x00189910: ('UT', '1', "Protocol Design Rationale", '', 'ProtocolDesignRationale'), # noqa 0x00189911: ('SQ', '1', "Patient Specification Sequence", '', 'PatientSpecificationSequence'), # noqa 0x00189912: ('SQ', '1', "Model Specification Sequence", '', 'ModelSpecificationSequence'), # noqa 0x00189913: ('SQ', '1', "Parameters Specification Sequence", '', 'ParametersSpecificationSequence'), # noqa 0x00189914: ('SQ', '1', "Instruction Sequence", '', 'InstructionSequence'), # noqa 0x00189915: ('US', '1', "Instruction Index", '', 'InstructionIndex'), # noqa 0x00189916: ('LO', '1', "Instruction Text", '', 'InstructionText'), # noqa 0x00189917: ('UT', '1', "Instruction Description", '', 'InstructionDescription'), # noqa 0x00189918: ('CS', '1', "Instruction Performed Flag", '', 'InstructionPerformedFlag'), # noqa 0x00189919: ('DT', '1', "Instruction Performed DateTime", '', 'InstructionPerformedDateTime'), # noqa 0x0018991A: ('UT', '1', "Instruction Performance Comment", '', 'InstructionPerformanceComment'), # noqa 0x0018991B: ('SQ', '1', "Patient Positioning Instruction Sequence", '', 'PatientPositioningInstructionSequence'), # noqa 0x0018991C: ('SQ', '1', "Positioning Method Code Sequence", '', 'PositioningMethodCodeSequence'), # noqa 0x0018991D: ('SQ', '1', "Positioning Landmark Sequence", '', 'PositioningLandmarkSequence'), # noqa 0x0018991E: ('UI', '1', "Target Frame of Reference UID", '', 'TargetFrameOfReferenceUID'), # noqa 0x0018991F: ('SQ', '1', "Acquisition Protocol Element Specification Sequence", '', 'AcquisitionProtocolElementSpecificationSequence'), # noqa 0x00189920: ('SQ', '1', "Acquisition Protocol Element Sequence", '', 'AcquisitionProtocolElementSequence'), # noqa 0x00189921: ('US', '1', "Protocol Element Number", '', 'ProtocolElementNumber'), # noqa 0x00189922: ('LO', '1', "Protocol Element Name", '', 'ProtocolElementName'), # noqa 0x00189923: ('UT', '1', "Protocol Element Characteristics Summary", '', 'ProtocolElementCharacteristicsSummary'), # noqa 0x00189924: ('UT', '1', "Protocol Element Purpose", '', 'ProtocolElementPurpose'), # noqa 0x00189930: ('CS', '1', "Acquisition Motion", '', 'AcquisitionMotion'), # noqa 0x00189931: ('SQ', '1', "Acquisition Start Location Sequence", '', 'AcquisitionStartLocationSequence'), # noqa 0x00189932: ('SQ', '1', "Acquisition End Location Sequence", '', 'AcquisitionEndLocationSequence'), # noqa 0x00189933: ('SQ', '1', "Reconstruction Protocol Element Specification Sequence", '', 'ReconstructionProtocolElementSpecificationSequence'), # noqa 0x00189934: ('SQ', '1', "Reconstruction Protocol Element Sequence", '', 'ReconstructionProtocolElementSequence'), # noqa 0x00189935: ('SQ', '1', "Storage Protocol Element Specification Sequence", '', 'StorageProtocolElementSpecificationSequence'), # noqa 0x00189936: ('SQ', '1', "Storage Protocol Element Sequence", '', 'StorageProtocolElementSequence'), # noqa 0x00189937: ('LO', '1', "Requested Series Description", '', 'RequestedSeriesDescription'), # noqa 0x00189938: ('US', '1-n', "Source Acquisition Protocol Element Number", '', 'SourceAcquisitionProtocolElementNumber'), # noqa 0x00189939: ('US', '1-n', "Source Acquisition Beam Number", '', 'SourceAcquisitionBeamNumber'), # noqa 0x0018993A: ('US', '1-n', "Source Reconstruction Protocol Element Number", '', 'SourceReconstructionProtocolElementNumber'), # noqa 0x0018993B: ('SQ', '1', "Reconstruction Start Location Sequence", '', 'ReconstructionStartLocationSequence'), # noqa 0x0018993C: ('SQ', '1', "Reconstruction End Location Sequence", '', 'ReconstructionEndLocationSequence'), # noqa 0x0018993D: ('SQ', '1', "Reconstruction Algorithm Sequence", '', 'ReconstructionAlgorithmSequence'), # noqa 0x0018993E: ('SQ', '1', "Reconstruction Target Center Location Sequence", '', 'ReconstructionTargetCenterLocationSequence'), # noqa 0x00189941: ('UT', '1', "Image Filter Description", '', 'ImageFilterDescription'), # noqa 0x00189942: ('FD', '1', "CTDIvol Notification Trigger", '', 'CTDIvolNotificationTrigger'), # noqa 0x00189943: ('FD', '1', "DLP Notification Trigger", '', 'DLPNotificationTrigger'), # noqa 0x00189944: ('CS', '1', "Auto KVP Selection Type", '', 'AutoKVPSelectionType'), # noqa 0x00189945: ('FD', '1', "Auto KVP Upper Bound", '', 'AutoKVPUpperBound'), # noqa 0x00189946: ('FD', '1', "Auto KVP Lower Bound", '', 'AutoKVPLowerBound'), # noqa 0x00189947: ('CS', '1', "Protocol Defined Patient Position", '', 'ProtocolDefinedPatientPosition'), # noqa 0x0018A001: ('SQ', '1', "Contributing Equipment Sequence", '', 'ContributingEquipmentSequence'), # noqa 0x0018A002: ('DT', '1', "Contribution DateTime", '', 'ContributionDateTime'), # noqa 0x0018A003: ('ST', '1', "Contribution Description", '', 'ContributionDescription'), # noqa 0x0020000D: ('UI', '1', "Study Instance UID", '', 'StudyInstanceUID'), # noqa 0x0020000E: ('UI', '1', "Series Instance UID", '', 'SeriesInstanceUID'), # noqa 0x00200010: ('SH', '1', "Study ID", '', 'StudyID'), # noqa 0x00200011: ('IS', '1', "Series Number", '', 'SeriesNumber'), # noqa 0x00200012: ('IS', '1', "Acquisition Number", '', 'AcquisitionNumber'), # noqa 0x00200013: ('IS', '1', "Instance Number", '', 'InstanceNumber'), # noqa 0x00200014: ('IS', '1', "Isotope Number", 'Retired', 'IsotopeNumber'), # noqa 0x00200015: ('IS', '1', "Phase Number", 'Retired', 'PhaseNumber'), # noqa 0x00200016: ('IS', '1', "Interval Number", 'Retired', 'IntervalNumber'), # noqa 0x00200017: ('IS', '1', "Time Slot Number", 'Retired', 'TimeSlotNumber'), # noqa 0x00200018: ('IS', '1', "Angle Number", 'Retired', 'AngleNumber'), # noqa 0x00200019: ('IS', '1', "Item Number", '', 'ItemNumber'), # noqa 0x00200020: ('CS', '2', "Patient Orientation", '', 'PatientOrientation'), # noqa 0x00200022: ('IS', '1', "Overlay Number", 'Retired', 'OverlayNumber'), # noqa 0x00200024: ('IS', '1', "Curve Number", 'Retired', 'CurveNumber'), # noqa 0x00200026: ('IS', '1', "LUT Number", 'Retired', 'LUTNumber'), # noqa 0x00200027: ('LO', '1', "Pyramid Label", '', 'PyramidLabel'), # noqa 0x00200030: ('DS', '3', "Image Position", 'Retired', 'ImagePosition'), # noqa 0x00200032: ('DS', '3', "Image Position (Patient)", '', 'ImagePositionPatient'), # noqa 0x00200035: ('DS', '6', "Image Orientation", 'Retired', 'ImageOrientation'), # noqa 0x00200037: ('DS', '6', "Image Orientation (Patient)", '', 'ImageOrientationPatient'), # noqa 0x00200050: ('DS', '1', "Location", 'Retired', 'Location'), # noqa 0x00200052: ('UI', '1', "Frame of Reference UID", '', 'FrameOfReferenceUID'), # noqa 0x00200060: ('CS', '1', "Laterality", '', 'Laterality'), # noqa 0x00200062: ('CS', '1', "Image Laterality", '', 'ImageLaterality'), # noqa 0x00200070: ('LO', '1', "Image Geometry Type", 'Retired', 'ImageGeometryType'), # noqa 0x00200080: ('CS', '1-n', "Masking Image", 'Retired', 'MaskingImage'), # noqa 0x002000AA: ('IS', '1', "Report Number", 'Retired', 'ReportNumber'), # noqa 0x00200100: ('IS', '1', "Temporal Position Identifier", '', 'TemporalPositionIdentifier'), # noqa 0x00200105: ('IS', '1', "Number of Temporal Positions", '', 'NumberOfTemporalPositions'), # noqa 0x00200110: ('DS', '1', "Temporal Resolution", '', 'TemporalResolution'), # noqa 0x00200200: ('UI', '1', "Synchronization Frame of Reference UID", '', 'SynchronizationFrameOfReferenceUID'), # noqa 0x00200242: ('UI', '1', "SOP Instance UID of Concatenation Source", '', 'SOPInstanceUIDOfConcatenationSource'), # noqa 0x00201000: ('IS', '1', "Series in Study", 'Retired', 'SeriesInStudy'), # noqa 0x00201001: ('IS', '1', "Acquisitions in Series", 'Retired', 'AcquisitionsInSeries'), # noqa 0x00201002: ('IS', '1', "Images in Acquisition", '', 'ImagesInAcquisition'), # noqa 0x00201003: ('IS', '1', "Images in Series", 'Retired', 'ImagesInSeries'), # noqa 0x00201004: ('IS', '1', "Acquisitions in Study", 'Retired', 'AcquisitionsInStudy'), # noqa 0x00201005: ('IS', '1', "Images in Study", 'Retired', 'ImagesInStudy'), # noqa 0x00201020: ('LO', '1-n', "Reference", 'Retired', 'Reference'), # noqa 0x0020103F: ('LO', '1', "Target Position Reference Indicator", '', 'TargetPositionReferenceIndicator'), # noqa 0x00201040: ('LO', '1', "Position Reference Indicator", '', 'PositionReferenceIndicator'), # noqa 0x00201041: ('DS', '1', "Slice Location", '', 'SliceLocation'), # noqa 0x00201070: ('IS', '1-n', "Other Study Numbers", 'Retired', 'OtherStudyNumbers'), # noqa 0x00201200: ('IS', '1', "Number of Patient Related Studies", '', 'NumberOfPatientRelatedStudies'), # noqa 0x00201202: ('IS', '1', "Number of Patient Related Series", '', 'NumberOfPatientRelatedSeries'), # noqa 0x00201204: ('IS', '1', "Number of Patient Related Instances", '', 'NumberOfPatientRelatedInstances'), # noqa 0x00201206: ('IS', '1', "Number of Study Related Series", '', 'NumberOfStudyRelatedSeries'), # noqa 0x00201208: ('IS', '1', "Number of Study Related Instances", '', 'NumberOfStudyRelatedInstances'), # noqa 0x00201209: ('IS', '1', "Number of Series Related Instances", '', 'NumberOfSeriesRelatedInstances'), # noqa 0x00203401: ('CS', '1', "Modifying Device ID", 'Retired', 'ModifyingDeviceID'), # noqa 0x00203402: ('CS', '1', "Modified Image ID", 'Retired', 'ModifiedImageID'), # noqa 0x00203403: ('DA', '1', "Modified Image Date", 'Retired', 'ModifiedImageDate'), # noqa 0x00203404: ('LO', '1', "Modifying Device Manufacturer", 'Retired', 'ModifyingDeviceManufacturer'), # noqa 0x00203405: ('TM', '1', "Modified Image Time", 'Retired', 'ModifiedImageTime'), # noqa 0x00203406: ('LO', '1', "Modified Image Description", 'Retired', 'ModifiedImageDescription'), # noqa 0x00204000: ('LT', '1', "Image Comments", '', 'ImageComments'), # noqa 0x00205000: ('AT', '1-n', "Original Image Identification", 'Retired', 'OriginalImageIdentification'), # noqa 0x00205002: ('LO', '1-n', "Original Image Identification Nomenclature", 'Retired', 'OriginalImageIdentificationNomenclature'), # noqa 0x00209056: ('SH', '1', "Stack ID", '', 'StackID'), # noqa 0x00209057: ('UL', '1', "In-Stack Position Number", '', 'InStackPositionNumber'), # noqa 0x00209071: ('SQ', '1', "Frame Anatomy Sequence", '', 'FrameAnatomySequence'), # noqa 0x00209072: ('CS', '1', "Frame Laterality", '', 'FrameLaterality'), # noqa 0x00209111: ('SQ', '1', "Frame Content Sequence", '', 'FrameContentSequence'), # noqa 0x00209113: ('SQ', '1', "Plane Position Sequence", '', 'PlanePositionSequence'), # noqa 0x00209116: ('SQ', '1', "Plane Orientation Sequence", '', 'PlaneOrientationSequence'), # noqa 0x00209128: ('UL', '1', "Temporal Position Index", '', 'TemporalPositionIndex'), # noqa 0x00209153: ('FD', '1', "Nominal Cardiac Trigger Delay Time", '', 'NominalCardiacTriggerDelayTime'), # noqa 0x00209154: ('FL', '1', "Nominal Cardiac Trigger Time Prior To R-Peak", '', 'NominalCardiacTriggerTimePriorToRPeak'), # noqa 0x00209155: ('FL', '1', "Actual Cardiac Trigger Time Prior To R-Peak", '', 'ActualCardiacTriggerTimePriorToRPeak'), # noqa 0x00209156: ('US', '1', "Frame Acquisition Number", '', 'FrameAcquisitionNumber'), # noqa 0x00209157: ('UL', '1-n', "Dimension Index Values", '', 'DimensionIndexValues'), # noqa 0x00209158: ('LT', '1', "Frame Comments", '', 'FrameComments'), # noqa 0x00209161: ('UI', '1', "Concatenation UID", '', 'ConcatenationUID'), # noqa 0x00209162: ('US', '1', "In-concatenation Number", '', 'InConcatenationNumber'), # noqa 0x00209163: ('US', '1', "In-concatenation Total Number", '', 'InConcatenationTotalNumber'), # noqa 0x00209164: ('UI', '1', "Dimension Organization UID", '', 'DimensionOrganizationUID'), # noqa 0x00209165: ('AT', '1', "Dimension Index Pointer", '', 'DimensionIndexPointer'), # noqa 0x00209167: ('AT', '1', "Functional Group Pointer", '', 'FunctionalGroupPointer'), # noqa 0x00209170: ('SQ', '1', "Unassigned Shared Converted Attributes Sequence", '', 'UnassignedSharedConvertedAttributesSequence'), # noqa 0x00209171: ('SQ', '1', "Unassigned Per-Frame Converted Attributes Sequence", '', 'UnassignedPerFrameConvertedAttributesSequence'), # noqa 0x00209172: ('SQ', '1', "Conversion Source Attributes Sequence", '', 'ConversionSourceAttributesSequence'), # noqa 0x00209213: ('LO', '1', "Dimension Index Private Creator", '', 'DimensionIndexPrivateCreator'), # noqa 0x00209221: ('SQ', '1', "Dimension Organization Sequence", '', 'DimensionOrganizationSequence'), # noqa 0x00209222: ('SQ', '1', "Dimension Index Sequence", '', 'DimensionIndexSequence'), # noqa 0x00209228: ('UL', '1', "Concatenation Frame Offset Number", '', 'ConcatenationFrameOffsetNumber'), # noqa 0x00209238: ('LO', '1', "Functional Group Private Creator", '', 'FunctionalGroupPrivateCreator'), # noqa 0x00209241: ('FL', '1', "Nominal Percentage of Cardiac Phase", '', 'NominalPercentageOfCardiacPhase'), # noqa 0x00209245: ('FL', '1', "Nominal Percentage of Respiratory Phase", '', 'NominalPercentageOfRespiratoryPhase'), # noqa 0x00209246: ('FL', '1', "Starting Respiratory Amplitude", '', 'StartingRespiratoryAmplitude'), # noqa 0x00209247: ('CS', '1', "Starting Respiratory Phase", '', 'StartingRespiratoryPhase'), # noqa 0x00209248: ('FL', '1', "Ending Respiratory Amplitude", '', 'EndingRespiratoryAmplitude'), # noqa 0x00209249: ('CS', '1', "Ending Respiratory Phase", '', 'EndingRespiratoryPhase'), # noqa 0x00209250: ('CS', '1', "Respiratory Trigger Type", '', 'RespiratoryTriggerType'), # noqa 0x00209251: ('FD', '1', "R-R Interval Time Nominal", '', 'RRIntervalTimeNominal'), # noqa 0x00209252: ('FD', '1', "Actual Cardiac Trigger Delay Time", '', 'ActualCardiacTriggerDelayTime'), # noqa 0x00209253: ('SQ', '1', "Respiratory Synchronization Sequence", '', 'RespiratorySynchronizationSequence'), # noqa 0x00209254: ('FD', '1', "Respiratory Interval Time", '', 'RespiratoryIntervalTime'), # noqa 0x00209255: ('FD', '1', "Nominal Respiratory Trigger Delay Time", '', 'NominalRespiratoryTriggerDelayTime'), # noqa 0x00209256: ('FD', '1', "Respiratory Trigger Delay Threshold", '', 'RespiratoryTriggerDelayThreshold'), # noqa 0x00209257: ('FD', '1', "Actual Respiratory Trigger Delay Time", '', 'ActualRespiratoryTriggerDelayTime'), # noqa 0x00209301: ('FD', '3', "Image Position (Volume)", '', 'ImagePositionVolume'), # noqa 0x00209302: ('FD', '6', "Image Orientation (Volume)", '', 'ImageOrientationVolume'), # noqa 0x00209307: ('CS', '1', "Ultrasound Acquisition Geometry", '', 'UltrasoundAcquisitionGeometry'), # noqa 0x00209308: ('FD', '3', "Apex Position", '', 'ApexPosition'), # noqa 0x00209309: ('FD', '16', "Volume to Transducer Mapping Matrix", '', 'VolumeToTransducerMappingMatrix'), # noqa 0x0020930A: ('FD', '16', "Volume to Table Mapping Matrix", '', 'VolumeToTableMappingMatrix'), # noqa 0x0020930B: ('CS', '1', "Volume to Transducer Relationship", '', 'VolumeToTransducerRelationship'), # noqa 0x0020930C: ('CS', '1', "Patient Frame of Reference Source", '', 'PatientFrameOfReferenceSource'), # noqa 0x0020930D: ('FD', '1', "Temporal Position Time Offset", '', 'TemporalPositionTimeOffset'), # noqa 0x0020930E: ('SQ', '1', "Plane Position (Volume) Sequence", '', 'PlanePositionVolumeSequence'), # noqa 0x0020930F: ('SQ', '1', "Plane Orientation (Volume) Sequence", '', 'PlaneOrientationVolumeSequence'), # noqa 0x00209310: ('SQ', '1', "Temporal Position Sequence", '', 'TemporalPositionSequence'), # noqa 0x00209311: ('CS', '1', "Dimension Organization Type", '', 'DimensionOrganizationType'), # noqa 0x00209312: ('UI', '1', "Volume Frame of Reference UID", '', 'VolumeFrameOfReferenceUID'), # noqa 0x00209313: ('UI', '1', "Table Frame of Reference UID", '', 'TableFrameOfReferenceUID'), # noqa 0x00209421: ('LO', '1', "Dimension Description Label", '', 'DimensionDescriptionLabel'), # noqa 0x00209450: ('SQ', '1', "Patient Orientation in Frame Sequence", '', 'PatientOrientationInFrameSequence'), # noqa 0x00209453: ('LO', '1', "Frame Label", '', 'FrameLabel'), # noqa 0x00209518: ('US', '1-n', "Acquisition Index", '', 'AcquisitionIndex'), # noqa 0x00209529: ('SQ', '1', "Contributing SOP Instances Reference Sequence", '', 'ContributingSOPInstancesReferenceSequence'), # noqa 0x00209536: ('US', '1', "Reconstruction Index", '', 'ReconstructionIndex'), # noqa 0x00220001: ('US', '1', "Light Path Filter Pass-Through Wavelength", '', 'LightPathFilterPassThroughWavelength'), # noqa 0x00220002: ('US', '2', "Light Path Filter Pass Band", '', 'LightPathFilterPassBand'), # noqa 0x00220003: ('US', '1', "Image Path Filter Pass-Through Wavelength", '', 'ImagePathFilterPassThroughWavelength'), # noqa 0x00220004: ('US', '2', "Image Path Filter Pass Band", '', 'ImagePathFilterPassBand'), # noqa 0x00220005: ('CS', '1', "Patient Eye Movement Commanded", '', 'PatientEyeMovementCommanded'), # noqa 0x00220006: ('SQ', '1', "Patient Eye Movement Command Code Sequence", '', 'PatientEyeMovementCommandCodeSequence'), # noqa 0x00220007: ('FL', '1', "Spherical Lens Power", '', 'SphericalLensPower'), # noqa 0x00220008: ('FL', '1', "Cylinder Lens Power", '', 'CylinderLensPower'), # noqa 0x00220009: ('FL', '1', "Cylinder Axis", '', 'CylinderAxis'), # noqa 0x0022000A: ('FL', '1', "Emmetropic Magnification", '', 'EmmetropicMagnification'), # noqa 0x0022000B: ('FL', '1', "Intra Ocular Pressure", '', 'IntraOcularPressure'), # noqa 0x0022000C: ('FL', '1', "Horizontal Field of View", '', 'HorizontalFieldOfView'), # noqa 0x0022000D: ('CS', '1', "Pupil Dilated", '', 'PupilDilated'), # noqa 0x0022000E: ('FL', '1', "Degree of Dilation", '', 'DegreeOfDilation'), # noqa 0x00220010: ('FL', '1', "Stereo Baseline Angle", '', 'StereoBaselineAngle'), # noqa 0x00220011: ('FL', '1', "Stereo Baseline Displacement", '', 'StereoBaselineDisplacement'), # noqa 0x00220012: ('FL', '1', "Stereo Horizontal Pixel Offset", '', 'StereoHorizontalPixelOffset'), # noqa 0x00220013: ('FL', '1', "Stereo Vertical Pixel Offset", '', 'StereoVerticalPixelOffset'), # noqa 0x00220014: ('FL', '1', "Stereo Rotation", '', 'StereoRotation'), # noqa 0x00220015: ('SQ', '1', "Acquisition Device Type Code Sequence", '', 'AcquisitionDeviceTypeCodeSequence'), # noqa 0x00220016: ('SQ', '1', "Illumination Type Code Sequence", '', 'IlluminationTypeCodeSequence'), # noqa 0x00220017: ('SQ', '1', "Light Path Filter Type Stack Code Sequence", '', 'LightPathFilterTypeStackCodeSequence'), # noqa 0x00220018: ('SQ', '1', "Image Path Filter Type Stack Code Sequence", '', 'ImagePathFilterTypeStackCodeSequence'), # noqa 0x00220019: ('SQ', '1', "Lenses Code Sequence", '', 'LensesCodeSequence'), # noqa 0x0022001A: ('SQ', '1', "Channel Description Code Sequence", '', 'ChannelDescriptionCodeSequence'), # noqa 0x0022001B: ('SQ', '1', "Refractive State Sequence", '', 'RefractiveStateSequence'), # noqa 0x0022001C: ('SQ', '1', "Mydriatic Agent Code Sequence", '', 'MydriaticAgentCodeSequence'), # noqa 0x0022001D: ('SQ', '1', "Relative Image Position Code Sequence", '', 'RelativeImagePositionCodeSequence'), # noqa 0x0022001E: ('FL', '1', "Camera Angle of View", '', 'CameraAngleOfView'), # noqa 0x00220020: ('SQ', '1', "Stereo Pairs Sequence", '', 'StereoPairsSequence'), # noqa 0x00220021: ('SQ', '1', "Left Image Sequence", '', 'LeftImageSequence'), # noqa 0x00220022: ('SQ', '1', "Right Image Sequence", '', 'RightImageSequence'), # noqa 0x00220028: ('CS', '1', "Stereo Pairs Present", '', 'StereoPairsPresent'), # noqa 0x00220030: ('FL', '1', "Axial Length of the Eye", '', 'AxialLengthOfTheEye'), # noqa 0x00220031: ('SQ', '1', "Ophthalmic Frame Location Sequence", '', 'OphthalmicFrameLocationSequence'), # noqa 0x00220032: ('FL', '2-2n', "Reference Coordinates", '', 'ReferenceCoordinates'), # noqa 0x00220035: ('FL', '1', "Depth Spatial Resolution", '', 'DepthSpatialResolution'), # noqa 0x00220036: ('FL', '1', "Maximum Depth Distortion", '', 'MaximumDepthDistortion'), # noqa 0x00220037: ('FL', '1', "Along-scan Spatial Resolution", '', 'AlongScanSpatialResolution'), # noqa 0x00220038: ('FL', '1', "Maximum Along-scan Distortion", '', 'MaximumAlongScanDistortion'), # noqa 0x00220039: ('CS', '1', "Ophthalmic Image Orientation", '', 'OphthalmicImageOrientation'), # noqa 0x00220041: ('FL', '1', "Depth of Transverse Image", '', 'DepthOfTransverseImage'), # noqa 0x00220042: ('SQ', '1', "Mydriatic Agent Concentration Units Sequence", '', 'MydriaticAgentConcentrationUnitsSequence'), # noqa 0x00220048: ('FL', '1', "Across-scan Spatial Resolution", '', 'AcrossScanSpatialResolution'), # noqa 0x00220049: ('FL', '1', "Maximum Across-scan Distortion", '', 'MaximumAcrossScanDistortion'), # noqa 0x0022004E: ('DS', '1', "Mydriatic Agent Concentration", '', 'MydriaticAgentConcentration'), # noqa 0x00220055: ('FL', '1', "Illumination Wave Length", '', 'IlluminationWaveLength'), # noqa 0x00220056: ('FL', '1', "Illumination Power", '', 'IlluminationPower'), # noqa 0x00220057: ('FL', '1', "Illumination Bandwidth", '', 'IlluminationBandwidth'), # noqa 0x00220058: ('SQ', '1', "Mydriatic Agent Sequence", '', 'MydriaticAgentSequence'), # noqa 0x00221007: ('SQ', '1', "Ophthalmic Axial Measurements Right Eye Sequence", '', 'OphthalmicAxialMeasurementsRightEyeSequence'), # noqa 0x00221008: ('SQ', '1', "Ophthalmic Axial Measurements Left Eye Sequence", '', 'OphthalmicAxialMeasurementsLeftEyeSequence'), # noqa 0x00221009: ('CS', '1', "Ophthalmic Axial Measurements Device Type", '', 'OphthalmicAxialMeasurementsDeviceType'), # noqa 0x00221010: ('CS', '1', "Ophthalmic Axial Length Measurements Type", '', 'OphthalmicAxialLengthMeasurementsType'), # noqa 0x00221012: ('SQ', '1', "Ophthalmic Axial Length Sequence", '', 'OphthalmicAxialLengthSequence'), # noqa 0x00221019: ('FL', '1', "Ophthalmic Axial Length", '', 'OphthalmicAxialLength'), # noqa 0x00221024: ('SQ', '1', "Lens Status Code Sequence", '', 'LensStatusCodeSequence'), # noqa 0x00221025: ('SQ', '1', "Vitreous Status Code Sequence", '', 'VitreousStatusCodeSequence'), # noqa 0x00221028: ('SQ', '1', "IOL Formula Code Sequence", '', 'IOLFormulaCodeSequence'), # noqa 0x00221029: ('LO', '1', "IOL Formula Detail", '', 'IOLFormulaDetail'), # noqa 0x00221033: ('FL', '1', "Keratometer Index", '', 'KeratometerIndex'), # noqa 0x00221035: ('SQ', '1', "Source of Ophthalmic Axial Length Code Sequence", '', 'SourceOfOphthalmicAxialLengthCodeSequence'), # noqa 0x00221036: ('SQ', '1', "Source of Corneal Size Data Code Sequence", '', 'SourceOfCornealSizeDataCodeSequence'), # noqa 0x00221037: ('FL', '1', "Target Refraction", '', 'TargetRefraction'), # noqa 0x00221039: ('CS', '1', "Refractive Procedure Occurred", '', 'RefractiveProcedureOccurred'), # noqa 0x00221040: ('SQ', '1', "Refractive Surgery Type Code Sequence", '', 'RefractiveSurgeryTypeCodeSequence'), # noqa 0x00221044: ('SQ', '1', "Ophthalmic Ultrasound Method Code Sequence", '', 'OphthalmicUltrasoundMethodCodeSequence'), # noqa 0x00221045: ('SQ', '1', "Surgically Induced Astigmatism Sequence", '', 'SurgicallyInducedAstigmatismSequence'), # noqa 0x00221046: ('CS', '1', "Type of Optical Correction", '', 'TypeOfOpticalCorrection'), # noqa 0x00221047: ('SQ', '1', "Toric IOL Power Sequence", '', 'ToricIOLPowerSequence'), # noqa 0x00221048: ('SQ', '1', "Predicted Toric Error Sequence", '', 'PredictedToricErrorSequence'), # noqa 0x00221049: ('CS', '1', "Pre-Selected for Implantation", '', 'PreSelectedForImplantation'), # noqa 0x0022104A: ('SQ', '1', "Toric IOL Power for Exact Emmetropia Sequence", '', 'ToricIOLPowerForExactEmmetropiaSequence'), # noqa 0x0022104B: ('SQ', '1', "Toric IOL Power for Exact Target Refraction Sequence", '', 'ToricIOLPowerForExactTargetRefractionSequence'), # noqa 0x00221050: ('SQ', '1', "Ophthalmic Axial Length Measurements Sequence", '', 'OphthalmicAxialLengthMeasurementsSequence'), # noqa 0x00221053: ('FL', '1', "IOL Power", '', 'IOLPower'), # noqa 0x00221054: ('FL', '1', "Predicted Refractive Error", '', 'PredictedRefractiveError'), # noqa 0x00221059: ('FL', '1', "Ophthalmic Axial Length Velocity", '', 'OphthalmicAxialLengthVelocity'), # noqa 0x00221065: ('LO', '1', "Lens Status Description", '', 'LensStatusDescription'), # noqa 0x00221066: ('LO', '1', "Vitreous Status Description", '', 'VitreousStatusDescription'), # noqa 0x00221090: ('SQ', '1', "IOL Power Sequence", '', 'IOLPowerSequence'), # noqa 0x00221092: ('SQ', '1', "Lens Constant Sequence", '', 'LensConstantSequence'), # noqa 0x00221093: ('LO', '1', "IOL Manufacturer", '', 'IOLManufacturer'), # noqa 0x00221094: ('LO', '1', "Lens Constant Description", 'Retired', 'LensConstantDescription'), # noqa 0x00221095: ('LO', '1', "Implant Name", '', 'ImplantName'), # noqa 0x00221096: ('SQ', '1', "Keratometry Measurement Type Code Sequence", '', 'KeratometryMeasurementTypeCodeSequence'), # noqa 0x00221097: ('LO', '1', "Implant Part Number", '', 'ImplantPartNumber'), # noqa 0x00221100: ('SQ', '1', "Referenced Ophthalmic Axial Measurements Sequence", '', 'ReferencedOphthalmicAxialMeasurementsSequence'), # noqa 0x00221101: ('SQ', '1', "Ophthalmic Axial Length Measurements Segment Name Code Sequence", '', 'OphthalmicAxialLengthMeasurementsSegmentNameCodeSequence'), # noqa 0x00221103: ('SQ', '1', "Refractive Error Before Refractive Surgery Code Sequence", '', 'RefractiveErrorBeforeRefractiveSurgeryCodeSequence'), # noqa 0x00221121: ('FL', '1', "IOL Power For Exact Emmetropia", '', 'IOLPowerForExactEmmetropia'), # noqa 0x00221122: ('FL', '1', "IOL Power For Exact Target Refraction", '', 'IOLPowerForExactTargetRefraction'), # noqa 0x00221125: ('SQ', '1', "Anterior Chamber Depth Definition Code Sequence", '', 'AnteriorChamberDepthDefinitionCodeSequence'), # noqa 0x00221127: ('SQ', '1', "Lens Thickness Sequence", '', 'LensThicknessSequence'), # noqa 0x00221128: ('SQ', '1', "Anterior Chamber Depth Sequence", '', 'AnteriorChamberDepthSequence'), # noqa 0x0022112A: ('SQ', '1', "Calculation Comment Sequence", '', 'CalculationCommentSequence'), # noqa 0x0022112B: ('CS', '1', "Calculation Comment Type", '', 'CalculationCommentType'), # noqa 0x0022112C: ('LT', '1', "Calculation Comment", '', 'CalculationComment'), # noqa 0x00221130: ('FL', '1', "Lens Thickness", '', 'LensThickness'), # noqa 0x00221131: ('FL', '1', "Anterior Chamber Depth", '', 'AnteriorChamberDepth'), # noqa 0x00221132: ('SQ', '1', "Source of Lens Thickness Data Code Sequence", '', 'SourceOfLensThicknessDataCodeSequence'), # noqa 0x00221133: ('SQ', '1', "Source of Anterior Chamber Depth Data Code Sequence", '', 'SourceOfAnteriorChamberDepthDataCodeSequence'), # noqa 0x00221134: ('SQ', '1', "Source of Refractive Measurements Sequence", '', 'SourceOfRefractiveMeasurementsSequence'), # noqa 0x00221135: ('SQ', '1', "Source of Refractive Measurements Code Sequence", '', 'SourceOfRefractiveMeasurementsCodeSequence'), # noqa 0x00221140: ('CS', '1', "Ophthalmic Axial Length Measurement Modified", '', 'OphthalmicAxialLengthMeasurementModified'), # noqa 0x00221150: ('SQ', '1', "Ophthalmic Axial Length Data Source Code Sequence", '', 'OphthalmicAxialLengthDataSourceCodeSequence'), # noqa 0x00221153: ('SQ', '1', "Ophthalmic Axial Length Acquisition Method Code Sequence", 'Retired', 'OphthalmicAxialLengthAcquisitionMethodCodeSequence'), # noqa 0x00221155: ('FL', '1', "Signal to Noise Ratio", '', 'SignalToNoiseRatio'), # noqa 0x00221159: ('LO', '1', "Ophthalmic Axial Length Data Source Description", '', 'OphthalmicAxialLengthDataSourceDescription'), # noqa 0x00221210: ('SQ', '1', "Ophthalmic Axial Length Measurements Total Length Sequence", '', 'OphthalmicAxialLengthMeasurementsTotalLengthSequence'), # noqa 0x00221211: ('SQ', '1', "Ophthalmic Axial Length Measurements Segmental Length Sequence", '', 'OphthalmicAxialLengthMeasurementsSegmentalLengthSequence'), # noqa 0x00221212: ('SQ', '1', "Ophthalmic Axial Length Measurements Length Summation Sequence", '', 'OphthalmicAxialLengthMeasurementsLengthSummationSequence'), # noqa 0x00221220: ('SQ', '1', "Ultrasound Ophthalmic Axial Length Measurements Sequence", '', 'UltrasoundOphthalmicAxialLengthMeasurementsSequence'), # noqa 0x00221225: ('SQ', '1', "Optical Ophthalmic Axial Length Measurements Sequence", '', 'OpticalOphthalmicAxialLengthMeasurementsSequence'), # noqa 0x00221230: ('SQ', '1', "Ultrasound Selected Ophthalmic Axial Length Sequence", '', 'UltrasoundSelectedOphthalmicAxialLengthSequence'), # noqa 0x00221250: ('SQ', '1', "Ophthalmic Axial Length Selection Method Code Sequence", '', 'OphthalmicAxialLengthSelectionMethodCodeSequence'), # noqa 0x00221255: ('SQ', '1', "Optical Selected Ophthalmic Axial Length Sequence", '', 'OpticalSelectedOphthalmicAxialLengthSequence'), # noqa 0x00221257: ('SQ', '1', "Selected Segmental Ophthalmic Axial Length Sequence", '', 'SelectedSegmentalOphthalmicAxialLengthSequence'), # noqa 0x00221260: ('SQ', '1', "Selected Total Ophthalmic Axial Length Sequence", '', 'SelectedTotalOphthalmicAxialLengthSequence'), # noqa 0x00221262: ('SQ', '1', "Ophthalmic Axial Length Quality Metric Sequence", '', 'OphthalmicAxialLengthQualityMetricSequence'), # noqa 0x00221265: ('SQ', '1', "Ophthalmic Axial Length Quality Metric Type Code Sequence", 'Retired', 'OphthalmicAxialLengthQualityMetricTypeCodeSequence'), # noqa 0x00221273: ('LO', '1', "Ophthalmic Axial Length Quality Metric Type Description", 'Retired', 'OphthalmicAxialLengthQualityMetricTypeDescription'), # noqa 0x00221300: ('SQ', '1', "Intraocular Lens Calculations Right Eye Sequence", '', 'IntraocularLensCalculationsRightEyeSequence'), # noqa 0x00221310: ('SQ', '1', "Intraocular Lens Calculations Left Eye Sequence", '', 'IntraocularLensCalculationsLeftEyeSequence'), # noqa 0x00221330: ('SQ', '1', "Referenced Ophthalmic Axial Length Measurement QC Image Sequence", '', 'ReferencedOphthalmicAxialLengthMeasurementQCImageSequence'), # noqa 0x00221415: ('CS', '1', "Ophthalmic Mapping Device Type", '', 'OphthalmicMappingDeviceType'), # noqa 0x00221420: ('SQ', '1', "Acquisition Method Code Sequence", '', 'AcquisitionMethodCodeSequence'), # noqa 0x00221423: ('SQ', '1', "Acquisition Method Algorithm Sequence", '', 'AcquisitionMethodAlgorithmSequence'), # noqa 0x00221436: ('SQ', '1', "Ophthalmic Thickness Map Type Code Sequence", '', 'OphthalmicThicknessMapTypeCodeSequence'), # noqa 0x00221443: ('SQ', '1', "Ophthalmic Thickness Mapping Normals Sequence", '', 'OphthalmicThicknessMappingNormalsSequence'), # noqa 0x00221445: ('SQ', '1', "Retinal Thickness Definition Code Sequence", '', 'RetinalThicknessDefinitionCodeSequence'), # noqa 0x00221450: ('SQ', '1', "Pixel Value Mapping to Coded Concept Sequence", '', 'PixelValueMappingToCodedConceptSequence'), # noqa 0x00221452: ('US or SS', '1', "Mapped Pixel Value", '', 'MappedPixelValue'), # noqa 0x00221454: ('LO', '1', "Pixel Value Mapping Explanation", '', 'PixelValueMappingExplanation'), # noqa 0x00221458: ('SQ', '1', "Ophthalmic Thickness Map Quality Threshold Sequence", '', 'OphthalmicThicknessMapQualityThresholdSequence'), # noqa 0x00221460: ('FL', '1', "Ophthalmic Thickness Map Threshold Quality Rating", '', 'OphthalmicThicknessMapThresholdQualityRating'), # noqa 0x00221463: ('FL', '2', "Anatomic Structure Reference Point", '', 'AnatomicStructureReferencePoint'), # noqa 0x00221465: ('SQ', '1', "Registration to Localizer Sequence", '', 'RegistrationToLocalizerSequence'), # noqa 0x00221466: ('CS', '1', "Registered Localizer Units", '', 'RegisteredLocalizerUnits'), # noqa 0x00221467: ('FL', '2', "Registered Localizer Top Left Hand Corner", '', 'RegisteredLocalizerTopLeftHandCorner'), # noqa 0x00221468: ('FL', '2', "Registered Localizer Bottom Right Hand Corner", '', 'RegisteredLocalizerBottomRightHandCorner'), # noqa 0x00221470: ('SQ', '1', "Ophthalmic Thickness Map Quality Rating Sequence", '', 'OphthalmicThicknessMapQualityRatingSequence'), # noqa 0x00221472: ('SQ', '1', "Relevant OPT Attributes Sequence", '', 'RelevantOPTAttributesSequence'), # noqa 0x00221512: ('SQ', '1', "Transformation Method Code Sequence", '', 'TransformationMethodCodeSequence'), # noqa 0x00221513: ('SQ', '1', "Transformation Algorithm Sequence", '', 'TransformationAlgorithmSequence'), # noqa 0x00221515: ('CS', '1', "Ophthalmic Axial Length Method", '', 'OphthalmicAxialLengthMethod'), # noqa 0x00221517: ('FL', '1', "Ophthalmic FOV", '', 'OphthalmicFOV'), # noqa 0x00221518: ('SQ', '1', "Two Dimensional to Three Dimensional Map Sequence", '', 'TwoDimensionalToThreeDimensionalMapSequence'), # noqa 0x00221525: ('SQ', '1', "Wide Field Ophthalmic Photography Quality Rating Sequence", '', 'WideFieldOphthalmicPhotographyQualityRatingSequence'), # noqa 0x00221526: ('SQ', '1', "Wide Field Ophthalmic Photography Quality Threshold Sequence", '', 'WideFieldOphthalmicPhotographyQualityThresholdSequence'), # noqa 0x00221527: ('FL', '1', "Wide Field Ophthalmic Photography Threshold Quality Rating", '', 'WideFieldOphthalmicPhotographyThresholdQualityRating'), # noqa 0x00221528: ('FL', '1', "X Coordinates Center Pixel View Angle", '', 'XCoordinatesCenterPixelViewAngle'), # noqa 0x00221529: ('FL', '1', "Y Coordinates Center Pixel View Angle", '', 'YCoordinatesCenterPixelViewAngle'), # noqa 0x00221530: ('UL', '1', "Number of Map Points", '', 'NumberOfMapPoints'), # noqa 0x00221531: ('OF', '1', "Two Dimensional to Three Dimensional Map Data", '', 'TwoDimensionalToThreeDimensionalMapData'), # noqa 0x00221612: ('SQ', '1', "Derivation Algorithm Sequence", '', 'DerivationAlgorithmSequence'), # noqa 0x00221615: ('SQ', '1', "Ophthalmic Image Type Code Sequence", '', 'OphthalmicImageTypeCodeSequence'), # noqa 0x00221616: ('LO', '1', "Ophthalmic Image Type Description", '', 'OphthalmicImageTypeDescription'), # noqa 0x00221618: ('SQ', '1', "Scan Pattern Type Code Sequence", '', 'ScanPatternTypeCodeSequence'), # noqa 0x00221620: ('SQ', '1', "Referenced Surface Mesh Identification Sequence", '', 'ReferencedSurfaceMeshIdentificationSequence'), # noqa 0x00221622: ('CS', '1', "Ophthalmic Volumetric Properties Flag", '', 'OphthalmicVolumetricPropertiesFlag'), # noqa 0x00221624: ('FL', '1', "Ophthalmic Anatomic Reference Point X-Coordinate", '', 'OphthalmicAnatomicReferencePointXCoordinate'), # noqa 0x00221626: ('FL', '1', "Ophthalmic Anatomic Reference Point Y-Coordinate", '', 'OphthalmicAnatomicReferencePointYCoordinate'), # noqa 0x00221628: ('SQ', '1', "Ophthalmic En Face Image Quality Rating Sequence", '', 'OphthalmicEnFaceImageQualityRatingSequence'), # noqa 0x00221630: ('DS', '1', "Quality Threshold", '', 'QualityThreshold'), # noqa 0x00221640: ('SQ', '1', "OCT B-scan Analysis Acquisition Parameters Sequence", '', 'OCTBscanAnalysisAcquisitionParametersSequence'), # noqa 0x00221642: ('UL', '1', "Number of B-scans Per Frame", '', 'NumberOfBscansPerFrame'), # noqa 0x00221643: ('FL', '1', "B-scan Slab Thickness", '', 'BscanSlabThickness'), # noqa 0x00221644: ('FL', '1', "Distance Between B-scan Slabs", '', 'DistanceBetweenBscanSlabs'), # noqa 0x00221645: ('FL', '1', "B-scan Cycle Time", '', 'BscanCycleTime'), # noqa 0x00221646: ('FL', '1-n', "B-scan Cycle Time Vector", '', 'BscanCycleTimeVector'), # noqa 0x00221649: ('FL', '1', "A-scan Rate", '', 'AscanRate'), # noqa 0x00221650: ('FL', '1', "B-scan Rate", '', 'BscanRate'), # noqa 0x00221658: ('UL', '1', "Surface Mesh Z-Pixel Offset", '', 'SurfaceMeshZPixelOffset'), # noqa 0x00240010: ('FL', '1', "Visual Field Horizontal Extent", '', 'VisualFieldHorizontalExtent'), # noqa 0x00240011: ('FL', '1', "Visual Field Vertical Extent", '', 'VisualFieldVerticalExtent'), # noqa 0x00240012: ('CS', '1', "Visual Field Shape", '', 'VisualFieldShape'), # noqa 0x00240016: ('SQ', '1', "Screening Test Mode Code Sequence", '', 'ScreeningTestModeCodeSequence'), # noqa 0x00240018: ('FL', '1', "Maximum Stimulus Luminance", '', 'MaximumStimulusLuminance'), # noqa 0x00240020: ('FL', '1', "Background Luminance", '', 'BackgroundLuminance'), # noqa 0x00240021: ('SQ', '1', "Stimulus Color Code Sequence", '', 'StimulusColorCodeSequence'), # noqa 0x00240024: ('SQ', '1', "Background Illumination Color Code Sequence", '', 'BackgroundIlluminationColorCodeSequence'), # noqa 0x00240025: ('FL', '1', "Stimulus Area", '', 'StimulusArea'), # noqa 0x00240028: ('FL', '1', "Stimulus Presentation Time", '', 'StimulusPresentationTime'), # noqa 0x00240032: ('SQ', '1', "Fixation Sequence", '', 'FixationSequence'), # noqa 0x00240033: ('SQ', '1', "Fixation Monitoring Code Sequence", '', 'FixationMonitoringCodeSequence'), # noqa 0x00240034: ('SQ', '1', "Visual Field Catch Trial Sequence", '', 'VisualFieldCatchTrialSequence'), # noqa 0x00240035: ('US', '1', "Fixation Checked Quantity", '', 'FixationCheckedQuantity'), # noqa 0x00240036: ('US', '1', "Patient Not Properly Fixated Quantity", '', 'PatientNotProperlyFixatedQuantity'), # noqa 0x00240037: ('CS', '1', "Presented Visual Stimuli Data Flag", '', 'PresentedVisualStimuliDataFlag'), # noqa 0x00240038: ('US', '1', "Number of Visual Stimuli", '', 'NumberOfVisualStimuli'), # noqa 0x00240039: ('CS', '1', "Excessive Fixation Losses Data Flag", '', 'ExcessiveFixationLossesDataFlag'), # noqa 0x00240040: ('CS', '1', "Excessive Fixation Losses", '', 'ExcessiveFixationLosses'), # noqa 0x00240042: ('US', '1', "Stimuli Retesting Quantity", '', 'StimuliRetestingQuantity'), # noqa 0x00240044: ('LT', '1', "Comments on Patient's Performance of Visual Field", '', 'CommentsOnPatientPerformanceOfVisualField'), # noqa 0x00240045: ('CS', '1', "False Negatives Estimate Flag", '', 'FalseNegativesEstimateFlag'), # noqa 0x00240046: ('FL', '1', "False Negatives Estimate", '', 'FalseNegativesEstimate'), # noqa 0x00240048: ('US', '1', "Negative Catch Trials Quantity", '', 'NegativeCatchTrialsQuantity'), # noqa 0x00240050: ('US', '1', "False Negatives Quantity", '', 'FalseNegativesQuantity'), # noqa 0x00240051: ('CS', '1', "Excessive False Negatives Data Flag", '', 'ExcessiveFalseNegativesDataFlag'), # noqa 0x00240052: ('CS', '1', "Excessive False Negatives", '', 'ExcessiveFalseNegatives'), # noqa 0x00240053: ('CS', '1', "False Positives Estimate Flag", '', 'FalsePositivesEstimateFlag'), # noqa 0x00240054: ('FL', '1', "False Positives Estimate", '', 'FalsePositivesEstimate'), # noqa 0x00240055: ('CS', '1', "Catch Trials Data Flag", '', 'CatchTrialsDataFlag'), # noqa 0x00240056: ('US', '1', "Positive Catch Trials Quantity", '', 'PositiveCatchTrialsQuantity'), # noqa 0x00240057: ('CS', '1', "Test Point Normals Data Flag", '', 'TestPointNormalsDataFlag'), # noqa 0x00240058: ('SQ', '1', "Test Point Normals Sequence", '', 'TestPointNormalsSequence'), # noqa 0x00240059: ('CS', '1', "Global Deviation Probability Normals Flag", '', 'GlobalDeviationProbabilityNormalsFlag'), # noqa 0x00240060: ('US', '1', "False Positives Quantity", '', 'FalsePositivesQuantity'), # noqa 0x00240061: ('CS', '1', "Excessive False Positives Data Flag", '', 'ExcessiveFalsePositivesDataFlag'), # noqa 0x00240062: ('CS', '1', "Excessive False Positives", '', 'ExcessiveFalsePositives'), # noqa 0x00240063: ('CS', '1', "Visual Field Test Normals Flag", '', 'VisualFieldTestNormalsFlag'), # noqa 0x00240064: ('SQ', '1', "Results Normals Sequence", '', 'ResultsNormalsSequence'), # noqa 0x00240065: ('SQ', '1', "Age Corrected Sensitivity Deviation Algorithm Sequence", '', 'AgeCorrectedSensitivityDeviationAlgorithmSequence'), # noqa 0x00240066: ('FL', '1', "Global Deviation From Normal", '', 'GlobalDeviationFromNormal'), # noqa 0x00240067: ('SQ', '1', "Generalized Defect Sensitivity Deviation Algorithm Sequence", '', 'GeneralizedDefectSensitivityDeviationAlgorithmSequence'), # noqa 0x00240068: ('FL', '1', "Localized Deviation From Normal", '', 'LocalizedDeviationFromNormal'), # noqa 0x00240069: ('LO', '1', "Patient Reliability Indicator", '', 'PatientReliabilityIndicator'), # noqa 0x00240070: ('FL', '1', "Visual Field Mean Sensitivity", '', 'VisualFieldMeanSensitivity'), # noqa 0x00240071: ('FL', '1', "Global Deviation Probability", '', 'GlobalDeviationProbability'), # noqa 0x00240072: ('CS', '1', "Local Deviation Probability Normals Flag", '', 'LocalDeviationProbabilityNormalsFlag'), # noqa 0x00240073: ('FL', '1', "Localized Deviation Probability", '', 'LocalizedDeviationProbability'), # noqa 0x00240074: ('CS', '1', "Short Term Fluctuation Calculated", '', 'ShortTermFluctuationCalculated'), # noqa 0x00240075: ('FL', '1', "Short Term Fluctuation", '', 'ShortTermFluctuation'), # noqa 0x00240076: ('CS', '1', "Short Term Fluctuation Probability Calculated", '', 'ShortTermFluctuationProbabilityCalculated'), # noqa 0x00240077: ('FL', '1', "Short Term Fluctuation Probability", '', 'ShortTermFluctuationProbability'), # noqa 0x00240078: ('CS', '1', "Corrected Localized Deviation From Normal Calculated", '', 'CorrectedLocalizedDeviationFromNormalCalculated'), # noqa 0x00240079: ('FL', '1', "Corrected Localized Deviation From Normal", '', 'CorrectedLocalizedDeviationFromNormal'), # noqa 0x00240080: ('CS', '1', "Corrected Localized Deviation From Normal Probability Calculated", '', 'CorrectedLocalizedDeviationFromNormalProbabilityCalculated'), # noqa 0x00240081: ('FL', '1', "Corrected Localized Deviation From Normal Probability", '', 'CorrectedLocalizedDeviationFromNormalProbability'), # noqa 0x00240083: ('SQ', '1', "Global Deviation Probability Sequence", '', 'GlobalDeviationProbabilitySequence'), # noqa 0x00240085: ('SQ', '1', "Localized Deviation Probability Sequence", '', 'LocalizedDeviationProbabilitySequence'), # noqa 0x00240086: ('CS', '1', "Foveal Sensitivity Measured", '', 'FovealSensitivityMeasured'), # noqa 0x00240087: ('FL', '1', "Foveal Sensitivity", '', 'FovealSensitivity'), # noqa 0x00240088: ('FL', '1', "Visual Field Test Duration", '', 'VisualFieldTestDuration'), # noqa 0x00240089: ('SQ', '1', "Visual Field Test Point Sequence", '', 'VisualFieldTestPointSequence'), # noqa 0x00240090: ('FL', '1', "Visual Field Test Point X-Coordinate", '', 'VisualFieldTestPointXCoordinate'), # noqa 0x00240091: ('FL', '1', "Visual Field Test Point Y-Coordinate", '', 'VisualFieldTestPointYCoordinate'), # noqa 0x00240092: ('FL', '1', "Age Corrected Sensitivity Deviation Value", '', 'AgeCorrectedSensitivityDeviationValue'), # noqa 0x00240093: ('CS', '1', "Stimulus Results", '', 'StimulusResults'), # noqa 0x00240094: ('FL', '1', "Sensitivity Value", '', 'SensitivityValue'), # noqa 0x00240095: ('CS', '1', "Retest Stimulus Seen", '', 'RetestStimulusSeen'), # noqa 0x00240096: ('FL', '1', "Retest Sensitivity Value", '', 'RetestSensitivityValue'), # noqa 0x00240097: ('SQ', '1', "Visual Field Test Point Normals Sequence", '', 'VisualFieldTestPointNormalsSequence'), # noqa 0x00240098: ('FL', '1', "Quantified Defect", '', 'QuantifiedDefect'), # noqa 0x00240100: ('FL', '1', "Age Corrected Sensitivity Deviation Probability Value", '', 'AgeCorrectedSensitivityDeviationProbabilityValue'), # noqa 0x00240102: ('CS', '1', "Generalized Defect Corrected Sensitivity Deviation Flag", '', 'GeneralizedDefectCorrectedSensitivityDeviationFlag'), # noqa 0x00240103: ('FL', '1', "Generalized Defect Corrected Sensitivity Deviation Value", '', 'GeneralizedDefectCorrectedSensitivityDeviationValue'), # noqa 0x00240104: ('FL', '1', "Generalized Defect Corrected Sensitivity Deviation Probability Value", '', 'GeneralizedDefectCorrectedSensitivityDeviationProbabilityValue'), # noqa 0x00240105: ('FL', '1', "Minimum Sensitivity Value", '', 'MinimumSensitivityValue'), # noqa 0x00240106: ('CS', '1', "Blind Spot Localized", '', 'BlindSpotLocalized'), # noqa 0x00240107: ('FL', '1', "Blind Spot X-Coordinate", '', 'BlindSpotXCoordinate'), # noqa 0x00240108: ('FL', '1', "Blind Spot Y-Coordinate", '', 'BlindSpotYCoordinate'), # noqa 0x00240110: ('SQ', '1', "Visual Acuity Measurement Sequence", '', 'VisualAcuityMeasurementSequence'), # noqa 0x00240112: ('SQ', '1', "Refractive Parameters Used on Patient Sequence", '', 'RefractiveParametersUsedOnPatientSequence'), # noqa 0x00240113: ('CS', '1', "Measurement Laterality", '', 'MeasurementLaterality'), # noqa 0x00240114: ('SQ', '1', "Ophthalmic Patient Clinical Information Left Eye Sequence", '', 'OphthalmicPatientClinicalInformationLeftEyeSequence'), # noqa 0x00240115: ('SQ', '1', "Ophthalmic Patient Clinical Information Right Eye Sequence", '', 'OphthalmicPatientClinicalInformationRightEyeSequence'), # noqa 0x00240117: ('CS', '1', "Foveal Point Normative Data Flag", '', 'FovealPointNormativeDataFlag'), # noqa 0x00240118: ('FL', '1', "Foveal Point Probability Value", '', 'FovealPointProbabilityValue'), # noqa 0x00240120: ('CS', '1', "Screening Baseline Measured", '', 'ScreeningBaselineMeasured'), # noqa 0x00240122: ('SQ', '1', "Screening Baseline Measured Sequence", '', 'ScreeningBaselineMeasuredSequence'), # noqa 0x00240124: ('CS', '1', "Screening Baseline Type", '', 'ScreeningBaselineType'), # noqa 0x00240126: ('FL', '1', "Screening Baseline Value", '', 'ScreeningBaselineValue'), # noqa 0x00240202: ('LO', '1', "Algorithm Source", '', 'AlgorithmSource'), # noqa 0x00240306: ('LO', '1', "Data Set Name", '', 'DataSetName'), # noqa 0x00240307: ('LO', '1', "Data Set Version", '', 'DataSetVersion'), # noqa 0x00240308: ('LO', '1', "Data Set Source", '', 'DataSetSource'), # noqa 0x00240309: ('LO', '1', "Data Set Description", '', 'DataSetDescription'), # noqa 0x00240317: ('SQ', '1', "Visual Field Test Reliability Global Index Sequence", '', 'VisualFieldTestReliabilityGlobalIndexSequence'), # noqa 0x00240320: ('SQ', '1', "Visual Field Global Results Index Sequence", '', 'VisualFieldGlobalResultsIndexSequence'), # noqa 0x00240325: ('SQ', '1', "Data Observation Sequence", '', 'DataObservationSequence'), # noqa 0x00240338: ('CS', '1', "Index Normals Flag", '', 'IndexNormalsFlag'), # noqa 0x00240341: ('FL', '1', "Index Probability", '', 'IndexProbability'), # noqa 0x00240344: ('SQ', '1', "Index Probability Sequence", '', 'IndexProbabilitySequence'), # noqa 0x00280002: ('US', '1', "Samples per Pixel", '', 'SamplesPerPixel'), # noqa 0x00280003: ('US', '1', "Samples per Pixel Used", '', 'SamplesPerPixelUsed'), # noqa 0x00280004: ('CS', '1', "Photometric Interpretation", '', 'PhotometricInterpretation'), # noqa 0x00280005: ('US', '1', "Image Dimensions", 'Retired', 'ImageDimensions'), # noqa 0x00280006: ('US', '1', "Planar Configuration", '', 'PlanarConfiguration'), # noqa 0x00280008: ('IS', '1', "Number of Frames", '', 'NumberOfFrames'), # noqa 0x00280009: ('AT', '1-n', "Frame Increment Pointer", '', 'FrameIncrementPointer'), # noqa 0x0028000A: ('AT', '1-n', "Frame Dimension Pointer", '', 'FrameDimensionPointer'), # noqa 0x00280010: ('US', '1', "Rows", '', 'Rows'), # noqa 0x00280011: ('US', '1', "Columns", '', 'Columns'), # noqa 0x00280012: ('US', '1', "Planes", 'Retired', 'Planes'), # noqa 0x00280014: ('US', '1', "Ultrasound Color Data Present", '', 'UltrasoundColorDataPresent'), # noqa 0x00280020: ('OB', '1', "Retired-blank", 'Retired', ''), # noqa 0x00280030: ('DS', '2', "Pixel Spacing", '', 'PixelSpacing'), # noqa 0x00280031: ('DS', '2', "Zoom Factor", '', 'ZoomFactor'), # noqa 0x00280032: ('DS', '2', "Zoom Center", '', 'ZoomCenter'), # noqa 0x00280034: ('IS', '2', "Pixel Aspect Ratio", '', 'PixelAspectRatio'), # noqa 0x00280040: ('CS', '1', "Image Format", 'Retired', 'ImageFormat'), # noqa 0x00280050: ('LO', '1-n', "Manipulated Image", 'Retired', 'ManipulatedImage'), # noqa 0x00280051: ('CS', '1-n', "Corrected Image", '', 'CorrectedImage'), # noqa 0x0028005F: ('LO', '1', "Compression Recognition Code", 'Retired', 'CompressionRecognitionCode'), # noqa 0x00280060: ('CS', '1', "Compression Code", 'Retired', 'CompressionCode'), # noqa 0x00280061: ('SH', '1', "Compression Originator", 'Retired', 'CompressionOriginator'), # noqa 0x00280062: ('LO', '1', "Compression Label", 'Retired', 'CompressionLabel'), # noqa 0x00280063: ('SH', '1', "Compression Description", 'Retired', 'CompressionDescription'), # noqa 0x00280065: ('CS', '1-n', "Compression Sequence", 'Retired', 'CompressionSequence'), # noqa 0x00280066: ('AT', '1-n', "Compression Step Pointers", 'Retired', 'CompressionStepPointers'), # noqa 0x00280068: ('US', '1', "Repeat Interval", 'Retired', 'RepeatInterval'), # noqa 0x00280069: ('US', '1', "Bits Grouped", 'Retired', 'BitsGrouped'), # noqa 0x00280070: ('US', '1-n', "Perimeter Table", 'Retired', 'PerimeterTable'), # noqa 0x00280071: ('US or SS', '1', "Perimeter Value", 'Retired', 'PerimeterValue'), # noqa 0x00280080: ('US', '1', "Predictor Rows", 'Retired', 'PredictorRows'), # noqa 0x00280081: ('US', '1', "Predictor Columns", 'Retired', 'PredictorColumns'), # noqa 0x00280082: ('US', '1-n', "Predictor Constants", 'Retired', 'PredictorConstants'), # noqa 0x00280090: ('CS', '1', "Blocked Pixels", 'Retired', 'BlockedPixels'), # noqa 0x00280091: ('US', '1', "Block Rows", 'Retired', 'BlockRows'), # noqa 0x00280092: ('US', '1', "Block Columns", 'Retired', 'BlockColumns'), # noqa 0x00280093: ('US', '1', "Row Overlap", 'Retired', 'RowOverlap'), # noqa 0x00280094: ('US', '1', "Column Overlap", 'Retired', 'ColumnOverlap'), # noqa 0x00280100: ('US', '1', "Bits Allocated", '', 'BitsAllocated'), # noqa 0x00280101: ('US', '1', "Bits Stored", '', 'BitsStored'), # noqa 0x00280102: ('US', '1', "High Bit", '', 'HighBit'), # noqa 0x00280103: ('US', '1', "Pixel Representation", '', 'PixelRepresentation'), # noqa 0x00280104: ('US or SS', '1', "Smallest Valid Pixel Value", 'Retired', 'SmallestValidPixelValue'), # noqa 0x00280105: ('US or SS', '1', "Largest Valid Pixel Value", 'Retired', 'LargestValidPixelValue'), # noqa 0x00280106: ('US or SS', '1', "Smallest Image Pixel Value", '', 'SmallestImagePixelValue'), # noqa 0x00280107: ('US or SS', '1', "Largest Image Pixel Value", '', 'LargestImagePixelValue'), # noqa 0x00280108: ('US or SS', '1', "Smallest Pixel Value in Series", '', 'SmallestPixelValueInSeries'), # noqa 0x00280109: ('US or SS', '1', "Largest Pixel Value in Series", '', 'LargestPixelValueInSeries'), # noqa 0x00280110: ('US or SS', '1', "Smallest Image Pixel Value in Plane", 'Retired', 'SmallestImagePixelValueInPlane'), # noqa 0x00280111: ('US or SS', '1', "Largest Image Pixel Value in Plane", 'Retired', 'LargestImagePixelValueInPlane'), # noqa 0x00280120: ('US or SS', '1', "Pixel Padding Value", '', 'PixelPaddingValue'), # noqa 0x00280121: ('US or SS', '1', "Pixel Padding Range Limit", '', 'PixelPaddingRangeLimit'), # noqa 0x00280122: ('FL', '1', "Float Pixel Padding Value", '', 'FloatPixelPaddingValue'), # noqa 0x00280123: ('FD', '1', "Double Float Pixel Padding Value", '', 'DoubleFloatPixelPaddingValue'), # noqa 0x00280124: ('FL', '1', "Float Pixel Padding Range Limit", '', 'FloatPixelPaddingRangeLimit'), # noqa 0x00280125: ('FD', '1', "Double Float Pixel Padding Range Limit", '', 'DoubleFloatPixelPaddingRangeLimit'), # noqa 0x00280200: ('US', '1', "Image Location", 'Retired', 'ImageLocation'), # noqa 0x00280300: ('CS', '1', "Quality Control Image", '', 'QualityControlImage'), # noqa 0x00280301: ('CS', '1', "Burned In Annotation", '', 'BurnedInAnnotation'), # noqa 0x00280302: ('CS', '1', "Recognizable Visual Features", '', 'RecognizableVisualFeatures'), # noqa 0x00280303: ('CS', '1', "Longitudinal Temporal Information Modified", '', 'LongitudinalTemporalInformationModified'), # noqa 0x00280304: ('UI', '1', "Referenced Color Palette Instance UID", '', 'ReferencedColorPaletteInstanceUID'), # noqa 0x00280400: ('LO', '1', "Transform Label", 'Retired', 'TransformLabel'), # noqa 0x00280401: ('LO', '1', "Transform Version Number", 'Retired', 'TransformVersionNumber'), # noqa 0x00280402: ('US', '1', "Number of Transform Steps", 'Retired', 'NumberOfTransformSteps'), # noqa 0x00280403: ('LO', '1-n', "Sequence of Compressed Data", 'Retired', 'SequenceOfCompressedData'), # noqa 0x00280404: ('AT', '1-n', "Details of Coefficients", 'Retired', 'DetailsOfCoefficients'), # noqa 0x00280700: ('LO', '1', "DCT Label", 'Retired', 'DCTLabel'), # noqa 0x00280701: ('CS', '1-n', "Data Block Description", 'Retired', 'DataBlockDescription'), # noqa 0x00280702: ('AT', '1-n', "Data Block", 'Retired', 'DataBlock'), # noqa 0x00280710: ('US', '1', "Normalization Factor Format", 'Retired', 'NormalizationFactorFormat'), # noqa 0x00280720: ('US', '1', "Zonal Map Number Format", 'Retired', 'ZonalMapNumberFormat'), # noqa 0x00280721: ('AT', '1-n', "Zonal Map Location", 'Retired', 'ZonalMapLocation'), # noqa 0x00280722: ('US', '1', "Zonal Map Format", 'Retired', 'ZonalMapFormat'), # noqa 0x00280730: ('US', '1', "Adaptive Map Format", 'Retired', 'AdaptiveMapFormat'), # noqa 0x00280740: ('US', '1', "Code Number Format", 'Retired', 'CodeNumberFormat'), # noqa 0x00280A02: ('CS', '1', "Pixel Spacing Calibration Type", '', 'PixelSpacingCalibrationType'), # noqa 0x00280A04: ('LO', '1', "Pixel Spacing Calibration Description", '', 'PixelSpacingCalibrationDescription'), # noqa 0x00281040: ('CS', '1', "Pixel Intensity Relationship", '', 'PixelIntensityRelationship'), # noqa 0x00281041: ('SS', '1', "Pixel Intensity Relationship Sign", '', 'PixelIntensityRelationshipSign'), # noqa 0x00281050: ('DS', '1-n', "Window Center", '', 'WindowCenter'), # noqa 0x00281051: ('DS', '1-n', "Window Width", '', 'WindowWidth'), # noqa 0x00281052: ('DS', '1', "Rescale Intercept", '', 'RescaleIntercept'), # noqa 0x00281053: ('DS', '1', "Rescale Slope", '', 'RescaleSlope'), # noqa 0x00281054: ('LO', '1', "Rescale Type", '', 'RescaleType'), # noqa 0x00281055: ('LO', '1-n', "Window Center & Width Explanation", '', 'WindowCenterWidthExplanation'), # noqa 0x00281056: ('CS', '1', "VOI LUT Function", '', 'VOILUTFunction'), # noqa 0x00281080: ('CS', '1', "Gray Scale", 'Retired', 'GrayScale'), # noqa 0x00281090: ('CS', '1', "Recommended Viewing Mode", '', 'RecommendedViewingMode'), # noqa 0x00281100: ('US or SS', '3', "Gray Lookup Table Descriptor", 'Retired', 'GrayLookupTableDescriptor'), # noqa 0x00281101: ('US or SS', '3', "Red Palette Color Lookup Table Descriptor", '', 'RedPaletteColorLookupTableDescriptor'), # noqa 0x00281102: ('US or SS', '3', "Green Palette Color Lookup Table Descriptor", '', 'GreenPaletteColorLookupTableDescriptor'), # noqa 0x00281103: ('US or SS', '3', "Blue Palette Color Lookup Table Descriptor", '', 'BluePaletteColorLookupTableDescriptor'), # noqa 0x00281104: ('US', '3', "Alpha Palette Color Lookup Table Descriptor", '', 'AlphaPaletteColorLookupTableDescriptor'), # noqa 0x00281111: ('US or SS', '4', "Large Red Palette Color Lookup Table Descriptor", 'Retired', 'LargeRedPaletteColorLookupTableDescriptor'), # noqa 0x00281112: ('US or SS', '4', "Large Green Palette Color Lookup Table Descriptor", 'Retired', 'LargeGreenPaletteColorLookupTableDescriptor'), # noqa 0x00281113: ('US or SS', '4', "Large Blue Palette Color Lookup Table Descriptor", 'Retired', 'LargeBluePaletteColorLookupTableDescriptor'), # noqa 0x00281199: ('UI', '1', "Palette Color Lookup Table UID", '', 'PaletteColorLookupTableUID'), # noqa 0x00281200: ('US or SS or OW', '1-n', "Gray Lookup Table Data", 'Retired', 'GrayLookupTableData'), # noqa 0x00281201: ('OW', '1', "Red Palette Color Lookup Table Data", '', 'RedPaletteColorLookupTableData'), # noqa 0x00281202: ('OW', '1', "Green Palette Color Lookup Table Data", '', 'GreenPaletteColorLookupTableData'), # noqa 0x00281203: ('OW', '1', "Blue Palette Color Lookup Table Data", '', 'BluePaletteColorLookupTableData'), # noqa 0x00281204: ('OW', '1', "Alpha Palette Color Lookup Table Data", '', 'AlphaPaletteColorLookupTableData'), # noqa 0x00281211: ('OW', '1', "Large Red Palette Color Lookup Table Data", 'Retired', 'LargeRedPaletteColorLookupTableData'), # noqa 0x00281212: ('OW', '1', "Large Green Palette Color Lookup Table Data", 'Retired', 'LargeGreenPaletteColorLookupTableData'), # noqa 0x00281213: ('OW', '1', "Large Blue Palette Color Lookup Table Data", 'Retired', 'LargeBluePaletteColorLookupTableData'), # noqa 0x00281214: ('UI', '1', "Large Palette Color Lookup Table UID", 'Retired', 'LargePaletteColorLookupTableUID'), # noqa 0x00281221: ('OW', '1', "Segmented Red Palette Color Lookup Table Data", '', 'SegmentedRedPaletteColorLookupTableData'), # noqa 0x00281222: ('OW', '1', "Segmented Green Palette Color Lookup Table Data", '', 'SegmentedGreenPaletteColorLookupTableData'), # noqa 0x00281223: ('OW', '1', "Segmented Blue Palette Color Lookup Table Data", '', 'SegmentedBluePaletteColorLookupTableData'), # noqa 0x00281224: ('OW', '1', "Segmented Alpha Palette Color Lookup Table Data", '', 'SegmentedAlphaPaletteColorLookupTableData'), # noqa 0x00281230: ('SQ', '1', "Stored Value Color Range Sequence", '', 'StoredValueColorRangeSequence'), # noqa 0x00281231: ('FD', '1', "Minimum Stored Value Mapped", '', 'MinimumStoredValueMapped'), # noqa 0x00281232: ('FD', '1', "Maximum Stored Value Mapped", '', 'MaximumStoredValueMapped'), # noqa 0x00281300: ('CS', '1', "Breast Implant Present", '', 'BreastImplantPresent'), # noqa 0x00281350: ('CS', '1', "Partial View", '', 'PartialView'), # noqa 0x00281351: ('ST', '1', "Partial View Description", '', 'PartialViewDescription'), # noqa 0x00281352: ('SQ', '1', "Partial View Code Sequence", '', 'PartialViewCodeSequence'), # noqa 0x0028135A: ('CS', '1', "Spatial Locations Preserved", '', 'SpatialLocationsPreserved'), # noqa 0x00281401: ('SQ', '1', "Data Frame Assignment Sequence", '', 'DataFrameAssignmentSequence'), # noqa 0x00281402: ('CS', '1', "Data Path Assignment", '', 'DataPathAssignment'), # noqa 0x00281403: ('US', '1', "Bits Mapped to Color Lookup Table", '', 'BitsMappedToColorLookupTable'), # noqa 0x00281404: ('SQ', '1', "Blending LUT 1 Sequence", '', 'BlendingLUT1Sequence'), # noqa 0x00281405: ('CS', '1', "Blending LUT 1 Transfer Function", '', 'BlendingLUT1TransferFunction'), # noqa 0x00281406: ('FD', '1', "Blending Weight Constant", '', 'BlendingWeightConstant'), # noqa 0x00281407: ('US', '3', "Blending Lookup Table Descriptor", '', 'BlendingLookupTableDescriptor'), # noqa 0x00281408: ('OW', '1', "Blending Lookup Table Data", '', 'BlendingLookupTableData'), # noqa 0x0028140B: ('SQ', '1', "Enhanced Palette Color Lookup Table Sequence", '', 'EnhancedPaletteColorLookupTableSequence'), # noqa 0x0028140C: ('SQ', '1', "Blending LUT 2 Sequence", '', 'BlendingLUT2Sequence'), # noqa 0x0028140D: ('CS', '1', "Blending LUT 2 Transfer Function", '', 'BlendingLUT2TransferFunction'), # noqa 0x0028140E: ('CS', '1', "Data Path ID", '', 'DataPathID'), # noqa 0x0028140F: ('CS', '1', "RGB LUT Transfer Function", '', 'RGBLUTTransferFunction'), # noqa 0x00281410: ('CS', '1', "Alpha LUT Transfer Function", '', 'AlphaLUTTransferFunction'), # noqa 0x00282000: ('OB', '1', "ICC Profile", '', 'ICCProfile'), # noqa 0x00282002: ('CS', '1', "Color Space", '', 'ColorSpace'), # noqa 0x00282110: ('CS', '1', "Lossy Image Compression", '', 'LossyImageCompression'), # noqa 0x00282112: ('DS', '1-n', "Lossy Image Compression Ratio", '', 'LossyImageCompressionRatio'), # noqa 0x00282114: ('CS', '1-n', "Lossy Image Compression Method", '', 'LossyImageCompressionMethod'), # noqa 0x00283000: ('SQ', '1', "Modality LUT Sequence", '', 'ModalityLUTSequence'), # noqa 0x00283001: ('SQ', '1', "Variable Modality LUT Sequence", '', 'VariableModalityLUTSequence'), # noqa 0x00283002: ('US or SS', '3', "LUT Descriptor", '', 'LUTDescriptor'), # noqa 0x00283003: ('LO', '1', "LUT Explanation", '', 'LUTExplanation'), # noqa 0x00283004: ('LO', '1', "Modality LUT Type", '', 'ModalityLUTType'), # noqa 0x00283006: ('US or OW', '1-n', "LUT Data", '', 'LUTData'), # noqa 0x00283010: ('SQ', '1', "VOI LUT Sequence", '', 'VOILUTSequence'), # noqa 0x00283110: ('SQ', '1', "Softcopy VOI LUT Sequence", '', 'SoftcopyVOILUTSequence'), # noqa 0x00284000: ('LT', '1', "Image Presentation Comments", 'Retired', 'ImagePresentationComments'), # noqa 0x00285000: ('SQ', '1', "Bi-Plane Acquisition Sequence", 'Retired', 'BiPlaneAcquisitionSequence'), # noqa 0x00286010: ('US', '1', "Representative Frame Number", '', 'RepresentativeFrameNumber'), # noqa 0x00286020: ('US', '1-n', "Frame Numbers of Interest (FOI)", '', 'FrameNumbersOfInterest'), # noqa 0x00286022: ('LO', '1-n', "Frame of Interest Description", '', 'FrameOfInterestDescription'), # noqa 0x00286023: ('CS', '1-n', "Frame of Interest Type", '', 'FrameOfInterestType'), # noqa 0x00286030: ('US', '1-n', "Mask Pointer(s)", 'Retired', 'MaskPointers'), # noqa 0x00286040: ('US', '1-n', "R Wave Pointer", '', 'RWavePointer'), # noqa 0x00286100: ('SQ', '1', "Mask Subtraction Sequence", '', 'MaskSubtractionSequence'), # noqa 0x00286101: ('CS', '1', "Mask Operation", '', 'MaskOperation'), # noqa 0x00286102: ('US', '2-2n', "Applicable Frame Range", '', 'ApplicableFrameRange'), # noqa 0x00286110: ('US', '1-n', "Mask Frame Numbers", '', 'MaskFrameNumbers'), # noqa 0x00286112: ('US', '1', "Contrast Frame Averaging", '', 'ContrastFrameAveraging'), # noqa 0x00286114: ('FL', '2', "Mask Sub-pixel Shift", '', 'MaskSubPixelShift'), # noqa 0x00286120: ('SS', '1', "TID Offset", '', 'TIDOffset'), # noqa 0x00286190: ('ST', '1', "Mask Operation Explanation", '', 'MaskOperationExplanation'), # noqa 0x00287000: ('SQ', '1', "Equipment Administrator Sequence", '', 'EquipmentAdministratorSequence'), # noqa 0x00287001: ('US', '1', "Number of Display Subsystems", '', 'NumberOfDisplaySubsystems'), # noqa 0x00287002: ('US', '1', "Current Configuration ID", '', 'CurrentConfigurationID'), # noqa 0x00287003: ('US', '1', "Display Subsystem ID", '', 'DisplaySubsystemID'), # noqa 0x00287004: ('SH', '1', "Display Subsystem Name", '', 'DisplaySubsystemName'), # noqa 0x00287005: ('LO', '1', "Display Subsystem Description", '', 'DisplaySubsystemDescription'), # noqa 0x00287006: ('CS', '1', "System Status", '', 'SystemStatus'), # noqa 0x00287007: ('LO', '1', "System Status Comment", '', 'SystemStatusComment'), # noqa 0x00287008: ('SQ', '1', "Target Luminance Characteristics Sequence", '', 'TargetLuminanceCharacteristicsSequence'), # noqa 0x00287009: ('US', '1', "Luminance Characteristics ID", '', 'LuminanceCharacteristicsID'), # noqa 0x0028700A: ('SQ', '1', "Display Subsystem Configuration Sequence", '', 'DisplaySubsystemConfigurationSequence'), # noqa 0x0028700B: ('US', '1', "Configuration ID", '', 'ConfigurationID'), # noqa 0x0028700C: ('SH', '1', "Configuration Name", '', 'ConfigurationName'), # noqa 0x0028700D: ('LO', '1', "Configuration Description", '', 'ConfigurationDescription'), # noqa 0x0028700E: ('US', '1', "Referenced Target Luminance Characteristics ID", '', 'ReferencedTargetLuminanceCharacteristicsID'), # noqa 0x0028700F: ('SQ', '1', "QA Results Sequence", '', 'QAResultsSequence'), # noqa 0x00287010: ('SQ', '1', "Display Subsystem QA Results Sequence", '', 'DisplaySubsystemQAResultsSequence'), # noqa 0x00287011: ('SQ', '1', "Configuration QA Results Sequence", '', 'ConfigurationQAResultsSequence'), # noqa 0x00287012: ('SQ', '1', "Measurement Equipment Sequence", '', 'MeasurementEquipmentSequence'), # noqa 0x00287013: ('CS', '1-n', "Measurement Functions", '', 'MeasurementFunctions'), # noqa 0x00287014: ('CS', '1', "Measurement Equipment Type", '', 'MeasurementEquipmentType'), # noqa 0x00287015: ('SQ', '1', "Visual Evaluation Result Sequence", '', 'VisualEvaluationResultSequence'), # noqa 0x00287016: ('SQ', '1', "Display Calibration Result Sequence", '', 'DisplayCalibrationResultSequence'), # noqa 0x00287017: ('US', '1', "DDL Value", '', 'DDLValue'), # noqa 0x00287018: ('FL', '2', "CIExy White Point", '', 'CIExyWhitePoint'), # noqa 0x00287019: ('CS', '1', "Display Function Type", '', 'DisplayFunctionType'), # noqa 0x0028701A: ('FL', '1', "Gamma Value", '', 'GammaValue'), # noqa 0x0028701B: ('US', '1', "Number of Luminance Points", '', 'NumberOfLuminancePoints'), # noqa 0x0028701C: ('SQ', '1', "Luminance Response Sequence", '', 'LuminanceResponseSequence'), # noqa 0x0028701D: ('FL', '1', "Target Minimum Luminance", '', 'TargetMinimumLuminance'), # noqa 0x0028701E: ('FL', '1', "Target Maximum Luminance", '', 'TargetMaximumLuminance'), # noqa 0x0028701F: ('FL', '1', "Luminance Value", '', 'LuminanceValue'), # noqa 0x00287020: ('LO', '1', "Luminance Response Description", '', 'LuminanceResponseDescription'), # noqa 0x00287021: ('CS', '1', "White Point Flag", '', 'WhitePointFlag'), # noqa 0x00287022: ('SQ', '1', "Display Device Type Code Sequence", '', 'DisplayDeviceTypeCodeSequence'), # noqa 0x00287023: ('SQ', '1', "Display Subsystem Sequence", '', 'DisplaySubsystemSequence'), # noqa 0x00287024: ('SQ', '1', "Luminance Result Sequence", '', 'LuminanceResultSequence'), # noqa 0x00287025: ('CS', '1', "Ambient Light Value Source", '', 'AmbientLightValueSource'), # noqa 0x00287026: ('CS', '1-n', "Measured Characteristics", '', 'MeasuredCharacteristics'), # noqa 0x00287027: ('SQ', '1', "Luminance Uniformity Result Sequence", '', 'LuminanceUniformityResultSequence'), # noqa 0x00287028: ('SQ', '1', "Visual Evaluation Test Sequence", '', 'VisualEvaluationTestSequence'), # noqa 0x00287029: ('CS', '1', "Test Result", '', 'TestResult'), # noqa 0x0028702A: ('LO', '1', "Test Result Comment", '', 'TestResultComment'), # noqa 0x0028702B: ('CS', '1', "Test Image Validation", '', 'TestImageValidation'), # noqa 0x0028702C: ('SQ', '1', "Test Pattern Code Sequence", '', 'TestPatternCodeSequence'), # noqa 0x0028702D: ('SQ', '1', "Measurement Pattern Code Sequence", '', 'MeasurementPatternCodeSequence'), # noqa 0x0028702E: ('SQ', '1', "Visual Evaluation Method Code Sequence", '', 'VisualEvaluationMethodCodeSequence'), # noqa 0x00287FE0: ('UR', '1', "Pixel Data Provider URL", '', 'PixelDataProviderURL'), # noqa 0x00289001: ('UL', '1', "Data Point Rows", '', 'DataPointRows'), # noqa 0x00289002: ('UL', '1', "Data Point Columns", '', 'DataPointColumns'), # noqa 0x00289003: ('CS', '1', "Signal Domain Columns", '', 'SignalDomainColumns'), # noqa 0x00289099: ('US', '1', "Largest Monochrome Pixel Value", 'Retired', 'LargestMonochromePixelValue'), # noqa 0x00289108: ('CS', '1', "Data Representation", '', 'DataRepresentation'), # noqa 0x00289110: ('SQ', '1', "Pixel Measures Sequence", '', 'PixelMeasuresSequence'), # noqa 0x00289132: ('SQ', '1', "Frame VOI LUT Sequence", '', 'FrameVOILUTSequence'), # noqa 0x00289145: ('SQ', '1', "Pixel Value Transformation Sequence", '', 'PixelValueTransformationSequence'), # noqa 0x00289235: ('CS', '1', "Signal Domain Rows", '', 'SignalDomainRows'), # noqa 0x00289411: ('FL', '1', "Display Filter Percentage", '', 'DisplayFilterPercentage'), # noqa 0x00289415: ('SQ', '1', "Frame Pixel Shift Sequence", '', 'FramePixelShiftSequence'), # noqa 0x00289416: ('US', '1', "Subtraction Item ID", '', 'SubtractionItemID'), # noqa 0x00289422: ('SQ', '1', "Pixel Intensity Relationship LUT Sequence", '', 'PixelIntensityRelationshipLUTSequence'), # noqa 0x00289443: ('SQ', '1', "Frame Pixel Data Properties Sequence", '', 'FramePixelDataPropertiesSequence'), # noqa 0x00289444: ('CS', '1', "Geometrical Properties", '', 'GeometricalProperties'), # noqa 0x00289445: ('FL', '1', "Geometric Maximum Distortion", '', 'GeometricMaximumDistortion'), # noqa 0x00289446: ('CS', '1-n', "Image Processing Applied", '', 'ImageProcessingApplied'), # noqa 0x00289454: ('CS', '1', "Mask Selection Mode", '', 'MaskSelectionMode'), # noqa 0x00289474: ('CS', '1', "LUT Function", '', 'LUTFunction'), # noqa 0x00289478: ('FL', '1', "Mask Visibility Percentage", '', 'MaskVisibilityPercentage'), # noqa 0x00289501: ('SQ', '1', "Pixel Shift Sequence", '', 'PixelShiftSequence'), # noqa 0x00289502: ('SQ', '1', "Region Pixel Shift Sequence", '', 'RegionPixelShiftSequence'), # noqa 0x00289503: ('SS', '2-2n', "Vertices of the Region", '', 'VerticesOfTheRegion'), # noqa 0x00289505: ('SQ', '1', "Multi-frame Presentation Sequence", '', 'MultiFramePresentationSequence'), # noqa 0x00289506: ('US', '2-2n', "Pixel Shift Frame Range", '', 'PixelShiftFrameRange'), # noqa 0x00289507: ('US', '2-2n', "LUT Frame Range", '', 'LUTFrameRange'), # noqa 0x00289520: ('DS', '16', "Image to Equipment Mapping Matrix", '', 'ImageToEquipmentMappingMatrix'), # noqa 0x00289537: ('CS', '1', "Equipment Coordinate System Identification", '', 'EquipmentCoordinateSystemIdentification'), # noqa 0x0032000A: ('CS', '1', "Study Status ID", 'Retired', 'StudyStatusID'), # noqa 0x0032000C: ('CS', '1', "Study Priority ID", 'Retired', 'StudyPriorityID'), # noqa 0x00320012: ('LO', '1', "Study ID Issuer", 'Retired', 'StudyIDIssuer'), # noqa 0x00320032: ('DA', '1', "Study Verified Date", 'Retired', 'StudyVerifiedDate'), # noqa 0x00320033: ('TM', '1', "Study Verified Time", 'Retired', 'StudyVerifiedTime'), # noqa 0x00320034: ('DA', '1', "Study Read Date", 'Retired', 'StudyReadDate'), # noqa 0x00320035: ('TM', '1', "Study Read Time", 'Retired', 'StudyReadTime'), # noqa 0x00321000: ('DA', '1', "Scheduled Study Start Date", 'Retired', 'ScheduledStudyStartDate'), # noqa 0x00321001: ('TM', '1', "Scheduled Study Start Time", 'Retired', 'ScheduledStudyStartTime'), # noqa 0x00321010: ('DA', '1', "Scheduled Study Stop Date", 'Retired', 'ScheduledStudyStopDate'), # noqa 0x00321011: ('TM', '1', "Scheduled Study Stop Time", 'Retired', 'ScheduledStudyStopTime'), # noqa 0x00321020: ('LO', '1', "Scheduled Study Location", 'Retired', 'ScheduledStudyLocation'), # noqa 0x00321021: ('AE', '1-n', "Scheduled Study Location AE Title", 'Retired', 'ScheduledStudyLocationAETitle'), # noqa 0x00321030: ('LO', '1', "Reason for Study", 'Retired', 'ReasonForStudy'), # noqa 0x00321031: ('SQ', '1', "Requesting Physician Identification Sequence", '', 'RequestingPhysicianIdentificationSequence'), # noqa 0x00321032: ('PN', '1', "Requesting Physician", '', 'RequestingPhysician'), # noqa 0x00321033: ('LO', '1', "Requesting Service", '', 'RequestingService'), # noqa 0x00321034: ('SQ', '1', "Requesting Service Code Sequence", '', 'RequestingServiceCodeSequence'), # noqa 0x00321040: ('DA', '1', "Study Arrival Date", 'Retired', 'StudyArrivalDate'), # noqa 0x00321041: ('TM', '1', "Study Arrival Time", 'Retired', 'StudyArrivalTime'), # noqa 0x00321050: ('DA', '1', "Study Completion Date", 'Retired', 'StudyCompletionDate'), # noqa 0x00321051: ('TM', '1', "Study Completion Time", 'Retired', 'StudyCompletionTime'), # noqa 0x00321055: ('CS', '1', "Study Component Status ID", 'Retired', 'StudyComponentStatusID'), # noqa 0x00321060: ('LO', '1', "Requested Procedure Description", '', 'RequestedProcedureDescription'), # noqa 0x00321064: ('SQ', '1', "Requested Procedure Code Sequence", '', 'RequestedProcedureCodeSequence'), # noqa 0x00321065: ('SQ', '1', "Requested Laterality Code Sequence", '', 'RequestedLateralityCodeSequence'), # noqa 0x00321066: ('UT', '1', "Reason for Visit", '', 'ReasonForVisit'), # noqa 0x00321067: ('SQ', '1', "Reason for Visit Code Sequence", '', 'ReasonForVisitCodeSequence'), # noqa 0x00321070: ('LO', '1', "Requested Contrast Agent", '', 'RequestedContrastAgent'), # noqa 0x00324000: ('LT', '1', "Study Comments", 'Retired', 'StudyComments'), # noqa 0x00340001: ('SQ', '1', "Flow Identifier Sequence", '', 'FlowIdentifierSequence'), # noqa 0x00340002: ('OB', '1', "Flow Identifier", '', 'FlowIdentifier'), # noqa 0x00340003: ('UI', '1', "Flow Transfer Syntax UID", '', 'FlowTransferSyntaxUID'), # noqa 0x00340004: ('UL', '1', "Flow RTP Sampling Rate", '', 'FlowRTPSamplingRate'), # noqa 0x00340005: ('OB', '1', "Source Identifier", '', 'SourceIdentifier'), # noqa 0x00340007: ('OB', '1', "Frame Origin Timestamp", '', 'FrameOriginTimestamp'), # noqa 0x00340008: ('CS', '1', "Includes Imaging Subject", '', 'IncludesImagingSubject'), # noqa 0x00340009: ('SQ', '1', "Frame Usefulness Group Sequence", '', 'FrameUsefulnessGroupSequence'), # noqa 0x0034000A: ('SQ', '1', "Real-Time Bulk Data Flow Sequence", '', 'RealTimeBulkDataFlowSequence'), # noqa 0x0034000B: ('SQ', '1', "Camera Position Group Sequence", '', 'CameraPositionGroupSequence'), # noqa 0x0034000C: ('CS', '1', "Includes Information", '', 'IncludesInformation'), # noqa 0x0034000D: ('SQ', '1', "Time of Frame Group Sequence", '', 'TimeOfFrameGroupSequence'), # noqa 0x00380004: ('SQ', '1', "Referenced Patient Alias Sequence", '', 'ReferencedPatientAliasSequence'), # noqa 0x00380008: ('CS', '1', "Visit Status ID", '', 'VisitStatusID'), # noqa 0x00380010: ('LO', '1', "Admission ID", '', 'AdmissionID'), # noqa 0x00380011: ('LO', '1', "Issuer of Admission ID", 'Retired', 'IssuerOfAdmissionID'), # noqa 0x00380014: ('SQ', '1', "Issuer of Admission ID Sequence", '', 'IssuerOfAdmissionIDSequence'), # noqa 0x00380016: ('LO', '1', "Route of Admissions", '', 'RouteOfAdmissions'), # noqa 0x0038001A: ('DA', '1', "Scheduled Admission Date", 'Retired', 'ScheduledAdmissionDate'), # noqa 0x0038001B: ('TM', '1', "Scheduled Admission Time", 'Retired', 'ScheduledAdmissionTime'), # noqa 0x0038001C: ('DA', '1', "Scheduled Discharge Date", 'Retired', 'ScheduledDischargeDate'), # noqa 0x0038001D: ('TM', '1', "Scheduled Discharge Time", 'Retired', 'ScheduledDischargeTime'), # noqa 0x0038001E: ('LO', '1', "Scheduled Patient Institution Residence", 'Retired', 'ScheduledPatientInstitutionResidence'), # noqa 0x00380020: ('DA', '1', "Admitting Date", '', 'AdmittingDate'), # noqa 0x00380021: ('TM', '1', "Admitting Time", '', 'AdmittingTime'), # noqa 0x00380030: ('DA', '1', "Discharge Date", 'Retired', 'DischargeDate'), # noqa 0x00380032: ('TM', '1', "Discharge Time", 'Retired', 'DischargeTime'), # noqa 0x00380040: ('LO', '1', "Discharge Diagnosis Description", 'Retired', 'DischargeDiagnosisDescription'), # noqa 0x00380044: ('SQ', '1', "Discharge Diagnosis Code Sequence", 'Retired', 'DischargeDiagnosisCodeSequence'), # noqa 0x00380050: ('LO', '1', "Special Needs", '', 'SpecialNeeds'), # noqa 0x00380060: ('LO', '1', "Service Episode ID", '', 'ServiceEpisodeID'), # noqa 0x00380061: ('LO', '1', "Issuer of Service Episode ID", 'Retired', 'IssuerOfServiceEpisodeID'), # noqa 0x00380062: ('LO', '1', "Service Episode Description", '', 'ServiceEpisodeDescription'), # noqa 0x00380064: ('SQ', '1', "Issuer of Service Episode ID Sequence", '', 'IssuerOfServiceEpisodeIDSequence'), # noqa 0x00380100: ('SQ', '1', "Pertinent Documents Sequence", '', 'PertinentDocumentsSequence'), # noqa 0x00380101: ('SQ', '1', "Pertinent Resources Sequence", '', 'PertinentResourcesSequence'), # noqa 0x00380102: ('LO', '1', "Resource Description", '', 'ResourceDescription'), # noqa 0x00380300: ('LO', '1', "Current Patient Location", '', 'CurrentPatientLocation'), # noqa 0x00380400: ('LO', '1', "Patient's Institution Residence", '', 'PatientInstitutionResidence'), # noqa 0x00380500: ('LO', '1', "Patient State", '', 'PatientState'), # noqa 0x00380502: ('SQ', '1', "Patient Clinical Trial Participation Sequence", '', 'PatientClinicalTrialParticipationSequence'), # noqa 0x00384000: ('LT', '1', "Visit Comments", '', 'VisitComments'), # noqa 0x003A0004: ('CS', '1', "Waveform Originality", '', 'WaveformOriginality'), # noqa 0x003A0005: ('US', '1', "Number of Waveform Channels", '', 'NumberOfWaveformChannels'), # noqa 0x003A0010: ('UL', '1', "Number of Waveform Samples", '', 'NumberOfWaveformSamples'), # noqa 0x003A001A: ('DS', '1', "Sampling Frequency", '', 'SamplingFrequency'), # noqa 0x003A0020: ('SH', '1', "Multiplex Group Label", '', 'MultiplexGroupLabel'), # noqa 0x003A0200: ('SQ', '1', "Channel Definition Sequence", '', 'ChannelDefinitionSequence'), # noqa 0x003A0202: ('IS', '1', "Waveform Channel Number", '', 'WaveformChannelNumber'), # noqa 0x003A0203: ('SH', '1', "Channel Label", '', 'ChannelLabel'), # noqa 0x003A0205: ('CS', '1-n', "Channel Status", '', 'ChannelStatus'), # noqa 0x003A0208: ('SQ', '1', "Channel Source Sequence", '', 'ChannelSourceSequence'), # noqa 0x003A0209: ('SQ', '1', "Channel Source Modifiers Sequence", '', 'ChannelSourceModifiersSequence'), # noqa 0x003A020A: ('SQ', '1', "Source Waveform Sequence", '', 'SourceWaveformSequence'), # noqa 0x003A020C: ('LO', '1', "Channel Derivation Description", '', 'ChannelDerivationDescription'), # noqa 0x003A0210: ('DS', '1', "Channel Sensitivity", '', 'ChannelSensitivity'), # noqa 0x003A0211: ('SQ', '1', "Channel Sensitivity Units Sequence", '', 'ChannelSensitivityUnitsSequence'), # noqa 0x003A0212: ('DS', '1', "Channel Sensitivity Correction Factor", '', 'ChannelSensitivityCorrectionFactor'), # noqa 0x003A0213: ('DS', '1', "Channel Baseline", '', 'ChannelBaseline'), # noqa 0x003A0214: ('DS', '1', "Channel Time Skew", '', 'ChannelTimeSkew'), # noqa 0x003A0215: ('DS', '1', "Channel Sample Skew", '', 'ChannelSampleSkew'), # noqa 0x003A0218: ('DS', '1', "Channel Offset", '', 'ChannelOffset'), # noqa 0x003A021A: ('US', '1', "Waveform Bits Stored", '', 'WaveformBitsStored'), # noqa 0x003A0220: ('DS', '1', "Filter Low Frequency", '', 'FilterLowFrequency'), # noqa 0x003A0221: ('DS', '1', "Filter High Frequency", '', 'FilterHighFrequency'), # noqa 0x003A0222: ('DS', '1', "Notch Filter Frequency", '', 'NotchFilterFrequency'), # noqa 0x003A0223: ('DS', '1', "Notch Filter Bandwidth", '', 'NotchFilterBandwidth'), # noqa 0x003A0230: ('FL', '1', "Waveform Data Display Scale", '', 'WaveformDataDisplayScale'), # noqa 0x003A0231: ('US', '3', "Waveform Display Background CIELab Value", '', 'WaveformDisplayBackgroundCIELabValue'), # noqa 0x003A0240: ('SQ', '1', "Waveform Presentation Group Sequence", '', 'WaveformPresentationGroupSequence'), # noqa 0x003A0241: ('US', '1', "Presentation Group Number", '', 'PresentationGroupNumber'), # noqa 0x003A0242: ('SQ', '1', "Channel Display Sequence", '', 'ChannelDisplaySequence'), # noqa 0x003A0244: ('US', '3', "Channel Recommended Display CIELab Value", '', 'ChannelRecommendedDisplayCIELabValue'), # noqa 0x003A0245: ('FL', '1', "Channel Position", '', 'ChannelPosition'), # noqa 0x003A0246: ('CS', '1', "Display Shading Flag", '', 'DisplayShadingFlag'), # noqa 0x003A0247: ('FL', '1', "Fractional Channel Display Scale", '', 'FractionalChannelDisplayScale'), # noqa 0x003A0248: ('FL', '1', "Absolute Channel Display Scale", '', 'AbsoluteChannelDisplayScale'), # noqa 0x003A0300: ('SQ', '1', "Multiplexed Audio Channels Description Code Sequence", '', 'MultiplexedAudioChannelsDescriptionCodeSequence'), # noqa 0x003A0301: ('IS', '1', "Channel Identification Code", '', 'ChannelIdentificationCode'), # noqa 0x003A0302: ('CS', '1', "Channel Mode", '', 'ChannelMode'), # noqa 0x003A0310: ('UI', '1', "Multiplex Group UID", '', 'MultiplexGroupUID'), # noqa 0x003A0311: ('DS', '1', "Powerline Frequency", '', 'PowerlineFrequency'), # noqa 0x003A0312: ('SQ', '1', "Channel Impedance Sequence", '', 'ChannelImpedanceSequence'), # noqa 0x003A0313: ('DS', '1', "Impedance Value", '', 'ImpedanceValue'), # noqa 0x003A0314: ('DT', '1', "Impedance Measurement DateTime", '', 'ImpedanceMeasurementDateTime'), # noqa 0x003A0315: ('DS', '1', "Impedance Measurement Frequency", '', 'ImpedanceMeasurementFrequency'), # noqa 0x003A0316: ('CS', '1', "Impedance Measurement Current Type", '', 'ImpedanceMeasurementCurrentType'), # noqa 0x003A0317: ('CS', '1', "Waveform Amplifier Type", '', 'WaveformAmplifierType'), # noqa 0x003A0318: ('SQ', '1', "Filter Low Frequency Characteristics Sequence", '', 'FilterLowFrequencyCharacteristicsSequence'), # noqa 0x003A0319: ('SQ', '1', "Filter High Frequency Characteristics Sequence", '', 'FilterHighFrequencyCharacteristicsSequence'), # noqa 0x003A0320: ('SQ', '1', "Summarized Filter Lookup Table Sequence", '', 'SummarizedFilterLookupTable'), # noqa 0x003A0321: ('SQ', '1', "Notch Filter Characteristics Sequence", '', 'NotchFilterCharacteristicsSequence'), # noqa 0x003A0322: ('CS', '1', "Waveform Filter Type", '', 'WaveformFilterType'), # noqa 0x003A0323: ('SQ', '1', "Analog Filter Characteristics Sequence", '', 'AnalogFilterCharacteristicsSequence'), # noqa 0x003A0324: ('DS', '1', "Analog Filter Roll Off", '', 'AnalogFilterRollOff'), # noqa 0x003A0325: ('SQ', '1', "Analog Filter Type Code Sequence", '', 'AnalogFilterType'), # noqa 0x003A0326: ('SQ', '1', "Digital Filter Characteristics Sequence", '', 'DigitalFilterCharacteristicsSequence'), # noqa 0x003A0327: ('IS', '1', "Digital Filter Order", '', 'DigitalFilterOrder'), # noqa 0x003A0328: ('SQ', '1', "Digital Filter Type Code Sequence", '', 'DigitalFilterTypeCodeSequence'), # noqa 0x003A0329: ('ST', '1', "Waveform Filter Description", '', 'WaveformFilterDescription'), # noqa 0x003A032A: ('SQ', '1', "Filter Lookup Table Sequence", '', 'FilterLookupTableSequence'), # noqa 0x003A032B: ('ST', '1', "Filter Lookup Table Description", '', 'FilterLookupTableDescription'), # noqa 0x003A032C: ('SQ', '1', "Frequency Encoding Code Sequence", '', 'FrequencyEncodingCodeSequence'), # noqa 0x003A032D: ('SQ', '1', "Magnitude Encoding Code Sequence", '', 'MagnitudeEncodingCodeSequence'), # noqa 0x003A032E: ('OD', '1', "Filter Lookup Table Data", '', 'FilterLookupTableData'), # noqa 0x00400001: ('AE', '1-n', "Scheduled Station AE Title", '', 'ScheduledStationAETitle'), # noqa 0x00400002: ('DA', '1', "Scheduled Procedure Step Start Date", '', 'ScheduledProcedureStepStartDate'), # noqa 0x00400003: ('TM', '1', "Scheduled Procedure Step Start Time", '', 'ScheduledProcedureStepStartTime'), # noqa 0x00400004: ('DA', '1', "Scheduled Procedure Step End Date", '', 'ScheduledProcedureStepEndDate'), # noqa 0x00400005: ('TM', '1', "Scheduled Procedure Step End Time", '', 'ScheduledProcedureStepEndTime'), # noqa 0x00400006: ('PN', '1', "Scheduled Performing Physician's Name", '', 'ScheduledPerformingPhysicianName'), # noqa 0x00400007: ('LO', '1', "Scheduled Procedure Step Description", '', 'ScheduledProcedureStepDescription'), # noqa 0x00400008: ('SQ', '1', "Scheduled Protocol Code Sequence", '', 'ScheduledProtocolCodeSequence'), # noqa 0x00400009: ('SH', '1', "Scheduled Procedure Step ID", '', 'ScheduledProcedureStepID'), # noqa 0x0040000A: ('SQ', '1', "Stage Code Sequence", '', 'StageCodeSequence'), # noqa 0x0040000B: ('SQ', '1', "Scheduled Performing Physician Identification Sequence", '', 'ScheduledPerformingPhysicianIdentificationSequence'), # noqa 0x00400010: ('SH', '1-n', "Scheduled Station Name", '', 'ScheduledStationName'), # noqa 0x00400011: ('SH', '1', "Scheduled Procedure Step Location", '', 'ScheduledProcedureStepLocation'), # noqa 0x00400012: ('LO', '1', "Pre-Medication", '', 'PreMedication'), # noqa 0x00400020: ('CS', '1', "Scheduled Procedure Step Status", '', 'ScheduledProcedureStepStatus'), # noqa 0x00400026: ('SQ', '1', "Order Placer Identifier Sequence", '', 'OrderPlacerIdentifierSequence'), # noqa 0x00400027: ('SQ', '1', "Order Filler Identifier Sequence", '', 'OrderFillerIdentifierSequence'), # noqa 0x00400031: ('UT', '1', "Local Namespace Entity ID", '', 'LocalNamespaceEntityID'), # noqa 0x00400032: ('UT', '1', "Universal Entity ID", '', 'UniversalEntityID'), # noqa 0x00400033: ('CS', '1', "Universal Entity ID Type", '', 'UniversalEntityIDType'), # noqa 0x00400035: ('CS', '1', "Identifier Type Code", '', 'IdentifierTypeCode'), # noqa 0x00400036: ('SQ', '1', "Assigning Facility Sequence", '', 'AssigningFacilitySequence'), # noqa 0x00400039: ('SQ', '1', "Assigning Jurisdiction Code Sequence", '', 'AssigningJurisdictionCodeSequence'), # noqa 0x0040003A: ('SQ', '1', "Assigning Agency or Department Code Sequence", '', 'AssigningAgencyOrDepartmentCodeSequence'), # noqa 0x00400100: ('SQ', '1', "Scheduled Procedure Step Sequence", '', 'ScheduledProcedureStepSequence'), # noqa 0x00400220: ('SQ', '1', "Referenced Non-Image Composite SOP Instance Sequence", '', 'ReferencedNonImageCompositeSOPInstanceSequence'), # noqa 0x00400241: ('AE', '1', "Performed Station AE Title", '', 'PerformedStationAETitle'), # noqa 0x00400242: ('SH', '1', "Performed Station Name", '', 'PerformedStationName'), # noqa 0x00400243: ('SH', '1', "Performed Location", '', 'PerformedLocation'), # noqa 0x00400244: ('DA', '1', "Performed Procedure Step Start Date", '', 'PerformedProcedureStepStartDate'), # noqa 0x00400245: ('TM', '1', "Performed Procedure Step Start Time", '', 'PerformedProcedureStepStartTime'), # noqa 0x00400250: ('DA', '1', "Performed Procedure Step End Date", '', 'PerformedProcedureStepEndDate'), # noqa 0x00400251: ('TM', '1', "Performed Procedure Step End Time", '', 'PerformedProcedureStepEndTime'), # noqa 0x00400252: ('CS', '1', "Performed Procedure Step Status", '', 'PerformedProcedureStepStatus'), # noqa 0x00400253: ('SH', '1', "Performed Procedure Step ID", '', 'PerformedProcedureStepID'), # noqa 0x00400254: ('LO', '1', "Performed Procedure Step Description", '', 'PerformedProcedureStepDescription'), # noqa 0x00400255: ('LO', '1', "Performed Procedure Type Description", '', 'PerformedProcedureTypeDescription'), # noqa 0x00400260: ('SQ', '1', "Performed Protocol Code Sequence", '', 'PerformedProtocolCodeSequence'), # noqa 0x00400261: ('CS', '1', "Performed Protocol Type", '', 'PerformedProtocolType'), # noqa 0x00400270: ('SQ', '1', "Scheduled Step Attributes Sequence", '', 'ScheduledStepAttributesSequence'), # noqa 0x00400275: ('SQ', '1', "Request Attributes Sequence", '', 'RequestAttributesSequence'), # noqa 0x00400280: ('ST', '1', "Comments on the Performed Procedure Step", '', 'CommentsOnThePerformedProcedureStep'), # noqa 0x00400281: ('SQ', '1', "Performed Procedure Step Discontinuation Reason Code Sequence", '', 'PerformedProcedureStepDiscontinuationReasonCodeSequence'), # noqa 0x00400293: ('SQ', '1', "Quantity Sequence", '', 'QuantitySequence'), # noqa 0x00400294: ('DS', '1', "Quantity", '', 'Quantity'), # noqa 0x00400295: ('SQ', '1', "Measuring Units Sequence", '', 'MeasuringUnitsSequence'), # noqa 0x00400296: ('SQ', '1', "Billing Item Sequence", '', 'BillingItemSequence'), # noqa 0x00400300: ('US', '1', "Total Time of Fluoroscopy", 'Retired', 'TotalTimeOfFluoroscopy'), # noqa 0x00400301: ('US', '1', "Total Number of Exposures", 'Retired', 'TotalNumberOfExposures'), # noqa 0x00400302: ('US', '1', "Entrance Dose", '', 'EntranceDose'), # noqa 0x00400303: ('US', '1-2', "Exposed Area", '', 'ExposedArea'), # noqa 0x00400306: ('DS', '1', "Distance Source to Entrance", '', 'DistanceSourceToEntrance'), # noqa 0x00400307: ('DS', '1', "Distance Source to Support", 'Retired', 'DistanceSourceToSupport'), # noqa 0x0040030E: ('SQ', '1', "Exposure Dose Sequence", 'Retired', 'ExposureDoseSequence'), # noqa 0x00400310: ('ST', '1', "Comments on Radiation Dose", '', 'CommentsOnRadiationDose'), # noqa 0x00400312: ('DS', '1', "X-Ray Output", '', 'XRayOutput'), # noqa 0x00400314: ('DS', '1', "Half Value Layer", '', 'HalfValueLayer'), # noqa 0x00400316: ('DS', '1', "Organ Dose", '', 'OrganDose'), # noqa 0x00400318: ('CS', '1', "Organ Exposed", '', 'OrganExposed'), # noqa 0x00400320: ('SQ', '1', "Billing Procedure Step Sequence", '', 'BillingProcedureStepSequence'), # noqa 0x00400321: ('SQ', '1', "Film Consumption Sequence", '', 'FilmConsumptionSequence'), # noqa 0x00400324: ('SQ', '1', "Billing Supplies and Devices Sequence", '', 'BillingSuppliesAndDevicesSequence'), # noqa 0x00400330: ('SQ', '1', "Referenced Procedure Step Sequence", 'Retired', 'ReferencedProcedureStepSequence'), # noqa 0x00400340: ('SQ', '1', "Performed Series Sequence", '', 'PerformedSeriesSequence'), # noqa 0x00400400: ('LT', '1', "Comments on the Scheduled Procedure Step", '', 'CommentsOnTheScheduledProcedureStep'), # noqa 0x00400440: ('SQ', '1', "Protocol Context Sequence", '', 'ProtocolContextSequence'), # noqa 0x00400441: ('SQ', '1', "Content Item Modifier Sequence", '', 'ContentItemModifierSequence'), # noqa 0x00400500: ('SQ', '1', "Scheduled Specimen Sequence", '', 'ScheduledSpecimenSequence'), # noqa 0x0040050A: ('LO', '1', "Specimen Accession Number", 'Retired', 'SpecimenAccessionNumber'), # noqa 0x00400512: ('LO', '1', "Container Identifier", '', 'ContainerIdentifier'), # noqa 0x00400513: ('SQ', '1', "Issuer of the Container Identifier Sequence", '', 'IssuerOfTheContainerIdentifierSequence'), # noqa 0x00400515: ('SQ', '1', "Alternate Container Identifier Sequence", '', 'AlternateContainerIdentifierSequence'), # noqa 0x00400518: ('SQ', '1', "Container Type Code Sequence", '', 'ContainerTypeCodeSequence'), # noqa 0x0040051A: ('LO', '1', "Container Description", '', 'ContainerDescription'), # noqa 0x00400520: ('SQ', '1', "Container Component Sequence", '', 'ContainerComponentSequence'), # noqa 0x00400550: ('SQ', '1', "Specimen Sequence", 'Retired', 'SpecimenSequence'), # noqa 0x00400551: ('LO', '1', "Specimen Identifier", '', 'SpecimenIdentifier'), # noqa 0x00400552: ('SQ', '1', "Specimen Description Sequence (Trial)", 'Retired', 'SpecimenDescriptionSequenceTrial'), # noqa 0x00400553: ('ST', '1', "Specimen Description (Trial)", 'Retired', 'SpecimenDescriptionTrial'), # noqa 0x00400554: ('UI', '1', "Specimen UID", '', 'SpecimenUID'), # noqa 0x00400555: ('SQ', '1', "Acquisition Context Sequence", '', 'AcquisitionContextSequence'), # noqa 0x00400556: ('ST', '1', "Acquisition Context Description", '', 'AcquisitionContextDescription'), # noqa 0x00400560: ('SQ', '1', "Specimen Description Sequence", '', 'SpecimenDescriptionSequence'), # noqa 0x00400562: ('SQ', '1', "Issuer of the Specimen Identifier Sequence", '', 'IssuerOfTheSpecimenIdentifierSequence'), # noqa 0x0040059A: ('SQ', '1', "Specimen Type Code Sequence", '', 'SpecimenTypeCodeSequence'), # noqa 0x00400600: ('LO', '1', "Specimen Short Description", '', 'SpecimenShortDescription'), # noqa 0x00400602: ('UT', '1', "Specimen Detailed Description", '', 'SpecimenDetailedDescription'), # noqa 0x00400610: ('SQ', '1', "Specimen Preparation Sequence", '', 'SpecimenPreparationSequence'), # noqa 0x00400612: ('SQ', '1', "Specimen Preparation Step Content Item Sequence", '', 'SpecimenPreparationStepContentItemSequence'), # noqa 0x00400620: ('SQ', '1', "Specimen Localization Content Item Sequence", '', 'SpecimenLocalizationContentItemSequence'), # noqa 0x004006FA: ('LO', '1', "Slide Identifier", 'Retired', 'SlideIdentifier'), # noqa 0x00400710: ('SQ', '1', "Whole Slide Microscopy Image Frame Type Sequence", '', 'WholeSlideMicroscopyImageFrameTypeSequence'), # noqa 0x0040071A: ('SQ', '1', "Image Center Point Coordinates Sequence", '', 'ImageCenterPointCoordinatesSequence'), # noqa 0x0040072A: ('DS', '1', "X Offset in Slide Coordinate System", '', 'XOffsetInSlideCoordinateSystem'), # noqa 0x0040073A: ('DS', '1', "Y Offset in Slide Coordinate System", '', 'YOffsetInSlideCoordinateSystem'), # noqa 0x0040074A: ('DS', '1', "Z Offset in Slide Coordinate System", '', 'ZOffsetInSlideCoordinateSystem'), # noqa 0x004008D8: ('SQ', '1', "Pixel Spacing Sequence", 'Retired', 'PixelSpacingSequence'), # noqa 0x004008DA: ('SQ', '1', "Coordinate System Axis Code Sequence", 'Retired', 'CoordinateSystemAxisCodeSequence'), # noqa 0x004008EA: ('SQ', '1', "Measurement Units Code Sequence", '', 'MeasurementUnitsCodeSequence'), # noqa 0x004009F8: ('SQ', '1', "Vital Stain Code Sequence (Trial)", 'Retired', 'VitalStainCodeSequenceTrial'), # noqa 0x00401001: ('SH', '1', "Requested Procedure ID", '', 'RequestedProcedureID'), # noqa 0x00401002: ('LO', '1', "Reason for the Requested Procedure", '', 'ReasonForTheRequestedProcedure'), # noqa 0x00401003: ('SH', '1', "Requested Procedure Priority", '', 'RequestedProcedurePriority'), # noqa 0x00401004: ('LO', '1', "Patient Transport Arrangements", '', 'PatientTransportArrangements'), # noqa 0x00401005: ('LO', '1', "Requested Procedure Location", '', 'RequestedProcedureLocation'), # noqa 0x00401006: ('SH', '1', "Placer Order Number / Procedure", 'Retired', 'PlacerOrderNumberProcedure'), # noqa 0x00401007: ('SH', '1', "Filler Order Number / Procedure", 'Retired', 'FillerOrderNumberProcedure'), # noqa 0x00401008: ('LO', '1', "Confidentiality Code", '', 'ConfidentialityCode'), # noqa 0x00401009: ('SH', '1', "Reporting Priority", '', 'ReportingPriority'), # noqa 0x0040100A: ('SQ', '1', "Reason for Requested Procedure Code Sequence", '', 'ReasonForRequestedProcedureCodeSequence'), # noqa 0x00401010: ('PN', '1-n', "Names of Intended Recipients of Results", '', 'NamesOfIntendedRecipientsOfResults'), # noqa 0x00401011: ('SQ', '1', "Intended Recipients of Results Identification Sequence", '', 'IntendedRecipientsOfResultsIdentificationSequence'), # noqa 0x00401012: ('SQ', '1', "Reason For Performed Procedure Code Sequence", '', 'ReasonForPerformedProcedureCodeSequence'), # noqa 0x00401060: ('LO', '1', "Requested Procedure Description (Trial)", 'Retired', 'RequestedProcedureDescriptionTrial'), # noqa 0x00401101: ('SQ', '1', "Person Identification Code Sequence", '', 'PersonIdentificationCodeSequence'), # noqa 0x00401102: ('ST', '1', "Person's Address", '', 'PersonAddress'), # noqa 0x00401103: ('LO', '1-n', "Person's Telephone Numbers", '', 'PersonTelephoneNumbers'), # noqa 0x00401104: ('LT', '1', "Person's Telecom Information", '', 'PersonTelecomInformation'), # noqa 0x00401400: ('LT', '1', "Requested Procedure Comments", '', 'RequestedProcedureComments'), # noqa 0x00402001: ('LO', '1', "Reason for the Imaging Service Request", 'Retired', 'ReasonForTheImagingServiceRequest'), # noqa 0x00402004: ('DA', '1', "Issue Date of Imaging Service Request", '', 'IssueDateOfImagingServiceRequest'), # noqa 0x00402005: ('TM', '1', "Issue Time of Imaging Service Request", '', 'IssueTimeOfImagingServiceRequest'), # noqa 0x00402006: ('SH', '1', "Placer Order Number / Imaging Service Request (Retired)", 'Retired', 'PlacerOrderNumberImagingServiceRequestRetired'), # noqa 0x00402007: ('SH', '1', "Filler Order Number / Imaging Service Request (Retired)", 'Retired', 'FillerOrderNumberImagingServiceRequestRetired'), # noqa 0x00402008: ('PN', '1', "Order Entered By", '', 'OrderEnteredBy'), # noqa 0x00402009: ('SH', '1', "Order Enterer's Location", '', 'OrderEntererLocation'), # noqa 0x00402010: ('SH', '1', "Order Callback Phone Number", '', 'OrderCallbackPhoneNumber'), # noqa 0x00402011: ('LT', '1', "Order Callback Telecom Information", '', 'OrderCallbackTelecomInformation'), # noqa 0x00402016: ('LO', '1', "Placer Order Number / Imaging Service Request", '', 'PlacerOrderNumberImagingServiceRequest'), # noqa 0x00402017: ('LO', '1', "Filler Order Number / Imaging Service Request", '', 'FillerOrderNumberImagingServiceRequest'), # noqa 0x00402400: ('LT', '1', "Imaging Service Request Comments", '', 'ImagingServiceRequestComments'), # noqa 0x00403001: ('LO', '1', "Confidentiality Constraint on Patient Data Description", '', 'ConfidentialityConstraintOnPatientDataDescription'), # noqa 0x00404001: ('CS', '1', "General Purpose Scheduled Procedure Step Status", 'Retired', 'GeneralPurposeScheduledProcedureStepStatus'), # noqa 0x00404002: ('CS', '1', "General Purpose Performed Procedure Step Status", 'Retired', 'GeneralPurposePerformedProcedureStepStatus'), # noqa 0x00404003: ('CS', '1', "General Purpose Scheduled Procedure Step Priority", 'Retired', 'GeneralPurposeScheduledProcedureStepPriority'), # noqa 0x00404004: ('SQ', '1', "Scheduled Processing Applications Code Sequence", 'Retired', 'ScheduledProcessingApplicationsCodeSequence'), # noqa 0x00404005: ('DT', '1', "Scheduled Procedure Step Start DateTime", '', 'ScheduledProcedureStepStartDateTime'), # noqa 0x00404006: ('CS', '1', "Multiple Copies Flag", 'Retired', 'MultipleCopiesFlag'), # noqa 0x00404007: ('SQ', '1', "Performed Processing Applications Code Sequence", 'Retired', 'PerformedProcessingApplicationsCodeSequence'), # noqa 0x00404008: ('DT', '1', "Scheduled Procedure Step Expiration DateTime", '', 'ScheduledProcedureStepExpirationDateTime'), # noqa 0x00404009: ('SQ', '1', "Human Performer Code Sequence", '', 'HumanPerformerCodeSequence'), # noqa 0x00404010: ('DT', '1', "Scheduled Procedure Step Modification DateTime", '', 'ScheduledProcedureStepModificationDateTime'), # noqa 0x00404011: ('DT', '1', "Expected Completion DateTime", '', 'ExpectedCompletionDateTime'), # noqa 0x00404015: ('SQ', '1', "Resulting General Purpose Performed Procedure Steps Sequence", 'Retired', 'ResultingGeneralPurposePerformedProcedureStepsSequence'), # noqa 0x00404016: ('SQ', '1', "Referenced General Purpose Scheduled Procedure Step Sequence", 'Retired', 'ReferencedGeneralPurposeScheduledProcedureStepSequence'), # noqa 0x00404018: ('SQ', '1', "Scheduled Workitem Code Sequence", '', 'ScheduledWorkitemCodeSequence'), # noqa 0x00404019: ('SQ', '1', "Performed Workitem Code Sequence", '', 'PerformedWorkitemCodeSequence'), # noqa 0x00404020: ('CS', '1', "Input Availability Flag", 'Retired', 'InputAvailabilityFlag'), # noqa 0x00404021: ('SQ', '1', "Input Information Sequence", '', 'InputInformationSequence'), # noqa 0x00404022: ('SQ', '1', "Relevant Information Sequence", 'Retired', 'RelevantInformationSequence'), # noqa 0x00404023: ('UI', '1', "Referenced General Purpose Scheduled Procedure Step Transaction UID", 'Retired', 'ReferencedGeneralPurposeScheduledProcedureStepTransactionUID'), # noqa 0x00404025: ('SQ', '1', "Scheduled Station Name Code Sequence", '', 'ScheduledStationNameCodeSequence'), # noqa 0x00404026: ('SQ', '1', "Scheduled Station Class Code Sequence", '', 'ScheduledStationClassCodeSequence'), # noqa 0x00404027: ('SQ', '1', "Scheduled Station Geographic Location Code Sequence", '', 'ScheduledStationGeographicLocationCodeSequence'), # noqa 0x00404028: ('SQ', '1', "Performed Station Name Code Sequence", '', 'PerformedStationNameCodeSequence'), # noqa 0x00404029: ('SQ', '1', "Performed Station Class Code Sequence", '', 'PerformedStationClassCodeSequence'), # noqa 0x00404030: ('SQ', '1', "Performed Station Geographic Location Code Sequence", '', 'PerformedStationGeographicLocationCodeSequence'), # noqa 0x00404031: ('SQ', '1', "Requested Subsequent Workitem Code Sequence", 'Retired', 'RequestedSubsequentWorkitemCodeSequence'), # noqa 0x00404032: ('SQ', '1', "Non-DICOM Output Code Sequence", 'Retired', 'NonDICOMOutputCodeSequence'), # noqa 0x00404033: ('SQ', '1', "Output Information Sequence", '', 'OutputInformationSequence'), # noqa 0x00404034: ('SQ', '1', "Scheduled Human Performers Sequence", '', 'ScheduledHumanPerformersSequence'), # noqa 0x00404035: ('SQ', '1', "Actual Human Performers Sequence", '', 'ActualHumanPerformersSequence'), # noqa 0x00404036: ('LO', '1', "Human Performer's Organization", '', 'HumanPerformerOrganization'), # noqa 0x00404037: ('PN', '1', "Human Performer's Name", '', 'HumanPerformerName'), # noqa 0x00404040: ('CS', '1', "Raw Data Handling", '', 'RawDataHandling'), # noqa 0x00404041: ('CS', '1', "Input Readiness State", '', 'InputReadinessState'), # noqa 0x00404050: ('DT', '1', "Performed Procedure Step Start DateTime", '', 'PerformedProcedureStepStartDateTime'), # noqa 0x00404051: ('DT', '1', "Performed Procedure Step End DateTime", '', 'PerformedProcedureStepEndDateTime'), # noqa 0x00404052: ('DT', '1', "Procedure Step Cancellation DateTime", '', 'ProcedureStepCancellationDateTime'), # noqa 0x00404070: ('SQ', '1', "Output Destination Sequence", '', 'OutputDestinationSequence'), # noqa 0x00404071: ('SQ', '1', "DICOM Storage Sequence", '', 'DICOMStorageSequence'), # noqa 0x00404072: ('SQ', '1', "STOW-RS Storage Sequence", '', 'STOWRSStorageSequence'), # noqa 0x00404073: ('UR', '1', "Storage URL", '', 'StorageURL'), # noqa 0x00404074: ('SQ', '1', "XDS Storage Sequence", '', 'XDSStorageSequence'), # noqa 0x00408302: ('DS', '1', "Entrance Dose in mGy", '', 'EntranceDoseInmGy'), # noqa 0x00408303: ('CS', '1', "Entrance Dose Derivation", '', 'EntranceDoseDerivation'), # noqa 0x00409092: ('SQ', '1', "Parametric Map Frame Type Sequence", '', 'ParametricMapFrameTypeSequence'), # noqa 0x00409094: ('SQ', '1', "Referenced Image Real World Value Mapping Sequence", '', 'ReferencedImageRealWorldValueMappingSequence'), # noqa 0x00409096: ('SQ', '1', "Real World Value Mapping Sequence", '', 'RealWorldValueMappingSequence'), # noqa 0x00409098: ('SQ', '1', "Pixel Value Mapping Code Sequence", '', 'PixelValueMappingCodeSequence'), # noqa 0x00409210: ('SH', '1', "LUT Label", '', 'LUTLabel'), # noqa 0x00409211: ('US or SS', '1', "Real World Value Last Value Mapped", '', 'RealWorldValueLastValueMapped'), # noqa 0x00409212: ('FD', '1-n', "Real World Value LUT Data", '', 'RealWorldValueLUTData'), # noqa 0x00409213: ('FD', '1', "Double Float Real World Value Last Value Mapped", '', 'DoubleFloatRealWorldValueLastValueMapped'), # noqa 0x00409214: ('FD', '1', "Double Float Real World Value First Value Mapped", '', 'DoubleFloatRealWorldValueFirstValueMapped'), # noqa 0x00409216: ('US or SS', '1', "Real World Value First Value Mapped", '', 'RealWorldValueFirstValueMapped'), # noqa 0x00409220: ('SQ', '1', "Quantity Definition Sequence", '', 'QuantityDefinitionSequence'), # noqa 0x00409224: ('FD', '1', "Real World Value Intercept", '', 'RealWorldValueIntercept'), # noqa 0x00409225: ('FD', '1', "Real World Value Slope", '', 'RealWorldValueSlope'), # noqa 0x0040A007: ('CS', '1', "Findings Flag (Trial)", 'Retired', 'FindingsFlagTrial'), # noqa 0x0040A010: ('CS', '1', "Relationship Type", '', 'RelationshipType'), # noqa 0x0040A020: ('SQ', '1', "Findings Sequence (Trial)", 'Retired', 'FindingsSequenceTrial'), # noqa 0x0040A021: ('UI', '1', "Findings Group UID (Trial)", 'Retired', 'FindingsGroupUIDTrial'), # noqa 0x0040A022: ('UI', '1', "Referenced Findings Group UID (Trial)", 'Retired', 'ReferencedFindingsGroupUIDTrial'), # noqa 0x0040A023: ('DA', '1', "Findings Group Recording Date (Trial)", 'Retired', 'FindingsGroupRecordingDateTrial'), # noqa 0x0040A024: ('TM', '1', "Findings Group Recording Time (Trial)", 'Retired', 'FindingsGroupRecordingTimeTrial'), # noqa 0x0040A026: ('SQ', '1', "Findings Source Category Code Sequence (Trial)", 'Retired', 'FindingsSourceCategoryCodeSequenceTrial'), # noqa 0x0040A027: ('LO', '1', "Verifying Organization", '', 'VerifyingOrganization'), # noqa 0x0040A028: ('SQ', '1', "Documenting Organization Identifier Code Sequence (Trial)", 'Retired', 'DocumentingOrganizationIdentifierCodeSequenceTrial'), # noqa 0x0040A030: ('DT', '1', "Verification DateTime", '', 'VerificationDateTime'), # noqa 0x0040A032: ('DT', '1', "Observation DateTime", '', 'ObservationDateTime'), # noqa 0x0040A033: ('DT', '1', "Observation Start DateTime", '', 'ObservationStartDateTime'), # noqa 0x0040A040: ('CS', '1', "Value Type", '', 'ValueType'), # noqa 0x0040A043: ('SQ', '1', "Concept Name Code Sequence", '', 'ConceptNameCodeSequence'), # noqa 0x0040A047: ('LO', '1', "Measurement Precision Description (Trial)", 'Retired', 'MeasurementPrecisionDescriptionTrial'), # noqa 0x0040A050: ('CS', '1', "Continuity Of Content", '', 'ContinuityOfContent'), # noqa 0x0040A057: ('CS', '1-n', "Urgency or Priority Alerts (Trial)", 'Retired', 'UrgencyOrPriorityAlertsTrial'), # noqa 0x0040A060: ('LO', '1', "Sequencing Indicator (Trial)", 'Retired', 'SequencingIndicatorTrial'), # noqa 0x0040A066: ('SQ', '1', "Document Identifier Code Sequence (Trial)", 'Retired', 'DocumentIdentifierCodeSequenceTrial'), # noqa 0x0040A067: ('PN', '1', "Document Author (Trial)", 'Retired', 'DocumentAuthorTrial'), # noqa 0x0040A068: ('SQ', '1', "Document Author Identifier Code Sequence (Trial)", 'Retired', 'DocumentAuthorIdentifierCodeSequenceTrial'), # noqa 0x0040A070: ('SQ', '1', "Identifier Code Sequence (Trial)", 'Retired', 'IdentifierCodeSequenceTrial'), # noqa 0x0040A073: ('SQ', '1', "Verifying Observer Sequence", '', 'VerifyingObserverSequence'), # noqa 0x0040A074: ('OB', '1', "Object Binary Identifier (Trial)", 'Retired', 'ObjectBinaryIdentifierTrial'), # noqa 0x0040A075: ('PN', '1', "Verifying Observer Name", '', 'VerifyingObserverName'), # noqa 0x0040A076: ('SQ', '1', "Documenting Observer Identifier Code Sequence (Trial)", 'Retired', 'DocumentingObserverIdentifierCodeSequenceTrial'), # noqa 0x0040A078: ('SQ', '1', "Author Observer Sequence", '', 'AuthorObserverSequence'), # noqa 0x0040A07A: ('SQ', '1', "Participant Sequence", '', 'ParticipantSequence'), # noqa 0x0040A07C: ('SQ', '1', "Custodial Organization Sequence", '', 'CustodialOrganizationSequence'), # noqa 0x0040A080: ('CS', '1', "Participation Type", '', 'ParticipationType'), # noqa 0x0040A082: ('DT', '1', "Participation DateTime", '', 'ParticipationDateTime'), # noqa 0x0040A084: ('CS', '1', "Observer Type", '', 'ObserverType'), # noqa 0x0040A085: ('SQ', '1', "Procedure Identifier Code Sequence (Trial)", 'Retired', 'ProcedureIdentifierCodeSequenceTrial'), # noqa 0x0040A088: ('SQ', '1', "Verifying Observer Identification Code Sequence", '', 'VerifyingObserverIdentificationCodeSequence'), # noqa 0x0040A089: ('OB', '1', "Object Directory Binary Identifier (Trial)", 'Retired', 'ObjectDirectoryBinaryIdentifierTrial'), # noqa 0x0040A090: ('SQ', '1', "Equivalent CDA Document Sequence", 'Retired', 'EquivalentCDADocumentSequence'), # noqa 0x0040A0B0: ('US', '2-2n', "Referenced Waveform Channels", '', 'ReferencedWaveformChannels'), # noqa 0x0040A110: ('DA', '1', "Date of Document or Verbal Transaction (Trial)", 'Retired', 'DateOfDocumentOrVerbalTransactionTrial'), # noqa 0x0040A112: ('TM', '1', "Time of Document Creation or Verbal Transaction (Trial)", 'Retired', 'TimeOfDocumentCreationOrVerbalTransactionTrial'), # noqa 0x0040A120: ('DT', '1', "DateTime", '', 'DateTime'), # noqa 0x0040A121: ('DA', '1', "Date", '', 'Date'), # noqa 0x0040A122: ('TM', '1', "Time", '', 'Time'), # noqa 0x0040A123: ('PN', '1', "Person Name", '', 'PersonName'), # noqa 0x0040A124: ('UI', '1', "UID", '', 'UID'), # noqa 0x0040A125: ('CS', '2', "Report Status ID (Trial)", 'Retired', 'ReportStatusIDTrial'), # noqa 0x0040A130: ('CS', '1', "Temporal Range Type", '', 'TemporalRangeType'), # noqa 0x0040A132: ('UL', '1-n', "Referenced Sample Positions", '', 'ReferencedSamplePositions'), # noqa 0x0040A136: ('US', '1-n', "Referenced Frame Numbers", 'Retired', 'ReferencedFrameNumbers'), # noqa 0x0040A138: ('DS', '1-n', "Referenced Time Offsets", '', 'ReferencedTimeOffsets'), # noqa 0x0040A13A: ('DT', '1-n', "Referenced DateTime", '', 'ReferencedDateTime'), # noqa 0x0040A160: ('UT', '1', "Text Value", '', 'TextValue'), # noqa 0x0040A161: ('FD', '1-n', "Floating Point Value", '', 'FloatingPointValue'), # noqa 0x0040A162: ('SL', '1-n', "Rational Numerator Value", '', 'RationalNumeratorValue'), # noqa 0x0040A163: ('UL', '1-n', "Rational Denominator Value", '', 'RationalDenominatorValue'), # noqa 0x0040A167: ('SQ', '1', "Observation Category Code Sequence (Trial)", 'Retired', 'ObservationCategoryCodeSequenceTrial'), # noqa 0x0040A168: ('SQ', '1', "Concept Code Sequence", '', 'ConceptCodeSequence'), # noqa 0x0040A16A: ('ST', '1', "Bibliographic Citation (Trial)", 'Retired', 'BibliographicCitationTrial'), # noqa 0x0040A170: ('SQ', '1', "Purpose of Reference Code Sequence", '', 'PurposeOfReferenceCodeSequence'), # noqa 0x0040A171: ('UI', '1', "Observation UID", '', 'ObservationUID'), # noqa 0x0040A172: ('UI', '1', "Referenced Observation UID (Trial)", 'Retired', 'ReferencedObservationUIDTrial'), # noqa 0x0040A173: ('CS', '1', "Referenced Observation Class (Trial)", 'Retired', 'ReferencedObservationClassTrial'), # noqa 0x0040A174: ('CS', '1', "Referenced Object Observation Class (Trial)", 'Retired', 'ReferencedObjectObservationClassTrial'), # noqa 0x0040A180: ('US', '1', "Annotation Group Number", '', 'AnnotationGroupNumber'), # noqa 0x0040A192: ('DA', '1', "Observation Date (Trial)", 'Retired', 'ObservationDateTrial'), # noqa 0x0040A193: ('TM', '1', "Observation Time (Trial)", 'Retired', 'ObservationTimeTrial'), # noqa 0x0040A194: ('CS', '1', "Measurement Automation (Trial)", 'Retired', 'MeasurementAutomationTrial'), # noqa 0x0040A195: ('SQ', '1', "Modifier Code Sequence", '', 'ModifierCodeSequence'), # noqa 0x0040A224: ('ST', '1', "Identification Description (Trial)", 'Retired', 'IdentificationDescriptionTrial'), # noqa 0x0040A290: ('CS', '1', "Coordinates Set Geometric Type (Trial)", 'Retired', 'CoordinatesSetGeometricTypeTrial'), # noqa 0x0040A296: ('SQ', '1', "Algorithm Code Sequence (Trial)", 'Retired', 'AlgorithmCodeSequenceTrial'), # noqa 0x0040A297: ('ST', '1', "Algorithm Description (Trial)", 'Retired', 'AlgorithmDescriptionTrial'), # noqa 0x0040A29A: ('SL', '2-2n', "Pixel Coordinates Set (Trial)", 'Retired', 'PixelCoordinatesSetTrial'), # noqa 0x0040A300: ('SQ', '1', "Measured Value Sequence", '', 'MeasuredValueSequence'), # noqa 0x0040A301: ('SQ', '1', "Numeric Value Qualifier Code Sequence", '', 'NumericValueQualifierCodeSequence'), # noqa 0x0040A307: ('PN', '1', "Current Observer (Trial)", 'Retired', 'CurrentObserverTrial'), # noqa 0x0040A30A: ('DS', '1-n', "Numeric Value", '', 'NumericValue'), # noqa 0x0040A313: ('SQ', '1', "Referenced Accession Sequence (Trial)", 'Retired', 'ReferencedAccessionSequenceTrial'), # noqa 0x0040A33A: ('ST', '1', "Report Status Comment (Trial)", 'Retired', 'ReportStatusCommentTrial'), # noqa 0x0040A340: ('SQ', '1', "Procedure Context Sequence (Trial)", 'Retired', 'ProcedureContextSequenceTrial'), # noqa 0x0040A352: ('PN', '1', "Verbal Source (Trial)", 'Retired', 'VerbalSourceTrial'), # noqa 0x0040A353: ('ST', '1', "Address (Trial)", 'Retired', 'AddressTrial'), # noqa 0x0040A354: ('LO', '1', "Telephone Number (Trial)", 'Retired', 'TelephoneNumberTrial'), # noqa 0x0040A358: ('SQ', '1', "Verbal Source Identifier Code Sequence (Trial)", 'Retired', 'VerbalSourceIdentifierCodeSequenceTrial'), # noqa 0x0040A360: ('SQ', '1', "Predecessor Documents Sequence", '', 'PredecessorDocumentsSequence'), # noqa 0x0040A370: ('SQ', '1', "Referenced Request Sequence", '', 'ReferencedRequestSequence'), # noqa 0x0040A372: ('SQ', '1', "Performed Procedure Code Sequence", '', 'PerformedProcedureCodeSequence'), # noqa 0x0040A375: ('SQ', '1', "Current Requested Procedure Evidence Sequence", '', 'CurrentRequestedProcedureEvidenceSequence'), # noqa 0x0040A380: ('SQ', '1', "Report Detail Sequence (Trial)", 'Retired', 'ReportDetailSequenceTrial'), # noqa 0x0040A385: ('SQ', '1', "Pertinent Other Evidence Sequence", '', 'PertinentOtherEvidenceSequence'), # noqa 0x0040A390: ('SQ', '1', "HL7 Structured Document Reference Sequence", '', 'HL7StructuredDocumentReferenceSequence'), # noqa 0x0040A402: ('UI', '1', "Observation Subject UID (Trial)", 'Retired', 'ObservationSubjectUIDTrial'), # noqa 0x0040A403: ('CS', '1', "Observation Subject Class (Trial)", 'Retired', 'ObservationSubjectClassTrial'), # noqa 0x0040A404: ('SQ', '1', "Observation Subject Type Code Sequence (Trial)", 'Retired', 'ObservationSubjectTypeCodeSequenceTrial'), # noqa 0x0040A491: ('CS', '1', "Completion Flag", '', 'CompletionFlag'), # noqa 0x0040A492: ('LO', '1', "Completion Flag Description", '', 'CompletionFlagDescription'), # noqa 0x0040A493: ('CS', '1', "Verification Flag", '', 'VerificationFlag'), # noqa 0x0040A494: ('CS', '1', "Archive Requested", '', 'ArchiveRequested'), # noqa 0x0040A496: ('CS', '1', "Preliminary Flag", '', 'PreliminaryFlag'), # noqa 0x0040A504: ('SQ', '1', "Content Template Sequence", '', 'ContentTemplateSequence'), # noqa 0x0040A525: ('SQ', '1', "Identical Documents Sequence", '', 'IdenticalDocumentsSequence'), # noqa 0x0040A600: ('CS', '1', "Observation Subject Context Flag (Trial)", 'Retired', 'ObservationSubjectContextFlagTrial'), # noqa 0x0040A601: ('CS', '1', "Observer Context Flag (Trial)", 'Retired', 'ObserverContextFlagTrial'), # noqa 0x0040A603: ('CS', '1', "Procedure Context Flag (Trial)", 'Retired', 'ProcedureContextFlagTrial'), # noqa 0x0040A730: ('SQ', '1', "Content Sequence", '', 'ContentSequence'), # noqa 0x0040A731: ('SQ', '1', "Relationship Sequence (Trial)", 'Retired', 'RelationshipSequenceTrial'), # noqa 0x0040A732: ('SQ', '1', "Relationship Type Code Sequence (Trial)", 'Retired', 'RelationshipTypeCodeSequenceTrial'), # noqa 0x0040A744: ('SQ', '1', "Language Code Sequence (Trial)", 'Retired', 'LanguageCodeSequenceTrial'), # noqa 0x0040A801: ('SQ', '1', "Tabulated Values Sequence", '', 'TabulatedValuesSequence'), # noqa 0x0040A802: ('UL', '1', "Number of Table Rows", '', 'NumberOfTableRows'), # noqa 0x0040A803: ('UL', '1', "Number of Table Columns", '', 'NumberOfTableColumns'), # noqa 0x0040A804: ('UL', '1', "Table Row Number", '', 'TableRowNumber'), # noqa 0x0040A805: ('UL', '1', "Table Column Number", '', 'TableColumnNumber'), # noqa 0x0040A806: ('SQ', '1', "Table Row Definition Sequence", '', 'TableRowDefinitionSequence'), # noqa 0x0040A807: ('SQ', '1', "Table Column Definition Sequence", '', 'TableColumnDefinitionSequence'), # noqa 0x0040A808: ('SQ', '1', "Cell Values Sequence", '', 'CellValuesSequence'), # noqa 0x0040A992: ('ST', '1', "Uniform Resource Locator (Trial)", 'Retired', 'UniformResourceLocatorTrial'), # noqa 0x0040B020: ('SQ', '1', "Waveform Annotation Sequence", '', 'WaveformAnnotationSequence'), # noqa 0x0040DB00: ('CS', '1', "Template Identifier", '', 'TemplateIdentifier'), # noqa 0x0040DB06: ('DT', '1', "Template Version", 'Retired', 'TemplateVersion'), # noqa 0x0040DB07: ('DT', '1', "Template Local Version", 'Retired', 'TemplateLocalVersion'), # noqa 0x0040DB0B: ('CS', '1', "Template Extension Flag", 'Retired', 'TemplateExtensionFlag'), # noqa 0x0040DB0C: ('UI', '1', "Template Extension Organization UID", 'Retired', 'TemplateExtensionOrganizationUID'), # noqa 0x0040DB0D: ('UI', '1', "Template Extension Creator UID", 'Retired', 'TemplateExtensionCreatorUID'), # noqa 0x0040DB73: ('UL', '1-n', "Referenced Content Item Identifier", '', 'ReferencedContentItemIdentifier'), # noqa 0x0040E001: ('ST', '1', "HL7 Instance Identifier", '', 'HL7InstanceIdentifier'), # noqa 0x0040E004: ('DT', '1', "HL7 Document Effective Time", '', 'HL7DocumentEffectiveTime'), # noqa 0x0040E006: ('SQ', '1', "HL7 Document Type Code Sequence", '', 'HL7DocumentTypeCodeSequence'), # noqa 0x0040E008: ('SQ', '1', "Document Class Code Sequence", '', 'DocumentClassCodeSequence'), # noqa 0x0040E010: ('UR', '1', "Retrieve URI", '', 'RetrieveURI'), # noqa 0x0040E011: ('UI', '1', "Retrieve Location UID", '', 'RetrieveLocationUID'), # noqa 0x0040E020: ('CS', '1', "Type of Instances", '', 'TypeOfInstances'), # noqa 0x0040E021: ('SQ', '1', "DICOM Retrieval Sequence", '', 'DICOMRetrievalSequence'), # noqa 0x0040E022: ('SQ', '1', "DICOM Media Retrieval Sequence", '', 'DICOMMediaRetrievalSequence'), # noqa 0x0040E023: ('SQ', '1', "WADO Retrieval Sequence", '', 'WADORetrievalSequence'), # noqa 0x0040E024: ('SQ', '1', "XDS Retrieval Sequence", '', 'XDSRetrievalSequence'), # noqa 0x0040E025: ('SQ', '1', "WADO-RS Retrieval Sequence", '', 'WADORSRetrievalSequence'), # noqa 0x0040E030: ('UI', '1', "Repository Unique ID", '', 'RepositoryUniqueID'), # noqa 0x0040E031: ('UI', '1', "Home Community ID", '', 'HomeCommunityID'), # noqa 0x00420010: ('ST', '1', "Document Title", '', 'DocumentTitle'), # noqa 0x00420011: ('OB', '1', "Encapsulated Document", '', 'EncapsulatedDocument'), # noqa 0x00420012: ('LO', '1', "MIME Type of Encapsulated Document", '', 'MIMETypeOfEncapsulatedDocument'), # noqa 0x00420013: ('SQ', '1', "Source Instance Sequence", '', 'SourceInstanceSequence'), # noqa 0x00420014: ('LO', '1-n', "List of MIME Types", '', 'ListOfMIMETypes'), # noqa 0x00420015: ('UL', '1', "Encapsulated Document Length", '', 'EncapsulatedDocumentLength'), # noqa 0x00440001: ('ST', '1', "Product Package Identifier", '', 'ProductPackageIdentifier'), # noqa 0x00440002: ('CS', '1', "Substance Administration Approval", '', 'SubstanceAdministrationApproval'), # noqa 0x00440003: ('LT', '1', "Approval Status Further Description", '', 'ApprovalStatusFurtherDescription'), # noqa 0x00440004: ('DT', '1', "Approval Status DateTime", '', 'ApprovalStatusDateTime'), # noqa 0x00440007: ('SQ', '1', "Product Type Code Sequence", '', 'ProductTypeCodeSequence'), # noqa 0x00440008: ('LO', '1-n', "Product Name", '', 'ProductName'), # noqa 0x00440009: ('LT', '1', "Product Description", '', 'ProductDescription'), # noqa 0x0044000A: ('LO', '1', "Product Lot Identifier", '', 'ProductLotIdentifier'), # noqa 0x0044000B: ('DT', '1', "Product Expiration DateTime", '', 'ProductExpirationDateTime'), # noqa 0x00440010: ('DT', '1', "Substance Administration DateTime", '', 'SubstanceAdministrationDateTime'), # noqa 0x00440011: ('LO', '1', "Substance Administration Notes", '', 'SubstanceAdministrationNotes'), # noqa 0x00440012: ('LO', '1', "Substance Administration Device ID", '', 'SubstanceAdministrationDeviceID'), # noqa 0x00440013: ('SQ', '1', "Product Parameter Sequence", '', 'ProductParameterSequence'), # noqa 0x00440019: ('SQ', '1', "Substance Administration Parameter Sequence", '', 'SubstanceAdministrationParameterSequence'), # noqa 0x00440100: ('SQ', '1', "Approval Sequence", '', 'ApprovalSequence'), # noqa 0x00440101: ('SQ', '1', "Assertion Code Sequence", '', 'AssertionCodeSequence'), # noqa 0x00440102: ('UI', '1', "Assertion UID", '', 'AssertionUID'), # noqa 0x00440103: ('SQ', '1', "Asserter Identification Sequence", '', 'AsserterIdentificationSequence'), # noqa 0x00440104: ('DT', '1', "Assertion DateTime", '', 'AssertionDateTime'), # noqa 0x00440105: ('DT', '1', "Assertion Expiration DateTime", '', 'AssertionExpirationDateTime'), # noqa 0x00440106: ('UT', '1', "Assertion Comments", '', 'AssertionComments'), # noqa 0x00440107: ('SQ', '1', "Related Assertion Sequence", '', 'RelatedAssertionSequence'), # noqa 0x00440108: ('UI', '1', "Referenced Assertion UID", '', 'ReferencedAssertionUID'), # noqa 0x00440109: ('SQ', '1', "Approval Subject Sequence", '', 'ApprovalSubjectSequence'), # noqa 0x0044010A: ('SQ', '1', "Organizational Role Code Sequence", '', 'OrganizationalRoleCodeSequence'), # noqa 0x00460012: ('LO', '1', "Lens Description", '', 'LensDescription'), # noqa 0x00460014: ('SQ', '1', "Right Lens Sequence", '', 'RightLensSequence'), # noqa 0x00460015: ('SQ', '1', "Left Lens Sequence", '', 'LeftLensSequence'), # noqa 0x00460016: ('SQ', '1', "Unspecified Laterality Lens Sequence", '', 'UnspecifiedLateralityLensSequence'), # noqa 0x00460018: ('SQ', '1', "Cylinder Sequence", '', 'CylinderSequence'), # noqa 0x00460028: ('SQ', '1', "Prism Sequence", '', 'PrismSequence'), # noqa 0x00460030: ('FD', '1', "Horizontal Prism Power", '', 'HorizontalPrismPower'), # noqa 0x00460032: ('CS', '1', "Horizontal Prism Base", '', 'HorizontalPrismBase'), # noqa 0x00460034: ('FD', '1', "Vertical Prism Power", '', 'VerticalPrismPower'), # noqa 0x00460036: ('CS', '1', "Vertical Prism Base", '', 'VerticalPrismBase'), # noqa 0x00460038: ('CS', '1', "Lens Segment Type", '', 'LensSegmentType'), # noqa 0x00460040: ('FD', '1', "Optical Transmittance", '', 'OpticalTransmittance'), # noqa 0x00460042: ('FD', '1', "Channel Width", '', 'ChannelWidth'), # noqa 0x00460044: ('FD', '1', "Pupil Size", '', 'PupilSize'), # noqa 0x00460046: ('FD', '1', "Corneal Size", '', 'CornealSize'), # noqa 0x00460047: ('SQ', '1', "Corneal Size Sequence", '', 'CornealSizeSequence'), # noqa 0x00460050: ('SQ', '1', "Autorefraction Right Eye Sequence", '', 'AutorefractionRightEyeSequence'), # noqa 0x00460052: ('SQ', '1', "Autorefraction Left Eye Sequence", '', 'AutorefractionLeftEyeSequence'), # noqa 0x00460060: ('FD', '1', "Distance Pupillary Distance", '', 'DistancePupillaryDistance'), # noqa 0x00460062: ('FD', '1', "Near Pupillary Distance", '', 'NearPupillaryDistance'), # noqa 0x00460063: ('FD', '1', "Intermediate Pupillary Distance", '', 'IntermediatePupillaryDistance'), # noqa 0x00460064: ('FD', '1', "Other Pupillary Distance", '', 'OtherPupillaryDistance'), # noqa 0x00460070: ('SQ', '1', "Keratometry Right Eye Sequence", '', 'KeratometryRightEyeSequence'), # noqa 0x00460071: ('SQ', '1', "Keratometry Left Eye Sequence", '', 'KeratometryLeftEyeSequence'), # noqa 0x00460074: ('SQ', '1', "Steep Keratometric Axis Sequence", '', 'SteepKeratometricAxisSequence'), # noqa 0x00460075: ('FD', '1', "Radius of Curvature", '', 'RadiusOfCurvature'), # noqa 0x00460076: ('FD', '1', "Keratometric Power", '', 'KeratometricPower'), # noqa 0x00460077: ('FD', '1', "Keratometric Axis", '', 'KeratometricAxis'), # noqa 0x00460080: ('SQ', '1', "Flat Keratometric Axis Sequence", '', 'FlatKeratometricAxisSequence'), # noqa 0x00460092: ('CS', '1', "Background Color", '', 'BackgroundColor'), # noqa 0x00460094: ('CS', '1', "Optotype", '', 'Optotype'), # noqa 0x00460095: ('CS', '1', "Optotype Presentation", '', 'OptotypePresentation'), # noqa 0x00460097: ('SQ', '1', "Subjective Refraction Right Eye Sequence", '', 'SubjectiveRefractionRightEyeSequence'), # noqa 0x00460098: ('SQ', '1', "Subjective Refraction Left Eye Sequence", '', 'SubjectiveRefractionLeftEyeSequence'), # noqa 0x00460100: ('SQ', '1', "Add Near Sequence", '', 'AddNearSequence'), # noqa 0x00460101: ('SQ', '1', "Add Intermediate Sequence", '', 'AddIntermediateSequence'), # noqa 0x00460102: ('SQ', '1', "Add Other Sequence", '', 'AddOtherSequence'), # noqa 0x00460104: ('FD', '1', "Add Power", '', 'AddPower'), # noqa 0x00460106: ('FD', '1', "Viewing Distance", '', 'ViewingDistance'), # noqa 0x00460110: ('SQ', '1', "Cornea Measurements Sequence", '', 'CorneaMeasurementsSequence'), # noqa 0x00460111: ('SQ', '1', "Source of Cornea Measurement Data Code Sequence", '', 'SourceOfCorneaMeasurementDataCodeSequence'), # noqa 0x00460112: ('SQ', '1', "Steep Corneal Axis Sequence", '', 'SteepCornealAxisSequence'), # noqa 0x00460113: ('SQ', '1', "Flat Corneal Axis Sequence", '', 'FlatCornealAxisSequence'), # noqa 0x00460114: ('FD', '1', "Corneal Power", '', 'CornealPower'), # noqa 0x00460115: ('FD', '1', "Corneal Axis", '', 'CornealAxis'), # noqa 0x00460116: ('SQ', '1', "Cornea Measurement Method Code Sequence", '', 'CorneaMeasurementMethodCodeSequence'), # noqa 0x00460117: ('FL', '1', "Refractive Index of Cornea", '', 'RefractiveIndexOfCornea'), # noqa 0x00460118: ('FL', '1', "Refractive Index of Aqueous Humor", '', 'RefractiveIndexOfAqueousHumor'), # noqa 0x00460121: ('SQ', '1', "Visual Acuity Type Code Sequence", '', 'VisualAcuityTypeCodeSequence'), # noqa 0x00460122: ('SQ', '1', "Visual Acuity Right Eye Sequence", '', 'VisualAcuityRightEyeSequence'), # noqa 0x00460123: ('SQ', '1', "Visual Acuity Left Eye Sequence", '', 'VisualAcuityLeftEyeSequence'), # noqa 0x00460124: ('SQ', '1', "Visual Acuity Both Eyes Open Sequence", '', 'VisualAcuityBothEyesOpenSequence'), # noqa 0x00460125: ('CS', '1', "Viewing Distance Type", '', 'ViewingDistanceType'), # noqa 0x00460135: ('SS', '2', "Visual Acuity Modifiers", '', 'VisualAcuityModifiers'), # noqa 0x00460137: ('FD', '1', "Decimal Visual Acuity", '', 'DecimalVisualAcuity'), # noqa 0x00460139: ('LO', '1', "Optotype Detailed Definition", '', 'OptotypeDetailedDefinition'), # noqa 0x00460145: ('SQ', '1', "Referenced Refractive Measurements Sequence", '', 'ReferencedRefractiveMeasurementsSequence'), # noqa 0x00460146: ('FD', '1', "Sphere Power", '', 'SpherePower'), # noqa 0x00460147: ('FD', '1', "Cylinder Power", '', 'CylinderPower'), # noqa 0x00460201: ('CS', '1', "Corneal Topography Surface", '', 'CornealTopographySurface'), # noqa 0x00460202: ('FL', '2', "Corneal Vertex Location", '', 'CornealVertexLocation'), # noqa 0x00460203: ('FL', '1', "Pupil Centroid X-Coordinate", '', 'PupilCentroidXCoordinate'), # noqa 0x00460204: ('FL', '1', "Pupil Centroid Y-Coordinate", '', 'PupilCentroidYCoordinate'), # noqa 0x00460205: ('FL', '1', "Equivalent Pupil Radius", '', 'EquivalentPupilRadius'), # noqa 0x00460207: ('SQ', '1', "Corneal Topography Map Type Code Sequence", '', 'CornealTopographyMapTypeCodeSequence'), # noqa 0x00460208: ('IS', '2-2n', "Vertices of the Outline of Pupil", '', 'VerticesOfTheOutlineOfPupil'), # noqa 0x00460210: ('SQ', '1', "Corneal Topography Mapping Normals Sequence", '', 'CornealTopographyMappingNormalsSequence'), # noqa 0x00460211: ('SQ', '1', "Maximum Corneal Curvature Sequence", '', 'MaximumCornealCurvatureSequence'), # noqa 0x00460212: ('FL', '1', "Maximum Corneal Curvature", '', 'MaximumCornealCurvature'), # noqa 0x00460213: ('FL', '2', "Maximum Corneal Curvature Location", '', 'MaximumCornealCurvatureLocation'), # noqa 0x00460215: ('SQ', '1', "Minimum Keratometric Sequence", '', 'MinimumKeratometricSequence'), # noqa 0x00460218: ('SQ', '1', "Simulated Keratometric Cylinder Sequence", '', 'SimulatedKeratometricCylinderSequence'), # noqa 0x00460220: ('FL', '1', "Average Corneal Power", '', 'AverageCornealPower'), # noqa 0x00460224: ('FL', '1', "Corneal I-S Value", '', 'CornealISValue'), # noqa 0x00460227: ('FL', '1', "Analyzed Area", '', 'AnalyzedArea'), # noqa 0x00460230: ('FL', '1', "Surface Regularity Index", '', 'SurfaceRegularityIndex'), # noqa 0x00460232: ('FL', '1', "Surface Asymmetry Index", '', 'SurfaceAsymmetryIndex'), # noqa 0x00460234: ('FL', '1', "Corneal Eccentricity Index", '', 'CornealEccentricityIndex'), # noqa 0x00460236: ('FL', '1', "Keratoconus Prediction Index", '', 'KeratoconusPredictionIndex'), # noqa 0x00460238: ('FL', '1', "Decimal Potential Visual Acuity", '', 'DecimalPotentialVisualAcuity'), # noqa 0x00460242: ('CS', '1', "Corneal Topography Map Quality Evaluation", '', 'CornealTopographyMapQualityEvaluation'), # noqa 0x00460244: ('SQ', '1', "Source Image Corneal Processed Data Sequence", '', 'SourceImageCornealProcessedDataSequence'), # noqa 0x00460247: ('FL', '3', "Corneal Point Location", '', 'CornealPointLocation'), # noqa 0x00460248: ('CS', '1', "Corneal Point Estimated", '', 'CornealPointEstimated'), # noqa 0x00460249: ('FL', '1', "Axial Power", '', 'AxialPower'), # noqa 0x00460250: ('FL', '1', "Tangential Power", '', 'TangentialPower'), # noqa 0x00460251: ('FL', '1', "Refractive Power", '', 'RefractivePower'), # noqa 0x00460252: ('FL', '1', "Relative Elevation", '', 'RelativeElevation'), # noqa 0x00460253: ('FL', '1', "Corneal Wavefront", '', 'CornealWavefront'), # noqa 0x00480001: ('FL', '1', "Imaged Volume Width", '', 'ImagedVolumeWidth'), # noqa 0x00480002: ('FL', '1', "Imaged Volume Height", '', 'ImagedVolumeHeight'), # noqa 0x00480003: ('FL', '1', "Imaged Volume Depth", '', 'ImagedVolumeDepth'), # noqa 0x00480006: ('UL', '1', "Total Pixel Matrix Columns", '', 'TotalPixelMatrixColumns'), # noqa 0x00480007: ('UL', '1', "Total Pixel Matrix Rows", '', 'TotalPixelMatrixRows'), # noqa 0x00480008: ('SQ', '1', "Total Pixel Matrix Origin Sequence", '', 'TotalPixelMatrixOriginSequence'), # noqa 0x00480010: ('CS', '1', "Specimen Label in Image", '', 'SpecimenLabelInImage'), # noqa 0x00480011: ('CS', '1', "Focus Method", '', 'FocusMethod'), # noqa 0x00480012: ('CS', '1', "Extended Depth of Field", '', 'ExtendedDepthOfField'), # noqa 0x00480013: ('US', '1', "Number of Focal Planes", '', 'NumberOfFocalPlanes'), # noqa 0x00480014: ('FL', '1', "Distance Between Focal Planes", '', 'DistanceBetweenFocalPlanes'), # noqa 0x00480015: ('US', '3', "Recommended Absent Pixel CIELab Value", '', 'RecommendedAbsentPixelCIELabValue'), # noqa 0x00480100: ('SQ', '1', "Illuminator Type Code Sequence", '', 'IlluminatorTypeCodeSequence'), # noqa 0x00480102: ('DS', '6', "Image Orientation (Slide)", '', 'ImageOrientationSlide'), # noqa 0x00480105: ('SQ', '1', "Optical Path Sequence", '', 'OpticalPathSequence'), # noqa 0x00480106: ('SH', '1', "Optical Path Identifier", '', 'OpticalPathIdentifier'), # noqa 0x00480107: ('ST', '1', "Optical Path Description", '', 'OpticalPathDescription'), # noqa 0x00480108: ('SQ', '1', "Illumination Color Code Sequence", '', 'IlluminationColorCodeSequence'), # noqa 0x00480110: ('SQ', '1', "Specimen Reference Sequence", '', 'SpecimenReferenceSequence'), # noqa 0x00480111: ('DS', '1', "Condenser Lens Power", '', 'CondenserLensPower'), # noqa 0x00480112: ('DS', '1', "Objective Lens Power", '', 'ObjectiveLensPower'), # noqa 0x00480113: ('DS', '1', "Objective Lens Numerical Aperture", '', 'ObjectiveLensNumericalAperture'), # noqa 0x00480120: ('SQ', '1', "Palette Color Lookup Table Sequence", '', 'PaletteColorLookupTableSequence'), # noqa 0x00480200: ('SQ', '1', "Referenced Image Navigation Sequence", 'Retired', 'ReferencedImageNavigationSequence'), # noqa 0x00480201: ('US', '2', "Top Left Hand Corner of Localizer Area", 'Retired', 'TopLeftHandCornerOfLocalizerArea'), # noqa 0x00480202: ('US', '2', "Bottom Right Hand Corner of Localizer Area", 'Retired', 'BottomRightHandCornerOfLocalizerArea'), # noqa 0x00480207: ('SQ', '1', "Optical Path Identification Sequence", '', 'OpticalPathIdentificationSequence'), # noqa 0x0048021A: ('SQ', '1', "Plane Position (Slide) Sequence", '', 'PlanePositionSlideSequence'), # noqa 0x0048021E: ('SL', '1', "Column Position In Total Image Pixel Matrix", '', 'ColumnPositionInTotalImagePixelMatrix'), # noqa 0x0048021F: ('SL', '1', "Row Position In Total Image Pixel Matrix", '', 'RowPositionInTotalImagePixelMatrix'), # noqa 0x00480301: ('CS', '1', "Pixel Origin Interpretation", '', 'PixelOriginInterpretation'), # noqa 0x00480302: ('UL', '1', "Number of Optical Paths", '', 'NumberOfOpticalPaths'), # noqa 0x00480303: ('UL', '1', "Total Pixel Matrix Focal Planes", '', 'TotalPixelMatrixFocalPlanes'), # noqa 0x00500004: ('CS', '1', "Calibration Image", '', 'CalibrationImage'), # noqa 0x00500010: ('SQ', '1', "Device Sequence", '', 'DeviceSequence'), # noqa 0x00500012: ('SQ', '1', "Container Component Type Code Sequence", '', 'ContainerComponentTypeCodeSequence'), # noqa 0x00500013: ('FD', '1', "Container Component Thickness", '', 'ContainerComponentThickness'), # noqa 0x00500014: ('DS', '1', "Device Length", '', 'DeviceLength'), # noqa 0x00500015: ('FD', '1', "Container Component Width", '', 'ContainerComponentWidth'), # noqa 0x00500016: ('DS', '1', "Device Diameter", '', 'DeviceDiameter'), # noqa 0x00500017: ('CS', '1', "Device Diameter Units", '', 'DeviceDiameterUnits'), # noqa 0x00500018: ('DS', '1', "Device Volume", '', 'DeviceVolume'), # noqa 0x00500019: ('DS', '1', "Inter-Marker Distance", '', 'InterMarkerDistance'), # noqa 0x0050001A: ('CS', '1', "Container Component Material", '', 'ContainerComponentMaterial'), # noqa 0x0050001B: ('LO', '1', "Container Component ID", '', 'ContainerComponentID'), # noqa 0x0050001C: ('FD', '1', "Container Component Length", '', 'ContainerComponentLength'), # noqa 0x0050001D: ('FD', '1', "Container Component Diameter", '', 'ContainerComponentDiameter'), # noqa 0x0050001E: ('LO', '1', "Container Component Description", '', 'ContainerComponentDescription'), # noqa 0x00500020: ('LO', '1', "Device Description", '', 'DeviceDescription'), # noqa 0x00500021: ('ST', '1', "Long Device Description", '', 'LongDeviceDescription'), # noqa 0x00520001: ('FL', '1', "Contrast/Bolus Ingredient Percent by Volume", '', 'ContrastBolusIngredientPercentByVolume'), # noqa 0x00520002: ('FD', '1', "OCT Focal Distance", '', 'OCTFocalDistance'), # noqa 0x00520003: ('FD', '1', "Beam Spot Size", '', 'BeamSpotSize'), # noqa 0x00520004: ('FD', '1', "Effective Refractive Index", '', 'EffectiveRefractiveIndex'), # noqa 0x00520006: ('CS', '1', "OCT Acquisition Domain", '', 'OCTAcquisitionDomain'), # noqa 0x00520007: ('FD', '1', "OCT Optical Center Wavelength", '', 'OCTOpticalCenterWavelength'), # noqa 0x00520008: ('FD', '1', "Axial Resolution", '', 'AxialResolution'), # noqa 0x00520009: ('FD', '1', "Ranging Depth", '', 'RangingDepth'), # noqa 0x00520011: ('FD', '1', "A-line Rate", '', 'ALineRate'), # noqa 0x00520012: ('US', '1', "A-lines Per Frame", '', 'ALinesPerFrame'), # noqa 0x00520013: ('FD', '1', "Catheter Rotational Rate", '', 'CatheterRotationalRate'), # noqa 0x00520014: ('FD', '1', "A-line Pixel Spacing", '', 'ALinePixelSpacing'), # noqa 0x00520016: ('SQ', '1', "Mode of Percutaneous Access Sequence", '', 'ModeOfPercutaneousAccessSequence'), # noqa 0x00520025: ('SQ', '1', "Intravascular OCT Frame Type Sequence", '', 'IntravascularOCTFrameTypeSequence'), # noqa 0x00520026: ('CS', '1', "OCT Z Offset Applied", '', 'OCTZOffsetApplied'), # noqa 0x00520027: ('SQ', '1', "Intravascular Frame Content Sequence", '', 'IntravascularFrameContentSequence'), # noqa 0x00520028: ('FD', '1', "Intravascular Longitudinal Distance", '', 'IntravascularLongitudinalDistance'), # noqa 0x00520029: ('SQ', '1', "Intravascular OCT Frame Content Sequence", '', 'IntravascularOCTFrameContentSequence'), # noqa 0x00520030: ('SS', '1', "OCT Z Offset Correction", '', 'OCTZOffsetCorrection'), # noqa 0x00520031: ('CS', '1', "Catheter Direction of Rotation", '', 'CatheterDirectionOfRotation'), # noqa 0x00520033: ('FD', '1', "Seam Line Location", '', 'SeamLineLocation'), # noqa 0x00520034: ('FD', '1', "First A-line Location", '', 'FirstALineLocation'), # noqa 0x00520036: ('US', '1', "Seam Line Index", '', 'SeamLineIndex'), # noqa 0x00520038: ('US', '1', "Number of Padded A-lines", '', 'NumberOfPaddedALines'), # noqa 0x00520039: ('CS', '1', "Interpolation Type", '', 'InterpolationType'), # noqa 0x0052003A: ('CS', '1', "Refractive Index Applied", '', 'RefractiveIndexApplied'), # noqa 0x00540010: ('US', '1-n', "Energy Window Vector", '', 'EnergyWindowVector'), # noqa 0x00540011: ('US', '1', "Number of Energy Windows", '', 'NumberOfEnergyWindows'), # noqa 0x00540012: ('SQ', '1', "Energy Window Information Sequence", '', 'EnergyWindowInformationSequence'), # noqa 0x00540013: ('SQ', '1', "Energy Window Range Sequence", '', 'EnergyWindowRangeSequence'), # noqa 0x00540014: ('DS', '1', "Energy Window Lower Limit", '', 'EnergyWindowLowerLimit'), # noqa 0x00540015: ('DS', '1', "Energy Window Upper Limit", '', 'EnergyWindowUpperLimit'), # noqa 0x00540016: ('SQ', '1', "Radiopharmaceutical Information Sequence", '', 'RadiopharmaceuticalInformationSequence'), # noqa 0x00540017: ('IS', '1', "Residual Syringe Counts", '', 'ResidualSyringeCounts'), # noqa 0x00540018: ('SH', '1', "Energy Window Name", '', 'EnergyWindowName'), # noqa 0x00540020: ('US', '1-n', "Detector Vector", '', 'DetectorVector'), # noqa 0x00540021: ('US', '1', "Number of Detectors", '', 'NumberOfDetectors'), # noqa 0x00540022: ('SQ', '1', "Detector Information Sequence", '', 'DetectorInformationSequence'), # noqa 0x00540030: ('US', '1-n', "Phase Vector", '', 'PhaseVector'), # noqa 0x00540031: ('US', '1', "Number of Phases", '', 'NumberOfPhases'), # noqa 0x00540032: ('SQ', '1', "Phase Information Sequence", '', 'PhaseInformationSequence'), # noqa 0x00540033: ('US', '1', "Number of Frames in Phase", '', 'NumberOfFramesInPhase'), # noqa 0x00540036: ('IS', '1', "Phase Delay", '', 'PhaseDelay'), # noqa 0x00540038: ('IS', '1', "Pause Between Frames", '', 'PauseBetweenFrames'), # noqa 0x00540039: ('CS', '1', "Phase Description", '', 'PhaseDescription'), # noqa 0x00540050: ('US', '1-n', "Rotation Vector", '', 'RotationVector'), # noqa 0x00540051: ('US', '1', "Number of Rotations", '', 'NumberOfRotations'), # noqa 0x00540052: ('SQ', '1', "Rotation Information Sequence", '', 'RotationInformationSequence'), # noqa 0x00540053: ('US', '1', "Number of Frames in Rotation", '', 'NumberOfFramesInRotation'), # noqa 0x00540060: ('US', '1-n', "R-R Interval Vector", '', 'RRIntervalVector'), # noqa 0x00540061: ('US', '1', "Number of R-R Intervals", '', 'NumberOfRRIntervals'), # noqa 0x00540062: ('SQ', '1', "Gated Information Sequence", '', 'GatedInformationSequence'), # noqa 0x00540063: ('SQ', '1', "Data Information Sequence", '', 'DataInformationSequence'), # noqa 0x00540070: ('US', '1-n', "Time Slot Vector", '', 'TimeSlotVector'), # noqa 0x00540071: ('US', '1', "Number of Time Slots", '', 'NumberOfTimeSlots'), # noqa 0x00540072: ('SQ', '1', "Time Slot Information Sequence", '', 'TimeSlotInformationSequence'), # noqa 0x00540073: ('DS', '1', "Time Slot Time", '', 'TimeSlotTime'), # noqa 0x00540080: ('US', '1-n', "Slice Vector", '', 'SliceVector'), # noqa 0x00540081: ('US', '1', "Number of Slices", '', 'NumberOfSlices'), # noqa 0x00540090: ('US', '1-n', "Angular View Vector", '', 'AngularViewVector'), # noqa 0x00540100: ('US', '1-n', "Time Slice Vector", '', 'TimeSliceVector'), # noqa 0x00540101: ('US', '1', "Number of Time Slices", '', 'NumberOfTimeSlices'), # noqa 0x00540200: ('DS', '1', "Start Angle", '', 'StartAngle'), # noqa 0x00540202: ('CS', '1', "Type of Detector Motion", '', 'TypeOfDetectorMotion'), # noqa 0x00540210: ('IS', '1-n', "Trigger Vector", '', 'TriggerVector'), # noqa 0x00540211: ('US', '1', "Number of Triggers in Phase", '', 'NumberOfTriggersInPhase'), # noqa 0x00540220: ('SQ', '1', "View Code Sequence", '', 'ViewCodeSequence'), # noqa 0x00540222: ('SQ', '1', "View Modifier Code Sequence", '', 'ViewModifierCodeSequence'), # noqa 0x00540300: ('SQ', '1', "Radionuclide Code Sequence", '', 'RadionuclideCodeSequence'), # noqa 0x00540302: ('SQ', '1', "Administration Route Code Sequence", '', 'AdministrationRouteCodeSequence'), # noqa 0x00540304: ('SQ', '1', "Radiopharmaceutical Code Sequence", '', 'RadiopharmaceuticalCodeSequence'), # noqa 0x00540306: ('SQ', '1', "Calibration Data Sequence", '', 'CalibrationDataSequence'), # noqa 0x00540308: ('US', '1', "Energy Window Number", '', 'EnergyWindowNumber'), # noqa 0x00540400: ('SH', '1', "Image ID", '', 'ImageID'), # noqa 0x00540410: ('SQ', '1', "Patient Orientation Code Sequence", '', 'PatientOrientationCodeSequence'), # noqa 0x00540412: ('SQ', '1', "Patient Orientation Modifier Code Sequence", '', 'PatientOrientationModifierCodeSequence'), # noqa 0x00540414: ('SQ', '1', "Patient Gantry Relationship Code Sequence", '', 'PatientGantryRelationshipCodeSequence'), # noqa 0x00540500: ('CS', '1', "Slice Progression Direction", '', 'SliceProgressionDirection'), # noqa 0x00540501: ('CS', '1', "Scan Progression Direction", '', 'ScanProgressionDirection'), # noqa 0x00541000: ('CS', '2', "Series Type", '', 'SeriesType'), # noqa 0x00541001: ('CS', '1', "Units", '', 'Units'), # noqa 0x00541002: ('CS', '1', "Counts Source", '', 'CountsSource'), # noqa 0x00541004: ('CS', '1', "Reprojection Method", '', 'ReprojectionMethod'), # noqa 0x00541006: ('CS', '1', "SUV Type", '', 'SUVType'), # noqa 0x00541100: ('CS', '1', "Randoms Correction Method", '', 'RandomsCorrectionMethod'), # noqa 0x00541101: ('LO', '1', "Attenuation Correction Method", '', 'AttenuationCorrectionMethod'), # noqa 0x00541102: ('CS', '1', "Decay Correction", '', 'DecayCorrection'), # noqa 0x00541103: ('LO', '1', "Reconstruction Method", '', 'ReconstructionMethod'), # noqa 0x00541104: ('LO', '1', "Detector Lines of Response Used", '', 'DetectorLinesOfResponseUsed'), # noqa 0x00541105: ('LO', '1', "Scatter Correction Method", '', 'ScatterCorrectionMethod'), # noqa 0x00541200: ('DS', '1', "Axial Acceptance", '', 'AxialAcceptance'), # noqa 0x00541201: ('IS', '2', "Axial Mash", '', 'AxialMash'), # noqa 0x00541202: ('IS', '1', "Transverse Mash", '', 'TransverseMash'), # noqa 0x00541203: ('DS', '2', "Detector Element Size", '', 'DetectorElementSize'), # noqa 0x00541210: ('DS', '1', "Coincidence Window Width", '', 'CoincidenceWindowWidth'), # noqa 0x00541220: ('CS', '1-n', "Secondary Counts Type", '', 'SecondaryCountsType'), # noqa 0x00541300: ('DS', '1', "Frame Reference Time", '', 'FrameReferenceTime'), # noqa 0x00541310: ('IS', '1', "Primary (Prompts) Counts Accumulated", '', 'PrimaryPromptsCountsAccumulated'), # noqa 0x00541311: ('IS', '1-n', "Secondary Counts Accumulated", '', 'SecondaryCountsAccumulated'), # noqa 0x00541320: ('DS', '1', "Slice Sensitivity Factor", '', 'SliceSensitivityFactor'), # noqa 0x00541321: ('DS', '1', "Decay Factor", '', 'DecayFactor'), # noqa 0x00541322: ('DS', '1', "Dose Calibration Factor", '', 'DoseCalibrationFactor'), # noqa 0x00541323: ('DS', '1', "Scatter Fraction Factor", '', 'ScatterFractionFactor'), # noqa 0x00541324: ('DS', '1', "Dead Time Factor", '', 'DeadTimeFactor'), # noqa 0x00541330: ('US', '1', "Image Index", '', 'ImageIndex'), # noqa 0x00541400: ('CS', '1-n', "Counts Included", 'Retired', 'CountsIncluded'), # noqa 0x00541401: ('CS', '1', "Dead Time Correction Flag", 'Retired', 'DeadTimeCorrectionFlag'), # noqa 0x00603000: ('SQ', '1', "Histogram Sequence", '', 'HistogramSequence'), # noqa 0x00603002: ('US', '1', "Histogram Number of Bins", '', 'HistogramNumberOfBins'), # noqa 0x00603004: ('US or SS', '1', "Histogram First Bin Value", '', 'HistogramFirstBinValue'), # noqa 0x00603006: ('US or SS', '1', "Histogram Last Bin Value", '', 'HistogramLastBinValue'), # noqa 0x00603008: ('US', '1', "Histogram Bin Width", '', 'HistogramBinWidth'), # noqa 0x00603010: ('LO', '1', "Histogram Explanation", '', 'HistogramExplanation'), # noqa 0x00603020: ('UL', '1-n', "Histogram Data", '', 'HistogramData'), # noqa 0x00620001: ('CS', '1', "Segmentation Type", '', 'SegmentationType'), # noqa 0x00620002: ('SQ', '1', "Segment Sequence", '', 'SegmentSequence'), # noqa 0x00620003: ('SQ', '1', "Segmented Property Category Code Sequence", '', 'SegmentedPropertyCategoryCodeSequence'), # noqa 0x00620004: ('US', '1', "Segment Number", '', 'SegmentNumber'), # noqa 0x00620005: ('LO', '1', "Segment Label", '', 'SegmentLabel'), # noqa 0x00620006: ('ST', '1', "Segment Description", '', 'SegmentDescription'), # noqa 0x00620007: ('SQ', '1', "Segmentation Algorithm Identification Sequence", '', 'SegmentationAlgorithmIdentificationSequence'), # noqa 0x00620008: ('CS', '1', "Segment Algorithm Type", '', 'SegmentAlgorithmType'), # noqa 0x00620009: ('LO', '1-n', "Segment Algorithm Name", '', 'SegmentAlgorithmName'), # noqa 0x0062000A: ('SQ', '1', "Segment Identification Sequence", '', 'SegmentIdentificationSequence'), # noqa 0x0062000B: ('US', '1-n', "Referenced Segment Number", '', 'ReferencedSegmentNumber'), # noqa 0x0062000C: ('US', '1', "Recommended Display Grayscale Value", '', 'RecommendedDisplayGrayscaleValue'), # noqa 0x0062000D: ('US', '3', "Recommended Display CIELab Value", '', 'RecommendedDisplayCIELabValue'), # noqa 0x0062000E: ('US', '1', "Maximum Fractional Value", '', 'MaximumFractionalValue'), # noqa 0x0062000F: ('SQ', '1', "Segmented Property Type Code Sequence", '', 'SegmentedPropertyTypeCodeSequence'), # noqa 0x00620010: ('CS', '1', "Segmentation Fractional Type", '', 'SegmentationFractionalType'), # noqa 0x00620011: ('SQ', '1', "Segmented Property Type Modifier Code Sequence", '', 'SegmentedPropertyTypeModifierCodeSequence'), # noqa 0x00620012: ('SQ', '1', "Used Segments Sequence", '', 'UsedSegmentsSequence'), # noqa 0x00620013: ('CS', '1', "Segments Overlap", '', 'SegmentsOverlap'), # noqa 0x00620020: ('UT', '1', "Tracking ID", '', 'TrackingID'), # noqa 0x00620021: ('UI', '1', "Tracking UID", '', 'TrackingUID'), # noqa 0x00640002: ('SQ', '1', "Deformable Registration Sequence", '', 'DeformableRegistrationSequence'), # noqa 0x00640003: ('UI', '1', "Source Frame of Reference UID", '', 'SourceFrameOfReferenceUID'), # noqa 0x00640005: ('SQ', '1', "Deformable Registration Grid Sequence", '', 'DeformableRegistrationGridSequence'), # noqa 0x00640007: ('UL', '3', "Grid Dimensions", '', 'GridDimensions'), # noqa 0x00640008: ('FD', '3', "Grid Resolution", '', 'GridResolution'), # noqa 0x00640009: ('OF', '1', "Vector Grid Data", '', 'VectorGridData'), # noqa 0x0064000F: ('SQ', '1', "Pre Deformation Matrix Registration Sequence", '', 'PreDeformationMatrixRegistrationSequence'), # noqa 0x00640010: ('SQ', '1', "Post Deformation Matrix Registration Sequence", '', 'PostDeformationMatrixRegistrationSequence'), # noqa 0x00660001: ('UL', '1', "Number of Surfaces", '', 'NumberOfSurfaces'), # noqa 0x00660002: ('SQ', '1', "Surface Sequence", '', 'SurfaceSequence'), # noqa 0x00660003: ('UL', '1', "Surface Number", '', 'SurfaceNumber'), # noqa 0x00660004: ('LT', '1', "Surface Comments", '', 'SurfaceComments'), # noqa 0x00660009: ('CS', '1', "Surface Processing", '', 'SurfaceProcessing'), # noqa 0x0066000A: ('FL', '1', "Surface Processing Ratio", '', 'SurfaceProcessingRatio'), # noqa 0x0066000B: ('LO', '1', "Surface Processing Description", '', 'SurfaceProcessingDescription'), # noqa 0x0066000C: ('FL', '1', "Recommended Presentation Opacity", '', 'RecommendedPresentationOpacity'), # noqa 0x0066000D: ('CS', '1', "Recommended Presentation Type", '', 'RecommendedPresentationType'), # noqa 0x0066000E: ('CS', '1', "Finite Volume", '', 'FiniteVolume'), # noqa 0x00660010: ('CS', '1', "Manifold", '', 'Manifold'), # noqa 0x00660011: ('SQ', '1', "Surface Points Sequence", '', 'SurfacePointsSequence'), # noqa 0x00660012: ('SQ', '1', "Surface Points Normals Sequence", '', 'SurfacePointsNormalsSequence'), # noqa 0x00660013: ('SQ', '1', "Surface Mesh Primitives Sequence", '', 'SurfaceMeshPrimitivesSequence'), # noqa 0x00660015: ('UL', '1', "Number of Surface Points", '', 'NumberOfSurfacePoints'), # noqa 0x00660016: ('OF', '1', "Point Coordinates Data", '', 'PointCoordinatesData'), # noqa 0x00660017: ('FL', '3', "Point Position Accuracy", '', 'PointPositionAccuracy'), # noqa 0x00660018: ('FL', '1', "Mean Point Distance", '', 'MeanPointDistance'), # noqa 0x00660019: ('FL', '1', "Maximum Point Distance", '', 'MaximumPointDistance'), # noqa 0x0066001A: ('FL', '6', "Points Bounding Box Coordinates", '', 'PointsBoundingBoxCoordinates'), # noqa 0x0066001B: ('FL', '3', "Axis of Rotation", '', 'AxisOfRotation'), # noqa 0x0066001C: ('FL', '3', "Center of Rotation", '', 'CenterOfRotation'), # noqa 0x0066001E: ('UL', '1', "Number of Vectors", '', 'NumberOfVectors'), # noqa 0x0066001F: ('US', '1', "Vector Dimensionality", '', 'VectorDimensionality'), # noqa 0x00660020: ('FL', '1-n', "Vector Accuracy", '', 'VectorAccuracy'), # noqa 0x00660021: ('OF', '1', "Vector Coordinate Data", '', 'VectorCoordinateData'), # noqa 0x00660022: ('OD', '1', "Double Point Coordinates Data", '', 'DoublePointCoordinatesData'), # noqa 0x00660023: ('OW', '1', "Triangle Point Index List", 'Retired', 'TrianglePointIndexList'), # noqa 0x00660024: ('OW', '1', "Edge Point Index List", 'Retired', 'EdgePointIndexList'), # noqa 0x00660025: ('OW', '1', "Vertex Point Index List", 'Retired', 'VertexPointIndexList'), # noqa 0x00660026: ('SQ', '1', "Triangle Strip Sequence", '', 'TriangleStripSequence'), # noqa 0x00660027: ('SQ', '1', "Triangle Fan Sequence", '', 'TriangleFanSequence'), # noqa 0x00660028: ('SQ', '1', "Line Sequence", '', 'LineSequence'), # noqa 0x00660029: ('OW', '1', "Primitive Point Index List", 'Retired', 'PrimitivePointIndexList'), # noqa 0x0066002A: ('UL', '1', "Surface Count", '', 'SurfaceCount'), # noqa 0x0066002B: ('SQ', '1', "Referenced Surface Sequence", '', 'ReferencedSurfaceSequence'), # noqa 0x0066002C: ('UL', '1', "Referenced Surface Number", '', 'ReferencedSurfaceNumber'), # noqa 0x0066002D: ('SQ', '1', "Segment Surface Generation Algorithm Identification Sequence", '', 'SegmentSurfaceGenerationAlgorithmIdentificationSequence'), # noqa 0x0066002E: ('SQ', '1', "Segment Surface Source Instance Sequence", '', 'SegmentSurfaceSourceInstanceSequence'), # noqa 0x0066002F: ('SQ', '1', "Algorithm Family Code Sequence", '', 'AlgorithmFamilyCodeSequence'), # noqa 0x00660030: ('SQ', '1', "Algorithm Name Code Sequence", '', 'AlgorithmNameCodeSequence'), # noqa 0x00660031: ('LO', '1', "Algorithm Version", '', 'AlgorithmVersion'), # noqa 0x00660032: ('LT', '1', "Algorithm Parameters", '', 'AlgorithmParameters'), # noqa 0x00660034: ('SQ', '1', "Facet Sequence", '', 'FacetSequence'), # noqa 0x00660035: ('SQ', '1', "Surface Processing Algorithm Identification Sequence", '', 'SurfaceProcessingAlgorithmIdentificationSequence'), # noqa 0x00660036: ('LO', '1', "Algorithm Name", '', 'AlgorithmName'), # noqa 0x00660037: ('FL', '1', "Recommended Point Radius", '', 'RecommendedPointRadius'), # noqa 0x00660038: ('FL', '1', "Recommended Line Thickness", '', 'RecommendedLineThickness'), # noqa 0x00660040: ('OL', '1', "Long Primitive Point Index List", '', 'LongPrimitivePointIndexList'), # noqa 0x00660041: ('OL', '1', "Long Triangle Point Index List", '', 'LongTrianglePointIndexList'), # noqa 0x00660042: ('OL', '1', "Long Edge Point Index List", '', 'LongEdgePointIndexList'), # noqa 0x00660043: ('OL', '1', "Long Vertex Point Index List", '', 'LongVertexPointIndexList'), # noqa 0x00660101: ('SQ', '1', "Track Set Sequence", '', 'TrackSetSequence'), # noqa 0x00660102: ('SQ', '1', "Track Sequence", '', 'TrackSequence'), # noqa 0x00660103: ('OW', '1', "Recommended Display CIELab Value List", '', 'RecommendedDisplayCIELabValueList'), # noqa 0x00660104: ('SQ', '1', "Tracking Algorithm Identification Sequence", '', 'TrackingAlgorithmIdentificationSequence'), # noqa 0x00660105: ('UL', '1', "Track Set Number", '', 'TrackSetNumber'), # noqa 0x00660106: ('LO', '1', "Track Set Label", '', 'TrackSetLabel'), # noqa 0x00660107: ('UT', '1', "Track Set Description", '', 'TrackSetDescription'), # noqa 0x00660108: ('SQ', '1', "Track Set Anatomical Type Code Sequence", '', 'TrackSetAnatomicalTypeCodeSequence'), # noqa 0x00660121: ('SQ', '1', "Measurements Sequence", '', 'MeasurementsSequence'), # noqa 0x00660124: ('SQ', '1', "Track Set Statistics Sequence", '', 'TrackSetStatisticsSequence'), # noqa 0x00660125: ('OF', '1', "Floating Point Values", '', 'FloatingPointValues'), # noqa 0x00660129: ('OL', '1', "Track Point Index List", '', 'TrackPointIndexList'), # noqa 0x00660130: ('SQ', '1', "Track Statistics Sequence", '', 'TrackStatisticsSequence'), # noqa 0x00660132: ('SQ', '1', "Measurement Values Sequence", '', 'MeasurementValuesSequence'), # noqa 0x00660133: ('SQ', '1', "Diffusion Acquisition Code Sequence", '', 'DiffusionAcquisitionCodeSequence'), # noqa 0x00660134: ('SQ', '1', "Diffusion Model Code Sequence", '', 'DiffusionModelCodeSequence'), # noqa 0x00686210: ('LO', '1', "Implant Size", '', 'ImplantSize'), # noqa 0x00686221: ('LO', '1', "Implant Template Version", '', 'ImplantTemplateVersion'), # noqa 0x00686222: ('SQ', '1', "Replaced Implant Template Sequence", '', 'ReplacedImplantTemplateSequence'), # noqa 0x00686223: ('CS', '1', "Implant Type", '', 'ImplantType'), # noqa 0x00686224: ('SQ', '1', "Derivation Implant Template Sequence", '', 'DerivationImplantTemplateSequence'), # noqa 0x00686225: ('SQ', '1', "Original Implant Template Sequence", '', 'OriginalImplantTemplateSequence'), # noqa 0x00686226: ('DT', '1', "Effective DateTime", '', 'EffectiveDateTime'), # noqa 0x00686230: ('SQ', '1', "Implant Target Anatomy Sequence", '', 'ImplantTargetAnatomySequence'), # noqa 0x00686260: ('SQ', '1', "Information From Manufacturer Sequence", '', 'InformationFromManufacturerSequence'), # noqa 0x00686265: ('SQ', '1', "Notification From Manufacturer Sequence", '', 'NotificationFromManufacturerSequence'), # noqa 0x00686270: ('DT', '1', "Information Issue DateTime", '', 'InformationIssueDateTime'), # noqa 0x00686280: ('ST', '1', "Information Summary", '', 'InformationSummary'), # noqa 0x006862A0: ('SQ', '1', "Implant Regulatory Disapproval Code Sequence", '', 'ImplantRegulatoryDisapprovalCodeSequence'), # noqa 0x006862A5: ('FD', '1', "Overall Template Spatial Tolerance", '', 'OverallTemplateSpatialTolerance'), # noqa 0x006862C0: ('SQ', '1', "HPGL Document Sequence", '', 'HPGLDocumentSequence'), # noqa 0x006862D0: ('US', '1', "HPGL Document ID", '', 'HPGLDocumentID'), # noqa 0x006862D5: ('LO', '1', "HPGL Document Label", '', 'HPGLDocumentLabel'), # noqa 0x006862E0: ('SQ', '1', "View Orientation Code Sequence", '', 'ViewOrientationCodeSequence'), # noqa 0x006862F0: ('SQ', '1', "View Orientation Modifier Code Sequence", '', 'ViewOrientationModifierCodeSequence'), # noqa 0x006862F2: ('FD', '1', "HPGL Document Scaling", '', 'HPGLDocumentScaling'), # noqa 0x00686300: ('OB', '1', "HPGL Document", '', 'HPGLDocument'), # noqa 0x00686310: ('US', '1', "HPGL Contour Pen Number", '', 'HPGLContourPenNumber'), # noqa 0x00686320: ('SQ', '1', "HPGL Pen Sequence", '', 'HPGLPenSequence'), # noqa 0x00686330: ('US', '1', "HPGL Pen Number", '', 'HPGLPenNumber'), # noqa 0x00686340: ('LO', '1', "HPGL Pen Label", '', 'HPGLPenLabel'), # noqa 0x00686345: ('ST', '1', "HPGL Pen Description", '', 'HPGLPenDescription'), # noqa 0x00686346: ('FD', '2', "Recommended Rotation Point", '', 'RecommendedRotationPoint'), # noqa 0x00686347: ('FD', '4', "Bounding Rectangle", '', 'BoundingRectangle'), # noqa 0x00686350: ('US', '1-n', "Implant Template 3D Model Surface Number", '', 'ImplantTemplate3DModelSurfaceNumber'), # noqa 0x00686360: ('SQ', '1', "Surface Model Description Sequence", '', 'SurfaceModelDescriptionSequence'), # noqa 0x00686380: ('LO', '1', "Surface Model Label", '', 'SurfaceModelLabel'), # noqa 0x00686390: ('FD', '1', "Surface Model Scaling Factor", '', 'SurfaceModelScalingFactor'), # noqa 0x006863A0: ('SQ', '1', "Materials Code Sequence", '', 'MaterialsCodeSequence'), # noqa 0x006863A4: ('SQ', '1', "Coating Materials Code Sequence", '', 'CoatingMaterialsCodeSequence'), # noqa 0x006863A8: ('SQ', '1', "Implant Type Code Sequence", '', 'ImplantTypeCodeSequence'), # noqa 0x006863AC: ('SQ', '1', "Fixation Method Code Sequence", '', 'FixationMethodCodeSequence'), # noqa 0x006863B0: ('SQ', '1', "Mating Feature Sets Sequence", '', 'MatingFeatureSetsSequence'), # noqa 0x006863C0: ('US', '1', "Mating Feature Set ID", '', 'MatingFeatureSetID'), # noqa 0x006863D0: ('LO', '1', "Mating Feature Set Label", '', 'MatingFeatureSetLabel'), # noqa 0x006863E0: ('SQ', '1', "Mating Feature Sequence", '', 'MatingFeatureSequence'), # noqa 0x006863F0: ('US', '1', "Mating Feature ID", '', 'MatingFeatureID'), # noqa 0x00686400: ('SQ', '1', "Mating Feature Degree of Freedom Sequence", '', 'MatingFeatureDegreeOfFreedomSequence'), # noqa 0x00686410: ('US', '1', "Degree of Freedom ID", '', 'DegreeOfFreedomID'), # noqa 0x00686420: ('CS', '1', "Degree of Freedom Type", '', 'DegreeOfFreedomType'), # noqa 0x00686430: ('SQ', '1', "2D Mating Feature Coordinates Sequence", '', 'TwoDMatingFeatureCoordinatesSequence'), # noqa 0x00686440: ('US', '1', "Referenced HPGL Document ID", '', 'ReferencedHPGLDocumentID'), # noqa 0x00686450: ('FD', '2', "2D Mating Point", '', 'TwoDMatingPoint'), # noqa 0x00686460: ('FD', '4', "2D Mating Axes", '', 'TwoDMatingAxes'), # noqa 0x00686470: ('SQ', '1', "2D Degree of Freedom Sequence", '', 'TwoDDegreeOfFreedomSequence'), # noqa 0x00686490: ('FD', '3', "3D Degree of Freedom Axis", '', 'ThreeDDegreeOfFreedomAxis'), # noqa 0x006864A0: ('FD', '2', "Range of Freedom", '', 'RangeOfFreedom'), # noqa 0x006864C0: ('FD', '3', "3D Mating Point", '', 'ThreeDMatingPoint'), # noqa 0x006864D0: ('FD', '9', "3D Mating Axes", '', 'ThreeDMatingAxes'), # noqa 0x006864F0: ('FD', '3', "2D Degree of Freedom Axis", '', 'TwoDDegreeOfFreedomAxis'), # noqa 0x00686500: ('SQ', '1', "Planning Landmark Point Sequence", '', 'PlanningLandmarkPointSequence'), # noqa 0x00686510: ('SQ', '1', "Planning Landmark Line Sequence", '', 'PlanningLandmarkLineSequence'), # noqa 0x00686520: ('SQ', '1', "Planning Landmark Plane Sequence", '', 'PlanningLandmarkPlaneSequence'), # noqa 0x00686530: ('US', '1', "Planning Landmark ID", '', 'PlanningLandmarkID'), # noqa 0x00686540: ('LO', '1', "Planning Landmark Description", '', 'PlanningLandmarkDescription'), # noqa 0x00686545: ('SQ', '1', "Planning Landmark Identification Code Sequence", '', 'PlanningLandmarkIdentificationCodeSequence'), # noqa 0x00686550: ('SQ', '1', "2D Point Coordinates Sequence", '', 'TwoDPointCoordinatesSequence'), # noqa 0x00686560: ('FD', '2', "2D Point Coordinates", '', 'TwoDPointCoordinates'), # noqa 0x00686590: ('FD', '3', "3D Point Coordinates", '', 'ThreeDPointCoordinates'), # noqa 0x006865A0: ('SQ', '1', "2D Line Coordinates Sequence", '', 'TwoDLineCoordinatesSequence'), # noqa 0x006865B0: ('FD', '4', "2D Line Coordinates", '', 'TwoDLineCoordinates'), # noqa 0x006865D0: ('FD', '6', "3D Line Coordinates", '', 'ThreeDLineCoordinates'), # noqa 0x006865E0: ('SQ', '1', "2D Plane Coordinates Sequence", '', 'TwoDPlaneCoordinatesSequence'), # noqa 0x006865F0: ('FD', '4', "2D Plane Intersection", '', 'TwoDPlaneIntersection'), # noqa 0x00686610: ('FD', '3', "3D Plane Origin", '', 'ThreeDPlaneOrigin'), # noqa 0x00686620: ('FD', '3', "3D Plane Normal", '', 'ThreeDPlaneNormal'), # noqa 0x00687001: ('CS', '1', "Model Modification", '', 'ModelModification'), # noqa 0x00687002: ('CS', '1', "Model Mirroring", '', 'ModelMirroring'), # noqa 0x00687003: ('SQ', '1', "Model Usage Code Sequence", '', 'ModelUsageCodeSequence'), # noqa 0x00687004: ('UI', '1', "Model Group UID", '', 'ModelGroupUID'), # noqa 0x00687005: ('UR', '1', "Relative URI Reference Within Encapsulated Document", '', 'RelativeURIReferenceWithinEncapsulatedDocument'), # noqa 0x006A0001: ('CS', '1', "Annotation Coordinate Type", '', 'AnnotationCoordinateType'), # noqa 0x006A0002: ('SQ', '1', "Annotation Group Sequence", '', 'AnnotationGroupSequence'), # noqa 0x006A0003: ('UI', '1', "Annotation Group UID", '', 'AnnotationGroupUID'), # noqa 0x006A0005: ('LO', '1', "Annotation Group Label", '', 'AnnotationGroupLabel'), # noqa 0x006A0006: ('UT', '1', "Annotation Group Description", '', 'AnnotationGroupDescription'), # noqa 0x006A0007: ('CS', '1', "Annotation Group Generation Type", '', 'AnnotationGroupGenerationType'), # noqa 0x006A0008: ('SQ', '1', "Annotation Group Algorithm Identification Sequence", '', 'AnnotationGroupAlgorithmIdentificationSequence'), # noqa 0x006A0009: ('SQ', '1', "Annotation Property Category Code Sequence", '', 'AnnotationPropertyCategoryCodeSequence'), # noqa 0x006A000A: ('SQ', '1', "Annotation Property Type Code Sequence", '', 'AnnotationPropertyTypeCodeSequence'), # noqa 0x006A000B: ('SQ', '1', "Annotation Property Type Modifier Code Sequence", '', 'AnnotationPropertyTypeModifierCodeSequence'), # noqa 0x006A000C: ('UL', '1', "Number of Annotations", '', 'NumberOfAnnotations'), # noqa 0x006A000D: ('CS', '1', "Annotation Applies to All Optical Paths", '', 'AnnotationAppliesToAllOpticalPaths'), # noqa 0x006A000E: ('SH', '1-n', "Referenced Optical Path Identifier", '', 'ReferencedOpticalPathIdentifier'), # noqa 0x006A000F: ('CS', '1', "Annotation Applies to All Z Planes", '', 'AnnotationAppliesToAllZPlanes'), # noqa 0x006A0010: ('FD', '1-n', "Common Z Coordinate Value", '', 'CommonZCoordinateValue'), # noqa 0x006A0011: ('OL', '1', "Annotation Index List", '', 'AnnotationIndexList'), # noqa 0x00700001: ('SQ', '1', "Graphic Annotation Sequence", '', 'GraphicAnnotationSequence'), # noqa 0x00700002: ('CS', '1', "Graphic Layer", '', 'GraphicLayer'), # noqa 0x00700003: ('CS', '1', "Bounding Box Annotation Units", '', 'BoundingBoxAnnotationUnits'), # noqa 0x00700004: ('CS', '1', "Anchor Point Annotation Units", '', 'AnchorPointAnnotationUnits'), # noqa 0x00700005: ('CS', '1', "Graphic Annotation Units", '', 'GraphicAnnotationUnits'), # noqa 0x00700006: ('ST', '1', "Unformatted Text Value", '', 'UnformattedTextValue'), # noqa 0x00700008: ('SQ', '1', "Text Object Sequence", '', 'TextObjectSequence'), # noqa 0x00700009: ('SQ', '1', "Graphic Object Sequence", '', 'GraphicObjectSequence'), # noqa 0x00700010: ('FL', '2', "Bounding Box Top Left Hand Corner", '', 'BoundingBoxTopLeftHandCorner'), # noqa 0x00700011: ('FL', '2', "Bounding Box Bottom Right Hand Corner", '', 'BoundingBoxBottomRightHandCorner'), # noqa 0x00700012: ('CS', '1', "Bounding Box Text Horizontal Justification", '', 'BoundingBoxTextHorizontalJustification'), # noqa 0x00700014: ('FL', '2', "Anchor Point", '', 'AnchorPoint'), # noqa 0x00700015: ('CS', '1', "Anchor Point Visibility", '', 'AnchorPointVisibility'), # noqa 0x00700020: ('US', '1', "Graphic Dimensions", '', 'GraphicDimensions'), # noqa 0x00700021: ('US', '1', "Number of Graphic Points", '', 'NumberOfGraphicPoints'), # noqa 0x00700022: ('FL', '2-n', "Graphic Data", '', 'GraphicData'), # noqa 0x00700023: ('CS', '1', "Graphic Type", '', 'GraphicType'), # noqa 0x00700024: ('CS', '1', "Graphic Filled", '', 'GraphicFilled'), # noqa 0x00700040: ('IS', '1', "Image Rotation (Retired)", 'Retired', 'ImageRotationRetired'), # noqa 0x00700041: ('CS', '1', "Image Horizontal Flip", '', 'ImageHorizontalFlip'), # noqa 0x00700042: ('US', '1', "Image Rotation", '', 'ImageRotation'), # noqa 0x00700050: ('US', '2', "Displayed Area Top Left Hand Corner (Trial)", 'Retired', 'DisplayedAreaTopLeftHandCornerTrial'), # noqa 0x00700051: ('US', '2', "Displayed Area Bottom Right Hand Corner (Trial)", 'Retired', 'DisplayedAreaBottomRightHandCornerTrial'), # noqa 0x00700052: ('SL', '2', "Displayed Area Top Left Hand Corner", '', 'DisplayedAreaTopLeftHandCorner'), # noqa 0x00700053: ('SL', '2', "Displayed Area Bottom Right Hand Corner", '', 'DisplayedAreaBottomRightHandCorner'), # noqa 0x0070005A: ('SQ', '1', "Displayed Area Selection Sequence", '', 'DisplayedAreaSelectionSequence'), # noqa 0x00700060: ('SQ', '1', "Graphic Layer Sequence", '', 'GraphicLayerSequence'), # noqa 0x00700062: ('IS', '1', "Graphic Layer Order", '', 'GraphicLayerOrder'), # noqa 0x00700066: ('US', '1', "Graphic Layer Recommended Display Grayscale Value", '', 'GraphicLayerRecommendedDisplayGrayscaleValue'), # noqa 0x00700067: ('US', '3', "Graphic Layer Recommended Display RGB Value", 'Retired', 'GraphicLayerRecommendedDisplayRGBValue'), # noqa 0x00700068: ('LO', '1', "Graphic Layer Description", '', 'GraphicLayerDescription'), # noqa 0x00700080: ('CS', '1', "Content Label", '', 'ContentLabel'), # noqa 0x00700081: ('LO', '1', "Content Description", '', 'ContentDescription'), # noqa 0x00700082: ('DA', '1', "Presentation Creation Date", '', 'PresentationCreationDate'), # noqa 0x00700083: ('TM', '1', "Presentation Creation Time", '', 'PresentationCreationTime'), # noqa 0x00700084: ('PN', '1', "Content Creator's Name", '', 'ContentCreatorName'), # noqa 0x00700086: ('SQ', '1', "Content Creator's Identification Code Sequence", '', 'ContentCreatorIdentificationCodeSequence'), # noqa 0x00700087: ('SQ', '1', "Alternate Content Description Sequence", '', 'AlternateContentDescriptionSequence'), # noqa 0x00700100: ('CS', '1', "Presentation Size Mode", '', 'PresentationSizeMode'), # noqa 0x00700101: ('DS', '2', "Presentation Pixel Spacing", '', 'PresentationPixelSpacing'), # noqa 0x00700102: ('IS', '2', "Presentation Pixel Aspect Ratio", '', 'PresentationPixelAspectRatio'), # noqa 0x00700103: ('FL', '1', "Presentation Pixel Magnification Ratio", '', 'PresentationPixelMagnificationRatio'), # noqa 0x00700207: ('LO', '1', "Graphic Group Label", '', 'GraphicGroupLabel'), # noqa 0x00700208: ('ST', '1', "Graphic Group Description", '', 'GraphicGroupDescription'), # noqa 0x00700209: ('SQ', '1', "Compound Graphic Sequence", '', 'CompoundGraphicSequence'), # noqa 0x00700226: ('UL', '1', "Compound Graphic Instance ID", '', 'CompoundGraphicInstanceID'), # noqa 0x00700227: ('LO', '1', "Font Name", '', 'FontName'), # noqa 0x00700228: ('CS', '1', "Font Name Type", '', 'FontNameType'), # noqa 0x00700229: ('LO', '1', "CSS Font Name", '', 'CSSFontName'), # noqa 0x00700230: ('FD', '1', "Rotation Angle", '', 'RotationAngle'), # noqa 0x00700231: ('SQ', '1', "Text Style Sequence", '', 'TextStyleSequence'), # noqa 0x00700232: ('SQ', '1', "Line Style Sequence", '', 'LineStyleSequence'), # noqa 0x00700233: ('SQ', '1', "Fill Style Sequence", '', 'FillStyleSequence'), # noqa 0x00700234: ('SQ', '1', "Graphic Group Sequence", '', 'GraphicGroupSequence'), # noqa 0x00700241: ('US', '3', "Text Color CIELab Value", '', 'TextColorCIELabValue'), # noqa 0x00700242: ('CS', '1', "Horizontal Alignment", '', 'HorizontalAlignment'), # noqa 0x00700243: ('CS', '1', "Vertical Alignment", '', 'VerticalAlignment'), # noqa 0x00700244: ('CS', '1', "Shadow Style", '', 'ShadowStyle'), # noqa 0x00700245: ('FL', '1', "Shadow Offset X", '', 'ShadowOffsetX'), # noqa 0x00700246: ('FL', '1', "Shadow Offset Y", '', 'ShadowOffsetY'), # noqa 0x00700247: ('US', '3', "Shadow Color CIELab Value", '', 'ShadowColorCIELabValue'), # noqa 0x00700248: ('CS', '1', "Underlined", '', 'Underlined'), # noqa 0x00700249: ('CS', '1', "Bold", '', 'Bold'), # noqa 0x00700250: ('CS', '1', "Italic", '', 'Italic'), # noqa 0x00700251: ('US', '3', "Pattern On Color CIELab Value", '', 'PatternOnColorCIELabValue'), # noqa 0x00700252: ('US', '3', "Pattern Off Color CIELab Value", '', 'PatternOffColorCIELabValue'), # noqa 0x00700253: ('FL', '1', "Line Thickness", '', 'LineThickness'), # noqa 0x00700254: ('CS', '1', "Line Dashing Style", '', 'LineDashingStyle'), # noqa 0x00700255: ('UL', '1', "Line Pattern", '', 'LinePattern'), # noqa 0x00700256: ('OB', '1', "Fill Pattern", '', 'FillPattern'), # noqa 0x00700257: ('CS', '1', "Fill Mode", '', 'FillMode'), # noqa 0x00700258: ('FL', '1', "Shadow Opacity", '', 'ShadowOpacity'), # noqa 0x00700261: ('FL', '1', "Gap Length", '', 'GapLength'), # noqa 0x00700262: ('FL', '1', "Diameter of Visibility", '', 'DiameterOfVisibility'), # noqa 0x00700273: ('FL', '2', "Rotation Point", '', 'RotationPoint'), # noqa 0x00700274: ('CS', '1', "Tick Alignment", '', 'TickAlignment'), # noqa 0x00700278: ('CS', '1', "Show Tick Label", '', 'ShowTickLabel'), # noqa 0x00700279: ('CS', '1', "Tick Label Alignment", '', 'TickLabelAlignment'), # noqa 0x00700282: ('CS', '1', "Compound Graphic Units", '', 'CompoundGraphicUnits'), # noqa 0x00700284: ('FL', '1', "Pattern On Opacity", '', 'PatternOnOpacity'), # noqa 0x00700285: ('FL', '1', "Pattern Off Opacity", '', 'PatternOffOpacity'), # noqa 0x00700287: ('SQ', '1', "Major Ticks Sequence", '', 'MajorTicksSequence'), # noqa 0x00700288: ('FL', '1', "Tick Position", '', 'TickPosition'), # noqa 0x00700289: ('SH', '1', "Tick Label", '', 'TickLabel'), # noqa 0x00700294: ('CS', '1', "Compound Graphic Type", '', 'CompoundGraphicType'), # noqa 0x00700295: ('UL', '1', "Graphic Group ID", '', 'GraphicGroupID'), # noqa 0x00700306: ('CS', '1', "Shape Type", '', 'ShapeType'), # noqa 0x00700308: ('SQ', '1', "Registration Sequence", '', 'RegistrationSequence'), # noqa 0x00700309: ('SQ', '1', "Matrix Registration Sequence", '', 'MatrixRegistrationSequence'), # noqa 0x0070030A: ('SQ', '1', "Matrix Sequence", '', 'MatrixSequence'), # noqa 0x0070030B: ('FD', '16', "Frame of Reference to Displayed Coordinate System Transformation Matrix", '', 'FrameOfReferenceToDisplayedCoordinateSystemTransformationMatrix'), # noqa 0x0070030C: ('CS', '1', "Frame of Reference Transformation Matrix Type", '', 'FrameOfReferenceTransformationMatrixType'), # noqa 0x0070030D: ('SQ', '1', "Registration Type Code Sequence", '', 'RegistrationTypeCodeSequence'), # noqa 0x0070030F: ('ST', '1', "Fiducial Description", '', 'FiducialDescription'), # noqa 0x00700310: ('SH', '1', "Fiducial Identifier", '', 'FiducialIdentifier'), # noqa 0x00700311: ('SQ', '1', "Fiducial Identifier Code Sequence", '', 'FiducialIdentifierCodeSequence'), # noqa 0x00700312: ('FD', '1', "Contour Uncertainty Radius", '', 'ContourUncertaintyRadius'), # noqa 0x00700314: ('SQ', '1', "Used Fiducials Sequence", '', 'UsedFiducialsSequence'), # noqa 0x00700315: ('SQ', '1', "Used RT Structure Set ROI Sequence", '', 'UsedRTStructureSetROISequence'), # noqa 0x00700318: ('SQ', '1', "Graphic Coordinates Data Sequence", '', 'GraphicCoordinatesDataSequence'), # noqa 0x0070031A: ('UI', '1', "Fiducial UID", '', 'FiducialUID'), # noqa 0x0070031B: ('UI', '1', "Referenced Fiducial UID", '', 'ReferencedFiducialUID'), # noqa 0x0070031C: ('SQ', '1', "Fiducial Set Sequence", '', 'FiducialSetSequence'), # noqa 0x0070031E: ('SQ', '1', "Fiducial Sequence", '', 'FiducialSequence'), # noqa 0x0070031F: ('SQ', '1', "Fiducials Property Category Code Sequence", '', 'FiducialsPropertyCategoryCodeSequence'), # noqa 0x00700401: ('US', '3', "Graphic Layer Recommended Display CIELab Value", '', 'GraphicLayerRecommendedDisplayCIELabValue'), # noqa 0x00700402: ('SQ', '1', "Blending Sequence", '', 'BlendingSequence'), # noqa 0x00700403: ('FL', '1', "Relative Opacity", '', 'RelativeOpacity'), # noqa 0x00700404: ('SQ', '1', "Referenced Spatial Registration Sequence", '', 'ReferencedSpatialRegistrationSequence'), # noqa 0x00700405: ('CS', '1', "Blending Position", '', 'BlendingPosition'), # noqa 0x00701101: ('UI', '1', "Presentation Display Collection UID", '', 'PresentationDisplayCollectionUID'), # noqa 0x00701102: ('UI', '1', "Presentation Sequence Collection UID", '', 'PresentationSequenceCollectionUID'), # noqa 0x00701103: ('US', '1', "Presentation Sequence Position Index", '', 'PresentationSequencePositionIndex'), # noqa 0x00701104: ('SQ', '1', "Rendered Image Reference Sequence", '', 'RenderedImageReferenceSequence'), # noqa 0x00701201: ('SQ', '1', "Volumetric Presentation State Input Sequence", '', 'VolumetricPresentationStateInputSequence'), # noqa 0x00701202: ('CS', '1', "Presentation Input Type", '', 'PresentationInputType'), # noqa 0x00701203: ('US', '1', "Input Sequence Position Index", '', 'InputSequencePositionIndex'), # noqa 0x00701204: ('CS', '1', "Crop", '', 'Crop'), # noqa 0x00701205: ('US', '1-n', "Cropping Specification Index", '', 'CroppingSpecificationIndex'), # noqa 0x00701206: ('CS', '1', "Compositing Method", 'Retired', 'CompositingMethod'), # noqa 0x00701207: ('US', '1', "Volumetric Presentation Input Number", '', 'VolumetricPresentationInputNumber'), # noqa 0x00701208: ('CS', '1', "Image Volume Geometry", '', 'ImageVolumeGeometry'), # noqa 0x00701209: ('UI', '1', "Volumetric Presentation Input Set UID", '', 'VolumetricPresentationInputSetUID'), # noqa 0x0070120A: ('SQ', '1', "Volumetric Presentation Input Set Sequence", '', 'VolumetricPresentationInputSetSequence'), # noqa 0x0070120B: ('CS', '1', "Global Crop", '', 'GlobalCrop'), # noqa 0x0070120C: ('US', '1-n', "Global Cropping Specification Index", '', 'GlobalCroppingSpecificationIndex'), # noqa 0x0070120D: ('CS', '1', "Rendering Method", '', 'RenderingMethod'), # noqa 0x00701301: ('SQ', '1', "Volume Cropping Sequence", '', 'VolumeCroppingSequence'), # noqa 0x00701302: ('CS', '1', "Volume Cropping Method", '', 'VolumeCroppingMethod'), # noqa 0x00701303: ('FD', '6', "Bounding Box Crop", '', 'BoundingBoxCrop'), # noqa 0x00701304: ('SQ', '1', "Oblique Cropping Plane Sequence", '', 'ObliqueCroppingPlaneSequence'), # noqa 0x00701305: ('FD', '4', "Plane", '', 'Plane'), # noqa 0x00701306: ('FD', '3', "Plane Normal", '', 'PlaneNormal'), # noqa 0x00701309: ('US', '1', "Cropping Specification Number", '', 'CroppingSpecificationNumber'), # noqa 0x00701501: ('CS', '1', "Multi-Planar Reconstruction Style", '', 'MultiPlanarReconstructionStyle'), # noqa 0x00701502: ('CS', '1', "MPR Thickness Type", '', 'MPRThicknessType'), # noqa 0x00701503: ('FD', '1', "MPR Slab Thickness", '', 'MPRSlabThickness'), # noqa 0x00701505: ('FD', '3', "MPR Top Left Hand Corner", '', 'MPRTopLeftHandCorner'), # noqa 0x00701507: ('FD', '3', "MPR View Width Direction", '', 'MPRViewWidthDirection'), # noqa 0x00701508: ('FD', '1', "MPR View Width", '', 'MPRViewWidth'), # noqa 0x0070150C: ('UL', '1', "Number of Volumetric Curve Points", '', 'NumberOfVolumetricCurvePoints'), # noqa 0x0070150D: ('OD', '1', "Volumetric Curve Points", '', 'VolumetricCurvePoints'), # noqa 0x00701511: ('FD', '3', "MPR View Height Direction", '', 'MPRViewHeightDirection'), # noqa 0x00701512: ('FD', '1', "MPR View Height", '', 'MPRViewHeight'), # noqa 0x00701602: ('CS', '1', "Render Projection", '', 'RenderProjection'), # noqa 0x00701603: ('FD', '3', "Viewpoint Position", '', 'ViewpointPosition'), # noqa 0x00701604: ('FD', '3', "Viewpoint LookAt Point", '', 'ViewpointLookAtPoint'), # noqa 0x00701605: ('FD', '3', "Viewpoint Up Direction", '', 'ViewpointUpDirection'), # noqa 0x00701606: ('FD', '6', "Render Field of View", '', 'RenderFieldOfView'), # noqa 0x00701607: ('FD', '1', "Sampling Step Size", '', 'SamplingStepSize'), # noqa 0x00701701: ('CS', '1', "Shading Style", '', 'ShadingStyle'), # noqa 0x00701702: ('FD', '1', "Ambient Reflection Intensity", '', 'AmbientReflectionIntensity'), # noqa 0x00701703: ('FD', '3', "Light Direction", '', 'LightDirection'), # noqa 0x00701704: ('FD', '1', "Diffuse Reflection Intensity", '', 'DiffuseReflectionIntensity'), # noqa 0x00701705: ('FD', '1', "Specular Reflection Intensity", '', 'SpecularReflectionIntensity'), # noqa 0x00701706: ('FD', '1', "Shininess", '', 'Shininess'), # noqa 0x00701801: ('SQ', '1', "Presentation State Classification Component Sequence", '', 'PresentationStateClassificationComponentSequence'), # noqa 0x00701802: ('CS', '1', "Component Type", '', 'ComponentType'), # noqa 0x00701803: ('SQ', '1', "Component Input Sequence", '', 'ComponentInputSequence'), # noqa 0x00701804: ('US', '1', "Volumetric Presentation Input Index", '', 'VolumetricPresentationInputIndex'), # noqa 0x00701805: ('SQ', '1', "Presentation State Compositor Component Sequence", '', 'PresentationStateCompositorComponentSequence'), # noqa 0x00701806: ('SQ', '1', "Weighting Transfer Function Sequence", '', 'WeightingTransferFunctionSequence'), # noqa 0x00701807: ('US', '3', "Weighting Lookup Table Descriptor", '', 'WeightingLookupTableDescriptor'), # noqa 0x00701808: ('OB', '1', "Weighting Lookup Table Data", '', 'WeightingLookupTableData'), # noqa 0x00701901: ('SQ', '1', "Volumetric Annotation Sequence", '', 'VolumetricAnnotationSequence'), # noqa 0x00701903: ('SQ', '1', "Referenced Structured Context Sequence", '', 'ReferencedStructuredContextSequence'), # noqa 0x00701904: ('UI', '1', "Referenced Content Item", '', 'ReferencedContentItem'), # noqa 0x00701905: ('SQ', '1', "Volumetric Presentation Input Annotation Sequence", '', 'VolumetricPresentationInputAnnotationSequence'), # noqa 0x00701907: ('CS', '1', "Annotation Clipping", '', 'AnnotationClipping'), # noqa 0x00701A01: ('CS', '1', "Presentation Animation Style", '', 'PresentationAnimationStyle'), # noqa 0x00701A03: ('FD', '1', "Recommended Animation Rate", '', 'RecommendedAnimationRate'), # noqa 0x00701A04: ('SQ', '1', "Animation Curve Sequence", '', 'AnimationCurveSequence'), # noqa 0x00701A05: ('FD', '1', "Animation Step Size", '', 'AnimationStepSize'), # noqa 0x00701A06: ('FD', '1', "Swivel Range", '', 'SwivelRange'), # noqa 0x00701A07: ('OD', '1', "Volumetric Curve Up Directions", '', 'VolumetricCurveUpDirections'), # noqa 0x00701A08: ('SQ', '1', "Volume Stream Sequence", '', 'VolumeStreamSequence'), # noqa 0x00701A09: ('LO', '1', "RGBA Transfer Function Description", '', 'RGBATransferFunctionDescription'), # noqa 0x00701B01: ('SQ', '1', "Advanced Blending Sequence", '', 'AdvancedBlendingSequence'), # noqa 0x00701B02: ('US', '1', "Blending Input Number", '', 'BlendingInputNumber'), # noqa 0x00701B03: ('SQ', '1', "Blending Display Input Sequence", '', 'BlendingDisplayInputSequence'), # noqa 0x00701B04: ('SQ', '1', "Blending Display Sequence", '', 'BlendingDisplaySequence'), # noqa 0x00701B06: ('CS', '1', "Blending Mode", '', 'BlendingMode'), # noqa 0x00701B07: ('CS', '1', "Time Series Blending", '', 'TimeSeriesBlending'), # noqa 0x00701B08: ('CS', '1', "Geometry for Display", '', 'GeometryForDisplay'), # noqa 0x00701B11: ('SQ', '1', "Threshold Sequence", '', 'ThresholdSequence'), # noqa 0x00701B12: ('SQ', '1', "Threshold Value Sequence", '', 'ThresholdValueSequence'), # noqa 0x00701B13: ('CS', '1', "Threshold Type", '', 'ThresholdType'), # noqa 0x00701B14: ('FD', '1', "Threshold Value", '', 'ThresholdValue'), # noqa 0x00720002: ('SH', '1', "Hanging Protocol Name", '', 'HangingProtocolName'), # noqa 0x00720004: ('LO', '1', "Hanging Protocol Description", '', 'HangingProtocolDescription'), # noqa 0x00720006: ('CS', '1', "Hanging Protocol Level", '', 'HangingProtocolLevel'), # noqa 0x00720008: ('LO', '1', "Hanging Protocol Creator", '', 'HangingProtocolCreator'), # noqa 0x0072000A: ('DT', '1', "Hanging Protocol Creation DateTime", '', 'HangingProtocolCreationDateTime'), # noqa 0x0072000C: ('SQ', '1', "Hanging Protocol Definition Sequence", '', 'HangingProtocolDefinitionSequence'), # noqa 0x0072000E: ('SQ', '1', "Hanging Protocol User Identification Code Sequence", '', 'HangingProtocolUserIdentificationCodeSequence'), # noqa 0x00720010: ('LO', '1', "Hanging Protocol User Group Name", '', 'HangingProtocolUserGroupName'), # noqa 0x00720012: ('SQ', '1', "Source Hanging Protocol Sequence", '', 'SourceHangingProtocolSequence'), # noqa 0x00720014: ('US', '1', "Number of Priors Referenced", '', 'NumberOfPriorsReferenced'), # noqa 0x00720020: ('SQ', '1', "Image Sets Sequence", '', 'ImageSetsSequence'), # noqa 0x00720022: ('SQ', '1', "Image Set Selector Sequence", '', 'ImageSetSelectorSequence'), # noqa 0x00720024: ('CS', '1', "Image Set Selector Usage Flag", '', 'ImageSetSelectorUsageFlag'), # noqa 0x00720026: ('AT', '1', "Selector Attribute", '', 'SelectorAttribute'), # noqa 0x00720028: ('US', '1', "Selector Value Number", '', 'SelectorValueNumber'), # noqa 0x00720030: ('SQ', '1', "Time Based Image Sets Sequence", '', 'TimeBasedImageSetsSequence'), # noqa 0x00720032: ('US', '1', "Image Set Number", '', 'ImageSetNumber'), # noqa 0x00720034: ('CS', '1', "Image Set Selector Category", '', 'ImageSetSelectorCategory'), # noqa 0x00720038: ('US', '2', "Relative Time", '', 'RelativeTime'), # noqa 0x0072003A: ('CS', '1', "Relative Time Units", '', 'RelativeTimeUnits'), # noqa 0x0072003C: ('SS', '2', "Abstract Prior Value", '', 'AbstractPriorValue'), # noqa 0x0072003E: ('SQ', '1', "Abstract Prior Code Sequence", '', 'AbstractPriorCodeSequence'), # noqa 0x00720040: ('LO', '1', "Image Set Label", '', 'ImageSetLabel'), # noqa 0x00720050: ('CS', '1', "Selector Attribute VR", '', 'SelectorAttributeVR'), # noqa 0x00720052: ('AT', '1-n', "Selector Sequence Pointer", '', 'SelectorSequencePointer'), # noqa 0x00720054: ('LO', '1-n', "Selector Sequence Pointer Private Creator", '', 'SelectorSequencePointerPrivateCreator'), # noqa 0x00720056: ('LO', '1', "Selector Attribute Private Creator", '', 'SelectorAttributePrivateCreator'), # noqa 0x0072005E: ('AE', '1-n', "Selector AE Value", '', 'SelectorAEValue'), # noqa 0x0072005F: ('AS', '1-n', "Selector AS Value", '', 'SelectorASValue'), # noqa 0x00720060: ('AT', '1-n', "Selector AT Value", '', 'SelectorATValue'), # noqa 0x00720061: ('DA', '1-n', "Selector DA Value", '', 'SelectorDAValue'), # noqa 0x00720062: ('CS', '1-n', "Selector CS Value", '', 'SelectorCSValue'), # noqa 0x00720063: ('DT', '1-n', "Selector DT Value", '', 'SelectorDTValue'), # noqa 0x00720064: ('IS', '1-n', "Selector IS Value", '', 'SelectorISValue'), # noqa 0x00720065: ('OB', '1', "Selector OB Value", '', 'SelectorOBValue'), # noqa 0x00720066: ('LO', '1-n', "Selector LO Value", '', 'SelectorLOValue'), # noqa 0x00720067: ('OF', '1', "Selector OF Value", '', 'SelectorOFValue'), # noqa 0x00720068: ('LT', '1', "Selector LT Value", '', 'SelectorLTValue'), # noqa 0x00720069: ('OW', '1', "Selector OW Value", '', 'SelectorOWValue'), # noqa 0x0072006A: ('PN', '1-n', "Selector PN Value", '', 'SelectorPNValue'), # noqa 0x0072006B: ('TM', '1-n', "Selector TM Value", '', 'SelectorTMValue'), # noqa 0x0072006C: ('SH', '1-n', "Selector SH Value", '', 'SelectorSHValue'), # noqa 0x0072006D: ('UN', '1', "Selector UN Value", '', 'SelectorUNValue'), # noqa 0x0072006E: ('ST', '1', "Selector ST Value", '', 'SelectorSTValue'), # noqa 0x0072006F: ('UC', '1-n', "Selector UC Value", '', 'SelectorUCValue'), # noqa 0x00720070: ('UT', '1', "Selector UT Value", '', 'SelectorUTValue'), # noqa 0x00720071: ('UR', '1', "Selector UR Value", '', 'SelectorURValue'), # noqa 0x00720072: ('DS', '1-n', "Selector DS Value", '', 'SelectorDSValue'), # noqa 0x00720073: ('OD', '1', "Selector OD Value", '', 'SelectorODValue'), # noqa 0x00720074: ('FD', '1-n', "Selector FD Value", '', 'SelectorFDValue'), # noqa 0x00720075: ('OL', '1', "Selector OL Value", '', 'SelectorOLValue'), # noqa 0x00720076: ('FL', '1-n', "Selector FL Value", '', 'SelectorFLValue'), # noqa 0x00720078: ('UL', '1-n', "Selector UL Value", '', 'SelectorULValue'), # noqa 0x0072007A: ('US', '1-n', "Selector US Value", '', 'SelectorUSValue'), # noqa 0x0072007C: ('SL', '1-n', "Selector SL Value", '', 'SelectorSLValue'), # noqa 0x0072007E: ('SS', '1-n', "Selector SS Value", '', 'SelectorSSValue'), # noqa 0x0072007F: ('UI', '1-n', "Selector UI Value", '', 'SelectorUIValue'), # noqa 0x00720080: ('SQ', '1', "Selector Code Sequence Value", '', 'SelectorCodeSequenceValue'), # noqa 0x00720081: ('OV', '1', "Selector OV Value", '', 'SelectorOVValue'), # noqa 0x00720082: ('SV', '1-n', "Selector SV Value", '', 'SelectorSVValue'), # noqa 0x00720083: ('UV', '1-n', "Selector UV Value", '', 'SelectorUVValue'), # noqa 0x00720100: ('US', '1', "Number of Screens", '', 'NumberOfScreens'), # noqa 0x00720102: ('SQ', '1', "Nominal Screen Definition Sequence", '', 'NominalScreenDefinitionSequence'), # noqa 0x00720104: ('US', '1', "Number of Vertical Pixels", '', 'NumberOfVerticalPixels'), # noqa 0x00720106: ('US', '1', "Number of Horizontal Pixels", '', 'NumberOfHorizontalPixels'), # noqa 0x00720108: ('FD', '4', "Display Environment Spatial Position", '', 'DisplayEnvironmentSpatialPosition'), # noqa 0x0072010A: ('US', '1', "Screen Minimum Grayscale Bit Depth", '', 'ScreenMinimumGrayscaleBitDepth'), # noqa 0x0072010C: ('US', '1', "Screen Minimum Color Bit Depth", '', 'ScreenMinimumColorBitDepth'), # noqa 0x0072010E: ('US', '1', "Application Maximum Repaint Time", '', 'ApplicationMaximumRepaintTime'), # noqa 0x00720200: ('SQ', '1', "Display Sets Sequence", '', 'DisplaySetsSequence'), # noqa 0x00720202: ('US', '1', "Display Set Number", '', 'DisplaySetNumber'), # noqa 0x00720203: ('LO', '1', "Display Set Label", '', 'DisplaySetLabel'), # noqa 0x00720204: ('US', '1', "Display Set Presentation Group", '', 'DisplaySetPresentationGroup'), # noqa 0x00720206: ('LO', '1', "Display Set Presentation Group Description", '', 'DisplaySetPresentationGroupDescription'), # noqa 0x00720208: ('CS', '1', "Partial Data Display Handling", '', 'PartialDataDisplayHandling'), # noqa 0x00720210: ('SQ', '1', "Synchronized Scrolling Sequence", '', 'SynchronizedScrollingSequence'), # noqa 0x00720212: ('US', '2-n', "Display Set Scrolling Group", '', 'DisplaySetScrollingGroup'), # noqa 0x00720214: ('SQ', '1', "Navigation Indicator Sequence", '', 'NavigationIndicatorSequence'), # noqa 0x00720216: ('US', '1', "Navigation Display Set", '', 'NavigationDisplaySet'), # noqa 0x00720218: ('US', '1-n', "Reference Display Sets", '', 'ReferenceDisplaySets'), # noqa 0x00720300: ('SQ', '1', "Image Boxes Sequence", '', 'ImageBoxesSequence'), # noqa 0x00720302: ('US', '1', "Image Box Number", '', 'ImageBoxNumber'), # noqa 0x00720304: ('CS', '1', "Image Box Layout Type", '', 'ImageBoxLayoutType'), # noqa 0x00720306: ('US', '1', "Image Box Tile Horizontal Dimension", '', 'ImageBoxTileHorizontalDimension'), # noqa 0x00720308: ('US', '1', "Image Box Tile Vertical Dimension", '', 'ImageBoxTileVerticalDimension'), # noqa 0x00720310: ('CS', '1', "Image Box Scroll Direction", '', 'ImageBoxScrollDirection'), # noqa 0x00720312: ('CS', '1', "Image Box Small Scroll Type", '', 'ImageBoxSmallScrollType'), # noqa 0x00720314: ('US', '1', "Image Box Small Scroll Amount", '', 'ImageBoxSmallScrollAmount'), # noqa 0x00720316: ('CS', '1', "Image Box Large Scroll Type", '', 'ImageBoxLargeScrollType'), # noqa 0x00720318: ('US', '1', "Image Box Large Scroll Amount", '', 'ImageBoxLargeScrollAmount'), # noqa 0x00720320: ('US', '1', "Image Box Overlap Priority", '', 'ImageBoxOverlapPriority'), # noqa 0x00720330: ('FD', '1', "Cine Relative to Real-Time", '', 'CineRelativeToRealTime'), # noqa 0x00720400: ('SQ', '1', "Filter Operations Sequence", '', 'FilterOperationsSequence'), # noqa 0x00720402: ('CS', '1', "Filter-by Category", '', 'FilterByCategory'), # noqa 0x00720404: ('CS', '1', "Filter-by Attribute Presence", '', 'FilterByAttributePresence'), # noqa 0x00720406: ('CS', '1', "Filter-by Operator", '', 'FilterByOperator'), # noqa 0x00720420: ('US', '3', "Structured Display Background CIELab Value", '', 'StructuredDisplayBackgroundCIELabValue'), # noqa 0x00720421: ('US', '3', "Empty Image Box CIELab Value", '', 'EmptyImageBoxCIELabValue'), # noqa 0x00720422: ('SQ', '1', "Structured Display Image Box Sequence", '', 'StructuredDisplayImageBoxSequence'), # noqa 0x00720424: ('SQ', '1', "Structured Display Text Box Sequence", '', 'StructuredDisplayTextBoxSequence'), # noqa 0x00720427: ('SQ', '1', "Referenced First Frame Sequence", '', 'ReferencedFirstFrameSequence'), # noqa 0x00720430: ('SQ', '1', "Image Box Synchronization Sequence", '', 'ImageBoxSynchronizationSequence'), # noqa 0x00720432: ('US', '2-n', "Synchronized Image Box List", '', 'SynchronizedImageBoxList'), # noqa 0x00720434: ('CS', '1', "Type of Synchronization", '', 'TypeOfSynchronization'), # noqa 0x00720500: ('CS', '1', "Blending Operation Type", '', 'BlendingOperationType'), # noqa 0x00720510: ('CS', '1', "Reformatting Operation Type", '', 'ReformattingOperationType'), # noqa 0x00720512: ('FD', '1', "Reformatting Thickness", '', 'ReformattingThickness'), # noqa 0x00720514: ('FD', '1', "Reformatting Interval", '', 'ReformattingInterval'), # noqa 0x00720516: ('CS', '1', "Reformatting Operation Initial View Direction", '', 'ReformattingOperationInitialViewDirection'), # noqa 0x00720520: ('CS', '1-n', "3D Rendering Type", '', 'ThreeDRenderingType'), # noqa 0x00720600: ('SQ', '1', "Sorting Operations Sequence", '', 'SortingOperationsSequence'), # noqa 0x00720602: ('CS', '1', "Sort-by Category", '', 'SortByCategory'), # noqa 0x00720604: ('CS', '1', "Sorting Direction", '', 'SortingDirection'), # noqa 0x00720700: ('CS', '2', "Display Set Patient Orientation", '', 'DisplaySetPatientOrientation'), # noqa 0x00720702: ('CS', '1', "VOI Type", '', 'VOIType'), # noqa 0x00720704: ('CS', '1', "Pseudo-Color Type", '', 'PseudoColorType'), # noqa 0x00720705: ('SQ', '1', "Pseudo-Color Palette Instance Reference Sequence", '', 'PseudoColorPaletteInstanceReferenceSequence'), # noqa 0x00720706: ('CS', '1', "Show Grayscale Inverted", '', 'ShowGrayscaleInverted'), # noqa 0x00720710: ('CS', '1', "Show Image True Size Flag", '', 'ShowImageTrueSizeFlag'), # noqa 0x00720712: ('CS', '1', "Show Graphic Annotation Flag", '', 'ShowGraphicAnnotationFlag'), # noqa 0x00720714: ('CS', '1', "Show Patient Demographics Flag", '', 'ShowPatientDemographicsFlag'), # noqa 0x00720716: ('CS', '1', "Show Acquisition Techniques Flag", '', 'ShowAcquisitionTechniquesFlag'), # noqa 0x00720717: ('CS', '1', "Display Set Horizontal Justification", '', 'DisplaySetHorizontalJustification'), # noqa 0x00720718: ('CS', '1', "Display Set Vertical Justification", '', 'DisplaySetVerticalJustification'), # noqa 0x00740120: ('FD', '1', "Continuation Start Meterset", '', 'ContinuationStartMeterset'), # noqa 0x00740121: ('FD', '1', "Continuation End Meterset", '', 'ContinuationEndMeterset'), # noqa 0x00741000: ('CS', '1', "Procedure Step State", '', 'ProcedureStepState'), # noqa 0x00741002: ('SQ', '1', "Procedure Step Progress Information Sequence", '', 'ProcedureStepProgressInformationSequence'), # noqa 0x00741004: ('DS', '1', "Procedure Step Progress", '', 'ProcedureStepProgress'), # noqa 0x00741006: ('ST', '1', "Procedure Step Progress Description", '', 'ProcedureStepProgressDescription'), # noqa 0x00741007: ('SQ', '1', "Procedure Step Progress Parameters Sequence", '', 'ProcedureStepProgressParametersSequence'), # noqa 0x00741008: ('SQ', '1', "Procedure Step Communications URI Sequence", '', 'ProcedureStepCommunicationsURISequence'), # noqa 0x0074100A: ('UR', '1', "Contact URI", '', 'ContactURI'), # noqa 0x0074100C: ('LO', '1', "Contact Display Name", '', 'ContactDisplayName'), # noqa 0x0074100E: ('SQ', '1', "Procedure Step Discontinuation Reason Code Sequence", '', 'ProcedureStepDiscontinuationReasonCodeSequence'), # noqa 0x00741020: ('SQ', '1', "Beam Task Sequence", '', 'BeamTaskSequence'), # noqa 0x00741022: ('CS', '1', "Beam Task Type", '', 'BeamTaskType'), # noqa 0x00741024: ('IS', '1', "Beam Order Index (Trial)", 'Retired', 'BeamOrderIndexTrial'), # noqa 0x00741025: ('CS', '1', "Autosequence Flag", '', 'AutosequenceFlag'), # noqa 0x00741026: ('FD', '1', "Table Top Vertical Adjusted Position", '', 'TableTopVerticalAdjustedPosition'), # noqa 0x00741027: ('FD', '1', "Table Top Longitudinal Adjusted Position", '', 'TableTopLongitudinalAdjustedPosition'), # noqa 0x00741028: ('FD', '1', "Table Top Lateral Adjusted Position", '', 'TableTopLateralAdjustedPosition'), # noqa 0x0074102A: ('FD', '1', "Patient Support Adjusted Angle", '', 'PatientSupportAdjustedAngle'), # noqa 0x0074102B: ('FD', '1', "Table Top Eccentric Adjusted Angle", '', 'TableTopEccentricAdjustedAngle'), # noqa 0x0074102C: ('FD', '1', "Table Top Pitch Adjusted Angle", '', 'TableTopPitchAdjustedAngle'), # noqa 0x0074102D: ('FD', '1', "Table Top Roll Adjusted Angle", '', 'TableTopRollAdjustedAngle'), # noqa 0x00741030: ('SQ', '1', "Delivery Verification Image Sequence", '', 'DeliveryVerificationImageSequence'), # noqa 0x00741032: ('CS', '1', "Verification Image Timing", '', 'VerificationImageTiming'), # noqa 0x00741034: ('CS', '1', "Double Exposure Flag", '', 'DoubleExposureFlag'), # noqa 0x00741036: ('CS', '1', "Double Exposure Ordering", '', 'DoubleExposureOrdering'), # noqa 0x00741038: ('DS', '1', "Double Exposure Meterset (Trial)", 'Retired', 'DoubleExposureMetersetTrial'), # noqa 0x0074103A: ('DS', '4', "Double Exposure Field Delta (Trial)", 'Retired', 'DoubleExposureFieldDeltaTrial'), # noqa 0x00741040: ('SQ', '1', "Related Reference RT Image Sequence", '', 'RelatedReferenceRTImageSequence'), # noqa 0x00741042: ('SQ', '1', "General Machine Verification Sequence", '', 'GeneralMachineVerificationSequence'), # noqa 0x00741044: ('SQ', '1', "Conventional Machine Verification Sequence", '', 'ConventionalMachineVerificationSequence'), # noqa 0x00741046: ('SQ', '1', "Ion Machine Verification Sequence", '', 'IonMachineVerificationSequence'), # noqa 0x00741048: ('SQ', '1', "Failed Attributes Sequence", '', 'FailedAttributesSequence'), # noqa 0x0074104A: ('SQ', '1', "Overridden Attributes Sequence", '', 'OverriddenAttributesSequence'), # noqa 0x0074104C: ('SQ', '1', "Conventional Control Point Verification Sequence", '', 'ConventionalControlPointVerificationSequence'), # noqa 0x0074104E: ('SQ', '1', "Ion Control Point Verification Sequence", '', 'IonControlPointVerificationSequence'), # noqa 0x00741050: ('SQ', '1', "Attribute Occurrence Sequence", '', 'AttributeOccurrenceSequence'), # noqa 0x00741052: ('AT', '1', "Attribute Occurrence Pointer", '', 'AttributeOccurrencePointer'), # noqa 0x00741054: ('UL', '1', "Attribute Item Selector", '', 'AttributeItemSelector'), # noqa 0x00741056: ('LO', '1', "Attribute Occurrence Private Creator", '', 'AttributeOccurrencePrivateCreator'), # noqa 0x00741057: ('IS', '1-n', "Selector Sequence Pointer Items", '', 'SelectorSequencePointerItems'), # noqa 0x00741200: ('CS', '1', "Scheduled Procedure Step Priority", '', 'ScheduledProcedureStepPriority'), # noqa 0x00741202: ('LO', '1', "Worklist Label", '', 'WorklistLabel'), # noqa 0x00741204: ('LO', '1', "Procedure Step Label", '', 'ProcedureStepLabel'), # noqa 0x00741210: ('SQ', '1', "Scheduled Processing Parameters Sequence", '', 'ScheduledProcessingParametersSequence'), # noqa 0x00741212: ('SQ', '1', "Performed Processing Parameters Sequence", '', 'PerformedProcessingParametersSequence'), # noqa 0x00741216: ('SQ', '1', "Unified Procedure Step Performed Procedure Sequence", '', 'UnifiedProcedureStepPerformedProcedureSequence'), # noqa 0x00741220: ('SQ', '1', "Related Procedure Step Sequence", 'Retired', 'RelatedProcedureStepSequence'), # noqa 0x00741222: ('LO', '1', "Procedure Step Relationship Type", 'Retired', 'ProcedureStepRelationshipType'), # noqa 0x00741224: ('SQ', '1', "Replaced Procedure Step Sequence", '', 'ReplacedProcedureStepSequence'), # noqa 0x00741230: ('LO', '1', "Deletion Lock", '', 'DeletionLock'), # noqa 0x00741234: ('AE', '1', "Receiving AE", '', 'ReceivingAE'), # noqa 0x00741236: ('AE', '1', "Requesting AE", '', 'RequestingAE'), # noqa 0x00741238: ('LT', '1', "Reason for Cancellation", '', 'ReasonForCancellation'), # noqa 0x00741242: ('CS', '1', "SCP Status", '', 'SCPStatus'), # noqa 0x00741244: ('CS', '1', "Subscription List Status", '', 'SubscriptionListStatus'), # noqa 0x00741246: ('CS', '1', "Unified Procedure Step List Status", '', 'UnifiedProcedureStepListStatus'), # noqa 0x00741324: ('UL', '1', "Beam Order Index", '', 'BeamOrderIndex'), # noqa 0x00741338: ('FD', '1', "Double Exposure Meterset", '', 'DoubleExposureMeterset'), # noqa 0x0074133A: ('FD', '4', "Double Exposure Field Delta", '', 'DoubleExposureFieldDelta'), # noqa 0x00741401: ('SQ', '1', "Brachy Task Sequence", '', 'BrachyTaskSequence'), # noqa 0x00741402: ('DS', '1', "Continuation Start Total Reference Air Kerma", '', 'ContinuationStartTotalReferenceAirKerma'), # noqa 0x00741403: ('DS', '1', "Continuation End Total Reference Air Kerma", '', 'ContinuationEndTotalReferenceAirKerma'), # noqa 0x00741404: ('IS', '1', "Continuation Pulse Number", '', 'ContinuationPulseNumber'), # noqa 0x00741405: ('SQ', '1', "Channel Delivery Order Sequence", '', 'ChannelDeliveryOrderSequence'), # noqa 0x00741406: ('IS', '1', "Referenced Channel Number", '', 'ReferencedChannelNumber'), # noqa 0x00741407: ('DS', '1', "Start Cumulative Time Weight", '', 'StartCumulativeTimeWeight'), # noqa 0x00741408: ('DS', '1', "End Cumulative Time Weight", '', 'EndCumulativeTimeWeight'), # noqa 0x00741409: ('SQ', '1', "Omitted Channel Sequence", '', 'OmittedChannelSequence'), # noqa 0x0074140A: ('CS', '1', "Reason for Channel Omission", '', 'ReasonForChannelOmission'), # noqa 0x0074140B: ('LO', '1', "Reason for Channel Omission Description", '', 'ReasonForChannelOmissionDescription'), # noqa 0x0074140C: ('IS', '1', "Channel Delivery Order Index", '', 'ChannelDeliveryOrderIndex'), # noqa 0x0074140D: ('SQ', '1', "Channel Delivery Continuation Sequence", '', 'ChannelDeliveryContinuationSequence'), # noqa 0x0074140E: ('SQ', '1', "Omitted Application Setup Sequence", '', 'OmittedApplicationSetupSequence'), # noqa 0x00760001: ('LO', '1', "Implant Assembly Template Name", '', 'ImplantAssemblyTemplateName'), # noqa 0x00760003: ('LO', '1', "Implant Assembly Template Issuer", '', 'ImplantAssemblyTemplateIssuer'), # noqa 0x00760006: ('LO', '1', "Implant Assembly Template Version", '', 'ImplantAssemblyTemplateVersion'), # noqa 0x00760008: ('SQ', '1', "Replaced Implant Assembly Template Sequence", '', 'ReplacedImplantAssemblyTemplateSequence'), # noqa 0x0076000A: ('CS', '1', "Implant Assembly Template Type", '', 'ImplantAssemblyTemplateType'), # noqa 0x0076000C: ('SQ', '1', "Original Implant Assembly Template Sequence", '', 'OriginalImplantAssemblyTemplateSequence'), # noqa 0x0076000E: ('SQ', '1', "Derivation Implant Assembly Template Sequence", '', 'DerivationImplantAssemblyTemplateSequence'), # noqa 0x00760010: ('SQ', '1', "Implant Assembly Template Target Anatomy Sequence", '', 'ImplantAssemblyTemplateTargetAnatomySequence'), # noqa 0x00760020: ('SQ', '1', "Procedure Type Code Sequence", '', 'ProcedureTypeCodeSequence'), # noqa 0x00760030: ('LO', '1', "Surgical Technique", '', 'SurgicalTechnique'), # noqa 0x00760032: ('SQ', '1', "Component Types Sequence", '', 'ComponentTypesSequence'), # noqa 0x00760034: ('SQ', '1', "Component Type Code Sequence", '', 'ComponentTypeCodeSequence'), # noqa 0x00760036: ('CS', '1', "Exclusive Component Type", '', 'ExclusiveComponentType'), # noqa 0x00760038: ('CS', '1', "Mandatory Component Type", '', 'MandatoryComponentType'), # noqa 0x00760040: ('SQ', '1', "Component Sequence", '', 'ComponentSequence'), # noqa 0x00760055: ('US', '1', "Component ID", '', 'ComponentID'), # noqa 0x00760060: ('SQ', '1', "Component Assembly Sequence", '', 'ComponentAssemblySequence'), # noqa 0x00760070: ('US', '1', "Component 1 Referenced ID", '', 'Component1ReferencedID'), # noqa 0x00760080: ('US', '1', "Component 1 Referenced Mating Feature Set ID", '', 'Component1ReferencedMatingFeatureSetID'), # noqa 0x00760090: ('US', '1', "Component 1 Referenced Mating Feature ID", '', 'Component1ReferencedMatingFeatureID'), # noqa 0x007600A0: ('US', '1', "Component 2 Referenced ID", '', 'Component2ReferencedID'), # noqa 0x007600B0: ('US', '1', "Component 2 Referenced Mating Feature Set ID", '', 'Component2ReferencedMatingFeatureSetID'), # noqa 0x007600C0: ('US', '1', "Component 2 Referenced Mating Feature ID", '', 'Component2ReferencedMatingFeatureID'), # noqa 0x00780001: ('LO', '1', "Implant Template Group Name", '', 'ImplantTemplateGroupName'), # noqa 0x00780010: ('ST', '1', "Implant Template Group Description", '', 'ImplantTemplateGroupDescription'), # noqa 0x00780020: ('LO', '1', "Implant Template Group Issuer", '', 'ImplantTemplateGroupIssuer'), # noqa 0x00780024: ('LO', '1', "Implant Template Group Version", '', 'ImplantTemplateGroupVersion'), # noqa 0x00780026: ('SQ', '1', "Replaced Implant Template Group Sequence", '', 'ReplacedImplantTemplateGroupSequence'), # noqa 0x00780028: ('SQ', '1', "Implant Template Group Target Anatomy Sequence", '', 'ImplantTemplateGroupTargetAnatomySequence'), # noqa 0x0078002A: ('SQ', '1', "Implant Template Group Members Sequence", '', 'ImplantTemplateGroupMembersSequence'), # noqa 0x0078002E: ('US', '1', "Implant Template Group Member ID", '', 'ImplantTemplateGroupMemberID'), # noqa 0x00780050: ('FD', '3', "3D Implant Template Group Member Matching Point", '', 'ThreeDImplantTemplateGroupMemberMatchingPoint'), # noqa 0x00780060: ('FD', '9', "3D Implant Template Group Member Matching Axes", '', 'ThreeDImplantTemplateGroupMemberMatchingAxes'), # noqa 0x00780070: ('SQ', '1', "Implant Template Group Member Matching 2D Coordinates Sequence", '', 'ImplantTemplateGroupMemberMatching2DCoordinatesSequence'), # noqa 0x00780090: ('FD', '2', "2D Implant Template Group Member Matching Point", '', 'TwoDImplantTemplateGroupMemberMatchingPoint'), # noqa 0x007800A0: ('FD', '4', "2D Implant Template Group Member Matching Axes", '', 'TwoDImplantTemplateGroupMemberMatchingAxes'), # noqa 0x007800B0: ('SQ', '1', "Implant Template Group Variation Dimension Sequence", '', 'ImplantTemplateGroupVariationDimensionSequence'), # noqa 0x007800B2: ('LO', '1', "Implant Template Group Variation Dimension Name", '', 'ImplantTemplateGroupVariationDimensionName'), # noqa 0x007800B4: ('SQ', '1', "Implant Template Group Variation Dimension Rank Sequence", '', 'ImplantTemplateGroupVariationDimensionRankSequence'), # noqa 0x007800B6: ('US', '1', "Referenced Implant Template Group Member ID", '', 'ReferencedImplantTemplateGroupMemberID'), # noqa 0x007800B8: ('US', '1', "Implant Template Group Variation Dimension Rank", '', 'ImplantTemplateGroupVariationDimensionRank'), # noqa 0x00800001: ('SQ', '1', "Surface Scan Acquisition Type Code Sequence", '', 'SurfaceScanAcquisitionTypeCodeSequence'), # noqa 0x00800002: ('SQ', '1', "Surface Scan Mode Code Sequence", '', 'SurfaceScanModeCodeSequence'), # noqa 0x00800003: ('SQ', '1', "Registration Method Code Sequence", '', 'RegistrationMethodCodeSequence'), # noqa 0x00800004: ('FD', '1', "Shot Duration Time", '', 'ShotDurationTime'), # noqa 0x00800005: ('FD', '1', "Shot Offset Time", '', 'ShotOffsetTime'), # noqa 0x00800006: ('US', '1-n', "Surface Point Presentation Value Data", '', 'SurfacePointPresentationValueData'), # noqa 0x00800007: ('US', '3-3n', "Surface Point Color CIELab Value Data", '', 'SurfacePointColorCIELabValueData'), # noqa 0x00800008: ('SQ', '1', "UV Mapping Sequence", '', 'UVMappingSequence'), # noqa 0x00800009: ('SH', '1', "Texture Label", '', 'TextureLabel'), # noqa 0x00800010: ('OF', '1', "U Value Data", '', 'UValueData'), # noqa 0x00800011: ('OF', '1', "V Value Data", '', 'VValueData'), # noqa 0x00800012: ('SQ', '1', "Referenced Texture Sequence", '', 'ReferencedTextureSequence'), # noqa 0x00800013: ('SQ', '1', "Referenced Surface Data Sequence", '', 'ReferencedSurfaceDataSequence'), # noqa 0x00820001: ('CS', '1', "Assessment Summary", '', 'AssessmentSummary'), # noqa 0x00820003: ('UT', '1', "Assessment Summary Description", '', 'AssessmentSummaryDescription'), # noqa 0x00820004: ('SQ', '1', "Assessed SOP Instance Sequence", '', 'AssessedSOPInstanceSequence'), # noqa 0x00820005: ('SQ', '1', "Referenced Comparison SOP Instance Sequence", '', 'ReferencedComparisonSOPInstanceSequence'), # noqa 0x00820006: ('UL', '1', "Number of Assessment Observations", '', 'NumberOfAssessmentObservations'), # noqa 0x00820007: ('SQ', '1', "Assessment Observations Sequence", '', 'AssessmentObservationsSequence'), # noqa 0x00820008: ('CS', '1', "Observation Significance", '', 'ObservationSignificance'), # noqa 0x0082000A: ('UT', '1', "Observation Description", '', 'ObservationDescription'), # noqa 0x0082000C: ('SQ', '1', "Structured Constraint Observation Sequence", '', 'StructuredConstraintObservationSequence'), # noqa 0x00820010: ('SQ', '1', "Assessed Attribute Value Sequence", '', 'AssessedAttributeValueSequence'), # noqa 0x00820016: ('LO', '1', "Assessment Set ID", '', 'AssessmentSetID'), # noqa 0x00820017: ('SQ', '1', "Assessment Requester Sequence", '', 'AssessmentRequesterSequence'), # noqa 0x00820018: ('LO', '1', "Selector Attribute Name", '', 'SelectorAttributeName'), # noqa 0x00820019: ('LO', '1', "Selector Attribute Keyword", '', 'SelectorAttributeKeyword'), # noqa 0x00820021: ('SQ', '1', "Assessment Type Code Sequence", '', 'AssessmentTypeCodeSequence'), # noqa 0x00820022: ('SQ', '1', "Observation Basis Code Sequence", '', 'ObservationBasisCodeSequence'), # noqa 0x00820023: ('LO', '1', "Assessment Label", '', 'AssessmentLabel'), # noqa 0x00820032: ('CS', '1', "Constraint Type", '', 'ConstraintType'), # noqa 0x00820033: ('UT', '1', "Specification Selection Guidance", '', 'SpecificationSelectionGuidance'), # noqa 0x00820034: ('SQ', '1', "Constraint Value Sequence", '', 'ConstraintValueSequence'), # noqa 0x00820035: ('SQ', '1', "Recommended Default Value Sequence", '', 'RecommendedDefaultValueSequence'), # noqa 0x00820036: ('CS', '1', "Constraint Violation Significance", '', 'ConstraintViolationSignificance'), # noqa 0x00820037: ('UT', '1', "Constraint Violation Condition", '', 'ConstraintViolationCondition'), # noqa 0x00820038: ('CS', '1', "Modifiable Constraint Flag", '', 'ModifiableConstraintFlag'), # noqa 0x00880130: ('SH', '1', "Storage Media File-set ID", '', 'StorageMediaFileSetID'), # noqa 0x00880140: ('UI', '1', "Storage Media File-set UID", '', 'StorageMediaFileSetUID'), # noqa 0x00880200: ('SQ', '1', "Icon Image Sequence", '', 'IconImageSequence'), # noqa 0x00880904: ('LO', '1', "Topic Title", 'Retired', 'TopicTitle'), # noqa 0x00880906: ('ST', '1', "Topic Subject", 'Retired', 'TopicSubject'), # noqa 0x00880910: ('LO', '1', "Topic Author", 'Retired', 'TopicAuthor'), # noqa 0x00880912: ('LO', '1-32', "Topic Keywords", 'Retired', 'TopicKeywords'), # noqa 0x01000410: ('CS', '1', "SOP Instance Status", '', 'SOPInstanceStatus'), # noqa 0x01000420: ('DT', '1', "SOP Authorization DateTime", '', 'SOPAuthorizationDateTime'), # noqa 0x01000424: ('LT', '1', "SOP Authorization Comment", '', 'SOPAuthorizationComment'), # noqa 0x01000426: ('LO', '1', "Authorization Equipment Certification Number", '', 'AuthorizationEquipmentCertificationNumber'), # noqa 0x04000005: ('US', '1', "MAC ID Number", '', 'MACIDNumber'), # noqa 0x04000010: ('UI', '1', "MAC Calculation Transfer Syntax UID", '', 'MACCalculationTransferSyntaxUID'), # noqa 0x04000015: ('CS', '1', "MAC Algorithm", '', 'MACAlgorithm'), # noqa 0x04000020: ('AT', '1-n', "Data Elements Signed", '', 'DataElementsSigned'), # noqa 0x04000100: ('UI', '1', "Digital Signature UID", '', 'DigitalSignatureUID'), # noqa 0x04000105: ('DT', '1', "Digital Signature DateTime", '', 'DigitalSignatureDateTime'), # noqa 0x04000110: ('CS', '1', "Certificate Type", '', 'CertificateType'), # noqa 0x04000115: ('OB', '1', "Certificate of Signer", '', 'CertificateOfSigner'), # noqa 0x04000120: ('OB', '1', "Signature", '', 'Signature'), # noqa 0x04000305: ('CS', '1', "Certified Timestamp Type", '', 'CertifiedTimestampType'), # noqa 0x04000310: ('OB', '1', "Certified Timestamp", '', 'CertifiedTimestamp'), # noqa 0x04000315: ('FL', '1', "", 'Retired', ''), # noqa 0x04000401: ('SQ', '1', "Digital Signature Purpose Code Sequence", '', 'DigitalSignaturePurposeCodeSequence'), # noqa 0x04000402: ('SQ', '1', "Referenced Digital Signature Sequence", '', 'ReferencedDigitalSignatureSequence'), # noqa 0x04000403: ('SQ', '1', "Referenced SOP Instance MAC Sequence", '', 'ReferencedSOPInstanceMACSequence'), # noqa 0x04000404: ('OB', '1', "MAC", '', 'MAC'), # noqa 0x04000500: ('SQ', '1', "Encrypted Attributes Sequence", '', 'EncryptedAttributesSequence'), # noqa 0x04000510: ('UI', '1', "Encrypted Content Transfer Syntax UID", '', 'EncryptedContentTransferSyntaxUID'), # noqa 0x04000520: ('OB', '1', "Encrypted Content", '', 'EncryptedContent'), # noqa 0x04000550: ('SQ', '1', "Modified Attributes Sequence", '', 'ModifiedAttributesSequence'), # noqa 0x04000551: ('SQ', '1', "Nonconforming Modified Attributes Sequence", '', 'NonconformingModifiedAttributesSequence'), # noqa 0x04000552: ('OB', '1', "Nonconforming Data Element Value", '', 'NonconformingDataElementValue'), # noqa 0x04000561: ('SQ', '1', "Original Attributes Sequence", '', 'OriginalAttributesSequence'), # noqa 0x04000562: ('DT', '1', "Attribute Modification DateTime", '', 'AttributeModificationDateTime'), # noqa 0x04000563: ('LO', '1', "Modifying System", '', 'ModifyingSystem'), # noqa 0x04000564: ('LO', '1', "Source of Previous Values", '', 'SourceOfPreviousValues'), # noqa 0x04000565: ('CS', '1', "Reason for the Attribute Modification", '', 'ReasonForTheAttributeModification'), # noqa 0x04000600: ('CS', '1', "Instance Origin Status", '', 'InstanceOriginStatus'), # noqa 0x20000010: ('IS', '1', "Number of Copies", '', 'NumberOfCopies'), # noqa 0x2000001E: ('SQ', '1', "Printer Configuration Sequence", '', 'PrinterConfigurationSequence'), # noqa 0x20000020: ('CS', '1', "Print Priority", '', 'PrintPriority'), # noqa 0x20000030: ('CS', '1', "Medium Type", '', 'MediumType'), # noqa 0x20000040: ('CS', '1', "Film Destination", '', 'FilmDestination'), # noqa 0x20000050: ('LO', '1', "Film Session Label", '', 'FilmSessionLabel'), # noqa 0x20000060: ('IS', '1', "Memory Allocation", '', 'MemoryAllocation'), # noqa 0x20000061: ('IS', '1', "Maximum Memory Allocation", '', 'MaximumMemoryAllocation'), # noqa 0x20000062: ('CS', '1', "Color Image Printing Flag", 'Retired', 'ColorImagePrintingFlag'), # noqa 0x20000063: ('CS', '1', "Collation Flag", 'Retired', 'CollationFlag'), # noqa 0x20000065: ('CS', '1', "Annotation Flag", 'Retired', 'AnnotationFlag'), # noqa 0x20000067: ('CS', '1', "Image Overlay Flag", 'Retired', 'ImageOverlayFlag'), # noqa 0x20000069: ('CS', '1', "Presentation LUT Flag", 'Retired', 'PresentationLUTFlag'), # noqa 0x2000006A: ('CS', '1', "Image Box Presentation LUT Flag", 'Retired', 'ImageBoxPresentationLUTFlag'), # noqa 0x200000A0: ('US', '1', "Memory Bit Depth", '', 'MemoryBitDepth'), # noqa 0x200000A1: ('US', '1', "Printing Bit Depth", '', 'PrintingBitDepth'), # noqa 0x200000A2: ('SQ', '1', "Media Installed Sequence", '', 'MediaInstalledSequence'), # noqa 0x200000A4: ('SQ', '1', "Other Media Available Sequence", '', 'OtherMediaAvailableSequence'), # noqa 0x200000A8: ('SQ', '1', "Supported Image Display Formats Sequence", '', 'SupportedImageDisplayFormatsSequence'), # noqa 0x20000500: ('SQ', '1', "Referenced Film Box Sequence", '', 'ReferencedFilmBoxSequence'), # noqa 0x20000510: ('SQ', '1', "Referenced Stored Print Sequence", 'Retired', 'ReferencedStoredPrintSequence'), # noqa 0x20100010: ('ST', '1', "Image Display Format", '', 'ImageDisplayFormat'), # noqa 0x20100030: ('CS', '1', "Annotation Display Format ID", '', 'AnnotationDisplayFormatID'), # noqa 0x20100040: ('CS', '1', "Film Orientation", '', 'FilmOrientation'), # noqa 0x20100050: ('CS', '1', "Film Size ID", '', 'FilmSizeID'), # noqa 0x20100052: ('CS', '1', "Printer Resolution ID", '', 'PrinterResolutionID'), # noqa 0x20100054: ('CS', '1', "Default Printer Resolution ID", '', 'DefaultPrinterResolutionID'), # noqa 0x20100060: ('CS', '1', "Magnification Type", '', 'MagnificationType'), # noqa 0x20100080: ('CS', '1', "Smoothing Type", '', 'SmoothingType'), # noqa 0x201000A6: ('CS', '1', "Default Magnification Type", '', 'DefaultMagnificationType'), # noqa 0x201000A7: ('CS', '1-n', "Other Magnification Types Available", '', 'OtherMagnificationTypesAvailable'), # noqa 0x201000A8: ('CS', '1', "Default Smoothing Type", '', 'DefaultSmoothingType'), # noqa 0x201000A9: ('CS', '1-n', "Other Smoothing Types Available", '', 'OtherSmoothingTypesAvailable'), # noqa 0x20100100: ('CS', '1', "Border Density", '', 'BorderDensity'), # noqa 0x20100110: ('CS', '1', "Empty Image Density", '', 'EmptyImageDensity'), # noqa 0x20100120: ('US', '1', "Min Density", '', 'MinDensity'), # noqa 0x20100130: ('US', '1', "Max Density", '', 'MaxDensity'), # noqa 0x20100140: ('CS', '1', "Trim", '', 'Trim'), # noqa 0x20100150: ('ST', '1', "Configuration Information", '', 'ConfigurationInformation'), # noqa 0x20100152: ('LT', '1', "Configuration Information Description", '', 'ConfigurationInformationDescription'), # noqa 0x20100154: ('IS', '1', "Maximum Collated Films", '', 'MaximumCollatedFilms'), # noqa 0x2010015E: ('US', '1', "Illumination", '', 'Illumination'), # noqa 0x20100160: ('US', '1', "Reflected Ambient Light", '', 'ReflectedAmbientLight'), # noqa 0x20100376: ('DS', '2', "Printer Pixel Spacing", '', 'PrinterPixelSpacing'), # noqa 0x20100500: ('SQ', '1', "Referenced Film Session Sequence", '', 'ReferencedFilmSessionSequence'), # noqa 0x20100510: ('SQ', '1', "Referenced Image Box Sequence", '', 'ReferencedImageBoxSequence'), # noqa 0x20100520: ('SQ', '1', "Referenced Basic Annotation Box Sequence", '', 'ReferencedBasicAnnotationBoxSequence'), # noqa 0x20200010: ('US', '1', "Image Box Position", '', 'ImageBoxPosition'), # noqa 0x20200020: ('CS', '1', "Polarity", '', 'Polarity'), # noqa 0x20200030: ('DS', '1', "Requested Image Size", '', 'RequestedImageSize'), # noqa 0x20200040: ('CS', '1', "Requested Decimate/Crop Behavior", '', 'RequestedDecimateCropBehavior'), # noqa 0x20200050: ('CS', '1', "Requested Resolution ID", '', 'RequestedResolutionID'), # noqa 0x202000A0: ('CS', '1', "Requested Image Size Flag", '', 'RequestedImageSizeFlag'), # noqa 0x202000A2: ('CS', '1', "Decimate/Crop Result", '', 'DecimateCropResult'), # noqa 0x20200110: ('SQ', '1', "Basic Grayscale Image Sequence", '', 'BasicGrayscaleImageSequence'), # noqa 0x20200111: ('SQ', '1', "Basic Color Image Sequence", '', 'BasicColorImageSequence'), # noqa 0x20200130: ('SQ', '1', "Referenced Image Overlay Box Sequence", 'Retired', 'ReferencedImageOverlayBoxSequence'), # noqa 0x20200140: ('SQ', '1', "Referenced VOI LUT Box Sequence", 'Retired', 'ReferencedVOILUTBoxSequence'), # noqa 0x20300010: ('US', '1', "Annotation Position", '', 'AnnotationPosition'), # noqa 0x20300020: ('LO', '1', "Text String", '', 'TextString'), # noqa 0x20400010: ('SQ', '1', "Referenced Overlay Plane Sequence", 'Retired', 'ReferencedOverlayPlaneSequence'), # noqa 0x20400011: ('US', '1-99', "Referenced Overlay Plane Groups", 'Retired', 'ReferencedOverlayPlaneGroups'), # noqa 0x20400020: ('SQ', '1', "Overlay Pixel Data Sequence", 'Retired', 'OverlayPixelDataSequence'), # noqa 0x20400060: ('CS', '1', "Overlay Magnification Type", 'Retired', 'OverlayMagnificationType'), # noqa 0x20400070: ('CS', '1', "Overlay Smoothing Type", 'Retired', 'OverlaySmoothingType'), # noqa 0x20400072: ('CS', '1', "Overlay or Image Magnification", 'Retired', 'OverlayOrImageMagnification'), # noqa 0x20400074: ('US', '1', "Magnify to Number of Columns", 'Retired', 'MagnifyToNumberOfColumns'), # noqa 0x20400080: ('CS', '1', "Overlay Foreground Density", 'Retired', 'OverlayForegroundDensity'), # noqa 0x20400082: ('CS', '1', "Overlay Background Density", 'Retired', 'OverlayBackgroundDensity'), # noqa 0x20400090: ('CS', '1', "Overlay Mode", 'Retired', 'OverlayMode'), # noqa 0x20400100: ('CS', '1', "Threshold Density", 'Retired', 'ThresholdDensity'), # noqa 0x20400500: ('SQ', '1', "Referenced Image Box Sequence (Retired)", 'Retired', 'ReferencedImageBoxSequenceRetired'), # noqa 0x20500010: ('SQ', '1', "Presentation LUT Sequence", '', 'PresentationLUTSequence'), # noqa 0x20500020: ('CS', '1', "Presentation LUT Shape", '', 'PresentationLUTShape'), # noqa 0x20500500: ('SQ', '1', "Referenced Presentation LUT Sequence", '', 'ReferencedPresentationLUTSequence'), # noqa 0x21000010: ('SH', '1', "Print Job ID", 'Retired', 'PrintJobID'), # noqa 0x21000020: ('CS', '1', "Execution Status", '', 'ExecutionStatus'), # noqa 0x21000030: ('CS', '1', "Execution Status Info", '', 'ExecutionStatusInfo'), # noqa 0x21000040: ('DA', '1', "Creation Date", '', 'CreationDate'), # noqa 0x21000050: ('TM', '1', "Creation Time", '', 'CreationTime'), # noqa 0x21000070: ('AE', '1', "Originator", '', 'Originator'), # noqa 0x21000140: ('AE', '1', "Destination AE", '', 'DestinationAE'), # noqa 0x21000160: ('SH', '1', "Owner ID", '', 'OwnerID'), # noqa 0x21000170: ('IS', '1', "Number of Films", '', 'NumberOfFilms'), # noqa 0x21000500: ('SQ', '1', "Referenced Print Job Sequence (Pull Stored Print)", 'Retired', 'ReferencedPrintJobSequencePullStoredPrint'), # noqa 0x21100010: ('CS', '1', "Printer Status", '', 'PrinterStatus'), # noqa 0x21100020: ('CS', '1', "Printer Status Info", '', 'PrinterStatusInfo'), # noqa 0x21100030: ('LO', '1', "Printer Name", '', 'PrinterName'), # noqa 0x21100099: ('SH', '1', "Print Queue ID", 'Retired', 'PrintQueueID'), # noqa 0x21200010: ('CS', '1', "Queue Status", 'Retired', 'QueueStatus'), # noqa 0x21200050: ('SQ', '1', "Print Job Description Sequence", 'Retired', 'PrintJobDescriptionSequence'), # noqa 0x21200070: ('SQ', '1', "Referenced Print Job Sequence", 'Retired', 'ReferencedPrintJobSequence'), # noqa 0x21300010: ('SQ', '1', "Print Management Capabilities Sequence", 'Retired', 'PrintManagementCapabilitiesSequence'), # noqa 0x21300015: ('SQ', '1', "Printer Characteristics Sequence", 'Retired', 'PrinterCharacteristicsSequence'), # noqa 0x21300030: ('SQ', '1', "Film Box Content Sequence", 'Retired', 'FilmBoxContentSequence'), # noqa 0x21300040: ('SQ', '1', "Image Box Content Sequence", 'Retired', 'ImageBoxContentSequence'), # noqa 0x21300050: ('SQ', '1', "Annotation Content Sequence", 'Retired', 'AnnotationContentSequence'), # noqa 0x21300060: ('SQ', '1', "Image Overlay Box Content Sequence", 'Retired', 'ImageOverlayBoxContentSequence'), # noqa 0x21300080: ('SQ', '1', "Presentation LUT Content Sequence", 'Retired', 'PresentationLUTContentSequence'), # noqa 0x213000A0: ('SQ', '1', "Proposed Study Sequence", '', 'ProposedStudySequence'), # noqa 0x213000C0: ('SQ', '1', "Original Image Sequence", '', 'OriginalImageSequence'), # noqa 0x22000001: ('CS', '1', "Label Using Information Extracted From Instances", '', 'LabelUsingInformationExtractedFromInstances'), # noqa 0x22000002: ('UT', '1', "Label Text", '', 'LabelText'), # noqa 0x22000003: ('CS', '1', "Label Style Selection", '', 'LabelStyleSelection'), # noqa 0x22000004: ('LT', '1', "Media Disposition", '', 'MediaDisposition'), # noqa 0x22000005: ('LT', '1', "Barcode Value", '', 'BarcodeValue'), # noqa 0x22000006: ('CS', '1', "Barcode Symbology", '', 'BarcodeSymbology'), # noqa 0x22000007: ('CS', '1', "Allow Media Splitting", '', 'AllowMediaSplitting'), # noqa 0x22000008: ('CS', '1', "Include Non-DICOM Objects", '', 'IncludeNonDICOMObjects'), # noqa 0x22000009: ('CS', '1', "Include Display Application", '', 'IncludeDisplayApplication'), # noqa 0x2200000A: ('CS', '1', "Preserve Composite Instances After Media Creation", '', 'PreserveCompositeInstancesAfterMediaCreation'), # noqa 0x2200000B: ('US', '1', "Total Number of Pieces of Media Created", '', 'TotalNumberOfPiecesOfMediaCreated'), # noqa 0x2200000C: ('LO', '1', "Requested Media Application Profile", '', 'RequestedMediaApplicationProfile'), # noqa 0x2200000D: ('SQ', '1', "Referenced Storage Media Sequence", '', 'ReferencedStorageMediaSequence'), # noqa 0x2200000E: ('AT', '1-n', "Failure Attributes", '', 'FailureAttributes'), # noqa 0x2200000F: ('CS', '1', "Allow Lossy Compression", '', 'AllowLossyCompression'), # noqa 0x22000020: ('CS', '1', "Request Priority", '', 'RequestPriority'), # noqa 0x30020002: ('SH', '1', "RT Image Label", '', 'RTImageLabel'), # noqa 0x30020003: ('LO', '1', "RT Image Name", '', 'RTImageName'), # noqa 0x30020004: ('ST', '1', "RT Image Description", '', 'RTImageDescription'), # noqa 0x3002000A: ('CS', '1', "Reported Values Origin", '', 'ReportedValuesOrigin'), # noqa 0x3002000C: ('CS', '1', "RT Image Plane", '', 'RTImagePlane'), # noqa 0x3002000D: ('DS', '3', "X-Ray Image Receptor Translation", '', 'XRayImageReceptorTranslation'), # noqa 0x3002000E: ('DS', '1', "X-Ray Image Receptor Angle", '', 'XRayImageReceptorAngle'), # noqa 0x30020010: ('DS', '6', "RT Image Orientation", '', 'RTImageOrientation'), # noqa 0x30020011: ('DS', '2', "Image Plane Pixel Spacing", '', 'ImagePlanePixelSpacing'), # noqa 0x30020012: ('DS', '2', "RT Image Position", '', 'RTImagePosition'), # noqa 0x30020020: ('SH', '1', "Radiation Machine Name", '', 'RadiationMachineName'), # noqa 0x30020022: ('DS', '1', "Radiation Machine SAD", '', 'RadiationMachineSAD'), # noqa 0x30020024: ('DS', '1', "Radiation Machine SSD", '', 'RadiationMachineSSD'), # noqa 0x30020026: ('DS', '1', "RT Image SID", '', 'RTImageSID'), # noqa 0x30020028: ('DS', '1', "Source to Reference Object Distance", '', 'SourceToReferenceObjectDistance'), # noqa 0x30020029: ('IS', '1', "Fraction Number", '', 'FractionNumber'), # noqa 0x30020030: ('SQ', '1', "Exposure Sequence", '', 'ExposureSequence'), # noqa 0x30020032: ('DS', '1', "Meterset Exposure", '', 'MetersetExposure'), # noqa 0x30020034: ('DS', '4', "Diaphragm Position", '', 'DiaphragmPosition'), # noqa 0x30020040: ('SQ', '1', "Fluence Map Sequence", '', 'FluenceMapSequence'), # noqa 0x30020041: ('CS', '1', "Fluence Data Source", '', 'FluenceDataSource'), # noqa 0x30020042: ('DS', '1', "Fluence Data Scale", '', 'FluenceDataScale'), # noqa 0x30020050: ('SQ', '1', "Primary Fluence Mode Sequence", '', 'PrimaryFluenceModeSequence'), # noqa 0x30020051: ('CS', '1', "Fluence Mode", '', 'FluenceMode'), # noqa 0x30020052: ('SH', '1', "Fluence Mode ID", '', 'FluenceModeID'), # noqa 0x30020100: ('IS', '1', "Selected Frame Number", '', 'SelectedFrameNumber'), # noqa 0x30020101: ('SQ', '1', "Selected Frame Functional Groups Sequence", '', 'SelectedFrameFunctionalGroupsSequence'), # noqa 0x30020102: ('SQ', '1', "RT Image Frame General Content Sequence", '', 'RTImageFrameGeneralContentSequence'), # noqa 0x30020103: ('SQ', '1', "RT Image Frame Context Sequence", '', 'RTImageFrameContextSequence'), # noqa 0x30020104: ('SQ', '1', "RT Image Scope Sequence", '', 'RTImageScopeSequence'), # noqa 0x30020105: ('CS', '1', "Beam Modifier Coordinates Presence Flag", '', 'BeamModifierCoordinatesPresenceFlag'), # noqa 0x30020106: ('FD', '1', "Start Cumulative Meterset", '', 'StartCumulativeMeterset'), # noqa 0x30020107: ('FD', '1', "Stop Cumulative Meterset", '', 'StopCumulativeMeterset'), # noqa 0x30020108: ('SQ', '1', "RT Acquisition Patient Position Sequence", '', 'RTAcquisitionPatientPositionSequence'), # noqa 0x30020109: ('SQ', '1', "RT Image Frame Imaging Device Position Sequence", '', 'RTImageFrameImagingDevicePositionSequence'), # noqa 0x3002010A: ('SQ', '1', "RT Image Frame kV Radiation Acquisition Sequence", '', 'RTImageFramekVRadiationAcquisitionSequence'), # noqa 0x3002010B: ('SQ', '1', "RT Image Frame MV Radiation Acquisition Sequence", '', 'RTImageFrameMVRadiationAcquisitionSequence'), # noqa 0x3002010C: ('SQ', '1', "RT Image Frame Radiation Acquisition Sequence", '', 'RTImageFrameRadiationAcquisitionSequence'), # noqa 0x3002010D: ('SQ', '1', "Imaging Source Position Sequence", '', 'ImagingSourcePositionSequence'), # noqa 0x3002010E: ('SQ', '1', "Image Receptor Position Sequence", '', 'ImageReceptorPositionSequence'), # noqa 0x3002010F: ('FD', '16', "Device Position to Equipment Mapping Matrix", '', 'DevicePositionToEquipmentMappingMatrix'), # noqa 0x30020110: ('SQ', '1', "Device Position Parameter Sequence", '', 'DevicePositionParameterSequence'), # noqa 0x30020111: ('CS', '1', "Imaging Source Location Specification Type", '', 'ImagingSourceLocationSpecificationType'), # noqa 0x30020112: ('SQ', '1', "Imaging Device Location Matrix Sequence", '', 'ImagingDeviceLocationMatrixSequence'), # noqa 0x30020113: ('SQ', '1', "Imaging Device Location Parameter Sequence", '', 'ImagingDeviceLocationParameterSequence'), # noqa 0x30020114: ('SQ', '1', "Imaging Aperture Sequence", '', 'ImagingApertureSequence'), # noqa 0x30020115: ('CS', '1', "Imaging Aperture Specification Type", '', 'ImagingApertureSpecificationType'), # noqa 0x30020116: ('US', '1', "Number of Acquisition Devices", '', 'NumberOfAcquisitionDevices'), # noqa 0x30020117: ('SQ', '1', "Acquisition Device Sequence", '', 'AcquisitionDeviceSequence'), # noqa 0x30020118: ('SQ', '1', "Acquisition Task Sequence", '', 'AcquisitionTaskSequence'), # noqa 0x30020119: ('SQ', '1', "Acquisition Task Workitem Code Sequence", '', 'AcquisitionTaskWorkitemCodeSequence'), # noqa 0x3002011A: ('SQ', '1', "Acquisition Subtask Sequence", '', 'AcquisitionSubtaskSequence'), # noqa 0x3002011B: ('SQ', '1', "Subtask Workitem Code Sequence", '', 'SubtaskWorkitemCodeSequence'), # noqa 0x3002011C: ('US', '1', "Acquisition Task Index", '', 'AcquisitionTaskIndex'), # noqa 0x3002011D: ('US', '1', "Acquisition Subtask Index", '', 'AcquisitionSubtaskIndex'), # noqa 0x3002011E: ('SQ', '1', "Referenced Baseline Parameters RT Radiation Instance Sequence", '', 'ReferencedBaselineParametersRTRadiationInstanceSequence'), # noqa 0x3002011F: ('SQ', '1', "Position Acquisition Template Identification Sequence", '', 'PositionAcquisitionTemplateIdentificationSequence'), # noqa 0x30020120: ('ST', '1', "Position Acquisition Template ID", '', 'PositionAcquisitionTemplateID'), # noqa 0x30020121: ('LO', '1', "Position Acquisition Template Name", '', 'PositionAcquisitionTemplateName'), # noqa 0x30020122: ('SQ', '1', "Position Acquisition Template Code Sequence", '', 'PositionAcquisitionTemplateCodeSequence'), # noqa 0x30020123: ('LT', '1', "Position Acquisition Template Description", '', 'PositionAcquisitionTemplateDescription'), # noqa 0x30020124: ('SQ', '1', "Acquisition Task Applicability Sequence", '', 'AcquisitionTaskApplicabilitySequence'), # noqa 0x30020125: ('SQ', '1', "Projection Imaging Acquisition Parameter Sequence", '', 'ProjectionImagingAcquisitionParameterSequence'), # noqa 0x30020126: ('SQ', '1', "CT Imaging Acquisition Parameter Sequence", '', 'CTImagingAcquisitionParameterSequence'), # noqa 0x30020127: ('SQ', '1', "KV Imaging Generation Parameters Sequence", '', 'KVImagingGenerationParametersSequence'), # noqa 0x30020128: ('SQ', '1', "MV Imaging Generation Parameters Sequence", '', 'MVImagingGenerationParametersSequence'), # noqa 0x30020129: ('CS', '1', "Acquisition Signal Type", '', 'AcquisitionSignalType'), # noqa 0x3002012A: ('CS', '1', "Acquisition Method", '', 'AcquisitionMethod'), # noqa 0x3002012B: ('SQ', '1', "Scan Start Position Sequence", '', 'ScanStartPositionSequence'), # noqa 0x3002012C: ('SQ', '1', "Scan Stop Position Sequence", '', 'ScanStopPositionSequence'), # noqa 0x3002012D: ('FD', '1', "Imaging Source to Beam Modifier Definition Plane Distance", '', 'ImagingSourceToBeamModifierDefinitionPlaneDistance'), # noqa 0x3002012E: ('CS', '1', "Scan Arc Type", '', 'ScanArcType'), # noqa 0x3002012F: ('CS', '1', "Detector Positioning Type", '', 'DetectorPositioningType'), # noqa 0x30020130: ('SQ', '1', "Additional RT Accessory Device Sequence", '', 'AdditionalRTAccessoryDeviceSequence'), # noqa 0x30020131: ('SQ', '1', "Device-Specific Acquisition Parameter Sequence", '', 'DeviceSpecificAcquisitionParameterSequence'), # noqa 0x30020132: ('SQ', '1', "Referenced Position Reference Instance Sequence", '', 'ReferencedPositionReferenceInstanceSequence'), # noqa 0x30020133: ('SQ', '1', "Energy Derivation Code Sequence", '', 'EnergyDerivationCodeSequence'), # noqa 0x30020134: ('FD', '1', "Maximum Cumulative Meterset Exposure", '', 'MaximumCumulativeMetersetExposure'), # noqa 0x30020135: ('SQ', '1', "Acquisition Initiation Sequence", '', 'AcquisitionInitiationSequence'), # noqa 0x30040001: ('CS', '1', "DVH Type", '', 'DVHType'), # noqa 0x30040002: ('CS', '1', "Dose Units", '', 'DoseUnits'), # noqa 0x30040004: ('CS', '1', "Dose Type", '', 'DoseType'), # noqa 0x30040005: ('CS', '1', "Spatial Transform of Dose", '', 'SpatialTransformOfDose'), # noqa 0x30040006: ('LO', '1', "Dose Comment", '', 'DoseComment'), # noqa 0x30040008: ('DS', '3', "Normalization Point", '', 'NormalizationPoint'), # noqa 0x3004000A: ('CS', '1', "Dose Summation Type", '', 'DoseSummationType'), # noqa 0x3004000C: ('DS', '2-n', "Grid Frame Offset Vector", '', 'GridFrameOffsetVector'), # noqa 0x3004000E: ('DS', '1', "Dose Grid Scaling", '', 'DoseGridScaling'), # noqa 0x30040010: ('SQ', '1', "RT Dose ROI Sequence", 'Retired', 'RTDoseROISequence'), # noqa 0x30040012: ('DS', '1', "Dose Value", 'Retired', 'DoseValue'), # noqa 0x30040014: ('CS', '1-3', "Tissue Heterogeneity Correction", '', 'TissueHeterogeneityCorrection'), # noqa 0x30040040: ('DS', '3', "DVH Normalization Point", '', 'DVHNormalizationPoint'), # noqa 0x30040042: ('DS', '1', "DVH Normalization Dose Value", '', 'DVHNormalizationDoseValue'), # noqa 0x30040050: ('SQ', '1', "DVH Sequence", '', 'DVHSequence'), # noqa 0x30040052: ('DS', '1', "DVH Dose Scaling", '', 'DVHDoseScaling'), # noqa 0x30040054: ('CS', '1', "DVH Volume Units", '', 'DVHVolumeUnits'), # noqa 0x30040056: ('IS', '1', "DVH Number of Bins", '', 'DVHNumberOfBins'), # noqa 0x30040058: ('DS', '2-2n', "DVH Data", '', 'DVHData'), # noqa 0x30040060: ('SQ', '1', "DVH Referenced ROI Sequence", '', 'DVHReferencedROISequence'), # noqa 0x30040062: ('CS', '1', "DVH ROI Contribution Type", '', 'DVHROIContributionType'), # noqa 0x30040070: ('DS', '1', "DVH Minimum Dose", '', 'DVHMinimumDose'), # noqa 0x30040072: ('DS', '1', "DVH Maximum Dose", '', 'DVHMaximumDose'), # noqa 0x30040074: ('DS', '1', "DVH Mean Dose", '', 'DVHMeanDose'), # noqa 0x30060002: ('SH', '1', "Structure Set Label", '', 'StructureSetLabel'), # noqa 0x30060004: ('LO', '1', "Structure Set Name", '', 'StructureSetName'), # noqa 0x30060006: ('ST', '1', "Structure Set Description", '', 'StructureSetDescription'), # noqa 0x30060008: ('DA', '1', "Structure Set Date", '', 'StructureSetDate'), # noqa 0x30060009: ('TM', '1', "Structure Set Time", '', 'StructureSetTime'), # noqa 0x30060010: ('SQ', '1', "Referenced Frame of Reference Sequence", '', 'ReferencedFrameOfReferenceSequence'), # noqa 0x30060012: ('SQ', '1', "RT Referenced Study Sequence", '', 'RTReferencedStudySequence'), # noqa 0x30060014: ('SQ', '1', "RT Referenced Series Sequence", '', 'RTReferencedSeriesSequence'), # noqa 0x30060016: ('SQ', '1', "Contour Image Sequence", '', 'ContourImageSequence'), # noqa 0x30060018: ('SQ', '1', "Predecessor Structure Set Sequence", '', 'PredecessorStructureSetSequence'), # noqa 0x30060020: ('SQ', '1', "Structure Set ROI Sequence", '', 'StructureSetROISequence'), # noqa 0x30060022: ('IS', '1', "ROI Number", '', 'ROINumber'), # noqa 0x30060024: ('UI', '1', "Referenced Frame of Reference UID", '', 'ReferencedFrameOfReferenceUID'), # noqa 0x30060026: ('LO', '1', "ROI Name", '', 'ROIName'), # noqa 0x30060028: ('ST', '1', "ROI Description", '', 'ROIDescription'), # noqa 0x3006002A: ('IS', '3', "ROI Display Color", '', 'ROIDisplayColor'), # noqa 0x3006002C: ('DS', '1', "ROI Volume", '', 'ROIVolume'), # noqa 0x30060030: ('SQ', '1', "RT Related ROI Sequence", '', 'RTRelatedROISequence'), # noqa 0x30060033: ('CS', '1', "RT ROI Relationship", '', 'RTROIRelationship'), # noqa 0x30060036: ('CS', '1', "ROI Generation Algorithm", '', 'ROIGenerationAlgorithm'), # noqa 0x30060037: ('SQ', '1', "ROI Derivation Algorithm Identification Sequence", '', 'ROIDerivationAlgorithmIdentificationSequence'), # noqa 0x30060038: ('LO', '1', "ROI Generation Description", '', 'ROIGenerationDescription'), # noqa 0x30060039: ('SQ', '1', "ROI Contour Sequence", '', 'ROIContourSequence'), # noqa 0x30060040: ('SQ', '1', "Contour Sequence", '', 'ContourSequence'), # noqa 0x30060042: ('CS', '1', "Contour Geometric Type", '', 'ContourGeometricType'), # noqa 0x30060044: ('DS', '1', "Contour Slab Thickness", 'Retired', 'ContourSlabThickness'), # noqa 0x30060045: ('DS', '3', "Contour Offset Vector", 'Retired', 'ContourOffsetVector'), # noqa 0x30060046: ('IS', '1', "Number of Contour Points", '', 'NumberOfContourPoints'), # noqa 0x30060048: ('IS', '1', "Contour Number", '', 'ContourNumber'), # noqa 0x30060049: ('IS', '1-n', "Attached Contours", 'Retired', 'AttachedContours'), # noqa 0x3006004A: ('SQ', '1', "Source Pixel Planes Characteristics Sequence", '', 'SourcePixelPlanesCharacteristicsSequence'), # noqa 0x30060050: ('DS', '3-3n', "Contour Data", '', 'ContourData'), # noqa 0x30060080: ('SQ', '1', "RT ROI Observations Sequence", '', 'RTROIObservationsSequence'), # noqa 0x30060082: ('IS', '1', "Observation Number", '', 'ObservationNumber'), # noqa 0x30060084: ('IS', '1', "Referenced ROI Number", '', 'ReferencedROINumber'), # noqa 0x30060085: ('SH', '1', "ROI Observation Label", 'Retired', 'ROIObservationLabel'), # noqa 0x30060086: ('SQ', '1', "RT ROI Identification Code Sequence", '', 'RTROIIdentificationCodeSequence'), # noqa 0x30060088: ('ST', '1', "ROI Observation Description", 'Retired', 'ROIObservationDescription'), # noqa 0x300600A0: ('SQ', '1', "Related RT ROI Observations Sequence", '', 'RelatedRTROIObservationsSequence'), # noqa 0x300600A4: ('CS', '1', "RT ROI Interpreted Type", '', 'RTROIInterpretedType'), # noqa 0x300600A6: ('PN', '1', "ROI Interpreter", '', 'ROIInterpreter'), # noqa 0x300600B0: ('SQ', '1', "ROI Physical Properties Sequence", '', 'ROIPhysicalPropertiesSequence'), # noqa 0x300600B2: ('CS', '1', "ROI Physical Property", '', 'ROIPhysicalProperty'), # noqa 0x300600B4: ('DS', '1', "ROI Physical Property Value", '', 'ROIPhysicalPropertyValue'), # noqa 0x300600B6: ('SQ', '1', "ROI Elemental Composition Sequence", '', 'ROIElementalCompositionSequence'), # noqa 0x300600B7: ('US', '1', "ROI Elemental Composition Atomic Number", '', 'ROIElementalCompositionAtomicNumber'), # noqa 0x300600B8: ('FL', '1', "ROI Elemental Composition Atomic Mass Fraction", '', 'ROIElementalCompositionAtomicMassFraction'), # noqa 0x300600B9: ('SQ', '1', "Additional RT ROI Identification Code Sequence", 'Retired', 'AdditionalRTROIIdentificationCodeSequence'), # noqa 0x300600C0: ('SQ', '1', "Frame of Reference Relationship Sequence", 'Retired', 'FrameOfReferenceRelationshipSequence'), # noqa 0x300600C2: ('UI', '1', "Related Frame of Reference UID", 'Retired', 'RelatedFrameOfReferenceUID'), # noqa 0x300600C4: ('CS', '1', "Frame of Reference Transformation Type", 'Retired', 'FrameOfReferenceTransformationType'), # noqa 0x300600C6: ('DS', '16', "Frame of Reference Transformation Matrix", '', 'FrameOfReferenceTransformationMatrix'), # noqa 0x300600C8: ('LO', '1', "Frame of Reference Transformation Comment", '', 'FrameOfReferenceTransformationComment'), # noqa 0x300600C9: ('SQ', '1', "Patient Location Coordinates Sequence", '', 'PatientLocationCoordinatesSequence'), # noqa 0x300600CA: ('SQ', '1', "Patient Location Coordinates Code Sequence", '', 'PatientLocationCoordinatesCodeSequence'), # noqa 0x300600CB: ('SQ', '1', "Patient Support Position Sequence", '', 'PatientSupportPositionSequence'), # noqa 0x30080010: ('SQ', '1', "Measured Dose Reference Sequence", '', 'MeasuredDoseReferenceSequence'), # noqa 0x30080012: ('ST', '1', "Measured Dose Description", '', 'MeasuredDoseDescription'), # noqa 0x30080014: ('CS', '1', "Measured Dose Type", '', 'MeasuredDoseType'), # noqa 0x30080016: ('DS', '1', "Measured Dose Value", '', 'MeasuredDoseValue'), # noqa 0x30080020: ('SQ', '1', "Treatment Session Beam Sequence", '', 'TreatmentSessionBeamSequence'), # noqa 0x30080021: ('SQ', '1', "Treatment Session Ion Beam Sequence", '', 'TreatmentSessionIonBeamSequence'), # noqa 0x30080022: ('IS', '1', "Current Fraction Number", '', 'CurrentFractionNumber'), # noqa 0x30080024: ('DA', '1', "Treatment Control Point Date", '', 'TreatmentControlPointDate'), # noqa 0x30080025: ('TM', '1', "Treatment Control Point Time", '', 'TreatmentControlPointTime'), # noqa 0x3008002A: ('CS', '1', "Treatment Termination Status", '', 'TreatmentTerminationStatus'), # noqa 0x3008002B: ('SH', '1', "Treatment Termination Code", 'Retired', 'TreatmentTerminationCode'), # noqa 0x3008002C: ('CS', '1', "Treatment Verification Status", '', 'TreatmentVerificationStatus'), # noqa 0x30080030: ('SQ', '1', "Referenced Treatment Record Sequence", '', 'ReferencedTreatmentRecordSequence'), # noqa 0x30080032: ('DS', '1', "Specified Primary Meterset", '', 'SpecifiedPrimaryMeterset'), # noqa 0x30080033: ('DS', '1', "Specified Secondary Meterset", '', 'SpecifiedSecondaryMeterset'), # noqa 0x30080036: ('DS', '1', "Delivered Primary Meterset", '', 'DeliveredPrimaryMeterset'), # noqa 0x30080037: ('DS', '1', "Delivered Secondary Meterset", '', 'DeliveredSecondaryMeterset'), # noqa 0x3008003A: ('DS', '1', "Specified Treatment Time", '', 'SpecifiedTreatmentTime'), # noqa 0x3008003B: ('DS', '1', "Delivered Treatment Time", '', 'DeliveredTreatmentTime'), # noqa 0x30080040: ('SQ', '1', "Control Point Delivery Sequence", '', 'ControlPointDeliverySequence'), # noqa 0x30080041: ('SQ', '1', "Ion Control Point Delivery Sequence", '', 'IonControlPointDeliverySequence'), # noqa 0x30080042: ('DS', '1', "Specified Meterset", '', 'SpecifiedMeterset'), # noqa 0x30080044: ('DS', '1', "Delivered Meterset", '', 'DeliveredMeterset'), # noqa 0x30080045: ('FL', '1', "Meterset Rate Set", '', 'MetersetRateSet'), # noqa 0x30080046: ('FL', '1', "Meterset Rate Delivered", '', 'MetersetRateDelivered'), # noqa 0x30080047: ('FL', '1-n', "Scan Spot Metersets Delivered", '', 'ScanSpotMetersetsDelivered'), # noqa 0x30080048: ('DS', '1', "Dose Rate Delivered", '', 'DoseRateDelivered'), # noqa 0x30080050: ('SQ', '1', "Treatment Summary Calculated Dose Reference Sequence", '', 'TreatmentSummaryCalculatedDoseReferenceSequence'), # noqa 0x30080052: ('DS', '1', "Cumulative Dose to Dose Reference", '', 'CumulativeDoseToDoseReference'), # noqa 0x30080054: ('DA', '1', "First Treatment Date", '', 'FirstTreatmentDate'), # noqa 0x30080056: ('DA', '1', "Most Recent Treatment Date", '', 'MostRecentTreatmentDate'), # noqa 0x3008005A: ('IS', '1', "Number of Fractions Delivered", '', 'NumberOfFractionsDelivered'), # noqa 0x30080060: ('SQ', '1', "Override Sequence", '', 'OverrideSequence'), # noqa 0x30080061: ('AT', '1', "Parameter Sequence Pointer", '', 'ParameterSequencePointer'), # noqa 0x30080062: ('AT', '1', "Override Parameter Pointer", '', 'OverrideParameterPointer'), # noqa 0x30080063: ('IS', '1', "Parameter Item Index", '', 'ParameterItemIndex'), # noqa 0x30080064: ('IS', '1', "Measured Dose Reference Number", '', 'MeasuredDoseReferenceNumber'), # noqa 0x30080065: ('AT', '1', "Parameter Pointer", '', 'ParameterPointer'), # noqa 0x30080066: ('ST', '1', "Override Reason", '', 'OverrideReason'), # noqa 0x30080067: ('US', '1', "Parameter Value Number", '', 'ParameterValueNumber'), # noqa 0x30080068: ('SQ', '1', "Corrected Parameter Sequence", '', 'CorrectedParameterSequence'), # noqa 0x3008006A: ('FL', '1', "Correction Value", '', 'CorrectionValue'), # noqa 0x30080070: ('SQ', '1', "Calculated Dose Reference Sequence", '', 'CalculatedDoseReferenceSequence'), # noqa 0x30080072: ('IS', '1', "Calculated Dose Reference Number", '', 'CalculatedDoseReferenceNumber'), # noqa 0x30080074: ('ST', '1', "Calculated Dose Reference Description", '', 'CalculatedDoseReferenceDescription'), # noqa 0x30080076: ('DS', '1', "Calculated Dose Reference Dose Value", '', 'CalculatedDoseReferenceDoseValue'), # noqa 0x30080078: ('DS', '1', "Start Meterset", '', 'StartMeterset'), # noqa 0x3008007A: ('DS', '1', "End Meterset", '', 'EndMeterset'), # noqa 0x30080080: ('SQ', '1', "Referenced Measured Dose Reference Sequence", '', 'ReferencedMeasuredDoseReferenceSequence'), # noqa 0x30080082: ('IS', '1', "Referenced Measured Dose Reference Number", '', 'ReferencedMeasuredDoseReferenceNumber'), # noqa 0x30080090: ('SQ', '1', "Referenced Calculated Dose Reference Sequence", '', 'ReferencedCalculatedDoseReferenceSequence'), # noqa 0x30080092: ('IS', '1', "Referenced Calculated Dose Reference Number", '', 'ReferencedCalculatedDoseReferenceNumber'), # noqa 0x300800A0: ('SQ', '1', "Beam Limiting Device Leaf Pairs Sequence", '', 'BeamLimitingDeviceLeafPairsSequence'), # noqa 0x300800A1: ('SQ', '1', "Enhanced RT Beam Limiting Device Sequence", '', 'EnhancedRTBeamLimitingDeviceSequence'), # noqa 0x300800A2: ('SQ', '1', "Enhanced RT Beam Limiting Opening Sequence", '', 'EnhancedRTBeamLimitingOpeningSequence'), # noqa 0x300800A3: ('CS', '1', "Enhanced RT Beam Limiting Device Definition Flag", '', 'EnhancedRTBeamLimitingDeviceDefinitionFlag'), # noqa 0x300800A4: ('FD', '2-2n', "Parallel RT Beam Delimiter Opening Extents", '', 'ParallelRTBeamDelimiterOpeningExtents'), # noqa 0x300800B0: ('SQ', '1', "Recorded Wedge Sequence", '', 'RecordedWedgeSequence'), # noqa 0x300800C0: ('SQ', '1', "Recorded Compensator Sequence", '', 'RecordedCompensatorSequence'), # noqa 0x300800D0: ('SQ', '1', "Recorded Block Sequence", '', 'RecordedBlockSequence'), # noqa 0x300800D1: ('SQ', '1', "Recorded Block Slab Sequence", '', 'RecordedBlockSlabSequence'), # noqa 0x300800E0: ('SQ', '1', "Treatment Summary Measured Dose Reference Sequence", '', 'TreatmentSummaryMeasuredDoseReferenceSequence'), # noqa 0x300800F0: ('SQ', '1', "Recorded Snout Sequence", '', 'RecordedSnoutSequence'), # noqa 0x300800F2: ('SQ', '1', "Recorded Range Shifter Sequence", '', 'RecordedRangeShifterSequence'), # noqa 0x300800F4: ('SQ', '1', "Recorded Lateral Spreading Device Sequence", '', 'RecordedLateralSpreadingDeviceSequence'), # noqa 0x300800F6: ('SQ', '1', "Recorded Range Modulator Sequence", '', 'RecordedRangeModulatorSequence'), # noqa 0x30080100: ('SQ', '1', "Recorded Source Sequence", '', 'RecordedSourceSequence'), # noqa 0x30080105: ('LO', '1', "Source Serial Number", '', 'SourceSerialNumber'), # noqa 0x30080110: ('SQ', '1', "Treatment Session Application Setup Sequence", '', 'TreatmentSessionApplicationSetupSequence'), # noqa 0x30080116: ('CS', '1', "Application Setup Check", '', 'ApplicationSetupCheck'), # noqa 0x30080120: ('SQ', '1', "Recorded Brachy Accessory Device Sequence", '', 'RecordedBrachyAccessoryDeviceSequence'), # noqa 0x30080122: ('IS', '1', "Referenced Brachy Accessory Device Number", '', 'ReferencedBrachyAccessoryDeviceNumber'), # noqa 0x30080130: ('SQ', '1', "Recorded Channel Sequence", '', 'RecordedChannelSequence'), # noqa 0x30080132: ('DS', '1', "Specified Channel Total Time", '', 'SpecifiedChannelTotalTime'), # noqa 0x30080134: ('DS', '1', "Delivered Channel Total Time", '', 'DeliveredChannelTotalTime'), # noqa 0x30080136: ('IS', '1', "Specified Number of Pulses", '', 'SpecifiedNumberOfPulses'), # noqa 0x30080138: ('IS', '1', "Delivered Number of Pulses", '', 'DeliveredNumberOfPulses'), # noqa 0x3008013A: ('DS', '1', "Specified Pulse Repetition Interval", '', 'SpecifiedPulseRepetitionInterval'), # noqa 0x3008013C: ('DS', '1', "Delivered Pulse Repetition Interval", '', 'DeliveredPulseRepetitionInterval'), # noqa 0x30080140: ('SQ', '1', "Recorded Source Applicator Sequence", '', 'RecordedSourceApplicatorSequence'), # noqa 0x30080142: ('IS', '1', "Referenced Source Applicator Number", '', 'ReferencedSourceApplicatorNumber'), # noqa 0x30080150: ('SQ', '1', "Recorded Channel Shield Sequence", '', 'RecordedChannelShieldSequence'), # noqa 0x30080152: ('IS', '1', "Referenced Channel Shield Number", '', 'ReferencedChannelShieldNumber'), # noqa 0x30080160: ('SQ', '1', "Brachy Control Point Delivered Sequence", '', 'BrachyControlPointDeliveredSequence'), # noqa 0x30080162: ('DA', '1', "Safe Position Exit Date", '', 'SafePositionExitDate'), # noqa 0x30080164: ('TM', '1', "Safe Position Exit Time", '', 'SafePositionExitTime'), # noqa 0x30080166: ('DA', '1', "Safe Position Return Date", '', 'SafePositionReturnDate'), # noqa 0x30080168: ('TM', '1', "Safe Position Return Time", '', 'SafePositionReturnTime'), # noqa 0x30080171: ('SQ', '1', "Pulse Specific Brachy Control Point Delivered Sequence", '', 'PulseSpecificBrachyControlPointDeliveredSequence'), # noqa 0x30080172: ('US', '1', "Pulse Number", '', 'PulseNumber'), # noqa 0x30080173: ('SQ', '1', "Brachy Pulse Control Point Delivered Sequence", '', 'BrachyPulseControlPointDeliveredSequence'), # noqa 0x30080200: ('CS', '1', "Current Treatment Status", '', 'CurrentTreatmentStatus'), # noqa 0x30080202: ('ST', '1', "Treatment Status Comment", '', 'TreatmentStatusComment'), # noqa 0x30080220: ('SQ', '1', "Fraction Group Summary Sequence", '', 'FractionGroupSummarySequence'), # noqa 0x30080223: ('IS', '1', "Referenced Fraction Number", '', 'ReferencedFractionNumber'), # noqa 0x30080224: ('CS', '1', "Fraction Group Type", '', 'FractionGroupType'), # noqa 0x30080230: ('CS', '1', "Beam Stopper Position", '', 'BeamStopperPosition'), # noqa 0x30080240: ('SQ', '1', "Fraction Status Summary Sequence", '', 'FractionStatusSummarySequence'), # noqa 0x30080250: ('DA', '1', "Treatment Date", '', 'TreatmentDate'), # noqa 0x30080251: ('TM', '1', "Treatment Time", '', 'TreatmentTime'), # noqa 0x300A0002: ('SH', '1', "RT Plan Label", '', 'RTPlanLabel'), # noqa 0x300A0003: ('LO', '1', "RT Plan Name", '', 'RTPlanName'), # noqa 0x300A0004: ('ST', '1', "RT Plan Description", '', 'RTPlanDescription'), # noqa 0x300A0006: ('DA', '1', "RT Plan Date", '', 'RTPlanDate'), # noqa 0x300A0007: ('TM', '1', "RT Plan Time", '', 'RTPlanTime'), # noqa 0x300A0009: ('LO', '1-n', "Treatment Protocols", '', 'TreatmentProtocols'), # noqa 0x300A000A: ('CS', '1', "Plan Intent", '', 'PlanIntent'), # noqa 0x300A000B: ('LO', '1-n', "Treatment Sites", 'Retired', 'TreatmentSites'), # noqa 0x300A000C: ('CS', '1', "RT Plan Geometry", '', 'RTPlanGeometry'), # noqa 0x300A000E: ('ST', '1', "Prescription Description", '', 'PrescriptionDescription'), # noqa 0x300A0010: ('SQ', '1', "Dose Reference Sequence", '', 'DoseReferenceSequence'), # noqa 0x300A0012: ('IS', '1', "Dose Reference Number", '', 'DoseReferenceNumber'), # noqa 0x300A0013: ('UI', '1', "Dose Reference UID", '', 'DoseReferenceUID'), # noqa 0x300A0014: ('CS', '1', "Dose Reference Structure Type", '', 'DoseReferenceStructureType'), # noqa 0x300A0015: ('CS', '1', "Nominal Beam Energy Unit", '', 'NominalBeamEnergyUnit'), # noqa 0x300A0016: ('LO', '1', "Dose Reference Description", '', 'DoseReferenceDescription'), # noqa 0x300A0018: ('DS', '3', "Dose Reference Point Coordinates", '', 'DoseReferencePointCoordinates'), # noqa 0x300A001A: ('DS', '1', "Nominal Prior Dose", '', 'NominalPriorDose'), # noqa 0x300A0020: ('CS', '1', "Dose Reference Type", '', 'DoseReferenceType'), # noqa 0x300A0021: ('DS', '1', "Constraint Weight", '', 'ConstraintWeight'), # noqa 0x300A0022: ('DS', '1', "Delivery Warning Dose", '', 'DeliveryWarningDose'), # noqa 0x300A0023: ('DS', '1', "Delivery Maximum Dose", '', 'DeliveryMaximumDose'), # noqa 0x300A0025: ('DS', '1', "Target Minimum Dose", '', 'TargetMinimumDose'), # noqa 0x300A0026: ('DS', '1', "Target Prescription Dose", '', 'TargetPrescriptionDose'), # noqa 0x300A0027: ('DS', '1', "Target Maximum Dose", '', 'TargetMaximumDose'), # noqa 0x300A0028: ('DS', '1', "Target Underdose Volume Fraction", '', 'TargetUnderdoseVolumeFraction'), # noqa 0x300A002A: ('DS', '1', "Organ at Risk Full-volume Dose", '', 'OrganAtRiskFullVolumeDose'), # noqa 0x300A002B: ('DS', '1', "Organ at Risk Limit Dose", '', 'OrganAtRiskLimitDose'), # noqa 0x300A002C: ('DS', '1', "Organ at Risk Maximum Dose", '', 'OrganAtRiskMaximumDose'), # noqa 0x300A002D: ('DS', '1', "Organ at Risk Overdose Volume Fraction", '', 'OrganAtRiskOverdoseVolumeFraction'), # noqa 0x300A0040: ('SQ', '1', "Tolerance Table Sequence", '', 'ToleranceTableSequence'), # noqa 0x300A0042: ('IS', '1', "Tolerance Table Number", '', 'ToleranceTableNumber'), # noqa 0x300A0043: ('SH', '1', "Tolerance Table Label", '', 'ToleranceTableLabel'), # noqa 0x300A0044: ('DS', '1', "Gantry Angle Tolerance", '', 'GantryAngleTolerance'), # noqa 0x300A0046: ('DS', '1', "Beam Limiting Device Angle Tolerance", '', 'BeamLimitingDeviceAngleTolerance'), # noqa 0x300A0048: ('SQ', '1', "Beam Limiting Device Tolerance Sequence", '', 'BeamLimitingDeviceToleranceSequence'), # noqa 0x300A004A: ('DS', '1', "Beam Limiting Device Position Tolerance", '', 'BeamLimitingDevicePositionTolerance'), # noqa 0x300A004B: ('FL', '1', "Snout Position Tolerance", '', 'SnoutPositionTolerance'), # noqa 0x300A004C: ('DS', '1', "Patient Support Angle Tolerance", '', 'PatientSupportAngleTolerance'), # noqa 0x300A004E: ('DS', '1', "Table Top Eccentric Angle Tolerance", '', 'TableTopEccentricAngleTolerance'), # noqa 0x300A004F: ('FL', '1', "Table Top Pitch Angle Tolerance", '', 'TableTopPitchAngleTolerance'), # noqa 0x300A0050: ('FL', '1', "Table Top Roll Angle Tolerance", '', 'TableTopRollAngleTolerance'), # noqa 0x300A0051: ('DS', '1', "Table Top Vertical Position Tolerance", '', 'TableTopVerticalPositionTolerance'), # noqa 0x300A0052: ('DS', '1', "Table Top Longitudinal Position Tolerance", '', 'TableTopLongitudinalPositionTolerance'), # noqa 0x300A0053: ('DS', '1', "Table Top Lateral Position Tolerance", '', 'TableTopLateralPositionTolerance'), # noqa 0x300A0055: ('CS', '1', "RT Plan Relationship", '', 'RTPlanRelationship'), # noqa 0x300A0070: ('SQ', '1', "Fraction Group Sequence", '', 'FractionGroupSequence'), # noqa 0x300A0071: ('IS', '1', "Fraction Group Number", '', 'FractionGroupNumber'), # noqa 0x300A0072: ('LO', '1', "Fraction Group Description", '', 'FractionGroupDescription'), # noqa 0x300A0078: ('IS', '1', "Number of Fractions Planned", '', 'NumberOfFractionsPlanned'), # noqa 0x300A0079: ('IS', '1', "Number of Fraction Pattern Digits Per Day", '', 'NumberOfFractionPatternDigitsPerDay'), # noqa 0x300A007A: ('IS', '1', "Repeat Fraction Cycle Length", '', 'RepeatFractionCycleLength'), # noqa 0x300A007B: ('LT', '1', "Fraction Pattern", '', 'FractionPattern'), # noqa 0x300A0080: ('IS', '1', "Number of Beams", '', 'NumberOfBeams'), # noqa 0x300A0082: ('DS', '3', "Beam Dose Specification Point", 'Retired', 'BeamDoseSpecificationPoint'), # noqa 0x300A0083: ('UI', '1', "Referenced Dose Reference UID", '', 'ReferencedDoseReferenceUID'), # noqa 0x300A0084: ('DS', '1', "Beam Dose", '', 'BeamDose'), # noqa 0x300A0086: ('DS', '1', "Beam Meterset", '', 'BeamMeterset'), # noqa 0x300A0088: ('FL', '1', "Beam Dose Point Depth", '', 'BeamDosePointDepth'), # noqa 0x300A0089: ('FL', '1', "Beam Dose Point Equivalent Depth", '', 'BeamDosePointEquivalentDepth'), # noqa 0x300A008A: ('FL', '1', "Beam Dose Point SSD", '', 'BeamDosePointSSD'), # noqa 0x300A008B: ('CS', '1', "Beam Dose Meaning", '', 'BeamDoseMeaning'), # noqa 0x300A008C: ('SQ', '1', "Beam Dose Verification Control Point Sequence", '', 'BeamDoseVerificationControlPointSequence'), # noqa 0x300A008D: ('FL', '1', "Average Beam Dose Point Depth", 'Retired', 'AverageBeamDosePointDepth'), # noqa 0x300A008E: ('FL', '1', "Average Beam Dose Point Equivalent Depth", 'Retired', 'AverageBeamDosePointEquivalentDepth'), # noqa 0x300A008F: ('FL', '1', "Average Beam Dose Point SSD", 'Retired', 'AverageBeamDosePointSSD'), # noqa 0x300A0090: ('CS', '1', "Beam Dose Type", '', 'BeamDoseType'), # noqa 0x300A0091: ('DS', '1', "Alternate Beam Dose", '', 'AlternateBeamDose'), # noqa 0x300A0092: ('CS', '1', "Alternate Beam Dose Type", '', 'AlternateBeamDoseType'), # noqa 0x300A0093: ('CS', '1', "Depth Value Averaging Flag", '', 'DepthValueAveragingFlag'), # noqa 0x300A0094: ('DS', '1', "Beam Dose Point Source to External Contour Distance", '', 'BeamDosePointSourceToExternalContourDistance'), # noqa 0x300A00A0: ('IS', '1', "Number of Brachy Application Setups", '', 'NumberOfBrachyApplicationSetups'), # noqa 0x300A00A2: ('DS', '3', "Brachy Application Setup Dose Specification Point", '', 'BrachyApplicationSetupDoseSpecificationPoint'), # noqa 0x300A00A4: ('DS', '1', "Brachy Application Setup Dose", '', 'BrachyApplicationSetupDose'), # noqa 0x300A00B0: ('SQ', '1', "Beam Sequence", '', 'BeamSequence'), # noqa 0x300A00B2: ('SH', '1', "Treatment Machine Name", '', 'TreatmentMachineName'), # noqa 0x300A00B3: ('CS', '1', "Primary Dosimeter Unit", '', 'PrimaryDosimeterUnit'), # noqa 0x300A00B4: ('DS', '1', "Source-Axis Distance", '', 'SourceAxisDistance'), # noqa 0x300A00B6: ('SQ', '1', "Beam Limiting Device Sequence", '', 'BeamLimitingDeviceSequence'), # noqa 0x300A00B8: ('CS', '1', "RT Beam Limiting Device Type", '', 'RTBeamLimitingDeviceType'), # noqa 0x300A00BA: ('DS', '1', "Source to Beam Limiting Device Distance", '', 'SourceToBeamLimitingDeviceDistance'), # noqa 0x300A00BB: ('FL', '1', "Isocenter to Beam Limiting Device Distance", '', 'IsocenterToBeamLimitingDeviceDistance'), # noqa 0x300A00BC: ('IS', '1', "Number of Leaf/Jaw Pairs", '', 'NumberOfLeafJawPairs'), # noqa 0x300A00BE: ('DS', '3-n', "Leaf Position Boundaries", '', 'LeafPositionBoundaries'), # noqa 0x300A00C0: ('IS', '1', "Beam Number", '', 'BeamNumber'), # noqa 0x300A00C2: ('LO', '1', "Beam Name", '', 'BeamName'), # noqa 0x300A00C3: ('ST', '1', "Beam Description", '', 'BeamDescription'), # noqa 0x300A00C4: ('CS', '1', "Beam Type", '', 'BeamType'), # noqa 0x300A00C5: ('FD', '1', "Beam Delivery Duration Limit", '', 'BeamDeliveryDurationLimit'), # noqa 0x300A00C6: ('CS', '1', "Radiation Type", '', 'RadiationType'), # noqa 0x300A00C7: ('CS', '1', "High-Dose Technique Type", '', 'HighDoseTechniqueType'), # noqa 0x300A00C8: ('IS', '1', "Reference Image Number", '', 'ReferenceImageNumber'), # noqa 0x300A00CA: ('SQ', '1', "Planned Verification Image Sequence", '', 'PlannedVerificationImageSequence'), # noqa 0x300A00CC: ('LO', '1-n', "Imaging Device-Specific Acquisition Parameters", '', 'ImagingDeviceSpecificAcquisitionParameters'), # noqa 0x300A00CE: ('CS', '1', "Treatment Delivery Type", '', 'TreatmentDeliveryType'), # noqa 0x300A00D0: ('IS', '1', "Number of Wedges", '', 'NumberOfWedges'), # noqa 0x300A00D1: ('SQ', '1', "Wedge Sequence", '', 'WedgeSequence'), # noqa 0x300A00D2: ('IS', '1', "Wedge Number", '', 'WedgeNumber'), # noqa 0x300A00D3: ('CS', '1', "Wedge Type", '', 'WedgeType'), # noqa 0x300A00D4: ('SH', '1', "Wedge ID", '', 'WedgeID'), # noqa 0x300A00D5: ('IS', '1', "Wedge Angle", '', 'WedgeAngle'), # noqa 0x300A00D6: ('DS', '1', "Wedge Factor", '', 'WedgeFactor'), # noqa 0x300A00D7: ('FL', '1', "Total Wedge Tray Water-Equivalent Thickness", '', 'TotalWedgeTrayWaterEquivalentThickness'), # noqa 0x300A00D8: ('DS', '1', "Wedge Orientation", '', 'WedgeOrientation'), # noqa 0x300A00D9: ('FL', '1', "Isocenter to Wedge Tray Distance", '', 'IsocenterToWedgeTrayDistance'), # noqa 0x300A00DA: ('DS', '1', "Source to Wedge Tray Distance", '', 'SourceToWedgeTrayDistance'), # noqa 0x300A00DB: ('FL', '1', "Wedge Thin Edge Position", '', 'WedgeThinEdgePosition'), # noqa 0x300A00DC: ('SH', '1', "Bolus ID", '', 'BolusID'), # noqa 0x300A00DD: ('ST', '1', "Bolus Description", '', 'BolusDescription'), # noqa 0x300A00DE: ('DS', '1', "Effective Wedge Angle", '', 'EffectiveWedgeAngle'), # noqa 0x300A00E0: ('IS', '1', "Number of Compensators", '', 'NumberOfCompensators'), # noqa 0x300A00E1: ('SH', '1', "Material ID", '', 'MaterialID'), # noqa 0x300A00E2: ('DS', '1', "Total Compensator Tray Factor", '', 'TotalCompensatorTrayFactor'), # noqa 0x300A00E3: ('SQ', '1', "Compensator Sequence", '', 'CompensatorSequence'), # noqa 0x300A00E4: ('IS', '1', "Compensator Number", '', 'CompensatorNumber'), # noqa 0x300A00E5: ('SH', '1', "Compensator ID", '', 'CompensatorID'), # noqa 0x300A00E6: ('DS', '1', "Source to Compensator Tray Distance", '', 'SourceToCompensatorTrayDistance'), # noqa 0x300A00E7: ('IS', '1', "Compensator Rows", '', 'CompensatorRows'), # noqa 0x300A00E8: ('IS', '1', "Compensator Columns", '', 'CompensatorColumns'), # noqa 0x300A00E9: ('DS', '2', "Compensator Pixel Spacing", '', 'CompensatorPixelSpacing'), # noqa 0x300A00EA: ('DS', '2', "Compensator Position", '', 'CompensatorPosition'), # noqa 0x300A00EB: ('DS', '1-n', "Compensator Transmission Data", '', 'CompensatorTransmissionData'), # noqa 0x300A00EC: ('DS', '1-n', "Compensator Thickness Data", '', 'CompensatorThicknessData'), # noqa 0x300A00ED: ('IS', '1', "Number of Boli", '', 'NumberOfBoli'), # noqa 0x300A00EE: ('CS', '1', "Compensator Type", '', 'CompensatorType'), # noqa 0x300A00EF: ('SH', '1', "Compensator Tray ID", '', 'CompensatorTrayID'), # noqa 0x300A00F0: ('IS', '1', "Number of Blocks", '', 'NumberOfBlocks'), # noqa 0x300A00F2: ('DS', '1', "Total Block Tray Factor", '', 'TotalBlockTrayFactor'), # noqa 0x300A00F3: ('FL', '1', "Total Block Tray Water-Equivalent Thickness", '', 'TotalBlockTrayWaterEquivalentThickness'), # noqa 0x300A00F4: ('SQ', '1', "Block Sequence", '', 'BlockSequence'), # noqa 0x300A00F5: ('SH', '1', "Block Tray ID", '', 'BlockTrayID'), # noqa 0x300A00F6: ('DS', '1', "Source to Block Tray Distance", '', 'SourceToBlockTrayDistance'), # noqa 0x300A00F7: ('FL', '1', "Isocenter to Block Tray Distance", '', 'IsocenterToBlockTrayDistance'), # noqa 0x300A00F8: ('CS', '1', "Block Type", '', 'BlockType'), # noqa 0x300A00F9: ('LO', '1', "Accessory Code", '', 'AccessoryCode'), # noqa 0x300A00FA: ('CS', '1', "Block Divergence", '', 'BlockDivergence'), # noqa 0x300A00FB: ('CS', '1', "Block Mounting Position", '', 'BlockMountingPosition'), # noqa 0x300A00FC: ('IS', '1', "Block Number", '', 'BlockNumber'), # noqa 0x300A00FE: ('LO', '1', "Block Name", '', 'BlockName'), # noqa 0x300A0100: ('DS', '1', "Block Thickness", '', 'BlockThickness'), # noqa 0x300A0102: ('DS', '1', "Block Transmission", '', 'BlockTransmission'), # noqa 0x300A0104: ('IS', '1', "Block Number of Points", '', 'BlockNumberOfPoints'), # noqa 0x300A0106: ('DS', '2-2n', "Block Data", '', 'BlockData'), # noqa 0x300A0107: ('SQ', '1', "Applicator Sequence", '', 'ApplicatorSequence'), # noqa 0x300A0108: ('SH', '1', "Applicator ID", '', 'ApplicatorID'), # noqa 0x300A0109: ('CS', '1', "Applicator Type", '', 'ApplicatorType'), # noqa 0x300A010A: ('LO', '1', "Applicator Description", '', 'ApplicatorDescription'), # noqa 0x300A010C: ('DS', '1', "Cumulative Dose Reference Coefficient", '', 'CumulativeDoseReferenceCoefficient'), # noqa 0x300A010E: ('DS', '1', "Final Cumulative Meterset Weight", '', 'FinalCumulativeMetersetWeight'), # noqa 0x300A0110: ('IS', '1', "Number of Control Points", '', 'NumberOfControlPoints'), # noqa 0x300A0111: ('SQ', '1', "Control Point Sequence", '', 'ControlPointSequence'), # noqa 0x300A0112: ('IS', '1', "Control Point Index", '', 'ControlPointIndex'), # noqa 0x300A0114: ('DS', '1', "Nominal Beam Energy", '', 'NominalBeamEnergy'), # noqa 0x300A0115: ('DS', '1', "Dose Rate Set", '', 'DoseRateSet'), # noqa 0x300A0116: ('SQ', '1', "Wedge Position Sequence", '', 'WedgePositionSequence'), # noqa 0x300A0118: ('CS', '1', "Wedge Position", '', 'WedgePosition'), # noqa 0x300A011A: ('SQ', '1', "Beam Limiting Device Position Sequence", '', 'BeamLimitingDevicePositionSequence'), # noqa 0x300A011C: ('DS', '2-2n', "Leaf/Jaw Positions", '', 'LeafJawPositions'), # noqa 0x300A011E: ('DS', '1', "Gantry Angle", '', 'GantryAngle'), # noqa 0x300A011F: ('CS', '1', "Gantry Rotation Direction", '', 'GantryRotationDirection'), # noqa 0x300A0120: ('DS', '1', "Beam Limiting Device Angle", '', 'BeamLimitingDeviceAngle'), # noqa 0x300A0121: ('CS', '1', "Beam Limiting Device Rotation Direction", '', 'BeamLimitingDeviceRotationDirection'), # noqa 0x300A0122: ('DS', '1', "Patient Support Angle", '', 'PatientSupportAngle'), # noqa 0x300A0123: ('CS', '1', "Patient Support Rotation Direction", '', 'PatientSupportRotationDirection'), # noqa 0x300A0124: ('DS', '1', "Table Top Eccentric Axis Distance", '', 'TableTopEccentricAxisDistance'), # noqa 0x300A0125: ('DS', '1', "Table Top Eccentric Angle", '', 'TableTopEccentricAngle'), # noqa 0x300A0126: ('CS', '1', "Table Top Eccentric Rotation Direction", '', 'TableTopEccentricRotationDirection'), # noqa 0x300A0128: ('DS', '1', "Table Top Vertical Position", '', 'TableTopVerticalPosition'), # noqa 0x300A0129: ('DS', '1', "Table Top Longitudinal Position", '', 'TableTopLongitudinalPosition'), # noqa 0x300A012A: ('DS', '1', "Table Top Lateral Position", '', 'TableTopLateralPosition'), # noqa 0x300A012C: ('DS', '3', "Isocenter Position", '', 'IsocenterPosition'), # noqa 0x300A012E: ('DS', '3', "Surface Entry Point", '', 'SurfaceEntryPoint'), # noqa 0x300A0130: ('DS', '1', "Source to Surface Distance", '', 'SourceToSurfaceDistance'), # noqa 0x300A0131: ('FL', '1', "Average Beam Dose Point Source to External Contour Distance", '', 'AverageBeamDosePointSourceToExternalContourDistance'), # noqa 0x300A0132: ('FL', '1', "Source to External Contour Distance", '', 'SourceToExternalContourDistance'), # noqa 0x300A0133: ('FL', '3', "External Contour Entry Point", '', 'ExternalContourEntryPoint'), # noqa 0x300A0134: ('DS', '1', "Cumulative Meterset Weight", '', 'CumulativeMetersetWeight'), # noqa 0x300A0140: ('FL', '1', "Table Top Pitch Angle", '', 'TableTopPitchAngle'), # noqa 0x300A0142: ('CS', '1', "Table Top Pitch Rotation Direction", '', 'TableTopPitchRotationDirection'), # noqa 0x300A0144: ('FL', '1', "Table Top Roll Angle", '', 'TableTopRollAngle'), # noqa 0x300A0146: ('CS', '1', "Table Top Roll Rotation Direction", '', 'TableTopRollRotationDirection'), # noqa 0x300A0148: ('FL', '1', "Head Fixation Angle", '', 'HeadFixationAngle'), # noqa 0x300A014A: ('FL', '1', "Gantry Pitch Angle", '', 'GantryPitchAngle'), # noqa 0x300A014C: ('CS', '1', "Gantry Pitch Rotation Direction", '', 'GantryPitchRotationDirection'), # noqa 0x300A014E: ('FL', '1', "Gantry Pitch Angle Tolerance", '', 'GantryPitchAngleTolerance'), # noqa 0x300A0150: ('CS', '1', "Fixation Eye", '', 'FixationEye'), # noqa 0x300A0151: ('DS', '1', "Chair Head Frame Position", '', 'ChairHeadFramePosition'), # noqa 0x300A0152: ('DS', '1', "Head Fixation Angle Tolerance", '', 'HeadFixationAngleTolerance'), # noqa 0x300A0153: ('DS', '1', "Chair Head Frame Position Tolerance", '', 'ChairHeadFramePositionTolerance'), # noqa 0x300A0154: ('DS', '1', "Fixation Light Azimuthal Angle Tolerance", '', 'FixationLightAzimuthalAngleTolerance'), # noqa 0x300A0155: ('DS', '1', "Fixation Light Polar Angle Tolerance", '', 'FixationLightPolarAngleTolerance'), # noqa 0x300A0180: ('SQ', '1', "Patient Setup Sequence", '', 'PatientSetupSequence'), # noqa 0x300A0182: ('IS', '1', "Patient Setup Number", '', 'PatientSetupNumber'), # noqa 0x300A0183: ('LO', '1', "Patient Setup Label", '', 'PatientSetupLabel'), # noqa 0x300A0184: ('LO', '1', "Patient Additional Position", '', 'PatientAdditionalPosition'), # noqa 0x300A0190: ('SQ', '1', "Fixation Device Sequence", '', 'FixationDeviceSequence'), # noqa 0x300A0192: ('CS', '1', "Fixation Device Type", '', 'FixationDeviceType'), # noqa 0x300A0194: ('SH', '1', "Fixation Device Label", '', 'FixationDeviceLabel'), # noqa 0x300A0196: ('ST', '1', "Fixation Device Description", '', 'FixationDeviceDescription'), # noqa 0x300A0198: ('SH', '1', "Fixation Device Position", '', 'FixationDevicePosition'), # noqa 0x300A0199: ('FL', '1', "Fixation Device Pitch Angle", '', 'FixationDevicePitchAngle'), # noqa 0x300A019A: ('FL', '1', "Fixation Device Roll Angle", '', 'FixationDeviceRollAngle'), # noqa 0x300A01A0: ('SQ', '1', "Shielding Device Sequence", '', 'ShieldingDeviceSequence'), # noqa 0x300A01A2: ('CS', '1', "Shielding Device Type", '', 'ShieldingDeviceType'), # noqa 0x300A01A4: ('SH', '1', "Shielding Device Label", '', 'ShieldingDeviceLabel'), # noqa 0x300A01A6: ('ST', '1', "Shielding Device Description", '', 'ShieldingDeviceDescription'), # noqa 0x300A01A8: ('SH', '1', "Shielding Device Position", '', 'ShieldingDevicePosition'), # noqa 0x300A01B0: ('CS', '1', "Setup Technique", '', 'SetupTechnique'), # noqa 0x300A01B2: ('ST', '1', "Setup Technique Description", '', 'SetupTechniqueDescription'), # noqa 0x300A01B4: ('SQ', '1', "Setup Device Sequence", '', 'SetupDeviceSequence'), # noqa 0x300A01B6: ('CS', '1', "Setup Device Type", '', 'SetupDeviceType'), # noqa 0x300A01B8: ('SH', '1', "Setup Device Label", '', 'SetupDeviceLabel'), # noqa 0x300A01BA: ('ST', '1', "Setup Device Description", '', 'SetupDeviceDescription'), # noqa 0x300A01BC: ('DS', '1', "Setup Device Parameter", '', 'SetupDeviceParameter'), # noqa 0x300A01D0: ('ST', '1', "Setup Reference Description", '', 'SetupReferenceDescription'), # noqa 0x300A01D2: ('DS', '1', "Table Top Vertical Setup Displacement", '', 'TableTopVerticalSetupDisplacement'), # noqa 0x300A01D4: ('DS', '1', "Table Top Longitudinal Setup Displacement", '', 'TableTopLongitudinalSetupDisplacement'), # noqa 0x300A01D6: ('DS', '1', "Table Top Lateral Setup Displacement", '', 'TableTopLateralSetupDisplacement'), # noqa 0x300A0200: ('CS', '1', "Brachy Treatment Technique", '', 'BrachyTreatmentTechnique'), # noqa 0x300A0202: ('CS', '1', "Brachy Treatment Type", '', 'BrachyTreatmentType'), # noqa 0x300A0206: ('SQ', '1', "Treatment Machine Sequence", '', 'TreatmentMachineSequence'), # noqa 0x300A0210: ('SQ', '1', "Source Sequence", '', 'SourceSequence'), # noqa 0x300A0212: ('IS', '1', "Source Number", '', 'SourceNumber'), # noqa 0x300A0214: ('CS', '1', "Source Type", '', 'SourceType'), # noqa 0x300A0216: ('LO', '1', "Source Manufacturer", '', 'SourceManufacturer'), # noqa 0x300A0218: ('DS', '1', "Active Source Diameter", '', 'ActiveSourceDiameter'), # noqa 0x300A021A: ('DS', '1', "Active Source Length", '', 'ActiveSourceLength'), # noqa 0x300A021B: ('SH', '1', "Source Model ID", '', 'SourceModelID'), # noqa 0x300A021C: ('LO', '1', "Source Description", '', 'SourceDescription'), # noqa 0x300A0222: ('DS', '1', "Source Encapsulation Nominal Thickness", '', 'SourceEncapsulationNominalThickness'), # noqa 0x300A0224: ('DS', '1', "Source Encapsulation Nominal Transmission", '', 'SourceEncapsulationNominalTransmission'), # noqa 0x300A0226: ('LO', '1', "Source Isotope Name", '', 'SourceIsotopeName'), # noqa 0x300A0228: ('DS', '1', "Source Isotope Half Life", '', 'SourceIsotopeHalfLife'), # noqa 0x300A0229: ('CS', '1', "Source Strength Units", '', 'SourceStrengthUnits'), # noqa 0x300A022A: ('DS', '1', "Reference Air Kerma Rate", '', 'ReferenceAirKermaRate'), # noqa 0x300A022B: ('DS', '1', "Source Strength", '', 'SourceStrength'), # noqa 0x300A022C: ('DA', '1', "Source Strength Reference Date", '', 'SourceStrengthReferenceDate'), # noqa 0x300A022E: ('TM', '1', "Source Strength Reference Time", '', 'SourceStrengthReferenceTime'), # noqa 0x300A0230: ('SQ', '1', "Application Setup Sequence", '', 'ApplicationSetupSequence'), # noqa 0x300A0232: ('CS', '1', "Application Setup Type", '', 'ApplicationSetupType'), # noqa 0x300A0234: ('IS', '1', "Application Setup Number", '', 'ApplicationSetupNumber'), # noqa 0x300A0236: ('LO', '1', "Application Setup Name", '', 'ApplicationSetupName'), # noqa 0x300A0238: ('LO', '1', "Application Setup Manufacturer", '', 'ApplicationSetupManufacturer'), # noqa 0x300A0240: ('IS', '1', "Template Number", '', 'TemplateNumber'), # noqa 0x300A0242: ('SH', '1', "Template Type", '', 'TemplateType'), # noqa 0x300A0244: ('LO', '1', "Template Name", '', 'TemplateName'), # noqa 0x300A0250: ('DS', '1', "Total Reference Air Kerma", '', 'TotalReferenceAirKerma'), # noqa 0x300A0260: ('SQ', '1', "Brachy Accessory Device Sequence", '', 'BrachyAccessoryDeviceSequence'), # noqa 0x300A0262: ('IS', '1', "Brachy Accessory Device Number", '', 'BrachyAccessoryDeviceNumber'), # noqa 0x300A0263: ('SH', '1', "Brachy Accessory Device ID", '', 'BrachyAccessoryDeviceID'), # noqa 0x300A0264: ('CS', '1', "Brachy Accessory Device Type", '', 'BrachyAccessoryDeviceType'), # noqa 0x300A0266: ('LO', '1', "Brachy Accessory Device Name", '', 'BrachyAccessoryDeviceName'), # noqa 0x300A026A: ('DS', '1', "Brachy Accessory Device Nominal Thickness", '', 'BrachyAccessoryDeviceNominalThickness'), # noqa 0x300A026C: ('DS', '1', "Brachy Accessory Device Nominal Transmission", '', 'BrachyAccessoryDeviceNominalTransmission'), # noqa 0x300A0271: ('DS', '1', "Channel Effective Length", '', 'ChannelEffectiveLength'), # noqa 0x300A0272: ('DS', '1', "Channel Inner Length", '', 'ChannelInnerLength'), # noqa 0x300A0273: ('SH', '1', "Afterloader Channel ID", '', 'AfterloaderChannelID'), # noqa 0x300A0274: ('DS', '1', "Source Applicator Tip Length", '', 'SourceApplicatorTipLength'), # noqa 0x300A0280: ('SQ', '1', "Channel Sequence", '', 'ChannelSequence'), # noqa 0x300A0282: ('IS', '1', "Channel Number", '', 'ChannelNumber'), # noqa 0x300A0284: ('DS', '1', "Channel Length", '', 'ChannelLength'), # noqa 0x300A0286: ('DS', '1', "Channel Total Time", '', 'ChannelTotalTime'), # noqa 0x300A0288: ('CS', '1', "Source Movement Type", '', 'SourceMovementType'), # noqa 0x300A028A: ('IS', '1', "Number of Pulses", '', 'NumberOfPulses'), # noqa 0x300A028C: ('DS', '1', "Pulse Repetition Interval", '', 'PulseRepetitionInterval'), # noqa 0x300A0290: ('IS', '1', "Source Applicator Number", '', 'SourceApplicatorNumber'), # noqa 0x300A0291: ('SH', '1', "Source Applicator ID", '', 'SourceApplicatorID'), # noqa 0x300A0292: ('CS', '1', "Source Applicator Type", '', 'SourceApplicatorType'), # noqa 0x300A0294: ('LO', '1', "Source Applicator Name", '', 'SourceApplicatorName'), # noqa 0x300A0296: ('DS', '1', "Source Applicator Length", '', 'SourceApplicatorLength'), # noqa 0x300A0298: ('LO', '1', "Source Applicator Manufacturer", '', 'SourceApplicatorManufacturer'), # noqa 0x300A029C: ('DS', '1', "Source Applicator Wall Nominal Thickness", '', 'SourceApplicatorWallNominalThickness'), # noqa 0x300A029E: ('DS', '1', "Source Applicator Wall Nominal Transmission", '', 'SourceApplicatorWallNominalTransmission'), # noqa 0x300A02A0: ('DS', '1', "Source Applicator Step Size", '', 'SourceApplicatorStepSize'), # noqa 0x300A02A1: ('IS', '1', "Applicator Shape Referenced ROI Number", '', 'ApplicatorShapeReferencedROINumber'), # noqa 0x300A02A2: ('IS', '1', "Transfer Tube Number", '', 'TransferTubeNumber'), # noqa 0x300A02A4: ('DS', '1', "Transfer Tube Length", '', 'TransferTubeLength'), # noqa 0x300A02B0: ('SQ', '1', "Channel Shield Sequence", '', 'ChannelShieldSequence'), # noqa 0x300A02B2: ('IS', '1', "Channel Shield Number", '', 'ChannelShieldNumber'), # noqa 0x300A02B3: ('SH', '1', "Channel Shield ID", '', 'ChannelShieldID'), # noqa 0x300A02B4: ('LO', '1', "Channel Shield Name", '', 'ChannelShieldName'), # noqa 0x300A02B8: ('DS', '1', "Channel Shield Nominal Thickness", '', 'ChannelShieldNominalThickness'), # noqa 0x300A02BA: ('DS', '1', "Channel Shield Nominal Transmission", '', 'ChannelShieldNominalTransmission'), # noqa 0x300A02C8: ('DS', '1', "Final Cumulative Time Weight", '', 'FinalCumulativeTimeWeight'), # noqa 0x300A02D0: ('SQ', '1', "Brachy Control Point Sequence", '', 'BrachyControlPointSequence'), # noqa 0x300A02D2: ('DS', '1', "Control Point Relative Position", '', 'ControlPointRelativePosition'), # noqa 0x300A02D4: ('DS', '3', "Control Point 3D Position", '', 'ControlPoint3DPosition'), # noqa 0x300A02D6: ('DS', '1', "Cumulative Time Weight", '', 'CumulativeTimeWeight'), # noqa 0x300A02E0: ('CS', '1', "Compensator Divergence", '', 'CompensatorDivergence'), # noqa 0x300A02E1: ('CS', '1', "Compensator Mounting Position", '', 'CompensatorMountingPosition'), # noqa 0x300A02E2: ('DS', '1-n', "Source to Compensator Distance", '', 'SourceToCompensatorDistance'), # noqa 0x300A02E3: ('FL', '1', "Total Compensator Tray Water-Equivalent Thickness", '', 'TotalCompensatorTrayWaterEquivalentThickness'), # noqa 0x300A02E4: ('FL', '1', "Isocenter to Compensator Tray Distance", '', 'IsocenterToCompensatorTrayDistance'), # noqa 0x300A02E5: ('FL', '1', "Compensator Column Offset", '', 'CompensatorColumnOffset'), # noqa 0x300A02E6: ('FL', '1-n', "Isocenter to Compensator Distances", '', 'IsocenterToCompensatorDistances'), # noqa 0x300A02E7: ('FL', '1', "Compensator Relative Stopping Power Ratio", '', 'CompensatorRelativeStoppingPowerRatio'), # noqa 0x300A02E8: ('FL', '1', "Compensator Milling Tool Diameter", '', 'CompensatorMillingToolDiameter'), # noqa 0x300A02EA: ('SQ', '1', "Ion Range Compensator Sequence", '', 'IonRangeCompensatorSequence'), # noqa 0x300A02EB: ('LT', '1', "Compensator Description", '', 'CompensatorDescription'), # noqa 0x300A0302: ('IS', '1', "Radiation Mass Number", '', 'RadiationMassNumber'), # noqa 0x300A0304: ('IS', '1', "Radiation Atomic Number", '', 'RadiationAtomicNumber'), # noqa 0x300A0306: ('SS', '1', "Radiation Charge State", '', 'RadiationChargeState'), # noqa 0x300A0308: ('CS', '1', "Scan Mode", '', 'ScanMode'), # noqa 0x300A0309: ('CS', '1', "Modulated Scan Mode Type", '', 'ModulatedScanModeType'), # noqa 0x300A030A: ('FL', '2', "Virtual Source-Axis Distances", '', 'VirtualSourceAxisDistances'), # noqa 0x300A030C: ('SQ', '1', "Snout Sequence", '', 'SnoutSequence'), # noqa 0x300A030D: ('FL', '1', "Snout Position", '', 'SnoutPosition'), # noqa 0x300A030F: ('SH', '1', "Snout ID", '', 'SnoutID'), # noqa 0x300A0312: ('IS', '1', "Number of Range Shifters", '', 'NumberOfRangeShifters'), # noqa 0x300A0314: ('SQ', '1', "Range Shifter Sequence", '', 'RangeShifterSequence'), # noqa 0x300A0316: ('IS', '1', "Range Shifter Number", '', 'RangeShifterNumber'), # noqa 0x300A0318: ('SH', '1', "Range Shifter ID", '', 'RangeShifterID'), # noqa 0x300A0320: ('CS', '1', "Range Shifter Type", '', 'RangeShifterType'), # noqa 0x300A0322: ('LO', '1', "Range Shifter Description", '', 'RangeShifterDescription'), # noqa 0x300A0330: ('IS', '1', "Number of Lateral Spreading Devices", '', 'NumberOfLateralSpreadingDevices'), # noqa 0x300A0332: ('SQ', '1', "Lateral Spreading Device Sequence", '', 'LateralSpreadingDeviceSequence'), # noqa 0x300A0334: ('IS', '1', "Lateral Spreading Device Number", '', 'LateralSpreadingDeviceNumber'), # noqa 0x300A0336: ('SH', '1', "Lateral Spreading Device ID", '', 'LateralSpreadingDeviceID'), # noqa 0x300A0338: ('CS', '1', "Lateral Spreading Device Type", '', 'LateralSpreadingDeviceType'), # noqa 0x300A033A: ('LO', '1', "Lateral Spreading Device Description", '', 'LateralSpreadingDeviceDescription'), # noqa 0x300A033C: ('FL', '1', "Lateral Spreading Device Water Equivalent Thickness", '', 'LateralSpreadingDeviceWaterEquivalentThickness'), # noqa 0x300A0340: ('IS', '1', "Number of Range Modulators", '', 'NumberOfRangeModulators'), # noqa 0x300A0342: ('SQ', '1', "Range Modulator Sequence", '', 'RangeModulatorSequence'), # noqa 0x300A0344: ('IS', '1', "Range Modulator Number", '', 'RangeModulatorNumber'), # noqa 0x300A0346: ('SH', '1', "Range Modulator ID", '', 'RangeModulatorID'), # noqa 0x300A0348: ('CS', '1', "Range Modulator Type", '', 'RangeModulatorType'), # noqa 0x300A034A: ('LO', '1', "Range Modulator Description", '', 'RangeModulatorDescription'), # noqa 0x300A034C: ('SH', '1', "Beam Current Modulation ID", '', 'BeamCurrentModulationID'), # noqa 0x300A0350: ('CS', '1', "Patient Support Type", '', 'PatientSupportType'), # noqa 0x300A0352: ('SH', '1', "Patient Support ID", '', 'PatientSupportID'), # noqa 0x300A0354: ('LO', '1', "Patient Support Accessory Code", '', 'PatientSupportAccessoryCode'), # noqa 0x300A0355: ('LO', '1', "Tray Accessory Code", '', 'TrayAccessoryCode'), # noqa 0x300A0356: ('FL', '1', "Fixation Light Azimuthal Angle", '', 'FixationLightAzimuthalAngle'), # noqa 0x300A0358: ('FL', '1', "Fixation Light Polar Angle", '', 'FixationLightPolarAngle'), # noqa 0x300A035A: ('FL', '1', "Meterset Rate", '', 'MetersetRate'), # noqa 0x300A0360: ('SQ', '1', "Range Shifter Settings Sequence", '', 'RangeShifterSettingsSequence'), # noqa 0x300A0362: ('LO', '1', "Range Shifter Setting", '', 'RangeShifterSetting'), # noqa 0x300A0364: ('FL', '1', "Isocenter to Range Shifter Distance", '', 'IsocenterToRangeShifterDistance'), # noqa 0x300A0366: ('FL', '1', "Range Shifter Water Equivalent Thickness", '', 'RangeShifterWaterEquivalentThickness'), # noqa 0x300A0370: ('SQ', '1', "Lateral Spreading Device Settings Sequence", '', 'LateralSpreadingDeviceSettingsSequence'), # noqa 0x300A0372: ('LO', '1', "Lateral Spreading Device Setting", '', 'LateralSpreadingDeviceSetting'), # noqa 0x300A0374: ('FL', '1', "Isocenter to Lateral Spreading Device Distance", '', 'IsocenterToLateralSpreadingDeviceDistance'), # noqa 0x300A0380: ('SQ', '1', "Range Modulator Settings Sequence", '', 'RangeModulatorSettingsSequence'), # noqa 0x300A0382: ('FL', '1', "Range Modulator Gating Start Value", '', 'RangeModulatorGatingStartValue'), # noqa 0x300A0384: ('FL', '1', "Range Modulator Gating Stop Value", '', 'RangeModulatorGatingStopValue'), # noqa 0x300A0386: ('FL', '1', "Range Modulator Gating Start Water Equivalent Thickness", '', 'RangeModulatorGatingStartWaterEquivalentThickness'), # noqa 0x300A0388: ('FL', '1', "Range Modulator Gating Stop Water Equivalent Thickness", '', 'RangeModulatorGatingStopWaterEquivalentThickness'), # noqa 0x300A038A: ('FL', '1', "Isocenter to Range Modulator Distance", '', 'IsocenterToRangeModulatorDistance'), # noqa 0x300A038F: ('FL', '1-n', "Scan Spot Time Offset", '', 'ScanSpotTimeOffset'), # noqa 0x300A0390: ('SH', '1', "Scan Spot Tune ID", '', 'ScanSpotTuneID'), # noqa 0x300A0391: ('IS', '1-n', "Scan Spot Prescribed Indices", '', 'ScanSpotPrescribedIndices'), # noqa 0x300A0392: ('IS', '1', "Number of Scan Spot Positions", '', 'NumberOfScanSpotPositions'), # noqa 0x300A0393: ('CS', '1', "Scan Spot Reordered", '', 'ScanSpotReordered'), # noqa 0x300A0394: ('FL', '1-n', "Scan Spot Position Map", '', 'ScanSpotPositionMap'), # noqa 0x300A0395: ('CS', '1', "Scan Spot Reordering Allowed", '', 'ScanSpotReorderingAllowed'), # noqa 0x300A0396: ('FL', '1-n', "Scan Spot Meterset Weights", '', 'ScanSpotMetersetWeights'), # noqa 0x300A0398: ('FL', '2', "Scanning Spot Size", '', 'ScanningSpotSize'), # noqa 0x300A0399: ('FL', '2-2n', "Scan Spot Sizes Delivered", '', 'ScanSpotSizesDelivered'), # noqa 0x300A039A: ('IS', '1', "Number of Paintings", '', 'NumberOfPaintings'), # noqa 0x300A03A0: ('SQ', '1', "Ion Tolerance Table Sequence", '', 'IonToleranceTableSequence'), # noqa 0x300A03A2: ('SQ', '1', "Ion Beam Sequence", '', 'IonBeamSequence'), # noqa 0x300A03A4: ('SQ', '1', "Ion Beam Limiting Device Sequence", '', 'IonBeamLimitingDeviceSequence'), # noqa 0x300A03A6: ('SQ', '1', "Ion Block Sequence", '', 'IonBlockSequence'), # noqa 0x300A03A8: ('SQ', '1', "Ion Control Point Sequence", '', 'IonControlPointSequence'), # noqa 0x300A03AA: ('SQ', '1', "Ion Wedge Sequence", '', 'IonWedgeSequence'), # noqa 0x300A03AC: ('SQ', '1', "Ion Wedge Position Sequence", '', 'IonWedgePositionSequence'), # noqa 0x300A0401: ('SQ', '1', "Referenced Setup Image Sequence", '', 'ReferencedSetupImageSequence'), # noqa 0x300A0402: ('ST', '1', "Setup Image Comment", '', 'SetupImageComment'), # noqa 0x300A0410: ('SQ', '1', "Motion Synchronization Sequence", '', 'MotionSynchronizationSequence'), # noqa 0x300A0412: ('FL', '3', "Control Point Orientation", '', 'ControlPointOrientation'), # noqa 0x300A0420: ('SQ', '1', "General Accessory Sequence", '', 'GeneralAccessorySequence'), # noqa 0x300A0421: ('SH', '1', "General Accessory ID", '', 'GeneralAccessoryID'), # noqa 0x300A0422: ('ST', '1', "General Accessory Description", '', 'GeneralAccessoryDescription'), # noqa 0x300A0423: ('CS', '1', "General Accessory Type", '', 'GeneralAccessoryType'), # noqa 0x300A0424: ('IS', '1', "General Accessory Number", '', 'GeneralAccessoryNumber'), # noqa 0x300A0425: ('FL', '1', "Source to General Accessory Distance", '', 'SourceToGeneralAccessoryDistance'), # noqa 0x300A0426: ('DS', '1', "Isocenter to General Accessory Distance", '', 'IsocenterToGeneralAccessoryDistance'), # noqa 0x300A0431: ('SQ', '1', "Applicator Geometry Sequence", '', 'ApplicatorGeometrySequence'), # noqa 0x300A0432: ('CS', '1', "Applicator Aperture Shape", '', 'ApplicatorApertureShape'), # noqa 0x300A0433: ('FL', '1', "Applicator Opening", '', 'ApplicatorOpening'), # noqa 0x300A0434: ('FL', '1', "Applicator Opening X", '', 'ApplicatorOpeningX'), # noqa 0x300A0435: ('FL', '1', "Applicator Opening Y", '', 'ApplicatorOpeningY'), # noqa 0x300A0436: ('FL', '1', "Source to Applicator Mounting Position Distance", '', 'SourceToApplicatorMountingPositionDistance'), # noqa 0x300A0440: ('IS', '1', "Number of Block Slab Items", '', 'NumberOfBlockSlabItems'), # noqa 0x300A0441: ('SQ', '1', "Block Slab Sequence", '', 'BlockSlabSequence'), # noqa 0x300A0442: ('DS', '1', "Block Slab Thickness", '', 'BlockSlabThickness'), # noqa 0x300A0443: ('US', '1', "Block Slab Number", '', 'BlockSlabNumber'), # noqa 0x300A0450: ('SQ', '1', "Device Motion Control Sequence", '', 'DeviceMotionControlSequence'), # noqa 0x300A0451: ('CS', '1', "Device Motion Execution Mode", '', 'DeviceMotionExecutionMode'), # noqa 0x300A0452: ('CS', '1', "Device Motion Observation Mode", '', 'DeviceMotionObservationMode'), # noqa 0x300A0453: ('SQ', '1', "Device Motion Parameter Code Sequence", '', 'DeviceMotionParameterCodeSequence'), # noqa 0x300A0501: ('FL', '1', "Distal Depth Fraction", '', 'DistalDepthFraction'), # noqa 0x300A0502: ('FL', '1', "Distal Depth", '', 'DistalDepth'), # noqa 0x300A0503: ('FL', '2', "Nominal Range Modulation Fractions", '', 'NominalRangeModulationFractions'), # noqa 0x300A0504: ('FL', '2', "Nominal Range Modulated Region Depths", '', 'NominalRangeModulatedRegionDepths'), # noqa 0x300A0505: ('SQ', '1', "Depth Dose Parameters Sequence", '', 'DepthDoseParametersSequence'), # noqa 0x300A0506: ('SQ', '1', "Delivered Depth Dose Parameters Sequence", '', 'DeliveredDepthDoseParametersSequence'), # noqa 0x300A0507: ('FL', '1', "Delivered Distal Depth Fraction", '', 'DeliveredDistalDepthFraction'), # noqa 0x300A0508: ('FL', '1', "Delivered Distal Depth", '', 'DeliveredDistalDepth'), # noqa 0x300A0509: ('FL', '2', "Delivered Nominal Range Modulation Fractions", '', 'DeliveredNominalRangeModulationFractions'), # noqa 0x300A0510: ('FL', '2', "Delivered Nominal Range Modulated Region Depths", '', 'DeliveredNominalRangeModulatedRegionDepths'), # noqa 0x300A0511: ('CS', '1', "Delivered Reference Dose Definition", '', 'DeliveredReferenceDoseDefinition'), # noqa 0x300A0512: ('CS', '1', "Reference Dose Definition", '', 'ReferenceDoseDefinition'), # noqa 0x300A0600: ('US', '1', "RT Control Point Index", '', 'RTControlPointIndex'), # noqa 0x300A0601: ('US', '1', "Radiation Generation Mode Index", '', 'RadiationGenerationModeIndex'), # noqa 0x300A0602: ('US', '1', "Referenced Defined Device Index", '', 'ReferencedDefinedDeviceIndex'), # noqa 0x300A0603: ('US', '1', "Radiation Dose Identification Index", '', 'RadiationDoseIdentificationIndex'), # noqa 0x300A0604: ('US', '1', "Number of RT Control Points", '', 'NumberOfRTControlPoints'), # noqa 0x300A0605: ('US', '1', "Referenced Radiation Generation Mode Index", '', 'ReferencedRadiationGenerationModeIndex'), # noqa 0x300A0606: ('US', '1', "Treatment Position Index", '', 'TreatmentPositionIndex'), # noqa 0x300A0607: ('US', '1', "Referenced Device Index", '', 'ReferencedDeviceIndex'), # noqa 0x300A0608: ('LO', '1', "Treatment Position Group Label", '', 'TreatmentPositionGroupLabel'), # noqa 0x300A0609: ('UI', '1', "Treatment Position Group UID", '', 'TreatmentPositionGroupUID'), # noqa 0x300A060A: ('SQ', '1', "Treatment Position Group Sequence", '', 'TreatmentPositionGroupSequence'), # noqa 0x300A060B: ('US', '1', "Referenced Treatment Position Index", '', 'ReferencedTreatmentPositionIndex'), # noqa 0x300A060C: ('US', '1', "Referenced Radiation Dose Identification Index", '', 'ReferencedRadiationDoseIdentificationIndex'), # noqa 0x300A060D: ('FD', '1', "RT Accessory Holder Water-Equivalent Thickness", '', 'RTAccessoryHolderWaterEquivalentThickness'), # noqa 0x300A060E: ('US', '1', "Referenced RT Accessory Holder Device Index", '', 'ReferencedRTAccessoryHolderDeviceIndex'), # noqa 0x300A060F: ('CS', '1', "RT Accessory Holder Slot Existence Flag", '', 'RTAccessoryHolderSlotExistenceFlag'), # noqa 0x300A0610: ('SQ', '1', "RT Accessory Holder Slot Sequence", '', 'RTAccessoryHolderSlotSequence'), # noqa 0x300A0611: ('LO', '1', "RT Accessory Holder Slot ID", '', 'RTAccessoryHolderSlotID'), # noqa 0x300A0612: ('FD', '1', "RT Accessory Holder Slot Distance", '', 'RTAccessoryHolderSlotDistance'), # noqa 0x300A0613: ('FD', '1', "RT Accessory Slot Distance", '', 'RTAccessorySlotDistance'), # noqa 0x300A0614: ('SQ', '1', "RT Accessory Holder Definition Sequence", '', 'RTAccessoryHolderDefinitionSequence'), # noqa 0x300A0615: ('LO', '1', "RT Accessory Device Slot ID", '', 'RTAccessoryDeviceSlotID'), # noqa 0x300A0616: ('SQ', '1', "RT Radiation Sequence", '', 'RTRadiationSequence'), # noqa 0x300A0617: ('SQ', '1', "Radiation Dose Sequence", '', 'RadiationDoseSequence'), # noqa 0x300A0618: ('SQ', '1', "Radiation Dose Identification Sequence", '', 'RadiationDoseIdentificationSequence'), # noqa 0x300A0619: ('LO', '1', "Radiation Dose Identification Label", '', 'RadiationDoseIdentificationLabel'), # noqa 0x300A061A: ('CS', '1', "Reference Dose Type", '', 'ReferenceDoseType'), # noqa 0x300A061B: ('CS', '1', "Primary Dose Value Indicator", '', 'PrimaryDoseValueIndicator'), # noqa 0x300A061C: ('SQ', '1', "Dose Values Sequence", '', 'DoseValuesSequence'), # noqa 0x300A061D: ('CS', '1-n', "Dose Value Purpose", '', 'DoseValuePurpose'), # noqa 0x300A061E: ('FD', '3', "Reference Dose Point Coordinates", '', 'ReferenceDosePointCoordinates'), # noqa 0x300A061F: ('SQ', '1', "Radiation Dose Values Parameters Sequence", '', 'RadiationDoseValuesParametersSequence'), # noqa 0x300A0620: ('SQ', '1', "Meterset to Dose Mapping Sequence", '', 'MetersetToDoseMappingSequence'), # noqa 0x300A0621: ('SQ', '1', "Expected In-Vivo Measurement Values Sequence", '', 'ExpectedInVivoMeasurementValuesSequence'), # noqa 0x300A0622: ('US', '1', "Expected In-Vivo Measurement Value Index", '', 'ExpectedInVivoMeasurementValueIndex'), # noqa 0x300A0623: ('LO', '1', "Radiation Dose In-Vivo Measurement Label", '', 'RadiationDoseInVivoMeasurementLabel'), # noqa 0x300A0624: ('FD', '2', "Radiation Dose Central Axis Displacement", '', 'RadiationDoseCentralAxisDisplacement'), # noqa 0x300A0625: ('FD', '1', "Radiation Dose Value", '', 'RadiationDoseValue'), # noqa 0x300A0626: ('FD', '1', "Radiation Dose Source to Skin Distance", '', 'RadiationDoseSourceToSkinDistance'), # noqa 0x300A0627: ('FD', '3', "Radiation Dose Measurement Point Coordinates", '', 'RadiationDoseMeasurementPointCoordinates'), # noqa 0x300A0628: ('FD', '1', "Radiation Dose Source to External Contour Distance", '', 'RadiationDoseSourceToExternalContourDistance'), # noqa 0x300A0629: ('SQ', '1', "RT Tolerance Set Sequence", '', 'RTToleranceSetSequence'), # noqa 0x300A062A: ('LO', '1', "RT Tolerance Set Label", '', 'RTToleranceSetLabel'), # noqa 0x300A062B: ('SQ', '1', "Attribute Tolerance Values Sequence", '', 'AttributeToleranceValuesSequence'), # noqa 0x300A062C: ('FD', '1', "Tolerance Value", '', 'ToleranceValue'), # noqa 0x300A062D: ('SQ', '1', "Patient Support Position Tolerance Sequence", '', 'PatientSupportPositionToleranceSequence'), # noqa 0x300A062E: ('FD', '1', "Treatment Time Limit", '', 'TreatmentTimeLimit'), # noqa 0x300A062F: ('SQ', '1', "C-Arm Photon-Electron Control Point Sequence", '', 'CArmPhotonElectronControlPointSequence'), # noqa 0x300A0630: ('SQ', '1', "Referenced RT Radiation Sequence", '', 'ReferencedRTRadiationSequence'), # noqa 0x300A0631: ('SQ', '1', "Referenced RT Instance Sequence", '', 'ReferencedRTInstanceSequence'), # noqa 0x300A0632: ('SQ', '1', "Referenced RT Patient Setup Sequence", 'Retired', 'ReferencedRTPatientSetupSequence'), # noqa 0x300A0634: ('FD', '1', "Source to Patient Surface Distance", '', 'SourceToPatientSurfaceDistance'), # noqa 0x300A0635: ('SQ', '1', "Treatment Machine Special Mode Code Sequence", '', 'TreatmentMachineSpecialModeCodeSequence'), # noqa 0x300A0636: ('US', '1', "Intended Number of Fractions", '', 'IntendedNumberOfFractions'), # noqa 0x300A0637: ('CS', '1', "RT Radiation Set Intent", '', 'RTRadiationSetIntent'), # noqa 0x300A0638: ('CS', '1', "RT Radiation Physical and Geometric Content Detail Flag", '', 'RTRadiationPhysicalAndGeometricContentDetailFlag'), # noqa 0x300A0639: ('CS', '1', "RT Record Flag", '', 'RTRecordFlag'), # noqa 0x300A063A: ('SQ', '1', "Treatment Device Identification Sequence", '', 'TreatmentDeviceIdentificationSequence'), # noqa 0x300A063B: ('SQ', '1', "Referenced RT Physician Intent Sequence", '', 'ReferencedRTPhysicianIntentSequence'), # noqa 0x300A063C: ('FD', '1', "Cumulative Meterset", '', 'CumulativeMeterset'), # noqa 0x300A063D: ('FD', '1', "Delivery Rate", '', 'DeliveryRate'), # noqa 0x300A063E: ('SQ', '1', "Delivery Rate Unit Sequence", '', 'DeliveryRateUnitSequence'), # noqa 0x300A063F: ('SQ', '1', "Treatment Position Sequence", '', 'TreatmentPositionSequence'), # noqa 0x300A0640: ('FD', '1', "Radiation Source-Axis Distance", '', 'RadiationSourceAxisDistance'), # noqa 0x300A0641: ('US', '1', "Number of RT Beam Limiting Devices", '', 'NumberOfRTBeamLimitingDevices'), # noqa 0x300A0642: ('FD', '1', "RT Beam Limiting Device Proximal Distance", '', 'RTBeamLimitingDeviceProximalDistance'), # noqa 0x300A0643: ('FD', '1', "RT Beam Limiting Device Distal Distance", '', 'RTBeamLimitingDeviceDistalDistance'), # noqa 0x300A0644: ('SQ', '1', "Parallel RT Beam Delimiter Device Orientation Label Code Sequence", '', 'ParallelRTBeamDelimiterDeviceOrientationLabelCodeSequence'), # noqa 0x300A0645: ('FD', '1', "Beam Modifier Orientation Angle", '', 'BeamModifierOrientationAngle'), # noqa 0x300A0646: ('SQ', '1', "Fixed RT Beam Delimiter Device Sequence", '', 'FixedRTBeamDelimiterDeviceSequence'), # noqa 0x300A0647: ('SQ', '1', "Parallel RT Beam Delimiter Device Sequence", '', 'ParallelRTBeamDelimiterDeviceSequence'), # noqa 0x300A0648: ('US', '1', "Number of Parallel RT Beam Delimiters", '', 'NumberOfParallelRTBeamDelimiters'), # noqa 0x300A0649: ('FD', '2-n', "Parallel RT Beam Delimiter Boundaries", '', 'ParallelRTBeamDelimiterBoundaries'), # noqa 0x300A064A: ('FD', '2-n', "Parallel RT Beam Delimiter Positions", '', 'ParallelRTBeamDelimiterPositions'), # noqa 0x300A064B: ('FD', '2', "RT Beam Limiting Device Offset", '', 'RTBeamLimitingDeviceOffset'), # noqa 0x300A064C: ('SQ', '1', "RT Beam Delimiter Geometry Sequence", '', 'RTBeamDelimiterGeometrySequence'), # noqa 0x300A064D: ('SQ', '1', "RT Beam Limiting Device Definition Sequence", '', 'RTBeamLimitingDeviceDefinitionSequence'), # noqa 0x300A064E: ('CS', '1', "Parallel RT Beam Delimiter Opening Mode", '', 'ParallelRTBeamDelimiterOpeningMode'), # noqa 0x300A064F: ('CS', '1-n', "Parallel RT Beam Delimiter Leaf Mounting Side", '', 'ParallelRTBeamDelimiterLeafMountingSide'), # noqa 0x300A0650: ('UI', '1', "Patient Setup UID", 'Retired', 'PatientSetupUID'), # noqa 0x300A0651: ('SQ', '1', "Wedge Definition Sequence", '', 'WedgeDefinitionSequence'), # noqa 0x300A0652: ('FD', '1', "Radiation Beam Wedge Angle", '', 'RadiationBeamWedgeAngle'), # noqa 0x300A0653: ('FD', '1', "Radiation Beam Wedge Thin Edge Distance", '', 'RadiationBeamWedgeThinEdgeDistance'), # noqa 0x300A0654: ('FD', '1', "Radiation Beam Effective Wedge Angle", '', 'RadiationBeamEffectiveWedgeAngle'), # noqa 0x300A0655: ('US', '1', "Number of Wedge Positions", '', 'NumberOfWedgePositions'), # noqa 0x300A0656: ('SQ', '1', "RT Beam Limiting Device Opening Sequence", '', 'RTBeamLimitingDeviceOpeningSequence'), # noqa 0x300A0657: ('US', '1', "Number of RT Beam Limiting Device Openings", '', 'NumberOfRTBeamLimitingDeviceOpenings'), # noqa 0x300A0658: ('SQ', '1', "Radiation Dosimeter Unit Sequence", '', 'RadiationDosimeterUnitSequence'), # noqa 0x300A0659: ('SQ', '1', "RT Device Distance Reference Location Code Sequence", '', 'RTDeviceDistanceReferenceLocationCodeSequence'), # noqa 0x300A065A: ('SQ', '1', "Radiation Device Configuration and Commissioning Key Sequence", '', 'RadiationDeviceConfigurationAndCommissioningKeySequence'), # noqa 0x300A065B: ('SQ', '1', "Patient Support Position Parameter Sequence", '', 'PatientSupportPositionParameterSequence'), # noqa 0x300A065C: ('CS', '1', "Patient Support Position Specification Method", '', 'PatientSupportPositionSpecificationMethod'), # noqa 0x300A065D: ('SQ', '1', "Patient Support Position Device Parameter Sequence", '', 'PatientSupportPositionDeviceParameterSequence'), # noqa 0x300A065E: ('US', '1', "Device Order Index", '', 'DeviceOrderIndex'), # noqa 0x300A065F: ('US', '1', "Patient Support Position Parameter Order Index", '', 'PatientSupportPositionParameterOrderIndex'), # noqa 0x300A0660: ('SQ', '1', "Patient Support Position Device Tolerance Sequence", '', 'PatientSupportPositionDeviceToleranceSequence'), # noqa 0x300A0661: ('US', '1', "Patient Support Position Tolerance Order Index", '', 'PatientSupportPositionToleranceOrderIndex'), # noqa 0x300A0662: ('SQ', '1', "Compensator Definition Sequence", '', 'CompensatorDefinitionSequence'), # noqa 0x300A0663: ('CS', '1', "Compensator Map Orientation", '', 'CompensatorMapOrientation'), # noqa 0x300A0664: ('OF', '1', "Compensator Proximal Thickness Map", '', 'CompensatorProximalThicknessMap'), # noqa 0x300A0665: ('OF', '1', "Compensator Distal Thickness Map", '', 'CompensatorDistalThicknessMap'), # noqa 0x300A0666: ('FD', '1', "Compensator Base Plane Offset", '', 'CompensatorBasePlaneOffset'), # noqa 0x300A0667: ('SQ', '1', "Compensator Shape Fabrication Code Sequence", '', 'CompensatorShapeFabricationCodeSequence'), # noqa 0x300A0668: ('SQ', '1', "Compensator Shape Sequence", '', 'CompensatorShapeSequence'), # noqa 0x300A0669: ('FD', '1', "Radiation Beam Compensator Milling Tool Diameter", '', 'RadiationBeamCompensatorMillingToolDiameter'), # noqa 0x300A066A: ('SQ', '1', "Block Definition Sequence", '', 'BlockDefinitionSequence'), # noqa 0x300A066B: ('OF', '1', "Block Edge Data", '', 'BlockEdgeData'), # noqa 0x300A066C: ('CS', '1', "Block Orientation", '', 'BlockOrientation'), # noqa 0x300A066D: ('FD', '1', "Radiation Beam Block Thickness", '', 'RadiationBeamBlockThickness'), # noqa 0x300A066E: ('FD', '1', "Radiation Beam Block Slab Thickness", '', 'RadiationBeamBlockSlabThickness'), # noqa 0x300A066F: ('SQ', '1', "Block Edge Data Sequence", '', 'BlockEdgeDataSequence'), # noqa 0x300A0670: ('US', '1', "Number of RT Accessory Holders", '', 'NumberOfRTAccessoryHolders'), # noqa 0x300A0671: ('SQ', '1', "General Accessory Definition Sequence", '', 'GeneralAccessoryDefinitionSequence'), # noqa 0x300A0672: ('US', '1', "Number of General Accessories", '', 'NumberOfGeneralAccessories'), # noqa 0x300A0673: ('SQ', '1', "Bolus Definition Sequence", '', 'BolusDefinitionSequence'), # noqa 0x300A0674: ('US', '1', "Number of Boluses", '', 'NumberOfBoluses'), # noqa 0x300A0675: ('UI', '1', "Equipment Frame of Reference UID", '', 'EquipmentFrameOfReferenceUID'), # noqa 0x300A0676: ('ST', '1', "Equipment Frame of Reference Description", '', 'EquipmentFrameOfReferenceDescription'), # noqa 0x300A0677: ('SQ', '1', "Equipment Reference Point Coordinates Sequence", '', 'EquipmentReferencePointCoordinatesSequence'), # noqa 0x300A0678: ('SQ', '1', "Equipment Reference Point Code Sequence", '', 'EquipmentReferencePointCodeSequence'), # noqa 0x300A0679: ('FD', '1', "RT Beam Limiting Device Angle", '', 'RTBeamLimitingDeviceAngle'), # noqa 0x300A067A: ('FD', '1', "Source Roll Angle", '', 'SourceRollAngle'), # noqa 0x300A067B: ('SQ', '1', "Radiation GenerationMode Sequence", '', 'RadiationGenerationModeSequence'), # noqa 0x300A067C: ('SH', '1', "Radiation GenerationMode Label", '', 'RadiationGenerationModeLabel'), # noqa 0x300A067D: ('ST', '1', "Radiation GenerationMode Description", '', 'RadiationGenerationModeDescription'), # noqa 0x300A067E: ('SQ', '1', "Radiation GenerationMode Machine Code Sequence", '', 'RadiationGenerationModeMachineCodeSequence'), # noqa 0x300A067F: ('SQ', '1', "Radiation Type Code Sequence", '', 'RadiationTypeCodeSequence'), # noqa 0x300A0680: ('DS', '1', "Nominal Energy", '', 'NominalEnergy'), # noqa 0x300A0681: ('DS', '1', "Minimum Nominal Energy", '', 'MinimumNominalEnergy'), # noqa 0x300A0682: ('DS', '1', "Maximum Nominal Energy", '', 'MaximumNominalEnergy'), # noqa 0x300A0683: ('SQ', '1', "Radiation Fluence Modifier Code Sequence", '', 'RadiationFluenceModifierCodeSequence'), # noqa 0x300A0684: ('SQ', '1', "Energy Unit Code Sequence", '', 'EnergyUnitCodeSequence'), # noqa 0x300A0685: ('US', '1', "Number of Radiation GenerationModes", '', 'NumberOfRadiationGenerationModes'), # noqa 0x300A0686: ('SQ', '1', "Patient Support Devices Sequence", '', 'PatientSupportDevicesSequence'), # noqa 0x300A0687: ('US', '1', "Number of Patient Support Devices", '', 'NumberOfPatientSupportDevices'), # noqa 0x300A0688: ('FD', '1', "RT Beam Modifier Definition Distance", '', 'RTBeamModifierDefinitionDistance'), # noqa 0x300A0689: ('SQ', '1', "Beam Area Limit Sequence", '', 'BeamAreaLimitSequence'), # noqa 0x300A068A: ('SQ', '1', "Referenced RT Prescription Sequence", '', 'ReferencedRTPrescriptionSequence'), # noqa 0x300A0700: ('UI', '1', "Treatment Session UID", '', 'TreatmentSessionUID'), # noqa 0x300A0701: ('CS', '1', "RT Radiation Usage", '', 'RTRadiationUsage'), # noqa 0x300A0702: ('SQ', '1', "Referenced RT Radiation Set Sequence", '', 'ReferencedRTRadiationSetSequence'), # noqa 0x300A0703: ('SQ', '1', "Referenced RT Radiation Record Sequence", '', 'ReferencedRTRadiationRecordSequence'), # noqa 0x300A0704: ('US', '1', "RT Radiation Set Delivery Number", '', 'RTRadiationSetDeliveryNumber'), # noqa 0x300A0705: ('US', '1', "Clinical Fraction Number", '', 'ClinicalFractionNumber'), # noqa 0x300A0706: ('CS', '1', "RT Treatment Fraction Completion Status", '', 'RTTreatmentFractionCompletionStatus'), # noqa 0x300A0707: ('CS', '1', "RT Radiation Set Usage", '', 'RTRadiationSetUsage'), # noqa 0x300A0708: ('CS', '1', "Treatment Delivery Continuation Flag", '', 'TreatmentDeliveryContinuationFlag'), # noqa 0x300A0709: ('CS', '1', "Treatment Record Content Origin", '', 'TreatmentRecordContentOrigin'), # noqa 0x300A0714: ('CS', '1', "RT Treatment Termination Status", '', 'RTTreatmentTerminationStatus'), # noqa 0x300A0715: ('SQ', '1', "RT Treatment Termination Reason Code Sequence", '', 'RTTreatmentTerminationReasonCodeSequence'), # noqa 0x300A0716: ('SQ', '1', "Machine-Specific Treatment Termination Code Sequence", '', 'MachineSpecificTreatmentTerminationCodeSequence'), # noqa 0x300A0722: ('SQ', '1', "RT Radiation Salvage Record Control Point Sequence", '', 'RTRadiationSalvageRecordControlPointSequence'), # noqa 0x300A0723: ('CS', '1', "Starting Meterset Value Known Flag", '', 'StartingMetersetValueKnownFlag'), # noqa 0x300A0730: ('ST', '1', "Treatment Termination Description", '', 'TreatmentTerminationDescription'), # noqa 0x300A0731: ('SQ', '1', "Treatment Tolerance Violation Sequence", '', 'TreatmentToleranceViolationSequence'), # noqa 0x300A0732: ('CS', '1', "Treatment Tolerance Violation Category", '', 'TreatmentToleranceViolationCategory'), # noqa 0x300A0733: ('SQ', '1', "Treatment Tolerance Violation Attribute Sequence", '', 'TreatmentToleranceViolationAttributeSequence'), # noqa 0x300A0734: ('ST', '1', "Treatment Tolerance Violation Description", '', 'TreatmentToleranceViolationDescription'), # noqa 0x300A0735: ('ST', '1', "Treatment Tolerance Violation Identification", '', 'TreatmentToleranceViolationIdentification'), # noqa 0x300A0736: ('DT', '1', "Treatment Tolerance Violation DateTime", '', 'TreatmentToleranceViolationDateTime'), # noqa 0x300A073A: ('DT', '1', "Recorded RT Control Point DateTime", '', 'RecordedRTControlPointDateTime'), # noqa 0x300A073B: ('US', '1', "Referenced Radiation RT Control Point Index", '', 'ReferencedRadiationRTControlPointIndex'), # noqa 0x300A073E: ('SQ', '1', "Alternate Value Sequence", '', 'AlternateValueSequence'), # noqa 0x300A073F: ('SQ', '1', "Confirmation Sequence", '', 'ConfirmationSequence'), # noqa 0x300A0740: ('SQ', '1', "Interlock Sequence", '', 'InterlockSequence'), # noqa 0x300A0741: ('DT', '1', "Interlock DateTime", '', 'InterlockDateTime'), # noqa 0x300A0742: ('ST', '1', "Interlock Description", '', 'InterlockDescription'), # noqa 0x300A0743: ('SQ', '1', "Interlock Originating Device Sequence", '', 'InterlockOriginatingDeviceSequence'), # noqa 0x300A0744: ('SQ', '1', "Interlock Code Sequence", '', 'InterlockCodeSequence'), # noqa 0x300A0745: ('SQ', '1', "Interlock Resolution Code Sequence", '', 'InterlockResolutionCodeSequence'), # noqa 0x300A0746: ('SQ', '1', "Interlock Resolution User Sequence", '', 'InterlockResolutionUserSequence'), # noqa 0x300A0760: ('DT', '1', "Override DateTime", '', 'OverrideDateTime'), # noqa 0x300A0761: ('SQ', '1', "Treatment Tolerance Violation Type Code Sequence", '', 'TreatmentToleranceViolationTypeCodeSequence'), # noqa 0x300A0762: ('SQ', '1', "Treatment Tolerance Violation Cause Code Sequence", '', 'TreatmentToleranceViolationCauseCodeSequence'), # noqa 0x300A0772: ('SQ', '1', "Measured Meterset to Dose Mapping Sequence", '', 'MeasuredMetersetToDoseMappingSequence'), # noqa 0x300A0773: ('US', '1', "Referenced Expected In-Vivo Measurement Value Index", '', 'ReferencedExpectedInVivoMeasurementValueIndex'), # noqa 0x300A0774: ('SQ', '1', "Dose Measurement Device Code Sequence", '', 'DoseMeasurementDeviceCodeSequence'), # noqa 0x300A0780: ('SQ', '1', "Additional Parameter Recording Instance Sequence", '', 'AdditionalParameterRecordingInstanceSequence'), # noqa 0x300A0782: ('US', '1', "", 'Retired', ''), # noqa 0x300A0783: ('ST', '1', "Interlock Origin Description", '', 'InterlockOriginDescription'), # noqa 0x300A0784: ('SQ', '1', "RT Patient Position Scope Sequence", '', 'RTPatientPositionScopeSequence'), # noqa 0x300A0785: ('UI', '1', "Referenced Treatment Position Group UID", '', 'ReferencedTreatmentPositionGroupUID'), # noqa 0x300A0786: ('US', '1', "Radiation Order Index", '', 'RadiationOrderIndex'), # noqa 0x300A0787: ('SQ', '1', "Omitted Radiation Sequence", '', 'OmittedRadiationSequence'), # noqa 0x300A0788: ('SQ', '1', "Reason for Omission Code Sequence", '', 'ReasonForOmissionCodeSequence'), # noqa 0x300A0789: ('SQ', '1', "RT Delivery Start Patient Position Sequence", '', 'RTDeliveryStartPatientPositionSequence'), # noqa 0x300A078A: ('SQ', '1', "RT Treatment Preparation Patient Position Sequence", '', 'RTTreatmentPreparationPatientPositionSequence'), # noqa 0x300A078B: ('SQ', '1', "Referenced RT Treatment Preparation Sequence", '', 'ReferencedRTTreatmentPreparationSequence'), # noqa 0x300A078C: ('SQ', '1', "Referenced Patient Setup Photo Sequence", '', 'ReferencedPatientSetupPhotoSequence'), # noqa 0x300A078D: ('SQ', '1', "Patient Treatment Preparation Method Code Sequence", '', 'PatientTreatmentPreparationMethodCodeSequence'), # noqa 0x300A078E: ('LT', '1', "Patient Treatment Preparation Procedure Parameter Description", '', 'PatientTreatmentPreparationProcedureParameterDescription'), # noqa 0x300A078F: ('SQ', '1', "Patient Treatment Preparation Device Sequence", '', 'PatientTreatmentPreparationDeviceSequence'), # noqa 0x300A0790: ('SQ', '1', "Patient Treatment Preparation Procedure Sequence", '', 'PatientTreatmentPreparationProcedureSequence'), # noqa 0x300A0791: ('SQ', '1', "Patient Treatment Preparation Procedure Code Sequence", '', 'PatientTreatmentPreparationProcedureCodeSequence'), # noqa 0x300A0792: ('LT', '1', "Patient Treatment Preparation Method Description", '', 'PatientTreatmentPreparationMethodDescription'), # noqa 0x300A0793: ('SQ', '1', "Patient Treatment Preparation Procedure Parameter Sequence", '', 'PatientTreatmentPreparationProcedureParameterSequence'), # noqa 0x300A0794: ('LT', '1', "Patient Setup Photo Description", '', 'PatientSetupPhotoDescription'), # noqa 0x300A0795: ('US', '1', "Patient Treatment Preparation Procedure Index", '', 'PatientTreatmentPreparationProcedureIndex'), # noqa 0x300A0796: ('US', '1', "Referenced Patient Setup Procedure Index", '', 'ReferencedPatientSetupProcedureIndex'), # noqa 0x300A0797: ('SQ', '1', "RT Radiation Task Sequence", '', 'RTRadiationTaskSequence'), # noqa 0x300A0798: ('SQ', '1', "RT Patient Position Displacement Sequence", '', 'RTPatientPositionDisplacementSequence'), # noqa 0x300A0799: ('SQ', '1', "RT Patient Position Sequence", '', 'RTPatientPositionSequence'), # noqa 0x300A079A: ('LO', '1', "Displacement Reference Label", '', 'DisplacementReferenceLabel'), # noqa 0x300A079B: ('FD', '16', "Displacement Matrix", '', 'DisplacementMatrix'), # noqa 0x300A079C: ('SQ', '1', "Patient Support Displacement Sequence", '', 'PatientSupportDisplacementSequence'), # noqa 0x300A079D: ('SQ', '1', "Displacement Reference Location Code Sequence", '', 'DisplacementReferenceLocationCodeSequence'), # noqa 0x300A079E: ('CS', '1', "RT Radiation Set Delivery Usage", '', 'RTRadiationSetDeliveryUsage'), # noqa 0x300C0002: ('SQ', '1', "Referenced RT Plan Sequence", '', 'ReferencedRTPlanSequence'), # noqa 0x300C0004: ('SQ', '1', "Referenced Beam Sequence", '', 'ReferencedBeamSequence'), # noqa 0x300C0006: ('IS', '1', "Referenced Beam Number", '', 'ReferencedBeamNumber'), # noqa 0x300C0007: ('IS', '1', "Referenced Reference Image Number", '', 'ReferencedReferenceImageNumber'), # noqa 0x300C0008: ('DS', '1', "Start Cumulative Meterset Weight", '', 'StartCumulativeMetersetWeight'), # noqa 0x300C0009: ('DS', '1', "End Cumulative Meterset Weight", '', 'EndCumulativeMetersetWeight'), # noqa 0x300C000A: ('SQ', '1', "Referenced Brachy Application Setup Sequence", '', 'ReferencedBrachyApplicationSetupSequence'), # noqa 0x300C000C: ('IS', '1', "Referenced Brachy Application Setup Number", '', 'ReferencedBrachyApplicationSetupNumber'), # noqa 0x300C000E: ('IS', '1', "Referenced Source Number", '', 'ReferencedSourceNumber'), # noqa 0x300C0020: ('SQ', '1', "Referenced Fraction Group Sequence", '', 'ReferencedFractionGroupSequence'), # noqa 0x300C0022: ('IS', '1', "Referenced Fraction Group Number", '', 'ReferencedFractionGroupNumber'), # noqa 0x300C0040: ('SQ', '1', "Referenced Verification Image Sequence", '', 'ReferencedVerificationImageSequence'), # noqa 0x300C0042: ('SQ', '1', "Referenced Reference Image Sequence", '', 'ReferencedReferenceImageSequence'), # noqa 0x300C0050: ('SQ', '1', "Referenced Dose Reference Sequence", '', 'ReferencedDoseReferenceSequence'), # noqa 0x300C0051: ('IS', '1', "Referenced Dose Reference Number", '', 'ReferencedDoseReferenceNumber'), # noqa 0x300C0055: ('SQ', '1', "Brachy Referenced Dose Reference Sequence", '', 'BrachyReferencedDoseReferenceSequence'), # noqa 0x300C0060: ('SQ', '1', "Referenced Structure Set Sequence", '', 'ReferencedStructureSetSequence'), # noqa 0x300C006A: ('IS', '1', "Referenced Patient Setup Number", '', 'ReferencedPatientSetupNumber'), # noqa 0x300C0080: ('SQ', '1', "Referenced Dose Sequence", '', 'ReferencedDoseSequence'), # noqa 0x300C00A0: ('IS', '1', "Referenced Tolerance Table Number", '', 'ReferencedToleranceTableNumber'), # noqa 0x300C00B0: ('SQ', '1', "Referenced Bolus Sequence", '', 'ReferencedBolusSequence'), # noqa 0x300C00C0: ('IS', '1', "Referenced Wedge Number", '', 'ReferencedWedgeNumber'), # noqa 0x300C00D0: ('IS', '1', "Referenced Compensator Number", '', 'ReferencedCompensatorNumber'), # noqa 0x300C00E0: ('IS', '1', "Referenced Block Number", '', 'ReferencedBlockNumber'), # noqa 0x300C00F0: ('IS', '1', "Referenced Control Point Index", '', 'ReferencedControlPointIndex'), # noqa 0x300C00F2: ('SQ', '1', "Referenced Control Point Sequence", '', 'ReferencedControlPointSequence'), # noqa 0x300C00F4: ('IS', '1', "Referenced Start Control Point Index", '', 'ReferencedStartControlPointIndex'), # noqa 0x300C00F6: ('IS', '1', "Referenced Stop Control Point Index", '', 'ReferencedStopControlPointIndex'), # noqa 0x300C0100: ('IS', '1', "Referenced Range Shifter Number", '', 'ReferencedRangeShifterNumber'), # noqa 0x300C0102: ('IS', '1', "Referenced Lateral Spreading Device Number", '', 'ReferencedLateralSpreadingDeviceNumber'), # noqa 0x300C0104: ('IS', '1', "Referenced Range Modulator Number", '', 'ReferencedRangeModulatorNumber'), # noqa 0x300C0111: ('SQ', '1', "Omitted Beam Task Sequence", '', 'OmittedBeamTaskSequence'), # noqa 0x300C0112: ('CS', '1', "Reason for Omission", '', 'ReasonForOmission'), # noqa 0x300C0113: ('LO', '1', "Reason for Omission Description", '', 'ReasonForOmissionDescription'), # noqa 0x300C0114: ('SQ', '1', "Prescription Overview Sequence", '', 'PrescriptionOverviewSequence'), # noqa 0x300C0115: ('FL', '1', "Total Prescription Dose", '', 'TotalPrescriptionDose'), # noqa 0x300C0116: ('SQ', '1', "Plan Overview Sequence", '', 'PlanOverviewSequence'), # noqa 0x300C0117: ('US', '1', "Plan Overview Index", '', 'PlanOverviewIndex'), # noqa 0x300C0118: ('US', '1', "Referenced Plan Overview Index", '', 'ReferencedPlanOverviewIndex'), # noqa 0x300C0119: ('US', '1', "Number of Fractions Included", '', 'NumberOfFractionsIncluded'), # noqa 0x300C0120: ('SQ', '1', "Dose Calibration Conditions Sequence", '', 'DoseCalibrationConditionsSequence'), # noqa 0x300C0121: ('FD', '1', "Absorbed Dose to Meterset Ratio", '', 'AbsorbedDoseToMetersetRatio'), # noqa 0x300C0122: ('FD', '2', "Delineated Radiation Field Size", '', 'DelineatedRadiationFieldSize'), # noqa 0x300C0123: ('CS', '1', "Dose Calibration Conditions Verified Flag", '', 'DoseCalibrationConditionsVerifiedFlag'), # noqa 0x300C0124: ('FD', '1', "Calibration Reference Point Depth", '', 'CalibrationReferencePointDepth'), # noqa 0x300C0125: ('SQ', '1', "Gating Beam Hold Transition Sequence", '', 'GatingBeamHoldTransitionSequence'), # noqa 0x300C0126: ('CS', '1', "Beam Hold Transition", '', 'BeamHoldTransition'), # noqa 0x300C0127: ('DT', '1', "Beam Hold Transition DateTime", '', 'BeamHoldTransitionDateTime'), # noqa 0x300C0128: ('SQ', '1', "Beam Hold Originating Device Sequence", '', 'BeamHoldOriginatingDeviceSequence'), # noqa 0x300E0002: ('CS', '1', "Approval Status", '', 'ApprovalStatus'), # noqa 0x300E0004: ('DA', '1', "Review Date", '', 'ReviewDate'), # noqa 0x300E0005: ('TM', '1', "Review Time", '', 'ReviewTime'), # noqa 0x300E0008: ('PN', '1', "Reviewer Name", '', 'ReviewerName'), # noqa 0x30100001: ('SQ', '1', "Radiobiological Dose Effect Sequence", '', 'RadiobiologicalDoseEffectSequence'), # noqa 0x30100002: ('CS', '1', "Radiobiological Dose Effect Flag", '', 'RadiobiologicalDoseEffectFlag'), # noqa 0x30100003: ('SQ', '1', "Effective Dose Calculation Method Category Code Sequence", '', 'EffectiveDoseCalculationMethodCategoryCodeSequence'), # noqa 0x30100004: ('SQ', '1', "Effective Dose Calculation Method Code Sequence", '', 'EffectiveDoseCalculationMethodCodeSequence'), # noqa 0x30100005: ('LO', '1', "Effective Dose Calculation Method Description", '', 'EffectiveDoseCalculationMethodDescription'), # noqa 0x30100006: ('UI', '1', "Conceptual Volume UID", '', 'ConceptualVolumeUID'), # noqa 0x30100007: ('SQ', '1', "Originating SOP Instance Reference Sequence", '', 'OriginatingSOPInstanceReferenceSequence'), # noqa 0x30100008: ('SQ', '1', "Conceptual Volume Constituent Sequence", '', 'ConceptualVolumeConstituentSequence'), # noqa 0x30100009: ('SQ', '1', "Equivalent Conceptual Volume Instance Reference Sequence", '', 'EquivalentConceptualVolumeInstanceReferenceSequence'), # noqa 0x3010000A: ('SQ', '1', "Equivalent Conceptual Volumes Sequence", '', 'EquivalentConceptualVolumesSequence'), # noqa 0x3010000B: ('UI', '1', "Referenced Conceptual Volume UID", '', 'ReferencedConceptualVolumeUID'), # noqa 0x3010000C: ('UT', '1', "Conceptual Volume Combination Expression", '', 'ConceptualVolumeCombinationExpression'), # noqa 0x3010000D: ('US', '1', "Conceptual Volume Constituent Index", '', 'ConceptualVolumeConstituentIndex'), # noqa 0x3010000E: ('CS', '1', "Conceptual Volume Combination Flag", '', 'ConceptualVolumeCombinationFlag'), # noqa 0x3010000F: ('ST', '1', "Conceptual Volume Combination Description", '', 'ConceptualVolumeCombinationDescription'), # noqa 0x30100010: ('CS', '1', "Conceptual Volume Segmentation Defined Flag", '', 'ConceptualVolumeSegmentationDefinedFlag'), # noqa 0x30100011: ('SQ', '1', "Conceptual Volume Segmentation Reference Sequence", '', 'ConceptualVolumeSegmentationReferenceSequence'), # noqa 0x30100012: ('SQ', '1', "Conceptual Volume Constituent Segmentation Reference Sequence", '', 'ConceptualVolumeConstituentSegmentationReferenceSequence'), # noqa 0x30100013: ('UI', '1', "Constituent Conceptual Volume UID", '', 'ConstituentConceptualVolumeUID'), # noqa 0x30100014: ('SQ', '1', "Derivation Conceptual Volume Sequence", '', 'DerivationConceptualVolumeSequence'), # noqa 0x30100015: ('UI', '1', "Source Conceptual Volume UID", '', 'SourceConceptualVolumeUID'), # noqa 0x30100016: ('SQ', '1', "Conceptual Volume Derivation Algorithm Sequence", '', 'ConceptualVolumeDerivationAlgorithmSequence'), # noqa 0x30100017: ('ST', '1', "Conceptual Volume Description", '', 'ConceptualVolumeDescription'), # noqa 0x30100018: ('SQ', '1', "Source Conceptual Volume Sequence", '', 'SourceConceptualVolumeSequence'), # noqa 0x30100019: ('SQ', '1', "Author Identification Sequence", '', 'AuthorIdentificationSequence'), # noqa 0x3010001A: ('LO', '1', "Manufacturer's Model Version", '', 'ManufacturerModelVersion'), # noqa 0x3010001B: ('UC', '1', "Device Alternate Identifier", '', 'DeviceAlternateIdentifier'), # noqa 0x3010001C: ('CS', '1', "Device Alternate Identifier Type", '', 'DeviceAlternateIdentifierType'), # noqa 0x3010001D: ('LT', '1', "Device Alternate Identifier Format", '', 'DeviceAlternateIdentifierFormat'), # noqa 0x3010001E: ('LO', '1', "Segmentation Creation Template Label", '', 'SegmentationCreationTemplateLabel'), # noqa 0x3010001F: ('UI', '1', "Segmentation Template UID", '', 'SegmentationTemplateUID'), # noqa 0x30100020: ('US', '1', "Referenced Segment Reference Index", '', 'ReferencedSegmentReferenceIndex'), # noqa 0x30100021: ('SQ', '1', "Segment Reference Sequence", '', 'SegmentReferenceSequence'), # noqa 0x30100022: ('US', '1', "Segment Reference Index", '', 'SegmentReferenceIndex'), # noqa 0x30100023: ('SQ', '1', "Direct Segment Reference Sequence", '', 'DirectSegmentReferenceSequence'), # noqa 0x30100024: ('SQ', '1', "Combination Segment Reference Sequence", '', 'CombinationSegmentReferenceSequence'), # noqa 0x30100025: ('SQ', '1', "Conceptual Volume Sequence", '', 'ConceptualVolumeSequence'), # noqa 0x30100026: ('SQ', '1', "Segmented RT Accessory Device Sequence", '', 'SegmentedRTAccessoryDeviceSequence'), # noqa 0x30100027: ('SQ', '1', "Segment Characteristics Sequence", '', 'SegmentCharacteristicsSequence'), # noqa 0x30100028: ('SQ', '1', "Related Segment Characteristics Sequence", '', 'RelatedSegmentCharacteristicsSequence'), # noqa 0x30100029: ('US', '1', "Segment Characteristics Precedence", '', 'SegmentCharacteristicsPrecedence'), # noqa 0x3010002A: ('SQ', '1', "RT Segment Annotation Sequence", '', 'RTSegmentAnnotationSequence'), # noqa 0x3010002B: ('SQ', '1', "Segment Annotation Category Code Sequence", '', 'SegmentAnnotationCategoryCodeSequence'), # noqa 0x3010002C: ('SQ', '1', "Segment Annotation Type Code Sequence", '', 'SegmentAnnotationTypeCodeSequence'), # noqa 0x3010002D: ('LO', '1', "Device Label", '', 'DeviceLabel'), # noqa 0x3010002E: ('SQ', '1', "Device Type Code Sequence", '', 'DeviceTypeCodeSequence'), # noqa 0x3010002F: ('SQ', '1', "Segment Annotation Type Modifier Code Sequence", '', 'SegmentAnnotationTypeModifierCodeSequence'), # noqa 0x30100030: ('SQ', '1', "Patient Equipment Relationship Code Sequence", '', 'PatientEquipmentRelationshipCodeSequence'), # noqa 0x30100031: ('UI', '1', "Referenced Fiducials UID", '', 'ReferencedFiducialsUID'), # noqa 0x30100032: ('SQ', '1', "Patient Treatment Orientation Sequence", '', 'PatientTreatmentOrientationSequence'), # noqa 0x30100033: ('SH', '1', "User Content Label", '', 'UserContentLabel'), # noqa 0x30100034: ('LO', '1', "User Content Long Label", '', 'UserContentLongLabel'), # noqa 0x30100035: ('SH', '1', "Entity Label", '', 'EntityLabel'), # noqa 0x30100036: ('LO', '1', "Entity Name", '', 'EntityName'), # noqa 0x30100037: ('ST', '1', "Entity Description", '', 'EntityDescription'), # noqa 0x30100038: ('LO', '1', "Entity Long Label", '', 'EntityLongLabel'), # noqa 0x30100039: ('US', '1', "Device Index", '', 'DeviceIndex'), # noqa 0x3010003A: ('US', '1', "RT Treatment Phase Index", '', 'RTTreatmentPhaseIndex'), # noqa 0x3010003B: ('UI', '1', "RT Treatment Phase UID", '', 'RTTreatmentPhaseUID'), # noqa 0x3010003C: ('US', '1', "RT Prescription Index", '', 'RTPrescriptionIndex'), # noqa 0x3010003D: ('US', '1', "RT Segment Annotation Index", '', 'RTSegmentAnnotationIndex'), # noqa 0x3010003E: ('US', '1', "Basis RT Treatment Phase Index", '', 'BasisRTTreatmentPhaseIndex'), # noqa 0x3010003F: ('US', '1', "Related RT Treatment Phase Index", '', 'RelatedRTTreatmentPhaseIndex'), # noqa 0x30100040: ('US', '1', "Referenced RT Treatment Phase Index", '', 'ReferencedRTTreatmentPhaseIndex'), # noqa 0x30100041: ('US', '1', "Referenced RT Prescription Index", '', 'ReferencedRTPrescriptionIndex'), # noqa 0x30100042: ('US', '1', "Referenced Parent RT Prescription Index", '', 'ReferencedParentRTPrescriptionIndex'), # noqa 0x30100043: ('ST', '1', "Manufacturer's Device Identifier", '', 'ManufacturerDeviceIdentifier'), # noqa 0x30100044: ('SQ', '1', "Instance-Level Referenced Performed Procedure Step Sequence", '', 'InstanceLevelReferencedPerformedProcedureStepSequence'), # noqa 0x30100045: ('CS', '1', "RT Treatment Phase Intent Presence Flag", '', 'RTTreatmentPhaseIntentPresenceFlag'), # noqa 0x30100046: ('CS', '1', "Radiotherapy Treatment Type", '', 'RadiotherapyTreatmentType'), # noqa 0x30100047: ('CS', '1-n', "Teletherapy Radiation Type", '', 'TeletherapyRadiationType'), # noqa 0x30100048: ('CS', '1-n', "Brachytherapy Source Type", '', 'BrachytherapySourceType'), # noqa 0x30100049: ('SQ', '1', "Referenced RT Treatment Phase Sequence", '', 'ReferencedRTTreatmentPhaseSequence'), # noqa 0x3010004A: ('SQ', '1', "Referenced Direct Segment Instance Sequence", '', 'ReferencedDirectSegmentInstanceSequence'), # noqa 0x3010004B: ('SQ', '1', "Intended RT Treatment Phase Sequence", '', 'IntendedRTTreatmentPhaseSequence'), # noqa 0x3010004C: ('DA', '1', "Intended Phase Start Date", '', 'IntendedPhaseStartDate'), # noqa 0x3010004D: ('DA', '1', "Intended Phase End Date", '', 'IntendedPhaseEndDate'), # noqa 0x3010004E: ('SQ', '1', "RT Treatment Phase Interval Sequence", '', 'RTTreatmentPhaseIntervalSequence'), # noqa 0x3010004F: ('CS', '1', "Temporal Relationship Interval Anchor", '', 'TemporalRelationshipIntervalAnchor'), # noqa 0x30100050: ('FD', '1', "Minimum Number of Interval Days", '', 'MinimumNumberOfIntervalDays'), # noqa 0x30100051: ('FD', '1', "Maximum Number of Interval Days", '', 'MaximumNumberOfIntervalDays'), # noqa 0x30100052: ('UI', '1-n', "Pertinent SOP Classes in Study", '', 'PertinentSOPClassesInStudy'), # noqa 0x30100053: ('UI', '1-n', "Pertinent SOP Classes in Series", '', 'PertinentSOPClassesInSeries'), # noqa 0x30100054: ('LO', '1', "RT Prescription Label", '', 'RTPrescriptionLabel'), # noqa 0x30100055: ('SQ', '1', "RT Physician Intent Predecessor Sequence", '', 'RTPhysicianIntentPredecessorSequence'), # noqa 0x30100056: ('LO', '1', "RT Treatment Approach Label", '', 'RTTreatmentApproachLabel'), # noqa 0x30100057: ('SQ', '1', "RT Physician Intent Sequence", '', 'RTPhysicianIntentSequence'), # noqa 0x30100058: ('US', '1', "RT Physician Intent Index", '', 'RTPhysicianIntentIndex'), # noqa 0x30100059: ('CS', '1', "RT Treatment Intent Type", '', 'RTTreatmentIntentType'), # noqa 0x3010005A: ('UT', '1', "RT Physician Intent Narrative", '', 'RTPhysicianIntentNarrative'), # noqa 0x3010005B: ('SQ', '1', "RT Protocol Code Sequence", '', 'RTProtocolCodeSequence'), # noqa 0x3010005C: ('ST', '1', "Reason for Superseding", '', 'ReasonForSuperseding'), # noqa 0x3010005D: ('SQ', '1', "RT Diagnosis Code Sequence", '', 'RTDiagnosisCodeSequence'), # noqa 0x3010005E: ('US', '1', "Referenced RT Physician Intent Index", '', 'ReferencedRTPhysicianIntentIndex'), # noqa 0x3010005F: ('SQ', '1', "RT Physician Intent Input Instance Sequence", '', 'RTPhysicianIntentInputInstanceSequence'), # noqa 0x30100060: ('SQ', '1', "RT Anatomic Prescription Sequence", '', 'RTAnatomicPrescriptionSequence'), # noqa 0x30100061: ('UT', '1', "Prior Treatment Dose Description", '', 'PriorTreatmentDoseDescription'), # noqa 0x30100062: ('SQ', '1', "Prior Treatment Reference Sequence", '', 'PriorTreatmentReferenceSequence'), # noqa 0x30100063: ('CS', '1', "Dosimetric Objective Evaluation Scope", '', 'DosimetricObjectiveEvaluationScope'), # noqa 0x30100064: ('SQ', '1', "Therapeutic Role Category Code Sequence", '', 'TherapeuticRoleCategoryCodeSequence'), # noqa 0x30100065: ('SQ', '1', "Therapeutic Role Type Code Sequence", '', 'TherapeuticRoleTypeCodeSequence'), # noqa 0x30100066: ('US', '1', "Conceptual Volume Optimization Precedence", '', 'ConceptualVolumeOptimizationPrecedence'), # noqa 0x30100067: ('SQ', '1', "Conceptual Volume Category Code Sequence", '', 'ConceptualVolumeCategoryCodeSequence'), # noqa 0x30100068: ('CS', '1', "Conceptual Volume Blocking Constraint", '', 'ConceptualVolumeBlockingConstraint'), # noqa 0x30100069: ('SQ', '1', "Conceptual Volume Type Code Sequence", '', 'ConceptualVolumeTypeCodeSequence'), # noqa 0x3010006A: ('SQ', '1', "Conceptual Volume Type Modifier Code Sequence", '', 'ConceptualVolumeTypeModifierCodeSequence'), # noqa 0x3010006B: ('SQ', '1', "RT Prescription Sequence", '', 'RTPrescriptionSequence'), # noqa 0x3010006C: ('SQ', '1', "Dosimetric Objective Sequence", '', 'DosimetricObjectiveSequence'), # noqa 0x3010006D: ('SQ', '1', "Dosimetric Objective Type Code Sequence", '', 'DosimetricObjectiveTypeCodeSequence'), # noqa 0x3010006E: ('UI', '1', "Dosimetric Objective UID", '', 'DosimetricObjectiveUID'), # noqa 0x3010006F: ('UI', '1', "Referenced Dosimetric Objective UID", '', 'ReferencedDosimetricObjectiveUID'), # noqa 0x30100070: ('SQ', '1', "Dosimetric Objective Parameter Sequence", '', 'DosimetricObjectiveParameterSequence'), # noqa 0x30100071: ('SQ', '1', "Referenced Dosimetric Objectives Sequence", '', 'ReferencedDosimetricObjectivesSequence'), # noqa 0x30100073: ('CS', '1', "Absolute Dosimetric Objective Flag", '', 'AbsoluteDosimetricObjectiveFlag'), # noqa 0x30100074: ('FD', '1', "Dosimetric Objective Weight", '', 'DosimetricObjectiveWeight'), # noqa 0x30100075: ('CS', '1', "Dosimetric Objective Purpose", '', 'DosimetricObjectivePurpose'), # noqa 0x30100076: ('SQ', '1', "Planning Input Information Sequence", '', 'PlanningInputInformationSequence'), # noqa 0x30100077: ('LO', '1', "Treatment Site", '', 'TreatmentSite'), # noqa 0x30100078: ('SQ', '1', "Treatment Site Code Sequence", '', 'TreatmentSiteCodeSequence'), # noqa 0x30100079: ('SQ', '1', "Fraction Pattern Sequence", '', 'FractionPatternSequence'), # noqa 0x3010007A: ('UT', '1', "Treatment Technique Notes", '', 'TreatmentTechniqueNotes'), # noqa 0x3010007B: ('UT', '1', "Prescription Notes", '', 'PrescriptionNotes'), # noqa 0x3010007C: ('IS', '1', "Number of Interval Fractions", '', 'NumberOfIntervalFractions'), # noqa 0x3010007D: ('US', '1', "Number of Fractions", '', 'NumberOfFractions'), # noqa 0x3010007E: ('US', '1', "Intended Delivery Duration", '', 'IntendedDeliveryDuration'), # noqa 0x3010007F: ('UT', '1', "Fractionation Notes", '', 'FractionationNotes'), # noqa 0x30100080: ('SQ', '1', "RT Treatment Technique Code Sequence", '', 'RTTreatmentTechniqueCodeSequence'), # noqa 0x30100081: ('SQ', '1', "Prescription Notes Sequence", '', 'PrescriptionNotesSequence'), # noqa 0x30100082: ('SQ', '1', "Fraction-Based Relationship Sequence", '', 'FractionBasedRelationshipSequence'), # noqa 0x30100083: ('CS', '1', "Fraction-Based Relationship Interval Anchor", '', 'FractionBasedRelationshipIntervalAnchor'), # noqa 0x30100084: ('FD', '1', "Minimum Hours between Fractions", '', 'MinimumHoursBetweenFractions'), # noqa 0x30100085: ('TM', '1-n', "Intended Fraction Start Time", '', 'IntendedFractionStartTime'), # noqa 0x30100086: ('LT', '1', "Intended Start Day of Week", '', 'IntendedStartDayOfWeek'), # noqa 0x30100087: ('SQ', '1', "Weekday Fraction Pattern Sequence", '', 'WeekdayFractionPatternSequence'), # noqa 0x30100088: ('SQ', '1', "Delivery Time Structure Code Sequence", '', 'DeliveryTimeStructureCodeSequence'), # noqa 0x30100089: ('SQ', '1', "Treatment Site Modifier Code Sequence", '', 'TreatmentSiteModifierCodeSequence'), # noqa 0x30100090: ('CS', '1', "Robotic Base Location Indicator", 'Retired', 'RoboticBaseLocationIndicator'), # noqa 0x30100091: ('SQ', '1', "Robotic Path Node Set Code Sequence", '', 'RoboticPathNodeSetCodeSequence'), # noqa 0x30100092: ('UL', '1', "Robotic Node Identifier", '', 'RoboticNodeIdentifier'), # noqa 0x30100093: ('FD', '3', "RT Treatment Source Coordinates", '', 'RTTreatmentSourceCoordinates'), # noqa 0x30100094: ('FD', '1', "Radiation Source Coordinate SystemYaw Angle", '', 'RadiationSourceCoordinateSystemYawAngle'), # noqa 0x30100095: ('FD', '1', "Radiation Source Coordinate SystemRoll Angle", '', 'RadiationSourceCoordinateSystemRollAngle'), # noqa 0x30100096: ('FD', '1', "Radiation Source Coordinate System Pitch Angle", '', 'RadiationSourceCoordinateSystemPitchAngle'), # noqa 0x30100097: ('SQ', '1', "Robotic Path Control Point Sequence", '', 'RoboticPathControlPointSequence'), # noqa 0x30100098: ('SQ', '1', "Tomotherapeutic Control Point Sequence", '', 'TomotherapeuticControlPointSequence'), # noqa 0x30100099: ('FD', '1-n', "Tomotherapeutic Leaf Open Durations", '', 'TomotherapeuticLeafOpenDurations'), # noqa 0x3010009A: ('FD', '1-n', "Tomotherapeutic Leaf Initial Closed Durations", '', 'TomotherapeuticLeafInitialClosedDurations'), # noqa 0x301000A0: ('SQ', '1', "Conceptual Volume Identification Sequence", '', 'ConceptualVolumeIdentificationSequence'), # noqa 0x40000010: ('LT', '1', "Arbitrary", 'Retired', 'Arbitrary'), # noqa 0x40004000: ('LT', '1', "Text Comments", 'Retired', 'TextComments'), # noqa 0x40080040: ('SH', '1', "Results ID", 'Retired', 'ResultsID'), # noqa 0x40080042: ('LO', '1', "Results ID Issuer", 'Retired', 'ResultsIDIssuer'), # noqa 0x40080050: ('SQ', '1', "Referenced Interpretation Sequence", 'Retired', 'ReferencedInterpretationSequence'), # noqa 0x400800FF: ('CS', '1', "Report Production Status (Trial)", 'Retired', 'ReportProductionStatusTrial'), # noqa 0x40080100: ('DA', '1', "Interpretation Recorded Date", 'Retired', 'InterpretationRecordedDate'), # noqa 0x40080101: ('TM', '1', "Interpretation Recorded Time", 'Retired', 'InterpretationRecordedTime'), # noqa 0x40080102: ('PN', '1', "Interpretation Recorder", 'Retired', 'InterpretationRecorder'), # noqa 0x40080103: ('LO', '1', "Reference to Recorded Sound", 'Retired', 'ReferenceToRecordedSound'), # noqa 0x40080108: ('DA', '1', "Interpretation Transcription Date", 'Retired', 'InterpretationTranscriptionDate'), # noqa 0x40080109: ('TM', '1', "Interpretation Transcription Time", 'Retired', 'InterpretationTranscriptionTime'), # noqa 0x4008010A: ('PN', '1', "Interpretation Transcriber", 'Retired', 'InterpretationTranscriber'), # noqa 0x4008010B: ('ST', '1', "Interpretation Text", 'Retired', 'InterpretationText'), # noqa 0x4008010C: ('PN', '1', "Interpretation Author", 'Retired', 'InterpretationAuthor'), # noqa 0x40080111: ('SQ', '1', "Interpretation Approver Sequence", 'Retired', 'InterpretationApproverSequence'), # noqa 0x40080112: ('DA', '1', "Interpretation Approval Date", 'Retired', 'InterpretationApprovalDate'), # noqa 0x40080113: ('TM', '1', "Interpretation Approval Time", 'Retired', 'InterpretationApprovalTime'), # noqa 0x40080114: ('PN', '1', "Physician Approving Interpretation", 'Retired', 'PhysicianApprovingInterpretation'), # noqa 0x40080115: ('LT', '1', "Interpretation Diagnosis Description", 'Retired', 'InterpretationDiagnosisDescription'), # noqa 0x40080117: ('SQ', '1', "Interpretation Diagnosis Code Sequence", 'Retired', 'InterpretationDiagnosisCodeSequence'), # noqa 0x40080118: ('SQ', '1', "Results Distribution List Sequence", 'Retired', 'ResultsDistributionListSequence'), # noqa 0x40080119: ('PN', '1', "Distribution Name", 'Retired', 'DistributionName'), # noqa 0x4008011A: ('LO', '1', "Distribution Address", 'Retired', 'DistributionAddress'), # noqa 0x40080200: ('SH', '1', "Interpretation ID", 'Retired', 'InterpretationID'), # noqa 0x40080202: ('LO', '1', "Interpretation ID Issuer", 'Retired', 'InterpretationIDIssuer'), # noqa 0x40080210: ('CS', '1', "Interpretation Type ID", 'Retired', 'InterpretationTypeID'), # noqa 0x40080212: ('CS', '1', "Interpretation Status ID", 'Retired', 'InterpretationStatusID'), # noqa 0x40080300: ('ST', '1', "Impressions", 'Retired', 'Impressions'), # noqa 0x40084000: ('ST', '1', "Results Comments", 'Retired', 'ResultsComments'), # noqa 0x40100001: ('CS', '1', "Low Energy Detectors", '', 'LowEnergyDetectors'), # noqa 0x40100002: ('CS', '1', "High Energy Detectors", '', 'HighEnergyDetectors'), # noqa 0x40100004: ('SQ', '1', "Detector Geometry Sequence", '', 'DetectorGeometrySequence'), # noqa 0x40101001: ('SQ', '1', "Threat ROI Voxel Sequence", '', 'ThreatROIVoxelSequence'), # noqa 0x40101004: ('FL', '3', "Threat ROI Base", '', 'ThreatROIBase'), # noqa 0x40101005: ('FL', '3', "Threat ROI Extents", '', 'ThreatROIExtents'), # noqa 0x40101006: ('OB', '1', "Threat ROI Bitmap", '', 'ThreatROIBitmap'), # noqa 0x40101007: ('SH', '1', "Route Segment ID", '', 'RouteSegmentID'), # noqa 0x40101008: ('CS', '1', "Gantry Type", '', 'GantryType'), # noqa 0x40101009: ('CS', '1', "OOI Owner Type", '', 'OOIOwnerType'), # noqa 0x4010100A: ('SQ', '1', "Route Segment Sequence", '', 'RouteSegmentSequence'), # noqa 0x40101010: ('US', '1', "Potential Threat Object ID", '', 'PotentialThreatObjectID'), # noqa 0x40101011: ('SQ', '1', "Threat Sequence", '', 'ThreatSequence'), # noqa 0x40101012: ('CS', '1', "Threat Category", '', 'ThreatCategory'), # noqa 0x40101013: ('LT', '1', "Threat Category Description", '', 'ThreatCategoryDescription'), # noqa 0x40101014: ('CS', '1', "ATD Ability Assessment", '', 'ATDAbilityAssessment'), # noqa 0x40101015: ('CS', '1', "ATD Assessment Flag", '', 'ATDAssessmentFlag'), # noqa 0x40101016: ('FL', '1', "ATD Assessment Probability", '', 'ATDAssessmentProbability'), # noqa 0x40101017: ('FL', '1', "Mass", '', 'Mass'), # noqa 0x40101018: ('FL', '1', "Density", '', 'Density'), # noqa 0x40101019: ('FL', '1', "Z Effective", '', 'ZEffective'), # noqa 0x4010101A: ('SH', '1', "Boarding Pass ID", '', 'BoardingPassID'), # noqa 0x4010101B: ('FL', '3', "Center of Mass", '', 'CenterOfMass'), # noqa 0x4010101C: ('FL', '3', "Center of PTO", '', 'CenterOfPTO'), # noqa 0x4010101D: ('FL', '6-n', "Bounding Polygon", '', 'BoundingPolygon'), # noqa 0x4010101E: ('SH', '1', "Route Segment Start Location ID", '', 'RouteSegmentStartLocationID'), # noqa 0x4010101F: ('SH', '1', "Route Segment End Location ID", '', 'RouteSegmentEndLocationID'), # noqa 0x40101020: ('CS', '1', "Route Segment Location ID Type", '', 'RouteSegmentLocationIDType'), # noqa 0x40101021: ('CS', '1-n', "Abort Reason", '', 'AbortReason'), # noqa 0x40101023: ('FL', '1', "Volume of PTO", '', 'VolumeOfPTO'), # noqa 0x40101024: ('CS', '1', "Abort Flag", '', 'AbortFlag'), # noqa 0x40101025: ('DT', '1', "Route Segment Start Time", '', 'RouteSegmentStartTime'), # noqa 0x40101026: ('DT', '1', "Route Segment End Time", '', 'RouteSegmentEndTime'), # noqa 0x40101027: ('CS', '1', "TDR Type", '', 'TDRType'), # noqa 0x40101028: ('CS', '1', "International Route Segment", '', 'InternationalRouteSegment'), # noqa 0x40101029: ('LO', '1-n', "Threat Detection Algorithm and Version", '', 'ThreatDetectionAlgorithmAndVersion'), # noqa 0x4010102A: ('SH', '1', "Assigned Location", '', 'AssignedLocation'), # noqa 0x4010102B: ('DT', '1', "Alarm Decision Time", '', 'AlarmDecisionTime'), # noqa 0x40101031: ('CS', '1', "Alarm Decision", '', 'AlarmDecision'), # noqa 0x40101033: ('US', '1', "Number of Total Objects", '', 'NumberOfTotalObjects'), # noqa 0x40101034: ('US', '1', "Number of Alarm Objects", '', 'NumberOfAlarmObjects'), # noqa 0x40101037: ('SQ', '1', "PTO Representation Sequence", '', 'PTORepresentationSequence'), # noqa 0x40101038: ('SQ', '1', "ATD Assessment Sequence", '', 'ATDAssessmentSequence'), # noqa 0x40101039: ('CS', '1', "TIP Type", '', 'TIPType'), # noqa 0x4010103A: ('CS', '1', "DICOS Version", '', 'DICOSVersion'), # noqa 0x40101041: ('DT', '1', "OOI Owner Creation Time", '', 'OOIOwnerCreationTime'), # noqa 0x40101042: ('CS', '1', "OOI Type", '', 'OOIType'), # noqa 0x40101043: ('FL', '3', "OOI Size", '', 'OOISize'), # noqa 0x40101044: ('CS', '1', "Acquisition Status", '', 'AcquisitionStatus'), # noqa 0x40101045: ('SQ', '1', "Basis Materials Code Sequence", '', 'BasisMaterialsCodeSequence'), # noqa 0x40101046: ('CS', '1', "Phantom Type", '', 'PhantomType'), # noqa 0x40101047: ('SQ', '1', "OOI Owner Sequence", '', 'OOIOwnerSequence'), # noqa 0x40101048: ('CS', '1', "Scan Type", '', 'ScanType'), # noqa 0x40101051: ('LO', '1', "Itinerary ID", '', 'ItineraryID'), # noqa 0x40101052: ('SH', '1', "Itinerary ID Type", '', 'ItineraryIDType'), # noqa 0x40101053: ('LO', '1', "Itinerary ID Assigning Authority", '', 'ItineraryIDAssigningAuthority'), # noqa 0x40101054: ('SH', '1', "Route ID", '', 'RouteID'), # noqa 0x40101055: ('SH', '1', "Route ID Assigning Authority", '', 'RouteIDAssigningAuthority'), # noqa 0x40101056: ('CS', '1', "Inbound Arrival Type", '', 'InboundArrivalType'), # noqa 0x40101058: ('SH', '1', "Carrier ID", '', 'CarrierID'), # noqa 0x40101059: ('CS', '1', "Carrier ID Assigning Authority", '', 'CarrierIDAssigningAuthority'), # noqa 0x40101060: ('FL', '3', "Source Orientation", '', 'SourceOrientation'), # noqa 0x40101061: ('FL', '3', "Source Position", '', 'SourcePosition'), # noqa 0x40101062: ('FL', '1', "Belt Height", '', 'BeltHeight'), # noqa 0x40101064: ('SQ', '1', "Algorithm Routing Code Sequence", '', 'AlgorithmRoutingCodeSequence'), # noqa 0x40101067: ('CS', '1', "Transport Classification", '', 'TransportClassification'), # noqa 0x40101068: ('LT', '1', "OOI Type Descriptor", '', 'OOITypeDescriptor'), # noqa 0x40101069: ('FL', '1', "Total Processing Time", '', 'TotalProcessingTime'), # noqa 0x4010106C: ('OB', '1', "Detector Calibration Data", '', 'DetectorCalibrationData'), # noqa 0x4010106D: ('CS', '1', "Additional Screening Performed", '', 'AdditionalScreeningPerformed'), # noqa 0x4010106E: ('CS', '1', "Additional Inspection Selection Criteria", '', 'AdditionalInspectionSelectionCriteria'), # noqa 0x4010106F: ('SQ', '1', "Additional Inspection Method Sequence", '', 'AdditionalInspectionMethodSequence'), # noqa 0x40101070: ('CS', '1', "AIT Device Type", '', 'AITDeviceType'), # noqa 0x40101071: ('SQ', '1', "QR Measurements Sequence", '', 'QRMeasurementsSequence'), # noqa 0x40101072: ('SQ', '1', "Target Material Sequence", '', 'TargetMaterialSequence'), # noqa 0x40101073: ('FD', '1', "SNR Threshold", '', 'SNRThreshold'), # noqa 0x40101075: ('DS', '1', "Image Scale Representation", '', 'ImageScaleRepresentation'), # noqa 0x40101076: ('SQ', '1', "Referenced PTO Sequence", '', 'ReferencedPTOSequence'), # noqa 0x40101077: ('SQ', '1', "Referenced TDR Instance Sequence", '', 'ReferencedTDRInstanceSequence'), # noqa 0x40101078: ('ST', '1', "PTO Location Description", '', 'PTOLocationDescription'), # noqa 0x40101079: ('SQ', '1', "Anomaly Locator Indicator Sequence", '', 'AnomalyLocatorIndicatorSequence'), # noqa 0x4010107A: ('FL', '3', "Anomaly Locator Indicator", '', 'AnomalyLocatorIndicator'), # noqa 0x4010107B: ('SQ', '1', "PTO Region Sequence", '', 'PTORegionSequence'), # noqa 0x4010107C: ('CS', '1', "Inspection Selection Criteria", '', 'InspectionSelectionCriteria'), # noqa 0x4010107D: ('SQ', '1', "Secondary Inspection Method Sequence", '', 'SecondaryInspectionMethodSequence'), # noqa 0x4010107E: ('DS', '6', "PRCS to RCS Orientation", '', 'PRCSToRCSOrientation'), # noqa 0x4FFE0001: ('SQ', '1', "MAC Parameters Sequence", '', 'MACParametersSequence'), # noqa 0x52009229: ('SQ', '1', "Shared Functional Groups Sequence", '', 'SharedFunctionalGroupsSequence'), # noqa 0x52009230: ('SQ', '1', "Per-frame Functional Groups Sequence", '', 'PerFrameFunctionalGroupsSequence'), # noqa 0x54000100: ('SQ', '1', "Waveform Sequence", '', 'WaveformSequence'), # noqa 0x54000110: ('OB or OW', '1', "Channel Minimum Value", '', 'ChannelMinimumValue'), # noqa 0x54000112: ('OB or OW', '1', "Channel Maximum Value", '', 'ChannelMaximumValue'), # noqa 0x54001004: ('US', '1', "Waveform Bits Allocated", '', 'WaveformBitsAllocated'), # noqa 0x54001006: ('CS', '1', "Waveform Sample Interpretation", '', 'WaveformSampleInterpretation'), # noqa 0x5400100A: ('OB or OW', '1', "Waveform Padding Value", '', 'WaveformPaddingValue'), # noqa 0x54001010: ('OB or OW', '1', "Waveform Data", '', 'WaveformData'), # noqa 0x56000010: ('OF', '1', "First Order Phase Correction Angle", '', 'FirstOrderPhaseCorrectionAngle'), # noqa 0x56000020: ('OF', '1', "Spectroscopy Data", '', 'SpectroscopyData'), # noqa 0x7FE00001: ('OV', '1', "Extended Offset Table", '', 'ExtendedOffsetTable'), # noqa 0x7FE00002: ('OV', '1', "Extended Offset Table Lengths", '', 'ExtendedOffsetTableLengths'), # noqa 0x7FE00003: ('UV', '1', "Encapsulated Pixel Data Value Total Length", '', 'EncapsulatedPixelDataValueTotalLength'), # noqa 0x7FE00008: ('OF', '1', "Float Pixel Data", '', 'FloatPixelData'), # noqa 0x7FE00009: ('OD', '1', "Double Float Pixel Data", '', 'DoubleFloatPixelData'), # noqa 0x7FE00010: ('OB or OW', '1', "Pixel Data", '', 'PixelData'), # noqa 0x7FE00020: ('OW', '1', "Coefficients SDVN", 'Retired', 'CoefficientsSDVN'), # noqa 0x7FE00030: ('OW', '1', "Coefficients SDHN", 'Retired', 'CoefficientsSDHN'), # noqa 0x7FE00040: ('OW', '1', "Coefficients SDDN", 'Retired', 'CoefficientsSDDN'), # noqa 0xFFFAFFFA: ('SQ', '1', "Digital Signatures Sequence", '', 'DigitalSignaturesSequence'), # noqa 0xFFFCFFFC: ('OB', '1', "Data Set Trailing Padding", '', 'DataSetTrailingPadding'), # noqa 0xFFFEE000: ('NONE', '1', "Item", '', 'Item'), # noqa 0xFFFEE00D: ('NONE', '1', "Item Delimitation Item", '', 'ItemDelimitationItem'), # noqa 0xFFFEE0DD: ('NONE', '1', "Sequence Delimitation Item", '', 'SequenceDelimitationItem') # noqa } RepeatersDictionary: Dict[str, Tuple[str, str, str, str, str]] = { '002031xx': ('CS', '1-n', "Source Image IDs", 'Retired', 'SourceImageIDs'), # noqa '002804x0': ('US', '1', "Rows For Nth Order Coefficients", 'Retired', 'RowsForNthOrderCoefficients'), # noqa '002804x1': ('US', '1', "Columns For Nth Order Coefficients", 'Retired', 'ColumnsForNthOrderCoefficients'), # noqa '002804x2': ('LO', '1-n', "Coefficient Coding", 'Retired', 'CoefficientCoding'), # noqa '002804x3': ('AT', '1-n', "Coefficient Coding Pointers", 'Retired', 'CoefficientCodingPointers'), # noqa '002808x0': ('CS', '1-n', "Code Label", 'Retired', 'CodeLabel'), # noqa '002808x2': ('US', '1', "Number of Tables", 'Retired', 'NumberOfTables'), # noqa '002808x3': ('AT', '1-n', "Code Table Location", 'Retired', 'CodeTableLocation'), # noqa '002808x4': ('US', '1', "Bits For Code Word", 'Retired', 'BitsForCodeWord'), # noqa '002808x8': ('AT', '1-n', "Image Data Location", 'Retired', 'ImageDataLocation'), # noqa '1000xxx0': ('US', '3', "Escape Triplet", 'Retired', 'EscapeTriplet'), # noqa '1000xxx1': ('US', '3', "Run Length Triplet", 'Retired', 'RunLengthTriplet'), # noqa '1000xxx2': ('US', '1', "Huffman Table Size", 'Retired', 'HuffmanTableSize'), # noqa '1000xxx3': ('US', '3', "Huffman Table Triplet", 'Retired', 'HuffmanTableTriplet'), # noqa '1000xxx4': ('US', '1', "Shift Table Size", 'Retired', 'ShiftTableSize'), # noqa '1000xxx5': ('US', '3', "Shift Table Triplet", 'Retired', 'ShiftTableTriplet'), # noqa '1010xxxx': ('US', '1-n', "Zonal Map", 'Retired', 'ZonalMap'), # noqa '50xx0005': ('US', '1', "Curve Dimensions", 'Retired', 'CurveDimensions'), # noqa '50xx0010': ('US', '1', "Number of Points", 'Retired', 'NumberOfPoints'), # noqa '50xx0020': ('CS', '1', "Type of Data", 'Retired', 'TypeOfData'), # noqa '50xx0022': ('LO', '1', "Curve Description", 'Retired', 'CurveDescription'), # noqa '50xx0030': ('SH', '1-n', "Axis Units", 'Retired', 'AxisUnits'), # noqa '50xx0040': ('SH', '1-n', "Axis Labels", 'Retired', 'AxisLabels'), # noqa '50xx0103': ('US', '1', "Data Value Representation", 'Retired', 'DataValueRepresentation'), # noqa '50xx0104': ('US', '1-n', "Minimum Coordinate Value", 'Retired', 'MinimumCoordinateValue'), # noqa '50xx0105': ('US', '1-n', "Maximum Coordinate Value", 'Retired', 'MaximumCoordinateValue'), # noqa '50xx0106': ('SH', '1-n', "Curve Range", 'Retired', 'CurveRange'), # noqa '50xx0110': ('US', '1-n', "Curve Data Descriptor", 'Retired', 'CurveDataDescriptor'), # noqa '50xx0112': ('US', '1-n', "Coordinate Start Value", 'Retired', 'CoordinateStartValue'), # noqa '50xx0114': ('US', '1-n', "Coordinate Step Value", 'Retired', 'CoordinateStepValue'), # noqa '50xx1001': ('CS', '1', "Curve Activation Layer", 'Retired', 'CurveActivationLayer'), # noqa '50xx2000': ('US', '1', "Audio Type", 'Retired', 'AudioType'), # noqa '50xx2002': ('US', '1', "Audio Sample Format", 'Retired', 'AudioSampleFormat'), # noqa '50xx2004': ('US', '1', "Number of Channels", 'Retired', 'NumberOfChannels'), # noqa '50xx2006': ('UL', '1', "Number of Samples", 'Retired', 'NumberOfSamples'), # noqa '50xx2008': ('UL', '1', "Sample Rate", 'Retired', 'SampleRate'), # noqa '50xx200A': ('UL', '1', "Total Time", 'Retired', 'TotalTime'), # noqa '50xx200C': ('OB or OW', '1', "Audio Sample Data", 'Retired', 'AudioSampleData'), # noqa '50xx200E': ('LT', '1', "Audio Comments", 'Retired', 'AudioComments'), # noqa '50xx2500': ('LO', '1', "Curve Label", 'Retired', 'CurveLabel'), # noqa '50xx2600': ('SQ', '1', "Curve Referenced Overlay Sequence", 'Retired', 'CurveReferencedOverlaySequence'), # noqa '50xx2610': ('US', '1', "Curve Referenced Overlay Group", 'Retired', 'CurveReferencedOverlayGroup'), # noqa '50xx3000': ('OB or OW', '1', "Curve Data", 'Retired', 'CurveData'), # noqa '60xx0010': ('US', '1', "Overlay Rows", '', 'OverlayRows'), # noqa '60xx0011': ('US', '1', "Overlay Columns", '', 'OverlayColumns'), # noqa '60xx0012': ('US', '1', "Overlay Planes", 'Retired', 'OverlayPlanes'), # noqa '60xx0015': ('IS', '1', "Number of Frames in Overlay", '', 'NumberOfFramesInOverlay'), # noqa '60xx0022': ('LO', '1', "Overlay Description", '', 'OverlayDescription'), # noqa '60xx0040': ('CS', '1', "Overlay Type", '', 'OverlayType'), # noqa '60xx0045': ('LO', '1', "Overlay Subtype", '', 'OverlaySubtype'), # noqa '60xx0050': ('SS', '2', "Overlay Origin", '', 'OverlayOrigin'), # noqa '60xx0051': ('US', '1', "Image Frame Origin", '', 'ImageFrameOrigin'), # noqa '60xx0052': ('US', '1', "Overlay Plane Origin", 'Retired', 'OverlayPlaneOrigin'), # noqa '60xx0060': ('CS', '1', "Overlay Compression Code", 'Retired', 'OverlayCompressionCode'), # noqa '60xx0061': ('SH', '1', "Overlay Compression Originator", 'Retired', 'OverlayCompressionOriginator'), # noqa '60xx0062': ('SH', '1', "Overlay Compression Label", 'Retired', 'OverlayCompressionLabel'), # noqa '60xx0063': ('CS', '1', "Overlay Compression Description", 'Retired', 'OverlayCompressionDescription'), # noqa '60xx0066': ('AT', '1-n', "Overlay Compression Step Pointers", 'Retired', 'OverlayCompressionStepPointers'), # noqa '60xx0068': ('US', '1', "Overlay Repeat Interval", 'Retired', 'OverlayRepeatInterval'), # noqa '60xx0069': ('US', '1', "Overlay Bits Grouped", 'Retired', 'OverlayBitsGrouped'), # noqa '60xx0100': ('US', '1', "Overlay Bits Allocated", '', 'OverlayBitsAllocated'), # noqa '60xx0102': ('US', '1', "Overlay Bit Position", '', 'OverlayBitPosition'), # noqa '60xx0110': ('CS', '1', "Overlay Format", 'Retired', 'OverlayFormat'), # noqa '60xx0200': ('US', '1', "Overlay Location", 'Retired', 'OverlayLocation'), # noqa '60xx0800': ('CS', '1-n', "Overlay Code Label", 'Retired', 'OverlayCodeLabel'), # noqa '60xx0802': ('US', '1', "Overlay Number of Tables", 'Retired', 'OverlayNumberOfTables'), # noqa '60xx0803': ('AT', '1-n', "Overlay Code Table Location", 'Retired', 'OverlayCodeTableLocation'), # noqa '60xx0804': ('US', '1', "Overlay Bits For Code Word", 'Retired', 'OverlayBitsForCodeWord'), # noqa '60xx1001': ('CS', '1', "Overlay Activation Layer", '', 'OverlayActivationLayer'), # noqa '60xx1100': ('US', '1', "Overlay Descriptor - Gray", 'Retired', 'OverlayDescriptorGray'), # noqa '60xx1101': ('US', '1', "Overlay Descriptor - Red", 'Retired', 'OverlayDescriptorRed'), # noqa '60xx1102': ('US', '1', "Overlay Descriptor - Green", 'Retired', 'OverlayDescriptorGreen'), # noqa '60xx1103': ('US', '1', "Overlay Descriptor - Blue", 'Retired', 'OverlayDescriptorBlue'), # noqa '60xx1200': ('US', '1-n', "Overlays - Gray", 'Retired', 'OverlaysGray'), # noqa '60xx1201': ('US', '1-n', "Overlays - Red", 'Retired', 'OverlaysRed'), # noqa '60xx1202': ('US', '1-n', "Overlays - Green", 'Retired', 'OverlaysGreen'), # noqa '60xx1203': ('US', '1-n', "Overlays - Blue", 'Retired', 'OverlaysBlue'), # noqa '60xx1301': ('IS', '1', "ROI Area", '', 'ROIArea'), # noqa '60xx1302': ('DS', '1', "ROI Mean", '', 'ROIMean'), # noqa '60xx1303': ('DS', '1', "ROI Standard Deviation", '', 'ROIStandardDeviation'), # noqa '60xx1500': ('LO', '1', "Overlay Label", '', 'OverlayLabel'), # noqa '60xx3000': ('OB or OW', '1', "Overlay Data", '', 'OverlayData'), # noqa '60xx4000': ('LT', '1', "Overlay Comments", 'Retired', 'OverlayComments'), # noqa '7Fxx0010': ('OB or OW', '1', "Variable Pixel Data", 'Retired', 'VariablePixelData'), # noqa '7Fxx0011': ('US', '1', "Variable Next Data Group", 'Retired', 'VariableNextDataGroup'), # noqa '7Fxx0020': ('OW', '1', "Variable Coefficients SDVN", 'Retired', 'VariableCoefficientsSDVN'), # noqa '7Fxx0030': ('OW', '1', "Variable Coefficients SDHN", 'Retired', 'VariableCoefficientsSDHN'), # noqa '7Fxx0040': ('OW', '1', "Variable Coefficients SDDN", 'Retired', 'VariableCoefficientsSDDN') # noqa } pydicom-2.4.3/pydicom/_private_dict.py000066400000000000000000022554641446675437500200650ustar00rootroot00000000000000"""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). """ from typing import Dict, Tuple private_dictionaries: Dict[str, Dict[str, Tuple[str, str, str, str]]] = { '1.2.840.113663.1': { '0029xx00': ('US', '1', 'Unknown', ''), # noqa '0029xx01': ('US', '1', 'Unknown', ''), # noqa }, '1.2.840.113681': { '0019xx10': ('ST', '1', 'CR Image Params Common', ''), # noqa '0019xx11': ('ST', '1', 'CR Image IP Params Single', ''), # noqa '0019xx12': ('ST', '1', 'CR Image IP Params Left', ''), # noqa '0019xx13': ('ST', '1', 'CR Image IP Params Right', ''), # noqa }, '1.2.840.113708.794.1.1.2.0': { '0087xx10': ('CS', '1', 'Media Type', ''), # noqa '0087xx20': ('CS', '1', 'Media Location', ''), # noqa '0087xx30': ('ST', '1', 'Storage File ID', ''), # noqa '0087xx40': ('DS', '1', 'Study or Image Size in MB', ''), # noqa '0087xx50': ('IS', '1', 'Estimated Retrieve Time', ''), # noqa }, '2.16.840.1.114059.1.1.6.1.50.1': { '0029xx20': ('LT', '1', 'Description', ''), # noqa '0029xx21': ('ST', '1', 'Orientation', ''), # noqa '0029xx22': ('ST', '1', 'Parameter 1', ''), # noqa '0029xx23': ('ST', '1', 'Parameter 2', ''), # noqa '0029xx24': ('LO', '1', 'Teeth', ''), # noqa '0029xx25': ('LO', '1', 'Jaw', ''), # noqa '0029xx26': ('LO', '1', 'Quadrant', ''), # noqa '0029xx27': ('LO', '1', 'CRC', ''), # noqa }, 'A.L.I. Technologies, Inc.': { '3711xx01': ('LO', '1', 'Filename', ''), # noqa '3711xx02': ('OB', '1', 'Data Blob of a Visit', ''), # noqa '3711xx03': ('US', '1', 'Revision Number', ''), # noqa '3711xx04': ('UL', '1', 'Unix Timestamp', ''), # noqa '3711xx05': ('IS', '1', 'Bag ID', ''), # noqa '3711xx0c': ('UI', '1', 'Original Study UID', ''), # noqa '3711xx0d': ('US', '1', 'Overlay Grayscale Value', ''), # noqa '3711xx0e': ('CS', '1', 'Anonymization Status', ''), # noqa }, 'ACUSON': { '0009xx00': ('IS', '1', 'Unknown', ''), # noqa '0009xx01': ('IS', '1', 'Unknown', ''), # noqa '0009xx02': ('UN', '1', 'Unknown', ''), # noqa '0009xx03': ('UN', '1', 'Unknown', ''), # noqa '0009xx04': ('UN', '1', 'Unknown', ''), # noqa '0009xx05': ('UN', '1', 'Unknown', ''), # noqa '0009xx06': ('UN', '1', 'Unknown', ''), # noqa '0009xx07': ('UN', '1', 'Unknown', ''), # noqa '0009xx08': ('LT', '1', 'Unknown', ''), # noqa '0009xx09': ('LT', '1', 'Unknown', ''), # noqa '0009xx0a': ('IS', '1', 'Unknown', ''), # noqa '0009xx0b': ('IS', '1', 'Unknown', ''), # noqa '0009xx0c': ('IS', '1', 'Unknown', ''), # noqa '0009xx0d': ('IS', '1', 'Unknown', ''), # noqa '0009xx0e': ('IS', '1', 'Unknown', ''), # noqa '0009xx0f': ('UN', '1', 'Unknown', ''), # noqa '0009xx10': ('IS', '1', 'Unknown', ''), # noqa '0009xx11': ('UN', '1', 'Unknown', ''), # noqa '0009xx12': ('IS', '1', 'Unknown', ''), # noqa '0009xx13': ('IS', '1', 'Unknown', ''), # noqa '0009xx14': ('LT', '1', 'Unknown', ''), # noqa '0009xx15': ('UN', '1', 'Unknown', ''), # noqa }, 'ACUSON: 1.2.840.11386.1.0': { '7fdfxx00': ('IS', '1', 'Lossy Compression Ratio', ''), # noqa '7fdfxx01': ('US', '1', 'Image Format', ''), # noqa '7fdfxx02': ('US', '1', 'Acuson Region Type', ''), # noqa '7fdfxx0b': ('UL', '1', 'Acuson Image Apex X', ''), # noqa '7fdfxx0c': ('UL', '1', 'Acuson Image Apex Y', ''), # noqa '7fdfxx0d': ('IS', '1', 'B-Color-On Flag', ''), # noqa }, 'ACUSON:1.2.840.113680.1.0:0921': { '0009xx20': ('UN', '1', 'View Name', ''), # noqa '0009xx2a': ('UN', '1', 'View List', ''), # noqa }, 'ACUSON:1.2.840.113680.1.0:7f10': { '7fdfxx00': ('UN', '1', 'Lossy Compression Ratio', ''), # noqa '7fdfxx01': ('UN', '1', 'Image Format', ''), # noqa '7fdfxx02': ('UN', '1', 'Acuson Region Type', ''), # noqa '7fdfxx0b': ('UN', '1', 'Acuson Image Apex X', ''), # noqa '7fdfxx0c': ('UN', '1', 'Acuson Image Apex Y', ''), # noqa '7fdfxx0d': ('UN', '1', 'B-Color-On Flag', ''), # noqa '7fdfxx0e': ('UN', '1', 'Acuson Mechanical Apex X', ''), # noqa '7fdfxx0f': ('UN', '1', 'Acuson Mechanical Apex Y', ''), # noqa '7fdfxx10': ('UN', '1', 'Acquisition Type:', ''), # noqa '7fdfxx18': ('UN', '1', 'Transformation Matrix Sequence', ''), # noqa '7fdfxx20': ('UN', '1', 'Left angle', ''), # noqa '7fdfxx22': ('UN', '1', 'Right angle', ''), # noqa '7fdfxx24': ('UN', '1', 'Color Map Family', ''), # noqa '7fdfxx25': ('UN', '1', 'Full Colormap.', ''), # noqa '7fdfxx26': ('UN', '1', 'Color Invert', ''), # noqa '7fdfxx27': ('UN', '1', 'Color Baseline', ''), # noqa '7fdfxx28': ('UN', '1', 'CD Color Mix Points X1', ''), # noqa '7fdfxx29': ('UN', '1', 'CD Color Mix Points Y1', ''), # noqa '7fdfxx2a': ('UN', '1', 'CD Color Mix Points X2', ''), # noqa '7fdfxx2b': ('UN', '1', 'CD Color Mix Points Y2', ''), # noqa '7fdfxx2c': ('UN', '1', 'Color Accent', ''), # noqa '7fdfxx30': ('UN', '1', 'Persistence SQ', ''), # noqa '7fdfxx31': ('UN', '1', 'Persistence Mode', ''), # noqa '7fdfxx32': ('UN', '1', 'Persistence Coefficient Mode', ''), # noqa '7fdfxx33': ('UN', '1', 'Alpha coefficient', ''), # noqa '7fdfxx34': ('UN', '1', 'Gamma coefficient', ''), # noqa '7fdfxx35': ('UN', '1', 'Persistence Time Flag', ''), # noqa '7fdfxx36': ('UN', '1', 'Persistence adaptive flag', ''), # noqa '7fdfxx37': ('UN', '1', 'Persistence Frame Rate', ''), # noqa '7fdfxx38': ('UN', '1', 'Persistence ID', ''), # noqa '7fdfxx40': ('UN', '1', 'Observation Date Time SQ', ''), # noqa '7fdfxx50': ('UN', '1', 'Capture Type Name', ''), # noqa '7fdfxx52': ('UN', '1', 'Capture Type Number', ''), # noqa '7fdfxx54': ('UN', '1', 'Number of Capture Types', ''), # noqa '7fdfxx60': ('UN', '1', 'CD Steering Angle', ''), # noqa '7fdfxx61': ('UN', '1', 'CD PRI', ''), # noqa '7fdfxx62': ('UN', '1', 'CD Dynamic Range', ''), # noqa '7fdfxx63': ('UN', '1', 'CD Velocity Scale Min', ''), # noqa '7fdfxx64': ('UN', '1', 'CD Velocity Scale Max', ''), # noqa '7fdfxx65': ('UN', '1', 'CD Color Mode', ''), # noqa '7fdfxx66': ('UN', '1', 'CD Frequency', ''), # noqa '7fdfxx67': ('UN', '1', 'CD Balance', ''), # noqa '7fdfxx68': ('UN', '1', 'CD Delta', ''), # noqa '7fdfxx69': ('UN', '1', 'CD Pan Box Min X0', ''), # noqa '7fdfxx6a': ('UN', '1', 'CD Pan Box Min Y0', ''), # noqa '7fdfxx6b': ('UN', '1', 'CD Pan Box Min X1', ''), # noqa '7fdfxx6c': ('UN', '1', 'CD Pan Box Min Y1', ''), # noqa '7fdfxx6d': ('UN', '1', 'CPS Map Type', ''), # noqa '7fdfxx6e': ('UN', '1', 'CPS Map Data', ''), # noqa '7fdfxx6f': ('UN', '1', 'CPS Balance Setting', ''), # noqa '7fdfxx70': ('UN', '1', '3DCard Step Angle', ''), # noqa '7fdfxx71': ('UN', '1', '3DCard Xdcr Angle', ''), # noqa '7fdfxx72': ('UN', '1', 'B-mode Frequency', ''), # noqa '7fdfxx73': ('UN', '1', 'B-mode Dynamic Range', ''), # noqa '7fdfxx74': ('UN', '1', 'B-mode Frame Rate', ''), # noqa '7fdfxx75': ('UN', '1', 'B-mode Space Time', ''), # noqa '7fdfxx76': ('UN', '1', 'B-mode Persistence', ''), # noqa '7fdfxx77': ('UN', '1', 'B-mode Display Depth Start', ''), # noqa '7fdfxx78': ('UN', '1', 'B-mode Display Depth End', ''), # noqa '7fdfxx79': ('UN', '1', 'B-mode Res Mode', ''), # noqa '7fdfxx7a': ('UN', '1', 'B-mode Preset Application', ''), # noqa '7fdfxx7b': ('UN', '1', 'Image Spec Name', ''), # noqa '7fdfxx7c': ('UN', '1', 'B Preset Image Look', ''), # noqa '7fdfxx7d': ('UN', '1', 'B-mode Post Processing', ''), # noqa '7fdfxx7e': ('UN', '1', 'B Edge', ''), # noqa '7fdfxx7f': ('UN', '1', 'B Delta', ''), # noqa '7fdfxx80': ('UN', '1', 'B-mode 1D Post Processing Curve', ''), # noqa '7fdfxx81': ('UN', '1', 'B-mode Delta (ECRI) Map Diagonal', ''), # noqa '7fdfxx82': ('UN', '1', 'Bytes Per Timestamp', ''), # noqa '7fdfxx83': ('UN', '1', 'Microseconds in unit timestamp', ''), # noqa '7fdfxx84': ('UN', '1', 'Start Stopwatch Timestamp', ''), # noqa '7fdfxx85': ('UN', '1', 'Acoustic Frame Timestamp', ''), # noqa '7fdfxx86': ('UN', '1', 'R-Wave Timestamp', ''), # noqa '7fdfxx87': ('UN', '1', 'Last Destruction Timestamp', ''), # noqa '7fdfxx88': ('UN', '1', 'Pixels Per Second', ''), # noqa '7fdfxx89': ('UN', '1', 'ECG Reference Timestamp', ''), # noqa '7fdfxx8a': ('UN', '1', 'ECG Sampling Interval (milliseconds)', ''), # noqa '7fdfxx8b': ('UN', '1', 'ECG Sample Count', ''), # noqa '7fdfxx8c': ('UN', '1', 'ECG Sample Size', ''), # noqa '7fdfxx8d': ('UN', '1', 'ECG Data Value', ''), # noqa '7fdfxx8e': ('UN', '1', 'Contrast/Active Image Indicator', ''), # noqa '7fdfxx8f': ('UN', '1', 'Live Dual Mode Indicator', ''), # noqa '7fdfxx90': ('UN', '1', '3DCard Clipset ID', ''), # noqa '7fdfxx91': ('UN', '1', '3DCard HRWave Min', ''), # noqa '7fdfxx92': ('UN', '1', '3DCard HRWave Max', ''), # noqa '7fdfxx93': ('UN', '1', 'Perspective Capture Type', ''), # noqa '7fdfxxf1': ('UN', '1', 'Trigger Mask.', ''), # noqa '7fdfxxf2': ('UN', '1', 'Study Directory', ''), # noqa '7fdfxxf3': ('UN', '1', 'Last Modify Date', ''), # noqa '7fdfxxf4': ('UN', '1', 'Last Modify Time', ''), # noqa '7fdfxxf5': ('UN', '1', 'Teaching Study', ''), # noqa '7fdfxxf6': ('UN', '1', 'Series Base UID', ''), # noqa }, 'ACUSON:1.2.840.113680.1.0:7ffe': { '7fdfxx00': ('UN', '1', 'Data Padding', ''), # noqa }, 'ADAC_IMG': { '0019xx02': ('IS', '1', 'Ver200 ADAC Pegasys File Size', ''), # noqa '0019xx10': ('LO', '2', 'ADAC Header Signature', ''), # noqa '0019xx11': ('US', '1', 'Number of ADAC Headers', ''), # noqa '0019xx12': ('IS', '1-n', 'ADAC Header/Image Sizes', ''), # noqa '0019xx20': ('OB', '1', 'ADAC Pegasys Headers', ''), # noqa '0019xx21': ('US', '1', 'Ver200 Number of ADAC Headers', ''), # noqa '0019xx41': ('IS', '1-n', 'Ver200 ADAC Header/Image Size', ''), # noqa '0019xx61': ('OB', '1', 'Ver200 ADAC Pegasys Headers', ''), # noqa '7043xx00': ('SH', '1', 'Cardiac Stress State', ''), # noqa '7043xx10': ('LO', '1', 'Philips NM Private Group', ''), # noqa }, 'AEGIS_DICOM_2.00': { '0003xx00': ('US', '1-n', 'Unknown', ''), # noqa '0005xx00': ('US', '1-n', 'Unknown', ''), # noqa '0009xx00': ('US', '1-n', 'Unknown', ''), # noqa '0019xx00': ('US', '1-n', 'Unknown', ''), # noqa '0029xx00': ('US', '1-n', 'Unknown', ''), # noqa '1369xx00': ('US', '1-n', 'Unknown', ''), # noqa }, 'AGFA': { '0009xx10': ('LO', '1', 'Unknown', ''), # noqa '0009xx11': ('LO', '1', 'Unknown', ''), # noqa '0009xx13': ('LO', '1', 'Unknown', ''), # noqa '0009xx14': ('LO', '1', 'Unknown', ''), # noqa '0009xx15': ('LO', '1', 'Unknown', ''), # noqa '0019xx10': ('SH', '1', 'Private Identification Code', ''), # noqa '0019xx11': ('LO', '3', 'Identification Data (Note 2)', ''), # noqa '0019xx13': ('LO', '1', 'Sensitometry Name', ''), # noqa '0019xx14': ('ST', '3', 'Window/Level List (Note 3)', ''), # noqa '0019xx15': ('LO', '1', 'Dose Monitoring List', ''), # noqa '0019xx16': ('LO', '3', 'Other Info (Note 5)', ''), # noqa '0019xx1a': ('LO', '1', 'Clipped Exposure Deviation', ''), # noqa '0019xx1b': ('LO', '1', 'Logarithmic PLT Full Scale', ''), # noqa '0019xx60': ('US', '1', 'Total number of series', ''), # noqa '0019xx61': ('SH', '1', 'Session Number', ''), # noqa '0019xx62': ('SH', '1', 'ID Station name', ''), # noqa '0019xx65': ('US', '1', 'Number of images in study to be transmitted (only sent with autoverify: on)', ''), # noqa '0019xx70': ('US', '1', 'Total number of images', ''), # noqa '0019xx80': ('ST', '1', 'Geometrical Transformations', ''), # noqa '0019xx81': ('ST', '1', 'Roam Origin', ''), # noqa '0019xx82': ('US', '1', 'Zoom factor', ''), # noqa '0019xx93': ('CS', '1', 'Status', ''), # noqa }, 'AGFA PACS Archive Mirroring 1.0': { '0031xx00': ('CS', '1', 'Unknown', ''), # noqa '0031xx01': ('UL', '1', 'Unknown', ''), # noqa }, 'AGFA-AG_HPState': { '0071xx18': ('SQ', '1', 'Unknown', ''), # noqa '0071xx19': ('SQ', '1', 'Unknown', ''), # noqa '0071xx1a': ('SQ', '1', 'Unknown', ''), # noqa '0071xx1c': ('SQ', '1', 'Unknown', ''), # noqa '0071xx1e': ('SQ', '1', 'Unknown', ''), # noqa '0071xx20': ('FL', '1-n', 'Unknown', ''), # noqa '0071xx21': ('FD', '1-n', 'Unknown', ''), # noqa '0071xx22': ('FD', '1-n', 'Unknown', ''), # noqa '0071xx23': ('FD', '1-n', 'Unknown', ''), # noqa '0071xx24': ('FD', '1', 'Unknown', ''), # noqa '0073xx23': ('SH', '1', 'Unknown', ''), # noqa '0073xx24': ('SQ', '1', 'Unknown', ''), # noqa '0073xx28': ('SQ', '1', 'Unknown', ''), # noqa '0073xx80': ('FL', '1', 'Unknown', ''), # noqa '0075xx10': ('LO', '1', 'Unknown', ''), # noqa '0087xx01': ('LO', '1', 'Unknown', ''), # noqa '0087xx02': ('LO', '1', 'Unknown', ''), # noqa }, 'AGFA_ADC_Compact': { '0019xx05': ('ST', '1', 'Data stream from cassette', ''), # noqa '0019xx10': ('LO', '1', 'Private Identification Code', ''), # noqa '0019xx30': ('ST', '1', 'Set of destination types', ''), # noqa '0019xx40': ('ST', '1', 'Set of destination Ids', ''), # noqa '0019xx50': ('ST', '1', 'Set of processing codes', ''), # noqa '0019xx60': ('US', '1', 'Number of series in study', ''), # noqa '0019xx61': ('US', '1', 'Session Number', ''), # noqa '0019xx62': ('SH', '1', 'ID station name', ''), # noqa '0019xx70': ('US', '1', 'Number of images in series', ''), # noqa '0019xx71': ('US', '1', 'Break condition', ''), # noqa '0019xx72': ('US', '1', 'Wait (or Hold) flag', ''), # noqa '0019xx73': ('US', '1', 'ScanRes flag', ''), # noqa '0019xx74': ('SH', '1', 'Operation code', ''), # noqa '0019xx95': ('CS', '1', 'Image quality', ''), # noqa }, 'ALOKA:1.2.392.200039.103.2': { '0009xx00': ('SH', '1', 'Unknown', ''), # noqa '0009xx04': ('US', '1-n', 'Unknown', ''), # noqa '0009xx06': ('US', '1-n', 'Unknown', ''), # noqa '0009xx0a': ('SH', '1', 'Unknown', ''), # noqa '0009xx20': ('CS', '1', 'Unknown', ''), # noqa '0009xx22': ('CS', '1', 'Unknown', ''), # noqa '0009xx24': ('CS', '1', 'Unknown', ''), # noqa '0009xx26': ('IS', '1', 'Unknown', ''), # noqa '0009xx28': ('IS', '1', 'Unknown', ''), # noqa '0009xx2a': ('DS', '1', 'Unknown', ''), # noqa '0009xx30': ('FD', '1', 'Unknown', ''), # noqa '0009xx32': ('DS', '1', 'Unknown', ''), # noqa '0009xx34': ('CS', '1', 'Unknown', ''), # noqa '0019xx08': ('FD', '1', 'Unknown', ''), # noqa '0019xx0c': ('CS', '1', 'Unknown', ''), # noqa '0019xx0e': ('DS', '1', 'Unknown', ''), # noqa '0019xx18': ('SL', '1', 'Unknown', ''), # noqa '0019xx1a': ('SL', '1', 'Unknown', ''), # noqa '0019xx40': ('SS', '1', 'Unknown', ''), # noqa '0019xx46': ('US', '1', 'Unknown', ''), # noqa '0019xx50': ('SL', '1', 'Unknown', ''), # noqa '0019xx52': ('DS', '1', 'Unknown', ''), # noqa '0019xx54': ('DS', '1', 'Unknown', ''), # noqa '0019xx56': ('FD', '1', 'Unknown', ''), # noqa }, 'AMI Annotations_01': { '3101xx10': ('SQ', '1', 'AMI Annotation Sequence (RET)', ''), # noqa }, 'AMI Annotations_02': { '3101xx20': ('SQ', '1', 'AMI Annotation Sequence (RET)', ''), # noqa }, 'AMI ImageContextExt_01': { '3107xxa0': ('CS', '1', 'AMI Window Function (RET)', ''), # noqa '3107xxb0': ('DS', '1', 'AMI Window Slope (RET)', ''), # noqa }, 'AMI ImageContext_01': { '3109xx10': ('CS', '1', 'AMI Window Invert (RET)', ''), # noqa '3109xx20': ('IS', '1', 'AMI Window Center (RET)', ''), # noqa '3109xx30': ('IS', '1', 'AMI Window Widith (RET)', ''), # noqa '3109xx40': ('CS', '1', 'AMI Pixel Aspect Ratio Swap (RET)', ''), # noqa '3109xx50': ('CS', '1', 'AMI Enable Averaging (RET)', ''), # noqa '3109xx60': ('CS', '1', 'AMI Quality (RET)', ''), # noqa '3109xx70': ('CS', '1', 'AMI Viewport Annotation Level (RET)', ''), # noqa '3109xx80': ('CS', '1', 'AMI Show Image Annotation (RET)', ''), # noqa '3109xx90': ('CS', '1', 'AMI Show Image Overlay (RET)', ''), # noqa }, 'AMI ImageTransform_01': { '3107xx10': ('DS', '1', 'AMI Transformation Matrix (RET)', ''), # noqa '3107xx20': ('DS', '1', 'AMI Center Offset (RET)', ''), # noqa '3107xx30': ('DS', '1', 'AMI Magnification (RET)', ''), # noqa '3107xx40': ('CS', '1', 'AMI Magnification Type (RET)', ''), # noqa '3107xx50': ('DS', '1', 'AMI Displayed Area (RET)', ''), # noqa '3107xx60': ('DS', '1', 'AMI Calibration Factor (RET)', ''), # noqa }, 'AMI Sequence AnnotElements_01': { '3105xx10': ('DS', '1', 'AMI Annotation Element Position', ''), # noqa '3105xx20': ('LT', '1', 'AMI Annotation Element Text', ''), # noqa }, 'AMI Sequence Annotations_01': { '3103xx10': ('CS', '1', 'AMI Annotation Sequence (RET)', ''), # noqa '3103xx20': ('UI', '1', 'AMI Annotation UID (RET)', ''), # noqa '3103xx30': ('US', '1', 'AMI Annotation Color (RET)', ''), # noqa '3103xx40': ('FD', '1', 'FontSize', ''), # noqa '3103xx50': ('CS', '1', 'AMI Annotation Line Style (RET)', ''), # noqa '3103xx60': ('SQ', '1', 'AMI Annotation Elements (RET)', ''), # noqa '3103xx70': ('SH', '1', 'AMI Annotation Label (RET)', ''), # noqa '3103xx80': ('PN', '1', 'AMI Annotation Creator (RET)', ''), # noqa '3103xx90': ('PN', '1', 'AMI Annotation Modifiers (RET)', ''), # noqa '3103xxa0': ('DA', '1', 'AMI Annotation Creation Date (RET)', ''), # noqa '3103xxb0': ('TM', '1', 'AMI Annotation Creation Time (RET)', ''), # noqa '3103xxc0': ('DA', '1', 'AMI Annotation Modification Dates (RET)', ''), # noqa '3103xxd0': ('TM', '1', 'AMI Annotation Modification Times (RET)', ''), # noqa '3103xxe0': ('US', '1', 'AMI Annotation Frame Number (RET)', ''), # noqa }, 'AMI Sequence Annotations_02': { '3103xx10': ('CS', '1', 'AMI Annotation Sequence (RET)', ''), # noqa '3103xx20': ('UI', '1', 'AMI Annotation UID (RET)', ''), # noqa '3103xx30': ('US', '1', 'AMI Annotation Color (RET)', ''), # noqa '3103xx50': ('CS', '1', 'AMI Annotation Line Style (RET)', ''), # noqa '3103xx60': ('SQ', '1', 'AMI Annotation Elements (RET)', ''), # noqa '3103xx70': ('SH', '1', 'AMI Annotation Label (RET)', ''), # noqa '3103xx80': ('PN', '1', 'AMI Annotation Creator (RET)', ''), # noqa '3103xx90': ('PN', '1', 'AMI Annotation Modifiers (RET)', ''), # noqa '3103xxa0': ('DA', '1', 'AMI Annotation Creation Date (RET)', ''), # noqa '3103xxb0': ('TM', '1', 'AMI Annotation Creation Time (RET)', ''), # noqa '3103xxc0': ('DA', '1', 'AMI Annotation Modification Dates (RET)', ''), # noqa '3103xxd0': ('TM', '1', 'AMI Annotation Modification Times (RET)', ''), # noqa '3103xxe0': ('US', '1', 'AMI Annotation Frame Number (RET)', ''), # noqa }, 'AMI StudyExtensions_01': { '3111xx01': ('UL', '1', 'AMI Last Released Annot Label (RET)', ''), # noqa }, 'AMICAS0': { '0023xx01': ('UI', '1', '', ''), # noqa '0023xx08': ('US', '1', '', ''), # noqa '0023xx10': ('US', '1', '', ''), # noqa '0023xx16': ('SL', '1', '', ''), # noqa }, 'APEX_PRIVATE': { '0027xx10': ('LO', '1', 'Private Creator', ''), # noqa '0027xx11': ('DS', '1', 'Bed Position', ''), # noqa }, 'ATL HDI V1.0': { '0009xx00': ('UN', '1', 'Private', ''), # noqa '0009xx10': ('UN', '1', 'Private', ''), # noqa '0009xx20': ('UN', '1', 'Private', ''), # noqa '0009xx30': ('UN', '1', 'Private', ''), # noqa '0009xx40': ('UN', '1', 'Private', ''), # noqa '0009xx50': ('UN', '1', 'Private', ''), # noqa '0009xx60': ('UN', '1', 'Private', ''), # noqa '0009xx70': ('UN', '1', 'Private', ''), # noqa '0009xx80': ('UN', '1', 'Private', ''), # noqa '0009xx90': ('UN', '1', 'Private', ''), # noqa '0009xx91': ('UN', '1', 'Private', ''), # noqa '0029xx30': ('UN', '1', 'Loop Mode', ''), # noqa '0029xx31': ('UN', '1', 'Trigger mode', ''), # noqa '0029xx32': ('UN', '1', 'Number of Loops', ''), # noqa '0029xx33': ('UN', '1', 'Loop Indexes', ''), # noqa '0029xx34': ('UN', '1', 'Loop Heart Rates', ''), # noqa '0029xx35': ('UN', '1', 'Medications', ''), # noqa }, 'ATL PRIVATE TAGS': { '0029xx30': ('UL', '1', 'Loop Mode', ''), # noqa '0029xx31': ('UL', '1', 'Trigger mode', ''), # noqa '0029xx32': ('UL', '1', 'Number of Loops', ''), # noqa '0029xx33': ('DS', '1-n', 'Loop Indexes', ''), # noqa '0029xx34': ('DS', '1-n', 'Loop Heart Rates', ''), # noqa '0029xx35': ('LO', '1', 'Medications', ''), # noqa }, 'Acuson X500': { '0009xx20': ('UN', '1', '(a)View Name', ''), # noqa '0009xx2a': ('UN', '1', 'View List', ''), # noqa '0011xx10': ('UN', '1', 'Siemens Medical', ''), # noqa '0011xx11': ('UN', '1', 'DIMAQ Software', ''), # noqa '0011xx20': ('UN', '1', 'Private Data', ''), # noqa '0011xx21': ('UN', '1', 'Private Data', ''), # noqa '0013xx10': ('UN', '1', 'Siemens Medical', ''), # noqa '0013xx11': ('UN', '1', 'DIMAQ Software', ''), # noqa '0013xx20': ('UN', '1', 'Private Data', ''), # noqa '0015xx10': ('UN', '1', 'Siemens Medical', ''), # noqa '0015xx11': ('UN', '1', 'DIMAQ Software', ''), # noqa '0015xx20': ('UN', '1', 'Private Data', ''), # noqa '0017xx10': ('UN', '1', 'Siemens Medical', ''), # noqa '0017xx11': ('UN', '1', 'DIMAQ Software', ''), # noqa '0017xx20': ('UN', '1', 'Private Data', ''), # noqa '0019xx20': ('UN', '1', 'Import Structured', ''), # noqa }, 'Agfa ADC NX': { '0019xx09': ('SQ', '1', 'Unknown', ''), # noqa '0019xxf5': ('CS', '1', 'Cassette Orientation', ''), # noqa '0019xxf6': ('DS', '1', 'Plate Sensitivity', ''), # noqa '0019xxf7': ('DS', '1', 'Plate Erasability', ''), # noqa '0019xxf8': ('IS', '1', 'Unknown', ''), # noqa '0019xxfe': ('CS', '1', 'Unknown', ''), # noqa }, 'AgilityRuntime': { '0029xx11': ('CS', '1', 'Unknown', ''), # noqa '0029xx12': ('US', '1', 'Unknown', ''), # noqa '0029xx13': ('US', '1', 'Unknown', ''), # noqa '0029xx14': ('US', '1', 'Unknown', ''), # noqa '0029xx1f': ('US', '1', 'Unknown', ''), # noqa }, 'Applicare/Centricity Radiology Web/Version 1.0': { '4109xx01': ('SH', '1', 'Mammography Laterality', ''), # noqa '4109xx02': ('SH', '1', 'Mammography View Name', ''), # noqa '4109xx03': ('SH', '1', 'Mammography View Modifier', ''), # noqa }, 'Applicare/Centricity Radiology Web/Version 2.0': { '4111xx01': ('CS', '1', 'Secondary Spine Label', ''), # noqa '4111xx02': ('IS', '1', 'Additional tags for Presentation State', ''), # noqa }, '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 = 'Given character is out of {}'.format(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), 'Given character is out of {}'.format(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), 'Given character is out of {}'.format(character_set)) encoded += b return encoded def _get_escape_sequence_for_encoding( encoding: str, encoded: Optional[bytes] = 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`. .. versionadded:: 1.2 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 warnings.warn( 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 warnings.warn( "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 warnings.warn( "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) warnings.warn(msg + f" - 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`. .. versionadded:: 1.2 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]) warnings.warn("Failed to encode value with encodings: {} - using " "replacement characters in encoded string" .format(', '.join(encodings))) 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: Union[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: Optional[str] = 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}'" ) warnings.warn(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: warnings.warn( ( 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: warnings.warn( ( 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: Optional[Union[str, List[str]]] ) -> 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: Union[PersonName, bytes] elem.value = cast(PersonName, elem.value).decode(encodings) else: # elem.value: Iterable[Union[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-2.4.3/pydicom/cli/000077500000000000000000000000001446675437500154245ustar00rootroot00000000000000pydicom-2.4.3/pydicom/cli/__init__.py000066400000000000000000000000001446675437500175230ustar00rootroot00000000000000pydicom-2.4.3/pydicom/cli/codify.py000066400000000000000000000017511446675437500172570ustar00rootroot00000000000000# 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-2.4.3/pydicom/cli/main.py000066400000000000000000000170311446675437500167240ustar00rootroot00000000000000# 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 import pkg_resources import re import sys from typing import Tuple, cast, List, Any, Dict, Optional, Callable from pydicom import dcmread from pydicom.data.data_manager import get_charset_files, get_testdata_file from pydicom.dataset import Dataset subparsers: Optional[argparse._SubParsersAction] = 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: {str(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` libary'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 NotImplementedError: # 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}': {str(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 pkg_resources.iter_entry_points("pydicom_subcommands"): subcommands[entry_point.name] = entry_point.load() return subcommands def main(args: Optional[List[str]] = 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-2.4.3/pydicom/cli/show.py000066400000000000000000000123131446675437500167560ustar00rootroot00000000000000# Copyright 2019 pydicom authors. See LICENSE file for details. """Pydicom command line interface program for `pydicom show`""" import argparse from typing import Optional, List, Union, 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) -> Optional[str]: class_uid = ds.get("SOPClassUID") if class_uid is None: return None return f"SOPClassUID: {class_uid.name}" def quiet_rtplan(ds: Dataset) -> Optional[str]: 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}, " f"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," f" {blocks} blocks)" ) lines.append(line) return "\n".join(lines) def quiet_image(ds: Dataset) -> Optional[str]: 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[Union[Callable[[Dataset], Optional[str]], 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-2.4.3/pydicom/compat.py000066400000000000000000000011371446675437500165140ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. """Compatibility functions for previous Python 2 support""" # Python 2 only - warn and mark this as deprecated. import warnings from pydicom import config if config._use_future: raise ImportError( "Pydicom Future Error: compat module will be removed in pydicom 3.0" ) warnings.warn( "Starting in pydicom 3.0, the compat module (used for Python 2)" " will be removed", DeprecationWarning ) # Text types text_type = str string_types = (str, ) char_types = (str, bytes) number_types = (int, ) int_type = int pydicom-2.4.3/pydicom/config.py000066400000000000000000000444621446675437500165060ustar00rootroot00000000000000# Copyright 2008-2018 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, Dict, Any, TYPE_CHECKING, Generator have_numpy = True try: import numpy 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") # 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``. """ data_element_callback_kwargs: Dict[str, Any] = {} """Set the keyword arguments passed to :func:`data_element_callback`. Default ``{}``. """ def reset_data_element_callback() -> None: """Reset the :func:`data_element_callback` function to the default.""" 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: Optional[int] = None # in future version, writing invalid values will raise by default, # currently the default value depends on enforce_valid_values self._writing_validation_mode: Optional[int] = ( RAISE if _use_future else None ) self._infer_sq_for_un_vr: bool = True @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. The default (:attr:`WARN`) is to issue a warning in the case of an invalid value, :attr:`RAISE` will raise an error in this case, and :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. .. versionadded:: 1.4 """ 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 """ # Logging system and debug function to change logging level logger = logging.getLogger("pydicom") logger.addHandler(logging.NullHandler()) import pydicom.overlays.numpy_handler as overlay_np # noqa overlay_data_handlers = [overlay_np] """Handlers for converting (60xx,3000) *Overlay Data* .. versionadded:: 1.4 .. deprecated:: 2.1 .. currentmodule:: pydicom.dataset This is an ordered list of *Overlay Data* handlers that the :meth:`~Dataset.overlay_array` method will use to try to extract a correctly sized numpy array from an *Overlay Data* element. Handlers have two required methods: def is_available(): Return ``True`` if the handler's dependencies are installed, ``False`` otherwise. def get_overlay_array(ds, group): Return a correctly shaped :class:`numpy.ndarray` derived from the *Overlay Data* with element tag `group`, in :class:`Dataset` `ds` or raise an exception. And two required attributes: DEPENDENCIES : dict A dict containing the dependencies of the handler as {'package_import_name': ('http://package.com/url', 'Package Name')} HANDLER_NAME : str The name of the handler, e.g. 'Numpy Overlay' The first handler that both announces that it supports the transfer syntax and does not raise an exception is the handler that will provide the data. If all handlers fail to convert the data only the last exception is raised. """ 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*. .. versionadded:: 1.2 .. 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 """ 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. .. versionchanged:1.4 Added `default_handler` keyword parameter. 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) 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-2.4.3/pydicom/data/000077500000000000000000000000001446675437500155665ustar00rootroot00000000000000pydicom-2.4.3/pydicom/data/__init__.py000066400000000000000000000006231446675437500177000ustar00rootroot00000000000000# 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-2.4.3/pydicom/data/charset_files/000077500000000000000000000000001446675437500204015ustar00rootroot00000000000000pydicom-2.4.3/pydicom/data/charset_files/FileInfo.txt000066400000000000000000000035501446675437500226400ustar00rootroot00000000000000Filename 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-2.4.3/pydicom/data/charset_files/chrArab.dcm000066400000000000000000000035441446675437500224360ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/charset_files/chrFren.dcm000066400000000000000000000035421446675437500224610ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/charset_files/chrFrenMulti.dcm000066400000000000000000000036221446675437500234730ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/charset_files/chrGerm.dcm000066400000000000000000000035461446675437500224650ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/charset_files/chrGreek.dcm000066400000000000000000000035421446675437500226240ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/charset_files/chrH31.dcm000066400000000000000000000036361446675437500221260ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/charset_files/chrH32.dcm000066400000000000000000000036501446675437500221230ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/charset_files/chrHbrw.dcm000066400000000000000000000035421446675437500224710ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/charset_files/chrI2.dcm000066400000000000000000000036161446675437500220430ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/charset_files/chrJapMulti.dcm000066400000000000000000000035761446675437500233230ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/charset_files/chrJapMultiExplicitIR6.dcm000066400000000000000000000036241446675437500253400ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/charset_files/chrKoreanMulti.dcm000066400000000000000000000035521446675437500240220ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/charset_files/chrRuss.dcm000066400000000000000000000035421446675437500225230ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/charset_files/chrSQEncoding.dcm000066400000000000000000000010101446675437500235450ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/charset_files/chrSQEncoding1.dcm000066400000000000000000000010101446675437500236260ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/charset_files/chrX1.dcm000066400000000000000000000035661446675437500220650ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/charset_files/chrX2.dcm000066400000000000000000000035601446675437500220600ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/data_manager.py000066400000000000000000000271671446675437500205600ustar00rootroot00000000000000# 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 Dict, List, Union, Optional, TYPE_CHECKING import warnings from pydicom.data.download import ( data_path_with_download, calculate_file_hash, get_cached_filehash, get_url_map, get_data_dir ) 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 pkg_resources import iter_entry_points # Prefer pydicom-data as the source entry_point = "pydicom.data.external_sources" sources = {vv.name: vv.load()() for vv in iter_entry_points(entry_point)} out = {} if "pydicom-data" in sources: out["pydicom-data"] = sources["pydicom-data"] out.update(sources) return out _EXTERNAL_DATA_SOURCES: Optional[Dict] = 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( "An error occurred downloading the following files: " f"{', '.join(error)}" ) def get_files( base: Union[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 http://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: warnings.warn( "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`. .. versionadded:: 1.4 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, ) -> Union[str, "Dataset", None]: """Return an absolute path to the first matching dataset with filename `name`. .. versionadded:: 1.4 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. """ 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) -> Optional[str]: # 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: Optional[str] 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: warnings.warn( 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. """ 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-2.4.3/pydicom/data/download.py000066400000000000000000000200151446675437500177450ustar00rootroot00000000000000# 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 Dict, Optional, cast import urllib.request import urllib.error import warnings 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: Optional[int] = 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 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", "r") 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: Optional[str] = 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", "r") 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: warnings.warn("Hash not found in hashes.json. File will be updated.") with open(HERE / "hashes.json", "r") 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-2.4.3/pydicom/data/hashes.json000066400000000000000000000142311446675437500177350ustar00rootroot00000000000000{ "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" } pydicom-2.4.3/pydicom/data/palettes/000077500000000000000000000000001446675437500174075ustar00rootroot00000000000000pydicom-2.4.3/pydicom/data/palettes/README.md000066400000000000000000000032751446675437500206750ustar00rootroot00000000000000DICOM 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-2.4.3/pydicom/data/palettes/fall.dcm000066400000000000000000000077561446675437500210310ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/palettes/hotiron.dcm000066400000000000000000000112221446675437500215540ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/palettes/hotmetalblue.dcm000066400000000000000000000112501446675437500225600ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/palettes/pet.dcm000066400000000000000000000111741446675437500206700ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/palettes/pet20step.dcm000066400000000000000000000112661446675437500217300ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/palettes/spring.dcm000066400000000000000000000100101446675437500213660ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/palettes/summer.dcm000066400000000000000000000100041446675437500213770ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/palettes/winter.dcm000066400000000000000000000100201446675437500213750ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/retry.py000066400000000000000000000040111446675437500173010ustar00rootroot00000000000000from functools import wraps import logging import time from typing import Union, Tuple, Optional, Callable, Any, Type def retry( exc: Union[Type[Exception], Tuple[Type[Exception], ...]], exc_msg: Optional[str] = None, tries: int = 4, delay: int = 3, backoff: int = 2, logger: Optional[logging.Logger] = None ) -> Callable[[Callable], Any]: """Retry calling the decorated function using an exponential backoff. http://www.saltycrane.com/blog/2009/11/trying-out-retry-decorator-python/ original from: http://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"{str(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-2.4.3/pydicom/data/test_files/000077500000000000000000000000001446675437500177275ustar00rootroot00000000000000pydicom-2.4.3/pydicom/data/test_files/693_J2KI.dcm000066400000000000000000000070061446675437500215170ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/CT_small.dcm000066400000000000000000001144461446675437500221240ustar00rootroot00000000000000II*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-2.4.3/pydicom/data/test_files/ExplVR_BigEnd.dcm000066400000000000000000000360641446675437500230150ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/ExplVR_BigEndNoMeta.dcm000066400000000000000000000006621446675437500241140ustar00rootroot00000000000000CS 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-2.4.3/pydicom/data/test_files/ExplVR_LitEndNoMeta.dcm000066400000000000000000000006621446675437500241430ustar00rootroot00000000000000CS 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-2.4.3/pydicom/data/test_files/GDCMJ2K_TextGBR.dcm000066400000000000000000000737621446675437500230130ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/J2K_pixelrep_mismatch.dcm000066400000000000000000004164261446675437500246140ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/JPEG-lossy.dcm000066400000000000000000000231641446675437500223160ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/JPEG2000-embedded-sequence-delimiter.dcm000066400000000000000000000063541446675437500267640ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/JPEG2000.dcm000066400000000000000000000063541446675437500214530ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/JPGExtended.dcm000066400000000000000000000231641446675437500225230ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/MR_small.dcm000066400000000000000000000231461446675437500221300ustar00rootroot00000000000000II*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-2.4.3/pydicom/data/test_files/MR_small_RLE.dcm000066400000000000000000000171561446675437500226360ustar00rootroot00000000000000II*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-2.4.3/pydicom/data/test_files/MR_small_bigendian.dcm000066400000000000000000000227541446675437500241340ustar00rootroot00000000000000II*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-2.4.3/pydicom/data/test_files/MR_small_expb.dcm000066400000000000000000000231661446675437500231500ustar00rootroot00000000000000II*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-2.4.3/pydicom/data/test_files/MR_small_implicit.dcm000066400000000000000000000227461446675437500240270ustar00rootroot00000000000000II*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-2.4.3/pydicom/data/test_files/MR_small_jp2klossless.dcm000066400000000000000000000135701446675437500246460ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/MR_small_jpeg_ls_lossless.dcm000066400000000000000000000137541446675437500255660ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/MR_small_padded.dcm000066400000000000000000000233461446675437500234330ustar00rootroot00000000000000II*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-2.4.3/pydicom/data/test_files/MR_truncated.dcm000066400000000000000000000226361446675437500230140ustar00rootroot00000000000000II*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-2.4.3/pydicom/data/test_files/README.txt000066400000000000000000000361171446675437500214350ustar00rootroot00000000000000Test 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 * PhotometricIntepretation 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 * PhotometricIntepretation 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 == DICOMDIR tests == dicomdirtests files were from http://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 == 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-2.4.3/pydicom/data/test_files/SC_jpeg_no_color_transform.dcm000066400000000000000000000103341446675437500257140ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/SC_jpeg_no_color_transform_2.dcm000066400000000000000000000103261446675437500261360ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/SC_rgb_dcmtk_+eb+cy+n2.dcm000066400000000000000000000060221446675437500244000ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/SC_rgb_dcmtk_+eb+cy+np.dcm000066400000000000000000000061041446675437500244770ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/SC_rgb_dcmtk_+eb+cy+s2.dcm000066400000000000000000000060261446675437500244110ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/SC_rgb_dcmtk_+eb+cy+s4.dcm000066400000000000000000000065341446675437500244170ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/SC_rgb_gdcm_KY.dcm000066400000000000000000000056661446675437500231650ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/SC_rgb_jpeg.dcm000066400000000000000000000105601446675437500225620ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/SC_rgb_jpeg_app14_dcmd.dcm000066400000000000000000000103261446675437500245560ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/SC_rgb_jpeg_gdcm.dcm000066400000000000000000000121241446675437500235520ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/SC_rgb_jpeg_lossy_gdcm.dcm000066400000000000000000000116621446675437500250110ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.2.1143.6844246171068686447348170864099716226UI1.2.840.10008.1.2.4.50UI01.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.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@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(!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-2.4.3/pydicom/data/test_files/SC_rgb_rle.dcm000066400000000000000000000037261446675437500224250ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/SC_rgb_rle_16bit.dcm000066400000000000000000000050561446675437500234300ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/SC_rgb_rle_16bit_2frame.dcm000066400000000000000000000074701446675437500246660ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/SC_rgb_rle_2frame.dcm000066400000000000000000000052101446675437500236470ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/SC_rgb_rle_32bit.dcm000066400000000000000000000072601446675437500234250ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/SC_rgb_rle_32bit_2frame.dcm000066400000000000000000000141461446675437500246620ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/SC_rgb_small_odd.dcm000066400000000000000000000026441446675437500235770ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/SC_rgb_small_odd_big_endian.dcm000066400000000000000000000026441446675437500257360ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/SC_rgb_small_odd_jpeg.dcm000066400000000000000000000037741446675437500246110ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/SC_ybr_full_422_uncompressed.dcm000066400000000000000000000522661446675437500260100ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/UN_sequence.dcm000066400000000000000000000012421446675437500226250ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/badVR.dcm000066400000000000000000000167021446675437500214200ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/000077500000000000000000000000001446675437500226045ustar00rootroot00000000000000pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/77654033/000077500000000000000000000000001446675437500235265ustar00rootroot00000000000000pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/77654033/CR1/000077500000000000000000000000001446675437500241135ustar00rootroot00000000000000pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/77654033/CR1/6154000066400000000000000000000043741446675437500244450ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/77654033/CR2/000077500000000000000000000000001446675437500241145ustar00rootroot00000000000000pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/77654033/CR2/6247000066400000000000000000000043721446675437500244470ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/77654033/CR3/000077500000000000000000000000001446675437500241155ustar00rootroot00000000000000pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/77654033/CR3/6278000066400000000000000000000043721446675437500244540ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/77654033/CT2/000077500000000000000000000000001446675437500241165ustar00rootroot00000000000000pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/77654033/CT2/17106000066400000000000000000000073421446675437500245250ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/77654033/CT2/17136000066400000000000000000000073441446675437500245320ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/77654033/CT2/17166000066400000000000000000000073441446675437500245350ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/77654033/CT2/17196000066400000000000000000000073441446675437500245400ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892001/000077500000000000000000000000001446675437500235305ustar00rootroot00000000000000pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/98892001/CT2N/000077500000000000000000000000001446675437500242365ustar00rootroot00000000000000pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/98892001/CT2N/6293000066400000000000000000000075201446675437500245700ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892001/CT2N/6924000066400000000000000000000075041446675437500245730ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892001/CT5N/000077500000000000000000000000001446675437500242415ustar00rootroot00000000000000pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/98892001/CT5N/2062000066400000000000000000000075401446675437500245630ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892001/CT5N/2392000066400000000000000000000075401446675437500245710ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892001/CT5N/2693000066400000000000000000000075401446675437500245750ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892001/CT5N/3023000066400000000000000000000075401446675437500245610ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892001/CT5N/3353000066400000000000000000000075421446675437500245710ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892003/000077500000000000000000000000001446675437500235325ustar00rootroot00000000000000pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/98892003/MR1/000077500000000000000000000000001446675437500241315ustar00rootroot00000000000000pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/98892003/MR1/15820000066400000000000000000000044401446675437500245350ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892003/MR1/4919000066400000000000000000000044401446675437500244640ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892003/MR1/5641000066400000000000000000000044321446675437500244560ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892003/MR2/000077500000000000000000000000001446675437500241325ustar00rootroot00000000000000pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/98892003/MR2/15970000066400000000000000000000044401446675437500245440ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892003/MR2/4950000066400000000000000000000044641446675437500244660ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892003/MR2/4981000066400000000000000000000044621446675437500244700ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892003/MR2/5011000066400000000000000000000044621446675437500244510ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892003/MR2/6273000066400000000000000000000044541446675437500244650ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892003/MR2/6605000066400000000000000000000044541446675437500244640ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892003/MR2/6935000066400000000000000000000044561446675437500244740ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892003/MR700/000077500000000000000000000000001446675437500242775ustar00rootroot00000000000000pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/98892003/MR700/4467000066400000000000000000000044561446675437500246370ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892003/MR700/4528000066400000000000000000000044541446675437500246330ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892003/MR700/4558000066400000000000000000000044541446675437500246360ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892003/MR700/4588000066400000000000000000000044561446675437500246430ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892003/MR700/4618000066400000000000000000000044561446675437500246350ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892003/MR700/4648000066400000000000000000000044561446675437500246400ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/98892003/MR700/4678000066400000000000000000000044561446675437500246430ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/DICOMDIR000066400000000000000000000255541446675437500237340ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/DICOMDIR-bigEnd000066400000000000000000000255541446675437500251220ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/DICOMDIR-empty.dcm000066400000000000000000000006141446675437500256200ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/DICOMDIR-implicit000066400000000000000000000255461446675437500255450ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/DICOMDIR-nooffset000066400000000000000000000255241446675437500255520ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/DICOMDIR-nopatient000066400000000000000000000255541446675437500257330ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/DICOMDIR-reordered000066400000000000000000000255541446675437500257050ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/README.txt000066400000000000000000000013171446675437500243040ustar00rootroot00000000000000In 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-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/000077500000000000000000000000001446675437500242745ustar00rootroot00000000000000pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/DICOMDIR000066400000000000000000000314121446675437500254120ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/000077500000000000000000000000001446675437500252575ustar00rootroot00000000000000pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/000077500000000000000000000000001446675437500262455ustar00rootroot00000000000000pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/000077500000000000000000000000001446675437500272145ustar00rootroot00000000000000pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM000000000066400000000000000000000013441446675437500301060ustar00rootroot00000000000000DICMULOBUI1.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 pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM000001000066400000000000000000000013441446675437500301070ustar00rootroot00000000000000DICMULOBUI1.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 pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM000002000066400000000000000000000013441446675437500301100ustar00rootroot00000000000000DICMULOBUI1.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 pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM000003000066400000000000000000000013441446675437500301110ustar00rootroot00000000000000DICMULOBUI1.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 pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM000004000066400000000000000000000013441446675437500301120ustar00rootroot00000000000000DICMULOBUI1.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 pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM000005000066400000000000000000000013441446675437500301130ustar00rootroot00000000000000DICMULOBUI1.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 pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM000006000066400000000000000000000013441446675437500301140ustar00rootroot00000000000000DICMULOBUI1.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 pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM000007000066400000000000000000000013441446675437500301150ustar00rootroot00000000000000DICMULOBUI1.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 pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM000008000066400000000000000000000013441446675437500301160ustar00rootroot00000000000000DICMULOBUI1.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 pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM000009000066400000000000000000000013441446675437500301170ustar00rootroot00000000000000DICMULOBUI1.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 pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000A000066400000000000000000000013441446675437500301270ustar00rootroot00000000000000DICMULOBUI1.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 IS10pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000B000066400000000000000000000013441446675437500301300ustar00rootroot00000000000000DICMULOBUI1.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 IS11pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000C000066400000000000000000000013441446675437500301310ustar00rootroot00000000000000DICMULOBUI1.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 IS12pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000D000066400000000000000000000013441446675437500301320ustar00rootroot00000000000000DICMULOBUI1.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 IS13pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000E000066400000000000000000000013441446675437500301330ustar00rootroot00000000000000DICMULOBUI1.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 IS14pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000F000066400000000000000000000013441446675437500301340ustar00rootroot00000000000000DICMULOBUI1.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 IS15pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000G000066400000000000000000000013441446675437500301350ustar00rootroot00000000000000DICMULOBUI1.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 IS16pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000H000066400000000000000000000013441446675437500301360ustar00rootroot00000000000000DICMULOBUI1.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 IS17pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000I000066400000000000000000000013441446675437500301370ustar00rootroot00000000000000DICMULOBUI1.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 IS18pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000J000066400000000000000000000013441446675437500301400ustar00rootroot00000000000000DICMULOBUI1.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 IS19pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000K000066400000000000000000000013441446675437500301410ustar00rootroot00000000000000DICMULOBUI1.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 IS20pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000L000066400000000000000000000013441446675437500301420ustar00rootroot00000000000000DICMULOBUI1.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 IS21pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000M000066400000000000000000000013441446675437500301430ustar00rootroot00000000000000DICMULOBUI1.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 IS22pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000N000066400000000000000000000013441446675437500301440ustar00rootroot00000000000000DICMULOBUI1.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 IS23pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000O000066400000000000000000000013441446675437500301450ustar00rootroot00000000000000DICMULOBUI1.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 IS24pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000P000066400000000000000000000013441446675437500301460ustar00rootroot00000000000000DICMULOBUI1.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 IS25pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000Q000066400000000000000000000013441446675437500301470ustar00rootroot00000000000000DICMULOBUI1.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 IS26pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000R000066400000000000000000000013441446675437500301500ustar00rootroot00000000000000DICMULOBUI1.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 IS27pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000S000066400000000000000000000013441446675437500301510ustar00rootroot00000000000000DICMULOBUI1.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 IS28pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000T000066400000000000000000000013441446675437500301520ustar00rootroot00000000000000DICMULOBUI1.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 IS29pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000U000066400000000000000000000013441446675437500301530ustar00rootroot00000000000000DICMULOBUI1.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 IS30pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000V000066400000000000000000000013441446675437500301540ustar00rootroot00000000000000DICMULOBUI1.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 IS31pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000W000066400000000000000000000013441446675437500301550ustar00rootroot00000000000000DICMULOBUI1.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 IS32pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000X000066400000000000000000000013441446675437500301560ustar00rootroot00000000000000DICMULOBUI1.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 IS33pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000Y000066400000000000000000000013441446675437500301570ustar00rootroot00000000000000DICMULOBUI1.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 IS34pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00000Z000066400000000000000000000013441446675437500301600ustar00rootroot00000000000000DICMULOBUI1.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 IS35pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM000010000066400000000000000000000013441446675437500301070ustar00rootroot00000000000000DICMULOBUI1.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 IS36pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM000011000066400000000000000000000013441446675437500301100ustar00rootroot00000000000000DICMULOBUI1.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 IS37pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM000012000066400000000000000000000013441446675437500301110ustar00rootroot00000000000000DICMULOBUI1.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 IS38pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM000013000066400000000000000000000013441446675437500301120ustar00rootroot00000000000000DICMULOBUI1.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 IS39pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM000014000066400000000000000000000013441446675437500301130ustar00rootroot00000000000000DICMULOBUI1.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 IS40pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM000015000066400000000000000000000013441446675437500301140ustar00rootroot00000000000000DICMULOBUI1.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 IS41pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM000016000066400000000000000000000013441446675437500301150ustar00rootroot00000000000000DICMULOBUI1.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 IS42pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM000017000066400000000000000000000013441446675437500301160ustar00rootroot00000000000000DICMULOBUI1.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 IS43pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM000018000066400000000000000000000013441446675437500301170ustar00rootroot00000000000000DICMULOBUI1.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 IS44pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM000019000066400000000000000000000013441446675437500301200ustar00rootroot00000000000000DICMULOBUI1.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 IS45pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00001A000066400000000000000000000013441446675437500301300ustar00rootroot00000000000000DICMULOBUI1.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 IS46pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00001B000066400000000000000000000013441446675437500301310ustar00rootroot00000000000000DICMULOBUI1.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 IS47pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00001C000066400000000000000000000013441446675437500301320ustar00rootroot00000000000000DICMULOBUI1.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 IS48pydicom-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000/IM00001D000066400000000000000000000013441446675437500301330ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/README000066400000000000000000000022661446675437500251620ustar00rootroot00000000000000"""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-2.4.3/pydicom/data/test_files/empty_charset_LEI.dcm000066400000000000000000000004241446675437500237540ustar00rootroot00000000000000DICMULVOBUI1.2.840.10008.1.2UI1.2.3.18.133392880203SHAEORIGINAL\PRIMARY\SINGLE PLANE pydicom-2.4.3/pydicom/data/test_files/image_dfl.dcm000066400000000000000000000110351446675437500223230ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/liver_1frame.dcm000066400000000000000000001103341446675437500227720ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/liver_expb_1frame.dcm000066400000000000000000001072641446675437500240200ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/meta_missing_tsyntax.dcm000066400000000000000000000004751446675437500246730ustar00rootroot00000000000000DICMUL:OBUIUIUI1234567890.1998.310Double Nested SQ  Nested SQ pydicom-2.4.3/pydicom/data/test_files/nested_priv_SQ.dcm000066400000000000000000000005271446675437500233450ustar00rootroot00000000000000DICMULTOBUIUIUI1.2.840.10008.1.2UI1234567890.1998.310Double Nested SQ  Nested SQ pydicom-2.4.3/pydicom/data/test_files/no_meta.dcm000066400000000000000000001137271446675437500220510ustar00rootroot00000000000000 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-2.4.3/pydicom/data/test_files/no_meta_group_length.dcm000066400000000000000000000006301446675437500246120ustar00rootroot00000000000000DICMOBUI1.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-2.4.3/pydicom/data/test_files/priv_SQ.dcm000066400000000000000000000010421446675437500217740ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/reportsi.dcm000066400000000000000000000056301446675437500222670ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/reportsi_with_empty_number_tags.dcm000066400000000000000000000052141446675437500271240ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/rtdose.dcm000066400000000000000000000166201446675437500217210ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/rtdose_1frame.dcm000077500000000000000000000036461446675437500231630ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/rtdose_expb.dcm000066400000000000000000000167021446675437500227400ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/rtdose_expb_1frame.dcm000066400000000000000000000037301446675437500241700ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/rtdose_rle.dcm000066400000000000000000000152401446675437500225600ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/rtdose_rle_1frame.dcm000066400000000000000000000041121446675437500240070ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/rtplan.dcm000066400000000000000000000051601446675437500217160ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/rtplan.dump000066400000000000000000000342121446675437500221200ustar00rootroot000000000000000000 : 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-2.4.3/pydicom/data/test_files/rtplan_truncated.dcm000066400000000000000000000041211446675437500237630ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/rtstruct.dcm000066400000000000000000000047461446675437500223210ustar00rootroot00000000000000 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-2.4.3/pydicom/data/test_files/rtstruct.dump000066400000000000000000000173771446675437500225270ustar00rootroot00000000000000(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-2.4.3/pydicom/data/test_files/test-SR.dcm000066400000000000000000000152141446675437500217200ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/test1.json000066400000000000000000000507451446675437500216750ustar00rootroot00000000000000{ "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-2.4.3/pydicom/data/test_files/test_PN.json000066400000000000000000000034611446675437500222020ustar00rootroot00000000000000{ "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-2.4.3/pydicom/data/test_files/waveform_ecg.dcm000077500000000000000000010704201446675437500230670ustar00rootroot00000000000000DICMULOBUI1.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-2.4.3/pydicom/data/test_files/zipMR.gz000066400000000000000000000154561446675437500213450ustar00rootroot00000000000000aOzipMR.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} Optional[str]: """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. .. versionadded:: 1.3 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. .. versionadded:: 1.3 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_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) -> Optional[int]: """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") warnings.warn(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-2.4.3/pydicom/dataelem.py000066400000000000000000000745721446675437500170220ustar00rootroot00000000000000# Copyright 2008-2021 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 import json from typing import ( Optional, Any, Tuple, Callable, Union, TYPE_CHECKING, Dict, Type, List, NamedTuple, MutableSequence ) import warnings 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, private_dictionary_VR) from pydicom.errors import BytesLengthException from pydicom.jsonrep import JsonDataElementConverter, BulkDataType from pydicom.multival import MultiValue from pydicom.tag import Tag, BaseTag from pydicom.uid import UID from pydicom import jsonrep import pydicom.valuerep # don't import DS directly as can be changed by config from pydicom.valuerep import ( 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: Optional[str], raw: bool = False ) -> Union[bytes, List[str], str, None, PersonName]: """Return the value for an empty element for `VR`. .. versionadded:: 1.4 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. VR : str The element's Value Representation. """ descripWidth = 35 maxBytesToDisplay = 16 showVR = True is_raw = False def __init__( self, tag: Union[int, str, Tuple[int, int]], VR: str, value: Any, file_value_tell: Optional[int] = None, is_undefined_length: bool = False, already_converted: bool = False, validation_mode: int = None ) -> None: """Create a new :class:`DataElement`. Parameters ---------- tag : int or str or 2-tuple of 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 The value of the data element. One of the following: * a single string value * a number * a :class:`list` or :class:`tuple` with all strings or all numbers * a multi-value string with backslash separator file_value_tell : int, optional The byte offset to the start of the encoded element value. is_undefined_length : bool Used internally to store whether the length field for this element was ``0xFFFFFFFF``, i.e. 'undefined length'. Default is ``False``. already_converted : bool Used to determine whether or not the element's value requires conversion to a value with VM > 1. Default is ``False``. validation_mode : int 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 = is_undefined_length self.private_creator: Optional[str] = None self.parent: Optional["Dataset"] = 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: Optional[str], bulk_data_uri_handler: Optional[ Union[ Callable[[str, str, str], BulkDataType], Callable[[str], BulkDataType] ] ] = None ) -> "DataElement": """Return a :class:`DataElement` from a DICOM JSON Model attribute object. .. versionadded:: 1.3 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[Union[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() 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: " f"{elem_value}" ) from exc def to_json_dict( self, bulk_data_element_handler: Optional[Callable[["DataElement"], str]], 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`. .. versionadded:: 1.4 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 encoded_value = base64.b64encode(binary_value).decode('utf-8') if ( bulk_data_element_handler is not None and len(encoded_value) > bulk_data_threshold ): json_element['BulkDataURI'] = ( bulk_data_element_handler(self) ) else: 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: Optional[ Callable[["DataElement"], str] ] = None, dump_handler: Optional[ Callable[[Dict[str, Any]], str] ] = None ) -> str: """Return a JSON representation of the :class:`DataElement`. .. versionadded:: 1.3 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: """Return the element's value.""" return self._value @value.setter def value(self, val: Any) -> None: """Convert (if necessary) and set the value of the element.""" # 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`.""" if self.value is None: return 0 if isinstance(self.value, (str, bytes, PersonName)): return 1 if self.value else 0 try: iter(self.value) except TypeError: return 1 return len(self.value) @property def is_empty(self) -> bool: """Return ``True`` if the element has no value. .. versionadded:: 1.4 """ return self.VM == 0 @property def empty_value(self) -> Union[bytes, List[str], None, str, PersonName]: """Return the value for an empty element. .. versionadded:: 1.4 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. .. versionadded:: 1.4 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.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 try: val.append except AttributeError: # not a list return self._convert(val) if len(val) == 1: return self._convert(val[0]) return MultiValue(self._convert, val, validation_mode=self.validation_mode) 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 __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) ) return self.value == other.value 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 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 "" def description(self) -> str: """Return the DICOM dictionary name for the element as :class:`str`. .. deprecated:: 2.3 ``DataElement.description()`` will be removed in v3.0, use :attr:`~pydicom.dataelem.DataElement.name` instead """ warnings.warn( "'DataElement.description()' is deprecated and will be removed " "in v3.0, use 'DataElement.name' instead", DeprecationWarning, ) return self.name @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 repr(self.value) if self.VR == VR_.SQ else str(self) class RawDataElement(NamedTuple): """Container for the data from a raw (mostly) undecoded element.""" tag: BaseTag VR: Optional[str] length: int value: Optional[bytes] value_tell: int is_implicit_VR: bool is_little_endian: bool is_raw: bool = True # 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) def _private_vr_for_tag(ds: Optional["Dataset"], 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 DataElement_from_raw( raw_data_element: RawDataElement, encoding: Optional[Union[str, MutableSequence[str]]] = None, dataset: Optional["Dataset"] = None ) -> DataElement: """Return a :class:`DataElement` created from `raw_data_element`. Parameters ---------- raw_data_element : RawDataElement The raw data to convert to a :class:`DataElement`. encoding : str or list of str, optional The character encoding of the raw data. dataset : Dataset, optional If given, used to resolve the VR for known private tags. Returns ------- DataElement Raises ------ KeyError If `raw_data_element` belongs to an unknown non-private tag and :attr:`~pydicom.config.settings.reading_validation_mode` is set to ``RAISE``. """ # XXX buried here to avoid circular import # filereader->Dataset->convert_value->filereader # (for SQ parsing) from pydicom.values import convert_value raw = raw_data_element # If user has hooked into conversion of raw values, call his/her routine if config.data_element_callback: raw = config.data_element_callback( raw_data_element, encoding=encoding, **config.data_element_callback_kwargs ) 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(dataset, raw.tag) # group length tag implied in versions < 3.0 elif raw.tag.element == 0: vr = VR_.UL else: msg = f"Unknown DICOM tag {str(raw.tag)}" if config.settings.reading_validation_mode == config.RAISE: raise KeyError(msg + " can't look up VR") vr = VR_.UN warnings.warn(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(dataset, raw.tag) elif raw.value is None or len(raw.value) < 0xffff: try: vr = dictionary_VR(raw.tag) except KeyError: pass try: value = convert_value(vr, raw, encoding) except NotImplementedError as e: raise NotImplementedError(f"{str(e)} in tag {raw.tag!r}") except BytesLengthException as e: message = ( f"{e} This occurred while trying to parse {raw.tag} according " f"to VR '{vr}'." ) if config.convert_wrong_length_to_UN: warnings.warn(f"{message} Setting VR to 'UN'.") vr = VR_.UN value = raw.value else: raise BytesLengthException( f"{message} To replace this error with a warning set " "pydicom.config.convert_wrong_length_to_UN = True." ) if raw.tag in _LUT_DESCRIPTOR_TAGS and value: # We only fix the first value as the third value is 8 or 16 try: if value[0] < 0: value[0] += 65536 except TypeError: pass return DataElement( raw.tag, vr, value, raw.value_tell, raw.length == 0xFFFFFFFF, already_converted=True, ) pydicom-2.4.3/pydicom/dataset.py000066400000000000000000003260721446675437500166660ustar00rootroot00000000000000# 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 from bisect import bisect_left from contextlib import nullcontext import io from importlib.util import find_spec as have_package import inspect # for __dir__ from itertools import takewhile import json import os import os.path import re from types import TracebackType from typing import ( Optional, Tuple, Union, List, Any, cast, Dict, ValuesView, Iterator, BinaryIO, AnyStr, Callable, TypeVar, Type, overload, MutableSequence, MutableMapping, AbstractSet, TYPE_CHECKING ) import warnings import weakref from pydicom.filebase import DicomFileLike 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_VR, tag_for_keyword, keyword_for_tag, repeater_has_keyword ) from pydicom.dataelem import DataElement, DataElement_from_raw, RawDataElement from pydicom.encaps import encapsulate, encapsulate_extended from pydicom.fileutil import path_from_pathlike, PathType from pydicom.pixel_data_handlers.util import ( convert_color_space, reshape_pixel_array, get_image_pixel_ids ) from pydicom.tag import Tag, BaseTag, tag_in_exception, TagType from pydicom.uid import ( ExplicitVRLittleEndian, ImplicitVRLittleEndian, ExplicitVRBigEndian, RLELossless, PYDICOM_IMPLEMENTATION_UID, UID ) from pydicom.valuerep import VR as VR_, AMBIGUOUS_VR from pydicom.waveforms import numpy_handler as wave_handler if TYPE_CHECKING: # pragma: no cover from pydicom.sequence import Sequence class PrivateBlock: """Helper class for a private block in the :class:`Dataset`. .. versionadded:: 1.3 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 _dict_equal( a: "Dataset", b: Any, exclude: Optional[List[str]] = 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 = Union[DataElement, RawDataElement] _DatasetType = Union["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 ``" "``. is_little_endian : bool Shall be set before writing with ``write_like_original=False``. The :class:`Dataset` (excluding the pixel data) will be written using the given endianness. is_implicit_VR : bool Shall be set before writing with ``write_like_original=False``. The :class:`Dataset` will be written using the transfer syntax with the given VR handling, e.g *Little Endian Implicit VR* if ``True``, and *Little Endian Explicit VR* or *Big Endian Explicit VR* (depending on ``Dataset.is_little_endian``) if ``False``. """ indent_chars = " " def __init__(self, *args: _DatasetType, **kwargs: Any) -> None: """Create a new :class:`Dataset` instance.""" self._parent_encoding: 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_endian: Optional[bool] = None # set depending on the VR handling of the read dataset self.read_implicit_vr: Optional[bool] = None # The dataset's original character set encoding self.read_encoding: Union[None, str, MutableSequence[str]] = None self.is_little_endian: Optional[bool] = None self.is_implicit_VR: Optional[bool] = None # True if the dataset is a sequence item with undefined length self.is_undefined_length_sequence_item = False # the parent data set, if this dataset is a sequence item self._parent_seq: "Optional[weakref.ReferenceType[Sequence]]" = None # known private creator blocks self._private_blocks: Dict[Tuple[int, str], PrivateBlock] = {} self._pixel_array: Optional["numpy.ndarray"] = None self._pixel_id: Dict[str, int] = {} self.file_meta: FileMetaDataset @property def parent_seq(self) -> "Optional[weakref.ReferenceType[Sequence]]": """Return a weak reference to the parent :class:`~pydicom.sequence.Sequence`. .. versionadded:: 2.4 Returned value is a weak reference to the parent ``Sequence``. """ return self._parent_seq @parent_seq.setter def parent_seq(self, value: "Sequence") -> None: """Set the parent :class:`~pydicom.sequence.Sequence` .. versionadded:: 2.4 """ if value != self._parent_seq: self._parent_seq = weakref.ref(value) @property def parent(self) -> "Optional[weakref.ReferenceType[Dataset]]": """Return a weak reference to the parent Sequence's parent Dataset. .. deprecated:: 2.4 """ if config._use_future: raise AttributeError("Future: Dataset.parent is removed in v3.x") else: warnings.warn( "Dataset.parent will be removed in pydicom 3.0", DeprecationWarning ) parent_ref = self.parent_seq if parent_ref is None: return None return cast("Sequence", parent_ref()).parent_dataset @parent.setter def parent(self, value: "Dataset") -> None: """Set the parent :class:`~pydicom.sequence.Sequence` .. deprecated:: 2.4 """ if config._use_future: raise AttributeError("Future: Dataset.parent is removed in v3.x") else: warnings.warn( "Dataset.parent will be removed in pydicom 3.0", DeprecationWarning ) self._parent = weakref.ref(value) def __deepcopy__(self, memo: Optional[Dict[int, Any]]) -> "Dataset": cls = self.__class__ copied = cls.__new__(cls) if memo: memo[id(self)] = copied # add the new class to the memo # Insert a deepcopy of all instance attributes copied.__dict__.update(copy.deepcopy(self.__dict__, memo)) # Manually update the weakref to be correct for elem in copied: # DICOM elements if elem.VR == VR_.SQ: elem.value.parent_dataset = copied # setter does weakref return copied def __enter__(self) -> "Dataset": """Method invoked on entry to a with statement.""" return self def __exit__( self, exc_type: Optional[Type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[TracebackType] ) -> Optional[bool]: """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 __array__(self) -> "numpy.ndarray": """Support accessing the dataset from a numpy array.""" return numpy.asarray(self._dict) def data_element(self, name: str) -> Optional[DataElement]: """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": warnings.warn(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] # 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: Union[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 = {} elif isinstance(key, BaseTag): del self._dict[key] if self._private_blocks and key.is_private_creator: self._private_blocks = {} 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 = {} 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: Optional[Any] = None) -> Any: pass # pragma: no cover @overload def get( self, key: Union[int, Tuple[int, int], BaseTag], default: Optional[Any] = None ) -> DataElement: pass # pragma: no cover def get( self, key: Union[str, Union[int, Tuple[int, int], BaseTag]], default: Optional[Any] = None ) -> Union[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) -> AbstractSet[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) -> AbstractSet[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) -> 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) @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: Union[slice, TagType] ) -> Union["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 elem = read_deferred_data_element( self.fileobj_type, self.filename, self.timestamp, elem ) if tag != BaseTag(0x00080005): character_set = self.read_encoding or self._character_set else: character_set = default_encoding # Not converted from raw form read from file yet; do so now self[tag] = DataElement_from_raw(elem, character_set, self) # 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`. .. versionadded:: 1.3 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( "Private creator '{}' not found".format(private_creator)) # 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. .. versionadded:: 1.3 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`. .. versionadded:: 1.3 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) -> "Dataset": pass # pragma: no cover @overload def get_item(self, key: TagType) -> DataElement: pass # pragma: no cover def get_item( self, key: Union[slice, TagType] ) -> Union["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. 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 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 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}) ds.is_little_endian = self.is_little_endian ds.is_implicit_VR = self.is_implicit_VR ds.set_original_encoding( self.read_implicit_vr, self.read_little_endian, self.read_encoding ) return ds @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`. .. versionadded:: 1.1 This includes properties related to endianness, VR handling and the (0008,0005) *Specific Character Set*. """ return ( self.is_implicit_VR is not None and self.is_little_endian is not None and self.read_implicit_vr == self.is_implicit_VR and self.read_little_endian == self.is_little_endian and self.read_encoding == self._character_set ) def set_original_encoding( self, is_implicit_vr: Optional[bool], is_little_endian: Optional[bool], character_encoding: Union[None, str, MutableSequence[str]] ) -> None: """Set the values for the original transfer syntax and encoding. .. versionadded:: 1.2 Can be used for a :class:`Dataset` with raw data elements to enable optimized writing (e.g. without decoding the data elements). """ self.read_implicit_vr = is_implicit_vr self.read_little_endian = is_little_endian self.read_encoding = 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]: """Yield the top-level elements of the :class:`Dataset`. .. versionadded:: 1.1 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: Union[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: Optional[Any] = 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: Union[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 warnings.warn( 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. Parameters ---------- handler_name : str, optional The name of the pixel handler that shall be used to decode the data. Supported names are: ``'gdcm'``, ``'pillow'``, ``'jpeg_ls'``, ``'rle'``, ``'numpy'`` and ``'pylibjpeg'``. If not used (the default), a matching handler is used from the handlers configured in :attr:`~pydicom.config.pixel_data_handlers`. Returns ------- None Converted pixel data is stored internally in the dataset. 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. """ # 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_id != get_image_pixel_ids(self): already_have = False if already_have: return if handler_name: self._convert_pixel_data_using_handler(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. """ # 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. """ # 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} " f"(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.""" # 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: Optional["numpy.ndarray"] = None, encoding_plugin: str = '', decoding_plugin: str = '', encapsulate_ext: bool = False, **kwargs: Any, ) -> None: """Compress and update an uncompressed dataset in-place with the resulting :dcm:`encapsulated` pixel data. .. versionadded:: 2.2 The dataset 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* 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 *Samples per Pixel* is greater than 1 then the following element will also be added: * (0028,0006) *Planar Configuration* 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* **Supported Transfer Syntax UIDs** +----------------------+----------+----------------------------------+ | UID | Plugins | Encoding Guide | +======================+==========+==================================+ | *RLE Lossless* - |pydicom, | :doc:`RLE Lossless | | 1.2.840.10008.1.2.5 |pylibjpeg,| ` | | |gdcm | | +----------------------+----------+----------------------------------+ Examples -------- Compress the existing uncompressed *Pixel Data* in place: >>> from pydicom.data import get_testdata_file >>> from pydicom.uid import RLELossless >>> ds = get_testdata_file("CT_small.dcm", read=True) >>> ds.compress(RLELossless) >>> ds.save_as("CT_small_rle.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). decoding_plugin : str, optional Placeholder for future functionality. 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. **kwargs Optional keyword parameters for the encoding plugin may also be present. See the :doc:`encoding plugins options ` for more information. """ from pydicom.encoders import get_encoder uid = UID(transfer_syntax_uid) # Raises NotImplementedError if `uid` is not supported encoder = get_encoder(uid) if not encoder.is_available: missing = "\n".join( [f" {s}" for s in encoder.missing_dependencies] ) raise RuntimeError( f"The '{uid.name}' encoder is unavailable because its " f"encoding plugins are missing dependencies:\n" f"{missing}" ) if arr is None: # Encode the current *Pixel Data* frame_iterator = encoder.iter_encode( self, encoding_plugin=encoding_plugin, decoding_plugin=decoding_plugin, **kwargs ) else: # Encode from an uncompressed pixel data array kwargs.update(encoder.kwargs_from_ds(self)) frame_iterator = encoder.iter_encode( arr, encoding_plugin=encoding_plugin, **kwargs ) # Encode! encoded = [f for f in frame_iterator] # Encapsulate the encoded *Pixel Data* nr_frames = getattr(self, "NumberOfFrames", 1) or 1 total = (nr_frames - 1) * 8 + sum([len(f) for f in encoded[:-1]]) if encapsulate_ext or total > 2**32 - 1: (self.PixelData, self.ExtendedOffsetTable, self.ExtendedOffsetTableLengths) = encapsulate_extended(encoded) else: self.PixelData = encapsulate(encoded) # PS3.5 Annex A.4 - encapsulated pixel data uses undefined length self['PixelData'].is_undefined_length = True # PS3.5 Annex A.4 - encapsulated datasets use explicit VR little endian self.is_implicit_VR = False self.is_little_endian = True # Set the correct *Transfer Syntax UID* if not hasattr(self, 'file_meta'): self.file_meta = FileMetaDataset() self.file_meta.TransferSyntaxUID = uid # Add or update any other required elements if self.SamplesPerPixel > 1: self.PlanarConfiguration: int = 1 if uid == RLELossless else 0 def decompress(self, handler_name: str = '') -> None: """Decompresses *Pixel Data* and modifies the :class:`Dataset` in-place. .. versionadded:: 1.4 The `handler_name` keyword argument was added If not a compressed transfer syntax, then pixel data is converted to a :class:`numpy.ndarray` internally, but not returned. If compressed pixel data, then is decompressed using an image handler, and internal state is updated appropriately: - ``Dataset.file_meta.TransferSyntaxUID`` is updated to non-compressed form - :attr:`~pydicom.dataelem.DataElement.is_undefined_length` is ``False`` for the (7FE0,0010) *Pixel Data* element. .. versionchanged:: 1.4 The `handler_name` keyword argument was added Parameters ---------- handler_name : str, optional The name of the pixel handler that shall be used to decode the data. Supported names are: ``'gdcm'``, ``'pillow'``, ``'jpeg_ls'``, ``'rle'``, ``'numpy'`` and ``'pylibjpeg'``. If not used (the default), a matching handler is used from the handlers configured in :attr:`~pydicom.config.pixel_data_handlers`. Returns ------- None Raises ------ NotImplementedError If the pixel data was originally compressed but file is not *Explicit VR Little Endian* as required by the DICOM Standard. """ self.convert_pixel_data(handler_name) self.is_decompressed = True # May have been undefined length pixel data, but won't be now if 'PixelData' in self: self[0x7fe00010].is_undefined_length = False # Make sure correct Transfer Syntax is set # According to the dicom standard PS3.5 section A.4, # all compressed files must have been explicit VR, little endian # First check if was a compressed file if ( hasattr(self, 'file_meta') and self.file_meta.TransferSyntaxUID.is_compressed ): # Check that current file as read does match expected if not self.is_little_endian or self.is_implicit_VR: msg = ("Current dataset does not match expected ExplicitVR " "LittleEndian transfer syntax from a compressed " "transfer syntax") raise NotImplementedError(msg) # All is as expected, updated the Transfer Syntax self.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian def overlay_array(self, group: int) -> "numpy.ndarray": """Return the *Overlay Data* in `group` as a :class:`numpy.ndarray`. .. versionadded:: 1.4 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)" ) from pydicom.config import overlay_data_handlers available_handlers = [ hh for hh in overlay_data_handlers if hh.is_available() ] if not available_handlers: # For each of the handlers we want to find which # dependencies are missing msg = ( "The following handlers are available to decode the overlay " "data however they are missing required dependencies: " ) pkg_msg = [] for hh in overlay_data_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} " f"(req. {', '.join(names)})" ) raise RuntimeError(msg + ', '.join(pkg_msg)) last_exception = None for handler in available_handlers: try: # Use the handler to get an ndarray of the pixel data func = handler.get_overlay_array return cast("numpy.ndarray", func(self, group)) except Exception as exc: logger.debug( "Exception raised by overlay data handler", exc_info=exc ) last_exception = exc logger.info( "Unable to decode the overlay 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] @property def pixel_array(self) -> "numpy.ndarray": """Return the pixel data as a :class:`numpy.ndarray`. .. versionchanged:: 1.4 Added support for *Float Pixel Data* and *Double Float Pixel Data* Returns ------- numpy.ndarray The (7FE0,0008) *Float Pixel Data*, (7FE0,0009) *Double Float Pixel Data* or (7FE0,0010) *Pixel Data* converted to a :class:`numpy.ndarray`. """ self.convert_pixel_data() return cast("numpy.ndarray", self._pixel_array) 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 http://docs.python.org/library/stdtypes.html#string-formatting-operations # noqa 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" # noqa def formatted_lines( self, element_format: str = default_element_format, sequence_element_format: str = default_sequence_element_format, indent_format: Optional[str] = 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}{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) 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: Union[str, "os.PathLike[AnyStr]", BinaryIO], write_like_original: bool = True ) -> None: """Write the :class:`Dataset` to `filename`. Wrapper for pydicom.filewriter.dcmwrite, passing this dataset to it. See documentation for that function for details. See Also -------- pydicom.filewriter.dcmwrite Write a DICOM file from a :class:`FileDataset` instance. """ pydicom.dcmwrite(filename, self, write_like_original) def ensure_file_meta(self) -> None: """Create an empty ``Dataset.file_meta`` if none exists. .. versionadded:: 1.2 """ # 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 fix_meta_info(self, enforce_standard: bool = True) -> None: """Ensure the file meta info exists and has the correct values for transfer syntax and media storage UIDs. .. versionadded:: 1.2 .. warning:: The transfer syntax for ``is_implicit_VR = False`` and ``is_little_endian = True`` is ambiguous and will therefore not be set. Parameters ---------- enforce_standard : bool, optional If ``True``, a check for incorrect and missing elements is performed (see :func:`~validate_file_meta`). """ self.ensure_file_meta() if self.is_little_endian and self.is_implicit_VR: self.file_meta.TransferSyntaxUID = ImplicitVRLittleEndian elif not self.is_little_endian and not self.is_implicit_VR: self.file_meta.TransferSyntaxUID = ExplicitVRBigEndian elif not self.is_little_endian and self.is_implicit_VR: raise NotImplementedError("Implicit VR Big Endian is not a " "supported Transfer Syntax.") if 'SOPClassUID' in self: self.file_meta.MediaStorageSOPClassUID = self.SOPClassUID if 'SOPInstanceUID' in self: self.file_meta.MediaStorageSOPInstanceUID = self.SOPInstanceUID if enforce_standard: validate_file_meta(self.file_meta, enforce_standard=True) 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) data_element = DataElement(tag, vr, value) if vr == VR_.SQ: # let a sequence know its parent dataset to pass it # to its items, who may need parent dataset tags # to resolve ambiguous tags data_element.parent = self else: # already have this data_element, just changing its value data_element = self[tag] data_element.value = value # Now have data_element - store it in this dict self[tag] = data_element 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": warnings.warn(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 mis-spells a dicom data_element - no error!!! object.__setattr__(self, name, value) def _set_file_meta(self, value: Optional["Dataset"]) -> None: if value is not None and not isinstance(value, FileMetaDataset): if config._use_future: raise TypeError( "Pydicom Future: Dataset.file_meta must be an instance " "of FileMetaDataset" ) FileMetaDataset.validate(value) warnings.warn( "Starting in pydicom 3.0, Dataset.file_meta must be a " "FileMetaDataset class instance", DeprecationWarning ) self.__dict__["file_meta"] = value def __setitem__( self, key: Union[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 " f"'{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 = DataElement_from_raw( elem, self._character_set, self ) elem.private_creator = self[private_creator_tag].value 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 if elem.value is not None: # let a sequence know its parent dataset, as sequence items # may need parent dataset tags to resolve ambiguous tags elem.value.parent_dataset = self # type:ignore def _slice_dataset( self, start: Optional[TagType], stop: Optional[TagType], step: Optional[int] ) -> 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: Union[Dict[str, Any], str, bytes, bytearray], bulk_data_uri_handler: Optional[ Union[ Callable[[str, str, str], Union[None, str, int, float, bytes]], Callable[[str], Union[None, str, int, float, bytes]] ] ] = None ) -> "Dataset": """Return a :class:`Dataset` from a DICOM JSON Model object. .. versionadded:: 1.3 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: Optional[Callable[[DataElement], str]] = None, # noqa 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`. .. versionadded:: 1.4 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 = '{:08X}'.format(key) 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: logger.error(f"Error while processing tag {json_key}") if not suppress_invalid_tags: raise exc return json_dataset def to_json( self, bulk_data_threshold: int = 1024, bulk_data_element_handler: Optional[Callable[[DataElement], str]] = None, # noqa dump_handler: Optional[Callable[[Dict[str, Any]], str]] = None, suppress_invalid_tags: bool = False, ) -> str: """Return a JSON representation of the :class:`Dataset`. .. versionadded:: 1.3 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 ) ) # For Pickle, need to make weakref a strong reference # Adapted from https://stackoverflow.com/a/45588812/1987276 def __getstate__(self) -> Dict[str, Any]: if self.parent_seq is not None: s = self.__dict__.copy() s['_parent_seq'] = s['_parent_seq']() return s return self.__dict__ # If recovering from a pickle, turn back into weak ref def __setstate__(self, state: Dict[str, Any]) -> None: self.__dict__.update(state) if self.__dict__['_parent_seq'] is not None: self.__dict__['_parent_seq'] = weakref.ref( self.__dict__['_parent_seq'] ) __repr__ = __str__ _FileDataset = TypeVar("_FileDataset", bound="FileDataset") class FileDataset(Dataset): """An extension of :class:`Dataset` to make reading and writing to file-like easier. Attributes ---------- preamble : str or bytes or None The optional DICOM preamble prepended to the :class:`FileDataset`, if available. file_meta : FileMetaDataset or None The Dataset's file meta information as a :class:`FileMetaDataset`, if available (``None`` if not present). Consists of group ``0x0002`` elements. filename : str or None The filename that the :class:`FileDataset` was read from (if read from file) or ``None`` if the filename is not available (if read from a :class:`io.BytesIO` or similar). fileobj_type The object type of the file-like the :class:`FileDataset` was read from. is_implicit_VR : bool ``True`` if the dataset encoding is implicit VR, ``False`` otherwise. is_little_endian : bool ``True`` if the dataset encoding is little endian byte ordering, ``False`` otherwise. timestamp : float or 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: Union[PathType, BinaryIO, DicomFileLike], dataset: _DatasetType, preamble: Optional[bytes] = None, file_meta: Optional["FileMetaDataset"] = 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 or PathLike or BytesIO or None Full path and filename to the file, memory buffer object, or ``None`` if is a :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() ) self.is_implicit_VR: bool = is_implicit_VR self.is_little_endian: bool = is_little_endian filename: Optional[str] = None filename_or_obj = path_from_pathlike(filename_or_obj) self.fileobj_type: Any = None self.filename: Union[PathType, BinaryIO] = "" if isinstance(filename_or_obj, str): filename = filename_or_obj self.fileobj_type = open elif isinstance(filename_or_obj, io.BufferedReader): filename = filename_or_obj.name # This is the appropriate constructor for io.BufferedReader self.fileobj_type = open else: # use __class__ python <2.7?; # http://docs.python.org/reference/datamodel.html self.fileobj_type = filename_or_obj.__class__ if hasattr(filename_or_obj, "name"): filename = filename_or_obj.name elif hasattr(filename_or_obj, "filename"): filename = ( filename_or_obj.filename # type: ignore[attr-defined] ) else: # e.g. came from BytesIO or something file-like self.filename = filename_or_obj self.timestamp = None if filename: self.filename = filename if os.path.exists(filename): statinfo = os.stat(filename) self.timestamp = statinfo.st_mtime def _copy_implementation(self, copy_function: Callable) -> "FileDataset": """Implementation of ``__copy__`` and ``__deepcopy__``. Sets the filename to ``None`` if it isn't a string, and copies all other attributes using `copy_function`. """ copied = self.__class__( self.filename, self, self.preamble, self.file_meta, self.is_implicit_VR, self.is_little_endian ) filename = self.filename if filename is not None and not isinstance(filename, str): warnings.warn("The 'filename' attribute of the dataset is a " "file-like object and will be set to None " "in the copied object") self.filename = None # type: ignore[assignment] for (k, v) in self.__dict__.items(): copied.__dict__[k] = copy_function(v) self.filename = filename return copied def __copy__(self) -> "FileDataset": """Return a shallow copy of the file dataset. Make sure that the filename is not copied in case it is a file-like object. Returns ------- FileDataset A shallow copy of the file data set. """ return self._copy_implementation(copy.copy) def __deepcopy__(self, _: Optional[Dict[int, Any]]) -> "FileDataset": """Return a deep copy of the file dataset. Make sure that the filename is not copied in case it is a file-like object. Returns ------- FileDataset A deep copy of the file data set. """ return self._copy_implementation(copy.deepcopy) def validate_file_meta( file_meta: "FileMetaDataset", enforce_standard: bool = True ) -> None: """Validate the *File Meta Information* elements in `file_meta`. .. versionchanged:: 1.2 Moved from :mod:`pydicom.filewriter`. 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: * (0002,0001) *File Meta Information Version* * (0002,0012) *Implementation Class UID* * (0002,0013) *Implementation Version Name* and the following elements will be checked: * (0002,0002) *Media Storage SOP Class UID* * (0002,0003) *Media Storage SOP Instance UID* * (0002,0010) *Transfer Syntax UID* Raises ------ ValueError If `enforce_standard` is ``True`` and any of the checked *File Meta Information* elements are missing from `file_meta`. 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 must be present in 'file_meta'.") if enforce_standard: if 'FileMetaInformationVersion' not in file_meta: file_meta.FileMetaInformationVersion = b'\x00\x01' if 'ImplementationClassUID' not in file_meta: file_meta.ImplementationClassUID = UID(PYDICOM_IMPLEMENTATION_UID) if 'ImplementationVersionName' not in file_meta: file_meta.ImplementationVersionName = ( 'PYDICOM ' + ".".join(str(x) for x in __version_info__)) # Check that required File Meta Information elements are present missing = [] for element in [0x0002, 0x0003, 0x0010]: if Tag(0x0002, element) not in file_meta: missing.append(Tag(0x0002, element)) if missing: msg = ("Missing required File Meta Information elements from " "'file_meta':\n") for tag in missing: msg += '\t{0} {1}\n'.format(tag, keyword_for_tag(tag)) raise ValueError(msg[:-1]) # Remove final newline 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: Optional[str] # SH, 3 self.SourceApplicationEntityTitle: Optional[str] # AE, 3 self.SendingApplicationEntityTitle: Optional[str] # AE, 3 self.ReceivingApplicationEntityTitle: Optional[str] # AE, 3 self.SourcePresentationAddress: Optional[str] # UR, 3 self.ReceivingPresentationAddress: Optional[str] # UR, 3 self.PrivateInformationCreatorUID: Optional[UID] # 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( "Argument must be a dict or Dataset, not {}".format( type(init_value) ) ) non_group2 = [ Tag(tag) for tag in init_value.keys() if Tag(tag).group != 2 ] if non_group2: msg = "Attempted to set non-group 2 elements: {}" raise ValueError(msg.format(non_group2)) def __setitem__( self, key: Union[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) _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-2.4.3/pydicom/dicomdir.py000066400000000000000000000130541446675437500170240ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Module for DicomDir class.""" import os from typing import Optional, List, Dict, Union, BinaryIO import warnings from pydicom import config from pydicom.dataset import FileDataset, FileMetaDataset, Dataset from pydicom.errors import InvalidDicomError class DicomDir(FileDataset): """Hold a DICOMDIR dataset read from file. Derived from :class:`~pydicom.dataset.FileDataset`, but additional methods are available, specific to the Directory structure .. deprecated:: 2.1 ``DicomDir`` is deprecated and will be removed in *pydicom* v3.0, use :class:`~pydicom.fileset.FileSet` instead. """ def __init__( self, filename_or_obj: Union[str, os.PathLike, BinaryIO], dataset: Dataset, preamble: Optional[bytes] = None, file_meta: Optional[FileMetaDataset] = None, is_implicit_VR: bool = True, is_little_endian: bool = True, ) -> None: """Initialize a DICOMDIR dataset read from a DICOM file. Carries forward all the initialization from :class:`~pydicom.dataset.FileDataset` Parameters ---------- filename_or_obj : str or PathLike or file-like or None Full path and filename to the file of ``None`` if :class:`io.BytesIO`. dataset : dataset.Dataset Some form of dictionary, usually a :class:`~pydicom.dataset.FileDataset` from :func:`~pydicom.filereader.dcmread`. preamble : bytes The 128-byte DICOM preamble. file_meta : dataset.Dataset The file meta :class:`~pydicom.dataset.Dataset`, such as the one returned by :func:`~pydicom.filereader.read_file_meta_info`, or an empty :class:`~pydicom.dataset.Dataset` if no file meta information is in the file. is_implicit_VR : bool ``True`` if implicit VR transfer syntax used (default); ``False`` if explicit VR. is_little_endian : bool ``True`` if little endian transfer syntax used (default); ``False`` if big endian. Raises ------ InvalidDicomError If the file transfer syntax is not Little Endian Explicit and :attr:`~pydicom.config.settings.reading_validation_mode` is ``RAISE``. """ # Usually this class is created through filereader.read_partial, # and it checks class SOP, but in case of direct creation, # check here also if file_meta: class_uid = file_meta.MediaStorageSOPClassUID if not class_uid.name == "Media Storage Directory Storage": msg = "SOP Class is not Media Storage Directory (DICOMDIR)" raise InvalidDicomError(msg) if is_implicit_VR or not is_little_endian: msg = ('Invalid transfer syntax for DICOMDIR - ' 'Explicit Little Endian expected.') if (config.settings.reading_validation_mode == config.RAISE): raise InvalidDicomError(msg) warnings.warn(msg, UserWarning) FileDataset.__init__( self, filename_or_obj, dataset, preamble, file_meta, is_implicit_VR=is_implicit_VR, is_little_endian=is_little_endian ) self.patient_records: List[Dataset] = [] self.parse_records() def parse_records(self) -> None: """Build the hierarchy of given directory records, and structure into Patient, Studies, Series, Images hierarchy. This is intended for initial read of file only, it will not reorganize correctly if records are changed. """ # Define a helper function for organizing the records def get_siblings( record: Dataset, map_offset_to_record: Dict[int, Dataset] ) -> List[Dataset]: """Return a list of all siblings of the given directory record, including itself. """ sibling_list = [record] current_record = record while ( 'OffsetOfTheNextDirectoryRecord' in current_record and current_record.OffsetOfTheNextDirectoryRecord ): offset_of_next = current_record.OffsetOfTheNextDirectoryRecord sibling = map_offset_to_record[offset_of_next] sibling_list.append(sibling) current_record = sibling return sibling_list # Build the mapping from file offsets to records records = self.DirectoryRecordSequence if not records: return map_offset_to_record = {} for record in records: offset = record.seq_item_tell map_offset_to_record[offset] = record # logging.debug("Record offsets: " + map_offset_to_record.keys()) # Find the children of each record for record in records: record.children = [] if 'OffsetOfReferencedLowerLevelDirectoryEntity' in record: child_offset = ( record.OffsetOfReferencedLowerLevelDirectoryEntity ) if child_offset: child = map_offset_to_record[child_offset] record.children = get_siblings(child, map_offset_to_record) self.patient_records = [ record for record in records if getattr(record, 'DirectoryRecordType') == 'PATIENT' ] pydicom-2.4.3/pydicom/dicomio.py000066400000000000000000000006231446675437500166530ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Many point of entry for pydicom read and write functions""" import warnings with warnings.catch_warnings(): warnings.simplefilter("ignore") from pydicom.filereader import read_file, read_dicomdir from pydicom.filewriter import write_file from pydicom.filereader import dcmread from pydicom.filewriter import dcmwrite pydicom-2.4.3/pydicom/encaps.py000066400000000000000000000643101446675437500165040ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. """Functions for working with encapsulated (compressed) pixel data.""" from struct import pack from typing import List, Generator, Optional, Tuple import warnings import pydicom.config from pydicom.filebase import DicomBytesIO, DicomFileLike from pydicom.tag import (Tag, ItemTag, SequenceDelimiterTag) # Functions for parsing encapsulated data def get_frame_offsets(fp: DicomFileLike) -> Tuple[bool, List[int]]: """Return a list of the fragment offsets from the Basic Offset Table. **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.DicomFileLike 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 Table Offset 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) for ii in range(length // 4): offsets.append(fp.read_UL()) return bool(length), offsets def get_nr_fragments(fp: DicomFileLike) -> int: """Return the number of fragments in `fp`. .. versionadded:: 1.4 """ if not fp.is_little_endian: raise ValueError("'fp.is_little_endian' must be True") nr_fragments = 0 start = fp.tell() while True: try: tag = Tag(fp.read_tag()) except EOFError: break if tag == 0xFFFEE000: # Item length = fp.read_UL() if length == 0xFFFFFFFF: raise ValueError( f"Undefined item length at offset {fp.tell() - 4} when " "parsing the encapsulated pixel data fragments" ) fp.seek(length, 1) nr_fragments += 1 elif tag == 0xFFFEE0DD: # Sequence Delimiter break else: raise ValueError( f"Unexpected tag '{tag}' at offset {fp.tell() - 4} when " "parsing the encapsulated pixel data fragment items" ) fp.seek(start) return nr_fragments def generate_pixel_data_fragment( fp: DicomFileLike ) -> Generator[bytes, None, None]: """Yield the encapsulated pixel data fragments. 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.DicomFileLike 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") # We should be positioned at the start of the Item Tag for the first # fragment after the Basic Offset Table while True: try: tag = Tag(fp.read_tag()) except EOFError: break if tag == 0xFFFEE000: # Item length = fp.read_UL() if length == 0xFFFFFFFF: raise ValueError( f"Undefined item length at offset {fp.tell() - 4} when " "parsing the encapsulated pixel data fragments" ) yield fp.read(length) elif tag == 0xFFFEE0DD: # Sequence Delimiter # Behave nicely and rewind back to the end of the items fp.seek(-4, 1) break else: raise ValueError( f"Unexpected tag '{tag}' at offset {fp.tell() - 4} when " "parsing the encapsulated pixel data fragment items" ) def generate_pixel_data_frame( bytestream: bytes, nr_frames: Optional[int] = None ) -> Generator[bytes, None, None]: """Yield an encapsulated pixel data frame. 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 fragmented_frame in generate_pixel_data(bytestream, nr_frames): yield b''.join(fragmented_frame) def generate_pixel_data( bytestream: bytes, nr_frames: Optional[int] = None ) -> Generator[Tuple[bytes, ...], None, None]: """Yield an encapsulated pixel data frame. 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 ` """ fp = DicomBytesIO(bytestream) fp.is_little_endian = True # `offsets` is a list of the offsets to the first fragment in each frame has_bot, offsets = get_frame_offsets(fp) # Doesn't actually matter what the last offset value is, as long as its # greater than the total number of bytes in the fragments offsets.append(len(bytestream)) if has_bot: # Use the BOT to determine the frame boundaries frame = [] frame_length = 0 frame_number = 0 for fragment in generate_pixel_data_fragment(fp): if frame_length < offsets[frame_number + 1]: frame.append(fragment) else: yield tuple(frame) frame = [fragment] frame_number += 1 frame_length += len(fragment) + 8 # Yield the final frame - required here because the frame_length will # never be greater than offsets[-1] and thus never trigger the final # yield within the for block yield tuple(frame) else: nr_fragments = get_nr_fragments(fp) if nr_fragments == 1: # Single fragment: 1 frame for fragment in generate_pixel_data_fragment(fp): yield tuple([fragment]) elif nr_frames: # Multiple fragments: 1 or more frames if nr_fragments == nr_frames: # 1 fragment per frame # Covers RLE and others if 1:1 ratio for fragment in generate_pixel_data_fragment(fp): yield tuple([fragment]) elif nr_frames == 1: # Multiple fragments: 1 frame frame = [] for fragment in generate_pixel_data_fragment(fp): frame.append(fragment) yield tuple(frame) elif nr_fragments > nr_frames: # More fragments then frames # Search for JPEG/JPEG-LS/JPEG2K EOI/EOC marker # Should be the last two bytes of a frame # May fail if no EOI/EOC marker or not JPEG eoi_marker = b'\xff\xd9' frame = [] frame_nr = 0 for fragment in generate_pixel_data_fragment(fp): frame.append(fragment) if eoi_marker in fragment[-10:]: yield tuple(frame) frame_nr += 1 frame = [] if frame or frame_nr != nr_frames: # If data in `frame` or fewer frames yielded then we # must've missed a frame boundary warnings.warn( "The end of the encapsulated pixel data has been " "reached but one or more frame boundaries may have " "been missed; please confirm that the generated frame " "data is correct" ) if frame: yield tuple(frame) else: # Fewer fragments than frames raise ValueError( "Unable to parse encapsulated pixel data as the Basic " "Offset Table is empty and there are fewer fragments then " "frames; the dataset may be corrupt" ) else: # Multiple fragments but unknown number of frames raise ValueError( "Unable to determine the frame boundaries for the " "encapsulated pixel data as the Basic Offset Table is empty " "and `nr_frames` parameter is None" ) def decode_data_sequence(data: bytes) -> List[bytes]: """Read encapsulated data and return a list of bytes. 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. Parameters ---------- data : bytes The encapsulated pixel data fragments. Returns ------- bytes All fragments concatenated together. """ return b"".join(decode_data_sequence(data)) # read_item modeled after filereader.ReadSequenceItem def read_item(fp: DicomFileLike) -> Optional[bytes]: """Read and return a single Item in the fragmented data stream. Parameters ---------- fp : filebase.DicomIO The file-like to read the item from. Returns ------- bytes The Item's raw bytes. """ logger = pydicom.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" " at data position 0x%x" % (fp.tell() - 4, )) item_data = fp.read(length) return item_data # Functions for encapsulating data def fragment_frame( frame: bytes, nr_fragments: int = 1 ) -> Generator[bytes, None, None]: """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 ' Generator[bytes, None, None]: """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) itemise_frame = itemize_frame 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_extended` """ 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(' 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 length available with the :dcm:`Basic Offset Table` (2**32 - 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) Examples -------- .. code-block:: python from pydicom.encaps import encapsulate_extended # '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.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` """ nr_frames = len(frames) frame_lengths = [len(frame) for frame in frames] 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 pydicom-2.4.3/pydicom/encoders/000077500000000000000000000000001446675437500164575ustar00rootroot00000000000000pydicom-2.4.3/pydicom/encoders/__init__.py000066400000000000000000000001021446675437500205610ustar00rootroot00000000000000from pydicom.encoders.base import get_encoder, RLELosslessEncoder pydicom-2.4.3/pydicom/encoders/base.py000066400000000000000000001064471446675437500177570ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. """Bulk data encoding.""" from importlib import import_module import sys from typing import ( Callable, Iterator, Tuple, List, Optional, Dict, Union, cast, Iterable, TYPE_CHECKING, Any ) from pydicom.uid import ( UID, JPEGBaseline8Bit, JPEGExtended12Bit, JPEGLosslessP14, JPEGLosslessSV1, JPEGLSLossless, JPEGLSNearLossless, JPEG2000Lossless, JPEG2000, RLELossless ) if TYPE_CHECKING: # pragma: no cover from pydicom.dataset import Dataset, FileMetaDataset, FileDataset try: import numpy import numpy as np except ImportError: pass class Encoder: """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. """ # The *Transfer Syntax UID* data will be encoded to self._uid = uid # Available encoding plugins self._available: Dict[str, Callable] = {} # Unavailable encoding plugins - missing dependencies or other reason self._unavailable: Dict[str, Tuple[str, ...]] = {} # Default encoding options self._defaults = { 'transfer_syntax_uid': self.UID, # Intended transfer syntax 'byteorder': '<', # Byte ordering of `src` passed to plugins } def add_plugin(self, label: str, import_path: Tuple[str, str]) -> None: """Add an encoding plugin to the encoder. The requirements for encoding plugins are available :doc:`here`. Parameters ---------- label : str The label to use for the plugin, should be unique for the encoder. import_path : Tuple[str, str] The module import path and the encoding function's name (e.g. ``('pydicom.encoders.pylibjpeg', 'encode_pixel_data')``). Raises ------ ModuleNotFoundError If the module import path is incorrect or unavailable. AttributeError If the plugin's encoding function, ``is_available()`` or ``ENCODER_DEPENDENCIES`` aren't found in the module. """ if label in self._available or label in self._unavailable: raise ValueError( f"'{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: # `ENCODER_DEPENDENCIES[UID]` is required for plugins deps = module.ENCODER_DEPENDENCIES self._unavailable[label] = deps[self.UID] @staticmethod def _check_kwargs(kwargs: Dict[str, Union[int, str]]) -> None: """Raise TypeError if `kwargs` is missing required keys.""" required_keys = [ 'rows', 'columns', 'samples_per_pixel', 'bits_allocated', 'bits_stored', 'pixel_representation', 'photometric_interpretation', 'number_of_frames' ] missing = [f"'{key}'" for key in required_keys if key not in kwargs] if missing: raise TypeError( f"Missing expected arguments: {', '.join(missing)}" ) def encode( self, src: Union[bytes, "numpy.ndarray", "Dataset"], idx: Optional[int] = None, encoding_plugin: str = '', decoding_plugin: str = '', **kwargs: Any, ) -> bytes: """Return an encoded frame of the pixel data in `src` as :class:`bytes`. 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, Samples) for single frame, multi-sample data. * (Frames, Rows, Columns) for multi-frame, single sample data. * (Frames, Rows, Columns, Samples) 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. Using ``bytes`` as the `src` will bypass some of the validation checks and is only recommended for advanced users. idx : int, optional Required when `src` contains multiple frames, this is the index of the frame to be encoded. 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`. decoding_plugin : str, optional Placeholder for future functionality. **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. """ from pydicom.dataset import Dataset if isinstance(src, Dataset): return self._encode_dataset( src, idx, encoding_plugin, decoding_plugin, **kwargs ) if isinstance(src, np.ndarray): return self._encode_array(src, idx, encoding_plugin, **kwargs) if isinstance(src, bytes): return self._encode_bytes(src, idx, encoding_plugin, **kwargs) raise TypeError( "'src' must be bytes, numpy.ndarray or pydicom.dataset.Dataset, " f"not '{src.__class__.__name__}'" ) def _encode_array( self, arr: "numpy.ndarray", idx: Optional[int] = None, encoding_plugin: str = '', **kwargs: Any, ) -> bytes: """Return a single encoded frame from `arr`.""" self._check_kwargs(kwargs) if len(arr.shape) > 4: raise ValueError(f"Unable to encode {len(arr.shape)}D ndarrays") if kwargs.get('number_of_frames', 1) > 1 or len(arr.shape) == 4: if idx is None: raise ValueError( "The frame 'idx' is required for multi-frame pixel data" ) arr = arr[idx] src = self._preprocess(arr, **kwargs) return self._process(src, encoding_plugin, **kwargs) def _encode_bytes( self, src: bytes, idx: Optional[int] = None, encoding_plugin: str = '', **kwargs: Any, ) -> bytes: """Return a single encoded frame from `src`. Encoding :class:`bytes` will bypass a number of the validation checks. This is to allow advanced users to intentionally perform non-conformant encoding if they wish to do so. """ self._check_kwargs(kwargs) rows: int = kwargs['rows'] columns: int = kwargs['columns'] samples_per_pixel: int = kwargs['samples_per_pixel'] bits_allocated: int = kwargs['bits_allocated'] bytes_allocated = bits_allocated // 8 # Expected length of a single frame expected_len = rows * columns * samples_per_pixel * bytes_allocated whole_frames = len(src) // expected_len # Insufficient data if whole_frames == 0: raise ValueError( "Unable to encode as the actual length of the frame " f"({len(src)} bytes) is less than the expected length " f"of {expected_len} bytes" ) # Single frame with matching length or with padding if whole_frames == 1: return self._process( src[:expected_len], plugin=encoding_plugin, **kwargs ) # Multiple frames if idx is not None: frame_offset = idx * expected_len return self._process( src[frame_offset:frame_offset + expected_len], plugin=encoding_plugin, **kwargs ) raise ValueError( "The frame 'idx' is required for multi-frame pixel data" ) def _encode_dataset( self, ds: "Dataset", idx: Optional[int] = None, encoding_plugin: str = '', decoding_plugin: str = '', **kwargs: Any, ) -> bytes: """Return a single encoded frame from the *Pixel Data* in `ds`.""" kwargs = {**self.kwargs_from_ds(ds), **kwargs} self._validate_encoding_profile(**kwargs) tsyntax = ds.file_meta.TransferSyntaxUID if not tsyntax.is_compressed: return self._encode_bytes( ds.PixelData, idx, encoding_plugin, **kwargs ) # Pixel Data is compressed raise ValueError( "The dataset must be decompressed and correct 'Transfer " "Syntax UID' and 'Photometric Interpretation' values set before " "attempting to compress" ) # Note that from this point on we require at least numpy be available # if decoding_plugin: # ds.convert_pixel_data(handler_name=decoding_plugin) # # arr = ds.pixel_array # # if kwargs['number_of_frames'] > 1 or len(arr.shape) == 4: # if idx is None: # raise ValueError( # "The frame 'idx' is required for multi-frame pixel data" # ) # # arr = arr[idx] # # src = self._preprocess(arr, **kwargs) # return self._process(src, encoding_plugin, **kwargs) @property def is_available(self) -> bool: """Return ``True`` if the encoder has plugins available that can be used to encode data, ``False`` otherwise. """ return bool(self._available) def iter_encode( self, src: Union[bytes, "numpy.ndarray", "Dataset"], encoding_plugin: str = '', decoding_plugin: str = '', **kwargs: Any, ) -> Iterator[bytes]: """Yield encoded frames of the pixel data in `src` as :class:`bytes`. 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, Samples) for single frame, multi-sample data. * (Frames, Rows, Columns) for multi-frame, single sample data. * (Frames, Rows, Columns, Samples) 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. Using ``bytes`` as the `src` will bypass some of the validation checks and is only recommended for advanced users. 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`. decoding_plugin : str, optional If `src` is a :class:`~pydicom.dataset.Dataset` containing compressed *Pixel Data* then this is the name of the :mod:`pixel data decoding handler`. If `decoding_plugin` is not specified then all available handlers will be tried (default). **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. """ from pydicom.dataset import Dataset if isinstance(src, Dataset): nr_frames = cast(Optional[str], src.get('NumberOfFrames', 1)) for idx in range(int(nr_frames or 1)): yield self._encode_dataset( src, idx, encoding_plugin, decoding_plugin, **kwargs ) elif isinstance(src, np.ndarray): for idx in range(kwargs.get('number_of_frames', 1)): yield self._encode_array(src, idx, encoding_plugin, **kwargs) elif isinstance(src, bytes): for idx in range(kwargs.get('number_of_frames', 1)): yield self._encode_bytes(src, idx, encoding_plugin, **kwargs) else: raise TypeError( "'src' must be bytes, numpy.ndarray or " f"pydicom.dataset.Dataset, not '{src.__class__.__name__}'" ) @staticmethod def kwargs_from_ds(ds: "Dataset") -> Dict[str, Union[int, str]]: """Return a *kwargs* dict from `ds`. Parameters ---------- ds : pydicom.dataset.Dataset The dataset to use as a source of keyword parameters. Returns ------- Dict[str, Union[int, str]] A dict with the following keys, with values from the corresponding dataset elements: * ``'rows'``: :class:`int` * ``'columns'``: :class:`int` * ``'samples_per_pixel'``: :class:`int` * ``'number_of_frames'``: :class:`int`, default ``1`` if not present * ``'bits_allocated'``: :class:`int` * ``'bits_stored'``: :class:`int` * ``'pixel_representation'``: :class:`int` * ``'photometric_interpretation'``: :class:`str` """ required = [ "Rows", "Columns", "SamplesPerPixel", "BitsAllocated", "BitsStored", "PixelRepresentation", "PhotometricInterpretation" ] missing = [f"'{kw}'" for kw in required if kw not in ds] if missing: raise AttributeError( "The following required elements are missing from the " f"dataset: {', '.join(missing)}" ) empty = [f"'{kw}'" for kw in required if ds[kw].VM == 0] if empty: raise AttributeError( "The following required dataset elements have a VM of 0: " f"{', '.join(empty)}" ) rows = cast(int, ds.Rows) # US columns = cast(int, ds.Columns) # US samples_per_pixel = cast(int, ds.SamplesPerPixel) # US bits_allocated = cast(int, ds.BitsAllocated) # US bits_stored = cast(int, ds.BitsStored) # US pixel_representation = cast(int, ds.PixelRepresentation) # US # CS photometric_interpretation = cast(str, ds.PhotometricInterpretation) # IS, may be missing, None or "1", "2", ... nr_frames = cast(Optional[str], ds.get('NumberOfFrames', 1)) return { 'rows': rows, 'columns': columns, 'samples_per_pixel': samples_per_pixel, 'number_of_frames': int(nr_frames or 1), 'bits_allocated': bits_allocated, 'bits_stored': bits_stored, 'pixel_representation': pixel_representation, 'photometric_interpretation': photometric_interpretation, } @property def missing_dependencies(self) -> List[str]: """Return nice strings for plugins with missing dependencies as List[str]. """ 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 @property def name(self) -> str: """Return the name of the encoder as :class:`str`.""" return f"{self.UID.keyword}Encoder" def _preprocess(self, arr: "numpy.ndarray", **kwargs: Any) -> bytes: """Preprocess `arr` before encoding to ensure it meets requirements. `arr` will be checked against the required keys in `kwargs` before being converted to little-endian ordered bytes. UID specific validation will also be performed to ensure `kwargs` meets the requirements of Section 8 of Part 5 of the DICOM Standard. Note that this pre-processing only occurs when an :class:`~numpy.ndarray` or :class:`~pydicom.dataset.Dataset` are passed to ``encode`` or ``iter_encode``. This is a deliberate decision to allow advanced users to bypass these restrictions by using :class:`bytes` as a `src`. Parameters ---------- arr : numpy.ndarray A single frame of uncompressed pixel data. Should be shaped as (Rows, Columns) or (Rows, Columns, Samples) or the corresponding 1D array. **kwargs Required parameters: * `rows`: int * `columns`: int * `samples_per_pixel`: int * `number_of_frames`: int * `bits_allocated`: int * `bits_stored`: int * `pixel_representation`: int Returns ------- bytes The pixel data in `arr` converted to little-endian ordered bytes. """ rows: int = kwargs['rows'] cols: int = kwargs['columns'] samples_per_pixel: int = kwargs['samples_per_pixel'] bits_allocated: int = kwargs['bits_allocated'] bytes_allocated = bits_allocated // 8 bits_stored: int = kwargs['bits_stored'] pixel_repr: int = kwargs['pixel_representation'] shape = arr.shape dims = len(shape) dtype = arr.dtype # Ensure *Samples per Pixel* value is supported if samples_per_pixel not in (1, 3): raise ValueError( "Unable to encode as a samples per pixel value of " f"{samples_per_pixel} is not supported (must be 1 or 3)" ) # Check shape/length of `arr` matches valid_shapes = { 1: (rows * cols * samples_per_pixel, ), 2: (rows, cols), 3: (rows, cols, samples_per_pixel), } if valid_shapes[dims] != shape: raise ValueError( f"Unable to encode as the shape of the ndarray {shape} " "doesn't match the values for the rows, columns and samples " "per pixel" ) if samples_per_pixel > 1 and dims == 2: raise ValueError( f"Unable to encode as the shape of the ndarray {shape} " "is not consistent with a samples per pixel value of 3" ) ui = [ np.issubdtype(dtype, np.unsignedinteger), np.issubdtype(dtype, np.signedinteger) ] if not any(ui): raise ValueError( f"Unable to encode as the ndarray's dtype '{dtype}' is " "not supported" ) # Check *Pixel Representation* is consistent with `arr` if not ui[pixel_repr]: s = ['unsigned', 'signed'][pixel_repr] raise ValueError( f"Unable to encode as the ndarray's dtype '{dtype}' is " f"not consistent with pixel representation '{pixel_repr}' " f"({s} int)" ) # Checks for *Bits Allocated* if bits_allocated % 8: raise ValueError( "Unable to encode as a bits allocated value of " f"{bits_allocated} is not supported (must be a multiple of 8)" ) if bytes_allocated != dtype.itemsize: raise ValueError( f"Unable to encode as the ndarray's dtype '{dtype}' is " "not consistent with a bits allocated value of " f"{bits_allocated}" ) if bits_allocated < bits_stored: raise ValueError( "Unable to encode as the bits stored value is greater than " "the bits allocated value" ) # UID specific validation based on Section 8 of Part 5 self._validate_encoding_profile(**kwargs) # Convert the array to 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 = dtype.byteorder byteorder = sys_endianness if byteorder == '=' else byteorder if byteorder == '>': arr = arr.astype(dtype.newbyteorder('<')) return cast(bytes, arr.tobytes()) def _process( self, src: bytes, plugin: str = '', **kwargs: Any, ) -> bytes: """Return an encoded frame from `src` as :class:`bytes`. Parameters ---------- src : bytes A single uncompressed frame of little-endian ordered pixel data. plugin : str, optional The name of the encoding plugin to use. If not specified then all available plugins will be tried. **kwargs Required parameters: * ``'rows'``: :class:`int` * ``'columns'``: :class:`int` * ``'number_of_frames'``: :class:`int` * ``'samples_per_pixel'``: :class:`int` * ``'bits_allocated'``: :class:`int` * ``'bits_stored'``: :class:`int` * ``'pixel_representation'``: :class:`int` * ``'photometric_interpretation'``: :class:`str` May also contain optional parameters for the encoding function. Returns ------ bytes The encoded pixel data frame. """ if not self.is_available: missing = "\n".join( [f" {s}" for s in self.missing_dependencies] ) raise RuntimeError( f"Unable to encode because the encoding plugins are missing " f"dependencies:\n{missing}" ) all_plugins = ( list(self._unavailable.keys()) + list(self._available.keys()) ) if plugin and plugin not in all_plugins: raise ValueError( f"No plugin named '{plugin}' has been added to the " f"'{self.name}'" ) if plugin and plugin in self._unavailable: deps = self._unavailable[plugin] missing = deps[0] if len(deps) > 1: missing = f"{', '.join(deps[:-1])} and {deps[-1]}" raise RuntimeError( f"Unable to encode with the '{plugin}' encoding plugin " f"because it's missing dependencies - requires {missing}" ) # Add our defaults, but don't override existing options kwargs = {**self._defaults, **kwargs} if plugin: # Try specific encoder try: return cast(bytes, self._available[plugin](src, **kwargs)) except Exception as exc: raise RuntimeError( "Unable to encode as an exception was raised by the " f"'{plugin}' plugin's encoding function" ) from exc # Try all available encoders failure_messages: List[str] = [] for name, func in self._available.items(): try: return cast(bytes, func(src, **kwargs)) except Exception as exc: failure_messages.append(f"{name}: {str(exc)}") messages = '\n '.join(failure_messages) raise RuntimeError( "Unable to encode as exceptions were raised by all the " f"available plugins:\n {messages}" ) def remove_plugin(self, label: str) -> None: """Remove a plugin from the encoder. 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 encoder's corresponding *Transfer Syntax UID* as :class:`~pydicom.uid.UID`. """ return self._uid def _validate_encoding_profile(self, **kwargs: Any) -> 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.UID not in ENCODING_PROFILES: return # Test each profile and see if it matches `kwargs` for (pi, spp, px_repr, bits_a, bits_s) in ENCODING_PROFILES[self.UID]: try: assert kwargs['photometric_interpretation'] == pi assert kwargs['samples_per_pixel'] == spp assert kwargs['pixel_representation'] in px_repr assert kwargs['bits_allocated'] in bits_a assert kwargs['bits_stored'] in bits_s except AssertionError as exc: continue return raise ValueError( "Unable to encode as one or more of 'photometric interpretation', " "'samples per pixel', 'bits allocated', 'bits stored' or " f"'pixel representation' is not valid for '{self.UID.name}'" ) # 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, )), ], JPEGLosslessP14: [ # 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_RCT", 3, (0, ), (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_plugin( 'gdcm', ('pydicom.encoders.gdcm', 'encode_pixel_data'), ) RLELosslessEncoder.add_plugin( 'pylibjpeg', ('pydicom.encoders.pylibjpeg', 'encode_pixel_data'), ) RLELosslessEncoder.add_plugin( 'pydicom', ('pydicom.encoders.native', '_encode_frame'), ) # Available pixel data encoders _PIXEL_DATA_ENCODERS = { # UID: (encoder, 'versionadded') RLELossless: (RLELosslessEncoder, '2.2'), } def _build_encoder_docstrings() -> None: """Override the default Encoder docstring.""" plugin_doc_links = { 'pydicom': ":ref:`pydicom `", 'pylibjpeg': ":ref:`pylibjpeg `", 'gdcm': ":ref:`gdcm `", } 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.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 | | +======================+========================+====================+ | *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-2.4.3/pydicom/encoders/gdcm.py000066400000000000000000000134151446675437500177470ustar00rootroot00000000000000"""Interface for *Pixel Data* encoding, not intended to be used directly.""" from typing import Any, cast from pydicom.uid import RLELossless try: import gdcm HAVE_GDCM = True except ImportError: HAVE_GDCM = False ENCODER_DEPENDENCIES = { RLELossless: ('gdcm', ), } 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: return False return uid in ENCODER_DEPENDENCIES def encode_pixel_data(src: bytes, **kwargs: Any) -> bytes: """Return the encoded image data in `src`. Parameters ---------- src : bytes The raw image frame data to be encoded. **kwargs Required parameters: * `rows`: int * `columns`: int * `samples_per_pixel`: int * `number_of_frames`: int * `bits_allocated`: int * `bits_stored`: int * `pixel_representation`: int * `byteorder`: str * `transfer_syntax_uid`: pydicom.uid.UID Returns ------- bytes The encoded image data. """ if kwargs['byteorder'] != '<': raise ValueError( "Unsupported option for the 'gdcm' encoding plugin: " f"\"byteorder = '{kwargs['byteorder']}'\"" ) return _ENCODERS[kwargs['transfer_syntax_uid']](src, **kwargs) def _rle_encode(src: bytes, **kwargs: Any) -> bytes: """Return RLE encoded image data from `src`. Parameters ---------- src : bytes The raw image frame data to be encoded. **kwargs Required parameters: * `rows`: int * `columns`: int * `samples_per_pixel`: int * `number_of_frames`: int * `bits_allocated`: int * `bits_stored`: int * `pixel_representation`: int * `photometric_interpretation`: str Returns ------- bytes The encoded image data. """ # Check the parameters are valid for RLE encoding with GDCM rows = kwargs['rows'] columns = kwargs['columns'] samples_per_pixel = kwargs['samples_per_pixel'] number_of_frames = kwargs['number_of_frames'] pixel_representation = kwargs['pixel_representation'] bits_allocated = kwargs['bits_allocated'] bits_stored = kwargs['bits_stored'] photometric_interpretation = kwargs['photometric_interpretation'] # Bug up to v3.0.9 (Apr 2021) in handling 32-bit, 3 sample/px data gdcm_version = [int(c) for c in gdcm.Version.GetVersion().split('.')] if gdcm_version < [3, 0, 10]: if bits_allocated == 32 and samples_per_pixel == 3: raise RuntimeError( "The 'gdcm' plugin is unable to RLE encode 32-bit, 3 " "samples/px data with GDCM v3.0.9 or older" ) if bits_allocated > 32: raise ValueError( f"The 'gdcm' plugin is unable to encode {bits_allocated}-bit data" ) # Create a gdcm.Image with the uncompressed `src` data pi = gdcm.PhotometricInterpretation.GetPIType( photometric_interpretation ) # GDCM's null photometric interpretation gets used for invalid values if pi == gdcm.PhotometricInterpretation.PI_END: raise ValueError( "An error occurred with the 'gdcm' plugin: invalid photometric " f"interpretation '{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((columns, rows, 1)) image.SetPhotometricInterpretation( gdcm.PhotometricInterpretation(pi) ) image.SetTransferSyntax(gdcm.TransferSyntax(ts)) pixel_format = gdcm.PixelFormat( samples_per_pixel, bits_allocated, bits_stored, bits_stored - 1, pixel_representation ) image.SetPixelFormat(pixel_format) if 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(kwargs['transfer_syntax_uid']) 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( "An error occurred with the 'gdcm' plugin: " "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( "An error occurred with the 'gdcm' plugin: 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-2.4.3/pydicom/encoders/native.py000066400000000000000000000123761446675437500203300ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. """Interface for *Pixel Data* encoding, not intended to be used directly.""" from itertools import groupby from struct import pack from typing import List, Any 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, **kwargs: Any) -> bytes: """Wrapper for use with the encoder interface. Parameters ---------- src : bytes A single frame of little-endian ordered image data to be RLE encoded. **kwargs Required parameters: * `rows`: int * `columns`: int * `samples_per_pixel`: int * `bits_allocated`: int Returns ------- bytes An RLE encoded frame. """ if kwargs.get('byteorder', '<') == '>': raise ValueError( "Unsupported option for the 'pydicom' encoding plugin: " f"\"byteorder = '{kwargs['byteorder']}'\"" ) samples_per_pixel = kwargs['samples_per_pixel'] bits_allocated = kwargs['bits_allocated'] bytes_allocated = bits_allocated // 8 nr_segments = bytes_allocated * 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 = [] for sample_nr in range(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], **kwargs) 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`. 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() row_length = kwargs['columns'] for idx in range(0, len(src), row_length): out.extend(_encode_row(src[idx:idx + row_length])) # 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('{}B'.format(len(out)), *out) pydicom-2.4.3/pydicom/encoders/pylibjpeg.py000066400000000000000000000021451446675437500210200ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. """Interface for *Pixel Data* encoding, not intended to be used directly.""" from typing import Any, cast from pydicom.uid import RLELossless try: from pylibjpeg.utils import get_pixel_data_encoders HAVE_PYLJ = True except ImportError: HAVE_PYLJ = False ENCODER_DEPENDENCIES = { RLELossless: ('numpy', 'pylibjpeg', 'pylibjpeg-rle'), } def encode_pixel_data(src: bytes, **kwargs: Any) -> bytes: """Return the encoded image data in `src`. Parameters ---------- src : bytes The raw image frame data to be encoded. **kwargs Parameters to pass to the encoder function. Returns ------- bytes The encoded image data. """ encoder = get_pixel_data_encoders()[kwargs['transfer_syntax_uid']] return cast(bytes, encoder(src, **kwargs)) def is_available(uid: str) -> bool: """Return ``True`` if a pixel data encoder for `uid` is available for use, ``False`` otherwise. """ if not HAVE_PYLJ: return False return uid in get_pixel_data_encoders() pydicom-2.4.3/pydicom/env_info.py000066400000000000000000000032621446675437500170350ustar00rootroot00000000000000# 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 Optional, Tuple, List, 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) -> Optional[str]: if module.__name__ == "gdcm": return cast(Optional[str], getattr(module, "GDCM_VERSION", None)) return cast(Optional[str], getattr(module, "__version__", None)) if __name__ == "__main__": main() pydicom-2.4.3/pydicom/errors.py000066400000000000000000000014031446675437500165410ustar00rootroot00000000000000# 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-2.4.3/pydicom/filebase.py000066400000000000000000000171621446675437500170100ustar00rootroot00000000000000# 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 from struct import unpack, pack from types import TracebackType from typing import ( Tuple, Optional, BinaryIO, Callable, Type, Union, cast, TextIO, TYPE_CHECKING, Any ) try: from typing import Protocol # added in 3.8 except ImportError: Protocol = object # type: ignore[assignment] from pydicom.tag import Tag, BaseTag, TagType # Customise the type hints for read() and seek() class Reader(Protocol): def __call__(self, size: int = -1) -> bytes: ... class Seeker(Protocol): def __call__(self, offset: int, whence: int = 0) -> int: ... class DicomIO: """File object which holds transfer syntax info and anything else we need. """ # number of times to read if don't get requested bytes max_read_attempts = 3 # default defer_size = None def __init__(self, *args: Any, **kwargs: Any) -> None: # start with this by default self._implicit_VR = True self.write: Callable[[bytes], int] self.parent_read: Reader self.seek: Seeker self.tell: Callable[[], int] def read_le_tag(self) -> Tuple[int, int]: """Read and return two unsigned shorts (little endian) from the file. """ bytes_read = self.read(4, need_exact_length=True) return cast(Tuple[int, int], unpack(b" Tuple[int, int]: """Read and return two unsigned shorts (big endian) from the file.""" bytes_read = self.read(4, need_exact_length=True) return cast(Tuple[int, int], unpack(b">HH", bytes_read)) def write_tag(self, tag: TagType) -> None: """Write a dicom tag (two unsigned shorts) to the file.""" # make sure is an instance of class, not just a tuple or int if not isinstance(tag, BaseTag): tag = Tag(tag) self.write_US(tag.group) self.write_US(tag.element) def read_leUS(self) -> int: """Return an unsigned short from the file with little endian byte order """ val: Tuple[int, ...] = unpack(b" int: """Return an unsigned short from the file with big endian byte order""" val: Tuple[int, ...] = unpack(b">H", self.read(2)) return val[0] def read_leUL(self) -> int: """Return an unsigned long read with little endian byte order""" val: Tuple[int, ...] = unpack(b" bytes: """Reads the required length, returns EOFError if gets less If length is ``None``, then read all bytes """ parent_read = self.parent_read # super(DicomIO, self).read if length is None: return parent_read() # get all of it bytes_read = parent_read(length) if len(bytes_read) < length and need_exact_length: # Didn't get all the desired bytes. Keep trying to get the rest. # If reading across network, might want to add a delay here attempts = 0 max_reads = self.max_read_attempts while attempts < max_reads and len(bytes_read) < length: bytes_read += parent_read(length - len(bytes_read)) attempts += 1 num_bytes = len(bytes_read) if num_bytes < length: start_pos = self.tell() - num_bytes msg = ( f"Unexpected end of file. Read {len(bytes_read)} bytes " f"of {length} expected starting at position " f"0x{start_pos:x}" ) raise EOFError(msg) return bytes_read def write_leUS(self, val: int) -> None: """Write an unsigned short with little endian byte order""" self.write(pack(b" None: """Write an unsigned long with little endian byte order""" self.write(pack(b" None: """Write an unsigned short with big endian byte order""" self.write(pack(b">H", val)) def write_beUL(self, val: int) -> None: """Write an unsigned long with big endian byte order""" self.write(pack(b">L", val)) write_US = write_leUS write_UL = write_leUL def read_beUL(self) -> int: """Return an unsigned long read with big endian byte order""" val: Tuple[int, ...] = unpack(b">L", self.read(4)) return val[0] # Set up properties is_little_endian and is_implicit_VR # Big/Little Endian changes functions to read unsigned # short or long, e.g. length fields etc @property def is_little_endian(self) -> bool: return self._little_endian @is_little_endian.setter def is_little_endian(self, value: bool) -> None: self._little_endian = value if value: # Little Endian self.read_US = self.read_leUS self.read_UL = self.read_leUL self.write_US = self.write_leUS # type: ignore[assignment] self.write_UL = self.write_leUL # type: ignore[assignment] self.read_tag = self.read_le_tag else: # Big Endian self.read_US = self.read_beUS self.read_UL = self.read_beUL self.write_US = self.write_beUS # type: ignore[assignment] self.write_UL = self.write_beUL # type: ignore[assignment] self.read_tag = self.read_be_tag @property def is_implicit_VR(self) -> bool: return self._implicit_VR @is_implicit_VR.setter def is_implicit_VR(self, value: bool) -> None: self._implicit_VR = value class DicomFileLike(DicomIO): def __init__( self, file_like_obj: Union[TextIO, BinaryIO, BytesIO], *args: Any, **kwargs: Any ) -> None: super().__init__(*args, **kwargs) self.parent = file_like_obj self.parent_read = getattr(file_like_obj, "read", self.no_read) self.write = getattr(file_like_obj, "write", self.no_write) self.seek = getattr(file_like_obj, "seek", self.no_seek) self.tell = file_like_obj.tell self.close = file_like_obj.close self.name: str = getattr(file_like_obj, 'name', '') def no_write(self, bytes_read: bytes) -> int: """Used for file-like objects where no write is available""" raise IOError("This DicomFileLike object has no write() method") def no_read(self, size: int = -1) -> bytes: """Used for file-like objects where no read is available""" raise IOError("This DicomFileLike object has no read() method") def no_seek(self, offset: int, whence: int = 0) -> int: """Used for file-like objects where no seek is available""" raise IOError("This DicomFileLike object has no seek() method") def __enter__(self) -> "DicomFileLike": return self def __exit__( self, *exc_info: Tuple[ Optional[Type[BaseException]], Optional[BaseException], Optional[TracebackType] ] ) -> None: self.close() def DicomFile(*args: Any, **kwargs: Any) -> DicomFileLike: return DicomFileLike(open(*args, **kwargs)) class DicomBytesIO(DicomFileLike): def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(BytesIO(*args, **kwargs)) def getvalue(self) -> bytes: self.parent = cast(BytesIO, self.parent) return self.parent.getvalue() pydicom-2.4.3/pydicom/filereader.py000066400000000000000000001271661446675437500173460ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. """Read a dicom media file""" # Need zlib and io.BytesIO for deflate-compressed file from io import BytesIO import os from struct import (Struct, unpack) import sys from typing import ( BinaryIO, Union, Optional, List, Any, Callable, cast, MutableSequence, Iterator, Dict, Type ) import warnings 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 from pydicom.dataelem import ( DataElement, RawDataElement, DataElement_from_raw, empty_value_for_VR ) from pydicom.dataset import Dataset, FileDataset, FileMetaDataset from pydicom.dicomdir import DicomDir from pydicom.errors import InvalidDicomError from pydicom.filebase import DicomFileLike from pydicom.fileutil import ( read_undefined_length_value, path_from_pathlike, PathType, _unpack_tag ) from pydicom.misc import size_in_bytes from pydicom.sequence import Sequence from pydicom.tag import ( ItemTag, SequenceDelimiterTag, TupleTag, Tag, BaseTag, TagListType ) import pydicom.uid from pydicom.util.hexutil import bytes2hex from pydicom.valuerep import EXPLICIT_VR_LENGTH_32, VR as VR_ def data_element_generator( fp: BinaryIO, is_implicit_VR: bool, is_little_endian: bool, stop_when: Optional[Callable[[BaseTag, Optional[str], int], bool]] = None, defer_size: Optional[Union[int, str, float]] = None, encoding: Union[str, MutableSequence[str]] = default_encoding, specific_tags: Optional[List[BaseTag]] = None ) -> Iterator[Union[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 : Union[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 if is_little_endian: endian_chr = "<" else: endian_chr = ">" # assign implicit VR struct to variable as use later if VR assumed missing implicit_VR_struct = Struct(endian_chr + "HHL") if is_implicit_VR: element_struct = implicit_VR_struct 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 logger_debug = logger.debug debugging = config.debugging element_struct_unpack = element_struct.unpack defer_size = size_in_bytes(defer_size) tag_set = {Tag(tag) for tag in specific_tags} if specific_tags else set() has_tag_set = bool(tag_set) if has_tag_set: tag_set.add(Tag(0x00080005)) # Specific Character Set while True: # VR: Optional[str] # 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 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 not (b'AA' <= vr <= b'ZZ') and config.assume_implicit_vr_switch: # invalid VR, must be 2 cap chrs, assume implicit and continue vr = None group, elem, length = implicit_VR_struct.unpack(bytes_read) else: 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) if debugging: debug_msg = "%-47s (%04x, %04x)" % (debug_msg, group, elem) 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 = TupleTag((group, elem)) if stop_when is not None: # XXX VR may be None here!! Should stop_when just take tag? if stop_when(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 != BaseTag(0x00080005)): # Flag as deferred by setting value to None, and skip bytes value = None 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( Optional[bytes], 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 == BaseTag(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(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(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(tag, vr, seq, value_tell, is_undefined_length=True) else: delimiter = SequenceDelimiterTag if debugging: logger_debug("Reading undefined length data element") value = read_undefined_length_value( fp, is_little_endian, delimiter, defer_size ) # tags with undefined length are skipped after read if has_tag_set and tag not in tag_set: continue yield RawDataElement(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: Optional[Callable[[BaseTag, Optional[str], int], bool]], 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) warnings.warn(msg + f" - using {found_vr} VR for reading", UserWarning) return found_implicit def read_dataset( fp: BinaryIO, is_implicit_VR: bool, is_little_endian: bool, bytelength: Optional[int] = None, stop_when: Optional[Callable[[BaseTag, Optional[str], int], bool]] = None, defer_size: Optional[Union[str, int, float]] = None, parent_encoding: Union[str, MutableSequence[str]] = default_encoding, specific_tags: Optional[List[BaseTag]] = 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 ItemDeliterTag, 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, Union[RawDataElement, DataElement]] = {} 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: while (bytelength is None) or (fp.tell() - fp_start < bytelength): raw_data_element = next(de_gen) # Read data elements. Stop on some errors, but return what was read tag = raw_data_element.tag # Check for ItemDelimiterTag --dataset is an item in a sequence if tag == BaseTag(0xFFFEE00D): break raw_data_elements[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", "") warnings.warn(msg, UserWarning) except NotImplementedError as details: logger.error(details) ds = Dataset(raw_data_elements) encoding: Union[str, MutableSequence[str]] if 0x00080005 in raw_data_elements: elem = cast(RawDataElement, raw_data_elements[BaseTag(0x00080005)]) char_set = cast( Optional[Union[str, MutableSequence[str]]], DataElement_from_raw(elem).value ) encoding = convert_encodings(char_set) # -> List[str] else: encoding = parent_encoding # -> Union[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: Union[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: Union[str, MutableSequence[str]], offset: int = 0 ) -> Optional[Dataset]: """Read and return a single :class:`~pydicom.sequence.Sequence` item, i.e. a :class:`~pydicom.dataset.Dataset`. """ seq_item_tell = fp.tell() + offset if is_little_endian: tag_length_format = " 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: Optional[str], length: int) -> bool: """Return True if the tag is not in group 0x0000, False otherwise.""" return tag.group != 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: Optional[str], length: int) -> bool: """Return True if the tag is not in group 0x0002, False otherwise.""" return tag.group != 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 ) ) 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 ) ) # 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) -> Optional[bytes]: """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: Optional[str], length: int) -> bool: return tag in {0x7fe00010, 0x7fe00009, 0x7fe00008} def read_partial( fileobj: BinaryIO, stop_when: Optional[Callable[[BaseTag, Optional[str], int], bool]] = None, defer_size: Optional[Union[int, str, float]] = None, force: bool = False, specific_tags: Optional[List[BaseTag]] = None ) -> Union[FileDataset, DicomDir]: """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 or dicomdir.DicomDir 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() # -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) fileobj = BytesIO(unzipped) # a file-like object is_implicit_VR = False 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) dataset.update(command_set) # (0002, 0002) Media Storage SOP Class UID elem = file_meta.get(0x00020002, None) sop_class = elem.value.name if (elem and elem.VM == 1) else "" if sop_class == "Media Storage Directory Storage": if "DirectoryRecordSequence" not in dataset: warnings.warn( "The SOP Class 'Media Storage Directory Storage' does" "not match the contents of the dataset - handling it" "as a regular dataset instead of a DICOMDIR." ) ds_class: Union[Type[FileDataset], Type[DicomDir]] = FileDataset else: warnings.warn( "The 'DicomDir' class is deprecated and will be removed in" " v3.0, after which 'dcmread()' will return a normal " "'FileDataset' instance for 'Media Storage Directory' " "SOP Instances.", DeprecationWarning ) ds_class = DicomDir else: ds_class = FileDataset ds = ds_class( 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: Union[PathType, BinaryIO, DicomFileLike], defer_size: Optional[Union[str, int, float]] = None, stop_before_pixels: bool = False, force: bool = False, specific_tags: Optional[TagListType] = None ) -> Union[FileDataset, DicomDir]: """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``. .. deprecated:: 2.2 Returning a :class:`~pydicom.dicomdir.DicomDir` is deprecated and will be removed in v3.0. Use :class:`~pydicom.fileset.FileSet` instead. 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 or PathLike or file-like Either a file-like object, a string containing the file name or the path to the file. The file-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 or DicomDir An instance of :class:`~pydicom.dataset.FileDataset` that represents a parsed DICOM file, unless the dataset is a *Media Storage Directory* instance in which case it will be a :class:`~pydicom.dicomdir.DicomDir`. 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("Reading file '{0}'".format(fp)) fp = open(fp, 'rb') elif fp is None or not hasattr(fp, "read") or not hasattr(fp, "seek"): raise TypeError("dcmread: Expected a file path or a file-like, " "but got " + type(fp).__name__) if config.debugging: logger.debug("\n" + "-" * 80) logger.debug("Call to dcmread()") msg = ("filename:'%s', defer_size='%s', " "stop_before_pixels=%s, force=%s, specific_tags=%s") logger.debug(msg % (fp.name, defer_size, stop_before_pixels, force, 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(Optional[List[BaseTag]], 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 __getattr__(name: str) -> Any: if name == 'read_file': warnings.warn( "'read_file' is deprecated and will be removed in v3.0, use " "'dcmread' instead", DeprecationWarning ) return globals()['dcmread'] raise AttributeError(f"module {__name__} has no attribute {name}") if sys.version_info[:2] < (3, 7): read_file = dcmread def read_dicomdir(filename: PathType = "DICOMDIR") -> DicomDir: """Read a DICOMDIR file and return a :class:`~pydicom.dicomdir.DicomDir`. This is a wrapper around :func:`dcmread` which gives a default file name. .. deprecated:: 2.1 ``read_dicomdir()`` is deprecated and will be removed in v3.0. Use :func:`~pydicom.filereader.dcmread` instead. Parameters ---------- filename : str, optional Full path and name to DICOMDIR file to open Returns ------- DicomDir Raises ------ InvalidDicomError Raised if filename is not a DICOMDIR file. """ warnings.warn( "'read_dicomdir()' is deprecated and will be removed in v3.0, use " "'dcmread()' instead", DeprecationWarning ) str_or_obj = path_from_pathlike(filename) ds = dcmread(str_or_obj) if not isinstance(ds, DicomDir): raise InvalidDicomError( f"File '{filename!r}' is not a Media Storage Directory file" ) return ds def data_element_offset_to_value( is_implicit_VR: bool, VR: Optional[str] ) -> 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: Union[PathType, BinaryIO], timestamp: Optional[float], 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 ------ IOError If `filename_or_obj` is ``None``. IOError 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. """ logger.debug("Reading deferred element %r" % str(raw_data_elem.tag)) # If it wasn't read from a file, then return an error if filename_or_obj is None: raise IOError( "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 IOError( 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: warnings.warn( "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 " f"{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-2.4.3/pydicom/fileset.py000066400000000000000000003077251446675437500167000ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. """DICOM File-set handling.""" import copy import os from pathlib import Path import re import shutil from tempfile import TemporaryDirectory from typing import ( Iterator, Optional, Union, Any, List, cast, Iterable, Dict, Callable ) import warnings 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.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: (36 ** (8 - `prefix`)) - `start` 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-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 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" 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: Optional[Dataset] = 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: Optional[FileInstance] = None self._parent: Optional["RecordNode"] = 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 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" 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()) @property def _file_id(self) -> Optional[Path]: """Return the *Referenced File ID* as a :class:`~pathlib.Path`. 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. """ if "ReferencedFileID" in self._record: elem = self._record["ReferencedFileID"] if elem.VM == 1: return Path(cast(str, self._record.ReferencedFileID)) if elem.VM > 1: return Path(*cast(List[str], self._record.ReferencedFileID)) return None 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 it's :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}{str(node)}") # Summarise 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}"] 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._flags = Flags() self._apply_stage('x') self._stage_path: Optional[Path] = 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'] / self.SOPInstanceUID ) 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: Union[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: Union[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 return os.fspath( cast(Path, self.file_set.path) / cast(Path, self.node._file_id) ) @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 = Union[Dataset, str, os.PathLike] class FileSet: """Representation of a DICOM File-set.""" def __init__(self, ds: Optional[DSPathType] = 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._path: Optional[Path] = 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: Optional[str] = None # The File-set UID self._uid: Optional[UID] = None # The File-set Descriptor File ID self._descriptor: Optional[str] = None # The Specific Character Set of File-set Descriptor File self._charset: Optional[str] = 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: Union[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, write_like_original=False) 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 dcmread, Dataset from pydicom.data import get_testdata_file from pydicom.fileset import FileSet, RecordNode from pydicom.uid import generate_uid # The instance to be added ds = dcmread(get_testdata_file("CT_small.dcm")) # 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: Union[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, write_like_original=False) return cast(FileInstance, instance) def clear(self) -> None: """Clear the File-set.""" self._tree.children = [] self._instances = [] self._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: Union[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) > 36**6: raise NotImplementedError( "pydicom doesn't support writing File-sets with more than " "2176782336 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) -> Union[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: Union[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) -> Union[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: Union[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: Union[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 = [] for instance in self: if match(instance, **kwargs): matches.append(instance) if not load and not has_elements: warnings.warn( "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: Union[str, int, List[Union[str, int]]], instances: Optional[List[FileInstance]] = None, load: bool = False ) -> Union[List[Any], Dict[Union[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[Union[str, int], List[Any]] = { element: [] for element in element_list } iter_instances = instances or iter(self) instance: Union[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: warnings.warn( "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) -> Union[str, None]: """Return the *File-set ID* (if available) or ``None``.""" return self._id @ID.setter def ID(self, val: Union[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: warnings.warn( "The DICOMDIR dataset uses an invalid transfer syntax " f"'{tsyntax.name}' and will be updated to use 'Explicit VR " "Little Endian'" ) try: path = Path(cast(str, 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(Optional[str], ds.get("FileSetID", None)) uid = cast( Optional[UID], ds.file_meta.get("MediaStorageSOPInstanceUID") ) if not uid: uid = generate_uid() ds.file_meta.MediaStorageSOPInstanceUID = uid self._uid = uid self._descriptor = cast( Optional[str], ds.get("FileSetDescriptorFileID", None) ) self._charset = cast( Optional[str], ds.get("SpecificCharacterSetOfFileSetDescriptorFile", None) ) self._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 = instance.node._file_id if file_id is None: bad_instances.append(instance) continue try: # self.path is already set at this point (cast(Path, self.path) / file_id).resolve(strict=True) except FileNotFoundError: bad_instances.append(instance) warnings.warn( "The referenced SOP Instance for the directory record at " f"offset {instance.node._offset} does not exist: " f"{cast(Path, self.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 _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: 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: warnings.warn( 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 file_id = node._file_id if file_id is None: continue # self.path is set for an existing File Set path = cast(Path, self.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 path(self) -> Optional[str]: """Return the absolute path to the File-set root directory as :class:`str` (if set) or ``None`` otherwise. """ if self._path is not None: return os.fspath(self._path) return self._path 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}' " "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" ) 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}' " "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" ) 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: Union[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: Optional[Union[str, os.PathLike]] = 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._path = Path(path) # Don't write unless changed or new if not self.is_staged: return # Path to the DICOMDIR file p = cast(Path, self._path) / '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) > 36**6: raise NotImplementedError( "pydicom doesn't support writing File-sets with more than " "2176782336 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 = { ii.node._file_id for ii in self if ii.SOPInstanceUID not in self._stage['+'] } collisions = fout & fin for instance in [ii for ii in self if ii.node._file_id in collisions]: self._stage['+'][instance.SOPInstanceUID] = instance instance._apply_stage('+') shutil.copyfile( self._path / instance.node._file_id, instance.path ) for instance in self: dst = self._path / instance.FileID dst.parent.mkdir(parents=True, exist_ok=True) fn: Callable if instance.SOPInstanceUID in self._stage['+']: src = instance.path fn = shutil.copyfile else: src = self._path / instance.node._file_id 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(Optional[UID], 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(Optional[UID], getattr(ds, "SOPClassUID", None)) try: return _FOUR_LEVEL_SOP_CLASSES[sop_class] # type: ignore[index] except KeyError: return "IMAGE" pydicom-2.4.3/pydicom/fileutil.py000066400000000000000000000344411446675437500170520ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. """Functions for reading to certain bytes, e.g. delimiters.""" import os from struct import pack, unpack from typing import Union, BinaryIO, Optional, Tuple, 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 DicomFileLike from pydicom.config import logger PathType = Union[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 = " Optional[int]: """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: Optional[Union[int, float]] = None, read_size: int = 1024 * 8 ) -> Optional[bytes]: """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("End of file reached before delimiter {0!r} found". format(delimiter_tag)) 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: Optional[Union[float, int]] = None, ) -> Tuple[bool, Optional[bytes]]: """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 ) -> Optional[int]: """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 = " Optional[int]: """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: Union[PathType, BinaryIO, DicomFileLike] ) -> Union[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))) pydicom-2.4.3/pydicom/filewriter.py000066400000000000000000001263151446675437500174130ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. """Functions related to writing DICOM data.""" from struct import pack import sys from typing import ( Union, BinaryIO, Any, cast, Sequence, MutableSequence, Iterable, Optional, List ) import warnings import zlib from pydicom import config from pydicom.charset import default_encoding, convert_encodings, encode_string from pydicom.config import have_numpy from pydicom.dataelem import DataElement_from_raw, DataElement, RawDataElement from pydicom.dataset import Dataset, validate_file_meta, FileMetaDataset from pydicom.filebase import DicomFile, DicomFileLike, DicomBytesIO, DicomIO from pydicom.fileutil import path_from_pathlike, PathType from pydicom.multival import MultiValue from pydicom.tag import (Tag, ItemTag, ItemDelimiterTag, SequenceDelimiterTag, tag_in_exception) from pydicom.uid import DeflatedExplicitVRLittleEndian, UID from pydicom.valuerep import ( PersonName, IS, DSclass, DA, DT, TM, EXPLICIT_VR_LENGTH_32, VR, AMBIGUOUS_VR, CUSTOMIZABLE_CHARSET_VR, validate_value ) from pydicom.values import convert_numbers if have_numpy: import numpy # (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 _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 _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, ds: Dataset, is_little_endian: bool ) -> DataElement: """Implementation for `correct_ambiguous_vr_element`. See `correct_ambiguous_vr_element` for description. """ # '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.is_implicit_VR: # 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 _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 while ( 'PixelRepresentation' not in ds and ds.parent_seq is not None and ds.parent_seq().parent_dataset is not None # type: ignore[union-attr] and ds.parent_seq().parent_dataset() # type: ignore ): # Make weakrefs into strong refs (locally here) by calling () them ds = ds.parent_seq().parent_dataset() # type: ignore # if no pixel data is present, none if these tags is used, # so we can just ignore a missing PixelRepresentation in this case if ( 'PixelRepresentation' not in ds and 'PixelData' not in ds or ds.PixelRepresentation == 0 ): elem.VR = VR.US byte_type = 'H' else: elem.VR = VR.SS byte_type = '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 _ob_ow_tags: # If WaveformBitsAllocated is > 8 then OW, otherwise may be # OB or OW. # See PS3.3 C.10.9.1. if ds.is_implicit_VR: 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, ds: Dataset, is_little_endian: bool ) -> DataElement: """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. Parameters ---------- elem : dataelem.DataElement 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. Returns ------- dataelem.DataElement The corrected element """ if elem.VR in AMBIGUOUS_VR: # convert raw data elements before handling them if isinstance(elem, RawDataElement): elem = DataElement_from_raw(elem, dataset=ds) ds.__setitem__(elem.tag, elem) try: _correct_ambiguous_vr_element(elem, ds, is_little_endian) except AttributeError as e: raise AttributeError( f"Failed to resolve ambiguous VR for tag {elem.tag}: " + str(e) ) return elem def correct_ambiguous_vr(ds: Dataset, is_little_endian: bool) -> 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. Parameters ---------- ds : pydicom.dataset.Dataset The dataset containing ambiguous VR elements. is_little_endian : bool The byte ordering of the values in the dataset. Returns ------- ds : dataset.Dataset The corrected dataset Raises ------ AttributeError If a tag is missing in `ds` that is required to resolve the ambiguity. """ # Iterate through the elements for elem in ds: # 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: for item in cast(MutableSequence[Dataset], elem.value): correct_ambiguous_vr(item, is_little_endian) elif elem.VR in AMBIGUOUS_VR: correct_ambiguous_vr_element(elem, ds, is_little_endian) 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. """ endianChar = '><'[fp.is_little_endian] value = elem.value if value is None or value == "": return # don't need to write anything for no or empty value 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: for val in cast(Iterable[Any], value): fp.write(pack(format_string, val)) except Exception as e: raise IOError( f"{str(e)}\nfor data_element:\n{str(elem)}" ) def write_OBvalue(fp: DicomIO, elem: DataElement) -> None: """Write a data_element with VR of 'other byte' (OB).""" if len(elem.value) % 2: # Pad odd length values fp.write(cast(bytes, elem.value)) fp.write(b'\x00') else: fp.write(cast(bytes, elem.value)) 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. """ # XXX for now just write the raw bytes without endian swapping fp.write(cast(bytes, elem.value)) 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 have_numpy and isinstance(val, numpy.ndarray): return True return isinstance(val, (MultiValue, list, tuple)) def multi_string(val: Union[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: Optional[List[str]] = 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(Union[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: Optional[List[str]] = 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(Union[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(Union[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(Union[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(Union[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: Optional[DA]) -> 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: Optional[DT]) -> 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: Optional[TM]) -> 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: Union[DataElement, RawDataElement], encodings: Optional[Union[str, List[str]]] = 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: Optional[str] = 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 {repr(elem.tag)}.\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] else: 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: encap_item = b'\xfe\xff\x00\xe0' if not fp.is_little_endian: # Non-conformant endianness encap_item = b'\xff\xfe\xe0\x00' if not cast(bytes, elem.value).startswith(encap_item): raise ValueError( "(7FE0,0010) Pixel Data has an undefined length indicating " "that it's compressed, but the data isn't encapsulated as " "required. See pydicom.encaps.encapsulate() for more " "information" ) value_length = buffer.tell() 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 msg = ( 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." ) warnings.warn(msg) 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) fp.write(buffer.getvalue()) if is_undefined_length: fp.write_tag(SequenceDelimiterTag) fp.write_UL(0) # 4-byte 'length' of delimiter data item def write_dataset( fp: DicomIO, dataset: Dataset, parent_encoding: Union[str, List[str]] = default_encoding ) -> int: """Write a Dataset dictionary to the file. Return the total length written. """ _harmonize_properties(dataset, fp) if None in (dataset.is_little_endian, dataset.is_implicit_VR): name = dataset.__class__.__name__ raise AttributeError( f"'{name}.is_little_endian' and '{name}.is_implicit_VR' must " f"be set appropriately before saving" ) if not dataset.is_original_encoding: dataset = correct_ambiguous_vr(dataset, fp.is_little_endian) dataset_encoding = cast( Union[None, str, List[str]], dataset.get('SpecificCharacterSet', parent_encoding) ) fpStart = fp.tell() # data_elements must be written in tag order tags = sorted(dataset.keys()) for tag in tags: # 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, dataset.get_item(tag), dataset_encoding) return fp.tell() - fpStart def _harmonize_properties(ds: Dataset, fp: DicomIO) -> None: """Make sure the properties in the dataset and the file pointer are consistent, so the user can set both with the same effect. Properties set on the destination file object always have preference. """ # ensure preference of fp over dataset if hasattr(fp, 'is_little_endian'): ds.is_little_endian = fp.is_little_endian if hasattr(fp, 'is_implicit_VR'): ds.is_implicit_VR = fp.is_implicit_VR # write the properties back to have a consistent state fp.is_implicit_VR = cast(bool, ds.is_implicit_VR) fp.is_little_endian = cast(bool, ds.is_little_endian) 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 _write_dataset( fp: DicomIO, dataset: Dataset, write_like_original: bool ) -> None: """Write the Data Set to a file-like. Assumes the file meta information, if any, has been written. """ # if we want to write with the same endianness and VR handling as # the read dataset we want to preserve raw data elements for # performance reasons (which is done by get_item); # otherwise we use the default converting item getter if dataset.is_original_encoding: get_item = Dataset.get_item else: get_item = Dataset.__getitem__ # type: ignore[assignment] # WRITE DATASET # The transfer syntax used to encode the dataset can't be changed # within the dataset. # Write any Command Set elements now as elements must be in tag order # Mixing Command Set with other elements is non-conformant so we # require `write_like_original` to be True command_set = get_item(dataset, slice(0x00000000, 0x00010000)) if command_set and write_like_original: fp.is_implicit_VR = True fp.is_little_endian = True write_dataset(fp, command_set) # Set file VR and endianness. MUST BE AFTER writing META INFO (which # requires Explicit VR Little Endian) and COMMAND SET (which requires # Implicit VR Little Endian) fp.is_implicit_VR = cast(bool, dataset.is_implicit_VR) fp.is_little_endian = cast(bool, dataset.is_little_endian) # Write non-Command Set elements now write_dataset(fp, get_item(dataset, slice(0x00010000, None))) def dcmwrite( filename: Union[PathType, BinaryIO], dataset: Dataset, write_like_original: bool = True ) -> None: """Write `dataset` to the `filename` specified. If `write_like_original` is ``True`` then the :class:`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). If `write_like_original` is ``False``, `dataset` will be stored in the :dcm:`DICOM File Format `. To do so requires that the ``Dataset.file_meta`` attribute exists and contains a :class:`Dataset` with the required (Type 1) *File Meta Information Group* elements. The byte stream of the `dataset` will be placed into the file after the DICOM *File Meta Information*. **File Meta Information** The *File Meta Information* consists of a 128-byte preamble, followed by a 4 byte ``b'DICM'`` prefix, followed by the *File Meta Information Group* elements. **Preamble and Prefix** The ``dataset.preamble`` attribute shall be 128-bytes long or ``None`` and is available for use as defined by the Application Profile or specific implementations. If the preamble is not used by an Application Profile or specific implementation then all 128 bytes should be set to ``0x00``. The actual preamble written depends on `write_like_original` and ``dataset.preamble`` (see the table below). +------------------+------------------------------+ | | write_like_original | +------------------+-------------+----------------+ | dataset.preamble | True | False | +==================+=============+================+ | 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 `write_like_original` is ``True`` then the *File Meta Information Group* elements are all optional. See :func:`~pydicom.filewriter.write_file_meta_info` for more information on which elements are required. The *File Meta Information Group* elements should be included within their own :class:`~pydicom.dataset.Dataset` in the ``dataset.file_meta`` attribute. If (0002,0010) *Transfer Syntax UID* is included then the user must ensure its value is compatible with the values for the ``dataset.is_little_endian`` and ``dataset.is_implicit_VR`` attributes. For example, if ``is_little_endian`` and ``is_implicit_VR`` are both ``True`` then the Transfer Syntax UID must be 1.2.840.10008.1.2 *Implicit VR Little Endian*. See the DICOM Standard, Part 5, :dcm:`Section 10` for more information on Transfer Syntaxes. *Encoding* The preamble and prefix are encoding independent. The File Meta 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. It is up to the user to ensure the `dataset` conforms to the DICOM Standard. *Encoding* The `dataset` is encoded as specified by the ``dataset.is_little_endian`` and ``dataset.is_implicit_VR`` attributes. It's up to the user to ensure these attributes are set correctly (as well as setting an appropriate value for ``dataset.file_meta.TransferSyntaxUID`` if present). Parameters ---------- filename : str or PathLike or file-like Name of file or the file-like to write the new DICOM file to. dataset : pydicom.dataset.FileDataset Dataset holding the DICOM information; e.g. an object read with :func:`~pydicom.filereader.dcmread`. write_like_original : bool, optional If ``True`` (default), preserves the following information from the Dataset (and may result in a non-conformant file): - preamble -- if the original file has no preamble then none will be written. - file_meta -- if the original file was missing any required *File Meta Information Group* elements then they will not be added or written. If (0002,0000) *File Meta Information Group Length* is present then it may have its value updated. - seq.is_undefined_length -- if original had delimiters, write them now too, instead of the more sensible length characters - is_undefined_length_sequence_item -- for datasets that belong to a sequence, write the undefined length delimiters if that is what the original had. If ``False``, produces a file conformant with the DICOM File Format, with explicit lengths for all elements. Raises ------ AttributeError If either ``dataset.is_implicit_VR`` or ``dataset.is_little_endian`` have not been set. ValueError If group 2 elements are in ``dataset`` rather than ``dataset.file_meta``, or if a preamble is given but is not 128 bytes long, or if Transfer Syntax is a compressed type and pixel data is not compressed. See Also -------- pydicom.dataset.Dataset Dataset class with relevant attributes and information. pydicom.dataset.Dataset.save_as Write a DICOM file from a dataset that was read in with ``dcmread()``. ``save_as()`` wraps ``dcmwrite()``. """ tsyntax: Optional[UID] try: tsyntax = dataset.file_meta.TransferSyntaxUID except AttributeError: tsyntax = None cls_name = dataset.__class__.__name__ encoding = (dataset.is_implicit_VR, dataset.is_little_endian) # Ensure is_little_endian and is_implicit_VR are set if None in encoding: if tsyntax is None: raise AttributeError( f"'{cls_name}.is_little_endian' and " f"'{cls_name}.is_implicit_VR' must be set appropriately " "before saving" ) if not tsyntax.is_private: dataset.is_little_endian = tsyntax.is_little_endian dataset.is_implicit_VR = tsyntax.is_implicit_VR if tsyntax and not tsyntax.is_private: # 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 # PS3.5 Annex A.4 - encapsulated datasets use Explicit VR Little if tsyntax.is_compressed and encoding != (False, True): warnings.warn( "All encapsulated (compressed) transfer syntaxes must use " "explicit VR little endian encoding for the dataset. Set " f"'{cls_name}.is_little_endian = True' and '{cls_name}." "is_implicit_VR = False' before saving" ) # Check that dataset's group 0x0002 elements are only present in the # `dataset.file_meta` Dataset - user may have added them to the wrong # place if dataset.group_dataset(0x0002) != Dataset(): raise ValueError( f"File Meta Information Group Elements (0002,eeee) should be in " f"their own Dataset object in the " f"'{dataset.__class__.__name__}.file_meta' attribute." ) # A preamble is required under the DICOM standard, however if # `write_like_original` is True we treat it as optional preamble = getattr(dataset, 'preamble', None) if preamble and len(preamble) != 128: raise ValueError( f"'{dataset.__class__.__name__}.preamble' must be 128-bytes long." ) if not preamble and not write_like_original: # The default preamble is 128 0x00 bytes. preamble = b'\x00' * 128 # File Meta Information is required under the DICOM standard, however if # `write_like_original` is True we treat it as optional if not write_like_original: # the checks will be done in write_file_meta_info() dataset.fix_meta_info(enforce_standard=False) else: dataset.ensure_file_meta() # Check for decompression, give warnings if inconsistencies # If decompressed, then pixel_array is now used instead of PixelData if dataset.is_decompressed: if dataset.file_meta.TransferSyntaxUID.is_compressed: raise ValueError( f"The Transfer Syntax UID element in " f"'{dataset.__class__.__name__}.file_meta' is compressed " f"but the pixel data has been decompressed" ) # Force PixelData to the decompressed version dataset.PixelData = dataset.pixel_array.tobytes() caller_owns_file = True # Open file if not already a file object filename = path_from_pathlike(filename) if isinstance(filename, str): fp = DicomFile(filename, 'wb') # caller provided a file name; we own the file handle caller_owns_file = False else: try: fp = DicomFileLike(filename) except AttributeError: raise TypeError("dcmwrite: Expected a file path or a file-like, " "but got " + type(filename).__name__) try: # WRITE FILE META INFORMATION if preamble: # Write the 'DICM' prefix if and only if we write the preamble fp.write(preamble) fp.write(b'DICM') tsyntax = None if dataset.file_meta: # May be an empty Dataset # If we want to `write_like_original`, don't enforce_standard write_file_meta_info( fp, dataset.file_meta, enforce_standard=not write_like_original ) tsyntax = cast(UID, getattr( dataset.file_meta, "TransferSyntaxUID", None)) if tsyntax == DeflatedExplicitVRLittleEndian: # See PS3.5 section A.5 # when writing, the entire dataset following # the file metadata is prepared the normal way, # then "deflate" compression applied. buffer = DicomBytesIO() _write_dataset(buffer, dataset, write_like_original) # Compress the encoded data and write to file compressor = zlib.compressobj(wbits=-zlib.MAX_WBITS) deflated = compressor.compress( buffer.parent.getvalue() # type: ignore[union-attr] ) deflated += compressor.flush() if len(deflated) % 2: deflated += b'\x00' fp.write(deflated) else: _write_dataset(fp, dataset, write_like_original) finally: if not caller_owns_file: fp.close() def __getattr__(name: str) -> Any: if name == 'write_file': warnings.warn( "'write_file' is deprecated and will be removed in v3.0, use " "'dcmwrite' instead", DeprecationWarning ) return globals()['dcmwrite'] raise AttributeError(f"module {__name__} has no attribute {name}") if sys.version_info[:2] < (3, 7): write_file = dcmwrite # 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-2.4.3/pydicom/jsonrep.py000066400000000000000000000277341446675437500167240ustar00rootroot00000000000000# 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 ( Callable, Optional, Union, Any, cast, Type, Dict, TYPE_CHECKING, List ) import warnings 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. .. versionadded:: 1.4 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: Optional[Union[Type[int], Type[float]]] = 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 = Union[None, str, int, float] PNValueType = Union[None, str, Dict[str, str]] SQValueType = Optional[Dict[str, Any]] # Recursive ValueType = Union[PNValueType, SQValueType, OtherValueType] InlineBinaryType = Union[str, List[str]] BulkDataURIType = Union[str, List[str]] JSONValueType = Union[List[ValueType], InlineBinaryType, BulkDataURIType] BulkDataType = Union[None, str, int, float, bytes] BulkDataHandlerType = Optional[Callable[[str, str, str], BulkDataType]] class JsonDataElementConverter: """Convert from a JSON struct to a :class:`DataElement`. .. versionadded:: 1.4 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: Optional[str], bulk_data_uri_handler: Optional[ Union[BulkDataHandlerType, Callable[[str], BulkDataType]] ] = 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[Union[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(Union[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: warnings.warn( '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: warnings.warn( 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: Union[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. warnings.warn( 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-2.4.3/pydicom/misc.py000066400000000000000000000031541446675437500161650ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Miscellaneous helper functions""" from itertools import groupby from pathlib import Path from typing import Optional, Union _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: Optional[Union[int, float, str]] ) -> Union[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: Union[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" pydicom-2.4.3/pydicom/multival.py000066400000000000000000000120241446675437500170630ustar00rootroot00000000000000# 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 ( Iterable, Union, List, overload, Callable, Any, cast, TypeVar, MutableSequence, Iterator ) from pydicom import config _T = TypeVar("_T") _ItemType = TypeVar("_ItemType") class MultiValue(MutableSequence[_ItemType]): """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[[_T], _ItemType], iterable: Iterable[_T], validation_mode: int = None ) -> 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`. """ from pydicom.valuerep import DSfloat, DSdecimal, IS def DS_IS_constructor(x: _T) -> _ItemType: return ( # type: ignore[no-any-return] self.type_constructor( # type: ignore[has-type] x, validation_mode=validation_mode) if x != '' else cast(_ItemType, x) ) if validation_mode is None: validation_mode = config.settings.reading_validation_mode self._list: List[_ItemType] = list() self.type_constructor = type_constructor if type_constructor in (DSfloat, IS, DSdecimal): type_constructor = DS_IS_constructor for x in iterable: self._list.append(type_constructor(x)) def append(self, val: _T) -> None: self._list.append(self.type_constructor(val)) def __delitem__(self, index: Union[slice, int]) -> None: del self._list[index] def extend(self, val: Iterable[_T]) -> None: """Extend the :class:`~pydicom.multival.MultiValue` using an iterable of objects. """ self._list.extend([self.type_constructor(x) for x in val]) def __iadd__( # type: ignore[override] self, other: Iterable[_T] ) -> MutableSequence[_ItemType]: """Implement MultiValue() += Iterable[Any].""" self._list += [self.type_constructor(x) for x in other] return self def __eq__(self, other: Any) -> Any: return self._list == other @overload def __getitem__(self, index: int) -> _ItemType: pass # pragma: no cover @overload def __getitem__(self, index: slice) -> MutableSequence[_ItemType]: pass # pragma: no cover def __getitem__( self, index: Union[slice, int] ) -> Union[MutableSequence[_ItemType], _ItemType]: return self._list[index] def insert(self, position: int, val: _T) -> None: self._list.insert(position, self.type_constructor(val)) def __iter__(self) -> Iterator[_ItemType]: yield from self._list def __len__(self) -> int: return len(self._list) def __ne__(self, other: Any) -> Any: 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__( # type: ignore[misc] self, idx: Union[int, slice], val: Union[_T, Iterable[_T]] ) -> None: """Set an item of the list, making sure it is of the right VR type""" if isinstance(idx, slice): val = cast(Iterable[_T], val) out = [self.type_constructor(v) for v in val] self._list.__setitem__(idx, out) else: val = cast(_T, val) self._list.__setitem__(idx, self.type_constructor(val)) 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-2.4.3/pydicom/overlay_data_handlers/000077500000000000000000000000001446675437500212075ustar00rootroot00000000000000pydicom-2.4.3/pydicom/overlay_data_handlers/__init__.py000066400000000000000000000001541446675437500233200ustar00rootroot00000000000000 import sys import pydicom.overlays.numpy_handler as _np_handler globals()['numpy_handler'] = _np_handler pydicom-2.4.3/pydicom/overlays/000077500000000000000000000000001446675437500165215ustar00rootroot00000000000000pydicom-2.4.3/pydicom/overlays/__init__.py000066400000000000000000000000751446675437500206340ustar00rootroot00000000000000from pydicom.overlays.numpy_handler import get_overlay_array pydicom-2.4.3/pydicom/overlays/numpy_handler.py000066400000000000000000000233371446675437500217500ustar00rootroot00000000000000# 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, Dict, Any, Optional import warnings try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False from pydicom.pixel_data_handlers 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': ('http://www.numpy.org/', 'NumPy')} def is_available() -> bool: """Return ``True`` if the handler has its dependencies met. .. versionadded:: 1.4 """ 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*. .. versionadded:: 1.4 +------------------------------------------------+-------------+ | 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`. .. versionadded:: 1.4 +------------------------------------------------+--------------+ | 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*. .. versionadded:: 1.4 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: Optional["DataElement"] = 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: warnings.warn( "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 warnings.warn( 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-2.4.3/pydicom/pixel_data_handlers/000077500000000000000000000000001446675437500206475ustar00rootroot00000000000000pydicom-2.4.3/pydicom/pixel_data_handlers/__init__.py000066400000000000000000000004061446675437500227600ustar00rootroot00000000000000 from pydicom.pixel_data_handlers.util import ( apply_color_lut, apply_modality_lut, apply_voi_lut, convert_color_space, apply_voi, apply_windowing, pack_bits, unpack_bits, expand_ybr422, ) apply_rescale = apply_modality_lut pydicom-2.4.3/pydicom/pixel_data_handlers/gdcm_handler.py000066400000000000000000000230411446675437500236300ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Use the `GDCM `_ Python package to decode pixel transfer syntaxes. """ import os from tempfile import NamedTemporaryFile from typing import TYPE_CHECKING, cast if TYPE_CHECKING: # pragma: no cover from pydicom.dataset import Dataset, FileMetaDataset, FileDataset 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_pixel_data import pydicom.uid from pydicom.uid import UID, JPEG2000, JPEG2000Lossless from pydicom.pixel_data_handlers.util import ( get_expected_length, pixel_dtype, get_j2k_parameters ) HANDLER_NAME = 'GDCM' DEPENDENCIES = { 'numpy': ('http://www.numpy.org/', 'NumPy'), 'gdcm': ('http://gdcm.sourceforge.net/wiki/index.php/Main_Page', 'GDCM'), } SUPPORTED_TRANSFER_SYNTAXES = [ pydicom.uid.JPEGBaseline8Bit, pydicom.uid.JPEGExtended12Bit, pydicom.uid.JPEGLosslessP14, 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: if getattr(ds, 'NumberOfFrames', 1) > 1: pixel_data_sequence = ( pydicom.encaps.decode_data_sequence(ds.PixelData) ) else: pixel_data_sequence = [ pydicom.encaps.defragment_data(ds.PixelData) ] fragments = gdcm.SequenceOfFragments.New() for pixel_data in pixel_data_sequence: fragment = gdcm.Fragment() fragment.SetByteStringValue(pixel_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 = getattr(ds, 'NumberOfFrames', 1) 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 = getattr(ds, 'NumberOfFrames', 1) codestream = next(generate_pixel_data(ds.PixelData, nr_frames))[0] 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 pixel_module = 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-2.4.3/pydicom/pixel_data_handlers/jpeg_ls_handler.py000066400000000000000000000065041446675437500243460ustar00rootroot00000000000000# 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 decode_data_sequence, defragment_data from pydicom.pixel_data_handlers.util import pixel_dtype import pydicom.uid if TYPE_CHECKING: # pragma: no cover from pydicom.dataset import Dataset HANDLER_NAME = 'JPEG-LS' DEPENDENCIES = { 'numpy': ('http://www.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 = getattr(ds, "NumberOfFrames", 1) or 1 if nr_frames > 1: for src in decode_data_sequence(ds.PixelData): frame = jpeg_ls.decode(numpy.frombuffer(src, dtype='u1')) pixel_bytes.extend(frame.tobytes()) else: src = defragment_data(ds.PixelData) frame = jpeg_ls.decode(numpy.frombuffer(src, dtype='u1')) pixel_bytes.extend(frame.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-2.4.3/pydicom/pixel_data_handlers/numpy_handler.py000066400000000000000000000277741446675437500241070ustar00rootroot00000000000000# 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 import warnings try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False from pydicom.pixel_data_handlers.util import ( pixel_dtype, get_expected_length, pack_bits, unpack_bits ) import pydicom.uid if TYPE_CHECKING: # pragma: no cover from pydicom.dataset import Dataset HANDLER_NAME = 'Numpy' DEPENDENCIES = { 'numpy': ('http://www.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. .. versionchanged:: 1.4 * Added support for uncompressed pixel data with a *Photometric Interpretation* of ``YBR_FULL_422``. * Added support for *Float Pixel Data* and *Double Float 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: warnings.warn( "The odd length pixel data is missing a trailing padding byte" ) else: raise ValueError( "The length of the pixel data in the dataset ({} bytes) " "doesn't match the expected length ({} bytes). " "The dataset may be corrupted or there may be an issue " "with the pixel data handler." .format(actual_length, padded_expected_len) ) elif actual_length > padded_expected_len: # PS 3.5, Section 8.1.1 msg = ( "The length of the pixel data in the dataset ({} bytes) indicates " "it contains excess padding. {} bytes will be removed from the " "end of the data" .format(actual_length, actual_length - expected_len) ) # 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 " "({} bytes) is a third larger than expected ({} bytes) " "which indicates that this may be incorrect. You may " "need to change the Photometric Interpretation to " "the correct value.".format(actual_length, expected_len) ) warnings.warn(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.is_little_endian 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-2.4.3/pydicom/pixel_data_handlers/pillow_handler.py000066400000000000000000000207671446675437500242400ustar00rootroot00000000000000# 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 import warnings if TYPE_CHECKING: # pragma: no cover from pydicom.dataset import Dataset, FileMetaDataset, FileDataset 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 defragment_data, decode_data_sequence from pydicom.pixel_data_handlers.util import pixel_dtype, get_j2k_parameters 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': ('http://www.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'): if 'adobe_transform' not in image.info: color_mode = 'YCbCr' image.tile = [( 'jpeg', image.tile[0][1], image.tile[0][2], (color_mode, ''), )] image.mode = color_mode image.rawmode = color_mode 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} only supported " "by Pillow if 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 = getattr(ds, 'NumberOfFrames', 1) or 1 pixel_bytes = bytearray() if nr_frames > 1: j2k_precision, j2k_sign = None, None # multiple compressed frames for frame in decode_data_sequence(ds.PixelData): 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) else: # single compressed frame pixel_data = defragment_data(ds.PixelData) im = _decompress_single_frame( pixel_data, transfer_syntax, photometric_interpretation ) if 'YBR' in photometric_interpretation: im.draft('YCbCr', (rows, columns)) pixel_bytes.extend(im.tobytes()) params = get_j2k_parameters(pixel_data) 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: warnings.warn( 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 -= 2**(bits_allocated - 1) if shift: arr = numpy.right_shift(arr, shift) else: # Corrections based on dataset elements if ds.PixelRepresentation == 1: arr -= 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-2.4.3/pydicom/pixel_data_handlers/pylibjpeg_handler.py000066400000000000000000000254551446675437500247160ustar00rootroot00000000000000# 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. """ import logging from typing import TYPE_CHECKING, Iterable, cast if TYPE_CHECKING: # pragma: no cover from pydicom.dataset import Dataset, FileMetaDataset try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False try: import pylibjpeg HAVE_PYLIBJPEG = True except ImportError: HAVE_PYLIBJPEG = False if HAVE_PYLIBJPEG: try: from pylibjpeg.utils import get_pixel_data_decoders except ImportError: # Old import, deprecated in 1.2, removal in 2.0 from pylibjpeg.pydicom.utils import get_pixel_data_decoders try: import openjpeg HAVE_OPENJPEG = True except ImportError: HAVE_OPENJPEG = False try: import libjpeg HAVE_LIBJPEG = True except ImportError: HAVE_LIBJPEG = False try: import rle HAVE_RLE = True except ImportError: HAVE_RLE = False from pydicom import config from pydicom.encaps import generate_pixel_data_frame from pydicom.pixel_data_handlers.util import ( pixel_dtype, get_expected_length, reshape_pixel_array, get_j2k_parameters ) from pydicom.uid import ( JPEGBaseline8Bit, JPEGExtended12Bit, JPEGLosslessP14, 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, JPEGLosslessP14, JPEGLosslessSV1, JPEGLSLossless, JPEGLSNearLossless ] _OPENJPEG_SYNTAXES = [JPEG2000Lossless, JPEG2000] _RLE_SYNTAXES = [RLELossless] SUPPORTED_TRANSFER_SYNTAXES = ( _LIBJPEG_SYNTAXES + _OPENJPEG_SYNTAXES + _RLE_SYNTAXES ) DEPENDENCIES = {"numpy": ("http://www.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 " "elements are missing from the dataset: " + ", ".join(missing) ) decoder = _DECODERS[tsyntax] LOGGER.debug(f"Decoding {tsyntax.name} encoded Pixel Data using {decoder}") nr_frames = getattr(ds, "NumberOfFrames", 1) pixel_module = ds.group_dataset(0x0028) dtype = pixel_dtype(ds) bits_stored = cast(int, ds.BitsStored) bits_allocated = cast(int, ds.BitsAllocated) for frame in generate_pixel_data_frame(ds.PixelData, nr_frames): arr = decoder(frame, 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 // getattr(ds, "NumberOfFrames", 1) # 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-2.4.3/pydicom/pixel_data_handlers/rle_handler.py000066400000000000000000000403051446675437500235020ustar00rootroot00000000000000# 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 import sys from typing import List, TYPE_CHECKING, cast import warnings try: import numpy as np HAVE_RLE = True except ImportError: HAVE_RLE = False from pydicom.encaps import decode_data_sequence, defragment_data from pydicom.pixel_data_handlers.util import pixel_dtype from pydicom.encoders.native import _encode_frame import pydicom.uid if TYPE_CHECKING: # pragma: no cover import numpy from pydicom.dataset import Dataset, FileMetaDataset HANDLER_NAME = 'RLE Lossless' DEPENDENCIES = {'numpy': ('http://www.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 = cast(int, getattr(ds, 'NumberOfFrames', 1) or 1) rows = cast(int, ds.Rows) cols = cast(int, ds.Columns) # Decompress each frame of the pixel data pixel_data = bytearray() if nr_frames > 1: for rle_frame in decode_data_sequence(ds.PixelData): frame = _rle_decode_frame( rle_frame, rows, cols, nr_samples, nr_bits, rle_segment_order ) pixel_data.extend(frame) else: frame = _rle_decode_frame( defragment_data(ds.PixelData), rows, cols, nr_samples, nr_bits, rle_segment_order ) pixel_data.extend(frame) 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( "The RLE header specifies an invalid number of segments ({})" .format(nr_segments) ) offsets = unpack('<{}L'.format(nr_segments), 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: warnings.warn( "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 # Old function kept for backwards compatibility def rle_encode_frame(arr: "numpy.ndarray") -> bytes: """Return an :class:`numpy.ndarray` image frame as RLE encoded :class:`bytearray`. .. versionadded:: 1.3 .. deprecated:: 2.2 Use :meth:`~pydicom.dataset.Dataset.compress` instead Parameters ---------- arr : numpy.ndarray A 2D (if *Samples Per Pixel* = 1) or 3D (if *Samples Per Pixel* = 3) ndarray containing a single frame of the image to be RLE encoded. Returns ------- bytes An RLE encoded frame, including the RLE header, following the format specified by the DICOM Standard, Part 5, :dcm:`Annex G`. """ shape = arr.shape if len(shape) > 3: # Note: only raises if multi-sample pixel data with multiple frames raise ValueError( "Unable to encode multiple frames at once, please encode one " "frame at a time" ) # Check the expected number of segments nr_segments = arr.dtype.itemsize if len(shape) == 3: # Number of samples * bytes per sample nr_segments *= shape[-1] if nr_segments > 15: raise ValueError( "Unable to encode as the DICOM standard only allows " "a maximum of 15 segments in RLE encoded data" ) dtype = arr.dtype kwargs = { 'bits_allocated': arr.dtype.itemsize * 8, 'rows': shape[0], 'columns': shape[1], 'samples_per_pixel': 3 if len(shape) == 3 else 1, 'byteorder': '<', } sys_endianness = '<' if sys.byteorder == 'little' else '>' byteorder = dtype.byteorder byteorder = sys_endianness if byteorder == '=' else byteorder if byteorder == '>': arr = arr.astype(dtype.newbyteorder('<')) return _encode_frame(arr.tobytes(), **kwargs) pydicom-2.4.3/pydicom/pixel_data_handlers/util.py000066400000000000000000001527021446675437500222050ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Utility functions used in the pixel data handlers.""" from struct import unpack, unpack_from from sys import byteorder from typing import ( Dict, Optional, Union, List, Tuple, TYPE_CHECKING, cast, Iterable, ByteString ) import warnings try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False from pydicom.data import get_palette_files from pydicom.uid import UID from pydicom.valuerep import VR if TYPE_CHECKING: # pragma: no cover from pydicom.dataset import Dataset, FileMetaDataset, FileDataset # 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) } def apply_color_lut( arr: "np.ndarray", ds: Optional["Dataset"] = None, palette: Optional[Union[str, UID]] = None ) -> "np.ndarray": """Apply a color palette lookup table to `arr`. .. versionadded:: 1.4 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("Unknown palette '{}'".format(palette)) try: from pydicom import dcmread fname = datasets[palette] ds = dcmread(get_palette_files(fname)[0]) except KeyError: raise ValueError("Unknown palette '{}'".format(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('uint{:.0f}'.format(nominal_depth)) luts = [] 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( Optional[bytes], getattr(ds, 'AlphaPaletteColorLookupTableData', None) ) actual_depth = len(r_lut) / nr_entries * 8 dtype = np.dtype('uint{:.0f}'.format(actual_depth)) for lut_bytes in [ii for ii in [r_lut, g_lut, b_lut, a_lut] if ii]: luts.append(np.frombuffer(lut_bytes, dtype=dtype)) 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( Optional[bytes], getattr(ds, 'SegmentedAlphaPaletteColorLookupTableData', None) ) endianness = '<' if ds.is_little_endian else '>' byte_depth = nominal_depth // 8 fmt = 'B' if byte_depth == 1 else 'H' actual_depth = nominal_depth for seg in [ii for ii in [r_lut, g_lut, b_lut, a_lut] if ii]: len_seg = len(seg) // byte_depth s_fmt = endianness + str(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] - 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_modality_lut(arr: "np.ndarray", ds: "Dataset") -> "np.ndarray": """Apply a modality lookup table or rescale operation to `arr`. .. versionadded:: 1.4 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 = 'uint{}'.format(nominal_depth) # Ambiguous VR, US or OW unc_data: Iterable[int] if item['LUTData'].VR == VR.OW: endianness = '<' if ds.is_little_endian else '>' unpack_fmt = '{}{}H'.format(endianness, nr_entries) 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 cast("np.ndarray", 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_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`. .. versionadded:: 1.4 .. 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.pixel_data_handlers.util.apply_modality_lut` :func:`~pydicom.pixel_data_handlers.util.apply_voi` :func:`~pydicom.pixel_data_handlers.util.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 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.pixel_data_handlers.util.apply_modality_lut` :func:`~pydicom.pixel_data_handlers.util.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 ` """ if not ds.get('VOILUTSequence'): return arr if not np.issubdtype(arr.dtype, np.integer): warnings.warn( "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: endianness = '<' if ds.is_little_endian else '>' unpack_fmt = f'{endianness}{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.pixel_data_handlers.util.apply_modality_lut` :func:`~pydicom.pixel_data_handlers.util.apply_voi` 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:: 1.4 Added support for ``YBR_FULL_422`` .. versionchanged:: 2.2 Added `per_frame` keyword parameter. Parameters ---------- arr : numpy.ndarray The image(s) as a :class:`numpy.ndarray` with :attr:`~numpy.ndarray.shape` (frames, rows, columns, 3) or (rows, columns, 3). 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 to reduce memory usage. Default ``False``. Returns ------- numpy.ndarray The image(s) converted to the desired 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 """ 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 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. 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 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 _expand_segmented_lut( data: Tuple[int, ...], fmt: str, nr_segments: Optional[int] = None, last_value: Optional[int] = 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 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 | +-------------+---------------------------+------+-------------+ .. versionchanged:: 1.4 Added support for a *Photometric Interpretation* of ``YBR_FULL_422`` 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. .. versionadded:: 1.4 +------------------------------------------------+ | 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, object]: """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}``. """ try: # First 2 bytes must be the SOC marker - if not then wrong format if codestream[0:2] != b'\xff\x4f': return {} # SIZ is required to be the second marker - Figure A-3 in 15444-1 if codestream[2:4] != b'\xff\x51': return {} # See 15444-1 A.5.1 for format of the SIZ box and contents ssiz = codestream[42] if ssiz & 0x80: return {"precision": (ssiz & 0x7F) + 1, "is_signed": True} return {"precision": ssiz + 1, "is_signed": False} except (IndexError, TypeError): pass return {} def get_nr_frames(ds: "Dataset") -> int: """Return NumberOfFrames or 1 if NumberOfFrames is None. Parameters ---------- ds : dataset.Dataset The :class:`~pydicom.dataset.Dataset` containing the Image Pixel module corresponding to the data in `arr`. Returns ------- int An integer for the NumberOfFrames or 1 if NumberOfFrames is None """ nr_frames: Optional[int] = getattr(ds, 'NumberOfFrames', 1) # 'NumberOfFrames' may exist in the DICOM file but have value equal to None if nr_frames is None: warnings.warn("A value of None 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 pack_bits(arr: "np.ndarray", pad: bool = True) -> bytes: """Pack a binary :class:`numpy.ndarray` for use with *Pixel Data*. .. versionadded:: 1.2 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 bytes() # 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 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 | +-------------+---------------------+------+------------------+ .. versionchanged:: 1.4 Added `as_float` keyword parameter and support for float dtypes. 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.") if ds.is_little_endian is None: ds.is_little_endian = ds.file_meta.TransferSyntaxUID.is_little_endian 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 ds.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, planes) * For multi-frame, single sample data (frames, rows, columns) * For multi-frame, multi-sample data (frames, rows, columns, planes) 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_frames < 1: raise ValueError( f"Unable to reshape the pixel array as a value of {nr_frames} for " "(0028,0008) 'Number of Frames' is invalid." ) 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 plane arr = arr.reshape(nr_frames, rows, columns) else: # Multiple planes, 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 plane arr = arr.reshape(rows, columns) else: # Multiple planes, 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 unpack_bits( src: bytes, as_array: bool = True ) -> Union["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-2.4.3/pydicom/py.typed000066400000000000000000000000001446675437500163420ustar00rootroot00000000000000pydicom-2.4.3/pydicom/sequence.py000066400000000000000000000166701446675437500170510ustar00rootroot00000000000000# 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 copy import deepcopy from typing import ( Iterable, Optional, List, cast, Union, overload, MutableSequence, Dict, Any) import weakref import warnings from pydicom import config from pydicom.dataset import Dataset from pydicom.multival import MultiValue def validate_dataset(elem: object) -> Dataset: """Check that `elem` is a :class:`~pydicom.dataset.Dataset` instance.""" if not isinstance(elem, Dataset): raise TypeError('Sequence contents must be Dataset instances.') return elem class Sequence(MultiValue[Dataset]): """Class to hold multiple :class:`~pydicom.dataset.Dataset` in a :class:`list`. This class is derived from :class:`~pydicom.multival.MultiValue` and as such enforces that all items added to the list are :class:`~pydicom.dataset.Dataset` instances. In order to do this, a validator is substituted for `type_constructor` when constructing the :class:`~pydicom.multival.MultiValue` super class. """ def __init__(self, iterable: Optional[Iterable[Dataset]] = None) -> None: """Initialize a list of :class:`~pydicom.dataset.Dataset`. Parameters ---------- iterable : list-like of dataset.Dataset, optional 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') # the parent dataset self._parent_dataset: "Optional[weakref.ReferenceType[Dataset]]" = None # validate_dataset is used as a pseudo type_constructor self._list: List[Dataset] = [] # If no inputs are provided, we create an empty Sequence super().__init__(validate_dataset, iterable or []) for ds in self: ds.parent_seq = self # type: ignore self.is_undefined_length: bool def append(self, val: Dataset) -> None: # type: ignore[override] """Append a :class:`~pydicom.dataset.Dataset` to the sequence.""" super().append(val) val.parent_seq = self # type: ignore def extend(self, val: Iterable[Dataset]) -> None: # type: ignore[override] """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) for ds in val: ds.parent_seq = self # type: ignore def __deepcopy__(self, memo: Optional[Dict[int, Any]]) -> "Sequence": cls = self.__class__ copied = cls.__new__(cls) if memo is not None: memo[id(self)] = copied copied.__dict__.update(deepcopy(self.__dict__, memo)) for ds in copied: ds.parent_seq = copied # type:ignore return copied def __iadd__( # type: ignore[override] self, other: Iterable[Dataset] ) -> MutableSequence[Dataset]: """Implement Sequence() += [Dataset()].""" if isinstance(other, Dataset): raise TypeError("An iterable of 'Dataset' is required") result = super().__iadd__(other) for ds in other: ds.parent_seq = self # type: ignore return result def insert( # type: ignore[override] self, position: int, val: Dataset ) -> None: """Insert a :class:`~pydicom.dataset.Dataset` into the sequence.""" super().insert(position, val) val.parent_seq = self # type: ignore @property def parent_dataset(self) -> "Optional[weakref.ReferenceType[Dataset]]": """Return a weak reference to the parent :class:`~pydicom.dataset.Dataset`. .. versionadded:: 2.4 Returned value is a weak reference to the parent ``Dataset``. """ return self._parent_dataset @parent_dataset.setter def parent_dataset(self, value: Dataset) -> None: """Set the parent :class:`~pydicom.dataset.Dataset` .. versionadded:: 2.4 """ if value != self._parent_dataset: self._parent_dataset = weakref.ref(value) @property def parent(self) -> "Optional[weakref.ReferenceType[Dataset]]": """Return a weak reference to the parent Dataset .. deprecated:: 2.4 """ if config._use_future: raise AttributeError("Future: Sequence.parent is removed in v3.x") else: warnings.warn( "Sequence.parent will be removed in pydicom 3.0", DeprecationWarning ) return self.parent_dataset @parent.setter def parent(self, value: "Dataset") -> None: """Set the parent :class:`~pydicom.dataset.Dataset` .. deprecated:: 2.4 """ if config._use_future: raise AttributeError("Future: Sequence.parent is removed in v3.x") else: warnings.warn( "Sequence.parent will be removed in pydicom 3.0", DeprecationWarning ) self.parent_dataset = value # type:ignore @overload # type: ignore[override] def __setitem__(self, idx: int, val: Dataset) -> None: pass # pragma: no cover @overload def __setitem__(self, idx: slice, val: Iterable[Dataset]) -> None: pass # pragma: no cover def __setitem__( self, idx: Union[slice, int], val: Union[Iterable[Dataset], Dataset] ) -> None: """Set the parent :class:`~pydicom.dataset.Dataset` to the new :class:`Sequence` item """ if isinstance(idx, slice): if isinstance(val, Dataset): raise TypeError("Can only assign an iterable of 'Dataset'") super().__setitem__(idx, val) for ds in val: ds.parent_seq = self # type: ignore else: val = cast(Dataset, val) super().__setitem__(idx, val) val.parent_seq = self # type: ignore def __str__(self) -> str: """String description of the Sequence.""" return f"[{''.join([str(x) for x in self])}]" def __repr__(self) -> str: # type: ignore[override] """String representation of the Sequence.""" return f"<{self.__class__.__name__}, length {len(self)}>" def __getstate__(self) -> Dict[str, Any]: if self.parent_dataset is not None: s = self.__dict__.copy() s['_parent_dataset'] = s['_parent_dataset']() return s return self.__dict__ # If recovering from a pickle, turn back into weak ref def __setstate__(self, state: Dict[str, Any]) -> None: self.__dict__.update(state) if self.__dict__['_parent_dataset'] is not None: self.__dict__['_parent_dataset'] = weakref.ref( self.__dict__['_parent_dataset'] ) pydicom-2.4.3/pydicom/sr/000077500000000000000000000000001446675437500153015ustar00rootroot00000000000000pydicom-2.4.3/pydicom/sr/__init__.py000066400000000000000000000000461446675437500174120ustar00rootroot00000000000000from pydicom.sr.codedict import codes pydicom-2.4.3/pydicom/sr/_cid_dict.py000066400000000000000000030043301446675437500175570ustar00rootroot00000000000000# Auto-generated by generate_concept_dicts.py. # -*- coding: utf-8 -*- # Dict with cid number as keys; value format is: # {scheme designator: # scheme_designator: ...} name_for_cid = {} cid_concepts = {} name_for_cid[12105] = 'IntracranialCerebralVessels' 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[4051] = 'GeneralDevices' cid_concepts[4051] = \ {'DCM': ['Phantom', 'ACRAccreditationPhantomCT', 'ACRAccreditationPhantomMR', 'ACRAccreditationPhantomMammography', 'ACRAccreditationPhantomStereotacticBreastBiopsy', 'ACRAccreditationPhantomECT', 'ACRAccreditationPhantomPET', 'ACRAccreditationPhantomECTPET', 'ACRAccreditationPhantomPETFaceplate', 'IECHeadDosimetryPhantom', 'IECBodyDosimetryPhantom', 'NEMAXR212000Phantom', 'Sphere'], 'SCT': ['Glue', 'AtherectomyDevice', 'EmbolizationCoil', 'EmbolizationParticulate', 'Laser', 'Catheter', 'MeasuringRuler', 'RotationalAtherectomyDevice', 'GuidingCatheter', 'EmbolizationBall', 'PercutaneousTransluminalAngioplastyBalloon', 'Syringe', 'Stent', 'DetachableBalloon']} name_for_cid[9233] = 'RequestedReportTypes' cid_concepts[9233] = \ {'DCM': ['FinalReport', 'PreliminaryReport']} name_for_cid[6129] = 'ChestSiteInvolvement' cid_concepts[6129] = \ {'DCM': ['Lobar'], 'SCT': ['Lung', 'Bronchial', 'HilumOfLung', 'Mediastinum', 'PleuralStructure', 'ChestWall', 'UpperAbdomen', 'InterstitialTissue', 'Aorta']} name_for_cid[6083] = 'ProceduresforBreast' cid_concepts[6083] = \ {'DCM': ['SurgicalConsult', 'MammographyCAD', 'MarkerPlacement', 'FilmScreenMammography', 'DigitalMammography', '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', 'SentinelLymphNodeBiopsy', 'BreastImplantation', 'CTOfBreast', 'RadioisotopeScanOfLymphaticSystem', 'DiagnosticAspirationOfBreastCyst', 'RadionuclideLocalizationOfTumorLimitedArea']} name_for_cid[3452] = 'CalibrationMethods' cid_concepts[3452] = \ {'DCM': ['GeometricNonIsocenter', 'CalibrationObjectUsed', 'GeometricIsocenter']} name_for_cid[6200] = 'ColonOverallAssessment' cid_concepts[6200] = \ {'DCM': ['C0InadequateStudyAwaitingPriorComparisons', 'C1NormalColonOrBenignLesion', 'C2IntermediatePolypOrIndeterminateFinding', 'C3PolypPossiblyAdvancedAdenoma', 'C4ColonicMassLikelyMalignant']} name_for_cid[7041] = 'CalciumScoringPatientSizeCategories' cid_concepts[7041] = \ {'DCM': ['SmallLesserThan32Point0cmLateralThickness', 'Medium32Point0To38Point0cmLateralThickness', 'LargeGreaterThan38Point0cmLateralThickness']} name_for_cid[3239] = 'PerceivedExertionScales' cid_concepts[3239] = \ {'DCM': ['BorgCR10Scale', 'BorgRPEScale']} name_for_cid[12017] = 'GrowthDistributionRank' cid_concepts[12017] = \ {'DCM': ['GrowthZScore', 'GrowthPercentileRank']} name_for_cid[12294] = 'CardiacUltrasoundPericardiumandPleuraFindingSites' cid_concepts[12294] = \ {'SCT': ['Pericardium', 'Pleura', 'LeftPleura', 'RightPleura']} name_for_cid[7016] = 'LevelofDifficulty' cid_concepts[7016] = \ {'DCM': ['PrimaryLevel', 'AdvancedLevel', 'IntermediateLevel']} name_for_cid[3405] = 'ProcedureActionValues' cid_concepts[3405] = \ {'DCM': ['ArterialConduitAngiography', 'VascularIntervention', 'MyocardialBiopsy', 'AorticIntervention', 'SeptalDefectIntervention', 'ValvularIntervention'], 'SCT': ['CardiacCatheterizationBaselinePhase', 'TransthoracicEchocardiography', 'StentPlacement', 'CardiacVentriculography', 'TransseptalCatheterization', 'DrugInfusionChallenge', 'AtherectomyByRotaryCutter', 'CardiacCatheterizationInterventionPhase', 'CardiacCatheterizationTherapyPhase', 'LeftVentriculography', 'CatheterizationOfBothLeftAndRightHeartWithoutGraft', 'IntravascularUltrasound', 'CardiacCatheterizationPostContrastPhase', 'Aortography', 'CatheterizationOfLeftHeart', 'CardiacCatheterizationPostInterventionPhase', 'PercutaneousInsertionOfIntravascularFilter', 'CardiacCatheterizationImageAcquisitionPhase', 'CatheterizationOfBothLeftAndRightHeartWithGraft', 'AtherectomyByLaser', 'RightVentriculography', 'TranscatheterTherapyForEmbolization', 'RestingState', 'CardiacCatheterizationPreInterventionPhase', 'Atherectomy', 'SelectiveEmbolizationOfArtery', 'PercutaneousRetrievalOfIntravascularForeignBody', 'IntracardiacEchocardiography', 'CoronaryArteriography', 'CardiacCatheterizationTestChallengePhase', 'PercutaneousTransluminalBalloonAngioplasty', 'EpicardialEchocardiography', 'BypassGraftAngiography', 'CardiacCatheterizationBailoutPhase', 'Angiography', 'TransesophagealEchocardiography', 'TranscatheterDeploymentOfDetachableBalloon', 'CatheterizationOfRightHeart', 'ExerciseChallenge']} name_for_cid[3110] = 'NuclearCardiologyProtocols' cid_concepts[3110] = \ {'DCM': ['StressTechnetiumRestTechnetium1DayProcedure', 'NMMyocardialViabilityProcedure', 'RestTechnetiumStressTechnetium1DayProcedure', 'RestTechnetiumStressTechnetium2DayProcedure', 'RestThalliumStressTechnetiumProcedure'], 'SCT': ['StressThalliumProcedure']} name_for_cid[3813] = 'StentFindings' cid_concepts[3813] = \ {'DCM': ['StentFracture', 'StentDisintegration', 'Endoleak'], 'SCT': ['Hypoplasia', 'MigrationOfImplantOrInternalDevice', 'Stenosis']} name_for_cid[7153] = 'CNSSegmentationTypes' cid_concepts[7153] = \ {'FMA': ['ArcuateFasciculus'], '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', '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', 'OpticRadiation']} name_for_cid[4010] = 'DXView' cid_concepts[4010] = \ {'SCT': ['RightPosteriorOblique', 'ObliqueCaudoCranial', 'PosteroAnteriorOblique', 'Axial', 'Sagittal', 'Tangential', 'CranioCaudal', 'LateroMedialOblique', 'Acanthioparietal', 'Orbitoparietal', 'OcclusalProjection', 'ObliqueCranioCaudal', 'Plantodorsal', 'LeftAnteriorOblique', 'LateralOblique', 'RightOblique', 'MedioLateralOblique', 'RightLateral', 'CaudoCranial', 'Verticosubmental', 'TissueSpecimen', 'Frontal', 'LeftLateral', 'Parietoacanthial', 'PosteroAnterior', 'RightAnteriorOblique', 'Submentovertical', 'AnteroPosteriorOblique', 'LateralMedial', 'LeftOblique', 'Dorsoplantar', 'ParietoOrbital', 'Oblique', 'MedialOblique', 'FrontalObliqueAxial', 'SagittalObliqueAxial', 'AnteroPosterior', 'MedialLateral', 'FrontalOblique', 'ObliqueAxial', 'Lateral', 'LeftPosteriorOblique']} name_for_cid[3690] = 'ECGControlVariablesNumeric' cid_concepts[3690] = \ {'MDC': ['LowPassFilterCutoffFreq', 'InterpolatorSNR', 'NotchFilterFrequency', 'SampleRate', 'NotchFilterBandwidth', 'Sensitivity', 'ZeroOffset', 'PadValue', 'TimeSkew', 'SampleSkew', 'TimeOffset']} name_for_cid[12001] = 'UltrasoundProtocolTypes' 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[3413] = 'AdverseOutcomes' cid_concepts[3413] = \ {'DCM': ['DeathDuringCatheterization'], 'SCT': ['LossOfDistalPulse', 'Pseudoaneurysm', 'EmergencyPercutaneousCoronaryIntervention', 'CardiogenicShock', 'Arrhythmia', 'ContrastMediaAdverseReaction', 'ArterialDissection', 'CardiacTamponade', 'CardiacArrest', 'AVFistula', 'CongestiveHeartFailure', 'CerebrovascularAccidentOrStroke', 'OcclusionOfArtery', 'EmergencyCoronaryArteryBypass', 'RenalFailure', 'Bleeding']} name_for_cid[7000] = 'DiagnosticImagingReportDocumentTitles' cid_concepts[7000] = \ {'DCM': ['BreastImagingReport'], 'LN': ['MRIHeadReport', 'XRayReport', 'CTAbdomenReport', 'EchocardiographyReport', 'ECGReport', 'CTChestReport', 'CTHeadReport', 'CardiacCatheterizationReport', 'FluoroscopyStudyReport', 'UltrasoundReport', 'DEXASkeletalSystemStudyReport', 'DiagnosticImagingReport', 'CTReport', 'DiagnosticInterventionalRadiologyReport', 'MammographyScreeningReport', 'CardiacElectrophysiologyReport', 'UltrasoundObstetricAndGynReport', 'NuclearMedicineThyroidScanReport', 'RadiologyReport', 'HolterStudyReport', 'ExerciseStressTestReport', 'PETScanReport', 'NuclearMedicineReport', 'MRISpineReport', 'MRIReport']} name_for_cid[12282] = 'CardiacUltrasoundVenousReturnSystemicFindingSites' cid_concepts[12282] = \ {'SCT': ['HepaticVein', 'LeftSuperiorVenaCava', 'FontanFenestration', 'MustardOrSenningSuperiorVenaCavaPathway', 'RightSuperiorVenaCava', 'InferiorVenaCava', 'FontanPathway', 'FontanBaffleLeak', 'SuperiorVenaCava', 'HemiFontanPathway', 'FontanInferiorVenaCavaPathway', 'FontanPulmonaryArteryConnection', 'MustardOrSenningCommonSystemicVenousPathway', 'GlennPathway', 'MustardOrSenningInferiorVenaCavaPathway']} name_for_cid[7450] = 'PersonRoles' 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[3805] = 'StenosisTypes' cid_concepts[3805] = \ {'SCT': ['Embolism', 'Thrombosis', 'Entrapment', 'Fibrous', 'Compression', 'ArterioscleroticVascularDisease', 'Vasculitis', 'CysticAdventitialDisease', 'RaynaudDisease']} name_for_cid[3106] = 'PETCardiologyProtocols' cid_concepts[3106] = \ {'DCM': ['PETMyocardialViabilityRestAndStress', 'PETMyocardialViabilityRestOnly', 'PETMyocardialViabilityStressOnly', 'PETMyocardialPerfusionRestAndStress', 'PETMyocardialPerfusionRestOnly', 'PETMyocardialPerfusionStressOnly']} name_for_cid[3628] = 'CardiacOutputMethods' cid_concepts[3628] = \ {'SCT': ['ThermalBath', 'ThermalInline', 'DyeDilution']} name_for_cid[12113] = 'AbdominalVeins(Lateral)' cid_concepts[12113] = \ {'SCT': ['TesticularVein', 'FirstLumbarArtery', 'OvarianVein', 'FourthLumbarArtery', 'FifthLumbarArtery', 'SixthLumbarArtery', 'CommonIliacVein', 'GastricVein', 'ThirdLumbarArtery', 'SecondLumbarArtery', 'IlealVein']} name_for_cid[8121] = 'MicroscopyLensType' cid_concepts[8121] = \ {'SCT': ['SlideOverviewLens', 'OilImmersionLens', 'HighPowerNonImmersionLens']} name_for_cid[6095] = 'NumericPropertiesofProcedures' cid_concepts[6095] = \ {'DCM': ['NeedleGauge', 'NeedleLength']} name_for_cid[4102] = 'PerfusionMeasurementMethods' cid_concepts[4102] = \ {'DCM': ['PerfusionAnalysisByStableXenonCTTechnique', 'PerfusionAnalysisByIVIodinatedContrastCTTechnique', 'PerfusionAnalysisByArterialSpinLabelingMRTechnique', 'PerfusionAnalysisBySusceptibilityMRTechnique']} name_for_cid[3014] = 'CoronaryArterySegments' cid_concepts[3014] = \ {'BARI': ['_2ndMarginalCoronaryArteryLaterals', '_1stDiagonalCoronaryArteryLaterals', '_3rdDiagonalCoronaryArteryLaterals', '_1stMarginalCoronaryArteryLaterals', '_3rdMarginalCoronaryArteryLaterals', '_2ndDiagonalCoronaryArteryLaterals', 'RamusLaterals', 'PosteriorDescendingSeptalPerforators'], 'SCT': ['ProximalRightCoronaryArtery', '_3rdLeftPosterolateralCoronaryArtery', 'RightPosteriorAVCoronaryArtery', 'ProximalCircumflexCoronaryArtery', '_2ndMarginalCoronaryArtery', 'MidCircumflexCoronaryArtery', '_1stLeftPosterolateralCoronaryArtery', 'IntermediateArteryRamus', 'DistalLeftAnteriorDescendingCoronaryArtery', 'RightCoronaryArteryOstium', 'LeftMainCoronaryArtery', '_2ndLeftPosterolateralCoronaryArtery', 'DistalRightCoronaryArtery', 'MarginalCoronaryArtery', '_2ndRightPosterolateralCoronaryArtery', 'PosteriorDescendingRightCoronaryArtery', 'LeftPosteriorDescendingCircumflexCoronaryArtery', '_1stMarginalCoronaryArtery', 'ProximalLeftAnteriorDescendingCoronaryArtery', '_3rdDiagonalCoronaryArtery', '_1stSeptalCoronaryArtery', '_3rdMarginalCoronaryArtery', '_1stDiagonalCoronaryArtery', 'MidRightCoronaryArtery', '_2ndDiagonalCoronaryArtery', 'AVGrooveContinuationOfCircumflexArtery', 'DistalCircumflexCoronaryArtery', 'MidLeftAnteriorDescendingCoronaryArtery', 'LeftMainCoronaryArteryOstium', '_1stRightPosterolateralCoronaryArtery', '_3rdRightPosterolateralCoronaryArtery']} name_for_cid[7112] = 'RadiotherapyFiducials' cid_concepts[7112] = \ {'DCM': ['MRMarker', 'InfraredReflectorMarker', 'VisibleReflectorMarker', 'CoilMarker', 'CylinderMarker', 'TransponderMarker', 'WireMarker', 'Sphere'], 'SCT': ['RadioactiveImplant', 'BBShotLeadPellet', 'Clip', 'ContrastMedia', 'Catheter']} name_for_cid[7305] = 'ImplantPlanningLandmarks' cid_concepts[7305] = \ {'DCM': ['AnatomicalAxisOfFemur', 'AcetabularCenterOfRotation', 'FemurHeadCenterOfRotation']} name_for_cid[33] = 'Modality' cid_concepts[33] = \ {'DCM': ['BoneMineralDensitometry', 'SlideMicroscopy', 'StructuredReportDocument', 'SpatialFiducials', 'OphthalmicPhotography', 'Other', 'KeyObjectSelection', 'Electrocardiography', 'GeneralMicroscopy', 'XRayAngiography', 'IntraocularLensCalculation', 'ExternalCameraPhotography', 'ContentAssessmentResult', 'IntravascularUltrasound', 'ComputedRadiography', 'ComputedTomography', 'OpticalSurfaceScanner', 'Thermography', 'Registration', 'Lensometry', 'RTDose', 'OphthalmicTomographyEnFace', 'HardCopy', 'RTPlan', 'HemodynamicWaveform', 'OpticalCoherenceTomography', 'UltrasoundBoneDensitometry', 'ModelFor3DManufacturing', 'Diaphanography', 'PresentationState', 'PositronEmissionTomography', 'CardiacElectrophysiology', 'LaserScan', 'PanoramicXRay', 'OphthalmicMapping', 'OphthalmicTomographyBScanVolumeAnalysis', 'OphthalmicVisualField', 'DigitalRadiography', 'OphthalmicTomography', 'Document', 'RTTreatmentRecord', 'Mammography', 'Ultrasound', 'IntravascularOpticalCoherenceTomography', 'RTStructureSet', 'MagneticResonance', 'IntraOralRadiography', 'RTImage', 'VisualAcuity', 'RespiratoryWaveform', 'Endoscopy', 'RealWorldValueMap', 'Autorefraction', 'Segmentation', 'RadiographicImaging', 'Radiofluoroscopy', 'BasicVoiceAudio', 'Keratometry', 'StereometricRelationship', 'CTProtocol', 'AutomatedSlideStainer', 'OphthalmicAxialMeasurements', 'NuclearMedicine', 'Plan', 'BiomagneticImaging', 'SubjectiveRefraction']} name_for_cid[10010] = 'DoseMeasurementDevices' cid_concepts[10010] = \ {'SCT': ['Dosimeter']} name_for_cid[3716] = 'Severity' cid_concepts[3716] = \ {'SCT': ['Moderate', 'Mild', 'MildToModerate', 'ModerateToSevere', 'None', 'Fatal', 'Severe']} name_for_cid[6144] = 'RECISTDefinedLesionResponse' cid_concepts[6144] = \ {'DCM': ['TargetLesionCompleteResponse', 'TargetLesionPartialResponse', 'TargetLesionProgressiveDisease', 'TargetLesionStableDisease', 'NonTargetLesionCompleteResponse', 'NonTargetLesionIncompleteResponseOrStableDisease', 'NonTargetLesionProgressiveDisease']} name_for_cid[6001] = 'OverallBreastCompositionfromBIRADS®' cid_concepts[6001] = \ {'SCT': ['ExtremelyDense', 'AlmostEntirelyFat', 'HeterogeneouslyDense', 'ScatteredFibroglandularDensities']} name_for_cid[3203] = 'ExerciserDevice' cid_concepts[3203] = \ {'SCT': ['BicycleErgometer', 'Treadmill', 'ArmErgometer']} name_for_cid[9527] = 'TeletherapyIsotope' cid_concepts[9527] = \ {'SCT': ['_60Cobalt']} name_for_cid[12241] = 'TricuspidValveFindingSites' cid_concepts[12241] = \ {'SCT': ['TricuspidAnnulus']} name_for_cid[3829] = 'PulmonaryArteries' cid_concepts[3829] = \ {'SCT': ['TrunkOfPulmonaryArtery', 'PulmonaryValveSinuses', 'RightPulmonaryArtery', 'SuprapulmonicValveArea', 'LeftPulmonaryArtery']} name_for_cid[7169] = 'BrainLesionSegmentationTypesWithoutNecrosis' cid_concepts[7169] = \ {'DCM': ['Background'], 'NCIt': ['NonEnhancingLesion', 'EnhancingLesion'], 'SCT': ['Normal', 'Edema']} name_for_cid[7186] = 'AbstractMultidimensionalImageModelQualitativeDimensionSampleSemantics' 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[12304] = 'EchoMeasuredProperties' cid_concepts[12304] = \ {'DCM': ['PeakBloodPressure', 'MaximumOrificeArea', 'ExcursionDistance', 'EffectiveOrificeArea', 'DyssynchronyIndex', 'VenaContractaWidth', 'RegurgitationJetWidth', 'RegurgitationJetArea', 'PISARadius', 'PeakTissueVelocity'], 'LN': ['MeanGradientPressureByDoppler', 'VelocityTimeIntegral', 'PeakBloodVelocity', 'VolumeFlowRate', 'DpDtByUS', 'Thickness', 'InternalDimension', 'PeakGradientPressure', 'FractionalShortening', 'AliasVelocity', 'PressureHalfTime', 'PeakInstantaneousFlowRate', 'DecelerationTime', 'AccelerationTime', 'EpicardialArea', 'MyocardialPerformanceIndexTei', 'MeanBloodVelocity'], 'SCT': ['Interval', 'VascularResistance', 'BloodPressure', 'Volume', 'Area', 'Mass', 'MeanBloodPressure', 'RegurgitantFraction', 'CardiacEjectionFraction', 'MinorAxis', 'Angle', 'Diameter', 'StrokeVolume', 'Length']} name_for_cid[230] = 'YesNo' cid_concepts[230] = \ {'SCT': ['Yes', 'No', 'Undetermined']} name_for_cid[4250] = 'VisualFieldStaticPerimetryTestPatterns' cid_concepts[4250] = \ {'DCM': ['VisualField60To4TestPattern', 'VisualFieldCentralTestPattern', 'VisualFieldMaculaTestPattern', 'VisualFieldCentral40PointTestPattern', 'VisualFieldCentral76PointTestPattern', 'VisualFieldPeripheral60PointTestPattern', 'VisualFieldFullField81PointTestPattern', 'VisualFieldFullField120PointTestPattern', 'VisualFieldGTestPattern', 'VisualField24To2TestPattern', 'VisualFieldMTestPattern', 'VisualField10To2TestPattern', 'VisualField07TestPattern', 'VisualField30To2TestPattern', 'VisualFieldLVCTestPattern']} name_for_cid[6113] = 'MediastinumAnatomyFindingorFeature' cid_concepts[6113] = \ {'DCM': ['Hiatus', 'AzygoesophagealRecessInterface', 'ParaspinalLine', 'PosteriorTrachealStripe', 'RightTrachealStripe', 'Stripe'], 'SCT': ['PulmonaryValve', 'FascialLayer', 'AorticValve', 'ThoracicDuct', 'AxillaryFascia', 'Carina', 'CarotidBody', 'TricuspidValve', 'Heart', 'ThymusGland', 'AtrialSeptalDefect', 'LymphNode', 'CostalCartilage', 'Ventricle', 'TrapeziusMuscle', 'Atrium', 'Esophagus', 'LeftMainBronchus', 'RightMainBronchus', 'Thyroid', 'LigamentumArteriosum', 'Trachea', 'MitralValve', 'AcromioclavicularJoint', 'EsophagealHiatus']} name_for_cid[3741] = 'MedicationAdministration,LabVisit' cid_concepts[3741] = \ {'SCT': ['Contraindicated', 'AdministeredAfterLabVisit', 'AdministeredBeforeLabVisit', 'AdministeredDuringLabVisit']} name_for_cid[7702] = 'ProjectionandThalamicFibers' cid_concepts[7702] = \ {'NEU': ['CorticobulbarTract', 'AnteriorThalamicRadiation', 'SuperiorOpticRadiationBaumLoop', 'CorticospinalTract', 'InferiorOpticRadiationMeyerLoop', 'SuperiorThalamicRadiation', 'InferiorThalamicRadiation', 'PosteriorThalamicRadiation'], 'SCT': ['AuditoryRadiation', 'InternalCapsule', 'ExternalCapsule', 'OpticRadiation']} name_for_cid[10047] = 'GFRMeasurementMethods' cid_concepts[10047] = \ {'DCM': ['CockroftGaultFormulaEstimationOfGFR', 'CKDEPIFormulaEstimationOfGFR', 'GlomerularFiltrationRateMDRD', 'GlomerularFiltrationRateNonBlackMDRD', 'GlomerularFiltrationRateBlackMDRD', 'GlomerularFiltrationRateFemaleMDRD', 'GlomerularFiltrationRateCystatinBasedFormula', 'GlomerularFiltrationRateCreatinineBasedFormulaSchwartz']} name_for_cid[64] = 'ImagingAgentAdministrationPatientState' cid_concepts[64] = \ {'DCM': ['AcuteUnilateralRenalBlockage', 'LowThyroidUptake', 'HighThyroidUptake', 'SeverelyJaundiced', 'PatientAllergicToMediaContrast'], 'SCT': ['Cardiomyopathy', 'MalignantEpithelialNeoplasmOfThyroid', 'Myeloma', 'HistoryOfHypertension', 'HistoryOfDiabetesMellitus', 'AnginaPectoris', 'Paraproteinemia', 'HistoryOfCongestiveHeartFailure', 'PulmonaryHypertension', 'Anxiety', 'Asthma', 'HistoryOfBetaBlockingAgentsTherapy', 'HistoryOfRenalFailure', 'AorticStenosis', 'AbnormalRenalFunction']} name_for_cid[3254] = 'ElectrophysiologyProcedurePhase' cid_concepts[3254] = \ {'SCT': ['AtrialEffectiveRefractoryPeriodEvaluationOf', 'PostDefibrillationProcedurePhase', 'VentricularEffectiveRefractoryPeriodEvaluationOf', 'ElectrophysiologyProcedureBaselinePhase', 'CarotidSinusMassageProcedurePhase', 'PostAblationPhase', 'ElectrophysiologyMappingPhase', 'SinusNodeRecoveryTimeEvaluationOf', 'RadiofrequencyAblationProcedurePhase']} name_for_cid[6056] = 'AssociatedFindingsforBreast' cid_concepts[6056] = \ {'DCM': ['CooperLigamentChanges', 'MassInTheSkin', 'MassOnTheSkin'], 'SCT': ['BreastHematoma', 'BreastComposition', 'AxillaryAdenopathy', 'SurgicalScar', 'NippleRetraction', 'Edema', 'AxillaryLymphNode', 'TrabecularThickeningOfBreast', 'SkinRetractionOfBreast', 'ArchitecturalDistortionOfBreast', 'TubularDensity', 'MammographyBreastDensity', 'SkinLesion', 'IndividualCalcification', 'SkinThickeningOfBreast', 'CalcificationCluster', 'IntramammaryLymphNode']} name_for_cid[3604] = 'ArterialLesionLocations' cid_concepts[3604] = \ {'BARI': ['_1stDiagonalCoronaryArteryLaterals', '_1stMarginalCoronaryArteryLaterals', '_2ndDiagonalCoronaryArteryLaterals', 'RamusLaterals', '_2ndMarginalCoronaryArteryLaterals', '_3rdDiagonalCoronaryArteryLaterals', '_3rdMarginalCoronaryArteryLaterals', 'PosteriorDescendingSeptalPerforators'], 'SCT': ['InternalCarotidArtery', 'ProximalRightCoronaryArtery', 'RightPosteriorAVCoronaryArtery', 'BasilarArtery', 'PulmonaryArteriovenousFistula', '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', 'DescendingAorta', 'SubclavianArtery', 'TibialArtery', '_3rdLeftPosterolateralCoronaryArtery', 'OphthalmicArtery', 'MesentericArtery', 'MedialPlantarArtery', 'PoplitealArtery', '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', 'AxillaryArtery', 'LeftPulmonaryArtery', 'MarginalCoronaryArtery', 'InternalMammaryArtery', 'ProximalLeftAnteriorDescendingCoronaryArtery', 'VertebralArtery', '_3rdDiagonalCoronaryArtery', 'AVGrooveContinuationOfCircumflexArtery', '_3rdRightPosterolateralCoronaryArtery', 'NeonatalPulmonaryArteryPrimitivePA', 'SuperficialFemoralArtery', 'ProximalCircumflexCoronaryArtery', '_2ndMarginalCoronaryArtery', 'PosteriorCommunicatingArtery', 'AorticArch', 'AbdominalAorta', 'LingualArtery', 'LeftMainCoronaryArtery', '_2ndLeftPosterolateralCoronaryArtery', 'PosteriorDescendingRightCoronaryArtery', 'Baffle', 'LacrimalArtery', 'OccipitalArtery', '_1stSeptalCoronaryArtery', 'RightCoronaryArtery', 'AscendingAorta', '_1stDiagonalCoronaryArtery', 'ProfundaFemorisArtery', 'LeftMainCoronaryArteryOstium', 'CerebralArtery', '_1stRightPosterolateralCoronaryArtery']} name_for_cid[12216] = 'EchocardiographyHepaticVeins' cid_concepts[12216] = \ {'LN': ['HepaticVeinAtrialContractionReversalPeakVelocity', 'HepaticVeinSystolicToDiastolicRatio', 'HepaticVeinDiastolicPeakVelocity', 'HeartRate', 'HepaticVeinSystolicPeakVelocity']} name_for_cid[3487] = 'IntravascularVolumetricRegions' cid_concepts[3487] = \ {'DCM': ['DistalStentMargin', 'EntirePullback', 'ProximalStentMargin', 'StentedRegion'], 'SCT': ['Lesion', 'MorphologicallyAbnormalStructure', 'CulpritLesion']} name_for_cid[3468] = 'EDVolume' cid_concepts[3468] = \ {'DCM': ['LeftAtrialEDVolume'], 'LN': ['RightVentricularEDVolume', 'LeftVentricularEDVolume']} 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[1005] = 'AnatomicalReferenceBasisAbdomen/Pelvis' cid_concepts[1005] = \ {'SCT': ['FemoralHead', 'Sacrum', 'SymphysisPubis', 'HipJoint', 'LesserTrochanter', 'Ischium', 'CommonIliacArteryBifurcation', 'Pancreas', 'Acetabulum', 'Liver', 'Kidney', 'AdrenalGland', 'IliacCrest']} name_for_cid[637] = 'ExogenousSubstanceTypes' cid_concepts[637] = \ {'DCM': ['TumorGraft'], 'SCT': ['Fibril', 'Virus', 'Cytokine', 'Toxin', 'GraftMaterial']} name_for_cid[72] = 'ImagingAgentAdministrationStepType' cid_concepts[72] = \ {'DCM': ['DiagnosticAdministration', 'TransitTimeTestInjection', 'PatencyTestInjection', 'FlushAdministration']} name_for_cid[3757] = 'CardiacDiagnosticProcedures' 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[6105] = 'AbnormalLucencyFindingorFeature' cid_concepts[6105] = \ {'DCM': ['HaloSign', 'AirBronchiologram', 'AirBronchogram', 'AirCrescent'], 'SCT': ['Pneumothorax', 'AirTrapping', 'Pneumomediastinum']} name_for_cid[3612] = 'BloodVelocityMeasurements' cid_concepts[3612] = \ {'DCM': ['BloodVelocityPeak', 'BloodVelocityMean', 'BloodVelocityMinimum', 'SystolicBloodVelocityMean', 'SystolicBloodVelocityPeak', 'DiastolicBloodVelocityMean', 'DiastolicBloodVelocityPeak']} name_for_cid[6040] = 'NonlesionObjectType' cid_concepts[6040] = \ {'DCM': ['OtherMarker', 'Unspecified'], 'SCT': ['Suture', 'CardiacPacemaker', 'CompressionPaddle', 'JWire', 'ScarTissue', 'Bullet', 'BBShotLeadPellet', 'OpaqueMarker', 'Clip', 'ContrastAgent', 'Catheter', 'IDPlate', 'Collimator', 'Implant', 'Staple']} name_for_cid[7201] = 'ReferencedImagePurposesofReference' cid_concepts[7201] = \ {'DCM': ['ImagesRelatedToStandaloneObject', 'AnatomicImage', 'TemporalSuccessor', 'Spectroscopy', 'FunctionalImage', 'OtherImageOfBiplanePair', 'VolumeCorrespondingToSpatiallyRelatedAcquisitionFrames', 'OtherImageOfStereoscopicPair', 'TemporalPredecessor', 'BiopsyLocalizer', 'OtherPartialViews', 'AcquisitionFramesCorrespondingToVolume', 'Localizer', 'ImageUsedForTreatmentPlanning', 'ImageAcquiredDuringTreatment', 'ImageUsedForDoseCalculation', 'ImageUsedAsReferenceImageForTreatment', 'DeviceLocalizer', 'SpectralFilteredImage']} name_for_cid[3491] = 'IVUSLesionMorphologies' cid_concepts[3491] = \ {'DCM': ['InStentNeointima', 'SoftPlaque', 'VulnerablePlaque', 'ErodedPlaque', 'NecroticLipidicPlaque', 'PlaqueRupture', 'FalseLumen', 'FibroLipidicPlaque'], 'SCT': ['VascularCalcification', 'PseudoAneurysm', 'Eccentric', 'PlaqueUlceration', 'Concentric', 'ArterialTrueAneurysm', 'Thrombus', 'FibrousPlaque']} name_for_cid[12200] = 'EchocardiographyLeftVentricle' 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', '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[621] = 'TypeofMedicationforSmallAnimalAnesthesia' cid_concepts[621] = \ {'DCM': ['CarrierGas'], 'SCT': ['OcularLubricant', 'CaloricAgent', 'Vasoconstrictor', 'CarbapenemAntibiotic', 'BetaLactamAntibiotic', 'AminoglycosideAntibiotic', 'Potassium', 'LocalAnesthetic', 'NasalDecongestant', 'Anticoagulant', 'PenicillinAntibiotic', 'ThyroidHormone', 'MetronidazoleAntibiotic', 'Calcium', 'Magnesium', 'AntidiureticHormone', 'Oxytocic', 'InotropicAgent', 'Estrogen', 'Antiarrhythmic', 'Barbiturate', 'Benzodiazepine', 'SulfonamideAntibiotic', 'Diuretic', 'VancomycinAntibiotic', 'Antifungal', 'Hypoglycemic', 'Steroid', 'LowMolecularWeightHeparin', 'RespiratoryStimulant', 'AntiHeparinAgent', 'Anticholinergic', 'NeuromuscularBlockingNMBNonDepolarizing', 'DrugDiluent', 'GeneralAnesthetic', 'HemostaticAgent', 'MacrolideAntibiotic', 'Antihypertensive', 'Antibiotic', 'Antihistamine', 'AdrenergicAgent', 'QuinoloneAntibiotic', 'NSAID', 'Vitamin', 'Antiemetic', 'BloodProduct', 'Vasodilator', 'BenzodiazepineAntagonist', 'CalciumChannelBlocker', 'CephalosporinAntibiotic', 'CholinergicAgent', 'GastrointestinalProkinetic', 'PlasmaExpander', 'Anticonvulsant', 'BetaBlocker', 'Bronchodilator', 'TetracyclineAntibiotic', 'SkeletalMuscleRelaxant', 'NarcoticOpiateAntagonist', 'LincomycinAntibiotic', 'NeuromuscularBlockingNMBDepolarizing', 'LinezolidAntibiotic', 'Analgesic'], 'UMLS': ['H2Antagonist', 'NarcoticAnalgesic', 'Antihypoglycemic']} name_for_cid[271] = 'ObservationSubjectClass' cid_concepts[271] = \ {'DCM': ['Fetus', 'Specimen', 'Patient', 'DeviceSubject']} 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[6152] = 'Orientation' cid_concepts[6152] = \ {'DCM': ['Parallel', 'NotParallel']} name_for_cid[3700] = 'CathDiagnosis' cid_concepts[3700] = \ {'SCT': ['AorticDissection', 'Arrhythmia', 'VentricularFibrillation', 'RecurrentAnginaPostStent', 'PericardialTamponade', 'IdiopathicHypertrophicSubaorticStenosis', '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', 'SPMIPositiveStressForIschemia', 'AtypicalAnginaVariantAngina', 'CongestiveHeartFailure', 'SubacuteBacterialEndocarditis', 'AorticStenosis', 'MitralValveDisease', 'TricuspidRegurgitation', 'AcuteMitralRegurgitation', 'RecurrentAnginaPostCABG', 'ConstrictivePericarditis']} name_for_cid[10006] = 'XRayFilterMaterials' cid_concepts[10006] = \ {'SCT': ['TinOrTinCompound', 'NiobiumOrNiobiumCompound', 'TantalumOrTantalumCompound', 'SilverOrSilverCompound', 'EuropiumOrEuropiumCompound', 'MolybdenumOrMolybdenumCompound', 'LeadOrLeadCompound', 'CopperOrCopperCompound', 'RhodiumOrRhodiumCompound', 'AluminumOrAluminumCompound']} name_for_cid[25] = 'Radiopharmaceuticals' cid_concepts[25] = \ {'NCIt': ['Technetium99mTrofolastat'], 'SCT': ['TechnetiumTc99mTetrofosmin', 'IodinatedI131Albumin', 'FerrousChlorideFe59', 'ColloidalIndium111', 'SodiumIodideI131', 'Chromium51Chloride', 'Indium111RedCellLabel', 'TechnetiumTc99mAlbuminColloid', 'IodinatedI125OleicAcidAndTriolein', 'DiagnosticRadioisotope', 'SodiumIodideI123', 'Carbon14DXylose', 'Iodine131Polyvinylpyrrolidone', 'TechnetiumTc99mSulfurColloid', 'TechnetiumTc99mTeboroxime', 'Technetium99mPhytate', 'TechnetiumTc99mIronAscorbate', 'StrontiumNitrateSr87', 'ColloidalGoldAu198', 'TechnetiumTc99mPyroAndPolyphosphates', 'Iodine1233IodobenzylguanidineMIBG', 'TechnetiumTc99mSestamibi', 'RoseBengalSodiumI131', 'Copper64Acetate', 'Indium113mPentetate', 'Technetium99mDimercaptosuccinicAcidDMSA', 'TechnetiumTc99mMedronate', 'TechnetiumTc99mSuccimer', 'Technetium99mHydroxymethyleneDiphosphonateHMDP', 'TechnetiumTc99mSerumAlbumin', 'IodinatedI131AggregatedAlbumin', 'SodiumFluorideF18', 'SodiumPertechnetateTc99m', 'StrontiumNitrateSr85', 'TechnetiumTc99mDisofenin', 'Indium111Pentetreotide', 'TechnetiumTc99mMebrofenin', 'IodinatedI131GammaGlobulin', 'Indium111Chloride', 'SodiumChromateCr51', 'TechnetiumTc99mStannousEtidronate', 'FluorodeoxyglucoseF18', 'IodinatedI125RoseBengal', 'Indium111FeOHGreaterThan3LesserThan', 'TechnetiumTc99mLidofenin', 'SelenomethionioneSe75', 'FibrinogenI123', 'TechnetiumTc99mTaggedRedCells', 'TechnetiumTc99mOxidronate', 'IodinatedI125Povidone', 'IodohippurateI123Sodium', 'Selenium75HCAT', 'Iodine1313IodobenzylguanidineMIBG', 'TechnetiumTc99cAlbuminMicrospheres', 'StrontiumChlorideSr87', 'Technetium99mLabeledCarbon', 'DiiodofluoreceinI131', 'TechnetiumTc99mDepreotide', 'StrontiumChlorideSr85', 'ChromicPhosphateP32', 'IothalamateSodiumI125', 'CyanocobalaminCo57', 'Indium111Transferrin', 'IodinatedI125Levothyroxine', 'CyanocobalaminCo58', 'Technetium99mStannousColloid', 'Indium111Oxyquinoline', 'Indium111Pentetate', 'Copper67Ceruloplasmin', 'Indium113mOxoquinolineWBCLabel', 'Technetium99mMercaptoacetylTriglycineMAG3', 'SodiumChlorideNa24', 'Carbon14Triolein', 'Krypton81m', 'IodohippurateI131Sodium', 'Copper64Versenate', 'IodohippurateI125Sodium', 'PotassiumCarbonateK42', 'Indium113mChloride', 'Indium113mOxoquinolineRBCLabel', 'IofetamineI123Hydrochloride', 'TechnetiumTc99mPentetate', 'Iodine131Methylnorcholestenol', 'IodocholesterolI131', 'Chromium51Albumin', 'Iodine123154Iodophenyl3RSMethylpentadecanoicAcid', 'TechnetiumTc99mMicroaggregatedAlbumin', 'TechnetiumTc99mExametazine', 'Indium111CapromabPendetide', 'CholylCarbon14Glycine', 'TherapeuticRadioisotope', 'Technetium99mNPyridoxyl5Methyltryptophan', 'TechnetiumTc99mSodiumGlucoheptonate', 'DisodiumIndium111', 'PotassiumChlorideK42', 'PentetateCalciumTrisodiumYb169', 'FerrousCitrateFe59', 'Technetium99mGalactosylHumanSerumAlbuminDiethylenetriamine', 'CyanocobalaminCo60', 'OleicAcidI125', 'TechnetiumTc99mAggregatedAlbumin', 'IodinatedI125SodiumIodine', 'SodiumPhosphateP32', 'PotassiumChlorideK43', 'ThallousChlorideTl201', 'Indium113mOxoquinolinePlateletLabel', 'IodinatedI125HumanSerumAlbumin', 'IronFe59LabeledDextran', 'IodinatedI125Albumin', 'Indium113mBleomycin', 'FerrousSulfateFe59', 'IodinatedI125SealedSource', 'Gallium67Citrate', 'TechnetiumTc99mNSubstitutedIminodiacetate', 'SodiumChlorideNa22']} name_for_cid[3215] = 'PerfusionFindingMethod' cid_concepts[3215] = \ {'SCT': ['ECGAnalysis', 'ImageAnalysis']} name_for_cid[6017] = 'CompositeFeaturefromBIRADS®' cid_concepts[6017] = \ {'SCT': ['FocalAsymmetricBreastTissue', 'MammographicBreastMass', 'AsymmetricBreastTissue']} name_for_cid[12257] = 'CardiacUltrasoundLeftVentricle' 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', '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[9531] = 'VolumeandDoseDosimetricObjectives' cid_concepts[9531] = \ {'DCM': ['MaximumAbsoluteVolumeAtRadiationDose', 'MinimumAbsoluteVolumeAtRadiationDose']} name_for_cid[3429] = 'CatheterizationDevices' cid_concepts[3429] = \ {'DCM': ['Bioptome'], 'SCT': ['FiberopticCatheter', 'IntracoronaryPressureGuideWire', 'IntravascularOpticalCoherenceTomographyDevice', 'CuttingBalloonAngioplastyCBADevice', 'Laser', 'ThermistorCatheter', 'Sheath', 'BrachytherapyDevice', 'FluidFilledCatheter', 'DirectionalCoronaryAtherectomyDCADevice', 'SalineThrombectomy', 'HallCatheter', 'RotationalAtherectomyDevice', 'SwannGanzCatheter', 'GuidingCatheter', 'PercutaneousTransluminalAngioplastyBalloon', 'GuideWire', 'TipManometer', 'IntracoronaryDopplerGuideWire', 'IntravascularUltrasoundIVUSDevice', 'TransseptalCatheter', 'RadiofrequencyAblationDevice', 'Stent', 'TransluminalExtractionCatheterTEC', 'IntraAorticBalloonPumpIABP']} name_for_cid[226] = 'PopulationStatisticalDescriptors' cid_concepts[226] = \ {'DCM': ['StandardDeviationOfPopulation', '_2SigmaDeviationOfPopulation'], 'SCT': ['_1SigmaLowerValueOfPopulation', '_2SigmaLowerValueOfPopulation', '_5thPercentileValueOfPopulation', '_10thPercentileValueOfPopulation', '_2SigmaUpperValueOfPopulation', 'MeanValueOfPopulation', '_95thPercentileValueOfPopulation', '_90thPercentileValueOfPopulation', '_1SigmaUpperValueOfPopulation', 'MedianValueOfPopulation']} name_for_cid[601] = 'BiosafetyLevels' cid_concepts[601] = \ {'SCT': ['BiosafetyLevel2', 'BiosafetyLevel1', 'BiosafetyLevel4', 'BiosafetyLevel3']} name_for_cid[251] = 'SeverityofComplication' cid_concepts[251] = \ {'SCT': ['Minor', 'Major']} name_for_cid[9403] = 'IEC61217PatientSupportPositionParameters' cid_concepts[9403] = \ {'DCM': ['IEC61217TableTopLongitudinalPosition', 'IEC61217TableTopVerticalPosition', 'IEC61217PatientSupportContinuousAngle', 'IEC61217TableTopContinuousPitchAngle', 'IEC61217TableTopContinuousRollAngle', 'IEC61217TableTopEccentricAxisDistance', 'IEC61217TableTopContinuousEccentricAngle', 'IEC61217TableTopLateralPosition']} name_for_cid[4231] = 'LensStatus' cid_concepts[4231] = \ {'SCT': ['Pseudophakia', 'Phakic', 'PiggybackIOL', 'Aphakic', 'PhakicIOL']} name_for_cid[12220] = 'EchocardiographyCommonMeasurements' cid_concepts[12220] = \ {'LN': ['HeartRate']} name_for_cid[6060] = 'BreastBiopsyTechniques' cid_concepts[6060] = \ {'DCM': ['VacuumAssisted', 'Mammographic', 'Mammographic', 'PalpationGuided'], 'SCT': ['QuadrantectomyOfBreast', 'Lumpectomy', 'DiagnosticRadiographyStereotacticLocalization', 'Mammography', 'UltrasonicGuidanceProcedure', 'MagneticResonanceImagingGuidedBiopsy', 'ComputedTomographyGuidedBiopsy'], 'UMLS': ['Mastectomy']} name_for_cid[3262] = 'ECGPatientStateValues' cid_concepts[3262] = \ {'SCT': ['BaselineState', 'ExerciseState', 'SupineBodyPosition', 'PostExerciseState', 'RestingState']} name_for_cid[7221] = 'RTDosePurposeofReference' cid_concepts[7221] = \ {'DCM': ['SourceDoseForComposingCurrentDose']} name_for_cid[12109] = 'LowerExtremityArteries' cid_concepts[12109] = \ {'SCT': ['AnteriorTibialArtery', 'ExternalIliacArtery', 'SuperficialFemoralArtery', 'CommonFemoralArtery', 'PoplitealArtery', 'PlantarArterialArch', 'InternalIliacArtery', 'CommonIliacArteryBifurcation', 'CommonIliacArtery', 'ProfundaFemorisArtery', 'DorsalisPedisArtery', 'PosteriorTibialArtery', 'PeronealArtery']} name_for_cid[10071] = 'RadiationDoseUnits' cid_concepts[10071] = \ {'UCUM': ['Sv', 'Gy']} name_for_cid[3777] = 'ImplantedDevices' cid_concepts[3777] = \ {'SCT': ['ImplantableDefibrillator', 'CardiacPacemaker', 'LeftVentricularAssistDevice', 'InsulinPump']} name_for_cid[6125] = 'GeneralChestLocation' cid_concepts[6125] = \ {'SCT': ['Peripheral', 'Basal', 'Central', 'Apical']} name_for_cid[3409] = 'AdministrationofDrugs/Contrast' cid_concepts[3409] = \ {'DCM': ['DrugStart', 'DrugEnd', 'InfusateStart', 'InfusateEnd', 'ContrastEnd', 'ContrastAdministered', 'DrugAdministered', 'ContrastStart']} name_for_cid[4266] = 'OphthalmicAnatomicStructureReferencePoint' cid_concepts[4266] = \ {'DCM': ['DiscFovea'], 'SCT': ['Lesion', 'OpticNerveHead', 'MorphologicallyAbnormalStructure', 'Cornea', 'FoveaCentralis']} name_for_cid[8300] = 'VisualEvaluationMethods' cid_concepts[8300] = \ {'DCM': ['GrayscaleResolutionEvaluation', 'OverallImageQualityEvaluation', 'LuminanceUniformityEvaluation', 'LuminanceResponseEvaluation', 'ClinicalEvaluation', 'AngularViewingEvaluation', 'PixelFaultsEvaluation', 'ChromaticityEvaluation', 'GeometricalImageEvaluation', 'VeilingGlareEvaluation']} name_for_cid[12277] = 'CardiacUltrasoundPericardiumandPleuraMeasurements' cid_concepts[12277] = \ {'LN': ['ROIInternalDimensionByUS', 'ROIThicknessByUS'], 'SCT': ['Radius', 'MinorAxis', 'Length', 'Diameter', 'MajorAxis', 'Circumference']} name_for_cid[9511] = 'GeneralExternalRadiotherapyProcedureTechniques' cid_concepts[9511] = \ {'DCM': ['StaticBeam', 'SlidingWindowBeam', 'StepAndShootBeam', 'ConformalArcBeam', 'ArcBeam', 'VMAT']} name_for_cid[6] = 'TransducerOrientation' cid_concepts[6] = \ {'SCT': ['FiveChamber', 'LongAxis', 'Parasagittal', 'FourChamber', 'OffAxis', 'ShortAxis', 'TwoChamber', 'Oblique', 'Sagittal', 'Coronal', 'Transverse', 'Longitudinal']} name_for_cid[7276] = 'MRDiffusionModelInputs' cid_concepts[7276] = \ {'DCM': ['SourceImageDiffusionBValue']} name_for_cid[3235] = 'PerfusionComparisonFindings' cid_concepts[3235] = \ {'SCT': ['ResolutionOfIschemia', 'MoreIschemia', 'NewIschemia', 'LessIschemia', 'NoChange', 'NewInfarction']} name_for_cid[6037] = 'MammographyQuantitativeTemporalDifferenceType' cid_concepts[6037] = \ {'SCT': ['DifferenceInSize', 'DifferenceInLocation', 'DifferenceInOpacity', 'DifferenceInSpatialProximity', 'DifferenceInNumberOfCalcifications']} name_for_cid[640] = 'Fibrils' cid_concepts[640] = \ {'DCM': ['HumanAlphaSynucleinPreformedFibrils', 'MouseAlphaSynucleinPreformedFibrils', 'HumanTauPreformedFibrils', 'MouseTauPreformedFibrils']} name_for_cid[210] = 'QualitativeEvaluationModifierTypes' cid_concepts[210] = \ {'SCT': ['TopographicalModifier', 'Laterality']} name_for_cid[4270] = 'OCTAProcessingAlgorithmFamilies' cid_concepts[4270] = \ {'DCM': ['OCTACorrelationMapping', 'OCTASpeckleVariance', 'DopplerOCTA', 'OCTAOneSidedRatio', 'OCTAOneSidedRatio', 'OCTAComplexVariance', 'OCTAAmplitudeDecorrelation']} name_for_cid[9507] = 'ExternalBodyModels' cid_concepts[9507] = \ {'DCM': ['ExtendedPatientAnatomyModel', 'PatientAnatomyModel']} 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', '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[3809] = 'AssociatedConditions' cid_concepts[3809] = \ {'SCT': ['MarfanSyndrome', 'TraumaticAbnormality']} name_for_cid[6021] = 'QuadrantLocationfromBIRADS®' cid_concepts[6021] = \ {'SCT': ['UpperOuterQuadrantOfBreast', 'LowerInnerQuadrantOfBreast', 'LowerOuterQuadrantOfBreast', 'UpperInnerQuadrantOfBreast']} name_for_cid[7260] = 'DiffusionAcquisitionValueTypes' cid_concepts[7260] = \ {'DCM': ['HARDI', 'DKI', 'DTI', 'DSI', 'LSDI', 'SingleShotEPI', 'MultipleShotEPI', 'ParallelImaging']} name_for_cid[13] = 'RadiographicContrastAgentIngredient' cid_concepts[13] = \ {'SCT': ['Gadolinium', 'Barium', 'Iron', 'Iodine', 'CarbonDioxide', 'Oxygen', 'Air', 'Water', 'Xenon']} name_for_cid[10030] = 'DetectorTypes' cid_concepts[10030] = \ {'DCM': ['IndirectDetector', 'DirectDetector', 'StorageDetector', 'Film']} name_for_cid[3736] = 'NYHAClassification' cid_concepts[3736] = \ {'SCT': ['NYHAClassII', 'NYHAClassIII', 'NYHAClassI', 'NYHAClassIV']} name_for_cid[6164] = 'TimeIntervals' cid_concepts[6164] = \ {'DCM': ['LesserThan3MonthsAgo', '_4MonthsTo1YearAgo', 'GreaterThan1YearAgo', 'NotSure']} name_for_cid[3448] = 'AirwayAssessment' cid_concepts[3448] = \ {'DCM': ['AirwaySeverelyObstructed', 'AirwayUnobstructed', 'AirwayPartiallyObstructed']} name_for_cid[247] = 'LateralityLeftRightOnly' cid_concepts[247] = \ {'SCT': ['Right', 'Left']} name_for_cid[617] = 'AirwayManagementMethodCodeTypeforSmallAnimalAnesthesia' cid_concepts[617] = \ {'DCM': ['NoseCone', 'NasalCannula'], 'SCT': ['ViaTracheostomy', 'AnestheticFaceMask', 'ArtificialRespiration', 'ControlledVentilation', 'OxygenTherapy', 'IntubationOfRespiratoryTract', 'LaryngealMaskAirwayLMA']} name_for_cid[12236] = 'EchoAnatomicSites' cid_concepts[12236] = \ {'SCT': ['RightVentricleOutflowTract', 'PericardialEffusion', 'VentricularSeptalDefect', 'ThoracicAorticCoarctation', 'MitralAnnulus', 'Aorta', 'MedialMitralAnnulus', 'LeftVentricle', 'AtrialSeptalDefect', 'LateralMitralAnnulus', 'MitralValve', 'LeftVentricleOutflowTract', 'AorticValveRing', 'TricuspidAnnulus']} name_for_cid[6133] = 'ChestQuantitativeTemporalDifferenceType' cid_concepts[6133] = \ {'SCT': ['DifferenceInLocation', 'DifferenceInSize']} name_for_cid[6099] = 'RacialGroup' cid_concepts[6099] = \ {'NCIt': ['NativeHawaiianOrOtherPacificIslander'], 'SCT': ['AmericanIndianOrAlaskaNative', 'CaucasianRace', 'AfricanRace', 'AsianRace']} name_for_cid[3761] = 'AntilipemicAgents' cid_concepts[3761] = \ {'SCT': ['FishOils', 'Statins', 'Fibrate', 'AnionExchangeResin', 'BileAcidSequestrant']} name_for_cid[10067] = 'RadiationAttenuatorMaterials' cid_concepts[10067] = \ {'SCT': ['TinOrTinCompound', 'CarbonFiber', 'NiobiumOrNiobiumCompound', 'TantalumOrTantalumCompound', 'SilverOrSilverCompound', 'EuropiumOrEuropiumCompound', 'MolybdenumOrMolybdenumCompound', 'LeadOrLeadCompound', 'CopperOrCopperCompound', 'RhodiumOrRhodiumCompound', 'AluminumOrAluminumCompound']} name_for_cid[7165] = 'AbstractSegmentationTypes' cid_concepts[7165] = \ {'DCM': ['RegistrationInput', 'Background', 'SingleSubjectExtractedFromGroup'], 'NCIt': ['ReferenceRegion'], 'SCT': ['Normal', 'WasteMaterial', 'Tissue']} name_for_cid[7470] = 'LinearMeasurements' cid_concepts[7470] = \ {'DCM': ['Distance', 'Height', 'PathLength'], 'SCT': ['DiameterOfCircumscribedCircle', 'Radius', 'Perimeter', 'MinorAxis', 'Width', 'Diameter', 'MajorAxis', 'PerpendicularAxis', 'LongAxis', 'Depth', 'ShortAxis', 'Length', 'Circumference']} name_for_cid[12021] = 'FetalLongBoneAnatomicSites' cid_concepts[12021] = \ {'SCT': ['Femur', 'Ulna', 'Radius', 'Clavicle', 'Tibia', 'Fibula']} name_for_cid[7309] = 'HumanTraumaImplantComponentTypes' cid_concepts[7309] = \ {'SCT': ['DHSPlate', 'Screw', 'BonePlate', 'BoneNail']} 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[4030] = 'CT,MRandPETAnatomyImaged' cid_concepts[4030] = \ {'DCM': ['Phantom'], 'SCT': ['IliacAndOrFemoralArtery', 'BoneOfLowerLimb', 'Ureter', 'Sacrum', 'SmallIntestine', 'ParanasalSinus', 'InternalAuditoryCanal', 'WristJoint', 'Thymus', 'CarotidArtery', 'Humerus', 'Ilium', 'JawRegion', 'Calcaneus', 'NasalBone', 'Esophagus', 'Mandible', 'OpticCanal', 'MastoidBone', 'NeckChestAbdomenAndPelvis', 'Thigh', 'Spleen', 'ChestAndAbdomen', 'CoronaryArtery', 'Trachea', 'UpperLimb', 'AnkleJoint', 'Maxilla', 'Cerebellum', 'Mediastinum', 'Hand', 'UpperUrinaryTract', 'Bronchus', 'Pelvis', 'SesamoidBonesOfFoot', 'Eye', 'Chest', 'Prostate', 'ElbowJoint', 'AbdomenAndPelvis', 'FacialBones', 'Colon', 'Sternum', 'SubmandibularGland', 'ThoracicSpine', 'NeckAndChest', 'Duodenum', 'Gallbladder', 'RenalArtery', 'BileDuct', 'UpperArm', 'Extremity', 'PancreaticDuctAndBileDuctSystems', 'Larynx', 'PulmonaryArtery', 'Skull', 'ThoracoLumbarSpine', 'Liver', 'Urethra', 'Thyroid', 'HipJoint', 'Rib', 'BoneOfUpperLimb', 'Head', 'AdrenalGland', 'AcromioclavicularJoint', 'Clavicle', 'ParotidGland', 'SternoclavicularJoint', 'Breast', 'EsophagusStomachAndDuodenum', 'Neck', 'Finger', 'CranialVenousSystem', 'Stomach', 'ThoracicAorta', 'Coccyx', 'Abdomen', 'HeadAndNeck', 'Uterus', 'TemporomandibularJoint', 'ApexOfLung', 'Ileum', 'Testis', 'PelvisAndLowerExtremities', 'Bladder', 'Knee', 'LargeIntestine', 'Forearm', 'EyeRegion', 'Spine', 'LumboSacralSpine', 'Foot', 'NeckChestAndAbdomen', 'SacroiliacJoint', 'Anus', 'MuscleOfUpperLimb', 'EntireBody', 'Thumb', 'LumbarSpine', 'Zygoma', 'SellaTurcica', 'UterusAndFallopianTubes', 'LowerLimb', 'LowerLeg', 'AorticArch', 'VertebralColumnAndCranium', 'Jejunum', 'ChestAbdomenAndPelvis', 'AbdominalAorta', 'Heart', 'TarsalJoint', 'Toe', 'Shoulder', 'Fibula', 'OrbitalStructure', 'CircleOfWillis', 'Brain', 'MuscleOfLowerLimb', 'Parathyroid', 'CervicoThoracicSpine', 'Femur', 'Rectum', 'Pancreas', 'Scapula', 'Kidney', 'Patella', 'CervicalSpine']} name_for_cid[8101] = 'ContainerTypes' cid_concepts[8101] = \ {'SCT': ['SpecimenContainer', 'TissueMicroarrayCassette', 'ElectronMicroscopyGrid', 'TissueCassette', 'MicroscopeSlide', 'SpecimenVial', 'SpecimenWell']} name_for_cid[68] = 'ImagingAgentAdministrationPharmaceuticalUnitofPresentation' cid_concepts[68] = \ {'SCT': ['ParenteralEnteralSolutionBag', 'Syringe', 'Cartridge', 'Bottle']} name_for_cid[3608] = 'AtrialSourceLocations' cid_concepts[3608] = \ {'SCT': ['RightAtrium', 'PulmonaryCapillaryWedge', 'Baffle', 'CoronarySinus', 'LeftAtrium', 'CommonAtrium', 'JuxtaposedAppendage', 'SystemicVenousAtrium', 'PulmonaryVenousAtrium', 'PulmonaryArteryWedge', 'PulmonaryChamberInCorTriatriatum']} name_for_cid[3472] = 'CardiacContractionPhase' cid_concepts[3472] = \ {'SCT': ['Diastolic', 'Systolic']} name_for_cid[7061] = 'ModelDocumentTitles' cid_concepts[7061] = \ {'DCM': ['US3DCAMModel', 'SourceImage', 'MixedModality3DCAMModel', 'LaserScanning3DCAMModel', 'PhotogrammetricImaging3DCAMModel'], 'LN': ['CT3DCAMModel', 'MR3DCAMModel']} 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', 'BrachialPlexus', 'ErectorSpinaeMuscle', 'AorticValve', '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', 'PectoralisMajorMuscle', 'DorsalScapularArtery', 'SuperiorVenaCava', 'Sternum', 'CostalCartilage', 'BrachiocephalicTrunk', '_2ndRightPosterolateralCoronaryArtery', 'LeftPosteriorDescendingCircumflexCoronaryArtery', '_1stMarginalCoronaryArtery', 'PulmonaryTrunk', 'AzygosVein', 'PulmonaryArtery', 'BrachialArtery', '_2ndDiagonalCoronaryArtery', 'DistalCircumflexCoronaryArtery', 'MidLeftAnteriorDescendingCoronaryArtery', 'Thyroid', 'Rib', 'CoronaryArteryGraft', 'TeresMinorMuscle', 'MitralValve', 'AcromioclavicularJoint', 'LongissimusMuscle', 'SerratusAnteriorMuscle', 'SupraspinatusMuscle', 'Clavicle', 'AorticIsthmus', 'AxillaryFascia', 'Vertebra', 'ExternalIntercostalMuscle', '_1stLeftPosterolateralCoronaryArtery', 'InfraspinatusMuscle', 'TricuspidValve', 'CircumflexCoronaryArtery', 'Diaphragm', 'FissureOfLung', 'LevatoresCostarumMuscles', 'SuperiorPhrenicArtery', 'DistalLeftAnteriorDescendingCoronaryArtery', 'AtrialSeptalDefect', 'Ventricle', 'RightCoronaryArteryOstium', 'AxillaryArtery', 'DescendingAorta', 'MarginalCoronaryArtery', 'Atrium', 'InternalThoracicArtery', 'VertebralArtery', 'ProximalLeftAnteriorDescendingCoronaryArtery', '_3rdDiagonalCoronaryArtery', 'SpinalisMuscle', 'InternalJugularVein', 'Spine', 'BronchialArtery', 'ChordaeTendineaeCordis', 'RightMainBronchus', 'ScalenousAnteriorMuscle', 'AVGrooveContinuationOfCircumflexArtery', 'TrabeculaeCarnae', '_3rdRightPosterolateralCoronaryArtery', 'ThyrocervicalTrunk', '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', 'LeftMainCoronaryArteryOstium', 'AxillaryVein', 'LigamentumArteriosum', 'Scapula', 'SegmentOfLung', 'IliocostalisMuscle', '_1stRightPosterolateralCoronaryArtery', 'LobeOfLung']} 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[3560] = 'BloodPressureMethods' cid_concepts[3560] = \ {'SCT': ['BloodPressureCuffMethod']} name_for_cid[3833] = 'CardiacEjectionFraction' cid_concepts[3833] = \ {'LN': ['LeftVentricularEjectionFractionByCT', 'RightVentricularEjectionFractionByMR', 'LeftVentricularEjectionFractionByMR', 'RightVentricularEjectionFractionByCT']} name_for_cid[7466] = 'PETRegionofInterestMeasurements' cid_concepts[7466] = \ {'DCM': ['MetabolicVolume', 'TotalLesionGlycolysis', 'Glycolysis', 'TotalLesionProliferation', 'ProliferativeActivity', 'StandardizedAddedMetabolicActivity', 'StandardizedAddedMetabolicActivityBackground', 'LesionToBackgroundSUVRatio', 'BackgroundForLesionToBackgroundSUVRatio']} name_for_cid[7036] = 'ImageQualityAssessment' cid_concepts[7036] = \ {'RADLEX': ['NonDiagnosticQuality', 'LimitedQuality', 'DiagnosticQuality']} name_for_cid[3425] = 'InterventionParameters' cid_concepts[3425] = \ {'SCT': ['AblationPower', 'AblationFrequency', 'AngioplastyInflationPressure', 'AngioplastyInflationDuration', 'RotationalAtherectomySpeed', 'DeliveredRadiationDose']} name_for_cid[29] = 'AcquisitionModality' cid_concepts[29] = \ {'DCM': ['OphthalmicVisualField', 'DigitalRadiography', 'OphthalmicTomography', 'BoneMineralDensitometry', 'Mammography', 'SlideMicroscopy', 'Ultrasound', 'OphthalmicPhotography', 'IntravascularOpticalCoherenceTomography', 'MagneticResonance', 'Electrocardiography', 'GeneralMicroscopy', 'IntraOralRadiography', 'XRayAngiography', 'RTImage', 'VisualAcuity', 'ExternalCameraPhotography', 'RespiratoryWaveform', 'IntravascularUltrasound', 'ComputedRadiography', 'Endoscopy', 'Autorefraction', 'ComputedTomography', 'OpticalSurfaceScanner', 'Thermography', 'Lensometry', 'RadiographicImaging', 'Radiofluoroscopy', 'Keratometry', 'OphthalmicTomographyEnFace', 'HemodynamicWaveform', 'OphthalmicAxialMeasurements', 'NuclearMedicine', 'OpticalCoherenceTomography', 'UltrasoundBoneDensitometry', 'Diaphanography', 'PositronEmissionTomography', 'BiomagneticImaging', 'CardiacElectrophysiology', 'LaserScan', 'PanoramicXRay', 'SubjectiveRefraction', 'OphthalmicMapping', 'OphthalmicTomographyBScanVolumeAnalysis']} name_for_cid[9301] = 'ModalityPPSDiscontinuationReasons' 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[800] = 'ProtocolAssertionCodes' 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[4026] = 'PrimaryAnatomicStructureforIntraoralandCraniofacialRadiographyTeeth' cid_concepts[4026] = \ {'SCT': ['DeciduousMandibularRightLateralIncisorTooth', 'SupernumeraryPermanentMandibularLeftThirdMolarTooth', 'SupernumeraryDeciduousMaxillaryLeftFirstMolarTooth', 'SupernumeraryPermanentMaxillaryLeftSecondPremolarTooth', 'SupernumeraryDeciduousMandibularRightCanineTooth', 'MaxillaryLeftSecondPremolarTooth', 'MandibularRightLateralIncisorTooth', 'DeciduousMandibularRightCanineTooth', 'MandibularRightFirstMolarTooth', 'MaxillaryLeftSecondMolarTooth', 'SupernumeraryPermanentMaxillaryRightFirstPremolarTooth', 'MaxillaryRightLateralIncisorTooth', 'SupernumeraryPermanentMaxillaryLeftThirdMolarTooth', 'DeciduousMandibularLeftLateralIncisorTooth', 'MaxillaryRightFirstMolarTooth', 'MandibularLeftCentralIncisorTooth', 'SupernumeraryPermanentMandibularRightFirstMolarTooth', 'SupernumeraryDeciduousMaxillaryLeftCentralIncisorTooth', 'MaxillaryRightFirstPremolarTooth', 'DeciduousMaxillaryRightLateralIncisorTooth', 'SupernumeraryPermanentMaxillaryRightCentralIncisorTooth', 'MaxillaryLeftLateralIncisorTooth', 'DeciduousMaxillaryLeftCentralIncisorTooth', 'DeciduousMaxillaryRightCanineTooth', 'SupernumeraryPermanentMandibularRightCentralIncisorTooth', 'MandibularRightCentralIncisorTooth', 'SupernumeraryPermanentMandibularLeftFirstMolarTooth', 'SupernumeraryPermanentMaxillaryLeftSecondMolarTooth', 'DeciduousMandibularLeftCanineTooth', 'SupernumeraryDeciduousMandibularRightSecondMolarTooth', 'DeciduousMandibularRightSecondMolarTooth', 'SupernumeraryDeciduousMandibularLeftCanineTooth', 'DeciduousMandibularRightFirstMolarTooth', 'SupernumeraryPermanentMandibularLeftCentralIncisorTooth', 'SupernumeraryPermanentMaxillaryRightFirstMolarTooth', 'SupernumeraryDeciduousMaxillaryRightSecondMolarTooth', 'MandibularLeftSecondMolarTooth', 'MaxillaryLeftCanineTooth', 'MandibularLeftFirstPremolarTooth', 'SupernumeraryPermanentMandibularLeftSecondMolarTooth', 'MandibularLeftFirstMolarTooth', 'MandibularRightFirstPremolarTooth', 'DeciduousMaxillaryLeftLateralIncisorTooth', 'MandibularLeftLateralTooth', 'DeciduousMandibularLeftCentralIncisorTooth', 'SupernumeraryDeciduousMaxillaryRightLateralIncisorTooth', 'MaxillaryLeftCentralIncisorTooth', 'SupernumeraryDeciduousMandibularLeftCentralIncisorTooth', 'SupernumeraryPermanentMandibularRightThirdMolarTooth', 'SupernumeraryPermanentMaxillaryLeftLateralIncisorTooth', 'DeciduousMandibularLeftFirstMolarTooth', 'DeciduousMandibularRightCentralIncisorTooth', 'SupernumeraryPermanentMandibularRightCanineTooth', 'SupernumeraryPermanentMandibularLeftFirstPremolarTooth', 'DeciduousMaxillaryRightCentralIncisorTooth', 'SupernumeraryDeciduousMaxillaryLeftLateralIncisorTooth', 'SupernumeraryPermanentMaxillaryRightThirdMolarTooth', 'MaxillaryRightCentralIncisorTooth', 'MandibularRightCanineTooth', 'DeciduousMaxillaryLeftSecondMolarTooth', 'SupernumeraryPermanentMaxillaryLeftCentralIncisorTooth', 'SupernumeraryPermanentMandibularLeftLateralIncisorTooth', 'MaxillaryRightSecondPremolarTooth', 'SupernumeraryPermanentMandibularRightLateralIncisorTooth', 'SupernumeraryPermanentMaxillaryRightSecondMolarTooth', 'SupernumeraryDeciduousMaxillaryRightFirstMolarTooth', 'SupernumeraryPermanentMandibularLeftSecondPremolarTooth', 'SupernumeraryDeciduousMaxillaryLeftSecondMolarTooth', 'MandibularLeftThirdMolarTooth', 'SupernumeraryDeciduousMandibularRightLateralIncisorTooth', 'DeciduousMaxillaryLeftFirstMolarTooth', 'SupernumeraryPermanentMaxillaryLeftFirstPremolarTooth', 'SupernumeraryPermanentMaxillaryRightCanineTooth', 'SupernumeraryDeciduousMandibularLeftFirstMolarTooth', 'SupernumeraryDeciduousMaxillaryRightCentralIncisorTooth', 'SupernumeraryPermanentMandibularRightSecondPremolarTooth', 'MaxillaryLeftFirstPremolarTooth', 'DeciduousMandibularLeftSecondMolarTooth', 'MandibularLeftSecondPremolarTooth', 'SupernumeraryPermanentMaxillaryLeftCanineTooth', 'MaxillaryLeftThirdMolarTooth', 'MandibularLeftCanineTooth', 'MaxillaryRightCanineTooth', 'MandibularRightSecondPremolarTooth', 'SupernumeraryDeciduousMandibularLeftSecondMolarTooth', 'SupernumeraryDeciduousMandibularLeftLateralIncisorTooth', 'SupernumeraryPermanentMandibularRightFirstPremolarTooth', 'SupernumeraryPermanentMandibularLeftCanineTooth', 'DeciduousMaxillaryRightFirstMolarTooth', 'SupernumeraryDeciduousMaxillaryLeftCanineTooth', 'SupernumeraryPermanentMaxillaryLeftFirstMolarTooth', 'MaxillaryRightThirdMolarTooth', 'SupernumeraryDeciduousMandibularRightFirstMolarTooth', 'SupernumeraryPermanentMaxillaryRightLateralIncisorTooth', 'MaxillaryRightSecondMolarTooth', 'MandibularRightSecondMolarTooth', 'DeciduousMaxillaryRightSecondMolarTooth', 'MaxillaryLeftFirstMolarTooth', 'SupernumeraryPermanentMaxillaryRightSecondPremolarTooth', 'SupernumeraryDeciduousMaxillaryRightCanineTooth', 'SupernumeraryPermanentMandibularRightSecondMolarTooth', 'SupernumeraryDeciduousMandibularRightCentralIncisorTooth', 'MandibularRightThirdMolarTooth', 'DeciduousMaxillaryLeftCanineTooth']} name_for_cid[9300] = 'ProcedureDiscontinuationReasons' 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', 'Sweating', 'InjectionSiteAnesthesia', 'FacialSwelling', 'InjectionSiteInduration', 'InjectionSiteUrticaria', 'Bronchospasm', 'InjectionSiteMalabsorption', 'InjectionSiteSterileAbscess', 'Headache', 'SensationOfBeingWarm', 'TachycardiaBradycardia', 'InjectionSiteNecrosis', 'Anxiety', 'InjectionSiteDermatitis', 'InjectionSiteDisorder', 'Shaking', 'InjectionSiteBruising', 'DrugInducedFlushing', 'CardiacArrhythmia', 'LaryngealEdema', 'InjectionSiteThrombosis', 'InjectionSiteAbscess', 'DrugInducedDizziness', 'InjectionSiteReaction', 'CardiorespiratoryArrest', 'InjectionSiteCyst', 'Hypertension', 'InjectionSiteEdema', 'Dyspnea', 'InjectionSiteAtrophy', 'DrugInducedHypotension', 'InjectionSiteBurning', 'InjectionSiteHemorrhage', 'InjectionSiteUlcer', 'EpilepticConvulsions', 'Itching', 'DrugRash', 'InjectionSiteInflammation', 'InjectionSiteInfection', 'Hypotension', 'DiffuseInflammatoryErythema', 'TasteAndSenseAltered', 'InjectionSiteParesthesia', 'NasalCongestion', 'NoMotorResponseToCommand', 'InjectionSitePain', 'DrugInducedNauseaAndVomiting', 'InjectionSiteMass', 'InjectionSiteGranuloma']} name_for_cid[3832] = 'StenosisGrade' cid_concepts[3832] = \ {'SCT': ['Moderate', 'Mild', 'Severe']} name_for_cid[7467] = 'GrayLevelCooccurrenceMatrixMeasurements' cid_concepts[7467] = \ {'DCM': ['RootAngularSecondMomentOfGLCM']} name_for_cid[6108] = 'ChestAnatomicStructureAbnormalDistribution' cid_concepts[6108] = \ {'DCM': ['ArchitecturalDistortion', 'MosaicPerfusion', 'Pleonemia', 'Oligemia'], 'SCT': ['AirTrapping']} name_for_cid[12124] = 'RenalRatios' cid_concepts[12124] = \ {'LN': ['RenalArteryAortaVelocityRatio']} name_for_cid[7060] = 'EncapsulatedDocumentSourcePurposesofReference' cid_concepts[7060] = \ {'DCM': ['SourceMeasurement', 'SourceRawData', 'SourceImage', 'SourceReport', 'SourceRealWorldValueMap']} name_for_cid[69] = 'ImagingAgentAdministrationConsumables' cid_concepts[69] = \ {'SCT': ['ContrastMediumInjectionSystemManifoldKit', 'Syringe', 'Catheter', 'Needle', 'TubeDevice', 'Bottle']} name_for_cid[3609] = 'VentricularSourceLocations' cid_concepts[3609] = \ {'SCT': ['RightVentricleOutflowTract', 'LeftVentricleInflow', 'RightVentricle', 'LeftVentricle', 'RightVentricleInflow', 'CommonVentricle', 'LeftVentricleApex', 'RightVentricleApex', 'LeftVentricleOutflowTract']} name_for_cid[3520] = 'BloodSourceType' cid_concepts[3520] = \ {'SCT': ['SystemicArteryBlood', 'PulmonaryVeinBlood', 'MixedVenousBlood', 'PulmonaryArteryBlood']} name_for_cid[3465] = 'QAReferenceMethods' cid_concepts[3465] = \ {'DCM': ['CurveFittedReference', 'InterpolatedLocalReference', 'MeanLocalReference']} name_for_cid[12020] = 'FetalBiometryAnatomicSites' cid_concepts[12020] = \ {'SCT': ['Foot', 'Femur', 'Cerebellum', 'Skull', 'Thorax', 'Abdomen', 'CisternaMagna', 'Kidney', 'Trunk']} name_for_cid[7308] = 'HumanHipImplantComponentTypes' cid_concepts[7308] = \ {'DCM': ['FemoralStem', 'FemoralStemDistalComponent', 'FemoralHeadConeTaperComponent', 'FemoralStemProximalComponent', 'FemoralStemComponent', 'NeckComponent', 'DistalCentralizer', 'MonoblockStem', 'AcetabularCupShell', 'ProstheticShaftAugment', 'AcetabularCupInsert', 'FemoralHeadResurfacingComponent', 'AcetabularCupMonoblock', 'FemoralHeadBallComponent'], 'SCT': ['FemoralHeadProsthesis']} 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[4031] = 'CommonAnatomicRegions' cid_concepts[4031] = \ {'DCM': ['Phantom'], 'SCT': ['BoneOfLowerLimb', 'Ureter', 'Sacrum', 'SmallIntestine', 'ParanasalSinus', 'InternalAuditoryCanal', 'WristJoint', 'Humerus', 'Ilium', 'JawRegion', 'Calcaneus', 'NasalBone', 'Esophagus', 'Mandible', 'OpticCanal', 'MastoidBone', 'NeckChestAbdomenAndPelvis', 'Thigh', 'ChestAndAbdomen', 'Trachea', 'UpperLimb', 'AnkleJoint', 'Maxilla', 'Mediastinum', 'Hand', 'UpperUrinaryTract', 'Bronchus', 'Pelvis', 'SesamoidBonesOfFoot', 'Eye', 'Chest', 'Prostate', 'ElbowJoint', 'AbdomenAndPelvis', 'FacialBones', 'Colon', 'Sternum', 'SubmandibularGland', 'ThoracicSpine', 'NeckAndChest', 'Duodenum', 'Gallbladder', 'BileDuct', 'UpperArm', 'Extremity', 'PancreaticDuctAndBileDuctSystems', 'Larynx', 'Skull', 'ThoracoLumbarSpine', 'Urethra', 'HipJoint', 'Rib', 'BoneOfUpperLimb', 'Head', 'AcromioclavicularJoint', 'Clavicle', 'ParotidGland', 'SternoclavicularJoint', 'Breast', 'EsophagusStomachAndDuodenum', 'Neck', 'Finger', 'Stomach', 'Coccyx', 'Abdomen', 'HeadAndNeck', 'TemporomandibularJoint', 'ApexOfLung', 'Ileum', 'PelvisAndLowerExtremities', 'Bladder', 'Knee', 'LargeIntestine', 'Forearm', 'EyeRegion', 'Spine', 'LumboSacralSpine', 'Foot', 'NeckChestAndAbdomen', 'SacroiliacJoint', 'Anus', 'MuscleOfUpperLimb', 'EntireBody', 'Thumb', 'LumbarSpine', 'Zygoma', 'SellaTurcica', 'UterusAndFallopianTubes', 'LowerLimb', 'LowerLeg', 'VertebralColumnAndCranium', 'Jejunum', 'ChestAbdomenAndPelvis', 'Heart', 'TarsalJoint', 'Toe', 'Shoulder', 'Fibula', 'OrbitalStructure', 'MuscleOfLowerLimb', 'CervicoThoracicSpine', 'Femur', 'Rectum', 'Scapula', 'Patella', 'CervicalSpine']} name_for_cid[7021] = 'MeasurementReportDocumentTitles' cid_concepts[7021] = \ {'DCM': ['ImagingMeasurementReport', 'OncologyMeasurementReport', 'DynamicContrastMRMeasurementReport', 'PETMeasurementReport']} name_for_cid[7471] = 'AreaMeasurements' cid_concepts[7471] = \ {'SCT': ['Area', 'AreaOfDefinedRegion']} name_for_cid[6132] = 'ChestCalcificationDescriptor' cid_concepts[6132] = \ {'DCM': ['Target', 'Fibrocalcific', 'Flocculent'], 'SCT': ['Nodular', 'Ossification', 'Laminated', 'CoarsePopcornLikeCalcification', 'EggshellCalcification']} name_for_cid[6098] = 'ClinicalCourseofDisease' cid_concepts[6098] = \ {'NCIt': ['NoEvidenceOfDisease', 'RecurrentDisease']} name_for_cid[3760] = 'HypertensionTherapy' cid_concepts[3760] = \ {'SCT': ['BetaBlocker', 'Diuretic', 'AngiotensinIIReceptorAntagonist', 'ACEInhibitor', 'CalciumChannelBlocker', 'NitrateVasodilator']} name_for_cid[10066] = 'AttenuatorCategory' cid_concepts[10066] = \ {'DCM': ['BeamBlock', 'XRayFilters', 'Table', 'TableCore', 'PatientSupport', 'TablePad', 'TableOuterLiner'], 'SCT': ['XRayShield', 'ShieldingBlock']} name_for_cid[3019] = 'CardiovascularAnatomicLocationModifiers' cid_concepts[3019] = \ {'DCM': ['GraftToCitedSegmentDistalSection', 'GraftToCitedSegmentProximalSection', 'GraftToCitedSegmentMidSection', 'Median', 'AneurysmOnCitedVessel'], 'NCIt': ['Middle'], 'SCT': ['VenousGraftToCitedSegment', 'EntireVessel', 'Central', 'Right', 'Posterior', 'Left', 'Superior', 'ArterialGraftToCitedSegment', 'Distal', 'Proximal', 'MidLongitudinal', 'Lateral', 'Inferior', 'GraftToCitedSegmentDistalAnastomosis', 'Ostium', 'Anterior', 'GraftToCitedSegmentBody', 'GraftToCitedSegmentProximalAnastomosis']} name_for_cid[246] = 'RelativeLaterality' cid_concepts[246] = \ {'SCT': ['Contralateral', 'Ipsilateral']} name_for_cid[616] = 'AnesthesiaMaintenanceCodeTypefromAnesthesiaQualityInitiative(AQI)' cid_concepts[616] = \ {'SCT': ['InhalationAnesthesiaSystemClosedRebreathingPrimaryAgent', 'InhalationAnesthesiaSystemClosedNoRebreathingPrimaryAgent']} name_for_cid[12237] = 'EchocardiographyAnatomicSiteModifiers' cid_concepts[12237] = \ {'SCT': ['RightLowerSegment', 'RightUpperSegment', 'LeftLowerSegment', 'LeftUpperSegment']} name_for_cid[6020] = 'QuadrantLocation' cid_concepts[6020] = \ {'SCT': ['UpperOuterQuadrantOfBreast', 'LowerInnerQuadrantOfBreast', 'LowerOuterQuadrantOfBreast', 'UpperInnerQuadrantOfBreast']} name_for_cid[7261] = 'DiffusionModelValueTypes' cid_concepts[7261] = \ {'DCM': ['SingleTensor', 'MultiTensor', 'ModelFree', 'CHARMED', 'DSI', 'DOT', 'PAS', 'SphericalDeconvolution']} name_for_cid[12] = 'RadiographicContrastAgent' cid_concepts[12] = \ {'DCM': ['NonIonicIodinatedContrastAgent'], 'SCT': ['MeglumineIodipamide', 'Iophendylate', 'Iodipamide', 'Ioxilan', 'Bunamiodyl', 'Ioversol', 'Gadodiamide', 'Metrizamide', 'Iodixanol', 'Ipodate', 'Oxygen', 'BariumSulfate', 'SodiumTyropanoate', 'Iohexol', 'Water', 'GadopentetateDimeglumine', 'SodiumAcetrizoate', 'Propyliodone', 'ContrastAgent', 'IodoalphionicAcid', 'Iodopyracet', 'SodiumDiprotrizoate', 'Iothalamate', 'Iodophthalein', 'Ioxaglate', 'MeglumineDiatrizoate', 'MangafodipirTrisodium', 'IodamideMeglumine', 'SodiumIodipamide', 'SodiumDiatrizoate', 'Diatrizoate', 'NonRadiopaqueMedium', 'ChloriodizedOil', 'IophenoxicAcid', 'Air', 'Iopamidol', 'Iopromide', 'IopanoicAcid', 'Gadolinium', 'Metrizoate', 'IonicIodinatedContrastAgent', 'IodizedOil', 'CarbonDioxide', 'SodiumIodomethamate']} name_for_cid[10031] = 'CR/DRMechanicalConfiguration' cid_concepts[10031] = \ {'DCM': ['TableMount', 'UprightStandMount', 'UnmountedDetector', 'CArmMount']} name_for_cid[3737] = 'NoninvasiveTestIschemia' cid_concepts[3737] = \ {} name_for_cid[6165] = 'BreastLinearMeasurements' cid_concepts[6165] = \ {'DCM': ['Distance', 'Height', 'DistanceFromChestWall', 'PathLength', 'DistanceFromNipple', 'DistanceFromSkin'], 'SCT': ['DiameterOfCircumscribedCircle', 'Radius', 'Perimeter', 'MinorAxis', 'Width', 'Diameter', 'MajorAxis', 'PerpendicularAxis', 'LongAxis', 'Depth', 'ShortAxis', 'Length', 'Circumference']} name_for_cid[641] = 'Viruses' cid_concepts[641] = \ {'SCT': ['TheilerMurineEncephalomyelitisVirus', 'AdenoAssociatedVirusGroup']} name_for_cid[211] = 'QualitativeEvaluationModifierValues' cid_concepts[211] = \ {'DCM': ['Median'], 'NCIt': ['Middle'], 'SCT': ['Bilateral', 'Central', 'Right', 'Posterior', 'Left', 'Unilateral', 'Superior', 'Distal', 'Proximal', 'MidLongitudinal', 'Lateral', 'Inferior', 'Anterior']} name_for_cid[4271] = 'EnFaceImageTypes' 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[9506] = 'BrachytherapyDevices' cid_concepts[9506] = \ {'DCM': ['BrachytherapyChannelShield', 'BrachytherapySourceApplicator', 'BrachytherapyChannel']} name_for_cid[12260] = 'CardiacUltrasoundPulmonaryArtery' 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', '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[3808] = 'AneurysmTypes' 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[7] = 'UltrasoundBeamPath' cid_concepts[7] = \ {'SCT': ['TransGastric', 'TransMural', 'TransHepatic', 'TransAbdominal', 'TransVaginal', 'TransThecal', 'TransVesical', 'TransSplenic', 'TransPleural', 'TransEsophageal', 'TransPancreatic', 'TransRenal', 'TransOrbital', 'TransTemporal']} name_for_cid[7277] = 'UnitsofDiffusionRateAreaOverTime' cid_concepts[7277] = \ {'UCUM': ['Mm2S', 'Um2ms', '_106Mm2S', 'Um2S']} name_for_cid[3234] = 'EctopicBeatMorphology' cid_concepts[3234] = \ {'SCT': ['VentricularTachycardiaPolymorphic', 'VentricularBigeminy', 'VentricularTachycardia', 'UnifocalPvcs', 'MultifocalPvcs']} name_for_cid[6036] = 'ScopeofFeature' cid_concepts[6036] = \ {'DCM': ['FeatureDetectedOnTheOnlyImage', 'FeatureDetectedOnOnlyOneOfTheImages', 'FeatureDetectedOnMultipleImages', 'FeatureDetectedOnImagesFromMultipleModalities']} name_for_cid[3664] = 'OxygenConsumptionEquationsandTables' cid_concepts[3664] = \ {'DCM': ['VO2EqualsVestpd10FIO2FE02', 'Vo2maleEqualsBSA138Point111Point49LogeAge0Point378Hrf', 'Vo2femaleEqualsBSA138Point117Point04LogeAge0Point378Hrf', 'FleischTable', 'BoothbyTable', 'VO2Equals176BSA', 'RobertsonReidTable', 'VO2Equals152BSA', 'VO2Equals175BSA']} name_for_cid[3721] = 'CardiovascularSurgeries' cid_concepts[3721] = \ {'SCT': ['AbdominalAorticAneurysmStenting', 'CorrectionOfCongenitalCardiovascularDeformity', 'CoronaryArteryBypassGraft', 'OperationOnHeartValve', 'HeartTransplant', 'ImplantationOfCardiacPacemaker', 'PercutaneousCoronaryIntervention', 'ImplantationOfAutomaticCardiacDefibrillator', 'AblationOperationForArrhythmia']} name_for_cid[3408] = 'ActionsWithConsumables' cid_concepts[3408] = \ {'DCM': ['RemainingConsumableDisposed', 'ConsumableUnusable', 'ConsumableTakenFromInventory', 'ConsumableReturnedToInventory']} name_for_cid[4267] = 'CornealTopographyMappingUnitsforRealWorldValueMapping' cid_concepts[4267] = \ {'UCUM': ['mm', 'Micrometer', 'Diopters']} name_for_cid[8301] = 'TestPatternCodes' 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', 'DINGrayscalePattern', 'TG18LN810Pattern', 'TG18LN809Pattern', 'TG18LN806Pattern', 'DINGeometryPattern', '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[12276] = 'CardiacUltrasoundAortoPulmonaryConnectionsMeasurements' 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', 'SystolicToDiastolicVelocityRatio', 'EFSlope', 'PeakReversalVelocityDuringAtrialContraction', 'TimeAveragedMeanVelocity'], 'SCT': ['RegurgitantFraction', 'CardiovascularOrificeArea', 'CardiovascularOrificeDiameter']} name_for_cid[9510] = 'PurposeofReferenceforRTTreatmentPlanningInput' cid_concepts[9510] = \ {'DCM': ['RTTreatmentPlanningInputImages', 'DiagnosticSourceImages', 'RegistrationResult', 'SegmentationResult', 'RTPrescriptionResult']} name_for_cid[6061] = 'BreastImagingProcedureModifiers' cid_concepts[6061] = \ {'DCM': ['Calibration', 'NeedleLocalizationAndBiopsy', 'QualityControl', 'MarkerPlacement', 'Targeted', 'Survey'], 'SCT': ['Diagnostic', 'Screening']} name_for_cid[3263] = 'ElectrodePlacementValues' 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[7220] = 'RTDoseDerivation' cid_concepts[7220] = \ {'DCM': ['ComposedFromPriorDoses', 'ComposedFromPriorDosesAndCurrentPlan']} name_for_cid[12108] = 'UpperExtremityVeins' cid_concepts[12108] = \ {'SCT': ['InnominateVein', 'SubclavianVein', 'UlnarVein', 'DeepPalmarVenousArch', 'BasilicVein', 'SuperficialPalmarVenousArch', 'InternalJugularVein', 'BrachialVein', 'SuperiorVenaCava', 'CephalicVein', 'AxillaryVein', 'MedianCubitalVein', 'RadialVein']} name_for_cid[10070] = 'RadiationDoseTypes' cid_concepts[10070] = \ {'DCM': ['EquivalentDose', 'AbsorbedDose']} name_for_cid[6124] = 'LocationinChest' cid_concepts[6124] = \ {'DCM': ['Subpleural'], 'SCT': ['Peripheral', 'Basal', 'LowerLobeOfLung', 'Central', 'AnteriorSegmentOfRightUpperLobe', 'UpperZoneOfLung', 'LowerZoneOfLung', 'Apical', 'PosteriorSegmentOfRightUpperLobe', 'MiddleZoneOfLung', 'MiddleLobeOfLung', 'AnteriorSegmentOfLeftUpperLobe', 'UpperLobeOfLung']} name_for_cid[250] = 'PositiveNegative' cid_concepts[250] = \ {'SCT': ['Negative', 'Positive']} name_for_cid[9402] = 'IEC61217GantryPositionParameters' cid_concepts[9402] = \ {'DCM': ['IEC61217GantryContinuousRollAngle', 'IEC61217GantryContinuousPitchAngle', 'IEC61217GantryContinuousYawAngle']} name_for_cid[4230] = 'OphthalmicUltrasoundAxialMeasurementsType' cid_concepts[4230] = \ {'DCM': ['UltrasoundContact', 'UltrasoundImmersion']} name_for_cid[12221] = 'FlowDirection' cid_concepts[12221] = \ {'SCT': ['RetrogradeFlow', 'AntegradeFlow', 'RegurgitantFlow', 'RightToLeftCardiovascularShunt', 'LeftToRightCardiovascularShunt']} name_for_cid[7484] = 'DXViewforAnimals' 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', 'Mediolateral', 'Palmar45DegreeMedialDorsolateral', 'DorsolateralPlantaromedialOblique', 'Palmar75DegreeProximalDorsodistalOblique', 'RightVentralLeftDorsalOblique']} name_for_cid[9530] = 'PercentageandDoseDosimetricObjectives' cid_concepts[9530] = \ {'DCM': ['MinimumPercentVolumeAtRadiationDose', 'MaximumPercentVolumeAtRadiationDose']} name_for_cid[3428] = 'ImagingProcedures' cid_concepts[3428] = \ {'DCM': ['ArterialConduitAngiography'], 'SCT': ['TransthoracicEchocardiography', 'CardiacVentriculography', 'RightVentriculography', 'LeftVentriculography', 'IntravascularUltrasound', 'IntracardiacEchocardiography', 'CoronaryArteriography', 'Aortography', 'EpicardialEchocardiography', 'BypassGraftAngiography', 'Angiography', 'TransesophagealEchocardiography']} name_for_cid[227] = 'SampleStatisticalDescriptors' cid_concepts[227] = \ {'DCM': ['PercentileRankingOfMeasurement', 'ZScoreOfMeasurement']} name_for_cid[7191] = 'TissueSegmentationPropertyTypes' cid_concepts[7191] = \ {'SCT': ['Ligament', 'Nerve', 'Artery', 'ConnectiveTissue', 'LymphaticSystem', 'Capillary', 'Meniscus', 'ScarTissue', 'BloodVessel', 'Tissue', 'Cartilage', 'Organ', 'Vein', 'Muscle', 'Skin', 'Blood', 'Bone', 'LymphaticVessel', 'LymphNode', 'BodyFat', 'Tendon']} name_for_cid[6153] = 'LesionBoundary' cid_concepts[6153] = \ {'DCM': ['AbruptInterface', 'EchogenicHalo']} name_for_cid[3701] = 'CardiacValvesandTracts' cid_concepts[3701] = \ {'SCT': ['TricuspidValve', 'PulmonaryValve', 'AorticValve', 'MitralValve', 'LeftVentricleOutflowTract']} name_for_cid[10007] = 'XRayFilterTypes' cid_concepts[10007] = \ {'DCM': ['StripFilter', 'NoFilter', 'WedgeFilter', 'ButterflyFilter', 'FlatFilter']} 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[12201] = 'LeftVentricleLinear' cid_concepts[12201] = \ {'LN': ['LeftVentricleInternalEndDiastolicDimension', 'LeftVentricleDiastolicMajorAxis', 'InterventricularSeptumPercentThickening', 'LeftVentriclePosteriorWallPercentThickening', 'LeftVentricleInternalSystolicDimension', 'LeftVentricularFractionalShortening', 'LeftVentricleSystolicMajorAxis', 'InterventricularSeptumSystolicThickness', 'LeftVentriclePosteriorWallDiastolicThickness', 'LeftVentriclePosteriorWallSystolicThickness', 'InterventricularSeptumToPosteriorWallThicknessRatio', 'InterventricularSeptumDiastolicThickness'], 'SCT': ['LeftVentricleTruncatedSemiMajorAxisDiastolicDimension', 'LeftVentricleSemiMajorAxisDiastolicDimension']} name_for_cid[620] = 'AirwayManagementSubMethodCodeTypefromAnesthesiaQualityInitiative(AQI)' cid_concepts[620] = \ {'SCT': ['HighFrequencyVentilation', 'TranstrachealJetVentilation', 'ContinuousFlowVentilation'], 'UMLS': ['InverseRatioVentilation']} name_for_cid[270] = 'ObserverType' cid_concepts[270] = \ {'DCM': ['Person', 'Device']} name_for_cid[4210] = 'OphthalmicTomographyAcquisitionDevice' cid_concepts[4210] = \ {'DCM': ['ReflectionBasedCornealTopographer', 'InterferometryBasedCornealTomographer', 'ScheimpflugCamera', 'ElevationBasedCornealTomographer'], 'SCT': ['ScanningLaserPolarimeter', 'OpticalCoherenceTomographyScanner', 'RetinalThicknessAnalyzer', 'ConfocalScanningLaserOphthalmoscope']} name_for_cid[73] = 'BolusShapingCurves' cid_concepts[73] = \ {'DCM': ['LinearCurve', 'NegativeExponential']} name_for_cid[10050] = 'SummaryRadiationExposureQuantities' cid_concepts[10050] = \ {'DCM': ['EffectiveDose', 'TotalFluoroTime', 'TotalNumberOfRadiographicFrames', 'MeanCtdivol', 'DoseAreaProductTotal', 'CTDoseLengthProductTotal', 'EntranceExposureAtRP', 'AcquisitionDoseAreaProductTotal', 'AccumulatedAverageGlandularDose', 'FluoroDoseAreaProductTotal', 'AdministeredActivity']} name_for_cid[3756] = 'CardiacPatientRiskFactors' cid_concepts[3756] = \ {'SCT': ['Arrhythmia', 'HistoryOfHypertension', 'HistoryOfDiabetes', 'HistoryOfCongestiveHeartFailure', 'PeripheralVascularDisease', 'InsulinDependentMotherIDM', 'HIVPositive', 'HistoryOfChronicLungDisease', 'HistoryOfHypercholesterolemia', 'HistoryOfRenalFailure', 'HistoryOfCerebrovascularDisease', 'HistoryOfMyocardialInfarction'], 'UMLS': ['InfantOfMotherWithGestationalDiabetes']} 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[3613] = 'HemodynamicTimeMeasurements' cid_concepts[3613] = \ {'DCM': ['Tau', 'IndicatorMeanTransitTime', 'RightVentricularFillingTime', 'LeftVentricularFillingTime', 'RightVentricularEjectionTime', 'LeftVentricularEjectionTime', 'RRInterval']} 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[12217] = 'EchocardiographyCardiacShunt' cid_concepts[12217] = \ {'LN': ['PulmonaryToSystemicShuntFlowRatio', 'HeartRate']} name_for_cid[3486] = 'VascularMeasurementSites' cid_concepts[3486] = \ {'DCM': ['SiteOfLumenMaximum', 'SiteOfLumenMinimum', 'ProximalReference', 'DistalReference']} name_for_cid[3469] = 'ESVolume' cid_concepts[3469] = \ {'DCM': ['LeftAtrialESVolume'], 'LN': ['RightVentricularESVolume', 'LeftVentricularESVolume']} name_for_cid[4206] = 'OphthalmicChannelDescription' cid_concepts[4206] = \ {'SCT': ['Infrared', 'Ultraviolet', 'Red', 'FullSpectrum', 'Blue', 'RedFree', 'Green']} 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[636] = 'TemperatureSensorDeviceComponentTypeforSmallAnimalProcedures' cid_concepts[636] = \ {'DCM': ['CarrierTemperatureSensor'], 'SCT': ['RectalTemperature'], 'UMLS': ['Thermography']} name_for_cid[6112] = 'PleuraAnatomyFindingorFeature' cid_concepts[6112] = \ {'DCM': ['AnteriorJunctionLine', 'PosteriorJunctionLine'], 'SCT': ['FissureOfLung']} name_for_cid[3740] = 'ThrombolyticAdministration' cid_concepts[3740] = \ {'SCT': ['Contraindicated', 'AdministeredLessThan3HoursBeforePCI', 'AdministeredBetween3And6HoursBeforePCI', 'AdministeredBetween6HoursAnd7DaysBeforePCI']} name_for_cid[10046] = 'GFRMeasurements' cid_concepts[10046] = \ {'LN': ['GlomerularFiltrationRateBlackMDRD', 'CockroftGaultFormulaEstimationOfGFR', 'GlomerularFiltrationRateCystatinBasedFormula', 'CKDEPIFormulaEstimationOfGFR', 'GlomerularFiltrationRateMDRD', 'GlomerularFiltrationRateCreatinineBasedFormulaSchwartz', 'GlomerularFiltrationRateNonBlackMDRD', 'GlomerularFiltrationRateFemaleMDRD']} name_for_cid[7703] = 'AssociationFibers' cid_concepts[7703] = \ {'DCM': ['SuperiorLongitudinalFasciculusIII', 'SuperiorLongitudinalFasciculusII', 'SuperiorLongitudinalFasciculusI'], 'NEU': ['ArcuateFasciculus', 'SuperiorLongitudinalFasciculus'], 'SCT': ['SuperiorFrontoOccipitalFasciculus', 'InferiorLongitudinalFasciculus', 'InferiorFrontoOccipitalFasciculus', 'UncinateFasciculus', 'VerticalOccipitalFasciculus']} name_for_cid[65] = 'PreMedicationforImagingAgentAdministration' cid_concepts[65] = \ {'SCT': ['Alfentanil', 'Remifentanil', 'Diphenhydramine', 'Papaverine', 'Propofol', 'Midazolam', 'Sufentanil', 'Methylprednisolone', 'HydrocortisoneSodiumSuccinate', 'DexamethasoneSodiumSulfate', 'MethylprednisoloneSodiumSuccinate', 'Ephedrine', 'H1Antihistamine', 'Prednisone']} name_for_cid[6057] = 'DuctographyFindingsforBreast' cid_concepts[6057] = \ {'DCM': ['DuctNarrowing', 'NormalBreastTissue', 'CystFill', 'IntraluminalFillingDefect', 'MultipleFillingDefect', 'AbruptDuctTermination', 'Extravasation'], 'SCT': ['MammaryDuctEctasia']} name_for_cid[9526] = 'IonTherapyParticle' cid_concepts[9526] = \ {'DCM': ['_16OxygenNucleus', '_12CarbonNucleus', '_4HeliumNucleus', '_3HeliumNucleus'], 'SCT': ['Electron', 'Proton']} name_for_cid[12240] = 'LeftVentricleArea' cid_concepts[12240] = \ {'SCT': ['LeftVentricleEpicardialDiastolicAreaPsaxPapView', 'LeftVentricularDiastolicArea', 'LeftVentricularFractionalAreaChange', 'LeftVentricularSystolicArea']} name_for_cid[7168] = 'BrainLesionSegmentationTypesWithNecrosis' cid_concepts[7168] = \ {'DCM': ['Background'], 'NCIt': ['NonEnhancingLesion', 'EnhancingLesion'], 'SCT': ['Normal', 'Necrosis', 'Edema']} name_for_cid[12305] = 'BasicEchoAnatomicSites' cid_concepts[12305] = \ {'DCM': ['RightVentricleAnteriorWall', 'RightVentricleOutflowTractProximal', 'RightVentricleOutflowTractDistal'], 'SCT': ['LeftVentricleMidAnteriorSegment', 'PulmonicValve', 'LeftVentricleMyocardium', 'PulmonaryVein', 'AorticValve', 'AorticSinotubularJunction', 'LeftVentricleBasalAnteriorSegment', 'LeftVentricleBasalInferiorSegment', 'InferiorVenaCava', 'MitralAnnulus', 'RightPulmonaryArtery', 'AorticRoot', 'RightAtrium', 'TricuspidValve', 'MedialMitralAnnulus', 'LeftVentricleMidAnterolateralSegment', 'RightVentricle', 'LeftVentricle', 'RightVentricleMidventricularSegment', 'LeftVentricleMidInferoseptalSegment', 'PulmonicRing', 'LeftVentricleMidAnteroseptalSegment', 'LeftVentricleOutflowTract', 'AorticValveRing', 'InterventricularSeptum', 'LeftPulmonaryArtery', 'TricuspidAnnulus', 'RightVentricleOutflowTract', 'LeftVentricleBasalAnteroseptalSegment', 'LeftVentricleBasalInferolateralSegment', 'LeftVentricleBasalInferoseptalSegment', 'LeftVentricleMidInferiorSegment', 'TrunkOfPulmonaryArtery', 'LeftVentricleBasalAnterolateralSegment', 'AscendingAorta', 'PulmonaryArtery', 'LeftVentricleMidInferolateralSegment', 'LeftAtrium', 'RightVentricleBasalSegment', 'LateralMitralAnnulus', 'MitralValve']} name_for_cid[231] = 'YesNoOnly' cid_concepts[231] = \ {'SCT': ['Yes', 'No']} name_for_cid[4251] = 'VisualFieldStaticPerimetryTestStrategies' 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[7304] = 'ImplantTargetAnatomy' cid_concepts[7304] = \ {'SCT': ['Clavicle', 'Tibia', 'DistalFemur', 'ProximalRadius', 'ProximalUlna', 'WristJoint', 'ThoracoLumbarSpine', 'Hand', 'ShaftOfTibia', 'Shoulder', 'Pelvis', 'Humerus', 'ElbowJoint', 'FacialBones', 'DistalRadius', 'ShaftOfUlna', 'Fibula', 'JawRegion', 'Talus', 'ThoracicSpine', 'Calcaneus', 'Ulna', 'HeadOfFemur', 'Radius', 'Knee', 'HipJoint', 'DistalUlna', 'LumboSacralSpine', 'Mandible', 'FingerJoint', 'CervicoThoracicSpine', 'ShaftOfRadius', 'Femur', 'ShaftOfFemur', 'Skull', 'ShaftOfHumerus', 'DistalHumerus', 'ProximalHumerus', 'ProximalFemur', 'Patella', 'DistalTibia', 'AnkleJoint', 'LumbarSpine', 'Maxilla', 'CervicalSpine']} name_for_cid[32] = 'NonAcquisitionModality' cid_concepts[32] = \ {'DCM': ['Registration', 'Segmentation', 'BasicVoiceAudio', 'RTDose', 'Document', 'StereometricRelationship', 'RTTreatmentRecord', 'HardCopy', 'CTProtocol', 'RTPlan', 'AutomatedSlideStainer', 'StructuredReportDocument', 'SpatialFiducials', 'ModelFor3DManufacturing', 'RTStructureSet', 'Plan', 'PresentationState', 'Other', 'KeyObjectSelection', 'IntraocularLensCalculation', 'ContentAssessmentResult', 'RealWorldValueMap']} name_for_cid[10011] = 'EffectiveDoseEvaluationMethod' cid_concepts[10011] = \ {'DCM': ['DLPToEConversionViaMCComputation', 'DLPToEConversionViaMeasurement', 'CtdifreeairToEConversionViaMCComputation', 'CtdifreeairToEConversionViaMeasurement']} name_for_cid[3717] = 'MyocardialWallSegments' cid_concepts[3717] = \ {'SCT': ['LeftVentricleMidAnteriorSegment', 'LeftVentricleBasalAnteroseptalSegment', 'LeftVentricleBasalInferolateralSegment', 'LeftVentricleBasalInferoseptalSegment', 'LeftVentricleMidInferiorSegment', 'LeftVentricleApicalInferiorSegment', 'LeftVentricleApicalLateralSegment', 'LeftVentricleApicalAnteriorSegment', 'LeftVentricleBasalAnteriorSegment', 'LeftVentricleApicalSeptalSegment', 'ApexOfLeftVentricle', 'LeftVentricleBasalAnterolateralSegment', 'LeftVentricleBasalInferiorSegment', 'LeftVentricleMidInferolateralSegment', 'LeftVentricleMidAnterolateralSegment', 'LeftVentricleMidInferoseptalSegment', 'LeftVentricleMidAnteroseptalSegment']} name_for_cid[6145] = 'BaselineCategory' cid_concepts[6145] = \ {'DCM': ['TargetLesionAtBaseline', 'NonTargetLesionAtBaseline', 'NonLesionAtBaseline']} name_for_cid[6000] = 'OverallBreastComposition' cid_concepts[6000] = \ {'SCT': ['ExtremelyDense', 'AlmostEntirelyFat', 'HeterogeneouslyDense', 'ScatteredFibroglandularDensities']} name_for_cid[3202] = 'ChestPain' cid_concepts[3202] = \ {'DCM': ['AnginalEquivalent'], 'SCT': ['AtypicalAngina', 'TypicalAngina', 'NoncardiacChestPain', 'ChestPainNotPresent', 'StableAngina', 'UnstableAngina']} name_for_cid[3015] = 'CoronaryArteries' cid_concepts[3015] = \ {'BARI': ['_2ndMarginalCoronaryArteryLaterals', '_1stDiagonalCoronaryArteryLaterals', '_3rdDiagonalCoronaryArteryLaterals', '_1stMarginalCoronaryArteryLaterals', '_3rdMarginalCoronaryArteryLaterals', '_2ndDiagonalCoronaryArteryLaterals', 'RamusLaterals', 'PosteriorDescendingSeptalPerforators'], 'SCT': ['ProximalRightCoronaryArtery', '_3rdLeftPosterolateralCoronaryArtery', 'RightPosteriorAVCoronaryArtery', 'ProximalCircumflexCoronaryArtery', '_2ndMarginalCoronaryArtery', 'MidCircumflexCoronaryArtery', '_1stLeftPosterolateralCoronaryArtery', 'IntermediateArteryRamus', 'CircumflexCoronaryArtery', 'DistalLeftAnteriorDescendingCoronaryArtery', 'RightCoronaryArteryOstium', 'LeftMainCoronaryArtery', '_2ndLeftPosterolateralCoronaryArtery', 'DistalRightCoronaryArtery', 'MarginalCoronaryArtery', '_2ndRightPosterolateralCoronaryArtery', 'PosteriorDescendingRightCoronaryArtery', 'LeftAnteriorDescendingCoronaryArtery', 'LeftPosteriorDescendingCircumflexCoronaryArtery', '_1stMarginalCoronaryArtery', 'ProximalLeftAnteriorDescendingCoronaryArtery', '_3rdDiagonalCoronaryArtery', '_1stSeptalCoronaryArtery', 'RightCoronaryArtery', '_3rdMarginalCoronaryArtery', '_1stDiagonalCoronaryArtery', 'MidRightCoronaryArtery', '_2ndDiagonalCoronaryArtery', 'AVGrooveContinuationOfCircumflexArtery', 'DistalCircumflexCoronaryArtery', 'MidLeftAnteriorDescendingCoronaryArtery', 'LeftMainCoronaryArteryOstium', 'CoronaryArteryGraft', 'LeftPosterolateralCircumflexCoronaryArtery', '_1stRightPosterolateralCoronaryArtery', '_3rdRightPosterolateralCoronaryArtery']} name_for_cid[3500] = 'PressureUnits' cid_concepts[3500] = \ {'UCUM': ['Mmhg', 'Kpa']} name_for_cid[3629] = 'ProcedureIntent' cid_concepts[3629] = \ {'DCM': ['QualityControlIntent'], 'SCT': ['DiagnosticIntent', 'StagingIntent', 'TherapeuticIntent', 'CurativeIntent', 'ProphylacticIntent', 'CombinedDiagnosticAndTherapeuticProcedure', 'AdjunctIntent', 'ForensicIntent', 'NeoAdjuvantIntent', 'SupportiveIntent', 'GuidanceIntent', 'PalliativeIntent', 'AdjuvantIntent', 'ScreeningIntent', 'PreventiveIntent']} name_for_cid[12112] = 'AbdominalArteries(Unilateral)' cid_concepts[12112] = \ {'SCT': ['InfraRenalAorta', 'SplenicArtery', 'CeliacAxis', 'GastroduodenalArtery', 'LumbarArtery', 'SupraRenalAorta', 'Aorta', 'LeftBranchOfHepaticArtery', 'ProperHepaticArtery', 'CommonIliacArtery', 'SuperiorMesentericArtery', 'InferiorMesentericArtery', 'RightBranchOfHepaticArtery', 'CommonHepaticArtery']} name_for_cid[8120] = 'WSIReferencedImagePurposesofReference' cid_concepts[8120] = \ {'DCM': ['ImagedContainerLabel', 'Localizer', 'SameAcquisitionAtDifferentFocalDepth', 'SameAcquisitionAtDifferentSpectralBand', 'SameAcquisitionAtLowerResolution', 'SameAcquisitionAtHigherResolution']} name_for_cid[6094] = 'QualitativeConceptsforUsage,ExposureFrequency' cid_concepts[6094] = \ {'DCM': ['RelativeDoseFrequency', 'RelativeFrequencyOfExposure', 'RelativeFrequencyOfUse']} name_for_cid[4103] = 'ArterialInputFunctionMeasurementMethods' cid_concepts[4103] = \ {'DCM': ['UserDefinedAIFROI', 'AutomaticallyDetectedAIFROI', 'BlindEstimationOfAIF', 'AIFIgnored', 'PopulationAveragedAIF']} name_for_cid[3412] = 'InterventionActionsandStatus' cid_concepts[3412] = \ {'DCM': ['StentReExpanded', 'ObjectRemoved', 'AngioplastyBalloonDeflated', 'DeviceDeployed', 'GuidewireCrossingLesionSuccessful', 'InterventionalDeviceWithdrawn', 'AngioplastyBalloonInflated', 'InterventionalDevicePlaced', 'GuidewireCrossingLesionUnsuccessful', 'InterventionPerformed', 'RadiationApplied', 'RadiationRemoved', 'InterventionalDevicePlacementUnsuccessful']} name_for_cid[7001] = 'DiagnosticImagingReportHeadings' 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[12283] = 'CardiacUltrasoundVenousReturnPulmonaryFindingSites' cid_concepts[12283] = \ {'SCT': ['PulmonaryVeinGreatVessel', 'PulmonaryVein', 'PulmonaryVeinToAtriumConnection', 'MustardOrSenningPulmonaryVenousPathway', 'CorTriatriatumOrifice']} 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[3804] = 'StenosisMeasurementMethods' cid_concepts[3804] = \ {'DCM': ['ECST', 'NASCET', 'AreaBasedMethod', 'DiameterBasedMethod']} name_for_cid[3107] = 'PETCardiologyRadiopharmaceuticals' cid_concepts[3107] = \ {'SCT': ['_82Rubidium', 'FluorodeoxyglucoseF18', '_13Nitrogen']} name_for_cid[4011] = 'DXViewModifier' cid_concepts[4011] = \ {'DCM': ['Crosstable'], 'SCT': ['Transoral', 'Transforamenal', 'Caudad', 'Cephalad', 'Transthoracic', 'Transorbital', 'MouthClosed']} name_for_cid[3691] = 'ECGControlVariablesText' cid_concepts[3691] = \ {'MDC': ['Interpolator', 'HighPassFilter', 'InterpolatorDescription', 'HighPassFilterDescription', 'NotchFilter', 'NotchFilterDescription', 'BaselineDescription', 'LowPassFilter']} name_for_cid[7017] = 'CategoryofTeachingMaterialImaging' cid_concepts[7017] = \ {'DCM': ['CardiovascularImagingSubjectMatter', 'GenitourinaryImagingSubjectMatter', 'GastrointestinalImagingSubjectMatter', 'VascularAndInterventionalImagingSubjectMatter', 'NeuroimagingSubjectMatter', 'UltrasoundImagingSubjectMatter', 'NuclearMedicineImagingSubjectMatter', 'BreastImagingSubjectMatter', 'PediatricImagingSubjectMatter', 'PulmonaryImagingSubjectMatter', 'MusculoskeletalImagingSubjectMatter']} name_for_cid[3404] = 'StaffActions' cid_concepts[3404] = \ {'DCM': ['OfficeCalled', 'PageSentTo', 'ConsultationWith', 'PersonnelArrived', 'PersonnelDeparted']} name_for_cid[3111] = 'NuclearCardiologyRadiopharmaceuticals' cid_concepts[3111] = \ {'SCT': ['Thallium201', 'Tc99mSestamibi', 'Tc99mTetrofosmin']} name_for_cid[7152] = 'CardiacStructureSegmentationTypes' cid_concepts[7152] = \ {'SCT': ['Pericardium', 'PericardialCavity', 'Heart', 'RightVentricle', 'LeftVentricle', 'Aorta']} name_for_cid[3668] = 'FraminghamTables' cid_concepts[3668] = \ {'DCM': ['TotalCholesterolScoreSheetForWomen', 'LDLCholesterolScoreSheetForWomen', 'TotalCholesterolScoreSheetForMen', 'LDLCholesterolScoreSheetForMen']} name_for_cid[3238] = 'StressScoringScales' cid_concepts[3238] = \ {'DCM': ['STHRIndex', 'RatioOfAchievedToPredictedFunctionalCapacity', 'AerobicIndex', 'RatioOfAchievedToPredictedMaximalOxygenConsumption'], 'SCT': ['DukeTreadmillScore']} name_for_cid[12016] = 'EstimatedFetalWeightPercentileEquationsandTables' cid_concepts[12016] = \ {'DCM': ['FWPByGACampbell1991', 'FWPByGAHadlock1991'], 'LN': ['FWPByGAAlexander1996', 'FWPByGAWilliams1982', 'MaleTwinsBWPByGAArbuckle1993', 'FWPByGABrenner1976', 'FemaleSingletonBWPByGAArbuckle1993', 'FemaleTwinsBWPByGAArbuckle1993', 'MaleSingletonBWPByGAArbuckle1993', 'FWPByGAHadlock1985']} name_for_cid[3687] = 'ElectrophysiologyWaveformDurations' 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[3453] = 'CardiacVolumeMethods' cid_concepts[3453] = \ {'DCM': ['AreaLengthDodge', 'AreaLengthKennedy', 'Parallelepiped', 'TSPyramid', 'TwoChamber', 'MultipleSlices', 'Boak', 'AreaLengthWynne']} name_for_cid[6201] = 'ColonFindingorFeature' cid_concepts[6201] = \ {'DCM': ['ImageQuality', 'SelectedRegion', 'NonLesion', 'AnatomicNonColon'], 'SCT': ['Lipoma', 'InvertedDiverticulum', 'IleocecalValve', 'TumorOfColon', 'Diverticulum', 'Feces', 'ContrastMedia', 'IntraluminalFluid', 'RectalMass', 'OperativeSite', 'PolypOfColon', 'ColonicHaustra']} name_for_cid[3003] = 'HemodynamicWaveformSources' 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[7040] = 'BroselowLutenPediatricSizeCategories' cid_concepts[7040] = \ {'SCT': ['BroselowLutenPurpleZone1011kg', 'BroselowLutenYellowZone1214kg', 'BroselowLutenWhiteZone1518kg', 'BroselowLutenGreenZone3036kg', 'BroselowLutenBlueZone1923kg', 'BroselowLutenPinkZone67kg', 'BroselowLutenOrangeZone2429kg', 'BroselowLutenRedZone89kg']} name_for_cid[12104] = 'ExtracranialArteries' cid_concepts[12104] = \ {'SCT': ['InternalCarotidArtery', 'ExternalCarotidArtery', 'VertebralArtery', 'CommonCarotidArtery', 'CarotidBulb', 'SubclavianArtery', 'CarotidBifurcation']} name_for_cid[4050] = 'DrugorContrastAgentCharacteristics' cid_concepts[4050] = \ {'DCM': ['ContrastBolusIngredientOpaque', 'ActiveIngredientUndilutedConcentration'], 'SCT': ['ActiveIngredient', 'Volume']} 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[6082] = 'GynecologicalProcedures' cid_concepts[6082] = \ {'SCT': ['DilationAndCurettage', 'EndometrialBiopsy', 'Hysterectomy']} name_for_cid[4237] = 'LensConstantType' cid_concepts[4237] = \ {'DCM': ['HaigisA1', 'HaigisA2', 'HofferPacdConstant', 'SurgeonFactor', 'BarrettLensFactor', 'ACDConstant', 'BarrettDesignFactor', 'HaigisA0'], 'SCT': ['AConstant']} name_for_cid[3458] = 'ContourRealignment' cid_concepts[3458] = \ {'DCM': ['LongAxisBased', 'NoRealignment', 'CenterOfGravity']} name_for_cid[607] = 'AnimalFeedTypes' cid_concepts[607] = \ {'DCM': ['NIH31', 'NIH07', 'AIN76', 'AIN93G', 'AIN93M']} name_for_cid[12226] = 'EchocardiographyImageView' cid_concepts[12226] = \ {'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[6066] = 'TargetConfirmation' cid_concepts[6066] = \ {'DCM': ['TargetContainedInTheSpecimen', 'TargetPartiallyObtainedInTheSpecimen', 'TargetNotInTheSpecimen', 'CalcificationsSeenInTheCore', 'LesionCompletelyRemoved', 'LesionPartiallyRemoved', 'FluidObtained']} name_for_cid[6089] = 'Substances' cid_concepts[6089] = \ {'SCT': ['LysergicAcidDiethlyamide', 'Methlyphenidate', 'Methadone', 'Phencyclidine', 'Morphine', 'Cocaine', 'Heroin', 'Amphetamine', 'Caffeine', 'Marijuana', 'EthylAlcohol', 'ChewingTobacco', 'CigaretteSmokingTobacco', 'Mescaline']} name_for_cid[6123] = 'ChestOpacityDescriptor' cid_concepts[6123] = \ {'DCM': ['Linear', 'Profusion', 'SilhouetteSign', 'Acinar', 'AirSpace', 'Fibronodular', 'Fluffy']} name_for_cid[4260] = 'OphthalmicMappingUnitsforRealWorldValueMapping' cid_concepts[4260] = \ {'UCUM': ['Micrometer']} name_for_cid[9517] = 'RadiotherapyBlockDeviceTypes' cid_concepts[9517] = \ {'DCM': ['ApertureBlock'], 'SCT': ['ShieldingBlock']} name_for_cid[7159] = 'LesionSegmentationTypes' cid_concepts[7159] = \ {'DCM': ['Background'], 'NCIt': ['EnhancingLesion', 'NonEnhancingLesion'], 'SCT': ['Embolus', 'Mass', 'Normal', 'Cyst', 'Abscess', 'Edema', 'NeoplasmPrimary', 'BloodClot', 'Nodule', 'Neoplasm', 'NeoplasmSecondary', 'Necrosis', 'Hemorrhage', 'Inflammation']} name_for_cid[12271] = 'CardiacUltrasoundOutflowTractsMeasurements' 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', '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[6031] = 'BenignPathologyCodesfromBIRADS®' 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': ['Hemangioma', 'LactatingAdenoma', 'CystOfBreast', 'FatNecrosisOfBreast', 'InfarctionOfBreast', 'Adenoma', 'Leiomyoma', 'RadialScar', 'HemangiomaOfSubcutaneousTissue', 'LymphNode', 'HemangiomaVenous', 'BreastLobularHyperplasia', 'GranularCellTumor', 'Angiolipoma', 'EpidermalInclusionCyst', 'Galactocele', 'ForeignBody', 'HyperplasiaUsual', 'ThrombophlebitisOfBreastMondorDisease', 'ScarTissue', 'Angiomatosis', 'Adenosis', 'DuctalHyperplasiaUsual', 'Seroma', 'Gynecomastia', 'ExtraAbdominalDesmoid', 'GiantFibroadenoma', 'Fibromatosis', 'Inflammation', 'IntramammaryLymphNode', 'ApocrineMetaplasia', 'TubularAdenoma', 'IntraductalPapilloma', 'Hematoma', 'Amyloid', 'Neurofibromatosis', 'PleomorphicAdenoma', 'Neurofibroma', 'Adenomyoepithelioma', 'FocalFibrosis', 'IntracysticPapilloma', 'Myofibroblastoma', 'Lipoma', 'JuvenileFibroadenoma', 'EctopicAccessoryBreastTissue', 'Abscess', 'SclerosingAdenosis', 'Edema', 'Papilloma', 'Adenolipoma', 'Hamartoma', 'AsynchronousInvolutionOfBreast', 'Fibroadenoma', 'FibrocysticDiseaseOfBreast', 'MammaryDuctEctasia', 'Chondroma', 'BenignNeoplasmOfNippleOfFemaleBreastNippleAdenoma']} name_for_cid[3233] = 'STSegmentMorphology' cid_concepts[3233] = \ {'DCM': ['STDepressionHorizontal', 'STDepressionUpsloping', 'STDepressionDownsloping'], 'SCT': ['STElevation', 'STDepression']} name_for_cid[3663] = 'BodySurfaceAreaEquations' cid_concepts[3663] = \ {'DCM': ['BSAEquals0Point038189WT0Point423HT0Point362', 'BSAEquals13210Point3433WT', 'BSAEquals0Point010265WT0Point423HT0Point651', 'BSAEquals0Point0004688WT0Point8168To0Point0154LogWT', 'BSAEquals0Point008883WT0Point444HT0Point663', 'BSAEquals0Point024265WT0Point5378Htcm0Point3964', 'BSAEqualsHTWT360Point5', 'BSAEquals0Point007358WT0Point425HT0Point725', 'BSAEquals0Point007184WT0Point425HT0Point725', 'BSAEquals0Point0235WT0Point51456Htcm0Point42246', 'BSAEquals0Point003207WT0Point7285To0Point0188LogWTHT0Point3', 'BSAEquals0Point009568WT0Point473HT0Point655']} name_for_cid[7270] = 'MRDiffusionComponentSemantics' cid_concepts[7270] = \ {'DCM': ['VolumetricDiffusionDxzComponent', 'VolumetricDiffusionDxyComponent', 'DiffusionWeighted', 'VolumetricDiffusionDxxComponent', 'VolumetricDiffusionDzzComponent', 'VolumetricDiffusionDyzComponent', 'VolumetricDiffusionDyyComponent']} name_for_cid[10020] = 'SourceofProjectionXRayDoseInformation' cid_concepts[10020] = \ {'DCM': ['SystemCalculated', 'CopiedFromImageAttributes', 'ManualEntry', 'DerivedFromHumanReadableReports', 'AutomatedDataCollection', 'ComputedFromImageAttributes', 'MPPSContent'], 'SCT': ['Dosimeter']} name_for_cid[3726] = 'IndicationsforCoronaryIntervention' cid_concepts[3726] = \ {'DCM': ['CoronaryLesionGreaterThanEquals50PercentStenosis'], 'SCT': ['CardiogenicShock']} name_for_cid[3419] = 'FindingsTitles' cid_concepts[3419] = \ {'DCM': ['Recommendation', 'Impression', 'Finding']} name_for_cid[646] = 'PreclinicalSmallAnimalImagingProcedures' cid_concepts[646] = \ {'DCM': ['SPECTOfWholeBody', 'SPECTCTOfWholeBody'], 'LN': ['MRIWholeBody', 'HeadCT', 'RadionuclideScanOfWholeBody', 'BrainMRI', 'RadionuclideBrainScan', 'PETWholeBody', 'WholeBodyCT', 'BrainPET', 'BrainSPECT'], 'SCT': ['UltrasonographyOfTotalBody']} name_for_cid[12288] = 'CardiacUltrasoundOutflowTractsFindingSites' cid_concepts[12288] = \ {'SCT': ['RastelliInterventricularTunnel', 'PulmonicValve', 'LeftVentricleToPulmonaryArteryConduitAnastomosis', 'RightVentricle', 'LeftVentricle', 'RightVentricleToPulmonaryArteryConduitAnastomosis', 'AorticValve']} name_for_cid[12267] = 'CardiacUltrasoundTricuspidValve' 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', '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[703] = 'BasisofAssessment' cid_concepts[703] = \ {'DCM': ['AssessmentByRules', 'AssessmentByComparison']} name_for_cid[9501] = 'PrescriptionAnatomyCategories' cid_concepts[9501] = \ {'DCM': ['ExternalBodyModel', 'NonSpecificVolume'], 'SCT': ['AnatomicalStructure', 'PhysicalObject']} name_for_cid[6027] = 'AssessmentfromBIRADS®' cid_concepts[6027] = \ {} name_for_cid[3730] = 'InsurancePayor' cid_concepts[3730] = \ {} name_for_cid[6162] = 'AssessmentofMetastasisforBreast' cid_concepts[6162] = \ {'SCT': ['M1DistantMetastasis', 'MXDistantMetastasisCannotBeAssessed', 'M0NoDistantMetastasis']} name_for_cid[241] = 'PresentAbsentOnly' cid_concepts[241] = \ {'SCT': ['Absent', 'Present']} name_for_cid[8202] = 'SurfaceScanModeTypes' cid_concepts[8202] = \ {'DCM': ['HighResolution', 'FastMode', 'Checkerboard', 'TurntableScanMethod']} name_for_cid[611] = 'AnesthesiaCategoryCodeTypeforSmallAnimalAnesthesia' cid_concepts[611] = \ {'SCT': ['MonitoredAnesthesiaCareMAC', 'GeneralAnesthesia', 'LocalAnesthesia', 'Sedation', 'SpinalAnesthesia', 'EpiduralAnesthesia', 'RegionalAnesthesia', 'TopicalLocalAnesthesia']} name_for_cid[4221] = 'VisualFixationQualityProblem' cid_concepts[4221] = \ {'DCM': ['EquipmentFailure', 'OperatorError', 'PatientMovement'], 'SCT': ['EccentricFixation']} name_for_cid[12230] = 'GradientMethods' cid_concepts[12230] = \ {'DCM': ['SimplifiedBernoulli', 'FullBernoulli']} name_for_cid[6070] = 'BloomRichardsonHistologicGrade' cid_concepts[6070] = \ {'SCT': ['Grade3PoorlyDifferentiated', 'Grade1WellDifferentiated', 'Grade4Undifferentiated', 'Grade2ModeratelyDifferentiated']} name_for_cid[12119] = 'VascularUltrasoundProperty' cid_concepts[12119] = \ {'LN': ['MinimumDiastolicVelocity', 'ResistivityIndex', 'PeakGradient', 'MeanGradient', 'PeakSystolicVelocity', 'VolumeFlow', 'AccelerationIndex', 'VelocityRatio', 'DecelerationTime', 'TimeAveragedPeakVelocity', 'AccelerationTime', 'SystolicToDiastolicVelocityRatio', 'PulsatilityIndex', 'EndDiastolicVelocity', 'TimeAveragedMeanVelocity'], 'SCT': ['VesselLumenDiameter', 'LengthOfSegment', 'VesselLumenCrossSectionalArea', 'VesselDepthFromSurface', 'VesselOutsideDiameter', 'VesselIntimalCrossSectionalArea', 'LumenDiameterStenosis', 'LumenAreaStenosis', 'VesselIntimalDiameter']} name_for_cid[42] = 'NumericValueQualifier' cid_concepts[42] = \ {'DCM': ['ValueUnknown', 'NegativeInfinity', 'NotANumber', 'ValueIndeterminate', 'DivideByZero', 'PositiveInfinity', 'Overflow', 'Underflow', 'MeasurementNotAttempted', 'MeasurementFailure', 'ValueOutOfRange', 'CalculationFailure']} name_for_cid[10061] = 'AbsorbedRadiationDoseTypes' cid_concepts[10061] = \ {'DCM': ['MinimumAbsorbedRadiationDose', 'MaximumAbsorbedRadiationDose', 'ModeAbsorbedRadiationDose', 'MeanAbsorbedRadiationDose', 'MedianAbsorbedRadiationDose']} name_for_cid[3337] = 'HemodynamicAnnotations' cid_concepts[3337] = \ {'DCM': ['BeatDetected', 'AWavePeakPressure', '_70PercentOfThermalDyeDilutionCO', 'ValveOpen', 'BeatDetected', '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[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[4108] = 'PerfusionModelParameters' cid_concepts[4108] = \ {'DCM': ['MeanTransitTime', 'RelativeRegionalBloodFlow', 'RelativeRegionalBloodVolume', 'TimeToPeak', 'AbsoluteRegionalBloodFlow', 'AbsoluteRegionalBloodVolume', 'OxygenExtractionFraction', 'Tmax']} name_for_cid[3120] = 'PerfusionFindings' cid_concepts[3120] = \ {'SCT': ['Abnormal', 'Equivocal', 'MyocardialPerfusionNormal']} name_for_cid[3823] = 'RespiratoryStatus' cid_concepts[3823] = \ {'DCM': ['CentralBreathingPosition'], 'SCT': ['ValsalvaManeuver', 'Expiration', 'ShallowBreathing', 'Inspiration', 'AutonomousBreathing']} name_for_cid[7026] = 'RadiotherapeuticDoseMeasurementDevices' cid_concepts[7026] = \ {'DCM': ['_3DGel', 'IonChamberArray', 'DiodeArray', 'LiquidIonChamber', 'Diode', 'IonChamber', 'OSLD', 'DiamondDetector'], 'SCT': ['MOSFETRadiationTherapyDosimetrySystemDosimeter', 'DigitalImager', 'MedicalXRayFilm', 'ThermoluminescentRadiationDosimeter']} name_for_cid[7476] = 'GrayLevelSizeZoneBasedFeatures' cid_concepts[7476] = \ {} name_for_cid[3209] = 'SummaryCodesStressImaging' cid_concepts[3209] = \ {'SCT': ['ImagingResultEquivocal', 'ImagingResultNormal', 'ImagingResultAbnormal', 'NotPerformed']} name_for_cid[3527] = 'BloodBaseExcess' cid_concepts[3527] = \ {'LN': ['BloodBaseExcess', 'VenousBloodBaseExcess', 'ArterialBloodBaseExcess']} name_for_cid[3462] = 'ChamberIdentification' cid_concepts[3462] = \ {'SCT': ['RightAtrium', 'RightVentricle', 'LeftVentricle', 'LeftAtrium']} name_for_cid[6119] = 'ChestBorderShape' cid_concepts[6119] = \ {'DCM': ['Elliptic', 'Lobulated', 'Spiculated'], 'SCT': ['RoundShape', 'Irregular']} name_for_cid[3531] = 'OxygenAdministration' cid_concepts[3531] = \ {'DCM': ['OxygenAdministrationByVentilator'], 'SCT': ['OxygenAdministrationByMask', 'OxygenAdministrationByNasalCannula']} name_for_cid[8111] = 'SpecimenPreparationProcedure' cid_concepts[8111] = \ {'DCM': ['SpecimenStorage'], 'SCT': ['Staining', 'SpecimenProcessing', 'SpecimenCollection', 'SamplingOfTissueSpecimen', 'SpecimenReceiving']} name_for_cid[502] = 'VolumetricViewModifier' cid_concepts[502] = \ {'DCM': ['Crosstable'], 'SCT': ['Transoral', 'Caudal', 'Sagittal', 'Caudad', 'FiveChamber', 'LongAxis', 'Parasagittal', 'Transforamenal', 'FourChamber', 'OffAxis', 'ShortAxis', 'TwoChamber', 'Oblique', 'Cephalad', 'Coronal', 'Transthoracic', 'Transverse', 'Transorbital', 'MouthClosed', 'Cephalic', 'Longitudinal']} name_for_cid[3618] = 'HemodynamicFlows' cid_concepts[3618] = \ {'DCM': ['SystemicFlow', 'PulmonaryFlow']} name_for_cid[12123] = 'CarotidRatios' cid_concepts[12123] = \ {'LN': ['ICACCAVelocityRatio']} name_for_cid[3835] = 'CardiacVolumeMeasurements' cid_concepts[3835] = \ {'DCM': ['LeftAtrialEDVolume', 'LeftAtrialESVolume'], 'LN': ['RightVentricularESVolume', 'LeftVentricularESVolume', 'RightVentricularEDVolume', 'LeftVentricularEDVolume'], 'SCT': ['StrokeVolume']} name_for_cid[3423] = 'NumericDeviceCharacteristics' cid_concepts[3423] = \ {'DCM': ['TransmitFrequency', 'CatheterCurve', 'InterMarkerDistance'], 'SCT': ['Length', 'Diameter', 'Volume']} name_for_cid[7460] = 'UnitsofLinearMeasurement' cid_concepts[7460] = \ {'UCUM': ['Millimeter', 'Centimeter', 'Micrometer']} name_for_cid[7030] = 'InstitutionalDepartments,UnitsandServices' 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', 'Histopathology', 'Radiology', 'HandSurgery', 'Gynecology', 'OrthopedicSurgery', 'InterventionalRadiologyService', 'PediatricMedicine', 'Psychiatry', 'Hematology', 'Pathology', 'PlasticSurgery', 'Neurology', 'EndocrineSurgery', 'GeriatricMedicine', 'VascularSurgery'], 'UMLS': ['Neuroradiology']} name_for_cid[6158] = 'CorrelationtoOtherFindings' cid_concepts[6158] = \ {'DCM': ['CorrelatesToPhysicalExamFindings', 'CorrelatesToMammographyFindings', 'CorrelatesToMRIFindings', 'CorrelatesToUltrasoundFindings', 'CorrelatesToOtherImagingFindings', 'NoCorrelationToOtherImagingFindings', 'NoCorrelationToClinicalFindings']} name_for_cid[12031] = 'ProtocolIntervalEvents' cid_concepts[12031] = \ {'DCM': ['CessationOfStimulation', 'OnsetOfStimulation', 'CessationOfExercise', 'OnsetOfExercise', 'DestructionOfMicrobubbles', 'StartOfContrastAgentAdministration', 'StartOfDrugDoseAdministration']} name_for_cid[9242] = 'RadiotherapyAcquisitionWorkitemDefinition' cid_concepts[9242] = \ {'DCM': ['RTPatientPositionAcquisitionSinglePlaneMV', 'RTPatientPositionAcquisitionUltrasound', 'RTPatientPositionAcquisitionSpatialFiducials', 'RTPatientPositionAcquisitionOptical', 'RTPatientPositionAcquisitionCTKv', 'RTPatientPositionAcquisitionCTMV', 'RTPatientPositionAcquisitionDualPlaneKv', 'RTPatientPositionAcquisitionDualPlaneKvMV', 'RTPatientPositionAcquisitionDualPlaneMV', 'RTPatientPositionAcquisitionSinglePlaneKv']} 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[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', 'Aorta', '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', 'LumbarArtery', 'AccessoryRenalArtery', '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', 'CommonIliacArtery', 'RightHepaticVein', 'CephalicVein', 'GastrocnemiusVein', 'GastricVein', 'MiddleCerebralArteryM2Segment', 'LeftMainBranchOfPortalVein', 'MiddleCerebralArtery', 'PosteriorCerebralArteryP2Segment', 'InferiorRightHepaticVein', 'TesticularVein', 'CarotidSiphon', 'AnteriorTibialVein', 'PosteriorTibialVein', 'SaphenopoplitealJunction', 'BasilicVein', 'PlantarArterialArch', 'HunterianPerforatingVein', 'AnteriorPosteriorCerebralArteryBifurcation', 'DeepPalmarArchOfRadialArtery', 'ProfundaFemorisArtery', 'FifthLumbarArtery', 'AxillaryVein', 'LesserSaphenousVein', 'InferiorMesentericArtery', 'DigitalArteryOfHand', 'GreatSaphenousVein', 'SecondLumbarArtery']} name_for_cid[8131] = 'PathologyImagingProtocols' cid_concepts[8131] = \ {'DCM': ['WSI40XRGB', 'PeriOperativePhotographicImaging', 'GrossSpecimenImaging', 'SlideMicroscopy', 'WholeSlideImaging', 'WSI20XRGB']} name_for_cid[6085] = 'TherapiesforBreast' cid_concepts[6085] = \ {'SCT': ['HormoneTherapy', 'BoneMarrowTransplant', 'Chemotherapy', 'RadiationTherapy']} name_for_cid[3004] = 'ArterialPulseWaveform' cid_concepts[3004] = \ {'DCM': ['ArterialPulseWaveform']} name_for_cid[6206] = 'RecumbentPatientOrientationforColon' cid_concepts[6206] = \ {'SCT': ['LeftLateralDecubitus', 'Supine', 'RightLateralDecubitus', 'Prone']} name_for_cid[3680] = 'ECGLeadNoiseDescriptions' cid_concepts[3680] = \ {'MDC': ['ModerateNoise', 'SevereNoise', 'NoNoise', 'NoSignal']} name_for_cid[12011] = 'UltrasoundPelvisandUterus' cid_concepts[12011] = \ {'LN': ['EndometriumThickness', 'CervixLength']} name_for_cid[3403] = 'PercutaneousEntry' cid_concepts[3403] = \ {'SCT': ['ViaFemoralVein', 'ViaFemoralArtery', 'ViaArtery', 'ViaBrachialArtery', 'ViaArmVein', 'ViaRadialArtery', 'ViaVein']} 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', 'TumorRegistryInputUsed', 'RTPlanningResult', 'TumorBoardInputUsed', 'RTTreatmentSimulationResult', 'ClinicalTrialSubmissionInputUsed', 'DiagnosticSourceImages', 'ForRTWorkflow', 'ForPrinting', 'RegistrationResult', 'SegmentationResult', 'RTPrescriptionResult', 'PrePlanningResult', 'PlanComparisonInputUsed', 'CoordinateAlignmentImageSeries', 'DoseCalculationImageSeries']} name_for_cid[12292] = 'CardiacUltrasoundCoronaryArteriesFindingSites' cid_concepts[12292] = \ {'SCT': ['CircumflexCoronaryArtery', 'AnteriorDescendingBranchOfLeftCoronaryArtery', 'ProximalCircumflexCoronaryArtery', 'DistalCircumflexCoronaryArtery', 'PosteriorDescendingCoronaryArtery', 'SeptalArtery', 'RightCoronaryArtery', 'MidCircumflexCoronaryArtery', 'LeftMainCoronaryArtery']} name_for_cid[3815] = 'SourceofVascularFinding' cid_concepts[3815] = \ {'SCT': ['Embolism', 'AfterProcedure', 'Trauma', 'Hyperplasia', 'Tumor', 'Thrombosis', 'Surgical', 'Vasculitis']} name_for_cid[7155] = 'ThoracicSegmentationTypes' cid_concepts[7155] = \ {'SCT': ['Lung', 'LowerLobeOfLung', 'Mediastinum', 'Clavicle', 'Esophagus', 'MiddleLobeOfRightLung', 'BloodVessel', 'Bronchus', 'Diaphragm', 'Pleura', 'Thymus', 'BoneOfThorax', 'Thorax', 'Rib', 'ChestWallMuscle', 'SkinOfChest', 'Trachea', 'UpperLobeOfLung', 'Sternum', 'ThoracicSpine']} name_for_cid[3116] = 'NMExtracardiacFindings' cid_concepts[3116] = \ {'SCT': ['IncreasedLungUptake', 'AbnormalExtracardiacUptake', 'NormalExtracardiacUptake']} name_for_cid[4016] = 'AnatomicRegionforIntraoralRadiography' cid_concepts[4016] = \ {'SCT': ['TeethGumsAndSupportingStructures', 'Mandible', 'JawRegion', 'Maxilla']} name_for_cid[3229] = 'ECGAxisMeasurements' cid_concepts[3229] = \ {'MDC': ['QRSAxis', 'PAxis', 'TAxis']} name_for_cid[19] = 'PatientOrientation' cid_concepts[19] = \ {'NCIt': ['Erect'], 'SCT': ['Recumbent', 'SemiErect']} name_for_cid[12007] = 'FetalCranium' cid_concepts[12007] = \ {'LN': ['NuchalFoldThickness', 'InnerOrbitalDiameter', 'CisternaMagnaLength', 'PosteriorHornLateralVentricularWidth', 'OuterOrbitalDiameter', 'WidthOfHemisphere', 'LateralVentricleWidth', 'AnteriorHornLateralVentricularWidth', 'NuchalTranslucency', 'TransCerebellarDiameter']} name_for_cid[12284] = 'CardiacUltrasoundAtriaandAtrialSeptumFindingSites' cid_concepts[12284] = \ {'SCT': ['RightAtrium', 'InteratrialSeptumStructure', 'FontanBaffleLeak', 'LimbusOfFossaOvalis', 'LeftAtrium', 'LeftAuricularAppendage', 'CommonAtrium', 'PatentForamenOvale', 'FontanFenestration', 'AtrialSeptalDefect', 'RightAuricularAppendage']} name_for_cid[7006] = 'SRDocumentPurposesofReference' cid_concepts[7006] = \ {'DCM': ['ExtendedRenderingForPresentation', 'SourceDocument', 'CompleteRenderingForPresentation', 'PartialRenderingForPresentation', 'EquivalentCDADocument']} name_for_cid[7456] = 'UnitsofMeasureforAge' cid_concepts[7456] = \ {'UCUM': ['Year', 'Minute', 'Hour', 'Week', 'Day', 'Month']} name_for_cid[3415] = 'CardiacRhythms' cid_concepts[3415] = \ {'MDC': ['AVDissociation', 'VentricularCouplet', 'FirstDegreeAVBlock', 'NonRespiratorySinusArrhythmia', 'VentricularParasystole', 'NonsustainedVentricularTachycardia', 'AVJunctionalNodalEscapeRhythm', 'IrregularRhythm', 'WolfParkinsonWhiteSyndrome', 'Bradycardia', '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', 'Asystole', 'AVJunctionalNodalRhythm', 'SinusRhythm', 'FirstDegreeSABlock', 'TWaveAlternans', 'AtrialFlutter', 'ThirdDegreeAVBlockCompleteAVBlock', 'AtrialBigeminy', 'AtrialDemandModePacing', 'VentricularTrigeminy', 'ReentrantAVNodalTachycardia', 'JunctionalTachycardia', 'SinusTachycardia', 'SupraventricularTachycardia', 'AntiTachycardiaPacing', 'IsorhythmicAVDissociation', 'MultifocalAtrialTachycardia', 'VentricularTachycardia', 'SecondDegreeAVBlockTypeIWenckebachOrMobitzTypeI', 'WanderingPacemakerBetweenTheSinusNodeAndTheAVNode', 'PolymorphicVentricularTachycardia', 'WolfParkinsonTypeB', 'SlowVentricularTachycardiaIdioventricularTachycardia', 'ThirdDegreeSABlockCompleteSABlock', 'NormalSinusRhythm', 'SecondDegreeSABlockTypeIWenckebach', 'AtrialFibrillation', 'AtrialTachycardia']} name_for_cid[3550] = 'CirculatorySupportActions' cid_concepts[3550] = \ {'DCM': ['EndCirculatorySupport', 'BeginCirculatorySupport']} 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[12115] = 'RenalVessels' cid_concepts[12115] = \ {'SCT': ['RenalArtery', 'LobarArtery', 'PerforatingArteryOfKidney', 'AccessoryRenalArtery', 'SegmentalArtery', 'HilarArtery', 'RenalVein', 'ArcuateArteryOfTheKidney', 'InterlobarArteryOfKidney']} name_for_cid[6093] = 'QualitativeConceptsforUsage,ExposureAmount' cid_concepts[6093] = \ {'DCM': ['RelativeDoseAmount', 'RelativeAmountOfExposure', 'RelativeAmountOfUse']} name_for_cid[4104] = 'BolusArrivalTimeDerivationMethods' cid_concepts[4104] = \ {'DCM': ['TemporalDerivativeExceedsThreshold', 'TimeOfPeakConcentration', 'TimeOfLeadingHalfPeakConcentration']} name_for_cid[6139] = 'NonlesionModifiers' cid_concepts[6139] = \ {'SCT': ['External', 'Internal']} name_for_cid[6210] = 'LocationinIntestinalTract' cid_concepts[6210] = \ {'SCT': ['Rectum', 'SigmoidColon', 'DescendingColon', 'TransverseColon', 'SplenicFlexureOfColon', 'Cecum', 'AscendingColon', 'HepaticFlexureOfColon']} name_for_cid[3442] = 'PeripheralPulseMethods' cid_concepts[3442] = \ {'SCT': ['Doppler', 'Palpation']} name_for_cid[3710] = 'CoronaryDominance' cid_concepts[3710] = \ {'SCT': ['BalancedCoronaryDominance', 'LeftCoronaryDominance', 'RightCoronaryDominance']} name_for_cid[6142] = 'CalculatedValue' cid_concepts[6142] = \ {'DCM': ['MassOfParenchymalTissue', 'MassOfBreast', 'AreaOfVascularCalcification', 'VolumeOfVascularCalcification', 'PercentageOfVascularCalcification', 'MassOfVascularCalcification', 'AverageCalcificationDistanceInACalcificationCluster', 'CalciumScore', 'StandardDeviationDistanceOfCalcificationsInACluster', 'BreastTissueDensity', 'VolumeOfParenchymalTissue', 'VolumeOfBreast', 'CavityExtentAsPercentOfVolume', 'CalcificationExtentAsPercentOfSurface', 'CalcificationExtentAsPercentOfVolume']} name_for_cid[7303] = 'ImplantTemplatesModifiedViewOrientations' cid_concepts[7303] = \ {'DCM': ['AP45', 'AP45']} name_for_cid[10016] = 'AnodeTargetMaterial' cid_concepts[10016] = \ {'SCT': ['TungstenOrTungstenCompound', 'MolybdenumOrMolybdenumCompound', 'RhodiumOrRhodiumCompound']} 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[6007] = 'CharacteristicsofMarginfromBIRADS®' cid_concepts[6007] = \ {'DCM': ['AngularMargins'], 'SCT': ['SpiculatedLesion', 'CircumscribedLesion', 'ObscuredLesion', 'IndistinctLesion', 'MicrolobulatedLesion']} name_for_cid[12247] = 'Pediatric,FetalandCongenitalCardiacSurgicalInterventions' cid_concepts[12247] = \ {'SCT': ['RastelliOperation', 'CreationOfConduitRightAtriumToPulmonaryTrunk', 'RightSidedBidirectionalGlennShuntProcedure', 'LeftSidedBidirectionalGlennShuntProcedure', 'ImplantationOfHeartValveWithTissueGraft', 'BlalockTaussigShuntPulmonarySubclavianArteryAnastomosis', 'HemiFontanOperation', 'NorwoodTypeOperation', 'PatentDuctusArteriosusCoilOrDeviceClosure', 'PartialAnomalousPulmonaryVenousConnectionOperation', 'CentralAortopulmonaryShuntOperation', 'ImplantationOfHeartValveProsthesisOrSyntheticDevice', 'RepairOfCoarctationOfAorta', 'ConstructionOfLVToAortaTunnelWRVToPAValvedConduit', 'RepairOfTotalAnomalousPulmonaryVenousConnection', 'PercutaneousProstheticClosureOfAtrialSeptalDefect', 'CoarctationOfTheAortaAngioplastyWithImplantOfStent', 'VentricularSeptalDefectDeviceClosure', 'RadicalAortopulmonaryReconstructWRVToPAValvelessConduit', 'ArterialSwitchOperation', 'CoarctationOfTheAortaBalloonAngioplasty', 'DamusStanselKayeOperation', 'ClosureOfDuctusArteriosusWithClip', 'AtrialInversionOperationUsingAtrialWall', 'RightGlennShuntProcedure', 'LateralCavalFontanProcedure', 'SanoProcedure', 'RepairOfDefectOfTheAtrioventricularSeptum', 'CorrectionOfVentricularSeptalDefect', 'AtrialSeptalDefectRepair', 'ImplantationOfBaffleAtrialOrInteratrial', 'MustardOperation', 'LeftGlennShuntProcedure']} name_for_cid[9521] = 'RadiotherapyTreatmentEnergyUnit' cid_concepts[9521] = \ {'UCUM': ['Kilovolt', 'Megavolt', 'Megaelectronvolt']} name_for_cid[4256] = 'VisualFieldProcedureModifier' cid_concepts[4256] = \ {'SCT': ['Diagnostic', 'Screening']} name_for_cid[12302] = 'EchoFindingObservationTypes' cid_concepts[12302] = \ {'DCM': ['BehaviorOfTheFindingSite', 'StructureOfTheFindingSite'], 'SCT': ['HemodynamicMeasurements']} name_for_cid[7180] = 'AbstractMultidimensionalImageModelComponentSemantics' 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', '', 'SpeedOfSound', 'Vp', 'Perfusion', 'Elasticity', 'EquivalentDose', 'AbsorbedDose', 'YBRFULLCRComponent', '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', 'R2', 'VolumetricDiffusionDxzComponent', 'MagneticSusceptibility', 'VolumetricDiffusionDxyComponent', 'VolumetricDiffusionDxxComponent', 'RelativeRegionalBloodFlow', 'RelativeRegionalBloodVolume', 'Ktrans', 'Kep', 'Ve', 'BloodOxygenationLevel', 'T2WeightedDynamicContrastEnhancedMRSignalIntensity', 'T2WeightedDynamicContrastEnhancedMRSignalIntensity', 'AbsoluteRegionalBloodFlow', 'T1WeightedDynamicContrastEnhancedMRSignalIntensity', 'AbsoluteRegionalBloodVolume', 'VolumetricDiffusionDzzComponent', 'OxygenExtractionFraction', 'R1', 'VolumetricDiffusionDyzComponent', 'R2', 'VolumetricDiffusionDyyComponent', 'VelocityEncoded', 'ZScore', 'ContrastAgentAngioMRSignalIntensity', 'SpinTaggingPerfusionMRSignalIntensity', 'RelativeAnisotropy', 'FractionalAnisotropy', 'FieldMapMRSignalIntensity', 'T2WeightedMRSignalIntensity', 'T2WeightedMRSignalIntensity', 'T1WeightedMRSignalIntensity', 'ProtonDensityWeightedMRSignalIntensity', 'TimeOfFlightAngioMRSignalIntensity', 'T1', 'T2', '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[62] = 'ImagingAgentAdministrationPhaseType' cid_concepts[62] = \ {'DCM': ['AutomaticAdministrationPhase', 'AutomaticProgrammedHoldPhase', 'AutomaticWithManualInjectPhase', 'AutomaticWithManualHoldPhase']} name_for_cid[7704] = 'LimbicSystemTracts' cid_concepts[7704] = \ {'NEU': ['StriaTerminalis'], 'SCT': ['Fornix', 'Cingulum']} name_for_cid[10041] = 'SourceofRadioisotopeActivityInformation' cid_concepts[10041] = \ {'DCM': ['DoseCalibrator', 'InfusionSystem', 'RadioisotopeGenerator']} name_for_cid[6115] = 'OsseousAnatomyModifiers' 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[3747] = 'PercutaneousClosure' cid_concepts[3747] = \ {} name_for_cid[6050] = 'BreastProcedureReported' cid_concepts[6050] = \ {'DCM': ['MarkerPlacement', 'FilmScreenMammography', 'DigitalMammography', '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[3602] = 'HemodynamicPatientState' cid_concepts[3602] = \ {'SCT': ['BaselineState', 'ExerciseState', 'SupineBodyPosition', 'RestingState', 'PostExerciseState']} name_for_cid[3481] = 'IVUSDistanceMeasurements' cid_concepts[3481] = \ {'DCM': ['PlaquePlusMediaThickness', 'LumenPerimeter', 'EEMDiameter'], 'SCT': ['StentDiameter', 'VesselLumenDiameter']} name_for_cid[12210] = 'EchocardiographyPulmonaryArtery' cid_concepts[12210] = \ {'LN': ['HeartRate', 'MainPulmonaryArteryDiameter', 'LeftPulmonaryArteryDiameter', 'RightPulmonaryArteryDiameter'], 'SCT': ['MainPulmonaryArteryPeakVelocity']} name_for_cid[631] = 'PhaseofProcedureRequiringAnesthesia' cid_concepts[631] = \ {'SCT': ['AfterProcedure', 'BeforeProcedure', 'Intraoperative', 'Preoperative', 'Postoperative', 'DuringProcedure']} 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[4201] = 'PatientEyeMovementCommand' cid_concepts[4201] = \ {'SCT': ['PrimaryGaze', 'RightGaze', 'ConvergentGaze', 'LeftGaze', 'LeftDowngaze', 'LeftUpgaze', 'RightDowngaze', 'UpwardGaze', 'RightUpgaze', 'Downgaze']} 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[74] = 'ImagingAgentAdministrationConsumableCatheterType' cid_concepts[74] = \ {'SCT': ['PeripheralIntravenousCatheter', 'CentralVenousCatheter', 'ImplantableVenousAccessPort', 'RectalCatheter']} name_for_cid[3614] = 'ValveAreas,Nonmitral' cid_concepts[3614] = \ {'DCM': ['DerivedNonValveArea'], 'SCT': ['TricuspidValveArea', 'PulmonicValveArea', 'AorticValveArea']} name_for_cid[6046] = 'UnitsofFollowupInterval' cid_concepts[6046] = \ {'UCUM': ['Year', 'Day', 'Week', 'Month']} name_for_cid[12206] = 'EchocardiographyRightAtrium' cid_concepts[12206] = \ {'LN': ['RightAtriumSystolicPressure', 'RightAtriumAreaA4CView', 'HeartRate']} name_for_cid[3497] = 'IVUSArterialMorphology' cid_concepts[3497] = \ {'DCM': ['NecroticLipidicPlaque', 'FibroLipidicPlaque'], 'SCT': ['LumenOfArtery', 'VascularCalcification', 'Thrombus', 'ExternalElasticMembrane', 'FibrousPlaque']} name_for_cid[1015] = 'PatientAlignmentMethods' cid_concepts[1015] = \ {'DCM': ['LaserCrossHairs']} name_for_cid[627] = 'NeuromuscularBlockingAgentsforSmallAnimalAnesthesia' cid_concepts[627] = \ {'SCT': ['Succinylcholine', 'Pancuronium']} name_for_cid[23] = 'CranioCaudadAngulation' cid_concepts[23] = \ {'SCT': ['Caudal', 'Cephalic']} name_for_cid[10000] = 'ScopeofAccumulation' cid_concepts[10000] = \ {'DCM': ['ProcedureStepToThisPoint', 'Study', 'Series', 'PerformedProcedureStep', 'IrradiationEvent']} name_for_cid[6154] = 'EchoPattern' cid_concepts[6154] = \ {'DCM': ['Anechoic', 'Hyperechoic', 'Complex', 'Hypoechoic', 'Isoechoic']} name_for_cid[3706] = 'OverallContractility' cid_concepts[3706] = \ {'SCT': ['Hypokinesis', 'Hyperkinesis', 'Akinesis', 'NormalWallContractility']} name_for_cid[6011] = 'CalcificationTypesfromBIRADS®' cid_concepts[6011] = \ {'DCM': ['FinePleomorphicCalcification', 'Macrocalcifications'], 'SCT': ['CalcifiedSkinOfBreast', 'FineLinearCastingCalcification', 'CalcifiedSutureMaterial', 'AmorphousCalcification', 'VascularCalcification', 'RoundShapedCalcification', 'LucentCenteredCalcification', 'PunctateCalcification', 'MilkOfCalciumCalcification', 'DystrophicCalcification', 'EggshellCalcification', 'LargeRodLikeCalcification', 'FineLinearBranchingCastingCalcification', 'MicrocalcificationsOfTheBreast', 'CoarsePopcornLikeCalcification', 'HeterogeneousCalcification']} name_for_cid[3213] = 'StressHemodynamicFindings' cid_concepts[3213] = \ {'SCT': ['ExertionalHypotension', 'ChronotropicIncompetence', 'ExertionalHypertension']} name_for_cid[7600] = 'LymphNodeAnatomicSites' cid_concepts[7600] = \ {'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', 'SubiliacLymphNode', 'SuperiorRectalLymphNode', 'SuperficialParotidLymphNode', 'HypogastricLymphNode', 'IliacLymphNode', 'LymphNodeOfMesentery', 'EpitrochlearLymphNode', 'AxillaryLymphNode', 'JuxtaintestinalLymphNode', 'ParatrachealLymphNode', 'DeepAnteriorCervicalLymphNode', 'LumbarLymphNode', 'UpperParatrachealLymphNode', 'RegionalLymphNode', 'PyloricLymphNode', 'LacunarLymphNode', 'GutAssociatedLymphNode', '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', 'AbdominalLymphNode', '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', 'PromontoryCommonIliacLymphNode', 'CysticLymphNode', 'SubmentalLymphNode', 'MedialExternalIliacLymphNode', 'LowerJugularLymphNode', 'PancreaticoduodenalLymphNode', 'MandibularLymphNode', 'PrepericardialLymphNode', 'MediastinalLymphNode', 'LowerLimbLymphNode', 'LungAndTracheobronchialLymphNodes', 'PrevascularRetrotrachealLymphNode', 'DiaphragmaticLymphNode', 'InferiorMesentericLymphNode', 'FemaleGenitalLymphNode', 'LymphNodeOfThePulmonaryLigament', 'PostauricularLymphNode', 'LymphNodeRingOfCardiaOfStomach', 'ParavaginalLymphNode', 'SupramammaryLymphNode', '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', 'SubmaxillaryLymphNode', 'ParamammaryLymphNode', 'ObturatorLymphNode', 'SuperiorLateralInguinalLymphNode', 'MastoidLymphNode', 'JugularLymphNode', 'LymphNodeOfHeadAndNeck', 'GastroOmentalLymphNode', 'LateralAxillaryLymphNode', 'CubitalLymphNode', 'ScaleneLymphNode', 'InferiorPancreaticLymphNode']} name_for_cid[7250] = 'MultiFrameSubsetType' cid_concepts[7250] = \ {'DCM': ['ReferencedFrames', 'ReferencedSegment']} name_for_cid[3090] = 'TimeSynchronizationChannelTypes' cid_concepts[3090] = \ {'DCM': ['XRayOnTrigger', 'XRayFluoroscopyOnSignal', 'DigitalTimecodeNOS', 'IRIGBTimecode', 'ECGBasedGatingSignalProcessed']} name_for_cid[9537] = 'EffectiveDoseCalculationMethodCategories' cid_concepts[9537] = \ {'DCM': ['FractionationBasedOrTemporallyBasedMethods', 'RadiationTransportBasedMethods']} name_for_cid[7483] = 'CommonAnatomicRegionsforAnimals' cid_concepts[7483] = \ {'SCT': ['FetlockOfHindlimb', 'Sacrum', 'NasalSinus', 'Metatarsus', 'NavicularOfHindfoot', 'CalcanealTubercle', 'Humerus', 'Abdomen', 'FetlockOfForelimb', 'Esophagus', 'Bladder', 'AtlantalAxialJoint', 'Mandible', 'PasternOfHindfoot', 'Wing', 'LumboSacralSpine', 'Metacarpus', 'MaxillaryIncisorTeeth', 'UrinaryTract', 'MandibularDentalArch', 'Carpus', 'EntireBody', 'ChestAndAbdomen', 'RadiusAndUlna', 'LumbarSpine', 'Digit', 'Hindfoot', 'MaxillaryDentalArch', 'TibiaAndFibula', 'PasternOfForefoot', 'Forefoot', 'Pelvis', 'Tarsus', 'UpperGastroIntestinalTract', 'Chest', 'Shoulder', 'Stiffle', 'ElbowJoint', 'Colon', 'AllLegs', 'OrbitalStructure', 'ThoracicSpine', 'HipJoint', 'CoccygealVertrebrae', 'CervicoThoracicSpine', 'MandibularIncisorTeeth', 'Femur', 'FrontalSinus', 'Skull', 'ThoracoLumbarSpine', 'Urethra', 'Patella', 'AtlantoOccipitalJoint', 'NavicularOfForefoot', 'CervicalSpine'], 'UMLS': ['DistalPhalanx']} name_for_cid[12251] = 'CardiacUltrasoundLinearValveMeasurements' cid_concepts[12251] = \ {'LN': ['LeafletThickness', 'LeafletSeparation', 'ROIInternalDimensionByUS', 'ROIThicknessByUS', 'CEDistance', 'DEExcursion'], 'SCT': ['Radius', 'MinorAxis', 'Length', 'Diameter', 'MajorAxis', 'Circumference']} name_for_cid[3839] = 'CoronaryVeins' cid_concepts[3839] = \ {'SCT': ['GreatCardiacVein', 'AnteriorCardiacVein', 'VentricularVein', 'AtrioventricularVein', 'SmallCardiacVein', 'SmallestCardiacVein', 'MiddleCardiacVein', 'CoronarySinus', 'AtrialVein', 'AzygosVein']} name_for_cid[220] = 'LevelofSignificance' cid_concepts[220] = \ {'SCT': ['Significant', 'SignificanceUndetermined', 'MostSignificant', 'HighlySignificant', 'NotSignificant']} name_for_cid[7196] = 'SpatialandRelationalConceptSegmentationPropertyTypes' cid_concepts[7196] = \ {'DCM': ['Lucency', 'RegistrationInput', 'Background', 'SingleSubjectExtractedFromGroup', 'Interface', 'Line'], 'NCIt': ['ReferenceRegion'], 'SCT': ['Normal', 'WasteMaterial', 'Tissue']} name_for_cid[4240] = 'OphthalmicMeasurementorCalculationDataSource' cid_concepts[4240] = \ {'DCM': ['MeasurementFromThisDevice', 'ExternalDataSource', 'AxialMeasurementsSOPInstance', 'RefractiveMeasurementsSOPInstance', 'AutorefractionMeasurementsSOPInstance', 'ManualEntry', 'KeratometryMeasurementsSOPInstance']} name_for_cid[9536] = 'RadiotherapyPrescribingandSegmentingPersonRoles' cid_concepts[9536] = \ {'DCM': ['LeadRadiologicTechnologist'], 'SCT': ['RadiologicTechnologist', 'Resident', 'MedicalPractitioner', 'Physician', 'RadiationTherapist'], 'UMLS': ['ConsultingPhysician', 'RadiationPhysicist', 'MedicalPhysicist']} name_for_cid[7482] = 'DXAnatomyImagedforAnimals' cid_concepts[7482] = \ {'SCT': ['FetlockOfHindlimb', 'Sacrum', 'NasalSinus', 'Metatarsus', 'NavicularOfHindfoot', 'CalcanealTubercle', 'Humerus', 'Abdomen', 'FetlockOfForelimb', 'Esophagus', 'Bladder', 'AtlantalAxialJoint', 'Mandible', 'PasternOfHindfoot', 'Wing', 'LumboSacralSpine', 'Metacarpus', 'MaxillaryIncisorTeeth', 'UrinaryTract', 'MandibularDentalArch', 'Carpus', 'EntireBody', 'ChestAndAbdomen', 'RadiusAndUlna', 'LumbarSpine', 'Digit', 'Hindfoot', 'MaxillaryDentalArch', 'TibiaAndFibula', 'PasternOfForefoot', 'Forefoot', 'Pelvis', 'Tarsus', 'UpperGastroIntestinalTract', 'Chest', 'Shoulder', 'Stiffle', 'ElbowJoint', 'Colon', 'AllLegs', 'OrbitalStructure', 'ThoracicSpine', 'HipJoint', 'CoccygealVertrebrae', 'CervicoThoracicSpine', 'MandibularIncisorTeeth', 'Femur', 'FrontalSinus', 'Skull', 'ThoracoLumbarSpine', 'Urethra', 'Patella', 'AtlantoOccipitalJoint', 'NavicularOfForefoot', 'CervicalSpine'], 'UMLS': ['DistalPhalanx']} name_for_cid[12250] = 'CardiacUltrasoundCommonLinearMeasurements' cid_concepts[12250] = \ {'LN': ['ROIInternalDimensionByUS', 'ROIThicknessByUS'], 'SCT': ['Radius', 'MinorAxis', 'Length', 'Diameter', 'MajorAxis', 'Circumference']} name_for_cid[3838] = 'DiameterDerivation' cid_concepts[3838] = \ {'DCM': ['AnteriorPosterior'], 'SCT': ['Minimum', 'Maximum', 'Mean', 'Transverse']} name_for_cid[221] = 'MeasurementRangeConcepts' cid_concepts[221] = \ {'DCM': ['PercentileRankingOfMeasurement', 'ZScoreOfMeasurement', 'StandardDeviationOfPopulation', '_2SigmaDeviationOfPopulation'], 'SCT': ['_1SigmaLowerValueOfPopulation', '_2SigmaLowerValueOfPopulation', '_5thPercentileValueOfPopulation', '_10thPercentileValueOfPopulation', '_1SigmaUpperValueOfPopulation', '_2SigmaUpperValueOfPopulation', 'MeanValueOfPopulation', '_95thPercentileValueOfPopulation', '_90thPercentileValueOfPopulation', 'MedianValueOfPopulation']} name_for_cid[7197] = 'BodySubstanceSegmentationPropertyTypes' cid_concepts[7197] = \ {'SCT': ['Feces', 'Urine', 'BodyFluid', 'Bile', 'Gas']} name_for_cid[4241] = 'OphthalmicAxialLengthSelectionMethod' cid_concepts[4241] = \ {'DCM': ['MeanValueChosen', 'UserChosenValue']} name_for_cid[10001] = 'UIDTypes' cid_concepts[10001] = \ {'DCM': ['StudyInstanceUID', 'PerformedProcedureStepSOPInstanceUID', 'SeriesInstanceUID', 'IrradiationEventUID']} name_for_cid[6155] = 'PosteriorAcousticFeatures' cid_concepts[6155] = \ {'DCM': ['CombinedPosteriorEnhancementAndShadowing', 'NoPosteriorAcousticFeatures', 'PosteriorEnhancement', 'PosteriorShadowing']} name_for_cid[3707] = 'VSDDescription' cid_concepts[3707] = \ {'SCT': ['NonRestrictive', 'Membranous', 'Restrictive', 'None']} name_for_cid[6010] = 'MammographyCalcificationTypes' cid_concepts[6010] = \ {'DCM': ['FinePleomorphicCalcification', 'Macrocalcifications'], 'SCT': ['CalcifiedSkinOfBreast', 'FineLinearCastingCalcification', 'CalcifiedSutureMaterial', 'AmorphousCalcification', 'VascularCalcification', 'RoundShapedCalcification', 'LucentCenteredCalcification', 'PunctateCalcification', 'MilkOfCalciumCalcification', 'DystrophicCalcification', 'EggshellCalcification', 'LargeRodLikeCalcification', 'FineLinearBranchingCastingCalcification', 'MicrocalcificationsOfTheBreast', 'CoarsePopcornLikeCalcification', 'HeterogeneousCalcification']} name_for_cid[3212] = 'TreadmillSpeed' cid_concepts[3212] = \ {'UCUM': ['kmH', 'Mph']} name_for_cid[3642] = 'DegreeFindings' cid_concepts[3642] = \ {'SCT': ['SeverelyElevated', 'Decreased', 'Elevated', 'NormalRange']} name_for_cid[7601] = 'HeadandNeckCancerAnatomicSites' cid_concepts[7601] = \ {'SCT': ['PharyngealTonsil', 'ParanasalSinus', 'Oropharynx', 'FloorOfMouth', 'BuccalMucosa', 'Supraglottis', 'BaseOfTongue', 'Lip', 'Tongue', 'TonsilAndAdenoid', 'Hypopharynx', 'OropharyngealTonsil', 'SalivaryGland', 'MaxillarySinus', 'PyriformSinus', 'Glottis', 'LingualTonsil', 'Larynx', 'PalatineUvula', 'OralCavity', 'PalatineTonsil', 'NasalCavity', 'Nasopharynx', 'TubalTonsil', 'LowerAlveolarRidge', 'RetromolarTrigone'], 'UMLS': ['UnknownPrimaryNeoplasiaSite']} name_for_cid[12207] = 'EchocardiographyMitralValve' 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', 'SystolicToDiastolicVelocityRatio', 'EFSlope', 'PeakReversalVelocityDuringAtrialContraction', 'TimeAveragedMeanVelocity'], 'SCT': ['MitralValveAWaveDuration', 'CardiacIndex', 'MitralValveClosureToOpeningTime', 'CardiacOutput', 'MitralValveATDTRatio', 'RegurgitantFraction', 'MitralValveEWaveDecelerationTime', 'StrokeVolume', 'CardiovascularOrificeArea', 'CardiovascularOrificeDiameter', 'StrokeIndex']} name_for_cid[3496] = 'IVUSFiducialPoints' cid_concepts[3496] = \ {'SCT': ['VascularCalcification', 'Vein', 'VesselOrigin', 'Stent', 'FibrousPlaque', 'CollateralBranchOfVessel']} name_for_cid[4216] = 'OphthalmicVisualAcuityType' cid_concepts[4216] = \ {'DCM': ['AutorefractionVisualAcuity', 'HabitualVisualAcuity', 'PrescriptionVisualAcuity'], 'SCT': ['BestCorrectedVisualAcuity', 'PinholeVisualAcuity', 'BrightnessAcuityTestingVisualAcuity', 'PotentialAcuityMeterVisualAcuity', 'UncorrectedVisualAcuity']} name_for_cid[626] = 'PremedicationAgentsforSmallAnimalAnesthesia' cid_concepts[626] = \ {'SCT': ['Chlorpromazine', 'Acepromazine']} name_for_cid[3750] = 'PreviouslyDilatedLesion' cid_concepts[3750] = \ {} 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', 'BrachialPlexus', 'ErectorSpinaeMuscle', 'MidCircumflexCoronaryArtery', 'Prosthesis', 'IntermediateArteryRamus', 'SubscapularisMuscle', 'EndotrachealTube', 'LymphNode', 'TrapeziusMuscle', 'IntercostalArtery', 'Esophagus', 'PlateLikeAtelectasis', 'ScarTissue', 'TeresMajorMuscle', 'LeftMainBronchus', 'MidRightCoronaryArtery', 'PulmonaryVein', 'SubclavianArtery', 'EsophagealHiatus', '_3rdLeftPosterolateralCoronaryArtery', 'HeartValveProsthesis', 'PectoralisMajorMuscle', 'Tracheotomy', 'Sternum', 'Staple', 'LeftPosteriorDescendingCircumflexCoronaryArtery', '_1stMarginalCoronaryArtery', 'Pin', 'PulmonaryArtery', 'MidLeftAnteriorDescendingCoronaryArtery', 'Thyroid', 'CoronaryArteryGraft', 'MitralValve', 'AcromioclavicularJoint', 'SupraspinatusMuscle', 'AxillaryFascia', 'ExternalIntercostalMuscle', 'InfraspinatusMuscle', 'TricuspidValve', 'Nodule', 'FissureOfLung', 'LevatoresCostarumMuscles', 'SuperiorPhrenicArtery', 'DistalLeftAnteriorDescendingCoronaryArtery', 'AtrialSeptalDefect', 'Catheter', 'Ventricle', 'RightCoronaryArteryOstium', 'DescendingAorta', 'MarginalCoronaryArtery', 'InternalThoracicArtery', 'ProximalLeftAnteriorDescendingCoronaryArtery', 'Bullet', 'Spine', 'BronchialArtery', 'BrachiocephalicVein', 'ProximalCircumflexCoronaryArtery', 'VenaCavaFilter', '_2ndMarginalCoronaryArtery', 'Needle', 'Carina', 'AorticArch', 'PulmonaryEmbolism', 'CarotidBody', 'Heart', 'AirwayStructure', 'DeltoidMuscle', 'LeftMainCoronaryArtery', 'InternalIntercostalMuscle', 'UretericStent', '_1stDiagonalCoronaryArtery', 'InteratrialSeptum', 'LeftMainCoronaryArteryOstium', 'Scapula', 'IliocostalisMuscle', '_1stRightPosterolateralCoronaryArtery', 'Suture', 'RightPosteriorAVCoronaryArtery', 'FascialLayer', 'AorticValve', 'InferiorVenaCava', 'Jewelry', 'ThymusGland', 'SubcostalMuscle', 'Humerus', 'DistalRightCoronaryArtery', 'Mass', 'LeftAnteriorDescendingCoronaryArtery', 'CommonCarotidArtery', 'InnermostIntercostalMuscles', '_3rdMarginalCoronaryArtery', 'PectoralisMinorMuscle', 'EsophagealArtery', 'LatissimusDorsiMuscle', 'CervicalCollar', 'Trachea', 'LeftPosterolateralCircumflexCoronaryArtery', 'Bronchus', 'DorsalScapularArtery', 'FeedingTube', 'SuperiorVenaCava', 'CostalCartilage', 'BrachiocephalicTrunk', '_2ndRightPosterolateralCoronaryArtery', 'PulmonaryTrunk', 'AzygosVein', 'BrachialArtery', '_2ndDiagonalCoronaryArtery', 'DistalCircumflexCoronaryArtery', 'Rib', 'TeresMinorMuscle', 'LongissimusMuscle', 'SerratusAnteriorMuscle', 'Clavicle', 'AirTrapping', 'AorticIsthmus', 'Vertebra', '_1stLeftPosterolateralCoronaryArtery', 'Pneumothorax', 'CircumflexCoronaryArtery', 'Diaphragm', 'AxillaryArtery', 'Atrium', '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[75] = 'LowHighEqual' cid_concepts[75] = \ {'SCT': ['Low', 'High', 'Equal']} name_for_cid[3615] = 'ValveAreas' cid_concepts[3615] = \ {'DCM': ['DerivedNonValveArea'], 'SCT': ['MitralValveArea', 'TricuspidValveArea', 'PulmonicValveArea', 'AorticValveArea']} name_for_cid[6047] = 'CADProcessingandFindingsSummary' cid_concepts[6047] = \ {'DCM': ['AllAlgorithmsSucceededWithoutFindings', 'AllAlgorithmsSucceededWithFindings', 'NotAllAlgorithmsSucceededWithoutFindings', 'NotAllAlgorithmsSucceededWithFindings', 'NoAlgorithmsSucceededWithoutFindings']} name_for_cid[3480] = 'IVUSProcedurePhases' cid_concepts[3480] = \ {'SCT': ['CardiacCatheterizationPostInterventionPhase', 'CardiacCatheterizationPreInterventionPhase']} name_for_cid[12211] = 'EchocardiographyAorticValve' 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', 'SystolicToDiastolicVelocityRatio', 'EFSlope', 'PeakReversalVelocityDuringAtrialContraction', 'AorticValveCuspSeparation', 'TimeAveragedMeanVelocity'], 'SCT': ['RegurgitantFraction', 'RatioOfAorticValveAccelerationTimeToEjectionTime', 'CardiovascularOrificeArea', 'CardiovascularOrificeDiameter']} name_for_cid[630] = 'LocalAnestheticsforSmallAnimalAnesthesia' cid_concepts[630] = \ {'SCT': ['Lidocaine', 'Bupivacaine', 'LidocainePrilocaine']} 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[4200] = 'OphthalmicImagingAgent' cid_concepts[4200] = \ {'SCT': ['IndocyanineGreen', 'RoseBengal', 'Fluorescein', 'TrypanBlue', 'MethyleneBlue']} name_for_cid[63] = 'ImagingAgentAdministrationMode' cid_concepts[63] = \ {'DCM': ['ManualAdministration', 'AutomatedAdministration']} name_for_cid[10040] = 'RadiopharmaceuticalOrganDoseReferenceAuthority' cid_concepts[10040] = \ {'DCM': ['InvestigationalNewDrug', 'MIRDPamphlet1', 'ICRPPublication53', 'ICRPPublication80', 'ICRPPublication106', 'MIRDOSE', 'OLINDAEXM', 'PackageInsert', 'InstitutionallyApprovedEstimates']} name_for_cid[7705] = 'CommissuralFibers' cid_concepts[7705] = \ {'SCT': ['ForcepsMinor', 'GenuOfCorpusCallosum', 'SpleniumOfCorpusCallosum', 'AnteriorCommissure', 'ForcepsMajor', 'PosteriorCommissure', 'CorpusCallosum', 'HabenularCommissure', 'TapetumOfCorpusCallosum']} name_for_cid[6114] = 'OsseousAnatomyFindingorFeature' cid_concepts[6114] = \ {'SCT': ['Clavicle', 'Rib', 'Humerus', 'Scapula', 'Vertebra', 'Spine', 'Sternum']} name_for_cid[3746] = 'PercutaneousEntrySite' cid_concepts[3746] = \ {'SCT': ['ViaFemoralVein', 'ViaFemoralArtery', 'ViaArtery', 'ViaBrachialArtery', 'ViaArmVein', 'ViaRadialArtery', 'ViaVein']} name_for_cid[6051] = 'BreastProcedureReason' cid_concepts[6051] = \ {'DCM': ['NeedleLocalizationAndBiopsy', 'HistoryOfBenignBreastBiopsy', 'MarkerPlacement', 'PersonalHistoryOfBreastCancerWithBreastConservationTherapy', 'PersonalHistoryOfBreastCancerWithMastectomy', 'KnownBiopsyProvenMalignancy', 'ClinicalFinding', 'Targeted', 'Survey', 'RecallForTechnicalReasons', 'Calibration', 'RecallForImagingFindings', 'RecallForPatientSymptomsClinicalFindings', 'ReviewOfAnOutsideStudy', 'AdditionalEvaluationRequestedFromAbnormalScreeningExam', 'QualityControl', 'AdditionalEvaluationRequestedFromPriorStudy', 'FollowUpAtShortIntervalFromPriorStudy', 'HistoryOfBreastAugmentationAsymptomatic'], 'SCT': ['ReductionMammoplasty', 'Diagnostic', 'PersonalHistoryOfBreastCancer', 'AugmentationMammoplasty', 'Brachytherapy', 'Screening', 'RadiationTherapy']} name_for_cid[6401] = 'NonlesionObjectTypePhysicalObjects' cid_concepts[6401] = \ {'DCM': ['OtherMarker'], 'SCT': ['Suture', 'CardiacPacemaker', 'CompressionPaddle', 'JWire', 'Bullet', 'BBShotLeadPellet', 'OpaqueMarker', 'Clip', 'Catheter', 'IDPlate', 'Collimator', 'Implant', 'Staple']} name_for_cid[7210] = 'RelatedSeriesPurposesofReference' cid_concepts[7210] = \ {'DCM': ['ForAttenuationCorrection', 'SameAnatomy', 'SourceSeriesForImageProcessingOperation', 'SameIndication', 'SimultaneouslyAcquired']} name_for_cid[12246] = 'CardiacUltrasoundIndicationforStudy' cid_concepts[12246] = \ {'SCT': ['Hemoptysis', 'Arrhythmia', 'Palpitations', 'AnginaPectoris', 'Syncope', 'AbnormalECG', 'CoronaryArteryDisease', 'SupraventricularTachycardia', 'ImagingGuidance', 'Fever', 'LeftBundleBranchBlock', 'ValvularHeartDisease', 'ChestPain', 'Hypertension', 'HeartDiseaseRiskFactors', 'Murmur', 'CongenitalHeartDisease', 'Dyspnea']} name_for_cid[9520] = 'SegmentedRTAccessoryDevices' cid_concepts[9520] = \ {'DCM': ['BrachytherapyChannel', 'RectalBalloon', 'Mold', 'AccessoryTray', 'HeadAndNeckMask', 'BrachytherapyChannelShield', 'ApertureBlock', 'HeadMask', 'BrachytherapySourceApplicator', 'Headframe', 'VaginalCylinder', 'BodyFrame', 'BreastBoard', 'Cast', 'RadiotherapyApplicator', 'WholeBodyPod', 'VacuumMold'], 'SCT': ['ShieldingBlock', 'Chair', 'SurfaceBolus', 'Headrest', 'BiteBlock', 'Table']} name_for_cid[4257] = 'VisualFieldGlobalIndexName' cid_concepts[4257] = \ {'DCM': ['VisualFieldIndex', 'VisualFieldLossDueToDiffuseDefect', 'VisualFieldLossDueToLocalDefect', 'GlaucomaHemifieldTestAnalysis', 'OpticalFixationMeasurements']} name_for_cid[12303] = 'EchoMeasurementTypes' cid_concepts[12303] = \ {'DCM': ['DirectlyMeasured', 'Calculated', 'FractionalChange', 'Indexed', 'ManualEntry'], 'SCT': ['Ratio']} name_for_cid[7181] = 'AbstractMultidimensionalImageModelComponentUnits' cid_concepts[7181] = \ {'UCUM': ['Centimeter2Milliliter', 'Mm2S', 'CubicCentimeter', 'SquareCentimeter', 'Um2ms', 'StandardizedUptakeValueBodySurfaceArea', 'StandardizedUptakeValueLeanBodyMassJanma', 'Millitesla', 'Sv', 'SecondPerSquareMillimeter', 'CubicMillimeter', 'SquareMillimeter', 'MilligramsMinuteMilliliter', 'StandardizedUptakeValueIdealBodyWeight', '_106Mm2S', 'BecquerelsMilliliter', 'Micrometer', 'MillimolesPerkgWetWeight', 'Gy', 'MicromoleMinuteMilliliter', 'Decibel', 'ArbitraryUnit', 'WoodUM2', 'DynScm5', 'MilliliterMinuteGram', 'Um2S', 'StandardizedUptakeValueBodyWeight', 'MilliliterPer100Milliliter', 'MillimeterSecond', 'MicromoleMilliliter', 'ProportionalToCountsPerSecond', 'Centimeter', 'MilliliterPerMinute', 'CountsPerSecond', 'Ppm', 'Second', 'PRUM2', 'StandardizedUptakeValueLeanBodyMassJames128Multiplier', 'WoodU', 'MilliliterGram', 'ProportionalToCounts', 'Kpa', 'NumberParticlesPer100GramOfTissue', 'MilliliterPer100GramPerMinute', 'Min', 'Centimeter', 'CubicDecimeter', 'Millimeter', 'CentimeterSecond', 'PRU', 'Ratio', 'CubicMicrometer', 'SquareMicrometer', 'Counts', 'Millisecond', 'DynScm5M2', 'Percent', 'S', 'NoUnits', 'HounsfieldUnit', 'MilliliterPerSecond', 'DegreesCelsius', 'Mmhg', 'StandardizedUptakeValueLeanBodyMassJames', 'Hertz']} name_for_cid[3711] = 'ValvularAbnormalities' cid_concepts[3711] = \ {'DCM': ['HeartValveFlail'], 'SCT': ['Regurgitation', 'CalcifiedHeartValve', 'Stenosis', 'ValvularEndocarditis', 'ImmobileHeartValve']} name_for_cid[6143] = 'LesionResponse' cid_concepts[6143] = \ {'DCM': ['TargetLesionCompleteResponse', 'TargetLesionPartialResponse', 'TargetLesionProgressiveDisease', 'TargetLesionStableDisease', 'NonTargetLesionCompleteResponse', 'NonTargetLesionIncompleteResponseOrStableDisease', 'NonTargetLesionProgressiveDisease']} name_for_cid[7302] = 'ImplantTemplatesViewOrientations' cid_concepts[7302] = \ {'SCT': ['AnteroPosterior', 'MedioLateral', 'LateralMedial']} name_for_cid[10017] = 'XRayGrid' cid_concepts[10017] = \ {'DCM': ['FixedGrid', 'FocusedGrid', 'ReciprocatingGrid', 'ParallelGrid', 'CrossedGrid', 'NoGrid']} name_for_cid[3204] = 'StressAgents' cid_concepts[3204] = \ {'SCT': ['Dobutamine', 'Adenosine', 'Dipyridamole', 'Atropine', 'AdenosineA2ReceptorAgonist']} name_for_cid[6006] = 'MammographyCharacteristicsofMargin' cid_concepts[6006] = \ {'DCM': ['AngularMargins'], 'SCT': ['SpiculatedLesion', 'CircumscribedLesion', 'ObscuredLesion', 'IndistinctLesion', 'MicrolobulatedLesion']} name_for_cid[6211] = 'ColonCADMaterialDescription' cid_concepts[6211] = \ {'DCM': ['SoftTissue'], 'SCT': ['BoneMatrix', 'Air', 'Fat']} 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[12114] = 'AbdominalVeins(Unilateral)' cid_concepts[12114] = \ {'SCT': ['HepaticVein', 'LeftMainBranchOfPortalVein', 'InferiorRightHepaticVein', 'PortalVein', 'SuperiorMesentericVein', 'TransjugularIntrahepaticPortosystemicShunt', 'InferiorVenaCava', 'MiddleHepaticVein', 'InferiorMesentericVein', 'RightHepaticVein', 'RightMainBranchOfPortalVein', 'UmbilicalVein', 'SplenicVein', 'LeftHepaticVein']} name_for_cid[4040] = 'EndoscopyAnatomicRegions' cid_concepts[4040] = \ {'SCT': ['Mediastinum', 'Ureter', 'UterusAndFallopianTubes', 'ParanasalSinus', 'EsophagusStomachAndDuodenum', 'UpperUrinaryTract', 'Bronchus', 'SigmoidColon', 'PharynxAndLarynx', 'Chest', 'Shoulder', 'Abdomen', 'AnusRectumAndSigmoidColon', 'LumenOfBloodVessel', 'TracheaAndBronchus', 'Gallbladder', 'Cervix', 'Bladder', 'Knee', 'BileDuct', 'Joint', 'LargeIntestine', 'Larynx', 'Spine', 'Rectum', 'Pharynx', 'ExternalAuditoryCanal', 'InguinalRegion', 'Kidney', 'Nasopharynx', 'BladderAndUrethra']} name_for_cid[6092] = 'QuantitativeConceptsforUsage,Exposure' cid_concepts[6092] = \ {'DCM': ['VolumeOfUse', 'DoseFrequency', 'RateOfExposure'], 'SCT': ['Dosage']} 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[4105] = 'PerfusionAnalysisMethods' cid_concepts[4105] = \ {'DCM': ['LeastMeanSquareLMSDeconvolution', 'SingularValueDecompositionSVDDeconvolution']} name_for_cid[12285] = 'CardiacUltrasoundAtrioventricularValvesFindingSites' cid_concepts[12285] = \ {'SCT': ['TricuspidValve', 'CommonNonMitralNonTricuspidAtrioventricularValveStructure', 'MitralValve']} name_for_cid[7457] = 'SexMaleFemaleorBoth' cid_concepts[7457] = \ {'DCM': ['MixedSex', 'Female', 'Male']} name_for_cid[3414] = 'ProcedureUrgency' cid_concepts[3414] = \ {'SCT': ['EmergentProcedure', 'UrgentProcedure', 'ElectiveProcedure', 'SalvageProcedure']} name_for_cid[3551] = 'VentilationActions' cid_concepts[3551] = \ {'DCM': ['EndVentilation', 'BeginVentilation']} 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[3101] = 'CardiacProceduralStateValues' cid_concepts[3101] = \ {'DCM': ['ReinjectionState', 'DelayedRedistributionState', 'RedistributionState'], 'SCT': ['CardiacStressState', 'RestingState']} name_for_cid[3802] = 'PlaqueStructures' cid_concepts[3802] = \ {'SCT': ['Mixed', 'NonCalcified', 'Hyperplasia', 'Fibrous', 'PathologicCalcification', 'FattyDegeneration']} name_for_cid[4017] = 'AnatomicRegionModifierforIntraoralRadiography' cid_concepts[4017] = \ {'SCT': ['FirstMolarRegion', 'FirstPremolarRegion', 'ThirdMolarRegion', 'LateralIncisorRegion', 'SecondMolarRegion', 'SecondPremolarRegion', 'CanineRegion', 'CentralIncisorRegion']} name_for_cid[3228] = 'ECGTimingMeasurements' cid_concepts[3228] = \ {'MDC': ['PDurationGlobal', 'PPIntervalGlobal', 'PPIntervalPerLead', 'QTIntervalGlobal', 'QRSDurationPerLead', 'QTIntervalPerLead', 'PDurationPerLead', 'QRSDurationGlobal', 'PRIntervalGlobal', 'PRIntervalPerLead', 'RRIntervalPerLead', 'RRIntervalGlobal']} name_for_cid[3678] = 'QTCorrectionAlgorithms' cid_concepts[3678] = \ {'DCM': ['FraminghamQtcAlgorithm', 'HodgesQTCorrectionAlgorithm', 'FridericiaQtcAlgorithm', 'BazettQTCorrectionAlgorithm']} name_for_cid[18] = 'IsotopesinRadiopharmaceuticals' cid_concepts[18] = \ {'DCM': ['_191mIridium'], '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[12006] = 'FetalLongBonesBiometryMeasurements' cid_concepts[12006] = \ {'LN': ['ClavicleLength', 'FemurLength', 'FibulaLength', 'HumerusLength', 'RadiusLength', 'TibiaLength', 'UlnaLength']} name_for_cid[3402] = 'PatientStatusandEvents' 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[7011] = 'RejectedforQualityReasons' cid_concepts[7011] = \ {'DCM': ['OtherFailure', 'MotionBlur', 'UnknownFailure', 'UnderExposed', 'DoubleExposure', 'Positioning', 'OverExposed', 'NoImage', 'DetectorArtifacts', 'ArtifactsOtherThanGridOrDetectorArtifact', 'MechanicalFailure', 'ElectricalFailure', 'ImageArtifacts', 'SoftwareFailure', 'GridArtifacts', 'InappropriateImageProcessing']} name_for_cid[12293] = 'CardiacUltrasoundAortopulmonaryConnectionsFindingSites' cid_concepts[12293] = \ {'SCT': ['ArteriovenousFistula', 'AortaToPulmonaryArteryConnection', 'PatentDuctusArteriosus']} name_for_cid[3814] = 'StentComposition' cid_concepts[3814] = \ {'SCT': ['MetalStent', 'PlasticStent']} name_for_cid[7154] = 'AbdominalSegmentationTypes' cid_concepts[7154] = \ {'SCT': ['SkinOfAbdomen', 'PeritonealCavity', 'SmallIntestine', 'BileDuct', 'InferiorVenaCava', 'UrinarySystem', 'AbdominalAorta', 'Peritioneum', 'RetroperitonealSpace', 'Liver', 'AbdominalCavity', 'Spleen', 'Abdomen', 'Kidney', 'AdrenalGland', 'Omentum', 'AbdominalWallMuscle']} name_for_cid[3117] = 'AttenuationCorrectionMethods' cid_concepts[3117] = \ {'DCM': ['OSEMAlgorithm', 'ChangMethod']} name_for_cid[3455] = 'IndexMethods' cid_concepts[3455] = \ {'DCM': ['BSA1Point219'], 'LN': ['BSA']} name_for_cid[3005] = 'RespirationWaveform' cid_concepts[3005] = \ {'DCM': ['RespirationWaveform']} name_for_cid[6207] = 'ColonQuantitativeTemporalDifferenceType' cid_concepts[6207] = \ {'SCT': ['DifferenceInLocation', 'DifferenceInAttenuation', 'DifferenceInSize']} name_for_cid[3510] = 'CatheterSizeUnits' cid_concepts[3510] = \ {'UCUM': ['French', 'mm']} name_for_cid[3843] = 'MyocardialSubsegment' cid_concepts[3843] = \ {'SCT': ['Endocardial', 'Epicardial']} name_for_cid[12102] = 'TemporalPeriodsRelatingtoProcedureorTherapy' cid_concepts[12102] = \ {'SCT': ['AfterProcedure', 'BeforeProcedure', 'DuringProcedure']} name_for_cid[8130] = 'StainingProtocols' cid_concepts[8130] = \ {'SCT': ['HematoxylinAndEosinStainMethod', 'Staining']} name_for_cid[6084] = 'MammoplastyProcedures' cid_concepts[6084] = \ {'SCT': ['BreastImplantation', 'ReductionMammoplasty', 'RemovalOfBreastImplant', 'BreastReconstruction']} name_for_cid[6159] = 'MalignancyType' cid_concepts[6159] = \ {'DCM': ['InvasiveBreastCarcinoma', 'OtherMalignancyType'], 'SCT': ['IntraductalCarcinomaNonInfiltrating']} name_for_cid[12030] = 'UltrasoundContrast/BolusAgents' cid_concepts[12030] = \ {'DCM': ['Sonazoid', 'Sonovue', 'TargestarB', 'TargestarP', 'Cardiosphere', 'Echovist', 'Imagify', 'Levovist'], 'NDC': ['Definity', 'Optison']} name_for_cid[9243] = 'RadiotherapyRegistrationWorkitemDefinition' cid_concepts[9243] = \ {'DCM': ['RTPatientPositionRegistrationSinglePlane', 'RTPatientPositionRegistrationDualPlane', 'RTPatientPositionRegistrationSpatialFiducials', 'RTPatientPositionRegistrationUltrasound', 'RTPatientPositionRegistration2DOn3DReference', 'RTPatientPositionRegistrationOptical', 'RTPatientPositionRegistration3DCTVolumeBased', 'RTPatientPositionRegistration3DOn2DReference', 'RTPatientPositionRegistration3DCTGeneral', 'RTPatientPositionRegistration3DCTMarkerBased']} name_for_cid[4021] = 'PETRadiopharmaceutical' cid_concepts[4021] = \ {'DCM': ['Cetuximab89Zr', 'RO532344189Zr', 'J59189Zr', 'RO54290889Zr', 'Cu3689Zr', 'RO695894818F', 'Bevacizumab89Zr', 'PSMA1007F18', 'Cg250FAb289Zr', 'PSMA617Ga68', 'R150789Zr', 'E4G1089Zr', '_7E1189Zr', '_7D1289Zr', '_28H189Zr', 'MonoclonalAntibodyMab64Cu', 'MonoclonalAntibodyMab89Zr', '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', 'DfFK89Zr', 'DfFKPEG389Zr', 'DfFK289Zr', 'DfCD4589Zr', 'DfFK23PEG489Zr'], 'NCIt': ['DcfpylF18', 'SarcosineC11', 'DCFBCF18', 'PSMA11Ga68'], 'SCT': ['MespiperoneC11', 'RacloprideC11', 'FluciclatideF18', 'EDTAGa68', 'CarbonMonoxideO15', 'CarbonMonoxideC11', 'FluorobenzothiazoleF18', 'FluoromethaneF18', 'SodiumFluorideF18', 'FlorbetabenF18', 'GlutamateN13', 'FlumazenilF18', 'MethionineC11', 'FluorodeoxyglucoseF18', 'FlutemetamolF18', 'OxygenO15', 'SodiumIodideI124', 'AcetateC11', 'FluorocholineF18', 'FluorethyltyrosinF18', 'CarbonDioxideO15', 'FlorbetapirF18', 'GermaniumGe68', 'ThymidineFLTF18', 'FluoromisonidazoleF18', 'MonoclonalAntibodyI124', 'ButanolO15', 'CarfentanilC11', 'OxygenWaterO15', 'ATSMCu64', 'FluciclovineF18', 'SpiperoneF18', 'PalmitateC11', 'AmmoniaN13', 'FluoroLDopaF18', 'FlumazenilC11', 'PTSMCu62', 'SodiumNa22', 'FluorouracilF18', 'RubidiumChlorideRb82'], 'UMLS': ['MK6240F18', 'ISO1F18', 'FluoropropylDihydrotetrabenazineDTBZF18', 'FluoroetanidazoleF18', 'THK5317F18', 'UCBJC11', 'FluoroestradiolFESF18', 'Tyrosine3OctreotateGa68', 'EdotreotideGa68', 'THK5351F18', 'FlortaucipirF18']} name_for_cid[3422] = 'DeviceUseActions' cid_concepts[3422] = \ {'DCM': ['DeviceCrossedLesion'], 'SCT': ['DeviceUsed', 'DeviceAtSiteOfInterest', 'DeviceAppliedToPatient', 'DeviceWithdrawnRemoved', 'DeviceInsertedIntoSheath', 'DeviceCrossedSeptum']} name_for_cid[7461] = 'UnitsofAreaMeasurement' cid_concepts[7461] = \ {'UCUM': ['SquareMillimeter', 'SquareCentimeter', 'SquareMicrometer']} name_for_cid[8110] = 'SpecimenSamplingProcedure' cid_concepts[8110] = \ {'DCM': ['DissectionWithEntireSpecimenSubmission', 'DissectionWithRepresentativeSectionsSubmission'], 'SCT': ['CoreSampling', 'SmearProcedure', 'BlockSectioning', 'BlockSurfaceRecut', 'BlockStepSectioning', 'Dissection', 'LaserMicrodissection', 'TouchPreparation']} name_for_cid[3619] = 'HemodynamicResistanceMeasurements' cid_concepts[3619] = \ {'DCM': ['TotalVascularResistance', 'TotalPulmonaryResistance'], 'SCT': ['PulmonaryVascularResistance', 'SystemicVascularResistance']} name_for_cid[12122] = 'OtherVascularProperties' cid_concepts[12122] = \ {'LN': ['DecelerationTime', 'PeakGradient', 'AccelerationTime', 'MeanGradient', 'VolumeFlow'], 'SCT': ['VesselLumenCrossSectionalArea', 'VesselDepthFromSurface', 'VesselOutsideDiameter', 'VesselLumenDiameter', 'VesselIntimalCrossSectionalArea', 'LengthOfSegment', 'VesselIntimalDiameter']} name_for_cid[3530] = 'OxygenAdministrationActions' cid_concepts[3530] = \ {'DCM': ['BeginOxygenAdministration', 'EndOxygenAdministration']} name_for_cid[6118] = 'SizeDescriptor' cid_concepts[6118] = \ {'DCM': ['ExtremelySmall', 'VerySmall', 'TooSmall'], 'SCT': ['Medium', 'Enlarged', 'Small', 'Large']} name_for_cid[3526] = 'BloodGasSaturation' cid_concepts[3526] = \ {'DCM': ['BloodCarbonDioxideSaturation'], 'LN': ['CapillaryBloodOxygenSaturation', 'ArterialOxygenSaturation', 'VenousOxygenSaturation', 'CapillaryBloodOxygenSaturationByOximetry', 'BloodOxygenSaturation']} name_for_cid[3463] = 'VentricleIdentification' cid_concepts[3463] = \ {'SCT': ['RightVentricle', 'LeftVentricle']} name_for_cid[3208] = 'SummaryCodesExerciseECG' cid_concepts[3208] = \ {'SCT': ['ExerciseECGAbnormal', 'ExerciseECGEquivocal', 'ExerciseECGNormal', 'NotPerformed']} name_for_cid[3121] = 'PerfusionMorphology' cid_concepts[3121] = \ {'SCT': ['MyocardialIschemia', 'MyocardialInfarction', 'MixedIschemiaAndInfarction']} name_for_cid[7162] = 'SurfaceProcessingAlgorithmFamilies' cid_concepts[7162] = \ {'DCM': ['ManualProcessing', 'MultispectralProcessing', 'ClusterAnalysis', 'MultiScaleResolutionFiltering', 'HistogramAnalysis', 'MorphologicalOperations', 'EdgeDetection', 'AdaptiveFiltering', 'NeighborhoodAnalysis', 'DeformableModels', 'ArtificialIntelligence']} name_for_cid[7027] = 'SegmentedRadiotherapeuticDoseMeasurementDevices' cid_concepts[7027] = \ {'DCM': ['IonChamberArray', 'DiodeArray', 'LiquidIonChamber', 'Diode', 'IonChamber', 'OSLD', 'DiamondDetector'], 'SCT': ['MOSFETRadiationTherapyDosimetrySystemDosimeter', 'DigitalImager', 'ThermoluminescentRadiationDosimeter']} name_for_cid[7477] = 'GlobalShapeDescriptors' cid_concepts[7477] = \ {} name_for_cid[6071] = 'HistologicGradingMethod' cid_concepts[6071] = \ {'DCM': ['BloomRichardsonGrade'], 'SCT': ['NottinghamCombinedGrade']} name_for_cid[12118] = 'MeasurementOrientation' cid_concepts[12118] = \ {'DCM': ['AnteriorPosterior'], 'SCT': ['Transverse', 'Longitudinal']} name_for_cid[10060] = 'OrgansforRadiationDoseEstimates' cid_concepts[10060] = \ {'DCM': ['Phantom'], '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', 'EntireBody', 'Thyroid', 'Spleen', 'Kidney', 'AdrenalGland', 'BoneSurface']} name_for_cid[4109] = 'ModelIndependentDynamicContrastAnalysisParameters' cid_concepts[4109] = \ {'DCM': ['TimeToPeak', 'IAUC90BN', 'IAUC180BN', 'TemporalDerivativeThreshold', 'IAUC', 'MaximumSlope', 'IAUC60', 'MaximumDifference', 'IAUC90', 'TracerConcentration', 'IAUC180', 'IAUCBN', 'IAUC60BN', 'TimeOfPeakConcentration', 'BolusArrivalTime', 'TimeOfLeadingHalfPeakConcentration']} name_for_cid[6134] = 'ChestQualitativeTemporalDifferenceType' cid_concepts[6134] = \ {'SCT': ['DifferenceInBorderDefinition', 'DifferenceInDistribution', 'NoSignificantChangesInTheFinding', 'IncreaseInSize', 'DifferenceInTexture', 'DifferenceInBorderShape', 'DifferenceInSiteInvolvement', 'DifferenceInSubstance', 'LessDefined', 'FindingPartiallyRemoved', 'MoreDefined', 'DecreaseInSize']} name_for_cid[240] = 'PresentAbsent' cid_concepts[240] = \ {'SCT': ['Absent', 'Present', 'Undetermined']} name_for_cid[8203] = 'SurfaceScanRegistrationMethodTypes' cid_concepts[8203] = \ {'DCM': ['IterativeClosestPoint', 'Freehand', 'FiducialAlignment']} name_for_cid[610] = 'WaterTypes' cid_concepts[610] = \ {'DCM': ['ReverseOsmosisPurifiedWater', 'ReverseOsmosisPurifiedHclAcidifiedWater'], 'SCT': ['TapWater', 'DistilledWater']} name_for_cid[4220] = 'VisualFixationQualityDuringAcquisition' cid_concepts[4220] = \ {'SCT': ['Steady', 'Indeterminate', 'NotSteady']} name_for_cid[12231] = 'VolumeFlowMethods' cid_concepts[12231] = \ {'DCM': ['DopplerVolumeFlow', 'ProximalIsovelocitySurfaceArea']} name_for_cid[6026] = 'MammographyAssessment' cid_concepts[6026] = \ {'DCM': ['PostProcedureMammogramsForMarkerPlacement']} name_for_cid[6163] = 'MenstrualCyclePhase' cid_concepts[6163] = \ {'DCM': ['_1stWeek', '_2ndWeek', '_3rdWeek'], 'SCT': ['MenstruationPresent']} name_for_cid[3418] = 'LesionRisk' cid_concepts[3418] = \ {} name_for_cid[647] = 'PositionReferenceIndicatorforFrameofReference' cid_concepts[647] = \ {'FMA': ['Bregma', 'Lambda']} name_for_cid[12289] = 'CardiacUltrasoundSemilunarValves,AnnulusandSinusesFindingSites' cid_concepts[12289] = \ {'SCT': ['PulmonicValve', 'NeoaorticValve', 'AorticValve', 'TruncalValveStructure', 'NeoaorticRoot', 'RootOfAorta']} name_for_cid[12266] = 'CardiacUltrasoundMitralValve' 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', '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[702] = 'RTContentAssessmentTypes' cid_concepts[702] = \ {'DCM': ['RTPreTreatmentConsistencyCheck', 'RTPreTreatmentDoseCheck']} name_for_cid[9500] = 'DosimetricObjectiveTypes' 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[6030] = 'MammographyPathologyCodes' 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', 'Leiomyosarcoma', 'Carcinosarcoma', 'TubularAdenocarcinoma', 'CystOfBreast', 'FatNecrosisOfBreast', 'Leiomyoma', 'HodgkinDisease', 'HemangiomaOfSubcutaneousTissue', 'LymphNode', 'BreastLobularHyperplasia', 'CarcinomaInSituOfMaleBreast', 'EpidermalInclusionCyst', 'Galactocele', 'ThrombophlebitisOfBreastMondorDisease', 'ScarTissue', 'LobularCarcinomaInSituOfBreast', 'Plasmacytoma', 'DuctalHyperplasiaUsual', 'Angiosarcoma', 'Gynecomastia', 'GiantFibroadenoma', 'MalignantFibrousHistiocytoma', 'ApocrineMetaplasia', 'Fibrosarcoma', 'TubularAdenoma', 'SignetRingCellCarcinoma', 'Lymphoma', 'Hematoma', 'Amyloid', 'PhyllodesTumor', 'CarcinomaWithMetaplasia', 'Chondrosarcoma', 'PleomorphicAdenoma', 'IntraductalCarcinomaMicroPapillary', 'Neurofibroma', 'Hemangiopericytoma', 'NonHodgkinLymphoma', 'PagetDiseaseMammary', 'Adenomyoepithelioma', 'FocalFibrosis', 'InfiltratingDuctCarcinoma', 'Lipoma', 'SpindleCellNodule', 'Abscess', 'SclerosingAdenosis', 'Liposarcoma', 'Adenolipoma', 'Comedocarcinoma', 'Fibroadenoma', 'MammaryDuctEctasia', 'Chondroma', 'Hemangioma', 'SquamousCellCarcinoma', 'InfarctionOfBreast', 'ApocrineAdenocarcinoma', 'Adenoma', 'PapillaryCarcinoma', 'RadialScar', 'InflammatoryCarcinoma', 'HemangiomaVenous', 'LipidRichLipidSecretingCarcinoma', 'GranularCellTumor', 'Angiolipoma', 'ForeignBody', 'HyperplasiaUsual', 'InvasiveCribriformCarcinoma', 'AdenoidCysticCarcinoma', 'Angiomatosis', 'Adenosis', 'Seroma', 'MedullaryCarcinoma', 'AtypicalIntraductalHyperplasia', 'ExtraAbdominalDesmoid', 'Fibromatosis', 'Inflammation', 'IntramammaryLymphNode', 'AtypicalLobularHyperplasia', 'IntraductalPapilloma', 'NeoplasmOfTheMammarySkin', 'PhyllodesTumorMalignant', 'GlycogenRichCarcinoma', 'SecretoryJuvenileCarcinomaOfTheBreast', 'Neurofibromatosis', 'MucinousAdenocarcinomaColloidCarcinoma', 'IntracysticPapilloma', 'Myofibroblastoma', 'PapillaryCarcinomaInSitu', 'JuvenileFibroadenoma', 'EctopicAccessoryBreastTissue', 'Edema', 'Papilloma', 'Hamartoma', 'AsynchronousInvolutionOfBreast', 'FibrocysticDiseaseOfBreast', 'BenignNeoplasmOfNippleOfFemaleBreastNippleAdenoma', 'InvasiveLobularCarcinoma', 'OsteogenicSarcoma']} name_for_cid[3232] = 'STSegmentLocation' cid_concepts[3232] = \ {'SCT': ['LeftVentricleLateralSegment', 'LeftVentricleInferiorSegment', 'LeftVentricleApicalSegment', 'LeftVentricleSeptalSegment', 'LeftVentricleAnteriorSegment']} name_for_cid[7271] = 'MRDiffusionAnisotropyIndices' cid_concepts[7271] = \ {'DCM': ['VolumeRatio', 'RelativeAnisotropy', 'FractionalAnisotropy']} name_for_cid[10021] = 'SourceofCTDoseInformation' cid_concepts[10021] = \ {'DCM': ['CopiedFromImageAttributes', 'ManualEntry', 'DerivedFromHumanReadableReports', 'AutomatedDataCollection', 'ComputedFromImageAttributes']} name_for_cid[3727] = 'IndicationsforCatheterization' cid_concepts[3727] = \ {'SCT': ['Cardiomyopathy', 'HeartDisease', 'ValvularHeartDisease', 'CardiogenicShock', 'Arrhythmia', 'IschemicHeartDisease', 'HeartTransplant', 'CardiacFunctionTestAbnormal', 'HeartDiseaseCongenital']} name_for_cid[4261] = 'OphthalmicMappingAcquisitionMethod' cid_concepts[4261] = \ {'DCM': ['RetinalTopography', 'TimeDomain', 'SpectralDomain', 'NoCornealCompensation', 'CornealBirefringenceCompensation']} name_for_cid[9516] = 'RadiotherapyBolusDeviceTypes' cid_concepts[9516] = \ {'SCT': ['SurfaceBolus']} name_for_cid[7158] = 'ArtifactSegmentationTypes' cid_concepts[7158] = \ {'SCT': ['Table', 'ForeignBody', 'Clothing']} name_for_cid[12270] = 'CardiacUltrasoundAorticValve' 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', '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[6067] = 'FluidColor' cid_concepts[6067] = \ {'DCM': ['LightBrownColor', 'DarkRedColor', 'DarkBrownColor', 'BrightRedColor', 'BloodTingedColor'], 'SCT': ['BlackColor', 'Clear', 'BrownColor', 'YellowColor', 'GrayColor', 'WhiteColor', 'GreenColor']} name_for_cid[6088] = 'OBGYNMaternalRiskFactors' 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[3770] = 'ProblemStatus' cid_concepts[3770] = \ {'SCT': ['Suspected', 'ActiveProblem', 'InactiveProblem', 'KnownAbsent', 'Recurrent', 'WellControlled', 'Chronic', 'Intermittent', 'ProblemResolved']} name_for_cid[6122] = 'ChestContentDescriptor' cid_concepts[6122] = \ {'DCM': ['Air', 'SoftTissue', 'Calcium'], 'SCT': ['ForeignMaterialIodizedOilMercuryTalc', 'Fat']} 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[606] = 'AnimalShelterTypes' cid_concepts[606] = \ {'DCM': ['Igloo', 'RedTranslucentIgloo'], 'SCT': ['None']} name_for_cid[12227] = 'EchocardiographyMeasurementMethod' cid_concepts[12227] = \ {'DCM': ['Teichholz', 'MethodOfDisksSinglePlane', 'MethodOfDisksBiplane', 'CubeMethod', 'BulletMethod', 'AreaLengthSinglePlane', 'ModifiedSimpson', 'AreaLengthBiplane', 'SinglePlaneEllipse', 'LeftVentricleMassByTruncatedEllipse', 'LeftVentricleMassByMMode', 'Planimetry', 'DopplerVolumeFlow', 'SimplifiedBernoulli', 'DirectlyMeasured', 'FullBernoulli', 'ProximalIsovelocitySurfaceArea', 'ContinuityEquationByVelocityTimeIntegral', 'LeftVentricleMassByTruncatedEllipseAdjustedByHeight', 'LeftVentricleMassByMModeAdjustedByHeight', 'LeftVentricleMassByAreaLength', 'ContinuityEquationByPeakVelocity', 'ContinuityEquationByMeanVelocity', 'ContinuityEquation', 'BiplaneEllipse', 'AreaByPressureHalfTime', 'LeftVentricleMassByAreaLengthAdjustedByHeight']} name_for_cid[12033] = 'UltrasoundTransducerGeometry' cid_concepts[12033] = \ {'DCM': ['RingUltrasoundTransducerGeometry', 'RadialUltrasoundTransducerGeometry', 'SectorUltrasoundTransducerGeometry', 'CurvedLinearUltrasoundTransducerGeometry', 'LinearUltrasoundTransducerGeometry', 'NonImagingDopplerUltrasoundTransducerGeometry']} name_for_cid[7462] = 'UnitsofVolumeMeasurement' cid_concepts[7462] = \ {'UCUM': ['CubicMillimeter', 'CubicCentimeter', 'CubicMicrometer', 'CubicDecimeter']} name_for_cid[7198] = 'SubstanceSegmentationPropertyTypes' cid_concepts[7198] = \ {'SCT': ['ContrastAgent']} name_for_cid[3421] = 'ProcedureAction' cid_concepts[3421] = \ {'DCM': ['SuspendProcedureAction', 'ResumeProcedureAction', 'StartProcedureAction', 'EndProcedureAction']} name_for_cid[9539] = 'FractionationBasedEffectiveDoseMethodModifers' cid_concepts[9539] = \ {'DCM': ['LinearQuadraticModelForLowDoseRateBrachytherapy', 'LinearQuadraticLinearModel', 'LinearQuadraticModelWithTimeFactor', 'LinearQuadraticModel', 'Equivalent2GrayFractionsModel']} name_for_cid[3837] = 'FiducialFeature' cid_concepts[3837] = \ {'SCT': ['CommonIliacBifurcation', 'RenalArtery', 'Ostium', 'AorticBifurcation']} name_for_cid[12121] = 'VascularIndicesandRatios' cid_concepts[12121] = \ {'LN': ['AccelerationIndex', 'ResistivityIndex', 'VelocityRatio', 'SystolicToDiastolicVelocityRatio', 'PulsatilityIndex'], 'SCT': ['LumenDiameterStenosis', 'LumenAreaStenosis']} name_for_cid[6048] = 'CADOperatingPointAxisLabel' cid_concepts[6048] = \ {'DCM': ['ImageSpecificity', 'CaseSpecificity', 'ProbabilityOfCancer', 'CertaintyOfFinding', 'LesionSensitivity', 'CaseSensitivity', 'FalseMarkersPerCase', 'FalseMarkersPerImage']} name_for_cid[8113] = 'SpecimenPreparationSteps' cid_concepts[8113] = \ {'SCT': ['SpecimenClearing', 'SpecimenSteamHeating', 'SpecimenFreezing', 'SpecimenMicrowaveHeating', 'ProteaseDigestionOfTissueSpecimen', 'SpecimenDehydration']} name_for_cid[629] = 'CarrierGasesforSmallAnimalAnesthesia' cid_concepts[629] = \ {'SCT': ['MedicalAir', 'OxygenGas'], 'UMLS': ['RoomAir']} name_for_cid[12208] = 'EchocardiographyTricuspidValve' 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', 'SystolicToDiastolicVelocityRatio', 'EFSlope', 'PeakReversalVelocityDuringAtrialContraction', 'TimeAveragedMeanVelocity'], 'SCT': ['RegurgitantFraction', 'TricuspidValveClosureToOpeningTime', 'CardiovascularOrificeArea', 'CardiovascularOrificeDiameter']} name_for_cid[83] = 'UnitsforRealWorldValueMapping' cid_concepts[83] = \ {'UCUM': ['MicromoleMinuteMilliliter', 'Centimeter2Milliliter', 'Centimeter2', 'MilliliterGram', 'StandardizedUptakeValueBodySurfaceArea', 'StandardizedUptakeValueLeanBodyMassJanma', 'ProportionalToCounts', 'Counts', 'Percent', 'MilliliterMinuteGram', 'StandardizedUptakeValueBodyWeight', 'MicromoleMilliliter', 'HounsfieldUnit', 'ProportionalToCountsPerSecond', 'MilligramsMinuteMilliliter', 'StandardizedUptakeValueIdealBodyWeight', 'Centimeter', 'BecquerelsMilliliter', 'CountsPerSecond', 'StandardizedUptakeValueLeanBodyMassJames', 'StandardizedUptakeValueLeanBodyMassJames128Multiplier']} name_for_cid[3749] = 'PCIProcedureResult' cid_concepts[3749] = \ {} name_for_cid[3460] = 'CircumferentialExtent' cid_concepts[3460] = \ {'DCM': ['RCARegionInRAOProjection', 'LADRegionInRAOProjection']} name_for_cid[3525] = 'BloodGasContent' cid_concepts[3525] = \ {'DCM': ['BloodOxygenContent'], 'LN': ['ArterialOxygenContent', 'PulmonaryArteryMainOxygenContent', 'PulmonaryWedgeOxygenContent', 'ArterialBloodCarbonDioxideContent', 'BloodCarbonDioxideContent', 'VenousBloodCarbonDioxideContent', 'AorticRootOxygenContent', 'VenousOxygenContent']} name_for_cid[280] = 'LongitudinalTemporalEventTypes' cid_concepts[280] = \ {'DCM': ['Baseline'], 'NCIt': ['Enrollment']} name_for_cid[404] = 'AuditParticipantObjectIDTypeCode' cid_concepts[404] = \ {'DCM': ['StudyInstanceUID', 'NodeID', 'SOPClassUID']} name_for_cid[6009] = 'DensityModifierfromBIRADS®' cid_concepts[6009] = \ {'SCT': ['LowDensityNotContainingFatLesion', 'HighDensityLesion', 'EqualDensityIsodenseLesion', 'FatContainingRadiolucentLesion']} name_for_cid[7024] = 'RTProcessInput' cid_concepts[7024] = \ {'DCM': ['ForRTPlanSummation', 'ForPhysicistReview', 'ForPhysicianReview', 'ForPlanQualityAssurance', 'ForPatientSetupVerification', 'ForMachineQualityAssurance', 'ForRTWorkflow', 'ForRTTreatmentPlanning', 'ForRTPrescription']} name_for_cid[7474] = 'GeneralVolumeCalculationMethods' cid_concepts[7474] = \ {'DCM': ['IntegrationOfSumOfClosedAreasOnContiguousSlices', 'SumOfSegmentedVoxelVolumes']} name_for_cid[7161] = 'PhysiologySegmentationTypes' cid_concepts[7161] = \ {'SCT': ['Perfusion']} name_for_cid[12249] = 'CardiacUltrasoundFetalSummaryCodes' 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[3821] = 'PapillaryMuscleIncluded/Excluded' cid_concepts[3821] = \ {'DCM': ['PapillaryMuscleIncluded', 'PapillaryMuscleExcluded']} name_for_cid[3122] = 'VentricularEnlargement' cid_concepts[3122] = \ {'SCT': ['MarkedlyEnlargedCardiacChamber', 'MildlyEnlargedCardiacChamber', 'ModeratelyEnlargedCardiacChamber', 'NormalSizeCardiacChamber']} name_for_cid[3335] = 'ECGAnnotations' cid_concepts[3335] = \ {'MDC': ['CalibrationPulse', 'AtriumAntitachycardiaPaceSpike', 'AberratedAtrialPrematureBeatAshmanBeat', 'PreExcitation', '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', 'WolfParkinsonTypeB', 'AtriumAntibradycardiaPaceSpike', 'VentricleAntitachycardiaPaceSpike', 'PRSegment', 'EntireQRSExcludingPTAndU', 'TransthoracicAntibradycardiaPaceSpike', 'VentricularFlutterWave', 'OsborneWave', 'Notch', 'QWave', 'BifascicularBlockBeat', 'SWaveThirdDeflectionInSWave', 'DominantBeat', 'PWaveSecondDeflectionInPWave', 'RWaveSecondDeflectionInRWave', 'IncompleteLeftBundleBranchBlockBeat', 'RightVentricleAntibradycardiaPaceSpike', 'AtriumDefibrillationSpike', 'ROnTPrematureVentricularBeat', 'PacemakerFusionBeat', 'LownGanongLevineSyndrome', 'TransthoracicDefibrillationSpike', 'AtrialEscapeBeat', 'NonConductedPWave', 'AntitachycardiaPaceSpike', 'JunctionalNodalPrematureContraction', 'WolfParkinsonWhiteSyndrome', 'IntraventricularConductionDisturbance', 'IsoelectricPointOrSegment', 'LeftAnteriorFascicularBlockBeat', 'EntireBeatQonToToffExcludingPAndU', 'DeltaWave', 'STChange', 'NormalBeatSinusBeatNormalConduction', 'RightAtriumAntibradycardiaPaceSpike', 'SWaveSecondDeflectionInSWave', 'VentricleCardioversionSpike', 'PWave', 'RWave', 'WolfParkinsonTypeA', 'VentricularPrematureContractionBeat', 'STMeasurementPoint', 'AntibradycardiaPaceSpike', 'SupraventricularPrematureContraction', 'CardioversionSpike', 'TrifascicularBlockBeat', 'RightBundleBranchBlockBeat', 'STSegment', 'TUFusedWave', 'IsoelectricRegionFromSpecificLeadQRSOffsetToGlobalOffset', 'SevereNoiseBeatsCannotBeDetectedOrClassified', 'TWave', 'VentricularActivationTime', 'TransthoracicAntitachycardiaPaceSpike', 'JunctionalNodalEscapeBeat', 'UnclassifiableBeat', 'RWaveThirdDeflectionInRWave', 'SupraventricularEscapeBeat', 'PWaveThirdDeflectionInPWave']} name_for_cid[6137] = 'TypesofCADAnalysis' cid_concepts[6137] = \ {'SCT': ['SpatialCollocationAnalysis', 'SpatialProximityAnalysis', 'TemporalCorrelation', 'ImageQualityAnalysis']} name_for_cid[10063] = 'RadiationDoseEstimateDistributionRepresentation' cid_concepts[10063] = \ {'DCM': ['SkinDoseMap', 'DosePointCloud', 'DoseGradient', '_3DDoseMap', 'DoseImage', 'Isodose']} name_for_cid[6072] = 'BreastImplantFindings' cid_concepts[6072] = \ {'DCM': ['DistortedImplant', 'SiliconeLadenLymphNodes', 'FreeSilicone', 'HerniatedImplant', 'Explantation', 'NormalImplants', 'AsymmetricImplants', 'CalcifiedImplant'], 'SCT': ['RuptureOfBreastImplant']} name_for_cid[3620] = 'HemodynamicRatios' cid_concepts[3620] = \ {'DCM': ['DiastolicSystolicVelocityRatio', 'HyperemicRatio', 'CoronaryFlowReserve', 'HemodynamicResistanceIndex'], 'LN': ['TibialBrachialIndex'], 'SCT': ['FractionalFlowReserve', 'FractionalFlowReserveUsingIntracoronaryBolus', 'PulmonarySystemicFlowRatio', 'PulsatilityIndex', 'FractionalFlowReserveUsingIntravenousInfusion']} name_for_cid[12232] = 'MyocardiumMassMethods' cid_concepts[12232] = \ {'DCM': ['LeftVentricleMassByTruncatedEllipseAdjustedByHeight', 'LeftVentricleMassByMModeAdjustedByHeight', 'LeftVentricleMassByAreaLength', 'LeftVentricleMassByTruncatedEllipse', 'LeftVentricleMassByMMode', 'LeftVentricleMassByAreaLengthAdjustedByHeight']} name_for_cid[613] = 'AnesthesiaInductionCodeTypeforSmallAnimalAnesthesia' cid_concepts[613] = \ {'SCT': ['IntramuscularRoute', 'PerRectum', 'IntravenousRoute', 'IntraperitonealRoute', 'ByInhalation']} name_for_cid[10034] = 'ReasonforRepeatingAcquisition' cid_concepts[10034] = \ {'DCM': ['SuboptimalContrastTiming', 'PatientMotion']} name_for_cid[12009] = 'EarlyGestationBiometryMeasurements' cid_concepts[12009] = \ {'LN': ['GestationalSacDiameter', 'CrownRumpLength', 'SpineLength', 'YolkSacLength', 'NuchalTranslucency']} name_for_cid[6160] = 'BreastPrimaryTumorAssessmentFromAJCC' cid_concepts[6160] = \ {'SCT': ['TXPrimaryTumorCannotBeAssessed', 'T1bTumorMoreThan0Point5cmButNotMoreThan1cm', 'T4InflammatoryCarcinoma', 'T1Tumor2cmOrLessInGreatestDimension', 'T0NoEvidenceOfPrimaryTumor', 'TisCarcinomaInSitu', 'TisDuctalCarcinomaInSitu', 'T2TumorMoreThan2cmButNotMoreThan5cm', 'T1cTumorMoreThan1cmButNotMoreThan2cm', 'TisPagetDiseaseOfTheNippleWithNoTumor', 'T1aTumorMoreThan0Point1cmButNotMoreThan0Point5cm', 'T4aTumorOfAnySizeWithExtensionToChestWallNotIncl', 'T4bTumorOfAnySizeWithEdemaIncludingPeauDOrange', 'T1micMicroinvasion0Point1cmOrLessInGreatestDimension', 'T4TumorOfAnySizeWithDirectExtensionToChestWall', 'T4cTumorOfAnySizeWithDirectExtensionToChestWall', 'TisLobularCarcinomaInSitu', 'T3TumorMoreThan5cmInGreatestDimension']} name_for_cid[3677] = 'SummaryCodesECG' cid_concepts[3677] = \ {'DCM': ['NonDiagnosticECG'], 'SCT': ['BorderlineNormalECG', 'ECGEquivocal', 'NormalECG', 'AbnormalECG']} name_for_cid[3227] = 'QTcMeasurements' cid_concepts[3227] = \ {'MDC': ['QtcPerLeadUsingFredericiaFormula', 'QtcIntervalPerLead', 'QtcIntervalGlobal', 'QtcGlobalUsingFredericiaFormula', 'QtcGlobalUsingBazettFormula', 'QtcPerLeadUsingBazettFormula']} name_for_cid[4018] = 'PrimaryAnatomicStructureforIntraoralRadiography(PermanentDentitionDesignationofTeeth)' cid_concepts[4018] = \ {'SCT': ['MaxillaryLeftFirstPremolarTooth', 'MaxillaryRightCentralIncisorTooth', 'MandibularLeftSecondPremolarTooth', 'MandibularRightCanineTooth', 'MaxillaryLeftThirdMolarTooth', 'MandibularLeftCanineTooth', 'MaxillaryLeftSecondPremolarTooth', 'MandibularRightLateralIncisorTooth', 'MaxillaryRightSecondPremolarTooth', 'MandibularRightFirstMolarTooth', 'MaxillaryRightCanineTooth', 'MaxillaryLeftSecondMolarTooth', 'MandibularRightSecondPremolarTooth', 'MaxillaryRightLateralIncisorTooth', 'MandibularLeftSecondMolarTooth', 'MaxillaryLeftCanineTooth', 'MandibularLeftFirstPremolarTooth', 'MandibularLeftFirstMolarTooth', 'MandibularRightFirstPremolarTooth', 'MaxillaryRightFirstMolarTooth', 'MandibularLeftLateralTooth', 'MandibularLeftCentralIncisorTooth', 'MaxillaryRightThirdMolarTooth', 'MaxillaryLeftCentralIncisorTooth', 'MandibularLeftThirdMolarTooth', 'MaxillaryRightFirstPremolarTooth', 'MaxillaryLeftLateralIncisorTooth', 'MaxillaryRightSecondMolarTooth', 'MandibularRightSecondMolarTooth', 'MaxillaryLeftFirstMolarTooth', 'MandibularRightCentralIncisorTooth', 'MandibularRightThirdMolarTooth']} name_for_cid[6025] = 'DepthfromBIRADS®' cid_concepts[6025] = \ {'NCIt': ['Middle'], 'SCT': ['Posterior', 'Anterior']} name_for_cid[9503] = 'RadiotherapyTherapeuticRoleCategories' cid_concepts[9503] = \ {'DCM': ['RTDoseCalculationStructure', 'RTTarget']} name_for_cid[701] = 'ContentAssessmentTypes' cid_concepts[701] = \ {'DCM': ['RTPreTreatmentConsistencyCheck', 'RTPreTreatmentDoseCheck']} name_for_cid[12265] = 'CardiacUltrasoundAtriaandAtrialSeptumMeasurements' 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', '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[644] = 'ExogenousSubstanceAdministrationSites' cid_concepts[644] = \ {'NCIt': ['MouseMammaryFatPad'], 'SCT': ['Liver', 'BoneMarrow', 'Tumor', 'Brain', 'Flank']} name_for_cid[7008] = 'MediaImport' cid_concepts[7008] = \ {'DCM': ['InstancesImported', 'StudiesImported', 'MODImported', 'DVDImported', 'CDImported', 'PaperDigitized', 'VideoTapeDigitized', 'CineFilmDigitized', 'SheetFilmDigitized']} name_for_cid[3724] = 'SmokingHistory' cid_concepts[3724] = \ {'SCT': ['CurrentSmoker', 'NoHistoryOfSmoking', 'FormerSmoker']} name_for_cid[10022] = 'LabelTypes' cid_concepts[10022] = \ {'DCM': ['SeriesNumber', 'AcquisitionNumber', 'InstanceNumber']} 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[7272] = 'MRDiffusionModelParameters' cid_concepts[7272] = \ {'DCM': ['ApparentDiffusionCoefficient', 'KurtosisDiffusionCoefficient', 'GammaDistributionScaleParameter', 'GammaDistributionShapeParameter', 'GammaDistributionMode', 'DistributedDiffusionCoefficient', 'AnomalousExponentParameter', 'DiffusionCoefficient', 'MonoExponentialApparentDiffusionCoefficient', 'SlowDiffusionCoefficient', 'FastDiffusionCoefficient', 'FastDiffusionCoefficientFraction']} name_for_cid[6033] = 'MalignantPathologyCodesfromBIRADS®' 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': ['Leiomyosarcoma', 'SquamousCellCarcinoma', 'Carcinosarcoma', 'TubularAdenocarcinoma', 'ApocrineAdenocarcinoma', 'PapillaryCarcinoma', 'InflammatoryCarcinoma', 'HodgkinDisease', 'LipidRichLipidSecretingCarcinoma', 'CarcinomaInSituOfMaleBreast', 'InvasiveCribriformCarcinoma', 'AdenoidCysticCarcinoma', 'Plasmacytoma', 'Angiosarcoma', 'MedullaryCarcinoma', 'MalignantFibrousHistiocytoma', 'Fibrosarcoma', 'SignetRingCellCarcinoma', 'Lymphoma', 'NeoplasmOfTheMammarySkin', 'PhyllodesTumorMalignant', 'GlycogenRichCarcinoma', 'CarcinomaWithMetaplasia', 'Chondrosarcoma', 'SecretoryJuvenileCarcinomaOfTheBreast', 'IntraductalCarcinomaMicroPapillary', 'Hemangiopericytoma', 'MucinousAdenocarcinomaColloidCarcinoma', 'NonHodgkinLymphoma', 'PagetDiseaseMammary', 'InfiltratingDuctCarcinoma', 'PapillaryCarcinomaInSitu', 'SpindleCellNodule', 'Liposarcoma', 'Comedocarcinoma', 'InvasiveLobularCarcinoma', 'OsteogenicSarcoma']} name_for_cid[3231] = 'STSegmentFindings' cid_concepts[3231] = \ {'DCM': ['StronglyPositive', 'StronglyPositiveSTElevation', 'NonDiagnosticRestingSTAbnormalities', 'NonDiagnosticVentricularPacingOrLBBB', 'NonDiagnosticLowHeartRate'], 'SCT': ['WeaklyPositive', 'STIntervalNormal', 'Positive']} name_for_cid[12273] = 'CardiacUltrasoundAorticSinotubularJunction' 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', 'SystolicToDiastolicVelocityRatio', 'EFSlope', 'PeakReversalVelocityDuringAtrialContraction', 'TimeAveragedMeanVelocity'], 'SCT': ['MajorAxis', 'RegurgitantFraction', 'Radius', 'MinorAxis', 'Diameter', 'CardiovascularOrificeArea', 'CardiovascularOrificeDiameter', 'Length', 'Circumference']} name_for_cid[9515] = 'RTPatientSupportDevices' cid_concepts[9515] = \ {'SCT': ['Chair', 'Table']} name_for_cid[3118] = 'LevelofRisk' cid_concepts[3118] = \ {'SCT': ['ModerateToHighRisk', 'HighRisk', 'LowToModerateRisk', 'ModerateRisk', 'NormalRisk', 'LowRisk', 'UncertainRisk']} name_for_cid[9000] = 'PhysicalQuantityDescriptors' cid_concepts[9000] = \ {'DCM': ['SourceImageDiffusionBValue', 'ModelFittingMethod', 'Derivation', 'Finding', 'EquivalentMeaningOfConceptName'], 'NCIt': ['ReferenceRegion'], 'SCT': ['Quantity', 'FindingSite', 'MeasurementMethod']} name_for_cid[4262] = 'RetinalThicknessDefinition' cid_concepts[4262] = \ {'DCM': ['RetinalNerveFiberLayerThickness', 'GanglionCellComplexThickness', 'TotalRetinalThicknessILMToISOS', 'TotalRetinalThicknessILMToRPE', 'TotalRetinalThicknessILMToBM']} name_for_cid[3773] = 'UseStatus' cid_concepts[3773] = \ {'SCT': ['Suspended', 'Ended', 'InProgress']} name_for_cid[6121] = 'ChestOrientationDescriptor' cid_concepts[6121] = \ {'SCT': ['Horizontal', 'Vertical', 'Oblique']} name_for_cid[6064] = 'UltrasoundFindingsforBreast' cid_concepts[6064] = \ {'DCM': ['ComplexCyst', 'ComplicatedCyst', 'IntracysticLesion', 'SolidMass', 'ClusteredMicrocysts'], 'SCT': ['SebaceousCystOfSkinOfBreast', 'ForeignBody', 'LymphNode', 'CystOfBreast', 'MammaryDuctEctasia', 'UltrasoundScanNormal']} name_for_cid[12224] = 'UltrasoundImageModes' cid_concepts[12224] = \ {'SCT': ['DopplerPulsed', 'MMode', 'TissueDopplerImaging', '_2DMode', '_3DMode', 'DopplerContinuousWave', 'PowerDoppler', 'DopplerColorFlow']} name_for_cid[605] = 'AnimalBeddingMaterial' cid_concepts[605] = \ {'DCM': ['AspenShavingBedding', 'CornCobBedding', 'PaperBasedBedding', 'PineChipBedding', 'PineShavingBedding', 'AspenChipBedding']} name_for_cid[4235] = 'KeratometryDescriptors' cid_concepts[4235] = \ {'DCM': ['ManualKeratometry', 'AutoKeratometry', 'SimulatedKeratometry', 'EquivalentKReading']} name_for_cid[6208] = 'ColonTypesofQualityControlStandard' cid_concepts[6208] = \ {'DCM': ['InstitutionallyDefinedQualityControlStandard', 'ACRPositionStatement', 'ACRGuidelinePerformanceOfAdultCTColonography', 'ACRStandardCTMedicalPhysicsPerformanceMonitoring']} name_for_cid[4242] = 'CorneaMeasurementMethodDescriptors' cid_concepts[4242] = \ {'DCM': ['PosteriorCorneaSurfaceMeasurementMethod', 'ManualKeratometry', 'AutoKeratometry', 'SimulatedKeratometry', 'EquivalentKReading', 'TotalCorneaPowerMeasurementMethod']} name_for_cid[222] = 'NormalityCodes' cid_concepts[222] = \ {'SCT': ['AbnormallyHigh', 'Abnormal', 'AbnormallyLow', 'Normal', 'NormalityUndetermined']} name_for_cid[7194] = 'MorphologicallyAbnormalStructureSegmentationPropertyTypes' cid_concepts[7194] = \ {'DCM': ['Background'], 'NCIt': ['EnhancingLesion', 'NonEnhancingLesion'], 'SCT': ['Embolus', 'Mass', 'Normal', 'Cyst', 'Abscess', 'Edema', 'NeoplasmPrimary', 'BloodClot', 'Nodule', 'Neoplasm', 'NeoplasmSecondary', 'Necrosis', 'Hemorrhage', 'Inflammation']} 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[12253] = 'CardiacUltrasoundAreaMeasurements' cid_concepts[12253] = \ {'LN': ['JetArea', 'FlowArea'], 'SCT': ['Area']} name_for_cid[9535] = 'RadiotherapyDoseCalculationRoles' cid_concepts[9535] = \ {'DCM': ['AvoidanceVolume', 'PlanningOrganAtRiskVolume', 'RadiationInteractionVolume', 'RadiationDoseShapingVolume', 'OrganAtRisk', 'DoseCalculationBoundingVolume', 'ConformalityShell']} name_for_cid[6013] = 'CalcificationDistributionModifierfromBIRADS®' cid_concepts[6013] = \ {'DCM': ['CalcificationsWithinAMass', 'CalcificationsOutsideOfAMass'], 'SCT': ['SegmentalCalcificationDistribution', 'LinearCalcificationDistribution', 'RegionalCalcificationDistribution', 'DiffuseCalcificationDistribution', 'GroupedCalcificationDistribution']} name_for_cid[3211] = 'BPResponse' cid_concepts[3211] = \ {'SCT': ['Normal', 'Blunted', 'Hypertensive', 'Hypotensive']} name_for_cid[3641] = 'HemodynamicAssessments' cid_concepts[3641] = \ {'SCT': ['PulmonaryVascularResistance', 'LeftVentricularSystolicPressure', 'RightAtrialPressure', 'LeftVentricularEndDiastolicPressure', 'RightVentricularEndDiastolicPressure', 'PulmonaryCapillaryWedgePressure', 'RightVentricularSystolicPressure', 'DiastolicPressure', 'PulmonaryArteryPressure', 'VascularResistance']} name_for_cid[3704] = 'MyocardiumWallMorphologyFindings' cid_concepts[3704] = \ {'DCM': ['ScarredMyocardium', 'ThinningMyocardium', 'NormalMyocardium'], 'SCT': ['VentricularAneurysm']} name_for_cid[21] = 'PatientEquipmentRelationship' cid_concepts[21] = \ {'DCM': ['LeftFirst', 'RightFirst', 'PosteriorFirst', 'AnteriorFirst'], 'SCT': ['Headfirst', 'FeetFirst', 'Transverse', 'Oblique']} name_for_cid[10002] = 'IrradiationEventTypes' cid_concepts[10002] = \ {'DCM': ['StationaryAcquisition', 'SteppingAcquisition', 'RotationalAcquisition'], 'SCT': ['Fluoroscopy']} name_for_cid[625] = 'InjectableAnesthesiaAgentsforSmallAnimalAnesthesia' 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[4215] = 'OphthalmicVerticalDirections' cid_concepts[4215] = \ {'SCT': ['Up', 'Down']} name_for_cid[3495] = 'IVUSPlaqueComposition' cid_concepts[3495] = \ {'DCM': ['NecroticLipidicPlaque', 'FibroLipidicPlaque'], 'SCT': ['VascularCalcification', 'Thrombus', 'FibrousPlaque']} name_for_cid[12204] = 'EchocardiographyRightVentricle' 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', 'SystolicToDiastolicVelocityRatio', 'EFSlope', 'PeakReversalVelocityDuringAtrialContraction', 'TimeAveragedMeanVelocity'], 'SCT': ['RVStrokeIndex', 'RVCardiacOutput', 'RightVentricularIndexOfMyocardialPerformance', 'RegurgitantFraction', 'RVStrokeVolume', 'CardiovascularOrificeArea', 'CardiovascularOrificeDiameter', 'RVCardiacIndex', 'RightVentricularPeakSystolicPressure']} name_for_cid[3616] = 'HemodynamicPeriodMeasurements' cid_concepts[3616] = \ {'SCT': ['PulmonarySystolicEjectionPeriodSepp', 'AorticSystolicEjectionPeriodSepa', 'DerivedPeriodNonValve', 'TricuspidDiastolicFillingPeriodDfpt', 'MitralDiastolicFillingPeriodDfpm']} name_for_cid[6044] = 'TypesofImageQualityAssessment' cid_concepts[6044] = \ {'DCM': ['UnusableQualityRendersImageUnusable', 'UsableDoesNotMeetTheQualityControlStandard', 'UsableMeetsTheQualityControlStandard']} name_for_cid[7205] = 'PurposeofReferencetoAlternateRepresentation' cid_concepts[7205] = \ {'DCM': ['FullFidelityImage', 'AlternatePhotometricInterpretationImage', 'LossyCompressedImage', 'AlternateSOPClassInstance', 'SourceImage']} name_for_cid[7710] = 'TractographyAnatomicSites' cid_concepts[7710] = \ {'DCM': ['Phantom', 'PerilesionalWhiteMatter', 'SuperiorLongitudinalFasciculusIII', 'SuperiorLongitudinalFasciculusII', 'SuperiorLongitudinalFasciculusI'], 'NEU': ['SuperiorLongitudinalFasciculus', 'SuperiorThalamicRadiation', 'InferiorThalamicRadiation', 'PosteriorThalamicRadiation', 'StriaTerminalis', 'InferiorOpticRadiationMeyerLoop', 'CorticospinalTract', 'CorticobulbarTract', 'ArcuateFasciculus', 'SuperiorOpticRadiationBaumLoop', 'AnteriorThalamicRadiation'], 'SCT': ['SpinalCordWhiteMatter', 'ForcepsMinor', 'LateralFuniculus', 'SuperiorFrontoOccipitalFasciculus', 'InferiorLongitudinalFasciculus', 'SkeletalMuscle', 'MiddleCerebellarPeduncle', '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[76] = 'TypeofPreMedication' cid_concepts[76] = \ {'DCM': ['ContrastReactionProphylacticAgent', 'PreMedication'], 'SCT': ['Sedative', 'Antiemetic']} name_for_cid[6101] = 'ChestFindingorFeature' cid_concepts[6101] = \ {'DCM': ['AbnormalLucency', 'AbnormalCalcifications', 'AbnormalTexture', 'AbnormalOpacity', 'ImageQuality', 'NonLesion', 'RadiographicAnatomy', 'SelectedRegion', 'AbnormalLines1D']} 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[4203] = 'OphthalmicPhotographyIllumination' cid_concepts[4203] = \ {'DCM': ['ScotopicLight', 'MesopicLight', 'PhotopicLight', 'DynamicLight', 'DiffuseDirectIllumination'], 'SCT': ['BroadTangentialDirectIllumination', 'DualDiffuseDirectIllumination', 'IndirectRetroilluminationFromTheIris', 'IndirectRetroilluminationFromTheRetina', 'FineSlitBeamDirectIllumination', 'IndirectScleroticScatterIllumination', 'IndirectIrisTransillumination']} name_for_cid[633] = 'PhaseofImagingProcedureRequiringAnesthesia' cid_concepts[633] = \ {'SCT': ['AfterProcedure', 'BeforeProcedure', 'DuringProcedure']} name_for_cid[12212] = 'EchocardiographyAorta' cid_concepts[12212] = \ {'LN': ['AorticRootDiameter', 'HeartRate', 'AscendingAorticDiameter', 'AorticArchDiameter', 'AorticIsthmusDiameter', 'ThoracicAortaCoarctationSystolicPeakVelocity', 'DescendingAorticDiameter', 'ThoracicAortaCoarctationSystolicPeakInstantaneousGradient']} name_for_cid[3529] = 'Arterial/VenousContent' cid_concepts[3529] = \ {'DCM': ['PulmonaryArterialContentFcpa', 'PulmonaryVenousContentFcpv'], 'LN': ['ArterialContentFca', 'VenousContentFcv']} name_for_cid[3483] = 'IVUSLongitudinalMeasurements' cid_concepts[3483] = \ {'DCM': ['StentGap', 'CalciumLength'], 'SCT': ['StentLength', 'StenoticLesionLength']} name_for_cid[6052] = 'BreastImagingReportSectionTitle' cid_concepts[6052] = \ {'DCM': ['Findings', 'ProcedureReported', 'Addendum', 'PhysicalExaminationResults', 'ReasonForProcedure', 'ComparisonToPreviousExams', 'Conclusions', 'OverallAssessment', 'Recommendations'], 'LN': ['Impressions'], 'SCT': ['BreastComposition']} 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[6402] = 'NonlesionObjectTypeSubstances' cid_concepts[6402] = \ {'SCT': ['ContrastAgent']} name_for_cid[3600] = 'RelativeTimes' cid_concepts[3600] = \ {'SCT': ['During', 'After', 'Before']} 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', 'BrachialPlexus', 'MidCircumflexCoronaryArtery', 'InferiorVenaCava', '_1stLeftPosterolateralCoronaryArtery', 'IntermediateArteryRamus', 'CircumflexCoronaryArtery', 'SuperiorPhrenicArtery', 'DistalLeftAnteriorDescendingCoronaryArtery', 'RightCoronaryArteryOstium', 'AxillaryArtery', 'DescendingAorta', 'DistalRightCoronaryArtery', 'MarginalCoronaryArtery', 'IntercostalArtery', 'InternalThoracicArtery', 'LeftAnteriorDescendingCoronaryArtery', 'VertebralArtery', 'ProximalLeftAnteriorDescendingCoronaryArtery', 'CommonCarotidArtery', '_3rdDiagonalCoronaryArtery', 'InternalJugularVein', '_3rdMarginalCoronaryArtery', 'BronchialArtery', 'MidRightCoronaryArtery', 'EsophagealArtery', 'AVGrooveContinuationOfCircumflexArtery', 'PulmonaryVein', 'SubclavianArtery', 'LeftPosterolateralCircumflexCoronaryArtery', '_3rdRightPosterolateralCoronaryArtery', 'ThyrocervicalTrunk', 'InferiorPhrenicArtery', 'BrachiocephalicVein', '_3rdLeftPosterolateralCoronaryArtery', 'ProximalCircumflexCoronaryArtery', '_2ndMarginalCoronaryArtery', 'AorticArch', 'DorsalScapularArtery', 'SuperiorVenaCava', 'LeftMainCoronaryArtery', '_2ndLeftPosterolateralCoronaryArtery', 'BrachiocephalicTrunk', '_2ndRightPosterolateralCoronaryArtery', 'PosteriorDescendingRightCoronaryArtery', 'LeftPosteriorDescendingCircumflexCoronaryArtery', '_1stMarginalCoronaryArtery', 'PulmonaryTrunk', '_1stSeptalCoronaryArtery', 'RightCoronaryArtery', 'AscendingAorta', 'AzygosVein', '_1stDiagonalCoronaryArtery', 'PericardiophrenicArtery', 'PulmonaryArtery', 'BrachialArtery', '_2ndDiagonalCoronaryArtery', 'CostocervicalTrunk', 'DistalCircumflexCoronaryArtery', 'MidLeftAnteriorDescendingCoronaryArtery', 'LeftMainCoronaryArteryOstium', 'AxillaryVein', 'CoronaryArteryGraft', '_1stRightPosterolateralCoronaryArtery']} name_for_cid[3745] = 'CalculationMethod' cid_concepts[3745] = \ {'SCT': ['Estimated', 'Calculated']} name_for_cid[8109] = 'SpecimenCollectionProcedure' cid_concepts[8109] = \ {'SCT': ['Scraping', 'Venipuncture', 'TakingOfSwab', 'SpecimenCollection', 'Excision', 'Aspiration', 'RemovalOfDevice', 'HarvestingOfTissue', 'Biopsy']} name_for_cid[60] = 'ImagingAgentAdministrationAdverseEvents' cid_concepts[60] = \ {'DCM': ['ExtravasationVisibleInImage', 'PatientConditionPreventedContinuing'], 'SCT': ['PallorPaleComplexion', 'InjectionSiteNerveDamage', 'InjectionSiteFibrosis', 'InjectionSiteExtravasation', 'Cough', 'ChillsAndFever', 'InjectionSiteHypersensitivity', 'InjectionSitePigmentationChange', 'InjectionSiteScar', 'InjectionSiteIrritation', 'Sweating', 'InjectionSiteAnesthesia', 'FacialSwelling', 'InjectionSiteInduration', 'InjectionSiteUrticaria', 'Bronchospasm', 'InjectionSiteMalabsorption', 'InjectionSiteSterileAbscess', 'Headache', 'SensationOfBeingWarm', 'TachycardiaBradycardia', 'InjectionSiteNecrosis', 'Anxiety', 'InjectionSiteDermatitis', 'InjectionSiteDisorder', 'Shaking', 'InjectionSiteBruising', 'DrugInducedFlushing', 'CardiacArrhythmia', 'LaryngealEdema', 'InjectionSiteThrombosis', 'InjectionSiteAbscess', 'DrugInducedDizziness', 'InjectionSiteReaction', 'CardiorespiratoryArrest', 'InjectionSiteCyst', 'Hypertension', 'InjectionSiteEdema', 'Dyspnea', 'InjectionSiteAtrophy', 'DrugInducedHypotension', 'InjectionSiteBurning', 'InjectionSiteHemorrhage', 'InjectionSiteUlcer', 'EpilepticConvulsions', 'Itching', 'DrugRash', 'InjectionSiteInflammation', 'InjectionSiteInfection', 'Hypotension', 'DiffuseInflammatoryErythema', 'TasteAndSenseAltered', 'InjectionSiteParesthesia', 'NasalCongestion', 'NoMotorResponseToCommand', 'InjectionSitePain', 'DrugInducedNauseaAndVomiting', 'InjectionSiteMass', 'InjectionSiteGranuloma']} name_for_cid[10043] = 'IntravenousExtravasationSymptoms' cid_concepts[10043] = \ {'DCM': ['ExtravasationVisibleInImage'], 'SCT': ['InjectionSiteBruising', 'InjectionSiteThrombosis', 'InjectionSiteAbscess', 'InjectionSiteNerveDamage', 'InjectionSiteFibrosis', 'InjectionSiteHypersensitivity', 'InjectionSitePigmentationChange', 'InjectionSiteScar', 'InjectionSiteIrritation', 'InjectionSiteReaction', 'InjectionSiteAnesthesia', 'InjectionSiteCyst', 'InjectionSiteInduration', 'InjectionSiteEdema', 'InjectionSiteUrticaria', 'InjectionSiteAtrophy', 'InjectionSiteBurning', 'InjectionSiteHemorrhage', 'InjectionSiteUlcer', 'InjectionSiteMalabsorption', 'InjectionSiteSterileAbscess', 'InjectionSiteInflammation', 'InjectionSiteInfection', 'InjectionSiteNecrosis', 'InjectionSiteParesthesia', 'InjectionSiteDermatitis', 'InjectionSiteDisorder', 'InjectionSitePain', 'InjectionSiteMass', 'InjectionSiteGranuloma']} name_for_cid[7706] = 'CranialNerves' cid_concepts[7706] = \ {'SCT': ['AbducensNerve', 'AccessoryNerve', 'TrochlearNerve', 'FacialNerve', 'GlossopharyngealNerve', 'TrigeminalNerve', 'VestibulocochlearNerve', 'VagusNerve', 'HypoglossalNerve', 'OculomotorNerve', 'OlfactoryTract', 'OpticNerve']} name_for_cid[12300] = 'CoreEchoMeasurements' cid_concepts[12300] = \ {'LN': ['TricuspidValveDiastolicVTI', 'MitralValvePeakInstantaneousGradient', 'LeftAtrialEndSystolicVolumeBiplaneAreaLength', 'LeftVentricularInternalSystolicDimensionBSA', 'LeftVentricularPreEjectionPeriod', 'LVBasalAnteriorTimeToSVmaxTsBasalAnterior', 'MitralRegurgitationPISARadius', 'PulmonicValveVmax', 'PulmonaryVeinSWaveVmax', 'LeftAtrialEndSystolicDiameterAPMMBSA', 'RightVentricularMidCavityDimension4C', 'LeftVentricularEndSystolicVolumeBiplaneMOD', 'MitralRegurgitationVmax', 'LeftVentricularEjectionFractionSinglePlane4CMOD', 'InterventricularSeptumSystolicDimensionMM', 'LeftVentricularMassDimensionMethodMMHeight2Point7', 'LVMidSeptalTimeToSVmaxTsMidSeptal', 'AorticSinotubularJunctionDimension', 'LeftVentricularInternalDiastolicDimensionBSA', 'TricuspidRegurgitationPISARadius', 'InferiorVenaCavaDiameter', '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', 'LeftVentricularPosteriorWallSystolicThickness', 'LeftAtrialEndSystolicVolumeBiplaneMOD', 'LeftVentricularEjectionFractionTeichholzMM', 'TricuspidValveAPrimeVmax', 'AorticRegurgitationPISARadius', 'LeftVentricularMassDimensionMethod2D', 'AorticValveAreaContinuityVmaxBSA', 'MitralSeptalEPrimeVmax', 'PulmonicRegurgitationEndDiastolicPeakGradient', 'MitralValveAreaPlanimetry', 'MitralRegurgitationPISAVelocity', 'PulmonicRegurgitationVmax', 'LVMidLateralTimeToSVmaxTsMidLateral', 'LeftVentricularMassDimensionMethodMM', 'RightVentricularFreeWallThickness2D', 'LeftVentricularEndDiastolicVolume3D', 'InterventricularSeptumTimeToPeakDisplacement', 'LeftVentricularFractionalShorteningOfMinorAxis2D', 'LeftVentricularInternalDiastolicDimension2D', 'TricuspidValveAWaveVmax', 'InterventricularSeptumDiastolicDimension2D', 'AorticValveMeanBloodVelocity', 'MitralValveEffectiveRegurgitantOrificeAreaPISA', 'LeftVentricularInternalDiastolicDimensionBSA', 'LeftVentricularPosteriorWallSystolicThickness', 'LeftAtrialEndSystolicVolumeBiplaneMODBSA', 'MitralRegurgitantFractionPISA', 'RightPulmonaryArteryDiameter', 'AorticRegurgitationPISAVelocity', 'LeftVentricularMassAreaLengthHeight2Point7', 'AorticValveAreaContinuityVTI', 'PulmonicValveEjectionTime', 'PulmonicValvePeakGradient', 'LVMidInferiorTimeToSVmaxTsMidInferior', 'RightVentricularEndSystolicArea4C', 'LeftVentricularEpicardialAreaSAXPMLevel', 'MitralValveAreaPISA', 'LeftAtrialEndSystolicArea2C', 'LeftVentricularMassDimensionMethod2DHeight2Point7', 'LeftVentricularEndDiastolicVolumeBiplaneMOD', 'LeftVentricularOutflowTractVmax', 'MitralValvePressureHalfTime', 'AorticRegurgitationVolumeContinuityVTI', 'MitralValveEToARatio', 'TricuspidValveEPrimeVmax', 'AorticRegurgitationPressureHalfTime', 'LeftAtrialEndSystolicVolumeSinglePlane2CMOD', 'PulmonicAnnulusDiameter', 'MitralValveEWaveVmax', 'LeftVentricularPosteriorWallDiastolicThickness', 'RightAtrialMinorAxisDimension4CBSA', 'MitralRegurgitantFractionContinuityVTI', 'AorticValveMeanGradient', 'LeftVentricularMassAreaLengthBSA', 'AorticValveAreaContinuityVTIBSA', 'LeftVentricularEjectionFractionTeichholz2D', 'RightVentricularFractionalAreaChange', 'LeftVentricularMassDimensionMethod2DBSA', 'LVMidAnteroseptalTimeToSVmaxTsMidAnteroseptal', 'RightVentricularEndDiastolicArea4C', 'RightVentricularOutflowTractVTI', 'MitralValveAWaveVmax', 'LeftAtrialEndSystolicArea4C', 'LeftVentricularEndocardialAreaSAXPMLevel', 'LeftVentricularEndDiastolicVolumeBiplaneMODBSA', 'LeftVentricularOutflowTractDimension2D', 'MitralValveVmax', 'AorticRegurgitationVolumePISA', 'AorticRegurgitationVenaContractaWidth', 'TricuspidValveEWaveVmax', 'LeftAtrialEndSystolicVolumeSinglePlane4CMOD', 'RightAtrialMinorAxisDimension4C', 'MitralLateralEPrimeVmax', 'LeftVentricularPosteriorWallDiastolicThickness', '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', 'LeftPulmonaryArteryDiameter', 'LVBasalInferiorTimeToSVmaxTsBasalInferior', 'AorticValveVmax', 'AorticRegurgitantFlow', 'PulmonaryVeinAWaveVmax', 'AorticRootDiameter', 'RightVentricularOutflowTractDiameterAtPulmonicValveRVOTDistal', 'LeftAtrialEndSystolicDiameterAP2DBSA', 'LeftVentricularEndDiastolicVolumeSinglePlane4CMOD', 'TricuspidValveMeanGradient', 'MainPulmonaryArteryDiameter', 'LeftVentricularEjectionFractionBiplaneMOD', 'LVBasalSeptalTimeToSVmaxTsBasalSeptal', 'LeftVentricularEndSystolicVolumeSinglePlane2CMOD', 'MitralRegurgitationVolumePISA', 'LeftVentricularMassTruncatedEllipseBSA', 'TricuspidValveClosureToOpeningTime', 'TricuspidValveVmax', 'AorticRegurgitantFraction', 'LeftVentricularIsovolumicRelaxationTimeByDoppler', 'MitralAnnulusDiastolicDiameterPLAX', 'RightVentricularPreEjectionPeriod', 'RightAtrialEndSystolicArea4C', 'LVBasalAnteroseptalTimeToSVmaxTSBasalAnteroseptal', 'LeftAtrialEndSystolicLength4C', 'LeftVentricularInternalSystolicDimensionBSA', 'LeftVenticularPosteriorWallTimeToPeakDisplacement', 'AorticValveVTI', 'TricuspidAnnularPlaneSystolicExcursionTAPSE', 'PulmonaryVeinDWaveVmax', 'TricuspidValvePeakGradient', 'MitralRegurgitationVolumeContinuityVTI', 'LeftAtrialEndSystolicDiameterAPMM', 'RightVentricularMyocardialPerformanceIndex', 'LVBasalPosteriorTimeToSVmaxTsBasalPosterior', 'LeftVentricularEjectionFractionSinglePlane2CMOD', 'LeftVentricularMass', 'LVTsSDDyssynchronyIndex', 'AorticRootDiameterBSA', 'LeftVentricularEndSystolicVolumeBiplaneMODBSA', 'TricuspidValveDecelerationTime', 'AscendingAortaDimension', 'AorticRegurgitantJetAreaLVOTAreaPercent', 'MitralAnnulusDiastolicDiameterA4C', 'PulmonicValveAccelerationTime']} name_for_cid[7478] = 'IntensityHistogramFeatures' cid_concepts[7478] = \ {} name_for_cid[7182] = 'AbstractMultidimensionalImageModelDimensionSemantics' cid_concepts[7182] = \ {'DCM': ['LinearDisplacement', 'Angle', 'Time', 'PhotonEnergy']} name_for_cid[4254] = 'VisualFieldStaticPerimetryTestAnalysisResults' cid_concepts[4254] = \ {'DCM': ['OutsideNormalLimits', 'Borderline', 'AbnormallyHighSensitivity', 'GeneralReductionInSensitivity', 'BorderlineAndGeneralReductionInSensitivity'], 'SCT': ['WithinNormalLimits']} name_for_cid[9523] = 'RoboticRadiotherapyProcedureTechniques' cid_concepts[9523] = \ {'DCM': ['SynchronizedRoboticTreatment', 'NonSynchronizedRoboticTreatment']} name_for_cid[12245] = 'CardiacUltrasoundReportTitles' cid_concepts[12245] = \ {'DCM': ['PediatricCardiacUltrasoundReport', 'AdultCongenitalCardiacUltrasoundReport', 'FetalCardiacUltrasoundReport']} name_for_cid[3207] = 'StressTestProcedurePhases' cid_concepts[3207] = \ {'SCT': ['CardiacStressState', 'Hyperventilation', 'PeakCardiacStressState', 'CardiacStressRecoveryState', 'RestingState']} name_for_cid[6005] = 'CharacteristicsofShapefromBIRADS®' cid_concepts[6005] = \ {'SCT': ['Lobular', 'RoundShape', 'Irregular', 'OvoidShapeOval']} name_for_cid[7301] = 'InterventionTypes' cid_concepts[7301] = \ {'SCT': ['HipJointReconstruction', 'ResurfacingOfTheFemoralHead', 'InsertionOfHipProsthesis', 'ResurfacingOfThePatella']} name_for_cid[10014] = 'ContrastImagingTechnique' cid_concepts[10014] = \ {'SCT': ['DiagnosticRadiographyWithContrastMedia', 'CTWithoutContrast']} name_for_cid[3712] = 'VesselDescriptors' cid_concepts[3712] = \ {'SCT': ['DiffuseDisease', 'Calcified', 'Stented', 'Restenotic', 'Tortuous', 'Stenotic', 'Culprit', 'Bifurcation', 'LuminalIrregularities', 'Aneurysmal', 'Thrombus', 'MuscleBridge', 'Ulcerated', 'Ectatic']} name_for_cid[6140] = 'CalculationMethods' cid_concepts[6140] = \ {'DCM': ['UnspecifiedMethodOfCalculation', 'AgatstonScoringMethod', 'VolumeScoringMethod', 'TwoDimensionalMethod', 'MassScoringMethod', 'ThreeDimensionalMethod'], 'SCT': ['Estimated']} name_for_cid[6212] = 'CalculatedValueforColonFindings' cid_concepts[6212] = \ {'DCM': ['PolypStalkWidth', 'DistanceFromAnus'], 'SCT': ['PolypSizeLargestDimension', 'PolypStalkLength']} name_for_cid[3010] = 'CardiovascularAnatomicLocations' 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', 'CongenitalPulmonaryArteriovenousFistula', 'DescendingAorta', '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', 'CongenitalCoronaryArteryFistulaToRightVentricle', 'PosteriorMedialTributary', 'CommonFemoralArtery', 'PulmonaryArteryConduit', 'RightAtrium', 'AnteriorCommunicatingArtery', 'CongenitalCoronaryArteryFistulaToLeftAtrium', 'RightVentricle', 'ThoracicAorta', 'CommonVentricle', '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[3440] = 'PeripheralPulseLocations' cid_concepts[3440] = \ {'SCT': ['FemoralArtery', 'BrachialArtery', 'UlnarArtery', 'CarotidArtery', 'DorsalisPedisArtery', 'PoplitealArtery', 'PosteriorTibialArtery', 'RadialArtery']} name_for_cid[8125] = 'MicroscopyIlluminatorType' cid_concepts[8125] = \ {'SCT': ['TungstenHalogenLamp', 'LightEmittingDiode', 'Laser', 'MercuryArcLamp', 'XenonArcLamp']} name_for_cid[3769] = 'ConcernTypes' cid_concepts[3769] = \ {'SCT': ['Problem', 'Complaint', 'FindingReportedByPatientInformant', 'Disease', 'FunctionalPerformanceAndActivity', 'Finding']} name_for_cid[6091] = 'RelativeFrequencyofEventValues' cid_concepts[6091] = \ {'SCT': ['Continuous', 'SingleEvent', 'AsRequired', 'Frequent', 'MidFrequency', 'Infrequent']} name_for_cid[4106] = 'QuantitativeMethodsusedforPerfusionAndTracerKineticModels' 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[3339] = 'ElectrophysiologyAnnotations' cid_concepts[3339] = \ {'DCM': ['StimulationAtRate4Interval', 'AblationOff', 'StimulationAtRate3Interval', 'StimulationAtRate2Interval', 'AblationOn', 'StartOfAtrialContraction', 'SWave', 'StimulationAtRate1Interval', 'StartOfAtrialContraction', 'PWave', 'VWave', 'HISBundleWave', 'TWave', 'RWave', 'QWave', 'VWaveOfNextBeat']} name_for_cid[12117] = 'VesselBranchModifiers' cid_concepts[12117] = \ {'NCIt': ['Middle'], 'SCT': ['Main', 'Right', 'Lateral', 'Inferior', 'Left', 'Superior', 'CollateralBranchOfVessel', 'Medial']} name_for_cid[12269] = 'CardiacUltrasoundInterventricularSeptumMeasurements' 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', 'SystolicToDiastolicVelocityRatio', 'EFSlope', 'PeakReversalVelocityDuringAtrialContraction', 'TimeAveragedMeanVelocity'], 'SCT': ['MajorAxis', 'Area', 'RegurgitantFraction', 'Radius', 'MinorAxis', 'Diameter', 'CardiovascularOrificeArea', 'CardiovascularOrificeDiameter', 'Length', 'Circumference']} name_for_cid[3552] = 'PacingActions' cid_concepts[3552] = \ {'DCM': ['EndPacing', 'BeginPacing']} name_for_cid[6300] = 'ProstateSectorAnatomy' cid_concepts[6300] = \ {'SCT': ['LeftBasalPeripheralZoneOfProstate', 'MaleExternalUrethralSphincter', 'RightApicalAnteriorFibromuscularStromaOfProstate', 'LeftPosteromedialApicalPeripheralZoneOfProstate', 'LeftPosterolateralMiddlePeripheralZoneOfProstate', 'RightBasalTransitionZoneOfProstate', 'LeftAnteriorApicalTransitionZoneOfProstate', 'LeftMiddleTransitionZoneOfProstate', 'LeftAnteriorBasalTransitionZoneOfProstate', 'RightPosterolateralBasalPeripheralZoneOfProstate', 'LeftApicalPeripheralZoneOfProstate', 'LeftPosteriorMiddleTransitionZoneOfProstate', 'LeftBasalAnteriorFibromuscularStromaOfProstate', 'LeftPosterolateralApicalPeripheralZoneOfProstate', 'RightSeminalVesicle', 'RightPosteromedialMiddlePeripheralZoneOfProstate', 'LeftApicalAnteriorFibromuscularStromaOfProstate', 'RightBasalPeripheralZoneOfProstate', 'RightPosteromedialApicalPeripheralZoneOfProstate', 'BasalAnteriorFibromuscularStromaOfProstate', 'LeftBasalPartTransitionZoneOfProstate', 'RightApicalPeripheralZoneOfProstate', 'LeftPosterolateralBasalPeripheralZoneOfProstate', 'RightPosterolateralApicalPeripheralZoneOfProstate', 'RightPosteriorBasalTransitionZoneOfProstate', 'RightAnteriorApicalTransitionZoneOfProstate', 'LeftAnteriorMiddlePeripheralZoneOfProstate', 'RightAnteriorMiddleTransitionZoneOfProstate', 'RightLateralMiddlePeripheralZoneOfProstate', 'CentralZoneOfLeftHalfProstate', 'LeftLateralMiddlePeripheralZoneOfProstate', 'LeftPosteromedialMiddlePeripheralZoneOfProstate', 'RightApicalTransitionZoneOfProstate', 'RightBasalAnteriorFibromuscularStromaOfProstate', 'MiddleAnteriorFibromuscularStromaOfProstate', 'RightAnteriorBasalTransitionZoneOfProstate', 'LeftPosteriorApicalTransitionZoneOfProstate', 'LeftAnteriorMiddleTransitionZoneOfProstate', 'LeftPosteriorBasalTransitionZoneOfProstate', 'RightAnteriorBasalPeripheralZoneOfProstate', 'LeftMiddleAnteriorFibromuscularStromaOfProstate', 'LeftAnteriorApicalPeripheralZoneOfProstate', 'CentralZoneOfRightHalfProstate', 'RightAnteriorMiddlePeripheralZoneOfProstate', 'RightPosterolateralMiddlePeripheralZoneOfProstate', 'LeftApicalTransitionZoneOfProstate', 'ApicalAnteriorFibromuscularStromaOfProstate', 'LeftSeminalVesicle', 'RightAnteriorApicalPeripheralZoneOfProstate', 'LeftAnteriorBasalPeripheralZoneOfProstate', 'RightMiddleAnteriorFibromuscularStromaOfProstate', 'RightPosteriorMiddleTransitionZoneOfProstate', 'RightPosteriorApicalTransitionZoneOfProstate', 'RightMiddleTransitionZoneOfProstate']} name_for_cid[3102] = 'RestStress' cid_concepts[3102] = \ {'DCM': ['CardiacStressState'], 'SCT': ['RestingState']} name_for_cid[12286] = 'CardiacUltrasoundInterventricularSeptumFindingSites' cid_concepts[12286] = \ {'SCT': ['BulboventricularForamen', 'VentricularSeptalDefect', 'InterventricularSeptum']} name_for_cid[218] = 'QuantitativeImageFeatures' 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', 'VolumeRatio', 'VolumeOfSphere', 'DiffusionCoefficient', 'VolumeOfCircumscribedSphere', 'VolumeOfEllipsoid', 'VolumeEstimatedFromThreeOrMoreNonCoplanar2DRegions', 'VolumeEstimatedFromTwoNonCoplanar2DRegions', 'VolumeEstimatedFromSingle2DRegion', 'PathLength', 'VolumeOfBoundingThreeDimensionalRegion', 'R2Coefficient', 'ChiSquare', 'DW', 'AIC', 'BIC', 'Distance', 'Height', 'RelativeLinearStoppingPower', '', 'Vp', 'EquivalentDose', 'AbsorbedDose', 'IAUC90BN', 'IAUC180BN', 'IAUC', 'IAUC60', 'IAUC90', 'IAUC180', 'IAUCBN', 'IAUC60BN', 'GlutamateAndGlutamine', 'CholineCreatineRatio', 'NAcetylaspartateCreatineRatio', 'NAcetylaspartateCholineRatio', 'Tmax', 'R2', 'VolumetricDiffusionDxzComponent', 'MagneticSusceptibility', 'VolumetricDiffusionDxyComponent', 'VolumetricDiffusionDxxComponent', 'RelativeRegionalBloodFlow', 'RelativeRegionalBloodVolume', 'BloodOxygenationLevel', 'T2WeightedDynamicContrastEnhancedMRSignalIntensity', 'T2WeightedDynamicContrastEnhancedMRSignalIntensity', 'AbsoluteRegionalBloodFlow', 'T1WeightedDynamicContrastEnhancedMRSignalIntensity', 'AbsoluteRegionalBloodVolume', 'VolumetricDiffusionDzzComponent', 'OxygenExtractionFraction', 'R1', 'VolumetricDiffusionDyzComponent', 'R2', 'VolumetricDiffusionDyyComponent', 'VelocityEncoded', 'ZScore', 'ContrastAgentAngioMRSignalIntensity', 'SpinTaggingPerfusionMRSignalIntensity', 'RelativeAnisotropy', 'FractionalAnisotropy', 'FieldMapMRSignalIntensity', 'T2WeightedMRSignalIntensity', 'T2WeightedMRSignalIntensity', 'T1WeightedMRSignalIntensity', 'ProtonDensityWeightedMRSignalIntensity', 'TimeOfFlightAngioMRSignalIntensity', 'T1', 'T2', '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'], 'SCT': ['Lipid', 'DiameterOfCircumscribedCircle', 'Depth', 'PowerDoppler', 'Perimeter', '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[7004] = 'WaveformPurposesofReference' cid_concepts[7004] = \ {'DCM': ['SimultaneousRespiratoryWaveform', 'SimultaneousArterialPulseWaveform', 'SimultaneousECG', 'SimultaneousVoiceNarrative', 'SimultaneousDoppler', 'SimultaneousHemodynamic', 'SimultaneousPhonocardiographicWaveform']} name_for_cid[7454] = 'AnimalTaxonomicRankValues' cid_concepts[7454] = \ {'ITIS_TSN': ['PeromyscusLeucopusAmericanWhiteFootedMouse', 'PeromyscusManiculatusDeerMouse', 'SigmodonGenus'], 'SCT': ['CanisLupus', 'RattusNorvegicus', 'FelisCatus', 'HomoSapiens', 'Canis', 'BosTaurus', 'OryctolagusCuniculusEuropeanRabbit', 'Capra', 'MustelaPutoriusFuro', 'EquusCaballus', 'SusScrofa', 'Equus', 'Ovis', 'Bovinae', 'Bos', 'CallithrixJacchus', 'CaviaPorcellus', 'Felis', 'Sus', 'CanisLupusFamiliaris', 'Rattus', 'MusGenus', 'OvisAries', 'MusMusculusHouseMouse', 'CapraHircus']} name_for_cid[12005] = 'FetalBiometryMeasurements' cid_concepts[12005] = \ {'LN': ['OccipitalFrontalDiameter', 'BPDAreaCorrected', 'TranverseAbdominalDiameter', 'APADTAD', 'CisternaMagna', 'AbdominalCircumference', 'FemurLength', 'ThoracicCircumference', 'HeadCircumference', 'FootLength', 'BiparietalDiameter', 'LeftKidneyThickness', 'TransverseThoracicDiameter', 'LeftKidneyLength', 'LeftKidneyWidth', 'AnteriorPosteriorAbdominalDiameter', 'ThoracicArea', 'RightKidneyThickness', 'AnteriorPosteriorTrunkDiameter', 'RightKidneyWidth', 'TransCerebellarDiameter', 'RightKidneyLength']} name_for_cid[12140] = 'PelvicVasculatureAnatomicalLocation' cid_concepts[12140] = \ {'SCT': ['UmbilicalVein', 'CommonIliacArtery', 'VitellineVeinOfPlacenta', 'OvarianArtery', 'OvarianVein', 'UterineVein', 'UmbilicalArtery', 'UterineArtery', 'VitellineArteryOfPlacenta']} 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[4014] = 'ViewforMammography' cid_concepts[4014] = \ {'SCT': ['SuperolateralToInferomedialOblique', 'TissueSpecimenFromBreast', 'MedioLateral', 'CranioCaudalExaggeratedLaterally', 'MedioLateralOblique', 'LateroMedial', 'LateroMedialOblique', 'CranioCaudal', 'InferomedialToSuperolateralOblique', 'CaudoCranial', 'CranioCaudalExaggeratedMedially']} name_for_cid[3114] = 'StudyQuality' cid_concepts[3114] = \ {'DCM': ['PoorImageQuality', 'ExcellentImageQuality', 'GoodImageQuality', 'UnusableQualityRendersImageUnusable']} name_for_cid[9519] = 'RadiotherapyAccessorySlotHolderDeviceTypes' cid_concepts[9519] = \ {'DCM': ['RadiotherapyApplicator']} name_for_cid[3817] = 'VascularSclerosisTypes' cid_concepts[3817] = \ {'SCT': ['VascularWallDegeneration', 'Arteriosclerosis', 'Phlebosclerosis', 'UlceratedAtheromatousPlaque', 'ComplicatedAtheromatousPlaque', 'AdventitialDegeneration', 'ElasticVascularSclerosis', 'Fibroelastosis', 'Arteriolosclerosis', 'AtheroscleroticFibrousPlaque', 'Atheroma', 'FocalFibroelastosis', 'CysticMedicalNecrosis', 'FattyStreaks', 'CalcifiedAtheromatousPlaque', 'ArteriosclerosisWithFibrinoidNecrosis', 'DiffuseFibroelastosis']} name_for_cid[7157] = 'DeviceSegmentationTypes' cid_concepts[7157] = \ {'DCM': ['BrachytherapyChannel', 'RectalBalloon', 'VaginalCylinder', 'Mold', 'BrachytherapyChannelShield', 'HeadAndNeckMask', 'BrachytherapySourceApplicator', 'HeadMask', 'Headframe', 'BodyFrame', 'BreastBoard', 'Cast', 'WholeBodyPod', 'VacuumMold'], 'SCT': ['Chair', 'RadioactiveImplant', 'Needle', 'InlayDentalRestoration', 'Table', 'DentalProsthesis', 'BonePin', 'Defibrillator', 'Headrest', 'CardiacPacemaker', 'BiteBlock', 'BoneScrew', 'LeftVentricularAssistDevice', 'Stent']} name_for_cid[7012] = 'BestinSet' cid_concepts[7012] = \ {'DCM': ['Study', 'Series', 'PerformedProcedureStep', 'StageView']} name_for_cid[12290] = 'CardiacUltrasoundPulmonaryArteriesFindingSites' cid_concepts[12290] = \ {'SCT': ['PulmonaryArtery', 'PulmonaryTrunk', 'AortaToPulmonaryArteryConnection']} name_for_cid[3401] = 'TypesofLogNotes' cid_concepts[3401] = \ {'DCM': ['PatientStatusOrEvent', 'ProcedureNote', 'NursingNote', 'PhysicianNote', 'TechNote']} name_for_cid[12013] = 'GestationalAgeEquationsandTables' 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[3728] = 'CathFindings' 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[1200] = 'ContraindicationsForCTImaging' cid_concepts[1200] = \ {'SCT': ['ContrastMediaAllergy', 'PatientCurrentlyPregnant', 'XRayContrastMediaAllergy', 'ImpairedRenalFunction']} name_for_cid[7100] = 'RCSRegistrationMethodType' cid_concepts[7100] = \ {'DCM': ['VisualAlignment', 'ImageContentBasedAlignment', 'AcquisitionEquipmentAlignment', 'FiducialAlignment', 'FrameOfReferenceIdentity']} name_for_cid[12228] = 'EchocardiographyVolumeMethods' cid_concepts[12228] = \ {'DCM': ['Teichholz', 'MethodOfDisksSinglePlane', 'MethodOfDisksBiplane', 'CubeMethod', 'BulletMethod', 'AreaLengthSinglePlane', 'ModifiedSimpson', 'AreaLengthBiplane', 'SinglePlaneEllipse', 'BiplaneEllipse']} name_for_cid[3840] = 'PulmonaryVeins' cid_concepts[3840] = \ {'SCT': ['PulmonaryVein', 'SuperiorLeftPulmonaryVein', 'InferiorLeftPulmonaryVein', 'RightPulmonaryVein', 'InferiorRightPulmonaryVein', 'LeftPulmonaryVein', 'SuperiorRightPulmonaryVein']} name_for_cid[3456] = 'SubsegmentMethods' cid_concepts[3456] = \ {'DCM': ['UserSelectedMethod', 'EquidistantMethod']} name_for_cid[6204] = 'AnatomicNoncolonFindings' 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[4239] = 'AnteriorChamberDepthDefinition' cid_concepts[4239] = \ {'DCM': ['FrontOfCorneaToFrontOfLens', 'BackOfCorneaToFrontOfLens']} name_for_cid[609] = 'AnimalFeedingMethods' cid_concepts[609] = \ {'DCM': ['FoodTreat'], 'NCIt': ['AdLibitum'], 'SCT': ['Gavage'], 'UMLS': ['RestrictedDiet']} name_for_cid[4110] = 'TracerKineticModelingCovariates' cid_concepts[4110] = \ {'LN': ['Hematocrit']} name_for_cid[6087] = 'GeneralRiskFactors' 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[8133] = 'TissueSelection' cid_concepts[8133] = \ {'DCM': ['NominalEmptyTileSuppression', 'HighThresholdEmptyTileSuppression', 'NoEmptyTileSuppression']} name_for_cid[12101] = 'VascularSummary' cid_concepts[12101] = \ {'DCM': ['Comment']} name_for_cid[6068] = 'TumorStagesFromAJCC' cid_concepts[6068] = \ {'DCM': ['Stage0', 'StageI', 'StageIIA', 'StageIIB', 'StageIIIA', 'StageIIIB', 'StageIIIC', 'StageIV']} name_for_cid[4111] = 'ContrastCharacteristics' cid_concepts[4111] = \ {'DCM': ['ContrastLongitudinalRelaxivity']} name_for_cid[6086] = 'MenopausalPhase' cid_concepts[6086] = \ {'SCT': ['AfterMenopause', 'BeforeMenopause', 'PostsurgicalMenopause', 'ArtificialMenopauseState', 'DuringMenopause']} name_for_cid[8132] = 'MagnificationSelection' cid_concepts[8132] = \ {'DCM': ['_10X', '_20X', '_40X', '_5X']} name_for_cid[6069] = 'NottinghamCombinedHistologicGrade' cid_concepts[6069] = \ {'SCT': ['NottinghamCombinedGradeI3To5Points', 'NottinghamCombinedGradeII6To7Points', 'NottinghamCombinedGradeIII8To9Points', 'NottinghamCombinedGradeCannotBeDetermined']} name_for_cid[7101] = 'BrainAtlasFiducials' cid_concepts[7101] = \ {'DCM': ['InterHemisphericPlane', 'LeftHemisphereMostInferior', 'LeftHemisphereMostSuperior', 'LeftHemisphereMostPosterior', 'LeftHemisphereMostAnterior', 'RightHemisphereMostInferior', 'RightHemisphereMostSuperior', 'RightHemisphereMostPosterior', 'RightHemisphereMostAnterior'], 'SCT': ['AnteriorCommissure', 'PosteriorCommissure']} name_for_cid[12229] = 'EchocardiographyAreaMethods' cid_concepts[12229] = \ {'DCM': ['ProximalIsovelocitySurfaceArea', 'ContinuityEquationByVelocityTimeIntegral', 'ContinuityEquationByPeakVelocity', 'ContinuityEquationByMeanVelocity', 'ContinuityEquation', 'AreaByPressureHalfTime', 'Planimetry']} name_for_cid[4238] = 'RefractiveErrorTypes' cid_concepts[4238] = \ {'SCT': ['Myopia', 'Hyperopia']} name_for_cid[6205] = 'ClockfaceLocationforColon' cid_concepts[6205] = \ {'SCT': ['_7OClockPosition', '_11OClockPosition', '_12OClockPosition', '_2OClockPosition', '_5OClockPosition', '_3OClockPosition', '_6OClockPosition', '_4OClockPosition', '_9OClockPosition', '_10OClockPosition', '_1OClockPosition', '_8OClockPosition']} name_for_cid[608] = 'AnimalFeedSources' cid_concepts[608] = \ {'DCM': ['LocallyManufacturedProduct'], 'UMLS': ['CommercialProduct']} name_for_cid[12012] = 'OBEquationsandTables' 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', 'HCACByGACampbell1977', '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', '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[3729] = 'AdmissionStatus' cid_concepts[3729] = \ {'SCT': ['Elective', 'EmergencyDepartment', 'Transfer']} name_for_cid[9518] = 'RadiotherapyAccessoryNoSlotHolderDeviceTypes' cid_concepts[9518] = \ {'DCM': ['AccessoryTray']} name_for_cid[3115] = 'StressImagingQualityIssues' cid_concepts[3115] = \ {'DCM': ['BreastAttenuation', 'DiaphragmaticAttenuation', 'BodyHabitusAttenuation', 'MotionBlur'], 'SCT': ['SubdiaphragmaticUptake']} name_for_cid[7156] = 'VascularSegmentationTypes' cid_concepts[7156] = \ {'SCT': ['CardiovascularSystem', 'VascularSclerosis', 'Intima', 'Thrombus', 'SystemicArtery', 'Adventitia', 'Media', 'SystemicVein', 'Lumen']} name_for_cid[7013] = 'NonImageSourceInstancePurposesofReference' cid_concepts[7013] = \ {'DCM': ['SourceMeasurement', 'SourceRawData', 'SourceReport', 'SourceRealWorldValueMap']} name_for_cid[12291] = 'CardiacUltrasoundAortaFindingSites' 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[3400] = 'ProcedureLogTitles' cid_concepts[3400] = \ {'DCM': ['CathLabProcedureLog']} name_for_cid[12004] = 'FetalBiometryRatios' cid_concepts[12004] = \ {'LN': ['HCAC', 'FLAC', 'CephalicIndex', 'FLBPD', 'FLHC']} name_for_cid[12141] = 'FetalVasculatureAnatomicalLocation' cid_concepts[12141] = \ {'SCT': ['DescendingAorta', 'MiddleCerebralArtery', 'PulmonaryArtery', 'PulmonaryVein', 'Aorta']} 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[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[7140] = 'BrainStructuresforVolumetricMeasurements' cid_concepts[7140] = \ {'DCM': ['WhiteMatterT2Hyperintensity', 'WhiteMatterT1Hypointensity', 'VentralDiencephalon'], 'SCT': ['Amygdala', 'CranialSubarachnoidSpace', 'FourthVentricle', 'ThirdVentricle', 'CerebralGrayMatter', 'GlobusPallidus', 'Thalamus', 'CerebralWhiteMatter', 'InferiorHornOfLateralVentricle', 'LateralVentricle', 'CaudateNucleus', 'NucleusAccumbens', 'CerebellarCortex', 'CerebellarSubarachnoidSpace', 'BrainStem', 'Putamen', 'Hippocampus', 'FifthVentricle', 'CerebellarWhiteMatter', 'CranialCavity', 'IntracranialStructure']} name_for_cid[12268] = 'CardiacUltrasoundAtrioventricularValvesMeasurements' 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', '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[3553] = 'CirculatorySupport' cid_concepts[3553] = \ {'SCT': ['ExternalCounterPulsation', 'LeftVentricularAssistDevice', 'CardiopulmonaryBypass', 'IntraAorticBalloonPump', 'ExtraCorporealCirculation']} 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[3416] = 'RespirationRhythms' cid_concepts[3416] = \ {'SCT': ['GaspingRespiration', 'RespirationIntermittent', 'AbnormalRespiratoryRhythm', 'NormalRespiratoryRhythm', 'IrregularBreathing']} name_for_cid[12287] = 'CardiacUltrasoundVentriclesFindingSites' cid_concepts[12287] = \ {'SCT': ['RightVentricle', 'LeftVentricle', 'CommonVentricle']} name_for_cid[7005] = 'ContributingEquipmentPurposesofReference' cid_concepts[7005] = \ {'DCM': ['PortableMediaImporterEquipment', 'FilmDigitizer', 'DeIdentifyingEquipment', 'ModifyingEquipment', 'EnhancedMultiFrameConversionEquipment', 'FrameExtractingEquipment', 'VideoTapeDigitizerEquipment', 'ProcessingEquipment', 'AcquisitionEquipment', 'DocumentDigitizerEquipment']} name_for_cid[7455] = 'Sex' cid_concepts[7455] = \ {'DCM': ['MalePseudohermaphrodite', 'UnknownSex', 'UndeterminedSex', 'Female', 'MaleChangedToFemale', 'AmbiguousSex', 'Hermaphrodite', 'OtherSex', 'FemalePseudohermaphrodite', 'Male', 'FemaleChangedToMale']} 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[6090] = 'RelativeUsage,ExposureAmount' cid_concepts[6090] = \ {'DCM': ['High', 'Medium', 'NoKnownExposure', 'Low']} name_for_cid[4107] = 'TracerKineticModelParameters' cid_concepts[4107] = \ {'DCM': ['', 'Vp', 'Ktrans', 'Kep', 'Ve']} name_for_cid[4042] = 'XA/XRFAnatomyImaged' cid_concepts[4042] = \ {'DCM': ['Phantom'], 'SCT': ['SubclavianVein', 'ExternalIliacArtery', 'BoneOfLowerLimb', 'TruncusCoeliacus', 'BasilarArtery', 'ParanasalSinus', 'ApexOfRightVentricle', 'WristJoint', 'GenicularArtery', 'LeftVentricleInflow', 'CarotidArtery', 'UmbilicalArtery', 'PrimitiveAorta', 'LeftVentricleOutflowTract', 'RadialArtery', 'RightFemoralArtery', 'JawRegion', 'LeftFemoralArtery', 'Calcaneus', 'Esophagus', 'AntecubitalVein', 'Mandible', 'PatentDuctusArteriosus', 'MesentericVein', 'PulmonaryVein', 'CoronaryArtery', 'UpperLimb', 'ExternalIliacVein', 'CongenitalPulmonaryArteriovenousFistula', 'DescendingAorta', 'SubclavianArtery', 'Maxilla', 'OphthalmicArtery', 'Hand', 'BrachialVein', 'Eye', 'Chest', 'Prostate', 'ElbowJoint', 'HepaticArtery', 'FacialBones', 'Sternum', 'PeronealArtery', 'NeckAndChest', 'RightVentricleOutflowTract', 'Duodenum', 'SuperiorLeftPulmonaryVein', 'BileDuct', 'SystemicCollateralArteryToLung', 'LumbarArtery', 'PancreaticDuctAndBileDuctSystems', 'ApexOfLeftVentricle', 'Larynx', 'FemoralArtery', 'PulmonaryArtery', 'Skull', 'ThoracoLumbarSpine', 'Urethra', 'Head', 'AcromioclavicularJoint', 'CongenitalCoronaryArteryFistulaToRightVentricle', 'PosteriorMedialTributary', 'SternoclavicularJoint', 'Breast', 'EsophagusStomachAndDuodenum', 'Neck', 'Finger', 'PulmonaryArteryConduit', 'RightAtrium', 'RightVentricle', 'CommonVentricle', 'Coccyx', 'Abdomen', 'HeadAndNeck', 'TemporomandibularJoint', 'HepaticVein', 'PelvisAndLowerExtremities', 'InternalMammaryArtery', 'Bladder', 'LargeIntestine', 'Forearm', 'Spine', 'Foot', 'NeckChestAndAbdomen', 'ExternalCarotidArtery', 'SuperiorMesentericArtery', 'MuscleOfUpperLimb', 'PosteriorTibialArtery', 'FemoralVein', 'RightAuricularAppendage', 'Zygoma', 'InnominateVein', 'SuperficialFemoralArtery', 'UterusAndFallopianTubes', 'LowerLimb', 'PosteriorCommunicationArtery', 'JuxtaposedAtrialAppendage', 'AorticArch', 'VertebralColumnAndCranium', 'Jejunum', 'ChestAbdomenAndPelvis', 'AbdominalAorta', 'Heart', 'TarsalJoint', 'CephalicVein', 'LingualArtery', 'GastricVein', 'CongenitalCoronaryArteryFistulaToRightAtrium', 'Fibula', 'OrbitalStructure', 'InferiorCardiacVein', 'Baffle', 'LacrimalArtery', 'OccipitalArtery', 'SystemicVenousAtrium', 'AnomalousPulmonaryVein', 'CervicoThoracicSpine', 'Femur', 'Rectum', 'AnteriorCardiacVein', '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', 'Pelvis', 'SesamoidBonesOfFoot', 'InternalIliacArtery', 'PulmonaryChamberOfCorTriatriatum', 'SuperiorVenaCava', 'UlnarArtery', 'LeftVentricle', 'AnteriorSpinalArtery', 'AbdomenAndPelvis', 'SplenicVein', 'Colon', 'SubmandibularGland', 'ThoracicSpine', 'SaphenousVein', 'Gallbladder', 'InnominateArtery', 'SplenicArtery', 'RenalArtery', 'UpperArm', 'Extremity', 'FacialArtery', 'AzygosVein', 'BrachialArtery', 'HipJoint', 'Rib', 'BoneOfUpperLimb', 'Clavicle', 'ParotidGland', 'CommonFemoralArtery', 'Stomach', 'AnteriorCommunicatingArtery', 'CongenitalCoronaryArteryFistulaToLeftAtrium', 'ThoracicAorta', 'CoronarySinus', 'AxillaryArtery', 'LeftPulmonaryArtery', 'ApexOfLung', 'Ileum', 'Knee', 'VertebralArtery', 'PulmonaryVeinConfluence', 'SaphenofemoralJunction', 'InternalJugularVein', 'EyeRegion', 'LacrimalArteryOfRightEye', 'LumboSacralSpine', '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', 'DoddPerforatingVein']} name_for_cid[12116] = 'VesselSegmentModifiers' cid_concepts[12116] = \ {'NCIt': ['Middle'], 'SCT': ['Distal', 'Proximal', 'DilatedPortionOfSegment', 'OriginOfVessel']} name_for_cid[3011] = 'ElectrophysiologyAnatomicLocations' 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[3441] = 'PatientAssessments' cid_concepts[3441] = \ {'LN': ['RespirationRhythm', 'CardiacRhythm'], 'SCT': ['RespirationAssessment', 'PatientMentalStateAssessment', 'SkinConditionAssessment']} name_for_cid[3206] = 'NoninvasiveCardiacImagingProcedures' cid_concepts[3206] = \ {'SCT': ['SPECT', 'PETHeartStudy', 'CardiacBloodPoolImaging', 'NuclearMedicineCardiovascularStudy', 'CardiacMRI', 'Echocardiography']} name_for_cid[6004] = 'MammographyCharacteristicsofShape' cid_concepts[6004] = \ {'SCT': ['Lobular', 'RoundShape', 'Irregular', 'OvoidShapeOval']} name_for_cid[7300] = 'ImplantMaterials' cid_concepts[7300] = \ {'SCT': ['Polymer', 'CarbonFiber', 'StainlessSteelMaterial', 'GoldAlloy', 'NickelTitanium']} name_for_cid[10015] = 'CTDoseReferenceAuthorities' cid_concepts[10015] = \ {'DCM': ['ICRPPub60', 'ICRPPub103']} name_for_cid[3713] = 'TIMIFlowCharacteristics' cid_concepts[3713] = \ {'SCT': ['_1PenetrationWithoutPerfusion', '_2PartialPerfusion', '_3CompletePerfusion', '_0NoPerfusion']} name_for_cid[6141] = 'AttenuationCoefficientMeasurements' cid_concepts[6141] = \ {'DCM': ['StandardDeviationOfAttenuationCoefficient', 'AttenuationCoefficient', 'MinimumAttenuationCoefficient', 'MaximumAttenuationCoefficient', 'MeanAttenuationCoefficient', 'MedianAttenuationCoefficient']} name_for_cid[12301] = 'MeasurementSelectionReasons' cid_concepts[12301] = \ {'DCM': ['MostRecentValueChosen', 'MeanValueChosen', 'UserChosenValue'], 'SCT': ['Minimum', 'Maximum']} name_for_cid[7479] = 'GreyLevelDistanceZoneBasedFeatures' cid_concepts[7479] = \ {} name_for_cid[7183] = 'AbstractMultidimensionalImageModelDimensionUnits' cid_concepts[7183] = \ {'UCUM': ['Millimeter', 'Radian', 'Degree', 'Centimeter', 'Micrometer', 'Millisecond', 'Second']} name_for_cid[4255] = 'VisualFieldIlluminationColor' cid_concepts[4255] = \ {'SCT': ['Yellow', 'Red', 'White', 'Blue', 'Green']} name_for_cid[9522] = 'MultiSourceRadiotherapyProcedureTechniques' cid_concepts[9522] = \ {'DCM': ['MultipleFixedSources']} name_for_cid[12244] = 'CongenitalFindingSites' cid_concepts[12244] = \ {'SCT': ['AtrialSeptalDefect', 'VentricularSeptalDefect']} name_for_cid[6053] = 'BreastImagingReportElements' cid_concepts[6053] = \ {'DCM': ['ProcedureReported', 'Conclusion', 'PhysicalExaminationResults', 'Recommendation', 'ReasonForProcedure', 'ComparisonToPreviousExams', 'OverallAssessment', 'Impression', 'Finding'], 'SCT': ['BreastComposition']} name_for_cid[6403] = 'NonlesionObjectTypeTissues' cid_concepts[6403] = \ {'SCT': ['ScarTissue']} 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[3744] = 'EFTestingMethod' cid_concepts[3744] = \ {'SCT': ['CardiacVentriculography', 'RadionuclideVentriculography', 'Echocardiography']} name_for_cid[61] = 'TimeRelativetoProcedure' cid_concepts[61] = \ {'SCT': ['AfterProcedure', 'BeforeProcedure', 'DuringProcedure']} name_for_cid[7707] = 'SpinalCordFibers' cid_concepts[7707] = \ {'SCT': ['LateralFuniculus', 'DorsalFuniculus', 'VentralFuniculus']} 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[4202] = 'OphthalmicPhotographyAcquisitionDevice' cid_concepts[4202] = \ {'SCT': ['FundusCamera', 'SlitLampBiomicroscope', 'DirectOphthalmoscope', 'OphthalmicEndoscope', 'ScanningLaserOphthalmoscope', 'Keratoscope', 'ExternalCamera', 'Pupillograph', 'IndirectOphthalmoscope', 'SpecularMicroscope', 'OperatingMicroscope']} name_for_cid[632] = 'PhaseofSurgicalProcedureRequiringAnesthesia' cid_concepts[632] = \ {'SCT': ['Intraoperative', 'Preoperative', 'Postoperative']} name_for_cid[3528] = 'BloodpH' cid_concepts[3528] = \ {'LN': ['BloodPh', 'VenousBloodPh', 'ArterialBloodPh']} name_for_cid[3482] = 'IVUSAreaMeasurements' cid_concepts[3482] = \ {'DCM': ['InStentNeointimalCrossSectionalArea', 'EEMCrossSectionalArea', 'PlaquePlusMediaCrossSectionalArea'], 'SCT': ['VesselLumenCrossSectionalArea', 'StentCrossSectionalArea']} name_for_cid[3617] = 'ValveFlows' cid_concepts[3617] = \ {'SCT': ['DerivedFlowNonValve', 'AorticValveFlow', 'MitralValveFlow', 'TricuspidValveFlow', 'PulmonaryValveFlow']} name_for_cid[6045] = 'MammographyTypesofQualityControlStandard' cid_concepts[6045] = \ {'DCM': ['InstitutionallyDefinedQualityControlStandard', 'MammographyQualityControlManual1999ACR', 'Title21CFRSection900SubpartB']} name_for_cid[3752] = 'GuidewireCrossing' cid_concepts[3752] = \ {'DCM': ['GuidewireCrossingLesionSuccessful', 'GuidewireCrossingLesionUnsuccessful']} name_for_cid[6100] = 'ChestComponentCategories' cid_concepts[6100] = \ {'DCM': ['Bronchovascular', 'Osseous'], 'SCT': ['Lung', 'Mediastinum', 'Heart', 'PleuralStructure', 'SystemicVascularStructure', 'Muscular']} name_for_cid[624] = 'InhalationalAnesthesiaAgentsforSmallAnimalAnesthesia' cid_concepts[624] = \ {'SCT': ['Chloroform', 'Isoflurane', 'Methoxyflurane', 'Enflurane', 'DiethylEther', 'CarbonDioxide', 'Desflurane', 'Halothane', 'Sevoflurane', 'NitrousOxide']} name_for_cid[4214] = 'OphthalmicHorizontalDirections' cid_concepts[4214] = \ {'SCT': ['Inward', 'Outward']} name_for_cid[3494] = 'IVUSNonMorphologicalFindings' cid_concepts[3494] = \ {'DCM': ['TrueLumen'], 'SCT': ['ArterialBloodStasis', 'AcquiredIncompleteStentApposition', 'IncompleteStentApposition']} name_for_cid[12205] = 'EchocardiographyLeftAtrium' cid_concepts[12205] = \ {'LN': ['LeftAtriumAreaA4CView', 'LeftAtriumToAorticRootRatio', 'HeartRate', 'LeftAtrialAppendagePeakVelocity', 'LeftAtriumAnteroPosteriorSystolicDimension'], 'SCT': ['LeftAtriumSystolicVolume']} name_for_cid[6012] = 'CalcificationDistributionModifier' cid_concepts[6012] = \ {'DCM': ['CalcificationsWithinAMass', 'CalcificationsOutsideOfAMass'], 'SCT': ['SegmentalCalcificationDistribution', 'LinearCalcificationDistribution', 'RegionalCalcificationDistribution', 'DiffuseCalcificationDistribution', 'GroupedCalcificationDistribution']} name_for_cid[3210] = 'SpeedofResponse' cid_concepts[3210] = \ {'SCT': ['Normal', 'Blunted', 'Accentuated']} name_for_cid[3640] = 'Hypertension' cid_concepts[3640] = \ {'SCT': ['PulmonaryHypertension', 'SystemicArterialHypertension']} name_for_cid[6157] = 'Vascularity' cid_concepts[6157] = \ {'DCM': ['VascularityNotPresent', 'VascularityNotAssessed', 'VascularityPresentInLesion', 'VascularityPresentImmediatelyAdjacentToLesion', 'DiffuselyIncreasedVascularityInSurroundingTissue']} name_for_cid[3705] = 'ChamberSize' cid_concepts[3705] = \ {'SCT': ['MarkedlyEnlargedCardiacChamber', 'MildlyEnlargedCardiacChamber', 'AbnormallySmallCardiacChamber', 'ModeratelyEnlargedCardiacChamber', 'NormalSizeCardiacChamber']} 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[10003] = 'EquipmentPlaneIdentification' cid_concepts[10003] = \ {'DCM': ['AllPlanes', 'PlaneA', 'PlaneB', 'SinglePlane']} name_for_cid[4243] = 'OphthalmicQualityMetricType' cid_concepts[4243] = \ {'DCM': ['StandardDeviationOfMeasurementsUsed', 'SignalToNoiseRatio']} name_for_cid[223] = 'NormalRangeValues' cid_concepts[223] = \ {'SCT': ['NormalRangeLowerLimit', 'NormalRangeUpperLimit']} name_for_cid[7195] = 'FunctionSegmentationPropertyTypes' cid_concepts[7195] = \ {'SCT': ['Perfusion']} 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', 'Minnesota4PigBreed', '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[12252] = 'CardiacUltrasoundCardiacFunction' cid_concepts[12252] = \ {'LN': ['HRCorrectedMeanVelocityOfCircumferentialFiberShortening', 'MeanVelocityOfCircumferentialFiberShorteningMeanVcfv', 'FractionalShortening', 'PercentThickening'], 'SCT': ['CardiacEjectionFraction']} name_for_cid[9534] = 'RadiotherapyTargets' cid_concepts[9534] = \ {'DCM': ['CTVPrimary', 'PTVPrimary', 'PTVNodal', 'RadiationDoseReferencePoint', 'GTVPrimary', 'RadiationDoseNormalizationPoint', 'GTVNodal', 'ITV', 'EntireBodyTargetVolume', 'CTVNodal', 'TreatedVolume'], 'SCT': ['IrradiatedVolume', 'GTV', 'PTV', 'CTV']} name_for_cid[604] = 'DeviceReuse' cid_concepts[604] = \ {'DCM': ['Unused', 'Reused']} name_for_cid[6209] = 'ColonMorphologyDescriptor' cid_concepts[6209] = \ {'SCT': ['Circumferential', 'Sessile', 'Flat', 'Ulcer', 'Pedunculated']} name_for_cid[4234] = 'RefractiveSurgeryTypes' cid_concepts[4234] = \ {'DCM': ['SMILE'], 'SCT': ['RK', 'LASIK', 'LASEK', 'PRK']} name_for_cid[3772] = 'HealthStatus' cid_concepts[3772] = \ {'SCT': ['LostToFollowUp', 'Disabled', 'Deceased', 'SymptomFree', 'ChronicallyIll', 'Alive', 'AliveAndWell', 'SeverelyDisabled', 'InRemission', 'SeverelyIll']} name_for_cid[6120] = 'ChestBorderDefinition' cid_concepts[6120] = \ {'DCM': ['SharplyDemarcated', 'PoorlyDemarcated', 'SharplyDefined', 'DistinctlyDefined', 'WellDemarcated'], 'SCT': ['PoorlyDefined', 'WellDefined', 'Circumscribed']} name_for_cid[6065] = 'InstrumentApproach' cid_concepts[6065] = \ {'DCM': ['InferolateralToSuperomedial', 'InferomedialToSuperolateral', 'SuperolateralToInferomedial', 'SuperomedialToInferolateral'], 'SCT': ['Lateral', 'Inferior', 'Superior', 'Medial']} name_for_cid[12272] = 'CardiacUltrasoundSemilunarValves,AnnulateandSinusesMeasurements' 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', '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[3119] = 'LVFunction' cid_concepts[3119] = \ {'SCT': ['Normal', 'ImpairedLeftVentricularFunction']} name_for_cid[9514] = 'AnatomicalStructuresforRadiotherapy' cid_concepts[9514] = \ {'BARI': ['_1stMarginalCoronaryArteryLaterals', '_2ndMarginalCoronaryArteryLaterals', '_3rdMarginalCoronaryArteryLaterals', '_1stDiagonalCoronaryArteryLaterals', '_2ndDiagonalCoronaryArteryLaterals', 'RamusLaterals', '_3rdDiagonalCoronaryArteryLaterals', 'PosteriorDescendingSeptalPerforators'], 'DCM': ['Phantom', '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': ['ArcuateFasciculus'], 'SCT': ['ProfundaFemorisVein', 'LeftHypochondriacRegion', 'SternocleidomastoidMuscle', 'TruncusCoeliacus', 'InferiorLongitudinalFasciculus', 'BasilarArtery', 'ParanasalSinus', 'BrainCerebrospinalFluidPathway', 'WristJoint', 'MidCircumflexCoronaryArtery', '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', 'PalatineBone', 'CoronaryArtery', 'RightBranchOfHepaticArtery', 'UpperLimb', 'DuraMater', 'ExternalIliacVein', 'CongenitalPulmonaryArteriovenousFistula', 'DescendingAorta', 'ParietalBone', 'Flank', 'Maxilla', 'EsophagealHiatus', 'CentralRetinalArtery', 'Neurohypophysis', 'SegmentalArtery', 'BrachialVein', 'RightUpperQuadrantOfAbdomen', 'Eye', 'SuperficialPalmarArch', 'Prostate', 'HepaticArtery', 'FacialBones', 'Back', 'PeronealArtery', 'Duodenum', 'RightHypochondriacRegion', '_1stMarginalCoronaryArtery', 'SuperiorMesentericVein', 'LumbarArtery', 'Cornea', 'Larynx', 'PeronealVein', 'FemoralArtery', 'Ovary', 'ThoracoLumbarSpine', 'Urethra', 'CoronaryArteryGraft', 'Head', 'AdrenalGland', 'MitralValve', 'AcromioclavicularJoint', 'UmbilicalRegion', 'SupraspinatusMuscle', 'CongenitalCoronaryArteryFistulaToRightVentricle', 'Calyx', 'PosteriorMedialTributary', 'PulmonaryVein', 'SoftPalate', 'Submental', 'ExternalIntercostalMuscle', 'CranialVenousSystem', 'NucleusAccumbens', 'GiacominiVein', 'PoplitealFossa', 'MiddleCerebellarPeduncle', 'PulmonaryArteryConduit', 'InternalCarotidArteryC5Segment', 'FissureOfLung', 'RightVentricle', 'LevatoresCostarumMuscles', 'FrontalLobe', 'VagusNerve', 'Adventitia', 'Abdomen', 'HeadAndNeck', 'Hypopharynx', 'RightCoronaryArteryOstium', 'HepaticVein', 'MarginalCoronaryArtery', 'PelvisAndLowerExtremities', 'InternalMammaryArtery', 'Bladder', 'Vulva', 'LargeIntestine', 'EntorhinalCortex', 'Forearm', 'BronchialArtery', 'NeckChestAndAbdomen', 'ExternalCarotidArtery', 'SuperiorMesentericArtery', 'TemporalLobe', 'SystemicArtery', 'PosteriorTibialArtery', 'FemoralVein', 'RightAuricularAppendage', 'GreatSaphenousVeinOfThigh', 'LeftHepaticVein', 'AbdominalWallMuscle', 'SuperficialFemoralArtery', 'VomerBone', 'UterusAndFallopianTubes', 'Arachnoid', '_2ndMarginalCoronaryArtery', 'SuperiorCerebellarPeduncle', 'AorticArch', 'Carina', 'Telencephalon', 'LeftBranchOfHepaticArtery', 'ArcuateArteryOfTheKidney', 'Heart', 'TarsalJoint', 'CephalicVein', 'LingualArtery', 'Lip', 'GastricVein', 'AirwayStructure', 'CongenitalCoronaryArteryFistulaToRightAtrium', 'DeltoidMuscle', 'LeftMainCoronaryArtery', 'CerebralFornix', 'Penis', 'Baffle', 'InferiorRightHepaticVein', 'VentricularVein', 'CarotidSiphon', 'SystemicVenousAtrium', 'PlantarArterialArch', 'Parathyroid', 'AnomalousPulmonaryVein', 'CervicoThoracicSpine', 'LeftMainCoronaryArteryOstium', 'Scapula', 'LesserSaphenousVein', 'Kidney', 'AutonomicNerve', 'GreatSaphenousVein', 'OmentalBursa', 'InternalCarotidArtery', 'Ureter', 'RightPosteriorAVCoronaryArtery', 'UlnarVein', 'FascialLayer', 'AorticValve', 'MiddleEar', 'InternalAuditoryCanal', 'RightPulmonaryArtery', 'RenalPelvis', 'ProperHepaticArtery', 'InterlobarArteryOfKidney', 'Thrombus', 'VenousNetwork', 'SubcostalMuscle', 'CorpusCallosum', 'CommonAtrium', 'PerforatingArteryOfKidney', 'Humerus', 'Ilium', 'AorticFistula', 'InternalCarotidArteryC6Segment', 'ILMInternalLimitingMembrane', 'NasalBone', 'AnteriorTibialArtery', 'CranialNerve', 'Cervix', 'SkinOfAbdomen', 'LeftAnteriorDescendingCoronaryArtery', 'Artery', 'CommonCarotidArtery', 'Buttock', 'InnermostIntercostalMuscles', '_3rdMarginalCoronaryArtery', 'FallopianTube', 'MastoidBone', 'Vein', 'CommonIliacArteryBifurcation', 'MiddleHepaticVein', 'CerebrospinalFluid', 'EsophagealArtery', 'Thigh', 'RadialVein', 'InferiorRightPulmonaryVein', 'Trachea', 'PulmonaryValveSinuses', 'LeftPosterolateralCircumflexCoronaryArtery', 'UterineArtery', 'BodyConduit', 'Thalamus', 'EndoVesical', 'RightVentricleInflow', 'MesentericArtery', 'LeftLowerQuadrantOfAbdomen', 'MuscleOfHead', 'SpinalCerebrospinalFluidPathway', 'MiddleCerebralArteryM1Segment', 'SesamoidBonesOfFoot', 'InternalIliacArtery', 'SuperiorVenaCava', 'SixthLumbarArtery', 'PosteriorArchVein', 'AnteriorSpinalArtery', 'AnusRectumAndSigmoidColon', 'Omentum', 'SplenicVein', 'Colon', 'SubmandibularGland', 'CentralNervousSystem', 'CarotidBifurcation', 'LeftLumbarRegion', 'InnominateArtery', 'SplenicArtery', 'FemaleInternalGenitalia', 'Extremity', 'FacialArtery', 'AccessoryRenalArtery', 'BoneStructureOfHeadAndOrNeck', 'EpigastricRegion', 'Media', 'SeminalVesicle', 'DistalCircumflexCoronaryArtery', 'AbdominalCavity', 'TeresMinorMuscle', 'BoneOfUpperLimb', 'DorsalisPedisArtery', 'Vagina', 'LongissimusMuscle', 'LowerInnerQuadrantOfBreast', 'Clavicle', 'ParotidGland', 'AorticIsthmus', 'CommonFemoralVein', 'SubstantiaNigra', '_1stLeftPosterolateralCoronaryArtery', 'Subxiphoid', 'UpperInnerQuadrantOfBreast', 'Diaphragm', 'ThoracicAorta', 'RightInguinalRegion', 'VasDeferens', 'AxillaryArtery', 'LeftPulmonaryArtery', 'Ileum', 'SalivaryGland', 'VertebralArtery', 'TransjugularIntrahepaticPortosystemicShunt', 'RightLowerQuadrantOfAbdomen', 'SupraRenalAorta', 'InternalJugularVein', 'LacrimalArteryOfRightEye', 'CockettPerforatingVein', 'ChordaeTendineaeCordis', 'LumboSacralSpine', 'SacroiliacJoint', 'RightMainBronchus', 'ScalenousAnteriorMuscle', 'AVGrooveContinuationOfCircumflexArtery', 'EntireBody', 'TesticularArtery', 'Thumb', 'HypogastricRegion', 'RightLumbarRegion', 'GreatCardiacVein', 'HyoidBone', 'ThoracicDuct', 'MiddleLobeOfRightLung', 'BoydPerforatingVein', 'Peritioneum', 'CommonIliacArtery', 'SupraclavicularRegionOfNeck', 'Meninges', 'Shoulder', 'TransversusThoracis', 'VascularGraft', 'CerebellarWhiteMatter', 'InterventricularSeptum', '_2ndLeftPosterolateralCoronaryArtery', 'MiddleCerebralArteryM2Segment', 'Cingulum', 'LowerLobeOfLung', 'TesticularVein', 'AnteriorTibialVein', 'LacrimalBone', 'BasilicVein', 'LeftInguinalRegion', 'RightCoronaryArtery', 'HunterianPerforatingVein', 'IntraPelvic', 'Putamen', 'ProfundaFemorisArtery', 'CostocervicalTrunk', 'Pharynx', 'FifthLumbarArtery', 'AxillaryVein', 'LigamentumArteriosum', 'Nasopharynx', 'SuprapulmonicValveArea', 'SympatheticTrunk', 'LobeOfLung', 'SubclavianVein', 'PulmonaryValve', 'ExternalIliacArtery', 'ProximalRightCoronaryArtery', 'TemporalBone', 'BoneOfLowerLimb', 'Midbrain', 'OvarianVein', 'PosteriorCerebralArtery', 'BrachialPlexus', 'ErectorSpinaeMuscle', 'DeepPalmarVenousArch', 'ApexOfRightVentricle', 'LateralCalfPerforator', 'Mouth', 'PharynxAndLarynx', 'CarotidArtery', 'FourthLumbarArtery', 'SmallestCardiacVein', 'ThirdLumbarArtery', 'LimbicLobe', 'SkinOfChest', 'UmbilicalArtery', 'BuccalRegionOfFace', 'LymphNode', 'PrimitiveAorta', 'RadialArtery', 'LeftFemoralArtery', 'LumenOfBloodVessel', 'TrapeziusMuscle', 'Esophagus', 'AntecubitalVein', 'SpinalCordGrayMatter', 'Mandible', 'LateralCorticospinalTract', 'Parasternal', 'LeftMainBronchus', 'BroadLigament', 'SystemicVein', 'OccipitalLobe', 'CerebralAqueduct', 'Insula', 'PulmonaryVein', 'MuscleOfNeck', 'SubclavianArtery', 'Amygdala', 'Lung', '_3rdLeftPosterolateralCoronaryArtery', 'OpticChiasm', 'OphthalmicArtery', 'Nose', 'PancreaticDuct', 'Hand', 'PectoralisMajorMuscle', 'CardiovascularSystem', 'FemaleExternalGenitalia', 'OvarianArtery', 'Chest', 'ElbowJoint', 'Hippocampus', 'Sternum', 'NeckAndChest', 'RightVentricleOutflowTract', 'GlobusPallidus', 'SuperficialFemoralVein', 'SuperiorLeftPulmonaryVein', 'LeftPosteriorDescendingCircumflexCoronaryArtery', 'BileDuct', 'SystemicCollateralArteryToLung', 'UpperOuterQuadrantOfBreast', 'PancreaticDuctAndBileDuctSystems', 'ApexOfLeftVentricle', 'PericardialCavity', 'PulmonaryArtery', 'Skull', 'MidLeftAnteriorDescendingCoronaryArtery', 'AtrioventricularVein', 'Thyroid', 'EthmoidBone', 'OpticRadiation', 'InfraRenalAorta', 'SternoclavicularJoint', 'EndoNasopharyngeal', 'Breast', 'EsophagusStomachAndDuodenum', 'Neck', 'AxillaryFascia', 'CarotidBulb', 'Finger', 'PoplitealVein', 'InfraspinatusMuscle', 'PiaMater', 'TricuspidValve', 'RightAtrium', 'VascularSclerosis', 'SuperiorPhrenicArtery', 'CommonVentricle', 'DistalLeftAnteriorDescendingCoronaryArtery', 'InnerEar', 'Coccyx', 'AtrialSeptalDefect', 'RightPulmonaryVein', 'TemporomandibularJoint', 'Uterus', 'Ventricle', 'DescendingAorta', 'TracheaAndBronchus', 'Testis', 'ProximalLeftAnteriorDescendingCoronaryArtery', 'OccipitalBone', 'Eyeball', 'Face', 'Spine', 'UrinarySystem', 'BrainStem', 'Foot', 'WhiteMatter', 'MuscleOfUpperLimb', 'PeripheralNervousSystem', 'PinealGland', 'UpperLobeOfLung', 'Zygoma', 'InnominateVein', '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', 'AtrialVein', '_1stDiagonalCoronaryArtery', 'SuprasternalNotch', 'Perineum', 'InteratrialSeptum', 'Femur', 'Rectum', 'AnteriorCardiacVein', 'Pancreas', 'BoneOfThorax', 'LeftAtrium', 'CerebralArtery', 'InferiorMesentericArtery', 'DigitalArteryOfHand', 'SecondLumbarArtery', 'IliocostalisMuscle', '_1stRightPosterolateralCoronaryArtery', 'BladderAndUrethra', 'CervicalSpine', 'IliacAndOrFemoralArtery', 'SpinalCordWhiteMatter', 'Sacrum', 'SmallIntestine', 'SuperiorRightPulmonaryVein', 'InferiorVenaCava', 'MaleExternalGenitalia', 'IntraArticular', 'Axilla', 'RetroperitonealSpace', 'Thymus', 'ELMExternalLimitingMembrane', 'AnteriorMiddleCerebralArteryBifurcation', 'ParietalLobe', 'SuperiorThyroidArtery', 'IliacArtery', 'DistalRightCoronaryArtery', 'CerebralCortex', 'TruncusArteriosusCommunis', 'Tooth', 'Joint', 'SubmandibularArea', 'GreatSaphenousVeinOfCalf', 'LeftPulmonaryVein', 'PectoralisMinorMuscle', 'OpticCanal', 'Aorta', 'SuperficialTemporalArtery', 'MedialLemniscus', 'Diencephalon', 'CongenitalCoronaryArteryFistulaToLeftVentricle', 'NeckChestAbdomenAndPelvis', 'InferiorCerebellarPeduncle', 'RightMainBranchOfPortalVein', 'SphenoidBone', 'LatissimusDorsiMuscle', 'ChestAndAbdomen', 'Spleen', 'CommonHepaticArtery', 'AnkleJoint', 'LowerOuterQuadrantOfBreast', 'Mediastinum', 'Cerebellum', 'FirstLumbarArtery', 'PoplitealArtery', 'UpperUrinaryTract', 'PulmonaryVenousAtrium', 'Bronchus', 'Pelvis', 'PulmonaryChamberOfCorTriatriatum', 'DorsalScapularArtery', 'UlnarArtery', 'LeftVentricle', 'AbdomenAndPelvis', 'LumbarRegion', 'CostalCartilage', 'ThoracicSpine', 'FourthVentricle', 'SaphenousVein', 'Gallbladder', '_2ndRightPosterolateralCoronaryArtery', 'RenalArtery', 'PeritonealCavity', 'UpperArm', 'OpticTract', 'HipJoint', 'TrunkOfPulmonaryArtery', 'GastroduodenalArtery', 'AzygosVein', 'BrachialArtery', '_2ndDiagonalCoronaryArtery', 'Liver', 'HipJoint', 'Rib', 'SerratusAnteriorMuscle', 'CommonFemoralArtery', 'SmallCardiacVein', 'SuperficialPalmarVenousArch', 'Vertebra', 'Stomach', 'CircumflexCoronaryArtery', 'AnteriorCommunicatingArtery', 'CongenitalCoronaryArteryFistulaToLeftAtrium', 'InferiorMesentericVein', 'MedianCubitalVein', 'CoronarySinus', 'HilarArtery', 'TerminalInternalCarotidArtery', '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', 'AnteriorCerebralArtery', 'LowerLeg', 'RenalVein', 'InternalIliacVein', 'IlealVein', 'Ear', 'Toe', 'SpinalCord', 'MiddleCardiacVein', 'Pericardium', 'MiddleCerebralArtery', 'PosteriorCerebralArteryP2Segment', 'PosteriorDescendingRightCoronaryArtery', 'CorpusStriatum', 'LeftAuricularAppendage', 'CircleOfWillis', 'Adenohypophysis', 'PosteriorTibialVein', 'SaphenopoplitealJunction', '_1stSeptalCoronaryArtery', 'MuscleOfLowerLimb', 'Eyelid', 'AscendingAorta', 'LeftUpperQuadrantOfAbdomen', 'DeepPalmarArchOfRadialArtery', 'PericardiophrenicArtery', 'Pleura', 'Subcostal', 'Intima', 'ExternalAuditoryCanal', 'Patella', 'SegmentOfLung', 'OccipitalVein', 'DoddPerforatingVein']} name_for_cid[4263] = 'OphthalmicThicknessMapValueType' cid_concepts[4263] = \ {'DCM': ['AbsoluteOphthalmicThickness', 'ThicknessDeviationCategoryFromNormativeData', 'ThicknessDeviationFromNormativeData']} name_for_cid[10023] = 'SizeSpecificDoseEstimationMethodforCT' cid_concepts[10023] = \ {'DCM': ['AAPM204EffectiveDiameterEstimatedFromPatientAge', 'WaterEquivalentDiameterRepresentativeValue', 'WaterEquivalentDiameterFromRawData', 'WaterEquivalentDiameterIntegratedAcrossScanRange', 'WaterEquivalentDiameterFromLocalizer', 'AAPM204LateralDimension', 'AAPM204SumOfLateralAndAPDimension', 'AAPM204APDimension']} name_for_cid[7273] = 'MRDiffusionModels' cid_concepts[7273] = \ {'DCM': ['MonoExponentialDiffusionModel', 'BiExponentialIVIMDiffusionModel', 'KurtosisDiffusionModel', 'GammaDistributionModel', 'StretchedExponentialDiffusionModel', 'TruncatedGaussianDiffusionModel']} name_for_cid[6032] = 'HighRiskLesionsPathologyCodesfromBIRADS®' cid_concepts[6032] = \ {'DCM': ['PeripheralDuctPapillomas'], 'SCT': ['AtypicalLobularHyperplasia', 'AtypicalIntraductalHyperplasia', 'PhyllodesTumor', 'LobularCarcinomaInSituOfBreast']} name_for_cid[3230] = 'ECGFindings' cid_concepts[3230] = \ {'SCT': ['VentricularPrematureContraction', 'VentricularFibrillation', 'VentricularPreExcitation', 'AtrialPrematureContraction', 'STDepression', 'RightBundleBranchBlock', 'SecondDegreeAtrioventricularBlock', 'ThirdDegreeAtrioventricularBlock', 'SecondarySTTAbnormality', 'Normal', 'EarlyRepolarization', 'NonSustainedVentricularTachycardia', 'IntraventricularConductionDisturbance', 'AtrialFibrillation', 'BifascicularBlock', 'VentricularTachycardia', 'STElevation', 'SupraventricularTachycardia', 'LeftAnteriorFascicularBlock', 'IncompleteRightBundleBranchBlock', 'LeftBundleBranchBlock', 'IncompleteLeftBundleBranchBlock', 'FirstDegreeAtrioventricularBlock', 'NonspecificSTTAbnormality', 'LeftPosteriorFascicularBlock']} name_for_cid[9502] = 'RTSegmentAnnotationCategories' cid_concepts[9502] = \ {'DCM': ['ExternalBodyModel', 'NonSpecificVolume', 'BrachytherapyDevice', 'FixationOrPositioningDevice', 'RTGeometricInformation', 'RTDoseCalculationStructure', 'RTTarget'], 'SCT': ['PhysicalObject']} name_for_cid[12264] = 'CardiacUltrasoundVenousReturnSystemicMeasurements' 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', '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[645] = 'ExogenousSubstanceTissueofOrigin' cid_concepts[645] = \ {'DCM': ['EmbryonicKidney'], 'SCT': ['Lung', 'PulmonaryMetastasis', 'Breast', 'Brain', 'AsciticFluid', 'PleuralEffusion', 'Lymph', 'Ovary', 'Bone', 'LymphaticTissue', 'Prostate', 'Kidney', 'LymphNode', 'Colon', 'Metastasis', 'CentralNervousSystem']} name_for_cid[7009] = 'PurposeofReferencetoPredecessorReport' cid_concepts[7009] = \ {'DCM': ['PartialReport', 'AddendedReport', 'PreliminaryReport', 'ReplacedReport', 'CurrentProcedureEvidence']} name_for_cid[7320] = 'PlanningMethods' cid_concepts[7320] = \ {'DCM': ['Generic2DPlanning', 'Generic3DPlanning', 'GenericPlanningForHipReplacement', 'GenericPlanningForKneeReplacement', 'MüllerMethodPlanningForHipReplacement']} name_for_cid[12008] = 'OBGYNAmnioticSac' cid_concepts[12008] = \ {'LN': ['ThirdQuadrantDiameter', 'SecondQuadrantDiameter', 'FourthQuadrantDiameter', 'FirstQuadrantDiameter'], 'SCT': ['Diameter']} name_for_cid[3733] = 'PrimaryCauseofDeath' cid_concepts[3733] = \ {} name_for_cid[6161] = 'ClinicalRegionalLymphNodeAssessmentforBreast' cid_concepts[6161] = \ {'SCT': ['N1MetastasisIn1To3AxillaryLymphNodes', 'N2bMetastasisInClinicallyApparentInternalNodes', 'N3MetastasisToIpsilateralInternalMammaryLymphNodes', 'N3cMetastasisInIpsilateralSupraclavicularLymphNodes', 'N0NoRegionalLymphNodeMetastasisHistologically', 'N3aMetastasisIn10OrMoreAxillaryLymphNodes', 'NXRegionalLymphNodesCannotBeAssessed', 'N2MetastasisIn4To9AxillaryLymphNodes', 'N3bMetastasisInClinicallyApparentIpsilateralInternal', 'N2aMetastasisIn4To9AxillaryLymphNodes2Point0mm']} name_for_cid[3676] = 'LeadMeasurementTechnique' cid_concepts[3676] = \ {'SCT': ['Representative', 'SingleBeats', 'Averaged', 'Routine', 'Median']} name_for_cid[6024] = 'Depth' cid_concepts[6024] = \ {'NCIt': ['Middle'], 'SCT': ['Posterior', 'Anterior']} name_for_cid[4019] = 'PrimaryAnatomicStructureforIntraoralRadiography(DeciduousDentitionDesignationofTeeth)' cid_concepts[4019] = \ {'SCT': ['DeciduousMandibularRightLateralIncisorTooth', 'DeciduousMandibularLeftSecondMolarTooth', 'DeciduousMandibularLeftCanineTooth', 'DeciduousMaxillaryRightLateralIncisorTooth', 'DeciduousMandibularRightSecondMolarTooth', 'DeciduousMaxillaryLeftCentralIncisorTooth', 'DeciduousMaxillaryLeftSecondMolarTooth', 'DeciduousMandibularRightFirstMolarTooth', 'DeciduousMaxillaryLeftFirstMolarTooth', 'DeciduousMaxillaryRightSecondMolarTooth', 'DeciduousMandibularRightCanineTooth', 'DeciduousMandibularLeftFirstMolarTooth', 'DeciduousMaxillaryRightCanineTooth', 'DeciduousMandibularRightCentralIncisorTooth', 'DeciduousMaxillaryRightCentralIncisorTooth', 'DeciduousMaxillaryRightFirstMolarTooth', 'DeciduousMaxillaryLeftLateralIncisorTooth', 'DeciduousMandibularLeftLateralIncisorTooth', 'DeciduousMandibularLeftCentralIncisorTooth', 'DeciduousMaxillaryLeftCanineTooth']} 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[4222] = 'OphthalmicMacularGridProblem' cid_concepts[4222] = \ {'DCM': ['InterferingTearsOrDrops', 'PatientPositioningProblem', 'EquipmentFailure', 'OperatorError', 'PatientMovement'], 'SCT': ['DryEyesProblem', 'PoorVisualFixation', 'EccentricFixation', 'CornealOpacity', 'EyelidDisease', 'VitreousOpacity', 'LensOpacity', 'RefractiveError', 'ConstrictedPupil']} name_for_cid[242] = 'NormalAbnormal' cid_concepts[242] = \ {'SCT': ['Abnormal', 'Normal', 'NormalityUndetermined']} name_for_cid[8201] = 'SurfaceScanAcquisitionTypes' cid_concepts[8201] = \ {'DCM': ['TimeOfFlight', 'LaserScanning', 'Interferometry', 'ShapeFromShading', 'PatternProjection', 'ConfocalImaging', 'ShapeFromMotion', 'PointCloudAlgorithmic']} name_for_cid[612] = 'AnesthesiaCategoryCodeTypefromAnesthesiaQualityInitiative(AQI)' cid_concepts[612] = \ {'SCT': ['MonitoredAnesthesiaCareMAC', 'GeneralAnesthesia', 'LocalAnesthesia', 'Sedation', 'SpinalAnesthesia', 'EpiduralAnesthesia', 'RegionalAnesthesia', 'TopicalLocalAnesthesia']} name_for_cid[6136] = 'ChestTypesofQualityControlStandard' cid_concepts[6136] = \ {'DCM': ['PerformanceOfPediatricAndAdultThoracicCT', 'PerformanceOfCTForDetectionOfPulmonaryEmbolismInAdults', 'InstitutionallyDefinedQualityControlStandard', 'PerformanceOfHighResolutionCTOfTheLungsInAdults', 'PerformanceOfPediatricAndAdultChestRadiographyACR', 'ACRPositionStatement']} name_for_cid[3764] = 'MyocardialInfarctionTherapies' cid_concepts[3764] = \ {'SCT': ['InsertionOfCoronaryArteryStent', 'ThrombolyticTherapy', 'CoronaryArteryBypassGraft', 'PercutaneousCoronaryIntervention']} name_for_cid[10062] = 'EquivalentRadiationDoseTypes' cid_concepts[10062] = \ {'DCM': ['MedianEquivalentRadiationDose', 'MinimumEquivalentRadiationDose', 'MaximumEquivalentRadiationDose', 'ModeEquivalentRadiationDose', 'MeanEquivalentRadiationDose']} name_for_cid[3271] = 'HemodynamicPhysiologicalChallenges' cid_concepts[3271] = \ {'SCT': ['LegUp', 'ValsalvaManeuver', 'PostVolumeChallenge', 'HeldVentilation', 'DrugInfusion', 'HeadUp', 'VagalStimulation', 'Pacing', 'NegativeLowerBodyPressure', 'Handgrip', 'HeldInspiration', 'ExerciseChallenge']} name_for_cid[3621] = 'FractionalFlowReserve' cid_concepts[3621] = \ {'SCT': ['FractionalFlowReserve', 'FractionalFlowReserveUsingIntracoronaryBolus', 'FractionalFlowReserveUsingIntravenousInfusion']} name_for_cid[7025] = 'RTProcessInputUsed' cid_concepts[7025] = \ {'DCM': ['RTTreatmentPlanningInputUsed', 'RTPrescriptionInputUsed', 'PhysicianReviewInputUsed', 'RTPlanSummationInputUsed', 'PlanQualityAssuranceInputUsed', 'PhysicistReviewInputUsed', 'PatientSetupVerificationInputUsed', 'MachineQualityAssuranceInputUsed', 'RTWorkflowInputUsed']} name_for_cid[7475] = 'GrayLevelRunLengthBasedFeatures' cid_concepts[7475] = \ {} name_for_cid[7160] = 'PelvicOrganSegmentationTypes' cid_concepts[7160] = \ {'SCT': ['Testis', 'Cervix', 'Bladder', 'FemaleInternalGenitalia', 'MaleExternalGenitalia', 'FallopianTube', 'MaleInternalGenitalia', 'Rectum', 'SeminalVesicle', 'Ovary', 'FemaleExternalGenitalia', 'Prostate', 'VasDeferens', 'Vagina', 'Uterus']} name_for_cid[12248] = 'CardiacUltrasoundSummaryCodes' 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[3820] = 'NoninvasiveVascularProcedures' cid_concepts[3820] = \ {'SCT': ['CardiovascularCT', 'PeripheralAngiography', 'CTOfAbdominalAorta', 'VascularMRI', 'TrunkAngiography', 'CardiacMRI']} name_for_cid[405] = 'MediaTypeCode' cid_concepts[405] = \ {'DCM': ['PaperDocument', 'URI', 'SecureDigitalCard', 'MultiMediaCard', 'CompactFlash', 'DVD', 'CD', 'Film', 'Email', 'USBDiskEmulation']} name_for_cid[6008] = 'DensityModifier' cid_concepts[6008] = \ {'SCT': ['LowDensityNotContainingFatLesion', 'HighDensityLesion', 'EqualDensityIsodenseLesion', 'FatContainingRadiolucentLesion']} name_for_cid[3461] = 'RegionalExtent' cid_concepts[3461] = \ {'DCM': ['MultipleRCARegionInRAOProjection', 'SingleRCARegionInRAOProjection', 'MultipleLADRegionInRAOProjection', 'SingleLADRegionInRAOProjection', 'CFXRegionInLAOProjection', 'LADRegionInLAOProjection', 'RCARegionInLAOProjection']} name_for_cid[3524] = 'BloodGasPressures' cid_concepts[3524] = \ {'LN': ['BloodCarbonDioxidePartialPressure', 'BloodOxygenPartialPressure', 'VenousOxygenPartialPressure', 'OxygenPartialPressureAt50PercentSaturationP50', 'ArterialOxygenPartialPressureAt50PercentSaturation', 'VenousBloodCarbonDioxidePartialPressure', 'VenousOxygenPartialPressureAt50PercentSaturation', 'ArterialOxygenPartialPressure', 'ArterialBloodCarbonDioxidePartialPressure']} name_for_cid[8104] = 'BreastTissueSpecimenTypes' cid_concepts[8104] = \ {'SCT': ['SpecimenFromBreastObtainedByExcision', 'SpecimenFromBreastObtainedByTotalMastectomy', 'SpecimenFromBreastObtainedByCoreNeedleBiopsy', 'SegmentectomyBreastSample', 'LumpectomyBreastSample', 'BreastTruCutBiopsySample', 'SpecimenFromBreastByIncisionalBiopsyOfBreastMass', 'BreastDuctSample', 'FrozenSectionBreastSample', 'SpecimenFromBreastStereotacticallyGuidedCoreNeedleBiopsy', 'SpecimenFromBreastObtainedByImageGuidedCoreBiopsy']} name_for_cid[3748] = 'AngiographicEFTestingMethod' cid_concepts[3748] = \ {'DCM': ['BiPlaneAngiography', 'SinglePlaneAngiography']} name_for_cid[7064] = 'ModelUsage' cid_concepts[7064] = \ {'DCM': ['ToolFabrication', 'PlanningIntent', 'QualityControlIntent', 'ImplantFabrication', 'ProstheticFabrication', 'SimulationIntent', 'EducationalIntent'], 'SCT': ['DiagnosticIntent']} name_for_cid[628] = 'AncillaryMedicationsforSmallAnimalAnesthesia' cid_concepts[628] = \ {} name_for_cid[12209] = 'EchocardiographyPulmonicValve' 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', 'SystolicToDiastolicVelocityRatio', 'EFSlope', 'PeakReversalVelocityDuringAtrialContraction', 'TimeAveragedMeanVelocity'], 'SCT': ['RatioOfPulmonicValveAccelerationTimeToEjectionTime', 'RegurgitantFraction', 'CardiovascularOrificeArea', 'CardiovascularOrificeDiameter']} name_for_cid[12120] = 'BloodVelocityMeasurementsbyUltrasound' cid_concepts[12120] = \ {'LN': ['MinimumDiastolicVelocity', 'TimeAveragedPeakVelocity', 'PeakSystolicVelocity', 'EndDiastolicVelocity', 'TimeAveragedMeanVelocity']} name_for_cid[94] = 'PhysicalForceAppliedDuringAcquisition' cid_concepts[94] = \ {'SCT': ['TractionAction', 'RotationAction', 'CompressionAction']} name_for_cid[8112] = 'SpecimenStains' 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', 'ThioninStain', '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', 'AlcoholSolubleNigrosineStain', 'MethylBlueStain', 'HematoxylinStain', 'WaterSolubleAnthraceneBrownStain', 'FastGarnetGBCSaltStain', 'BenzoFastScarletStain', 'NeutrophilAlkalinePhosphataseStain', 'AcriflavineStain', 'AcridineOrangeStain', 'AcidFastStain', 'EthylVioletStain', 'CurcuminStain', 'SolubleBerlinBlueStain', 'CochinealStain', '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', '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', 'RomanowskyStain', 'LightGreenSFStain', 'ErieGarnetStain', 'MethyleneBlueStain', 'MethylGreenPyroninStain', 'DurazolRedStain', 'CarbolFuchsinStain', 'MethyleneVioletStain', 'FastRedBSaltStain', 'NaphtholYellowSStain', 'ChrysoidineYStain', 'SilverStain', 'AnilineBlueStain', 'TartrazineStain', 'PyronineGStain', 'BrilliantYellowStain', 'PatentBlueVSodiumSaltStain', 'MalachiteGreenStain', 'AuramineOStain', 'PermethrinStain', 'OrangeIIStain', 'DibromofluoresceinStain', 'EvansBlueStain', 'PrussianBlueStain', 'SudanBlackStain', 'NuclearFastRedStain', 'FuchsinBasicStain', 'IndigoCarmineStain', 'BiebrichScarletStain', 'PonceauXylidineStain', 'ThioflavineSStain', 'PotassiumHydroxideStain', 'PhosphotungsticAcidHematoxylinStain', 'FastRedTRSaltStain', 'SolochromeBlack6BStain']} name_for_cid[501] = 'VolumetricViewDescription' cid_concepts[501] = \ {'SCT': ['SubcostalShortAxis', 'RightPosteriorOblique', 'LeftLateralProjection', 'ParasternalLongAxisViewOfTheRVOutflowTract', 'ParasternalShortAxisAtThePapillaryMuscleLevel', 'Tangential', 'CranioCaudal', 'LateroMedialOblique', 'Acanthioparietal', 'SuprasternalSagittalView', 'Orbitoparietal', 'PosteriorProjection', 'FiveChamber', 'ObliqueCranioCaudal', 'LongAxis', 'RightAnteriorOblique', 'RightVentricularInflowTractView', 'LateralOblique', 'RightOblique', 'OffAxis', 'TwoChamber', 'Lateral', 'MedioLateralOblique', 'RightLateral', 'Verticosubmental', 'ObliqueAxial', 'MedialLateral', 'SubcostalObliqueCoronalView', 'Frontal', 'Parietoacanthial', 'PosteroAnterior', 'Submentovertical', 'HorizontalLongAxis', 'AnteroPosteriorOblique', 'RightPosteriorOblique', 'LeftOblique', 'SubcostalShortAxisViewAtMitralValveLevel', 'ParietoOrbital', 'MedialOblique', 'FrontalObliqueAxial', 'ParasternalShortAxisAtTheAorticValveLevel', 'SubcostalShortAxisViewAtPapillaryMuscleLevel', 'AnteroPosterior', 'SubcostalShortAxisViewAtVenousInflowLevel', 'FrontalOblique', 'LeftPosteriorOblique', 'FourChamber', 'ParasternalShortAxisAtTheLevelOfTheMitralChords', 'LeftPosteriorOblique', 'RightVentricularOutflowTractView', 'ParasternalShortAxis', 'ParasternalShortAxisAtTheMitralValveLevel', 'ParasternalLongAxis', 'ObliqueCaudoCranial', 'SuprasternalShortAxis', 'SubcostalViewOfCardiacOutletsDirectedAnteriorly', 'SagittalObliqueAxial', 'PosteroAnteriorOblique', 'VerticalLongAxis', 'Axial', 'Sagittal', 'LeftAnteriorOblique', 'OcclusalProjection', 'SuprasternalLongAxis', 'TransesophagealShortAxisView', 'Axial', 'Plantodorsal', 'SuprasternalCoronalView', 'Parasagittal', 'LeftAnteriorOblique', 'ParasternalLongAxisViewOfTheRVInflowTract', 'Oblique', 'RightLateralProjection', 'SuprasternalLongAxisViewOfAorticArch', 'CaudoCranial', 'Transverse', 'TissueSpecimen', 'SubcostalLongAxis', 'LeftLateral', 'RightAnteriorOblique', 'LateralMedial', 'Dorsoplantar', 'ApicalLongAxis', 'SubcostalShortAxisViewAtAorticValveLevel', 'Oblique', 'AnteriorProjection', 'SagittalObliqueAxial', 'LateralMedial', 'MedialLateral', 'ShortAxis', 'MedioLateralOblique', 'LateroMedialOblique', 'ObliqueAxial', 'Lateral', 'Coronal', 'Longitudinal']} name_for_cid[9538] = 'RadiationTransportBasedEffectiveDoseMethodModifiers' cid_concepts[9538] = \ {'DCM': ['LocalEffectModel', 'MicrodosimetricKineticModel']} name_for_cid[3836] = 'TimebasedPerfusionMeasurements' cid_concepts[3836] = \ {'DCM': ['SignalTimeToPeak', 'SignalIncreaseStartTime', 'SignalEarliestPeakTime', 'SignalBaselineStart', 'SignalBaselineEnd']} name_for_cid[9241] = 'RadiotherapyGeneralWorkitemDefinition' cid_concepts[9241] = \ {'DCM': ['RTPatientSetup', 'RTPatientPositionInTreatmentSessionReview', 'RTTreatmentQAByRTIonPlanDifferenceCheck', 'RTTreatmentSimulationWithInternalVerification', 'RTBrachyTreatment', 'RTTreatmentQAByRTPlanDifferenceCheck', 'RTPatientPositionAdjustment', 'RTTreatmentQAByRTIonPlanDoseCheck', 'RTMachineQA', 'RTTreatmentQAByRTPlanDoseCheck', 'RTTreatmentQAWithExternalVerification', 'RTTreatmentWithExternalVerification', 'RTTreatmentQAWithInternalVerification', 'RTTreatmentSimulationWithExternalVerification', 'RTTreatmentWithInternalVerification']} name_for_cid[12032] = 'TransducerScanPattern' cid_concepts[12032] = \ {'DCM': ['VolumeScanPattern', 'PlaneScanPattern', 'LineScanPattern']} name_for_cid[3709] = 'AorticRootDescription' cid_concepts[3709] = \ {'SCT': ['EnlargedAorticRoot', 'RupturedSinusOfValsalva', 'PostStenoticDilation', 'NormalAorticRoot', 'AneurysmOfAorticRoot', 'AnnularAbscessOfAorticRoot']} name_for_cid[224] = 'SelectionMethod' cid_concepts[224] = \ {'DCM': ['MostRecentValueChosen', 'MeanValueChosen', 'UserChosenValue']} name_for_cid[7468] = 'TextureMeasurements' cid_concepts[7468] = \ {'DCM': ['RootAngularSecondMomentOfGLCM', 'FractalDimension']} name_for_cid[7192] = 'AnatomicalStructureSegmentationPropertyTypes' cid_concepts[7192] = \ {'BARI': ['_1stMarginalCoronaryArteryLaterals', '_2ndMarginalCoronaryArteryLaterals', '_3rdMarginalCoronaryArteryLaterals', '_1stDiagonalCoronaryArteryLaterals', '_2ndDiagonalCoronaryArteryLaterals', 'RamusLaterals', '_3rdDiagonalCoronaryArteryLaterals', 'PosteriorDescendingSeptalPerforators'], 'DCM': ['Phantom', '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': ['ArcuateFasciculus'], 'SCT': ['ProfundaFemorisVein', 'LeftHypochondriacRegion', 'SternocleidomastoidMuscle', 'TruncusCoeliacus', 'InferiorLongitudinalFasciculus', 'BasilarArtery', 'ParanasalSinus', 'BrainCerebrospinalFluidPathway', 'WristJoint', 'MidCircumflexCoronaryArtery', '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', 'PalatineBone', 'CoronaryArtery', 'RightBranchOfHepaticArtery', 'UpperLimb', 'DuraMater', 'ExternalIliacVein', 'CongenitalPulmonaryArteriovenousFistula', 'DescendingAorta', 'ParietalBone', 'Flank', 'Maxilla', 'EsophagealHiatus', 'CentralRetinalArtery', 'Neurohypophysis', 'SegmentalArtery', 'BrachialVein', 'RightUpperQuadrantOfAbdomen', 'Eye', 'SuperficialPalmarArch', 'Prostate', 'HepaticArtery', 'FacialBones', 'Back', 'PeronealArtery', 'Duodenum', 'RightHypochondriacRegion', '_1stMarginalCoronaryArtery', 'SuperiorMesentericVein', 'LumbarArtery', 'Cornea', 'Larynx', 'PeronealVein', 'FemoralArtery', 'Ovary', 'ThoracoLumbarSpine', 'Urethra', 'CoronaryArteryGraft', 'Head', 'AdrenalGland', 'MitralValve', 'AcromioclavicularJoint', 'UmbilicalRegion', 'SupraspinatusMuscle', 'CongenitalCoronaryArteryFistulaToRightVentricle', 'Calyx', 'PosteriorMedialTributary', 'PulmonaryVein', 'SoftPalate', 'Submental', 'ExternalIntercostalMuscle', 'CranialVenousSystem', 'NucleusAccumbens', 'GiacominiVein', 'PoplitealFossa', 'MiddleCerebellarPeduncle', 'PulmonaryArteryConduit', 'InternalCarotidArteryC5Segment', 'FissureOfLung', 'RightVentricle', 'LevatoresCostarumMuscles', 'FrontalLobe', 'VagusNerve', 'Adventitia', 'Abdomen', 'HeadAndNeck', 'Hypopharynx', 'RightCoronaryArteryOstium', 'HepaticVein', 'MarginalCoronaryArtery', 'PelvisAndLowerExtremities', 'InternalMammaryArtery', 'Bladder', 'Vulva', 'LargeIntestine', 'EntorhinalCortex', 'Forearm', 'BronchialArtery', 'NeckChestAndAbdomen', 'ExternalCarotidArtery', 'SuperiorMesentericArtery', 'TemporalLobe', 'SystemicArtery', 'PosteriorTibialArtery', 'FemoralVein', 'RightAuricularAppendage', 'GreatSaphenousVeinOfThigh', 'LeftHepaticVein', 'AbdominalWallMuscle', 'SuperficialFemoralArtery', 'VomerBone', 'UterusAndFallopianTubes', 'Arachnoid', '_2ndMarginalCoronaryArtery', 'SuperiorCerebellarPeduncle', 'AorticArch', 'Carina', 'Telencephalon', 'LeftBranchOfHepaticArtery', 'ArcuateArteryOfTheKidney', 'Heart', 'TarsalJoint', 'CephalicVein', 'LingualArtery', 'Lip', 'GastricVein', 'AirwayStructure', 'CongenitalCoronaryArteryFistulaToRightAtrium', 'DeltoidMuscle', 'LeftMainCoronaryArtery', 'CerebralFornix', 'Penis', 'Baffle', 'InferiorRightHepaticVein', 'VentricularVein', 'CarotidSiphon', 'SystemicVenousAtrium', 'PlantarArterialArch', 'Parathyroid', 'AnomalousPulmonaryVein', 'CervicoThoracicSpine', 'LeftMainCoronaryArteryOstium', 'Scapula', 'LesserSaphenousVein', 'Kidney', 'AutonomicNerve', 'GreatSaphenousVein', 'OmentalBursa', 'InternalCarotidArtery', 'Ureter', 'RightPosteriorAVCoronaryArtery', 'UlnarVein', 'FascialLayer', 'AorticValve', 'MiddleEar', 'InternalAuditoryCanal', 'RightPulmonaryArtery', 'RenalPelvis', 'ProperHepaticArtery', 'InterlobarArteryOfKidney', 'Thrombus', 'VenousNetwork', 'SubcostalMuscle', 'CorpusCallosum', 'CommonAtrium', 'PerforatingArteryOfKidney', 'Humerus', 'Ilium', 'AorticFistula', 'InternalCarotidArteryC6Segment', 'ILMInternalLimitingMembrane', 'NasalBone', 'AnteriorTibialArtery', 'CranialNerve', 'Cervix', 'SkinOfAbdomen', 'LeftAnteriorDescendingCoronaryArtery', 'Artery', 'CommonCarotidArtery', 'Buttock', 'InnermostIntercostalMuscles', '_3rdMarginalCoronaryArtery', 'FallopianTube', 'MastoidBone', 'Vein', 'CommonIliacArteryBifurcation', 'MiddleHepaticVein', 'CerebrospinalFluid', 'EsophagealArtery', 'Thigh', 'RadialVein', 'InferiorRightPulmonaryVein', 'Trachea', 'PulmonaryValveSinuses', 'LeftPosterolateralCircumflexCoronaryArtery', 'UterineArtery', 'BodyConduit', 'Thalamus', 'EndoVesical', 'RightVentricleInflow', 'MesentericArtery', 'LeftLowerQuadrantOfAbdomen', 'MuscleOfHead', 'SpinalCerebrospinalFluidPathway', 'MiddleCerebralArteryM1Segment', 'SesamoidBonesOfFoot', 'InternalIliacArtery', 'SuperiorVenaCava', 'SixthLumbarArtery', 'PosteriorArchVein', 'AnteriorSpinalArtery', 'AnusRectumAndSigmoidColon', 'Omentum', 'SplenicVein', 'Colon', 'SubmandibularGland', 'CentralNervousSystem', 'CarotidBifurcation', 'LeftLumbarRegion', 'InnominateArtery', 'SplenicArtery', 'FemaleInternalGenitalia', 'Extremity', 'FacialArtery', 'AccessoryRenalArtery', 'BoneStructureOfHeadAndOrNeck', 'EpigastricRegion', 'Media', 'SeminalVesicle', 'DistalCircumflexCoronaryArtery', 'AbdominalCavity', 'TeresMinorMuscle', 'BoneOfUpperLimb', 'DorsalisPedisArtery', 'Vagina', 'LongissimusMuscle', 'LowerInnerQuadrantOfBreast', 'Clavicle', 'ParotidGland', 'AorticIsthmus', 'CommonFemoralVein', 'SubstantiaNigra', '_1stLeftPosterolateralCoronaryArtery', 'Subxiphoid', 'UpperInnerQuadrantOfBreast', 'Diaphragm', 'ThoracicAorta', 'RightInguinalRegion', 'VasDeferens', 'AxillaryArtery', 'LeftPulmonaryArtery', 'Ileum', 'SalivaryGland', 'VertebralArtery', 'TransjugularIntrahepaticPortosystemicShunt', 'RightLowerQuadrantOfAbdomen', 'SupraRenalAorta', 'InternalJugularVein', 'LacrimalArteryOfRightEye', 'CockettPerforatingVein', 'ChordaeTendineaeCordis', 'LumboSacralSpine', 'SacroiliacJoint', 'RightMainBronchus', 'ScalenousAnteriorMuscle', 'AVGrooveContinuationOfCircumflexArtery', 'EntireBody', 'TesticularArtery', 'Thumb', 'HypogastricRegion', 'RightLumbarRegion', 'GreatCardiacVein', 'HyoidBone', 'ThoracicDuct', 'MiddleLobeOfRightLung', 'BoydPerforatingVein', 'Peritioneum', 'CommonIliacArtery', 'SupraclavicularRegionOfNeck', 'Meninges', 'Shoulder', 'TransversusThoracis', 'VascularGraft', 'CerebellarWhiteMatter', 'InterventricularSeptum', '_2ndLeftPosterolateralCoronaryArtery', 'MiddleCerebralArteryM2Segment', 'Cingulum', 'LowerLobeOfLung', 'TesticularVein', 'AnteriorTibialVein', 'LacrimalBone', 'BasilicVein', 'LeftInguinalRegion', 'RightCoronaryArtery', 'HunterianPerforatingVein', 'IntraPelvic', 'Putamen', 'ProfundaFemorisArtery', 'CostocervicalTrunk', 'Pharynx', 'FifthLumbarArtery', 'AxillaryVein', 'LigamentumArteriosum', 'Nasopharynx', 'SuprapulmonicValveArea', 'SympatheticTrunk', 'LobeOfLung', 'SubclavianVein', 'PulmonaryValve', 'ExternalIliacArtery', 'ProximalRightCoronaryArtery', 'TemporalBone', 'BoneOfLowerLimb', 'Midbrain', 'OvarianVein', 'PosteriorCerebralArtery', 'BrachialPlexus', 'ErectorSpinaeMuscle', 'DeepPalmarVenousArch', 'ApexOfRightVentricle', 'LateralCalfPerforator', 'Mouth', 'PharynxAndLarynx', 'CarotidArtery', 'FourthLumbarArtery', 'SmallestCardiacVein', 'ThirdLumbarArtery', 'LimbicLobe', 'SkinOfChest', 'UmbilicalArtery', 'BuccalRegionOfFace', 'LymphNode', 'PrimitiveAorta', 'RadialArtery', 'LeftFemoralArtery', 'LumenOfBloodVessel', 'TrapeziusMuscle', 'Esophagus', 'AntecubitalVein', 'SpinalCordGrayMatter', 'Mandible', 'LateralCorticospinalTract', 'Parasternal', 'LeftMainBronchus', 'BroadLigament', 'SystemicVein', 'OccipitalLobe', 'CerebralAqueduct', 'Insula', 'PulmonaryVein', 'MuscleOfNeck', 'SubclavianArtery', 'Amygdala', 'Lung', '_3rdLeftPosterolateralCoronaryArtery', 'OpticChiasm', 'OphthalmicArtery', 'Nose', 'PancreaticDuct', 'Hand', 'PectoralisMajorMuscle', 'CardiovascularSystem', 'FemaleExternalGenitalia', 'OvarianArtery', 'Chest', 'ElbowJoint', 'Hippocampus', 'Sternum', 'NeckAndChest', 'RightVentricleOutflowTract', 'GlobusPallidus', 'SuperficialFemoralVein', 'SuperiorLeftPulmonaryVein', 'LeftPosteriorDescendingCircumflexCoronaryArtery', 'BileDuct', 'SystemicCollateralArteryToLung', 'UpperOuterQuadrantOfBreast', 'PancreaticDuctAndBileDuctSystems', 'ApexOfLeftVentricle', 'PericardialCavity', 'PulmonaryArtery', 'Skull', 'MidLeftAnteriorDescendingCoronaryArtery', 'AtrioventricularVein', 'Thyroid', 'EthmoidBone', 'OpticRadiation', 'InfraRenalAorta', 'SternoclavicularJoint', 'EndoNasopharyngeal', 'EsophagusStomachAndDuodenum', 'Breast', 'Neck', 'AxillaryFascia', 'CarotidBulb', 'Finger', 'PoplitealVein', 'InfraspinatusMuscle', 'PiaMater', 'TricuspidValve', 'RightAtrium', 'VascularSclerosis', 'SuperiorPhrenicArtery', 'CommonVentricle', 'DistalLeftAnteriorDescendingCoronaryArtery', 'InnerEar', 'Coccyx', 'AtrialSeptalDefect', 'RightPulmonaryVein', 'Uterus', 'TemporomandibularJoint', 'Ventricle', 'DescendingAorta', 'TracheaAndBronchus', 'Testis', 'ProximalLeftAnteriorDescendingCoronaryArtery', 'OccipitalBone', 'Eyeball', 'Face', 'Spine', 'UrinarySystem', 'BrainStem', 'Foot', 'WhiteMatter', 'MuscleOfUpperLimb', 'PeripheralNervousSystem', 'PinealGland', 'UpperLobeOfLung', 'Zygoma', 'InnominateVein', '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', 'AtrialVein', '_1stDiagonalCoronaryArtery', 'SuprasternalNotch', 'Perineum', 'InteratrialSeptum', 'Rectum', 'Femur', 'AnteriorCardiacVein', 'Pancreas', 'BoneOfThorax', 'LeftAtrium', 'CerebralArtery', 'InferiorMesentericArtery', 'DigitalArteryOfHand', 'SecondLumbarArtery', 'IliocostalisMuscle', '_1stRightPosterolateralCoronaryArtery', 'BladderAndUrethra', 'CervicalSpine', 'IliacAndOrFemoralArtery', 'SpinalCordWhiteMatter', 'Sacrum', 'SmallIntestine', 'SuperiorRightPulmonaryVein', 'InferiorVenaCava', 'MaleExternalGenitalia', 'IntraArticular', 'Axilla', 'RetroperitonealSpace', 'Thymus', 'ELMExternalLimitingMembrane', 'AnteriorMiddleCerebralArteryBifurcation', 'ParietalLobe', 'SuperiorThyroidArtery', 'IliacArtery', 'DistalRightCoronaryArtery', 'CerebralCortex', 'TruncusArteriosusCommunis', 'Tooth', 'Joint', 'SubmandibularArea', 'GreatSaphenousVeinOfCalf', 'LeftPulmonaryVein', 'PectoralisMinorMuscle', 'OpticCanal', 'Aorta', 'SuperficialTemporalArtery', 'MedialLemniscus', 'Diencephalon', 'CongenitalCoronaryArteryFistulaToLeftVentricle', 'NeckChestAbdomenAndPelvis', 'InferiorCerebellarPeduncle', 'RightMainBranchOfPortalVein', 'SphenoidBone', 'LatissimusDorsiMuscle', 'Spleen', 'ChestAndAbdomen', 'CommonHepaticArtery', 'AnkleJoint', 'LowerOuterQuadrantOfBreast', 'Mediastinum', 'Cerebellum', 'FirstLumbarArtery', 'PoplitealArtery', 'UpperUrinaryTract', 'PulmonaryVenousAtrium', 'Bronchus', 'Pelvis', 'PulmonaryChamberOfCorTriatriatum', 'DorsalScapularArtery', 'UlnarArtery', 'LeftVentricle', 'AbdomenAndPelvis', 'LumbarRegion', 'CostalCartilage', 'ThoracicSpine', 'FourthVentricle', 'SaphenousVein', 'Gallbladder', '_2ndRightPosterolateralCoronaryArtery', 'RenalArtery', 'PeritonealCavity', 'UpperArm', 'OpticTract', 'HipJoint', 'TrunkOfPulmonaryArtery', 'GastroduodenalArtery', 'AzygosVein', 'BrachialArtery', '_2ndDiagonalCoronaryArtery', 'Liver', 'HipJoint', 'Rib', 'SerratusAnteriorMuscle', 'CommonFemoralArtery', 'SmallCardiacVein', 'SuperficialPalmarVenousArch', 'Vertebra', 'Stomach', 'CircumflexCoronaryArtery', 'AnteriorCommunicatingArtery', 'CongenitalCoronaryArteryFistulaToLeftAtrium', 'InferiorMesentericVein', 'MedianCubitalVein', 'CoronarySinus', 'HilarArtery', 'TerminalInternalCarotidArtery', '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', 'AnteriorCerebralArtery', 'LowerLeg', 'RenalVein', 'InternalIliacVein', 'IlealVein', 'Ear', 'Toe', 'SpinalCord', 'MiddleCardiacVein', 'Pericardium', 'MiddleCerebralArtery', 'PosteriorCerebralArteryP2Segment', 'PosteriorDescendingRightCoronaryArtery', 'CorpusStriatum', 'LeftAuricularAppendage', 'CircleOfWillis', 'Adenohypophysis', 'PosteriorTibialVein', 'SaphenopoplitealJunction', '_1stSeptalCoronaryArtery', 'MuscleOfLowerLimb', 'Eyelid', 'AscendingAorta', 'LeftUpperQuadrantOfAbdomen', 'DeepPalmarArchOfRadialArtery', 'PericardiophrenicArtery', 'Pleura', 'Subcostal', 'Intima', 'ExternalAuditoryCanal', 'Patella', 'SegmentOfLung', 'OccipitalVein', 'DoddPerforatingVein']} name_for_cid[4244] = 'OphthalmicAgentConcentrationUnits' cid_concepts[4244] = \ {'UCUM': ['Percent', 'mgml']} name_for_cid[9533] = 'DeliveryTimeStructure' cid_concepts[9533] = \ {'DCM': ['ContinuousPermanent', 'ContinuousTemporary', 'HyperFractionation', 'HypoFractionation', 'StandardFractionation', 'SingleFraction']} name_for_cid[12255] = 'CardiacUltrasoundMyocardiumMeasurements' cid_concepts[12255] = \ {'DCM': ['WallMass'], 'LN': ['EndocardialArea', 'EpicardialArea', 'MyocardialPerformanceIndexTei']} name_for_cid[3217] = 'ComparisonFinding' cid_concepts[3217] = \ {'DCM': ['AgreementWithPriorFindings', 'DisagreementWithPriorFindings']} 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[4028] = 'CraniofacialAnatomicRegions' 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[10004] = 'FluoroModes' cid_concepts[10004] = \ {'DCM': ['Continuous', 'Pulsed']} name_for_cid[27] = 'BasicCardiacViews' cid_concepts[27] = \ {'SCT': ['VerticalLongAxis', 'ShortAxis', 'HorizontalLongAxis']} name_for_cid[1011] = 'ReferenceGeometryPoints' cid_concepts[1011] = \ {'DCM': ['CenterOfMass', 'GeometricCenterpoint']} 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[12202] = 'LeftVentricleVolume' cid_concepts[12202] = \ {'LN': ['LeftVentricularEjectionFractionByUS', 'LeftVentricularEndSystolicVolume', 'LeftVentricularEndDiastolicVolume']} name_for_cid[3493] = 'IVUSRelativeStenosisSeverities' cid_concepts[3493] = \ {'DCM': ['T2Secondary', 'T3Secondary', 'T1Worst', 'T4Secondary']} name_for_cid[7203] = 'ImageDerivation' cid_concepts[7203] = \ {'DCM': ['SpatialResampling', 'PixelByPixelAddition', 'EdgeEnhancement', 'Smoothing', 'GaussianBlur', 'UnsharpMask', 'PixelByPixelDivision', 'PixelByPixelMask', 'PixelByPixelMaximum', 'LossyCompression', 'PixelByPixelSubtraction', 'PerfusionImageAnalysis', 'DiffusionTractography', 'DiffusionImageAnalysis', 'PixelByPixelMean', 'VolumeRendering', 'PixelByPixelMultiplication', 'SurfaceRendering', 'MultiEnergyProportionalWeighting', 'Segmentation', 'ExtractionOfIndividualSubjectFromGroup', 'VolumeEditing', 'MaximumIntensityProjection', 'MinimumIntensityProjection', 'ImageStitching', 'SpatiallyRelatedFramesExtractedFromTheVolume', 'TemporallyRelatedFramesExtractedFromTheSetOfVolumes', 'PolarToRectangularScanConversion', 'MetaboliteMapsFromSpectroscopyData', 'MultiplanarReformatting', 'PixelByPixelMinimum', 'CurvedMultiplanarReformatting', 'OCTBScanAnalysis']} name_for_cid[3610] = 'GradientSourceLocations' cid_concepts[3610] = \ {'SCT': ['TricuspidValve', 'RightVentricleOutflowTract', 'PulmonaryValve', 'PulmonaryArtery', 'CoarctationOfAorta', 'AorticValve', 'AtrialSeptalDefect', 'MitralValve', 'VentricularSeptalDefect', 'LeftVentricleOutflowTract']} name_for_cid[6042] = 'StatusofResults' cid_concepts[6042] = \ {'DCM': ['Succeeded', 'PartiallySucceeded', 'Failed', 'NotAttempted']} name_for_cid[3240] = 'ElectrophysiologyMeasurementFunctionsandTechniques' cid_concepts[3240] = \ {'DCM': ['PacingElectricalStimulusVoltage', 'MonopoleSignal', 'HisBundleElectrogram', 'DifferentialSignal', 'VoltageMeasurementByMappingCatheter', 'VoltageMeasurementByBasketCatheter', 'VoltageMeasurement', 'RadioFrequencyAblationPower']} name_for_cid[3755] = 'CathComplications' cid_concepts[3755] = \ {'SCT': ['EmergencyPercutaneousCoronaryIntervention', 'CardiogenicShock', 'Arrhythmia', 'ContrastMediaAdverseReaction', 'CongestiveHeartFailure', 'CerebrovascularAccidentOrStroke', 'CardiacTamponade', 'EmergencyCoronaryArteryBypass', 'RenalFailure', 'CardiacArrest']} name_for_cid[6107] = 'WidthDescriptor' cid_concepts[6107] = \ {'DCM': ['Vasoconstriction', 'Vasodilation'], 'SCT': ['Narrow', 'Enlarged']} name_for_cid[70] = 'Flush' cid_concepts[70] = \ {'SCT': ['Dextran', 'Saline', 'LactatedRingerS']} 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[4205] = 'OphthalmicLens' cid_concepts[4205] = \ {'SCT': ['IndirectOphthalmoscopyLens', 'ContactFundusLens', 'ConcaveNoncontactFundusLens', 'ConcaveContactFundusLens', 'Goniolens', 'NoncontactFundusLens', 'ConvexContactFundusLens', 'ConvexNoncontactFundusLens']} name_for_cid[3485] = 'IVUSVolumeMeasurements' cid_concepts[3485] = \ {'DCM': ['NativePlaqueVolume', 'TotalPlaqueVolume', 'InStentNeointimalVolume', 'EEMVolume', 'LumenVolume'], 'SCT': ['StentVolume']} name_for_cid[12214] = 'EchocardiographyPulmonaryVeins' cid_concepts[12214] = \ {'LN': ['PulmonaryVeinSystolicPeakVelocity', 'PulmonaryVeinDiastolicPeakVelocity', 'HeartRate', 'PulmonaryVeinAtrialContractionReversalPeakVelocity', 'PulmonaryVeinSystolicToDiastolicRatio'], 'SCT': ['PulmonaryVeinAWaveDuration', 'PulmonaryVeinSWaveVelocityTimeIntegral', 'PulmonaryVeinDWaveVelocityTimeIntegral']} name_for_cid[6054] = 'BreastImagingFindings' 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[3606] = 'ArterialSourceLocations' cid_concepts[3606] = \ {'SCT': ['InternalCarotidArtery', 'BasilarArtery', 'CommonFemoralArtery', 'PulmonaryArteriovenousFistula', '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', 'DescendingAorta', '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[6404] = 'ChestNonlesionObjectTypePhysicalObjects' 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[7215] = 'SpectroscopyPurposeofReference' cid_concepts[7215] = \ {'DCM': ['SpectroscopyDataForWaterPhaseCorrection']} name_for_cid[10045] = 'RadiopharmaceuticalPatientState' cid_concepts[10045] = \ {'DCM': ['CardiacStressState', 'AcuteUnilateralRenalBlockage', 'LowThyroidUptake', 'HighThyroidUptake', 'SeverelyJaundiced'], 'SCT': ['AbnormalRenalFunction', 'RestingState']} name_for_cid[66] = 'MedicationforImagingAgentAdministration' cid_concepts[66] = \ {'SCT': ['Alfentanil', 'Remifentanil', 'Propofol', 'Midazolam', 'Sufentanil']} name_for_cid[6111] = 'BronchovascularAnatomyFindingorFeature' cid_concepts[6111] = \ {'DCM': ['CarinaAngle', 'CentrilobularStructures'], 'SCT': ['HilumOfLung', 'AirwayStructure', 'Carina', 'Bronchus']} name_for_cid[3743] = 'Clopidogrel/TiclopidineAdministration' cid_concepts[3743] = \ {'SCT': ['Contraindicated', 'AdministeredAfterPercutaneousCoronaryIntervention', 'NotAdministered', 'AdministeredLessThan72HoursBeforePCI']} name_for_cid[4252] = 'VisualFieldStaticPerimetryScreeningTestModes' cid_concepts[4252] = \ {'DCM': ['AgeCorrected', 'ThresholdRelated', 'UserChosenValue', 'SingleLuminance', 'FovealSensitivityRelated', 'RelatedToNonMacularSensitivity']} name_for_cid[7184] = 'AbstractMultidimensionalImageModelAxisDirection' cid_concepts[7184] = \ {'DCM': ['SeptumWallAxis', 'AnteriorInferiorAxis', 'ApexBaseAxis', 'AnteriorPosteriorAxis', 'HeadFootAxis', 'LeftRightAxis']} name_for_cid[12306] = 'EchoFlowDirections' cid_concepts[12306] = \ {'SCT': ['RetrogradeDirection', 'AntegradeDirection']} name_for_cid[12243] = 'LeftVentricleFindingSites' cid_concepts[12243] = \ {'SCT': ['LeftVentricleOutflowTract']} name_for_cid[9525] = 'RadiationTherapyParticle' cid_concepts[9525] = \ {'SCT': ['Electron', 'Photon']} name_for_cid[3651] = 'HemodynamicMeasurementPhase' cid_concepts[3651] = \ {'SCT': ['CardiacCatheterizationBaselinePhase', 'CardiacCatheterizationTestChallengePhase', 'CardiacCatheterizationGradientAssessmentPhase', 'DrugInfusionChallenge', 'CardiacCatheterizationPostInterventionPhase', 'CardiacCatheterizationPostContrastPhase', 'RestingState', 'ExerciseChallenge']} name_for_cid[6003] = 'ChangeSinceLastMammogramorPriorSurgeryfromBIRADS®' cid_concepts[6003] = \ {'SCT': ['RemovalOfImplantSincePreviousMammogram', 'ImplantRevisedSincePreviousMammogram', 'NoSignificantChangesInTheFinding', 'IncreaseInSize', 'NewFinding', 'IncreaseInNumberOfCalcifications', 'DecreaseInNumberOfCalcifications', 'LessDefined', 'FindingPartiallyRemoved', 'MoreDefined', 'DecreaseInSize']} name_for_cid[3201] = 'IndicationsforStressTest' cid_concepts[3201] = \ {'SCT': ['AbnormalExerciseToleranceTest', 'Arrhythmia', 'Palpitations', 'PreOperative', 'AnginaPectoris', 'Syncope', 'HeartFailure', 'AbnormalECG', 'CoronaryArteryDisease', 'SupraventricularTachycardia', 'HistoryOfCABG', 'LeftBundleBranchBlock', 'ValvularHeartDisease', 'PostPTCA', 'ChestPain', 'Hypertension', 'OccupationalRequirement', 'HistoryOfMyocardialInfarction', 'HeartDiseaseRiskFactors', 'Dyspnea']} name_for_cid[3714] = 'Thrombus' cid_concepts[3714] = \ {'SCT': ['PossibleThrombus', 'SevereThrombus', 'NoThrombus', 'DefiniteThrombus']} name_for_cid[6146] = 'TimePointTypes' cid_concepts[6146] = \ {'DCM': ['Posttreatment', 'Eligibility'], 'UMLS': ['Unscheduled', 'Baseline', 'Pretreatment', 'Nadir']} name_for_cid[7307] = 'ImplantComponentTypes' 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[31] = 'AbstractPriors' cid_concepts[31] = \ {'DCM': ['AtLastAppointment', 'OnDischargeFromUnit', 'OnDischarge', 'PostIntervention', 'PreIntervention', 'OnAdmissionToUnit'], 'SCT': ['Intraoperative', 'PreOperative', 'OnAdmission', 'PreAdmission', 'PreDose', 'PostOperative', 'PostDose']} name_for_cid[12238] = 'WallMotionScoringSchemes' cid_concepts[12238] = \ {'DCM': ['_5PointSegmentFindingScaleWithGradedHypokinesis', '_5PointSegmentFindingScale', '_4PointSegmentFindingScale']} name_for_cid[3850] = 'ContrastBolusSubstance' cid_concepts[3850] = \ {'DCM': ['NonIonicIodinatedContrastAgent'], 'SCT': ['MeglumineIodipamide', 'Iophendylate', 'Iodipamide', 'Ioxilan', 'Bunamiodyl', 'Ioversol', 'Gadodiamide', 'Metrizamide', 'Iodixanol', 'Ipodate', 'Oxygen', 'BariumSulfate', 'SodiumTyropanoate', 'Iohexol', 'Water', 'GadopentetateDimeglumine', 'SodiumAcetrizoate', 'Propyliodone', 'ContrastAgent', 'IodoalphionicAcid', 'Iodopyracet', 'SodiumDiprotrizoate', 'Iothalamate', 'Iodophthalein', 'Ioxaglate', 'MeglumineDiatrizoate', 'MangafodipirTrisodium', 'IodamideMeglumine', 'SodiumIodipamide', 'SodiumDiatrizoate', 'Diatrizoate', 'Saline', 'NonRadiopaqueMedium', 'ChloriodizedOil', 'IophenoxicAcid', 'Air', 'Iopamidol', 'Iopromide', 'IopanoicAcid', 'Dextran', 'Gadolinium', 'Metrizoate', 'IonicIodinatedContrastAgent', 'IodizedOil', 'CarbonDioxide', 'SodiumIodomethamate', 'LactatedRingerS']} name_for_cid[7110] = 'FiducialsCategories' cid_concepts[7110] = \ {'DCM': ['FiducialMark'], 'SCT': ['BodyReferencePointMarker', 'BodySurfacePoint', 'AnatomicalPoint']} name_for_cid[3503] = 'IndexedHemodynamicResistanceUnits' cid_concepts[3503] = \ {'UCUM': ['WoodUM2', 'DynScm5M2', 'PRUM2']} name_for_cid[3016] = 'MajorCoronaryArteries' cid_concepts[3016] = \ {'SCT': ['CircumflexCoronaryArtery', 'LeftAnteriorDescendingCoronaryArtery', 'RightCoronaryArtery', 'LeftMainCoronaryArtery']} name_for_cid[3446] = 'SkinCondition' cid_concepts[3446] = \ {'DCM': ['SkinConditionMottled', 'SkinConditionPale', 'SkinConditionDiaphoretic', 'SkinConditionFlush', 'SkinConditionDry', 'SkinConditionClammy', 'SkinConditionCool', 'SkinConditionCold', 'SkinConditionWarm']} name_for_cid[619] = 'AirwayManagementSubMethodCodeTypeforSmallAnimalAnesthesia' cid_concepts[619] = \ {'SCT': ['HighFrequencyVentilation', 'TranstrachealJetVentilation', 'ContinuousFlowVentilation'], 'UMLS': ['InverseRatioVentilation']} name_for_cid[6097] = 'SideofFamily' cid_concepts[6097] = \ {'DCM': ['Maternal'], 'SCT': ['Paternal']} name_for_cid[4100] = 'T1MeasurementMethods' cid_concepts[4100] = \ {'DCM': ['T1ByInversionRecovery', 'T1ByFixedValue', 'T1ByMultipleFlipAngles']} name_for_cid[8123] = 'MicroscopyIlluminationMethod' cid_concepts[8123] = \ {'DCM': ['DifferentialInterferenceContrast', 'TotalInternalReflectionFluorescence', 'TransmissionIllumination', 'ReflectionIllumination', 'EpifluorescenceIllumination', 'BrightfieldIllumination', 'DarkfieldIllumination', 'ObliqueIllumination', 'PhaseContrastIllumination']} name_for_cid[10069] = 'RadiationDoseEstimationParameter' 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[12111] = 'AbdominalArteries(Lateral)' cid_concepts[12111] = \ {'SCT': ['GastricArtery', 'OvarianArtery', 'AccessoryRenalArtery', 'UmbilicalArtery', 'TesticularArtery', 'UterineArtery']} name_for_cid[3554] = 'Ventilation' cid_concepts[3554] = \ {'SCT': ['PressureSupportVentilator', 'AmbuBag', 'VolumeSupportVentilator']} name_for_cid[9509] = 'PurposeofReferenceforRTPhysicianIntentInput' cid_concepts[9509] = \ {'DCM': ['HistoricalRTPrescription', 'RTPrescriptionInputImages', 'DiagnosticSourceImages', 'RegistrationResult', 'SegmentationResult'], 'LN': ['RelevantDiagnosticTestsAndOrLaboratoryData']} name_for_cid[3104] = 'CardiacSynchronizationTechnique' cid_concepts[3104] = \ {'DCM': ['ProspectiveGating', 'RealTimeAcquisition', 'Paced', 'RetrospectiveGating']} name_for_cid[3807] = 'VolumeMeasurementMethods' cid_concepts[3807] = \ {'DCM': ['VolumeBasedMethod', 'AreaBasedMethod', 'DiameterBasedMethod']} name_for_cid[7002] = 'DiagnosticImagingReportElements' cid_concepts[7002] = \ {'DCM': ['PreviousFinding', 'Conclusion', 'PatientPresentation', 'Summary', 'Recommendation', 'ProcedureDescription', 'Impression', 'Finding'], 'LN': ['History', 'Request'], 'SCT': ['ComplicationOfProcedure']} name_for_cid[12280] = 'CardiacUltrasoundTargetSites' cid_concepts[12280] = \ {'SCT': ['RightVentricleOutflowTract', 'LeftSuperiorPulmonaryVein', 'TransverseAorticArch', 'LeftInferiorPulmonaryVein', 'Effusion', 'RightSuperiorPulmonaryVein', 'RightPulmonaryArtery', 'PosteriorWall', 'PulmonaryVeinCommonRightSegment', 'PreductalRegionOfAorticArch', 'VenaContracta', 'PulmonaryVeinCommonLeftSegment', 'RightInferiorPulmonaryVein', 'PulmonaryVeinRightMiddleSegment', 'CardiacValveLeaflet', 'LeftVentricleOutflowTract', 'AnteriorWall', 'CardiacValveAnnulus', 'PulmonaryVeinConfluenceToAtriumConnection', 'PostductalRegionOfAorticArch', 'LeftPulmonaryArtery']} name_for_cid[7452] = 'OrganizationalRoles' 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[3411] = 'IntracoronaryDevices' cid_concepts[3411] = \ {'SCT': ['SalineThrombectomy', 'RotationalAtherectomyDevice', 'GuidingCatheter', 'PercutaneousTransluminalAngioplastyBalloon', 'GuideWire', 'IntracoronaryPressureGuideWire', 'IntravascularOpticalCoherenceTomographyDevice', 'CuttingBalloonAngioplastyCBADevice', 'Laser', 'IntracoronaryDopplerGuideWire', 'IntravascularUltrasoundIVUSDevice', 'RadiofrequencyAblationDevice', 'Stent', 'BrachytherapyDevice', 'TransluminalExtractionCatheterTEC', 'DirectionalCoronaryAtherectomyDCADevice']} name_for_cid[12003] = 'OBGYNDates' cid_concepts[12003] = \ {'LN': ['ConceptionDate', 'EstimatedLMPByEDD', 'EDDFromAverageUltrasoundAge', 'EDDFromOvulationDate', 'EDD', 'LMP', 'EDDFromLMP', 'OvulationDate']} name_for_cid[3738] = 'PreCathAnginaType' cid_concepts[3738] = \ {} 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', 'Wolf', '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[12279] = 'CardiacUltrasoundFetalGeneralMeasurements' cid_concepts[12279] = \ {'LN': ['OccipitalFrontalDiameter', 'FLAC', 'AbdominalCircumference', 'HeadCircumference', 'BiparietalDiameter', 'CephalicIndex', 'NuchalTranslucency', 'TransverseThoracicDiameter', 'ThoracicArea', 'TransCerebellarDiameter', 'HCAC', 'BPDAreaCorrected', 'TranverseAbdominalDiameter', 'CisternaMagna', 'FemurLength', 'ThoracicCircumference', 'LeftVentricleRightVentricleDiameterRatio', 'ForamenOvaleDiameterAorticRootDiameter', 'CardiacCircumferenceTransverseByUS', 'CardiothoracicAreaRatio', 'FLBPD', 'CardiacCrossSectionalAreaTransverseByUS', 'AnteriorPosteriorAbdominalDiameter', 'FLHC', 'AnteriorPosteriorTrunkDiameter', 'CardiothoracicCircumferenceRatio'], 'SCT': ['NumberOfUmbilicalArteries']} name_for_cid[7501] = 'NeighbouringGreyLevelDependenceBasedFeatures' cid_concepts[7501] = \ {} name_for_cid[7151] = 'SegmentationPropertyTypes' cid_concepts[7151] = \ {'BARI': ['_1stMarginalCoronaryArteryLaterals', '_2ndMarginalCoronaryArteryLaterals', '_3rdMarginalCoronaryArteryLaterals', 'RamusLaterals', '_3rdDiagonalCoronaryArteryLaterals', '_1stDiagonalCoronaryArteryLaterals', '_2ndDiagonalCoronaryArteryLaterals', 'PosteriorDescendingSeptalPerforators'], 'DCM': ['Phantom', 'AorticKnob', 'ArchOfTheAzygosVein', 'IonChamberArray', 'DiodeArray', 'LiquidIonChamber', 'Diode', 'IonChamber', 'OSLD', 'DiamondDetector', 'Portacath', 'ChestTube', 'CentralLine', 'KidneyStent', 'PancreaticStent', 'NippleRing', 'Coin', 'FiducialMark', 'RegistrationInput', 'Background', 'SurfaceOfTheChoroidScleraInterface', 'OuterSurfaceOfTheBM', 'OuterSurfaceOfTheCC', 'Mold', 'HeadAndNeckMask', 'HeadMask', 'Headframe', 'BodyFrame', 'BreastBoard', 'Cast', 'WholeBodyPod', 'VacuumMold', 'RectalBalloon', 'VaginalCylinder', 'PosteriorSurfaceOfTheRPE', 'SurfaceOfTheCenterOfTheRPE', 'OuterSurfaceOfIPL', 'OuterSurfaceOfGCL', 'OuterSurfaceOfOPL', 'OuterSurfaceOfINL', 'SurfaceBetweenInnerAndOuterSegmentsOfThePhotoreceptors', 'OuterSurfaceOfHFL', 'AnteriorSurfaceOfTheRPE', 'SurfaceOfTheInterdigitatingZoneBetweenRetinaAndRPE', 'OuterSurfaceOfRNFL', 'Sphere', 'OtherMarker', 'SecondaryPulmonaryLobule', 'SingleSubjectExtractedFromGroup', 'Hiatus', 'AzygoesophagealRecessInterface', 'ParaspinalLine', 'PosteriorTrachealStripe', 'RightTrachealStripe', 'Stripe', 'Lucency', 'MidlungWindow', 'CarinaAngle', 'CentrilobularStructures', 'AnteriorJunctionLine', 'PosteriorJunctionLine', 'Interface', 'Line', 'BrachytherapyChannelShield', 'BrachytherapySourceApplicator', 'BrachytherapyChannel'], 'FMA': ['ArcuateFasciculus'], 'NCIt': ['NonEnhancingLesion', 'ReferenceRegion', 'EnhancingLesion'], 'SCT': ['ProfundaFemorisVein', 'LeftHypochondriacRegion', 'SternocleidomastoidMuscle', 'Ligament', 'TruncusCoeliacus', 'InferiorLongitudinalFasciculus', 'WristJoint', 'IntermediateArteryRamus', 'GenicularArtery', 'LeftVentricleInflow', 'FontanelOfSkull', 'SigmoidColon', 'RightFemoralArtery', 'Intracranial', 'JawRegion', 'LobarArtery', 'DentalProsthesis', 'ThighPerforator', 'Pituitary', 'MidRightCoronaryArtery', 'UpperLimb', 'ExternalIliacVein', 'CongenitalPulmonaryArteriovenousFistula', 'DescendingAorta', 'ParietalBone', 'Cartilage', 'RightUpperQuadrantOfAbdomen', 'Eye', 'SuperficialPalmarArch', 'Prostate', 'FacialBones', 'Back', 'Duodenum', '_1stMarginalCoronaryArtery', 'Larynx', 'BonePin', 'PeronealVein', 'FemoralArtery', 'Ovary', 'Urethra', 'Head', 'AdrenalGland', 'MitralValve', 'Calyx', 'PosteriorMedialTributary', 'PulmonaryVein', 'ForeignBody', 'Submental', 'NucleusAccumbens', 'PoplitealFossa', 'PulmonaryArteryConduit', 'InternalCarotidArteryC5Segment', 'Nodule', 'LevatoresCostarumMuscles', 'FrontalLobe', 'Adventitia', 'Hypopharynx', 'RightCoronaryArteryOstium', 'HepaticVein', 'MarginalCoronaryArtery', 'InternalMammaryArtery', 'BronchialArtery', 'ExternalCarotidArtery', 'BiteBlock', 'Neoplasm', 'SystemicArtery', 'VomerBone', 'UterusAndFallopianTubes', 'CardiacPacemaker', 'Arachnoid', 'VenaCavaFilter', 'TarsalJoint', 'LingualArtery', 'NeoplasmSecondary', 'AirwayStructure', 'CongenitalCoronaryArteryFistulaToRightAtrium', 'DeltoidMuscle', 'CerebralFornix', 'Penis', 'Baffle', 'VentricularVein', 'UretericStent', 'Parathyroid', 'CervicoThoracicSpine', 'Scapula', 'Kidney', 'OmentalBursa', 'InternalCarotidArtery', 'RightPosteriorAVCoronaryArtery', 'FascialLayer', 'RenalPelvis', 'Thrombus', 'VenousNetwork', 'SubcostalMuscle', 'CommonAtrium', 'Ilium', 'InternalCarotidArteryC6Segment', 'AnteriorTibialArtery', 'CranialNerve', 'SkinOfAbdomen', 'ConnectiveTissue', 'CommonCarotidArtery', 'InnermostIntercostalMuscles', '_3rdMarginalCoronaryArtery', 'MastoidBone', 'CommonIliacArteryBifurcation', 'MiddleHepaticVein', 'Thigh', 'Trachea', 'LeftPosterolateralCircumflexCoronaryArtery', 'BodyConduit', 'Thalamus', 'RightVentricleInflow', 'LeftLowerQuadrantOfAbdomen', 'SpinalCerebrospinalFluidPathway', 'SesamoidBonesOfFoot', 'SixthLumbarArtery', 'BodyFluid', 'Omentum', 'SubmandibularGland', 'CarotidBifurcation', 'LeftLumbarRegion', 'InnominateArtery', 'FemaleInternalGenitalia', 'Extremity', 'FacialArtery', 'BoneStructureOfHeadAndOrNeck', 'EpigastricRegion', 'NeoplasmPrimary', 'DigitalImager', 'AbdominalCavity', 'TeresMinorMuscle', 'CommonFemoralVein', 'SubstantiaNigra', 'UpperInnerQuadrantOfBreast', 'ThoracicAorta', 'RightInguinalRegion', 'RightLowerQuadrantOfAbdomen', 'CockettPerforatingVein', 'LumboSacralSpine', 'RightMainBronchus', 'AVGrooveContinuationOfCircumflexArtery', 'Thumb', 'GreatCardiacVein', 'MiddleLobeOfRightLung', '_2ndLeftPosterolateralCoronaryArtery', 'MiddleCerebralArteryM2Segment', 'LacrimalBone', 'BasilicVein', 'HunterianPerforatingVein', 'ProfundaFemorisArtery', 'Pharynx', 'LigamentumArteriosum', 'Clothing', 'Nasopharynx', 'SuprapulmonicValveArea', 'SympatheticTrunk', 'LobeOfLung', 'OvarianVein', 'BrachialPlexus', 'ApexOfRightVentricle', 'LateralCalfPerforator', 'FourthLumbarArtery', 'ThirdLumbarArtery', 'LimbicLobe', 'SkinOfChest', 'PrimitiveAorta', 'LumenOfBloodVessel', 'Hemorrhage', 'AntecubitalVein', 'SpinalCordGrayMatter', 'Mandible', 'Parasternal', 'LeftMainBronchus', 'SystemicVein', 'OccipitalLobe', 'SubclavianArtery', 'Amygdala', '_3rdLeftPosterolateralCoronaryArtery', 'OpticChiasm', 'OphthalmicArtery', 'Nose', 'PancreaticDuct', 'Hand', 'PectoralisMajorMuscle', 'FemaleExternalGenitalia', 'OvarianArtery', 'Hippocampus', 'SuperficialFemoralVein', 'SuperiorLeftPulmonaryVein', 'LeftPosteriorDescendingCircumflexCoronaryArtery', 'BileDuct', 'SystemicCollateralArteryToLung', 'Skull', 'AtrioventricularVein', 'IDPlate', 'OpticRadiation', 'EndoNasopharyngeal', 'EsophagusStomachAndDuodenum', 'Breast', 'Meniscus', 'AxillaryFascia', 'PoplitealVein', 'EmbolizationCoil', 'PiaMater', 'TricuspidValve', 'RightAtrium', 'VascularSclerosis', 'DistalLeftAnteriorDescendingCoronaryArtery', 'InnerEar', 'Coccyx', 'AtrialSeptalDefect', 'DescendingAorta', 'ProximalLeftAnteriorDescendingCoronaryArtery', 'OccipitalBone', 'Bullet', 'Spine', 'Muscle', 'WhiteMatter', 'Zygoma', 'InnominateVein', 'RadioactiveImplant', 'Needle', 'JuxtaposedAtrialAppendage', 'Jejunum', 'CarotidBody', 'ChestAbdomenAndPelvis', 'RightHepaticVein', 'GastrocnemiusVein', 'Scalp', 'OrbitalStructure', 'LeftMainBranchOfPortalVein', 'BloodVessel', 'Sclera', 'AnteriorPosteriorCerebralArteryBifurcation', '_1stDiagonalCoronaryArtery', 'Perineum', 'InteratrialSeptum', 'Rectum', 'Femur', 'LeftAtrium', 'CerebralArtery', 'InferiorMesentericArtery', 'IliocostalisMuscle', 'LeftVentricularAssistDevice', 'CervicalSpine', 'IliacAndOrFemoralArtery', 'SpinalCordWhiteMatter', 'SmallIntestine', 'SuperiorRightPulmonaryVein', 'InferiorVenaCava', 'IntraArticular', 'Jewelry', 'Axilla', 'Thymus', 'ELMExternalLimitingMembrane', 'MeasuringRuler', 'ParietalLobe', 'IliacArtery', 'DistalRightCoronaryArtery', 'SubmandibularArea', 'PectoralisMinorMuscle', 'OpticCanal', 'SuperficialTemporalArtery', 'MedialLemniscus', 'InferiorCerebellarPeduncle', 'RightMainBranchOfPortalVein', 'SphenoidBone', 'Spleen', 'ChestAndAbdomen', 'LowerOuterQuadrantOfBreast', 'Mediastinum', 'Cerebellum', 'FirstLumbarArtery', 'PoplitealArtery', 'UpperUrinaryTract', 'PulmonaryVenousAtrium', 'EmbolizationParticulate', 'DorsalScapularArtery', 'LeftVentricle', 'AbdomenAndPelvis', 'CostalCartilage', 'SaphenousVein', 'Gallbladder', '_2ndRightPosterolateralCoronaryArtery', 'RenalArtery', 'PeritonealCavity', 'UpperArm', 'GastroduodenalArtery', 'Bile', 'AzygosVein', 'Liver', 'Rib', 'Stent', 'Implant', 'CommonFemoralArtery', 'SmallCardiacVein', 'SuperficialPalmarVenousArch', 'Vertebra', 'CongenitalCoronaryArteryFistulaToLeftAtrium', 'HilarArtery', 'Embolus', 'ApexOfLung', 'ThirdVentricle', '_3rdDiagonalCoronaryArtery', 'SpinalisMuscle', 'SaphenofemoralJunction', 'Anus', 'FrontalBone', 'Clip', 'CommonIliacVein', 'TrabeculaeCarnae', 'BoneScrew', 'PosteriorCerebralArteryP1Segment', 'LumbarSpine', 'ThyrocervicalTrunk', 'PrimitivePulmonaryArtery', 'HilumOfLung', 'SellaTurcica', 'Scrotum', 'InferiorLeftPulmonaryVein', 'LowerLeg', 'RenalVein', 'InternalIliacVein', 'IlealVein', 'Toe', 'Skin', 'Laser', 'MiddleCardiacVein', 'MiddleCerebralArtery', 'PosteriorDescendingRightCoronaryArtery', 'CompressionPaddle', 'CorpusStriatum', 'Adenohypophysis', 'PosteriorTibialVein', 'MuscleOfLowerLimb', 'AscendingAorta', 'LeftUpperQuadrantOfAbdomen', 'PericardiophrenicArtery', 'CardiacPacemaker', 'ExternalAuditoryCanal', 'Patella', 'OccipitalVein', 'BasilarArtery', 'ParanasalSinus', 'BrainCerebrospinalFluidPathway', 'MidCircumflexCoronaryArtery', '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', 'HepaticArtery', 'Tracheotomy', 'PeronealArtery', 'Staple', 'RightHypochondriacRegion', 'SuperiorMesentericVein', 'LumbarArtery', 'Cornea', 'PercutaneousTransluminalAngioplastyBalloon', 'ThoracoLumbarSpine', 'CoronaryArteryGraft', 'AcromioclavicularJoint', 'UmbilicalRegion', 'SupraspinatusMuscle', 'CongenitalCoronaryArteryFistulaToRightVentricle', 'SoftPalate', 'ExternalIntercostalMuscle', 'CranialVenousSystem', 'GiacominiVein', 'Glue', 'MiddleCerebellarPeduncle', 'BloodClot', 'MOSFETRadiationTherapyDosimetrySystemDosimeter', 'FissureOfLung', 'RightVentricle', 'VagusNerve', 'Abdomen', 'HeadAndNeck', 'PelvisAndLowerExtremities', 'Bladder', 'Vulva', 'LargeIntestine', 'EntorhinalCortex', 'Forearm', 'NeckChestAndAbdomen', 'SuperiorMesentericArtery', 'TemporalLobe', 'PosteriorTibialArtery', 'FemoralVein', 'RightAuricularAppendage', 'GreatSaphenousVeinOfThigh', 'LeftHepaticVein', 'DetachableBalloon', 'AbdominalWallMuscle', 'SuperficialFemoralArtery', 'JWire', '_2ndMarginalCoronaryArtery', 'SuperiorCerebellarPeduncle', 'AorticArch', 'Carina', 'Telencephalon', 'LeftBranchOfHepaticArtery', 'ArcuateArteryOfTheKidney', 'Heart', 'CephalicVein', 'Lip', 'GastricVein', 'LeftMainCoronaryArtery', 'InferiorRightHepaticVein', 'CarotidSiphon', 'SystemicVenousAtrium', 'PlantarArterialArch', 'AnomalousPulmonaryVein', 'LeftMainCoronaryArteryOstium', 'LesserSaphenousVein', 'AutonomicNerve', 'GreatSaphenousVein', 'Necrosis', 'Ureter', 'UlnarVein', 'AorticValve', 'MiddleEar', 'InternalAuditoryCanal', 'RightPulmonaryArtery', 'ProperHepaticArtery', 'InterlobarArteryOfKidney', 'CorpusCallosum', 'PerforatingArteryOfKidney', 'Humerus', 'AorticFistula', 'ILMInternalLimitingMembrane', 'NasalBone', 'Collimator', 'Mass', 'Cervix', 'LeftAnteriorDescendingCoronaryArtery', 'Artery', 'Buttock', 'FallopianTube', 'Vein', 'CerebrospinalFluid', 'EsophagealArtery', 'RadialVein', 'InferiorRightPulmonaryVein', 'PulmonaryValveSinuses', 'UterineArtery', 'Gas', 'EndoVesical', 'MesentericArtery', 'MuscleOfHead', 'MiddleCerebralArteryM1Segment', 'InternalIliacArtery', 'SuperiorVenaCava', 'FeedingTube', 'Urine', 'PosteriorArchVein', 'AnteriorSpinalArtery', 'AnusRectumAndSigmoidColon', 'SplenicVein', 'Colon', 'CentralNervousSystem', 'SplenicArtery', 'AccessoryRenalArtery', 'Media', 'BBShotLeadPellet', 'SeminalVesicle', 'Headrest', 'DistalCircumflexCoronaryArtery', 'Feces', 'BoneOfUpperLimb', 'DorsalisPedisArtery', 'Vagina', 'LongissimusMuscle', 'LowerInnerQuadrantOfBreast', 'Clavicle', 'ParotidGland', 'AorticIsthmus', 'Capillary', '_1stLeftPosterolateralCoronaryArtery', 'Subxiphoid', 'Diaphragm', 'VasDeferens', 'AxillaryArtery', 'LeftPulmonaryArtery', 'Ileum', 'SalivaryGland', 'VertebralArtery', 'TransjugularIntrahepaticPortosystemicShunt', 'SupraRenalAorta', 'InternalJugularVein', 'LacrimalArteryOfRightEye', 'ChordaeTendineaeCordis', 'OpaqueMarker', 'SacroiliacJoint', 'ScalenousAnteriorMuscle', 'CardiacPacemakerLead', 'EntireBody', 'TesticularArtery', 'HypogastricRegion', 'RightLumbarRegion', 'HyoidBone', 'ThoracicDuct', 'AtherectomyDevice', 'BoydPerforatingVein', 'Organ', 'Peritioneum', 'CommonIliacArtery', 'SupraclavicularRegionOfNeck', 'Meninges', 'Shoulder', 'TransversusThoracis', 'VascularGraft', 'CerebellarWhiteMatter', 'InterventricularSeptum', 'Cingulum', 'LowerLobeOfLung', 'TesticularVein', 'AnteriorTibialVein', 'LeftInguinalRegion', 'RightCoronaryArtery', 'Edema', 'IntraPelvic', 'Putamen', 'CostocervicalTrunk', 'FifthLumbarArtery', 'AxillaryVein', 'SubclavianVein', 'PulmonaryValve', 'ExternalIliacArtery', 'ProximalRightCoronaryArtery', 'TemporalBone', 'BoneOfLowerLimb', 'Midbrain', 'PosteriorCerebralArtery', 'ErectorSpinaeMuscle', 'DeepPalmarVenousArch', 'Mouth', 'PharynxAndLarynx', 'CarotidArtery', 'SmallestCardiacVein', 'UmbilicalArtery', 'BuccalRegionOfFace', 'EndotrachealTube', 'LymphNode', 'RadialArtery', 'LeftFemoralArtery', 'TrapeziusMuscle', 'Esophagus', 'RotationalAtherectomyDevice', 'LateralCorticospinalTract', 'BroadLigament', 'CerebralAqueduct', 'Insula', 'PulmonaryVein', 'MuscleOfNeck', 'Lung', 'HeartValveProsthesis', 'CardiovascularSystem', 'Chest', 'ElbowJoint', 'Sternum', 'NeckAndChest', 'RightVentricleOutflowTract', 'GlobusPallidus', 'UpperOuterQuadrantOfBreast', 'PancreaticDuctAndBileDuctSystems', 'ApexOfLeftVentricle', 'PericardialCavity', 'PulmonaryArtery', 'Defibrillator', 'MidLeftAnteriorDescendingCoronaryArtery', 'Thyroid', 'EthmoidBone', 'InfraRenalAorta', 'SternoclavicularJoint', 'Neck', 'CarotidBulb', 'Finger', 'InlayDentalRestoration', 'InfraspinatusMuscle', 'SuperiorPhrenicArtery', 'CommonVentricle', 'RightPulmonaryVein', 'Catheter', 'BodyFat', 'Uterus', 'TemporomandibularJoint', 'Ventricle', 'Nerve', 'TracheaAndBronchus', 'Testis', 'Eyeball', 'Face', 'Tissue', 'UrinarySystem', 'BrainStem', 'Foot', 'MuscleOfUpperLimb', 'PeripheralNervousSystem', 'PinealGland', 'UpperLobeOfLung', 'Inflammation', 'ProximalCircumflexCoronaryArtery', 'LowerLimb', 'PosteriorCommunicationArtery', 'VertebralColumnAndCranium', 'AbdominalAorta', 'Bone', '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', 'MaleExternalGenitalia', 'RetroperitonealSpace', 'AnteriorMiddleCerebralArteryBifurcation', 'SuperiorThyroidArtery', 'CerebralCortex', 'TruncusArteriosusCommunis', 'Tooth', 'Joint', 'GreatSaphenousVeinOfCalf', 'LeftPulmonaryVein', 'Aorta', 'Diencephalon', 'CongenitalCoronaryArteryFistulaToLeftVentricle', 'NeckChestAbdomenAndPelvis', 'LatissimusDorsiMuscle', 'CervicalCollar', 'CommonHepaticArtery', 'AnkleJoint', 'Bronchus', 'Pelvis', 'PulmonaryChamberOfCorTriatriatum', 'UlnarArtery', 'LumbarRegion', 'ThoracicSpine', 'FourthVentricle', 'OpticTract', 'HipJoint', 'TrunkOfPulmonaryArtery', 'Abscess', 'BrachialArtery', '_2ndDiagonalCoronaryArtery', 'HipJoint', 'SerratusAnteriorMuscle', 'Chair', 'LymphaticSystem', 'Stomach', 'CircumflexCoronaryArtery', 'AnteriorCommunicatingArtery', 'InferiorMesentericVein', 'MedianCubitalVein', 'CoronarySinus', 'Tendon', 'TerminalInternalCarotidArtery', 'Atrium', 'CerebralWhiteMatter', 'Knee', 'Cyst', 'SubarachnoidSpace', 'PulmonaryVeinConfluence', 'GuidingCatheter', 'EyeRegion', 'ThermoluminescentRadiationDosimeter', 'BrainVentricle', 'UmbilicalVein', 'InguinalRegion', '_3rdRightPosterolateralCoronaryArtery', 'EndoNasal', 'InferiorPhrenicArtery', 'JejunostomyTube', 'PortalVein', 'PosteriorCerebralCommissure', 'UncinateFasciculus', 'AnteriorCerebralArtery', 'Ear', 'LymphaticVessel', 'SpinalCord', 'Pericardium', 'PosteriorCerebralArteryP2Segment', 'LeftAuricularAppendage', 'CircleOfWillis', 'SaphenopoplitealJunction', '_1stSeptalCoronaryArtery', 'Eyelid', 'DeepPalmarArchOfRadialArtery', 'Pleura', 'Subcostal', 'Intima', 'SegmentOfLung', 'DoddPerforatingVein']} name_for_cid[3112] = 'AttenuationCorrection' cid_concepts[3112] = \ {'DCM': ['CTBasedAttenuationCorrection', 'NoAttenuationCorrection', 'AlgorithmicAttenuationCorrection', 'NMTransmissionAttenuationCorrection']} name_for_cid[4268] = 'CornealTopographyMapValueType' cid_concepts[4268] = \ {'DCM': ['CornealAxialPowerMap', 'CornealInstantaneousPowerMap', 'CornealRefractivePowerMap', 'CornealElevationMap', 'CornealWavefrontMap']} name_for_cid[3407] = 'PurposeofReferencetoObject' cid_concepts[3407] = \ {'DCM': ['PriorReportForCurrentPatient', 'PreProcedureLog', 'AnalysisOrMeasurementsForCurrentProcedure']} name_for_cid[7014] = 'ExportAdditionalInformationDocumentTitles' cid_concepts[7014] = \ {'DCM': ['ForTeachingFileExport', 'ForClinicalTrialExport', 'ForPublicationExport', 'ForResearchCollectionExport']} name_for_cid[12015] = 'FetalGrowthEquationsandTables' cid_concepts[12015] = \ {'LN': ['CRLByGAShinozuka1996', 'CRLByGARempen1991', 'FLByGAHadlock1984', 'HCACByGACampbell1977', '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']} name_for_cid[8] = 'AngiographicInterventionalDevices' cid_concepts[8] = \ {'DCM': ['Sphere'], 'SCT': ['RotationalAtherectomyDevice', 'GuidingCatheter', 'Glue', 'EmbolizationBall', 'PercutaneousTransluminalAngioplastyBalloon', 'AtherectomyDevice', 'EmbolizationCoil', 'EmbolizationParticulate', 'Laser', 'Catheter', 'MeasuringRuler', 'Stent', 'DetachableBalloon']} name_for_cid[6039] = 'NippleCharacteristic' cid_concepts[6039] = \ {'SCT': ['NormalShape', 'NippleRetraction']} name_for_cid[3515] = 'SpecimenCollection' cid_concepts[3515] = \ {'SCT': ['BloodSamplingFromExtracorporealBloodCircuit', 'SpecimenCollection', 'CollectionOfBloodSpecimenForLaboratory']} name_for_cid[6202] = 'ColonFindingorFeatureModifier' cid_concepts[6202] = \ {'DCM': ['ChestTube', 'KidneyStent', 'PancreaticStent', 'Coin', 'FiducialMark'], 'SCT': ['JejunostomyTube', 'Suture', 'Lung', 'IleostomyBag', 'ColostomyBag', 'VenaCavaFilter', 'UrostomyBag', 'UrostomySet', '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', 'ColostomySet', 'Liver', 'Spleen', 'Kidney', 'AdrenalGland', 'IleostomySet']} name_for_cid[3000] = 'AudioChannelSource' cid_concepts[3000] = \ {'DCM': ['PhysiologicalAudioSignal', 'Phonocardiogram', 'OperatorNarrative', 'Voice', 'DopplerAudio', 'AmbientRoomEnvironment']} name_for_cid[6081] = 'BreastCancerRiskFactors' 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[9231] = 'WorkitemDefinition' cid_concepts[9231] = \ {'DCM': ['NoSubsequentWorkitems', 'AddAddendumToReport', 'Print', 'ReportVerification', 'Transcription', 'Interpretation', 'ComputerAidedDetection', 'ComputerAidedDiagnosis', 'QualityControl', 'MediaImport', 'ImageProcessing']} name_for_cid[12107] = 'UpperExtremityArteries' cid_concepts[12107] = \ {'SCT': ['BrachialArtery', 'InnominateArtery', 'SuperficialPalmarArch', 'UlnarArtery', 'DigitalArteryOfHand', 'RadialArtery', 'SubclavianArtery', 'DeepPalmarArchOfRadialArtery', 'AxillaryArtery']} 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[9303] = 'InterpretationRequestDiscontinuationReasons' cid_concepts[9303] = \ {'DCM': ['ResourcePreEmpted', 'PatientDied', 'IncorrectProcedureOrdered', 'DiscontinuedForUnspecifiedReason', 'ObjectSetIncomplete', 'DoctorCanceledProcedure', 'DuplicateOrder', 'InterpretationRequiresSpecialistExpertise', 'InsufficientQualityForInterpretation', 'WorkitemAssignmentRejectedByAssignedResource', 'ChangeOfProcedureForCorrectCharging']} name_for_cid[10008] = 'DoseRelatedDistanceMeasurements' cid_concepts[10008] = \ {'DCM': ['DistanceSourceToTablePlane', 'DistanceSourceToDetector', 'TableHeightEndPosition', 'TableLateralEndPosition', 'TableLateralPosition', 'TableLongitudinalPosition', 'TableXEndPositionToIsocenter', 'TableZPositionToIsocenter', 'TableZEndPositionToIsocenter', 'TableYPositionToIsocenter', 'TableXPositionToIsocenter', 'TableHeightPosition', 'TableYEndPositionToIsocenter', 'DistanceSourceToIsocenter', 'DistanceSourceToReferencePoint', 'TableLongitudinalEndPosition']} name_for_cid[12035] = 'UltrasoundTransducerApplication' cid_concepts[12035] = \ {'DCM': ['ExternalTransducer', 'IntravascularTransducer', 'EndorectalTransducer', 'EndovaginalTransducer', 'TransesophagealTransducer']} name_for_cid[3427] = 'EquipmentEvents' cid_concepts[3427] = \ {'DCM': ['EquipmentFailure', 'EquipmentRemoved', 'EquipmentBroughtToProcedureRoom', 'EquipmentReady']} name_for_cid[7464] = 'GeneralRegionofInterestMeasurementModifiers' cid_concepts[7464] = \ {'DCM': ['Skewness', 'Kurtosis', 'PeakValueWithinROI'], 'SCT': ['StandardDeviation', 'Mode', 'Minimum', 'Maximum', 'Total', 'Mean', 'Median'], 'UMLS': ['CoefficientOfVariance', 'Variance', 'RootMeanSquare']} name_for_cid[228] = 'EquationorTable' cid_concepts[228] = \ {'DCM': ['TableOfValues', 'TableOfValuesCitation', 'MethodCitation', 'Equation', 'EquationCitation']} name_for_cid[12259] = 'CardiacUltrasoundVentriclesMeasurements' 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', '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[3831] = 'StenosisLength' cid_concepts[3831] = \ {'SCT': ['Long', 'Short']} name_for_cid[93] = 'JointPositioningMethod' cid_concepts[93] = \ {'SCT': ['PassiveMovement', 'ManipulationOfJoint']} name_for_cid[8115] = 'SpecimenEmbeddingMedia' cid_concepts[8115] = \ {'SCT': ['EpoxyResin', 'AcrylicResin', 'TissueFreezingMedium', 'ParaffinWax', 'Plastic', 'Agar']} name_for_cid[7063] = 'ModelScaleUnits' cid_concepts[7063] = \ {'UCUM': ['mm', 'M', 'cm', 'um']} name_for_cid[3470] = 'VesselLumenCrosssectionalAreaCalculationMethods' cid_concepts[3470] = \ {'DCM': ['DensitometricMethod', 'CircularMethod']} name_for_cid[85] = 'SUVUnits' cid_concepts[85] = \ {'UCUM': ['StandardizedUptakeValueIdealBodyWeight', 'StandardizedUptakeValueBodySurfaceArea', 'StandardizedUptakeValueLeanBodyMassJanma', 'StandardizedUptakeValueBodyWeight', 'StandardizedUptakeValueLeanBodyMassJames', 'StandardizedUptakeValueLeanBodyMassJames128Multiplier']} name_for_cid[6058] = 'ProcedureModifiersforBreast' cid_concepts[6058] = \ {'DCM': ['SalineImplant', 'PolyurethaneImplant', 'PercutaneousSiliconeInjection', 'CombinationImplant', 'PrePectoralImplant', 'NeedleLocalizationAndBiopsy', 'RetroPectoralImplant', 'MarkerPlacement', 'Mammographic', 'Mammographic', 'PalpationGuided', 'Targeted', 'Survey', 'VacuumAssisted', 'Calibration', 'QualityControl'], 'SCT': ['Lumpectomy', 'TissueDopplerImaging', 'BreastImplantTypeNotSpecified', '_3DMode', '_2DMode', 'Mammography', 'DopplerContinuousWave', 'MagneticResonanceImagingGuidedBiopsy', 'Diagnostic', 'QuadrantectomyOfBreast', 'SiliconeGelImplant', 'DopplerPulsed', 'MMode', 'DiagnosticRadiographyStereotacticLocalization', 'Screening', 'PowerDoppler', 'UltrasonicGuidanceProcedure', 'DopplerColorFlow', 'ComputedTomographyGuidedBiopsy'], 'UMLS': ['Mastectomy']} name_for_cid[8103] = 'AnatomicPathologySpecimenTypes' cid_concepts[8103] = \ {'SCT': ['SpecimenFromBreastObtainedByExcision', 'SmearSample', 'Aspirate', 'SpecimenFromBreastObtainedByTotalMastectomy', 'SegmentectomyBreastSample', 'BreastTruCutBiopsySample', 'BodySubstanceSample', 'TissueSection', 'SpecimenFromBreastObtainedByImageGuidedCoreBiopsy', 'TissueSpot', 'LumpectomyBreastSample', 'LiquidBasedCytologicMaterial', 'BreastDuctSample', 'SpecimenFromBreastStereotacticallyGuidedCoreNeedleBiopsy', 'TissueSpecimen', 'GeneticSample', 'SpecimenFromBreastObtainedByCoreNeedleBiopsy', 'CoreSampleOfTissueBlock', 'BodyFluidSample', 'FrozenSectionBreastSample', 'TouchPreparationCytologicMaterial', 'Slide', 'EntireBody', 'SpecimenFromBreastByIncisionalBiopsyOfBreastMass', 'GrossSpecimen']} 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[3466] = 'PlaneIdentification' cid_concepts[3466] = \ {'SCT': ['AnteroPosterior', 'LeftAnteriorOblique', 'LeftLateral', 'CaudalRAO', 'RightAnteriorOblique', 'CranialRAO', 'CaudalLAO', 'CranialLAO']} name_for_cid[639] = 'TumorGraftHistologicType' cid_concepts[639] = \ {'NCIt': ['BronchioloalveolarAdenocarcinoma'], 'SCT': ['NonSmallCellCarcinoma', 'RenalCellCarcinoma', 'SquamousCellCarcinoma', 'AmelanoticMelanoma', 'SpindleCellCarcinoma', 'Glioblastoma', 'Adenocarcinoma', 'Carcinosarcoma', 'MixedSmallCellCarcinoma', 'Carcinoma', 'Leukemia', 'InfiltratingDuctalCarcinomaOfBreast', 'Mesothelioma', 'Cystadenocarcinoma', 'LargeCellCarcinoma', 'Astrocytoma', 'Melanoma', 'Osteosarcoma', 'Sarcoma', 'SmallCellCarcinoma']} name_for_cid[12218] = 'EchocardiographyCongenital' 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', 'SystolicToDiastolicVelocityRatio', 'EFSlope', 'PeakReversalVelocityDuringAtrialContraction', 'TimeAveragedMeanVelocity'], 'SCT': ['MajorAxis', 'RegurgitantFraction', 'Radius', 'MinorAxis', 'Diameter', 'CardiovascularOrificeArea', 'CardiovascularOrificeDiameter', 'Length', 'Circumference']} name_for_cid[3489] = 'CalciumDistribution' cid_concepts[3489] = \ {'SCT': ['Deep', 'Superficial']} name_for_cid[4032] = 'MRSpectroscopyMetabolites' cid_concepts[4032] = \ {'DCM': ['CreatineCholineCitrateRatio', 'GlutamateAndGlutamine', 'CholineCreatineRatio', 'NAcetylaspartateCreatineRatio', 'CreatineAndCholine', 'NAcetylaspartateCholineRatio', 'LipidAndLactate'], 'SCT': ['Inositol', 'Citrate', 'Choline', 'Creatine', 'Lactate', 'Glutamine', 'NAcetylaspartate', 'Lipid', 'Tuarine']} name_for_cid[9250] = 'ScheduledProcessingParameterConceptCodesforRTTreatment' cid_concepts[9250] = \ {'DCM': ['TreatmentDeliveryType']} name_for_cid[402] = 'AuditActiveParticipantRoleIDCode' cid_concepts[402] = \ {'DCM': ['SourceMedia', 'DestinationMedia', 'SourceRoleID', 'DestinationRoleID', 'ApplicationLauncher', 'Application']} name_for_cid[12023] = 'PelvisandUterusAnatomicSites' cid_concepts[12023] = \ {'SCT': ['Endometrium', 'Cervix', 'Uterus']} name_for_cid[3718] = 'MyocardialWallSegmentsinProjection' cid_concepts[3718] = \ {'SCT': ['MyocardiumOfPosterolateralRegion', 'MyocardiumOfApexOfHeart', 'MyocardiumOfInferolateralRegion', 'LeftVentricleBasalLateralSegment', 'LeftVentricularBasalSeptalSegment', 'LeftVentricleBasalAnteriorSegment', 'LeftVentricleApicalSeptalSegment', 'MyocardiumOfDiaphragmaticRegion', 'LeftVentricleBasalInferiorSegment', 'LeftVentricularPosterobasalSegment', 'MyocardiumOfAnterolateralRegion']} name_for_cid[7022] = 'RadiotherapyPurposesofReference' cid_concepts[7022] = \ {'DCM': ['RegistrationCreatedDuringTreatment', 'RTTreatmentPlanForThePositionBeingVerified', 'RegistrationUsedInPlanning']} name_for_cid[7472] = 'VolumeMeasurements' cid_concepts[7472] = \ {'DCM': ['VolumeEstimatedFromThreeOrMoreNonCoplanar2DRegions', 'VolumeEstimatedFromTwoNonCoplanar2DRegions', 'VolumeEstimatedFromSingle2DRegion', 'VolumeOfSphere', 'VolumeOfCircumscribedSphere', 'VolumeOfEllipsoid', 'VolumeOfBoundingThreeDimensionalRegion'], 'SCT': ['Volume']} name_for_cid[9529] = 'SingleDoseDosimetricObjectives' cid_concepts[9529] = \ {'DCM': ['MinimumRadiationDose', 'MaximumSurfaceRadiationDose', 'MinimumSurfaceRadiationDose', 'MinimumEquivalentUniformDose', 'MaximumMeanRadiationDose', 'MinimumMeanRadiationDose', 'MaximumRadiationDose', 'PrescriptionRadiationDose', 'MaximumEquivalentUniformDose']} name_for_cid[7167] = 'PeripheralNervousSystemSegmentationTypes' cid_concepts[7167] = \ {'SCT': ['CranialNerve', 'PeripheralNervousSystem', 'PeripheralNerve', 'VagusNerve', 'AutonomicNerve', 'SympatheticTrunk']} name_for_cid[3827] = 'VesselSegments' 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', 'SuperficialPalmarArch', 'OvarianArtery', 'PeronealArtery', 'SuperficialFemoralVein', 'LeftPosteriorDescendingCircumflexCoronaryArtery', 'SuperiorLeftPulmonaryVein', '_1stMarginalCoronaryArtery', 'SuperiorMesentericVein', 'LumbarArtery', 'PeronealVein', 'MidLeftAnteriorDescendingCoronaryArtery', 'AtrioventricularVein', 'CoronaryArteryGraft', 'InfraRenalAorta', 'PulmonaryVein', 'CarotidBulb', 'PoplitealVein', 'GiacominiVein', 'InternalCarotidArteryC5Segment', 'DistalLeftAnteriorDescendingCoronaryArtery', 'RightPulmonaryVein', 'RightCoronaryArteryOstium', 'MarginalCoronaryArtery', 'HepaticVein', 'ProximalLeftAnteriorDescendingCoronaryArtery', 'ExternalCarotidArtery', 'SuperiorMesentericArtery', 'PosteriorTibialArtery', 'GreatSaphenousVeinOfThigh', 'LeftHepaticVein', 'InnominateVein', 'SuperficialFemoralArtery', 'ProximalCircumflexCoronaryArtery', '_2ndMarginalCoronaryArtery', 'PosteriorCommunicatingArtery', 'LeftBranchOfHepaticArtery', 'ArcuateArteryOfTheKidney', 'RightHepaticVein', 'GastrocnemiusVein', 'CephalicVein', 'GastricVein', 'LeftMainCoronaryArtery', 'LeftMainBranchOfPortalVein', 'InferiorRightHepaticVein', 'VentricularVein', 'CarotidSiphon', 'PlantarArterialArch', 'AnteriorPosteriorCerebralArteryBifurcation', 'AtrialVein', '_1stDiagonalCoronaryArtery', 'AnteriorCardiacVein', 'LeftMainCoronaryArteryOstium', 'LesserSaphenousVein', 'InferiorMesentericArtery', 'DigitalArteryOfHand', 'GreatSaphenousVein', 'SecondLumbarArtery', '_1stRightPosterolateralCoronaryArtery', 'InternalCarotidArtery', 'RightPosteriorAVCoronaryArtery', 'UlnarVein', 'SuperiorRightPulmonaryVein', 'InferiorVenaCava', 'ProperHepaticArtery', 'InterlobarArteryOfKidney', 'AnteriorMiddleCerebralArteryBifurcation', 'PerforatingArteryOfKidney', 'InternalCarotidArteryC6Segment', 'DistalRightCoronaryArtery', 'AnteriorTibialArtery', 'LeftAnteriorDescendingCoronaryArtery', 'CommonCarotidArtery', 'GreatSaphenousVeinOfCalf', 'LeftPulmonaryVein', '_3rdMarginalCoronaryArtery', 'Aorta', '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', '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[10065] = 'RadiationTransportModelType' cid_concepts[10065] = \ {'DCM': ['MeasuredRadiationDose', 'VoxelizedRadiationTransportModel', 'GeometricRadiationTransportModel', 'NURBSRadiationTransportModel', 'MeshRadiationTransportModel', 'BREPRadiationTransportModel']} name_for_cid[6131] = 'ChestTextureDescriptor' cid_concepts[6131] = \ {'DCM': ['Inhomogeneous', 'Homogeneous']} name_for_cid[300] = 'MultienergyRelevantMaterials' cid_concepts[300] = \ {'SCT': ['Silicon', 'Yttrium', 'Iron', 'Iodine', 'UricAcid', 'CobaltChromiumAlloy', 'Silicone', 'Hafnium', 'Tantalum', 'Water', 'Fat', 'Gold', 'Calcium', 'Barium', 'Gadolinium', 'RenalStone', 'NickelCobaltChromium', 'Bismuth', 'CalciumHydroxyapatite', 'Titanium', 'Platinum', 'Silver', 'AluminumOxide']} name_for_cid[12234] = 'RespirationState' cid_concepts[12234] = \ {'SCT': ['Expiration', 'Inspiration']} name_for_cid[245] = 'LateralitywithMedian' cid_concepts[245] = \ {'DCM': ['Median'], 'SCT': ['Bilateral', 'Right', 'Left', 'Unilateral']} name_for_cid[615] = 'AnesthesiaMaintenanceCodeTypeforSmallAnimalAnesthesia' cid_concepts[615] = \ {'SCT': ['InhalationAnesthesiaSystemClosedRebreathingPrimaryAgent', 'InhalationAnesthesiaSystemClosedNoRebreathingPrimaryAgent']} name_for_cid[6166] = 'CADGeometrySecondaryGraphicalRepresentation' cid_concepts[6166] = \ {'DCM': ['OrthogonalLocationArcInnerMargin', 'OrthogonalLocationArcOuterMargin', 'OutlineOfLobulations', 'InnerLimitsOfFuzzyMargin', 'OuterLimitsOfFuzzyMargin', 'OutlineOfSpiculations', 'LinearSpiculation', 'PixelatedSpiculations', 'OrthogonalLocationArc'], 'SCT': ['LongAxis', 'ShortAxis']} name_for_cid[11] = 'RouteofAdministration' cid_concepts[11] = \ {'DCM': ['RetroOrbitalRoute'], 'NCIt': ['IntraepithelialRoute', 'ExtraluminalRoute', 'TransluminalRoute'], 'SCT': ['IntramedullaryRoute', 'IntraluminalRoute', 'TopicalRoute', 'IntrathecalRoute', 'OralRoute', 'IntramuscularRoute', 'NasalRoute', 'PerRectum', 'IntratumorRoute', 'IntravenousRoute', 'SubcutaneousRoute', 'IntraperitonealRoute', 'ByInhalation', 'VaginalRoute', 'IntraArterialRoute', 'IntraArticularRoute', 'IntracardiacRoute', 'IntraventricularRouteCardiac', 'IntracutaneousRoute', 'IntracoronaryRoute']} name_for_cid[10032] = 'ProjectionXRayAcquisitionDeviceTypes' cid_concepts[10032] = \ {'DCM': ['CassetteBasedProjectionRadiographySystem', 'IntegratedProjectionRadiographySystem', 'FluoroscopyGuidedProjectionRadiographySystem']} name_for_cid[7262] = 'DiffusionTractographyAlgorithmFamilies' cid_concepts[7262] = \ {'DCM': ['Deterministic', 'Probabilistic', 'Global', 'FACT', 'Streamline', 'TEND', 'Bootstrap', 'Euler', 'RungeKutta']} name_for_cid[3671] = 'ReasonforECGExam' cid_concepts[3671] = \ {'SCT': ['PreSurgeryTesting', 'RoutineProcedure', 'EmergencyDepartmentPatientVisit', 'EmergencyProcedure', 'ProcedureInCardiacCareUnit', 'EvaluationOfMurmur', 'OutpatientProcedure']} name_for_cid[6023] = 'SidefromBIRADS®' cid_concepts[6023] = \ {'SCT': ['LeftBreast', 'RightBreast', 'BothBreasts']} name_for_cid[3221] = 'StressTestTerminationReasons' cid_concepts[3221] = \ {'SCT': ['HypotensiveEpisode', 'EndOfProtocol', 'Arrhythmia', 'TargetHeartRateAchieved', 'Claudication', 'ChestPain', 'Syncope', 'AbnormalECG', 'Fatigue', 'PatientRefusedExerciseTest', 'Dyspnea', 'HypertensiveEpisode']} name_for_cid[12263] = 'CardiacUltrasoundVenousReturnPulmonaryMeasurements' 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', '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[3108] = 'NM/PETProcedures' cid_concepts[3108] = \ {'SCT': ['PETBrainStudy', 'PETHeartStudy', 'RadioisotopeStudyOfRespiratorySystem', 'PETStudyForLocalizationOfTumor', 'RadioisotopeStudyOfGenitourinarySystem', 'PETBreastStudy', 'RadioisotopeStudyOfMusculoskeletalSystem', 'RadioisotopeStudyOfHematopoieticSystem', 'NuclearMedicineDiagnosticProcedureOnNervousSystem', 'RadioisotopeStudyOfGastrointestinalSystem', 'NuclearMedicineCardiovascularStudy', 'RadioisotopeStudyOfEndocrineSystem', 'RadionuclideStudyForLocalizationOfInflammatoryDisease', 'RadionuclideLocalizationOfTumor']} name_for_cid[9505] = 'FixationorPositioningDevices' cid_concepts[9505] = \ {'DCM': ['RectalBalloon', 'Mold', 'HeadAndNeckMask', 'HeadMask', 'Headframe', 'VaginalCylinder', 'BodyFrame', 'BreastBoard', 'Cast', 'WholeBodyPod', 'VacuumMold'], 'SCT': ['Chair', 'Headrest', 'BiteBlock', 'Table']} name_for_cid[4272] = 'OPTScanPatternTypes' cid_concepts[4272] = \ {'DCM': ['GridBScanPattern', 'CircleRadialBScanPattern', 'CubeBScanPattern', 'RasterBScanPattern', 'RadialBScanPattern', 'LineBScanPattern', 'CircleBScanPattern', 'CrossBScanPattern', 'CircleRasterBScanPattern', 'ConcentricCircleBScanPattern']} name_for_cid[642] = 'Cytokines' cid_concepts[642] = \ {'SCT': ['InterferonGamma', 'VascularEndothelialGrowthFactor', 'TumorNecrosisFactorAlpha']} name_for_cid[212] = 'GenericAnatomicLocationModifiers' cid_concepts[212] = \ {'DCM': ['Median'], 'NCIt': ['Middle'], 'SCT': ['Distal', 'Proximal', 'MidLongitudinal', 'Central', 'Lateral', 'Posterior', 'Inferior', 'Anterior', 'Superior']} name_for_cid[10024] = 'WaterEquivalentDiameterMethod' cid_concepts[10024] = \ {'DCM': ['AAPM220']} name_for_cid[12019] = 'OBGYNFetusSummary' cid_concepts[12019] = \ {'LN': ['EFWPercentileRank', 'FetalHeartRate', 'GestationalAgeByLMP', 'GestationalAge', 'EstimatedWeight', 'CompositeUltrasoundAge']} name_for_cid[3688] = 'ElectrophysiologyWaveformVoltages' 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[3722] = 'DiabeticTherapy' cid_concepts[3722] = \ {'SCT': ['DiabeticOnOralTreatment', 'DiabeticOnInsulin', 'DiabeticOnDietaryTreatment']} name_for_cid[3237] = 'WallMotionComparisonFindings' cid_concepts[3237] = \ {'SCT': ['NewWallMotionAbnormality', 'NoChange', 'ImprovementOfWallMotion']} name_for_cid[6035] = 'CompositeFeatureRelations' cid_concepts[6035] = \ {'DCM': ['TargetContentItemsAreRelatedTemporally', 'TargetContentItemsAreRelatedSpatially', 'TargetContentItemsAreRelatedContraLaterally']} name_for_cid[3667] = 'FraminghamScores' cid_concepts[3667] = \ {'DCM': ['ComparativeLow10YearCHDRisk', '_10YearCHDRisk', 'ComparativeAverage10YearCHDRisk']} name_for_cid[4] = 'AnatomicRegion' cid_concepts[4] = \ {'DCM': ['Phantom'], 'SCT': ['LeftHypochondriacRegion', 'SubclavianVein', 'ExternalIliacArtery', 'BoneOfLowerLimb', 'TruncusCoeliacus', 'BasilarArtery', 'ParanasalSinus', 'ApexOfRightVentricle', 'WristJoint', 'FontanelOfSkull', 'Mouth', 'GenicularArtery', 'LeftVentricleInflow', 'SigmoidColon', 'PharynxAndLarynx', 'CarotidArtery', 'BuccalRegionOfFace', 'UmbilicalArtery', 'PrimitiveAorta', 'LeftVentricleOutflowTract', 'RadialArtery', 'Intracranial', 'RightFemoralArtery', 'JawRegion', 'LeftFemoralArtery', 'LumenOfBloodVessel', 'Calcaneus', 'EndoEsophageal', 'AntecubitalVein', 'Mandible', 'Parasternal', 'BroadLigament', 'PatentDuctusArteriosus', 'MesentericVein', 'PulmonaryVein', 'CoronaryArtery', 'UpperLimb', 'ExternalIliacVein', 'CongenitalPulmonaryArteriovenousFistula', 'DescendingAorta', 'SubclavianArtery', 'Flank', 'Maxilla', 'Lung', 'OphthalmicArtery', 'Nose', 'PancreaticDuct', 'Hand', 'BrachialVein', 'RightUpperQuadrantOfAbdomen', 'Eye', 'IntraThoracic', 'Prostate', 'ElbowJoint', 'HepaticArtery', 'Back', 'FacialBones', 'Sternum', 'PeronealArtery', 'NeckAndChest', 'RightVentricleOutflowTract', 'Duodenum', 'RightHypochondriacRegion', 'SuperiorLeftPulmonaryVein', 'BileDuct', 'SystemicCollateralArteryToLung', 'UpperOuterQuadrantOfBreast', 'LumbarArtery', 'PancreaticDuctAndBileDuctSystems', 'ApexOfLeftVentricle', 'Cornea', 'Larynx', 'PulmonaryArtery', 'FemoralArtery', 'Ovary', 'Skull', 'ThoracoLumbarSpine', 'EndoUrethral', 'Thyroid', 'Head', 'AdrenalGland', 'AcromioclavicularJoint', 'UmbilicalRegion', 'Calyx', 'CongenitalCoronaryArteryFistulaToRightVentricle', 'PosteriorMedialTributary', 'SternoclavicularJoint', 'EndoNasopharyngeal', 'EsophagusStomachAndDuodenum', 'Breast', 'Neck', 'Finger', 'Submental', 'CranialVenousSystem', 'PoplitealFossa', 'PulmonaryArteryConduit', 'RightAtrium', 'RightVentricle', 'CommonVentricle', 'Coccyx', 'Abdomen', 'HeadAndNeck', 'Hypopharynx', 'Ventricle', 'Uterus', 'TemporomandibularJoint', 'TracheaAndBronchus', 'HepaticVein', 'Testis', 'PelvisAndLowerExtremities', 'InternalMammaryArtery', 'Bladder', 'Vulva', 'LargeIntestine', 'Forearm', 'Face', 'Spine', 'Foot', 'NeckChestAndAbdomen', 'ExternalCarotidArtery', 'SuperiorMesentericArtery', 'MuscleOfUpperLimb', 'PosteriorTibialArtery', 'FemoralVein', 'RightAuricularAppendage', 'Zygoma', 'InnominateVein', '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', 'AnomalousPulmonaryVein', 'SuprasternalNotch', 'CervicoThoracicSpine', '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', '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', 'Pelvis', 'SesamoidBonesOfFoot', 'InternalIliacArtery', 'PulmonaryChamberOfCorTriatriatum', 'SuperiorVenaCava', 'UlnarArtery', 'LeftVentricle', 'AnteriorSpinalArtery', 'AbdomenAndPelvis', 'LumbarRegion', 'Omentum', 'AnusRectumAndSigmoidColon', 'SplenicVein', 'Colon', 'SubmandibularGland', 'LeftLumbarRegion', 'ThoracicSpine', 'SaphenousVein', 'Gallbladder', 'InnominateArtery', 'SplenicArtery', 'RenalArtery', 'HipJoint', 'UpperArm', 'Extremity', 'FacialArtery', 'EpigastricRegion', 'AzygosVein', 'BrachialArtery', 'Liver', 'IntraAbdominal', 'HipJoint', 'Rib', 'BoneOfUpperLimb', 'EndoVaginal', 'LowerInnerQuadrantOfBreast', 'Clavicle', 'ParotidGland', 'CommonFemoralArtery', 'Stomach', 'Subxiphoid', 'UpperInnerQuadrantOfBreast', 'AnteriorCommunicatingArtery', 'CongenitalCoronaryArteryFistulaToLeftAtrium', 'RightInguinalRegion', 'ThoracicAorta', 'CoronarySinus', 'AxillaryArtery', 'LeftPulmonaryArtery', 'ApexOfLung', 'Ileum', 'Atrium', 'Knee', 'VertebralArtery', 'RightLowerQuadrantOfAbdomen', 'PulmonaryVeinConfluence', 'SaphenofemoralJunction', 'InternalJugularVein', 'EyeRegion', 'LacrimalArteryOfRightEye', 'LumboSacralSpine', 'SacroiliacJoint', 'Anus', 'UmbilicalVein', 'EntireBody', 'CommonIliacVein', 'InguinalRegion', 'EndoNasal', 'HypogastricRegion', 'RightLumbarRegion', 'Thumb', 'LumbarSpine', 'GreatCardiacVein', 'PrimitivePulmonaryArtery', 'SellaTurcica', 'PortalVein', 'Scrotum', 'InferiorLeftPulmonaryVein', 'LowerLeg', 'RenalVein', 'BoydPerforatingVein', 'Ear', 'SupraclavicularRegionOfNeck', 'CommonIliacArtery', 'Toe', 'Shoulder', 'SpinalCord', 'VascularGraft', 'LeftAuricularAppendage', 'CircleOfWillis', 'LeftInguinalRegion', 'Eyelid', 'MuscleOfLowerLimb', 'LeftUpperQuadrantOfAbdomen', 'AscendingAorta', 'HunterianPerforatingVein', 'IntraPelvic', 'Subcostal', 'ProfundaFemorisArtery', 'Pharynx', 'ExternalAuditoryCanal', 'AxillaryVein', 'Patella', 'Nasopharynx', 'OccipitalVein', 'DoddPerforatingVein']} name_for_cid[7274] = 'MRDiffusionModelFittingMethods' cid_concepts[7274] = \ {'DCM': ['LeastSquaresFitOfMultipleSamples', 'LevenbergMarquardt', 'TrustRegion', 'FixedDp', 'SegmentedUnconstrained', 'SegmentedConstrained', 'BayesianProbability', 'LogOfRatioOfTwoSamples']} name_for_cid[9513] = 'FixationDevices' cid_concepts[9513] = \ {'DCM': ['RectalBalloon', 'Mold', 'HeadAndNeckMask', 'HeadMask', 'Headframe', 'VaginalCylinder', 'BodyFrame', 'BreastBoard', 'Cast', 'WholeBodyPod', 'VacuumMold'], 'SCT': ['Headrest', 'BiteBlock']} name_for_cid[8302] = 'MeasurementPatternCodes' cid_concepts[8302] = \ {'DCM': ['TG18UNL80Pattern', 'TG18UNL10Pattern']} name_for_cid[12275] = 'CardiacUltrasoundCoronaryArteriesMeasurements' 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', 'SystolicToDiastolicVelocityRatio', 'EFSlope', 'PeakReversalVelocityDuringAtrialContraction', 'TimeAveragedMeanVelocity'], 'SCT': ['MajorAxis', 'RegurgitantFraction', 'Radius', 'MinorAxis', 'Diameter', 'CardiovascularOrificeArea', 'CardiovascularOrificeDiameter', 'Length', 'Circumference']} name_for_cid[7018] = 'MiscellaneousDocumentTitles' cid_concepts[7018] = \ {'DCM': ['AdditionalTeachingFileInformation']} name_for_cid[4264] = 'OphthalmicMapPurposesofReference' cid_concepts[4264] = \ {'DCM': ['Localizer', 'SourceImageForImageProcessingOperation', 'RelatedOphthalmicThicknessMap']} name_for_cid[6127] = 'SegmentLocationinLung' cid_concepts[6127] = \ {'SCT': ['AnteriorSegmentOfLeftUpperLobe', 'AnteriorSegmentOfRightUpperLobe', 'PosteriorSegmentOfRightUpperLobe']} name_for_cid[50] = 'InstanceAvailabilityStatus' cid_concepts[50] = \ {'DCM': ['Unavailable', 'Nearline', 'Offline', 'Online']} name_for_cid[3630] = 'CardiovascularAnatomicLocations' cid_concepts[3630] = \ {'SCT': ['SubclavianVein', 'InternalCarotidArtery', 'PulmonaryValve', 'BasilarArtery', 'PulmonaryArteriovenousFistula', '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', 'DescendingAorta', 'SubclavianArtery', 'TibialArtery', 'RightVentricleInflow', 'OphthalmicArtery', 'MesentericArtery', 'MedialPlantarArtery', 'VenaAnonyma', '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', 'AxillaryArtery', 'LeftPulmonaryArtery', 'HepaticVein', 'InternalMammaryArtery', 'VertebralArtery', 'PulmonaryVeinConfluence', 'SaphenofemoralJunction', 'InternalJugularVein', 'UmbilicalVein', 'FemoralVein', 'InnominateVein', 'NeonatalPulmonaryArteryPrimitivePA', 'SuperficialFemoralArtery', 'PortalVein', 'PosteriorCommunicatingArtery', 'JuxtaposedAppendage', 'AorticArch', 'RenalVein', 'BoydPerforatingVein', 'AbdominalAorta', 'CoronarySinus', 'CephalicVein', 'LingualArtery', 'GastricVein', 'Baffle', 'LacrimalArtery', 'BasilicVein', 'OccipitalArtery', 'SystemicVenousAtrium', 'HunterianPerforatingVein', 'AscendingAorta', 'AnomalousPulmonaryVein', 'ProfundaFemorisArtery', 'LeftAtrium', 'CerebralArtery', 'AxillaryVein', 'GreatSaphenousVein', 'PulmonaryArteryWedge', 'DoddPerforatingVein']} name_for_cid[6062] = 'InterventionalProcedureComplications' cid_concepts[6062] = \ {'DCM': ['AbnormalDischarge', 'NoComplications'], 'SCT': ['Pneumothorax', 'Weal', 'HealthcareAssociatedInfection', 'Swelling', 'HematomaPostoperative', 'HemorrhagePostprocedure', 'Rash', 'VasovagalSyncope', 'PersistentPainFollowingProcedure']} name_for_cid[12222] = 'OrificeFlowProperties' 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', 'SystolicToDiastolicVelocityRatio', 'EFSlope', 'PeakReversalVelocityDuringAtrialContraction', 'TimeAveragedMeanVelocity'], 'SCT': ['RegurgitantFraction', 'CardiovascularOrificeArea', 'CardiovascularOrificeDiameter']} name_for_cid[9401] = 'IEC61217DevicePositionParameters' cid_concepts[9401] = \ {'DCM': ['IEC61217TableTopLongitudinalPosition', 'IEC61217TableTopVerticalPosition', 'IEC61217GantryContinuousRollAngle', 'IEC61217GantryContinuousPitchAngle', 'IEC61217GantryContinuousYawAngle', 'IEC61217PatientSupportContinuousAngle', 'IEC61217TableTopContinuousPitchAngle', 'IEC61217TableTopContinuousRollAngle', 'IEC61217TableTopEccentricAxisDistance', 'IEC61217TableTopContinuousEccentricAngle', 'IEC61217TableTopLateralPosition']} name_for_cid[4233] = 'OphthalmicAxialLengthMeasurementsSegmentNames' cid_concepts[4233] = \ {'DCM': ['SingleOrAnteriorLens', 'PosteriorLens'], 'SCT': ['AnteriorChamber', 'VitreousCavity', 'Cornea']} name_for_cid[603] = 'AnimalRoomTypes' cid_concepts[603] = \ {'DCM': ['AnimalHousingRoom', 'PreparationRoom', 'ImagingProcedureRoom'], 'SCT': ['InductionRoom', 'IsolationRoom', 'RecoveryRoom']} name_for_cid[12223] = 'EchocardiographyStrokeVolumeOrigin' cid_concepts[12223] = \ {'SCT': ['RightVentricleOutflowTract', 'LeftVentricle', 'MitralValve', 'LeftVentricleOutflowTract', 'Aorta']} name_for_cid[4232] = 'VitreousStatus' cid_concepts[4232] = \ {'SCT': ['PostVitrectomy', 'GasInVitreousCavity', 'VitreousOnly', 'SiliconeOil']} name_for_cid[602] = 'BiosafetyControlReasons' cid_concepts[602] = \ {'SCT': ['BiohazardousMaterial', 'Carcinogen', 'PatientImmunocompromised'], 'UMLS': ['TransgenicAnimal']} name_for_cid[252] = 'SMLSizeDescriptor' cid_concepts[252] = \ {'SCT': ['Medium', 'Small', 'Large']} name_for_cid[3774] = 'SocialHistory' cid_concepts[3774] = \ {'SCT': ['Nutrition', 'AlcoholConsumption', 'TobaccoSmokingBehavior', 'Exercise', 'DrugMisuseBehavior']} name_for_cid[6126] = 'LocationinLung' cid_concepts[6126] = \ {'DCM': ['Subpleural'], 'SCT': ['LowerLobeOfLung', 'UpperZoneOfLung', 'LowerZoneOfLung', 'UpperLobeOfLung', 'MiddleZoneOfLung', 'MiddleLobeOfLung']} name_for_cid[7222] = 'ParametricMapDerivationImagePurposeofReference' cid_concepts[7222] = \ {'DCM': ['SourceImageForImageProcessingOperation']} name_for_cid[6063] = 'InterventionalProcedureResults' cid_concepts[6063] = \ {'SCT': ['Benign', 'Malignant', 'InsufficientSample', 'HighRiskTumor', 'IndeterminateResult']} name_for_cid[3261] = 'StressProtocols' cid_concepts[3261] = \ {'SCT': ['StressTestUsingBicycleErgometer', 'EllestadProtocol', 'PharmacologicStressProtocol', 'DobutamineStressProtocol', 'NaughtonProtocol', 'PepperProtocol', 'AdenosineStressProtocol', 'StressTestUsingCardiacPacing', 'PharmacologicAndExerciseStressTest', 'ModifiedNaughtonProtocol', 'DipyridamoleStressProtocol', 'RampProtocol', 'ExerciseStressECGTest', 'BalkeProtocol', 'ModifiedBruceProtocol', 'BruceProtocol']} name_for_cid[9512] = 'TomotherapeuticRadiotherapyProcedureTechniques' cid_concepts[9512] = \ {'DCM': ['TopographicBeam', 'HelicalBeam']} name_for_cid[8303] = 'DisplayDeviceType' cid_concepts[8303] = \ {'DCM': ['CRTFrontProjectionSystem', 'DLPRearProjectionSystem', 'OLED', 'CRTRearProjectionSystem', 'DLPFrontProjectionSystem', 'CRTDisplay', 'PlasmaDisplay', 'LiquidCrystalDisplay']} name_for_cid[12274] = 'CardiacUltrasoundAortaMeasurements' 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', '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[7019] = 'SegmentationNonImageSourcePurposesofReference' cid_concepts[7019] = \ {'DCM': ['SourceRealWorldValueMap']} name_for_cid[7449] = 'ReaderSpecialty' cid_concepts[7449] = \ {'DCM': ['OncologicImagingSpecialty', 'OBGynImagingSpecialty', 'ThoracicImagingSpecialty', 'OncologySpecialty', 'AbdominalImagingSpecialty', 'VascularImagingSpecialty', 'PediatricImagingSpecialty', 'HeadAndNeckImagingSpecialty', 'CardiacImagingSpecialty', 'MusculoskeletalImagingSpecialty', 'NeuroradiologyImagingSpecialty', 'NeurologySpecialty']} name_for_cid[4265] = 'OphthalmicThicknessDeviationCategories' cid_concepts[4265] = \ {'DCM': ['PGreaterThan5Percent', 'PLesserThan5Percent', 'PLesserThan2Percent', 'PLesserThan1Percent', 'PLesserThan0Point5Percent']} name_for_cid[12018] = 'OBGYNSummary' cid_concepts[12018] = \ {'LN': ['NumberOfFetusesByUS', 'GestationalAgeByOvulationDate']} name_for_cid[10025] = 'RadiationDoseReferencePoints' cid_concepts[10025] = \ {'DCM': ['_15cmFromIsocenterTowardSource', '_1cmAboveTabletop', '_30cmInFrontOfImageInputSurface', '_15cmFromTableCenterline', 'InDetectorPlane', '_30cmAboveTabletop', 'EntranceExposureToA4Point2cmBreastThickness', 'AtSurfaceOfPatient']} name_for_cid[3689] = 'ECGGlobalWaveformDurations' cid_concepts[3689] = \ {'MDC': ['PDurationGlobal', 'PPTimePeriodGlobal', 'RRTimePeriodGlobal', 'QTDurationGlobal', 'PQSegmentTimePeriodGlobal', 'QRSDurationGlobal', 'PQTimePeriodGlobal', 'PRTimePeriodGlobal', 'QTUTimePeriodGlobal']} name_for_cid[3723] = 'MITypes' cid_concepts[3723] = \ {'SCT': ['NonSTElevationMyocardialInfarction', 'STElevationMyocardialInfarction']} name_for_cid[3236] = 'ToleranceComparisonFindings' cid_concepts[3236] = \ {'SCT': ['DecreasedTolerance', 'NoChange', 'IncreasedTolerance']} name_for_cid[6034] = 'IntendedUseofCADOutput' cid_concepts[6034] = \ {'DCM': ['PresentationRequiredRenderingDeviceIsExpectedToPresent', 'PresentationOptionalRenderingDeviceMayPresent', 'NotForPresentationRenderingDeviceExpectedNotToPresent']} name_for_cid[4009] = 'DXAnatomyImaged' cid_concepts[4009] = \ {'DCM': ['Phantom'], 'SCT': ['BoneOfLowerLimb', 'Ureter', 'Sacrum', 'SmallIntestine', 'ParanasalSinus', 'InternalAuditoryCanal', 'WristJoint', 'Humerus', 'Ilium', 'JawRegion', 'Calcaneus', 'NasalBone', 'Esophagus', 'Mandible', 'OpticCanal', 'MastoidBone', 'NeckChestAbdomenAndPelvis', 'Thigh', 'ChestAndAbdomen', 'Trachea', 'UpperLimb', 'AnkleJoint', 'Maxilla', 'Mediastinum', 'Hand', 'UpperUrinaryTract', 'Bronchus', 'Pelvis', 'SesamoidBonesOfFoot', 'Eye', 'Chest', 'Prostate', 'ElbowJoint', 'AbdomenAndPelvis', 'FacialBones', 'Colon', 'Sternum', 'SubmandibularGland', 'ThoracicSpine', 'NeckAndChest', 'Duodenum', 'Gallbladder', 'BileDuct', 'UpperArm', 'Extremity', 'PancreaticDuctAndBileDuctSystems', 'Larynx', 'Skull', 'ThoracoLumbarSpine', 'Urethra', 'HipJoint', 'Rib', 'BoneOfUpperLimb', 'Head', 'AcromioclavicularJoint', 'Clavicle', 'ParotidGland', 'SternoclavicularJoint', 'Breast', 'EsophagusStomachAndDuodenum', 'Neck', 'Finger', 'Stomach', 'Coccyx', 'Abdomen', 'HeadAndNeck', 'TemporomandibularJoint', 'ApexOfLung', 'Ileum', 'PelvisAndLowerExtremities', 'Bladder', 'Knee', 'LargeIntestine', 'Forearm', 'EyeRegion', 'Spine', 'LumboSacralSpine', 'Foot', 'NeckChestAndAbdomen', 'SacroiliacJoint', 'Anus', 'MuscleOfUpperLimb', 'EntireBody', 'Thumb', 'LumbarSpine', 'Zygoma', 'SellaTurcica', 'UterusAndFallopianTubes', 'LowerLimb', 'LowerLeg', 'VertebralColumnAndCranium', 'Jejunum', 'ChestAbdomenAndPelvis', 'Heart', 'TarsalJoint', 'Toe', 'Shoulder', 'Fibula', 'OrbitalStructure', 'MuscleOfLowerLimb', 'CervicoThoracicSpine', 'Femur', 'Rectum', 'Scapula', 'Patella', 'CervicalSpine']} name_for_cid[3666] = 'P50Equations' cid_concepts[3666] = \ {'DCM': ['IfAgeLesserThan30DayP50Equals24Point6', 'IfAgeLesserThan18YearsP50Equals27Point2', 'IfPremAgeLesserThan3DaysP50Equals19Point9', 'IfAgeLesserThan1DayP50Equals21Point6', 'IfAgeGreaterThan60YearsP50Equals29Point3', 'IfAgeLesserThan40YearsP50Equals27Point4']} name_for_cid[5] = 'TransducerApproach' cid_concepts[5] = \ {'SCT': ['Peripheral', 'Midline', 'Ascending', 'Right', 'Surface', 'Caudal', 'Posterior', 'Left', 'External', 'Superior', 'Distal', 'PiaMater', 'Proximal', 'Parasagittal', 'Intraluminal', 'Lateral', 'Inferior', 'Capsular', 'Anterior', 'WaterBagProsthesisForImagingProcedure', 'Transverse', 'GelProsthesisForImagingProcedure', 'Cranial', 'Central', 'Apical', 'Parenchyma', 'SalineBagProsthesisForImagingProcedure', 'MidLongitudinal', 'SubcutaneousTissue', 'Lumen', 'ExternalProsthesisForSonographicProcedureStandOff', 'DuraMater', 'ContactWith', 'Internal', 'Medial', 'Descending']} name_for_cid[7275] = 'MRDiffusionModelSpecificMethods' cid_concepts[7275] = \ {'DCM': ['VoxelwiseSelectionOfBValue']} name_for_cid[12262] = 'CardiacUltrasoundPulmonaryValve' 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', '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[9504] = 'RTGeometricInformation' cid_concepts[9504] = \ {'DCM': ['PatientSetupPoint', 'ReferenceAcquisitionPoint', 'MoveableLaserPatientSetupPoint', 'RoomLaserPatientSetupPoint', 'IsocentricTreatmentLocationPoint']} name_for_cid[4273] = 'RetinalSegmentationSurfaces' cid_concepts[4273] = \ {'DCM': ['PosteriorSurfaceOfTheRPE', 'SurfaceOfTheCenterOfTheRPE', 'SurfaceOfTheChoroidScleraInterface', 'OuterSurfaceOfRNFL', 'OuterSurfaceOfTheBM', 'OuterSurfaceOfTheCC', 'OuterSurfaceOfIPL', 'OuterSurfaceOfGCL', 'OuterSurfaceOfOPL', 'OuterSurfaceOfINL', 'SurfaceBetweenInnerAndOuterSegmentsOfThePhotoreceptors', 'OuterSurfaceOfHFL', 'AnteriorSurfaceOfTheRPE', 'SurfaceOfTheInterdigitatingZoneBetweenRetinaAndRPE'], 'SCT': ['ELMExternalLimitingMembrane', 'ILMInternalLimitingMembrane']} name_for_cid[643] = 'Toxins' cid_concepts[643] = \ {'PUBCHEM_CID': ['_6Hydroxydopamine'], 'SCT': ['Lysophosphatidylcholine', 'Lipopolysaccharide'], 'UMLS': ['EthidiumBromide']} name_for_cid[3735] = 'AcuteCoronarySyndromeTimePeriod' cid_concepts[3735] = \ {} name_for_cid[10] = 'InterventionalDrug' cid_concepts[10] = \ {'SCT': ['Nitroglycerin', 'HemostaticAgent', 'AntihemophilicFactorPreparation', 'UrokinasePreparation', 'Verapamil', 'Propranolol', 'Coagulant', 'LidocaineHydrochloride', 'AntiHeparinAgent', 'Diuretic', 'GlucagonPreparation', 'ThrombolyticAgent', 'Ethanol', 'Nifedipine', 'Anticoagulant', 'Warfarin', 'AntiarrhythmicDrug', 'InotropicAgent', 'Heparin', 'BetaAdrenergicBlockingAgent', 'ThrombinPreparation', 'CentrallyActingHypotensiveAgent', 'Thromboplastin', 'ProtamineSulfate', 'AlphaAdrenergicBlockingAgent', 'Epinephrine', 'TolazolineHydrocholoride', 'Atropine', 'Antihistamine', 'Quinidine', 'Dextran', 'InjectableFibrinolysin', 'StreptokinasePreparation', 'MethyleneBlue', 'Lidocaine', 'CardiotonicDrug', 'Digoxin', 'CardiacAdrenergicBlockingAgent', 'HypotensiveAgent', 'AstringentDrug', 'HumanFibrinogen']} name_for_cid[10033] = 'CTReconstructionAlgorithm' cid_concepts[10033] = \ {'DCM': ['IterativeReconstruction', 'FilteredBackProjection']} name_for_cid[7263] = 'DiffusionTractographyMeasurementTypes' 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[3670] = 'ECGProcedureTypes' cid_concepts[3670] = \ {'SCT': ['_15LeadECG', '_12LeadECG', '_18LeadECG']} name_for_cid[6022] = 'Side' cid_concepts[6022] = \ {'SCT': ['LeftBreast', 'RightBreast', 'BothBreasts']} name_for_cid[3220] = 'StressSymptoms' cid_concepts[3220] = \ {'DCM': ['AnginalEquivalent'], 'SCT': ['Dizziness', 'Nausea', 'Claudication', 'AtypicalAngina', 'TypicalAngina', 'Syncope', 'Flushing', 'Fatigue', 'NoncardiacChestPain', 'UnstableAngina', 'ChestPain', 'ChestPainNotPresent', 'ChestDiscomfort', 'Dyspnea', 'StableAngina']} name_for_cid[301] = 'MultienergyMaterialUnits' cid_concepts[301] = \ {'DCM': ['ModifiedHounsfieldUnit', 'EffectiveAtomicNumber'], 'UCUM': ['mgcm3', 'HounsfieldUnit', 'ElectronDensity', 'Percent', 'mgml']} name_for_cid[12235] = 'MitralValveAnatomicSites' cid_concepts[12235] = \ {'SCT': ['MedialMitralAnnulus', 'LateralMitralAnnulus', 'MitralAnnulus']} name_for_cid[244] = 'Laterality' cid_concepts[244] = \ {'SCT': ['Bilateral', 'Right', 'Left', 'Unilateral']} name_for_cid[614] = 'AnesthesiaInductionCodeTypefromAnesthesiaQualityInitiative(AQI)' cid_concepts[614] = \ {'SCT': ['IntramuscularRoute', 'PerRectum', 'IntravenousRoute', 'ByInhalation']} name_for_cid[10064] = 'PatientModelType' cid_concepts[10064] = \ {'DCM': ['AnthropomorphicModel', 'SimpleObjectModel', 'PatientSegmentedModel']} name_for_cid[6130] = 'SeverityDescriptor' cid_concepts[6130] = \ {'DCM': ['HyperAcute'], 'SCT': ['AcuteOnset', 'Moderate', 'Mild', 'Chronic', 'Subacute', 'Severe']} name_for_cid[3762] = 'AntiarrhythmicAgents' cid_concepts[3762] = \ {'SCT': ['ClassIIIAntiarrhythmicAgent', 'ClassIIAntiarrhythmicAgent', 'ClassIVAntiarrhythmicAgent', 'ClassIAntiarrhythmicAgent']} name_for_cid[3627] = 'MeasurementType' cid_concepts[3627] = \ {'SCT': ['Estimated', 'PeakToPeak', 'Measured', 'Mode', 'VisualEstimation', 'BestValue', 'Calculated', 'Mean', 'PointSourceMeasurement', 'Median']} name_for_cid[7023] = 'RTProcessOutput' cid_concepts[7023] = \ {'DCM': ['RTPlanningResult', 'RTTreatmentSimulationResult', 'DosimetricResult', 'RTTreatmentSessionResult', 'PatientSetupVerificationResult', 'RTTreatmentQAResult', 'RTTreatmentCourseSummary', 'RTPrescriptionResult', 'PrePlanningResult', 'CoordinateAlignmentImageSeries', 'DoseCalculationImageSeries']} name_for_cid[7473] = 'GeneralAreaCalculationMethods' cid_concepts[7473] = \ {'DCM': ['AreaOfAClosedNURBS', 'AreaOfClosedIrregularPolygon']} name_for_cid[3430] = 'DateTimeQualifiers' cid_concepts[3430] = \ {'DCM': ['DatetimeUnsynchronized', 'DatetimeEstimated']} 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[7166] = 'CommonTissueSegmentationTypes' cid_concepts[7166] = \ {'SCT': ['Ligament', 'Nerve', 'Artery', 'ConnectiveTissue', 'LymphaticSystem', 'Capillary', 'Meniscus', 'BloodVessel', 'Tissue', 'Cartilage', 'Organ', 'Vein', 'Muscle', 'Skin', 'Blood', 'Bone', 'LymphaticVessel', 'LymphNode', 'BodyFat', 'Tendon']} name_for_cid[3826] = 'HeartRhythm' cid_concepts[3826] = \ {'SCT': ['VentricularArrhythmia', 'NormalSinusRhythm', 'AtrialArrhythmia']} name_for_cid[4033] = 'MRProtonSpectroscopyMetabolites' cid_concepts[4033] = \ {'DCM': ['CreatineCholineCitrateRatio', 'GlutamateAndGlutamine', 'CholineCreatineRatio', 'NAcetylaspartateCreatineRatio', 'CreatineAndCholine', 'NAcetylaspartateCholineRatio', 'LipidAndLactate'], 'SCT': ['Inositol', 'Citrate', 'Choline', 'Creatine', 'Lactate', 'Glutamine', 'NAcetylaspartate', 'Lipid', 'Tuarine']} 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[12022] = 'FetalCraniumAnatomicSites' cid_concepts[12022] = \ {'SCT': ['Cerebellum', 'LateralVentricle', 'CerebralHemisphere', 'OccipitalRegionOfScalp', 'CisternaMagna', 'AnteriorHornLateralVentricle', 'PosteriorHornLateralVentricle', 'Orbit']} name_for_cid[3719] = 'CanadianClinicalClassification' cid_concepts[3719] = \ {'SCT': ['AnginaClassII', 'AnginaClassI', 'AnginaClassIV', 'AnginaClassIII', 'ChestPainNotPresent']} name_for_cid[4208] = 'MydriaticAgent' cid_concepts[4208] = \ {'SCT': ['Tropicamide', 'Homatropine', 'Cyclopentolate', 'Atropine', 'Phenylephrine']} name_for_cid[3467] = 'EjectionFraction' cid_concepts[3467] = \ {'DCM': ['LeftAtrialEjectionFractionByAngiography'], 'LN': ['RightVentricularEjectionFractionByAngiography', 'LeftVentricularEjectionFractionByAngiography']} name_for_cid[638] = 'ExogenousSubstance' cid_concepts[638] = \ {'DCM': ['HumanAlphaSynucleinPreformedFibrils', 'MouseAlphaSynucleinPreformedFibrils', 'HumanTauPreformedFibrils', 'MouseTauPreformedFibrils'], 'NCIt': ['BronchioloalveolarAdenocarcinoma'], 'PUBCHEM_CID': ['_6Hydroxydopamine'], 'SCT': ['NonSmallCellCarcinoma', 'SquamousCellCarcinoma', 'AmelanoticMelanoma', 'SpindleCellCarcinoma', 'Lipopolysaccharide', 'Adenocarcinoma', 'Carcinosarcoma', 'TumorNecrosisFactorAlpha', 'MixedSmallCellCarcinoma', 'LargeCellCarcinoma', 'VascularEndothelialGrowthFactor', 'Melanoma', 'InterferonGamma', 'RenalCellCarcinoma', 'Glioblastoma', 'Carcinoma', 'Lysophosphatidylcholine', 'Leukemia', 'InfiltratingDuctalCarcinomaOfBreast', 'Mesothelioma', 'Cystadenocarcinoma', 'TheilerMurineEncephalomyelitisVirus', 'Astrocytoma', 'AdenoAssociatedVirusGroup', 'Osteosarcoma', 'Sarcoma', 'SmallCellCarcinoma'], 'UMLS': ['EthidiumBromide']} name_for_cid[12219] = 'PulmonaryVeinModifiers' cid_concepts[12219] = \ {'SCT': ['RightLowerSegment', 'RightUpperSegment', 'LeftLowerSegment', 'LeftUpperSegment']} name_for_cid[3488] = 'Min/Max/Mean' cid_concepts[3488] = \ {'SCT': ['Minimum', 'Maximum', 'Mean']} name_for_cid[84] = 'PETUnits' cid_concepts[84] = \ {'UCUM': ['MicromoleMinuteMilliliter', 'Centimeter2Milliliter', 'Centimeter2', 'MilliliterGram', 'StandardizedUptakeValueBodySurfaceArea', 'StandardizedUptakeValueLeanBodyMassJanma', 'ProportionalToCounts', 'Counts', 'Percent', 'MilliliterMinuteGram', 'StandardizedUptakeValueBodyWeight', 'MicromoleMilliliter', 'ProportionalToCountsPerSecond', 'MilligramsMinuteMilliliter', 'StandardizedUptakeValueIdealBodyWeight', 'Centimeter', 'BecquerelsMilliliter', 'CountsPerSecond', 'StandardizedUptakeValueLeanBodyMassJames', 'StandardizedUptakeValueLeanBodyMassJames128Multiplier']} name_for_cid[6059] = 'BreastImplantTypes' cid_concepts[6059] = \ {'DCM': ['SalineImplant', 'PolyurethaneImplant', 'PercutaneousSiliconeInjection', 'CombinationImplant', 'PrePectoralImplant', 'RetroPectoralImplant'], 'SCT': ['SiliconeGelImplant', 'BreastImplantTypeNotSpecified']} name_for_cid[8102] = 'ContainerComponentTypes' cid_concepts[8102] = \ {'SCT': ['MicroscopeSlideCoverSlip', 'SpecimenContainer', 'TissueMicroarrayCassette', 'ElectronMicroscopyGrid', 'TissueCassette', 'MicroscopeSlideMountingMedia', 'SpecimenContainerLid', 'MicroscopeSlide', 'SpecimenVial', 'SpecimenWell']} name_for_cid[7062] = 'PurposeofReferencetoPredecessor3DModel' cid_concepts[7062] = \ {'DCM': ['EditedModel', 'ComponentModel']} name_for_cid[3471] = 'EstimatedVolumes' cid_concepts[3471] = \ {'DCM': ['VolumeEstimatedFromTwoNonCoplanar2DRegions', 'VolumeEstimatedFromSingle2DRegion']} name_for_cid[92] = 'JointPositionDuringAcquisition' cid_concepts[92] = \ {'DCM': ['NeutralMusculoskeletalPosition'], 'SCT': ['Torsion', 'ExternalRotation', 'Pronation', 'Flexion', 'InternalRotation', 'Abduction', 'Extension', 'Adduction', 'Supination']} name_for_cid[8114] = 'SpecimenFixatives' 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[3758] = 'CardiovascularFamilyHistory' cid_concepts[3758] = \ {'SCT': ['NoFamilyHistoryOfCardiovascularDisease', 'FamilyHistoryOfDiabetesMellitus', 'FamilyHistoryOfCoronaryArteriosclerosis', 'NoFamilyHistoryOfDiabetes', 'FamilyHistoryUnknown', 'FamilyHistoryOfCardiovascularDisease', 'FamilyHistoryOfMyocardialInfarction']} name_for_cid[3426] = 'ConsumablesParameters' cid_concepts[3426] = \ {'DCM': ['LotIdentifier', 'UnitSerialIdentifier', 'DescriptionOfMaterial']} name_for_cid[7465] = 'MeasurementsDerivedFromMultipleROIMeasurements' cid_concepts[7465] = \ {'DCM': ['PercentileRankingOfMeasurement', 'ZScoreOfMeasurement', 'StandardDeviationOfPopulation', '_2SigmaDeviationOfPopulation'], 'SCT': ['_1SigmaLowerValueOfPopulation', '_2SigmaLowerValueOfPopulation', '_5thPercentileValueOfPopulation', '_10thPercentileValueOfPopulation', '_1SigmaUpperValueOfPopulation', '_2SigmaUpperValueOfPopulation', 'MeanValueOfPopulation', '_95thPercentileValueOfPopulation', '_90thPercentileValueOfPopulation', 'MedianValueOfPopulation']} name_for_cid[7035] = 'ActionableFindingClassification' cid_concepts[7035] = \ {'RADLEX': ['ACRCategory2ActionableFinding', 'ACRCategory1ActionableFinding', 'ACRCategory3ActionableFinding']} name_for_cid[12258] = 'CardiacUltrasoundRightVentricle' 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', '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[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[4025] = 'PrimaryAnatomicStructureforIntraoralRadiography(SupernumeraryDentitionDesignationofTeeth)' cid_concepts[4025] = \ {'SCT': ['SupernumeraryPermanentMandibularLeftThirdMolarTooth', 'SupernumeraryDeciduousMaxillaryLeftFirstMolarTooth', 'SupernumeraryPermanentMaxillaryLeftCentralIncisorTooth', 'SupernumeraryPermanentMaxillaryLeftSecondPremolarTooth', 'SupernumeraryDeciduousMandibularRightCanineTooth', 'SupernumeraryPermanentMandibularLeftLateralIncisorTooth', 'SupernumeraryPermanentMandibularRightLateralIncisorTooth', 'SupernumeraryPermanentMaxillaryRightFirstPremolarTooth', 'SupernumeraryPermanentMaxillaryRightSecondMolarTooth', 'SupernumeraryDeciduousMaxillaryRightFirstMolarTooth', 'SupernumeraryPermanentMandibularLeftSecondPremolarTooth', 'SupernumeraryDeciduousMaxillaryLeftSecondMolarTooth', 'SupernumeraryPermanentMaxillaryLeftThirdMolarTooth', 'SupernumeraryPermanentMandibularRightFirstMolarTooth', 'SupernumeraryDeciduousMaxillaryLeftCentralIncisorTooth', 'SupernumeraryDeciduousMandibularRightLateralIncisorTooth', 'SupernumeraryPermanentMaxillaryRightCentralIncisorTooth', 'SupernumeraryPermanentMaxillaryLeftFirstPremolarTooth', 'SupernumeraryPermanentMandibularRightCentralIncisorTooth', 'SupernumeraryPermanentMaxillaryRightCanineTooth', 'SupernumeraryDeciduousMandibularLeftFirstMolarTooth', 'SupernumeraryDeciduousMaxillaryRightCentralIncisorTooth', 'SupernumeraryPermanentMandibularLeftFirstMolarTooth', 'SupernumeraryPermanentMandibularRightSecondPremolarTooth', 'SupernumeraryPermanentMaxillaryLeftSecondMolarTooth', 'SupernumeraryDeciduousMandibularRightSecondMolarTooth', 'SupernumeraryPermanentMaxillaryLeftCanineTooth', 'SupernumeraryDeciduousMandibularLeftCanineTooth', 'SupernumeraryPermanentMandibularLeftCentralIncisorTooth', 'SupernumeraryPermanentMaxillaryRightFirstMolarTooth', 'SupernumeraryDeciduousMandibularLeftSecondMolarTooth', 'SupernumeraryDeciduousMaxillaryRightSecondMolarTooth', 'SupernumeraryDeciduousMandibularLeftLateralIncisorTooth', 'SupernumeraryPermanentMandibularRightFirstPremolarTooth', 'SupernumeraryPermanentMandibularLeftCanineTooth', 'SupernumeraryPermanentMandibularLeftSecondMolarTooth', 'SupernumeraryDeciduousMaxillaryLeftCanineTooth', 'SupernumeraryPermanentMaxillaryLeftFirstMolarTooth', 'SupernumeraryDeciduousMaxillaryRightLateralIncisorTooth', 'SupernumeraryDeciduousMandibularRightFirstMolarTooth', 'SupernumeraryDeciduousMandibularLeftCentralIncisorTooth', 'SupernumeraryPermanentMandibularRightThirdMolarTooth', 'SupernumeraryPermanentMaxillaryLeftLateralIncisorTooth', 'SupernumeraryPermanentMaxillaryRightLateralIncisorTooth', 'SupernumeraryPermanentMandibularRightCanineTooth', 'SupernumeraryPermanentMaxillaryRightSecondPremolarTooth', 'SupernumeraryDeciduousMaxillaryRightCanineTooth', 'SupernumeraryPermanentMandibularLeftFirstPremolarTooth', 'SupernumeraryPermanentMandibularRightSecondMolarTooth', 'SupernumeraryDeciduousMandibularRightCentralIncisorTooth', 'SupernumeraryDeciduousMaxillaryLeftLateralIncisorTooth', 'SupernumeraryPermanentMaxillaryRightThirdMolarTooth']} name_for_cid[9302] = 'MediaImportPPSDiscontinuationReasons' cid_concepts[9302] = \ {'DCM': ['IncorrectWorklistEntrySelected', 'MediaFailure', 'DiscontinuedForUnspecifiedReason', 'ObjectSetIncomplete', 'EquipmentFailure', 'ObjectTypesNotSupported', 'ObjectsIncorrectlyFormatted', 'DuplicateOrder']} name_for_cid[100] = 'QuantitativeDiagnosticImagingProcedures' cid_concepts[100] = \ {'DCM': ['MultiparametricMRIOfProstate', 'MultiparametricMRIOfWholeBody', 'MultiparametricMRI'], 'LN': ['NMUnspecifiedBodyRegion', 'PETWholeBody', 'SPECTBrain', 'MRIUnspecifiedBodyRegion', 'PETUnspecifiedBodyRegion', 'CTUnspecifiedBodyRegion', 'CTPerfusionHeadWithContrastIV'], 'RADLEX': ['NMHeadPerfusionBrainPETCTAV45'], 'SCT': ['DynamicMagneticResonanceImagingOfKnee', 'DynamicMagneticResonanceImagingOfPelvis', 'PETCTFDGImagingOfWholeBody', 'PETCTMETImagingOfWholeBody', 'MagneticResonanceImagingGuidance', 'ImagingProcedure']} name_for_cid[12034] = 'UltrasoundTransducerBeamSteering' cid_concepts[12034] = \ {'DCM': ['PhasedBeamSteering', 'MechanicalBeamSteering', 'FixedBeamDirection']} name_for_cid[10009] = 'Measured/Calculated' cid_concepts[10009] = \ {'SCT': ['Estimated', 'Measured', 'Calculated']} name_for_cid[3778] = 'Stages' cid_concepts[3778] = \ {'SCT': ['Stage1', 'Stage5', 'Stage0', 'Stage4', 'Stage2', 'Stage3']} name_for_cid[6080] = 'GynecologicalHormones' cid_concepts[6080] = \ {'DCM': ['UnspecifiedGynecologicalHormone'], 'SCT': ['Anastrozole', 'Tamoxifen', 'Raloxifene', 'Contraceptives', 'ProgesteroneProduct', 'EstrogenProduct']} name_for_cid[4052] = 'PhantomDevices' cid_concepts[4052] = \ {'DCM': ['IECHeadDosimetryPhantom', 'IECBodyDosimetryPhantom', 'Phantom', 'NEMAXR212000Phantom', 'ACRAccreditationPhantomCT', 'ACRAccreditationPhantomMR', 'ACRAccreditationPhantomMammography', 'ACRAccreditationPhantomStereotacticBreastBiopsy', 'ACRAccreditationPhantomECT', 'ACRAccreditationPhantomPET', 'ACRAccreditationPhantomECTPET', 'ACRAccreditationPhantomPETFaceplate']} name_for_cid[12106] = 'IntracranialCerebralVessels(Unilateral)' cid_concepts[12106] = \ {'SCT': ['BasilarArtery']} name_for_cid[7042] = 'CMDCTECCCalciumScoringPatientSizeCategories' cid_concepts[7042] = \ {'DCM': ['SmallLesserThan32Point0cmLateralThickness', 'Medium32Point0To38Point0cmLateralThickness', 'LargeGreaterThan38Point0cmLateralThickness']} name_for_cid[3451] = 'CalibrationObjects' cid_concepts[3451] = \ {'DCM': ['Sphere'], 'SCT': ['Catheter', 'MeasuringRuler']} name_for_cid[6203] = 'ColonNonlesionObjectType' cid_concepts[6203] = \ {'DCM': ['ChestTube', 'KidneyStent', 'PancreaticStent', 'Coin', 'FiducialMark'], 'SCT': ['JejunostomyTube', 'Suture', 'IleostomyBag', 'ColostomyBag', 'VenaCavaFilter', 'UrostomyBag', 'UrostomySet', 'Needle', 'Prosthesis', 'Jewelry', 'RectalTube', 'Catheter', 'Staple', 'UrethralCatheter', 'ScarTissue', 'UreteralStent', 'Bullet', 'Pin', 'ColostomySet', 'IleostomySet']} name_for_cid[3001] = 'ECGLeads' 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', 'ChestLead', 'ChestLeadPerV4AndV4RPlacement', 'LeadV2R', 'ChestLeadPerV1AndV1RPlacement', 'LeadV3R', 'LeadV4R', 'LeadV5R', 'LeadV6R', 'LeadVFNonaugmentedVoltageVectorOfLL', 'ModifiedChestLead', 'ModifiedChestLeadPerV1Placement', 'ModifiedChestLeadPerV2Placement', 'ModifiedChestLeadPerV3Placement']} name_for_cid[12014] = 'OBFetalBodyWeightEquationsandTables' cid_concepts[12014] = \ {'LN': ['EFWByACHCHadlock1984', 'EFWByACBPDFLHadlock1985', 'EFWByBPDTTDHansmann1986', 'EFWByACBPDFLHCHadlock1985', 'EFWByACFLHCHadlock1985', 'EFWByACBPDHadlock1984', 'EFWByACCampbell1975', 'EFWByACAndBPDShepard1982', 'EFWByACFLHadlock1984', 'EFW3ByShinozuka1996', 'EFWByBPDAPADTADFLTokyo1987', 'EFWByACBPDFLHadlock1984', 'EFWByACFLHadlock1985', 'EFWByBPDFTAFLOsaka1990', 'EFW1ByShinozuka1996', 'EFW2ByShinozuka1996']} name_for_cid[9] = 'ImageGuidedTherapeuticProcedures' cid_concepts[9] = \ {'SCT': ['Thoracentesis', 'StentPlacement', 'CatheterManipulation', 'OcclusionOfCatheter', 'UltrasonicGuidanceForAmniocentesis', 'Amniocentesis', 'AtherectomyByRotaryCutter', 'PercutaneousRetrievalOfIntravascularForeignBody', 'AmnioinfusionInjectionOfAmnion', 'Vasoconstriction', 'Fetocide', 'IrrigationFollowingInsertionOfCatheter', 'PercutaneousInsertionOfIntravascularFilter', 'IntraArterialInfusionOfThrombolyticAgent', 'RemovalOfCatheter', 'AtherectomyByLaser', 'CatheterReplacement', 'Catheterization', 'IntrauterineCordocentesis', 'TranscatheterTherapyForEmbolization', 'Biopsy', 'Atherectomy', 'SelectiveEmbolizationOfArtery', 'RemovalOfForeignBody', 'ProstaglandinInjection', 'PercutaneousTransluminalBalloonAngioplasty', 'FailedAttemptedProcedure', 'IntrauterineTransfusion', 'TranscatheterDeploymentOfDetachableBalloon', 'BreechVersionObstetricalVersion', 'Vasodilatation']} name_for_cid[4005] = 'PartialViewSectionforMammography' cid_concepts[4005] = \ {'SCT': ['Central', 'Posterior', 'Lateral', 'Inferior', 'Anterior', 'Superior', 'Medial']} name_for_cid[6038] = 'MammographyQualitativeTemporalDifferenceType' cid_concepts[6038] = \ {'SCT': ['DifferenceInMargin', 'DifferenceInSymmetry', 'DifferenceInShape']} name_for_cid[7500] = 'NeighbourhoodGreyToneDifferenceBasedFeatures' cid_concepts[7500] = \ {} name_for_cid[3810] = 'VascularMorphology' cid_concepts[3810] = \ {'SCT': ['Embolism', 'Pseudoaneurysm', 'Angioma', 'ArterialDissection', 'Stenosis', 'Plaque', 'Tortuosity', 'Dilatation', 'VascularCoiling', 'VascularSclerosis', 'ArteriovenousFistula', 'Diverticulum', 'Thrombus', 'FibromuscularDysplasia', 'Aneurysm', 'Occlusion', 'Stent']} name_for_cid[7150] = 'SegmentationPropertyCategories' cid_concepts[7150] = \ {'SCT': ['SpatialAndRelationalConcept', 'AnatomicalStructure', 'Function', 'Substance', 'MorphologicallyAbnormalStructure', 'Tissue', 'PhysicalObject', 'BodySubstance']} name_for_cid[3113] = 'TypesofPerfusionDefects' cid_concepts[3113] = \ {'DCM': ['FalsePositiveDefectFinding'], 'SCT': ['PartiallyReversibleMyocardialPerfusionDefect', 'FixedMyocardialPerfusionDefect', 'ReversibleMyocardialPerfusionDefect']} name_for_cid[3406] = 'NoncoronaryTranscatheterInterventions' cid_concepts[3406] = \ {'DCM': ['VascularIntervention', 'MyocardialBiopsy', 'AorticIntervention', 'SeptalDefectIntervention', 'ValvularIntervention']} name_for_cid[7445] = 'DeviceParticipatingRoles' cid_concepts[7445] = \ {'DCM': ['Recording', 'XRayReadingDevice', 'IrradiatingDevice']} name_for_cid[7015] = 'ExportDelayReasons' cid_concepts[7015] = \ {'DCM': ['DelayExportUntilPatientDies', 'DelayExportUntilPatientIsDischarged', 'DelayExportUntilExpertReviewIsAvailable', 'DelayExportUntilClinicalInformationIsAvailable', 'DelayExportUntilFinalReportIsAvailable', 'DelayExportUntilHistopathologyIsAvailable', 'DelayExportUntilConfirmationOfDiagnosisIsAvailable', 'DelayExportUntilOtherLaboratoryResultsAreAvailable']} name_for_cid[12002] = 'UltrasoundProtocolStageTypes' cid_concepts[12002] = \ {'SCT': ['AfterProcedure', 'ValsalvaManeuver', 'CardiacStressState', 'Hyperventilation', 'BeforeProcedure', 'PeakCardiacStressState', 'CardiacPacing', 'CardiacStressRecoveryState', 'DuringProcedure', 'HandGrip', 'RestingState']} name_for_cid[3739] = 'CathProcedureType' cid_concepts[3739] = \ {'DCM': ['PercutaneousCoronaryIntervention'], 'SCT': ['CatheterizationOfBothLeftAndRightHeartWithGraft', 'CatheterizationOfLeftHeart', 'CatheterizationOfBothLeftAndRightHeartWithoutGraft', 'CatheterizationOfRightHeart']} name_for_cid[4013] = 'AnatomicRegionforMammography' cid_concepts[4013] = \ {'SCT': ['Breast']} name_for_cid[3555] = 'Pacing' cid_concepts[3555] = \ {'SCT': ['AtrialPacing', 'TemporaryTranscutaneousPacing', 'PacingWithMagnet', 'Pacing', 'AVSequentialPacing', 'VentricularPacing']} name_for_cid[9508] = 'NonspecificVolumes' cid_concepts[9508] = \ {'DCM': ['UnclassifiedVolume', 'UnclassifiedCombination']} name_for_cid[3806] = 'StenosisShape' cid_concepts[3806] = \ {'SCT': ['Eccentric', 'Concentric']} name_for_cid[7003] = 'DiagnosticImagingReportPurposesofReference' cid_concepts[7003] = \ {'DCM': ['BestIllustrationOfFinding', 'Baseline', 'SourceOfMeasurement', 'IllustrationOfROI']} name_for_cid[12281] = 'CardiacUltrasoundTargetSiteModifiers' cid_concepts[12281] = \ {'NCIt': ['Middle'], 'SCT': ['Distal', 'Proximal', 'Lateral', 'Posterior', 'Inferior', 'Anterior', 'Medial']} name_for_cid[7453] = 'PerformingRoles' 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[3410] = 'NumericParametersofDrugs/Contrast' cid_concepts[3410] = \ {'DCM': ['UndilutedDoseAdministered', 'Concentration', 'VolumeAdministered', 'MassAdministered', 'VolumeUnadministeredOrDiscarded', 'QuantityAdministered', 'RateOfAdministration', 'DurationOfAdministration']} name_for_cid[6096] = 'PregnancyStatus' cid_concepts[6096] = \ {'SCT': ['Unknown', 'PatientCurrentlyPregnant', 'NotPregnant', 'PossiblePregnancy']} name_for_cid[4101] = 'TracerKineticModels' cid_concepts[4101] = \ {'DCM': ['StandardToftsModel', 'ExtendedToftsModel', 'FirstPassLeakageProfileFPLPModel', 'ShutterSpeedModelSSM', 'GammaCapillaryTransitTimeGCTTModel', 'AdiabaticTissueHomogeneityATHModel', 'TwoCompartmentExchange2CXModel']} name_for_cid[8122] = 'MicroscopyIlluminatorandSensorColor' cid_concepts[8122] = \ {'SCT': ['Infrared', 'Ultraviolet', 'Red', 'FullSpectrum', 'Blue', 'Green']} name_for_cid[10068] = 'EstimateMethodTypes' cid_concepts[10068] = \ {'DCM': ['TabularDataAlgorithm', 'AnalyticalAlgorithm', 'EmpiricalAlgorithm'], 'MSH': ['MonteCarloMethod']} name_for_cid[12110] = 'LowerExtremityVeins' 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[12239] = 'CardiacOutputProperties' cid_concepts[12239] = \ {'SCT': ['CardiacOutput', 'StrokeIndex', 'CardiacIndex', 'StrokeVolume']} name_for_cid[7111] = 'Fiducials' 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[3502] = 'HemodynamicResistanceUnits' cid_concepts[3502] = \ {'UCUM': ['WoodU', 'PRU', 'DynScm5']} name_for_cid[618] = 'AirwayManagementMethodCodeTypefromAnesthesiaQualityInitiative(AQI)' cid_concepts[618] = \ {'DCM': ['NasalCannula'], 'SCT': ['ViaTracheostomy', 'AnestheticFaceMask', 'ArtificialRespiration', 'ControlledVentilation', 'OxygenTherapy', 'IntubationOfRespiratoryTract', 'LaryngealMaskAirwayLMA']} name_for_cid[6002] = 'ChangeSinceLastMammogramorPriorSurgery' cid_concepts[6002] = \ {'SCT': ['RemovalOfImplantSincePreviousMammogram', 'ImplantRevisedSincePreviousMammogram', 'NoSignificantChangesInTheFinding', 'IncreaseInSize', 'NewFinding', 'IncreaseInNumberOfCalcifications', 'DecreaseInNumberOfCalcifications', 'LessDefined', 'FindingPartiallyRemoved', 'MoreDefined', 'DecreaseInSize']} name_for_cid[3200] = 'StressTestProcedure' cid_concepts[3200] = \ {'SCT': ['ExerciseStressTest', 'PharmacologicStressTest', 'PacedStressTest', 'PharmacologicAndExerciseStressTest']} name_for_cid[3715] = 'LesionMargin' cid_concepts[3715] = \ {'SCT': ['Smooth', 'MultipleIrregularities', 'Ulcerative', 'Irregular']} name_for_cid[6147] = 'ResponseCriteria' cid_concepts[6147] = \ {'DCM': ['RECIST1Point0', 'RECIST1Point1', 'WHO'], 'NCIt': ['RANO']} name_for_cid[7306] = 'HumanHipImplantPlanningLandmarks' cid_concepts[7306] = \ {'DCM': ['AnatomicalAxisOfFemur', 'AcetabularCenterOfRotation', 'FemurHeadCenterOfRotation']} name_for_cid[30] = 'DICOMDevices' cid_concepts[30] = \ {'DCM': ['BoneMineralDensitometry', 'SlideMicroscopy', 'OphthalmicPhotography', 'FilmDigitizer', 'Workstation', 'Electrocardiography', 'GeneralMicroscopy', 'XRayAngiography', 'ExternalCameraPhotography', 'IntravascularUltrasound', 'ComputedRadiography', 'ComputationServer', 'MediaCreationDevice', 'ComputedTomography', 'OpticalSurfaceScanner', 'Thermography', 'Lensometry', 'OphthalmicTomographyEnFace', 'HemodynamicWaveform', 'OpticalCoherenceTomography', '_3DManufacturingModelingSystem', 'UltrasoundBoneDensitometry', 'Diaphanography', 'PositronEmissionTomography', 'CardiacElectrophysiology', 'LaserScan', 'HardCopyPrintServer', 'PanoramicXRay', 'OphthalmicMapping', 'OphthalmicTomographyBScanVolumeAnalysis', 'OphthalmicVisualField', 'DigitalRadiography', 'OphthalmicTomography', 'Mammography', 'Ultrasound', 'IntravascularOpticalCoherenceTomography', 'DepartmentSystemScheduler', 'ProcedureLogging', 'MagneticResonance', 'IntraOralRadiography', 'ComputerAssistedDetectionDiagnosis', 'RTImage', 'VisualAcuity', 'RespiratoryWaveform', 'Endoscopy', 'Autorefraction', 'RadiographicImaging', 'Radiofluoroscopy', 'Keratometry', 'Archive', 'ImageCapture', 'AutomatedSlideStainer', 'OphthalmicAxialMeasurements', 'NuclearMedicine', 'RadiationTherapyDevice', 'BiomagneticImaging', 'SubjectiveRefraction']} name_for_cid[10013] = 'CTAcquisitionType' cid_concepts[10013] = \ {'DCM': ['StationaryAcquisition', 'ConstantAngleAcquisition', 'FreeAcquisition', 'SequencedAcquisition'], 'SCT': ['SpiralAcquisition', 'ConeBeamAcquisition']} name_for_cid[4253] = 'VisualFieldStaticPerimetryFixationStrategy' cid_concepts[4253] = \ {'DCM': ['AutomatedOptical', 'BlindSpotMonitoring', 'MacularFixationTesting', 'ObservationByExaminer'], 'SCT': ['None']} name_for_cid[7185] = 'AbstractMultidimensionalImageModelAxisOrientation' cid_concepts[7185] = \ {'DCM': ['LeftToRight', 'RightToLeft', 'WallToSeptum', 'SeptumToWall', 'InferiorToAnterior', 'AnteriorToInferior', 'BaseToApex', 'ApexToBase', 'PosteriorToAnterior', 'AnteriorToPosterior', 'FootToHead', 'HeadToFoot']} name_for_cid[12307] = 'CardiacPhasesandTimePoints' cid_concepts[12307] = \ {'DCM': ['FullCardiacCycle', 'ARWave', 'AtrialDiastolicFillingDWave', 'PreEjectionPeriod', 'ElectromechanicalDelay'], 'SCT': ['Diastole', 'VentricularIsovolumicContraction', 'Diastasis', 'EndDiastole', 'EndSystole', 'AtrialSystoleAWave', 'VentricularEjectionSWave', 'DiastolicRapidInflowEWave', 'VentricularIsovolumicRelaxation', 'Systole']} name_for_cid[12242] = 'AorticValveFindingSites' cid_concepts[12242] = \ {'SCT': ['AorticValveRing']} name_for_cid[7490] = 'ResearchAnimalSourceRegistries' cid_concepts[7490] = \ {'DCM': ['ILCR']} name_for_cid[9524] = 'RadiotherapyProcedureTechniques' cid_concepts[9524] = \ {'DCM': ['StaticBeam', 'SlidingWindowBeam', 'SynchronizedRoboticTreatment', 'StepAndShootBeam', 'MultipleFixedSources', 'ConformalArcBeam', 'ArcBeam', 'TopographicBeam', 'HelicalBeam', 'VMAT', 'NonSynchronizedRoboticTreatment']} name_for_cid[3083] = 'UnitsofRadioactivity' cid_concepts[3083] = \ {'UCUM': ['Millicurie', 'Becquerel', 'Megabecquerel']} name_for_cid[6055] = 'BreastClinicalFindingorIndicatedProblem' cid_concepts[6055] = \ {'DCM': ['CancerElsewhere', 'NonBloodyDischarge', 'ImageDetectedMass', 'DifficultPhysicalClinicalExamination'], 'SCT': ['OEAxillaryLymphadenopathy', 'DiscolorationOfSkinOfBreast', 'BloodyNippleDischarge', 'DisseminatedMalignancyOfUnknownPrimary', 'PeauDOrangeSurfaceOfBreast', 'DisorderOfBreastImplant', 'SkinRetractionOfBreast', 'RadiographicCalcificationFinding', 'OELymphadenopathy', 'OEBreastLumpPalpated', 'BreastPain', 'SkinThickeningOfBreast', 'NippleDischargeSymptom', 'Erythema', 'NippleProblem', 'BreastLump']} name_for_cid[3607] = 'VenousSourceLocations' cid_concepts[3607] = \ {'SCT': ['InnominateVein', 'SubclavianVein', 'PosteriorMedialTributary', 'PortalVein', 'VenaAnonyma', '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[6405] = 'ChestNonlesionObjectTypeTissues' cid_concepts[6405] = \ {'SCT': ['ScarTissue']} name_for_cid[7701] = 'FiberTractsInBrainstem' cid_concepts[7701] = \ {'SCT': ['CorticospinalTractInBrainstem', 'MedialLemniscus', 'MedialLongitudinalFasciculus', 'InferiorCerebellarPeduncle', 'SuperiorCerebellarPeduncle', 'LateralLemniscus', 'MiddleCerebellarPeduncle']} name_for_cid[10044] = 'RadiosensitiveOrgans' 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[67] = 'ImagingAgentAdministrationCompletionStatus' cid_concepts[67] = \ {'DCM': ['TerminatedDueToFlowRateAboveTerminationLimit', 'TerminatedDueToConsumableRemoval', 'TerminatedDueToPressureAboveTerminationLimit', 'TerminatedDueToCriticalBatteryLevel', 'TerminatedByScanner', 'TerminatedDueToAirDetected', 'TerminatedDueToRequestFromOperator', 'TerminatedDueToInjectorCommunicationLoss', 'TerminatedDueToExcessiveDurationPause', 'TerminatedDueToUnspecifiedInjectorFailure'], 'SCT': ['Complete']} name_for_cid[6110] = 'LungAnatomyFindingorFeature' cid_concepts[6110] = \ {'DCM': ['MidlungWindow', 'SecondaryPulmonaryLobule'], 'SCT': ['SegmentOfLung', 'LobeOfLung']} name_for_cid[3742] = 'MedicationAdministration,PCI' cid_concepts[3742] = \ {'SCT': ['Contraindicated', 'AdministeredAfterPercutaneousCoronaryIntervention', 'AdministeredDuringPercutaneousCoronaryIntervention', 'NotAdministered', 'AdministeredPriorToPercutaneousCoronaryIntervention']} name_for_cid[634] = 'PhaseofAnimalHandling' cid_concepts[634] = \ {'DCM': ['InHomeCage', 'DuringTransport', 'StagingPriorToImaging', 'PreparationForImaging'], 'SCT': ['AnesthesiaInduction', 'ImagingProcedure'], 'UMLS': ['AnesthesiaRecoveryPeriod']} name_for_cid[4204] = 'OphthalmicFilter' cid_concepts[4204] = \ {'DCM': ['NoFilter'], 'SCT': ['BlueOpticalFilter', 'PolarizingOpticalFilter', 'YellowGreenOpticalFilter', 'GreenOpticalFilter', 'BlueGreenOpticalFilter', 'InfraredOpticalFilter', 'RedOpticalFilter']} name_for_cid[1006] = 'AnatomicalReferenceBasisExtremities' cid_concepts[1006] = \ {'SCT': ['Foot', 'KneeJoint', 'Toe', 'MalleolarStructureOfTibia', 'TibialPlateau', 'ElbowJoint', 'Patella', 'WristJoint', 'AnkleJoint', 'Metacarpal', 'Scaphoid', 'Talus']} name_for_cid[3484] = 'IVUSIndicesandRatios' cid_concepts[3484] = \ {'DCM': ['LumenShapeIndex', 'StentSymmetryIndex', 'StentExpansionIndex', 'PlaquePlusMediaEccentricityIndex', 'RemodelingIndex', 'LumenEccentricityIndex', 'StentDiameterRatio', 'EEMDiameterRatio', 'LumenDiameterRatio']} name_for_cid[12215] = 'EchocardiographyVenaCavae' cid_concepts[12215] = \ {'LN': ['InferiorVenaCavaDiameter', 'InferiorVenaCavaPercentCollapse', 'HeartRate']} name_for_cid[7202] = 'SourceImagePurposesofReference' cid_concepts[7202] = \ {'DCM': ['PredecessorContainingGroupOfImagingSubjects', 'ForProcessingPredecessor', 'MaskImageForImageProcessingOperation', 'SourceImageForImageProcessingOperation', 'LossyCompressedPredecessor', 'UncompressedPredecessor', 'FlowImageForImageProcessing', 'StructuralImageForImageProcessing', 'SourceImageForMontage']} name_for_cid[3611] = 'PressureMeasurements' 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[6043] = 'TypesofMammographyCADAnalysis' cid_concepts[6043] = \ {'DCM': ['IndividualImpressionRecommendationAnalysis', 'OverallImpressionRecommendationAnalysis'], 'SCT': ['FocalAsymmetricDensityAnalysis', 'BreastCompositionAnalysis', 'SpatialCollocationAnalysis', 'SpatialProximityAnalysis', 'TemporalCorrelation', 'ImageQualityAnalysis', 'AsymmetricBreastTissueAnalysis']} name_for_cid[3241] = 'HemodynamicMeasurementTechniques' cid_concepts[3241] = \ {'SCT': ['ThermistorCatheterMethod', 'TipManometerMethod', 'FiberopticCatheterMethod', 'DopplerCatheterMethod', 'FluidFilledCatheterMethod', 'HallCatheterMethod', 'AveragedHemodynamicMeasurementMethod', 'PulmonaryCapillaryWedgeMethod', 'ConductanceCatheterMethod', 'StaticCatheterMethod', 'CompositeHemodynamicMeasurementMethod', 'WedgeMethod', 'ComputedHemodynamicMeasurementMethod', 'DualCatheterMethod', 'PullbackMethod']} name_for_cid[3754] = 'VascularComplications' cid_concepts[3754] = \ {'SCT': ['LossOfDistalPulse', 'Pseudoaneurysm', 'AVFistula', 'ArterialDissection', 'OcclusionOfArtery', 'Bleeding']} name_for_cid[6106] = 'AbnormalTextureFindingorFeature' cid_concepts[6106] = \ {'DCM': ['MosaicPattern', 'ReticulonodularPattern', 'NodularPattern', 'ReticularPattern', 'AbnormalInterstitialPattern', 'SmallIrregularOpacities', 'GranularPattern', 'HoneycombPattern', 'MiliaryPattern']} name_for_cid[71] = 'ImagingAgentAdministrationInjectorEventType' cid_concepts[71] = \ {'DCM': ['TerminatedDueToUnspecifiedInjectorFailure', 'FlowRateAboveAdjustmentLimit', 'AirDetected', 'SyringeDetached', 'FlowRateAboveWarningLimit', 'SyringeAttached', 'PressureAboveAdjustmentLimit', 'KeepVeinOpenEnded', 'PressureAboveWarningLimit', 'KeepVeinOpenStarted', 'TerminatedDueToFlowRateAboveTerminationLimit', 'TerminatedDueToConsumableRemoval', 'TerminatedDueToPressureAboveTerminationLimit', 'TerminatedDueToCriticalBatteryLevel', 'FixedDurationPauseEnded', 'TerminatedByScanner', 'EquipmentFailure', 'TerminatedDueToAirDetected', 'TerminatedDueToRequestFromOperator', 'TerminatedDueToInjectorCommunicationLoss', 'TerminatedDueToExcessiveDurationPause', 'ResourceInadequate']} name_for_cid[1010] = 'ReferenceGeometryPlanes' cid_concepts[1010] = \ {'DCM': ['PlaneThroughDistalExtent', 'PlaneThroughProximalExtent', 'PlaneThroughLateralExtent', 'PlaneThroughMedialExtent', 'PlaneThroughRightmostExtent', 'PlaneThroughLeftmostExtent', 'PlaneThroughPosteriorExtent', 'PlaneThroughAnteriorExtent', 'PlaneThroughCenter', 'PlaneThroughInferiorExtent', 'PlaneThroughSuperiorExtent']} name_for_cid[622] = 'MedicationTypeCodeTypefromAnesthesiaQualityInitiative(AQI)' cid_concepts[622] = \ {'SCT': ['OcularLubricant', 'CaloricAgent', 'Vasoconstrictor', 'CarbapenemAntibiotic', 'BetaLactamAntibiotic', 'AminoglycosideAntibiotic', 'Potassium', 'LocalAnesthetic', 'NasalDecongestant', 'Anticoagulant', 'PenicillinAntibiotic', 'ThyroidHormone', 'MetronidazoleAntibiotic', 'Calcium', 'Magnesium', 'AntidiureticHormone', 'Oxytocic', 'InotropicAgent', 'Estrogen', 'Antiarrhythmic', 'Barbiturate', 'Benzodiazepine', 'SulfonamideAntibiotic', 'Diuretic', 'VancomycinAntibiotic', 'Antifungal', 'Hypoglycemic', 'Steroid', 'LowMolecularWeightHeparin', 'RespiratoryStimulant', 'AntiHeparinAgent', 'Anticholinergic', 'NeuromuscularBlockingNMBNonDepolarizing', 'DrugDiluent', 'GeneralAnesthetic', 'HemostaticAgent', 'MacrolideAntibiotic', 'Antihypertensive', 'Antibiotic', 'Antihistamine', 'AdrenergicAgent', 'QuinoloneAntibiotic', 'NSAID', 'Vitamin', 'Antiemetic', 'BloodProduct', 'Vasodilator', 'BenzodiazepineAntagonist', 'CalciumChannelBlocker', 'CephalosporinAntibiotic', 'CholinergicAgent', 'GastrointestinalProkinetic', 'PlasmaExpander', 'Anticonvulsant', 'BetaBlocker', 'Bronchodilator', 'TetracyclineAntibiotic', 'SkeletalMuscleRelaxant', 'NarcoticOpiateAntagonist', 'LincomycinAntibiotic', 'NeuromuscularBlockingNMBDepolarizing', 'LinezolidAntibiotic', 'Analgesic'], 'UMLS': ['H2Antagonist', 'NarcoticAnalgesic', 'Antihypoglycemic']} name_for_cid[12203] = 'LeftVentricleOther' cid_concepts[12203] = \ {'LN': ['LeftVentricularIsovolumicRelaxationTime', 'LeftVentricleMass'], 'SCT': ['LeftVentricularPeakSystolicTissueVelocity', 'RatioOfMVPeakVelocityToLVPeakTissueVelocityEWave', 'LeftVentricularIndexOfMyocardialPerformance', 'LVPeakDiastolicTissueVelocityDuringAtrialSystole', 'LeftVentricularIsovolumicContractionTime', 'LeftVentricularPeakEarlyDiastolicTissueVelocity']} name_for_cid[3492] = 'VascularDissectionClassifications' cid_concepts[3492] = \ {'DCM': ['MedialDissection', 'IntraStentDissection', 'AdventitialDissection', 'IntimalDissection'], 'SCT': ['IntramuralHematoma']} name_for_cid[4029] = 'DermatologyAnatomicSites' 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', 'NailOfFourthToe', 'SkinOfSupraclavicularRegionOfNeck', 'SkinOfAnteriorSurfaceOfLowerLeg', 'SkinOfMedialCanthus', 'FemaleExternalUrethralOrifice', 'SkinOfAnteriorSurfaceOfUpperArm', 'SkinOfAnteriorSurfaceOfForearm', 'SkinOfPosteriorSurfaceOfForearm', 'SkinOfChin', 'SkinOfTemporalRegion', 'NailOfMiddleFinger', 'SkinOfLowerEyelid', 'MucosaOfMandibularGingiva', 'SkinOfInguinalRegion', 'NailOfSecondToe', 'SkinOfLabium', 'SkinOfPerineum', 'MaleExternalUrethralOrifice', 'SkinOfUpperAbdomen', 'SkinOfLowerLip', 'Cornea', 'Eyelash', 'SkinOfEyeRegion', 'SkinOfAntitragus', 'SkinOfScalp', 'SkinOfMedialSurfaceOfThigh', 'SkinOfAreola', 'SkinOfEarLobule', 'SkinOfNuchalRegion', 'SkinOfPrepuceOfClitoris', 'SkinOfPosteriorSurfaceOfElbow', 'SkinOfBack', 'SkinOfPoplitealFossa', 'VulvalVestibule', 'SkinOfPosteriorSurfaceOfUpperArm', 'SkinOfLateralPartOfHeel', 'SkinOfUmbilicus', 'SkinOfSupraorbitalArea', 'FrenulumOfLabiaMinora', 'SkinOfLateralCanthus', 'SkinOfBackOfUpperThoracicRegion', 'NailOfIndexFinger', 'SkinOfLowerChestWall', 'SkinOfUpperExtremity', 'SkinOfNasolabialFold', 'SkinOfThenarRegionOfPalm', 'SkinOfHeel', 'SkinOfAntecubitalFossa', 'SkinOfExternalGenitalia', 'MucosaOfUpperLip', 'SkinOfSubmentalArea', 'SkinOfClitoris', 'SkinOfPostauricularRegion', 'SkinOfForehead', 'MucosaOfMaxillaryGingiva', 'SkinOfAnteriorSurfaceOfKnee', 'SkinOfLips', 'MucosaOfTipOfTongue', 'SkinOfSideOfNose', 'SkinOfLowerBack', 'SkinOfPhiltrum', 'Sclera', 'SkinOfTragus', 'SkinOfFace', 'SkinOfCavityOfConcha', 'SkinOfEpigastricArea', 'SkinOfPalmOfHand', 'SkinOfTipOfNose', 'SkinOfLateralAspectOfAnkle', 'SkinOfCrusOfHelix', 'VaginalIntroitus', 'SkinOfAnteriorPortionOfNeck', 'SkinOfLowerAbdomen', 'SkinOfExternalAuditoryCanal', 'SkinOfAnteriorSurfaceOfThigh', 'SkinOfNeck', 'SkinOfLateralPortionOfNeck', 'SkinOfAbdomen', 'SkinOfLabiumMinus', 'Tooth', 'SkinOfDigitOfHand', 'SubmandibularTriangle', 'SkinOfHead', 'SkinOfLowerExtremity', 'SkinOfMedialPartOfHeel', 'SkinOfRootOfPenis', 'SkinOfPartOfDorsalSurfaceOfHand', 'SkinOfMedialAspectOfAnkle', 'SkinOfGlutealFold', 'SkinOfLabiumMajus', 'SkinOfButtock', 'SkinOfLateralBorderOfSoleOfFoot', 'SkinOfParietalRegion', 'SkinOfEyebrow', 'SkinOfHand', 'NailOfFifthToe', 'NailOfThirdToe', 'SkinOfPosteriorSurfaceOfLowerLeg', 'SkinOfAlaNasi', 'PosteriorCommissureOfLabiumMajorum', 'SkinOfUpperLip', 'SkinOfPosteriorSurfaceOfThorax', 'SkinOfToe', 'SkinOfPosteriorSurfaceOfThigh', 'SkinOfGlansPenis', 'SkinOfNose', 'SkinOfVertexOfScalp', 'SkinOfPalmarAreaOfWrist', 'SkinOfHelixOfEar', 'SkinOfInfraclavicularRegion', 'Iris', 'SkinOfAxilla', 'SkinOfShaftOfPenis', 'NailOfFinger', 'MucosaOfTongue', 'SkinOfHypothenarRegionOfPalm', 'SkinOfAnteriorSurfaceOfThorax', 'OralMucosa', 'GroinSkinCrease', 'SkinOfAnteriorTrunk', 'NailOfToe', 'SkinOfUpperEyelid', 'SkinOfEar', 'SkinOfPreauricularRegion', 'NailOfGreatToe', 'NailOfLittleFinger', 'SkinOfAnus', 'SternalSkin', 'Hair', 'AnteriorTriangleOfNeck', 'MucosaOfLowerLip', 'Skin', 'SkinOfNipple', 'SkinOfPerioralRegionOfFace', 'SkinOfCheek', 'SkinOfJawline', 'NailOfRingFinger', 'NailOfThumb', 'SkinOfFoot', 'SkinOfIntertragalIncisure', 'SkinOfDorsalAreaOfWrist', 'SkinOfHypogastricRegion', 'SkinOfScrotum', 'SkinOfUpperTrunk', 'Retina', 'SkinOfPenis', 'SkinOfMedialBorderOfSoleOfFoot']} 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[26] = 'NuclearMedicineProjections' cid_concepts[26] = \ {'SCT': ['MedialLateral', 'SagittalObliqueAxial', 'LeftLateralProjection', 'VerticalLongAxis', 'HorizontalLongAxis', 'Sagittal', 'RightPosteriorOblique', 'LeftAnteriorOblique', 'PosteriorProjection', 'AnteriorProjection', 'Axial', 'LateralMedial', 'RightAnteriorOblique', 'LeftPosteriorOblique', 'ShortAxis', 'MedioLateralOblique', 'Lateral', 'RightLateralProjection', 'LateroMedialOblique', 'Coronal', 'ObliqueAxial', 'Transverse']} name_for_cid[7310] = 'ImplantFixationMethod' cid_concepts[7310] = \ {'DCM': ['Bolting', 'Wedging', 'Pinning', 'Sewing'], 'SCT': ['RepairByNailing', 'Anchoring', 'Gluing', 'UncementedComponentFixation', 'CementedComponentFixation', 'InternalFixationUsingStaple', 'InternalFixationUsingInternalFixatorSystem', 'Fusion', 'InternalFixationUsingPlate', 'InternalFixationUsingScrew']} name_for_cid[6151] = 'BackgroundEchotexture' cid_concepts[6151] = \ {'DCM': ['HomogeneousFatEchotexture', 'HomogeneousFibroglandularEchotexture', 'HeterogeneousEchotexture']} name_for_cid[3703] = 'WallMotion' cid_concepts[3703] = \ {'DCM': ['NotVisualized'], 'SCT': ['ModerateHypokinesis', 'HyperkineticRegion', 'Hypokinesis', 'SevereHypokinesis', 'Unknown', 'NormalWallMotion', 'MildHypokinesis', 'Akinesis', 'NotEvaluated', 'Dyskinesis']} name_for_cid[7039] = 'PediatricSizeCategories' cid_concepts[7039] = \ {'SCT': ['BroselowLutenPurpleZone1011kg', 'BroselowLutenYellowZone1214kg', 'BroselowLutenWhiteZone1518kg', 'BroselowLutenGreenZone3036kg', 'BroselowLutenBlueZone1923kg', 'BroselowLutenPinkZone67kg', 'BroselowLutenOrangeZone2429kg', 'BroselowLutenRedZone89kg']} name_for_cid[225] = 'MeasurementUncertaintyConcepts' cid_concepts[225] = \ {'SCT': ['RangeOfUpperMeasurementUncertainty', 'RangeOfMeasurementUncertainty', 'RangeOfLowerMeasurementUncertainty']} name_for_cid[7469] = 'GenericIntensityandSizeMeasurements' cid_concepts[7469] = \ {'DCM': ['ApparentDiffusionCoefficient', 'DiffusionWeighted', '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', '', 'SpeedOfSound', 'Vp', 'Perfusion', 'Elasticity', 'EquivalentDose', 'AbsorbedDose', 'YBRFULLCRComponent', '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', 'R2', 'VolumetricDiffusionDxzComponent', 'MagneticSusceptibility', 'VolumetricDiffusionDxyComponent', 'VolumetricDiffusionDxxComponent', 'RelativeRegionalBloodFlow', 'RelativeRegionalBloodVolume', 'Ktrans', 'Kep', 'Ve', 'BloodOxygenationLevel', 'T2WeightedDynamicContrastEnhancedMRSignalIntensity', 'T2WeightedDynamicContrastEnhancedMRSignalIntensity', 'AbsoluteRegionalBloodFlow', 'T1WeightedDynamicContrastEnhancedMRSignalIntensity', 'AbsoluteRegionalBloodVolume', 'VolumetricDiffusionDzzComponent', 'OxygenExtractionFraction', 'R1', 'VolumetricDiffusionDyzComponent', 'R2', 'VolumetricDiffusionDyyComponent', 'VelocityEncoded', 'ZScore', 'ContrastAgentAngioMRSignalIntensity', 'SpinTaggingPerfusionMRSignalIntensity', 'RelativeAnisotropy', 'FractionalAnisotropy', 'FieldMapMRSignalIntensity', 'T2WeightedMRSignalIntensity', 'T2WeightedMRSignalIntensity', 'T1WeightedMRSignalIntensity', 'ProtonDensityWeightedMRSignalIntensity', 'TimeOfFlightAngioMRSignalIntensity', 'T1', 'T2', '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': ['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[7193] = 'PhysicalObjectSegmentationPropertyTypes' cid_concepts[7193] = \ {'DCM': ['OtherMarker', 'Mold', 'BrachytherapyChannelShield', 'HeadAndNeckMask', 'BrachytherapySourceApplicator', 'HeadMask', 'Headframe', 'BodyFrame', 'BreastBoard', 'Cast', 'WholeBodyPod', 'VacuumMold', 'Portacath', 'ChestTube', 'CentralLine', 'KidneyStent', 'PancreaticStent', 'NippleRing', 'Coin', 'BrachytherapyChannel', 'RectalBalloon', 'FiducialMark', 'VaginalCylinder', 'IonChamberArray', 'DiodeArray', 'LiquidIonChamber', 'Diode', 'IonChamber', 'OSLD', 'DiamondDetector', 'Sphere'], 'SCT': ['Suture', 'Chair', 'ForeignBody', 'Glue', 'InlayDentalRestoration', 'EmbolizationCoil', 'Jewelry', 'Prosthesis', 'MOSFETRadiationTherapyDosimetrySystemDosimeter', 'Catheter', 'EndotrachealTube', 'MeasuringRuler', 'Collimator', 'RotationalAtherectomyDevice', 'Bullet', 'DentalProsthesis', 'GuidingCatheter', 'ThermoluminescentRadiationDosimeter', 'OpaqueMarker', 'BiteBlock', 'CardiacPacemakerLead', 'Clip', 'BoneScrew', 'CervicalCollar', 'DetachableBalloon', 'JejunostomyTube', 'RadioactiveImplant', 'CardiacPacemaker', 'JWire', 'VenaCavaFilter', 'HeartValveProsthesis', 'Needle', 'AtherectomyDevice', 'EmbolizationParticulate', 'FeedingTube', 'Laser', 'Table', 'Tracheotomy', 'Staple', 'CompressionPaddle', 'UretericStent', 'EmbolizationBall', 'PercutaneousTransluminalAngioplastyBalloon', 'BonePin', 'BBShotLeadPellet', 'Defibrillator', 'Headrest', 'CardiacPacemaker', 'DigitalImager', 'IDPlate', 'Clothing', 'LeftVentricularAssistDevice', 'Stent', 'Implant']} name_for_cid[4245] = 'WideFieldOphthalmicPhotographyTransformationMethod' cid_concepts[4245] = \ {'DCM': ['SphericalProjection', 'SurfaceContourMapping']} name_for_cid[9532] = 'NoParameterDosimetricObjectives' cid_concepts[9532] = \ {'DCM': ['MinimizeMeterset']} name_for_cid[7486] = 'MixedBreeds' cid_concepts[7486] = \ {'SCT': ['MixedBreedGoat', 'MixedBreedCattle', 'MixedBreedChicken', 'MixedBreedDog', 'MixedBreedCat', 'MixedBreedPig', 'MixedBreedHorse', 'MixedBreedSheep']} name_for_cid[12254] = 'CardiacUltrasoundHemodynamicMeasurements' cid_concepts[12254] = \ {'DCM': ['Tau', 'IndicatorMeanTransitTime', 'RRInterval'], 'LN': ['PreEjectionPeriod', 'EjectionTime', 'AWaveDuration', 'EnvelopeDuration', 'TimeToPeakByUS', 'DpDtByUS', 'HeartRateCorrectedEjectionTime', 'FillingTime', 'HeartRateCorrectedPreEjectionPeriod', 'PreEjectionPeriodEjectionTimeRatio', 'IsovolumicContractionTime', 'ClosureToOpeningTime', 'IsovolumicRelaxationTime'], 'SCT': ['BloodPressure']} pydicom-2.4.3/pydicom/sr/_concepts_dict.py000066400000000000000000123134261446675437500206470ustar00rootroot00000000000000# Auto-generated by generate_concept_dicts.py. # -*- coding: utf-8 -*- # 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['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, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, 'AVSequentialPacing': {'371910005': ('A-V sequential pacing', [3555])}, 'Abdomen': {'113345001': ('Abdomen', [4030, 12020, 4031, 7483, 7482, 4040, 7154, 4042, 9514, 7192, 7151, 4, 4009])}, 'AbdomenAndOrPelvisStructure': {'416949008': ('Abdomen and/or pelvis ' 'structure (body structure)', [])}, 'AbdomenAndPelvis': {'416949008': ('Abdomen and Pelvis', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'AbdominalAorta': {'7832008': ('Abdominal aorta', [3604, 4030, 7154, 3010, 12291, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'AbdominalAortaStructure': {'7832008': ('Abdominal aorta structure (body ' 'structure)', [])}, 'AbdominalAorticAneurysmStenting': {'307701005': ('Abdominal aortic aneurysm ' 'stenting', [3721])}, 'AbdominalApproach': {'66739002': ('Abdominal approach (qualifier value)', [])}, 'AbdominalCavity': {'52731004': ('Abdominal cavity', [7154, 9514, 7192, 7151])}, 'AbdominalCavityStructure': {'52731004': ('Abdominal cavity structure (body ' 'structure)', [])}, 'AbdominalLymphNode': {'8568009': ('abdominal lymph node', [7600])}, 'AbdominalLymphNodeStructure': {'8568009': ('Abdominal lymph node structure ' '(body structure)', [])}, 'AbdominalStructure': {'113345001': ('Abdominal structure (body structure)', [])}, 'AbdominalWallMuscle': {'195879000': ('Abdominal wall muscle', [7154, 9514, 7192, 7151])}, 'AbducensNerve': {'80622005': ('abducens nerve', [7710, 7706])}, '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', [3120, 222, 242])}, 'AbnormalECG': {'102594003': ('Abnormal ECG', [12246, 3677, 3201, 3221])}, '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', [7159, 6031, 6030, 7194, 7151])}, 'AbsenceFindings': {'272519000': ('Absence findings (qualifier value)', [])}, 'Absent': {'272519000': ('Absent', [241, 240])}, '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', [4010, 501])}, 'AcanthioparietalProjection': {'399242004': ('Acanthioparietal projection ' '(qualifier value)', [])}, 'Accentuated': {'428691001': ('accentuated', [3210])}, 'AccessoryAtrioventricularBundle': {'8225009': ('Accessory atrioventricular ' 'bundle', [3011])}, 'AccessoryNerve': {'15119000': ('accessory nerve', [7710, 7706])}, 'AccessoryNerveStructure': {'15119000': ('Accessory nerve structure (body ' 'structure)', [])}, 'AccessoryRenalArtery': {'85383006': ('Accessory Renal Artery', [12103, 12115, 9514, 7192, 12111, 7151, 3827])}, 'AccidentAndEmergency': {'225728007': ('Accident and Emergency', [7030])}, 'AccidentAndEmergencyDepartment': {'225728007': ('Accident and Emergency ' 'department (environment)', [])}, 'AcehCattleBreed': {'133655001': ('Aceh cattle breed', [7480])}, 'Acepromazine': {'96218000': ('Acepromazine', [626, 623])}, 'Acetabulum': {'37783008': ('Acetabulum', [1005, 1001, 1000])}, 'AcetateC11': {'129513004': ('Acetate C^11^', [4021])}, 'AceticAcid': {'2869004': ('Acetic acid', [8114])}, 'AchhamCattleBreed': {'133656000': ('Achham cattle breed', [7480])}, 'AcidFastStain': {'406976001': ('acid fast stain', [8112])}, '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', [8112])}, 'AcriflavineStain': {'17693003': ('acriflavine stain', [8112])}, 'AcromioclavicularJoint': {'85856004': ('Acromioclavicular Joint', [6113, 4030, 6109, 4031, 1004, 6102, 1001, 4042, 1000, 9514, 7192, 7151, 4, 4009])}, 'AcromioclavicularJointStructure': {'85856004': ('Acromioclavicular joint ' 'structure (body structure)', [])}, 'AcromionProcessOfScapula': {'31934006': ('Acromion process of scapula', [6115])}, 'AcrylicPolymer': {'261712009': ('Acrylic polymer (substance)', [])}, 'AcrylicResin': {'261712009': ('Acrylic resin', [8115])}, 'ActiveIngredient': {'127489000': ('Active Ingredient', [4050])}, 'ActiveProblem': {'394774009': ('Active problem', [3770])}, 'AcuteFebrileMucocutaneousLymphNodeSyndrome': {'75053002': ('Acute febrile ' 'mucocutaneous ' 'lymph node ' 'syndrome', [12249, 12248])}, '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', [6130])}, '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', [641, 638])}, 'Adenocarcinoma': {'35917007': ('Adenocarcinoma', [639, 638])}, 'AdenocarcinomaNoSubtype': {'35917007': ('Adenocarcinoma, no subtype ' '(morphologic abnormality)', [])}, 'AdenocarcinomaWithApocrineMetaplasia': {'22694002': ('Adenocarcinoma with ' 'apocrine metaplasia ' '(morphologic ' 'abnormality)', [])}, 'Adenohypophysis': {'62818001': ('Adenohypophysis', [7153, 9514, 7192, 7151])}, 'AdenohypophysisStructure': {'62818001': ('Adenohypophysis structure (body ' 'structure)', [])}, 'AdenoidCysticCarcinoma': {'11671000': ('Adenoid cystic carcinoma', [6030, 6033])}, 'AdenoidalStructure': {'55940004': ('Adenoidal structure (body structure)', [])}, 'Adenolipoma': {'22024005': ('Adenolipoma', [6031, 6030])}, 'Adenoma': {'32048006': ('Adenoma', [6031, 6030])}, 'AdenomaNoSubtype': {'32048006': ('Adenoma, no subtype (morphologic ' 'abnormality)', [])}, 'Adenomyoepithelioma': {'128765009': ('Adenomyoepithelioma', [6031, 6030])}, 'Adenosine': {'108502004': ('Adenosine', [3204])}, 'AdenosineA2ReceptorAgonist': {'432062000': ('Adenosine A2 receptor agonist', [3204])}, 'AdenosinePreparation': {'108502004': ('Adenosine preparation (product)', [])}, 'AdenosineStressProtocol': {'424444005': ('Adenosine Stress protocol', [12001, 3261])}, 'Adenosis': {'57597008': ('Adenosis', [6031, 6030])}, 'AdjunctIntent': {'421974008': ('Adjunct intent', [3629])}, 'AdjuvantIntent': {'373846009': ('Adjuvant intent', [3629])}, 'AdministeredAfterLabVisit': {'371899006': ('Administered after lab visit', [3741])}, 'AdministeredAfterPercutaneousCoronaryIntervention': {'371902009': ('Administered ' 'After ' 'Percutaneous ' 'Coronary ' 'Intervention', [3743, 3742])}, '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', [1005, 4030, 7154, 10060, 1001, 6204, 1000, 9514, 7192, 7151, 6202, 4, 10044])}, 'AdrenalStructure': {'23451007': ('Adrenal structure (body structure)', [])}, 'AdrenergicAgent': {'86308005': ('Adrenergic agent', [621, 622])}, 'Adventitia': {'30180000': ('Adventitia', [7156, 9514, 7192, 7151])}, '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', [3815, 631, 12102, 633, 61, 12002])}, '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', [13, 12, 6211, 3850])}, 'AirHeatingPad': {'468192005': ('Air heating pad', [635])}, 'AirHeatingPadSystem': {'468192005': ('Air heating pad system (physical ' 'object)', [])}, 'AirTrapping': {'76171001': ('Air-trapping', [6105, 6108, 6102])}, 'AiredaleTerrier': {'3921008': ('Airedale terrier', [7480])}, 'AirwayManagement': {'386509000': ('Airway management (procedure)', [])}, 'AirwayStructure': {'89187006': ('Airway structure', [6109, 6102, 9514, 7192, 6111, 7151])}, 'AkbashDogBreed': {'132531008': ('Akbash dog breed', [7480])}, 'AkhaPigBreed': {'133172007': ('Akha pig breed', [7480])}, 'AkhalTekeHorseBreed': {'133121003': ('Akhal-Teke horse breed', [7480])}, 'Akinesis': {'195675009': ('Akinesis', [3706, 3703])}, '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])}, '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': {'160573003': ('Alcohol consumption', [3774])}, 'AlcoholIntake': {'160573003': ('Alcohol intake (observable entity)', [])}, 'AlcoholSolubleNigrosineStain': {'47995002': ('alcohol soluble nigrosine ' 'stain', [8112])}, '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', [7483, 7482])}, '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', [6001, 6000])}, 'AlmostEntirelyFatBreastComposition': {'129716005': ('Almost entirely fat ' 'breast composition ' '(finding)', [])}, 'AlongEdge': {'57183005': ('Along edge (qualifier value)', [])}, 'AlphaAdrenergicBlockingAgent': {'67440007': ('Alpha-adrenergic blocking ' 'agent', [10])}, 'Alphachloralose': {'277016007': ('Alphachloralose', [625, 623])}, 'Alphadolone': {'125707004': ('Alphadolone', [625, 623])}, '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])}, 'AluminumANDORAluminumCompound': {'105830007': ('Aluminum AND/OR aluminum ' 'compound (substance)', [])}, 'AluminumOrAluminumCompound': {'105830007': ('Aluminum or Aluminum compound', [10006, 10067])}, 'AluminumOxide': {'83881004': ('Aluminum Oxide', [300])}, 'AlurCattleBreed': {'131442004': ('Alur cattle breed', [7480])}, 'AmbuBag': {'371785003': ('Ambu Bag', [3554])}, 'AmelanoticMelanoma': {'70594002': ('Amelanotic melanoma', [639, 638])}, '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', [6011, 6010])}, 'Amphetamine': {'703842006': ('Amphetamine', [6089])}, 'AmritMahalZebuCattleBreed': {'133594007': ('Amrit Mahal zebu cattle breed', [7480])}, 'AmritmahalCattleBreed': {'133594007': ('Amritmahal cattle breed (organism)', [])}, 'Amygdala': {'4958002': ('Amygdala', [7153, 7140, 9514, 7192, 7151])}, 'AmygdaloidStructure': {'4958002': ('Amygdaloid structure (body structure)', [])}, 'Amyloid': {'37279009': ('Amyloid (tumor)', [6031, 6030])}, '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': ('Anatomical reference plane (body ' 'structure)', [])}, 'AnatomicalStructure': {'123037004': ('Anatomical Structure', [7150]), '91723000': ('Anatomical Structure', [9501])}, '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])}, '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, 12246, 3201])}, 'Angiography': {'77343006': ('Angiography', [3405, 3428])}, 'Angiolipoma': {'73219006': ('Angiolipoma', [6031, 6030])}, 'Angioma': {'2099007': ('angioma', [3810])}, 'Angiomatosis': {'14350002': ('Angiomatosis', [6031, 6030])}, '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])}, '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', [4030, 4031, 7304, 1001, 4042, 1000, 9514, 7192, 7151, 4, 4009, 1006])}, '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', [3010, 4042, 9514, 7192, 7151, 4, 3630, 3607])}, 'AntecubitalVein': {'128553008': ('Antecubital vein', [3010, 4042, 9514, 7192, 7151, 4, 3630, 3607])}, 'AntegradeDirection': {'263677008': ('Antegrade Direction', [12306])}, 'AntegradeFlow': {'263677008': ('Antegrade Flow', [12221])}, 'Anterior': {'255549009': ('Anterior', [3019, 211, 6025, 2, 6024, 212, 5, 4005, 12281])}, 'AnteriorAuricularLymphNode': {'25247006': ('anterior auricular lymph node', [7600])}, 'AnteriorCardiacVein': {'194996006': ('Anterior Cardiac Vein', [3839, 3010, 4042, 9514, 7192, 7151, 3827, 4])}, 'AnteriorCerebralArtery': {'60176003': ('Anterior Cerebral Artery', [12105, 12103, 9514, 7192, 7151, 3827])}, 'AnteriorCervicalLymphNode': {'5727003': ('anterior cervical lymph node', [7600])}, 'AnteriorChamber': {'31636006': ('Anterior Chamber', [4233])}, 'AnteriorChamberOfEye': {'31636006': ('Anterior chamber of eye', [4211, 4209])}, 'AnteriorChamberOfEyeStructure': {'31636006': ('Anterior chamber of eye ' 'structure (body structure)', [])}, 'AnteriorCommissure': {'62872008': ('anterior commissure', [7705, 7710, 7101, 7111])}, 'AnteriorCommunicatingArtery': {'8012006': ('Anterior Communicating Artery', [12105, 3604, 12103, 3010, 4042, 9514, 7192, 3606, 7151, 3827, 4, 3630])}, '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)', [])}, 'AnteriorHornLateralVentricle': {'30399003': ('Anterior Horn Lateral ' 'Ventricle', [12022])}, 'AnteriorMediastinalLymphNode': {'5296000': ('anterior mediastinal lymph node', [7600])}, 'AnteriorMiddleCerebralArteryBifurcation': {'397418009': ('Anterior-Middle ' 'Cerebral Artery ' 'Bifurcation', [12105, 12103, 9514, 7192, 7151, 3827])}, 'AnteriorPosteriorCerebralArteryBifurcation': {'397419001': ('Anterior-Posterior ' 'Cerebral Artery ' 'Bifurcation', [12105, 12103, 9514, 7192, 7151, 3827])}, 'AnteriorProjection': {'399321004': ('Anterior projection', [501, 26])}, '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', [3604, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'AnteriorTibialArtery': {'68053000': ('Anterior Tibial Artery', [12109, 12103, 3010, 4042, 9514, 7192, 7151, 3827, 4])}, 'AnteriorTibialLymphNode': {'303713004': ('anterior tibial lymph node', [7600])}, 'AnteriorTibialVein': {'26703007': ('Anterior Tibial Vein', [12103, 9514, 7192, 7151, 3827, 12110])}, 'AnteriorTriangleOfNeck': {'182329002': ('Anterior triangle of neck', [4029])}, 'AnteriorWall': {'263943000': ('Anterior Wall', [12280])}, 'AnteroPosterior': {'399348003': ('antero-posterior', [4010, 7302, 501, 3466])}, 'AnteroPosteriorOblique': {'399312000': ('antero-posterior oblique', [4010, 501])}, '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]), '372708000': ('Anti-heparin agent', [621, 622])}, 'Antiarrhythmic': {'372813008': ('Antiarrhythmic', [621, 622])}, 'AntiarrhythmicAgent': {'372813008': ('Antiarrhythmic agent (substance)', [])}, 'AntiarrhythmicDrug': {'67507000': ('Antiarrhythmic drug', [10])}, 'Antibiotic': {'255631004': ('Antibiotic', [621, 622])}, 'Anticholinergic': {'373246003': ('Anticholinergic', [621, 622])}, 'AnticholinergicAgent': {'373246003': ('Anticholinergic agent (substance)', [])}, 'Anticoagulant': {'372862008': ('Anticoagulant', [621, 622]), '81839001': ('Anticoagulant', [10])}, 'Anticonvulsant': {'255632006': ('Anticonvulsant', [621, 622])}, 'AntidiureticHormone': {'77671006': ('Antidiuretic hormone', [621, 622])}, 'Antiemetic': {'52017007': ('Antiemetic', [621, 76, 622])}, 'Antifungal': {'373219008': ('Antifungal', [621, 622])}, 'AntihemophilicFactorPreparation': {'59057006': ('Antihemophilic factor ' 'preparation', [10])}, 'Antihistamine': {'372806008': ('Antihistamine', [621, 622]), '6425004': ('Antihistamine', [10])}, 'Antihypertensive': {'1182007': ('Antihypertensive', [621, 622])}, 'Anus': {'53505006': ('Anus', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'AnusRectumAndSigmoidColon': {'110612005': ('Anus, rectum and sigmoid colon', [4040, 9514, 7192, 7151, 4])}, 'AnusRectumAndSigmoidColonCombinedSite': {'110612005': ('Anus, rectum and ' 'sigmoid colon ' '(combined site) ' '(body structure)', [])}, 'Anxiety': {'48694002': ('Anxiety', [64, 9300, 60])}, 'Aorta': {'15825003': ('Aorta', [6129, 3604, 12236, 12112, 7152, 12103, 3010, 6204, 12141, 4042, 9514, 7192, 3606, 7151, 6202, 3827, 4, 3630, 12223])}, 'AortaToPulmonaryArteryConnection': {'443096004': ('Aorta to Pulmonary Artery ' 'Connection', [12293, 12290])}, 'AorticAneurysm': {'67362008': ('Aortic aneurysm', [3700])}, 'AorticArch': {'57034009': ('Aortic Arch', [3604, 4030, 6109, 1004, 6102, 1001, 6117, 3010, 12291, 4042, 1000, 9514, 7192, 3606, 7151, 4, 3630])}, 'AorticArchStructure': {'57034009': ('Aortic arch structure (body structure)', [])}, 'AorticBifurcation': {'73166001': ('Aortic Bifurcation', [3837, 7111])}, 'AorticDissection': {'308546005': ('Aortic dissection', [3700])}, 'AorticFistula': {'128551005': ('Aortic fistula', [3604, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'AorticIncompetenceNonRheumatic': {'194983005': ('Aortic incompetence, ' 'non-rheumatic (disorder)', [])}, 'AorticInsufficiency': {'194983005': ('Aortic insufficiency', [3700, 3728])}, 'AorticIsthmus': {'88593004': ('Aortic isthmus', [6109, 6102, 6117, 12291, 9514, 7192, 7151])}, 'AorticLymphNode': {'35783009': ('aortic lymph node', [7600])}, 'AorticPressureWaveform': {'128444004': ('Aortic pressure waveform', [3003])}, 'AorticPressureWaveformFunction': {'128444004': ('Aortic pressure waveform, ' 'function (observable ' 'entity)', [])}, 'AorticRegurgitation': {'60234000': ('Aortic regurgitation', [12249, 12248])}, 'AorticRoot': {'8128003': ('Aortic Root', [12305])}, 'AorticRootFeature': {'364091008': ('Aortic root feature (observable entity)', [])}, 'AorticSinotubularJunction': {'443167003': ('Aortic Sinotubular Junction', [12305, 12291])}, 'AorticStenosis': {'60573004': ('Aortic stenosis', [64, 3700, 12249, 3728, 12248])}, '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', [6113, 6109, 3701, 12305, 12288, 6102, 12289, 9514, 7192, 3610, 7151, 3630])}, '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, 12305, 12242])}, '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', [1004, 1001, 1000])}, 'ApexOfLeftVentricle': {'128564006': ('apex of left ventricle', [3717, 3010, 4042, 3011, 9514, 7192, 7151, 4])}, 'ApexOfLung': {'86598002': ('Apex of Lung', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'ApexOfRightVentricle': {'128565007': ('Apex of right ventricle', [3010, 4042, 3011, 9514, 7192, 7151, 4])}, 'Aphakia': {'24010005': ('Aphakia (disorder)', [])}, 'Aphakic': {'24010005': ('Aphakic', [4231])}, 'Apical': {'43674008': ('Apical', [6125, 6124, 2, 5])}, 'ApicalAnteriorFibromuscularStromaOfProstate': {'716925003': ('Apical ' 'anterior ' 'fibromuscular ' 'stroma of ' 'prostate', [6303, 6300])}, 'ApicalAxillaryLymphNode': {'16051009': ('apical axillary lymph node', [7600])}, 'ApicalFourChamber': {'399214001': ('Apical four chamber', [12226])}, 'ApicalFourChamberView': {'399214001': ('Apical four chamber view (qualifier ' 'value)', [])}, 'ApicalLongAxis': {'399339008': ('Apical long axis', [12226, 501])}, 'ApicalTwoChamber': {'399232001': ('Apical two chamber', [12226])}, 'ApicalTwoChamberView': {'399232001': ('Apical two chamber view (qualifier ' 'value)', [])}, 'ApocrineAdenocarcinoma': {'57141000': ('Apocrine adenocarcinoma', [6030, 6033])}, 'ApocrineMetaplasia': {'81274009': ('Apocrine Metaplasia', [6031, 6030])}, 'AppaloosaHorse': {'55167009': ('Appaloosa horse (organism)', [])}, 'AppaloosaHorseBreed': {'55167009': ('Appaloosa horse breed', [7480])}, 'AppendicealStump': {'441850003': ('Appendiceal stump', [6204, 6202])}, 'AppendicularLymphNode': {'46157003': ('appendicular lymph node', [7600])}, 'Appendix': {'66754008': ('Appendix', [6204, 6202])}, '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', [7153, 9514, 7192, 7151])}, '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])}, 'ArchitecturalDistortionOfBreast': {'129792006': ('Architectural distortion ' 'of breast', [6056, 6016, 6015, 6054, 6014])}, 'ArcuateArteryOfTheKidney': {'274231001': ('Arcuate Artery of the Kidney', [12103, 12115, 9514, 7192, 7151, 3827])}, 'ArdennesHorseBreed': {'133116001': ('Ardennes horse breed', [7480])}, 'Area': {'42798000': ('Area', [12304, 12257, 7471, 12260, 12271, 12267, 12266, 12270, 12265, 12253, 12269, 218, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12258, 7469])}, 'AreaOfDefinedRegion': {'131184002': ('Area of defined region', [7471, 218, 7469])}, '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])}, 'ArouquesaCattleBreed': {'133298009': ('Arouquesa cattle breed', [7480])}, 'Arrhythmia': {'44808001': ('Arrhythmia', [3413, 3756, 12246, 3727, 3755, 3201, 3221]), '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, 3810, 3754])}, 'ArterialGraftToCitedSegment': {'128950003': ('Arterial graft to cited ' 'segment', [3019])}, '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]), '439470001': ('Arteriovenous Fistula', [12293])}, 'ArteriovenousFistulaOfPulmonaryVessels': {'111289009': ('Arteriovenous ' 'fistula of ' 'pulmonary vessels ' '(disorder)', [])}, 'Artery': {'51114001': ('Artery', [3604, 7191, 3010, 4042, 9514, 7192, 3606, 7151, 3630, 7166])}, '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', [3604, 6109, 12305, 6102, 6117, 3010, 12291, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'AscendingAortaStructure': {'54247002': ('Ascending aorta structure (body ' 'structure)', [])}, 'AscendingColon': {'9040008': ('Ascending colon', [6210])}, 'AscendingColonStructure': {'9040008': ('Ascending colon structure (body ' 'structure)', [])}, 'AsciticFluid': {'409615008': ('Ascitic fluid', [645])}, 'AshantiDwarfPigBreed': {'133178006': ('Ashanti Dwarf pig breed', [7480])}, 'AsianRace': {'413582008': ('Asian race', [6099])}, '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 (disorder)', [64])}, 'AstringentDrug': {'60533005': ('Astringent drug', [10])}, 'Astrocytoma': {'38713004': ('Astrocytoma', [639, 638])}, 'AstrocytomaNoInternationalClassificationOfDiseasesForOncologySubtype': {'38713004': ('Astrocytoma, ' 'no ' 'International ' 'Classification ' 'of ' 'Diseases ' 'for ' 'Oncology ' 'subtype ' '(morphologic ' 'abnormality)', [])}, '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', [6017, 6016, 6054])}, 'AsymmetricBreastTissueAnalysis': {'133889002': ('Asymmetric breast tissue ' 'analysis', [6043])}, 'AsymmetricBreastTissueFinding': {'129790003': ('Asymmetric breast tissue ' 'finding (finding)', [])}, 'AsynchronousInvolutionOfBreast': {'130963002': ('Asynchronous involution of ' 'breast', [6031, 6030])}, 'Ataxia': {'20262006': ('Ataxia (finding)', [])}, 'AtaxiaOrIncoordination': {'20262006': ('Ataxia or incoordination', [3205])}, 'AtebrinFSStain': {'84656005': ('atebrin FS stain', [8112])}, 'Atherectomy': {'6832004': ('Atherectomy', [3405, 9])}, 'AtherectomyByLaser': {'76611008': ('Atherectomy by laser', [3405, 9])}, 'AtherectomyByRotaryCutter': {'65659003': ('Atherectomy by rotary cutter', [3405, 9])}, 'AtherectomyDevice': {'102312002': ('Atherectomy device', [4051, 7151, 8, 7193])}, 'Atheroma': {'48434008': ('atheroma', [3817])}, 'AtheroscleroticFibrousPlaque': {'20717008': ('atherosclerotic fibrous plaque', [3817])}, 'AtlantalAxialJoint': {'62555009': ('Atlantal-axial joint', [7483, 7482])}, 'AtlantoOccipitalJoint': {'20292002': ('Atlanto-occipital joint', [7483, 7482])}, 'AtlantooccipitalJointStructure': {'20292002': ('Atlantooccipital joint ' 'structure (body structure)', [])}, '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', [3700, 3230])}, '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', [6113, 3700, 12236, 6109, 12284, 6102, 12249, 3728, 12244, 9514, 12248, 7192, 3610, 7151, 3630])}, 'AtrialSeptalDefectRepair': {'112811009': ('Atrial septal defect repair', [12247])}, 'AtrialSeptalDefectWithEndocardialCushionDefectPartial': {'60732002': ('Atrial ' 'septal ' 'defect ' 'with ' 'endocardial ' 'cushion ' 'defect, ' 'partial', [12249, 12248])}, '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', [3839, 9514, 7192, 7151, 3827])}, 'AtrioventricularBundle': {'345000': ('Atrioventricular bundle', [3011])}, 'AtrioventricularBundleStructure': {'345000': ('Atrioventricular bundle ' 'structure (body structure)', [])}, 'AtrioventricularNode': {'25943004': ('Atrioventricular node', [3011])}, 'AtrioventricularSequentialPacing': {'371910005': ('Atrioventricular ' 'sequential pacing ' '(procedure)', [])}, 'AtrioventricularVein': {'195496005': ('Atrioventricular Vein', [3839, 9514, 7192, 7151, 3827])}, 'Atrium': {'59652004': ('Atrium', [6113, 6109, 6102, 9514, 7192, 7151, 4])}, 'Atropine': {'349947003': ('Atropine', [4208]), '73949004': ('Atropine', [3204, 10])}, '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])}, 'AubracCattleBreed': {'131565006': ('Aubrac cattle breed', [7480])}, 'Audiology': {'309914005': ('Audiology', [7030])}, 'AudiologyDepartment': {'309914005': ('Audiology department (environment)', [])}, 'AuditoryRadiation': {'410726006': ('auditory radiation', [7702, 7710])}, '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])}, '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])}, 'AutomaticImplantableCardiacDefibrillatorInSitu': {'443325000': ('Automatic ' 'implantable ' 'cardiac ' 'defibrillator ' 'in situ ' '(finding)', [])}, 'AutonomicNerve': {'53520000': ('Autonomic nerve', [9514, 7192, 7151, 7167])}, 'AutonomicNerveStructure': {'53520000': ('Autonomic nerve structure (body ' 'structure)', [])}, 'AutonomousBreathing': {'45804006': ('autonomous breathing', [3823])}, '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])}, 'AwassiSheepBreed': {'132808001': ('Awassi sheep breed', [7480])}, 'AweilDinkaCattleBreed': {'131446001': ('Aweil Dinka cattle breed', [7480])}, 'Axial': {'24422004': ('Axial', [2, 501, 26]), '399061009': ('axial', [4010, 501])}, 'AxialProjection': {'399061009': ('Axial projection (qualifier value)', [])}, 'Axilla': {'91470000': ('Axilla', [9514, 7192, 7151, 4])}, 'AxillaPositionOnMammogram': {'129791004': ('Axilla position on mammogram ' '(finding)', [])}, 'AxillaRegion': {'129791004': ('Axilla region', [6019, 6018])}, 'AxillaryAdenopathy': {'127189005': ('Axillary adenopathy', [6056, 6016, 6015, 6054, 6014])}, 'AxillaryArtery': {'67937003': ('Axillary Artery', [3604, 6109, 12103, 6102, 6117, 3010, 4042, 9514, 7192, 3606, 7151, 12107, 3827, 4, 3630])}, 'AxillaryFascia': {'368536000': ('Axillary Fascia', [6113, 6109, 6102, 9514, 7192, 7151])}, 'AxillaryLymphNode': {'68171009': ('Axillary lymph node', [6056, 6016, 7600, 6015, 6054, 6014])}, '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', [6019, 6018])}, 'AxillaryTissue': {'442580003': ('Axillary tissue', [4015])}, 'AxillaryTissueMammographyView': {'442580003': ('Axillary tissue mammography ' 'view (qualifier value)', [])}, 'AxillaryVein': {'68705008': ('Axillary vein', [6109, 12108, 12103, 6102, 6117, 3010, 4042, 9514, 7192, 7151, 3827, 4, 3630, 3607])}, 'AxillaryVeinLymphNode': {'421624008': ('axillary vein lymph node', [7600])}, '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', [625, 623])}, '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', [6109, 3839, 6102, 6117, 3010, 4042, 9514, 7192, 7151, 3827, 4, 3630, 3607])}, 'BBShotDevice': {'102378009': ('BB shot, device (qualifier value)', [])}, 'BBShotLeadPellet': {'102378009': ('BB Shot (Lead Pellet)', [7112, 6040, 6401, 7151, 7111, 7193])}, 'BKB1PigBreed': {'132277000': ('BKB-1 pig breed', [7480])}, 'BSIPigBreed': {'132342003': ('BSI pig breed', [7480])}, 'BaXuyenPigBreed': {'132220001': ('Ba Xuyen pig breed', [7480])}, 'BachaurCattleBreed': {'133595008': ('Bachaur cattle breed', [7480])}, 'Back': {'77568009': ('Back', [9514, 7192, 7151, 4])}, 'BackStructureExcludingNeck': {'77568009': ('Back structure, excluding neck ' '(body structure)', [])}, 'BadenWurttemburgHorseBreed': {'132731005': ('Baden Wurttemburg horse breed', [7480])}, 'Baffle': {'128981007': ('Baffle', [3604, 3608, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, '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', [12001, 3261])}, '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', [6125, 6124, 2])}, 'BasalAnteriorFibromuscularStromaOfProstate': {'716891004': ('Basal anterior ' 'fibromuscular ' 'stroma of ' 'prostate', [6303, 6300])}, 'BaseOfTongue': {'47975008': ('base of tongue', [7601])}, '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', [3604, 12103, 3010, 4042, 9514, 7192, 3606, 7151, 3827, 4, 3630, 12106])}, 'BasilicVein': {'19715009': ('Basilic vein', [12108, 12103, 9514, 7192, 7151, 3827, 3630, 3607])}, '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, 12102, 633, 61, 12002])}, '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])}, 'BenignNeoplasmOfNippleOfFemaleBreast': {'92248004': ('Benign neoplasm of ' 'nipple of female ' 'breast (disorder)', [])}, 'BenignNeoplasmOfNippleOfFemaleBreastNippleAdenoma': {'92248004': ('Benign ' 'neoplasm ' 'of nipple ' 'of female ' 'breast ' '(Nipple ' 'adenoma)', [6031, 6030])}, '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)', [])}, '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])}, 'BetaAdrenergicBlockingAgent': {'33252009': ('beta-Adrenergic blocking agent', [10])}, 'BetaBlocker': {'33252009': ('Beta blocker', [3760]), '373254001': ('Beta-blocker', [621, 622])}, 'BetaBlockingAgent': {'33252009': ('beta-Blocking agent (product)', []), '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', [211, 2, 245, 244])}, 'Bile': {'70150004': ('Bile', [7197, 7151])}, 'BileAcidSequestrant': {'83750004': ('Bile acid sequestrant', [3761])}, 'BileAcidSequestrantAntilipemicAgent': {'83750004': ('Bile acid sequestrant ' 'antilipemic agent ' '(product)', [])}, 'BileDuct': {'28273000': ('Bile duct', [4030, 4031, 4040, 7154, 4042, 9514, 7192, 7151, 4, 4009])}, 'BileDuctStructure': {'28273000': ('Bile duct structure (body structure)', [])}, 'BillyDogBreed': {'132526006': ('Billy dog breed', [7480])}, 'BimalCattleBreed': {'133641009': ('Bimal cattle breed', [7480])}, 'BiohazardousMaterial': {'409595003': ('Biohazardous material', [602])}, 'Biopsy': {'86273004': ('Biopsy', [8109, 9])}, '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', [9520, 7157, 7151, 9505, 9513, 7193])}, 'BizanianHoundDogBreed': {'132372009': ('Bizanian Hound dog breed', [7480])}, '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', [4030, 4031, 7483, 7482, 4040, 10060, 6204, 4042, 9514, 7160, 7192, 7151, 6202, 4, 4009, 10044])}, 'BladderAndUrethra': {'110837003': ('Bladder and urethra', [4040, 9514, 7192, 7151, 4])}, '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])}, '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', [7191, 7151, 7166])}, 'BloodClot': {'75753009': ('Blood clot', [7159, 7194, 7151])}, 'BloodPressure': {'75367002': ('Blood Pressure', [12304, 12257, 12261, 12260, 12271, 12267, 12266, 12270, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12258, 12254])}, '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', [7191, 7155, 6204, 9514, 7192, 7151, 6202, 7166])}, '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, 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', [8124, 4204])}, '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', [3211, 3210])}, '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])}, 'BodyConduit': {'91830000': ('Body conduit', [3010, 4042, 9514, 7192, 7151, 4])}, 'BodyFat': {'248300009': ('Body fat', [7191, 7151, 7166])}, 'BodyFatObservable': {'248300009': ('Body fat observable (observable entity)', [])}, 'BodyFluid': {'32457005': ('Body fluid', [7197, 7151])}, 'BodyFluidSample': {'309051001': ('Body fluid sample', [8103])}, 'BodyMassIndex': {'60621009': ('Body mass index (observable entity)', [])}, 'BodyOfSternum': {'52509009': ('Body of sternum', [6115])}, '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])}, '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', [7191, 6204, 645, 7151, 6202, 7166])}, 'BoneFormationFunction': {'83323007': ('Bone formation, function (observable ' 'entity)', [])}, 'BoneMarrow': {'14016003': ('Bone Marrow', [10060, 644, 10044])}, 'BoneMarrowStructure': {'14016003': ('Bone marrow structure (body structure)', [])}, 'BoneMarrowTransplant': {'23719005': ('Bone marrow transplant', [6083, 6085])}, 'BoneMatrix': {'45001002': ('Bone matrix', [6211])}, 'BoneNail': {'63289001': ('Bone Nail', [7309, 7307])}, 'BoneOfLowerLimb': {'72001000': ('Bone of lower limb', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'BoneOfThorax': {'272710004': ('Bone of thorax', [7155, 9514, 7192, 7151])}, 'BoneOfUpperLimb': {'371195002': ('Bone of upper limb', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'BonePin': {'77444004': ('Bone Pin', [7157, 7151, 7193])}, 'BonePinDevice': {'77444004': ('Bone pin, device (physical object)', [])}, 'BonePlate': {'271003': ('Bone Plate', [7309, 7307])}, 'BonePlateDevice': {'271003': ('Bone plate, device (physical object)', [])}, 'BoneScrew': {'68183006': ('Bone Screw', [7157, 7151, 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)', [])}, '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', [9514, 7192, 4028, 7151])}, 'BoneStructureOfHumerus': {'85050009': ('Bone structure of humerus (body ' 'structure)', [])}, 'BoneStructureOfIlium': {'22356005': ('Bone structure of ilium (body ' 'structure)', [])}, 'BoneStructureOfIschium': {'85710004': ('Bone structure of ischium (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': ('Bone structure of pelvis (body ' 'structure)', [])}, '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)', [])}, 'BoneStructureOfRadius': {'62413002': ('Bone structure of radius (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)', [])}, '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', [10060, 10044])}, 'BonsmaraCattleBreed': {'131431008': ('Bonsmara cattle breed', [7480])}, '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 (domestic cow)', [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', [6023, 6022])}, 'BothEyes': {'40638003': ('Both eyes', [4209])}, 'Bottle': {'68276009': ('Bottle', [68, 69])}, 'BottleDevice': {'68276009': ('Bottle, device (physical object)', [])}, 'BouinFluid': {'433474002': ("Bouin's fluid", [8114])}, 'BoulonnaisHorseBreed': {'131883005': ('Boulonnais horse breed', [7480])}, '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", [12103, 3010, 4042, 9514, 7192, 7151, 3827, 4, 3630, 12110, 3607])}, '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', [3604, 6109, 12103, 6102, 6117, 3010, 3440, 4042, 9514, 7192, 3606, 7151, 12107, 3827, 4, 3630])}, 'BrachialPlexus': {'36582005': ('Brachial plexus', [6109, 6102, 6117, 9514, 7192, 7151])}, 'BrachialPlexusStructure': {'36582005': ('Brachial plexus structure (body ' 'structure)', [])}, 'BrachialVein': {'20115005': ('Brachial vein', [12108, 12103, 3010, 4042, 9514, 7192, 7151, 3827, 4, 3630, 3607])}, 'BrachiocephalicTrunk': {'12691009': ('brachiocephalic trunk', [3604, 6109, 6102, 6117, 3606, 3630])}, 'BrachiocephalicVein': {'8887007': ('Brachiocephalic vein', [6109, 6102, 6117])}, 'Brachytherapy': {'384692006': ('Brachytherapy', [6051])}, 'BrachytherapyDevice': {'228748004': ('Brachytherapy Device', [3429, 3411])}, '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', [7153, 4030, 10060, 644, 9514, 645, 7192, 7151, 4, 10044])}, 'BrainCerebrospinalFluidPathway': {'280371009': ('Brain cerebrospinal fluid ' 'pathway', [7153, 9514, 7192, 7151])}, 'BrainStem': {'119238007': ('Brain stem', [7153, 7140, 9514, 7192, 7151])}, 'BrainStemPart': {'119238007': ('Brain stem part (body structure)', [])}, 'BrainStructure': {'12738006': ('Brain structure (body structure)', [])}, 'BrainVentricle': {'35764002': ('Brain ventricle', [7153, 9514, 7192, 7151])}, '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', [4030, 4031, 10060, 4042, 9514, 645, 7192, 7151, 4, 4009, 4013, 10044])}, 'BreastComposition': {'129715009': ('Breast composition', [6056, 6016, 6052, 6053, 6015, 6054, 6014])}, 'BreastCompositionAnalysis': {'133890006': ('Breast composition analysis', [6043])}, 'BreastDuctSample': {'309548003': ('breast duct sample', [8104, 8103])}, 'BreastHematoma': {'302924003': ('Breast hematoma', [6056])}, 'BreastImplantTypeNotSpecified': {'2282003': ('Breast implant, type not ' 'specified', [6058, 6059])}, 'BreastImplantation': {'119853006': ('Breast implantation', [6083, 6084])}, 'BreastLobularHyperplasia': {'6703006': ('Breast lobular hyperplasia', [6031, 6030])}, '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)', [])}, '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', [6083, 6050])}, 'BreastTruCutBiopsySample': {'309058007': ('breast tru-cut biopsy sample', [8104, 8103])}, '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', [9514, 7192, 7151, 4])}, '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': {'261061003': ('Bronchial', [6129])}, 'BronchialArtery': {'64468002': ('Bronchial artery', [6109, 6102, 6117, 9514, 7192, 7151])}, 'BronchialStructure': {'955009': ('Bronchial structure (body structure)', [])}, 'Bronchodilator': {'372580007': ('Bronchodilator', [621, 622])}, 'BronchopulmonarySegmentStructure': {'72674008': ('Bronchopulmonary segment ' 'structure (body structure)', [])}, 'Bronchospasm': {'4386001': ('Bronchospasm', [9300, 60])}, 'Bronchus': {'955009': ('Bronchus', [4030, 6109, 4031, 7155, 6102, 4040, 4042, 9514, 7192, 6111, 7151, 4, 4009])}, 'BroselowLutenBlueZone1923kg': {'444474005': ('Broselow Luten Blue Zone ' '(19-23 kg)', [7040, 7039])}, 'BroselowLutenGreenZone3036kg': {'444503000': ('Broselow Luten Green Zone ' '(30-36 kg)', [7040, 7039])}, 'BroselowLutenOrangeZone2429kg': {'444496004': ('Broselow Luten Orange Zone ' '(24-29 kg)', [7040, 7039])}, '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)', [7040, 7039])}, 'BroselowLutenPurpleZone1011kg': {'444489001': ('Broselow Luten Purple Zone ' '(10-11 kg)', [7040, 7039])}, 'BroselowLutenRedZone89kg': {'444471002': ('Broselow Luten Red Zone (8-9 kg)', [7040, 7039])}, 'BroselowLutenWhiteZone1518kg': {'444504006': ('Broselow Luten White Zone ' '(15-18 kg)', [7040, 7039])}, 'BroselowLutenYellowZone1214kg': {'444505007': ('Broselow Luten Yellow Zone ' '(12-14 kg)', [7040, 7039])}, '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', [12001, 3261])}, 'BrunoDeJuraDogBreed': {'132416002': ('Bruno de Jura dog breed', [7480])}, 'BuccalMucosa': {'16811007': ('buccal mucosa', [7601])}, 'BuccalRegionOfFace': {'60819002': ('Buccal region of face', [9514, 7192, 7151, 4])}, 'BuccinatorLymphNode': {'143925009': ('buccinator lymph node', [7600])}, '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, 6401, 6138, 6404, 7151, 6202, 6203, 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', [630, 623])}, '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', [625, 623])}, 'ButanaCattleBreed': {'133643007': ('Butana cattle breed', [7480])}, 'ButanolO15': {'422540000': ('Butanol O^15^', [4021])}, 'Buttock': {'46862004': ('Buttock', [9514, 7192, 7151, 4])}, 'ButtockStructure': {'46862004': ('Buttock structure (body structure)', [])}, 'ButyrateEsteraseStain': {'406955006': ('butyrate esterase stain', [8112])}, 'ByInhalation': {'446406008': ('By inhalation', [613, 11, 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', [1003, 1001, 1000])}, '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])}, 'CTOfAbdominalAorta': {'241553009': ('CT of abdominal aorta', [3820])}, 'CTOfBreast': {'241539009': ('CT of breast', [6083, 6050])}, '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', [7483, 7482])}, 'CalcanealTubercleStructure': {'82474009': ('Calcaneal tubercle structure ' '(body structure)', [])}, 'Calcaneus': {'80144004': ('Calcaneus', [4030, 4031, 7304, 4042, 9514, 7192, 7151, 4, 4009])}, 'CalcificationCluster': {'129769006': ('Calcification Cluster', [6056, 6016, 6015, 6054, 6014])}, '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', [6011, 6010])}, 'CalcifiedSutureMaterial': {'129758008': ('Calcified suture material', [6011, 6010])}, 'Calcium': {'5540006': ('Calcium', [621, 300, 622])}, 'CalciumChannelBlocker': {'373304005': ('Calcium channel blocker', [621, 622]), '48698004': ('Calcium channel blocker', [3760])}, 'CalciumChannelBlockingAgent': {'48698004': ('Calcium channel blocking agent ' '(product)', [])}, 'CalciumHydroxyapatite': {'256579008': ('Calcium Hydroxyapatite', [300])}, 'Calculated': {'258090004': ('Calculated', [3745, 3627, 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 (common marmoset)', [7454])}, 'CaloricAgent': {'373530005': ('Caloric agent', [621, 622])}, 'CalvanaCattleBreed': {'133342006': ('Calvana cattle breed', [7480])}, 'Calyx': {'2334006': ('Calyx', [9514, 7192, 7151, 4])}, '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])}, '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 (domestic dog)', [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', [7191, 7151, 7166])}, 'Capra': {'388249000': ('Capra', [7454])}, 'CapraHircus': {'125097000': ('Capra hircus (domestic goat)', [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': {'406978000': ('carbol fuchsin stain', [8112])}, 'Carbon14DXylose': {'2942001': ('Carbon^14^ D-xylose', [25])}, 'Carbon14Triolein': {'42417005': ('Carbon^14^ triolein', [25])}, 'CarbonDioxide': {'31811003': ('Carbon Dioxide', [13, 12, 624, 623, 3850])}, 'CarbonDioxideO15': {'129507008': ('Carbon dioxide O^15^', [4021])}, 'CarbonFiber': {'256501007': ('Carbon Fiber', [10067, 7300])}, 'CarbonMonoxideC11': {'129515006': ('Carbon monoxide C^11^', [4021])}, 'CarbonMonoxideO15': {'129506004': ('Carbon monoxide O^15^', [4021])}, 'Carcinogen': {'88376000': ('Carcinogen', [602])}, 'Carcinoma': {'68453008': ('Carcinoma', [639, 638])}, 'CarcinomaInSituOfMaleBreast': {'92652009': ('Carcinoma in situ of male ' 'breast', [6030, 6033])}, 'CarcinomaNoSubtype': {'68453008': ('Carcinoma, no subtype (morphologic ' 'abnormality)', [])}, 'CarcinomaWithMetaplasia': {'22694002': ('Carcinoma with metaplasia', [6030, 6033])}, 'Carcinosarcoma': {'63264007': ('Carcinosarcoma', [6030, 6033, 639, 638])}, 'CardiacAdrenergicBlockingAgent': {'373263004': ('Cardiac adrenergic blocking ' 'agent', [10])}, 'CardiacAkinesia': {'195675009': ('Cardiac akinesia (finding)', [])}, 'CardiacArrest': {'410429000': ('Cardiac arrest', [3413, 3755])}, 'CardiacArrhythmia': {'698247007': ('Cardiac Arrhythmia', [9300, 60])}, 'CardiacBloodPoolImaging': {'35621002': ('Cardiac blood pool imaging ' '(nuclear)', [3757, 3206])}, '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', [3405, 3250])}, 'CardiacCatheterizationBaselinePhase': {'128955008': ('Cardiac ' 'catheterization ' 'baseline phase', [3405, 3250, 3651])}, 'CardiacCatheterizationCoronaryAngiogram': {'419416005': ('Cardiac ' 'catheterization ' 'coronary angiogram', [3757])}, 'CardiacCatheterizationGradientAssessmentPhase': {'371874005': ('Cardiac ' 'catheterization ' 'gradient ' 'assessment ' 'phase', [3651])}, 'CardiacCatheterizationImageAcquisitionPhase': {'128956009': ('Cardiac ' 'catheterization ' 'image ' 'acquisition ' 'phase', [3405, 3250])}, 'CardiacCatheterizationInterventionPhase': {'128957000': ('Cardiac ' 'catheterization ' 'intervention phase', [3405, 3250])}, 'CardiacCatheterizationLeftHeartTransseptal': {'67338003': ('Cardiac ' 'catheterization, ' 'left heart, ' 'transseptal ' '(procedure)', [])}, 'CardiacCatheterizationPostContrastPhase': {'129083002': ('Cardiac ' 'catheterization ' 'post contrast ' 'phase', [3405, 3250, 3651])}, 'CardiacCatheterizationPostInterventionPhase': {'128960007': ('Cardiac ' 'catheterization ' 'post-intervention ' 'phase', [3405, 3480, 3250, 3651])}, 'CardiacCatheterizationPreInterventionPhase': {'128958005': ('Cardiac ' 'catheterization ' 'pre-intervention ' 'phase', [3405, 3480, 3250])}, 'CardiacCatheterizationProcedurePhase': {'129085009': ('Cardiac ' 'catheterization ' 'procedure phase ' '(qualifier value)', [])}, 'CardiacCatheterizationTestChallengePhase': {'373105002': ('Cardiac ' 'catheterization ' 'test/challenge ' 'phase', [3405, 3250, 3651])}, 'CardiacCatheterizationTherapyPhase': {'128959002': ('Cardiac catheterization ' 'therapy phase', [3405, 3250])}, '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', [12304, 12257, 12271, 12267, 12266, 12270, 12268, 12252, 12272, 12264, 12259, 12263, 12274, 12262])}, 'CardiacEjectionFractionFunction': {'70822001': ('Cardiac ejection fraction, ' 'function (observable ' 'entity)', [])}, 'CardiacFunctionTestAbnormal': {'165076002': ('cardiac function test abnormal', [3727])}, 'CardiacIndex': {'54993008': ('Cardiac Index', [12200, 12257, 12271, 12267, 12207, 12266, 12270, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12239])}, 'CardiacIntensiveCare': {'309907008': ('Cardiac Intensive Care', [7030])}, 'CardiacIntensiveCareUnit': {'309907008': ('Cardiac intensive care unit ' '(environment)', [])}, 'CardiacMRI': {'241620005': ('Cardiac MRI', [3757, 3206, 3820])}, 'CardiacMRIStress': {'431609005': ('Cardiac MRI stress', [3757])}, 'CardiacMuscle': {'122448007': ('Cardiac muscle', [7710])}, 'CardiacMuscleTissue': {'122448007': ('Cardiac muscle (tissue) (body ' 'structure)', [])}, 'CardiacOutput': {'82799009': ('Cardiac Output', [12200, 12257, 12271, 12267, 12207, 12266, 12270, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12239])}, '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': {'118378005': ('Cardiac Pacemaker', [6040, 6401, 7151, 7193]), '14106009': ('Cardiac pacemaker', [3777, 6102, 6138, 7157, 1000, 6404, 7151, 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])}, 'CardiacSeptumProsthesisDevice': {'118375008': ('Cardiac septum prosthesis, ' 'device (physical object)', [])}, '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', [12249, 12248])}, 'Cardiomyopathy': {'85898001': ('Cardiomyopathy', [64, 3727])}, 'CardiophrenicAngleLymphNode': {'371013005': ('cardiophrenic angle lymph node', [7600])}, 'CardiopulmonaryBypass': {'63697000': ('Cardiopulmonary bypass', [3553])}, 'CardiopulmonaryBypassOperation': {'63697000': ('Cardiopulmonary bypass ' 'operation (procedure)', [])}, 'CardiorespiratoryArrest': {'410430005': ('Cardiorespiratory arrest', [9300, 60])}, 'CardiothoracicSurgery': {'309969008': ('Cardiothoracic Surgery', [7030])}, 'CardiothoracicSurgeryDepartment': {'309969008': ('Cardiothoracic surgery ' 'department (environment)', [])}, 'CardiotonicAgent': {'69440003': ('Cardiotonic agent (substance)', [])}, 'CardiotonicDrug': {'69440003': ('Cardiotonic drug', [10])}, 'CardiovascularCT': {'303680000': ('cardiovascular CT', [3820])}, 'CardiovascularCyclePoint': {'272518008': ('Cardiovascular cycle point ' '(qualifier value)', [])}, 'CardiovascularEventRisk': {'395112001': ('Cardiovascular event risk ' '(finding)', [])}, 'CardiovascularOrificeArea': {'399367004': ('Cardiovascular Orifice Area', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'CardiovascularOrificeDiameter': {'399027007': ('Cardiovascular Orifice ' 'Diameter', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, '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', [7156, 9514, 7192, 7151])}, 'CareOfTheElderlyDepartment': {'309933000': ('Care of the elderly department ' '(environment)', [])}, 'CarfentanilC11': {'129511002': ('Carfentanil C^11^', [4021])}, 'Carina': {'28700002': ('Carina', [6113, 6109, 1004, 6102, 1001, 1000, 9514, 7192, 6111, 7151])}, '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', [3604, 4030, 1002, 1001, 3010, 3440, 4042, 1000, 9514, 7192, 3606, 7151, 4, 3630])}, 'CarotidArteryStructure': {'69105007': ('Carotid artery structure (body ' 'structure)', [])}, 'CarotidBifurcation': {'80272002': ('Carotid Bifurcation', [12104, 12103, 9514, 7192, 7151, 3827])}, 'CarotidBody': {'51345006': ('Carotid Body', [6113, 6109, 6102, 9514, 7192, 7151])}, 'CarotidBodyStructure': {'51345006': ('Carotid body structure (body ' 'structure)', [])}, 'CarotidBulb': {'21479005': ('Carotid Bulb', [12104, 12103, 9514, 7192, 7151, 3827])}, 'CarotidSinusMassageProcedurePhase': {'129090007': ('Carotid Sinus Massage ' 'procedure phase', [3254])}, 'CarotidSiphon': {'54409005': ('Carotid Siphon', [12105, 12103, 9514, 7192, 7151, 3827])}, 'CarpatheGoatBreed': {'131687008': ('Carpathe goat breed', [7480])}, 'CarpathianBrownCattleBreed': {'133346009': ('Carpathian Brown cattle breed', [7480])}, 'CarpathianPonyHorseBreed': {'133138004': ('Carpathian Pony horse breed', [7480])}, 'Carpus': {'8205005': ('Carpus', [7483, 7482])}, 'CarthusianHorseBreed': {'133127004': ('Carthusian horse breed', [7480])}, 'Cartilage': {'309312004': ('Cartilage', [7191, 7151, 7166])}, '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', [4051, 7112, 6040, 69, 6102, 6401, 6138, 6404, 7151, 8, 6202, 3451, 6203, 7111, 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', [3405, 3250, 3739])}, 'CatheterizationOfBothLeftAndRightHeartWithoutGraft': {'128953001': ('Catheterization ' 'of both ' 'left ' 'and ' 'right ' 'heart ' 'without ' 'graft', [3405, 3250, 3739])}, 'CatheterizationOfLeftHeart': {'67629009': ('Catheterization of left heart', [3405, 3250, 3739])}, 'CatheterizationOfRightHeart': {'40403005': ('Catheterization of right heart', [3405, 3250, 3739])}, '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', [4011, 502])}, 'Caudal': {'3583002': ('Caudal', [502, 23, 2, 5])}, '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', [7153, 7140, 9514, 7192, 7151])}, 'CaudateNucleusStructure': {'11000004': ('Caudate nucleus structure (body ' 'structure)', [])}, 'CaudoCranial': {'399196006': ('caudo-cranial', [4010, 4014, 501])}, '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 (domestic guinea pig)', [7454])}, 'CayuseHorseBreed': {'133125007': ('Cayuse horse breed', [7480])}, 'Cecum': {'32713005': ('Cecum', [6210])}, 'CecumStructure': {'32713005': ('Cecum structure (body structure)', [])}, 'CelestineBlueBStain': {'38707008': ('celestine blue B stain', [8112])}, 'CeliacAxis': {'57850000': ('Celiac Axis', [12112, 12103, 3827])}, 'CeliacLymphNode': {'47985009': ('celiac lymph node', [7600])}, 'CementedComponentFixation': {'257771002': ('Cemented component fixation', [7310])}, 'Central': {'26216008': ('Central', [6125, 3019, 211, 6124, 2, 212, 5, 4005])}, '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])}, 'CentralIncisorRegion': {'699453001': ('Central incisor region', [4017])}, 'CentralIncisorRegionOfOralCavity': {'699453001': ('Central incisor region of ' 'oral cavity (body ' 'structure)', [])}, 'CentralNervousSystem': {'21483005': ('Central nervous system', [7153, 9514, 645, 7192, 7151])}, 'CentralPortionOfBreastPositionOnMammogram': {'129786000': ('Central portion ' 'of breast ' 'position on ' 'mammogram ' '(finding)', [])}, 'CentralRegionOfBreast': {'129786000': ('Central region of breast', [6019, 6018])}, 'CentralRetinalArtery': {'76117006': ('Central Retinal Artery', [12105, 12103, 9514, 7192, 7151, 3827])}, 'CentralRetinalVein': {'62869001': ('Central Retinal Vein', [12105, 12103, 9514, 7192, 7151, 3827])}, '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', [3630, 3607])}, 'CentralZoneOfLeftHalfProstate': {'716901006': ('Central zone of left half ' 'prostate', [6302, 6303, 6300, 6301])}, 'CentralZoneOfRightHalfProstate': {'716900007': ('Central zone of right half ' 'prostate', [6302, 6303, 6300, 6301])}, 'CentrallyActingHypotensiveAgent': {'4382004': ('Centrally acting hypotensive ' 'agent', [10])}, 'Cephalad': {'399196006': ('cephalad', [4011, 502])}, 'Cephalic': {'66787007': ('Cephalic', [502, 23, 2])}, 'CephalicVein': {'20699002': ('Cephalic vein', [12108, 12103, 3010, 4042, 9514, 7192, 7151, 3827, 4, 3630, 3607])}, 'CephalosporinAntibiotic': {'373262009': ('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', [7153, 7710, 7140, 9514, 7192, 7151])}, 'CerebellarWhiteMatterStructure': {'33060004': ('Cerebellar white matter ' 'structure (body structure)', [])}, 'Cerebellum': {'113305005': ('Cerebellum', [4030, 12020, 9514, 7192, 7151, 4, 12022])}, 'CerebralAqueduct': {'80447000': ('Cerebral aqueduct', [7153, 9514, 7192, 7151])}, 'CerebralArtery': {'88556005': ('cerebral artery', [3604, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'CerebralCortex': {'40146001': ('Cerebral cortex', [7153, 9514, 7192, 7151])}, 'CerebralFornix': {'87463005': ('Cerebral fornix', [7153, 9514, 7192, 7151])}, 'CerebralFornixStructure': {'87463005': ('Cerebral fornix structure (body ' 'structure)', [])}, 'CerebralGrayMatter': {'40146001': ('Cerebral Gray Matter', [7140])}, 'CerebralHemisphere': {'372073000': ('Cerebral hemisphere', [12022])}, 'CerebralHemisphereStructure': {'372073000': ('Cerebral hemisphere structure ' '(body structure)', [])}, 'CerebralWhiteMatter': {'68523003': ('Cerebral White Matter', [7153, 7710, 7140, 9514, 7192, 7151])}, 'CerebralWhiteMatterStructure': {'68523003': ('Cerebral white matter ' 'structure (body structure)', [])}, 'CerebrospinalFluid': {'65216001': ('Cerebrospinal Fluid', [7153, 9514, 7192, 7151])}, '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])}, 'CervicalLymphNodeStructure': {'81105003': ('Cervical lymph node structure ' '(body structure)', [])}, 'CervicalSpine': {'122494005': ('Cervical spine', [4030, 4031, 7304, 7483, 7482, 4042, 9514, 7192, 4028, 7151, 4, 4009])}, 'CervicoThoracicSpine': {'297171002': ('Cervico-thoracic spine', [4030, 4031, 7304, 7483, 7482, 4042, 9514, 7192, 7151, 4, 4009])}, 'CervicothoracicRegionOfSpineStructure': {'297171002': ('Cervicothoracic ' 'region of spine ' 'structure (body ' 'structure)', [])}, 'Cervix': {'71252005': ('Cervix', [4040, 6204, 9514, 7160, 7192, 7151, 6202, 12023, 4])}, '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', [9520, 9515, 7157, 7151, 9505, 7193])}, '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)', [])}, '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': {'51185008': ('Chest', [4030, 4031, 7483, 7482, 4040, 4042, 9514, 7192, 7151, 4009])}, 'ChestAbdomenAndPelvis': {'416775004': ('Chest, Abdomen and Pelvis', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'ChestAndAbdomen': {'416550000': ('Chest and Abdomen', [4030, 4031, 7483, 7482, 4042, 9514, 7192, 7151, 4, 4009])}, 'ChestAndOrAbdomenAndOrPelvisStructure': {'416775004': ('Chest and/or abdomen ' 'and/or pelvis ' 'structure (body ' 'structure)', [])}, 'ChestAndOrAbdomenStructure': {'416550000': ('Chest and/or abdomen structure ' '(body structure)', [])}, 'ChestCircumference': {'248366000': ('Chest circumference (observable entity)', [])}, 'ChestDiscomfort': {'279084009': ('Chest discomfort', [3220])}, 'ChestImaging': {'413815006': ('Chest imaging (procedure)', [])}, 'ChestPain': {'29857009': ('Chest Pain', [12246, 3201, 3221, 3220])}, 'ChestPainFinding': {'29857009': ('Chest pain (finding)', [])}, 'ChestPainNotPresent': {'161971004': ('Chest pain not present', [3202, 3220, 3719])}, 'ChestWall': {'78904004': ('Chest wall', [6129, 6018])}, 'ChestWallMuscle': {'372074006': ('Chest wall muscle', [7155, 9514, 7192, 7151])}, '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', [9300, 60])}, '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', [625, 623])}, 'ChloriodizedOil': {'62442005': ('Chloriodized oil', [12, 3850])}, 'ChloroacetateEsteraseStain': {'255796003': ('chloroacetate esterase stain', [8112])}, 'Chloroform': {'259153006': ('Chloroform', [624, 623, 8114])}, 'Chlorpromazine': {'387258005': ('Chlorpromazine', [626, 623])}, 'Choline': {'65123005': ('Choline', [7186, 7180, 218, 4032, 4033, 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])}, 'CholylCarbon14Glycine': {'70086001': ('Cholyl-carbon^14^ glycine', [25])}, 'Chondroma': {'31186001': ('Chondroma', [6031, 6030])}, 'Chondrosarcoma': {'14990007': ('Chondrosarcoma', [6030, 6033])}, 'ChondrosarcomaNoInternationalClassificationOfDiseasesForOncologySubtype': {'14990007': ('Chondrosarcoma, ' 'no ' 'International ' 'Classification ' 'of ' 'Diseases ' 'for ' 'Oncology ' 'subtype ' '(morphologic ' 'abnormality)', [])}, 'ChordaeTendineaeCordis': {'102298001': ('Chordae tendineae cordis', [6109, 6102, 6116, 9514, 7192, 7151])}, 'ChoroidOfEye': {'68703001': ('Choroid of eye', [4211, 4209])}, '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': {'161901003': ('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', [4211, 4209])}, 'CiliaryBodyStructure': {'29534007': ('Ciliary body structure (body ' 'structure)', [])}, 'Cingulum': {'37035000': ('Cingulum', [7153, 7704, 7710, 9514, 7192, 7151])}, 'CinisaraCattleBreed': {'131462007': ('Cinisara cattle breed', [7480])}, 'CircleOfWillis': {'11279006': ('Circle of Willis', [4030, 9514, 7192, 7151, 4])}, 'CirculatingNurse': {'413854007': ('Circulating Nurse', [7453])}, 'Circumference': {'74551000': ('Circumference', [12257, 12277, 7470, 6165, 12260, 12271, 12267, 12251, 12250, 12266, 12270, 12265, 12273, 12269, 218, 12268, 12272, 12264, 12259, 12218, 12263, 12275, 12274, 12262, 12258, 7469])}, 'Circumferential': {'255593009': ('Circumferential', [6209])}, 'CircumflexCoronaryArtery': {'57396003': ('Circumflex Coronary Artery', [3604, 6109, 3015, 12292, 6102, 6117, 9514, 7192, 3016, 7151, 3827])}, 'Circumscribed': {'263706005': ('Circumscribed', [6120])}, 'CircumscribedLesion': {'129738007': ('Circumscribed lesion', [6007, 6006])}, 'CiritHorseBreed': {'131907007': ('Cirit horse breed', [7480])}, 'CirnecoDellEtnaDogBreed': {'132422006': ("Cirneco dell'Etna dog breed", [7480])}, 'CirsoidAneurysm': {'233982006': ('cirsoid aneurysm', [3808])}, 'CisternaMagna': {'54165005': ('Cisterna Magna', [12020, 12022])}, 'Citrate': {'59351004': ('Citrate', [7186, 7180, 218, 4032, 4033, 7469])}, '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', [3221, 3220])}, 'Clavicle': {'51299004': ('Clavicle', [12021, 4030, 6109, 4031, 7304, 7155, 6102, 6114, 4042, 9514, 7192, 7151, 4, 4009])}, 'ClavicularNotchOfSternum': {'75319007': ('Clavicular notch of sternum', [6115])}, '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', [7112, 6040, 6401, 7151, 7111, 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', [7158, 7151, 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])}, 'CoPigBreed': {'132350007': ('Co pig breed', [7480])}, 'Coagulant': {'15117003': ('Coagulant', [10])}, 'CoarctationAngioplasty': {'308696000': ('Coarctation angioplasty (procedure)', [])}, 'CoarctationOfAorta': {'7305005': ('Coarctation of Aorta', [12291, 3610, 3630])}, 'CoarctationOfTheAorta': {'7305005': ('Coarctation of the Aorta', [12249, 12248])}, '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', [6132, 6011, 6010])}, 'CoarsePopcornLikeRadiographicCalcification': {'129749001': ('Coarse ' '(popcorn-like) ' 'radiographic ' 'calcification ' '(finding)', [])}, 'CobaltChromiumAlloy': {'256526003': ('Cobalt-chromium alloy', [300])}, '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', [7483, 7482])}, 'Coccyx': {'64688005': ('Coccyx', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'CochinealStain': {'91606004': ('cochineal stain', [8112])}, 'CockerSpanielAnySolidColorOtherThanBlack': {'30565000': ('Cocker spaniel, ' 'any solid color ' 'other than black ' '(organism)', [])}, 'CockettPerforatingVein': {'128549006': ("Cockett's perforating vein", [12103, 9514, 7192, 7151, 3827, 12110])}, 'CoiledPosition': {'34108001': ('Coiled position (finding)', [])}, 'CoinLesion': {'308689002': ('Coin lesion', [6104, 6102])}, '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])}, 'CollateralBranchOfVessel': {'397406000': ('Collateral Branch of vessel', [3496, 12117, 7111])}, 'CollectionOfBloodSpecimenForLaboratory': {'82078001': ('collection of blood ' 'specimen for ' 'laboratory', [3515])}, 'Collie': {'19078005': ('Collie', [7480])}, 'Collimator': {'228761004': ('Collimator', [6040, 6401, 7151, 7193])}, 'ColloidalGoldAu198': {'37947008': ('Colloidal gold Au^198^', [25])}, 'ColloidalIndium111': {'30825005': ('Colloidal Indium^111^', [25])}, 'ColloidalIronStain': {'406952009': ('colloidal iron stain', [8112])}, 'ColombianCriolloHorseBreed': {'131804001': ('Colombian Criollo horse breed', [7480])}, 'Colon': {'71854001': ('Colon', [4030, 4031, 7483, 7482, 10060, 4042, 9514, 645, 7192, 7151, 4, 4009, 10044])}, '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', [6202, 6203])}, 'ColourpointShorthairedCat': {'61753003': ('Colourpoint shorthaired cat', [7480])}, 'ColumbiaSheepBreed': {'131705005': ('Columbia sheep breed', [7480])}, 'CombinedDiagnosticAndTherapeutic': {'371931008': ('Combined diagnostic and ' 'therapeutic (procedure)', [])}, 'CombinedDiagnosticAndTherapeuticProcedure': {'371931008': ('Combined ' 'Diagnostic and ' 'Therapeutic ' 'Procedure', [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', [12249, 12248])}, 'CommonAtrium': {'253276007': ('Common atrium', [3608, 12284, 3010, 4042, 9514, 7192, 7151, 4, 3630])}, 'CommonCarotidArtery': {'32062004': ('Common carotid artery', [3604, 6109, 12104, 12103, 6102, 6117, 3010, 4042, 9514, 7192, 3606, 7151, 3827, 4, 3630])}, 'CommonCarotidArteryStructure': {'32062004': ('Common carotid artery ' 'structure (body structure)', [])}, 'CommonDuctLymphNode': {'280639005': ('common duct lymph node', [7600])}, 'CommonFemoralArtery': {'181347005': ('Common Femoral Artery', [3604, 12109, 12103, 3010, 4042, 9514, 7192, 3606, 7151, 3827, 4, 3630])}, 'CommonFemoralVein': {'397363009': ('Common Femoral Vein', [12103, 9514, 7192, 7151, 3827, 12110])}, 'CommonFemoralVeinStructure': {'397363009': ('Common femoral vein structure ' '(body structure)', [])}, 'CommonHepaticArtery': {'66559000': ('Common Hepatic Artery', [12112, 12103, 9514, 7192, 7151, 3827])}, 'CommonIliacArtery': {'73634005': ('Common Iliac Artery', [12109, 12112, 12103, 3010, 12140, 4042, 9514, 7192, 7151, 3827, 4])}, 'CommonIliacArteryBifurcation': {'413896006': ('Common iliac artery ' 'bifurcation', [1005, 12109, 12103, 1001, 1000, 9514, 7192, 7151, 3827])}, 'CommonIliacArteryStructure': {'73634005': ('Common iliac artery structure ' '(body structure)', [])}, 'CommonIliacBifurcation': {'413896006': ('Common Iliac Bifurcation', [3837, 7111])}, 'CommonIliacVein': {'46027005': ('Common iliac vein', [12113, 12103, 3010, 4042, 9514, 7192, 7151, 3827, 4, 12110])}, 'CommonNonMitralNonTricuspidAtrioventricularValveStructure': {'312522004': ('Common ' 'non-mitral ' 'non-tricuspid ' 'Atrioventricular ' 'Valve ' 'Structure', [12285])}, 'CommonTruncusArteriosus': {'61959006': ('Common truncus arteriosus ' '(disorder)', [])}, 'CommonVentricle': {'45503006': ('Common ventricle', [3609, 3010, 12287, 4042, 3011, 9514, 7192, 7151, 4, 3630])}, 'Complaint': {'409586006': ('Complaint', [3769])}, 'Complete': {'255594003': ('Complete', [67])}, 'CompleteAtrioventricularBlock': {'27885002': ('Complete atrioventricular ' 'block (disorder)', [])}, 'CompleteTranspositionOfGreatVessels': {'26146002': ('Complete transposition ' 'of great vessels', [12249, 12248])}, '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)', [])}, 'ComputedTomographyAngiographyOfCoronaryArteries': {'419545005': ('Computed ' 'tomography ' 'angiography ' 'of ' 'coronary ' 'arteries ' '(procedure)', [])}, 'ComputedTomographyGuidedBiopsy': {'277591006': ('Computed tomography guided ' 'biopsy', [6060, 6058])}, 'ComputedTomographyOfAbdominalAorta': {'241553009': ('Computed tomography of ' 'abdominal aorta ' '(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': ('Conduction disorder of the ' 'heart (disorder)', [])}, 'ConeBeamAcquisition': {'702569007': ('Cone Beam Acquisition', [10013])}, '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', [3010, 4042, 9514, 7192, 7151, 4])}, 'CongenitalCoronaryArteryFistulaToLeftVentricle': {'128556000': ('Congenital ' 'coronary ' 'artery ' 'fistula to ' 'left ' 'ventricle', [3010, 4042, 9514, 7192, 7151, 4])}, 'CongenitalCoronaryArteryFistulaToRightAtrium': {'128557009': ('Congenital ' 'coronary ' 'artery ' 'fistula to ' 'right atrium', [3010, 4042, 9514, 7192, 7151, 4])}, 'CongenitalCoronaryArteryFistulaToRightVentricle': {'128558004': ('Congenital ' 'coronary ' 'artery ' 'fistula to ' 'right ' 'ventricle', [3010, 4042, 9514, 7192, 7151, 4])}, 'CongenitalHeartDisease': {'13213009': ('Congenital heart disease', [12246])}, 'CongenitalPulmonaryArteriovenousFistula': {'111289009': ('Congenital ' 'pulmonary ' 'arteriovenous ' 'fistula', [3010, 4042, 9514, 7192, 7151, 4])}, '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', [12249, 12248])}, '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', [4211, 4209])}, 'ConjunctivalStructure': {'29445007': ('Conjunctival structure (body ' 'structure)', [])}, 'ConnectiveTissue': {'21793004': ('Connective tissue', [7191, 7151, 7166])}, '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)', [])}, 'ContinuousFlowVentilation': {'243156001': ('Continuous flow ventilation', [620, 619])}, 'Contraceptives': {'108899006': ('Contraceptives', [6080])}, 'Contraindicated': {'373147003': ('Contraindicated', [3741, 3743, 3742]), '373148008': ('Contraindicated', [3740])}, 'Contralateral': {'255209002': ('Contralateral', [246])}, 'ContrastAgent': {'7140000': ('Contrast agent', [6040, 12, 7198, 6402, 3850])}, 'ContrastEchocardiography': {'433231002': ('Contrast echocardiography', [12001])}, 'ContrastMedia': {'385420005': ('Contrast media', [7112, 6201, 7111])}, 'ContrastMediaAdverseReaction': {'292095005': ('Contrast media adverse ' 'reaction', [3413, 3755])}, 'ContrastMediaAllergy': {'293637006': ('Contrast Media Allergy', [1200])}, 'ContrastMediaSeenInPlaque': {'413912008': ('Contrast media seen in plaque ' '(finding)', [])}, 'ContrastMediumInjectionSystemManifoldKit': {'467354001': ('Contrast medium ' 'injection system ' 'manifold kit', [69])}, '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])}, '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])}, 'CopperANDORCopperCompound': {'105837005': ('Copper AND/OR copper compound ' '(substance)', [])}, 'CopperOrCopperCompound': {'105837005': ('Copper or Copper compound', [10006, 10067])}, 'CorTriatriatumOrifice': {'443445009': ('Cor Triatriatum Orifice', [12283])}, 'CorTriloculareBiventriculare': {'253276007': ('Cor triloculare ' 'biventriculare (disorder)', [])}, 'CoracoidProcessOfScapula': {'8931003': ('Coracoid process of scapula', [6115])}, 'CoreBodyTemperatureMeasuredInRectum': {'307047009': ('Core body temperature ' 'measured in rectum ' '(observable entity)', [])}, 'CoreNeedleBiopsyOfBreast': {'44578009': ('Core needle biopsy of breast', [6083, 6050])}, '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', [4211, 4266, 9514, 7192, 7151, 4209, 4, 4233, 4029])}, 'CornealEndothelium': {'65431007': ('Corneal endothelium', [4211])}, 'CornealEpithelium': {'15775008': ('Corneal epithelium', [4211])}, 'CornealOpacity': {'64634000': ('Corneal Opacity', [4222])}, 'CornealStructure': {'28726007': ('Corneal structure (body structure)', [])}, 'CornishRexCatBreed': {'56917006': ('Cornish rex cat breed', [7480])}, 'Coronal': {'81654009': ('Coronal', [6, 502, 2, 501, 26])}, 'CoronaryAngiography': {'33367005': ('Coronary angiography (procedure)', [])}, 'CoronaryArteriography': {'33367005': ('Coronary Arteriography', [3405, 3428])}, 'CoronaryArteriosclerosis': {'53741008': ('Coronary arteriosclerosis ' '(disorder)', [])}, 'CoronaryArtery': {'41801008': ('Coronary Artery', [3604, 4030, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'CoronaryArteryBypassGraft': {'232717009': ('Coronary artery bypass graft', [3721, 3764])}, 'CoronaryArteryBypassGrafting': {'232717009': ('Coronary artery bypass ' 'grafting (procedure)', [])}, 'CoronaryArteryDisease': {'53741008': ('Coronary artery disease', [3700, 12246, 3201])}, 'CoronaryArteryFeature': {'364092001': ('Coronary artery feature (observable ' 'entity)', [])}, 'CoronaryArteryFistulaToRightAtrium': {'373095005': ('Coronary artery fistula ' 'to right atrium ' '(disorder)', [])}, 'CoronaryArteryGraft': {'264293000': ('Coronary Artery Graft', [3604, 6109, 1004, 3015, 6102, 1001, 6117, 1000, 9514, 7192, 7151, 3827])}, 'CoronaryArteryStructure': {'41801008': ('Coronary artery structure (body ' 'structure)', [])}, 'CoronaryBypassGraftAngiography': {'252427007': ('Coronary bypass graft ' 'angiography (procedure)', [])}, 'CoronarySinus': {'31162003': ('Coronary sinus', [3608, 3630]), '90219004': ('Coronary Sinus', [3839, 3010, 4042, 3011, 9514, 7192, 7151, 3827, 4])}, 'CoronarySinusStructure': {'90219004': ('Coronary sinus structure (body ' 'structure)', [])}, 'CorpusCallosum': {'88442005': ('Corpus callosum', [7153, 7705, 7710, 9514, 7192, 7151])}, 'CorpusCallosumStructure': {'88442005': ('Corpus callosum structure (body ' 'structure)', [])}, 'CorpusStriatum': {'31428008': ('Corpus striatum', [7153, 9514, 7192, 7151])}, 'CorpusStriatumStructure': {'31428008': ('Corpus striatum structure (body ' 'structure)', [])}, 'CorrectedTranspositionOfGreatVessels': {'83799000': ('Corrected ' 'transposition of great ' 'vessels', [12249, 12248])}, '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', [7710, 7701])}, 'CosentinaPigBreed': {'132180009': ('Cosentina pig breed', [7480])}, 'CostaRicanSaddleHorseHorseBreed': {'131807008': ('Costa Rican Saddle Horse ' 'horse breed', [7480])}, 'CostalCartilage': {'50016007': ('Costal Cartilage', [6113, 6109, 6102, 9514, 7192, 7151])}, 'CostalGroove': {'17399006': ('Costal groove', [6115])}, 'CostenoHorseBreed': {'131808003': ('Costeno horse breed', [7480])}, 'CosteñoConCuernosCattleBreed': {'131587002': ('Costeño con Cuernos cattle ' 'breed', [7480])}, 'CostocervicalTrunk': {'3159004': ('Costocervical trunk', [6109, 6102, 6117, 9514, 7192, 7151])}, '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', [9300, 60])}, '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', [9514, 7192, 7151, 7167])}, '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', [4030, 9514, 7192, 7151, 4])}, 'CranioCaudal': {'399162004': ('cranio-caudal', [4010, 4014, 501])}, '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', [7186, 7180, 218, 4032, 4033, 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])}, 'CrystalPonceauStain': {'68459007': ('crystal ponceau stain', [8112])}, '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])}, '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', [3429, 3411])}, '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', [12249, 12248])}, 'Cyclopentolate': {'8348002': ('Cyclopentolate', [4208])}, 'CylindroidAneurysm': {'52856002': ('cylindroid aneurysm', [3808])}, 'CyprusCattleBreed': {'133367009': ('Cyprus cattle breed', [7480])}, 'Cyst': {'367643001': ('Cyst', [7159, 7194, 7151])}, 'CystOfBreast': {'399294002': ('Cyst of breast', [6031, 6030, 6064, 6054])}, 'Cystadenocarcinoma': {'21008007': ('Cystadenocarcinoma', [639, 638])}, 'CysticAdventitialDisease': {'234021009': ('cystic adventitial disease', [3805])}, 'CysticLymphNode': {'280556009': ('cystic lymph node', [7600])}, '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)', [])}, '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', [7309, 7307])}, '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])}, 'DangiCattleBreedOrganism': {'133603002': ('Dangi cattle breed (organism)', [])}, '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': {'245639007': ('Deciduous mandibular ' 'left canine tooth', [4026, 4019])}, 'DeciduousMandibularLeftCentralIncisorTooth': {'89552004': ('Deciduous ' 'mandibular left ' 'central incisor ' 'tooth', [4026, 4019])}, 'DeciduousMandibularLeftFirstMolarTooth': {'38896004': ('Deciduous mandibular ' 'left first molar ' 'tooth', [4026, 4019])}, 'DeciduousMandibularLeftLateralIncisorTooth': {'14770005': ('Deciduous ' 'mandibular left ' 'lateral incisor ' 'tooth', [4026, 4019])}, 'DeciduousMandibularLeftSecondMolarTooth': {'49330006': ('Deciduous ' 'mandibular left ' 'second molar tooth', [4026, 4019])}, 'DeciduousMandibularRightCanineTooth': {'6062009': ('Deciduous mandibular ' 'right canine tooth', [4026, 4019])}, 'DeciduousMandibularRightCentralIncisorTooth': {'67834006': ('Deciduous ' 'mandibular ' 'right central ' 'incisor tooth', [4026, 4019])}, 'DeciduousMandibularRightFirstMolarTooth': {'245631005': ('Deciduous ' 'mandibular right ' 'first molar tooth', [4026, 4019])}, 'DeciduousMandibularRightLateralIncisorTooth': {'22445006': ('Deciduous ' 'mandibular ' 'right lateral ' 'incisor tooth', [4026, 4019])}, 'DeciduousMandibularRightSecondMolarTooth': {'61868007': ('Deciduous ' 'mandibular right ' 'second molar tooth', [4026, 4019])}, 'DeciduousMaxillaryLeftCanineTooth': {'73937000': ('Deciduous maxillary left ' 'canine tooth', [4026, 4019])}, 'DeciduousMaxillaryLeftCentralIncisorTooth': {'51678005': ('Deciduous ' 'maxillary left ' 'central incisor ' 'tooth', [4026, 4019])}, 'DeciduousMaxillaryLeftFirstMolarTooth': {'45234009': ('Deciduous maxillary ' 'left first molar ' 'tooth', [4026, 4019])}, 'DeciduousMaxillaryLeftLateralIncisorTooth': {'43622005': ('Deciduous ' 'maxillary left ' 'lateral incisor ' 'tooth', [4026, 4019])}, 'DeciduousMaxillaryLeftSecondMolarTooth': {'51943008': ('Deciduous maxillary ' 'left second molar ' 'tooth', [4026, 4019])}, 'DeciduousMaxillaryRightCanineTooth': {'30618001': ('Deciduous maxillary ' 'right canine tooth', [4026, 4019])}, 'DeciduousMaxillaryRightCentralIncisorTooth': {'245620002': ('Deciduous ' 'maxillary right ' 'central incisor ' 'tooth', [4026, 4019])}, 'DeciduousMaxillaryRightFirstMolarTooth': {'245616001': ('Deciduous maxillary ' 'right first molar ' 'tooth', [4026, 4019])}, 'DeciduousMaxillaryRightLateralIncisorTooth': {'245619008': ('Deciduous ' 'maxillary right ' 'lateral incisor ' 'tooth', [4026, 4019])}, 'DeciduousMaxillaryRightSecondMolarTooth': {'27855007': ('Deciduous maxillary ' 'right second molar ' 'tooth', [4026, 4019])}, 'DecreaseInNumberOfCalcifications': {'129727007': ('Decrease in number of ' 'calcifications', [6003, 6002])}, 'DecreaseInNumberOfCalcificationsSincePreviousMammogram': {'129727007': ('Decrease ' 'in ' 'number ' 'of ' 'calcifications ' 'since ' 'previous ' 'mammogram ' '(finding)', [])}, 'DecreaseInSize': {'19776001': ('Decrease in size', [6134, 6003, 6002])}, '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])}, 'DeepCervicalLymphNode': {'279145002': ('deep cervical lymph node', [7600])}, 'DeepInguinalLymphNode': {'65266007': ('deep inguinal lymph node', [7600])}, 'DeepIntraparotidLymphNode': {'75040000': ('deep intraparotid lymph node', [7600])}, 'DeepLateralCervicalLymphNode': {'167864002': ('deep lateral cervical lymph ' 'node', [7600])}, 'DeepLymphNode': {'60996007': ('deep lymph node', [7600])}, 'DeepPalmarArchOfRadialArtery': {'10119003': ('Deep Palmar Arch of Radial ' 'Artery', [12103, 9514, 7192, 7151, 12107, 3827])}, 'DeepPalmarVenousArch': {'368481004': ('Deep Palmar Venous Arch', [12108, 12103, 9514, 7192, 7151, 3827])}, 'DeepParotidLymphNode': {'279142004': ('deep parotid lymph node', [7600])}, 'DeepPoplitealLymphNode': {'35721009': ('deep popliteal lymph node', [7600])}, 'Defibrillator': {'72506001': ('Defibrillator', [7157, 7151, 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])}, 'DeltoidMuscle': {'35259002': ('Deltoid muscle', [6109, 6102, 6116, 9514, 7192, 7151])}, 'DengchuanCattleBreed': {'133373005': ('Dengchuan cattle breed', [7480])}, 'DentalProsthesis': {'27606000': ('Dental Prosthesis', [7157, 7151, 7193])}, 'DentalProsthesisDevice': {'27606000': ('Dental prosthesis, device (physical ' 'object)', [])}, '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', [7470, 6165, 218, 7469])}, '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)', [])}, 'DesFossesCommunesDeLOuestGoatBreed': {'131690002': ('Des Fosses (Communes de ' "l'Ouest) goat breed", [7480])}, 'Descending': {'75294000': ('Descending', [5])}, 'DescendingAorta': {'281130003': ('Descending aorta', [6109, 6102, 6117, 12141, 9514, 7192, 7151]), '32672002': ('Descending aorta', [3604, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'DescendingAortaStructure': {'281130003': ('Descending aorta structure (body ' 'structure)', [])}, 'DescendingColon': {'32622004': ('Descending colon', [6210])}, 'DescendingColonStructure': {'32622004': ('Descending colon structure (body ' 'structure)', [])}, 'Desflurane': {'386841003': ('Desflurane', [624, 623])}, 'DetachableBalloon': {'102320000': ('Detachable balloon', [4051, 7151, 8, 7193])}, 'DetachableBalloonDevice': {'102320000': ('Detachable balloon, device ' '(physical object)', [])}, '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': {'49992008': ('Dexamethasone sodium phosphate ' '(product)', [])}, 'DexamethasoneSodiumSulfate': {'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', [70, 3850, 10])}, 'Dextrocardia': {'27637000': ('Dextrocardia', [12249, 12248])}, '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', [6061, 4256, 6051, 6058])}, 'DiagnosticAspirationOfBreastCyst': {'287572003': ('Diagnostic aspiration of ' 'breast cyst', [6083, 6050])}, 'DiagnosticImaging': {'441662001': ('Diagnostic Imaging', [7030])}, 'DiagnosticImagingDepartment': {'441662001': ('Diagnostic imaging department ' '(environment)', [])}, 'DiagnosticIntent': {'261004008': ('Diagnostic Intent', [3629, 7064])}, 'DiagnosticProcedure': {'103693007': ('Diagnostic procedure (procedure)', [])}, 'DiagnosticProcedureOnBloodVessel': {'83422003': ('Diagnostic procedure on ' 'blood vessel (procedure)', [])}, 'DiagnosticRadiographyStereotacticLocalization': {'64318009': ('Diagnostic ' 'radiography, ' 'stereotactic ' 'localization', [6060, 6058])}, 'DiagnosticRadiographyWithContrastMedia': {'27483000': ('Diagnostic ' 'radiography with ' 'contrast media', [10014])}, 'DiagnosticRadioisotope': {'17600005': ('Diagnostic radioisotope', [25])}, 'DiagnosticUltrasonography': {'16310003': ('Diagnostic ultrasonography', [6029, 6028])}, 'DialiCattleBreed': {'133648003': ('Diali cattle breed', [7480])}, 'Diameter': {'81827009': ('Diameter', [12304, 12257, 12277, 7470, 6165, 12260, 12271, 12267, 3423, 12251, 12250, 12266, 12270, 12265, 12273, 12269, 218, 12268, 12272, 12264, 12008, 12259, 12218, 12263, 12275, 12274, 12262, 12258, 7469])}, 'DiameterOfCircumscribedCircle': {'131192006': ('Diameter of circumscribed ' 'circle', [7470, 6165, 218, 7469])}, 'DiamondBlackStain': {'72572003': ('diamond black stain', [8112])}, 'DianiPigBreed': {'133176005': ('Diani pig breed', [7480])}, 'Diaphragm': {'5798000': ('Diaphragm', [6109, 1004, 7155, 6102, 1001, 6116, 1000, 9514, 7192, 7151])}, 'DiaphragmStructure': {'5798000': ('Diaphragm structure (body structure)', [])}, 'DiaphragmaticLymphNode': {'196751009': ('diaphragmatic lymph node', [7600])}, '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', [625, 623])}, 'DibromofluoresceinStain': {'17172002': ('dibromofluorescein stain', [8112])}, 'DichroicBeamsplitter': {'445316008': ('Dichroic beamsplitter', [8124])}, 'DidingaCattleBreed': {'133649006': ('Didinga cattle breed', [7480])}, 'Diencephalon': {'87563008': ('Diencephalon', [7153, 9514, 7192, 7151])}, 'DiethylEther': {'259170003': ('Diethyl ether', [624, 623])}, '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]), '442726008': ('Difference in location', [6133, 6207])}, '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]), '442714003': ('Difference in size', [6133, 6207])}, '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])}, 'DiffuseCalcificationDistribution': {'129764001': ('Diffuse calcification ' 'distribution', [6013, 6012])}, 'DiffuseDisease': {'371915000': ('Diffuse Disease', [3712])}, 'DiffuseDiseaseOfCoronaryArtery': {'371915000': ('Diffuse disease of coronary ' 'artery (finding)', [])}, 'DiffuseFibroelastosis': {'125358004': ('diffuse fibroelastosis', [3817])}, 'DiffuseInflammatoryErythema': {'402603005': ('Diffuse inflammatory erythema', [9300, 60])}, 'Digit': {'82680008': ('Digit', [7483, 7482])}, 'DigitStructure': {'82680008': ('Digit structure (body structure)', [])}, 'DigitalArteryOfHand': {'40254007': ('Digital artery of hand', [12103, 9514, 7192, 7151, 12107, 3827])}, 'DigitalImager': {'468440006': ('Digital imager', [7026, 7027, 7151, 7193])}, 'DigitalImagerRadiationTherapy': {'468440006': ('Digital imager, radiation ' 'therapy (physical object)', [])}, 'Digoxin': {'796001': ('Digoxin', [10])}, 'DiiodofluoreceinI131': {'53207004': ('Diiodofluorecein I^131^', [25])}, 'DiiodofluoresceinI131': {'53207004': ('Diiodofluorescein I^131^ (substance)', [])}, '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': {'26458009': ('Diphenhydramine', [65])}, 'Dipyridamole': {'66859009': ('Dipyridamole', [3204])}, 'DipyridamoleStressProtocol': {'422685009': ('Dipyridamole Stress protocol', [12001, 3261])}, 'DirectOphthalmoscope': {'409900009': ('Direct Ophthalmoscope', [4202])}, 'DirectionOfFlow': {'260674002': ('Direction of flow (attribute)', [])}, 'DirectionalCoronaryAtherectomyDCADevice': {'371796006': ('Directional ' 'Coronary ' 'Atherectomy (DCA) ' 'Device', [3429, 3411])}, '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])}, 'DisodiumIndium111': {'56475001': ('Disodium indium^111^', [25])}, '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', [6055])}, 'Distal': {'46053002': ('Distal', [3019, 211, 2, 12116, 212, 5, 12281])}, 'DistalCircumflexCoronaryArtery': {'6511003': ('Distal Circumflex Coronary ' 'Artery', [3014, 3604, 6109, 3015, 12292, 6102, 6117, 9514, 7192, 7151, 3827])}, 'DistalFemur': {'310652005': ('Distal Femur', [7304])}, 'DistalHumerus': {'118495001': ('Distal Humerus', [7304])}, 'DistalLeftAnteriorDescendingCoronaryArtery': {'36672000': ('Distal Left ' 'Anterior ' 'Descending ' 'Coronary Artery', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, 'DistalRadius': {'75129005': ('Distal Radius', [7304])}, 'DistalRightCoronaryArtery': {'41879009': ('Distal Right Coronary Artery', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, 'DistalTibia': {'64605006': ('Distal Tibia', [7304])}, 'DistalUlna': {'91238003': ('Distal Ulna', [7304])}, 'DistilledWater': {'444883009': ('Distilled water', [610])}, 'Diuretic': {'30492008': ('Diuretic', [3760, 10]), '372695000': ('Diuretic', [621, 622])}, 'Diverticulum': {'31113003': ('Diverticulum', [6201, 3810])}, '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', [12001, 3261])}, 'DoddPerforatingVein': {'128554002': ("Dodd's perforating vein", [3010, 4042, 9514, 7192, 7151, 4, 3630, 3607])}, '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': {'83422003': ('Doppler', [3442])}, 'DopplerCatheterMethod': {'133911005': ('Doppler catheter method', [3241])}, 'DopplerColorFlow': {'261197005': ('Doppler Color Flow', [12224, 6058])}, 'DopplerContinuousWave': {'261198000': ('Doppler Continuous Wave', [12224, 6058])}, 'DopplerPulsed': {'261199008': ('Doppler Pulsed', [12224, 6058])}, '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])}, 'DorsalFuniculus': {'59752008': ('dorsal funiculus', [7710, 7707])}, 'DorsalFuniculusStructure': {'59752008': ('Dorsal funiculus structure (body ' 'structure)', [])}, 'DorsalScapularArtery': {'91732003': ('Dorsal scapular artery', [6109, 6102, 6117, 9514, 7192, 7151])}, 'DorsalisPedisArtery': {'86547008': ('Dorsalis Pedis Artery', [12109, 12103, 3440, 9514, 7192, 7151, 3827])}, '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', [4010, 7484, 501])}, '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)', [])}, '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])}, 'Droperidol': {'387146001': ('Droperidol', [625, 623])}, 'DroughtmasterCattleBreed': {'133720007': ('Droughtmaster cattle breed ' '(organism)', [])}, 'DroughtmasterXZebuCattleBreed': {'133720007': ('Droughtmaster X zebu cattle ' 'breed', [7480])}, 'DrugDiluent': {'74626007': ('Drug diluent', [621, 622])}, 'DrugInducedDizziness': {'473188002': ('Drug Induced Dizziness', [9300, 60])}, 'DrugInducedFlushing': {'403618004': ('Drug induced Flushing', [9300, 60])}, 'DrugInducedHypotension': {'234171009': ('Drug-induced hypotension', [9300, 60])}, 'DrugInducedNauseaAndVomiting': {'405165006': ('Drug induced Nausea and ' 'vomiting', [9300, 60])}, 'DrugInfusion': {'133882006': ('Drug infusion', [91, 3271])}, 'DrugInfusionChallenge': {'133882006': ('Drug Infusion Challenge', [3405, 3250, 3651])}, 'DrugMisuseBehavior': {'228366006': ('Drug misuse behavior', [3774])}, 'DrugRash': {'28926001': ('Drug Rash', [9300, 60])}, '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)', [])}, 'DuctalHyperplasiaUsual': {'67617000': ('Ductal hyperplasia, Usual', [6031, 6030])}, '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', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'DuraMater': {'18545000': ('Dura mater', [7153, 9514, 7192, 7151, 5])}, '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, 12102, 633, 61, 12002])}, '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', [9300, 12246, 60, 3201, 3221, 3220])}, 'DystrophicCalcification': {'129750001': ('Dystrophic calcification', [6011, 6010])}, '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])}, 'EDTAGa68': {'423498000': ('EDTA Ga^68^', [4021])}, 'ELMExternalLimitingMembrane': {'76710003': ('ELM - External limiting ' 'membrane', [9514, 7192, 7151, 4273])}, 'Ear': {'117590005': ('Ear', [9514, 7192, 7151, 4])}, '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', [12001, 3757, 3206, 3744])}, 'EchocardiographyForDeterminingVentricularContraction': {'35757004': ('Echocardiography ' 'for ' 'determining ' 'ventricular ' 'contraction ' '(procedure)', [])}, 'Ectatic': {'386140000': ('Ectatic', [3712])}, 'EctaticCoronaryArtery': {'386140000': ('Ectatic coronary artery (finding)', [])}, 'EctopicAccessoryBreastTissue': {'1896004': ('Ectopic (accessory) breast ' 'tissue', [6031, 6030])}, 'EctopicBreastTissue': {'1896004': ('Ectopic breast tissue (disorder)', [])}, 'EdelschweinPigBreed': {'132353009': ('Edelschwein pig breed', [7480])}, 'Edema': {'79654002': ('Edema', [7169, 6056, 6016, 7168, 7159, 6031, 6030, 7194, 6015, 6054, 7151, 6014])}, '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', [6132, 6011, 6010])}, 'EggshellRadiographicCalcification': {'129751002': ('Eggshell radiographic ' 'calcification (finding)', [])}, 'EgyptianCattleBreed': {'131470002': ('Egyptian cattle breed', [7480])}, 'EgyptianHorseBreed': {'133017007': ('Egyptian horse breed', [7480])}, 'EgyptianMauCat': {'21637005': ('Egyptian mau cat', [7480])}, 'ElasticVascularSclerosis': {'19952003': ('elastic vascular sclerosis', [3817])}, 'ElbowJoint': {'16953009': ('Elbow joint', [4030, 4031, 7304, 7483, 7482, 1001, 4042, 1000, 9514, 7192, 7151, 4, 4009, 1006])}, 'ElbowJointStructure': {'16953009': ('Elbow joint structure (body structure)', [])}, 'Elective': {'103390000': ('Elective (qualifier value)', []), '8715000': ('Elective', [3729])}, '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)', [])}, 'ElectrocardiogramNormal': {'164854000': ('Electrocardiogram normal (finding)', [])}, 'ElectrocardiogramSTIntervalNormal': {'164929001': ('Electrocardiogram: ST ' 'interval normal ' '(finding)', [])}, 'ElectrocardiogramWithExerciseTest': {'46136006': ('Electrocardiogram with ' 'exercise test (procedure)', [])}, 'Electron': {'46602004': ('Electron', [9525]), '48006008': ('Electron', [9526])}, '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])}, 'EllestadProtocol': {'129098000': ('Ellestad protocol', [12001, 3261])}, 'ElliottdaleSheepBreed': {'131720004': ('Elliottdale sheep breed', [7480])}, 'Embolism': {'55584005': ('embolism', [3805, 3815, 3810])}, 'EmbolizationBall': {'102315000': ('Embolization ball', [4051, 7151, 8, 7193])}, 'EmbolizationBallDevice': {'102315000': ('Embolization ball, device (physical ' 'object)', [])}, 'EmbolizationCoil': {'102314001': ('Embolization coil', [4051, 7151, 8, 7193])}, 'EmbolizationCoilDevice': {'102314001': ('Embolization coil, device (physical ' 'object)', [])}, 'EmbolizationParticulate': {'102316004': ('Embolization particulate', [4051, 7151, 8, 7193])}, 'EmbolizationParticulateDevice': {'102316004': ('Embolization particulate, ' 'device (physical object)', [])}, 'Embolus': {'55584005': ('Embolus', [7159, 7194, 7151])}, '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])}, 'EmptyVitreous': {'232077005': ('Empty vitreous (disorder)', [])}, 'EndDiastole': {'255254001': ('End Diastole', [12307]), '416190007': ('End diastole', [3337, 12233])}, 'EndDiastolicFunction': {'255254001': ('End-diastolic, function (observable ' 'entity)', [])}, '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', [9514, 7192, 7151, 4])}, 'EndoNasopharyngeal': {'18962004': ('Endo-nasopharyngeal', [9514, 7192, 7151, 4])}, 'EndoRectal': {'34402009': ('Endo-rectal', [4])}, 'EndoRenal': {'64033007': ('Endo-renal', [4])}, 'EndoUreteric': {'87953007': ('Endo-ureteric', [4])}, 'EndoUrethral': {'13648007': ('Endo-urethral', [4])}, 'EndoVaginal': {'76784001': ('Endo-vaginal', [4])}, 'EndoVascular': {'59820001': ('Endo-vascular', [4])}, 'EndoVenous': {'29092000': ('Endo-venous', [4])}, 'EndoVesical': {'48367006': ('Endo-vesical', [9514, 7192, 7151, 4])}, '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', [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', [624, 623])}, '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', [6118, 6107])}, 'EnlargedAorticRoot': {'373133002': ('Enlarged Aortic Root', [3709])}, 'EnlargedSeptalForamenOfHeart': {'287272002': ('Enlarged septal foramen of ' 'heart (disorder)', [])}, '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', [4030, 4031, 7483, 7482, 10060, 4042, 9514, 7192, 7151, 8103, 4, 4009])}, '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)', [])}, 'EntireSkin': {'181469002': ('Entire skin (body structure)', [])}, 'EntireVessel': {'361097006': ('Entire Vessel', [3019])}, 'EntlebucherDogBreed': {'132486007': ('Entlebucher dog breed', [7480])}, 'EntorhinalCortex': {'3937002': ('Entorhinal Cortex', [7153, 9514, 7192, 7151])}, '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': {'65026000': ('Ephedrine', [65])}, 'Epicardial': {'261073003': ('epicardial', [3843])}, 'EpicardialEchocardiography': {'433232009': ('Epicardial echocardiography', [3405, 12001, 3428])}, 'Epicardium': {'6871001': ('Epicardium', [3011])}, 'EpidermalInclusionCyst': {'419670003': ('Epidermal inclusion cyst', [6031, 6030])}, 'EpidermoidCyst': {'419670003': ('Epidermoid cyst (morphologic abnormality)', [])}, 'EpididymisStructure': {'87644002': ('Epididymis structure (body structure)', [])}, 'EpiduralAnesthesia': {'18946005': ('Epidural anesthesia', [611, 612])}, 'EpigastricLymphNode': {'60965003': ('epigastric lymph node', [7600])}, 'EpigastricRegion': {'27947004': ('Epigastric region', [9514, 7192, 7151, 4])}, 'EpigastricRegionStructure': {'27947004': ('Epigastric region structure (body ' 'structure)', [])}, 'Epilepsy': {'84757009': ('Epilepsy (disorder)', [])}, 'EpilepticConvulsions': {'84757009': ('Epileptic convulsions', [9300, 60])}, 'Epinephrine': {'387362001': ('Epinephrine', [10])}, 'EpirusCattleBreed': {'133381006': ('Epirus cattle breed', [7480])}, 'EpitrochlearLymphNode': {'28870006': ('epitrochlear lymph node', [7600])}, 'EpoxyResin': {'65345002': ('Epoxy resin', [8115])}, 'Equal': {'9726003': ('Equal', [75])}, 'EqualDensityIsodenseLesion': {'129745007': ('Equal density (isodense) lesion', [6009, 6008])}, 'EquipmentTemperature': {'250881009': ('Equipment temperature (observable ' 'entity)', [])}, 'Equivocal': {'42425007': ('Equivocal', [3120])}, 'Equus': {'388445009': ('Equus', [7454])}, 'EquusCaballus': {'35354009': ('Equus caballus (domestic horse)', [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', [6109, 6102, 6116, 9514, 7192, 7151])}, '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', [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', [6109, 6102, 6117, 9514, 7192, 7151])}, 'EsophagealHiatus': {'280062008': ('Esophageal Hiatus', [6113, 6109, 6102, 9514, 7192, 7151])}, 'EsophagealLymphNode': {'11899006': ('esophageal lymph node', [7600])}, 'EsophagealStructure': {'32849002': ('Esophageal structure (body structure)', [])}, 'Esophagus': {'32849002': ('Esophagus', [6113, 4030, 6109, 4031, 7155, 7483, 7482, 6102, 10060, 4042, 9514, 7192, 7151, 4009, 10044])}, 'EsophagusStomachAndDuodenum': {'110861005': ('Esophagus, stomach and ' 'duodenum', [4030, 4031, 4040, 4042, 9514, 7192, 7151, 4, 4009])}, 'EsophagusStomachAndDuodenumCombinedSite': {'110861005': ('Esophagus, stomach ' 'and duodenum ' '(combined site) ' '(body structure)', [])}, 'Estimated': {'414135002': ('Estimated', [3745, 6140, 3627, 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', [621, 622])}, 'EstrogenProduct': {'61946003': ('Estrogen product', [6080])}, 'EstrogenicPreparation': {'61946003': ('Estrogenic preparation (product)', [])}, 'Ethanol': {'419442005': ('Ethanol', [10, 8114])}, 'EthmoidBone': {'52374004': ('Ethmoid bone', [9514, 7192, 4028, 7151])}, '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', [625, 623])}, 'EurasianDogBreed': {'132481002': ('Eurasian dog breed', [7480])}, 'EurasierDogBreed': {'132387004': ('Eurasier dog breed', [7480])}, 'EurolinePigBreed': {'132026004': ('Euroline pig breed', [7480])}, 'EuropiumANDOREuropiumCompound': {'429591003': ('Europium AND/OR europium ' 'compound (substance)', [])}, 'EuropiumOrEuropiumCompound': {'429591003': ('Europium or Europium compound', [10006, 10067])}, '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])}, 'ExSmoker': {'8517006': ('Ex-smoker (finding)', [])}, 'ExaggeratedCranioCaudalProjection': {'399265009': ('Exaggerated ' 'cranio-caudal projection ' '(qualifier value)', [])}, 'ExaminationOfBreast': {'46662001': ('Examination of breast', [6083, 6050])}, 'Excision': {'65801008': ('Excision', [8109])}, 'Exercise': {'256235009': ('Exercise', [3774])}, 'ExerciseChallenge': {'128967005': ('Exercise challenge', [3405, 91, 3250, 3271, 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', [12001, 3261])}, 'ExerciseStressEchocardiography': {'433233004': ('Exercise stress ' 'echocardiography', [12001, 3757])}, '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])}, 'ExertionalHypertensionDisorder': {'429198000': ('Exertional hypertension ' '(disorder)', [])}, '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, 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', [6139, 2, 5])}, 'ExternalAuditoryCanal': {'84301002': ('External auditory canal', [4040, 9514, 7192, 7151, 4])}, 'ExternalAuditoryCanalStructure': {'84301002': ('External auditory canal ' 'structure (body structure)', [])}, 'ExternalAuditoryMeatus': {'84301002': ('External Auditory Meatus', [1002, 1001, 1000])}, 'ExternalCamera': {'409903006': ('External Camera', [4202])}, 'ExternalCapsule': {'10517005': ('external capsule', [7702, 7710])}, 'ExternalCapsuleOfBrain': {'10517005': ('External capsule of brain (body ' 'structure)', [])}, 'ExternalCarotidArtery': {'22286001': ('External Carotid Artery', [12104, 12103, 3010, 4042, 9514, 7192, 7151, 3827, 4])}, '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', [9514, 7192, 4028, 7151])}, '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', [12109, 12103, 3010, 4042, 9514, 7192, 7151, 3827, 4])}, 'ExternalIliacLymphNode': {'65349008': ('external iliac lymph node', [7600])}, 'ExternalIliacVein': {'63507001': ('External Iliac Vein', [12103, 3010, 4042, 9514, 7192, 7151, 3827, 4, 12110])}, 'ExternalIntercostalMuscle': {'53967007': ('External intercostal muscle', [6109, 6102, 6116, 9514, 7192, 7151])}, 'ExternalMammaryLymphNode': {'421988007': ('external mammary lymph node', [7600])}, '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', [6031, 6030])}, '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])}, 'ExtremelyDense': {'129719003': ('Extremely dense', [6001, 6000])}, 'ExtremelyDenseBreastComposition': {'129719003': ('Extremely dense breast ' 'composition (finding)', [])}, 'Extremity': {'66019005': ('Extremity', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'Eye': {'81745001': ('Eye', [4030, 4031, 4042, 9514, 7192, 7151, 4209, 4, 4009])}, 'EyeLenses': {'78076003': ('Eye lenses', [10060, 10044])}, 'EyeRegion': {'371398005': ('Eye region', [4030, 4031, 4042, 9514, 7192, 4028, 7151, 4, 4009])}, 'EyeRegionStructure': {'371398005': ('Eye region structure (body structure)', [])}, 'Eyeball': {'79652003': ('Eyeball', [9514, 7192, 4028, 7151])}, 'Eyelash': {'85803001': ('Eyelash', [4029])}, 'Eyelid': {'80243003': ('Eyelid', [9514, 7192, 7151, 4209, 4])}, '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', [9514, 7192, 7151, 4])}, 'FaceStructure': {'89545001': ('Face structure (body structure)', [])}, 'FacialArtery': {'23074001': ('facial artery', [3604, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'FacialBones': {'91397008': ('Facial bones', [4030, 4031, 7304, 4042, 9514, 7192, 4028, 7151, 4, 4009])}, 'FacialLymphNode': {'48918001': ('facial lymph node', [7600])}, 'FacialNerve': {'56052001': ('facial nerve', [7710, 7706])}, 'FacialNerveStructure': {'56052001': ('Facial nerve structure (body ' 'structure)', [])}, 'FacialSwelling': {'278528006': ('Facial Swelling', [9300, 60])}, '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', [9514, 7160, 7192, 7151])}, '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', [6087, 6081])}, '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])}, 'FamilyHistoryOfMalignantNeoplasmOfBreast': {'429740004': ('Family history of ' 'malignant ' 'neoplasm of ' 'breast ' '(situation)', [])}, 'FamilyHistoryOfMyocardialInfarction': {'266897007': ('Family history of ' 'myocardial infarction', [3758])}, 'FamilyHistoryUnknown': {'407559004': ('Family history unknown', [3758])}, 'FamilyHistoryWithExplicitContext': {'57177007': ('Family history with ' 'explicit context ' '(situation)', [])}, 'FannongSpottedPigBreed': {'132332000': ('Fannong Spotted pig breed', [7480])}, 'FascialLayer': {'120576005': ('Fascial layer', [6113, 6109, 6102, 9514, 7192, 7151])}, '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', [7180, 6211, 6122, 218, 300, 7469])}, 'FatContainingRadiolucentLesion': {'129747004': ('Fat containing ' '(radiolucent) lesion', [6009, 6008])}, 'FatNecrosisOfBreast': {'21381006': ('Fat necrosis of breast', [6031, 6030])}, 'FatRed7BStain': {'76439002': ('fat red 7B stain', [8112])}, 'Fatal': {'399166001': ('Fatal', [3716])}, 'Fatigue': {'84229001': ('Fatigue', [3221, 3220])}, 'FattyDegeneration': {'29185008': ('fatty degeneration', [3802])}, 'FattyStreaks': {'53151000': ('fatty streaks', [3817])}, 'FauveDeBretagneDogBreed': {'132426009': ('Fauve de Bretagne dog breed', [7480])}, 'Feces': {'39477002': ('Feces', [6201, 7197, 7151])}, '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 (domestic cat)', [7454])}, 'FellPonyHorseBreed': {'132996008': ('Fell Pony horse breed', [7480])}, 'FellTerrierDogBreed': {'132482009': ('Fell Terrier dog breed', [7480])}, 'FellataCattleBreed': {'133651005': ('Fellata cattle breed', [7480])}, 'FemaleExternalGenitalia': {'86969008': ('Female external genitalia', [9514, 7160, 7192, 7151])}, 'FemaleExternalGenitaliaStructure': {'86969008': ('Female external genitalia ' 'structure (body structure)', [])}, 'FemaleExternalUrethralOrifice': {'279479008': ('Female external urethral ' 'orifice', [4029])}, 'FemaleFirstCousin': {'270002': ('Female first cousin', [7450, 7451])}, 'FemaleGenitalLymphNode': {'314736006': ('female genital lymph node', [7600])}, 'FemaleInternalGenitalia': {'87759004': ('Female internal genitalia', [9514, 7160, 7192, 7151])}, 'FemaleInternalGenitaliaStructure': {'87759004': ('Female internal genitalia ' 'structure (body structure)', [])}, 'FemoralArtery': {'7657000': ('Femoral artery', [3604, 3010, 3440, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'FemoralArteryPressureWaveform': {'128442000': ('Femoral artery pressure ' 'waveform', [3003])}, 'FemoralHead': {'2812003': ('Femoral head', [1005, 1001, 1000])}, 'FemoralHeadProsthesis': {'304121006': ('Femoral Head Prosthesis', [7308, 7307])}, 'FemoralVein': {'83419000': ('Femoral vein', [3010, 4042, 9514, 7192, 7151, 4, 3630, 3607])}, 'FemoralVeinStructure': {'83419000': ('Femoral vein structure (body ' 'structure)', [])}, 'Femur': {'71341001': ('Femur', [12021, 4030, 12020, 4031, 7304, 7483, 7482, 4042, 9514, 7192, 7151, 4, 4009])}, 'FengjingPigBreed': {'132233007': ('Fengjing pig breed', [7480])}, 'Ferguson': {'399372008': ('Ferguson', [4012])}, 'FergusonProjection': {'399372008': ('Ferguson projection (qualifier value)', [])}, 'FerrandaisCattleBreed': {'133383009': ('Ferrandais cattle breed', [7480])}, '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])}, 'FetalUmbilicalVeinStructure': {'13576009': ('Fetal umbilical vein structure ' '(body structure)', [])}, 'FetlockOfForelimb': {'13190002': ('Fetlock of forelimb', [7483, 7482])}, 'FetlockOfHindlimb': {'113351006': ('Fetlock of hindlimb', [7483, 7482])}, '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])}, 'Fibrate': {'108602006': ('Fibrate', [3761])}, 'FibrateAntihyperlipidemic': {'108602006': ('Fibrate antihyperlipidemic ' '(product)', [])}, 'Fibril': {'88921000': ('Fibril', [637])}, 'FibrinogenI123': {'71636003': ('Fibrinogen I^123^', [25])}, 'Fibroadenoma': {'65877006': ('Fibroadenoma', [6031, 6030])}, 'FibroadenomaNoInternationalClassificationOfDiseasesForOncologySubtype': {'65877006': ('Fibroadenoma, ' 'no ' 'International ' 'Classification ' 'of ' 'Diseases ' 'for ' 'Oncology ' 'subtype ' '(morphologic ' 'abnormality)', [])}, 'FibrocysticBreastChanges': {'27431007': ('Fibrocystic breast changes ' '(finding)', [])}, 'FibrocysticDiseaseOfBreast': {'27431007': ('Fibrocystic disease of breast', [6031, 6030])}, 'Fibroelastosis': {'72166006': ('fibroelastosis', [3817])}, 'Fibromatosis': {'19928005': ('Fibromatosis', [6031, 6030])}, 'FibromuscularDysplasia': {'31653004': ('fibromuscular dysplasia', [3810])}, 'Fibrosarcoma': {'53654007': ('Fibrosarcoma', [6030, 6033])}, 'FibrosingAdenosis': {'50916005': ('Fibrosing adenosis (morphologic ' 'abnormality)', [])}, 'Fibrous': {'255423002': ('fibrous', [3805, 3802])}, 'FibrousHistiocytomaMalignant': {'34360000': ('Fibrous histiocytoma, ' 'malignant (morphologic ' 'abnormality)', [])}, 'FibrousPlaque': {'40772000': ('Fibrous Plaque', [3491, 3497, 3496, 3495, 7111])}, 'Fibula': {'87342007': ('Fibula', [12021, 4030, 4031, 7304, 4042, 9514, 7192, 7151, 4, 4009])}, 'FibularLymphNode': {'31171007': ('fibular lymph node', [7600])}, 'FieldSpaniel': {'27385008': ('Field spaniel (organism)', [])}, 'FieldSpanielDogBreed': {'27385008': ('Field spaniel dog breed', [7480])}, 'FieldStain': {'255798002': ("field's stain", [8112])}, 'FifthLumbarArtery': {'397411003': ('Fifth Lumbar Artery', [12113, 12103, 9514, 7192, 7151, 3827])}, 'FifthPercentile': {'371888009': ('Fifth percentile (qualifier value)', [])}, 'FifthVentricle': {'180933005': ('Fifth Ventricle', [7140])}, 'FightingBullCattleBreed': {'131597006': ('Fighting Bull cattle breed', [7480])}, 'FilaBrasileiroDogBreed': {'132483004': ('Fila Brasileiro dog breed', [7480])}, 'Finding': {'404684003': ('Finding', [3769])}, '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)', [])}, 'FindingOfDifferenceInLocationComparedToPreviousRadiologicExamination': {'442726008': ('Finding ' 'of ' 'difference ' 'in ' 'location ' 'compared ' 'to ' 'previous ' 'radiologic ' 'examination ' '(finding)', [])}, '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)', [])}, 'FindingOfDifferenceInSizeComparedToPreviousRadiologicExamination': {'442714003': ('Finding ' 'of ' 'difference ' 'in ' 'size ' 'compared ' 'to ' 'previous ' 'radiologic ' 'examination ' '(finding)', [])}, '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', [6134, 6003, 6002])}, '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])}, 'FindingsValues': {'260245000': ('Findings values (qualifier value)', [])}, 'FineLinearBranchingCastingCalcification': {'129762002': ('Fine linear, ' 'branching ' '(casting) ' 'calcification', [6011, 6010])}, 'FineLinearBranchingCastingRadiographicCalcification': {'129762002': ('Fine, ' 'linear, ' 'branching ' '(casting) ' 'radiographic ' 'calcification ' '(finding)', [])}, 'FineLinearCastingCalcification': {'129761009': ('Fine, linear (casting) ' 'calcification', [6011, 6010])}, 'FineLinearCastingRadiographicCalcification': {'129761009': ('Fine, linear, ' '(casting) ' 'radiographic ' 'calcification ' '(finding)', [])}, 'FineMerinoSheepBreed': {'132722005': ('Fine Merino sheep breed', [7480])}, 'FineNeedleAspirationOfBreast': {'387736007': ('Fine needle aspiration of ' 'breast', [6083, 6050])}, 'FineSlitBeamDirectIllumination': {'410462008': ('Fine slit beam direct ' 'illumination', [4203])}, 'FineSlitBeamDirectIlluminationAction': {'410462008': ('Fine slit beam direct ' 'illumination - action ' '(qualifier value)', [])}, 'Finger': {'7569003': ('Finger', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'FingerJoint': {'125682004': ('Finger Joint', [7304])}, '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])}, 'FirstLumbarArtery': {'397407009': ('First Lumbar Artery', [12113, 12103, 9514, 7192, 7151, 3827])}, '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', [6109, 6112, 6102, 9514, 7192, 7151])}, '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])}, 'FiveChamber': {'398994001': ('Five chamber', [6, 502, 501])}, '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', [644, 9514, 7192, 7151, 4])}, '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)', [])}, 'FloorOfMouth': {'36360002': ('floor of mouth', [7601])}, '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])}, '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', [8112])}, 'FluorescentStain': {'35352008': ('fluorescent stain', [8112])}, 'FluorethyltyrosinF18': {'424708001': ('Fluorethyltyrosin F^18^', [4021])}, 'FluorexonStain': {'108880002': ('fluorexon stain', [8112])}, 'FluoroLDopaF18': {'129500005': ('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])}, '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])}, 'FluorouracilF18': {'425236000': ('Fluorouracil F^18^', [4021])}, 'Flushing': {'238810007': ('Flushing', [3220])}, 'FlutemetamolF18': {'456997008': ('Flutemetamol F^18^', [4021])}, 'Focal': {'87017008': ('Focal', [6128])}, 'FocalAsymmetricBreastTissue': {'129789007': ('Focal asymmetric breast tissue', [6017, 6016, 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', [6031, 6030])}, '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', [9514, 7192, 7151, 4])}, 'FonthillMerinoSheepBreed': {'132718000': ('Fonthill Merino sheep breed', [7480])}, 'Foot': {'56459004': ('Foot', [4030, 12020, 4031, 1001, 4042, 1000, 9514, 7192, 7151, 4, 4009, 1006])}, 'FootStructure': {'56459004': ('Foot structure (body structure)', [])}, 'ForamenMagnum': {'24532009': ('Foramen Magnum', [1002, 1001, 1000])}, 'ForcedAirWarmingBlanket': {'420572009': ('Forced air warming blanket', [635])}, 'ForcepsMajor': {'80049006': ('forceps major', [7705, 7710])}, 'ForcepsMinor': {'42932006': ('forceps minor', [7705, 7710])}, 'Forearm': {'14975008': ('Forearm', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'ForearmStructure': {'14975008': ('Forearm structure (body structure)', [])}, 'Forefoot': {'419176008': ('Forefoot', [7483, 7482])}, 'ForefootOfQuadruped': {'419176008': ('Forefoot of quadruped (body structure)', [])}, 'ForeignBody': {'19227008': ('Foreign body', [7158, 6064, 6054, 7151, 7193]), '37058002': ('Foreign body (reaction)', [6031, 6030])}, 'ForeignBodyGiantCellGranuloma': {'37058002': ('Foreign body giant cell ' 'granuloma (morphologic ' 'abnormality)', [])}, '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, 502, 501])}, 'FourthLumbarArtery': {'397410002': ('Fourth Lumbar Artery', [12113, 12103, 9514, 7192, 7151, 3827])}, 'FourthVentricle': {'35918002': ('Fourth ventricle', [7153, 7140, 9514, 7192, 7151])}, 'FourthVentricleStructure': {'35918002': ('Fourth ventricle structure (body ' 'structure)', [])}, 'FoutaHorseBreed': {'133113009': ('Fouta horse breed', [7480])}, 'FoveaCentralis': {'67046006': ('Fovea centralis', [4266, 4209])}, '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])}, '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', [4010, 501])}, 'FrontalBone': {'74872008': ('Frontal bone', [9514, 7192, 4028, 7151])}, 'FrontalBoneStructure': {'74872008': ('Frontal bone structure (body ' 'structure)', [])}, 'FrontalLobe': {'83251001': ('Frontal lobe', [7153, 9514, 7192, 7151])}, 'FrontalLobeStructure': {'83251001': ('Frontal lobe structure (body ' 'structure)', [])}, 'FrontalOblique': {'399160007': ('frontal oblique', [4010, 501])}, 'FrontalObliqueAxial': {'399132005': ('frontal-oblique axial', [4010, 501])}, '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', [7483, 7482, 1002, 1001, 1000])}, 'FrontalSinusStructure': {'55060009': ('Frontal sinus structure (body ' 'structure)', [])}, 'FroxfieldPygmyPigBreed': {'132263003': ('Froxfield Pygmy pig breed', [7480])}, 'FrozenSectionBreastSample': {'309059004': ('frozen section breast sample', [8104, 8103])}, '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])}, 'FullSpectrum': {'414298005': ('Full Spectrum', [4206, 8122])}, 'FullSpectrumColor': {'414298005': ('Full spectrum color (qualifier value)', [])}, 'FumatiPigBreed': {'132183006': ('Fumati pig breed', [7480])}, 'Function': {'246464006': ('Function', [7150])}, 'FunctionalCapacity': {'429160000': ('Functional capacity (observable entity)', [])}, 'FunctionalObservable': {'364644000': ('Functional observable (observable ' 'entity)', [])}, 'FunctionalPerformanceAndActivity': {'248536006': ('Functional performance ' 'and activity', [3769])}, 'FunctionalSingleVentricle': {'443379009': ('Functional Single Ventricle', [12249, 12248])}, '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])}, 'Gadodiamide': {'354088005': ('Gadodiamide', [12, 3850])}, 'Gadolinium': {'58281002': ('Gadolinium', [13, 12, 3850, 300])}, 'GadopentetateDimeglumine': {'404846007': ('Gadopentetate dimeglumine', [12, 3850])}, 'GaitProblem': {'22325002': ('Gait problem', [3205])}, 'Galactocele': {'42385006': ('Galactocele', [6031, 6030])}, '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', [4030, 4031, 4040, 10060, 4042, 9514, 7192, 7151, 4, 4009, 10044])}, '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', [7197, 7151])}, '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', [12103, 9514, 7192, 12111, 7151, 3827])}, 'GastricVein': {'110568007': ('Gastric vein', [12113, 12103, 3010, 4042, 9514, 7192, 7151, 3827, 4, 3630, 3607])}, 'GastroOmentalLymphNode': {'83380007': ('gastro-omental lymph node', [7600])}, 'GastrocnemiusVein': {'264481007': ('Gastrocnemius vein', [12103, 9514, 7192, 7151, 3827, 12110])}, 'GastroduodenalArtery': {'37274004': ('Gastroduodenal Artery', [12112, 12103, 9514, 7192, 7151, 3827])}, 'GastrointestinalProkinetic': {'116532005': ('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', [3010, 4042, 9514, 7192, 7151, 4])}, '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])}, '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': {'129516007': ('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', [12103, 9514, 7192, 7151, 3827, 12110])}, 'GiantFibroadenoma': {'34882000': ('Giant fibroadenoma', [6031, 6030])}, '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])}, 'GlenoidStructure': {'46385009': ('Glenoid structure (body structure)', [])}, 'Glioblastoma': {'63634009': ('Glioblastoma', [639, 638])}, 'GlioblastomaNoInternationalClassificationOfDiseasesForOncologySubtype': {'63634009': ('Glioblastoma, ' 'no ' 'International ' 'Classification ' 'of ' 'Diseases ' 'for ' 'Oncology ' 'subtype ' '(morphologic ' 'abnormality)', [])}, 'GlobusPallidus': {'14738005': ('Globus pallidus', [7153, 7140, 9514, 7192, 7151])}, 'GlobusPallidusStructure': {'14738005': ('Globus pallidus structure (body ' 'structure)', [])}, 'GlomerularFiltrationRate': {'80274001': ('Glomerular filtration rate ' '(observable entity)', [])}, 'GlossopharyngealNerve': {'21161002': ('glossopharyngeal nerve', [7710, 7706])}, 'GlossopharyngealNerveStructure': {'21161002': ('Glossopharyngeal nerve ' 'structure (body structure)', [])}, 'Glottis': {'1307006': ('glottis', [7601])}, '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', [4051, 7151, 8, 7193])}, 'Gluing': {'360038009': ('Gluing', [7310])}, 'GluingAction': {'360038009': ('Gluing - action (qualifier value)', [])}, 'GlutamateN13': {'129509006': ('Glutamate N^13^', [4021])}, 'Glutamine': {'25761002': ('Glutamine', [7186, 7180, 218, 4032, 4033, 7469])}, 'GlutealLymphNode': {'80867000': ('gluteal lymph node', [7600])}, 'GlycogenRichCarcinoma': {'74280008': ('Glycogen-rich carcinoma', [6030, 6033])}, 'GobraCattleBreed': {'133659007': ('Gobra cattle breed', [7480])}, 'Gold': {'2309006': ('Gold', [300])}, 'GoldAlloy': {'256496006': ('Gold Alloy', [7300])}, '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])}, '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])}, '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)', [])}, 'GraftToCitedSegmentBody': {'128947001': ('Graft to cited segment, body', [3019])}, 'GraftToCitedSegmentDistalAnastomosis': {'128948006': ('Graft to cited ' 'segment, distal ' 'anastomosis', [3019])}, 'GraftToCitedSegmentProximalAnastomosis': {'128949003': ('Graft to cited ' 'segment, proximal ' 'anastomosis', [3019])}, 'GraftToDistalAnastomosis': {'128948006': ('Graft to distal anastomosis ' '(substance)', [])}, 'GraftToProximalAnastomosis': {'128949003': ('Graft to proximal anastomosis ' '(substance)', [])}, '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', [6031, 6030])}, 'Grashey': {'399146005': ('Grashey', [4012])}, 'GrasheyProjection': {'399146005': ('Grashey projection (qualifier value)', [])}, 'GratiCattleBreed': {'131473000': ('Grati cattle breed', [7480])}, 'GraueGehoernteHeidschnuckeSheepBreed': {'131728006': ('Graue Gehoernte ' 'Heidschnucke sheep ' 'breed', [7480])}, 'GrayAlpineCattleBreed': {'133422003': ('Gray Alpine cattle breed', [7480])}, 'GrayColor': {'371253002': ('Gray color', [6067])}, 'GrayMatter': {'389081007': ('Gray Matter', [7153, 9514, 7192, 7151])}, 'GrayMatterStructureOfCentralNervousSystem': {'389081007': ('Gray matter ' 'structure of ' 'central nervous ' 'system (body ' 'structure)', [])}, 'GreatCardiacVein': {'5928000': ('Great Cardiac Vein', [3839, 3010, 4042, 3011, 9514, 7192, 7151, 3827, 4])}, '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', [12103, 3010, 4042, 9514, 7192, 7151, 3827, 4, 3630, 12110, 3607])}, 'GreatSaphenousVeinOfCalf': {'414368000': ('Great Saphenous Vein of Calf', [12103, 9514, 7192, 7151, 3827, 12110])}, 'GreatSaphenousVeinOfThigh': {'414369008': ('Great Saphenous Vein of Thigh', [12103, 9514, 7192, 7151, 3827, 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', [8124, 4204])}, '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])}, 'GromarkSheepBreed': {'131730008': ('Gromark sheep breed', [7480])}, 'GroningenHorseBreed': {'133104007': ('Groningen horse breed', [7480])}, 'GroningenWhiteheadedCattleBreed': {'131605002': ('Groningen Whiteheaded ' 'cattle breed', [7480])}, 'GrossSpecimen': {'430861001': ('Gross specimen', [8103])}, 'GrossTumorVolume': {'228791009': ('Gross tumor volume (observable entity)', [])}, 'GroupedCalcificationDistribution': {'129766004': ('Grouped calcification ' 'distribution', [6013, 6012])}, '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', [3429, 3411])}, 'GuidingCatheter': {'102317008': ('Guiding catheter', [4051, 3429, 3411, 7151, 8, 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])}, 'GutAssociatedLymphNode': {'72381005': ('gut-associated lymph node', [7600])}, 'GuteSheepBreed': {'131738001': ('Gute sheep breed', [7480])}, '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', [6031, 6030])}, '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': {'349955005': ('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])}, 'HackneyHorse': {'112488001': ('Hackney horse (organism)', [])}, 'HackneyHorseBreed': {'112488001': ('Hackney horse breed', [7480])}, 'HackneyPonyHorseBreed': {'132748002': ('Hackney Pony horse breed', [7480])}, '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])}, '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', [3429])}, 'HallCatheterMethod': {'133913008': ('Hall catheter method', [3241])}, 'HallikarCattleBreed': {'133607001': ('Hallikar cattle breed', [7480])}, 'HallingdalCattleBreed': {'133579008': ('Hallingdal cattle breed', [7480])}, 'Halothane': {'387351001': ('Halothane', [624, 623])}, 'Hamartoma': {'51398009': ('Hamartoma', [6031, 6030])}, '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': {'24097009': ('Hand', [7304]), '85562004': ('Hand', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, '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', [4030, 4031, 4042, 9514, 7192, 4028, 7151, 4, 4009])}, 'HeadAndNeck': {'774007': ('Head and Neck', [4030, 4031, 4042, 9514, 7192, 4028, 7151, 4, 4009])}, 'HeadAndNeckStructure': {'774007': ('Head and neck structure (body structure)', [])}, 'HeadOfFemur': {'2812003': ('Head of Femur', [7304])}, 'HeadOfRib': {'12872006': ('Head of rib', [6115])}, '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', [9300, 60])}, 'Headfirst': {'102540008': ('headfirst', [21])}, 'HeadfirstPosition': {'102540008': ('Headfirst position (finding)', [])}, 'Headrest': {'706683002': ('Headrest', [9520, 7157, 7151, 9505, 9513, 7193])}, 'HealthcareAssociatedInfection': {'408678008': ('Healthcare associated ' 'infection', [6062])}, 'HealthcareAssociatedInfectiousDisease': {'408678008': ('Healthcare ' 'associated ' 'infectious disease ' '(disorder)', [])}, 'HealthcareProfessional': {'223366009': ('Healthcare professional', [7450])}, 'Heart': {'80891009': ('Heart', [6113, 4030, 6109, 4031, 1004, 7152, 6102, 10060, 1001, 4042, 1000, 6100, 9514, 7192, 7151, 4009, 10044])}, 'HeartDisease': {'56265001': ('heart disease', [3727])}, 'HeartDiseaseCongenital': {'13213009': ('heart disease, congenital', [3700, 3727, 3728])}, 'HeartDiseaseRiskFactors': {'171224000': ('Heart disease risk factors', [12246, 3201])}, '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': ('Heart valve stenosis (disorder)', [])}, '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': {'2099007': ('Hemangioma', [6031, 6030])}, 'HemangiomaNoInternationalClassificationOfDiseasesForOncologySubtype': {'2099007': ('Hemangioma, ' 'no ' 'International ' 'Classification ' 'of ' 'Diseases ' 'for ' 'Oncology ' 'subtype ' '(morphologic ' 'abnormality)', [])}, 'HemangiomaOfSubcutaneousTissue': {'93473009': ('Hemangioma of subcutaneous ' 'tissue', [6031, 6030])}, 'HemangiomaVenous': {'56468002': ('Hemangioma - venous', [6031, 6030])}, 'Hemangiopericytoma': {'36060005': ('Hemangiopericytoma', [6030, 6033])}, 'Hemangiosarcoma': {'39000009': ('Hemangiosarcoma (morphologic abnormality)', [])}, 'HemateinStain': {'75956008': ('hematein stain', [8112])}, 'Hematology': {'309954007': ('Hematology', [7030])}, 'HematologyDepartment': {'309954007': ('Hematology department (environment)', [])}, 'Hematoma': {'35566002': ('Hematoma', [6031, 6030])}, '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)', [])}, 'HemolymphNode': {'18457007': ('hemolymph node', [7600])}, 'Hemoptysis': {'66857006': ('Hemoptysis', [12246])}, 'Hemorrhage': {'50960005': ('Hemorrhage', [7159, 7194, 7151])}, 'HemorrhagePostprocedure': {'110265006': ('Hemorrhage postprocedure', [6062])}, 'HemostaticAgent': {'26370007': ('Hemostatic agent', [10]), '372681003': ('Hemostatic agent', [621, 622])}, 'Henschen': {'399199004': ('Henschen', [4012])}, 'HenschenProjection': {'399199004': ('Henschen projection (qualifier value)', [])}, 'Heparin': {'84812008': ('Heparin', [10])}, 'HepaticArtery': {'76015000': ('Hepatic artery', [3604, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'HepaticFlexureOfColon': {'48338005': ('Hepatic flexure of colon', [6210])}, 'HepaticLymphNode': {'61492009': ('hepatic lymph node', [7600])}, 'HepaticVein': {'8993003': ('Hepatic Vein', [12282, 12103, 12114, 3010, 4042, 9514, 7192, 7151, 3827, 4, 3630, 3607])}, 'HepatobiliarySurgery': {'310158005': ('Hepatobiliary Surgery', [7030])}, 'HepatobiliarySurgicalService': {'310158005': ('Hepatobiliary surgical ' 'service (qualifier value)', [])}, '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', [6011, 6010])}, 'HeterogeneousRadiographicCalcification': {'129763007': ('Heterogeneous ' 'radiographic ' 'calcification ' '(finding)', [])}, 'HeterogeneouslyDense': {'129718006': ('Heterogeneously dense', [6001, 6000])}, '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', [6009, 6008])}, 'HighFrequencyJetVentilation': {'243154003': ('High frequency jet ventilation ' '(procedure)', [])}, 'HighFrequencyVentilation': {'243154003': ('High frequency ventilation', [620, 619])}, '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])}, '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])}, 'HighlandPonyHorseBreed': {'133103001': ('Highland Pony horse breed', [7480])}, 'HighlySignificant': {'371926006': ('Highly significant', [220])}, 'Hilar': {'32381004': ('Hilar', [2])}, 'HilarArtery': {'397405001': ('Hilar Artery', [12103, 12115, 9514, 7192, 7151, 3827])}, 'HilarLymphNode': {'53074004': ('hilar lymph node', [7600])}, 'HilarRenalArtery': {'397405001': ('Hilar renal artery (body structure)', [])}, 'HillRadnorSheepBreed': {'131773004': ('Hill Radnor sheep breed', [7480])}, 'HilumOfLung': {'46750007': ('Hilum of lung', [6129, 6109, 6102, 9514, 7192, 6111, 7151])}, 'Hindfoot': {'416804009': ('Hindfoot', [7483, 7482])}, 'HindfootOfQuadruped': {'416804009': ('Hindfoot of quadruped (body structure)', [])}, 'HinisHorseBreed': {'131981006': ('Hinis horse breed', [7480])}, 'HinterwaldCattleBreed': {'133232007': ('Hinterwald cattle breed', [7480])}, 'HipJoint': {'24136001': ('Hip joint', [1005, 7304, 7483, 7482, 1001, 1000, 9514, 7192, 7151, 4]), '29836001': ('Hip joint', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, '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', [7153, 7140, 9514, 7192, 7151])}, 'HirtzModification': {'424086005': ('Hirtz Modification', [4012])}, 'HirtzModificationProjection': {'424086005': ('Hirtz Modification projection ' '(qualifier value)', [])}, 'HirzaiHorseBreed': {'131982004': ('Hirzai horse breed', [7480])}, 'HissarCattleBreed': {'133663000': ('Hissar cattle breed', [7480])}, 'HistologicGrade': {'371469007': ('Histologic grade (observable entity)', [])}, 'HistologicalGradeFinding': {'373372005': ('Histological grade finding ' '(finding)', [])}, 'Histopathology': {'441950002': ('Histopathology', [7030])}, 'HistopathologyDepartment': {'441950002': ('Histopathology department ' '(environment)', [])}, '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', [6088, 6087])}, '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, 6088, 6087])}, 'HistoryOfEclampsia': {'161806007': ('History of - eclampsia', [6088, 6087])}, 'HistoryOfEctopicPregnancy': {'161763005': ('History of - ectopic pregnancy', [6088, 6087])}, '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, 6088, 6087])}, 'HistoryOfInfertility': {'161798008': ('History of infertility', [6088, 6087])}, 'HistoryOfKidneyDisease': {'275552000': ('History of kidney disease ' '(situation)', [])}, 'HistoryOfLowerLimbAmputation': {'161622006': ('History of lower limb ' 'amputation (situation)', [])}, 'HistoryOfMyocardialInfarction': {'399211009': ('History of myocardial ' 'infarction', [3756, 3201])}, 'HistoryOfObesity': {'161453001': ('History of - obesity', [6088, 6087])}, 'HistoryOfPrematureDelivery': {'161765003': ('History of - premature delivery', [6088, 6087])}, 'HistoryOfRegularMedication': {'161656000': ('History of - regular medication', [6088, 6087])}, 'HistoryOfRenalFailure': {'414417004': ('History of renal failure', [64, 3756])}, 'HistoryOfSeverePreEclampsia': {'161807003': ('History of - severe ' 'pre-eclampsia', [6088, 6087])}, 'HistoryOfSubstanceAbuse': {'371422002': ('History of substance abuse', [6088, 6087])}, 'HodgkinDisease': {'14537002': ("Hodgkin's disease (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', [501, 27, 26])}, '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': ('Hospital admission, elective ' '(procedure)', [])}, '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', [4030, 6109, 4031, 7304, 7483, 7482, 6102, 6114, 4042, 9514, 7192, 7151, 4, 4009])}, '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', [12103, 3010, 4042, 9514, 7192, 7151, 3827, 4, 3630, 12110, 3607])}, 'HydrocortisoneSodiumSuccinate': {'109066000': ('Hydrocortisone sodium ' 'succinate', [65])}, 'HydroxymethylglutarylCoenzymeAReductaseInhibitor': {'96302009': ('Hydroxymethylglutaryl-coenzyme ' 'A ' 'reductase ' 'inhibitor ' '(product)', [])}, 'HyoidBone': {'21387005': ('Hyoid bone', [9514, 7192, 4028, 7151])}, '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', [3815, 3802])}, 'HyperplasiaUsual': {'76197007': ('Hyperplasia, usual', [6031, 6030])}, 'Hypertension': {'38341003': ('Hypertension', [9300, 12246, 60, 3201])}, 'Hypertensive': {'38341003': ('Hypertensive', [3211])}, 'HypertensiveDisorderSystemicArterial': {'38341003': ('Hypertensive disorder, ' 'systemic arterial ' '(disorder)', [])}, 'HypertensiveEpisode': {'62275004': ('Hypertensive episode', [3221])}, 'HypertensiveHeartDisease': {'64715009': ('Hypertensive heart disease', [3700, 3728])}, 'HypertrophicCardiomyopathyWithObstruction': {'45227007': ('Hypertrophic ' 'cardiomyopathy ' 'with obstruction', [3728])}, 'HypertrophicCardiomyopathyWithoutObstruction': {'195020003': ('Hypertrophic ' 'cardiomyopathy ' 'without ' 'obstruction', [3728])}, 'HypertrophicObstructiveCardiomyopathy': {'45227007': ('Hypertrophic ' 'obstructive ' 'cardiomyopathy ' '(disorder)', [])}, 'Hyperventilation': {'68978004': ('Hyperventilation', [3207, 12002])}, 'HypochondriacRegionStructure': {'19695001': ('Hypochondriac region structure ' '(body structure)', [])}, 'HypogastricLymphNode': {'69255009': ('hypogastric lymph node', [7600])}, 'HypogastricRegion': {'11708003': ('Hypogastric region', [9514, 7192, 7151, 4])}, 'HypogastricRegionStructure': {'11708003': ('Hypogastric region structure ' '(body structure)', [])}, 'HypoglossalNerve': {'37899009': ('hypoglossal nerve', [7710, 7706])}, 'HypoglossalNerveStructure': {'37899009': ('Hypoglossal nerve structure (body ' 'structure)', [])}, 'Hypoglycemic': {'312064005': ('Hypoglycemic', [621, 622])}, 'HypoglycemicAgent': {'312064005': ('Hypoglycemic agent (product)', [])}, 'Hypokinesis': {'37706002': ('Hypokinesis', [3706, 3703])}, 'HypokinesisOfCardiacWall': {'37706002': ('Hypokinesis of cardiac wall ' '(finding)', [])}, 'HypopharyngealStructure': {'81502006': ('Hypopharyngeal structure (body ' 'structure)', [])}, 'Hypopharynx': {'81502006': ('hypopharynx', [7601, 9514, 7192, 7151, 4])}, 'Hypoplasia': {'55199003': ('hypoplasia', [3813])}, 'HypoplasticLeftHeartSyndrome': {'62067003': ('Hypoplastic left heart ' 'syndrome', [12249, 12248])}, 'Hypotension': {'45007003': ('Hypotension', [9300, 60])}, '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', [9514, 7192, 7151, 4273])}, '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', [3700])}, 'IleDeFranceSheepBreed': {'131761004': ('Ile-de-France sheep breed', [7480])}, 'IlealStructure': {'34516001': ('Ileal structure (body structure)', [])}, 'IlealVein': {'397439002': ('Ileal vein', [12113, 12103, 9514, 7192, 7151, 3827])}, '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])}, 'IleostomyBag': {'417136005': ('Ileostomy bag', [6202, 6203])}, 'IleostomySet': {'342706005': ('Ileostomy set', [6202, 6203])}, 'Ileum': {'34516001': ('Ileum', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'IliacAndOrFemoralArtery': {'299716001': ('Iliac and/or femoral artery', [4030, 9514, 7192, 7151, 4])}, 'IliacAndOrFemoralArteryStructures': {'299716001': ('Iliac and/or femoral ' 'artery structures (body ' 'structure)', [])}, 'IliacArtery': {'10293006': ('Iliac artery', [3604, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'IliacCrest': {'29850006': ('Iliac Crest', [1005, 1001, 1000])}, 'IliacCrestStructure': {'29850006': ('Iliac crest structure (body structure)', [])}, 'IliacLymphNode': {'84219008': ('iliac lymph node', [7600])}, 'IliacVeinStructure': {'244411005': ('Iliac vein structure (body structure)', [])}, 'IliocostalisMuscle': {'57651003': ('Iliocostalis muscle', [6109, 6102, 6116, 9514, 7192, 7151])}, 'Ilium': {'22356005': ('Ilium', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, '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', [6137, 6043])}, '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', [8112])}, 'ImpairedLeftVentricularFunction': {'275514001': ('Impaired left ventricular ' 'function', [3119])}, 'ImpairedRenalFunction': {'236423003': ('Impaired Renal Function', [1200])}, 'Implant': {'40388003': ('Implant', [6040, 6401, 6054, 7151, 7193])}, 'ImplantDevice': {'40388003': ('Implant, device', [1000])}, 'ImplantDisplaced': {'399209000': ('Implant Displaced', [4015])}, 'ImplantRevisedSincePreviousMammogram': {'129731001': ('Implant revised since ' 'previous mammogram', [6003, 6002])}, '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', [12247])}, '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])}, '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': {'313386006': ('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', [6003, 6002])}, 'IncreaseInNumberOfCalcificationsSincePreviousMammogram': {'129726003': ('Increase ' 'in ' 'number ' 'of ' 'calcifications ' 'since ' 'previous ' 'mammogram ' '(finding)', [])}, 'IncreaseInSize': {'15454001': ('Increase in size', [6134, 6003, 6002])}, '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])}, 'IncreasedToleranceFinding': {'102459008': ('Increased tolerance (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])}, 'IndicationForProcedure': {'432678004': ('Indication for procedure ' '(observable entity)', [])}, 'IndigoCarmineStain': {'45475000': ('indigo carmine stain', [8112])}, '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', [6007, 6006])}, '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)', [])}, 'Indium113Chloride': {'21451004': ('Indium^113^ chloride (product)', [])}, 'Indium113OxoquinolinePlateletLabel': {'56006008': ('Indium^113^ oxoquinoline ' 'platelet label ' '(substance)', [])}, 'Indium113OxoquinolineRedBloodCellLabel': {'56867003': ('Indium^113^ ' 'oxoquinoline red ' 'blood cell label ' '(substance)', [])}, 'Indium113OxoquinolineWhiteBloodCellLabel': {'77510008': ('Indium^113^ ' 'oxoquinoline white ' 'blood cell label ' '(substance)', [])}, 'Indium113Pentetate': {'42728008': ('Indium^113^ pentetate (substance)', [])}, 'Indium113mBleomycin': {'90617008': ('Indium^113m^ bleomycin', [25])}, 'Indium113mChloride': {'21451004': ('Indium^113m^ chloride', [25])}, 'Indium113mOxoquinolinePlateletLabel': {'56006008': ('Indium^113m^ ' 'oxoquinoline platelet ' 'label', [25])}, 'Indium113mOxoquinolineRBCLabel': {'56867003': ('Indium^113m^ oxoquinoline ' 'RBC label', [25])}, 'Indium113mOxoquinolineWBCLabel': {'77510008': ('Indium^113m^ oxoquinoline ' 'WBC label', [25])}, 'Indium113mPentetate': {'42728008': ('Indium^113m^ pentetate', [25])}, 'IndiumChloride111in': {'395742005': ('Indium chloride[111In] (substance)', [])}, 'IndividualCalcification': {'129770007': ('Individual Calcification', [6056, 6016, 6015, 6054, 6014])}, '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', [6031, 6030])}, 'InfectiousDisease': {'309934006': ('Infectious Disease', [7030])}, 'InfectiousDiseasesDepartment': {'309934006': ('Infectious diseases ' 'department (environment)', [])}, 'Inferior': {'261089000': ('Inferior', [3019, 211, 2, 12117, 6065, 212, 5, 4005, 12281])}, 'InferiorArticularFacetOfAxis': {'181901007': ('Inferior articular facet of ' 'axis', [6115])}, 'InferiorArticularProcessOfVertebra': {'317766009': ('Inferior articular ' 'process of vertebra', [6115])}, 'InferiorAuricularLymphNode': {'155237005': ('inferior auricular lymph node', [7600])}, 'InferiorCardiacVein': {'195416006': ('Inferior cardiac vein', [3010, 4042, 9514, 7192, 7151, 4])}, 'InferiorCerebellarPeduncle': {'67701001': ('Inferior cerebellar peduncle', [7153, 7710, 9514, 7192, 7151, 7701])}, 'InferiorCerebellarPeduncleStructure': {'67701001': ('Inferior cerebellar ' 'peduncle structure ' '(body structure)', [])}, 'InferiorFrontoOccipitalFasciculus': {'35664009': ('inferior fronto-occipital ' 'fasciculus', [7703, 7710])}, 'InferiorGlutealLymphNode': {'40684008': ('inferior gluteal lymph node', [7600])}, 'InferiorHornOfLateralVentricle': {'53118009': ('Inferior Horn of Lateral ' 'Ventricle', [7140])}, 'InferiorInguinalLymphNode': {'85380009': ('inferior inguinal lymph node', [7600])}, 'InferiorLeftPulmonaryVein': {'51249003': ('Inferior left pulmonary vein', [3010, 3840, 4042, 3011, 9514, 7192, 7151, 3827, 4])}, 'InferiorLongitudinalFasciculus': {'55233005': ('Inferior longitudinal ' 'fasciculus', [7153, 7703, 7710, 9514, 7192, 7151])}, 'InferiorMesentericArtery': {'33795007': ('Inferior Mesenteric Artery', [12112, 12103, 3010, 4042, 9514, 7192, 7151, 3827, 4])}, 'InferiorMesentericLymphNode': {'113336002': ('inferior mesenteric lymph node', [7600])}, 'InferiorMesentericVein': {'32859001': ('Inferior Mesenteric Vein', [12103, 12114, 9514, 7192, 7151, 3827])}, 'InferiorPancreaticLymphNode': {'280915003': ('inferior pancreatic lymph node', [7600])}, 'InferiorPancreaticoduodenalLymphNode': {'281227003': ('inferior ' 'pancreaticoduodenal ' 'lymph node', [7600])}, 'InferiorPhrenicArtery': {'29660000': ('Inferior phrenic artery', [6109, 6102, 6117, 9514, 7192, 7151])}, 'InferiorRightHepaticVein': {'397425002': ('Inferior Right Hepatic Vein', [12103, 12114, 9514, 7192, 7151, 3827])}, 'InferiorRightHepaticVeinStructure': {'397425002': ('Inferior right hepatic ' 'vein structure (body ' 'structure)', [])}, 'InferiorRightPulmonaryVein': {'113273001': ('Inferior right pulmonary vein', [3010, 3840, 4042, 3011, 9514, 7192, 7151, 3827, 4])}, 'InferiorRollingOfBreast': {'414493004': ('Inferior rolling of breast ' '(procedure)', [])}, 'InferiorVenaCava': {'64131007': ('Inferior Vena Cava', [12282, 6109, 12305, 12103, 6102, 12114, 7154, 6117, 3010, 6204, 4042, 9514, 7192, 7151, 6202, 3827, 4, 3630, 3607])}, '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', [639, 638])}, 'Inflammation': {'23583003': ('Inflammation', [7159, 6031, 6030, 7194, 7151])}, 'InflammatoryAbdominalAorticAneurysm': {'314186008': ('inflammatory abdominal ' 'aortic aneurysm', [3808])}, 'InflammatoryCarcinoma': {'32968003': ('Inflammatory carcinoma', [6030, 6033])}, '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', [12112, 12103, 12291, 9514, 7192, 7151, 3827])}, 'InfraclavicularLymphNode': {'9659009': ('infraclavicular lymph node', [7600])}, 'Infrared': {'414497003': ('Infrared', [4206, 8122])}, 'InfraredOpticalFilter': {'445169002': ('Infrared optical filter', [8124, 4204])}, 'InfraredOpticalFilterOfOpticalMicroscope': {'445169002': ('Infrared optical ' 'filter of optical ' 'microscope ' '(physical object)', [])}, 'InfraspinatusMuscle': {'72573008': ('Infraspinatus muscle', [6109, 6102, 6116, 9514, 7192, 7151])}, 'InfraspinatusMuscleStructure': {'72573008': ('Infraspinatus muscle structure ' '(body structure)', [])}, 'Infrequent': {'27789000': ('Infrequent', [6091])}, 'IngessanaCattleBreed': {'133664006': ('Ingessana cattle breed', [7480])}, 'InguinalLymphNode': {'8928004': ('inguinal lymph node', [7600])}, 'InguinalLymphNodeStructure': {'8928004': ('Inguinal lymph node structure ' '(body structure)', [])}, 'InguinalRegion': {'26893007': ('Inguinal region', [4040, 9514, 7192, 7151, 4])}, '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', [616, 615])}, 'InhalationAnesthesiaSystemClosedRebreathingPrimaryAgent': {'112987001': ('Inhalation ' 'anesthesia ' 'system ' 'closed ' 'rebreathing ' 'primary ' 'agent', [616, 615])}, 'InhalationTechnique': {'446406008': ('Inhalation technique (qualifier value)', [])}, 'InjectableFibrinolysin': {'87811005': ('Injectable fibrinolysin', [10])}, 'InjectionOfAmnion': {'15415002': ('Injection of amnion (procedure)', [])}, 'InjectionOfProstaglandin': {'133875007': ('Injection of prostaglandin ' '(procedure)', [])}, 'InjectionSiteAbscess': {'95382004': ('Injection site abscess', [9300, 60, 10043])}, 'InjectionSiteAnesthesia': {'95398006': ('Injection site anesthesia', [9300, 60, 10043])}, 'InjectionSiteAtrophy': {'95404001': ('Injection site atrophy', [9300, 60, 10043])}, 'InjectionSiteBruising': {'95401009': ('Injection site bruising', [9300, 60, 10043])}, 'InjectionSiteBurning': {'95389008': ('Injection site burning', [9300, 60, 10043])}, 'InjectionSiteCyst': {'95396005': ('Injection site cyst', [9300, 60, 10043])}, 'InjectionSiteDermatitis': {'95393002': ('Injection site dermatitis', [9300, 60, 10043])}, 'InjectionSiteDisorder': {'95376002': ('Injection site disorder', [9300, 60, 10043])}, 'InjectionSiteEdema': {'95392007': ('Injection site edema', [9300, 60, 10043])}, 'InjectionSiteExtravasation': {'95384003': ('Injection Site Extravasation', [9301, 9300, 60])}, 'InjectionSiteFibrosis': {'95403007': ('Injection site fibrosis', [9300, 60, 10043])}, 'InjectionSiteGranuloma': {'24389009': ('Injection site granuloma', [9300, 60, 10043])}, 'InjectionSiteHemorrhage': {'95385002': ('Injection site hemorrhage', [9300, 60, 10043])}, 'InjectionSiteHypersensitivity': {'95378001': ('Injection site ' 'hypersensitivity', [9300, 60, 10043])}, 'InjectionSiteInduration': {'95402002': ('Injection site induration', [9300, 60, 10043])}, 'InjectionSiteInfection': {'95381006': ('Injection site infection', [9300, 60, 10043])}, 'InjectionSiteInflammation': {'95391000': ('Injection site inflammation', [9300, 60, 10043])}, 'InjectionSiteIrritation': {'95379009': ('Injection site irritation', [9300, 60, 10043])}, 'InjectionSiteMalabsorption': {'95387005': ('Injection site malabsorption', [9300, 60, 10043])}, 'InjectionSiteMass': {'95395009': ('Injection site mass', [9300, 60, 10043])}, 'InjectionSiteNecrosis': {'95397001': ('Injection site necrosis', [9300, 60, 10043])}, 'InjectionSiteNerveDamage': {'95390004': ('Injection site nerve damage', [9300, 60, 10043])}, 'InjectionSitePain': {'95388000': ('Injection site pain', [9300, 60, 10043])}, 'InjectionSiteParesthesia': {'95399003': ('Injection site paresthesia', [9300, 60, 10043])}, 'InjectionSitePigmentationChange': {'95380007': ('Injection site pigmentation ' 'change', [9300, 60, 10043])}, 'InjectionSiteReaction': {'95377006': ('Injection site reaction', [9300, 60, 10043])}, 'InjectionSiteScar': {'111017005': ('Injection site scar', [9300, 60, 10043])}, 'InjectionSiteSterileAbscess': {'95383009': ('Injection site sterile abscess', [9300, 60, 10043])}, 'InjectionSiteThrombosis': {'95386001': ('Injection site thrombosis', [9300, 60, 10043])}, 'InjectionSiteUlcer': {'95400005': ('Injection site ulcer', [9300, 60, 10043])}, 'InjectionSiteUrticaria': {'95394008': ('Injection site urticaria', [9300, 60, 10043])}, 'InkukuCattleBreed': {'131479001': ('Inkuku cattle breed', [7480])}, 'InlayDentalRestoration': {'272287005': ('Inlay Dental Restoration', [7157, 7151, 7193])}, 'InnerEar': {'22945000': ('Inner ear', [9514, 7192, 4028, 7151])}, 'InnerEarStructure': {'22945000': ('Inner ear structure (body structure)', [])}, 'InnermostIntercostalMuscles': {'24062007': ('Innermost intercostal muscles', [6109, 6102, 6116, 9514, 7192, 7151])}, 'InnominateArtery': {'12691009': ('Innominate Artery', [12103, 3010, 12291, 4042, 9514, 7192, 7151, 12107, 3827, 4])}, 'InnominateLymphNode': {'196821008': ('innominate lymph node', [7600])}, 'InnominateVein': {'8887007': ('Innominate vein', [12108, 12103, 3010, 4042, 9514, 7192, 7151, 3827, 4, 3630, 3607])}, 'InobutaInterSpeciesHybridPigBreed': {'133182008': ('Inobuta (inter-species ' 'hybrid) pig breed', [7480])}, 'Inositol': {'72164009': ('Inositol', [7186, 7180, 218, 4032, 4033, 7469])}, 'InotropicAgent': {'111139005': ('Inotropic agent', [621, 10, 622])}, 'InsertionOfCatheter': {'45211000': ('Insertion of catheter', [6083, 6050])}, 'InsertionOfCoronaryArteryStent': {'36969009': ('Insertion of coronary artery ' 'stent', [3764])}, 'InsertionOfHipProsthesis': {'398010007': ('Insertion of hip prosthesis', [7301])}, 'InsolubleBerlinBlueStain': {'47030008': ('insoluble berlin blue stain', [8112])}, 'Inspiration': {'14910006': ('inspiration', [3823, 12234])}, 'InstrumentDevice': {'57134006': ('Instrument, device (physical object)', [])}, 'InsufficientSample': {'281268007': ('Insufficient sample', [6063])}, 'Insula': {'36169008': ('Insula', [7153, 9514, 7192, 7151])}, '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', [6109, 6102, 6116, 9514, 7192, 7151])}, 'InteratrialSeptumStructure': {'58095006': ('Interatrial Septum Structure', [12284])}, 'InteratrialTranspositionOfVenousReturn': {'40250003': ('Interatrial ' 'transposition of ' 'venous return ' '(procedure)', [])}, 'IntercostalArtery': {'281134007': ('Intercostal artery', [6109, 6102, 6117, 9514, 7192, 7151])}, 'IntercostalLymphNode': {'64038003': ('intercostal lymph node', [7600])}, 'InterferonGamma': {'420303002': ('Interferon gamma', [642, 638])}, 'InteriliacLymphNode': {'279271008': ('interiliac lymph node', [7600])}, 'InterlobarArteryOfKidney': {'274143007': ('Interlobar Artery of Kidney', [12103, 12115, 9514, 7192, 7151, 3827])}, 'InterlobarLymphNodeOfTheLung': {'127919002': ('interlobar lymph node of the ' 'lung', [7600])}, 'Intermediate': {'11896004': ('Intermediate', [2])}, 'IntermediateArtery': {'244252004': ('Intermediate artery (body structure)', [])}, 'IntermediateArteryRamus': {'244252004': ('Intermediate Artery (Ramus)', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, 'IntermediateCommonIliacLymphNode': {'64556009': ('intermediate common iliac ' 'lymph node', [7600])}, 'IntermediateExternalIliacLymphNode': {'50193000': ('intermediate external ' 'iliac lymph node', [7600])}, 'Intermittent': {'7087005': ('Intermittent', [3770])}, 'Internal': {'260521003': ('Internal', [6139, 2, 5])}, 'InternalAuditoryCanal': {'361078006': ('Internal Auditory Canal', [4030, 4031, 4042, 9514, 7192, 4028, 7151, 4, 4009])}, 'InternalAuditoryMeatus': {'61671002': ('Internal Auditory Meatus', [1002, 1001, 1000])}, 'InternalCapsule': {'85637007': ('internal capsule', [7702, 7710])}, 'InternalCapsuleStructureOfBrain': {'85637007': ('Internal capsule structure ' 'of brain (body structure)', [])}, 'InternalCarotidArtery': {'86117002': ('Internal Carotid Artery', [12105, 3604, 12104, 12103, 3010, 4042, 9514, 7192, 3606, 7151, 3827, 4, 3630])}, 'InternalCarotidArteryC5Segment': {'415637004': ('Internal Carotid Artery C5 ' 'segment', [12105, 12103, 9514, 7192, 7151, 3827])}, 'InternalCarotidArteryC6Segment': {'698348000': ('Internal Carotid Artery C6 ' 'segment', [12105, 12103, 9514, 7192, 7151, 3827])}, 'InternalCarotidArteryStructure': {'86117002': ('Internal carotid artery ' 'structure (body structure)', [])}, 'InternalFixationUsingInternalFixatorSystem': {'257837004': ('Internal ' 'fixation using ' 'internal ' 'fixator system', [7310])}, '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', [12109, 12103, 3010, 4042, 9514, 7192, 7151, 3827, 4])}, 'InternalIliacVein': {'40300007': ('Internal iliac vein', [12103, 9514, 7192, 7151, 3827, 12110])}, 'InternalIntercostalMuscle': {'41313007': ('Internal intercostal muscle', [6109, 6102, 6116, 9514, 7192, 7151])}, 'InternalJugularVein': {'12123001': ('Internal jugular vein', [6109, 12108, 12103, 6102, 6117, 3010, 4042, 9514, 7192, 7151, 3827, 4, 3630, 3607])}, 'InternalJugularVeinStructure': {'12123001': ('Internal jugular vein ' 'structure (body structure)', [])}, 'InternalLimitingMembraneOfRetina': {'280677004': ('Internal limiting ' 'membrane of retina (body ' 'structure)', [])}, 'InternalMammaryArtery': {'69327007': ('Internal mammary artery', [3604, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'InternalNoseStructure': {'53342003': ('Internal nose structure (body ' 'structure)', [])}, 'InternalRotation': {'12852001': ('Internal rotation', [92])}, 'InternalRotationFunction': {'12852001': ('Internal rotation, function ' '(observable entity)', [])}, 'InternalStructureOfEyeball': {'79652003': ('Internal structure of eyeball ' '(body structure)', [])}, 'InternalThoracicArtery': {'69327007': ('Internal thoracic artery', [6109, 6102, 6117])}, 'InternationalStripedHorseHorseBreed': {'131986001': ('International Striped ' 'Horse horse breed', [7480])}, 'InterpectoralLymphNode': {'420800007': ('interpectoral lymph node', [7600])}, 'InterruptedAorticArch': {'218728005': ('Interrupted Aortic Arch', [12249, 12248])}, 'InterstitialTissue': {'85293002': ('Interstitial tissue', [6129])}, 'IntertarsalJointStructure': {'27949001': ('Intertarsal joint structure (body ' 'structure)', [])}, 'Interval': {'385673002': ('Interval', [12304])}, 'InterventionalRadiologyService': {'708174004': ('Interventional Radiology ' 'Service', [7030])}, 'InterventricularSeptum': {'589001': ('Interventricular septum', [6109, 12305, 6102, 12286, 6116, 9514, 7192, 7151])}, 'InterventricularSeptumStructure': {'589001': ('Interventricular septum ' 'structure (body structure)', [])}, 'IntestinalLymphNode': {'36251007': ('intestinal lymph node', [7600])}, 'Intima': {'8361002': ('Intima', [7156, 9514, 7192, 7151])}, 'IntraAbdominal': {'52731004': ('Intra-abdominal', [4])}, '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, 9514, 7192, 7151, 4])}, 'IntraArticularRoute': {'12130007': ('Intra-articular route', [11])}, 'IntraAtrialPacing': {'69158002': ('Intra-atrial pacing (procedure)', [])}, 'IntraPelvic': {'21844003': ('Intra-pelvic', [9514, 7192, 7151, 4])}, 'IntraThoracic': {'51185008': ('Intra-thoracic', [4])}, 'IntracardiacEchocardiography': {'252421008': ('Intracardiac echocardiography', [3405, 12001, 3428])}, 'IntracardiacRoute': {'372460008': ('Intracardiac route', [11])}, 'IntracavitaryBrachytherapy': {'384692006': ('Intracavitary brachytherapy ' '(procedure)', [])}, 'IntracavitaryEchocardiography': {'252421008': ('Intracavitary ' 'echocardiography (procedure)', [])}, 'IntracoronaryDopplerGuideWire': {'371788001': ('Intracoronary Doppler guide ' 'wire', [3429, 3411])}, 'IntracoronaryPressureGuideWire': {'371789009': ('Intracoronary pressure ' 'guide wire', [3429, 3411])}, 'IntracoronaryRoute': {'372463005': ('Intracoronary route', [11])}, 'Intracranial': {'1101003': ('Intracranial', [9514, 7192, 7151, 4])}, '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', [6031, 6030])}, 'IntradermalRoute': {'372464004': ('Intradermal route (qualifier value)', [])}, 'IntraductalCarcinomaMicroPapillary': {'128696009': ('Intraductal carcinoma ' 'micro-papillary', [6030, 6033])}, 'IntraductalCarcinomaNonInfiltrating': {'86616005': ('Intraductal carcinoma, ' 'non-infiltrating', [6159])}, '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', [6031, 6030])}, 'IntraglandularParotidLymphNode': {'143824007': ('intraglandular parotid ' 'lymph node', [7600])}, 'Intraluminal': {'264045001': ('Intraluminal', [5])}, 'IntraluminalFluid': {'442170005': ('Intraluminal fluid', [6201])}, 'IntraluminalRoute': {'37737002': ('Intraluminal route', [11])}, 'IntramammaryLymphNode': {'443808008': ('Intramammary lymph node', [6056, 6016, 6031, 7600, 6030, 6015, 6054, 6014])}, 'IntramedullaryRoute': {'60213007': ('Intramedullary route', [11])}, 'IntramuralHematoma': {'54493002': ('Intramural hematoma', [3492])}, 'IntramuscularRoute': {'78421000': ('Intramuscular route', [613, 11, 614])}, 'Intraoperative': {'277671009': ('Intraoperative', [631, 632, 31])}, 'IntraoperativeEchocardiography': {'429884006': ('Intraoperative ' 'echocardiography', [12001])}, 'IntraperitonealRoute': {'38239002': ('Intraperitoneal route', [613, 11])}, 'IntrapulmonaryArteriovenousFistula': {'253639004': ('Intrapulmonary ' 'arteriovenous fistula ' '(disorder)', [])}, 'IntrapulmonaryLymphNode': {'196662004': ('intrapulmonary lymph node', [7600])}, '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', [3429, 3411])}, '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', [3429, 3411])}, 'IntravascularUltrasoundScan': {'241466007': ('Intravascular ultrasound scan ' '(procedure)', [])}, 'IntravenousRoute': {'47625008': ('Intravenous route', [613, 11, 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])}, 'IodinatedI125Levothyroxine': {'80260008': ('Iodinated I^125^ levothyroxine', [25])}, 'IodinatedI125Liothyronine': {'33785000': ('Iodinated I^125^ liothyronine ' '(substance)', [])}, 'IodinatedI125OleicAcidAndTriolein': {'73745003': ('Iodinated I^125^ oleic ' 'acid and triolein', [25])}, 'IodinatedI125Povidone': {'69839009': ('Iodinated I^125^ povidone', [25])}, 'IodinatedI125RoseBengal': {'21378001': ('Iodinated I^125^ Rose Bengal', [25])}, 'IodinatedI125SealedSource': {'37437001': ('Iodinated I^125^ sealed source', [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])}, 'Iodine131Methylnorcholestenol': {'446531006': ('Iodine^131 ' 'Methylnorcholestenol', [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])}, 'Iohexol': {'109218004': ('Iohexol', [12, 3850])}, 'IomudHorseBreed': {'133047009': ('Iomud horse breed', [7480])}, 'Ion': {'48006008': ('Ion (substance)', [])}, 'IonicIodinatedContrastAgent': {'96387000': ('Ionic iodinated contrast agent', [12, 3850])}, 'IonicIodinatedContrastMedia': {'96387000': ('Ionic iodinated contrast media ' '(product)', [])}, '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': {'109223004': ('Ioxaglate', [12, 3850])}, 'IoxaglateMeglumine': {'109223004': ('Ioxaglate meglumine (product)', [])}, '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', [4211, 4209, 4029])}, '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': {'105840005': ('Iron', [13, 300])}, 'IronANDORIronCompound': {'105840005': ('Iron AND/OR iron compound ' '(substance)', [])}, 'IronFe59LabeledDextran': {'60459006': ('Iron Fe^59^ labeled dextran', [25])}, 'IrradiatedVolume': {'228790005': ('Irradiated Volume', [9534])}, 'Irregular': {'49608001': ('Irregular', [6119, 6005, 6004, 3715])}, 'IrregularBreathing': {'248585001': ('irregular breathing', [3416])}, 'IrrigationFollowingInsertionOfCatheter': {'8592001': ('Irrigation following ' 'insertion of catheter', [9])}, 'IschemicHeartDisease': {'414545008': ('ischemic heart disease', [3727])}, 'IscherwoodProjection': {'399025004': ('Ischerwood projection (qualifier ' 'value)', [])}, 'Ischium': {'85710004': ('Ischium', [1005, 1001, 1000])}, 'Isherwood': {'399025004': ('Isherwood', [4012])}, 'IskarCattleBreed': {'131480003': ('Iskar cattle breed', [7480])}, 'Isoflurane': {'387368002': ('Isoflurane', [624, 623])}, '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', [9300, 60])}, '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])}, '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', [4030, 4031, 7304, 4016, 4042, 9514, 7192, 4028, 7151, 4, 4009])}, 'JawRegionStructure': {'661005': ('Jaw region structure (body structure)', [])}, 'JejunalStructure': {'21306003': ('Jejunal structure (body structure)', [])}, 'JejunostomyTube': {'126065006': ('Jejunostomy tube', [6102, 6138, 6404, 7151, 6202, 6203, 7193])}, 'JejunostomyTubeDevice': {'126065006': ('Jejunostomy tube, device (physical ' 'object)', [])}, 'Jejunum': {'21306003': ('Jejunum', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, '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, 6404, 7151, 6202, 6203, 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', [4040, 9514, 7192, 7151, 4])}, '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])}, 'JutlandHorseBreed': {'133048004': ('Jutland horse breed', [7480])}, 'JuvenileCarcinomaOfTheBreast': {'41919003': ('Juvenile carcinoma of the ' 'breast (morphologic ' 'abnormality)', [])}, 'JuvenileFibroadenoma': {'46212000': ('Juvenile fibroadenoma', [6031, 6030])}, 'JuxtaintestinalLymphNode': {'279609001': ('juxtaintestinal lymph node', [7600])}, 'JuxtaposedAppendage': {'128563000': ('Juxtaposed appendage', [3608, 3630])}, 'JuxtaposedAtrialAppendage': {'128563000': ('Juxtaposed atrial appendage', [3010, 4042, 9514, 7192, 7151, 4])}, '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])}, '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', [625, 623])}, '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', [1005, 4030, 12020, 4040, 7154, 10060, 1001, 6204, 1000, 9514, 645, 7192, 7151, 6202, 10044])}, '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', [4030, 4031, 7304, 4040, 4042, 9514, 7192, 7151, 4, 4009])}, 'KneeChest': {'23242002': ('knee-chest', [20])}, 'KneeChestPosition': {'23242002': ('Knee-chest position (finding)', [])}, 'KneeJoint': {'49076000': ('Knee joint', [1001, 1000, 1006])}, '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])}, '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', [3604, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'LacrimalArteryOfRightEye': {'128979005': ('Lacrimal artery of right eye', [3010, 4042, 9514, 7192, 7151, 4])}, 'LacrimalArteryRight': {'128979005': ('Lacrimal artery, right (body ' 'structure)', [])}, 'LacrimalBone': {'6229007': ('Lacrimal bone', [9514, 7192, 4028, 7151])}, 'LacrimalBoneStructure': {'6229007': ('Lacrimal bone structure (body ' 'structure)', [])}, 'LacrimalCaruncle': {'43045000': ('Lacrimal caruncle', [4209])}, 'LacrimalCaruncleStructure': {'43045000': ('Lacrimal caruncle structure (body ' 'structure)', [])}, 'LacrimalGland': {'13561001': ('Lacrimal gland', [4209])}, 'LacrimalGlandStructure': {'13561001': ('Lacrimal gland structure (body ' 'structure)', [])}, 'LacrimalSac': {'3954005': ('Lacrimal sac', [4209])}, 'LacrimalSacStructure': {'3954005': ('Lacrimal sac structure (body structure)', [])}, 'Lactate': {'83036002': ('Lactate', [7186, 7180, 218, 4032, 4033, 7469])}, 'LactatedRingerS': {'347379006': ("Lactated Ringer's", [70, 3850])}, 'LactatedRingerSolution': {'347379006': ("Lactated Ringer's solution " '(product)', [])}, 'LactatingAdenoma': {'128651002': ('Lactating adenoma', [6031, 6030])}, 'Lactocele': {'42385006': ('Lactocele (disorder)', [])}, 'LacunarLymphNode': {'360993001': ('lacunar lymph node', [7600])}, '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])}, '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', [6118, 252])}, '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', [639, 638])}, 'LargeIntestinalStructure': {'14742008': ('Large intestinal structure (body ' 'structure)', [])}, 'LargeIntestine': {'14742008': ('Large intestine', [4030, 4031, 4040, 4042, 9514, 7192, 7151, 4, 4009])}, 'LargePolishLongEaredPigBreed': {'133230004': ('Large Polish Long-Eared pig ' 'breed', [7480])}, 'LargeRodLikeCalcification': {'129752009': ('Large rod-like calcification', [6011, 6010])}, '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', [9300, 60])}, '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', [4030, 4031, 7601, 4040, 4042, 9514, 7192, 4028, 7151, 4, 4009])}, 'Laser': {'122456005': ('Laser', [8125]), '38586004': ('Laser', [4051, 3429, 3411, 7151, 8, 7193])}, 'LaserAssistedInSituKeratomileusis': {'312965008': ('Laser assisted in situ ' 'keratomileusis ' '(procedure)', [])}, 'LaserAssistedSubepithelialKeratomileusis': {'414582004': ('Laser assisted ' 'subepithelial ' 'keratomileusis ' '(procedure)', [])}, 'LaserDevice': {'122456005': ('Laser device (physical object)', [])}, 'LaserGeneratedElectromagneticRadiation': {'38586004': ('Laser-generated ' 'electromagnetic ' 'radiation (physical ' 'force)', [])}, 'LaserMicrodissection': {'433454009': ('Laser microdissection', [8110])}, 'Lateral': {'399067008': ('lateral', [4010, 501]), '49370004': ('Lateral', [3019, 211, 2, 12117, 6065, 501, 212, 5, 4005, 12281, 26])}, '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])}, 'LateralCalfPerforator': {'714754004': ('Lateral calf perforator', [12103, 9514, 7192, 7151, 3827, 12110])}, 'LateralCanthus': {'61242005': ('Lateral Canthus', [1002, 1001, 1000])}, 'LateralCanthusStructure': {'61242005': ('Lateral canthus structure (body ' 'structure)', [])}, 'LateralCavalFontanProcedure': {'427886002': ('Lateral-Caval Fontan procedure', [12247])}, 'LateralCervicalLymphNode': {'68915008': ('lateral cervical lymph node', [7600])}, 'LateralCommonIliacLymphNode': {'41145006': ('lateral common iliac lymph node', [7600])}, 'LateralCorticospinalTract': {'461002': ('Lateral corticospinal tract', [7153, 9514, 7192, 7151])}, 'LateralDecubitus': {'32185000': ('lateral decubitus', [20])}, 'LateralDecubitusPosition': {'32185000': ('Lateral decubitus position ' '(finding)', [])}, 'LateralExternalIliacLymphNode': {'40242007': ('lateral external iliac lymph ' 'node', [7600])}, 'LateralFuniculus': {'14892003': ('lateral funiculus', [7710, 7707])}, 'LateralFuniculusStructure': {'14892003': ('Lateral funiculus structure (body ' 'structure)', [])}, 'LateralHighRightAtrium': {'128592001': ('Lateral high right atrium', [3011])}, 'LateralIncisorRegion': {'699511000': ('Lateral incisor region', [4017])}, 'LateralIncisorRegionOfOralCavity': {'699511000': ('Lateral incisor region of ' 'oral cavity (body ' 'structure)', [])}, 'LateralJugularLymphNode': {'168159002': ('lateral jugular lymph node', [7600])}, 'LateralLemniscus': {'86136007': ('lateral lemniscus', [7710, 7701])}, 'LateralLemniscusStructure': {'86136007': ('Lateral lemniscus structure (body ' 'structure)', [])}, 'LateralMedial': {'399300004': ('Lateral-medial', [501, 26]), '399352003': ('lateral-medial', [4010, 7302, 501])}, 'LateralMedialEmissiveProjection': {'399300004': ('Lateral-medial emissive ' 'projection (qualifier ' 'value)', [])}, 'LateralMedialProjection': {'399352003': ('Lateral-medial projection ' '(qualifier value)', [])}, 'LateralMitralAnnulus': {'399086000': ('Lateral Mitral Annulus', [12236, 12305, 12235])}, 'LateralMitralAnnulusStructure': {'399086000': ('Lateral mitral annulus ' 'structure (body structure)', [])}, 'LateralOblique': {'260427002': ('lateral oblique', [4010, 501])}, 'LateralPericardialLymphNode': {'196587000': ('lateral pericardial lymph node', [7600])}, 'LateralPlantarArtery': {'44830000': ('lateral plantar artery', [3604, 3606, 3630])}, 'LateralProjection': {'399067008': ('Lateral projection (qualifier value)', [])}, 'LateralRetropharyngealLymphNode': {'167464007': ('lateral retropharyngeal ' 'lymph node', [7600])}, 'LateralRollingOfBreast': {'399197002': ('Lateral rolling of breast ' '(procedure)', [])}, 'LateralVentricle': {'66720007': ('Lateral ventricle', [7153, 7140, 9514, 7192, 7151, 12022])}, 'LateralVentricleStructure': {'66720007': ('Lateral ventricle structure (body ' 'structure)', [])}, 'LateralVesicularLymphNode': {'278672000': ('lateral vesicular lymph node', [7600])}, 'Laterality': {'272741003': ('Laterality', [210])}, 'LateroMedial': {'399352003': ('latero-medial', [4014])}, 'LateroMedialOblique': {'399099002': ('latero-medial oblique', [4010, 4014, 501]), '399159002': ('Latero-medial oblique', [501, 26])}, 'LateroMedialObliqueEmissiveProjection': {'399159002': ('Latero-medial ' 'oblique emissive ' 'projection ' '(qualifier value)', [])}, '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', [6109, 6102, 6116, 9514, 7192, 7151])}, '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)', [])}, 'LeadANDORLeadCompound': {'105842002': ('Lead AND/OR lead compound ' '(substance)', [])}, 'LeadOrLeadCompound': {'105842002': ('Lead or Lead compound', [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', [247, 3019, 211, 2, 12117, 245, 5, 244])}, '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', [6303, 6300, 6301])}, 'LeftAnteriorApicalTransitionZoneOfProstate': {'716931000': ('Left anterior ' 'apical ' 'transition zone ' 'of prostate', [6300, 6301])}, 'LeftAnteriorBasalPeripheralZoneOfProstate': {'716905002': ('Left anterior ' 'basal peripheral ' 'zone of prostate', [6303, 6300, 6301])}, 'LeftAnteriorBasalTransitionZoneOfProstate': {'716897000': ('Left anterior ' 'basal transition ' 'zone of prostate', [6300, 6301])}, 'LeftAnteriorDescendingCoronaryArtery': {'59438005': ('Left Anterior ' 'Descending Coronary ' 'Artery', [3604, 6109, 3015, 6102, 6117, 9514, 7192, 3016, 7151, 3827])}, 'LeftAnteriorDivisionOfLeftBranchAtrioventricularBundle': {'84654008': ('Left ' 'anterior ' 'division ' 'of ' 'left ' 'branch ' 'atrioventricular ' 'bundle', [3011])}, 'LeftAnteriorFascicularBlock': {'37760005': ('Left anterior fascicular block', [3230])}, 'LeftAnteriorMiddlePeripheralZoneOfProstate': {'716920008': ('Left anterior ' 'middle ' 'peripheral zone ' 'of prostate', [6303, 6300, 6301])}, 'LeftAnteriorMiddleTransitionZoneOfProstate': {'716914007': ('Left anterior ' 'middle ' 'transition zone ' 'of prostate', [6300, 6301])}, 'LeftAnteriorOblique': {'399074003': ('Left anterior oblique', [501, 26]), '399135007': ('left anterior oblique', [4010, 501, 3466])}, 'LeftAnteriorObliqueEmissiveProjection': {'399074003': ('Left anterior ' 'oblique emissive ' 'projection ' '(qualifier value)', [])}, 'LeftAnteriorObliqueProjection': {'399135007': ('Left anterior oblique ' 'projection (qualifier value)', [])}, 'LeftApicalAnteriorFibromuscularStromaOfProstate': {'716927006': ('Left ' 'apical ' 'anterior ' 'fibromuscular ' 'stroma of ' 'prostate', [6300, 6301])}, 'LeftApicalPeripheralZoneOfProstate': {'716935009': ('Left apical peripheral ' 'zone of prostate', [6302, 6300])}, 'LeftApicalTransitionZoneOfProstate': {'716929009': ('Left apical transition ' 'zone of prostate', [6302, 6303, 6300])}, 'LeftAtrialStructure': {'82471001': ('Left atrial structure (body structure)', [])}, 'LeftAtrium': {'82471001': ('Left atrium', [3608, 12305, 3462, 12284, 3010, 4042, 3011, 9514, 7192, 7151, 4, 3630])}, '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', [12284, 3010, 4042, 3011, 9514, 7192, 7151, 4])}, 'LeftBasalAnteriorFibromuscularStromaOfProstate': {'716893001': ('Left basal ' 'anterior ' 'fibromuscular ' 'stroma of ' 'prostate', [6300, 6301])}, 'LeftBasalPartTransitionZoneOfProstate': {'716895008': ('Left basal part ' 'transition zone of ' 'prostate', [6302, 6303, 6300])}, 'LeftBasalPeripheralZoneOfProstate': {'716903009': ('Left basal peripheral ' 'zone of prostate', [6302, 6300])}, 'LeftBranchOfAtrioventricularBundle': {'74031005': ('Left branch of ' 'atrioventricular bundle', [3011])}, 'LeftBranchOfHepaticArtery': {'21807003': ('Left Branch of Hepatic Artery', [12112, 12103, 9514, 7192, 7151, 3827])}, 'LeftBreast': {'80248007': ('Left breast', [6023, 6022])}, 'LeftBreastStructure': {'80248007': ('Left breast structure (body structure)', [])}, 'LeftBundleBranchBlock': {'63467002': ('Left bundle branch block', [3205, 12246, 3230, 3201])}, '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)', [])}, 'LeftCoronaryArteryMainStem': {'3227004': ('Left coronary artery main stem ' '(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', [3604, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'LeftGaze': {'255530005': ('Left gaze', [4201])}, 'LeftGlennShuntProcedure': {'444178004': ('Left Glenn shunt procedure', [12247])}, 'LeftHepaticVein': {'273202007': ('Left Hepatic Vein', [12103, 12114, 9514, 7192, 7151, 3827])}, 'LeftHypochondriacRegion': {'133945003': ('Left hypochondriac region', [9514, 7192, 7151, 4])}, 'LeftHypochondriacRegionStructure': {'133945003': ('Left hypochondriac region ' 'structure (body ' 'structure)', [])}, 'LeftInferiorPulmonaryVein': {'51249003': ('Left Inferior Pulmonary Vein', [12280])}, 'LeftInguinalRegion': {'85119005': ('Left inguinal region', [9514, 7192, 7151, 4])}, 'LeftInguinalRegionStructure': {'85119005': ('Left inguinal region structure ' '(body structure)', [])}, 'LeftLateral': {'399173006': ('left lateral', [4010, 501, 3466])}, 'LeftLateralDecubitus': {'102536004': ('left lateral decubitus', [6206, 20])}, 'LeftLateralDecubitusPosition': {'102536004': ('Left lateral decubitus ' 'position (finding)', [])}, 'LeftLateralEmissiveProjection': {'399118008': ('Left lateral emissive ' 'projection (qualifier value)', [])}, 'LeftLateralMiddlePeripheralZoneOfProstate': {'716918005': ('Left lateral ' 'middle ' 'peripheral zone ' 'of prostate', [6302, 6300])}, 'LeftLateralProjection': {'399118008': ('Left lateral projection', [501, 26]), '399173006': ('Left lateral projection (qualifier ' 'value)', [])}, 'LeftLowerQuadrantOfAbdomen': {'68505006': ('Left lower quadrant of abdomen', [9514, 7192, 7151, 4])}, 'LeftLowerSegment': {'264068005': ('Left Lower Segment', [12237, 12219])}, 'LeftLumbarRegion': {'133943005': ('Left lumbar region', [9514, 7192, 7151, 4])}, 'LeftMainBranchOfPortalVein': {'70253006': ('Left Main Branch of Portal Vein', [12103, 12114, 9514, 7192, 7151, 3827])}, 'LeftMainBronchus': {'75245000': ('Left main bronchus', [6113, 6109, 6102, 9514, 7192, 7151])}, 'LeftMainBronchusStructure': {'75245000': ('Left main bronchus structure ' '(body structure)', [])}, 'LeftMainCoronaryArtery': {'3227004': ('Left Main Coronary Artery', [3014, 3604, 6109, 3015, 12292, 6102, 6117, 9514, 7192, 3016, 7151, 3827])}, 'LeftMainCoronaryArteryDisease': {'371804009': ('Left main coronary artery ' 'disease', [3728])}, 'LeftMainCoronaryArteryOstium': {'76862008': ('Left Main Coronary Artery ' 'Ostium', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, 'LeftMiddleAnteriorFibromuscularStromaOfProstate': {'716910003': ('Left ' 'middle ' 'anterior ' 'fibromuscular ' 'stroma of ' 'prostate', [6300, 6301])}, 'LeftMiddleTransitionZoneOfProstate': {'716912006': ('Left middle transition ' 'zone of prostate', [6302, 6303, 6300])}, 'LeftOblique': {'399184004': ('left oblique', [4010, 501])}, '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])}, 'LeftPosteriorBasalTransitionZoneOfProstate': {'716899002': ('Left posterior ' 'basal ' 'transition zone ' 'of prostate', [6300, 6301])}, 'LeftPosteriorDescendingCircumflexCoronaryArtery': {'91760001': ('Left ' 'Posterior ' 'Descending ' 'Circumflex ' 'Coronary ' 'Artery', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, 'LeftPosteriorDivisionOfLeftBranchAtrioventricularBundle': {'91085002': ('Left ' 'posterior ' 'division ' 'of ' 'left ' 'branch ' 'atrioventricular ' 'bundle', [3011])}, 'LeftPosteriorFascicularBlock': {'62026008': ('Left posterior fascicular ' 'block', [3230])}, 'LeftPosteriorMiddleTransitionZoneOfProstate': {'716916009': ('Left posterior ' 'middle ' 'transition ' 'zone of ' 'prostate', [6300, 6301])}, 'LeftPosteriorOblique': {'399006002': ('left posterior oblique', [4010, 501]), '399136008': ('Left posterior oblique', [501, 26])}, 'LeftPosteriorObliqueEmissiveProjection': {'399136008': ('Left posterior ' 'oblique emissive ' 'projection ' '(qualifier value)', [])}, 'LeftPosteriorObliqueProjection': {'399006002': ('Left posterior oblique ' 'projection (qualifier ' 'value)', [])}, 'LeftPosterolateralApicalPeripheralZoneOfProstate': {'716939003': ('Left ' 'posterolateral ' 'apical ' 'peripheral ' 'zone of ' 'prostate', [6303, 6300, 6301])}, 'LeftPosterolateralBasalPeripheralZoneOfProstate': {'716907005': ('Left ' 'posterolateral ' 'basal ' 'peripheral ' 'zone of ' 'prostate', [6303, 6300, 6301])}, 'LeftPosterolateralCircumflexCoronaryArtery': {'57823005': ('Left ' 'Posterolateral ' 'Circumflex ' 'Coronary Artery', [3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, 'LeftPosterolateralMiddlePeripheralZoneOfProstate': {'716922000': ('Left ' 'posterolateral ' 'middle ' 'peripheral ' 'zone of ' 'prostate', [6303, 6300, 6301])}, 'LeftPosteromedialApicalPeripheralZoneOfProstate': {'716941002': ('Left ' 'posteromedial ' 'apical ' 'peripheral ' 'zone of ' 'prostate', [6303, 6300, 6301])}, 'LeftPosteromedialMiddlePeripheralZoneOfProstate': {'716924004': ('Left ' 'posteromedial ' 'middle ' 'peripheral ' 'zone of ' 'prostate', [6302, 6303, 6300, 6301])}, 'LeftPulmonaryArtery': {'50408007': ('Left pulmonary artery', [3829, 3604, 12305, 3010, 4042, 9514, 7192, 3606, 12280, 7151, 4, 3630])}, 'LeftPulmonaryVein': {'27706005': ('Left Pulmonary Vein', [3840, 9514, 7192, 7151, 3827])}, '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', [6302, 6303, 6300, 6301])}, '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', [9514, 7192, 7151, 4])}, 'LeftUpperSegment': {'255482005': ('Left Upper Segment', [12237, 12219])}, 'LeftVentralRightDorsalOblique': {'442739007': ('Left ventral-right dorsal ' 'oblique', [7484])}, 'LeftVentralRightDorsalObliqueProjection': {'442739007': ('Left ventral-right ' 'dorsal oblique ' 'projection ' '(qualifier value)', [])}, 'LeftVentricle': {'87878005': ('Left Ventricle', [12236, 3609, 12305, 7152, 12288, 3462, 3463, 3010, 12287, 4042, 3011, 9514, 7192, 7151, 4, 3630, 12223])}, 'LeftVentricleAnteriorSegment': {'284355001': ('Left ventricle anterior ' 'segment', [3232])}, 'LeftVentricleApex': {'128564006': ('Left ventricle apex', [3609, 3630])}, 'LeftVentricleApicalAnteriorSegment': {'264844003': ('left ventricle apical ' 'anterior segment', [3717])}, 'LeftVentricleApicalInferiorSegment': {'264849008': ('left ventricle apical ' 'inferior segment', [3717])}, 'LeftVentricleApicalLateralSegment': {'264853005': ('left ventricle apical ' 'lateral segment', [3717])}, 'LeftVentricleApicalSegment': {'128564006': ('Left ventricle apical segment', [3232])}, 'LeftVentricleApicalSeptalSegment': {'264845002': ('left ventricle apical ' 'septal segment', [3717, 3718])}, 'LeftVentricleBasalAnteriorSegment': {'264850008': ('Left ventricle basal ' 'anterior segment', [12305, 3717, 3718])}, 'LeftVentricleBasalAnterolateralSegment': {'396654005': ('Left ventricle ' 'basal anterolateral ' 'segment', [12305, 3717])}, 'LeftVentricleBasalAnteroseptalSegment': {'396482007': ('Left ventricle basal ' 'anteroseptal segment', [12305, 3717])}, 'LeftVentricleBasalInferiorSegment': {'264846001': ('Left ventricle basal ' 'inferior segment', [12305, 3717, 3718])}, 'LeftVentricleBasalInferolateralSegment': {'396652009': ('Left ventricle ' 'basal inferolateral ' 'segment', [12305, 3717])}, 'LeftVentricleBasalInferoseptalSegment': {'396646008': ('Left ventricle basal ' 'inferoseptal segment', [12305, 3717])}, 'LeftVentricleBasalLateralSegment': {'277631004': ('left ventricle basal ' 'lateral segment', [3718])}, 'LeftVentricleEpicardialDiastolicAreaPsaxPapView': {'399293008': ('Left ' 'Ventricle ' 'Epicardial ' 'Diastolic ' 'Area, psax ' 'pap view', [12200, 12240])}, 'LeftVentricleInferiorSegment': {'284357009': ('Left ventricle inferior ' 'segment', [3232])}, 'LeftVentricleInflow': {'70238003': ('Left ventricle inflow', [3609, 3010, 4042, 3011, 9514, 7192, 7151, 4, 3630])}, 'LeftVentricleLateralSegment': {'284358004': ('Left ventricle lateral segment', [3232])}, 'LeftVentricleMidAnteriorSegment': {'264848000': ('Left ventricle mid ' 'anterior segment', [12305, 3717])}, 'LeftVentricleMidAnterolateralSegment': {'396656007': ('Left ventricle mid ' 'anterolateral segment', [12305, 3717])}, 'LeftVentricleMidAnteroseptalSegment': {'396647004': ('Left ventricle mid ' 'anteroseptal segment', [12305, 3717])}, 'LeftVentricleMidInferiorSegment': {'264847005': ('Left ventricle mid ' 'inferior segment', [12305, 3717])}, 'LeftVentricleMidInferolateralSegment': {'396655006': ('Left ventricle mid ' 'inferolateral segment', [12305, 3717])}, 'LeftVentricleMidInferoseptalSegment': {'396649001': ('Left ventricle mid ' 'inferoseptal segment', [12305, 3717])}, 'LeftVentricleMyocardium': {'49848007': ('Left Ventricle Myocardium', [12305])}, 'LeftVentricleOutflowChamber': {'128570000': ('Left ventricle outflow chamber ' '(disorder)', [])}, 'LeftVentricleOutflowTract': {'13418002': ('Left Ventricle Outflow Tract', [12236, 3609, 3701, 12305, 3010, 4042, 3011, 9514, 7192, 3610, 12243, 12280, 7151, 4, 3630, 12223])}, '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', [3777, 7157, 3553, 7151, 7193])}, 'LeftVentricularBasalSeptalSegment': {'277630003': ('left ventricular basal ' 'septal segment', [3718])}, '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', [3718])}, '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': {'44598004': ('Leiomyoma', [6031, 6030])}, 'LeiomyomaNoInternationalClassificationOfDiseasesForOncologySubtype': {'44598004': ('Leiomyoma, ' 'no ' 'International ' 'Classification ' 'of ' 'Diseases ' 'for ' 'Oncology ' 'subtype ' '(morphologic ' 'abnormality)', [])}, 'Leiomyosarcoma': {'51549004': ('Leiomyosarcoma', [6030, 6033])}, 'LeiomyosarcomaNoSubtype': {'51549004': ('Leiomyosarcoma, no subtype ' '(morphologic abnormality)', [])}, 'LeiqiongCattleBreed': {'133662005': ('Leiqiong cattle breed', [7480])}, 'LeishmanStain': {'255802001': ('Leishman stain', [8112])}, 'Length': {'410668003': ('Length', [12304, 12257, 12277, 7470, 6165, 12260, 12271, 12267, 3423, 12251, 12250, 12266, 12270, 12265, 12273, 12269, 218, 12268, 12272, 12264, 12259, 12218, 12263, 12275, 12274, 12262, 12258, 7469])}, 'LengthOfSegment': {'414599003': ('Length of Segment', [12119, 12122])}, 'LengthOfVesselSegment': {'414599003': ('Length of vessel segment (observable ' 'entity)', [])}, 'LengthProperty': {'410668003': ('Length property (qualifier value)', [])}, 'Lens': {'78076003': ('Lens', [4211, 4209])}, '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])}, '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', [6134, 6003, 6002])}, 'LessIschemia': {'429232006': ('Less ischemia', [3235])}, 'LesserCaucasusCattleBreed': {'133486002': ('Lesser Caucasus cattle breed', [7480])}, 'LesserSaphenousVein': {'26805005': ('Lesser Saphenous Vein', [12103, 9514, 7192, 7151, 3827, 12110])}, 'LesserTrochanter': {'55499008': ('Lesser trochanter', [1005, 1001, 1000])}, 'Leukemia': {'93143009': ('Leukemia', [639, 638])}, 'LeukemiaDisease': {'93143009': ('Leukemia, disease (disorder)', [])}, 'LevatoresCostarumMuscles': {'73930003': ('Levatores costarum muscles', [6109, 6102, 6116, 9514, 7192, 7151])}, 'LevelOfC2C3IntervertebralDisc': {'243902007': ('Level of C2/C3 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfC3C4IntervertebralDisc': {'243903002': ('Level of C3/C4 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfC4C5IntervertebralDisc': {'243904008': ('Level of C4/C5 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfC5C6IntervertebralDisc': {'243905009': ('Level of C5/C6 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfC6C7IntervertebralDisc': {'243906005': ('Level of C6/C7 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfC7T1IntervertebralDisc': {'243925008': ('Level of C7/T1 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfL1L2IntervertebralDisc': {'243920003': ('Level of L1/L2 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfL2L3IntervertebralDisc': {'243921004': ('Level of L2/L3 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfL3L4IntervertebralDisc': {'243922006': ('Level of L3/L4 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfL4L5IntervertebralDisc': {'243923001': ('Level of L4/L5 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfL5S1IntervertebralDisc': {'243927000': ('Level of L5/S1 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfT10T11IntervertebralDisc': {'243917006': ('Level of T10/T11 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfT11T12IntervertebralDisc': {'243918001': ('Level of T11/T12 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfT12L1IntervertebralDisc': {'243926009': ('Level of T12/L1 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfT1T2IntervertebralDisc': {'243908006': ('Level of T1/T2 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfT2T3IntervertebralDisc': {'243909003': ('Level of T2/T3 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfT3T4IntervertebralDisc': {'243910008': ('Level of T3/T4 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfT4T5IntervertebralDisc': {'243911007': ('Level of T4/T5 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfT5T6IntervertebralDisc': {'243912000': ('Level of T5/T6 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfT6T7IntervertebralDisc': {'243913005': ('Level of T6/T7 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfT7T8IntervertebralDisc': {'243914004': ('Level of T7/T8 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfT8T9IntervertebralDisc': {'243915003': ('Level of T8/T9 ' 'intervertebral disc', [1003, 1001, 1000])}, 'LevelOfT9T10IntervertebralDisc': {'243916002': ('Level of T9/T10 ' 'intervertebral disc', [1003, 1001, 1000])}, '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', [630, 623]), '82573000': ('Lidocaine', [10])}, 'LidocaineHydrochloride': {'61773008': ('Lidocaine hydrochloride', [10])}, 'LidocainePrilocaine': {'346553009': ('Lidocaine + Prilocaine', [630, 623])}, 'Ligament': {'52082005': ('Ligament', [7191, 7151, 7166])}, 'LigamentumArteriosum': {'2160002': ('Ligamentum arteriosum', [6113, 6109, 6102, 9514, 7192, 7151])}, 'LightEmittingDiode': {'445683001': ('Light emitting diode', [8125])}, 'LightEmittingDiodeLampMicroscopeIlluminator': {'445683001': ('Light emitting ' 'diode lamp ' 'microscope ' 'illuminator ' '(physical ' 'object)', [])}, 'LightGreenSFStain': {'89139001': ('light green SF stain', [8112])}, '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', [7153, 9514, 7192, 7151])}, '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', [6013, 6012])}, 'LinebackCattleBreed': {'133584002': ('Lineback cattle breed', [7480])}, 'Linezolid': {'387056004': ('Linezolid (substance)', [])}, 'LinezolidAntibiotic': {'387056004': ('Linezolid antibiotic', [621, 622])}, 'LingualArtery': {'113264009': ('lingual artery', [3604, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'LingualTonsil': {'2048000': ('lingual tonsil', [7601])}, 'LingualTonsilStructure': {'2048000': ('Lingual tonsil structure (body ' 'structure)', [])}, 'Lip': {'48477009': ('lip', [7601, 9514, 7192, 4028, 7151])}, 'LipStructure': {'48477009': ('Lip structure (body structure)', [])}, 'LipetskPigBreed': {'132070008': ('Lipetsk pig breed', [7480])}, 'Lipid': {'70106000': ('Lipid', [7186, 7180, 218, 4032, 4033, 7469])}, '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': {'46720004': ('Lipoma', [6201, 6031, 6030])}, 'LipomaNoInternationalClassificationOfDiseasesForOncologySubtype': {'46720004': ('Lipoma, ' 'no ' 'International ' 'Classification ' 'of ' 'Diseases ' 'for ' 'Oncology ' 'subtype ' '(morphologic ' 'abnormality)', [])}, 'Lipopolysaccharide': {'3325005': ('Lipopolysaccharide', [643, 638])}, 'Liposarcoma': {'49430005': ('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', [1005, 4030, 7154, 10060, 644, 1001, 6204, 1000, 9514, 7192, 7151, 6202, 4, 10044])}, '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', [12103, 12115, 9514, 7192, 7151, 3827])}, 'LobarLymphNodeOfTheLung': {'127920008': ('lobar lymph node of the lung', [7600])}, 'LobeOfLung': {'31094006': ('Lobe of lung', [6109, 6102, 9514, 7192, 7151, 6110])}, 'LobiCattleBreed': {'133492008': ('Lobi cattle breed', [7480])}, 'Lobular': {'40266001': ('Lobular', [6005, 6004])}, '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, 7470, 6165, 502, 218, 501, 6166, 7469])}, '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', [6109, 6102, 6116, 9514, 7192, 7151])}, 'Longitudinal': {'38717003': ('Longitudinal', [6, 502, 12118, 2, 501])}, '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', [6009, 6008])}, '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])}, 'LowRisk': {'75976002': ('Low risk', [3118])}, 'LowToModerateRisk': {'429551001': ('Low to moderate risk', [3118])}, 'LowerAlveolarRidge': {'288546009': ('lower alveolar ridge', [7601])}, 'LowerAlveolarRidgeStructure': {'288546009': ('Lower alveolar ridge structure ' '(body structure)', [])}, 'LowerDeepCervicalLymphNode': {'285429007': ('lower deep cervical lymph node', [7600])}, 'LowerDentalArchStructure': {'88176008': ('Lower dental arch structure (body ' 'structure)', [])}, 'LowerEyelid': {'62736007': ('Lower Eyelid', [4209])}, 'LowerEyelidStructure': {'62736007': ('Lower eyelid structure (body ' 'structure)', [])}, 'LowerInnerQuadrantOfBreast': {'19100000': ('Lower inner quadrant of breast', [6021, 6020, 9514, 7192, 7151, 4])}, 'LowerJugularLymphNode': {'245323006': ('lower jugular lymph node', [7600])}, 'LowerLeg': {'30021000': ('Lower leg', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'LowerLegStructure': {'30021000': ('Lower leg structure (body structure)', [])}, 'LowerLimb': {'61685007': ('Lower limb', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'LowerLimbAmputation': {'161622006': ('Lower limb amputation', [3205])}, 'LowerLimbLymphNode': {'4942000': ('lower limb lymph node', [7600])}, '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, 7155, 9514, 7192, 7151, 6126])}, 'LowerOuterQuadrantOfBreast': {'33564002': ('Lower outer quadrant of breast', [6021, 6020, 9514, 7192, 7151, 4])}, 'LowerParatrachealIncludingAzygousLymphNode': {'127932007': ('lower ' 'paratracheal ' '(including ' 'azygous) lymph ' 'node', [7600])}, 'LowerZoneOfLung': {'281394001': ('Lower zone of lung', [6124, 6126])}, 'LucanianCattleBreed': {'131494002': ('Lucanian cattle breed', [7480])}, 'LucanianPigBreed': {'132188002': ('Lucanian pig breed', [7480])}, 'LucentCenteredCalcification': {'129754005': ('Lucent-centered calcification', [6011, 6010])}, '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', [3604, 12112, 12103, 3010, 4042, 9514, 7192, 3606, 7151, 3827, 4, 3630])}, 'LumbarLymphNode': {'8334002': ('lumbar lymph node', [7600])}, 'LumbarRegion': {'52612000': ('Lumbar region', [9514, 7192, 7151, 4])}, 'LumbarRegionBackStructure': {'52612000': ('Lumbar region back structure ' '(body structure)', [])}, 'LumbarSpine': {'122496007': ('Lumbar spine', [4030, 4031, 7304, 7483, 7482, 4042, 9514, 7192, 7151, 4, 4009])}, 'LumbarSpineStructure': {'122496007': ('Lumbar spine structure (body ' 'structure)', [])}, 'LumboSacralSpine': {'243898001': ('Lumbo-Sacral Spine', [7304]), '297173004': ('Lumbo-sacral spine', [4030, 4031, 7483, 7482, 4042, 9514, 7192, 7151, 4, 4009])}, 'LumbosacralRegionOfSpineStructure': {'297173004': ('Lumbosacral region of ' 'spine structure (body ' 'structure)', [])}, 'Lumen': {'113342003': ('Lumen', [5]), '91747007': ('Lumen', [7156])}, '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', [4040, 9514, 7192, 7151, 4])}, 'LuminalIrregularities': {'371873004': ('Luminal Irregularities', [3712])}, 'LuminalIrregularitiesOfCoronaryArtery': {'371873004': ('Luminal ' 'irregularities of ' 'coronary artery ' '(finding)', [])}, 'Lumpectomy': {'392021009': ('Lumpectomy', [6060, 6058])}, 'LumpectomyBreastSample': {'309546004': ('lumpectomy breast sample', [8104, 8103])}, 'LumpectomyOfBreast': {'392021009': ('Lumpectomy of breast (procedure)', [])}, 'LundehundDogBreed': {'132614005': ('Lundehund dog breed', [7480])}, 'LundyPonyHorseBreed': {'131932009': ('Lundy Pony horse breed', [7480])}, 'Lung': {'39607008': ('Lung', [6129, 1004, 7155, 10060, 1001, 6204, 1000, 6100, 9514, 645, 7192, 7151, 6202, 4, 10044])}, 'LungAndTracheobronchialLymphNodes': {'110550009': ('lung and ' 'tracheobronchial lymph ' 'nodes', [7600])}, 'LungAndTracheobronchialLymphNodesCombinedSite': {'110550009': ('Lung and ' 'tracheobronchial ' 'lymph nodes ' '(combined ' 'site) (body ' 'structure)', [])}, 'LungStructure': {'39607008': ('Lung structure (body structure)', [])}, 'LurcherHoundDogBreed': {'132615006': ('Lurcher Hound dog breed', [7480])}, 'LusitanoHorseBreed': {'133035003': ('Lusitano horse breed', [7480])}, 'LutaiWhitePigBreed': {'132339009': ('Lutai White pig breed', [7480])}, 'LuxiCattleBreed': {'133501007': ('Luxi cattle breed', [7480])}, 'LuxolFastBlueStain': {'406958008': ('luxol fast blue stain', [8112])}, 'LuzeinSheepBreed': {'131742003': ('Luzein sheep breed', [7480])}, 'Lymph': {'38000004': ('Lymph', [645])}, 'LymphNode': {'59441001': ('Lymph node', [6113, 6109, 7191, 6031, 7600, 6102, 10060, 6030, 6064, 9514, 645, 7192, 6054, 7151, 7166, 10044])}, 'LymphNodeOfAorticArch': {'127937001': ('lymph node of aortic arch', [7600])}, 'LymphNodeOfAortopulmonaryWindow': {'127938006': ('lymph node of ' 'aortopulmonary window', [7600])}, 'LymphNodeOfEpiploicForamen': {'68878000': ('lymph node of epiploic foramen', [7600])}, 'LymphNodeOfGreaterCurvatureOfStomach': {'76878005': ('lymph node of greater ' 'curvature of stomach', [7600])}, 'LymphNodeOfHead': {'13482005': ('lymph node of head', [7600])}, 'LymphNodeOfHeadAndNeck': {'312501005': ('lymph node of head and neck', [7600])}, 'LymphNodeOfLesserCurvatureOfStomach': {'279784003': ('lymph node of lesser ' 'curvature of stomach', [7600])}, 'LymphNodeOfLimb': {'312503008': ('lymph node of limb', [7600])}, 'LymphNodeOfMesentery': {'279795009': ('lymph node of mesentery', [7600])}, 'LymphNodeOfStomach': {'314730000': ('lymph node of stomach', [7600])}, 'LymphNodeOfThePulmonaryLigament': {'127941002': ('lymph node of the ' 'pulmonary ligament', [7600])}, 'LymphNodeOfThorax': {'47109002': ('lymph node of thorax', [7600])}, 'LymphNodeOfTrunk': {'312502003': ('lymph node of trunk', [7600])}, 'LymphNodeRingOfCardiaOfStomach': {'279866008': ('lymph node ring of cardia ' 'of stomach', [7600])}, 'LymphNodeStructureOfLimb': {'312503008': ('Lymph node structure of limb ' '(body structure)', [])}, 'LymphNodeStructureOfTrunk': {'312502003': ('Lymph node structure of trunk ' '(body structure)', [])}, 'LymphaticSystem': {'89890002': ('Lymphatic system', [7191, 7151, 7166])}, 'LymphaticTissue': {'181768009': ('Lymphatic tissue', [645])}, 'LymphaticVessel': {'83555006': ('Lymphatic vessel', [7191, 7151, 7166])}, 'Lymphoma': {'21964009': ('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', [643, 638])}, 'LöwchenDogBreed': {'132607008': ('Löwchen dog breed', [7480])}, 'M0NoDistantMetastasis': {'373169005': ('M0: No distant metastasis (breast)', [6162])}, 'M1DistantMetastasis': {'373171005': ('M1: Distant metastasis (breast)', [6162])}, 'MBayarHorseBreed': {'133034004': ("M'Bayar horse breed", [7480])}, 'MMode': {'399155008': ('M mode', [12224, 6058])}, 'MModeUltrasound': {'399155008': ('M-mode ultrasound (qualifier value)', [])}, 'MOSFETRadiationTherapyDosimetrySystemDosimeter': {'701933006': ('MOSFET ' 'radiation ' 'therapy ' 'dosimetry ' 'system ' 'dosimeter', [7026, 7027, 7151, 7193])}, 'MRIOfBreast': {'241615005': ('MRI of breast', [6083, 6050, 6029, 6028])}, 'MXDistantMetastasisCannotBeAssessed': {'373170006': ('MX: Distant metastasis ' 'cannot be assessed ' '(breast)', [6162])}, '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', [6060, 6058])}, '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)', [])}, 'Magnification': {'399163009': ('Magnification', [4015])}, 'MagnificationViews': {'399163009': ('Magnification views', [6029, 6028])}, '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)', [])}, 'Major': {'255603008': ('Major', [251])}, 'MajorAxis': {'131187009': ('Major Axis', [12257, 12277, 7470, 6165, 12260, 12271, 12267, 12251, 12250, 12266, 12270, 12265, 12273, 12269, 218, 12268, 12272, 12264, 12259, 12218, 12263, 12275, 12274, 12262, 12258, 7469])}, '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', [9514, 7160, 7192, 7151])}, 'MaleExternalGenitaliaStructure': {'90418005': ('Male external genitalia ' 'structure (body structure)', [])}, 'MaleExternalUrethralOrifice': {'279478000': ('Male external urethral orifice', [4029])}, 'MaleExternalUrethralSphincter': {'717027004': ('Male external urethral ' 'sphincter', [6302, 6303, 6300, 6301])}, 'MaleFirstCousin': {'11993008': ('Male first cousin', [7450, 7451])}, 'MaleInternalGenitalia': {'38242008': ('Male internal genitalia', [9514, 7160, 7192, 7151])}, '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)', [])}, 'MalignantMelanomaNoInternationalClassificationOfDiseasesForOncologySubtype': {'2092003': ('Malignant ' 'melanoma, ' 'no ' 'International ' 'Classification ' 'of ' 'Diseases ' 'for ' 'Oncology ' 'subtype ' '(morphologic ' 'abnormality)', [])}, 'MalignantNeoplasmPrimary': {'86049000': ('Malignant neoplasm, primary ' '(morphologic abnormality)', [])}, 'MalleolarStructureOfTibia': {'314796009': ('Malleolar structure of tibia', [1001, 1000, 1006])}, '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', [6057, 6031, 6030, 6064, 6054])}, 'MammaryDuctogram': {'18102001': ('Mammary ductogram', [6083, 6050, 6029, 6028])}, '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', [6017, 6016, 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', [6060, 6058])}, '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', [6056, 6016, 6015, 6054, 6014])}, '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', [4030, 4031, 7304, 4016, 7483, 7482, 1002, 1001, 4042, 1000, 9514, 7192, 4028, 7151, 4, 4009])}, 'MandibularDentalArch': {'88176008': ('Mandibular dental arch', [7483, 7482])}, 'MandibularIncisorTeeth': {'442274007': ('Mandibular incisor teeth', [7483, 7482])}, 'MandibularLeftCanineTooth': {'39844006': ('Mandibular left canine tooth', [4026, 4018])}, 'MandibularLeftCentralIncisorTooth': {'113278005': ('Mandibular left central ' 'incisor tooth', [4026, 4018])}, 'MandibularLeftFirstMolarTooth': {'89625000': ('Mandibular left first molar ' 'tooth', [4026, 4018])}, 'MandibularLeftFirstPremolarTooth': {'2400006': ('Mandibular left first ' 'premolar tooth', [4026, 4018])}, 'MandibularLeftLateralTooth': {'77130001': ('Mandibular left lateral tooth', [4026, 4018])}, 'MandibularLeftSecondMolarTooth': {'48402004': ('Mandibular left second molar ' 'tooth', [4026, 4018])}, 'MandibularLeftSecondPremolarTooth': {'24573005': ('Mandibular left second ' 'premolar tooth', [4026, 4018])}, 'MandibularLeftThirdMolarTooth': {'74344005': ('Mandibular left third molar ' 'tooth', [4026, 4018])}, 'MandibularLymphNode': {'155338003': ('mandibular lymph node', [7600])}, 'MandibularRightCanineTooth': {'47055002': ('Mandibular right canine tooth', [4026, 4018])}, 'MandibularRightCentralIncisorTooth': {'15422005': ('Mandibular right central ' 'incisor tooth', [4026, 4018])}, 'MandibularRightFirstMolarTooth': {'28480000': ('Mandibular right first molar ' 'tooth', [4026, 4018])}, 'MandibularRightFirstPremolarTooth': {'80140008': ('Mandibular right first ' 'premolar tooth', [4026, 4018])}, 'MandibularRightLateralIncisorTooth': {'82628004': ('Mandibular right lateral ' 'incisor tooth', [4026, 4018])}, 'MandibularRightSecondMolarTooth': {'40005008': ('Mandibular right second ' 'molar tooth', [4026, 4018])}, 'MandibularRightSecondPremolarTooth': {'8873007': ('Mandibular right second ' 'premolar tooth', [4026, 4018])}, 'MandibularRightThirdMolarTooth': {'38994002': ('Mandibular right third molar ' 'tooth', [4026, 4018])}, 'MangafodipirTrisodium': {'410873007': ('Mangafodipir trisodium', [12, 3850])}, '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])}, 'ManubriumOfSternum': {'37285002': ('Manubrium of sternum', [6115])}, '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, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, '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': {'118538004': ('Mass', [12304]), '4147007': ('Mass', [6104, 7159, 6102, 7194, 7151])}, 'MassAMeasureOfQuantityOfMatterProperty': {'118538004': ('Mass, a measure of ' 'quantity of matter ' '(property) ' '(qualifier value)', [])}, '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', [4030, 4031, 1002, 1001, 4042, 1000, 9514, 7192, 4028, 7151, 4, 4009])}, 'MastoidCellsAndAntra': {'91716001': ('Mastoid cells and antra', [1002, 1001, 1000])}, 'MastoidCellsAndAntraStructure': {'91716001': ('Mastoid cells and antra ' 'structure (body structure)', [])}, 'MastoidLymphNode': {'279143009': ('mastoid lymph node', [7600])}, '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', [4030, 4031, 7304, 4016, 4042, 9514, 7192, 4028, 7151, 4, 4009])}, 'MaxillaryDentalArch': {'39481002': ('Maxillary dental arch', [7483, 7482])}, 'MaxillaryIncisorTeeth': {'442100006': ('Maxillary incisor teeth', [7483, 7482])}, 'MaxillaryLeftCanineTooth': {'72876007': ('Maxillary left canine tooth', [4026, 4018])}, 'MaxillaryLeftCentralIncisorTooth': {'31982000': ('Maxillary left central ' 'incisor tooth', [4026, 4018])}, 'MaxillaryLeftFirstMolarTooth': {'23427002': ('Maxillary left first molar ' 'tooth', [4026, 4018])}, 'MaxillaryLeftFirstPremolarTooth': {'61897005': ('Maxillary left first ' 'premolar tooth', [4026, 4018])}, 'MaxillaryLeftLateralIncisorTooth': {'25748002': ('Maxillary left lateral ' 'incisor tooth', [4026, 4018])}, 'MaxillaryLeftSecondMolarTooth': {'66303006': ('Maxillary left second molar ' 'tooth', [4026, 4018])}, 'MaxillaryLeftSecondPremolarTooth': {'23226009': ('Maxillary left second ' 'premolar tooth', [4026, 4018])}, 'MaxillaryLeftThirdMolarTooth': {'87704003': ('Maxillary left third molar ' 'tooth', [4026, 4018])}, 'MaxillaryRightCanineTooth': {'80647007': ('Maxillary right canine tooth', [4026, 4018])}, 'MaxillaryRightCentralIncisorTooth': {'22120004': ('Maxillary right central ' 'incisor tooth', [4026, 4018])}, 'MaxillaryRightFirstMolarTooth': {'5140004': ('Maxillary right first molar ' 'tooth', [4026, 4018])}, 'MaxillaryRightFirstPremolarTooth': {'57826002': ('Maxillary right first ' 'premolar tooth', [4026, 4018])}, 'MaxillaryRightLateralIncisorTooth': {'11712009': ('Maxillary right lateral ' 'incisor tooth', [4026, 4018])}, 'MaxillaryRightSecondMolarTooth': {'7121006': ('Maxillary right second molar ' 'tooth', [4026, 4018])}, 'MaxillaryRightSecondPremolarTooth': {'36492000': ('Maxillary right second ' 'premolar tooth', [4026, 4018])}, 'MaxillaryRightThirdMolarTooth': {'68085002': ('Maxillary right third molar ' 'tooth', [4026, 4018])}, 'MaxillarySinus': {'15924003': ('maxillary sinus', [7601, 1002, 1001, 1000])}, 'MaxillarySinusStructure': {'15924003': ('Maxillary sinus structure (body ' 'structure)', [])}, 'Maximal': {'56851009': ('Maximal (qualifier value)', [])}, 'Maximum': {'56851009': ('Maximum', [3838, 12301, 7464, 3488])}, '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', [3838, 7464, 3627, 3488])}, 'MeanBloodPressure': {'6797001': ('Mean Blood Pressure', [12304, 3337, 3611])}, 'MeanNumericEstimationTechnique': {'373098007': ('Mean - numeric estimation ' 'technique (qualifier value)', [])}, 'MeanValueOfPopulation': {'373098007': ('Mean Value of population', [226, 221, 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', [4051, 7151, 8, 3451, 7193])}, 'MeasuringRulerDevice': {'102304005': ('Measuring ruler, device (physical ' 'object)', [])}, 'MeatlinePigBreed': {'132024001': ('Meatline pig breed', [7480])}, 'MecklenburgHorseBreed': {'131994008': ('Mecklenburg horse breed', [7480])}, 'Media': {'61695000': ('Media', [7156, 9514, 7192, 7151])}, 'Medial': {'255561001': ('Medial', [2, 12117, 6065, 5, 4005, 12281])}, 'MedialCommonIliacLymphNode': {'34625003': ('medial common iliac lymph node', [7600])}, 'MedialExternalIliacLymphNode': {'42472007': ('medial external iliac lymph ' 'node', [7600])}, 'MedialLacunarLymphNode': {'23198005': ('medial lacunar lymph node', [7600])}, 'MedialLateral': {'399012007': ('Medial-lateral', [501, 26]), '399260004': ('medial-lateral', [4010, 501])}, 'MedialLateralEmissiveProjection': {'399012007': ('Medial-lateral emissive ' 'projection (qualifier ' 'value)', [])}, 'MedialLateralProjection': {'399260004': ('Medial-lateral projection ' '(qualifier value)', [])}, 'MedialLemniscus': {'30114003': ('Medial Lemniscus', [7153, 7710, 9514, 7192, 7151, 7701])}, 'MedialLemniscusStructure': {'30114003': ('Medial lemniscus structure (body ' 'structure)', [])}, 'MedialLongitudinalFasciculus': {'28390009': ('medial longitudinal fasciculus', [7710, 7701])}, 'MedialLongitudinalFasciculusStructure': {'28390009': ('Medial longitudinal ' 'fasciculus structure ' '(body structure)', [])}, 'MedialMitralAnnulus': {'399093001': ('Medial Mitral Annulus', [12236, 12305, 12235])}, 'MedialMitralAnnulusStructure': {'399093001': ('Medial mitral annulus ' 'structure (body structure)', [])}, 'MedialOblique': {'260426006': ('medial oblique', [4010, 501])}, 'MedialPlantarArtery': {'74156002': ('medial plantar artery', [3604, 3606, 3630])}, 'MedialRollingOfBreast': {'399226006': ('Medial rolling of breast (procedure)', [])}, 'Median': {'260528009': ('Median (qualifier value)', []), '373099004': ('Median', [3676, 7464, 3627])}, 'MedianCubitalVein': {'49852007': ('Median Cubital vein', [12108, 12103, 9514, 7192, 7151, 3827])}, 'MedianNumericEstimationTechnique': {'373099004': ('Median - numeric ' 'estimation technique ' '(qualifier value)', [])}, 'MedianRetropharyngealLymphNode': {'167364008': ('median retropharyngeal ' 'lymph node', [7600])}, 'MedianValueOfPopulation': {'373099004': ('Median Value of population', [226, 221, 7465])}, 'MediastinalEmphysema': {'16838000': ('Mediastinal emphysema (disorder)', [])}, 'MediastinalLymphNode': {'62683002': ('mediastinal lymph node', [7600])}, 'MediastinalLymphNodeStructure': {'62683002': ('Mediastinal lymph node ' 'structure (body structure)', [])}, 'MediastinalStructure': {'72410000': ('Mediastinal structure (body structure)', [])}, 'Mediastinum': {'72410000': ('Mediastinum', [6129, 4030, 4031, 7155, 4040, 4042, 6100, 9514, 7192, 7151, 4, 4009])}, 'MedicalAir': {'417696007': ('Medical air', [629, 623])}, '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, 9536, 7452])}, '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)', [])}, 'MedioLateral': {'399260004': ('medio-lateral', [4014]), '399368009': ('Medio-Lateral', [7302])}, 'MedioLateralOblique': {'399268006': ('Medio-lateral oblique', [501, 26]), '399368009': ('medio-lateral oblique', [4010, 4014, 501])}, 'MedioLateralObliqueEmissiveProjection': {'399268006': ('Medio-lateral ' 'oblique emissive ' 'projection ' '(qualifier value)', [])}, 'MedioLateralObliqueProjection': {'399368009': ('Medio-lateral oblique ' 'projection (qualifier value)', [])}, 'Mediolateral': {'261129000': ('Mediolateral (qualifier value)', []), '399260004': ('Mediolateral', [7484])}, 'Medium': {'255508009': ('Medium', [6118, 252])}, '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])}, 'Melanoma': {'2092003': ('Melanoma', [639, 638])}, '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', [7153, 9514, 7192, 7151])}, 'MeningesStructure': {'1231004': ('Meninges structure (body structure)', [])}, 'Meniscus': {'74135004': ('Meniscus', [7191, 7151, 7166])}, '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])}, 'MertolengaCattleBreed': {'133585001': ('Mertolenga cattle breed', [7480])}, 'Mescaline': {'373780001': ('Mescaline', [6089])}, 'MesentericArtery': {'86570000': ('mesenteric artery', [3604, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'MesentericArteryLymphNode': {'299993000': ('mesenteric artery lymph node', [7600])}, 'MesentericVein': {'128583004': ('Mesenteric vein', [3010, 4042, 9514, 7192, 7151, 4, 3630, 3607])}, 'Mesocardia': {'16567006': ('Mesocardia', [12249, 12248])}, 'Mesothelioma': {'62064005': ('Mesothelioma', [639, 638])}, 'MesotheliomaMalignant': {'62064005': ('Mesothelioma, malignant (morphologic ' 'abnormality)', [])}, 'MespiperoneC11': {'424789007': ('Mespiperone C^11^', [4021])}, 'MessaoriaCattleBreed': {'133507006': ('Messaoria cattle breed', [7480])}, 'MessaraHorseBreed': {'131943001': ('Messara horse breed', [7480])}, 'Metacarpal': {'36455000': ('Metacarpal', [1001, 1000, 1006])}, 'Metacarpus': {'36455000': ('Metacarpus', [7483, 7482])}, '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])}, 'MetastasisCategoryFinding': {'385380006': ('Metastasis category finding ' '(finding)', [])}, 'Metatarsus': {'280711000': ('Metatarsus', [7483, 7482])}, 'Methadone': {'387286002': ('Methadone', [6089])}, 'Methanol': {'259221006': ('Methanol', [8114])}, 'MethionineC11': {'129510001': ('Methionine C^11^', [4021])}, 'Methlyphenidate': {'373337007': ('Methlyphenidate', [6089])}, 'Methohexital': {'373488009': ('Methohexital', [625, 623])}, 'Methoxyflurane': {'11136004': ('Methoxyflurane', [624, 623])}, 'MethylBlueStain': {'9010006': ('methyl blue stain', [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': {'354064008': ('Methylene blue', [4200]), '6725000': ('Methylene blue', [10])}, 'MethyleneBlueProduct': {'354064008': ('Methylene blue product (product)', [])}, '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])}, 'MethylprednisoloneSodiumSuccinate': {'109069007': ('Methylprednisolone ' 'sodium succinate', [65])}, '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', [6011, 6010])}, 'MicrodissectionOfTissueSpecimenUsingLaser': {'433454009': ('Microdissection ' 'of tissue ' 'specimen using ' 'laser ' '(procedure)', [])}, 'MicrolobulatedLesion': {'129739004': ('Microlobulated lesion', [6007, 6006])}, '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)', [])}, 'MicrowaveHeatingOfTissueSpecimen': {'433455005': ('Microwave heating of ' 'tissue specimen ' '(procedure)', [])}, 'MidCircumflexCoronaryArtery': {'91753007': ('Mid Circumflex Coronary Artery', [3014, 3604, 6109, 3015, 12292, 6102, 6117, 9514, 7192, 7151, 3827])}, 'MidFrequency': {'255218000': ('Mid-frequency', [6091])}, 'MidLeftAnteriorDescendingCoronaryArtery': {'91748002': ('Mid Left Anterior ' 'Descending Coronary ' 'Artery', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, 'MidLongitudinal': {'103342007': ('Mid-longitudinal', [3019, 211, 212, 5])}, 'MidRightAtrium': {'128593006': ('Mid right atrium', [3011])}, 'MidRightCoronaryArtery': {'450960006': ('Mid Right Coronary Artery', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, 'Midazolam': {'373476007': ('Midazolam', [65, 625, 623, 66])}, 'Midbrain': {'61962009': ('Midbrain', [7153, 9514, 7192, 7151])}, 'MidbrainStructure': {'61962009': ('Midbrain structure (body structure)', [])}, 'MidcolicLymphNode': {'282031000': ('midcolic lymph node', [7600])}, 'MiddleAnteriorFibromuscularStromaOfProstate': {'716908000': ('Middle ' 'anterior ' 'fibromuscular ' 'stroma of ' 'prostate', [6303, 6300])}, 'MiddleAsianOvtcharkaDogBreed': {'132437005': ('Middle Asian Ovtcharka dog ' 'breed', [7480])}, 'MiddleCardiacVein': {'73580002': ('Middle Cardiac Vein', [3839, 3011, 9514, 7192, 7151, 3827])}, 'MiddleCerebellarPeduncle': {'33723005': ('Middle cerebellar peduncle', [7153, 7710, 9514, 7192, 7151, 7701])}, 'MiddleCerebralArtery': {'17232002': ('Middle Cerebral Artery', [12105, 12103, 12141, 9514, 7192, 7151, 3827])}, 'MiddleCerebralArteryM1Segment': {'414722000': ('Middle Cerebral Artery M1 ' 'Segment', [12105, 12103, 9514, 7192, 7151, 3827])}, 'MiddleCerebralArteryM2Segment': {'414723005': ('Middle Cerebral Artery M2 ' 'Segment', [12105, 12103, 9514, 7192, 7151, 3827])}, 'MiddleDeepCervicalLymphNode': {'285427009': ('middle deep cervical lymph ' 'node', [7600])}, 'MiddleEar': {'25342003': ('Middle ear', [9514, 7192, 4028, 7151])}, 'MiddleEarStructure': {'25342003': ('Middle ear structure (body structure)', [])}, 'MiddleHepaticVein': {'273099000': ('Middle Hepatic Vein', [12103, 12114, 9514, 7192, 7151, 3827])}, 'MiddleJugularLymphNode': {'245322001': ('middle jugular lymph node', [7600])}, 'MiddleLobeOfLung': {'40020002': ('Middle lobe of lung', [6124, 6126])}, 'MiddleLobeOfRightLung': {'72481006': ('Middle lobe of right lung', [7155, 9514, 7192, 7151])}, 'MiddleWhitePig': {'82909008': ('Middle white pig (organism)', [])}, 'MiddleWhitePigBreed': {'82909008': ('Middle white pig breed', [7480])}, 'MiddleZoneOfLung': {'281393007': ('Middle zone of lung', [6124, 6126])}, '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', [6011, 6010])}, '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', [3838, 12301, 7464, 3488])}, 'MinimumDiastolicBloodPressure': {'314451001': ('Minimum diastolic blood ' 'pressure', [3337, 3611])}, 'MinisibPigBreed': {'132112005': ('Minisib pig breed', [7480])}, 'Minnesota4PigBreed': {'132036007': ('Minnesota #4 pig breed', [7480])}, 'MinnesotaPig': {'132036007': ('Minnesota pig (organism)', []), '61083001': ('Minnesota pig (organism)', [])}, 'MinnesotaPigBreed': {'61083001': ('Minnesota pig breed', [7480])}, 'Minor': {'255606000': ('Minor', [251])}, 'MinorAxis': {'131188004': ('Minor Axis', [12304, 12257, 12277, 7470, 6165, 12260, 12271, 12267, 12251, 12250, 12266, 12270, 12265, 12273, 12269, 218, 12268, 12272, 12264, 12259, 12218, 12263, 12275, 12274, 12262, 12258, 7469])}, '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', [12236, 12305, 12235])}, 'MitralDiastolicFillingPeriod': {'371849007': ('Mitral diastolic filling ' 'period (observable entity)', [])}, 'MitralDiastolicFillingPeriodDfpm': {'371849007': ('Mitral Diastolic Filling ' 'Period (DFPm)', [3616])}, 'MitralRegurgitation': {'48724000': ('Mitral regurgitation', [3700, 12249, 3728, 12248])}, 'MitralRing': {'65197004': ('Mitral ring', [3011])}, 'MitralStenosis': {'79619009': ('Mitral stenosis', [3700, 12249, 3728, 12248])}, 'MitralValve': {'91134007': ('Mitral Valve', [6113, 12236, 6109, 3701, 12305, 6102, 12285, 9514, 7192, 3610, 7151, 3630, 12223])}, '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, 12249, 3728, 12248])}, '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])}, 'MixedSmallCellCarcinoma': {'21326004': ('Mixed small cell carcinoma', [639, 638])}, 'MixedVenousBlood': {'116176007': ('Mixed Venous Blood', [3520])}, 'Mixture': {'272163001': ('Mixture (qualifier value)', [])}, 'MiyakoHorseBreed': {'133013006': ('Miyako horse breed', [7480])}, 'Mode': {'373100007': ('Mode', [7464, 3627])}, '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', [12001, 3261])}, 'ModifiedNaughtonProtocol': {'129102008': ('Modified Naughton protocol', [12001, 3261])}, '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)', [])}, 'MolybdenumANDORMolybdenumCompound': {'105860002': ('Molybdenum AND/OR ' 'molybdenum compound ' '(substance)', [])}, 'MolybdenumOrMolybdenumCompound': {'105860002': ('Molybdenum or Molybdenum ' 'compound', [10006, 10067, 10016])}, '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)', [])}, 'MonitoringOfElectrocardiogramAtSurgery': {'91096005': ('Monitoring of ' 'electrocardiogram at ' 'surgery (procedure)', [])}, 'MonitoringOfRespirationRegimeTherapy': {'53617003': ('Monitoring of ' 'respiration ' '(regime/therapy)', [])}, 'MonoclonalAntibodyI124': {'424874008': ('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', [6134, 6003, 6002])}, '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', [3487, 4266, 1000, 7150])}, '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])}, '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', [9514, 7192, 7151, 4])}, 'MouthClosed': {'286866000': ('Mouth closed', [4011, 502])}, '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])}, 'MucosaOfLowerLip': {'46353006': ('Mucosa of lower lip', [4029])}, 'MucosaOfMandibularGingiva': {'245823002': ('Mucosa of mandibular gingiva', [4029])}, 'MucosaOfMaxillaryGingiva': {'245814000': ('Mucosa of maxillary gingiva', [4029])}, 'MucosaOfTipOfTongue': {'245831007': ('Mucosa of tip of tongue', [4029])}, 'MucosaOfTongue': {'8001006': ('Mucosa of tongue', [4029])}, 'MucosaOfUpperLip': {'18444004': ('Mucosa of upper lip', [4029])}, '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])}, 'MultifocalPrematureVentricularComplexes': {'10626002': ('Multifocal ' 'premature ' 'ventricular ' 'complexes ' '(disorder)', [])}, 'MultifocalPvcs': {'10626002': ('Multifocal PVCs', [3234])}, 'MultipleAneurysm': {'125274006': ('multiple aneurysm', [3808])}, 'MultipleAneurysms': {'125274006': ('Multiple aneurysms (morphologic ' 'abnormality)', [])}, 'MultipleIrregularities': {'371922008': ('Multiple Irregularities', [3715])}, 'MultipleMyelomaNoInternationalClassificationOfDiseasesForOncologySubtype': {'55921005': ('Multiple ' 'myeloma, ' 'no ' 'International ' 'Classification ' 'of ' 'Diseases ' 'for ' 'Oncology ' 'subtype ' '(morphologic ' 'abnormality)', [])}, 'MultiplePregnancy': {'16356006': ('Multiple pregnancy', [6088, 6087])}, '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 (organism)', [])}, 'MusMusculusHouseMouse': {'447612001': ('Mus musculus (House mouse)', [7454])}, 'Muscle': {'71616004': ('Muscle', [7191, 10060, 6204, 7151, 6202, 7166, 10044])}, 'MuscleBridge': {'424045003': ('Muscle Bridge', [3712])}, 'MuscleOfHead': {'22688005': ('Muscle of head', [9514, 7192, 4028, 7151])}, 'MuscleOfLowerLimb': {'102292000': ('Muscle of lower limb', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'MuscleOfNeck': {'81727001': ('Muscle of neck', [9514, 7192, 4028, 7151])}, 'MuscleOfUpperLimb': {'30608006': ('Muscle of upper limb', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'Muscular': {'263816006': ('Muscular', [6100])}, '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 (ferret)', [7454])}, 'MustelaPutoriusSubspeciesFuro': {'449310008': ('Mustela putorius subspecies ' 'furo (organism)', [])}, 'MycoticAneurysm': {'51668007': ('mycotic aneurysm', [3808])}, 'Myeloma': {'55921005': ('Myeloma', [64])}, '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', [6031, 6030])}, 'Myopia': {'57190000': ('Myopia', [4238])}, 'MyotonicGoatBreed': {'131623005': ('Myotonic goat breed', [7480])}, 'MytileneHorseBreed': {'132777001': ('Mytilene horse breed', [7480])}, 'N0NoRegionalLymphNodeMetastasisHistologically': {'373151001': ('N0: No ' 'regional ' 'lymph node ' 'metastasis ' 'histologically...', [6161])}, 'N1MetastasisIn1To3AxillaryLymphNodes': {'373156006': ('N1: Metastasis in 1 ' 'to 3 axillary lymph ' 'nodes...', [6161])}, 'N2MetastasisIn4To9AxillaryLymphNodes': {'373162001': ('N2: Metastasis in 4 ' 'to 9 axillary lymph ' 'nodes...', [6161])}, 'N2aMetastasisIn4To9AxillaryLymphNodes2Point0mm': {'373163006': ('N2a: ' 'Metastasis ' 'in 4 to 9 ' 'axillary ' 'lymph nodes ' '(...2.0 ' 'mm)...', [6161])}, 'N2bMetastasisInClinicallyApparentInternalNodes': {'373164000': ('N2b: ' 'Metastasis ' 'in ' 'clinically ' 'apparent ' 'internal... ' 'nodes...', [6161])}, 'N3MetastasisToIpsilateralInternalMammaryLymphNodes': {'369991007': ('N3: ' 'Metastasis ' 'to ' 'ipsilateral ' 'internal ' 'mammary ' 'lymph ' 'node(s)', [6161])}, 'N3aMetastasisIn10OrMoreAxillaryLymphNodes': {'373165004': ('N3a: Metastasis ' 'in 10 or more ' 'axillary lymph ' 'nodes...', [6161])}, 'N3bMetastasisInClinicallyApparentIpsilateralInternal': {'373167007': ('N3b: ' 'Metastasis ' 'in ' 'clinically ' 'apparent ' 'ipsilateral ' 'internal...', [6161])}, 'N3cMetastasisInIpsilateralSupraclavicularLymphNodes': {'373166003': ('N3c: ' 'Metastasis ' 'in ' 'ipsilateral ' 'supraclavicular ' 'lymph ' 'nodes...', [6161])}, 'NAcetylLAspartate': {'115391007': ('N-acetyl-L-aspartate (substance)', [])}, 'NAcetylaspartate': {'115391007': ('N-acetylaspartate', [7186, 7180, 218, 4032, 4033, 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])}, 'NXRegionalLymphNodesCannotBeAssessed': {'373150000': ('NX: Regional lymph ' 'nodes cannot be ' 'assessed...', [6161])}, '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])}, 'NailOfFifthToe': {'22740002': ('Nail of fifth toe', [4029])}, 'NailOfFinger': {'91456000': ('Nail of finger', [4029])}, 'NailOfFourthToe': {'6194002': ('Nail of fourth toe', [4029])}, 'NailOfGreatToe': {'38790000': ('Nail of great toe', [4029])}, 'NailOfIndexFinger': {'63288009': ('Nail of index finger', [4029])}, 'NailOfLittleFinger': {'44431006': ('Nail of little finger', [4029])}, 'NailOfMiddleFinger': {'61366001': ('Nail of middle finger', [4029])}, 'NailOfRingFinger': {'51596007': ('Nail of ring finger', [4029])}, 'NailOfSecondToe': {'8770002': ('Nail of second toe', [4029])}, 'NailOfThirdToe': {'1569005': ('Nail of third toe', [4029])}, 'NailOfThumb': {'28274006': ('Nail of thumb', [4029])}, 'NailOfToe': {'76578001': ('Nail of toe', [4029])}, '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', [4030, 4031, 4042, 9514, 7192, 4028, 7151, 4, 4009])}, 'NasalBoneStructure': {'74386004': ('Nasal bone structure (body structure)', [])}, 'NasalCavity': {'279549004': ('nasal cavity', [7601])}, 'NasalCavityStructure': {'279549004': ('Nasal cavity structure (body ' 'structure)', [])}, 'NasalCongestion': {'68235000': ('Nasal Congestion', [9300, 60])}, 'NasalDecongestant': {'96329004': ('Nasal decongestant', [621, 622])}, 'NasalDecongestantPreparation': {'96329004': ('Nasal decongestant preparation ' '(product)', [])}, 'NasalRoute': {'46713006': ('Nasal route', [11])}, 'NasalSinus': {'2095001': ('Nasal sinus', [7483, 7482])}, 'NasalSinusStructure': {'2095001': ('Nasal sinus structure (body structure)', [])}, 'NasalStructure': {'45206002': ('Nasal structure (body structure)', [])}, 'NasolabialLymphNode': {'144026003': ('nasolabial lymph node', [7600])}, 'NasopharyngealStructure': {'71836000': ('Nasopharyngeal structure (body ' 'structure)', [])}, 'Nasopharynx': {'360955006': ('Nasopharynx', [4040, 9514, 7192, 7151, 4]), '71836000': ('nasopharynx', [7601])}, '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', [12001, 3261])}, 'Nausea': {'422587007': ('Nausea', [3220])}, 'NauseaAndVomitingStatusDisruptiveEffects': {'405165006': ('Nausea and ' 'vomiting status: ' 'disruptive ' 'effects ' '(observable ' 'entity)', [])}, 'NavajoChurroSheepBreed': {'131838009': ('Navajo-Churro sheep breed', [7480])}, 'NavajoSheep': {'59210004': ('Navajo sheep (organism)', [])}, 'NavajoSheepBreed': {'59210004': ('Navajo sheep breed', [7480])}, 'NavicularOfForefoot': {'30518006': ('Navicular of forefoot', [7483, 7482])}, 'NavicularOfHindfoot': {'75772009': ('Navicular of hindfoot', [7483, 7482])}, 'NdaguCattleBreed': {'133817008': ('Ndagu cattle breed (organism)', [])}, 'NdaguXZebuCattleBreed': {'133817008': ('Ndagu X zebu cattle breed', [7480])}, 'NebelungCatBreed': {'132671008': ('Nebelung cat breed', [7480])}, 'Neck': {'45048000': ('Neck', [4030, 4031, 4042, 9514, 7192, 4028, 7151, 4, 4009])}, 'NeckAndChest': {'417437006': ('Neck and Chest', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, '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', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'NeckChestAndAbdomen': {'416152001': ('Neck, Chest and Abdomen', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'NeckOfRib': {'72184008': ('Neck of rib', [6115])}, 'NeckStructure': {'45048000': ('Neck structure (body structure)', [])}, 'Necrosis': {'6574001': ('Necrosis', [7168, 7159, 7194, 7151])}, 'Needle': {'79068005': ('Needle', [69, 6102, 6138, 7157, 6404, 7151, 6202, 6203, 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', [7159, 7194, 7151])}, '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': {'86049000': ('Neoplasm, Primary', [7159, 7194, 7151])}, 'NeoplasmSecondary': {'14799000': ('Neoplasm, Secondary', [7159, 7194, 7151])}, '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': {'119410002': ('Nerve', [7191, 7151, 7166])}, 'NervePart': {'119410002': ('Nerve part (body structure)', [])}, 'Neurofibroma': {'89084002': ('Neurofibroma', [6031, 6030])}, 'NeurofibromaNoInternationalClassificationOfDiseasesForOncologySubtype': {'89084002': ('Neurofibroma, ' 'no ' 'International ' 'Classification ' 'of ' 'Diseases ' 'for ' 'Oncology ' 'subtype ' '(morphologic ' 'abnormality)', [])}, 'Neurofibromatosis': {'81669005': ('Neurofibromatosis', [6031, 6030])}, 'Neurohypophysis': {'37512009': ('Neurohypophysis', [7153, 9514, 7192, 7151])}, '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', [6003, 6002])}, '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])}, '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', [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])}, 'NiobiumANDORNiobiumCompound': {'429310004': ('Niobium AND/OR niobium ' 'compound (substance)', [])}, 'NiobiumOrNiobiumCompound': {'429310004': ('Niobium or Niobium compound', [10006, 10067])}, 'Nipple': {'24142002': ('Nipple', [6016, 6054, 6014])}, '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': {'31845005': ('Nipple retraction', [6056, 6039])}, 'NippleStructure': {'24142002': ('Nipple structure (body structure)', [])}, 'NitraHybridPigBreed': {'133219002': ('Nitra Hybrid pig breed', [7480])}, 'NitrateBasedVasodilatingAgent': {'31970009': ('Nitrate-based vasodilating ' 'agent (product)', [])}, 'NitrateVasodilator': {'31970009': ('Nitrate vasodilator', [3760])}, 'NitrazineYellowStain': {'86750008': ('nitrazine yellow stain', [8112])}, 'Nitroglycerin': {'71759000': ('Nitroglycerin', [10])}, 'NitrousOxide': {'111132001': ('Nitrous oxide', [624, 623])}, 'NkediCattleBreed': {'133743003': ('Nkedi cattle breed', [7480])}, 'NkoneCattleBreed': {'131508005': ('Nkone cattle breed', [7480])}, 'No': {'373067005': ('No', [230, 231])}, 'NoChange': {'260388006': ('No change', [3235, 3237, 3236])}, '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', [6087, 6081])}, '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', [9300, 60])}, 'NoSignificantChangeSincePreviousMammogram': {'129723006': ('No significant ' 'change since ' 'previous ' 'mammogram ' '(finding)', [])}, 'NoSignificantChangesInTheFinding': {'129723006': ('No significant changes in ' 'the finding', [6134, 6003, 6002])}, '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', [6104, 7159, 6102, 7194, 7151])}, '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)', [])}, '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': {'1929004': ("Non-Hodgkin's lymphoma", [6030, 6033])}, 'NonHodgkinLymphomaNoInternationalClassificationOfDiseasesForOncologySubtype': {'1929004': ('Non-Hodgkin ' 'lymphoma, ' 'no ' 'International ' 'Classification ' 'of ' 'Diseases ' 'for ' 'Oncology ' 'subtype ' '(morphologic ' 'abnormality)', [])}, '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', [639, 638])}, 'NonSteroidalAntiInflammatoryAgent': {'372665008': ('Non-steroidal ' 'anti-inflammatory agent ' '(substance)', [])}, 'NonSustainedVentricularTachycardia': {'66657009': ('Non-sustained ' 'ventricular tachycardia', [3230])}, 'NoncardiacChestPain': {'274668005': ('Noncardiac Chest Pain', [3202, 3220])}, 'NoncontactFundusLens': {'410685001': ('Noncontact fundus lens', [4205])}, 'NondepolarizingAgent': {'372790002': ('Nondepolarizing agent (substance)', [])}, 'None': {'260413007': ('None', [3716, 3707, 606, 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': {'164854000': ('Normal', [3230]), '17621005': ('Normal', [7169, 7165, 7168, 7159, 7196, 222, 7194, 3211, 3210, 3119, 242, 7151])}, 'NormalAorticRoot': {'373132007': ('Normal Aortic Root', [3709])}, 'NormalCoronaryArteries': {'371860003': ('Normal coronary arteries', [3728])}, 'NormalECG': {'164854000': ('Normal ECG', [3677])}, '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', [9514, 7192, 7151, 4])}, 'NotAdministered': {'371900001': ('Not Administered', [3743, 3742])}, 'NotEvaluated': {'373121007': ('Not Evaluated', [3703])}, 'NotPerformed': {'262008008': ('Not performed', [3209, 3208])}, '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', [3757, 3206, 3108])}, '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', [3108])}, 'NuclearMedicineProcedure': {'371572003': ('Nuclear medicine procedure', [6028])}, 'NucleusAccumbens': {'427667007': ('Nucleus accumbens', [7153, 7140, 9514, 7192, 7151])}, 'NuerCattleBreed': {'131510007': ('Nuer cattle breed', [7480])}, 'Nulliparous': {'102877006': ('Nulliparous', [6087, 6081])}, '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, 502, 6121, 501]), '399182000': ('oblique', [4010, 501]), '399366008': ('oblique', [21])}, 'ObliqueAxial': {'399004004': ('oblique axial', [4010, 501]), '399089007': ('Oblique axial', [501, 26])}, 'ObliqueAxialEmissiveProjection': {'399089007': ('Oblique axial emissive ' 'projection (qualifier ' 'value)', [])}, 'ObliqueAxialProjection': {'399004004': ('Oblique axial projection (qualifier ' 'value)', [])}, 'ObliqueBodyPosition': {'399366008': ('Oblique body position (finding)', [])}, 'ObliqueCaudoCranial': {'399225005': ('oblique caudo-cranial', [4010, 501])}, 'ObliqueCaudoCranialProjection': {'399225005': ('Oblique caudo-cranial ' 'projection (qualifier value)', [])}, 'ObliqueCranioCaudal': {'399288005': ('oblique cranio-caudal', [4010, 501])}, 'ObliqueCranioCaudalProjection': {'399288005': ('Oblique cranio-caudal ' 'projection (qualifier value)', [])}, 'ObliqueLateral': {'260427002': ('Oblique lateral (qualifier value)', [])}, 'ObliqueProjection': {'399182000': ('Oblique projection (qualifier value)', [])}, 'ObscuredLesion': {'129740002': ('Obscured lesion', [6007, 6006])}, 'ObstetricHistory': {'248983002': ('Obstetric history (observable entity)', [])}, '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])}, 'OccipitalArtery': {'31145008': ('occipital artery', [3604, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'OccipitalBone': {'31640002': ('Occipital bone', [9514, 7192, 4028, 7151])}, 'OccipitalBoneStructure': {'31640002': ('Occipital bone structure (body ' 'structure)', [])}, 'OccipitalLobe': {'31065004': ('Occipital lobe', [7153, 9514, 7192, 7151])}, 'OccipitalLobeStructure': {'31065004': ('Occipital lobe structure (body ' 'structure)', [])}, 'OccipitalLymphNode': {'3916005': ('occipital lymph node', [7600])}, 'OccipitalRegionOfScalp': {'700032006': ('Occipital region of scalp', [12022])}, 'OccipitalVein': {'32114007': ('Occipital vein', [3010, 4042, 9514, 7192, 7151, 4])}, 'OcclusalProjection': {'260499007': ('Occlusal projection', [4010, 501])}, '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': {'398828005': ('Ocular Lubricant', [621, 622])}, 'OculomotorNerve': {'56193007': ('oculomotor nerve', [7710, 7706])}, 'OculomotorNerveStructure': {'56193007': ('Oculomotor nerve structure (body ' 'structure)', [])}, 'OffAxis': {'419161000': ('Off axis', [6, 502, 501])}, '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', [7710, 7706])}, 'OlfactoryTractStructure': {'3960005': ('Olfactory tract structure (body ' 'structure)', [])}, 'OliventinaPigBreed': {'132193004': ('Oliventina pig breed', [7480])}, 'OmentalBursa': {'113346000': ('Omental bursa', [9514, 7192, 7151, 4])}, 'OmentalBursaStructure': {'113346000': ('Omental bursa structure (body ' 'structure)', [])}, 'Omentum': {'27398004': ('Omentum', [7154, 9514, 7192, 7151, 4])}, '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])}, 'OperativeSite': {'43526002': ('Operative Site', [6201])}, 'OphthalmicArtery': {'53549008': ('Ophthalmic Artery', [12105, 3604, 12103, 3010, 4042, 9514, 7192, 3606, 7151, 4209, 3827, 4, 3630])}, 'OphthalmicEndoscope': {'409902001': ('Ophthalmic Endoscope', [4202])}, 'OphthalmicFormAtropine': {'349947003': ('Ophthalmic form atropine (product)', [])}, 'OphthalmicLubricant': {'398828005': ('Ophthalmic lubricant (product)', [])}, 'OphthalmicPhenylephrine': {'386693003': ('Ophthalmic phenylephrine (product)', [])}, 'Ophthalmology': {'309935007': ('Ophthalmology', [7030])}, 'OpiateAntagonist': {'372656001': ('Opiate antagonist (substance)', [])}, 'OpticCanal': {'55024004': ('Optic canal', [4030, 4031, 4042, 9514, 7192, 4028, 7151, 4, 4009])}, 'OpticCanalStructure': {'55024004': ('Optic canal structure (body structure)', [])}, 'OpticChiasm': {'244453006': ('Optic chiasm', [7153, 9514, 7192, 7151])}, 'OpticChiasma': {'244453006': ('Optic chiasma (body structure)', [])}, 'OpticDiscStructure': {'81016008': ('Optic disc structure (body structure)', [])}, 'OpticForamenProjection': {'272466003': ('Optic foramen projection (qualifier ' 'value)', [])}, 'OpticNerve': {'18234004': ('optic nerve', [7710, 7706])}, 'OpticNerveHead': {'81016008': ('Optic nerve head', [4211, 4266, 4209])}, 'OpticNerveStructure': {'18234004': ('Optic nerve structure (body structure)', [])}, 'OpticRadiation': {'70105001': ('Optic radiation', [7153, 7702, 7710, 9514, 7192, 7151])}, 'OpticTract': {'53238003': ('Optic tract', [7153, 9514, 7192, 7151])}, '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])}, 'OralCavityStructure': {'74262004': ('Oral cavity structure (body structure)', [])}, 'OralMucosa': {'113277000': ('Oral mucosa', [10060, 10044, 4029])}, 'OralMucousMembraneStructure': {'113277000': ('Oral mucous membrane structure ' '(body structure)', [])}, 'OralRoute': {'26643006': ('Oral route', [11])}, 'OralSurgery': {'309974000': ('Oral Surgery', [7030])}, 'OralSurgeryDepartment': {'309974000': ('Oral surgery department ' '(environment)', [])}, 'OrangeGStain': {'54221006': ('orange G stain', [8112])}, 'OrangeIIStain': {'25941002': ('orange II stain', [8112])}, 'Orbit': {'363654007': ('Orbit', [12022])}, 'OrbitalStructure': {'363654007': ('Orbital structure', [4030, 4031, 7483, 7482, 1002, 1001, 4042, 1000, 9514, 7192, 4028, 7151, 4, 4009])}, 'OrbitoParietalProjection': {'399351005': ('Orbito-parietal projection ' '(qualifier value)', [])}, 'Orbitoparietal': {'399351005': ('orbitoparietal', [4010, 501])}, 'OrceinStain': {'406966004': ('orcein stain', [8112])}, 'OregonRexCatBreed': {'396505009': ('Oregon rex cat breed', [7480])}, 'OrehlaDeColherPigBreed': {'132166002': ('Orehla de Colher pig breed', [7480])}, 'Organ': {'113343008': ('Organ', [7191, 7151, 7166])}, '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 (waldeyer's ring)", [7601])}, 'Oropharynx': {'31389004': ('oropharynx', [7601])}, '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 (organism)', [])}, 'OryctolagusCuniculusEuropeanRabbit': {'36571002': ('Oryctolagus cuniculus ' '(European rabbit)', [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])}, 'OsteogenicSarcoma': {'21708004': ('Osteogenic sarcoma', [6030, 6033])}, 'Osteosarcoma': {'21708004': ('Osteosarcoma', [639, 638])}, '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])}, '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])}, 'OvamboCattleBreed': {'131513009': ('Ovambo cattle breed', [7480])}, 'OvarianArtery': {'12052000': ('Ovarian Artery', [12103, 12140, 9514, 7192, 12111, 7151, 3827])}, 'OvarianFollicleStructure': {'24162005': ('Ovarian follicle structure (body ' 'structure)', [])}, 'OvarianStructure': {'15497006': ('Ovarian structure (body structure)', [])}, 'OvarianVein': {'976004': ('Ovarian vein', [12113, 12103, 12140, 9514, 7192, 7151, 3827])}, 'Ovary': {'15497006': ('Ovary', [10060, 6204, 9514, 645, 7160, 7192, 7151, 6202, 4, 10044])}, 'OverbedTrapezeDevice': {'422915004': ('Overbed trapeze device (physical ' 'object)', [])}, 'OvineSpecies': {'36295001': ('Ovine species (organism)', [])}, 'Ovis': {'388254009': ('Ovis', [7454])}, 'OvisAries': {'125099002': ('Ovis aries (domestic sheep)', [7454])}, 'OvoidShape': {'84360004': ('Ovoid shape (qualifier value)', [])}, 'OvoidShapeOval': {'84360004': ('Ovoid shape (Oval)', [6005, 6004])}, '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', [13, 12, 3850])}, 'OxygenAdministrationByMask': {'371908008': ('Oxygen Administration by mask', [3531])}, 'OxygenAdministrationByNasalCannula': {'371907003': ('Oxygen Administration ' 'by nasal cannula', [3531])}, 'OxygenGas': {'320917000': ('Oxygen gas', [629, 623])}, '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': {'241434002': ('PET brain study', [3108])}, 'PETBreastStudy': {'416323006': ('PET breast study', [3108])}, 'PETCTFDGImagingOfWholeBody': {'443271005': ('PET/CT FDG imaging of whole ' 'body', [100])}, 'PETCTMETImagingOfWholeBody': {'443844003': ('PET/CT MET imaging of whole ' 'body', [100])}, 'PETHeartStudy': {'241439007': ('PET heart study', [3757, 3206, 3108])}, '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])}, '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])}, 'PacemakerPulseGeneratorDevice': {'118378005': ('Pacemaker pulse generator, ' 'device (physical object)', [])}, '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)', [])}, 'PajunaCattleBreed': {'133538007': ('Pajuna cattle breed', [7480])}, 'PalatineBone': {'51283005': ('Palatine bone', [9514, 7192, 4028, 7151])}, 'PalatineBoneStructure': {'51283005': ('Palatine bone structure (body ' 'structure)', [])}, 'PalatineTonsil': {'75573002': ('palatine tonsil', [7601])}, 'PalatineUvula': {'26140008': ('palatine uvula', [7601])}, '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)', [9300, 60])}, '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', [12246, 3201])}, 'PanamaSheep': {'13934009': ('Panama sheep (organism)', [])}, 'PanamaSheepBreed': {'13934009': ('Panama sheep breed', [7480])}, 'Pancreas': {'15776009': ('Pancreas', [1005, 4030, 10060, 1001, 1000, 9514, 7192, 7151, 4, 10044])}, 'PancreaticDuct': {'69930009': ('Pancreatic duct', [9514, 7192, 7151, 4])}, 'PancreaticDuctAndBileDuctSystems': {'110621006': ('Pancreatic duct and bile ' 'duct systems', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, '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])}, 'PancreaticStructure': {'15776009': ('Pancreatic structure (body structure)', [])}, 'PancreaticoduodenalLymphNode': {'76659008': ('pancreaticoduodenal lymph node', [7600])}, 'PancreaticosplenicLymphNode': {'16050005': ('pancreaticosplenic lymph node', [7600])}, 'Pancuronium': {'373738000': ('Pancuronium', [627, 623])}, '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': {'346607007': ('Papaverine', [65])}, 'PaphosCattleBreed': {'133541003': ('Paphos cattle breed', [7480])}, 'PapillaryCarcinoma': {'25910003': ('Papillary carcinoma (invasive)', [6030, 6033])}, 'PapillaryCarcinomaInSitu': {'10376009': ('Papillary carcinoma in-situ', [6030, 6033])}, 'Papilloma': {'23730008': ('Papilloma', [6031, 6030])}, '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])}, 'ParaesophagealLymphNodeBelowCarina': {'127940001': ('paraesophageal lymph ' 'node below carina', [7600])}, 'Paraffin': {'255667006': ('Paraffin (substance)', [])}, 'ParaffinWax': {'311731000': ('Paraffin wax', [8115])}, 'Paraformaldehyde': {'52836003': ('Paraformaldehyde', [8114])}, 'ParalyticSyndrome': {'29426003': ('Paralytic syndrome', [3205])}, 'ParamammaryLymphNode': {'368550005': ('paramammary lymph node', [7600])}, 'ParametrialLymphNode': {'3243006': ('parametrial lymph node', [7600])}, 'ParanasalSinus': {'2095001': ('Paranasal sinus', [4030, 4031, 7601, 4040, 4042, 9514, 7192, 4028, 7151, 4, 4009])}, 'Paraproteinemia': {'35601003': ('Paraproteinemia', [64])}, 'PararectalLymphNode': {'21875007': ('pararectal lymph node', [7600])}, 'Parasagittal': {'103343002': ('Parasagittal', [6, 502, 501, 5])}, 'Parasternal': {'91691001': ('Parasternal', [9514, 7192, 7151, 4])}, 'ParasternalLongAxis': {'399139001': ('Parasternal long axis', [12226, 501])}, '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', [12226, 501])}, 'ParasternalLongAxisViewOfTheRVOutflowTract': {'443083000': ('Parasternal ' 'long axis view ' 'of the RV ' 'outflow tract', [12226, 501])}, 'ParasternalLymphNode': {'82365008': ('parasternal lymph node', [7600])}, 'ParasternalShortAxis': {'399306005': ('Parasternal short axis', [12226, 501])}, 'ParasternalShortAxisAtTheAorticValveLevel': {'399239005': ('Parasternal ' 'short axis at ' 'the aortic valve ' 'level', [12226, 501])}, 'ParasternalShortAxisAtTheLevelOfTheMitralChords': {'399371001': ('Parasternal ' 'short axis ' 'at the ' 'level of ' 'the mitral ' 'chords', [12226, 501])}, 'ParasternalShortAxisAtTheMitralValveLevel': {'399036006': ('Parasternal ' 'short axis at ' 'the Mitral Valve ' 'level', [12226, 501])}, 'ParasternalShortAxisAtThePapillaryMuscleLevel': {'399271003': ('Parasternal ' 'short axis ' 'at the ' 'Papillary ' 'Muscle level', [12226, 501])}, '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', [4030, 9514, 7192, 7151, 4])}, 'ParathyroidStructure': {'111002': ('Parathyroid structure (body structure)', [])}, 'ParatrachealLymphNode': {'65690001': ('paratracheal lymph node', [7600])}, 'ParavaginalLymphNode': {'16228004': ('paravaginal lymph node', [7600])}, 'ParavesicularLymphNode': {'1439000': ('paravesicular lymph node', [7600])}, 'Parenchyma': {'91772007': ('Parenchyma', [5])}, 'ParenteralEnteralSolutionBag': {'464557001': ('Parenteral/enteral solution ' 'bag', [68])}, 'ParietalBone': {'24924006': ('Parietal bone', [9514, 7192, 4028, 7151])}, 'ParietalBoneStructure': {'24924006': ('Parietal bone structure (body ' 'structure)', [])}, 'ParietalLobe': {'16630005': ('Parietal lobe', [7153, 9514, 7192, 7151])}, 'ParietalLobeStructure': {'16630005': ('Parietal lobe structure (body ' 'structure)', [])}, 'ParietoOrbital': {'399316002': ('parieto-orbital', [4010, 501])}, 'ParietoOrbitalProjection': {'399316002': ('Parieto-orbital projection ' '(qualifier value)', [])}, 'Parietoacanthial': {'399272005': ('parietoacanthial', [4010, 501])}, 'ParietoacanthialProjection': {'399272005': ('Parietoacanthial projection ' '(qualifier value)', [])}, 'ParmensePigBreed': {'132194005': ('Parmense pig breed', [7480])}, 'ParotidGland': {'45289007': ('Parotid gland', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'ParotidGlandStructure': {'45289007': ('Parotid gland structure (body ' 'structure)', [])}, 'ParotidLymphNode': {'10209003': ('parotid lymph node', [7600])}, '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', [12249, 12248])}, '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])}, 'PasternOfForefoot': {'31329001': ('Pastern of forefoot', [7483, 7482])}, 'PasternOfHindfoot': {'18525008': ('Pastern of hindfoot', [7483, 7482])}, 'PasternRegionOfHindfoot': {'18525008': ('Pastern region of hindfoot (body ' 'structure)', [])}, 'Patella': {'64234005': ('Patella', [4030, 4031, 7304, 7483, 7482, 1001, 4042, 1000, 9514, 7192, 7151, 4, 4009, 1006])}, 'PatentBlueVSodiumSaltStain': {'48540004': ('patent blue V sodium salt stain', [8112])}, 'PatentDuctusArteriosus': {'83330001': ('patent ductus arteriosus', [3604, 12293, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, '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])}, '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, 6096])}, 'PatientHasPacemaker': {'441509002': ('Patient has pacemaker', [3205])}, 'PatientImmunocompromised': {'370388006': ('Patient immunocompromised', [602])}, 'PatientInRemission': {'313386006': ('Patient in remission (finding)', [])}, '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])}, 'PectoralGirdle': {'26444007': ('Pectoral girdle', [6115])}, 'PectoralisMajorMuscle': {'60005003': ('Pectoralis major muscle', [6109, 6102, 6116, 9514, 7192, 7151])}, 'PectoralisMajorMuscleStructure': {'60005003': ('Pectoralis major muscle ' 'structure (body structure)', [])}, 'PectoralisMinorMuscle': {'18686000': ('Pectoralis minor muscle', [6109, 6102, 6116, 9514, 7192, 7151])}, '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])}, 'Pedunculated': {'25126001': ('Pedunculated', [6209])}, 'PeeWeeCattleBreed': {'133400005': ('Pee Wee cattle breed', [7480])}, 'PekingeseDog': {'67684001': ('Pekingese dog', [7480])}, 'PelibüeySheepBreed': {'132802000': ('Pelibüey sheep breed', [7480])}, 'PeloponnesusCattleBreed': {'133401009': ('Peloponnesus cattle breed', [7480])}, 'PelvicCavityStructure': {'21844003': ('Pelvic cavity structure (body ' 'structure)', [])}, 'PelvicLymphNode': {'54268001': ('pelvic lymph node', [7600])}, 'PelvicLymphNodeStructure': {'54268001': ('Pelvic lymph node structure (body ' 'structure)', [])}, 'PelvicStructure': {'12921003': ('Pelvic structure (body structure)', [])}, 'PelvicVascularStructure': {'281496003': ('Pelvic vascular structure (body ' 'structure)', [])}, 'Pelvis': {'118645006': ('Pelvis', [7304]), '12921003': ('Pelvis', [4030, 4031, 7483, 7482, 4042, 9514, 7192, 7151, 4, 4009])}, 'PelvisAndLowerExtremities': {'416631005': ('Pelvis and lower extremities', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, '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', [9514, 7192, 7151, 4])}, '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', [625, 623])}, 'PepperProtocol': {'129100000': ('Pepper protocol', [12001, 3261])}, 'PerRectum': {'37161004': ('Per rectum', [613, 11, 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', [3405, 9])}, 'PercutaneousProstheticClosureOfAtrialSeptalDefect': {'30123000': ('Percutaneous ' 'prosthetic ' 'closure ' 'of atrial ' 'septal ' 'defect', [12247])}, 'PercutaneousRemovalOfEndovascularForeignBody': {'240946003': ('Percutaneous ' 'removal of ' 'endovascular ' 'foreign body ' '(procedure)', [])}, 'PercutaneousRetrievalOfIntravascularForeignBody': {'240946003': ('Percutaneous ' 'retrieval ' 'of ' 'intravascular ' 'foreign ' 'body', [9]), '37630009': ('Percutaneous ' 'retrieval ' 'of ' 'intravascular ' 'foreign ' 'body', [3405])}, 'PercutaneousTransluminalAngioplastyBalloon': {'102319006': ('Percutaneous ' 'transluminal ' 'angioplasty ' 'balloon', [4051, 3429, 3411, 7151, 8, 7193])}, 'PercutaneousTransluminalAngioplastyBalloonDevice': {'102319006': ('Percutaneous ' 'transluminal ' 'angioplasty ' 'balloon, ' 'device ' '(physical ' 'object)', [])}, 'PercutaneousTransluminalBalloonAngioplasty': {'68457009': ('Percutaneous ' 'transluminal ' 'balloon ' 'angioplasty', [3405, 9])}, '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', [12103, 12115, 9514, 7192, 7151, 3827])}, 'Perfusion': {'371863001': ('Perfusion', [7161, 7195, 7151])}, 'PerfusionFinding': {'371863001': ('Perfusion finding (finding)', [])}, 'PerfusionImaging': {'35202002': ('Perfusion imaging (nuclear)', [3757])}, 'PerianganHorseBreed': {'132975001': ('Periangan horse breed', [7480])}, 'PericardialCavity': {'25489000': ('Pericardial cavity', [7152, 9514, 7192, 7151])}, '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', [6109, 6102, 6117, 9514, 7192, 7151])}, 'Pericardium': {'76848001': ('Pericardium', [12294, 7152, 9514, 7192, 7151])}, 'PerigastricLymphNode': {'245344006': ('perigastric lymph node', [7600])}, 'Perimeter': {'131191004': ('Perimeter', [7470, 6165, 218, 7469])}, 'PerinealStructure': {'38864007': ('Perineal structure (body structure)', [])}, 'Perineum': {'38864007': ('Perineum', [9514, 7192, 7151, 4])}, 'PeriodOfCollection': {'260867005': ('Period of collection (qualifier value)', [])}, 'PeriodicAcidSchiffStain': {'255808002': ('periodic acid Schiff stain', [8112])}, 'PeripancreaticLymphNode': {'245346008': ('peripancreatic lymph node', [7600])}, 'Peripheral': {'14414005': ('Peripheral', [6125, 6124, 2, 5])}, 'PeripheralAngiography': {'271993009': ('peripheral angiography', [3820])}, 'PeripheralIntravenousCatheter': {'82449006': ('Peripheral intravenous ' 'catheter', [74])}, 'PeripheralIntravenousCatheterDevice': {'82449006': ('Peripheral intravenous ' 'catheter, device ' '(physical object)', [])}, 'PeripheralNerve': {'84782009': ('Peripheral nerve', [7710, 9514, 7192, 7151, 7167])}, 'PeripheralNerveStructure': {'84782009': ('Peripheral nerve structure (body ' 'structure)', [])}, 'PeripheralNervousSystem': {'3058005': ('Peripheral nervous system', [9514, 7192, 7151, 7167])}, 'PeripheralNervousSystemStructure': {'3058005': ('Peripheral nervous system ' 'structure (body structure)', [])}, 'PeripheralVascularDisease': {'400047006': ('Peripheral vascular disease', [3756, 3205])}, 'Peritioneum': {'15425007': ('Peritioneum', [7154, 9514, 7192, 7151])}, 'PeritonealCavity': {'83670000': ('Peritoneal cavity', [7154, 9514, 7192, 7151])}, 'PeritonealCavityStructure': {'83670000': ('Peritoneal cavity structure (body ' 'structure)', [])}, 'PeritoneumSerousMembraneStructure': {'15425007': ('Peritoneum (serous ' 'membrane) structure (body ' 'structure)', [])}, 'PermethrinStain': {'333111009': ('permethrin stain', [8112])}, 'PermethrinStainSubstance': {'333111009': ('Permethrin stain (substance)', [])}, 'PeritoneumSerousMembraneStructure': {'15425007': ('Peritoneum (serous ' 'membrane) structure (body ' 'structure)', [])}, 'PermethrinStain': {'333111009': ('permethrin stain', [8112])}, 'PernaCurtaPigBreed': {'132163005': ('Perna-Curta pig breed', [7480])}, 'PeronealArtery': {'8821006': ('peroneal artery', [3604, 12109, 12103, 3010, 4042, 9514, 7192, 3606, 7151, 3827, 4, 3630])}, 'PeronealVein': {'71758008': ('Peroneal Vein', [12103, 9514, 7192, 7151, 3827, 12110])}, 'PeroxidaseStain': {'406974003': ('peroxidase stain', [8112])}, 'PerpendicularAxis': {'131189007': ('Perpendicular Axis', [7470, 6165, 218, 7469])}, '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])}, 'Phakic': {'309649001': ('Phakic', [4231])}, 'PhakicIOL': {'397559001': ('Phakic IOL', [4231])}, 'PhakicIntraocularLensImplant': {'397559001': ('Phakic intraocular lens ' 'implant (physical object)', [])}, 'PharaohHound': {'14876008': ('Pharaoh hound', [7480])}, 'PharmacologicAndExerciseStressTest': {'428813002': ('Pharmacologic and ' 'exercise stress test', [12001, 3757, 3261, 3200])}, 'PharmacologicStressProtocol': {'424064009': ('Pharmacologic Stress protocol', [12001, 3261])}, 'PharmacologicStressTest': {'424064009': ('Pharmacologic stress test', [3200])}, 'PharmacologicalStressTest': {'424064009': ('Pharmacological stress test', [3757])}, 'PharmacologicalStressUsed': {'246489000': ('Pharmacological stress used ' '(attribute)', [])}, 'PharyngealStructure': {'54066008': ('Pharyngeal structure (body structure)', [])}, 'PharyngealTonsil': {'55940004': ('pharyngeal tonsil (adenoid)', [7601])}, 'Pharynx': {'54066008': ('Pharynx', [4040, 9514, 7192, 7151, 4])}, 'PharynxAndLarynx': {'312535008': ('Pharynx and larynx', [4040, 9514, 7192, 7151, 4])}, '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])}, '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])}, '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', [9501, 9502, 7150])}, 'Physician': {'309343006': ('Physician', [7450, 9536, 7452])}, 'PhysiologicalMonitoringRegimeRegimeTherapy': {'281691001': ('Physiological ' 'monitoring ' 'regime ' '(regime/therapy)', [])}, 'Physiotherapy': {'310464005': ('Physiotherapy', [7030])}, 'PhysiotherapyDepartment': {'310464005': ('Physiotherapy department ' '(environment)', [])}, 'PiaMater': {'23180006': ('Pia mater', [7153, 9514, 7192, 7151, 5])}, '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, 6404, 6202, 6203])}, 'PindosHorseBreed': {'132984001': ('Pindos horse breed', [7480])}, 'PindosPonyBreed': {'424111008': ('Pindos pony breed (organism)', [])}, 'PindosPonyHorseBreed': {'424111008': ('Pindos pony horse breed', [7480])}, 'PinealGland': {'45793000': ('Pineal Gland', [7153, 9514, 7192, 7151])}, 'PinealStructure': {'45793000': ('Pineal structure (body structure)', [])}, 'PineywoodsPigBreed': {'132037003': ('Pineywoods pig breed', [7480])}, 'PinholeVisualAcuity': {'419475002': ('Pinhole Visual Acuity', [4216])}, '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', [7153, 9514, 7192, 7151])}, 'PituitaryFossa': {'42575006': ('Pituitary Fossa', [1002, 1001, 1000])}, '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)', [])}, 'PlacentalStructure': {'78067005': ('Placental structure (body structure)', [])}, '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', [12109, 12103, 9514, 7192, 7151, 3827])}, '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', [4010, 501])}, 'PlantodorsalProjection': {'399071006': ('Plantodorsal projection (qualifier ' 'value)', [])}, 'Plaque': {'1522000': ('plaque', [3810])}, 'PlaqueUlceration': {'62189002': ('Plaque Ulceration', [3491])}, 'PlasmaExpander': {'372578001': ('Plasma Expander', [621, 622])}, 'Plasmacytoma': {'10639003': ('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', [6103, 6102])}, 'Platinum': {'84847000': ('Platinum', [300])}, 'PleomorphicAdenoma': {'8360001': ('Pleomorphic adenoma', [6031, 6030])}, 'Pleura': {'3120008': ('Pleura', [12294, 7155, 9514, 7192, 7151])}, 'PleuralEffusion': {'60046008': ('Pleural effusion', [645])}, 'PleuralMembraneStructure': {'3120008': ('Pleural membrane structure (body ' 'structure)', [])}, 'PleuralStructure': {'3120008': ('Pleural structure', [6129, 6100])}, 'PlevenHorseBreed': {'132986004': ('Pleven horse breed', [7480])}, 'PlottHound': {'40400008': ('Plott hound', [7480])}, 'Pm0NoDistantMetastasisBreast': {'373169005': ('pM0: No distant metastasis ' '(breast) (finding)', [])}, 'Pm1DistantMetastasisBreast': {'373171005': ('pM1: Distant metastasis ' '(breast) (finding)', [])}, 'PmxDistantMetastasisCannotBeAssessedBreast': {'373170006': ('pMX: Distant ' 'metastasis ' 'cannot be ' 'assessed ' '(breast) ' '(finding)', [])}, '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)', [])}, '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)', [])}, '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)', [])}, 'Pn2aMetastasisIn4To9AxillaryLymphNodesAtLeastOneTumorDepositGreaterThan2Point0mmBreast': {'373163006': ('pN2a: ' 'Metastasis ' 'in ' '4 ' 'to ' '9 ' 'axillary ' 'lymph ' 'nodes ' '(at ' 'least ' 'one ' 'tumor ' 'deposit ' 'greater ' 'than ' '2.0 ' 'mm) ' '(breast) ' '(finding)', [])}, 'Pn2bMetastasisInClinicallyApparentInternalMammaryLymphNodesInTheAbsenceOfAxillaryLymphNodeMetastasisBreast': {'373164000': ('pN2b: ' 'Metastasis ' 'in ' 'clinically ' 'apparent ' 'internal ' 'mammary ' 'lymph ' 'nodes ' 'in ' 'the ' 'absence ' 'of ' 'axillary ' 'lymph ' 'node ' 'metastasis ' '(breast) ' '(finding)', [])}, '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)', [])}, 'Pn3bTumorOfBreastWithMetastasisAsPerAmericanJointCommitteeOnCancer6thEditionDefinitionBreast': {'373167007': ('pN3b: ' 'Tumor ' 'of ' 'breast ' 'with ' 'metastasis ' 'as ' 'per ' 'American ' 'Joint ' 'Committee ' 'on ' 'Cancer ' '6th ' 'Edition ' 'definition ' '(breast) ' '(finding)', [])}, 'Pn3cMetastasisInIpsilateralSupraclavicularLymphNodesBreast': {'373166003': ('pN3c: ' 'Metastasis ' 'in ' 'ipsilateral ' 'supraclavicular ' 'lymph ' 'nodes ' '(breast) ' '(finding)', [])}, 'Pneumomediastinum': {'16838000': ('Pneumomediastinum', [6105, 6102])}, 'Pneumothorax': {'36118008': ('Pneumothorax', [6105, 6102, 6062])}, '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', [8124, 4204])}, '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])}, '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', [3604, 12109, 12103, 3010, 3440, 4042, 9514, 7192, 3606, 7151, 3827, 4, 3630])}, 'PoplitealFossa': {'32361000': ('Popliteal fossa', [9514, 7192, 7151, 4])}, 'PoplitealFossaStructure': {'32361000': ('Popliteal fossa structure (body ' 'structure)', [])}, 'PoplitealLymphNode': {'47471008': ('popliteal lymph node', [7600])}, 'PoplitealLymphNodeStructure': {'47471008': ('Popliteal lymph node structure ' '(body structure)', [])}, 'PoplitealVein': {'56849005': ('Popliteal Vein', [12103, 9514, 7192, 7151, 3827, 12110])}, 'PorcelaineDogBreed': {'132578009': ('Porcelaine dog breed', [7480])}, 'PorcineSpecies': {'42018006': ('Porcine species (organism)', [])}, 'Portal': {'32381004': ('Portal (qualifier value)', [])}, 'PortalVein': {'32764006': ('Portal Vein', [12103, 12114, 3010, 4042, 9514, 7192, 7151, 3827, 4, 3630, 3607])}, '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])}, 'PositronEmissionTomographyBrainStudy': {'241434002': ('Positron emission ' 'tomography brain ' 'study (procedure)', [])}, '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)', [])}, 'PositronEmissionTomographyWithComputedTomographyOfWholeBodyForNeoplasmUptakeOfMethionine': {'443844003': ('Positron ' 'emission ' 'tomography ' 'with ' 'computed ' 'tomography ' 'of ' 'whole ' 'body ' 'for ' 'neoplasm ' 'uptake ' 'of ' 'methionine ' '(procedure)', [])}, 'PossiblePregnancy': {'102874004': ('possible pregnancy', [6096])}, 'PossibleThrombus': {'373141002': ('Possible Thrombus', [3714])}, 'PostAblationPhase': {'129093009': ('Post-ablation phase', [3254])}, '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])}, 'PostPTCA': {'373108000': ('Post PTCA', [3201])}, 'PostPercutaneousTransluminalCoronaryAngioplasty': {'373108000': ('Post ' 'percutaneous ' 'transluminal ' 'coronary ' 'angioplasty ' '(finding)', [])}, 'PostStenoticDilation': {'371872009': ('Post Stenotic Dilation', [3709])}, 'PostVitrectomy': {'232077005': ('Post-Vitrectomy', [4232])}, 'PostVolumeChallenge': {'128971008': ('Post volume challenge', [91, 3271])}, 'PostartificialMenopausalSyndrome': {'31351009': ('Postartificial menopausal ' 'syndrome (disorder)', [])}, 'PostauricularLymphNode': {'245328002': ('postauricular lymph node', [7600])}, 'Postaxial': {'60583000': ('Postaxial', [2])}, 'PostductalRegionOfAorticArch': {'60835009': ('Postductal region of aortic ' 'arch', [12280])}, 'Posterior': {'255551008': ('Posterior', [3019, 211, 6025, 2, 6024, 212, 5, 4005, 12281])}, 'PosteriorArchVein': {'397435008': ('Posterior arch vein', [12103, 9514, 7192, 7151, 3827, 12110])}, 'PosteriorAuricularLymphNode': {'30793004': ('posterior auricular lymph node', [7600])}, 'PosteriorCerebralArtery': {'70382005': ('Posterior Cerebral Artery', [12105, 12103, 9514, 7192, 7151, 3827])}, 'PosteriorCerebralArteryP1Segment': {'415144009': ('Posterior Cerebral Artery ' 'P1 Segment', [12105, 12103, 9514, 7192, 7151, 3827])}, 'PosteriorCerebralArteryP2Segment': {'415145005': ('Posterior Cerebral Artery ' 'P2 Segment', [12105, 12103, 9514, 7192, 7151, 3827])}, 'PosteriorCerebralCommissure': {'279336005': ('Posterior cerebral commissure', [7153, 9514, 7192, 7151])}, 'PosteriorCommissure': {'279336005': ('posterior commissure', [7705, 7710, 7101, 7111])}, 'PosteriorCommissureOfLabiumMajorum': {'4019005': ('Posterior commissure of ' 'labium majorum', [4029])}, 'PosteriorCommunicatingArtery': {'43119007': ('Posterior Communicating Artery', [12105, 3604, 12103, 3606, 3827, 3630])}, 'PosteriorCommunicationArtery': {'43119007': ('Posterior communication artery', [3010, 4042, 9514, 7192, 7151, 4])}, 'PosteriorDescendingCoronaryArtery': {'443113009': ('Posterior Descending ' 'Coronary Artery', [12292])}, 'PosteriorDescendingRightCoronaryArtery': {'53655008': ('Posterior Descending ' 'Right Coronary ' 'Artery', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, 'PosteriorEmissiveProjection': {'399001007': ('Posterior emissive projection ' '(qualifier value)', [])}, 'PosteriorHornLateralVentricle': {'52943005': ('Posterior Horn Lateral ' 'Ventricle', [12022])}, 'PosteriorMedialTributary': {'128569001': ('Posterior medial tributary', [3010, 4042, 9514, 7192, 7151, 4, 3630, 3607])}, 'PosteriorMedialTributaryOfSuperficialVenousSystemOfLowerExtremity': {'128569001': ('Posterior ' 'medial ' 'tributary ' 'of ' 'superficial ' 'venous ' 'system ' 'of ' 'lower ' 'extremity ' '(body ' 'structure)', [])}, 'PosteriorMediastinalLymphNode': {'25447008': ('posterior mediastinal lymph ' 'node', [7600])}, 'PosteriorProjection': {'399001007': ('Posterior projection', [501, 26])}, 'PosteriorSegmentOfRightUpperLobe': {'3236000': ('Posterior segment of right ' 'upper lobe', [6124, 6127])}, 'PosteriorTibialArtery': {'13363002': ('Posterior Tibial Artery', [12109, 12103, 3010, 3440, 4042, 9514, 7192, 7151, 3827, 4])}, 'PosteriorTibialLymphNode': {'303623000': ('posterior tibial lymph node', [7600])}, 'PosteriorTibialVein': {'4258007': ('Posterior Tibial Vein', [12103, 9514, 7192, 7151, 3827, 12110])}, 'PosteriorTriangleCervicalLymphNode': {'245324000': ('posterior triangle ' 'cervical lymph node', [7600])}, 'PosteriorWall': {'264159006': ('Posterior Wall', [12280])}, 'PosteroAnterior': {'272479007': ('postero-anterior', [4010, 501])}, 'PosteroAnteriorOblique': {'399059000': ('postero-anterior oblique', [4010, 501])}, 'PosteroAnteriorObliqueProjection': {'399059000': ('Postero-anterior oblique ' 'projection (qualifier ' 'value)', [])}, 'PosteroanteriorProjection': {'272479007': ('Posteroanterior projection ' '(qualifier value)', [])}, 'Posterolateral': {'90069004': ('Posterolateral', [2])}, '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])}, '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])}, 'PotassiumHydroxideStain': {'406984002': ('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', [7180, 12224, 218, 6058, 7469])}, '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', [6083, 6050])}, 'PreDose': {'255235001': ('Pre-dose', [31])}, 'PreExerciseState': {'128977007': ('Pre-exercise state (finding)', [])}, 'PreOperative': {'262068006': ('Pre-operative', [3201, 31])}, 'PreSurgeryTesting': {'110467000': ('Pre-Surgery testing', [3671])}, 'Preaxial': {'32400000': ('Preaxial', [2])}, 'PrececalLymphNode': {'281765006': ('prececal lymph node', [7600])}, 'Prednisone': {'116602009': ('Prednisone', [65])}, 'PreductalRegionOfAorticArch': {'75397005': ('Preductal region of aortic arch', [12280])}, 'PrefemoralLymphNode': {'48193007': ('prefemoral lymph node', [7600])}, 'PregnancyObservable': {'364320009': ('Pregnancy observable (observable ' 'entity)', [])}, 'PreinfarctionSyndrome': {'4557003': ('Preinfarction syndrome (disorder)', [])}, 'PrelaryngealLymphNode': {'74203007': ('prelaryngeal lymph node', [7600])}, 'PrematureAtrialContraction': {'284470004': ('Premature atrial contraction ' '(disorder)', [])}, 'PremierPigBreed': {'132028003': ('Premier pig breed', [7480])}, 'Preoperative': {'262068006': ('Preoperative', [631, 632])}, 'PrepericardialLymphNode': {'196516004': ('prepericardial lymph node', [7600])}, 'PresaCanarioDogBreed': {'132576008': ('Presa Canario dog breed', [7480])}, 'Present': {'52101004': ('Present', [241, 240])}, '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])}, 'PretaCattleBreed': {'133433000': ('Preta cattle breed', [7480])}, 'PretrachealLymphNode': {'168460001': ('pretracheal lymph node', [7600])}, 'PrevascularRetrotrachealLymphNode': {'127930004': ('prevascular/retrotracheal ' 'lymph node', [7600])}, 'PreventiveIntent': {'129428001': ('Preventive intent', [3629])}, 'PreventiveProcedureIntent': {'129428001': ('Preventive - procedure intent ' '(qualifier value)', [])}, 'PrevertebralLymphNode': {'196446004': ('prevertebral lymph node', [7600])}, 'PrevesicularLymphNode': {'11740004': ('prevesicular lymph node', [7600])}, 'PrewakwaCattleBreed': {'133754008': ('Prewakwa cattle breed', [7480])}, 'PrianganSheepBreed': {'132814008': ('Priangan sheep breed', [7480])}, 'PrimaryCareDepartment': {'441480003': ('Primary Care Department', [7030])}, 'PrimaryGaze': {'408744005': ('Primary gaze', [4201])}, 'PrimaryRestrictiveCardiomyopathy': {'90828009': ('Primary restrictive ' 'cardiomyopathy (disorder)', [])}, 'PrimitiveAorta': {'14944004': ('Primitive aorta', [3010, 4042, 9514, 7192, 7151, 4])}, 'PrimitiveAorticStructure': {'14944004': ('Primitive aortic structure (body ' 'structure)', [])}, 'PrimitivePulmonaryArtery': {'91707000': ('Primitive pulmonary artery', [3010, 4042, 9514, 7192, 7151, 4])}, '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', [3604, 12109, 12103, 3010, 4042, 9514, 7192, 3606, 7151, 3827, 4, 3630])}, 'ProfundaFemorisVein': {'23438002': ('Profunda Femoris Vein', [12103, 9514, 7192, 7151, 3827, 12110])}, 'ProgesteronePreparation': {'50318003': ('Progesterone preparation (product)', [])}, 'ProgesteroneProduct': {'50318003': ('Progesterone product', [6080])}, 'ProkineticAgent': {'116532005': ('Prokinetic Agent (product)', [])}, 'PromontoryCommonIliacLymphNode': {'279189002': ('promontory common iliac ' 'lymph node', [7600])}, 'Pronation': {'88241000': ('Pronation', [92])}, 'PronationFunction': {'88241000': ('Pronation, function (observable entity)', [])}, 'Prone': {'1240000': ('Prone', [6206, 20])}, 'ProneBodyPosition': {'1240000': ('Prone body position (finding)', [])}, 'ProperHepaticArtery': {'18112008': ('Proper Hepatic Artery', [12112, 12103, 9514, 7192, 7151, 3827])}, 'ProphylacticIntent': {'360271000': ('Prophylactic intent', [3629])}, 'ProphylaxisProcedureIntent': {'360271000': ('Prophylaxis - procedure intent ' '(qualifier value)', [])}, 'Propofol': {'387423006': ('Propofol', [65, 625, 623, 66])}, 'Propranolol': {'55745002': ('Propranolol', [10])}, 'Propyliodone': {'111158001': ('Propyliodone', [12, 3850])}, 'ProstaglandinInjection': {'133875007': ('Prostaglandin injection', [9])}, 'Prostate': {'41216001': ('Prostate', [4030, 4031, 10060, 6204, 4042, 9514, 645, 7160, 7192, 7151, 6202, 4, 4009, 10044])}, 'ProstaticStructure': {'41216001': ('Prostatic structure (body structure)', [])}, 'Prosthesis': {'53350007': ('Prosthesis', [6102, 6138, 6404, 7151, 6202, 6203, 7193])}, 'ProsthesisDevice': {'53350007': ('Prosthesis, device (physical object)', [])}, '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', [3019, 211, 2, 12116, 212, 5, 12281])}, 'ProximalCircumflexCoronaryArtery': {'52433000': ('Proximal Circumflex ' 'Coronary Artery', [3014, 3604, 6109, 3015, 12292, 6102, 6117, 9514, 7192, 7151, 3827])}, 'ProximalFemur': {'310651003': ('Proximal Femur', [7304])}, 'ProximalHumerus': {'119524001': ('Proximal Humerus', [7304])}, 'ProximalLeftAnteriorDescendingCoronaryArtery': {'68787002': ('Proximal Left ' 'Anterior ' 'Descending ' 'Coronary ' 'Artery', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, 'ProximalRadius': {'12881000': ('Proximal Radius', [7304])}, 'ProximalRightCoronaryArtery': {'91083009': ('Proximal Right Coronary Artery', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, 'ProximalUlna': {'34318004': ('Proximal Ulna', [7304])}, 'ProximoDistal': {'442626000': ('Proximo-distal', [7484])}, 'ProximoDistalProjection': {'442626000': ('Proximo-distal projection ' '(qualifier value)', [])}, 'PrussianBlueStain': {'255809005': ('Prussian blue stain', [8112])}, 'PseudoAneurysm': {'22036004': ('Pseudo Aneurysm', [3491])}, 'Pseudoaneurysm': {'22036004': ('Pseudoaneurysm', [3413, 3810, 3754])}, 'Pseudophakia': {'95217000': ('Pseudophakia', [4231])}, 'Psychiatry': {'309958005': ('Psychiatry', [7030])}, 'PsychiatryDepartment': {'309958005': ('Psychiatry department (environment)', [])}, 'Psychology': {'310123008': ('Psychology', [7030])}, 'PsychologyService': {'310123008': ('Psychology service (qualifier value)', [])}, 'Pt0NoEvidenceOfPrimaryTumorBreast': {'373174002': ('pT0: No evidence of ' 'primary tumor (breast) ' '(finding)', [])}, 'Pt1Tumor2cmOrLessInGreatestDimensionBreast': {'373172003': ('pT1: Tumor 2 cm ' 'or less in ' 'greatest ' 'dimension ' '(breast) ' '(finding)', [])}, 'Pt1aTumorMoreThan0Point1cmButNotMoreThan0Point5cmInGreatestDimensionBreast': {'373180005': ('pT1a: ' 'Tumor ' 'more ' 'than ' '0.1 ' 'cm ' 'but ' 'not ' 'more ' 'than ' '0.5 ' 'cm ' 'in ' 'greatest ' 'dimension ' '(breast) ' '(finding)', [])}, 'Pt1bTumorMoreThan0Point5cmButNotMoreThan1cmInGreatestDimensionBreast': {'373204007': ('pT1b: ' 'Tumor ' 'more ' 'than ' '0.5 ' 'cm ' 'but ' 'not ' 'more ' 'than ' '1 ' 'cm ' 'in ' 'greatest ' 'dimension ' '(breast) ' '(finding)', [])}, 'Pt1cTumorMoreThan1cmButNotMoreThan2cmInGreatestDimensionBreast': {'373183007': ('pT1c: ' 'Tumor ' 'more ' 'than ' '1 ' 'cm ' 'but ' 'not ' 'more ' 'than ' '2 ' 'cm ' 'in ' 'greatest ' 'dimension ' '(breast) ' '(finding)', [])}, 'Pt1micMicroinvasion0Point1cmOrLessInGreatestDimensionBreast': {'373179007': ('pT1mic: ' 'Microinvasion ' '0.1 ' 'cm ' 'or ' 'less ' 'in ' 'greatest ' 'dimension ' '(breast) ' '(finding)', [])}, 'Pt2TumorMoreThan2cmButNotMoreThan5cmInGreatestDimensionBreast': {'373182002': ('pT2: ' 'Tumor ' 'more ' 'than ' '2 ' 'cm ' 'but ' 'not ' 'more ' 'than ' '5 ' 'cm ' 'in ' 'greatest ' 'dimension ' '(breast) ' '(finding)', [])}, 'Pt3TumorMoreThan5cmInGreatestDimensionBreast': {'373184001': ('pT3: Tumor ' 'more than 5 ' 'cm in ' 'greatest ' 'dimension ' '(breast) ' '(finding)', [])}, 'Pt4TumorOfAnySizeWithDirectExtensionToChestWallOrSkinBreast': {'373185000': ('pT4: ' 'Tumor ' 'of ' 'any ' 'size ' 'with ' 'direct ' 'extension ' 'to ' 'chest ' 'wall ' 'or ' 'skin ' '(breast) ' '(finding)', [])}, 'Pt4aTumorOfAnySizeWithExtensionToChestWallNotIncludingPectoralisMuscleBreast': {'373186004': ('pT4a: ' 'Tumor ' 'of ' 'any ' 'size ' 'with ' 'extension ' 'to ' 'chest ' 'wall, ' 'not ' 'including ' 'pectoralis ' 'muscle ' '(breast) ' '(finding)', [])}, '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)', [])}, '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)', [])}, 'Pt4dInflammatoryCarcinomaBreast': {'373190002': ('pT4d: Inflammatory ' 'carcinoma (breast) ' '(finding)', [])}, 'PtCategoryFinding': {'385385001': ('pT category finding (finding)', [])}, 'PtisCarcinomaInSituBreast': {'373175001': ('pTis: Carcinoma in situ (breast) ' '(finding)', [])}, 'PtisDuctalCarcinomaInSituBreast': {'373176000': ('pTis: Ductal carcinoma in ' 'situ (breast) (finding)', [])}, 'PtisLobularCarcinomaInSituBreast': {'373177009': ('pTis: Lobular carcinoma ' 'in situ (breast) ' '(finding)', [])}, 'PtisPagetDiseaseWithoutInvasiveCarcinomaBreast': {'373178004': ('pTis: Paget ' 'disease ' 'without ' 'invasive ' 'carcinoma ' '(breast) ' '(finding)', [])}, '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': {'253639004': ('Pulmonary arteriovenous ' 'fistula', [3604, 3606, 3630])}, 'PulmonaryArtery': {'81040000': ('Pulmonary artery', [3604, 4030, 6109, 12305, 6102, 6117, 3010, 12290, 12141, 4042, 9514, 7192, 3610, 3606, 7151, 4, 3630])}, 'PulmonaryArteryBlood': {'371953005': ('Pulmonary Artery Blood', [3520])}, 'PulmonaryArteryConduit': {'128584005': ('Pulmonary artery conduit', [3604, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, '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', [12249, 12248])}, 'PulmonaryAtresiaWithVentricularSeptalDefect': {'253591008': ('Pulmonary ' 'atresia with ' 'ventricular ' 'septal defect', [12249, 12248])}, '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', [3010, 4042, 9514, 7192, 7151, 4])}, 'PulmonaryDisease': {'19829001': ('Pulmonary disease', [3205])}, 'PulmonaryEdema': {'19242006': ('Pulmonary edema', [3700])}, 'PulmonaryEmbolism': {'59282003': ('Pulmonary embolism', [6104, 6102])}, 'PulmonaryHypertension': {'70995007': ('Pulmonary hypertension', [64, 3700, 3728, 3640])}, 'PulmonaryMetastasis': {'94391008': ('Pulmonary metastasis', [645])}, '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', [6109, 6102, 6117, 12290])}, 'PulmonaryValve': {'39057004': ('Pulmonary valve', [6113, 6109, 3701, 6102, 9514, 7192, 3610, 7151, 3630])}, '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, 9514, 7192, 7151])}, 'PulmonaryValveStructure': {'39057004': ('Pulmonary valve structure (body ' 'structure)', [])}, 'PulmonaryVascularResistance': {'276901002': ('Pulmonary Vascular Resistance', [3619, 3641])}, 'PulmonaryVein': {'122972007': ('Pulmonary vein', [6109, 12283, 6102, 6117, 3010, 12141, 4042, 3011, 9514, 7192, 7151, 4, 3630, 3607]), '430757002': ('Pulmonary Vein', [12305, 3840, 9514, 7192, 7151, 3827])}, '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', [3010, 4042, 9514, 7192, 7151, 4, 3630, 3607])}, 'PulmonaryVeinConfluenceToAtriumConnection': {'443208000': ('Pulmonary Vein ' 'confluence to ' 'Atrium ' 'Connection', [12280])}, 'PulmonaryVeinDWaveVelocityTimeIntegral': {'399039004': ('Pulmonary Vein ' 'D-Wave Velocity ' 'Time Integral', [12214])}, 'PulmonaryVeinGreatVessel': {'430757002': ('Pulmonary Vein Great Vessel', [12283])}, 'PulmonaryVeinRightMiddleSegment': {'443714006': ('Pulmonary Vein Right ' 'Middle Segment', [12280])}, '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', [3608, 3010, 4042, 9514, 7192, 7151, 4, 3630])}, 'PulmonaryVenousStructure': {'122972007': ('Pulmonary venous structure (body ' 'structure)', [])}, 'PulmonicRing': {'90318009': ('Pulmonic Ring', [12305, 3011])}, 'PulmonicValve': {'39057004': ('Pulmonic Valve', [12305, 12288, 12289])}, 'PulmonicValveArea': {'251013007': ('Pulmonic Valve Area', [3614, 3615])}, 'PulmonicValveDisease': {'76267008': ('Pulmonic valve disease', [3700])}, 'PulmonicValveStenosis': {'56786000': ('Pulmonic valve stenosis', [12249, 12248])}, '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', [6011, 6010])}, 'PunctateRadiographicCalcification': {'129755006': ('Punctate radiographic ' 'calcification (finding)', [])}, 'PunganurCattleBreed': {'133756005': ('Punganur cattle breed', [7480])}, 'Pupillograph': {'420827006': ('Pupillograph', [4202])}, 'PurkinjeFibers': {'13050003': ('Purkinje fibers', [3011])}, 'Putamen': {'89278009': ('Putamen', [7153, 7140, 9514, 7192, 7151])}, '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])}, 'PyreneanCattleBreed': {'133435007': ('Pyrenean cattle breed', [7480])}, 'PyreneanGoatBreed': {'131619002': ('Pyrenean goat breed', [7480])}, 'PyreneanMastiffDogBreed': {'132447008': ('Pyrenean Mastiff dog breed', [7480])}, 'PyriformSinus': {'6217003': ('pyriform sinus', [7601])}, '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', [6060, 6058])}, '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])}, 'RackaSheepBreed': {'131851004': ('Racka sheep breed', [7480])}, 'RackingHorseHorseBreed': {'133157008': ('Racking Horse horse breed', [7480])}, 'RacloprideC11': {'129512009': ('Raclopride C^11^', [4021])}, 'RadialArtery': {'45631007': ('radial artery', [3604, 12103, 3010, 3440, 4042, 9514, 7192, 3606, 7151, 12107, 3827, 4, 3630])}, 'RadialKeratotomy': {'51683002': ('Radial keratotomy (procedure)', [])}, 'RadialScar': {'133855003': ('Radial scar', [6031, 6030])}, 'RadialVein': {'52359001': ('Radial vein', [12108, 12103, 9514, 7192, 7151, 3827])}, 'RadiationTherapist': {'3430008': ('Radiation Therapist', [7450, 9536, 7452])}, 'RadiationTherapy': {'53438000': ('Radiation therapy', [6083, 6085, 6051])}, 'RadiationTherapyProcedureOrService': {'53438000': ('Radiation therapy ' 'procedure or service ' '(procedure)', [])}, 'RadicalAortopulmonaryReconstructWRVToPAValvelessConduit': {'429616001': ('Radical ' 'aortopulmonary ' 'reconstruct ' 'w ' 'RV ' 'to ' 'PA ' 'valveless ' 'conduit', [12247])}, 'RadioactiveImplant': {'19443004': ('Radioactive implant', [7112, 7157, 7151, 7111, 7193])}, 'RadioactiveImplantDevice': {'19443004': ('Radioactive implant, device ' '(physical object)', [])}, 'RadioactiveIsotope': {'89457008': ('Radioactive isotope (substance)', [])}, 'RadiofrequencyAblationDevice': {'371791001': ('Radiofrequency Ablation ' 'Device', [3429, 3411])}, '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)', [])}, 'RadiographicFindingOfVascularCalcification': {'129759000': ('Radiographic ' 'finding of ' 'vascular ' 'calcification ' '(finding)', [])}, 'RadiographicIndividualCalcification': {'129770007': ('Radiographic ' 'individual ' 'calcification ' '(finding)', [])}, 'RadiographicLesionMarginCharacteristics': {'129737002': ('Radiographic ' 'lesion margin ' 'characteristics ' '(finding)', [])}, 'RadioisotopeBrainImaging': {'41440006': ('Radioisotope brain imaging ' '(procedure)', [])}, 'RadioisotopeScanOfLymphaticSystem': {'169167001': ('Radioisotope scan of ' 'lymphatic system', [6083, 6050])}, '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, 9536, 7452])}, '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', [6083, 6050])}, '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', [9301, 9300])}, 'RadiopharmaceuticalAgent': {'417881006': ('Radiopharmaceutical agent ' '(substance)', [])}, 'Radiotherapy': {'309903007': ('Radiotherapy', [7030])}, 'RadiotherapyDepartment': {'309903007': ('Radiotherapy department ' '(environment)', [])}, 'Radius': {'131190003': ('Radius', [12257, 12277, 7470, 6165, 12260, 12271, 12267, 12251, 12250, 12266, 12270, 12265, 12273, 12269, 218, 12268, 12272, 12264, 12259, 12218, 12263, 12275, 12274, 12262, 12258, 7469]), '62413002': ('Radius', [12021, 7304])}, 'RadiusANDUlnaCombinedSite': {'110535000': ('radius AND ulna (combined site) ' '(body structure)', [])}, 'RadiusAndUlna': {'110535000': ('Radius and ulna', [7483, 7482])}, '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', [12001, 3261])}, '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, 12257, 12271, 12259, 12203])}, '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 (common rat)', [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', [4030, 4031, 6210, 4040, 6204, 4042, 9514, 7160, 7192, 7151, 6202, 4009])}, 'RectumStructure': {'34402009': ('Rectum structure (body structure)', [])}, 'Recumbent': {'102538003': ('recumbent', [19])}, 'RecumbentBodyPosition': {'102538003': ('Recumbent body position (finding)', [])}, '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)', [])}, 'Red': {'371240000': ('Red', [4206, 4255, 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', [8124, 4204])}, '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', [6083, 6051, 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)', [])}, 'RegionalAnesthesia': {'27372005': ('Regional anesthesia', [611, 612])}, 'RegionalCalcificationDistribution': {'129767008': ('Regional calcification ' 'distribution', [6013, 6012])}, 'RegionalLymphNode': {'312500006': ('regional lymph node', [7600])}, 'RegionalLymphNodeStructure': {'312500006': ('Regional lymph node structure ' '(body structure)', [])}, 'Registrar': {'158971006': ('Registrar', [7450, 7452])}, 'RegurgitantFlow': {'397417004': ('Regurgitant Flow', [12221])}, 'RegurgitantFraction': {'399301000': ('Regurgitant Fraction', [12304, 12200, 12257, 12261, 12260, 12276, 12271, 12267, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, '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', [6003, 6002])}, 'RenalArtery': {'2841007': ('Renal artery', [3604, 4030, 12103, 12115, 3837, 3010, 4042, 9514, 7192, 3606, 7151, 3827, 4, 3630, 7111])}, 'RenalCellCarcinoma': {'702391001': ('Renal cell carcinoma', [639, 638])}, 'RenalFailure': {'42399005': ('Renal failure', [3413, 3755])}, 'RenalFailureSyndrome': {'42399005': ('Renal failure syndrome (disorder)', [])}, 'RenalHilarLymphNode': {'249708006': ('renal hilar lymph node', [7600])}, 'RenalImpairment': {'236423003': ('Renal impairment (disorder)', [])}, 'RenalPelvis': {'25990002': ('Renal pelvis', [9514, 7192, 7151, 4])}, 'RenalPelvisStructure': {'25990002': ('Renal pelvis structure (body ' 'structure)', [])}, 'RenalStone': {'386103008': ('Renal stone', [300])}, 'RenalVein': {'56400007': ('Renal Vein', [12103, 12115, 3010, 4042, 9514, 7192, 7151, 3827, 4, 3630, 3607])}, '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, 9536, 7452])}, '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', [3405, 3262, 3602, 3101, 3250, 3207, 3102, 10045, 3651, 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', [4211, 4209, 4029])}, '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])}, 'RetrogradeDirection': {'312004007': ('Retrograde Direction', [12306])}, 'RetrogradeFlow': {'312004007': ('Retrograde Flow', [12221])}, 'RetromolarTrigone': {'85816001': ('retromolar trigone', [7601])}, 'RetroperitonealCompartmentStructure': {'82849001': ('Retroperitoneal ' 'compartment structure ' '(body structure)', [])}, 'RetroperitonealLymphNode': {'91394001': ('retroperitoneal lymph node', [7600])}, 'RetroperitonealSpace': {'82849001': ('Retroperitoneal space', [7154, 9514, 7192, 7151])}, 'Retroperitoneum': {'82849001': ('Retroperitoneum', [4])}, 'RetropharyngealLymphNode': {'25683005': ('retropharyngeal lymph node', [7600])}, 'RetropyloricLymphNode': {'280402004': ('retropyloric lymph node', [7600])}, 'RetrotrachealLymphNode': {'127931000': ('retrotracheal lymph node ' '(mediastinal)', [7600])}, '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', [12249, 12248])}, '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])}, 'RhodiumANDORRhodiumCompound': {'105877002': ('Rhodium AND/OR rhodium ' 'compound (substance)', [])}, 'RhodiumOrRhodiumCompound': {'105877002': ('Rhodium or Rhodium compound', [10006, 10067, 10016])}, 'RhoenschafSheepBreed': {'131854007': ('Rhoenschaf sheep breed', [7480])}, 'Rib': {'113197003': ('Rib', [4030, 6109, 4031, 7155, 6102, 6114, 4042, 9514, 7192, 7151, 4, 4009])}, 'RideauArcottSheepBreed': {'132703001': ('Rideau Arcott sheep breed', [7480])}, 'Right': {'24028007': ('Right', [247, 3019, 211, 2, 12117, 245, 5, 244])}, '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', [6303, 6300, 6301])}, 'RightAnteriorApicalTransitionZoneOfProstate': {'716930004': ('Right anterior ' 'apical ' 'transition ' 'zone of ' 'prostate', [6300, 6301])}, 'RightAnteriorBasalPeripheralZoneOfProstate': {'716904003': ('Right anterior ' 'basal ' 'peripheral zone ' 'of prostate', [6303, 6300, 6301])}, 'RightAnteriorBasalTransitionZoneOfProstate': {'716896009': ('Right anterior ' 'basal ' 'transition zone ' 'of prostate', [6300, 6301])}, 'RightAnteriorMiddlePeripheralZoneOfProstate': {'716919002': ('Right anterior ' 'middle ' 'peripheral ' 'zone of ' 'prostate', [6303, 6300, 6301])}, 'RightAnteriorMiddleTransitionZoneOfProstate': {'716913001': ('Right anterior ' 'middle ' 'transition ' 'zone of ' 'prostate', [6300, 6301])}, 'RightAnteriorOblique': {'399108003': ('Right anterior oblique', [501, 26]), '399356000': ('right anterior oblique', [4010, 501, 3466])}, 'RightAnteriorObliqueEmissiveProjection': {'399108003': ('Right anterior ' 'oblique emissive ' 'projection ' '(qualifier value)', [])}, 'RightAnteriorObliqueProjection': {'399356000': ('Right anterior oblique ' 'projection (qualifier ' 'value)', [])}, 'RightApicalAnteriorFibromuscularStromaOfProstate': {'716926002': ('Right ' 'apical ' 'anterior ' 'fibromuscular ' 'stroma of ' 'prostate', [6300, 6301])}, 'RightApicalPeripheralZoneOfProstate': {'716934008': ('Right apical ' 'peripheral zone of ' 'prostate', [6302, 6300])}, 'RightApicalTransitionZoneOfProstate': {'716928001': ('Right apical ' 'transition zone of ' 'prostate', [6302, 6303, 6300])}, 'RightAtrialPressure': {'276755008': ('Right Atrial Pressure', [3641])}, 'RightAtrialStructure': {'73829009': ('Right atrial structure (body ' 'structure)', [])}, 'RightAtrioventricularOstium': {'90561006': ('Right atrioventricular ostium', [3011])}, 'RightAtrioventricularOstiumStructure': {'90561006': ('Right atrioventricular ' 'ostium structure (body ' 'structure)', [])}, 'RightAtrium': {'73829009': ('Right Atrium', [3608, 12305, 3462, 12284, 3010, 4042, 3011, 9514, 7192, 7151, 4, 3630])}, 'RightAtriumPressureWaveform': {'128440008': ('Right atrium pressure waveform', [3003])}, 'RightAtriumPressureWaveformFunction': {'128440008': ('Right atrium pressure ' 'waveform, function ' '(observable entity)', [])}, 'RightAuricularAppendage': {'68300000': ('Right Auricular Appendage', [12284, 3010, 4042, 3011, 9514, 7192, 7151, 4])}, 'RightBasalAnteriorFibromuscularStromaOfProstate': {'716892006': ('Right ' 'basal ' 'anterior ' 'fibromuscular ' 'stroma of ' 'prostate', [6300, 6301])}, 'RightBasalPeripheralZoneOfProstate': {'716902004': ('Right basal peripheral ' 'zone of prostate', [6302, 6300])}, 'RightBasalTransitionZoneOfProstate': {'716894007': ('Right basal transition ' 'zone of prostate', [6302, 6303, 6300])}, 'RightBranchOfAtrioventricularBundle': {'57383004': ('Right branch of ' 'Atrioventricular bundle', [3011])}, 'RightBranchOfHepaticArtery': {'69421009': ('Right Branch of Hepatic Artery', [12112, 12103, 9514, 7192, 7151, 3827])}, 'RightBreast': {'73056007': ('Right breast', [6023, 6022])}, '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', [3604, 6109, 3015, 12292, 6102, 6117, 9514, 7192, 3016, 7151, 3827])}, 'RightCoronaryArteryOstium': {'56789007': ('Right Coronary Artery Ostium', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, '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', [3604, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'RightGaze': {'255531009': ('Right gaze', [4201])}, 'RightGlennShuntProcedure': {'444001009': ('Right Glenn shunt procedure', [12247])}, 'RightHepaticVein': {'272998002': ('Right Hepatic Vein', [12103, 12114, 9514, 7192, 7151, 3827])}, 'RightHypochondriacRegion': {'133946002': ('Right hypochondriac region', [9514, 7192, 7151, 4])}, 'RightHypochondriacRegionStructure': {'133946002': ('Right hypochondriac ' 'region structure (body ' 'structure)', [])}, 'RightInferiorPulmonaryVein': {'113273001': ('Right Inferior Pulmonary Vein', [12280])}, 'RightInguinalRegion': {'37117007': ('Right inguinal region', [9514, 7192, 7151, 4])}, 'RightInguinalRegionStructure': {'37117007': ('Right inguinal region ' 'structure (body structure)', [])}, 'RightLateral': {'399198007': ('right lateral', [4010, 501])}, 'RightLateralDecubitus': {'102535000': ('right lateral decubitus', [6206, 20])}, 'RightLateralDecubitusPosition': {'102535000': ('Right lateral decubitus ' 'position (finding)', [])}, 'RightLateralEmissiveProjection': {'399297009': ('Right lateral emissive ' 'projection (qualifier ' 'value)', [])}, 'RightLateralMiddlePeripheralZoneOfProstate': {'716917000': ('Right lateral ' 'middle ' 'peripheral zone ' 'of prostate', [6302, 6300])}, 'RightLateralProjection': {'399198007': ('Right lateral projection (qualifier ' 'value)', []), '399297009': ('Right lateral projection', [501, 26])}, 'RightLeftLateral': {'399173006': ('Right-left lateral', [7484])}, 'RightLowerQuadrantOfAbdomen': {'48544008': ('Right lower quadrant of abdomen', [9514, 7192, 7151, 4])}, 'RightLowerSegment': {'255496004': ('Right Lower Segment', [12237, 12219])}, 'RightLumbarRegion': {'133944004': ('Right lumbar region', [9514, 7192, 7151, 4])}, 'RightMainBranchOfPortalVein': {'73931004': ('Right Main Branch of Portal ' 'Vein', [12103, 12114, 9514, 7192, 7151, 3827])}, 'RightMainBronchus': {'70074004': ('Right main bronchus', [6113, 6109, 6102, 9514, 7192, 7151])}, 'RightMainBronchusStructure': {'70074004': ('Right main bronchus structure ' '(body structure)', [])}, 'RightMiddleAnteriorFibromuscularStromaOfProstate': {'716909008': ('Right ' 'middle ' 'anterior ' 'fibromuscular ' 'stroma of ' 'prostate', [6300, 6301])}, 'RightMiddleTransitionZoneOfProstate': {'716911004': ('Right middle ' 'transition zone of ' 'prostate', [6302, 6303, 6300])}, 'RightOblique': {'399236003': ('right oblique', [4010, 501])}, '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, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, 'RightPosteriorApicalTransitionZoneOfProstate': {'716932007': ('Right ' 'posterior ' 'apical ' 'transition ' 'zone of ' 'prostate', [6300, 6301])}, 'RightPosteriorBasalTransitionZoneOfProstate': {'716898005': ('Right ' 'posterior ' 'basal ' 'transition ' 'zone of ' 'prostate', [6300, 6301])}, 'RightPosteriorMiddleTransitionZoneOfProstate': {'716915008': ('Right ' 'posterior ' 'middle ' 'transition ' 'zone of ' 'prostate', [6300, 6301])}, 'RightPosteriorOblique': {'399038007': ('right posterior oblique', [4010, 501]), '399075002': ('Right posterior oblique', [501, 26])}, 'RightPosteriorObliqueEmissiveProjection': {'399075002': ('Right posterior ' 'oblique emissive ' 'projection ' '(qualifier value)', [])}, 'RightPosteriorObliqueProjection': {'399038007': ('Right posterior oblique ' 'projection (qualifier ' 'value)', [])}, 'RightPosterolateralApicalPeripheralZoneOfProstate': {'716938006': ('Right ' 'posterolateral ' 'apical ' 'peripheral ' 'zone of ' 'prostate', [6303, 6300, 6301])}, 'RightPosterolateralBasalPeripheralZoneOfProstate': {'716906001': ('Right ' 'posterolateral ' 'basal ' 'peripheral ' 'zone of ' 'prostate', [6303, 6300, 6301])}, 'RightPosterolateralMiddlePeripheralZoneOfProstate': {'716921007': ('Right ' 'posterolateral ' 'middle ' 'peripheral ' 'zone of ' 'prostate', [6303, 6300, 6301])}, 'RightPosteromedialApicalPeripheralZoneOfProstate': {'716940001': ('Right ' 'posteromedial ' 'apical ' 'peripheral ' 'zone of ' 'prostate', [6303, 6300, 6301])}, 'RightPosteromedialMiddlePeripheralZoneOfProstate': {'716923005': ('Right ' 'posteromedial ' 'middle ' 'peripheral ' 'zone of ' 'prostate', [6302, 6303, 6300, 6301])}, 'RightPulmonaryArtery': {'78480002': ('Right pulmonary artery', [3829, 3604, 12305, 3010, 4042, 9514, 7192, 3606, 12280, 7151, 4, 3630])}, 'RightPulmonaryVein': {'91539005': ('Right Pulmonary Vein', [3840, 9514, 7192, 7151, 3827])}, 'RightRostralLeftCaudalOblique': {'442747007': ('Right rostral-left caudal ' 'oblique', [7484])}, 'RightRostralLeftCaudalObliqueProjection': {'442747007': ('Right rostral-left ' 'caudal oblique ' 'projection ' '(qualifier value)', [])}, 'RightSeminalVesicle': {'74308000': ('Right seminal vesicle', [6302, 6303, 6300, 6301])}, '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', [9514, 7192, 7151, 4])}, 'RightUpperSegment': {'255499006': ('Right Upper Segment', [12237, 12219])}, 'RightVentralLeftDorsalOblique': {'442595001': ('Right ventral-left dorsal ' 'oblique', [7484])}, 'RightVentralLeftDorsalObliqueProjection': {'442595001': ('Right ventral-left ' 'dorsal oblique ' 'projection ' '(qualifier value)', [])}, 'RightVentricle': {'53085002': ('Right ventricle', [3609, 12305, 7152, 12288, 3462, 3463, 3010, 12287, 4042, 3011, 9514, 7192, 7151, 4, 3630])}, 'RightVentricleApex': {'128565007': ('Right ventricle apex', [3609, 3630])}, 'RightVentricleBasalSegment': {'277635008': ('Right Ventricle Basal Segment', [12305])}, 'RightVentricleInflow': {'8017000': ('Right ventricle inflow', [3609, 3010, 4042, 3011, 9514, 7192, 7151, 4, 3630])}, 'RightVentricleMidventricularSegment': {'277634007': ('Right Ventricle ' 'Midventricular Segment', [12305])}, 'RightVentricleOutflowChamber': {'128572008': ('Right ventricle outflow ' 'chamber (disorder)', [])}, 'RightVentricleOutflowTract': {'44627009': ('Right Ventricle Outflow Tract', [12236, 3609, 12305, 3010, 4042, 3011, 9514, 7192, 3610, 12280, 7151, 4, 3630, 12223])}, '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', [12226, 501])}, 'RightVentricularOutflowTractView': {'399195005': ('Right Ventricular Outflow ' 'Tract View', [12226, 501])}, '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])}, '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])}, 'RoseBengal': {'330888007': ('Rose Bengal', [4200])}, 'RoseBengalProduct': {'330888007': ('Rose bengal product (product)', [])}, 'RoseBengalSodiumI131': {'111159009': ('Rose Bengal sodium I^131^', [25])}, 'RoseBengalStain': {'82411007': ('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', [4051, 3429, 3411, 7151, 8, 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])}, 'RoundShape': {'42700002': ('Round shape', [6119, 6005, 6004])}, 'RoundShapedCalcification': {'129756007': ('Round shaped calcification', [6011, 6010])}, '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', [3757, 3206])}, 'SPMIPositiveStressForIschemia': {'371824008': ('s/p MI positive stress for ' 'ischemia', [3700])}, 'SPMPigBreed': {'132020005': ('SPM pig breed', [7480])}, 'SRDGoatBreed': {'131640001': ('SRD goat breed', [7480])}, 'STDepression': {'26141007': ('ST Depression', [3233, 3230]), '429622005': ('ST Depression (observable entity)', [])}, 'STElevation': {'164931005': ('ST elevation (observable entity)', []), '76388001': ('ST Elevation', [3233, 3230])}, 'STElevationMyocardialInfarction': {'401303003': ('ST Elevation Myocardial ' 'Infarction', [3723])}, 'STIntervalNormal': {'164929001': ('ST Interval Normal', [3231])}, 'STSegmentDepression': {'26141007': ('ST segment depression (finding)', [])}, 'STSegmentElevation': {'76388001': ('ST segment elevation (finding)', [])}, '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])}, 'SacrococcygealRegionOfSpineStructure': {'297174005': ('Sacrococcygeal region ' 'of spine structure ' '(body structure)', [])}, 'SacroiliacJoint': {'39723000': ('Sacroiliac joint', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'SacroiliacJointStructure': {'39723000': ('Sacroiliac joint structure (body ' 'structure)', [])}, 'Sacrum': {'54735007': ('Sacrum', [1005, 4030, 4031, 7483, 7482, 1001, 4042, 1000, 9514, 7192, 7151, 4, 4009])}, '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', [4010, 6, 502, 2, 501, 26])}, 'SagittalObliqueAxial': {'399273000': ('Sagittal-oblique axial', [501, 26]), '399325008': ('sagittal-oblique axial', [4010, 501])}, 'SagittalObliqueAxialEmissiveProjection': {'399273000': ('Sagittal-oblique ' 'axial emissive ' 'projection ' '(qualifier value)', [])}, 'SagittalObliqueAxialProjection': {'399325008': ('Sagittal-oblique axial ' 'projection (qualifier ' 'value)', [])}, '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])}, 'SakhalinWhitePigBreedOrganism': {'132113000': ('Sakhalin White pig 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': {'262003004': ('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', [3429, 3411])}, 'SalineThrombectomyDevice': {'371797002': ('Saline thrombectomy device ' '(physical object)', [])}, 'SalivaryGland': {'385294005': ('salivary gland', [7601, 9514, 7192, 4028, 7151])}, 'SalivaryGlandStructure': {'385294005': ('Salivary gland structure (body ' 'structure)', [])}, 'SalivaryGlands': {'385294005': ('Salivary Glands', [10060, 10044])}, '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', [12103, 3010, 4042, 9514, 7192, 7151, 3827, 4, 3630, 12110, 3607])}, 'SaphenopoplitealJunction': {'244415001': ('Saphenopopliteal junction', [12103, 9514, 7192, 7151, 3827, 12110])}, 'SaphenousVein': {'362072009': ('Saphenous vein', [12103, 3010, 4042, 9514, 7192, 7151, 3827, 4, 3630, 12110, 3607])}, 'SaphenousVeinStructure': {'362072009': ('Saphenous vein structure (body ' 'structure)', [])}, 'SarPlaninaSheepBreed': {'132783003': ('Sar Planina sheep breed', [7480])}, 'SarabiCattleBreed': {'133270006': ('Sarabi cattle breed', [7480])}, 'Sarcoma': {'2424003': ('Sarcoma', [639, 638])}, 'SarcomaNoInternationalClassificationOfDiseasesForOncologySubtype': {'2424003': ('Sarcoma, ' 'no ' 'International ' 'Classification ' 'of ' 'Diseases ' 'for ' 'Oncology ' 'subtype ' '(morphologic ' 'abnormality)', [])}, '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])}, 'ScalenousAnteriorMuscle': {'50755001': ('Scalenous anterior muscle', [6109, 6102, 6116, 9514, 7192, 7151])}, 'Scalp': {'41695006': ('Scalp', [9514, 7192, 7151, 4])}, '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', [1001, 1000, 1006])}, 'Scapula': {'79601000': ('Scapula', [4030, 6109, 4031, 1004, 6102, 6114, 1001, 4042, 1000, 9514, 7192, 7151, 4, 4009])}, 'Scar': {'12402003': ('Scar (morphologic abnormality)', [])}, 'ScarTissue': {'12402003': ('Scar tissue', [6040, 7191, 6031, 6102, 6138, 6030, 6403, 7151, 6202, 6203, 6405])}, 'ScatteredFibroglandularDensities': {'129717001': ('Scattered fibroglandular ' 'densities', [6001, 6000])}, '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', [4211, 9514, 7192, 7151, 4209, 4, 4029])}, 'ScleralStructure': {'18619003': ('Scleral structure (body structure)', [])}, 'SclerosingAdenosis': {'50916005': ('Sclerosing adenosis', [6031, 6030])}, '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', [6061, 4256, 6051, 6058])}, 'ScreeningIntent': {'360156006': ('Screening Intent', [3629])}, 'ScreeningProcedureIntent': {'360156006': ('Screening - procedure intent ' '(qualifier value)', [])}, 'Screw': {'68183006': ('Screw', [7309, 7307])}, 'ScrotalStructure': {'20233005': ('Scrotal structure (body structure)', [])}, 'Scrotum': {'20233005': ('Scrotum', [9514, 7192, 7151, 4])}, 'ScrubNurse': {'415506007': ('Scrub nurse', [7450, 7452])}, 'SealyhamTerrier': {'34752004': ('Sealyham terrier', [7480])}, 'SebaceousCystOfSkinOfBreast': {'76649007': ('Sebaceous cyst of skin of ' 'breast', [6064, 6054])}, 'SecondDegreeAtrioventricularBlock': {'195042002': ('Second degree ' 'Atrioventricular block', [3230])}, 'SecondLumbarArtery': {'397408004': ('Second Lumbar Artery', [12113, 12103, 9514, 7192, 7151, 3827])}, '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)', [])}, '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])}, 'Sedative': {'372614000': ('Sedative', [76])}, 'SeferihisarCattleBreed': {'133482000': ('Seferihisar cattle breed', [7480])}, 'SegmentOfLung': {'72674008': ('Segment of lung', [6109, 6102, 9514, 7192, 7151, 6110])}, 'Segmental': {'62372003': ('Segmental', [6128])}, 'SegmentalArtery': {'120234003': ('Segmental Artery', [12103, 12115, 9514, 7192, 7151, 3827])}, 'SegmentalCalcificationDistribution': {'129768003': ('Segmental calcification ' 'distribution', [6013, 6012])}, 'SegmentalLymphNodeOfTheLung': {'127921007': ('segmental lymph node of the ' 'lung', [7600])}, 'SegmentectomyBreastSample': {'309547008': ('segmentectomy breast sample', [8104, 8103])}, 'SelectiveEmbolizationOfArtery': {'57238002': ('Selective embolization of ' 'artery', [3405, 9])}, 'SelectiveFetalReduction': {'133874006': ('Selective fetal reduction ' '(procedure)', [])}, 'Selenium75HCAT': {'13626001': ('Selenium^75^ HCAT', [25])}, 'Selenium75HomocholicAcidTaurine': {'13626001': ('Selenium^75^-homocholic ' 'acid taurine (substance)', [])}, 'SelenomethionineSe75': {'88473009': ('Selenomethionine Se^75^ (substance)', [])}, 'SelenomethionioneSe75': {'88473009': ('Selenomethionione Se^75^', [25])}, 'SelkirkRexCatBreed': {'132676003': ('Selkirk Rex cat breed', [7480])}, 'SellaTurcica': {'42575006': ('Sella turcica', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, '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', [6204, 9514, 7160, 7192, 7151, 6202])}, '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)', [9300, 60])}, 'SentinelLymphNodeBiopsy': {'396487001': ('Sentinel lymph node biopsy', [6083, 6050])}, 'SeptalArtery': {'244251006': ('Septal Artery', [12292])}, 'SerereCattleBreed': {'131522005': ('Serere cattle breed', [7480])}, 'Seroma': {'56021002': ('Seroma', [6031, 6030])}, 'SerpentinaGoatBreed': {'131627006': ('Serpentina goat breed', [7480])}, 'SerpentineAneurysm': {'70984001': ('serpentine aneurysm', [3808])}, 'SerranaGoatBreed': {'131628001': ('Serrana goat breed', [7480])}, 'SerratusAnteriorMuscle': {'18346003': ('Serratus anterior muscle', [6109, 6102, 6116, 9514, 7192, 7151])}, 'SesamoidBonesOfFoot': {'58742003': ('Sesamoid bones of foot', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'SeshagaCattleBreed': {'131523000': ('Seshaga cattle breed', [7480])}, 'Sessile': {'5712003': ('Sessile', [6209])}, 'Settegast': {'399243009': ('Settegast', [4012])}, 'SettegastProjection': {'399243009': ('Settegast projection (qualifier value)', [])}, 'Setter': {'37453003': ('Setter', [7480])}, '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', [624, 623])}, 'ShaftOfFemur': {'41111004': ('Shaft of Femur', [7304])}, 'ShaftOfHumerus': {'20760004': ('Shaft of Humerus', [7304])}, 'ShaftOfRadius': {'47728000': ('Shaft of Radius', [7304])}, 'ShaftOfRib': {'41601005': ('Shaft of rib', [6115])}, 'ShaftOfTibia': {'52687003': ('Shaft of Tibia', [7304])}, 'ShaftOfUlna': {'21133008': ('Shaft of Ulna', [7304])}, 'ShagyaHorseBreed': {'133152002': ('Shagya horse breed', [7480])}, 'ShahutouPigBreed': {'132320004': ('Shahutou pig breed', [7480])}, 'ShakhansurriCattleBreed': {'133761007': ('Shakhansurri cattle breed', [7480])}, 'Shaking': {'26079004': ('Shaking', [9300, 60])}, 'ShallowBreathing': {'386616007': ('shallow breathing', [3823])}, 'ShanHorseBreed': {'133081003': ('Shan horse breed', [7480])}, 'ShanghaiWhitePigBreed': {'132322007': ('Shanghai White pig breed', [7480])}, 'ShanxiBlackPigBreed': {'132335003': ('Shanxi Black pig breed', [7480])}, 'Shape': {'300842002': ('Shape (attribute)', [])}, 'ShapeFinding': {'107644003': ('Shape finding (qualifier value)', [])}, 'SharPeiDogBreed': {'132589002': ('Shar-pei dog breed', [7480])}, 'SharabiCattleBreed': {'133271005': ('Sharabi cattle breed', [7480])}, 'Sheath': {'268461001': ('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', [10066, 9517, 9520])}, '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, 7470, 6165, 502, 218, 501, 27, 6166, 26, 7469])}, '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', [4030, 4031, 7304, 7483, 7482, 4040, 4042, 9514, 7192, 7151, 4, 4009])}, 'ShoulderGirdleStructure': {'26444007': ('Shoulder girdle structure (body ' 'structure)', [])}, 'ShoulderRegionStructure': {'16982005': ('Shoulder region structure', [1004, 1001, 1000])}, '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', [6210, 4040, 9514, 7192, 7151, 4])}, 'SigmoidColonStructure': {'60184004': ('Sigmoid colon structure (body ' 'structure)', [])}, 'SigmoidLymphNode': {'30024008': ('sigmoid lymph node', [7600])}, '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])}, 'SiliconeGelImplant': {'257357007': ('Silicone gel implant', [6058, 6059])}, 'SiliconeOil': {'247095003': ('Silicone Oil', [4232])}, 'SilkyTerrier': {'39882003': ('Silky terrier', [7480])}, 'Silver': {'41967008': ('Silver', [300])}, 'SilverANDORSilverCompound': {'105847008': ('Silver AND/OR silver compound ' '(substance)', [])}, 'SilverNitrateStain': {'406985001': ('silver nitrate stain', [8112])}, 'SilverOrSilverCompound': {'105847008': ('Silver or Silver compound', [10006, 10067])}, '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])}, '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)', [])}, 'SixthLumbarArtery': {'397412005': ('Sixth Lumbar Artery', [12113, 12103, 9514, 7192, 7151, 3827])}, 'SkeletalAndOrSmoothMuscleStructure': {'71616004': ('Skeletal and/or smooth ' 'muscle structure (body ' 'structure)', [])}, 'SkeletalMuscle': {'127954009': ('Skeletal muscle', [7710])}, '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', [7191, 10060, 7151, 7166, 10044, 4029])}, 'SkinConditionAssessment': {'364528001': ('Skin condition assessment', [3441])}, 'SkinLesion': {'95324001': ('Skin lesion', [6056, 6016, 6015, 6054, 6014])}, 'SkinObservable': {'364528001': ('Skin observable (observable entity)', [])}, 'SkinOfAbdomen': {'75093004': ('Skin of abdomen', [7154, 9514, 7192, 7151, 4029])}, 'SkinOfAlaNasi': {'68598004': ('Skin of ala nasi', [4029])}, 'SkinOfAntecubitalFossa': {'17957002': ('Skin of antecubital fossa', [4029])}, 'SkinOfAnteriorPortionOfNeck': {'11584001': ('Skin of anterior portion of ' 'neck', [4029])}, 'SkinOfAnteriorSurfaceOfForearm': {'70559009': ('Skin of anterior surface of ' 'forearm', [4029])}, 'SkinOfAnteriorSurfaceOfKnee': {'181553006': ('Skin of anterior surface of ' 'knee', [4029])}, 'SkinOfAnteriorSurfaceOfLowerLeg': {'25763004': ('Skin of anterior surface of ' 'lower leg', [4029])}, 'SkinOfAnteriorSurfaceOfThigh': {'61248009': ('Skin of anterior surface of ' 'thigh', [4029])}, 'SkinOfAnteriorSurfaceOfThorax': {'244106003': ('Skin of anterior surface of ' 'thorax', [4029])}, 'SkinOfAnteriorSurfaceOfUpperArm': {'45981001': ('Skin of anterior surface of ' 'upper arm', [4029])}, 'SkinOfAnteriorTrunk': {'181491009': ('Skin of anterior trunk', [4029])}, 'SkinOfAntitragus': {'38407007': ('Skin of antitragus', [4029])}, 'SkinOfAnus': {'59112000': ('Skin of anus', [4029])}, 'SkinOfAreola': {'72005009': ('Skin of areola', [4029])}, 'SkinOfAxilla': {'699891005': ('Skin of axilla', [4029])}, 'SkinOfBack': {'66643007': ('Skin of back', [4029])}, 'SkinOfBackOfUpperThoracicRegion': {'699893008': ('Skin of back of upper ' 'thoracic region', [4029])}, 'SkinOfButtock': {'22180002': ('Skin of buttock', [4029])}, 'SkinOfCavityOfConcha': {'51098001': ('Skin of cavity of concha', [4029])}, 'SkinOfCheek': {'36141000': ('Skin of cheek', [4029])}, 'SkinOfChest': {'74160004': ('Skin of chest', [7155, 9514, 7192, 7151])}, 'SkinOfChin': {'23747009': ('Skin of chin', [4029])}, 'SkinOfClitoris': {'29353003': ('Skin of clitoris', [4029])}, 'SkinOfCrusOfHelix': {'57726007': ('Skin of crus of helix', [4029])}, 'SkinOfDigitOfHand': {'244169007': ('Skin of digit of hand', [4029])}, 'SkinOfDorsalAreaOfWrist': {'52876008': ('Skin of dorsal area of wrist', [4029])}, 'SkinOfEar': {'1902009': ('Skin of ear', [4029])}, 'SkinOfEarLobule': {'2059009': ('Skin of ear lobule', [4029])}, 'SkinOfEpigastricArea': {'30598005': ('Skin of epigastric area', [4029])}, 'SkinOfExternalAuditoryCanal': {'86409001': ('Skin of external auditory canal', [4029])}, 'SkinOfExternalGenitalia': {'60944009': ('Skin of external genitalia', [4029])}, 'SkinOfEyeRegion': {'362916000': ('Skin of eye region', [4029])}, 'SkinOfEyebrow': {'367577003': ('Skin of eyebrow', [4029])}, 'SkinOfFace': {'73897004': ('Skin of face', [4029])}, 'SkinOfFoot': {'60496002': ('Skin of foot', [4029])}, 'SkinOfForehead': {'68698007': ('Skin of forehead', [4029])}, 'SkinOfGlansPenis': {'7991003': ('Skin of glans penis', [4029])}, 'SkinOfGlutealFold': {'63029009': ('Skin of gluteal fold', [4029])}, 'SkinOfHand': {'33712006': ('Skin of hand', [4029])}, 'SkinOfHead': {'70762009': ('Skin of head', [4029])}, 'SkinOfHeel': {'84607009': ('Skin of heel', [4029])}, 'SkinOfHelixOfEar': {'79313003': ('Skin of helix of ear', [4029])}, 'SkinOfHypogastricRegion': {'367578008': ('Skin of hypogastric region', [4029])}, 'SkinOfHypothenarRegionOfPalm': {'89784008': ('Skin of hypothenar region of ' 'palm', [4029])}, 'SkinOfInfraclavicularRegion': {'66288003': ('Skin of infraclavicular region', [4029])}, 'SkinOfInguinalRegion': {'39687006': ('Skin of inguinal region', [4029])}, 'SkinOfIntertragalIncisure': {'45591000': ('Skin of intertragal incisure', [4029])}, 'SkinOfJawline': {'244097004': ('Skin of jawline', [4029])}, 'SkinOfLabium': {'73058008': ('Skin of labium', [4029])}, 'SkinOfLabiumMajus': {'128252004': ('Skin of labium majus', [4029])}, 'SkinOfLabiumMinus': {'128253009': ('Skin of labium minus', [4029])}, 'SkinOfLateralAspectOfAnkle': {'181564009': ('Skin of lateral aspect of ankle', [4029])}, 'SkinOfLateralBorderOfSoleOfFoot': {'35739000': ('Skin of lateral border of ' 'sole of foot', [4029])}, 'SkinOfLateralCanthus': {'37671003': ('Skin of lateral canthus', [4029])}, 'SkinOfLateralPartOfHeel': {'699909001': ('Skin of lateral part of heel', [4029])}, 'SkinOfLateralPortionOfNeck': {'5272005': ('Skin of lateral portion of neck', [4029])}, 'SkinOfLips': {'88089004': ('Skin of lips', [4029])}, 'SkinOfLowerAbdomen': {'699914002': ('Skin of lower abdomen', [4029])}, 'SkinOfLowerBack': {'113182001': ('Skin of lower back', [4029])}, 'SkinOfLowerChestWall': {'699915001': ('Skin of lower chest wall', [4029])}, 'SkinOfLowerExtremity': {'371304004': ('Skin of lower extremity', [4029])}, 'SkinOfLowerEyelid': {'40069000': ('Skin of lower eyelid', [4029])}, 'SkinOfLowerLip': {'66934001': ('Skin of lower lip', [4029])}, 'SkinOfMedialAspectOfAnkle': {'181563003': ('Skin of medial aspect of ankle', [4029])}, 'SkinOfMedialBorderOfSoleOfFoot': {'52953006': ('Skin of medial border of ' 'sole of foot', [4029])}, 'SkinOfMedialCanthus': {'27887005': ('Skin of medial canthus', [4029])}, 'SkinOfMedialPartOfHeel': {'699919007': ('Skin of medial part of heel', [4029])}, 'SkinOfMedialSurfaceOfThigh': {'73958006': ('Skin of medial surface of thigh', [4029])}, 'SkinOfNasolabialFold': {'37108007': ('Skin of nasolabial fold', [4029])}, 'SkinOfNeck': {'43081002': ('Skin of neck', [4029])}, 'SkinOfNipple': {'54468004': ('Skin of nipple', [4029])}, 'SkinOfNose': {'113179006': ('Skin of nose', [4029])}, 'SkinOfNuchalRegion': {'4658004': ('Skin of nuchal region', [4029])}, 'SkinOfOccipitalRegion': {'79951008': ('Skin of occipital region', [4029])}, 'SkinOfPalmOfHand': {'70887009': ('Skin of palm of hand', [4029])}, 'SkinOfPalmarAreaOfWrist': {'24527008': ('Skin of palmar area of wrist', [4029])}, 'SkinOfParietalRegion': {'21672008': ('Skin of parietal region', [4029])}, 'SkinOfPartOfDorsalSurfaceOfHand': {'281642007': ('Skin of part of dorsal ' 'surface of hand', [4029])}, 'SkinOfPenis': {'35900000': ('Skin of penis', [4029])}, 'SkinOfPerineum': {'48014002': ('Skin of perineum', [4029])}, 'SkinOfPerioralRegionOfFace': {'110488009': ('Skin of perioral region of face', [4029])}, 'SkinOfPhiltrum': {'84365009': ('Skin of philtrum', [4029])}, 'SkinOfPoplitealFossa': {'84507004': ('Skin of popliteal fossa', [4029])}, 'SkinOfPostauricularRegion': {'24483006': ('Skin of postauricular region', [4029])}, 'SkinOfPosteriorSurfaceOfElbow': {'181536004': ('Skin of posterior surface of ' 'elbow', [4029])}, 'SkinOfPosteriorSurfaceOfForearm': {'41550009': ('Skin of posterior surface ' 'of forearm', [4029])}, 'SkinOfPosteriorSurfaceOfLowerLeg': {'47224004': ('Skin of posterior surface ' 'of lower leg', [4029])}, 'SkinOfPosteriorSurfaceOfThigh': {'4578000': ('Skin of posterior surface of ' 'thigh', [4029])}, 'SkinOfPosteriorSurfaceOfThorax': {'244111001': ('Skin of posterior surface ' 'of thorax', [4029])}, 'SkinOfPosteriorSurfaceOfUpperArm': {'72939005': ('Skin of posterior surface ' 'of upper arm', [4029])}, 'SkinOfPreauricularRegion': {'86719006': ('Skin of preauricular region', [4029])}, 'SkinOfPrepuceOfClitoris': {'76723005': ('Skin of prepuce of clitoris', [4029])}, 'SkinOfRootOfPenis': {'244117002': ('Skin of root of penis', [4029])}, 'SkinOfScalp': {'43067004': ('Skin of scalp', [4029])}, 'SkinOfScrotum': {'81992007': ('Skin of scrotum', [4029])}, 'SkinOfShaftOfPenis': {'244118007': ('Skin of shaft of penis', [4029])}, 'SkinOfSideOfNose': {'244089006': ('Skin of side of nose', [4029])}, 'SkinOfSubmentalArea': {'34926004': ('Skin of submental area', [4029])}, 'SkinOfSupraclavicularRegionOfNeck': {'76072005': ('Skin of supraclavicular ' 'region of neck', [4029])}, 'SkinOfSupraorbitalArea': {'48670002': ('Skin of supraorbital area', [4029])}, 'SkinOfTemporalRegion': {'16621002': ('Skin of temporal region', [4029])}, 'SkinOfThenarRegionOfPalm': {'26795005': ('Skin of thenar region of palm', [4029])}, 'SkinOfTipOfNose': {'79283007': ('Skin of tip of nose', [4029])}, 'SkinOfToe': {'52034004': ('Skin of toe', [4029])}, 'SkinOfTragus': {'79502000': ('Skin of tragus', [4029])}, 'SkinOfUmbilicus': {'315003': ('Skin of umbilicus', [4029])}, 'SkinOfUpperAbdomen': {'699935000': ('Skin of upper abdomen', [4029])}, 'SkinOfUpperExtremity': {'371311000': ('Skin of upper extremity', [4029])}, 'SkinOfUpperEyelid': {'41310005': ('Skin of upper eyelid', [4029])}, 'SkinOfUpperLip': {'16251004': ('Skin of upper lip', [4029])}, 'SkinOfUpperTrunk': {'54440003': ('Skin of upper trunk', [4029])}, 'SkinOfVertexOfScalp': {'61719002': ('Skin of vertex of scalp', [4029])}, 'SkinRetractionOfBreast': {'129796009': ('Skin retraction of breast', [6056, 6016, 6015, 6054, 6055, 6014])}, 'SkinStructure': {'39937001': ('Skin structure (body structure)', [])}, 'SkinStructureOfAbdomen': {'75093004': ('Skin structure of abdomen (body ' 'structure)', [])}, 'SkinStructureOfChest': {'74160004': ('Skin structure of chest (body ' 'structure)', [])}, 'SkinThickeningOfBreast': {'129797000': ('Skin thickening of breast', [6056, 6016, 6015, 6054, 6055, 6014])}, 'SkuddeSheepBreed': {'131799006': ('Skudde sheep breed', [7480])}, 'Skull': {'89546000': ('Skull', [4030, 12020, 4031, 7304, 7483, 7482, 1002, 1001, 4042, 1000, 9514, 7192, 4028, 7151, 4, 4009])}, 'SkyeTerrier': {'24299002': ('Skye terrier', [7480])}, 'SkyrosHorseBreed': {'133084006': ('Skyros horse breed', [7480])}, 'SkyrosPonyBreed': {'423926000': ('Skyros pony breed (organism)', [])}, 'SkyrosPonyHorseBreed': {'423926000': ('Skyros pony horse breed', [7480])}, 'Slide': {'258661006': ('Slide', [8103])}, 'SlideOverviewLens': {'445601002': ('Slide overview lens', [8121])}, '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', [6118, 252])}, 'SmallCardiacVein': {'49082002': ('Small Cardiac Vein', [3839, 9514, 7192, 7151, 3827])}, 'SmallCellCarcinoma': {'74364000': ('Small cell carcinoma', [639, 638])}, 'SmallEastAfricanZebuCattleBreed': {'133773007': ('Small East African Zebu ' 'cattle breed', [7480])}, 'SmallIntestinalStructure': {'30315005': ('Small intestinal structure (body ' 'structure)', [])}, 'SmallIntestine': {'30315005': ('Small intestine', [4030, 4031, 7154, 10060, 4042, 9514, 7192, 7151, 4, 4009, 10044])}, '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', [3839, 9514, 7192, 7151, 3827])}, '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])}, 'SodiumChromateCr51': {'62517004': ('Sodium chromate Cr^51^', [25])}, 'SodiumDiatrizoate': {'24891006': ('Sodium diatrizoate', [12, 3850])}, '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': {'129517003': ('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', [9514, 7192, 4028, 7151])}, 'SoftPalateStructure': {'49460000': ('Soft palate structure (body structure)', [])}, 'SokokeCatBreed': {'132679005': ('Sokoke cat breed', [7480])}, 'SokolkaHorseBreed': {'133086008': ('Sokolka horse breed', [7480])}, 'SokotoGudaliCattleBreed': {'133774001': ('Sokoto Gudali cattle breed', [7480])}, 'SolealVein': {'397427005': ('Soleal vein', [12103, 9514, 7192, 7151, 3827, 12110])}, '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])}, '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])}, 'SpatialAndRelationalConcepts': {'309825002': ('Spatial and relational ' 'concepts (qualifier value)', [])}, 'SpatialCollocationAnalysis': {'133884007': ('Spatial collocation analysis', [6137, 6043])}, 'SpatialProximityAnalysis': {'133885008': ('Spatial proximity analysis', [6137, 6043])}, 'SpecimenClearing': {'433452008': ('Specimen clearing', [8113])}, 'SpecimenCollection': {'17636008': ('Specimen collection', [8111, 8109, 3515])}, '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', [8104, 8103])}, 'SpecimenFromBreastObtainedByCoreNeedleBiopsy': {'122737001': ('specimen from ' 'breast ' 'obtained by ' 'core needle ' 'biopsy', [8104, 8103])}, 'SpecimenFromBreastObtainedByExcision': {'397199005': ('specimen from breast ' 'obtained by excision', [8104, 8103])}, 'SpecimenFromBreastObtainedByImageGuidedCoreBiopsy': {'373102004': ('specimen ' 'from ' 'breast ' 'obtained ' 'by image ' 'guided ' 'core ' 'biopsy', [8104, 8103])}, 'SpecimenFromBreastObtainedByIncisionalBiopsyOfBreastMass': {'122739003': ('Specimen ' 'from ' 'breast ' 'obtained ' 'by ' 'incisional ' 'biopsy ' 'of ' 'breast ' 'mass ' '(specimen)', [])}, 'SpecimenFromBreastObtainedByTotalMastectomy': {'122595009': ('specimen from ' 'breast ' 'obtained by ' 'total ' 'mastectomy', [8104, 8103])}, 'SpecimenFromBreastStereotacticallyGuidedCoreNeedleBiopsy': {'122738006': ('specimen ' 'from ' 'breast, ' 'stereotactically ' 'guided ' 'core ' 'needle ' 'biopsy', [8104, 8103])}, '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', [6083, 6050])}, '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', [9514, 7192, 4028, 7151])}, 'SphenoidBoneStructure': {'73117003': ('Sphenoid bone structure (body ' 'structure)', [])}, 'SphynxCatBreed': {'132680008': ('Sphynx cat breed', [7480])}, 'SpiculatedLesion': {'129742005': ('Spiculated lesion', [6007, 6006])}, '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', [7153, 9514, 7192, 7151])}, 'SpinalCord': {'2748008': ('Spinal cord', [7153, 9514, 7192, 7151, 4])}, 'SpinalCordGrayMatter': {'12958003': ('Spinal cord gray matter', [7153, 9514, 7192, 7151])}, 'SpinalCordGrayMatterStructure': {'12958003': ('Spinal cord gray matter ' 'structure (body structure)', [])}, 'SpinalCordStructure': {'2748008': ('Spinal cord structure (body structure)', [])}, 'SpinalCordWhiteMatter': {'27088001': ('Spinal cord white matter', [7153, 7710, 9514, 7192, 7151])}, 'SpinalCordWhiteMatterStructure': {'27088001': ('Spinal cord white matter ' 'structure (body structure)', [])}, 'SpinalisMuscle': {'4317002': ('Spinalis muscle', [6109, 6102, 6116, 9514, 7192, 7151])}, 'SpindleCellCarcinoma': {'65692009': ('Spindle cell carcinoma', [639, 638])}, 'SpindleCellNodule': {'110451006': ('Spindle cell nodule (tumor)', [6030, 6033])}, 'Spine': {'421060004': ('Spine', [4030, 6109, 4031, 6102, 6114, 4040, 4042, 9514, 7192, 7151, 4, 4009])}, 'SpinoneItalianoDogBreed': {'132638009': ('Spinone Italiano dog breed', [7480])}, 'SpinousProcessOfVertebra': {'55678000': ('Spinous process of vertebra', [6115])}, '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', [4030, 7154, 10060, 6204, 9514, 7192, 7151, 6202, 4, 10044])}, 'SplenicArtery': {'22083002': ('Splenic Artery', [12112, 12103, 3010, 4042, 9514, 7192, 7151, 3827, 4])}, 'SplenicFlexureOfColon': {'72592005': ('Splenic flexure of colon', [6210])}, 'SplenicLymphNode': {'280824006': ('splenic lymph node', [7600])}, 'SplenicStructure': {'78961009': ('Splenic structure (body structure)', [])}, 'SplenicVein': {'35819009': ('Splenic Vein', [12103, 12114, 3010, 4042, 9514, 7192, 7151, 3827, 4, 3630, 3607])}, 'SpleniumOfCorpusCallosum': {'23347006': ('splenium of corpus callosum', [7705, 7710])}, 'SporeStain': {'255811001': ('spore stain', [8112])}, 'SpotCompression': {'399055006': ('Spot compression', [6029, 4015, 6028])}, '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': {'28899001': ('Squamous cell carcinoma', [6030, 6033, 639, 638])}, 'SquamousCellCarcinomaNoInternationalClassificationOfDiseasesForOncologySubtype': {'28899001': ('Squamous ' 'cell ' 'carcinoma, ' 'no ' 'International ' 'Classification ' 'of ' 'Diseases ' 'for ' 'Oncology ' 'subtype ' '(morphologic ' 'abnormality)', [])}, 'StBernardDog': {'83236005': ('St. Bernard dog', [7480])}, 'StCroixSheepBreed': {'132795003': ('St. Croix sheep breed', [7480])}, 'StableAngina': {'233819005': ('Stable Angina', [3700, 3202, 3220])}, '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])}, '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])}, '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, 6401, 6138, 6404, 7151, 6202, 6203, 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', [3813, 3810]), '44241007': ('Stenosis', [3711])}, 'Stenotic': {'386139002': ('Stenotic', [3712])}, 'StenoticCoronaryArtery': {'386139002': ('Stenotic coronary artery (finding)', [])}, 'StenoticLesionLength': {'408716009': ('Stenotic Lesion Length', [3483])}, 'Stent': {'65818007': ('Stent', [4051, 3429, 3496, 7157, 3411, 7151, 8, 3810, 7111, 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', [3405, 9])}, '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])}, 'SternalSkin': {'244107007': ('Sternal skin', [4029])}, 'SternoclavicularJoint': {'7844006': ('Sternoclavicular joint', [4030, 4031, 1004, 1001, 4042, 1000, 9514, 7192, 7151, 4, 4009])}, 'SternoclavicularJointStructure': {'7844006': ('Sternoclavicular joint ' 'structure (body structure)', [])}, 'SternocleidomastoidMuscle': {'22823000': ('Sternocleidomastoid muscle', [6109, 6102, 6116, 9514, 7192, 7151])}, 'Sternum': {'56873002': ('Sternum', [4030, 6109, 4031, 1004, 7155, 6102, 6114, 1001, 4042, 1000, 9514, 7192, 7151, 4, 4009])}, 'Steroid': {'116566001': ('Steroid', [621, 622])}, 'Stiffle': {'116010006': ('Stiffle', [7483, 7482])}, 'StifleJoint': {'116010006': ('Stifle joint (body structure)', [])}, 'Stomach': {'69695003': ('Stomach', [4030, 4031, 10060, 4042, 9514, 7192, 7151, 4, 4009, 10044])}, '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])}, 'StreptokinaseAgent': {'20847002': ('Streptokinase agent (substance)', [])}, 'StreptokinasePreparation': {'20847002': ('Streptokinase preparation', [10])}, 'StressTestUsingBicycleErgometer': {'26046004': ('Stress test using Bicycle ' 'Ergometer', [12001, 3261])}, 'StressTestUsingCardiacPacing': {'428685003': ('Stress test using cardiac ' 'pacing', [12001, 3757, 3261])}, 'StressThalliumProcedure': {'431511008': ('Stress thallium procedure', [3110])}, 'Stroke': {'309966001': ('Stroke', [7030])}, 'StrokeIndex': {'277381004': ('Stroke Index', [12200, 12257, 12271, 12267, 12207, 12266, 12270, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12239])}, 'StrokeUnit': {'309966001': ('Stroke unit (environment)', [])}, 'StrokeVolume': {'90096001': ('Stroke Volume', [12304, 12200, 12257, 12271, 12267, 3835, 12207, 12266, 12270, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12239])}, 'StrongWoolMerinoSheepBreed': {'132720002': ('Strong Wool Merino sheep breed', [7480])}, 'StrontiumChlorideSr85': {'69076006': ('Strontium chloride Sr^85^', [25])}, 'StrontiumChlorideSr87': {'38424001': ('Strontium chloride Sr^87^', [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)', [])}, 'StructureOfAcromion': {'31934006': ('Structure of acromion (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)', [])}, '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)', [])}, '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': ('Structure of descending ' 'thoracic aorta (body ' 'structure)', [])}, '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)', [])}, '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)', [])}, 'StructureOfFacialArtery': {'23074001': ('Structure of facial artery (body ' 'structure)', [])}, 'StructureOfFacialLymphNode': {'48918001': ('Structure of facial lymph node ' '(body structure)', [])}, 'StructureOfFemoralArtery': {'7657000': ('Structure of femoral artery (body ' 'structure)', [])}, 'StructureOfFibularLymphNode': {'31171007': ('Structure of fibular lymph node ' '(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)', [])}, '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)', [])}, '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)', [])}, '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)', [])}, '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)', [])}, '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)', [])}, '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)', [])}, '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)', [])}, '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)', [])}, '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)', [])}, '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)', [])}, 'StructureOfPeronealArtery': {'8821006': ('Structure of peroneal artery (body ' 'structure)', [])}, 'StructureOfPeronealVein': {'71758008': ('Structure of peroneal vein (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)', [])}, '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)', [])}, '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)', [])}, 'StructureOfPulmonaryVeinGreatVessel': {'430757002': ('Structure of pulmonary ' 'vein great vessel ' '(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)', [])}, '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)', [])}, '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)', [])}, '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)', [])}, '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)', [])}, 'StructureOfSubmaxillaryLymphNode': {'144127009': ('Structure of submaxillary ' '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)', [])}, '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)', [])}, '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)', [])}, '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])}, 'SubarachnoidSpace': {'35951006': ('Subarachnoid space', [7153, 9514, 7192, 7151])}, 'SubarachnoidSpaceStructure': {'35951006': ('Subarachnoid space structure ' '(body structure)', [])}, 'SubareolarPositionOnMammogram': {'129784002': ('Subareolar position on ' 'mammogram (finding)', [])}, 'SubareolarRegion': {'129784002': ('Subareolar region', [6019, 6018])}, 'Subcapsular': {'61397002': ('Subcapsular', [2])}, 'SubcarinalLymphNode': {'28330007': ('subcarinal lymph node', [7600])}, 'SubclavianArtery': {'36765005': ('Subclavian Artery', [3604, 6109, 12104, 12103, 6102, 6117, 3010, 4042, 9514, 7192, 3606, 7151, 12107, 3827, 4, 3630])}, 'SubclavianLymphNode': {'421861001': ('subclavian lymph node', [7600])}, 'SubclavianVein': {'9454009': ('Subclavian vein', [6109, 12108, 12103, 6102, 6117, 3010, 4042, 9514, 7192, 7151, 3827, 4, 3630, 3607])}, 'Subcostal': {'19695001': ('Subcostal', [9514, 7192, 7151, 4])}, 'SubcostalLongAxis': {'399310008': ('Subcostal long axis', [12226, 501])}, 'SubcostalLongAxisView': {'399310008': ('Subcostal long axis view (qualifier ' 'value)', [])}, 'SubcostalMuscle': {'64658001': ('Subcostal muscle', [6109, 6102, 6116, 9514, 7192, 7151])}, 'SubcostalObliqueCoronalView': {'443640005': ('Subcostal oblique coronal view', [12226, 501])}, 'SubcostalShortAxis': {'399200001': ('Subcostal short axis', [12226, 501])}, 'SubcostalShortAxisView': {'399200001': ('Subcostal short axis view ' '(qualifier value)', [])}, 'SubcostalShortAxisViewAtAorticValveLevel': {'443609003': ('Subcostal short ' 'axis view at ' 'aortic valve ' 'level', [12226, 501])}, 'SubcostalShortAxisViewAtMitralValveLevel': {'443499004': ('Subcostal short ' 'axis view at ' 'mitral valve ' 'level', [12226, 501])}, 'SubcostalShortAxisViewAtPapillaryMuscleLevel': {'443160001': ('Subcostal ' 'short axis ' 'view at ' 'papillary ' 'muscle level', [12226, 501])}, 'SubcostalShortAxisViewAtVenousInflowLevel': {'443500008': ('Subcostal short ' 'axis view at ' 'venous inflow ' 'level', [12226, 501])}, 'SubcostalViewOfCardiacOutletsDirectedAnteriorly': {'443100003': ('Subcostal ' 'view of ' 'cardiac ' 'outlets ' 'directed ' 'anteriorly', [12226, 501])}, 'SubcutaneousRoute': {'34206005': ('Subcutaneous route', [11])}, 'SubcutaneousTissue': {'71966008': ('Subcutaneous tissue', [5])}, 'SubcutaneousTissueStructure': {'71966008': ('Subcutaneous tissue structure ' '(body structure)', [])}, 'SubdiaphragmaticTracerUptake': {'429382003': ('Subdiaphragmatic tracer ' 'uptake (finding)', [])}, 'SubdiaphragmaticUptake': {'429382003': ('Subdiaphragmatic uptake', [3115])}, 'SubfamilyBovinae': {'107007004': ('Subfamily Bovinae (organism)', [])}, 'SubiliacLymphNode': {'113338001': ('subiliac lymph node', [7600])}, 'SubjectRelationshipContext': {'408732007': ('Subject relationship context ' '(attribute)', [])}, 'SubmandibularArea': {'5713008': ('Submandibular area', [9514, 7192, 7151, 4])}, 'SubmandibularGland': {'54019009': ('Submandibular gland', [4030, 4031, 4042, 9514, 7192, 4028, 7151, 4, 4009])}, 'SubmandibularLymphNode': {'59503006': ('submandibular lymph node', [7600])}, 'SubmandibularSalivaryApparatus': {'54019009': ('Submandibular salivary ' 'apparatus (body structure)', [])}, 'SubmandibularTriangle': {'5713008': ('Submandibular triangle', [4029])}, 'SubmandibularTriangleStructure': {'5713008': ('Submandibular triangle ' 'structure (body structure)', [])}, 'SubmaxillaryLymphNode': {'144127009': ('submaxillary lymph node', [7600])}, 'Submental': {'170887008': ('Submental', [9514, 7192, 7151, 4])}, 'SubmentalLymphNode': {'46055009': ('submental lymph node', [7600])}, 'SubmentalTriangleStructure': {'170887008': ('Submental triangle structure ' '(body structure)', [])}, 'Submentovertical': {'399255003': ('submentovertical', [4010, 501])}, 'SubmentoverticalProjection': {'399255003': ('Submentovertical projection ' '(qualifier value)', [])}, 'SuboticaWhitePigBreed': {'133212006': ('Subotica White pig breed', [7480])}, 'SubpyloricLymphNode': {'280314006': ('subpyloric lymph node', [7600])}, 'SubscapularAxillaryLymphNode': {'12196003': ('subscapular axillary lymph ' 'node', [7600])}, 'SubscapularisMuscle': {'90588001': ('Subscapularis muscle', [6109, 6102, 6116, 9514, 7192, 7151])}, 'SubscapularisMuscleStructure': {'90588001': ('Subscapularis muscle structure ' '(body structure)', [])}, 'SubsegmentalLymphNodeOfTheLung': {'127922000': ('subsegmental lymph node of ' 'the lung', [7600])}, 'Substance': {'105590001': ('Substance', [7150])}, 'SubstantiaNigra': {'70007007': ('Substantia nigra', [7153, 9514, 7192, 7151])}, 'SubstantiaNigraStructure': {'70007007': ('Substantia nigra structure (body ' 'structure)', [])}, 'Subxiphoid': {'5076001': ('Subxiphoid', [9514, 7192, 7151, 4])}, 'Succinylcholine': {'372724004': ('Succinylcholine', [627, 623])}, '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])}, '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])}, 'SuperficialCervicalLymphNode': {'279144003': ('superficial cervical lymph ' 'node', [7600])}, 'SuperficialFemoralArtery': {'181349008': ('Superficial Femoral Artery', [3604, 12109, 12103, 3010, 4042, 9514, 7192, 3606, 7151, 3827, 4, 3630])}, 'SuperficialFemoralVein': {'397364003': ('Superficial Femoral Vein', [12103, 9514, 7192, 7151, 3827, 12110])}, 'SuperficialFemoralVeinStructure': {'397364003': ('Superficial femoral vein ' 'structure (body structure)', [])}, 'SuperficialInguinalLymphNode': {'113340006': ('superficial inguinal lymph ' 'node', [7600])}, 'SuperficialIntraparotidLymphNode': {'68339009': ('superficial intraparotid ' 'lymph node', [7600])}, 'SuperficialLateralCervicalLymphNode': {'167965000': ('superficial lateral ' 'cervical lymph node', [7600])}, 'SuperficialLymphNode': {'90606007': ('superficial lymph node', [7600])}, 'SuperficialPalmarArch': {'26818002': ('Superficial Palmar Arch', [12103, 9514, 7192, 7151, 12107, 3827])}, 'SuperficialPalmarArchStructure': {'26818002': ('Superficial palmar arch ' 'structure (body structure)', [])}, 'SuperficialPalmarVenousArch': {'368479001': ('Superficial Palmar Venous Arch', [12108, 12103, 9514, 7192, 7151, 3827])}, 'SuperficialParotidLymphNode': {'279141006': ('superficial parotid lymph node', [7600])}, 'SuperficialPoplitealLymphNode': {'12728001': ('superficial popliteal lymph ' 'node', [7600])}, 'SuperficialTemporalArtery': {'15672000': ('superficial temporal artery', [3604, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'SuperfineMerinoSheepBreed': {'132724006': ('Superfine Merino sheep breed', [7480])}, 'Superior': {'264217000': ('Superior', [3019, 211, 2, 12117, 6065, 212, 5, 4005])}, 'SuperiorArticularFacetOfAxis': {'181900008': ('Superior articular facet of ' 'axis', [6115])}, 'SuperiorArticularProcessOfVertebra': {'317665004': ('Superior articular ' 'process of vertebra', [6115])}, 'SuperiorCerebellarPeduncle': {'11089000': ('Superior cerebellar peduncle', [7153, 7710, 9514, 7192, 7151, 7701])}, 'SuperiorFrontoOccipitalFasciculus': {'13958008': ('superior fronto-occipital ' 'fasciculus', [7703, 7710])}, 'SuperiorGlutealLymphNode': {'76290003': ('superior gluteal lymph node', [7600])}, 'SuperiorLateralInguinalLymphNode': {'76704003': ('superior lateral inguinal ' 'lymph node', [7600])}, 'SuperiorLeftPulmonaryVein': {'43863001': ('Superior left pulmonary vein', [3010, 3840, 4042, 3011, 9514, 7192, 7151, 3827, 4])}, 'SuperiorLongitudinalFasciculus': {'89202009': ('Superior longitudinal ' 'fasciculus', [7153, 9514, 7192, 7151])}, 'SuperiorMedialInguinalLymphNode': {'52554005': ('superior medial inguinal ' 'lymph node', [7600])}, 'SuperiorMediastinalLymphNode': {'127925003': ('superior mediastinal lymph ' 'node', [7600])}, 'SuperiorMesentericArtery': {'42258001': ('Superior Mesenteric Artery', [12112, 12103, 3010, 4042, 9514, 7192, 7151, 3827, 4])}, 'SuperiorMesentericArteryStructure': {'42258001': ('Superior mesenteric ' 'artery structure (body ' 'structure)', [])}, 'SuperiorMesentericLymphNode': {'49394004': ('superior mesenteric lymph node', [7600])}, 'SuperiorMesentericVein': {'90771006': ('Superior Mesenteric Vein', [12103, 12114, 9514, 7192, 7151, 3827])}, 'SuperiorPancreaticLymphNode': {'280999005': ('superior pancreatic lymph node', [7600])}, 'SuperiorPancreaticoduodenalLymphNode': {'281320004': ('superior ' 'pancreaticoduodenal ' 'lymph node', [7600])}, 'SuperiorPhrenicArtery': {'38991005': ('Superior phrenic artery', [6109, 6102, 6117, 9514, 7192, 7151])}, 'SuperiorRectalLymphNode': {'68881005': ('superior rectal lymph node', [7600])}, 'SuperiorRightPulmonaryVein': {'8629005': ('Superior right pulmonary vein', [3010, 3840, 4042, 3011, 9514, 7192, 7151, 3827, 4])}, 'SuperiorRollingOfBreast': {'415670009': ('Superior rolling of breast ' '(procedure)', [])}, 'SuperiorThyroidArtery': {'72021004': ('superior thyroid artery', [3604, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'SuperiorTracheobronchialLymphNode': {'67941004': ('superior tracheobronchial ' 'lymph node', [7600])}, 'SuperiorVenaCava': {'48345005': ('Superior Vena Cava', [12282, 6109, 12108, 12103, 6102, 6117, 3010, 4042, 9514, 7192, 7151, 3827, 4, 3630, 3607])}, 'SuperiorVenaCavaStructure': {'48345005': ('Superior vena cava structure ' '(body structure)', [])}, 'SupernumeraryDeciduousMandibularLeftCanineTooth': {'707029006': ('Supernumerary ' 'deciduous ' 'mandibular ' 'left ' 'canine ' 'tooth', [4026, 4025])}, 'SupernumeraryDeciduousMandibularLeftCentralIncisorTooth': {'707026004': ('Supernumerary ' 'deciduous ' 'mandibular ' 'left ' 'central ' 'incisor ' 'tooth', [4026, 4025])}, 'SupernumeraryDeciduousMandibularLeftFirstMolarTooth': {'707030001': ('Supernumerary ' 'deciduous ' 'mandibular ' 'left ' 'first ' 'molar ' 'tooth', [4026, 4025])}, 'SupernumeraryDeciduousMandibularLeftLateralIncisorTooth': {'707028003': ('Supernumerary ' 'deciduous ' 'mandibular ' 'left ' 'lateral ' 'incisor ' 'tooth', [4026, 4025])}, 'SupernumeraryDeciduousMandibularLeftSecondMolarTooth': {'707031002': ('Supernumerary ' 'deciduous ' 'mandibular ' 'left ' 'second ' 'molar ' 'tooth', [4026, 4025])}, 'SupernumeraryDeciduousMandibularRightCanineTooth': {'707023007': ('Supernumerary ' 'deciduous ' 'mandibular ' 'right ' 'canine ' 'tooth', [4026, 4025])}, 'SupernumeraryDeciduousMandibularRightCentralIncisorTooth': {'707025000': ('Supernumerary ' 'deciduous ' 'mandibular ' 'right ' 'central ' 'incisor ' 'tooth', [4026, 4025])}, 'SupernumeraryDeciduousMandibularRightFirstMolarTooth': {'707022002': ('Supernumerary ' 'deciduous ' 'mandibular ' 'right ' 'first ' 'molar ' 'tooth', [4026, 4025])}, 'SupernumeraryDeciduousMandibularRightLateralIncisorTooth': {'707024001': ('Supernumerary ' 'deciduous ' 'mandibular ' 'right ' 'lateral ' 'incisor ' 'tooth', [4026, 4025])}, 'SupernumeraryDeciduousMandibularRightSecondMolarTooth': {'707021009': ('Supernumerary ' 'deciduous ' 'mandibular ' 'right ' 'second ' 'molar ' 'tooth', [4026, 4025])}, 'SupernumeraryDeciduousMaxillaryLeftCanineTooth': {'707016006': ('Supernumerary ' 'deciduous ' 'maxillary ' 'left canine ' 'tooth', [4026, 4025])}, 'SupernumeraryDeciduousMaxillaryLeftCentralIncisorTooth': {'707014009': ('Supernumerary ' 'deciduous ' 'maxillary ' 'left ' 'central ' 'incisor ' 'tooth', [4026, 4025])}, 'SupernumeraryDeciduousMaxillaryLeftFirstMolarTooth': {'707017002': ('Supernumerary ' 'deciduous ' 'maxillary ' 'left ' 'first ' 'molar ' 'tooth', [4026, 4025])}, 'SupernumeraryDeciduousMaxillaryLeftLateralIncisorTooth': {'707015005': ('Supernumerary ' 'deciduous ' 'maxillary ' 'left ' 'lateral ' 'incisor ' 'tooth', [4026, 4025])}, 'SupernumeraryDeciduousMaxillaryLeftSecondMolarTooth': {'707018007': ('Supernumerary ' 'deciduous ' 'maxillary ' 'left ' 'second ' 'molar ' 'tooth', [4026, 4025])}, 'SupernumeraryDeciduousMaxillaryRightCanineTooth': {'707011001': ('Supernumerary ' 'deciduous ' 'maxillary ' 'right ' 'canine ' 'tooth', [4026, 4025])}, 'SupernumeraryDeciduousMaxillaryRightCentralIncisorTooth': {'707013003': ('Supernumerary ' 'deciduous ' 'maxillary ' 'right ' 'central ' 'incisor ' 'tooth', [4026, 4025])}, 'SupernumeraryDeciduousMaxillaryRightFirstMolarTooth': {'707010000': ('Supernumerary ' 'deciduous ' 'maxillary ' 'right ' 'first ' 'molar ' 'tooth', [4026, 4025])}, 'SupernumeraryDeciduousMaxillaryRightLateralIncisorTooth': {'707012008': ('Supernumerary ' 'deciduous ' 'maxillary ' 'right ' 'lateral ' 'incisor ' 'tooth', [4026, 4025])}, 'SupernumeraryDeciduousMaxillaryRightSecondMolarTooth': {'707009005': ('Supernumerary ' 'deciduous ' 'maxillary ' 'right ' 'second ' 'molar ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMandibularLeftCanineTooth': {'707058009': ('Supernumerary ' 'permanent ' 'mandibular ' 'left ' 'canine ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMandibularLeftCentralIncisorTooth': {'707060006': ('Supernumerary ' 'permanent ' 'mandibular ' 'left ' 'central ' 'incisor ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMandibularLeftFirstMolarTooth': {'707055007': ('Supernumerary ' 'permanent ' 'mandibular ' 'left ' 'first ' 'molar ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMandibularLeftFirstPremolarTooth': {'707057004': ('Supernumerary ' 'permanent ' 'mandibular ' 'left ' 'first ' 'premolar ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMandibularLeftLateralIncisorTooth': {'707059001': ('Supernumerary ' 'permanent ' 'mandibular ' 'left ' 'lateral ' 'incisor ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMandibularLeftSecondMolarTooth': {'707054006': ('Supernumerary ' 'permanent ' 'mandibular ' 'left ' 'second ' 'molar ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMandibularLeftSecondPremolarTooth': {'707056008': ('Supernumerary ' 'permanent ' 'mandibular ' 'left ' 'second ' 'premolar ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMandibularLeftThirdMolarTooth': {'707052005': ('Supernumerary ' 'permanent ' 'mandibular ' 'left ' 'third ' 'molar ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMandibularRightCanineTooth': {'707063008': ('Supernumerary ' 'permanent ' 'mandibular ' 'right ' 'canine ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMandibularRightCentralIncisorTooth': {'707061005': ('Supernumerary ' 'permanent ' 'mandibular ' 'right ' 'central ' 'incisor ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMandibularRightFirstMolarTooth': {'707066000': ('Supernumerary ' 'permanent ' 'mandibular ' 'right ' 'first ' 'molar ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMandibularRightFirstPremolarTooth': {'707064002': ('Supernumerary ' 'permanent ' 'mandibular ' 'right ' 'first ' 'premolar ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMandibularRightLateralIncisorTooth': {'707062003': ('Supernumerary ' 'permanent ' 'mandibular ' 'right ' 'lateral ' 'incisor ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMandibularRightSecondMolarTooth': {'707067009': ('Supernumerary ' 'permanent ' 'mandibular ' 'right ' 'second ' 'molar ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMandibularRightSecondPremolarTooth': {'707065001': ('Supernumerary ' 'permanent ' 'mandibular ' 'right ' 'second ' 'premolar ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMandibularRightThirdMolarTooth': {'707068004': ('Supernumerary ' 'permanent ' 'mandibular ' 'right ' 'third ' 'molar ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMaxillaryLeftCanineTooth': {'707044007': ('Supernumerary ' 'permanent ' 'maxillary ' 'left canine ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMaxillaryLeftCentralIncisorTooth': {'707042006': ('Supernumerary ' 'permanent ' 'maxillary ' 'left ' 'central ' 'incisor ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMaxillaryLeftFirstMolarTooth': {'707047000': ('Supernumerary ' 'permanent ' 'maxillary ' 'left ' 'first ' 'molar ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMaxillaryLeftFirstPremolarTooth': {'707045008': ('Supernumerary ' 'permanent ' 'maxillary ' 'left ' 'first ' 'premolar ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMaxillaryLeftLateralIncisorTooth': {'707043001': ('Supernumerary ' 'permanent ' 'maxillary ' 'left ' 'lateral ' 'incisor ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMaxillaryLeftSecondMolarTooth': {'707048005': ('Supernumerary ' 'permanent ' 'maxillary ' 'left ' 'second ' 'molar ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMaxillaryLeftSecondPremolarTooth': {'707046009': ('Supernumerary ' 'permanent ' 'maxillary ' 'left ' 'second ' 'premolar ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMaxillaryLeftThirdMolarTooth': {'707049002': ('Supernumerary ' 'permanent ' 'maxillary ' 'left ' 'third ' 'molar ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMaxillaryRightCanineTooth': {'707038008': ('Supernumerary ' 'permanent ' 'maxillary ' 'right ' 'canine ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMaxillaryRightCentralIncisorTooth': {'707041004': ('Supernumerary ' 'permanent ' 'maxillary ' 'right ' 'central ' 'incisor ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMaxillaryRightFirstMolarTooth': {'707035006': ('Supernumerary ' 'permanent ' 'maxillary ' 'right ' 'first ' 'molar ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMaxillaryRightFirstPremolarTooth': {'707037003': ('Supernumerary ' 'permanent ' 'maxillary ' 'right ' 'first ' 'premolar ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMaxillaryRightLateralIncisorTooth': {'707039000': ('Supernumerary ' 'permanent ' 'maxillary ' 'right ' 'lateral ' 'incisor ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMaxillaryRightSecondMolarTooth': {'707033004': ('Supernumerary ' 'permanent ' 'maxillary ' 'right ' 'second ' 'molar ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMaxillaryRightSecondPremolarTooth': {'707036007': ('Supernumerary ' 'permanent ' 'maxillary ' 'right ' 'second ' 'premolar ' 'tooth', [4026, 4025])}, 'SupernumeraryPermanentMaxillaryRightThirdMolarTooth': {'707032009': ('Supernumerary ' 'permanent ' 'maxillary ' 'right ' 'third ' 'molar ' 'tooth', [4026, 4025])}, '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', [6206, 20])}, 'SupineBodyPosition': {'40199007': ('Supine body position', [3262, 3602])}, 'SupportiveIntent': {'399707004': ('Supportive intent', [3629])}, 'SupportiveProcedureIntent': {'399707004': ('Supportive - procedure intent ' '(qualifier value)', [])}, 'SupraRenalAorta': {'1918003': ('Supra-renal Aorta', [12112, 12103, 12291, 9514, 7192, 7151, 3827])}, 'SupraaorticValveAreaStructure': {'8128003': ('Supraaortic valve area ' 'structure (body structure)', [])}, 'SupraclavicularLymphNode': {'76838003': ('supraclavicular lymph node', [7600])}, 'SupraclavicularRegionOfNeck': {'77621008': ('Supraclavicular region of neck', [9514, 7192, 7151, 4])}, 'Supraglottis': {'119255006': ('supraglottis', [7601])}, 'SupraglottisStructure': {'119255006': ('Supraglottis structure (body ' 'structure)', [])}, 'SupramammaryLymphNode': {'62630005': ('supramammary lymph node', [7600])}, 'SuprapulmonicValveArea': {'79142001': ('Suprapulmonic valve area', [3829, 9514, 7192, 7151])}, 'SuprapulmonicValveAreaStructure': {'79142001': ('Suprapulmonic valve area ' 'structure (body structure)', [])}, 'SuprapyloricLymphNode': {'280216006': ('suprapyloric lymph node', [7600])}, 'SupraspinatusMuscle': {'6423006': ('Supraspinatus muscle', [6109, 6102, 6116, 9514, 7192, 7151])}, 'SupraspinatusMuscleStructure': {'6423006': ('Supraspinatus muscle structure ' '(body structure)', [])}, 'SuprasternalCoronalView': {'443162009': ('Suprasternal coronal view', [12226, 501])}, 'SuprasternalLongAxis': {'399106004': ('Suprasternal long axis', [12226, 501])}, 'SuprasternalLongAxisView': {'399106004': ('Suprasternal long axis view ' '(qualifier value)', [])}, 'SuprasternalLongAxisViewOfAorticArch': {'443562002': ('Suprasternal long ' 'axis view of aortic ' 'arch', [12226, 501])}, 'SuprasternalLongAxisViewOfAorticArchQualifierValue': {'443562002': ('Suprasternal ' 'long ' 'axis ' 'view of ' 'aortic ' 'arch ' '(qualifier ' 'value)', [])}, 'SuprasternalLongAxisViewQualifierValue': {'399106004': ('Suprasternal long ' 'axis view ' '(qualifier value)', [])}, 'SuprasternalNotch': {'26493002': ('Suprasternal Notch', [1004, 6115, 1001, 1000, 9514, 7192, 7151, 4])}, 'SuprasternalSagittalView': {'443163004': ('Suprasternal sagittal view', [12226, 501])}, 'SuprasternalShortAxis': {'399145009': ('Suprasternal short axis', [12226, 501])}, 'SuprasternalShortAxisView': {'399145009': ('Suprasternal short axis view ' '(qualifier value)', [])}, 'SupraventricularTachycardia': {'6456007': ('Supraventricular tachycardia', [12246, 3230, 3201])}, 'Surface': {'410679008': ('Surface', [2, 5])}, 'SurfaceBolus': {'228736002': ('Surface Bolus', [9520, 9516])}, '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)', [])}, 'SurgicalMetalNailDevice': {'63289001': ('Surgical metal nail, device ' '(physical object)', [])}, 'SurgicalProcedure': {'387713003': ('Surgical procedure (procedure)', [])}, '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, 6401, 6138, 6404, 7151, 6202, 6203, 7193])}, 'SwabianHallPigBreed': {'132354003': ('Swabian-Hall pig breed', [7480])}, 'SwaledaleSheepBreed': {'131822003': ('Swaledale sheep breed', [7480])}, 'SwallowBeliedMangalitzaPigBreed': {'132232002': ('Swallow Belied Mangalitza ' 'pig breed', [7480])}, 'SwanGanzCatheterDevice': {'79952001': ('Swan-Ganz catheter, device (physical ' 'object)', [])}, 'SwannGanzCatheter': {'79952001': ('Swann-Ganz catheter', [3429])}, 'Swanson': {'399313005': ('Swanson', [4012])}, 'SwansonProjection': {'399313005': ('Swanson projection (qualifier value)', [])}, 'Sweating': {'415690000': ('Sweating', [9300, 60])}, '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', [9514, 7192, 7151, 7167])}, 'SympatheticTrunkStructure': {'44909008': ('Sympathetic trunk structure (body ' 'structure)', [])}, 'SympathomimeticAgent': {'86308005': ('Sympathomimetic agent (product)', [])}, 'SymphysisPubis': {'82561000': ('Symphysis pubis', [1005, 1001, 1000])}, 'SymphysisPubisStructure': {'82561000': ('Symphysis pubis structure (body ' 'structure)', [])}, 'SymptomFree': {'162467007': ('Symptom free', [3772])}, 'Syncope': {'271594007': ('Syncope', [12246, 3201, 3221, 3220])}, 'SyntheticSL98PigBreed': {'133220008': ('Synthetic SL98 pig breed', [7480])}, 'Syringe': {'61968008': ('Syringe', [4051, 69]), '733020007': ('Syringe', [68])}, 'SyringeDevice': {'61968008': ('Syringe, device (physical object)', [])}, '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', [7156, 9514, 7192, 7151])}, 'SystemicArteryBlood': {'371952000': ('Systemic Artery Blood', [3520])}, 'SystemicCollateralArteryToLung': {'128589000': ('Systemic collateral Artery ' 'to lung', [3604, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'SystemicVascularResistance': {'386530009': ('Systemic Vascular Resistance', [3619])}, 'SystemicVascularStructure': {'281157001': ('Systemic vascular structure', [6100])}, 'SystemicVein': {'360592004': ('Systemic vein', [7156, 9514, 7192, 7151])}, 'SystemicVenousAtrium': {'128568009': ('Systemic venous atrium', [3608, 3010, 4042, 9514, 7192, 7151, 4, 3630])}, '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)', [])}, 'T0NoEvidenceOfPrimaryTumor': {'373174002': ('T0: No evidence of primary ' 'tumor (breast)', [6160])}, 'T1Tumor2cmOrLessInGreatestDimension': {'373172003': ('T1: Tumor 2 cm or less ' 'in greatest dimension ' '(breast)', [6160])}, 'T1aTumorMoreThan0Point1cmButNotMoreThan0Point5cm': {'373180005': ('T1a: ' 'Tumor ' 'more than ' '0.1 cm ' 'but not ' 'more than ' '0.5 cm...', [6160])}, 'T1bTumorMoreThan0Point5cmButNotMoreThan1cm': {'373204007': ('T1b: Tumor more ' 'than 0.5 cm but ' 'not more than 1 ' 'cm...', [6160])}, 'T1cTumorMoreThan1cmButNotMoreThan2cm': {'373183007': ('T1c: Tumor more than ' '1 cm but not more ' 'than 2 cm...', [6160])}, 'T1micMicroinvasion0Point1cmOrLessInGreatestDimension': {'373179007': ('T1mic: ' 'Microinvasion ' '0.1 ' 'cm or ' 'less ' 'in ' 'greatest ' 'dimension...', [6160])}, 'T2TumorMoreThan2cmButNotMoreThan5cm': {'373182002': ('T2: Tumor more than 2 ' 'cm but not more than 5 ' 'cm...', [6160])}, 'T3TumorMoreThan5cmInGreatestDimension': {'373184001': ('T3: Tumor more than ' '5 cm in greatest ' 'dimension (breast)', [6160])}, 'T4InflammatoryCarcinoma': {'373190002': ('T4: Inflammatory carcinoma ' '(breast)', [6160])}, 'T4TumorOfAnySizeWithDirectExtensionToChestWall': {'373185000': ('T4: Tumor ' 'of any size ' 'with direct ' 'extension ' 'to chest ' 'wall...', [6160])}, 'T4aTumorOfAnySizeWithExtensionToChestWallNotIncl': {'373186004': ('T4a: ' 'Tumor of ' 'any size ' 'with ' 'extension ' 'to chest ' 'wall, not ' 'incl...', [6160])}, 'T4bTumorOfAnySizeWithEdemaIncludingPeauDOrange': {'373187008': ('T4b: Tumor ' 'of any size ' 'with edema ' '(including ' 'peau ' "d'orange) " '...', [6160])}, 'T4cTumorOfAnySizeWithDirectExtensionToChestWall': {'373189006': ('T4c: Tumor ' 'of any ' 'size with ' 'direct ' 'extension ' 'to chest ' 'wall...', [6160])}, 'TSSH1CattleBreed': {'133839005': ('TSSH-1 cattle breed (organism)', [])}, 'TSSH1XZebuCattleBreed': {'133839005': ('TSSH-1 X zebu cattle breed', [7480])}, 'TWaveAlternans': {'428550008': ('T wave alternans (observable entity)', [])}, 'TXPrimaryTumorCannotBeAssessed': {'373173008': ('TX: Primary tumor cannot be ' 'assessed (breast)', [6160])}, 'TabapuaCattleBreed': {'133787007': ('Tabapua cattle breed', [7480])}, 'Table': {'86407004': ('Table', [9520, 7158, 9515, 7157, 7151, 9505, 7193])}, 'TableDevice': {'86407004': ('Table, device (physical object)', [])}, 'TachycardiaBradycardia': {'74615001': ('Tachycardia-bradycardia', [9300, 60])}, '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', [7304, 1001, 1000, 1006])}, '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', [4010, 4015, 501])}, 'TangentialProjection': {'399110001': ('Tangential projection (qualifier ' 'value)', [])}, 'Tantalum': {'45215009': ('Tantalum', [300])}, 'TantalumANDORTantalumCompound': {'105866008': ('Tantalum AND/OR tantalum ' 'compound (substance)', [])}, 'TantalumOrTantalumCompound': {'105866008': ('Tantalum or Tantalum compound', [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])}, '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', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'Tarsus': {'108371006': ('Tarsus', [7483, 7482])}, 'TartrazineStain': {'21592006': ('tartrazine stain', [8112])}, 'TasteAndSenseAltered': {'271801002': ('Taste and sense altered', [9300, 60])}, 'TasteSenseAltered': {'271801002': ('Taste sense altered (finding)', [])}, 'Taurine': {'10944007': ('Taurine (substance)', [])}, 'TavdaHorseBreed': {'132764005': ('Tavda horse breed', [7480])}, 'TawleedHorseBreed': {'133001001': ('Tawleed horse breed', [7480])}, 'Taylor': {'399296000': ('Taylor', [4012])}, 'TaylorProjection': {'399296000': ('Taylor projection (qualifier value)', [])}, 'Tc99mSestamibi': {'404706008': ('Tc-99m sestamibi', [3111])}, 'Tc99mTetrofosmin': {'404707004': ('Tc-99m tetrofosmin', [3111])}, 'Technetium99mDimercaptosuccinicAcidDMSA': {'447201007': ('Technetium^99m ' 'Dimercaptosuccinic ' 'Acid DMSA', [25])}, 'Technetium99mGalactosylHumanSerumAlbuminDiethylenetriamine': {'446534003': ('Technetium^99m ' 'Galactosyl ' 'Human ' 'Serum ' 'Albumin ' 'Diethylenetriamine', [25])}, 'Technetium99mHydroxymethyleneDiphosphonateHMDP': {'446535002': ('Technetium^99m ' 'Hydroxymethylene ' 'diphosphonate ' 'HMDP', [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])}, 'Technetium99mtcSestamibiInjection': {'404706008': ('Technetium[99mTc] ' 'sestamibi injection ' '(product)', [])}, 'Technetium99mtcTetrofosminInjection': {'404707004': ('Technetium[99mTc] ' 'tetrofosmin 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])}, 'TechnetiumTc99mAlbuminColloid': {'16011006': ('Technetium Tc^99m^ albumin ' 'colloid', [25])}, 'TechnetiumTc99mAlbuminMicrospheres': {'55494003': ('Technetium Tc^99m^ ' 'albumin microspheres ' '(substance)', [])}, 'TechnetiumTc99mDepreotide': {'415704007': ('Technetium Tc^99m^ depreotide', [25])}, 'TechnetiumTc99mDimercaptosuccinicAcid': {'447201007': ('Technetium Tc^99m^ ' 'dimercaptosuccinic ' 'acid (substance)', [])}, 'TechnetiumTc99mDisofenin': {'3040004': ('Technetium Tc^99m^ disofenin', [25])}, 'TechnetiumTc99mExametazime': {'77313009': ('Technetium Tc^99m^ exametazime ' '(substance)', [])}, 'TechnetiumTc99mExametazine': {'77313009': ('Technetium Tc^99m^ exametazine', [25])}, 'TechnetiumTc99mGalactosylHumanSerumAlbuminDiethylenetriaminePentaaceticAcid': {'446534003': ('Technetium ' 'Tc^99m^ ' 'galactosyl ' 'human ' 'serum ' 'albumin ' 'diethylenetriamine ' 'pentaacetic ' 'acid ' '(substance)', [])}, 'TechnetiumTc99mHydroxymethyleneDiphosphonate': {'446535002': ('Technetium ' 'Tc^99m^ ' 'hydroxymethylene ' 'diphosphonate ' '(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)', [])}, 'TechnetiumTc99mPyroAndPolyphosphates': {'65156006': ('Technetium Tc^99m^ ' 'pyro and ' 'polyphosphates', [25])}, 'TechnetiumTc99mPyrophosphateAndPolyphosphate': {'65156006': ('Technetium ' 'Tc^99m^ ' 'pyrophosphate ' 'and ' 'polyphosphate ' '(substance)', [])}, '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])}, 'TelemarkCattleBreed': {'133278004': ('Telemark cattle breed', [7480])}, 'Telencephalon': {'11628009': ('Telencephalon', [7153, 9514, 7192, 7151])}, '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', [1002, 1001, 1000, 9514, 7192, 4028, 7151])}, 'TemporalBoneStructure': {'60911003': ('Temporal bone structure (body ' 'structure)', [])}, 'TemporalCorrelation': {'133886009': ('Temporal correlation', [6137, 6043])}, 'TemporalLobe': {'78277001': ('Temporal lobe', [7153, 9514, 7192, 7151])}, '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', [4030, 4031, 4042, 9514, 7192, 4028, 7151, 4, 4009])}, 'TemporomandibularJointStructure': {'53620006': ('Temporomandibular joint ' 'structure (body structure)', [])}, 'Tendon': {'13024002': ('Tendon', [7191, 7151, 7166])}, 'TendonOfTodaro': {'128595004': ('Tendon of Todaro', [3011])}, 'TendonStructure': {'13024002': ('Tendon structure (body structure)', [])}, 'TennesseeWalkingHorse': {'51023000': ('Tennessee walking horse (organism)', [])}, 'TennesseeWalkingHorseBreed': {'51023000': ('Tennessee walking horse breed', [7480])}, 'TenthPercentile': {'371890005': ('Tenth percentile (qualifier value)', [])}, 'TeresMajorMuscle': {'1193009': ('Teres major muscle', [6109, 6102, 6116, 9514, 7192, 7151])}, 'TeresMinorMuscle': {'51159009': ('Teres minor muscle', [6109, 6102, 6116, 9514, 7192, 7151])}, 'TerminalDeoxynucleotidylTransferaseStain': {'406975002': ('terminal ' 'deoxynucleotidyl ' 'transferase stain', [8112])}, 'TerminalInternalCarotidArtery': {'415646005': ('Terminal internal carotid ' 'artery', [12105, 12103, 9514, 7192, 7151, 3827])}, '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', [12103, 9514, 7192, 12111, 7151, 3827])}, 'TesticularVein': {'31688004': ('Testicular Vein', [12113, 12103, 9514, 7192, 7151, 3827])}, 'Testis': {'40689003': ('Testis', [4030, 10060, 6204, 9514, 7160, 7192, 7151, 6202, 4, 10044])}, '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', [12249, 12248])}, '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': {'119406000': ('Thalamus', [7140]), '42695009': ('Thalamus', [7153, 9514, 7192, 7151])}, 'ThalamusPart': {'119406000': ('Thalamus part (body structure)', [])}, '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', [641, 638])}, 'TherapeuticIntent': {'262202000': ('Therapeutic Intent', [3629])}, 'TherapeuticProcedure': {'277132007': ('Therapeutic procedure (procedure)', [])}, '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', [625, 623])}, 'ThiamylalSodium': {'40342009': ('Thiamylal sodium (substance)', [])}, 'ThibarCattleBreed': {'133836003': ('Thibar cattle breed (organism)', [])}, 'ThibarXZebuCattleBreed': {'133836003': ('Thibar X zebu cattle breed', [7480])}, 'Thigh': {'68367000': ('Thigh', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'ThighPerforator': {'714759009': ('Thigh perforator', [12103, 9514, 7192, 7151, 3827, 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', [8112])}, 'ThionineStain': {'12001002': ('thionine stain', [8112])}, 'Thiopental': {'387448009': ('Thiopental', [625, 623])}, 'ThiopentalSodium': {'387448009': ('Thiopental sodium (substance)', [])}, 'ThirdDegreeAtrioventricularBlock': {'27885002': ('Third degree ' 'Atrioventricular block', [3230])}, 'ThirdLumbarArtery': {'397409007': ('Third Lumbar Artery', [12113, 12103, 9514, 7192, 7151, 3827])}, 'ThirdMolarRegion': {'699503005': ('Third molar region', [4017])}, 'ThirdMolarRegionOfOralCavity': {'699503005': ('Third molar region of oral ' 'cavity (body structure)', [])}, 'ThirdVentricle': {'49841001': ('Third ventricle', [7153, 7140, 9514, 7192, 7151])}, 'ThirdVentricleStructure': {'49841001': ('Third ventricle structure (body ' 'structure)', [])}, 'Thoracentesis': {'91602002': ('Thoracentesis', [9])}, 'ThoracicAorta': {'113262008': ('Thoracic aorta', [3604, 4030, 3010, 12291, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'ThoracicAortaStructure': {'113262008': ('Thoracic aorta structure (body ' 'structure)', [])}, 'ThoracicAorticCoarctation': {'253678000': ('Thoracic Aortic Coarctation', [12236])}, 'ThoracicDuct': {'1732005': ('Thoracic Duct', [6113, 6109, 6102, 9514, 7192, 7151])}, 'ThoracicDuctStructure': {'1732005': ('Thoracic duct structure (body ' 'structure)', [])}, 'ThoracicInlet': {'42973007': ('Thoracic Inlet', [1004, 1001, 1000])}, 'ThoracicSpine': {'122495006': ('Thoracic spine', [4030, 4031, 7304, 7155, 7483, 7482, 4042, 9514, 7192, 7151, 4, 4009])}, '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': {'297172009': ('Thoraco-lumbar spine', [4030, 4031, 7483, 7482, 4042, 9514, 7192, 7151, 4, 4009]), '297174005': ('Thoraco-Lumbar Spine', [7304])}, 'ThoracolumbarRegionOfSpineStructure': {'297172009': ('Thoracolumbar region ' 'of spine structure ' '(body structure)', [])}, 'Thorax': {'51185008': ('Thorax', [12020, 7155])}, '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)', [])}, 'ThrombolyticAgentNotAdministeredBecauseContraindicated': {'373148008': ('Thrombolytic ' 'agent ' 'not ' 'administered ' 'because ' 'contraindicated ' '(situation)', [])}, 'ThrombolyticTherapy': {'426347000': ('Thrombolytic therapy', [3764])}, 'ThrombophlebitisOfBreast': {'69954004': ('Thrombophlebitis of breast ' '(disorder)', [])}, 'ThrombophlebitisOfBreastMondorDisease': {'69954004': ('Thrombophlebitis of ' "breast (Mondor's " 'disease)', [6031, 6030])}, 'Thromboplastin': {'65265006': ('Thromboplastin', [10])}, 'ThrombosedAneurysm': {'125271003': ('thrombosed aneurysm', [3808])}, 'Thrombosis': {'118927008': ('thrombosis', [3815]), '264579008': ('thrombosis', [3805])}, 'ThromboticDisorder': {'118927008': ('Thrombotic disorder (navigational ' 'concept)', [])}, 'Thrombus': {'396339007': ('Thrombus', [3491, 3497, 3495, 3712, 7156, 9514, 7192, 7151, 3810])}, 'Thumb': {'76505004': ('Thumb', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'ThumbStructure': {'76505004': ('Thumb structure (body structure)', [])}, 'ThuocNhieuPigBreed': {'133165006': ('Thuoc Nhieu pig breed', [7480])}, 'ThuringianGoatBreed': {'131642009': ('Thuringian goat breed', [7480])}, 'ThymidineF18': {'129502002': ('Thymidine F^18^ (substance)', [])}, 'ThymidineFLTF18': {'129502002': ('Thymidine (FLT) F^18^', [4021])}, 'Thymus': {'9875009': ('Thymus', [4030, 7155, 10060, 9514, 7192, 7151, 4, 10044])}, 'ThymusGland': {'9875009': ('Thymus Gland', [6113, 6109, 6102])}, 'ThymusGlandStructure': {'9875009': ('Thymus gland structure (body structure)', [])}, 'ThyrocervicalTrunk': {'6538005': ('Thyrocervical trunk', [6109, 6102, 6117, 9514, 7192, 7151])}, 'Thyroid': {'69748006': ('Thyroid', [6113, 4030, 6109, 6102, 10060, 9514, 7192, 7151, 4, 10044])}, 'ThyroidHormone': {'18220004': ('Thyroid hormone', [621, 622])}, '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', [12021, 7304])}, 'TibiaAndFibula': {'110536004': ('Tibia and fibula', [7483, 7482])}, 'TibiaAndFibulaCombinedSite': {'110536004': ('Tibia and fibula (combined ' 'site) (body structure)', [])}, 'TibialArtery': {'181351007': ('tibial artery', [3604, 3606, 3630])}, 'TibialLymphNode': {'80769008': ('tibial lymph node', [7600])}, 'TibialPlateau': {'306783000': ('Tibial Plateau', [1001, 1000, 1006])}, 'TibialPlateauStructure': {'306783000': ('Tibial plateau structure (body ' 'structure)', [])}, 'TielingHorseBreed': {'131952005': ('Tieling horse breed', [7480])}, 'Tiletamine': {'96265006': ('Tiletamine', [625, 623])}, 'TiletamineHydrochloride': {'96265006': ('Tiletamine hydrochloride ' '(substance)', [])}, 'TimeFromStartOfTest': {'252131008': ('Time from start of test (observable ' 'entity)', [])}, 'TimorHorseBreed': {'131953000': ('Timor horse breed', [7480])}, 'TinANDORTinCompound': {'105849006': ('Tin AND/OR tin compound (substance)', [])}, 'TinOrTinCompound': {'105849006': ('Tin or Tin compound', [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])}, 'TisCarcinomaInSitu': {'373175001': ('Tis: Carcinoma in situ (breast)', [6160])}, 'TisDuctalCarcinomaInSitu': {'373176000': ('Tis: Ductal carcinoma in situ ' '(breast)', [6160])}, 'TisLobularCarcinomaInSitu': {'373177009': ('Tis: Lobular carcinoma in situ ' '(breast)', [6160])}, 'TisPagetDiseaseOfTheNippleWithNoTumor': {'373178004': ("Tis: Paget's disease " 'of the nipple with ' 'no tumor', [6160])}, 'Tissue': {'85756007': ('Tissue', [7165, 7191, 7196, 7151, 7166, 7150])}, 'TissueCassette': {'434464009': ('Tissue cassette', [8101, 8102])}, 'TissueCassetteForMicroarray': {'434708008': ('Tissue cassette for microarray ' '(physical object)', [])}, 'TissueDopplerImaging': {'439858009': ('Tissue Doppler Imaging', [12224, 6058])}, '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', [4010, 501, 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', [4030, 4031, 1001, 4042, 1000, 9514, 7192, 7151, 4, 4009, 1006])}, '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', [8112])}, 'TongConPigBreed': {'132347009': ('Tong Con pig breed', [7480])}, 'TongSheepBreed': {'132708005': ('Tong sheep breed', [7480])}, 'TongaCattleBreed': {'131534002': ('Tonga cattle breed', [7480])}, 'Tongue': {'21974007': ('tongue', [7601, 9514, 7192, 4028, 7151, 4])}, 'TongueStructure': {'21974007': ('Tongue structure (body structure)', [])}, 'TonkineseCat': {'44855006': ('Tonkinese cat', [7480])}, 'TonsilAndAdenoid': {'303337002': ('tonsil and adenoid', [7601])}, 'TonsilAndAdenoidStructure': {'303337002': ('Tonsil and adenoid structure ' '(body structure)', [])}, 'TonsillarStructurePalatine': {'75573002': ('Tonsillar structure (palatine) ' '(body structure)', [])}, 'Tooth': {'38199008': ('Tooth', [9514, 7192, 4028, 7151, 4029])}, 'ToothStructure': {'38199008': ('Tooth structure (body structure)', [])}, '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', [6109, 6102, 6116, 9514, 7192, 7151])}, 'TrabeculaeCarneaeCordis': {'118755002': ('Trabeculae carneae cordis (body ' 'structure)', [])}, 'TrabecularThickeningOfBreast': {'129795008': ('Trabecular thickening of ' 'breast', [6056, 6016, 6015, 6054, 6014])}, 'Trachea': {'44567001': ('Trachea', [6113, 4030, 6109, 4031, 7155, 6102, 4042, 9514, 7192, 4028, 7151, 4, 4009])}, 'TracheaAndBronchus': {'110726009': ('Trachea and bronchus', [4040, 9514, 7192, 7151, 4])}, 'TracheaAndBronchusCombinedSite': {'110726009': ('Trachea and bronchus ' '(combined site) (body ' 'structure)', [])}, 'TrachealStructure': {'44567001': ('Tracheal structure (body structure)', [])}, 'TracheobronchialLymphNode': {'245341003': ('tracheobronchial lymph node', [7600])}, 'TracheobronchialLymphNodeLocatedNearCarina': {'89858007': ('tracheobronchial ' 'lymph node, ' 'located near ' 'carina', [7600])}, '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])}, '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])}, 'TransRenal': {'103347001': ('Trans-renal', [7])}, 'TransSplenic': {'103346005': ('Trans-splenic', [7])}, 'TransTemporal': {'103382000': ('Trans-temporal', [7])}, 'TransThecal': {'103345009': ('Trans-thecal', [7])}, 'TransVaginal': {'54300008': ('Trans-vaginal (endovaginal)', [7])}, 'TransVesical': {'103344008': ('Trans-vesical', [7])}, 'TransarterialApproach': {'103387006': ('Transarterial approach (qualifier ' 'value)', [])}, 'TranscatheterDeploymentOfDetachableBalloon': {'105372003': ('Transcatheter ' 'deployment of ' 'detachable ' 'balloon', [3405, 9])}, 'TranscatheterTherapyForEmbolization': {'16736007': ('Transcatheter therapy ' 'for embolization', [3405, 9])}, 'TransesophagealApproach': {'103383005': ('Transesophageal approach ' '(qualifier value)', [])}, 'TransesophagealEchocardiography': {'105376000': ('Transesophageal ' 'echocardiography', [3405, 12001, 3757, 3428])}, 'TransesophagealShortAxisView': {'443698002': ('Transesophageal short axis ' 'view', [12226, 501])}, 'Transfer': {'4563007': ('Transfer', [3729])}, 'Transforamenal': {'272466003': ('transforamenal', [4011, 502])}, '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])}, 'TransjugularIntrahepaticPortosystemicShunt': {'397423009': ('Transjugular ' 'Intrahepatic ' 'Portosystemic ' 'Shunt', [12103, 12114, 9514, 7192, 7151, 3827])}, 'TransluminalExtractionCatheterDevice': {'21870002': ('Transluminal ' 'extraction catheter, ' 'device (physical ' 'object)', [])}, 'TransluminalExtractionCatheterTEC': {'21870002': ('Transluminal Extraction ' 'Catheter (TEC)', [3429, 3411])}, 'Transmural': {'103354007': ('Transmural (qualifier value)', [])}, 'Transoral': {'118438002': ('transoral', [4011, 502])}, 'TransoralApproach': {'118438002': ('Transoral approach (qualifier value)', [])}, 'Transorbital': {'278318001': ('transorbital', [4011, 502])}, '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)', [])}, 'Transrenal': {'103347001': ('Transrenal (qualifier value)', [])}, 'TransseptalCatheter': {'386124003': ('Transseptal catheter', [3429])}, 'TransseptalCatheterization': {'67338003': ('Transseptal catheterization', [3405, 3250])}, 'Transsplenic': {'103346005': ('Transsplenic (qualifier value)', [])}, 'TranstemporalApproach': {'103382000': ('Transtemporal approach (qualifier ' 'value)', [])}, 'Transthecal': {'103345009': ('Transthecal (qualifier value)', [])}, 'Transthoracic': {'272476000': ('transthoracic', [4011, 502])}, 'TransthoracicEchocardiography': {'252418006': ('Transthoracic ' 'echocardiography (procedure)', []), '433236007': ('Transthoracic ' 'echocardiography', [3405, 12001, 3757, 3428])}, 'TransthoracicProjection': {'272476000': ('Transthoracic projection ' '(qualifier value)', [])}, 'TranstrachealJetVentilation': {'448442005': ('Transtracheal jet ventilation', [620, 619])}, 'TransvenousApproach': {'103386002': ('Transvenous approach (qualifier value)', [])}, 'Transverse': {'399220000': ('transverse', [21]), '62824007': ('Transverse', [6, 502, 3838, 12118, 2, 501, 5, 26])}, 'TransverseAorticArch': {'443281009': ('Transverse Aortic Arch', [12280])}, 'TransverseBodyPosition': {'399220000': ('Transverse body position (finding)', [])}, 'TransverseColon': {'485005': ('Transverse colon', [6210])}, 'TransverseColonStructure': {'485005': ('Transverse colon structure (body ' 'structure)', [])}, 'TransverseProcessOrVertebra': {'73400003': ('Transverse process or vertebra', [6115])}, 'TransversusThoracis': {'88454005': ('Transversus thoracis', [6109, 6102, 6116, 9514, 7192, 7151])}, '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', [6113, 6109, 6102, 6116, 9514, 7192, 7151])}, 'Trauma': {'417746004': ('trauma', [3815])}, 'TraumaSurgery': {'309994009': ('Trauma Surgery', [7030])}, 'TraumaSurgeryDepartment': {'309994009': ('Trauma surgery department ' '(environment)', [])}, 'TraumaticAbnormality': {'19130008': ('Traumatic Abnormality', [3809])}, '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)', [])}, 'TribredPigBreed': {'132029006': ('Tribred pig breed', [7480])}, 'Tribromoethanol': {'84386009': ('Tribromoethanol', [625, 623])}, 'TrichromeStain': {'406989007': ('trichrome stain', [8112])}, 'TricuspidAnnulus': {'113259005': ('Tricuspid Annulus', [12241, 12236, 12305])}, 'TricuspidDiastolicFillingPeriod': {'371847009': ('Tricuspid diastolic ' 'filling period (observable ' 'entity)', [])}, 'TricuspidDiastolicFillingPeriodDfpt': {'371847009': ('Tricuspid Diastolic ' 'Filling Period (DFPt)', [12267, 3616, 12268])}, 'TricuspidRegurgitation': {'111287006': ('Tricuspid regurgitation', [3700])}, 'TricuspidRing': {'113259005': ('Tricuspid ring', [3011])}, 'TricuspidValve': {'46030003': ('Tricuspid Valve', [6113, 6109, 3701, 12305, 6102, 12285, 9514, 7192, 3610, 7151, 3630])}, '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', [7710, 7706])}, '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', [7710, 7706])}, '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', [3604, 3010, 4042, 9514, 7192, 3606, 7151, 4, 3630])}, 'TruncusCoeliacus': {'57850000': ('Truncus coeliacus', [3010, 4042, 9514, 7192, 7151, 4])}, 'Trunk': {'22943007': ('Trunk', [12020])}, 'TrunkAngiography': {'303827001': ('trunk angiography', [3820])}, 'TrunkOfPulmonaryArtery': {'45341000': ('Trunk of pulmonary artery', [3829, 12305, 9514, 7192, 7151])}, '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', [7186, 7180, 218, 4032, 4033, 7469])}, 'TubalTonsil': {'21058000': ('tubal tonsil', [7601])}, 'TubeDevice': {'83059008': ('Tube, device (physical object)', [69])}, 'TubeFeedingOfPatientRegimeTherapy': {'61420007': ('Tube feeding of patient ' '(regime/therapy)', [])}, 'TubercleOfRib': {'113198008': ('Tubercle of rib', [6115])}, 'TubercleOfRibStructure': {'113198008': ('Tubercle of rib structure (body ' 'structure)', [])}, 'TubularAdenocarcinoma': {'4631006': ('Tubular adenocarcinoma', [6030, 6033])}, 'TubularAdenoma': {'19665009': ('Tubular adenoma', [6031, 6030])}, 'TubularAdenomaNoInternationalClassificationOfDiseasesForOncologySubtype': {'19665009': ('Tubular ' 'adenoma, ' 'no ' 'International ' 'Classification ' 'of ' 'Diseases ' 'for ' 'Oncology ' 'subtype ' '(morphologic ' 'abnormality)', [])}, 'TubularDensity': {'129794007': ('Tubular density', [6056, 6016, 6015, 6054, 6014])}, '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', [3815, 644])}, 'TumorInvasionLimitedToSkin': {'409783000': ('Tumor invasion limited to skin ' '(finding)', [])}, 'TumorMarginStatus': {'372249001': ('Tumor margin status (observable entity)', [])}, 'TumorNecrosisFactorAlpha': {'39525005': ('Tumor necrosis factor alpha', [642, 638])}, 'TumorOfColon': {'126838000': ('Tumor of colon', [6201])}, 'TumorStageFinding': {'385356007': ('Tumor stage finding (finding)', [])}, 'TunchangPigBreed': {'132199000': ('Tunchang pig breed (organism)', [])}, 'TungchangPigBreed': {'132199000': ('Tungchang pig breed', [7480])}, 'TungstenANDORTungstenCompound': {'105874009': ('Tungsten AND/OR tungsten ' 'compound (substance)', [])}, 'TungstenHalogenLamp': {'445679001': ('Tungsten halogen lamp', [8125])}, 'TungstenHalogenLampMicroscopeIlluminator': {'445679001': ('Tungsten halogen ' 'lamp microscope ' 'illuminator ' '(physical object)', [])}, 'TungstenOrTungstenCompound': {'105874009': ('Tungsten or Tungsten compound', [10016])}, 'TuniCattleBreed': {'131536000': ('Tuni cattle breed', [7480])}, 'TunicaAdventitia': {'30180000': ('Tunica adventitia (body structure)', [])}, 'TunicaIntima': {'8361002': ('Tunica intima (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, 502, 501])}, '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', [12021, 7304])}, 'UlnarArtery': {'44984001': ('Ulnar Artery', [12103, 3010, 3440, 4042, 9514, 7192, 7151, 12107, 3827, 4])}, 'UlnarVein': {'17623008': ('Ulnar vein', [12108, 12103, 9514, 7192, 7151, 3827])}, 'UltraVioletColor': {'415770004': ('Ultra-violet color (qualifier value)', [])}, 'UltrasonicGuidanceForAmniocentesis': {'65388005': ('Ultrasonic guidance for ' 'amniocentesis', [9])}, 'UltrasonicGuidanceProcedure': {'61593002': ('Ultrasonic guidance procedure', [6060, 6058])}, 'Ultrasonography': {'310169008': ('Ultrasonography', [7030])}, 'UltrasonographyOfBreast': {'47079000': ('Ultrasonography of breast', [6083, 6050])}, 'UltrasonographyOfTotalBody': {'24135002': ('Ultrasonography of total body', [646])}, 'UltrasonographyService': {'310169008': ('Ultrasonography service (qualifier ' 'value)', [])}, 'UltrasoundScanNormal': {'169254007': ('Ultrasound scan normal', [6064, 6054])}, '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', [3604, 12103, 3010, 12140, 4042, 9514, 7192, 3606, 12111, 7151, 3827, 4, 3630])}, 'UmbilicalRegion': {'90290004': ('Umbilical region', [9514, 7192, 7151, 4])}, 'UmbilicalRegionStructure': {'90290004': ('Umbilical region structure (body ' 'structure)', [])}, 'UmbilicalVein': {'13576009': ('Umbilical Vein', [12140]), '284639000': ('Umbilical Vein', [12103, 12114, 3010, 4042, 9514, 7192, 7151, 3827, 4, 3630, 3607])}, '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', [7153, 7703, 7710, 9514, 7192, 7151])}, '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', [211, 2, 245, 244])}, 'UnilateralLeft': {'419161000': ('Unilateral left (qualifier value)', [])}, 'Unknown': {'261665006': ('Unknown', [6096, 3703])}, '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])}, 'UpperAbdomenStructure': {'80581009': ('Upper abdomen structure (body ' 'structure)', [])}, 'UpperArm': {'40983000': ('Upper arm', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'UpperArmStructure': {'40983000': ('Upper arm structure (body structure)', [])}, 'UpperDeepCervicalLymphNode': {'285425001': ('upper deep cervical lymph node', [7600])}, 'UpperDentalArchStructure': {'39481002': ('Upper dental arch structure (body ' 'structure)', [])}, 'UpperEyelid': {'38934000': ('Upper Eyelid', [4209])}, 'UpperEyelidStructure': {'38934000': ('Upper eyelid structure (body ' 'structure)', [])}, 'UpperGastroIntestinalTract': {'62834003': ('Upper gastro-intestinal tract', [7483, 7482])}, 'UpperGastrointestinalTractStructure': {'62834003': ('Upper gastrointestinal ' 'tract structure (body ' 'structure)', [])}, 'UpperInnerQuadrantOfBreast': {'77831004': ('Upper inner quadrant of breast', [6021, 6020, 9514, 7192, 7151, 4])}, 'UpperJugularLymphNode': {'245321008': ('upper jugular lymph node', [7600])}, 'UpperLimb': {'53120007': ('Upper limb', [4030, 4031, 4042, 9514, 7192, 7151, 4, 4009])}, 'UpperLimbLymphNode': {'44914007': ('upper limb lymph node', [7600])}, '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, 7155, 9514, 7192, 7151, 6126])}, 'UpperOuterQuadrantOfBreast': {'76365002': ('Upper outer quadrant of breast', [6021, 6020, 9514, 7192, 7151, 4])}, 'UpperParatrachealLymphNode': {'127927006': ('upper paratracheal lymph node ' '(mediastinal)', [7600])}, 'UpperParatrachealLymphNodeMediastinal': {'127927006': ('Upper paratracheal ' 'lymph node ' '(mediastinal) (body ' 'structure)', [])}, 'UpperUrinaryTract': {'431491007': ('Upper urinary tract', [4030, 4031, 4040, 4042, 9514, 7192, 7151, 4, 4009])}, 'UpperZoneOfLung': {'281392002': ('Upper zone of lung', [6124, 6126])}, 'UpwardGaze': {'255533007': ('Upward gaze', [4201])}, 'UralBlackPiedCattleBreed': {'133556007': ('Ural Black Pied cattle breed', [7480])}, 'Ureter': {'87953007': ('Ureter', [4030, 4031, 4040, 4042, 9514, 7192, 7151, 4009])}, '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)', [625, 623])}, 'Urethra': {'13648007': ('Urethra', [4030, 4031, 7483, 7482, 4042, 9514, 7192, 7151, 4009])}, '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', [7154, 9514, 7192, 7151])}, 'UrinarySystemStructure': {'122489005': ('Urinary system structure (body ' 'structure)', [])}, 'UrinaryTract': {'431938005': ('Urinary tract', [7483, 7482])}, 'Urine': {'78014005': ('Urine', [7197, 7151])}, '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', [6202, 6203])}, 'UrzhumPigBreed': {'132111003': ('Urzhum pig breed', [7480])}, 'UsesEquipment': {'116682006': ('Uses equipment (attribute)', [])}, 'UsingSubstance': {'424361007': ('Using substance (attribute)', [])}, 'UterineArtery': {'91079009': ('Uterine Artery', [12103, 12140, 9514, 7192, 12111, 7151, 3827])}, 'UterineParacervicalLymphNode': {'5394000': ('uterine paracervical lymph node', [7600])}, 'UterineStructure': {'35039007': ('Uterine structure (body structure)', [])}, 'UterineVein': {'60028002': ('Uterine Vein', [12140])}, 'Uterus': {'35039007': ('Uterus', [4030, 10060, 6204, 9514, 7160, 7192, 7151, 6202, 12023, 4, 10044])}, 'UterusAndFallopianTubes': {'110639002': ('Uterus and fallopian tubes', [4030, 4031, 4040, 4042, 9514, 7192, 7151, 4, 4009])}, 'UterusAndFallopianTubesCombinedSite': {'110639002': ('Uterus and fallopian ' 'tubes (combined site) ' '(body structure)', [])}, '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', [9514, 7160, 7192, 7151])}, 'VaginalApproach': {'54300008': ('Vaginal approach (qualifier value)', [])}, 'VaginalIntroitus': {'18857001': ('Vaginal introitus', [4029])}, 'VaginalRoute': {'16857009': ('Vaginal route', [11])}, 'VaginalStructure': {'76784001': ('Vaginal structure (body structure)', [])}, 'VagusNerve': {'88882009': ('vagus nerve', [7710, 7706, 9514, 7192, 7151, 7167])}, '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, 3823, 3271, 12002])}, 'ValvularEndocarditis': {'89736004': ('Valvular endocarditis', [3711])}, 'ValvularHeartDisease': {'368009': ('Valvular heart disease', [12246, 3727, 3201])}, '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', [9514, 7160, 7192, 7151])}, 'VasDeferensStructure': {'57671007': ('Vas deferens structure (body ' 'structure)', [])}, 'VascularCalcification': {'129759000': ('Vascular calcification', [6011, 6010]), '237897009': ('Vascular Calcification', [3491, 3497, 3496, 3495, 7111])}, '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', [642, 638])}, 'VascularFlowFunction': {'58190003': ('Vascular flow, function (observable ' 'entity)', [])}, 'VascularGraft': {'118375008': ('Vascular graft', [9514, 7192, 7151, 4]), '312288001': ('Vascular graft (morphologic abnormality)', [])}, 'VascularMRI': {'241663008': ('vascular MRI', [3820])}, 'VascularResistance': {'251271006': ('Vascular Resistance', [12304]), '88619007': ('Vascular Resistance', [3641])}, 'VascularResistanceFunction': {'88619007': ('Vascular resistance, function ' '(observable entity)', [])}, 'VascularSclerosis': {'107671003': ('Vascular sclerosis', [7156, 9514, 7192, 7151, 3810])}, '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', [621, 622])}, 'Vasodilatation': {'30017007': ('Vasodilatation', [9])}, 'Vasodilator': {'372787008': ('Vasodilator', [621, 622])}, 'VasovagalSyncope': {'398665005': ('Vasovagal syncope', [6062])}, 'VaynolCattleBreed': {'133558008': ('Vaynol cattle breed', [7480])}, 'Vein': {'29092000': ('Vein', [7191, 3496, 3010, 4042, 9514, 7192, 7151, 3630, 7166, 7111, 3607])}, 'VenaAnonyma': {'371951007': ('Vena anonyma', [3630, 3607])}, 'VenaCavaFilter': {'257409000': ('Vena cava filter', [6102, 6138, 6404, 7151, 6202, 6203, 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', [3019])}, 'VenousHemangioma': {'56468002': ('Venous hemangioma (morphologic ' 'abnormality)', [])}, 'VenousNetwork': {'34340008': ('Venous network', [3010, 4042, 9514, 7192, 7151, 4])}, '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', [7710, 7707])}, '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', [6113, 6109, 6102, 9514, 7192, 7151, 4])}, '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', [3700, 3230])}, '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)', [])}, 'VentricularPrematureContraction': {'17338001': ('Ventricular premature ' 'contraction', [3230])}, 'VentricularSeptalDefect': {'30288003': ('Ventricular septal defect', [3700, 12236, 12249, 12286, 3728, 12244, 12248, 3610, 3630])}, 'VentricularSeptalDefectDeviceClosure': {'89814007': ('Ventricular septal ' 'defect device closure', [12247])}, 'VentricularSystole': {'8997002': ('Ventricular Systole', [12233])}, 'VentricularSystoleFunction': {'8997002': ('Ventricular systole, function ' '(observable entity)', [])}, 'VentricularTachycardia': {'25569003': ('Ventricular tachycardia', [3700, 3234, 3230])}, 'VentricularTachycardiaPolymorphic': {'251159007': ('Ventricular tachycardia, ' 'polymorphic', [3234])}, 'VentricularVein': {'195328002': ('Ventricular Vein', [3839, 9514, 7192, 7151, 3827])}, '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', [6109, 6102, 6114, 9514, 7192, 7151])}, 'VertebralArtery': {'85234005': ('Vertebral artery', [3604, 6109, 12104, 12103, 6102, 6117, 3010, 4042, 9514, 7192, 3606, 7151, 3827, 4, 3630])}, 'VertebralCanal': {'61853006': ('Vertebral canal', [6115])}, 'VertebralColumnAndCranium': {'110517009': ('Vertebral column and cranium', [4030, 4031, 4042, 9514, 7192, 4028, 7151, 4, 4009])}, 'VertebralColumnAndCraniumCombinedSite': {'110517009': ('Vertebral column and ' 'cranium (combined ' 'site) (body ' 'structure)', [])}, 'VertebralForamen': {'280734009': ('Vertebral foramen', [6115])}, 'VertexOfHead': {'88986008': ('Vertex of Head', [1002, 1001, 1000])}, 'VertexStructure': {'88986008': ('Vertex structure (body structure)', [])}, 'Vertical': {'33096000': ('Vertical', [2, 6121])}, 'VerticalLongAxis': {'131185001': ('Vertical Long Axis', [501, 27, 26])}, 'VerticalOccipitalFasciculus': {'80434005': ('vertical occipital fasciculus', [7703, 7710])}, 'Verticosubmental': {'399360002': ('verticosubmental', [4010, 501])}, '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])}, 'VesselDepthFromSurface': {'413975003': ('Vessel depth from surface', [12119, 12122])}, 'VesselIntimalCrossSectionalArea': {'415814008': ('Vessel Intimal ' 'Cross-Sectional Area', [12119, 12122])}, 'VesselIntimalCrossSectionalDiameter': {'415814008': ('Vessel intimal ' 'cross-sectional ' 'diameter (observable ' 'entity)', [])}, 'VesselIntimalDiameter': {'415815009': ('Vessel Intimal Diameter', [12119, 12122])}, 'VesselLumenCrossSectionalArea': {'397415007': ('Vessel lumen cross-sectional ' 'area', [12119, 12122, 3482])}, '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', [12119, 3481, 12122])}, 'VesselOrigin': {'397421006': ('Vessel Origin', [3496, 7111])}, 'VesselOutsideDiameter': {'397414006': ('Vessel outside diameter', [12119, 12122])}, 'VestibulocochlearNerve': {'8598002': ('vestibulocochlear nerve', [7710, 7706])}, '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])}, '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)', [])}, '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])}, '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])}, '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', [12304, 12257, 4050, 12271, 3423, 12265, 218, 12259, 7472, 12258, 7469])}, 'VolumeProperty': {'118565006': ('Volume (property) (qualifier value)', [])}, 'VolumeSupportVentilator': {'371787006': ('Volume Support Ventilator', [3554])}, 'VolynskCattleBreed': {'132780000': ('Volynsk cattle breed', [7480])}, 'VomerBone': {'87166008': ('Vomer bone', [9514, 7192, 4028, 7151])}, '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', [9514, 7192, 7151, 4])}, 'VulvalStructure': {'45292006': ('Vulval structure (body structure)', [])}, 'VulvalVestibule': {'23213005': ('Vulval vestibule', [4029])}, '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])}, 'WallisBlacknosedSheepBreed': {'132699004': ('Wallis Blacknosed Sheep breed', [7480])}, 'WallisCountrySheepBreed': {'132702006': ('Wallis Country Sheep breed', [7480])}, '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', [7165, 7196, 7151])}, 'Water': {'11713004': ('Water', [13, 12, 7180, 218, 3850, 300, 7469])}, '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)', [])}, '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])}, '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])}, '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', [7153, 9514, 7192, 7151])}, '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', [7470, 6165, 218, 7469])}, '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', [7483, 7482])}, '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': {'422996004': ('Wolf', [4012]), '82676003': ('Wolf', [7480])}, 'WolfProjection': {'422996004': ('Wolf projection (qualifier value)', [])}, 'WoodenLegGoatBreed': {'131673008': ('Wooden Leg goat breed', [7480])}, 'WrightStain': {'373682001': ('wright stain', [8112])}, 'WristJoint': {'74670003': ('Wrist joint', [4030, 4031, 7304, 1001, 4042, 1000, 9514, 7192, 7151, 4, 4009, 1006])}, '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])}, 'XRayContrastMediaAllergy': {'293638001': ('X-ray Contrast Media Allergy', [1200])}, 'XRayShield': {'65577000': ('X-Ray shield', [10066])}, 'XRayShieldDevice': {'65577000': ('X-ray shield, device (physical object)', [])}, 'Xenon': {'83598005': ('Xenon', [13])}, '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', [1004, 1001, 1000])}, 'XiphoidProcessOfSternum': {'20298003': ('Xiphoid process of sternum', [6115])}, 'Xylazine': {'96230006': ('Xylazine', [625, 623])}, '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])}, '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])}, '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])}, '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', [625, 623])}, 'ZolazepamHydrochloride': {'96227004': ('Zolazepam hydrochloride (substance)', [])}, 'Zygoma': {'13881006': ('Zygoma', [4030, 4031, 4042, 9514, 7192, 4028, 7151, 4, 4009])}, '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", [6205, 6019, 6018])}, '_10OClockPositionOnMammogram': {'129781005': ("10 o'clock position on " 'mammogram (finding)', [])}, '_10thPercentileValueOfPopulation': {'371890005': ('10th Percentile Value of ' 'population', [226, 221, 7465])}, '_111Indium': {'56609000': ('^111^Indium', [18])}, '_113mIndium': {'48895003': ('^113m^Indium', [18])}, '_11Carbon': {'40565003': ('^11^Carbon', [4020])}, '_11OClockPosition': {'129782003': ("11 o'clock position", [6205, 6019, 6018])}, '_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", [6205, 6019, 6018])}, '_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', [4020, 18])}, '_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", [6205, 6019, 6018])}, '_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', [226, 221, 7465])}, '_1SigmaUpperValueOfPopulation': {'371917008': ('1 Sigma Upper Value of ' 'population', [226, 221, 7465])}, '_1stDiagonalCoronaryArtery': {'91750005': ('1st Diagonal Coronary Artery', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, '_1stLeftPosterolateralCoronaryArtery': {'91757008': ('1st Left ' 'Posterolateral ' 'Coronary Artery', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, '_1stMarginalCoronaryArtery': {'91754001': ('1st Marginal Coronary Artery', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, '_1stRightPosterolateralCoronaryArtery': {'91761002': ('1st Right ' 'posterolateral ' 'Coronary Artery', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, '_1stSeptalCoronaryArtery': {'244251006': ('1st Septal Coronary Artery', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, '_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', [4020, 18])}, '_24Sodium': {'58541008': ('^24^Sodium', [18])}, '_252Californium': {'35978008': ('^252^Californium', [9528])}, '_2DMode': {'399064001': ('2D mode', [12224, 6058])}, '_2DModeUltrasound': {'399064001': ('2D mode ultrasound (qualifier value)', [])}, '_2OClockPosition': {'129773009': ("2 o'clock position", [6205, 6019, 6018])}, '_2OClockPositionOnMammogram': {'129773009': ("2 o'clock position on " 'mammogram (finding)', [])}, '_2PartialPerfusion': {'371864007': ('2: Partial Perfusion', [3713])}, '_2SigmaLowerValueOfPopulation': {'371918003': ('2 Sigma Lower Value of ' 'population', [226, 221, 7465])}, '_2SigmaUpperValueOfPopulation': {'371920000': ('2 Sigma Upper Value of ' 'population', [226, 221, 7465])}, '_2ndDiagonalCoronaryArtery': {'91751009': ('2nd Diagonal Coronary Artery', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, '_2ndLeftPosterolateralCoronaryArtery': {'91758003': ('2nd Left ' 'Posterolateral ' 'Coronary Artery', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, '_2ndMarginalCoronaryArtery': {'91755000': ('2nd Marginal Coronary Artery', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, '_2ndRightPosterolateralCoronaryArtery': {'91762009': ('2nd Right ' 'posterolateral ' 'Coronary Artery', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, '_32Phosphorus': {'32505007': ('^32^Phosphorus', [18, 9528])}, '_38Potassium': {'423764008': ('^38^Potassium', [4020])}, '_3CompletePerfusion': {'371865008': ('3: Complete Perfusion', [3713])}, '_3DMode': {'426865009': ('3D mode', [12224, 6058])}, '_3DModeUltrasound': {'426865009': ('3D mode ultrasound (qualifier value)', [])}, '_3OClockPosition': {'129774003': ("3 o'clock position", [6205, 6019, 6018])}, '_3OClockPositionOnMammogram': {'129774003': ("3 o'clock position on " 'mammogram (finding)', [])}, '_3rdDiagonalCoronaryArtery': {'91752002': ('3rd diagonal Coronary Artery', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, '_3rdLeftPosterolateralCoronaryArtery': {'91759006': ('3rd Left ' 'Posterolateral ' 'Coronary Artery', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, '_3rdMarginalCoronaryArtery': {'91756004': ('3rd Marginal Coronary Artery', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, '_3rdRightPosterolateralCoronaryArtery': {'91763004': ('3rd Right ' 'posterolateral ' 'Coronary Artery', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, '_42Potassium': {'59844004': ('^42^Potassium', [18])}, '_43Potassium': {'8202008': ('^43^Potassium', [18])}, '_45Titanium': {'75696008': ('^45^Titanium', [4020])}, '_4OClockPosition': {'129775002': ("4 o'clock position", [6205, 6019, 6018])}, '_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", [6205, 6019, 6018])}, '_5OClockPositionOnMammogram': {'129776001': ("5 o'clock position on " 'mammogram (finding)', [])}, '_5thPercentileValueOfPopulation': {'371888009': ('5th Percentile Value of ' 'population', [226, 221, 7465])}, '_60Cobalt': {'5405008': ('^60^Cobalt', [9527, 18, 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', [4020, 18])}, '_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", [6205, 6019, 6018])}, '_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", [6205, 6019, 6018])}, '_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", [6205, 6019, 6018])}, '_8OClockPositionOnMammogram': {'129779008': ("8 o'clock position on " 'mammogram (finding)', [])}, '_90Strontium': {'14071002': ('^90^Strontium', [9528])}, '_90Yttrium': {'14691008': ('^90^Yttrium', [4020, 18, 9528])}, '_90thPercentileValueOfPopulation': {'371887004': ('90th Percentile Value of ' 'population', [226, 221, 7465])}, '_94mTechnetium': {'424079002': ('^94m^Technetium', [4020])}, '_95thPercentileValueOfPopulation': {'371889001': ('95th Percentile Value of ' 'population', [226, 221, 7465])}, '_97Ruthenium': {'23788009': ('^97^Ruthenium', [18])}, '_99mTechnetium': {'72454006': ('^99m^Technetium', [18])}, '_9OClockPosition': {'129780006': ("9 o'clock position", [6205, 6019, 6018])}, '_9OClockPositionOnMammogram': {'129780006': ("9 o'clock position on " 'mammogram (finding)', [])}, 'ÍPigBreed': {'132327001': ('Í pig breed', [7480])}} concepts['DCM'] = \ {'': {'...': ('...', []), '126330': ('tau_m', [7180, 218, 4107, 7469])}, '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', [10024])}, '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', [6208, 6136])}, 'ACRStandardCTMedicalPhysicsPerformanceMonitoring': {'112249': ('ACR ' 'Standard, CT ' 'medical ' 'physics ' 'performance ' 'monitoring', [6208])}, 'AGN15099889Zr': {'126729': ('AGN-150998 ^89^Zr', [4021])}, 'AIC': {'126223': ('AIC', [7180, 218, 7469])}, 'AIFIgnored': {'126360': ('AIF Ignored', [4103, 4106])}, 'AIN76': {'127272': ('AIN76', [607])}, 'AIN93G': {'127273': ('AIN93G', [607])}, 'AIN93M': {'127274': ('AIN93M', [607])}, 'ANGPattern': {'109902': ('ANG Pattern', [8301])}, 'AP45': {'112300': ('AP+45', [7303]), '112301': ('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])}, 'AbdominalImagingSpecialty': {'128006': ('Abdominal Imaging Specialty', [7449])}, 'AbdominalRadiology': {'128170': ('Abdominal Radiology', [7030])}, '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', [6104, 6102, 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', [6057, 6054])}, 'AbruptInterface': {'111358': ('Abrupt interface', [6153])}, 'Absent': {'121054': ('Absent', [])}, 'AbsoluteOphthalmicThickness': {'111930': ('Absolute ophthalmic thickness', [4263])}, 'AbsoluteRegionalBloodFlow': {'126390': ('Absolute Regional Blood Flow', [4108, 7180, 218, 7469])}, 'AbsoluteRegionalBloodVolume': {'126391': ('Absolute Regional Blood Volume', [4108, 7180, 218, 7469])}, 'AbsoluteValuesOfVentricularMeasurements': {'122608': ('Absolute Values Of ' 'Ventricular ' 'Measurements', [])}, 'AbsorbedDose': {'128513': ('Absorbed Dose', [10070, 7180, 218, 7469])}, 'AccessControlDecision': {'110147': ('Access Control Decision', [401, 403])}, 'AccessionNumber': {'121022': ('Accession Number', [])}, 'AccessoryTray': {'130124': ('Accessory Tray', [9520, 9518])}, 'AccumulatedAverageGlandularDose': {'111637': ('Accumulated Average Glandular ' 'Dose (mammo)', [10050])}, 'AccumulatedCtdivolForwardEstimate': {'113906': ('Accumulated CTDIvol Forward ' 'Estimate', [])}, 'AccumulatedDLPForwardEstimate': {'113905': ('Accumulated DLP Forward ' 'Estimate', [])}, 'AccumulatedXRayDoseData': {'113702': ('Accumulated X-Ray Dose Data', [])}, 'AcetabularCenterOfRotation': {'112303': ('Acetabular Center of Rotation', [7305, 7306])}, 'AcetabularCupInsert': {'112306': ('Acetabular Cup Insert', [7308, 7307])}, 'AcetabularCupMonoblock': {'112307': ('Acetabular Cup Monoblock', [7308, 7307])}, 'AcetabularCupShell': {'112305': ('Acetabular Cup Shell', [7308, 7307])}, '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])}, '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])}, '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', [6052])}, 'AdditionalEvaluationRequestedFromAbnormalScreeningExam': {'111419': ('Additional ' 'evaluation ' 'requested ' 'from ' 'abnormal ' 'screening ' 'exam', [6051])}, 'AdditionalEvaluationRequestedFromPriorStudy': {'111415': ('Additional ' 'evaluation ' 'requested from ' 'prior study', [6051])}, 'AdditionalProjections': {'111135': ('Additional projections', [6029, 6028])}, 'AdditionalTeachingFileInformation': {'128712': ('Additional Teaching File ' 'Information', [7018])}, 'Adenolipoma': {'111248': ('Adenolipoma', [])}, 'Adenomyoepithelioma': {'111250': ('Adenomyoepithelioma', [])}, 'AdhocMeasurements': {'125303': ('Adhoc Measurements', [])}, 'AdiabaticTissueHomogeneityATHModel': {'126346': ('Adiabatic Tissue ' 'Homogeneity (ATH) Model', [4106, 4101])}, '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', [12245])}, 'AdultEchocardiographyProcedureReport': {'125200': ('Adult Echocardiography ' 'Procedure Report', [])}, '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', [6105, 6102])}, 'AirBronchogram': {'112071': ('Air bronchogram', [6105, 6102])}, 'AirChanges': {'127172': ('Air changes', [])}, 'AirCrescent': {'112072': ('Air crescent', [6105, 6102])}, 'AirDetected': {'130175': ('Air detected', [71])}, 'AirFluidLevel': {'112104': ('Air-fluid level', [6103, 6102])}, 'AirSpace': {'112147': ('Air space', [6123])}, '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])}, '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])}, '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', [6007, 6006])}, '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', [])}, 'AnodeTargetMaterial': {'111632': ('Anode Target Material', [])}, 'AnomalousExponentParameter': {'113299': ('Anomalous Exponent Parameter', [7180, 7272, 218, 7469])}, 'AnteriorFirst': {'126833': ('anterior first', [21])}, 'AnteriorInferiorAxis': {'110864': ('Anterior-Inferior Axis', [7184])}, 'AnteriorJunctionLine': {'112088': ('Anterior junction line', [6109, 6112, 6102, 9514, 7192, 7151])}, 'AnteriorPosterior': {'122675': ('Anterior-Posterior', [3838, 12118])}, 'AnteriorPosteriorAxis': {'110862': ('Anterior-Posterior Axis', [7184])}, 'AnteriorSurfaceOfTheRPE': {'128297': ('Anterior surface of the RPE', [9514, 7192, 7151, 4273])}, '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', [6029, 6028])}, 'AorticIntervention': {'122054': ('Aortic Intervention', [3405, 3406])}, 'AorticKnob': {'112102': ('Aortic knob', [6109, 6102, 6117, 9514, 7192, 7151])}, 'ApertureBlock': {'130123': ('Aperture Block', [9517, 9520])}, 'ApexBaseAxis': {'110863': ('Apex-Base Axis', [7184])}, 'ApexToBase': {'110872': ('Apex To Base', [7185])}, 'ApparentDiffusionCoefficient': {'113041': ('Apparent Diffusion Coefficient', [7180, 7272, 218, 7263, 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])}, '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])}, 'ArcBeam': {'130103': ('Arc Beam', [9511, 9524])}, 'ArcOfCalcium': {'122355': ('Arc of Calcium', [])}, 'ArchOfTheAzygosVein': {'112103': ('Arch of the Azygos vein', [6109, 6102, 6117, 9514, 7192, 7151])}, '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', []), '121201': ('Area Outline', [])}, 'AreaSymmetry': {'122545': ('Area Symmetry', [])}, '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', [])}, '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', [7180, 218, 6141, 10069, 7469])}, 'AttenuationCorrectionMethod': {'122713': ('Attenuation correction method', [])}, 'AttenuatorCategory': {'128458': ('Attenuator Category', [])}, 'AttenuatorDescription': {'128468': ('Attenuator Description', [])}, '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])}, 'AutomatedOptical': {'111843': ('Automated Optical', [4253])}, 'AutomatedSlideStainer': {'STAIN': ('Automated Slide Stainer', [33, 32, 30])}, 'AutomaticAdministrationPhase': {'130168': ('Automatic Administration Phase', [62])}, 'AutomaticProgrammedHoldPhase': {'130169': ('Automatic Programmed Hold Phase', [62])}, 'AutomaticWithManualHoldPhase': {'130170': ('Automatic with Manual Hold Phase', [62])}, 'AutomaticWithManualInjectPhase': {'130171': ('Automatic with Manual Inject ' 'Phase', [62])}, 'AutomaticallyDetectedAIFROI': {'126363': ('Automatically Detected AIF ROI', [4103, 4106])}, 'Autorefraction': {'AR': ('Autorefraction', [33, 29, 30])}, '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', [6031, 6030])}, 'AxillaryNodeWithCalcifications': {'111252': ('Axillary node with ' 'calcifications', [6031, 6030])}, 'AxillaryNodeWithLymphoma': {'111300': ('Axillary node with lymphoma', [6030, 6033])}, 'AzygoesophagealRecessInterface': {'112090': ('Azygoesophageal recess ' 'interface', [6113, 6109, 6102, 9514, 7192, 7151])}, 'BIC': {'126224': ('BIC', [7180, 218, 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', [6087, 6081])}, 'BRCA2BreastCancerGene': {'111557': ('BRCA2 breast cancer gene', [6087, 6081])}, 'BRCA3BreastCancerGene': {'111558': ('BRCA3 breast cancer gene', [6087, 6081])}, 'BREPRadiationTransportModel': {'128406': ('BREP Radiation Transport Model', [10065])}, 'BSA1Point219': {'122572': ('BSA^1.219', [3455])}, 'BSAEquals0Point0004688WT0Point81680Point0154LogWT': {'122246': ('BSA = ' '0.0004688 * ' 'WT ^ ' '(0.8168 - ' '0.0154 * ' 'log(WT))', [])}, '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*HT^ ' '0.42246', [])}, 'BSAEquals0Point0235WT0Point51456Htcm0Point42246': {'122242': ('BSA = ' '0.0235*WT^0.51456*HTcm^ ' '0.42246', [3663])}, 'BSAEquals0Point024265WT0Point5378HT0Point3964': {'122243': ('BSA = ' '0.024265*WT^0.5378*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])}, 'BSAEquals3Point207WT0Point7285To0Point0188LogWTHT0Point3': {'122240': ('BSA ' '= ' '3.207*WT^(0.7285-0.0188 ' 'log ' '(WT)) ' '*HT^0.3', [])}, 'BSAEqualsHTWT360Point5': {'122244': ('BSA = (HT * WT/36) ^0.5', [3663])}, 'BackOfCorneaToFrontOfLens': {'111777': ('Back Of Cornea To Front Of Lens', [4239])}, 'Background': {'125040': ('Background', [7169, 7165, 7168, 7159, 7196, 7194, 7151])}, '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', [33, 32])}, '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', [6104, 6102])}, 'BeamBlock': {'128431': ('Beam Block', [10066])}, 'BeamShapingNote': {'130023': ('Beam Shaping Note', [])}, 'BeatDetected': {'109018': ('Beat detected (accepted)', [3337]), '109019': ('Beat detected (rejected)', [3337])}, 'BeatNumber': {'122149': ('Beat Number', [])}, '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])}, 'BehaviorOfTheFindingSite': {'125312': ('Behavior of the Finding Site', [12302])}, 'BenignCalcifications': {'111256': ('Benign Calcifications', [6031, 6030])}, 'BenignCystWithBlood': {'111255': ('Benign cyst with blood', [6031, 6030])}, 'Benralizumab89Zr': {'126722': ('Benralizumab ^89^Zr', [4021])}, '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', [7180, 218, 7469])}, 'BiomagneticImaging': {'BI': ('Biomagnetic Imaging', [33, 29, 30])}, 'BiomedicalEngineering': {'128171': ('Biomedical Engineering', [7030])}, 'BiometryGroup': {'125005': ('Biometry Group', [])}, 'BiophysicalProfile': {'125006': ('Biophysical Profile', [])}, 'BiopsyLocalizer': {'121312': ('Biopsy localizer', [7201])}, 'BiopsyShouldBeConsidered': {'111143': ('Biopsy should be considered', [6029, 6028])}, 'BiopsyShouldBeStronglyConsidered': {'111148': ('Biopsy should be strongly ' 'considered', [6029, 6028])}, 'Bioptome': {'122052': ('Bioptome', [3429])}, 'BiosafetyConditions': {'127010': ('Biosafety conditions', [])}, 'BiplaneEllipse': {'125211': ('Biplane Ellipse', [12227, 12228])}, 'Blinatumomab89Zr': {'126727': ('Blinatumomab ^89^Zr', [4021])}, 'BlindEstimationOfAIF': {'126364': ('Blind Estimation of AIF', [4103, 4106])}, 'BlindSpotMonitoring': {'111844': ('Blind Spot Monitoring', [4253])}, 'BloodCarbonDioxideSaturation': {'122187': ('Blood Carbon dioxide saturation', [3526])}, 'BloodLabMeasurements': {'122125': ('Blood lab measurements', [])}, 'BloodOxygenContent': {'122185': ('Blood Oxygen content', [3525])}, 'BloodOxygenationLevel': {'110819': ('Blood Oxygenation Level', [7180, 218, 7469])}, 'BloodTemperature': {'122183': ('Blood temperature', [])}, 'BloodTingedColor': {'111454': ('Blood tinged color', [6067])}, 'BloodVelocityMean': {'122205': ('Blood velocity, mean', [3612, 12261, 12276, 12267, 12266, 12268, 12264, 12263])}, 'BloodVelocityMeasurements': {'122124': ('Blood velocity measurements', [])}, 'BloodVelocityMinimum': {'122206': ('Blood velocity, minimum', [3612, 12261, 12276, 12267, 12266, 12268, 12264, 12263])}, 'BloodVelocityPeak': {'122207': ('Blood velocity, peak', [3612, 12261, 12276, 12267, 12266, 12268, 12264, 12263])}, '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])}, 'BodyFrame': {'130117': ('Body Frame', [9520, 7157, 7151, 9505, 9513, 7193])}, 'BodyHabitusAttenuation': {'122743': ('Body habitus attenuation', [3115])}, 'Bolting': {'112320': ('Bolting', [7310])}, 'BolusArrivalTime': {'126371': ('Bolus Arrival Time', [7180, 4109, 218, 7469])}, 'BolusShapingCurve': {'130210': ('Bolus Shaping Curve', [])}, 'BoneMineralDensitometry': {'BMD': ('Bone Mineral Densitometry', [33, 29, 30])}, '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', [])}, 'BrachytherapyChannel': {'130080': ('Brachytherapy channel', [9506, 9520, 7157, 7151, 7193])}, 'BrachytherapyChannelShield': {'130079': ('Brachytherapy channel shield', [9506, 9520, 7157, 7151, 7193])}, 'BrachytherapyDevice': {'130045': ('Brachytherapy Device', [9502])}, 'BrachytherapyIsotope': {'130038': ('Brachytherapy Isotope', [])}, 'BrachytherapySourceApplicator': {'130078': ('Brachytherapy source applicator', [9506, 9520, 7157, 7151, 7193])}, 'BrandName': {'111529': ('Brand Name', [])}, 'BreastAttenuation': {'122744': ('Breast attenuation', [3115])}, 'BreastBackgroundEchotexture': {'111350': ('Breast background echotexture', [])}, 'BreastBoard': {'130116': ('Breast Board', [9520, 7157, 7151, 9505, 9513, 7193])}, 'BreastComposition': {'111006': ('Breast composition', [])}, 'BreastFeedingHistory': {'111543': ('Breast feeding history', [])}, 'BreastGeometry': {'111100': ('Breast geometry', [6016, 6054, 6014])}, '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])}, '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])}, '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])}, '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', [])}, 'CTDoseLengthProductTotal': {'113813': ('CT Dose Length Product Total', [10050])}, 'CTEffectiveDoseTotal': {'113814': ('CT Effective Dose Total', [])}, 'CTProtocol': {'CTPROTOCOL': ('CT Protocol', [33, 32])}, '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', [6013, 6012])}, 'CalcificationsSeenInTheCore': {'111446': ('Calcifications seen in the core', [6066])}, 'CalcificationsWithinAMass': {'111346': ('Calcifications within a mass', [6013, 6012])}, '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', [6142])}, 'CalciumScoringAnalysis': {'122603': ('Calcium Scoring Analysis', [])}, 'CalciumScoringCalibration': {'122659': ('Calcium Scoring Calibration', [])}, 'CalciumVolume': {'122660': ('Calcium Volume', [])}, 'Calculated': {'121428': ('Calculated', []), '125315': ('Calculated', [12303])}, 'CalculationDescription': {'112034': ('Calculation Description', [])}, 'CalculationFailure': {'114008': ('Calculation failure', [42])}, 'Calibration': {'122505': ('Calibration', [6061, 6051, 6058])}, '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', [33, 29, 30])}, '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', [6109, 6102, 9514, 7192, 6111, 7151])}, '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', [9520, 7157, 7151, 9505, 9513, 7193])}, '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])}, 'Center': {'111010': ('Center', [])}, 'CenterOfGravity': {'122475': ('Center of Gravity', [3458])}, 'CenterOfMass': {'128138': ('Center of Mass', [1011])}, 'CenterOfTableHead': {'128751': ('Center of Table Head', [])}, 'CenterlineWallMotionAnalysis': {'122449': ('Centerline Wall Motion Analysis', [])}, 'CentralBreathingPosition': {'122612': ('central breathing position', [3823])}, 'CentralLine': {'112174': ('Central line', [6102, 6138, 6404, 7151, 7193])}, 'Centrilobular': {'112156': ('Centrilobular', [6128])}, 'CentrilobularStructures': {'112087': ('Centrilobular structures', [6109, 6102, 9514, 7192, 6111, 7151])}, '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])}, 'ChangeOfProcedureForCorrectCharging': {'110509': ('Change of procedure for ' 'correct charging', [9301, 9300, 9303])}, 'Checkerboard': {'114216': ('Checkerboard', [8202])}, 'ChestCADReport': {'112000': ('Chest CAD Report', [])}, 'ChestTube': {'112173': ('Chest tube', [6102, 6138, 6404, 7151, 6202, 6203, 7193])}, 'ChiSquare': {'126221': ('Chi-square', [7180, 218, 7469])}, 'CholineC11': {'126703': ('Choline C^11^', [4021])}, 'CholineCreatineRatio': {'113081': ('Choline/Creatine Ratio', [7186, 7180, 218, 4032, 4033, 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', [])}, 'Circumscribed': {'112142': ('Circumscribed', [])}, '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])}, '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', [6064, 6054])}, 'CmabU3689Zr': {'126746': ('cMAb U36 ^89^Zr', [4021])}, 'Coalescent': {'112157': ('Coalescent', [6128])}, 'CockroftGaultFormulaEstimationOfGFR': {'113570': ('Cockroft-Gault Formula ' 'estimation of GFR', [10047])}, 'CoilMarker': {'129301': ('Coil Marker', [7112, 7111])}, 'Coin': {'112178': ('Coin', [6102, 6138, 6404, 7151, 6202, 6203, 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', [])}, '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])}, '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])}, 'ComparisonToPreviousExams': {'111424': ('Comparison to previous exams', [6052, 6053])}, 'ComparisonToPreviousFindings': {'111424': ('Comparison to previous findings', [])}, 'ComparisonWithPriorExamDone': {'122140': ('Comparison with Prior Exam Done', [])}, 'CompleteAcquisitionContent': {'113034': ('Complete Acquisition Content', [7010])}, 'CompleteRenderingForPresentation': {'121332': ('Complete Rendering for ' 'Presentation', [7006])}, 'CompleteStudyContent': {'113032': ('Complete Study Content', [7010])}, 'Complex': {'111363': ('Complex', [6154])}, 'ComplexCyst': {'111460': ('Complex cyst', [6064, 6054])}, 'ComplicatedCyst': {'111130': ('Complicated cyst', [6064, 6054])}, '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])}, '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', [33, 29, 30])}, 'ComputedTomography': {'CT': ('Computed Tomography', [33, 29, 30])}, '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', [6052])}, 'ConditionEffectiveDoseMeasured': {'113816': ('Condition Effective Dose ' 'measured', [])}, 'ConfirmationOfTarget': {'111442': ('Confirmation of target', [])}, 'ConfocalImaging': {'114207': ('Confocal imaging', [8201])}, 'ConformalArcBeam': {'130104': ('Conformal Arc Beam', [9511, 9524])}, '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', [33, 32])}, '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', [7180, 218, 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', [])}, 'ConversionFactor': {'128528': ('Conversion Factor', [])}, 'CooperLigamentChanges': {'111111': ("Cooper's ligament changes", [6056, 6016, 6015, 6054, 6014])}, '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', [6103, 6102])}, 'CoronaryArteryBypassDuringThisAdmission': {'122164': ('Coronary Artery ' 'Bypass During This ' 'Admission', [])}, '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])}, 'CorrelatesToPhysicalExamFindings': {'111381': ('Correlates to physical exam ' 'findings', [6158])}, 'CorrelatesToUltrasoundFindings': {'111384': ('Correlates to ultrasound ' 'findings', [6158])}, 'CorrelationOfGLCM': {'126066': ('Correlation of GLCM', [])}, 'CorrelationToOtherFindings': {'111380': ('Correlation to other Findings', [])}, 'CountryOfLanguage': {'121046': ('Country of Language', [])}, 'CreatineAndCholine': {'113094': ('Creatine and Choline', [7186, 7180, 218, 4032, 4033, 7469])}, 'CreatineCholineCitrateRatio': {'113096': ('Creatine+Choline/Citrate Ratio', [7186, 7180, 218, 4032, 4033, 7469])}, 'CrossBScanPattern': {'128283': ('Cross B-scan pattern', [4272])}, 'CrossedGrid': {'111645': ('Crossed grid', [10017])}, 'Crosstable': {'111069': ('Crosstable', [4011, 502])}, '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', [])}, 'CurrentPregnancyKnownOrSuspectedMalformationsSyndromes': {'111573': ('Current ' 'pregnancy, ' 'known ' 'or ' 'suspected ' 'malformations/syndromes', [6088, 6087])}, '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', [7112, 7111])}, 'CystFill': {'111430': ('Cyst fill', [6057, 6054])}, 'Cystoscopy': {'CS': ('Cystoscopy', [])}, 'CytologicAnalysis': {'111147': ('Cytologic analysis', [6029, 6028])}, 'DICOMInstancesAccessed': {'110103': ('DICOM Instances Accessed', [400])}, 'DICOMInstancesTransferred': {'110104': ('DICOM Instances Transferred', [400])}, 'DICOMObjectCatalog': {'121181': ('DICOM Object Catalog', [])}, 'DICOMStudyDeleted': {'110105': ('DICOM Study Deleted', [400])}, 'DINGeometryPattern': {'109931': ('DIN Geometry Pattern', [8301]), '109932': ('DIN Geometry Pattern', [])}, 'DINGrayscalePattern': {'109931': ('DIN Grayscale Pattern', []), '109932': ('DIN Grayscale 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])}, 'DSI': {'113224': ('DSI', [7260, 7261])}, 'DTI': {'113223': ('DTI', [7260])}, 'DVD': {'110033': ('DVD', [405])}, 'DVDImported': {'110025': ('DVD Imported', [7008])}, 'DW': {'126222': ('D-W', [7180, 218, 7469])}, 'DarkBrownColor': {'111452': ('Dark brown color', [6067])}, 'DarkRedColor': {'111451': ('Dark red color', [6067])}, 'DarkfieldIllumination': {'111745': ('Darkfield illumination', [8123])}, 'DataRetentionPolicyExpired': {'113039': ('Data Retention Policy Expired', [7010])}, '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])}, '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])}, 'DeliveryVerificationNote': {'130031': ('Delivery Verification Note', [])}, 'DensitometricLuminalCrossSectionalAreaGraph': {'122517': ('Densitometric ' 'Luminal ' 'Cross-sectional ' 'Area Graph', [])}, 'DensitometricMethod': {'122474': ('Densitometric method', [3470])}, 'Density': {'111103': ('Density', []), '112118': ('Density', [6104, 6102])}, 'DepartmentSystemScheduler': {'DSS': ('Department System Scheduler', [30])}, 'DependentOpacity': {'112119': ('Dependent opacity', [6104, 6102])}, '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', [])}, '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', [])}, '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', [])}, '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', [6031, 6030])}, 'DiagnosisInputUsed': {'128218': ('Diagnosis Input Used', [7010])}, 'DiagnosticAdministration': {'130249': ('Diagnostic Administration', [72])}, 'DiagnosticSourceImages': {'128181': ('Diagnostic Source Images', [9510, 7010, 9509])}, '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', [33, 29, 30])}, 'DiaphragmaticAttenuation': {'122745': ('Diaphragmatic attenuation', [3115])}, 'DiastolicBloodVelocityMean': {'122201': ('Diastolic blood velocity, mean', [3612, 12261, 12276, 12267, 12266, 12268, 12264, 12263])}, 'DiastolicBloodVelocityPeak': {'122202': ('Diastolic blood velocity, peak', [3612, 12261, 12276, 12267, 12266, 12268, 12264, 12263])}, '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])}, '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', [7180, 7272, 218, 7469])}, 'DiffusionImageAnalysis': {'129105': ('Diffusion image analysis', [7203])}, 'DiffusionTractography': {'129106': ('Diffusion tractography', [7203])}, 'DiffusionWeighted': {'113043': ('Diffusion weighted', [7270, 7180, 218, 7469])}, 'DigitalFluoroscopy': {'DF': ('Digital fluoroscopy', [])}, 'DigitalMammography': {'111409': ('Digital Mammography', [6083, 6050])}, 'DigitalMicroscopy': {'DM': ('Digital microscopy', [])}, 'DigitalRadiography': {'DX': ('Digital Radiography', [33, 29, 30])}, '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', [12303, 12227])}, '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', [9301, 9300, 9303, 9302])}, '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', [7308, 7307])}, 'DistalFindingSite': {'121117': ('Distal Finding Site', [])}, 'DistalReference': {'122381': ('Distal Reference', [3486])}, 'DistalStentMargin': {'122386': ('Distal Stent Margin', [3487])}, 'Distance': {'121206': ('Distance', [7470, 6165, 218, 10069, 7469])}, 'DistanceCorrection': {'128527': ('Distance Correction', [10069])}, 'DistanceFromAnus': {'112233': ('Distance from anus', [6212])}, 'DistanceFromChestWall': {'121244': ('Distance from chest wall', [6165])}, '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])}, 'DistributedDiffusionCoefficient': {'113298': ('Distributed Diffusion ' 'Coefficient', [7180, 7272, 218, 7469])}, 'DistributionDescriptor': {'112006': ('Distribution Descriptor', [])}, 'DistributionRepresentation': {'128413': ('Distribution Representation', [])}, 'DivideByZero': {'114003': ('Divide by zero', [42])}, 'DoctorCanceledProcedure': {'110500': ('Doctor canceled procedure', [9301, 9300, 9303])}, 'Document': {'121003': ('Document', []), 'DOC': ('Document', [33, 32])}, 'DocumentDigitizerEquipment': {'DOCD': ('Document Digitizer Equipment', [7005])}, 'DocumentTitle': {'121144': ('Document Title', [])}, 'DocumentTitleModifier': {'113011': ('Document Title Modifier', [])}, 'DogRegistryOfAmerica': {'109212': ('Dog Registry of America', [7481])}, 'DopplerAngle': {'125106': ('Doppler Angle', [])}, 'DopplerAudio': {'109113': ('Doppler audio', [3000])}, 'DopplerOCTA': {'128256': ('Doppler OCT-A', [4270])}, 'DopplerVolumeFlow': {'125219': ('Doppler Volume Flow', [12231, 12227])}, 'DoseAreaProduct': {'122130': ('Dose Area Product', [])}, 'DoseAreaProductTotal': {'113722': ('Dose Area Product Total', [10050])}, 'DoseCalculationBoundingVolume': {'130065': ('Dose Calculation Bounding ' 'Volume', [9535])}, 'DoseCalculationImageSeries': {'128186': ('Dose Calculation Image Series', [7010, 7023])}, 'DoseCalibrator': {'113541': ('Dose Calibrator', [10041])}, 'DoseCheckAlertDetails': {'113900': ('Dose Check Alert Details', [])}, 'DoseCheckNotificationDetails': {'113908': ('Dose Check Notification Details', [])}, 'DoseFrequency': {'111578': ('Dose frequency', [6092])}, 'DoseGradient': {'128488': ('Dose Gradient', [10063])}, 'DoseImage': {'121342': ('Dose Image', [10063])}, 'DoseMeasurementDevice': {'113794': ('Dose Measurement Device', [])}, 'DosePointCloud': {'128496': ('Dose Point Cloud', [10063])}, 'DoseRP': {'113738': ('Dose (RP)', [])}, 'DoseRPTotal': {'113725': ('Dose (RP) Total', [])}, 'DosimeterType': {'113818': ('Dosimeter Type', [])}, 'DosimetricResult': {'128190': ('Dosimetric Result', [7010, 7023])}, 'DosingFactor': {'130190': ('Dosing Factor', [])}, 'DoubleExposure': {'113026': ('Double exposure', [7011])}, 'DoubleProduct': {'122708': ('Double Product', [])}, 'DrugAdministered': {'122083': ('Drug administered', [3409])}, 'DrugEnd': {'122082': ('Drug end', [3409])}, 'DrugProductIdentifier': {'113510': ('Drug Product Identifier', [])}, 'DrugStart': {'122081': ('Drug start', [3409])}, 'DuctNarrowing': {'111429': ('Duct narrowing', [6057, 6054])}, 'DuctalAdenoma': {'111258': ('Ductal adenoma', [6031, 6030])}, 'DuctalHyperplasia': {'111249': ('Ductal hyperplasia', [])}, 'Ductography': {'111139': ('Ductography', [])}, 'DuplexDoppler': {'DD': ('Duplex Doppler', [])}, 'DuplicateOrder': {'110510': ('Duplicate order', [9301, 9300, 9303, 9302])}, 'DurationOfAdministration': {'122095': ('Duration of administration', [3410])}, 'DurationOfIntervention': {'122106': ('Duration of Intervention', [])}, 'DuringTransport': {'127102': ('During transport', [634])}, 'DuringVoiding': {'109137': ('During voiding', [91])}, 'DynamicContrastMRMeasurementReport': {'126002': ('Dynamic Contrast MR ' 'Measurement Report', [7021])}, 'DynamicLight': {'111630': ('Dynamic light', [4203])}, '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])}, 'EEMCrossSectionalArea': {'122333': ('EEM Cross-Sectional Area', [3482])}, 'EEMDiameter': {'122330': ('EEM Diameter', [3481])}, 'EEMDiameterRatio': {'122352': ('EEM Diameter Ratio', [3484])}, 'EEMVolume': {'122371': ('EEM Volume', [3485])}, 'EPProcedurePhase': {'109061': ('EP Procedure Phase', [])}, 'EarlyGestation': {'125009': ('Early Gestation', [])}, 'EchoPattern': {'111360': ('Echo pattern', [])}, 'Echocardiography': {'EC': ('Echocardiography', [])}, 'EchogenicHalo': {'111359': ('Echogenic halo', [6153])}, 'Echogenicity': {'110849': ('Echogenicity', [7180, 218, 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', [7180, 218, 7469])}, 'ElectricalFailure': {'111217': ('Electrical failure', [6041, 6135, 7011])}, 'Electrocardiography': {'ECG': ('Electrocardiography', [33, 29, 30])}, 'ElectrodePlacement': {'122141': ('Electrode Placement', [])}, 'ElectromechanicalDelay': {'125320': ('Electromechanical Delay', [12307])}, '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])}, 'Email': {'110031': ('Email', [405])}, 'EmbryonicKidney': {'127801': ('Embryonic kidney', [645])}, '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])}, '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', [])}, 'Endoleak': {'122680': ('endoleak', [3813])}, 'EndorectalTransducer': {'125264': ('Endorectal Transducer', [12035])}, 'Endoscopy': {'ES': ('Endoscopy', [33, 29, 30])}, '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': ('Entire Pullback', []), '122384': ('Entire Pullback', [3487])}, 'EntranceExposureAtRP': {'111636': ('Entrance Exposure at RP', [10050])}, 'EntranceExposureToA4Point2cmBreastThickness': {'113865': ('Entrance exposure ' 'to a 4.2 cm ' 'breast thickness', [10025])}, 'EnvironmentalExposureHistory': {'111547': ('Environmental Exposure History', [])}, 'EnvironmentalFactor': {'111548': ('Environmental Factor', [])}, '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', [9301, 9300])}, 'EquipmentFailure': {'110501': ('Equipment failure', [9301, 9300, 4221, 4222, 3427, 9302, 71]), '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', [])}, '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', [10070, 7180, 218, 7469])}, '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])}, 'Estimated': {'121427': ('Estimated', [])}, 'EstimatedExtravasationActivity': {'113506': ('Estimated Extravasation ' 'Activity', [])}, 'EstimatedExtravasationVolume': {'130214': ('Estimated Extravasation Volume', [])}, 'EstimatedNormalFlow': {'122555': ('Estimated Normal Flow', [])}, 'EstimatedTimeframe': {'111395': ('Estimated Timeframe', [])}, 'EstrogenReceptor': {'111475': ('Estrogen receptor', [])}, 'Euler': {'113218': ('Euler', [7262])}, 'EuropiumOrEuropiumCompound': {'113711': ('Europium or Europium compound', [])}, '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', [])}, 'Explantation': {'111510': ('Explantation', [6072])}, 'Export': {'110106': ('Export', [400])}, 'ExposedRange': {'113899': ('Exposed Range', [])}, 'Exposure': {'113736': ('Exposure', [])}, 'ExposureIndex': {'113845': ('Exposure Index', [])}, 'ExposureTime': {'113735': ('Exposure Time', []), '113824': ('Exposure Time', [])}, 'ExposureTimePerRotation': {'113834': ('Exposure Time per Rotation', [])}, 'ExtendedPatientAnatomyModel': {'130068': ('Extended Patient Anatomy Model', [9507])}, 'ExtendedRenderingForPresentation': {'121334': ('Extended Rendering for ' 'Presentation', [7006])}, 'ExtendedToftsModel': {'126341': ('Extended Tofts Model', [4106, 4101])}, 'ExternalBodyModel': {'130047': ('External Body Model', [9501, 9502])}, 'ExternalBodyStructure': {'130047': ('External Body Structure', [])}, 'ExternalCameraPhotography': {'XC': ('External-camera Photography', [33, 29, 30])}, 'ExternalDataSource': {'111781': ('External Data Source', [4240])}, 'ExternalTransducer': {'125261': ('External Transducer', [12035])}, 'ExtraAbdominalDesmoid': {'111260': ('Extra abdominal desmoid', [])}, 'ExtractionOfIndividualSubjectFromGroup': {'113131': ('Extraction of ' 'individual subject ' 'from group', [7203])}, 'Extravasation': {'111428': ('Extravasation', [6057, 6054])}, 'ExtravasationVisibleInImage': {'113568': ('Extravasation visible in image', [9300, 60, 10043])}, 'ExtremelySmall': {'112131': ('Extremely small', [6118])}, 'FACT': {'113214': ('FACT', [7262])}, 'FLB457C11': {'126706': ('FLB 457 C^11^', [4021])}, 'FWPByGACampbell1991': {'128040': ('FWP by GA, Campbell, 1991', [12016, 12012])}, 'FWPByGAHadlock1991': {'128041': ('FWP by GA, Hadlock, 1991', [12016, 12012])}, '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', [6088, 6087])}, 'FamilyHistoryOfProstateCancer': {'111562': ('Family history of prostate ' 'cancer', [6087, 6081])}, 'FamilyHistoryUnknown': {'111563': ('Family history unknown', [6087, 6081])}, 'FamilyMemberWithRiskFactor': {'111537': ('Family Member with Risk Factor', [])}, 'FastDiffusionCoefficient': {'113292': ('Fast Diffusion Coefficient', [7180, 7272, 218, 7469])}, 'FastDiffusionCoefficientFraction': {'113293': ('Fast Diffusion Coefficient ' 'Fraction', [7180, 7272, 218, 7469])}, 'FastMode': {'114211': ('Fast mode', [8202])}, 'FastingDuration': {'113550': ('Fasting Duration', [])}, 'FatFraction': {'129100': ('Fat fraction', [7180, 218, 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', [7457, 7455])}, 'FemaleChangedToMale': {'FC': ('Female changed to Male', [7455])}, 'FemalePseudohermaphrodite': {'FP': ('Female Pseudohermaphrodite', [7455])}, 'FemoralHeadBallComponent': {'112308': ('Femoral Head Ball Component', [7308, 7307])}, 'FemoralHeadConeTaperComponent': {'112309': ('Femoral Head Cone Taper ' 'Component', [7308, 7307])}, 'FemoralHeadResurfacingComponent': {'112317': ('Femoral Head Resurfacing ' 'Component', [7308, 7307])}, 'FemoralStem': {'112310': ('Femoral Stem', [7308, 7307])}, 'FemoralStemComponent': {'112313': ('Femoral Stem Component', [7308, 7307])}, 'FemoralStemDistalComponent': {'112311': ('Femoral Stem Distal Component', [7308, 7307])}, 'FemoralStemProximalComponent': {'112312': ('Femoral Stem Proximal Component', [7308, 7307])}, 'FemurHeadCenterOfRotation': {'112304': ('Femur Head Center of Rotation', [7305, 7306])}, 'FetalBiometry': {'125002': ('Fetal Biometry', [])}, 'FetalBiometryRatios': {'125001': ('Fetal Biometry Ratios', [])}, 'FetalCardiacUltrasoundReport': {'125196': ('Fetal Cardiac Ultrasound Report', [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, 3497, 3495])}, 'Fibroadenolipoma': {'111264': ('Fibroadenolipoma', [6031, 6030])}, 'FibroadenomatoidHyperplasia': {'111263': ('Fibroadenomatoid hyperplasia', [6031, 6030])}, 'Fibrocalcific': {'112163': ('Fibrocalcific', [6132])}, 'Fibronodular': {'112148': ('Fibronodular', [6123])}, 'FiducialAlignment': {'125022': ('Fiducial Alignment', [8203, 7100])}, 'FiducialFeature': {'122340': ('Fiducial feature', [])}, 'FiducialIntent': {'112369': ('Fiducial Intent', [])}, 'FiducialMark': {'112171': ('Fiducial mark', [6102, 6138, 6404, 7110, 7151, 6202, 6203, 7193])}, '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', [7180, 218, 7469])}, 'FillerNumber': {'121021': ('Filler Number', [])}, 'Film': {'110010': ('Film', [405]), '113951': ('Film', [10030])}, 'FilmDigitizer': {'FILMD': ('Film Digitizer', [7005, 30])}, 'FilmScreenMammography': {'111408': ('Film Screen Mammography', [6083, 6050])}, 'FilteredBackProjection': {'113962': ('Filtered Back Projection', [10033])}, 'FinalReport': {'128005': ('Final Report', [9233])}, 'Finding': {'121071': ('Finding', [3419, 9000, 6053, 7002])}, 'FindingObservationType': {'125305': ('Finding Observation Type', [])}, 'Findings': {'121070': ('Findings', [6052])}, 'FinePleomorphicCalcification': {'111344': ('Fine pleomorphic calcification', [6011, 6010])}, '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', [4106, 4101])}, 'FixationOrPositioningDevice': {'130044': ('Fixation or Positioning Device', [9502])}, 'FixedBeamDirection': {'125257': ('Fixed beam direction', [12034])}, 'FixedDp': {'113267': ('Fixed-Dp', [7274])}, 'FixedDurationPauseEnded': {'130155': ('Fixed duration pause ended', [71])}, 'FixedGrid': {'111641': ('Fixed grid', [10017])}, '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])}, 'FleischTable': {'122254': ('Fleisch table', [3664])}, 'FleischnerLines': {'112107': ("Fleischner's line(s)", [6103, 6102])}, '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', [7180, 218, 7469])}, 'FlowVelocity': {'110828': ('Flow Velocity', [7180, 218, 7469])}, 'FlubatineF18': {'126503': ('Flubatine F^18^', [4021]), '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])}, '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)', [6029, 6028])}, '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])}, 'FractalDimension': {'126050': ('Fractal Dimension', [218, 7468])}, 'FractionalAnisotropy': {'110808': ('Fractional Anisotropy', [7180, 7271, 218, 7263, 7469])}, 'FractionalChange': {'125314': ('Fractional Change', [12303])}, 'FractionalKurtosisAnisotropy': {'113209': ('Fractional Kurtosis Anisotropy', [7263])}, 'FractionalOccupancySegmentation': {'110855': ('Fractional Occupancy ' 'Segmentation', [7180, 218, 7469])}, 'FractionalProbabilisticSegmentation': {'110854': ('Fractional Probabilistic ' 'Segmentation', [7180, 218, 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])}, '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', [12230, 12227])}, 'FullCardiacCycle': {'125324': ('Full Cardiac Cycle', [12307])}, 'FullFidelityImage': {'121327': ('Full fidelity image', [7205])}, 'FunctionalImage': {'121339': ('Functional image', [7201])}, 'Fundoscopy': {'FS': ('Fundoscopy', [])}, 'GA20189Zr': {'126731': ('GA201 ^89^Zr', [4021])}, 'GDPattern': {'109903': ('GD Pattern', [8301])}, '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', [4106, 4101])}, 'GammaDistributionMode': {'113297': ('Gamma Distribution Mode', [7180, 7272, 218, 7469])}, 'GammaDistributionModel': {'113253': ('Gamma distribution model', [7273])}, 'GammaDistributionScaleParameter': {'113295': ('Gamma Distribution Scale ' 'Parameter', [7180, 7272, 218, 7469])}, 'GammaDistributionShapeParameter': {'113296': ('Gamma Distribution Shape ' 'Parameter', [7180, 7272, 218, 7469])}, 'GanglionCellComplexThickness': {'111926': ('Ganglion cell complex thickness', [4262])}, 'GastrointestinalImagingSubjectMatter': {'128731': ('Gastrointestinal imaging ' 'subject matter', [7017])}, 'GaussianBlur': {'113088': ('Gaussian blur', [7203])}, 'GeneralMicroscopy': {'GM': ('General Microscopy', [33, 29, 30])}, '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', [])}, 'GenitourinaryImagingSubjectMatter': {'128732': ('Genitourinary imaging ' 'subject matter', [7017])}, 'GeometricCenterpoint': {'128137': ('Geometric Centerpoint', [1011])}, 'GeometricIsocenter': {'122486': ('Geometric Isocenter', [3452])}, 'GeometricNonIsocenter': {'122487': ('Geometric Non-Isocenter', [3452])}, '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', [7186, 7180, 218, 4032, 4033, 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])}, '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', [])}, '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', [8131])}, 'GroundGlassOpacity': {'112120': ('Ground glass opacity', [6104, 6102])}, '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', [6088, 6087])}, 'GynecologicSurgery': {'111568': ('Gynecologic surgery', [6088, 6087])}, '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', [6105, 6102])}, 'HardCopy': {'HC': ('Hard Copy', [33, 32])}, 'HardCopyPrintServer': {'PRINT': ('Hard Copy Print Server', [30])}, 'HardwareConfiguration': {'110130': ('Hardware Configuration', [401, 403])}, 'HeadAndNeckImagingSpecialty': {'128008': ('Head and Neck Imaging Specialty', [7449])}, 'HeadAndNeckMask': {'130112': ('Head and Neck Mask', [9520, 7157, 7151, 9505, 9513, 7193])}, 'HeadFootAxis': {'110861': ('Head-Foot Axis', [7184])}, 'HeadMask': {'130111': ('Head Mask', [9520, 7157, 7151, 9505, 9513, 7193])}, 'HeadOfCardiology': {'128675': ('Head of Cardiology', [7450, 7452])}, 'HeadOfRadiology': {'128670': ('Head of Radiology', [7450, 7452])}, 'HeadToFoot': {'110868': ('Head To Foot', [7185])}, 'Headframe': {'130110': ('Headframe', [9520, 7157, 7151, 9505, 9513, 7193])}, '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', [])}, 'Height': {'121207': ('Height', [7470, 6165, 218, 7469])}, 'HelicalBeam': {'130108': ('Helical Beam', [9512, 9524])}, 'HemangiomaNonparenchymalSubcutaneous': {'111271': ('Hemangioma - ' 'nonparenchymal, ' 'subcutaneous', [])}, 'HemodynamicResistance': {'110825': ('Hemodynamic Resistance', [7180, 218, 7469])}, 'HemodynamicResistanceIndex': {'122220': ('Hemodynamic Resistance Index', [3620])}, 'HemodynamicWaveform': {'HD': ('Hemodynamic Waveform', [33, 29, 30])}, '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', [6113, 6109, 6102, 9514, 7192, 7151])}, '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', [6029, 6028])}, 'HisBundleElectrogram': {'109007': ('His bundle electrogram', [3240])}, 'HistogramAnalysis': {'123105': ('Histogram Analysis', [7162])}, 'HistologyUsingCoreBiopsy': {'111145': ('Histology using core biopsy', [6029, 6028])}, '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', [6087, 6081])}, 'HistoryOfHighRiskLesionOnPreviousBiopsy': {'111553': ('History of high risk ' 'lesion on previous ' 'biopsy', [6087, 6081])}, 'HistoryOfMultipleFetuses': {'111572': ('History of multiple fetuses', [6088, 6087])}, 'HistoryOfOvarianCancer': {'111552': ('History of ovarian cancer', [6087, 6081])}, '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 (uniform opacity)', [6131])}, 'HomogeneousFatEchotexture': {'111351': ('Homogeneous fat echotexture', [6151])}, 'HomogeneousFibroglandularEchotexture': {'111352': ('Homogeneous ' 'fibroglandular ' 'echotexture', [6151])}, 'HoneycombPattern': {'112106': ('Honeycomb pattern', [6103, 6102, 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', [640, 638])}, 'HumanTauPreformedFibrils': {'127853': ('Human Tau preformed fibrils', [640, 638])}, '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', [])}, 'HypoFractionation': {'130098': ('Hypo-fractionation', [9533])}, 'Hypoechoic': {'111364': ('Hypoechoic', [6154])}, 'IAUC': {'126320': ('IAUC', [7180, 4109, 218, 7469])}, 'IAUC180': {'126323': ('IAUC180', [7180, 4109, 218, 7469])}, 'IAUC180BN': {'126327': ('IAUC180BN', [7180, 4109, 218, 7469])}, 'IAUC60': {'126321': ('IAUC60', [7180, 4109, 218, 7469])}, 'IAUC60BN': {'126325': ('IAUC60BN', [7180, 4109, 218, 7469])}, 'IAUC90': {'126322': ('IAUC90', [7180, 4109, 218, 7469])}, 'IAUC90BN': {'126326': ('IAUC90BN', [7180, 4109, 218, 7469])}, 'IAUCBN': {'126324': ('IAUCBN', [7180, 4109, 218, 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', [9402, 9401])}, 'IEC61217GantryContinuousRollAngle': {'126809': ('IEC61217 Gantry Continuous ' 'Roll Angle', [9402, 9401])}, 'IEC61217GantryContinuousYawAngle': {'126811': ('IEC61217 Gantry Continuous ' 'Yaw Angle', [9402, 9401])}, 'IEC61217PatientSupportContinuousAngle': {'126801': ('IEC61217 Patient ' 'Support Continuous ' 'Angle', [9403, 9401])}, 'IEC61217TableTopContinuousEccentricAngle': {'126805': ('IEC61217 Table Top ' 'Continuous Eccentric ' 'Angle', [9403, 9401])}, 'IEC61217TableTopContinuousPitchAngle': {'126802': ('IEC61217 Table Top ' 'Continuous Pitch Angle', [9403, 9401])}, 'IEC61217TableTopContinuousRollAngle': {'126803': ('IEC61217 Table Top ' 'Continuous Roll Angle', [9403, 9401])}, 'IEC61217TableTopEccentricAxisDistance': {'126804': ('IEC61217 Table Top ' 'Eccentric Axis Distance', [9403, 9401])}, 'IEC61217TableTopLateralPosition': {'126806': ('IEC61217 Table Top Lateral ' 'Position', [9403, 9401])}, 'IEC61217TableTopLongitudinalPosition': {'126807': ('IEC61217 Table Top ' 'Longitudinal Position', [9403, 9401])}, 'IEC61217TableTopVerticalPosition': {'126808': ('IEC61217 Table Top Vertical ' 'Position', [9403, 9401])}, 'IECBodyDosimetryPhantom': {'113691': ('IEC Body Dosimetry Phantom', [4051, 4052])}, 'IECHeadDosimetryPhantom': {'113690': ('IEC Head Dosimetry Phantom', [4051, 4052])}, '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', [])}, '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])}, 'ImageContentBasedAlignment': {'125024': ('Image Content-based Alignment', [7100])}, 'ImageDetectedMass': {'111126': ('Image detected mass', [6055])}, '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', [6016, 6201, 6101, 6054, 6014])}, '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])}, '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', [])}, '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', [])}, 'ImagingAgentAdministrationProtocolName': {'130200': ('Imaging Agent ' 'Administration ' 'Protocol Name', [])}, 'ImagingAgentAdministrationStep': {'130195': ('Imaging Agent Administration ' 'Step', [])}, 'ImagingAgentAdministrationStepIdentifier': {'130196': ('Imaging Agent ' 'Administration Step ' 'Identifier', [])}, 'ImagingAgentAdministrationSteps': {'130192': ('Imaging Agent Administration ' 'Steps', [])}, 'ImagingAgentAdministrationStepsDescription': {'130199': ('Imaging Agent ' 'Administration ' 'Steps Description', [])}, 'ImagingAgentAdministrationSyringePumpPhaseActivity': {'130237': ('Imaging ' 'Agent ' 'Administration ' 'Syringe/Pump ' 'Phase ' 'Activity', [])}, '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])}, 'ImagingStartDatetime': {'122712': ('Imaging Start DateTime', [])}, '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])}, 'InappropriateForTheDevice': {'128618': ('Inappropriate for the device', [800])}, 'InappropriateForTheIndications': {'128621': ('Inappropriate for the ' 'indications', [800])}, 'InappropriateImageProcessing': {'111219': ('Inappropriate image processing', [6041, 6135, 7011])}, 'IncisionMade': {'111440': ('Incision made', [])}, 'InconsistentWithLabelingOfTheDevice': {'128622': ('Inconsistent with ' 'labeling of the device', [800])}, 'IncorrectModalityWorklistEntry': {'113038': ('Incorrect Modality Worklist ' 'Entry', [7010])}, 'IncorrectProcedureOrdered': {'110502': ('Incorrect procedure ordered', [9301, 9300, 9303])}, 'IncorrectSideOrdered': {'110512': ('Incorrect side ordered', [9301, 9300])}, 'IncorrectWorklistEntrySelected': {'110514': ('Incorrect worklist entry ' 'selected', [9301, 9300, 9302])}, 'Index': {'121425': ('Index', [])}, 'Indexed': {'125313': ('Indexed', [12303])}, 'IndexedHemodynamicResistance': {'110826': ('Indexed Hemodynamic Resistance', [7180, 218, 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', [12257, 12261, 12260, 3613, 12271, 12267, 3337, 12266, 12270, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12258, 12254])}, 'IndirectDetector': {'113949': ('Indirect Detector', [10030])}, 'IndividualCalcification': {'111104': ('Individual Calcification', [])}, 'IndividualImpressionRecommendation': {'111034': ('Individual ' 'Impression/Recommendation', [])}, 'IndividualImpressionRecommendationAnalysis': {'111233': ('Individual ' 'Impression / ' 'Recommendation ' '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', [6104, 6102])}, 'InflowAngle': {'122546': ('Inflow Angle', [])}, 'InformationTechnology': {'128173': ('Information Technology', [7030])}, 'InformationUsedForPlanning': {'112358': ('Information used for planning', [])}, 'InfraredFilter': {'111606': ('Infrared filter', [])}, 'InfraredReflectorMarker': {'129309': ('Infrared Reflector Marker', [7112, 7111])}, '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', [6208, 6045, 6136])}, '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])}, 'IntegrationOfSumOfClosedAreasOnContiguousSlices': {'122503': ('Integration ' 'of sum of ' 'closed areas ' 'on contiguous ' 'slices', [7474])}, 'InterHemisphericPlane': {'125030': ('Inter-Hemispheric Plane', [7101, 7111])}, 'InterMarkerDistance': {'121208': ('Inter-Marker Distance', [3423])}, 'Interface': {'112082': ('Interface', [6109, 7196, 6102, 7151])}, 'InterferingTearsOrDrops': {'111695': ('Interfering Tears or Drops', [4222])}, 'Interferometry': {'114202': ('Interferometry', [8201])}, 'InterferometryBasedCornealTomographer': {'111947': ('Interferometry-based ' 'corneal tomographer', [4210])}, 'IntermediateFamilyHistoryOfBreastCancer': {'111560': ('Intermediate family ' 'history of breast ' 'cancer', [6087, 6081])}, '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])}, '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', [33, 29, 30])}, 'IntraStentDissection': {'122388': ('Intra-stent Dissection', [3492])}, 'IntracysticLesion': {'111461': ('Intracystic lesion', [6064, 6054])}, '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', [6103, 6102])}, 'IntraluminalFillingDefect': {'111425': ('Intraluminal filling defect', [6057, 6054])}, 'IntraocularLensCalculation': {'IOL': ('Intraocular Lens Calculation', [33, 32])}, 'IntravascularOpticalCoherenceTomography': {'IVOCT': ('Intravascular Optical ' 'Coherence Tomography', [33, 29, 30])}, 'IntravascularTransducer': {'125265': ('Intravascular Transducer', [12035])}, 'IntravascularUltrasound': {'IVUS': ('Intravascular Ultrasound', [33, 29, 30])}, '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', [])}, '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])}, 'IrradiationDuration': {'113742': ('Irradiation Duration', [])}, 'IrradiationEvent': {'113852': ('Irradiation Event', [10000])}, 'IrradiationEventLabel': {'113605': ('Irradiation Event Label', [])}, 'IrradiationEventType': {'113721': ('Irradiation Event Type', [])}, 'IrradiationEventUID': {'113769': ('Irradiation Event UID', [10001]), '113853': ('Irradiation Event UID', [])}, 'IrradiationEventXRayData': {'113706': ('Irradiation Event X-Ray Data', [])}, 'IsIonic': {'130189': ('Is Ionic', [])}, 'IsRepeatedAcquisition': {'128551': ('Is Repeated Acquisition', [])}, 'IsocentricTreatmentLocationPoint': {'130073': ('Isocentric Treatment ' 'Location Point', [9504])}, 'Isodose': {'128484': ('Isodose', [10063])}, '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', [])}, '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', [6031, 6030])}, 'KVP': {'113733': ('KVP', [])}, 'KeepVeinOpenEnded': {'130162': ('Keep vein open ended', [71])}, 'KeepVeinOpenStarted': {'130161': ('Keep vein open started', [71])}, 'Kep': {'126313': ('kep', [7180, 218, 4107, 7469])}, 'Keratometry': {'KER': ('Keratometry', [33, 29, 30])}, 'KeratometryMeasurementsSOPInstance': {'111757': ('Keratometry Measurements ' 'SOP Instance', [4240])}, 'KerleyALine': {'112109': ('Kerley A line', [6103, 6102])}, 'KerleyBLine': {'112110': ('Kerley B line', [6103, 6102])}, 'KerleyCLines': {'112111': ('Kerley C lines', [6103, 6102])}, 'KeyImages': {'121180': ('Key Images', [])}, 'KeyObjectDescription': {'113012': ('Key Object Description', [])}, 'KeyObjectSelection': {'KO': ('Key Object Selection', [33, 32])}, 'KidneyStent': {'112175': ('Kidney stent', [6102, 6138, 6404, 7151, 6202, 6203, 7193])}, 'KnownBiopsyProvenMalignancy': {'111125': ('Known biopsy proven malignancy', [6051])}, 'KnownBiopsyProvenMalignancyTakeAppropriateAction': {'111122': ('Known biopsy ' 'proven ' 'malignancy - ' 'take ' 'appropriate ' 'action', [6029, 6028])}, 'Ktrans': {'126312': ('Ktrans', [7180, 218, 4107, 7469])}, 'Kurtosis': {'126052': ('Kurtosis', [7464])}, 'KurtosisDiffusionCoefficient': {'113294': ('Kurtosis Diffusion Coefficient', [7180, 7272, 218, 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])}, 'LVWallMotionScoreIndex': {'125202': ('LV Wall Motion Score Index', [])}, 'LabelType': {'113606': ('Label Type', [])}, 'LactatingAdenoma': {'111278': ('Lactating adenoma', [])}, 'LactationalChange': {'111279': ('Lactational change', [6031, 6030])}, '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', [6031, 6030])}, '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])}, 'LaserScan': {'LS': ('Laser Scan', [33, 29, 30])}, 'LaserScanning': {'114203': ('Laser scanning', [8201])}, 'LaserScanning3DCAMModel': {'129021': ('Laser Scanning 3D CAM model', [7061])}, 'LaserSurfaceScan': {'LS': ('Laser surface scan', [])}, 'LastChordOfAbnormalRegion': {'122453': ('Last Chord of Abnormal Region', [])}, 'LateChildBearingAfter30': {'111555': ('Late child bearing (after 30)', [6087, 6081])}, 'LateContrastEnhancement': {'122664': ('Late Contrast Enhancement', [])}, 'LeadID': {'122148': ('Lead ID', [])}, 'LeadRadiologicTechnologist': {'128674': ('Lead Radiologic Technologist', [7450, 9536, 7452])}, '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', [])}, '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', [33, 29, 30])}, 'LesionBoundary': {'111357': ('Lesion boundary', [])}, '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', [6109, 7196, 6102, 7151])}, 'LineBScanPattern': {'128281': ('Line B-scan pattern', [4272])}, 'LineScanPattern': {'125240': ('Line scan pattern', [12032])}, 'Linear': {'112150': ('Linear', [6123])}, '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', [7186, 7180, 218, 4032, 4033, 7469])}, 'LiquidCrystalDisplay': {'109992': ('Liquid Crystal Display', [8303])}, 'LiquidIonChamber': {'128705': ('Liquid Ion Chamber', [7026, 7027, 7151, 7193])}, 'Lobar': {'112158': ('Lobar', [6129, 6128])}, 'Lobulated': {'112135': ('Lobulated', [6119])}, 'LocalEffectModel': {'130128': ('Local Effect Model', [9538])}, 'LocalServiceOperationStarted': {'110141': ('Local Service Operation Started', [401, 403])}, 'LocalServiceOperationStopped': {'110142': ('Local Service Operation Stopped', [401, 403])}, 'Localizer': {'121311': ('Localizer', [7201, 8120, 4264])}, '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', [])}, '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', [6109, 7196, 6102, 7151])}, '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])}, 'LympathicVesselInvasion': {'111320': ('Lympathic vessel invasion', [6030, 6033])}, 'Lymphoma': {'111321': ('Lymphoma', [])}, 'MEDI55189Zr': {'126730': ('MEDI-551 ^89^Zr', [4021])}, 'MIRDOSE': {'113526': ('MIRDOSE', [10040])}, 'MIRDPamphlet1': {'113520': ('MIRD Pamphlet 1', [10040])}, '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', [7112, 7111])}, 'MRPerfusionPeak': {'122635': ('MR Perfusion Peak', [])}, 'MRPerfusionSlope': {'122636': ('MR Perfusion Slope', [])}, 'MRPerfusionTimeIntegral': {'122637': ('MR Perfusion Time Integral', [])}, 'MRSignalIntensity': {'110852': ('MR signal intensity', [7180, 218, 7469])}, 'MVAEqualsFlow38Point0SqrtGradientMmhg': {'122263': ('MVA = Flow / 38.0 * ' 'sqrt(Gradient[mmHg])', [])}, 'MachineQualityAssuranceInputUsed': {'128216': ('Machine Quality Assurance ' 'Input Used', [7010, 7025])}, 'Macrocalcifications': {'111345': ('Macrocalcifications', [6011, 6010])}, 'MaculaCentered': {'111900': ('Macula centered', [4207])}, 'MacularFixationTesting': {'111845': ('Macular Fixation Testing', [4253])}, 'MacularGridThicknessAndVolumeReport': {'111690': ('Macular Grid Thickness ' 'and Volume Report', [])}, 'MagneticResonance': {'MR': ('Magnetic Resonance', [33, 29, 30])}, 'MagneticResonanceAngiography': {'MA': ('Magnetic resonance angiography', [])}, 'MagneticResonanceSpectroscopy': {'MS': ('Magnetic resonance spectroscopy', [])}, 'MagneticSusceptibility': {'126396': ('Magnetic Susceptibility', [7180, 218, 7469])}, 'MagnetizationTransferRatio': {'113098': ('Magnetization Transfer Ratio', [7180, 218, 7469])}, 'MagnificationSelection': {'112709': ('Magnification selection', [])}, 'Male': {'M': ('Male', [7457, 7455])}, '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])}, 'Mammographic': {'111487': ('Mammographic (crosshair)', [6060, 6058]), '111488': ('Mammographic (grid)', [6060, 6058])}, 'Mammography': {'MG': ('Mammography', [33, 29, 30])}, 'MammographyCAD': {'111411': ('Mammography CAD', [6083, 6050])}, 'MammographyCADReport': {'111036': ('Mammography CAD Report', [])}, 'MammographyQualityControlManual1999ACR': {'111238': ('Mammography Quality ' 'Control Manual 1999, ' 'ACR', [6045])}, 'Manifest': {'113030': ('Manifest', [7010])}, 'ManualAdministration': {'130174': ('Manual Administration', [63])}, 'ManualEntry': {'113857': ('Manual Entry', [10020, 4240, 12303, 10021])}, 'ManualHandlingInterval': {'127152': ('Manual handling interval', [])}, 'ManualKeratometry': {'111753': ('Manual Keratometry', [4235, 4242])}, 'ManualProcessing': {'123109': ('Manual Processing', [7162])}, 'ManuallyTriggeredInjectionInformation': {'130172': ('Manually Triggered ' 'Injection Information', [])}, 'ManufacturerImplantTemplate': {'112371': ('Manufacturer Implant Template', [])}, 'Margetuximab89Zr': {'126740': ('Margetuximab ^89^Zr', [4021])}, 'Margins': {'111037': ('Margins', [])}, 'MarkerPlacement': {'111123': ('Marker placement', [6083, 6061, 6050, 6051, 6058])}, 'MaskImageForImageProcessingOperation': {'121321': ('Mask image for image ' 'processing operation', [7202])}, 'MassAdministered': {'121383': ('Mass administered', [3410])}, 'MassInTheSkin': {'111112': ('Mass in the skin', [6056, 6016, 6015, 6054, 6014])}, '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', [6056, 6016, 6015, 6054, 6014])}, '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', [9531, 9500])}, 'MaximumAbsorbedRadiationDose': {'128531': ('Maximum Absorbed Radiation Dose', [10061])}, 'MaximumAttenuationCoefficient': {'112180': ('Maximum Attenuation Coefficient', [6141])}, 'MaximumCADOperatingPoint': {'111072': ('Maximum CAD Operating Point', [])}, 'MaximumDifference': {'126376': ('Maximum Difference', [7180, 4109, 218, 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', [9530, 9500])}, 'MaximumPowerOutputAchieved': {'122716': ('Maximum Power Output Achieved', [])}, 'MaximumPressureAcceleration': {'122193': ('Maximum pressure acceleration', [])}, 'MaximumRadiationDose': {'130004': ('Maximum Radiation Dose', [9500, 9529])}, 'MaximumSlope': {'126375': ('Maximum Slope', [7180, 4109, 218, 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', [4108, 7180, 218, 7469])}, 'MeanValueChosen': {'121412': ('Mean value chosen', [4241, 12301, 224])}, '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])}, 'MeasurementFromThisDevice': {'111780': ('Measurement From This Device', [4240])}, 'MeasurementGroup': {'125007': ('Measurement Group', [])}, 'MeasurementNotAttempted': {'114007': ('Measurement not attempted', [42])}, 'MeasurementOfResponse': {'112051': ('Measurement of Response', [])}, 'MeasurementOrientation': {'125105': ('Measurement Orientation', [])}, 'MeasurementType': {'125306': ('Measurement Type', [])}, 'MechanicalBeamSteering': {'125258': ('Mechanical beam steering', [12034])}, 'MechanicalFailure': {'111216': ('Mechanical failure', [6041, 6135, 7011])}, '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', [3019, 211, 2, 245, 212])}, '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])}, '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', [6031, 6030])}, 'Micronodule': {'112122': ('Micronodule', [6104, 6102])}, '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])}, 'MidlungWindow': {'112085': ('Midlung window', [6109, 6102, 9514, 7192, 7151, 6110])}, 'MiliaryPattern': {'112129': ('Miliary pattern', [6102, 6106])}, 'MinimizeMeterset': {'130018': ('Minimize Meterset', [9500, 9532])}, 'MinimumAbsoluteVolumeAtRadiationDose': {'130016': ('Minimum Absolute Volume ' 'at Radiation Dose', [9531, 9500])}, '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', [9530, 9500])}, 'MinimumRadiationDose': {'130003': ('Minimum Radiation Dose', [9500, 9529])}, 'MinimumSurfaceRadiationDose': {'130001': ('Minimum Surface Radiation Dose', [9500, 9529])}, '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', [33, 32])}, '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', [9520, 7157, 7151, 9505, 9513, 7193])}, 'MonoExponentialApparentDiffusionCoefficient': {'113290': ('Mono-exponential ' 'Apparent ' 'Diffusion ' 'Coefficient', [7180, 7272, 218, 7469])}, 'MonoExponentialDiffusionModel': {'113250': ('Mono-exponential diffusion ' 'model', [7273])}, 'MonoblockStem': {'112315': ('Monoblock Stem', [7308, 7307])}, 'MonoclonalAntibodyMab64Cu': {'126510': ('Monoclonal Antibody (mAb) ^64^Cu', [4021])}, 'MonoclonalAntibodyMab89Zr': {'126511': ('Monoclonal Antibody (mAb) ^89^Zr', [4021])}, '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', [12301, 224])}, 'MotherOfFetus': {'121036': ('Mother of fetus', [])}, 'MotionBlur': {'111210': ('Motion blur', [6041, 6135, 7011, 3115])}, 'MouseAlphaSynucleinPreformedFibrils': {'127852': ('Mouse alpha synuclein ' 'preformed fibrils', [640, 638])}, 'MouseTauPreformedFibrils': {'127854': ('Mouse Tau preformed fibrils', [640, 638])}, 'MoveableLaserPatientSetupPoint': {'130071': ('Moveable Laser Patient Setup ' 'Point', [9504])}, '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', [])}, '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', [100])}, 'MultiparametricMRIOfWholeBody': {'126022': ('Multiparametric MRI of whole ' 'body', [100])}, 'MultiplanarReformatting': {'113072': ('Multiplanar reformatting', [7203])}, 'MultipleFillingDefect': {'111426': ('Multiple filling defect', [6057, 6054])}, 'MultipleFixedSources': {'130138': ('Multiple Fixed Sources', [9522, 9524])}, 'MultipleIntraductalPapillomas': {'111285': ('Multiple Intraductal Papillomas', [6031, 6030])}, '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])}, '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', [7186, 7180, 218, 4032, 4033, 7469])}, 'NAcetylaspartateCreatineRatio': {'113082': ('N-acetylaspartate/Creatine ' 'Ratio', [7186, 7180, 218, 4032, 4033, 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])}, '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', [7308, 7307])}, 'NecroticLipidicPlaque': {'122395': ('Necrotic-Lipidic Plaque', [3491, 3497, 3495])}, 'NeedleGauge': {'111465': ('Needle Gauge', [6095])}, 'NeedleInTarget': {'111438': ('Needle in target', [])}, 'NeedleLength': {'111467': ('Needle Length', [6095])}, 'NeedleLocalizationAndBiopsy': {'111144': ('Needle localization and biopsy', [6061, 6051, 6029, 6028, 6058])}, 'NegativeEnhancementIntegral': {'113054': ('Negative enhancement integral', [7180, 218, 7469])}, 'NegativeExponential': {'130252': ('Negative exponential', [73])}, 'NegativeInfinity': {'114001': ('Negative Infinity', [42])}, '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])}, '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', [6031, 6030])}, '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])}, 'NoFilter': {'111609': ('No Filter', [10007, 8124, 4204])}, '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', [6104, 6102, 6106])}, 'Nomenclature': {'127413': ('Nomenclature', [])}, 'NominalEmptyTileSuppression': {'112719': ('Nominal empty tile suppression', [8133])}, '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])}, 'NonImagingDopplerUltrasoundTransducerGeometry': {'125251': ('Non-imaging ' 'Doppler ' 'ultrasound ' 'transducer ' 'geometry', [12033])}, 'NonIonicIodinatedContrastAgent': {'127855': ('Non-ionic iodinated contrast ' 'agent', [12, 3850])}, 'NonLesion': {'111102': ('Non-lesion', [6016, 6201, 6101, 6054, 6014])}, 'NonLesionAtBaseline': {'112076': ('Non-Lesion at Baseline', [6145])}, 'NonLesionModifier': {'112037': ('Non-lesion Modifier', [])}, 'NonSpecificVolume': {'130046': ('Non-specific Volume', [9501, 9502])}, 'NonSynchronizedRoboticTreatment': {'130140': ('Non-Synchronized Robotic ' 'Treatment', [9523, 9524])}, 'NonTargetLesionAtBaseline': {'112075': ('Non-Target Lesion at Baseline', [6145])}, 'NonTargetLesionCompleteResponse': {'112045': ('Non-Target Lesion Complete ' 'Response', [6144, 6143])}, 'NonTargetLesionIncompleteResponseOrStableDisease': {'112046': ('Non-Target ' 'Lesion ' 'Incomplete ' 'Response or ' 'Stable ' 'Disease', [6144, 6143])}, 'NonTargetLesionProgressiveDisease': {'112047': ('Non-Target Lesion ' 'Progressive Disease', [6144, 6143])}, 'NormalAxillaryNode': {'111251': ('Normal axillary node', [6031, 6030])}, 'NormalBreastTissue': {'111287': ('Normal breast tissue', [6057, 6031, 6030, 6054])}, 'NormalImplants': {'111503': ('Normal implants', [6072])}, 'NormalIntervalFollowUp': {'111140': ('Normal interval follow-up', [6029, 6028])}, '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])}, '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', [33, 29, 30])}, 'NuclearMedicineImagingSubjectMatter': {'128735': ('Nuclear medicine imaging ' 'subject matter', [7017])}, 'NuclearMedicineProjectionActivity': {'110820': ('Nuclear Medicine Projection ' 'Activity', [7180, 218, 7469])}, 'NuclearMedicineTomographicActivity': {'110821': ('Nuclear Medicine ' 'Tomographic Activity', [7180, 218, 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', [])}, 'NumberOfFocalPlanes': {'112707': ('Number of focal planes', [])}, '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', [])}, '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', [])}, 'NumberOfXRaySources': {'113823': ('Number of X-Ray Sources', [])}, 'Nurse': {'121082': ('Nurse', [])}, 'NursingNote': {'121172': ('Nursing Note', [3401])}, 'NursingUnitCancel': {'110511': ('Nursing unit cancel', [9301, 9300])}, 'OBGYNUltrasoundProcedureReport': {'125000': ('OB-GYN Ultrasound Procedure ' 'Report', [])}, '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])}, 'OCTAOneSidedRatio': {'128304': ('OCT-A one-sided ratio (lesser)', [4270]), '128305': ('OCT-A one-sided ratio (greater)', [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, 9303, 9302])}, '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])}, '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)', [6031, 6030])}, 'OldFilmsForComparison': {'111138': ('Old films for comparison', [6029, 6028])}, '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', [6104, 6102])}, 'OpacityDescriptor': {'112027': ('Opacity Descriptor', [])}, 'OperatorError': {'110519': ('Operator Error', [4221, 4222])}, 'OperatorNarrative': {'109111': ("Operator's narrative", [3000])}, 'OphthalmicAxialMeasurements': {'OAM': ('Ophthalmic Axial Measurements', [33, 29, 30])}, 'OphthalmicMacularGridProblem': {'111698': ('Ophthalmic Macular Grid Problem', [])}, 'OphthalmicMapping': {'OPM': ('Ophthalmic Mapping', [33, 29, 30])}, 'OphthalmicPhotography': {'OP': ('Ophthalmic Photography', [33, 29, 30])}, 'OphthalmicRefraction': {'OPR': ('Ophthalmic Refraction', [])}, 'OphthalmicTomography': {'OPT': ('Ophthalmic Tomography', [33, 29, 30])}, 'OphthalmicTomographyBScanVolumeAnalysis': {'OPTBSV': ('Ophthalmic Tomography ' 'B-scan Volume ' 'Analysis', [33, 29, 30])}, 'OphthalmicTomographyEnFace': {'OPTENF': ('Ophthalmic Tomography En Face', [33, 29, 30])}, 'OphthalmicVisualField': {'OPV': ('Ophthalmic Visual Field', [33, 29, 30])}, 'OppositeRegionSeverity': {'122461': ('Opposite Region Severity', [])}, 'Optical': {'111752': ('Optical', [])}, 'OpticalCoherenceTomography': {'OCT': ('Optical Coherence Tomography', [33, 29, 30])}, 'OpticalFilterType': {'112712': ('Optical filter type', [])}, 'OpticalFixationMeasurements': {'111856': ('Optical Fixation Measurements', [4257])}, 'OpticalSurfaceScanner': {'OSS': ('Optical Surface Scanner', [33, 29, 30])}, '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', [])}, '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', [33, 32])}, '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])}, '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', [9514, 7192, 7151, 4273])}, 'OuterSurfaceOfHFL': {'128294': ('Outer surface of HFL', [9514, 7192, 7151, 4273])}, 'OuterSurfaceOfINL': {'128292': ('Outer surface of INL', [9514, 7192, 7151, 4273])}, 'OuterSurfaceOfIPL': {'128291': ('Outer surface of IPL', [9514, 7192, 7151, 4273])}, 'OuterSurfaceOfOPL': {'128293': ('Outer surface of OPL', [9514, 7192, 7151, 4273])}, 'OuterSurfaceOfRNFL': {'128289': ('Outer surface of RNFL', [9514, 7192, 7151, 4273])}, 'OuterSurfaceOfTheBM': {'128300': ('Outer surface of the BM', [9514, 7192, 7151, 4273])}, 'OuterSurfaceOfTheCC': {'128302': ('Outer surface of the CC', [9514, 7192, 7151, 4273])}, 'OutflowAngle': {'122547': ('Outflow Angle', [])}, 'Outline': {'111041': ('Outline', [])}, 'OutlineOfLobulations': {'113661': ('Outline of lobulations', [6166])}, 'OutlineOfSpiculations': {'113664': ('Outline of spiculations', [6166])}, '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 / ' 'Recommendation ' 'Analysis', [6043])}, 'OverallStudyQuality': {'122739': ('Overall study quality', [])}, 'Overflow': {'114005': ('Overflow', [42])}, 'OxygenAdministrationByVentilator': {'121163': ('Oxygen Administration by ' 'ventilator', [3531])}, 'OxygenAdministrationRate': {'121160': ('Oxygen Administration Rate', [])}, 'OxygenConsumption': {'122239': ('Oxygen Consumption', [])}, 'OxygenExtractionFraction': {'126392': ('Oxygen Extraction Fraction', [4108, 7180, 218, 7469])}, '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])}, '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])}, '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', [6060, 6058])}, 'PancreaticStent': {'112176': ('Pancreatic stent', [6102, 6138, 6404, 7151, 6202, 6203, 7193])}, 'Panitumumab89Zr': {'126736': ('Panitumumab ^89^Zr', [4021])}, 'PanoramicXRay': {'PX': ('Panoramic X-Ray', [33, 29, 30])}, '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', [6113, 6109, 6102, 9514, 7192, 7151])}, 'ParenchymalBand': {'112112': ('Parenchymal band', [6103, 6102])}, 'ParentSpecimenIdentifier': {'111705': ('Parent Specimen Identifier', [])}, 'ParentSpecimenType': {'111707': ('Parent specimen type', [])}, 'ParentVesselFinding': {'122686': ('Parent Vessel Finding', [])}, 'PartialRenderingForPresentation': {'121333': ('Partial Rendering for ' 'Presentation', [7006])}, 'PartialReport': {'121363': ('Partial report', [7009])}, 'PartiallySucceeded': {'111223': ('Partially Succeeded', [6042])}, 'PatencyTestInjection': {'130247': ('Patency Test Injection', [72])}, 'Path': {'121055': ('Path', []), '121210': ('Path', [])}, 'PathLength': {'121211': ('Path length', [7470, 6165, 218, 7469])}, 'PathVertex': {'121230': ('Path Vertex', [])}, 'Pathology': {'111042': ('Pathology', [])}, 'PathologyResults': {'111468': ('Pathology Results', [])}, 'Patient': {'121025': ('Patient', [7450, 271])}, '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])}, 'PatientAllergicToMediaContrast': {'110503': ('Patient allergic to ' 'media/contrast', [64, 9301, 9300])}, 'PatientAnatomyModel': {'130067': ('Patient Anatomy Model', [9507])}, 'PatientAsleep': {'122028': ('Patient asleep', [3402])}, 'PatientAssessmentPerformed': {'121165': ('Patient Assessment Performed', [])}, 'PatientAssistedToTable': {'122007': ('Patient assisted to table', [3402])}, 'PatientCalledToProcedureRoom': {'122001': ('Patient called to procedure room', [3402])}, 'PatientCharacteristics': {'121118': ('Patient Characteristics', [])}, 'PatientConditionPreventedContinuing': {'110515': ('Patient condition ' 'prevented continuing', [9301, 9300, 60])}, 'PatientConnectedToContinuousMonitoring': {'122009': ('Patient connected to ' 'continuous monitoring', [3402])}, 'PatientCoughed': {'122031': ('Patient coughed', [3402])}, 'PatientDataUsedDuringPlanning': {'112361': ('Patient Data Used During ' 'Planning', [])}, 'PatientDidNotArrive': {'110507': ('Patient did not arrive', [9301, 9300])}, 'PatientDied': {'110504': ('Patient died', [9301, 9300, 9303])}, 'PatientDischargedFromDepartment': {'122037': ('Patient discharged from ' 'department', [3402])}, 'PatientDisconnectedFromContinuousMonitoring': {'122032': ('Patient ' 'disconnected from ' 'continuous ' 'monitoring', [3402])}, 'PatientDisoriented': {'122020': ('Patient disoriented', [3402])}, 'PatientEquivalentThickness': {'111638': ('Patient Equivalent Thickness', [])}, 'PatientExposureToIonizingRadiation': {'121290': ('Patient exposure to ' 'ionizing radiation', [])}, '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])}, 'PatientMovement': {'110518': ('Patient Movement', [4221, 4222])}, 'PatientOrientation': {'113743': ('Patient Orientation', [])}, 'PatientOrientationColumn': {'111043': ('Patient Orientation Column', [])}, 'PatientOrientationModifier': {'113744': ('Patient Orientation Modifier', [])}, 'PatientOrientationRow': {'111044': ('Patient Orientation Row', [])}, 'PatientPositioningNote': {'130026': ('Patient Positioning Note', [])}, 'PatientPositioningProblem': {'111209': ('Patient Positioning Problem', [4222])}, 'PatientPositioningProcedureNote': {'130035': ('Patient Positioning Procedure ' 'Note', [])}, 'PatientPregnant': {'110508': ('Patient pregnant', [9301, 9300])}, 'PatientPreppedAndDraped': {'122008': ('Patient prepped and draped', [3402])}, 'PatientPresentation': {'121110': ('Patient Presentation', [7002])}, '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', [9301, 9300])}, '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])}, 'PatientRestless': {'122026': ('Patient restless', [3402])}, 'PatientSedated': {'122027': ('Patient sedated', [3402])}, 'PatientSegmentedModel': {'128494': ('Patient Segmented Model', [10064])}, 'PatientSetupNote': {'130028': ('Patient Setup Note', [])}, 'PatientSetupPoint': {'130069': ('Patient Setup Point', [9504])}, 'PatientSetupVerificationInputUsed': {'128217': ('Patient Setup Verification ' 'Input Used', [7010, 7025])}, 'PatientSetupVerificationResult': {'128191': ('Patient Setup Verification ' 'Result', [7010, 7023])}, 'PatientState': {'109054': ('Patient State', [])}, 'PatientStatusOrEvent': {'121123': ('Patient Status or Event', [3401])}, 'PatientSupport': {'128492': ('Patient Support', [10066])}, 'PatientTableRelationship': {'113745': ('Patient Table Relationship', [])}, 'PatientTakenForTreatmentOrSurgery': {'110506': ('Patient taken for treatment ' 'or surgery', [9301, 9300])}, '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])}, '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', [])}, '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', [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])}, 'PercentageOfVascularCalcification': {'112198': ('Percentage of Vascular ' 'Calcification', [6142])}, 'PercentileRankingOfMeasurement': {'121415': ('Percentile Ranking of ' 'measurement', [227, 221, 7465])}, 'PercutaneousCoronaryIntervention': {'122061': ('Percutaneous Coronary ' 'Intervention', [3739])}, 'PercutaneousEntryAction': {'121156': ('Percutaneous Entry Action', [])}, 'PercutaneousSiliconeInjection': {'111483': ('Percutaneous silicone injection', [6058, 6059])}, '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', [10000, 7012])}, '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', [7180, 218, 7469])}, '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])}, 'PerimeterOutline': {'121057': ('Perimeter outline', []), '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])}, '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', [6087, 6081])}, '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', [4051, 4030, 4031, 10060, 7710, 4042, 9514, 7192, 7151, 4, 4009, 4052])}, 'PhantomTumor': {'112123': ('Phantom tumor (pseudotumor)', [6104, 6102])}, '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])}, 'PhotogrammetricImaging3DCAMModel': {'129020': ('Photogrammetric Imaging 3D ' 'CAM model', [7061])}, 'PhotonEnergy': {'110857': ('Photon Energy', [7182])}, 'PhotopicLight': {'111629': ('Photopic light', [4203])}, 'PhysicalExaminationResults': {'111423': ('Physical Examination Results', [6052, 6053])}, 'PhysicalForce': {'109133': ('Physical force', [])}, 'PhysicalSupport': {'128492': ('Physical Support', [])}, 'Physician': {'121081': ('Physician', [])}, 'PhysicianNote': {'121173': ('Physician Note', [3401])}, 'PhysicianReviewInputUsed': {'128213': ('Physician Review Input Used', [7010, 7025])}, 'PhysicistReviewInputUsed': {'128214': ('Physicist Review Input Used', [7010, 7025])}, 'PhysiologicalAudioSignal': {'109115': ('Physiological audio signal', [3000])}, 'PhysiologicalChallenges': {'109059': ('Physiological challenges', [])}, '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', [33, 32])}, 'PlanComparisonInputUsed': {'128220': ('Plan Comparison Input Used', [7010])}, 'PlanQualityAssuranceInputUsed': {'128215': ('Plan Quality Assurance Input ' 'Used', [7010, 7025])}, '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])}, 'Pleonemia': {'112081': ('Pleonemia', [6108])}, 'PointCloudAlgorithmic': {'114208': ('Point Cloud Algorithmic', [8201])}, '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])}, 'PoorImageQuality': {'122742': ('Poor image quality', [3114])}, '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', [])}, '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])}, 'PositiveInfinity': {'114002': ('Positive Infinity', [42])}, 'PositronEmissionTomography': {'PT': ('Positron emission tomography', [33, 29, 30])}, 'PostAdministrationMeasuredActivity': {'113509': ('Post-Administration ' 'Measured Activity', [])}, 'PostCoordinatedMeasurements': {'125302': ('Post-coordinated Measurements', [])}, 'PostIntervention': {'109124': ('Post-intervention', [31])}, 'PostInterventionStenosisMeasurement': {'122108': ('Post-Intervention ' 'Stenosis Measurement', [])}, 'PostInterventionTIMIFlow': {'122110': ('Post-Intervention TIMI Flow', [])}, 'PostMenopausalPatient': {'111554': ('Post menopausal patient', [6087, 6081])}, 'PostProcedureMammogramsForMarkerPlacement': {'111120': ('Post Procedure ' 'Mammograms for ' 'Marker Placement', [6026])}, 'PostReductionMammoplasty': {'111291': ('Post reduction mammoplasty', [6031, 6030])}, 'PostVoiding': {'109135': ('Post voiding', [91])}, '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', [6109, 6112, 6102, 9514, 7192, 7151])}, 'PosteriorLens': {'111779': ('Posterior Lens', [4233])}, 'PosteriorShadowing': {'111369': ('Posterior shadowing', [6155])}, 'PosteriorSurfaceOfTheRPE': {'128299': ('Posterior surface of the RPE', [9514, 7192, 7151, 4273])}, 'PosteriorToAnterior': {'110871': ('Posterior To Anterior', [7185])}, 'PosteriorTrachealStripe': {'112092': ('Posterior tracheal stripe', [6113, 6109, 6102, 9514, 7192, 7151])}, 'Posttreatment': {'126074': ('Posttreatment', [6146])}, 'PowerDoppler': {'125230': ('Power Doppler', [])}, 'PreAdministrationMeasuredActivity': {'113508': ('Pre-Administration Measured ' 'Activity', [])}, '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])}, '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', [9233, 7009])}, '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', [33, 32])}, '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', [6088, 6087])}, 'PreviousFinding': {'121069': ('Previous Finding', [7002])}, 'PreviousFindings': {'121068': ('Previous Findings', [])}, 'PreviousLBWOrIUGRBirth': {'111569': ('Previous LBW or IUGR birth', [6088, 6087])}, 'PreviousProcedure': {'111531': ('Previous Procedure', [])}, 'PreviousRHNegativeOrBloodDyscrasiaAtBirth': {'111571': ('Previous RH ' 'negative or blood ' 'dyscrasia at birth', [6088, 6087])}, 'PreviousReports': {'111549': ('Previous Reports', [])}, 'PreviousTreatmentNote': {'130029': ('Previous Treatment Note', [])}, 'PrimaryComplex': {'112059': ('Primary complex', [6104, 6102])}, '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])}, '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', [])}, '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', [])}, 'ProcessingEquipment': {'109102': ('Processing Equipment', [7005])}, 'ProcessingStepDescription': {'111703': ('Processing step description', [])}, 'ProcessingType': {'111701': ('Processing type', [])}, 'Profusion': {'112151': ('Profusion', [6123])}, 'ProgesteroneReceptor': {'111476': ('Progesterone receptor', [])}, 'ProgrammableDevice': {'130218': ('Programmable Device', [])}, 'ProjectionEponymousName': {'113946': ('Projection Eponymous Name', [])}, 'ProjectionXRay': {'113704': ('Projection X-Ray', [])}, 'ProliferativeActivity': {'126036': ('Proliferative Activity', [7466])}, 'ProspectiveGating': {'109081': ('Prospective gating', [3104])}, 'ProstheticFabrication': {'129015': ('Prosthetic Fabrication', [7064])}, 'ProstheticShaftAugment': {'112316': ('Prosthetic Shaft Augment', [7308, 7307])}, 'ProtocolStage': {'109055': ('Protocol Stage', [])}, 'ProtocolTimePointIdentifier': {'126071': ('Protocol Time Point Identifier', [])}, 'ProtonDensity': {'113058': ('Proton Density', [7180, 218, 7469])}, 'ProtonDensityWeightedMRSignalIntensity': {'110803': ('Proton Density ' 'Weighted MR Signal ' 'Intensity', [7180, 218, 7469])}, 'ProximalFindingSite': {'121116': ('Proximal Finding Site', [])}, 'ProximalIsovelocitySurfaceArea': {'125216': ('Proximal Isovelocity Surface ' 'Area', [12231, 12227, 12229])}, 'ProximalReference': {'122380': ('Proximal Reference', [3486])}, 'ProximalStentMargin': {'122385': ('Proximal Stent Margin', [3487])}, 'PseudoangiomatousStromalHyperplasia': {'111292': ('Pseudoangiomatous stromal ' 'hyperplasia', [6031, 6030])}, 'Pseudoplaque': {'112068': ('Pseudoplaque', [6104, 6102])}, '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])}, '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', [6061, 6051, 9231, 6058])}, 'QualityControlIntent': {'113680': ('Quality Control Intent', [3629, 7064])}, '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', [7180, 218, 7469])}, 'R150789Zr': {'126518': ('R1507 ^89^Zr', [4021])}, 'R2': {'126394': ('R2', [7180, 218, 7469]), '126395': ('R2*', [7180, 218, 7469])}, 'R2Coefficient': {'126220': ('R2-Coefficient', [7180, 218, 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', [7180, 218, 7469])}, 'RECIST': {'112022': ('RECIST', [])}, 'RECIST1Point0': {'126080': ('RECIST 1.0', [6147])}, 'RECIST1Point1': {'126081': ('RECIST 1.1', [6147])}, 'RGBBComponent': {'110836': ('RGB B Component', [7186, 7180, 218, 7469])}, 'RGBGComponent': {'110835': ('RGB G Component', [7186, 7180, 218, 7469])}, 'RGBRComponent': {'110834': ('RGB R Component', [7186, 7180, 218, 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])}, 'RRInterval': {'122182': ('R-R interval', [12257, 12261, 12260, 3613, 12271, 12267, 12266, 12270, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12258, 12254])}, 'RTBeamEnergy': {'130034': ('RT Beam Energy', [])}, 'RTBrachyTreatment': {'121735': ('RT Brachy Treatment', [9241])}, 'RTDose': {'RTDOSE': ('RT Dose', [33, 32])}, 'RTDoseCalculationStructure': {'130042': ('RT Dose Calculation Structure', [9503, 9502])}, 'RTGeometricInformation': {'130043': ('RT Geometric Information', [9502])}, 'RTImage': {'RTIMAGE': ('RT Image', [33, 29, 30])}, 'RTMachineQA': {'121730': ('RT Machine QA', [9241])}, 'RTPatientPositionAcquisitionCTKv': {'121707': ('RT Patient Position ' 'Acquisition, CT kV', [9242])}, 'RTPatientPositionAcquisitionCTMV': {'121708': ('RT Patient Position ' 'Acquisition, CT MV', [9242])}, 'RTPatientPositionAcquisitionDualPlaneKv': {'121705': ('RT Patient Position ' 'Acquisition, dual ' 'plane kV', [9242])}, 'RTPatientPositionAcquisitionDualPlaneKvMV': {'121706': ('RT Patient Position ' 'Acquisition, dual ' 'plane kV/MV', [9242])}, 'RTPatientPositionAcquisitionDualPlaneMV': {'121703': ('RT Patient Position ' 'Acquisition, dual ' 'plane MV', [9242])}, 'RTPatientPositionAcquisitionOptical': {'121709': ('RT Patient Position ' 'Acquisition, Optical', [9242])}, 'RTPatientPositionAcquisitionSinglePlaneKv': {'121704': ('RT Patient Position ' 'Acquisition, single ' 'plane kV', [9242])}, 'RTPatientPositionAcquisitionSinglePlaneMV': {'121702': ('RT Patient Position ' 'Acquisition, single ' 'plane MV', [9242])}, '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])}, '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])}, 'RTPatientSetup': {'121701': ('RT Patient Setup', [9241])}, 'RTPlan': {'RTPLAN': ('RT Plan', [33, 32])}, 'RTPlanSummationInputUsed': {'128212': ('RT Plan Summation Input Used', [7010, 7025])}, 'RTPlanningResult': {'128189': ('RT Planning Result', [7010, 7023])}, 'RTPreTreatmentConsistencyCheck': {'121374': ('RT Pre-Treatment Consistency ' 'Check', [702, 701])}, 'RTPreTreatmentDoseCheck': {'121373': ('RT Pre-Treatment Dose Check', [702, 701])}, 'RTPrescriptionInputImages': {'130136': ('RT Prescription Input Images', [9509])}, 'RTPrescriptionInputUsed': {'128210': ('RT Prescription Input Used', [7010, 7025])}, 'RTPrescriptionResult': {'128185': ('RT Prescription Result', [7010, 7023]), '128186': ('RT Prescription Result', [9510])}, 'RTStructureSet': {'RTSTRUCT': ('RT Structure Set', [33, 32])}, 'RTTarget': {'130041': ('RT Target', [9503, 9502])}, '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', [33, 32])}, '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])}, 'RTTreatmentWithExternalVerification': {'121727': ('RT Treatment with ' 'External Verification', [9241])}, 'RTTreatmentWithInternalVerification': {'121726': ('RT Treatment with ' 'Internal Verification', [9241])}, '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])}, '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', [])}, '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', [])}, 'RadiationDoseEstimateParameters': {'128434': ('Radiation Dose Estimate ' 'Parameters', [])}, 'RadiationDoseEstimateRepresentation': {'128412': ('Radiation Dose Estimate ' 'Representation', [])}, 'RadiationDoseEstimationParameterType': {'128464': ('Radiation Dose ' 'Estimation Parameter ' 'Type', [])}, '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', [])}, 'RadiationInteractionVolume': {'130066': ('Radiation Interaction Volume', [9535])}, 'RadiationPhysicist': {'121105': ('Radiation Physicist', [])}, 'RadiationRemoved': {'122309': ('Radiation removed', [3412])}, '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])}, 'RadioactiveSubstanceAdministered': {'113922': ('Radioactive Substance ' 'Administered', [])}, 'Radiofluoroscopy': {'RF': ('Radiofluoroscopy', [33, 29, 30])}, 'Radiographer': {'121084': ('Radiographer', [])}, 'RadiographicAnatomy': {'112005': ('Radiographic anatomy', [6101])}, 'RadiographicImaging': {'RG': ('Radiographic imaging', [33, 29, 30])}, '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', [9520, 9519])}, 'RadiotherapyDose': {'RTDOSE': ('Radiotherapy Dose', [])}, 'RadiotherapyImage': {'RTIMAGE': ('Radiotherapy Image', [])}, 'RadiotherapyPlan': {'RTPLAN': ('Radiotherapy Plan', [])}, 'RadiotherapyStructureSet': {'RTSTRUCT': ('Radiotherapy Structure Set', [])}, 'RadiotherapyTreatmentRecord': {'RTRECORD': ('Radiotherapy Treatment Record', [])}, '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', [33, 32])}, 'RealWorldValueMapUsedForMeasurement': {'126100': ('Real World Value Map used ' 'for measurement', [])}, 'ReasonForBiosafetyControls': {'127011': ('Reason for biosafety controls', [])}, 'ReasonForExam': {'122139': ('Reason for Exam', [])}, 'ReasonForProcedure': {'111401': ('Reason for procedure', [6052, 6053])}, 'ReasonForProceeding': {'113907': ('Reason for Proceeding', [])}, 'ReasonForRepeatingAcquisition': {'128552': ('Reason for Repeating ' 'Acquisition', [])}, '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', [6052])}, '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', [9520, 7157, 7151, 9505, 9513, 7193])}, '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', [])}, 'ReferenceMethod': {'122430': ('Reference Method', [])}, 'ReferencePoint': {'122611': ('Reference Point', [])}, 'ReferencePointDefinition': {'113780': ('Reference Point Definition', [])}, 'ReferencePoints': {'122438': ('Reference Points', [])}, 'ReferenceToUncertaintyDeterminationMethod': {'128511': ('Reference to ' 'Uncertainty ' 'Determination ' 'Method', [])}, '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', [])}, '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])}, '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', [33, 32])}, 'RegistrationCreatedDuringTreatment': {'129211': ('Registration created ' 'during Treatment', [7022])}, 'RegistrationInput': {'125041': ('Registration Input', [7165, 7196, 7151])}, 'RegistrationMethod': {'128446': ('Registration Method', [])}, 'RegistrationResult': {'128183': ('Registration Result', [9510, 7010, 9509])}, '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])}, 'RejectedForQualityReasons': {'113001': ('Rejected for Quality Reasons', [7010])}, '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', [7180, 7271, 218, 7263, 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', [7180, 218, 7469])}, 'RelativeMassDensity': {'130082': ('Relative Mass Density', [])}, 'RelativePosition': {'122337': ('Relative position', [])}, 'RelativeRegionalBloodFlow': {'126397': ('Relative Regional Blood Flow', [4108, 7180, 218, 7469])}, 'RelativeRegionalBloodVolume': {'126398': ('Relative Regional Blood Volume', [4108, 7180, 218, 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', [])}, 'ReplacedReport': {'121360': ('Replaced report', [7009])}, 'ReportRequested': {'128004': ('Report Requested', [])}, 'ReportVerification': {'110007': ('Report Verification', [9231])}, 'RepresentativeOfEthicsCommittee': {'128677': ('Representative of Ethics ' 'Committee', [7450, 7452])}, 'RepresentativeOfProtocolCommittee': {'128676': ('Representative of Protocol ' 'Committee', [7450, 7452])}, 'Request': {'121062': ('Request', [])}, 'Requesting': {'121096': ('Requesting', [7453])}, 'Resident': {'121086': ('Resident', [])}, 'ResidualVolumeOfImagingAgentInContainer': {'130206': ('Residual Volume of ' 'Imaging Agent in ' 'Container', [])}, 'ResourceInadequate': {'110527': ('Resource inadequate', [9300, 71])}, 'ResourcePreEmpted': {'110526': ('Resource pre-empted', [9300, 9303])}, 'RespirationWaveform': {'109117': ('Respiration Waveform', [3005])}, 'RespiratoryWaveform': {'RESP': ('Respiratory Waveform', [33, 29, 30])}, '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])}, 'ReticularPattern': {'112113': ('Reticular pattern', [6103, 6102, 6106])}, 'ReticulonodularPattern': {'112065': ('Reticulonodular pattern', [6104, 6103, 6102, 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])}, 'RibScaleneTubercle': {'112096': ('Rib Scalene Tubercle', [6115])}, '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', [6113, 6109, 6102, 9514, 7192, 7151])}, '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])}, 'RoomOxygenConcentration': {'122223': ('Room oxygen concentration', [])}, 'RoomTemperature': {'122224': ('Room temperature', [])}, 'RootAngularSecondMomentOfGLCM': {'126061': ('Root Angular Second Moment of ' 'GLCM', [7467, 218, 7468])}, '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])}, '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])}, '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', [])}, 'ScanningLength': {'113825': ('Scanning Length', [])}, 'ScapularInfraspinatusFossa': {'112101': ('Scapular Infraspinatus Fossa', [6115])}, 'ScapularSpine': {'112099': ('Scapular Spine', [6115])}, 'ScapularSupraspinatusFossa': {'112100': ('Scapular Supraspinatus Fossa', [6115])}, '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', [])}, 'SecondMeasureOfInformationCorrelationOfGLCM': {'128799': ('Second Measure of ' 'Information ' 'Correlation of ' 'GLCM', [])}, 'SecondaryPulmonaryLobule': {'112054': ('Secondary pulmonary lobule', [6109, 6102, 9514, 7192, 7151, 6110])}, '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])}, 'Segmentation': {'113076': ('Segmentation', [7203]), 'SEG': ('Segmentation', [33, 32])}, 'SegmentationMethod': {'122554': ('Segmentation Method', [])}, 'SegmentationResult': {'128182': ('Segmentation Result', [9510, 7010, 9509])}, 'SegmentedConstrained': {'113269': ('Segmented-Constrained', [7274])}, 'SegmentedUnconstrained': {'113268': ('Segmented-Unconstrained', [7274])}, 'SelectedImplantComponent': {'112346': ('Selected Implant Component', [])}, 'SelectedRegion': {'111099': ('Selected region', [6016, 6201, 6101, 6054, 6014])}, '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)', [6103, 6102])}, 'SeptumToWall': {'110876': ('Septum To Wall', [7185])}, 'SeptumWallAxis': {'110865': ('Septum-Wall Axis', [7184])}, 'SequencedAcquisition': {'113804': ('Sequenced Acquisition', [10013])}, 'Series': {'113015': ('Series', [10000, 7012])}, '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])}, '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', [6104, 6102])}, 'ShapeFromMotion': {'114206': ('Shape from motion', [8201])}, 'ShapeFromShading': {'114205': ('Shape from shading', [8201])}, 'SharplyDefined': {'112137': ('Sharply defined', [6120])}, 'SharplyDemarcated': {'112140': ('Sharply demarcated', [6120])}, 'SheetFilmDigitized': {'110020': ('Sheet Film Digitized', [7008])}, 'ShelterManufacturer': {'127196': ('Shelter manufacturer', [])}, 'ShelterProductCode': {'127198': ('Shelter product code', [])}, 'ShelterProductName': {'127197': ('Shelter product name', [])}, 'ShelterType': {'127195': ('Shelter type', [])}, '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)', [4106, 4101])}, 'SideOfFamily': {'111540': ('Side of Family', [])}, 'SignalBaselineEnd': {'122639': ('Signal Baseline End', [3836])}, 'SignalBaselineStart': {'122638': ('Signal Baseline Start', [3836])}, 'SignalChange': {'113059': ('Signal change', [7180, 218, 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', [7180, 218, 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', [6104, 6102])}, 'SilhouetteSign': {'112152': ('Silhouette sign', [6123])}, 'SiliconeGranuloma': {'111296': ('Silicone granuloma', [6031, 6030])}, 'SiliconeLadenLymphNodes': {'111507': ('Silicone-laden lymph nodes', [6072])}, 'SimpleObjectModel': {'128418': ('Simple Object Model', [10064])}, 'SimplifiedBernoulli': {'125218': ('Simplified Bernoulli', [12230, 12227])}, '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])}, '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])}, 'SingleSubjectExtractedFromGroup': {'113132': ('Single subject extracted from ' 'group', [7165, 7196, 7151])}, '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', [])}, 'SizeSpecificDoseEstimation': {'113930': ('Size Specific Dose Estimation', [])}, 'Skewness': {'126051': ('Skewness', [7464])}, '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])}, 'SkinOfAnteriorHelixOfEar': {'130305': ('Skin of anterior helix of ear', [4029])}, 'SkinOfCaruncleOfEye': {'130306': ('Skin of caruncle of eye', [4029])}, 'SkinOfInferiorHelixOfEar': {'130307': ('Skin of inferior helix of ear', [4029])}, 'SkinOfInferiorPosteriorSurfaceOfThePinna': {'130308': ('Skin of inferior ' 'posterior surface of ' 'the pinna', [4029])}, 'SkinOfInfraalarGroove': {'130312': ('Skin of infraalar groove', [4029])}, 'SkinOfLateralPartOfDorsumOfFoot': {'130309': ('Skin of lateral part of ' 'dorsum of foot', [4029])}, 'SkinOfLowerAntihelixOfEar': {'130310': ('Skin of lower antihelix of ear', [4029])}, 'SkinOfLowerEyelidMargin': {'130311': ('Skin of lower eyelid margin', [4029])}, 'SkinOfLowerParaspinalRegion': {'130304': ('Skin of lower paraspinal region', [4029])}, 'SkinOfMedialPartOfDorsumOfFoot': {'130313': ('Skin of medial part of dorsum ' 'of foot', [4029])}, 'SkinOfMidBack': {'130323': ('Skin of mid back', [4029])}, 'SkinOfMidParaspinalRegion': {'130303': ('Skin of mid paraspinal region', [4029])}, 'SkinOfParanasalCheek': {'130314': ('Skin of paranasal cheek', [4029])}, 'SkinOfParaspinalAreaOfTheNeck': {'130300': ('Skin of paraspinal area of the ' 'neck', [4029])}, 'SkinOfParaspinalAreaOfTheSuperiorBack': {'130301': ('Skin of paraspinal area ' 'of the superior back', [4029])}, 'SkinOfPosteriorHelixOfEar': {'130315': ('Skin of posterior helix of ear', [4029])}, 'SkinOfPosteriorLobuleOfTheEar': {'130316': ('Skin of posterior lobule of the ' 'ear', [4029])}, 'SkinOfSoleOfForefoot': {'130317': ('Skin of sole of forefoot', [4029])}, 'SkinOfSuperiorAntihelixOfEar': {'130318': ('Skin of superior antihelix of ' 'ear', [4029])}, 'SkinOfSuperiorPosteriorHelixOfEar': {'130319': ('Skin of superior posterior ' 'helix of ear', [4029])}, 'SkinOfSuperiorPosteriorSurfaceOfThePinna': {'130320': ('Skin of superior ' 'posterior surface of ' 'the pinna', [4029])}, 'SkinOfUpperAntihelixOfEar': {'130321': ('Skin of upper antihelix of ear', [4029])}, 'SkinOfUpperEyelidMargin': {'130322': ('Skin of upper eyelid margin', [4029])}, 'SkinOfUpperParaspinalRegion': {'130302': ('Skin of upper paraspinal region', [4029])}, 'SliceContributionToEjectionFraction': {'122498': ('Slice Contribution to ' 'Ejection Fraction', [])}, 'SliceThickness': {'112225': ('Slice Thickness', [])}, 'SlideIdentifier': {'121043': ('Slide Identifier', [])}, 'SlideMicroscopy': {'112702': ('Slide Microscopy', [8131]), 'SM': ('Slide Microscopy', [33, 29, 30])}, 'SlideUID': {'121044': ('Slide UID', [])}, 'SlidingWindowBeam': {'130106': ('Sliding Window Beam', [9511, 9524])}, 'SlowDiffusionCoefficient': {'113291': ('Slow Diffusion Coefficient', [7180, 7272, 218, 7469])}, 'SmallIrregularOpacities': {'112125': ('Small irregular opacities', [6104, 6102, 6106])}, 'SmallLesserThan32Point0cmLateralThickness': {'113601': ('Small: < 32.0 cm ' 'lateral thickness', [7041, 7042])}, 'SmallRoundedOpacities': {'112126': ('Small rounded opacities', [6104, 6102])}, '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', [6211, 6122])}, 'SoftwareConfiguration': {'110131': ('Software Configuration', [401, 403])}, 'SoftwareFailure': {'111218': ('Software failure', [6041, 6135, 7011])}, 'SolidMass': {'111462': ('Solid mass', [6064, 6054])}, 'Sonazoid': {'125905': ('Sonazoid', [12030])}, 'Sonographer': {'121093': ('Sonographer', [])}, 'Sonologist': {'121092': ('Sonologist', [7450, 7452])}, 'Sonovue': {'125906': ('SonoVue', [12030])}, 'SourceDocument': {'121335': ('Source Document', [7006])}, 'SourceDoseForComposingCurrentDose': {'121372': ('Source dose for composing ' 'current dose', [7221])}, 'SourceImage': {'121324': ('Source image', [7061, 7060, 7205])}, 'SourceImageDiffusionBValue': {'113240': ('Source image diffusion b-value', [7276, 9000])}, 'SourceImageForImageProcessingOperation': {'121322': ('Source image for image ' 'processing operation', [4264, 7222, 7202])}, 'SourceImageForMontage': {'121329': ('Source image for montage', [7202])}, 'SourceImageForSegmentation': {'121233': ('Source image for segmentation', [])}, 'SourceMeasurement': {'128224': ('Source measurement', [7060, 7013])}, 'SourceMedia': {'110155': ('Source Media', [402])}, 'SourceOfDoseInformation': {'113854': ('Source of Dose Information', [])}, 'SourceOfMeasurement': {'121112': ('Source of Measurement', [7003])}, 'SourceRawData': {'128226': ('Source raw data', [7060, 7013])}, 'SourceRealWorldValueMap': {'128227': ('Source real world value map', [7060, 7013, 7019])}, 'SourceReport': {'128225': ('Source report', [7060, 7013])}, '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', [7180, 218, 7469])}, 'SpatialDisplacementYComponent': {'110823': ('Spatial Displacement Y ' 'Component', [7180, 218, 7469])}, 'SpatialDisplacementZComponent': {'110824': ('Spatial Displacement Z ' 'Component', [7180, 218, 7469])}, 'SpatialFiducials': {'128447': ('Spatial Fiducials', []), 'FID': ('Spatial Fiducials', [33, 32])}, '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', [])}, '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', [7180, 218, 7469])}, 'Sphere': {'122485': ('Sphere', [4051, 7112, 7151, 8, 3451, 7111, 7193])}, 'SphericalDeconvolution': {'113238': ('Spherical Deconvolution', [7261])}, 'SphericalProjection': {'111791': ('Spherical projection', [4245])}, 'Spiculated': {'112136': ('Spiculated', [6119])}, 'SpinTaggingPerfusionMRSignalIntensity': {'110800': ('Spin Tagging Perfusion ' 'MR Signal Intensity', [7180, 218, 7469])}, 'SpontaneousAbortion': {'111566': ('Spontaneous Abortion', [6088, 6087])}, 'SpotMagnificationViews': {'111136': ('Spot magnification view(s)', [6029, 6028])}, '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', [226, 221, 7465])}, 'StandardFractionation': {'130097': ('Standard Fractionation', [9533])}, 'StandardToftsModel': {'126340': ('Standard Tofts Model', [4106, 4101])}, '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', [7180, 218, 7469])}, 'Standby': {'121101': ('Standby', [7453])}, 'StartOfAtrialContraction': {'109045': ('Start of atrial contraction', [3339]), '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])}, 'StationAETitle': {'110119': ('Station AE Title', [])}, 'StationaryAcquisition': {'113611': ('Stationary Acquisition', [10002]), '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': {'122383': ('Stented Region', [3487]), '122384': ('Stented Region', [])}, 'StepAndShootBeam': {'130105': ('Step and Shoot Beam', [9511, 9524])}, 'SteppingAcquisition': {'113612': ('Stepping Acquisition', [10002])}, 'StereometricRelationship': {'SMR': ('Stereometric Relationship', [33, 32])}, 'StereotacticCoordinates': {'127450': ('Stereotactic coordinates', [])}, '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])}, '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', [6113, 6109, 6102, 9514, 7192, 7151])}, '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', [33, 32])}, 'StudentTTest': {'113068': ("Student's T-test", [7180, 218, 7469])}, 'StudiesImported': {'110027': ('Studies Imported', [7008])}, 'Study': {'113014': ('Study', [10000, 7012])}, 'StudyDate': {'111060': ('Study Date', [])}, 'StudyInstanceUID': {'110180': ('Study Instance UID', [10001, 404])}, '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', [33, 29, 30])}, 'SuboptimalContrastTiming': {'128554': ('Suboptimal contrast timing', [10034])}, 'Subpleural': {'112153': ('Subpleural', [6124, 6126])}, 'SubpleuralLine': {'112115': ('Subpleural line', [6103, 6102])}, 'SubscapularFossa': {'112098': ('Subscapular Fossa', [6115])}, 'SubstanceUseHistory': {'111545': ('Substance Use History', [])}, 'Succeeded': {'111222': ('Succeeded', [6042])}, 'SuccessfulAnalyses': {'111062': ('Successful Analyses', [])}, 'SuccessfulDetections': {'111063': ('Successful Detections', [])}, 'SuggestiveOfMalignancyTakeAppropriateAction': {'111146': ('Suggestive of ' 'malignancy - take ' 'appropriate ' 'action', [6029, 6028])}, 'SumAverageOfGLCM': {'128787': ('Sum Average of GLCM', [])}, 'SumEntropyOfGLCM': {'128789': ('Sum Entropy of GLCM', [])}, 'SumOfSegmentedVoxelVolumes': {'126030': ('Sum of segmented voxel volumes', [7474])}, 'SumVarianceOfGLCM': {'128788': ('Sum Variance of GLCM', [])}, 'Summary': {'121111': ('Summary', [7002])}, '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])}, 'SuperiorLongitudinalFasciculusII': {'110704': ('superior longitudinal ' 'fasciculus II', [7703, 7710])}, 'SuperiorLongitudinalFasciculusIII': {'110705': ('superior longitudinal ' 'fasciculus III', [7703, 7710])}, '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', [9514, 7192, 7151, 4273])}, 'SurfaceContourMapping': {'111792': ('Surface contour mapping', [4245])}, 'SurfaceOfTheCenterOfTheRPE': {'128298': ('Surface of the center of the RPE', [9514, 7192, 7151, 4273])}, 'SurfaceOfTheChoroidScleraInterface': {'128301': ('Surface of the ' 'choroid-sclera interface', [9514, 7192, 7151, 4273])}, 'SurfaceOfTheInterdigitatingZoneBetweenRetinaAndRPE': {'128296': ('Surface of ' 'the ' 'interdigitating ' 'zone ' 'between ' 'retina and ' 'RPE', [9514, 7192, 7151, 4273])}, 'SurfaceRendering': {'113075': ('Surface rendering', [7203])}, 'Surgeon': {'121091': ('Surgeon', [])}, 'SurgeonFactor': {'111773': ('Surgeon Factor', [4237])}, 'SurgicalConsult': {'111410': ('Surgical consult', [6083, 6050, 6028])}, 'Survey': {'111128': ('Survey', [6061, 6051, 6058])}, 'SuspendProcedureAction': {'121132': ('Suspend Procedure Action', [3421])}, 'SuspendProcedureActionItem': {'121132': ('Suspend Procedure Action Item', [])}, 'Suvbsa': {'126403': ('SUVbsa', [7180, 218, 7469])}, 'Suvbw': {'126401': ('SUVbw', [7180, 218, 7469])}, 'Suvibw': {'126404': ('SUVibw', [7180, 218, 7469])}, 'Suvlbm': {'126402': ('SUVlbm', [7180, 218, 7469])}, 'SuvlbmJames128': {'126406': ('SUVlbm(James128)', [7180, 218, 7469])}, 'SuvlbmJanma': {'126405': ('SUVlbm(Janma)', [7180, 218, 7469])}, 'SynchronizedRoboticTreatment': {'130139': ('Synchronized Robotic Treatment', [9523, 9524])}, '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, 12276, 12267, 12266, 12268, 12264, 12263])}, 'SystolicBloodVelocityPeak': {'122204': ('Systolic blood velocity, peak', [3612, 12261, 12276, 12267, 12266, 12268, 12264, 12263])}, 'SystolicPeakPressure': {'109033': ('Systolic peak pressure', [])}, 'SystolicPressureAverage': {'109032': ('Systolic pressure, average', [])}, 'T1': {'113063': ('T1', [7180, 218, 7469])}, 'T1ByFixedValue': {'126352': ('T1 by Fixed Value', [4106, 4100])}, 'T1ByInversionRecovery': {'126351': ('T1 by Inversion Recovery', [4106, 4100])}, 'T1ByMultipleFlipAngles': {'126350': ('T1 by Multiple Flip Angles', [4106, 4100])}, 'T1UsedForCalculation': {'126353': ('T1 Used For Calculation', [])}, 'T1WeightedDynamicContrastEnhancedMRSignalIntensity': {'110816': ('T1 ' 'Weighted ' 'Dynamic ' 'Contrast ' 'Enhanced ' 'MR Signal ' 'Intensity', [7180, 218, 7469])}, 'T1WeightedMRSignalIntensity': {'110804': ('T1 Weighted MR Signal Intensity', [7180, 218, 7469])}, 'T1Worst': {'122367': ('T-1 Worst', [3493])}, 'T2': {'113064': ('T2*', [7180, 218, 7469]), '113065': ('T2', [7180, 218, 7469])}, 'T2Secondary': {'122368': ('T-2 Secondary', [3493])}, 'T2WeightedDynamicContrastEnhancedMRSignalIntensity': {'110817': ('T2 ' 'Weighted ' 'Dynamic ' 'Contrast ' 'Enhanced ' 'MR Signal ' 'Intensity', [7180, 218, 7469]), '110818': ('T2* ' 'Weighted ' 'Dynamic ' 'Contrast ' 'Enhanced ' 'MR Signal ' 'Intensity', [7180, 218, 7469])}, 'T2WeightedMRSignalIntensity': {'110805': ('T2 Weighted MR Signal Intensity', [7180, 218, 7469]), '110806': ('T2* Weighted MR Signal Intensity', [7180, 218, 7469])}, 'T3Secondary': {'122369': ('T-3 Secondary', [3493])}, 'T4Secondary': {'122370': ('T-4 Secondary', [3493])}, 'T807F18': {'126502': ('T807 F^18^', [4021])}, '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])}, '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', [6144, 6143])}, 'TargetLesionPartialResponse': {'112042': ('Target Lesion Partial Response', [6144, 6143])}, 'TargetLesionProgressiveDisease': {'112043': ('Target Lesion Progressive ' 'Disease', [6144, 6143])}, 'TargetLesionStableDisease': {'112044': ('Target Lesion Stable Disease', [6144, 6143])}, 'TargetNotInTheSpecimen': {'111445': ('Target not in the specimen', [6066])}, 'TargetPartiallyObtainedInTheSpecimen': {'111444': ('Target partially ' 'obtained in the specimen', [6066])}, 'TargetRegion': {'123014': ('Target Region', [])}, 'Targeted': {'111127': ('Targeted', [6061, 6051, 6058])}, 'Tau': {'109072': ('Tau', [12257, 12261, 12260, 3613, 12271, 12267, 3337, 12266, 12270, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12258, 12254])}, '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', [7180, 218, 7469])}, 'TemporalDerivativeExceedsThreshold': {'126373': ('Temporal Derivative ' 'Exceeds Threshold', [4104, 4106])}, 'TemporalDerivativeThreshold': {'126374': ('Temporal Derivative Threshold', [7180, 4109, 218, 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])}, 'TerritoryRegionSeverity': {'122459': ('Territory Region Severity', [])}, 'TextureDescriptor': {'112010': ('Texture Descriptor', [])}, 'Thermography': {'TG': ('Thermography', [33, 29, 30])}, '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])}, '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', [])}, 'Time': {'110858': ('Time', [7182])}, 'TimeAfterTheStartOfInjection': {'130194': ('Time after the start of ' 'injection', [])}, 'TimeCourseOfSignal': {'113066': ('Time course of signal', [7180, 218, 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', [7180, 218, 7469])}, 'TimeOfLeadingHalfPeakConcentration': {'126372': ('Time of Leading Half-Peak ' 'Concentration', [4104, 7180, 4109, 4106, 218, 7469])}, 'TimeOfPeakConcentration': {'126370': ('Time of Peak Concentration', [4104, 7180, 4109, 4106, 218, 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', [4108, 7180, 4109, 218, 7469])}, 'TimeframeUncertain': {'111399': ('Timeframe uncertain', [])}, 'TissueAirRatio': {'128433': ('Tissue Air Ratio', [10069])}, 'TissueFraction': {'128526': ('Tissue Fraction', [10069])}, 'TissueOfOrigin': {'127401': ('Tissue of origin', [])}, 'TissueSelectionMethod': {'112713': ('Tissue selection method', [])}, 'TissueVelocity': {'110827': ('Tissue Velocity', [7180, 218, 7469])}, 'Title21CFRSection900SubpartB': {'111239': ('Title 21 CFR Section 900, ' 'Subpart B', [6045])}, 'Tmax': {'113084': ('Tmax', [4108, 7180, 218, 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])}, 'TotalAcquisitionTime': {'113855': ('Total Acquisition Time', [])}, '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])}, 'TotalStepVolumeAdministered': {'130241': ('Total Step Volume Administered', [])}, 'TotalVascularResistance': {'122216': ('Total Vascular Resistance', [3619])}, 'Trace': {'113201': ('Trace', [7263])}, 'TracerConcentration': {'126377': ('Tracer Concentration', [7180, 4109, 218, 7469])}, 'TrackingIdentifier': {'112039': ('Tracking Identifier', [])}, 'TrackingUniqueIdentifier': {'112040': ('Tracking Unique Identifier', [])}, 'TramlineShadow': {'112116': ('Tramline shadow', [6103, 6102])}, 'Transcription': {'110006': ('Transcription', [9231]), '110012': ('Transcription', [])}, 'TransesophagealTransducer': {'125262': ('Transesophageal Transducer', [12035])}, 'TransitTimeTestInjection': {'130248': ('Transit Time Test Injection', [72])}, 'TransmissionIllumination': {'111741': ('Transmission illumination', [8123])}, 'TransmitFrequency': {'122098': ('Transmit Frequency', [3423])}, 'TransponderMarker': {'129306': ('Transponder Marker', [7112, 7111])}, '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])}, 'TreatmentPlanningNote': {'130024': ('Treatment Planning Note', [])}, 'TreeInBudSign': {'112127': ('Tree-in-bud sign', [6104, 6102])}, 'Trend': {'122151': ('Trend', [])}, 'TrueLumen': {'122360': ('True Lumen', [3494])}, 'TruncatedGaussianDiffusionModel': {'113255': ('Truncated Gaussian diffusion ' 'model', [7273])}, 'TrustRegion': {'113266': ('Trust-Region', [7274])}, 'TubularShadow': {'112117': ('Tubular shadow', [6103, 6102])}, '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', [4106, 4101])}, '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': {'111137': ('Ultrasound', []), 'US': ('Ultrasound', [33, 29, 30])}, 'UltrasoundAttenuation': {'110833': ('Ultrasound Attenuation', [7180, 218, 7469])}, 'UltrasoundBoneDensitometry': {'BDUS': ('Ultrasound Bone Densitometry', [33, 29, 30])}, 'UltrasoundContact': {'111750': ('Ultrasound Contact', [4230])}, 'UltrasoundImagingSubjectMatter': {'128736': ('Ultrasound imaging subject ' 'matter', [7017])}, 'UltrasoundImmersion': {'111751': ('Ultrasound Immersion', [4230])}, '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])}, 'UndeterminedSex': {'121103': ('Undetermined sex', [7455])}, 'UndilutedDoseAdministered': {'122092': ('Undiluted dose administered', [3410])}, 'Unheated': {'127255': ('Unheated', [635])}, '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', [6044, 3114])}, 'Unused': {'127177': ('Unused', [604])}, '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', [4241, 12301, 224, 4252])}, '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', [6088, 6087])}, 'VMAT': {'130107': ('VMAT', [9511, 9524])}, '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])}, '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', [6060, 6058])}, 'VacuumMold': {'130118': ('Vacuum Mold', [9520, 7157, 7151, 9505, 9513, 7193])}, 'VaginalCylinder': {'130121': ('Vaginal Cylinder', [9520, 7157, 7151, 9505, 9513, 7193])}, 'ValueBasedImage': {'129322': ('Value-based Image', [])}, 'ValueIndeterminate': {'114011': ('Value indeterminate', [42])}, 'ValueOutOfRange': {'114009': ('Value out of range', [42])}, 'ValueUnknown': {'114010': ('Value unknown', [42])}, 'ValveClose': {'109036': ('Valve close', [3337])}, 'ValveOpen': {'109037': ('Valve open', [3337])}, 'ValvularIntervention': {'122053': ('Valvular Intervention', [3405, 3406])}, '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', [7180, 218, 4107, 7469])}, 'VeilingGlareEvaluation': {'109707': ('Veiling glare evaluation', [8300])}, 'VelocityEncoded': {'113070': ('Velocity encoded', [7180, 218, 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])}, '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', [6087, 6081])}, 'VesselBranch': {'125101': ('Vessel Branch', [])}, 'VesselLumenCrossSectionalArea': {'122480': ('Vessel Lumen Cross-Sectional ' 'Area', [])}, 'VesselMorphology': {'122134': ('Vessel Morphology', [])}, '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', [6031, 6030])}, 'ViscosityAt37C': {'130186': ('Viscosity at 37C', [])}, 'VisibleReflectorMarker': {'129310': ('Visible Reflector Marker', [7112, 7111])}, 'VisualAcuity': {'VA': ('Visual Acuity', [33, 29, 30])}, 'VisualAlignment': {'125025': ('Visual Alignment', [7100])}, '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, 7472, 3471, 7469])}, 'VolumeEstimatedFromThreeOrMoreNonCoplanar2DRegions': {'121217': ('Volume ' 'estimated ' 'from three ' 'or more ' 'non-coplanar ' '2D regions', [218, 7472, 7469])}, 'VolumeEstimatedFromTwoNonCoplanar2DRegions': {'121218': ('Volume estimated ' 'from two ' 'non-coplanar 2D ' 'regions', [218, 7472, 3471, 7469])}, 'VolumeMethod': {'122429': ('Volume Method', [])}, 'VolumeOccupancyImage': {'129328': ('Volume Occupancy Image', [])}, 'VolumeOfBoundingThreeDimensionalRegion': {'121219': ('Volume of bounding ' 'three dimensional ' 'region', [218, 7472, 7469])}, 'VolumeOfBreast': {'112193': ('Volume of breast', [6142])}, 'VolumeOfCircumscribedSphere': {'121220': ('Volume of circumscribed sphere', [218, 7472, 7469])}, 'VolumeOfEllipsoid': {'121221': ('Volume of ellipsoid', [218, 7472, 7469])}, 'VolumeOfParenchymalTissue': {'112192': ('Volume of parenchymal tissue', [6142])}, 'VolumeOfSphere': {'121222': ('Volume of sphere', [218, 7472, 7469])}, 'VolumeOfUse': {'111580': ('Volume of use', [6092])}, 'VolumeOfVascularCalcification': {'112197': ('Volume of Vascular ' 'Calcification', [6142])}, 'VolumeRatio': {'113288': ('Volume Ratio', [7180, 7271, 218, 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', [7186, 7270, 7180, 218, 7263, 7469])}, 'VolumetricDiffusionDxyComponent': {'110811': ('Volumetric Diffusion Dxy ' 'Component', [7186, 7270, 7180, 218, 7263, 7469])}, 'VolumetricDiffusionDxzComponent': {'110812': ('Volumetric Diffusion Dxz ' 'Component', [7186, 7270, 7180, 218, 7263, 7469])}, 'VolumetricDiffusionDyyComponent': {'110813': ('Volumetric Diffusion Dyy ' 'Component', [7186, 7270, 7180, 218, 7263, 7469])}, 'VolumetricDiffusionDyzComponent': {'110814': ('Volumetric Diffusion Dyz ' 'Component', [7186, 7270, 7180, 218, 7263, 7469])}, 'VolumetricDiffusionDzzComponent': {'110815': ('Volumetric Diffusion Dzz ' 'Component', [7186, 7270, 7180, 218, 7263, 7469])}, 'VoxelizedRadiationTransportModel': {'128422': ('Voxelized Radiation ' 'Transport Model', [10065])}, 'VoxelwiseSelectionOfBValue': {'113285': ('Voxelwise selection of b-value', [7275])}, 'Vp': {'126331': ('vp', [7180, 218, 4107, 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', [12257, 12271, 12265, 12255, 12259, 12258])}, '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', [])}, 'WaterEquivalentDiameter': {'113980': ('Water Equivalent Diameter', [])}, 'WaterEquivalentDiameterFromLocalizer': {'113984': ('Water Equivalent ' 'Diameter From Localizer', [10023, 10069])}, 'WaterEquivalentDiameterFromRawData': {'113983': ('Water Equivalent Diameter ' 'From Raw Data', [10023, 10069])}, 'WaterEquivalentDiameterIntegratedAcrossScanRange': {'113982': ('Water ' 'Equivalent ' 'Diameter ' 'Integrated ' 'Across Scan ' 'Range', [10023, 10069])}, 'WaterEquivalentDiameterRepresentativeValue': {'113981': ('Water Equivalent ' 'Diameter ' 'Representative ' 'Value', [10023, 10069])}, 'WaterFatInPhase': {'129101': ('Water/fat in phase', [7180, 218, 7469])}, 'WaterFatOutOfPhase': {'129102': ('Water/fat out of phase', [7180, 218, 7469])}, 'WaterFraction': {'129103': ('Water fraction', [7180, 218, 7469])}, 'WaveformAcquired': {'121143': ('Waveform Acquired', [])}, 'WeakFamilyHistoryOfBreastCancer': {'111559': ('Weak family history of breast ' 'cancer', [6087, 6081])}, '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', [9520, 7157, 7151, 9505, 9513, 7193])}, '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', [])}, 'WireMarker': {'129305': ('Wire Marker', [7112, 7111])}, '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])}, 'XRayAngiography': {'XA': ('X-Ray Angiography', [33, 29, 30])}, 'XRayAttenuation': {'110850': ('X-Ray Attenuation', [7180, 218, 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', [])}, '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', [])}, 'XRayTubeCurrent': {'113734': ('X-Ray Tube Current', [])}, 'Xmab557489Zr': {'126734': ('XmAb5574 ^89^Zr', [4021])}, 'YBRFULLCBComponent': {'110838': ('YBR FULL CB Component', [7186, 7180, 218, 7469])}, 'YBRFULLCRComponent': {'110839': ('YBR FULL CR Component', [7186, 7180, 218, 7469])}, 'YBRFULLYComponent': {'110837': ('YBR FULL Y Component', [7186, 7180, 218, 7469])}, 'YBRICTCBComponent': {'110844': ('YBR ICT CB Component', [7186, 7180, 218, 7469])}, 'YBRICTCRComponent': {'110845': ('YBR ICT CR Component', [7186, 7180, 218, 7469])}, 'YBRICTYComponent': {'110843': ('YBR ICT Y Component', [7186, 7180, 218, 7469])}, 'YBRPARTIALCBComponent': {'110841': ('YBR PARTIAL CB Component', [7186, 7180, 218, 7469])}, 'YBRPARTIALCRComponent': {'110842': ('YBR PARTIAL CR Component', [7186, 7180, 218, 7469])}, 'YBRPARTIALYComponent': {'110840': ('YBR PARTIAL Y Component', [7186, 7180, 218, 7469])}, 'YBRRCTCBComponent': {'110847': ('YBR RCT CB Component', [7186, 7180, 218, 7469])}, 'YBRRCTCRComponent': {'110848': ('YBR RCT CR Component', [7186, 7180, 218, 7469])}, 'YBRRCTYComponent': {'110846': ('YBR RCT Y Component', [7186, 7180, 218, 7469])}, 'YConcept': {'122699': ('Y-Concept', [])}, 'YDescentPressure': {'122209': ('y-descent pressure', [3611])}, 'YellowGreenFilter': {'111604': ('Yellow-green filter', [])}, 'ZPointPressure': {'122210': ('z-point pressure', [3611])}, 'ZScore': {'113071': ('Z-score', [7180, 218, 7469])}, 'ZScoreOfMeasurement': {'121416': ('Z-Score of measurement', [227, 221, 7465])}, 'ZValueOfLocationOfWaterEquivalentDiameterEstimation': {'113986': ('Z value ' 'of ' 'location ' 'of Water ' 'Equivalent ' 'Diameter ' 'estimation', [])}, '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', [])}, '_10X': {'112716': ('10X', [8132])}, '_10YearCHDRisk': {'122230': ('10 Year CHD Risk', [3667])}, '_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])}, '_1cmAboveTabletop': {'113862': ('1cm above Tabletop', [10025])}, '_1stWeek': {'111392': ('1st week', [6163])}, '_20X': {'112717': ('20X', [8132])}, '_28H189Zr': {'126752': ('28H1 ^89^Zr', [4021])}, '_2FAF18': {'126713': ('2FA F^18^', [4021])}, '_2SigmaDeviationOfPopulation': {'121417': ('2 Sigma deviation of population', [226, 221, 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', [])}, '_3HeliumNucleus': {'130141': ('^3^Helium nucleus', [9526])}, '_3rdWeek': {'111394': ('3rd week', [6163])}, '_40X': {'112718': ('40X', [8132])}, '_43Scandium': {'126605': ('^43^Scandium', [4020])}, '_44Scandium': {'126600': ('^44^Scandium', [4020])}, '_4DRadiationTreatmentNote': {'130027': ('4D Radiation Treatment Note', [])}, '_4HeliumNucleus': {'130142': ('^4^Helium nucleus', [9526])}, '_4MonthsTo1YearAgo': {'111397': ('4 months to 1 year ago', [6164])}, '_4PointSegmentFindingScale': {'125223': ('4 Point Segment Finding Scale', [12238])}, '_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])}, '_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['LN'] = \ {'ACASUM2000': {'33072-0': ('AC, ASUM 2000', [12013, 12012])}, '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', [12013, 12012])}, 'ACDerivedByGAChitty1994': {'33546-3': ('AC (derived) by GA, Chitty 1994', [12012, 12015])}, 'ACHadlock1984': {'11892-7': ('AC, Hadlock 1984', [12013, 12012])}, 'ACHansmann1985': {'33073-8': ('AC, Hansmann1985', [12013, 12012])}, 'ACInterval': {'59103-2': ('A-C Interval', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'ACJeanty1982': {'33537-2': ('AC, Jeanty 1982', [12013, 12012])}, 'ACJeanty1984': {'11893-5': ('AC, Jeanty 1984', [12013, 12012])}, 'ACLessoway1998': {'33074-6': ('AC, Lessoway 1998', [12013, 12012])}, 'ACMeasuredByGAChitty1994': {'33147-0': ('AC (measured) by GA, Chitty 1994', [12012, 12015])}, 'ACMertz1988': {'33075-3': ('AC, Mertz 1988', [12013, 12012])}, 'ACShinozuka1996': {'33076-1': ('AC, Shinozuka 1996', [12013, 12012])}, 'APADTAD': {'33191-8': ('APAD * TAD', [12005])}, 'APAbdominalDiameterLessoway1998': {'33077-9': ('A-P Abdominal Diameter, ' 'Lessoway 1998', [12013, 12012])}, 'AWaveAmplitude': {'59100-8': ('A-Wave Amplitude', [12271, 12272, 12263, 12262])}, 'AWaveDuration': {'59105-7': ('A-Wave Duration', [12257, 12261, 12260, 12271, 12267, 12266, 12270, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12258, 12254])}, 'AWavePeakVelocity': {'59081-0': ('A-Wave Peak Velocity', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'AbdominalCircumference': {'11979-2': ('Abdominal Circumference', [12005, 12279])}, 'AccelerationIndex': {'20167-3': ('Acceleration Index', [12119, 12121])}, 'AccelerationSlope': {'20167-3': ('Acceleration Slope', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'AccelerationTime': {'20168-1': ('Acceleration Time', [12304, 12200, 12257, 12261, 12260, 12276, 12271, 12267, 12119, 12207, 12211, 12122, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'Addendum': {'55107-7': ('Addendum', [7001])}, 'AliasVelocity': {'59130-5': ('Alias Velocity', [12304, 12200, 12257, 12261, 12260, 12276, 12271, 12267, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, '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])}, 'AorticRootDiameter': {'18015-8': ('Aortic Root Diameter', [12212]), '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', [12271, 12211, 12270, 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', [12013, 12012])}, 'AxtByGAShinozuka1996': {'33150-4': ('AxT by GA, Shinozuka 1996', [12012, 12015])}, 'AxtShinozuka1996': {'33078-7': ('AxT, Shinozuka 1996', [12013, 12012])}, 'BCSlope': {'59126-3': ('B-C Slope', [12271, 12272, 12263, 12262])}, 'BDJeanty1982': {'33545-5': ('BD, Jeanty 1982', [12013, 12012])}, 'BPDASUM1989': {'33079-5': ('BPD, ASUM 1989', [12013, 12012])}, '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', [12013, 12012])}, 'BPDHadlock1984': {'11902-4': ('BPD, Hadlock 1984', [12013, 12012])}, 'BPDHansmann1985': {'11903-2': ('BPD, Hansmann 1985', [12013, 12012])}, 'BPDHansmann1986': {'33538-0': ('BPD, Hansmann 1986', [12013, 12012])}, 'BPDJeanty1982': {'33539-8': ('BPD, Jeanty 1982', [12013, 12012])}, 'BPDJeanty1984': {'11905-7': ('BPD, Jeanty 1984', [12013, 12012])}, 'BPDKurtz1980': {'11906-5': ('BPD, Kurtz 1980', [12013, 12012])}, 'BPDLessoway1998': {'33080-3': ('BPD, Lessoway 1998', [12013, 12012])}, 'BPDMertz1988': {'33081-1': ('BPD, Mertz 1988', [12013, 12012])}, 'BPDOiChitty1997': {'33086-0': ('BPD-oi, Chitty 1997', [12013, 12012])}, 'BPDOoChitty1997': {'33087-8': ('BPD-oo, Chitty 1997', [12013, 12012])}, 'BPDOsaka1989': {'33082-9': ('BPD, Osaka 1989', [12013, 12012])}, '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', [12013, 12012])}, 'BPDSabbagha1978': {'11907-3': ('BPD, Sabbagha 1978', [12013, 12012])}, 'BPDShinozuka1996': {'33084-5': ('BPD, Shinozuka 1996', [12013, 12012])}, 'BPDTokyo1986': {'33085-2': ('BPD, Tokyo 1986', [12013, 12012])}, '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', [12013, 12012])}, 'BrainMRI': {'24590-2': ('Brain MRI', [646])}, 'BrainPET': {'44138-6': ('Brain PET', [646])}, 'BrainSPECT': {'39632-5': ('Brain SPECT', [646])}, 'BreastBilateralMammogram': {'36626-0': ('breast - bilateral mammogram', [6083, 6050])}, 'BreastBilateralMr': {'30795-9': ('breast - bilateral mr', [6083, 6050])}, 'BreastBilateralMrWContrastIv': {'36150-1': ('breast - bilateral mr w ' 'contrast iv', [6083, 6050])}, 'BreastBilateralMrWoAndWContrastIv': {'36277-2': ('breast - bilateral mr wo ' 'and w contrast iv', [6083, 6050])}, 'BreastFfdMammogram': {'46342-2': ('breast ffd mammogram', [6083, 6050])}, 'BreastLeftMammogram': {'36627-8': ('breast - left mammogram', [6083, 6050])}, 'BreastLeftMr': {'35954-7': ('breast - left mr', [6083, 6050])}, 'BreastLeftMrWContrastIv': {'36151-9': ('breast - left mr w contrast iv', [6083, 6050])}, 'BreastLeftMrWoAndWContrastIv': {'36278-0': ('breast - left mr wo and w ' 'contrast iv', [6083, 6050])}, 'BreastMrWContrastIv': {'36149-3': ('breast mr w contrast iv', [6083, 6050])}, 'BreastMrWoAndWContrastIv': {'36276-4': ('breast mr wo and w contrast iv', [6083, 6050])}, 'BreastRightMammogram': {'37774-7': ('breast - right mammogram', [6083, 6050])}, 'BreastRightMr': {'35955-4': ('breast - right mr', [6083, 6050])}, 'BreastRightMrWContrastIv': {'36152-7': ('breast - right mr w contrast iv', [6083, 6050])}, 'BreastRightMrWoAndWContrastIv': {'36279-8': ('breast - right mr wo and w ' 'contrast iv', [6083, 6050])}, 'BreastUnilateralMammogram': {'46339-8': ('breast - unilateral mammogram', [6083, 6050])}, 'BreastUnilateralMr': {'46299-4': ('breast - unilateral mr', [6083, 6050])}, 'BreastUnilateralMrWContrastIv': {'46323-2': ('breast - unilateral mr w ' 'contrast iv', [6083, 6050])}, 'BreastUnilateralMrWoAndWContrastIv': {'43528-9': ('breast - unilateral mr wo ' 'and w contrast iv', [6083, 6050])}, 'BreastUnilateralMrWoContrast': {'46333-1': ('breast - unilateral mr wo ' 'contrast', [6083, 6050])}, 'CEDistance': {'59122-2': ('C-E Distance', [12271, 12267, 12251, 12266, 12268, 12272, 12263, 12262])}, 'CKDEPIFormulaEstimationOfGFR': {'62238-1': ('CKD-EPI Formula estimation of ' 'GFR', [10046])}, 'CRLASUM1991': {'33089-4': ('CRL, ASUM 1991', [12013, 12012])}, 'CRLASUM2000': {'33090-2': ('CRL, ASUM 2000', [12013, 12012])}, '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', [12013, 12012])}, 'CRLHadlock1992': {'11910-7': ('CRL, Hadlock 1992', [12013, 12012])}, 'CRLHansmann1985': {'11911-5': ('CRL, Hansmann 1985', [12013, 12012])}, 'CRLHansmann1986': {'33540-6': ('CRL, Hansmann 1986', [12013, 12012])}, 'CRLJeanty1982': {'33092-8': ('CRL, Jeanty 1982', [12013, 12012])}, 'CRLJeanty1984': {'11917-2': ('CRL, Jeanty 1984', [12013, 12012])}, 'CRLNelson1981': {'11913-1': ('CRL, Nelson 1981', [12013, 12012])}, 'CRLOsaka1989': {'33093-6': ('CRL, Osaka 1989', [12013, 12012])}, 'CRLRempen1991': {'33094-4': ('CRL, Rempen 1991', [12013, 12012])}, 'CRLRobinson1975': {'11914-9': ('CRL, Robinson 1975', [12013, 12012])}, 'CRLShinozuka1996': {'33095-1': ('CRL, Shinozuka 1996', [12013, 12012])}, 'CRLTokyo1986': {'33096-9': ('CRL, Tokyo 1986', [12013, 12012])}, 'CT3DCAMModel': {'85040-4': ('CT 3D CAM model', [7061])}, 'CTAbdomenReport': {'11540-2': ('CT Abdomen Report', [7000])}, 'CTChestReport': {'11538-6': ('CT Chest Report', [7000])}, 'CTHeadReport': {'11539-4': ('CT Head Report', [7000])}, 'CTPerfusionHeadWithContrastIV': {'39142-5': ('CT perfusion head with ' 'contrast IV', [100])}, 'CTReport': {'18747-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])}, 'CisternaMagna': {'11860-4': ('Cisterna Magna', [12005, 12279])}, 'CisternaMagnaLength': {'11860-4': ('Cisterna Magna length', [12007])}, 'ClavicleLength': {'11962-8': ('Clavicle length', [12006])}, 'ClavicleLengthYarkoni1985': {'33088-6': ('Clavicle length, Yarkoni 1985', [12013, 12012])}, 'ClinicalInformation': {'55752-0': ('Clinical Information', [7001])}, 'ClosureToOpeningTime': {'59082-8': ('Closure to Opening Time', [12257, 12261, 12260, 12271, 12267, 12266, 12270, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12258, 12254])}, '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', [7001])}, 'CrownRumpLength': {'11957-8': ('Crown Rump Length', [12009])}, 'CurrentProcedureDescriptions': {'55111-9': ('Current Procedure Descriptions', [7001])}, 'DEExcursion': {'59091-9': ('D-E Excursion', [12271, 12267, 12251, 12266, 12268, 12272, 12263, 12262])}, 'DESlope': {'59127-1': ('D-E Slope', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'DEXASkeletalSystemStudyReport': {'38269-7': ('DEXA Skeletal System Study ' 'Report', [7000])}, 'DecelerationSlope': {'20216-8': ('Deceleration Slope', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'DecelerationTime': {'20217-6': ('Deceleration Time', [12304, 12200, 12257, 12261, 12260, 12276, 12271, 12267, 12119, 12207, 12211, 12122, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, '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', [12304, 12257, 12261, 12260, 12271, 12267, 12266, 12270, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12258, 12254])}, '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, 12257, 12261, 12260, 12276, 12271, 12267, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, '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])}, 'EFWPercentileRank': {'11767-1': ('EFW percentile rank', [12019])}, 'EVelocityToAnnulusEVelocityRatio': {'59111-5': ('E Velocity to Annulus E ' 'Velocity Ratio', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'EWavePeakVelocity': {'59080-2': ('E-Wave Peak Velocity', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'EchocardiographyReport': {'11522-0': ('Echocardiography Report', [7000])}, 'EjectionTime': {'20222-6': ('Ejection Time', [12257, 12261, 12260, 12271, 12267, 12266, 12270, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12258, 12254])}, 'EndDiastolicVelocity': {'11653-3': ('End Diastolic Velocity', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12119, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12120, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'EndocardialArea': {'59094-3': ('Endocardial Area', [12257, 12271, 12265, 12255, 12259, 12258])}, 'EndometriumThickness': {'12145-9': ('Endometrium Thickness', [12011])}, 'EnvelopeDuration': {'59108-1': ('Envelope Duration', [12257, 12261, 12260, 12271, 12267, 12266, 12270, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12258, 12254])}, 'EpicardialArea': {'59093-5': ('Epicardial Area', [12304, 12257, 12271, 12265, 12255, 12259, 12258])}, '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', [12013, 12012])}, 'FLHC': {'11873-7': ('FL/HC', [12004, 12279])}, 'FLHadlock1984': {'11920-6': ('FL, Hadlock 1984', [12013, 12012])}, 'FLHansmann1985': {'11921-4': ('FL, Hansmann 1985', [12013, 12012])}, 'FLHansmann1986': {'33541-4': ('FL, Hansmann 1986', [12013, 12012])}, 'FLHohler1982': {'11922-2': ('FL, Hohler 1982', [12013, 12012])}, 'FLJeanty1982': {'33099-3': ('FL, Jeanty 1982', [12013, 12012])}, 'FLJeanty1984': {'11923-0': ('FL, Jeanty 1984', [12013, 12012])}, 'FLLessoway1998': {'33100-9': ('FL, Lessoway 1998', [12013, 12012])}, 'FLMerz1987': {'11924-8': ('FL, Merz 1987', [12013, 12012])}, 'FLMerz1988': {'33542-2': ('FL, Merz 1988', [12013, 12012])}, 'FLOsaka1989': {'33101-7': ('FL, Osaka 1989', [12013, 12012])}, 'FLShinozuka1996': {'33102-5': ('FL, Shinozuka 1996', [12013, 12012])}, 'FLTokyo1986': {'33103-3': ('FL, Tokyo 1986', [12013, 12012])}, 'FWPByGAAlexander1996': {'33185-0': ('FWP by GA, Alexander, 1996', [12016, 12012])}, 'FWPByGABrenner1976': {'33189-2': ('FWP by GA, Brenner 1976', [12016, 12012])}, 'FWPByGAHadlock1985': {'33190-0': ('FWP by GA, Hadlock 1985', [12016, 12012])}, 'FWPByGAWilliams1982': {'33184-3': ('FWP by GA, Williams, 1982', [12016, 12012])}, 'FemaleSingletonBWPByGAArbuckle1993': {'33187-6': ('Female Singleton BWP by ' 'GA, Arbuckle 1993', [12016, 12012])}, 'FemaleTwinsBWPByGAArbuckle1993': {'33188-4': ('Female Twins BWP by GA, ' 'Arbuckle 1993', [12016, 12012])}, 'FemurLength': {'11963-6': ('Femur Length', [12006, 12005, 12279])}, 'FetalHeartRate': {'11948-7': ('Fetal Heart Rate', [12019])}, 'FetalTrunkCrossSectionalAreaOsaka1989': {'33138-9': ('Fetal Trunk ' 'Cross-Sectional Area, ' 'Osaka 1989', [12013, 12012])}, 'FibulaByGAJeanty1983': {'33164-5': ('Fibula by GA, Jeanty 1983', [12012, 12015])}, 'FibulaJeanty1983': {'33097-7': ('Fibula, Jeanty 1983', [12013, 12012])}, 'FibulaLength': {'11964-4': ('Fibula length', [12006])}, 'FibulaMerz1987': {'11918-0': ('Fibula, Merz 1987', [12013, 12012])}, 'FillingTime': {'59119-8': ('Filling Time', [12257, 12261, 12260, 12271, 12267, 12266, 12270, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12258, 12254])}, 'Findings': {'59776-5': ('Findings', [7001])}, 'FirstQuadrantDiameter': {'11624-4': ('First Quadrant Diameter', [12008])}, 'FlowArea': {'20226-7': ('Flow Area', [12257, 12260, 12271, 12267, 12266, 12270, 12265, 12253, 12269, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12258])}, 'FlowRadius': {'59102-4': ('Flow Radius', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'FluoroscopyStudyReport': {'49512-7': ('Fluoroscopy Study Report', [7000])}, 'FootLength': {'11965-1': ('Foot length', [12005])}, 'FootLengthMercer1987': {'11926-3': ('Foot Length, Mercer 1987', [12013, 12012])}, 'ForamenOvaleDiameterAorticRootDiameter': {'59077-8': ('Foramen Ovale ' 'Diameter/Aortic Root ' 'Diameter', [12279])}, 'FourthQuadrantDiameter': {'11623-6': ('Fourth Quadrant Diameter', [12008])}, 'FractionalShortening': {'59132-1': ('Fractional Shortening', [12304, 12257, 12271, 12267, 12266, 12270, 12268, 12252, 12272, 12264, 12259, 12263, 12274, 12262])}, 'GSByGARempen1991': {'33171-0': ('GS by GA, Rempen 1991', [12012, 12015])}, 'GSDaya1991': {'33104-1': ('GS, Daya 1991', [12013, 12012])}, 'GSHansmann1979': {'33105-8': ('GS, Hansmann 1979', [12013, 12012])}, 'GSHansmann1982': {'33106-6': ('GS, Hansmann 1982', [12013, 12012])}, 'GSHellman1969': {'11928-9': ('GS, Hellman 1969', [12013, 12012])}, 'GSNyberg1992': {'33107-4': ('GS, Nyberg 1992', [12013, 12012])}, 'GSRempen1991': {'11929-7': ('GS, Rempen 1991', [12013, 12012])}, 'GSTokyo1986': {'33108-2': ('GS, Tokyo 1986', [12013, 12012])}, 'GestationalAge': {'18185-9': ('Gestational Age', [12019])}, 'GestationalAgeByLMP': {'11885-1': ('Gestational Age by LMP', [12013, 12012, 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': {'33182-7': ('HC/AC by GA, Campbell 1977', [12012, 12015])}, 'HCASUM2000': {'33109-0': ('HC, ASUM 2000', [12013, 12012])}, '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', [12013, 12012])}, 'HCHadlock1984': {'11932-1': ('HC, Hadlock 1984', [12013, 12012])}, 'HCHansmann1985': {'33112-4': ('HC, Hansmann 1985', [12013, 12012])}, 'HCHansmann1986': {'33543-0': ('HC, Hansmann 1986', [12013, 12012])}, 'HCJeanty1982': {'33113-2': ('HC, Jeanty 1982', [12013, 12012])}, 'HCJeanty1984': {'11934-7': ('HC, Jeanty 1984', [12013, 12012])}, 'HCLessoway1998': {'33114-0': ('HC, Lessoway 1998', [12013, 12012])}, 'HCMeasuredChitty1997': {'33110-8': ('HC measured, Chitty 1997', [12013, 12012])}, 'HCMerz1988': {'33115-7': ('HC Merz, 1988', [12013, 12012])}, 'HRCorrectedMeanVelocityOfCircumferentialFiberShortening': {'59118-0': ('HR-Corrected ' 'Mean ' 'Velocity ' 'of ' 'Circumferential ' 'Fiber ' 'Shortening', [12257, 12271, 12267, 12266, 12270, 12268, 12252, 12272, 12264, 12259, 12263, 12274, 12262])}, 'HeadCT': {'24725-4': ('Head CT', [646])}, 'HeadCircumference': {'11984-2': ('Head Circumference', [12005, 12279])}, 'HeartRate': {'8867-4': ('Heart rate', [12216, 12200, 12257, 12220, 12261, 12260, 12276, 12217, 12271, 12267, 12210, 12206, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12212, 12269, 12268, 12205, 12272, 12264, 12209, 12214, 12259, 12218, 12263, 12275, 12274, 12262, 12258, 12215])}, 'HeartRateCorrectedEjectionTime': {'59086-9': ('Heart Rate-Corrected Ejection ' 'Time', [12257, 12261, 12260, 12271, 12267, 12266, 12270, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12258, 12254])}, 'HeartRateCorrectedPreEjectionPeriod': {'59087-7': ('Heart Rate-Corrected ' 'Pre-Ejection Period', [12257, 12261, 12260, 12271, 12267, 12266, 12270, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12258, 12254])}, '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', [12013, 12012])}, 'HumerusLength': {'11966-9': ('Humerus length', [12006])}, 'HumerusLengthASUM2000': {'33116-5': ('Humerus Length, ASUM 2000', [12013, 12012])}, 'HumerusLengthByGAASUM2000': {'33177-7': ('Humerus Length by GA, ASUM 2000', [12012, 12015])}, 'HumerusLengthOsaka1989': {'33117-3': ('Humerus Length, Osaka 1989', [12013, 12012])}, 'HumerusMerz1987': {'11937-0': ('Humerus, Merz 1987', [12013, 12012])}, 'ICACCAVelocityRatio': {'33868-1': ('ICA/CCA velocity ratio', [12123])}, 'IODMayden1982': {'33122-3': ('IOD, Mayden 1982', [12013, 12012])}, 'IODTrout1994': {'33123-1': ('IOD, Trout 1994', [12013, 12012])}, 'Impressions': {'19005-8': ('Impressions', [7001, 6052])}, 'IndicationsForProcedure': {'18785-6': ('Indications for Procedure', [7001])}, 'InferiorVenaCavaDiameter': {'18006-7': ('Inferior Vena Cava Diameter', [12215]), '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, 12257, 12201, 12271, 12259])}, 'IntravascularDiastolicBloodPressure': {'8462-4': ('Intravascular diastolic ' 'blood pressure', [3611])}, 'IntravascularSystolicBloodPressure': {'8480-6': ('Intravascular Systolic ' 'Blood pressure', [3611])}, 'IsovolumicContractionTime': {'59084-4': ('Isovolumic Contraction Time', [12257, 12261, 12260, 12271, 12267, 12266, 12270, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12258, 12254])}, 'IsovolumicRelaxationTime': {'59083-6': ('Isovolumic Relaxation Time', [12257, 12261, 12260, 12271, 12267, 12266, 12270, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12258, 12254])}, 'JetArea': {'59123-0': ('Jet Area', [12257, 12260, 12271, 12267, 12266, 12270, 12265, 12253, 12269, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12258])}, 'KeyImages': {'55113-5': ('Key Images', [7001])}, 'LMP': {'11955-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', [12271, 12267, 12251, 12266, 12268, 12272, 12263, 12262])}, 'LeafletThickness': {'59110-7': ('Leaflet Thickness', [12271, 12267, 12251, 12266, 12268, 12272, 12263, 12262])}, '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', [12265, 12205])}, 'LeftAtriumVolumeToRightAtriumVolumeRatio': {'59131-3': ('Left Atrium Volume ' 'to Right Atrium ' 'Volume Ratio', [12265])}, '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]), '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, 12271, 12259])}, '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, 12271, 12259])}, '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])}, 'LeftVentricularInternalDiastolicDimensionBSA': {'80009-4': ('Left ' 'ventricular ' 'internal ' 'diastolic ' 'dimension / BSA', [12300]), '80010-2': ('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])}, 'LeftVentricularInternalSystolicDimensionBSA': {'80013-6': ('Left ventricular ' 'internal ' 'systolic ' 'dimension / BSA', [12300]), '80014-4': ('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])}, 'LeftVentricularPosteriorWallDiastolicThickness': {'80031-8': ('Left ' 'ventricular ' 'posterior ' 'wall ' 'diastolic ' 'thickness', [12300]), '80032-6': ('Left ' 'ventricular ' 'posterior ' 'wall ' 'diastolic ' 'thickness', [12300])}, 'LeftVentricularPosteriorWallSystolicThickness': {'80033-4': ('Left ' 'ventricular ' 'posterior wall ' 'systolic ' 'thickness', [12300]), '80034-2': ('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', [12013, 12012])}, 'MR3DCAMModel': {'85041-2': ('MR 3D CAM model', [7061])}, 'MRIHeadReport': {'11541-0': ('MRI Head Report', [7000])}, 'MRIReport': {'18755-9': ('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]), '80049-0': ('Main pulmonary artery diameter', [12300])}, 'MainPulmonaryArteryVmax': {'': ('Main pulmonary artery Vmax', [12300])}, 'MaleSingletonBWPByGAArbuckle1993': {'33186-8': ('Male Singleton BWP by GA, ' 'Arbuckle 1993', [12016, 12012])}, 'MaleTwinsBWPByGAArbuckle1993': {'33199-1': ('Male Twins BWP by GA, Arbuckle ' '1993', [12016, 12012])}, 'MammographyScreeningReport': {'24606-6': ('Mammography Screening Report', [7000])}, 'MeanBloodVelocity': {'20352-1': ('Mean Blood Velocity', [12304])}, 'MeanGradient': {'20256-4': ('Mean Gradient', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12119, 12207, 12211, 12122, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'MeanGradientPressureByDoppler': {'20256-4': ('Mean Gradient [Pressure] by ' 'Doppler', [12304])}, 'MeanVelocityOfCircumferentialFiberShorteningMeanVcfv': {'59117-2': ('Mean ' 'Velocity ' 'of ' 'Circumferential ' 'Fiber ' 'Shortening ' '(Mean ' 'VcFv)', [12257, 12271, 12267, 12266, 12270, 12268, 12252, 12272, 12264, 12259, 12263, 12274, 12262])}, '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)', [12304, 12257, 12271, 12265, 12255, 12259, 12258])}, 'NMUnspecifiedBodyRegion': {'49118-3': ('NM unspecified body region', [100])}, 'NuchalFoldThickness': {'12146-7': ('Nuchal Fold thickness', [12007])}, 'NuchalTranslucency': {'33069-6': ('Nuchal Translucency', [12007, 12009, 12279])}, 'NuclearMedicineReport': {'18757-5': ('Nuclear Medicine Report', [7000])}, 'NuclearMedicineThyroidScanReport': {'17787-3': ('Nuclear Medicine Thyroid ' 'Scan Report', [7000])}, 'NumberOfFetusesByUS': {'11878-6': ('Number of Fetuses by US', [12018])}, 'OFDASUM2000': {'33119-9': ('OFD, ASUM 2000', [12013, 12012])}, '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', [12013, 12012])}, 'OFDHansmann1986': {'33120-7': ('OFD, Hansmann 1986', [12013, 12012])}, 'OFDLessoway1998': {'33121-5': ('OFD, Lessoway 1998', [12013, 12012])}, 'OODMayden1982': {'33124-9': ('OOD, Mayden, 1982', [12013, 12012])}, 'OODTrout1994': {'33125-6': ('OOD, Trout 1994', [12013, 12012])}, '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': {'18758-3': ('PET Scan Report', [7000])}, 'PETUnspecifiedBodyRegion': {'44136-0': ('PET unspecified body region', [100])}, 'PETWholeBody': {'44139-4': ('PET whole body', [646, 100])}, 'PatientPresentation': {'55108-5': ('Patient Presentation', [7001])}, 'PeakBloodVelocity': {'11726-7': ('Peak Blood Velocity', [12304])}, 'PeakEWavePeakAWaveByUS': {'59104-0': ('Peak E wave/Peak A wave by US', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'PeakGradient': {'20247-3': ('Peak Gradient', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12119, 12207, 12211, 12122, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'PeakGradientPressure': {'20247-3': ('Peak Gradient [Pressure]', [12304])}, 'PeakInstantaneousFlowRate': {'34141-2': ('Peak Instantaneous Flow Rate', [12304, 12200, 12257, 12261, 12260, 12276, 12271, 12267, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'PeakReversalVelocityDuringAtrialContraction': {'59079-4': ('Peak Reversal ' 'Velocity during ' 'Atrial ' 'Contraction', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'PeakSystolicVelocity': {'11726-7': ('Peak Systolic Velocity', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12119, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12120, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'PeakTissueVelocity': {'59133-9': ('Peak Tissue Velocity', [12257, 12271, 12259])}, 'PercentThickening': {'59092-7': ('% Thickening', [12257, 12271, 12267, 12266, 12270, 12268, 12252, 12272, 12264, 12259, 12263, 12274, 12262])}, 'PosteriorHornLateralVentricularWidth': {'33196-7': ('Posterior Horn Lateral ' 'ventricular width', [12007])}, 'PreEjectionPeriod': {'59085-1': ('Pre-Ejection Period', [12257, 12261, 12260, 12271, 12267, 12266, 12270, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12258, 12254])}, 'PreEjectionPeriodEjectionTimeRatio': {'59088-5': ('Pre-Ejection ' 'Period/Ejection Time ' 'Ratio', [12257, 12261, 12260, 12271, 12267, 12266, 12270, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12258, 12254])}, 'PressureHalfTime': {'20280-4': ('Pressure Half Time', [12304, 12200, 12257, 12261, 12260, 12276, 12271, 12267, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'PreviousFindings': {'18834-2': ('Previous Findings', [7001])}, 'PriorProcedureDescriptions': {'55114-3': ('Prior Procedure Descriptions', [7001])}, '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', [12271, 12272, 12263, 12262])}, 'PulmonaryToSystemicShuntFlowRatio': {'29462-9': ('Pulmonary-to-Systemic ' 'Shunt Flow Ratio', [12276, 12217])}, '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', [12300, 12209])}, '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', [12257, 12277, 12260, 12271, 12267, 12251, 12250, 12266, 12270, 12265, 12273, 12269, 12268, 12272, 12264, 12259, 12218, 12263, 12275, 12274, 12262, 12258])}, 'ROIThicknessByUS': {'59089-3': ('ROI Thickness by US', [12257, 12277, 12260, 12271, 12267, 12251, 12250, 12266, 12270, 12265, 12273, 12269, 12268, 12272, 12264, 12259, 12218, 12263, 12275, 12274, 12262, 12258])}, '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', [12013, 12012])}, 'RadiusLength': {'11967-7': ('Radius length', [12006])}, 'RadiusMerz1987': {'11939-6': ('Radius, Merz 1987', [12013, 12012])}, 'Recommendations': {'18783-1': ('Recommendations', [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])}, '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]), '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', [12013, 12012])}, 'StenosisPeakGradient': {'59106-5': ('Stenosis Peak Gradient', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'StenosisPeakVelocity': {'59107-3': ('Stenosis Peak Velocity', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'Summary': {'55112-7': ('Summary', [7001])}, 'SystolicToDiastolicVelocityRatio': {'12144-2': ('Systolic to Diastolic ' 'Velocity Ratio', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12119, 12207, 12211, 12266, 12270, 12121, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'TADEriksen1985': {'33128-0': ('TAD, Eriksen 1985', [12013, 12012])}, 'TADHansmann1979': {'33129-8': ('TAD Hansmann, 1979', [12013, 12012])}, 'TADTokyo1986': {'33130-6': ('TAD, Tokyo 1986', [12013, 12012])}, 'TCDByGAGoldstein1987': {'33181-9': ('TCD by GA Goldstein 1987', [12012, 12015])}, 'TCDChitty1994': {'33132-2': ('TCD, Chitty 1994', [12013, 12012])}, 'TCDGoldstein1987': {'33133-0': ('TCD, Goldstein 1987', [12013, 12012])}, 'TCDHill1990': {'33134-8': ('TCD, Hill 1990', [12013, 12012])}, 'TCDNimrod1986': {'33135-5': ('TCD, Nimrod 1986', [12013, 12012])}, 'ThcChitkara1987': {'33131-4': ('ThC, Chitkara 1987', [12013, 12012])}, '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', [12013, 12012])}, 'TibiaLength': {'11968-5': ('Tibia length', [12006])}, 'TibialBrachialIndex': {'8581-1': ('Tibial/brachial index', [3620])}, 'TimeAveragedMeanVelocity': {'20352-1': ('Time Averaged Mean Velocity', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12119, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12120, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'TimeAveragedPeakVelocity': {'11692-1': ('Time Averaged Peak Velocity', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12119, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12120, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'TimeFromQWaveToPulmonicValveCloses': {'20295-2': ('Time from Q wave to ' 'Pulmonic Valve Closes', [12271, 12272, 12209, 12263, 12262])}, 'TimeFromQWaveToTricuspidValveOpens': {'20296-0': ('Time from Q wave to ' 'Tricuspid Valve Opens', [12267, 12208, 12268])}, 'TimeToLeftVentricleETissueVelocity': {'59096-8': ('Time to Left Ventricle E ' 'Tissue Velocity', [12257, 12271, 12259])}, 'TimeToLeftVentricleSTissueVelocity': {'59095-0': ('Time to Left Ventricle S ' 'Tissue Velocity', [12257, 12271, 12259])}, 'TimeToPeakByUS': {'59121-4': ('Time to Peak by US', [12257, 12261, 12260, 12271, 12267, 12266, 12270, 12268, 12272, 12264, 12259, 12263, 12274, 12262, 12258, 12254])}, 'TissueVelocityTimeIntegralVTIForTheAreaUnderLeftVentricleAWave': {'59125-5': ('Tissue ' 'Velocity ' 'Time ' 'Integral ' '(VTI) ' 'for ' 'the ' 'area ' 'under ' 'Left ' 'Ventricle ' 'A ' 'wave', [12257, 12271, 12259])}, 'TissueVelocityTimeIntegralVTIForTheAreaUnderLeftVentricleEWave': {'59124-8': ('Tissue ' 'Velocity ' 'Time ' 'Integral ' '(VTI) ' 'for ' 'the ' 'area ' 'under ' 'Left ' 'Ventricle ' 'E ' 'wave', [12257, 12271, 12259])}, 'TransCerebellarDiameter': {'11863-8': ('Trans Cerebellar Diameter', [12007, 12005, 12279])}, 'TransverseThoracicDiameter': {'11864-6': ('Transverse Thoracic Diameter', [12005, 12279])}, 'TransverseThoracicDiameterHansmann1985': {'33136-3': ('Transverse Thoracic ' 'Diameter, Hansmann ' '1985', [12013, 12012])}, 'TransverseThoracicDiameterLessoway1998': {'33137-1': ('Transverse Thoracic ' 'Diameter, Lessoway ' '1998', [12013, 12012])}, 'TranverseAbdominalDiameter': {'11862-0': ('Tranverse Abdominal Diameter', [12005, 12279])}, '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])}, 'UlnaJeanty1984': {'11944-6': ('Ulna, Jeanty 1984', [12013, 12012])}, 'UlnaLength': {'11969-3': ('Ulna length', [12006])}, 'UlnaMerz1987': {'11945-3': ('Ulna, Merz 1987', [12013, 12012])}, 'UltrasoundObstetricAndGynReport': {'11525-3': ('Ultrasound Obstetric and Gyn ' 'Report', [7000])}, 'UltrasoundReport': {'18760-9': ('Ultrasound Report', [7000])}, 'VelocityOfFlowPropagation': {'59115-6': ('Velocity of Flow Propagation', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'VelocityRatio': {'33867-3': ('Velocity ratio', [12119, 12121])}, 'VelocityTimeIntegral': {'20354-7': ('Velocity Time Integral', [12304, 12200, 12257, 12261, 12260, 12276, 12271, 12267, 12207, 12211, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, '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', [12200, 12257, 12261, 12260, 12276, 12271, 12267, 12119, 12207, 12211, 12122, 12266, 12270, 12208, 12265, 12273, 12204, 12269, 12268, 12272, 12264, 12209, 12259, 12218, 12263, 12275, 12222, 12274, 12262, 12258])}, 'VolumeFlowRate': {'33878-0': ('Volume Flow Rate', [12304])}, 'WholeBodyCT': {'46305-9': ('Whole body CT', [646])}, 'WholeBodyCt': {'46305-9': ('whole body ct', [6083, 6050])}, 'WholeBodyPtWRncIv': {'44139-4': ('whole body pt w rnc iv', [6083, 6050])}, 'WidthOfHemisphere': {'12170-7': ('Width of Hemisphere', [12007])}, 'XRayReport': {'43468-8': ('X-Ray Report', [7000])}, 'YolkSacLength': {'11816-6': ('Yolk Sac length', [12009])}} concepts['FMA'] = \ {'ArcuateFasciculus': {'276650': ('Arcuate Fasciculus', [7153, 9514, 7192, 7151])}, 'Bregma': {'264776': ('Bregma', [647])}, 'Lambda': {'264773': ('Lambda', [647])}, 'MucosaOfDorsumOfOralPartOfTongue': {'281534': ('Mucosa of dorsum of oral ' 'part of tongue', [4029])}, 'MucosaOfDorsumOfPharyngealPartOfTongue': {'281537': ('Mucosa of dorsum of ' 'pharyngeal part of ' 'tongue', [4029])}, 'MucosaOfOralSegmentOfHardPalate': {'289677': ('Mucosa of oral segment of ' 'hard palate', [4029])}, 'MucosaOfPalatoglossalArch': {'60031': ('Mucosa of palatoglossal arch', [4029])}, 'MucosaOfPharynx': {'55031': ('Mucosa of pharynx', [4029])}, 'MucosaOfPosteriorWallOfOropharynx': {'55060': ('Mucosa of posterior wall of ' 'oropharynx', [4029])}, 'MucosaOfUvula': {'60030': ('Mucosa of uvula', [4029])}, 'Nasion': {'264779': ('Nasion', [1002, 1001, 1000])}, 'SkinOfBackOfTrunk': {'49943': ('Skin of back of trunk', [4029])}, 'SkinOfDorsalPartOfFifthToe': {'37885': ('Skin of dorsal part of fifth toe', [4029])}, 'SkinOfDorsalPartOfFourthToe': {'37882': ('Skin of dorsal part of fourth toe', [4029])}, 'SkinOfDorsalPartOfGreatToe': {'37873': ('Skin of dorsal part of great toe', [4029])}, 'SkinOfDorsalPartOfIndexFinger': {'38324': ('Skin of dorsal part of index ' 'finger', [4029])}, 'SkinOfDorsalPartOfLittleFinger': {'38333': ('Skin of dorsal part of little ' 'finger', [4029])}, 'SkinOfDorsalPartOfMiddleFinger': {'38327': ('Skin of dorsal part of middle ' 'finger', [4029])}, 'SkinOfDorsalPartOfRingFinger': {'38330': ('Skin of dorsal part of ring ' 'finger', [4029])}, 'SkinOfDorsalPartOfSecondToe': {'37876': ('Skin of dorsal part of second toe', [4029])}, 'SkinOfDorsalPartOfThirdToe': {'37879': ('Skin of dorsal part of third toe', [4029])}, 'SkinOfDorsalPartOfThumb': {'38321': ('Skin of dorsal part of thumb', [4029])}, 'SkinOfDorsumOfNose': {'59532': ('Skin of dorsum of nose', [4029])}, 'SkinOfLowerInnerQuadrantOfBreast': {'61427': ('Skin of lower inner quadrant ' 'of breast', [4029])}, 'SkinOfLowerOuterQuadrantOfBreast': {'61423': ('Skin of lower outer quadrant ' 'of breast', [4029])}, 'SkinOfPalmarPartOfIndexFinger': {'38344': ('Skin of palmar part of index ' 'finger', [4029])}, 'SkinOfPalmarPartOfLittleFinger': {'38357': ('Skin of palmar part of little ' 'finger', [4029])}, 'SkinOfPalmarPartOfMiddleFinger': {'38347': ('Skin of palmar part of middle ' 'finger', [4029])}, 'SkinOfPalmarPartOfRingFinger': {'38354': ('Skin of palmar part of ring ' 'finger', [4029])}, 'SkinOfPalmarPartOfThumb': {'38341': ('Skin of palmar part of thumb', [4029])}, 'SkinOfPlantarPartOfFifthToe': {'38119': ('Skin of plantar part of fifth toe', [4029])}, 'SkinOfPlantarPartOfFourthToe': {'38116': ('Skin of plantar part of fourth ' 'toe', [4029])}, 'SkinOfPlantarPartOfGreatToe': {'38107': ('Skin of plantar part of great toe', [4029])}, 'SkinOfPlantarPartOfSecondToe': {'38110': ('Skin of plantar part of second ' 'toe', [4029])}, 'SkinOfPlantarPartOfThirdToe': {'38113': ('Skin of plantar part of third toe', [4029])}, 'SkinOfUpperInnerQuadrantOfBreast': {'61426': ('Skin of upper inner quadrant ' 'of breast', [4029])}, 'SkinOfUpperOuterQuadrantOfLeftBreast': {'61439': ('Skin of upper outer ' 'quadrant of left breast', [4029])}, 'SkinOfVermilionProperOfLowerLip': {'312651': ('Skin of vermilion proper of ' 'lower lip', [4029])}, 'SkinOfVermilionProperOfUpperLip': {'312647': ('Skin of vermilion proper of ' 'upper lip', [4029])}} concepts['MDC'] = \ {'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])}, '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])}, 'Asystole': {'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': {'10:9472': ('Atrial fibrillation', [3415])}, 'AtrialFlutter': {'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])}, '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])}, '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])}, 'Bradycardia': {'10:10432': ('Bradycardia', [3415])}, '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]), '2:98': ('Chest lead (symmetric placement)', [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])}, '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])}, 'CompleteAVDissociation': {'10:9760': ('Complete AV dissociation', [3415])}, 'CubeXYZLeadSystem': {'10:11276': ('Cube XYZ lead system', [3263])}, '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])}, 'DominantBeat': {'10:8240': ('Dominant beat', [3335])}, '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])}, '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])}, 'ExternalPacingLeadAnteriorPosterior': {'2:74': ('External pacing lead: ' 'anterior-posterior', [3001])}, 'FirstDegreeAVBlock': {'10:9632': ('First Degree AV Block', [3415])}, 'FirstDegreeSABlock': {'10:9776': ('First Degree SA Block', [3415])}, '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])}, '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])}, 'IrregularRhythm': {'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])}, '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])}, '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])}, '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]), '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])}, 'MultifocalAtrialTachycardia': {'10:9424': ('Multifocal Atrial Tachycardia', [3415])}, 'NEHBLeadSystem': {'10:11280': ('NEHB lead system', [3263])}, 'NegativeLowRightScapulaLead': {'2:124': ('negative: low right scapula Lead', [3001])}, 'NegativeRightInfraclavicularFossa': {'2:123': ('negative: right ' 'infraclavicular fossa', [3001])}, 'NoECGSignalIsAvailable': {'10:11248': ('No ECG signal is available', [3335])}, 'NoNoise': {'10:11200': ('No noise', [3680, 3335])}, '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])}, 'OsborneWave': {'10:1408': ('Osborne wave', [3335])}, 'P3AmplitudePerLead': {'2:3072': ('P3 amplitude, per lead', [3688])}, 'PAxis': {'2:16128': ('P Axis', [3229])}, 'PDurationGlobal': {'2:16184': ('P duration global', [3228, 3689])}, 'PDurationPerLead': {'2:6656': ('P duration, per lead', [3687, 3228])}, 'PMaximumAmplitudePerLead': {'2:1280': ('P maximum amplitude, per lead', [3688])}, 'PMinimumAmplitudePerLead': {'2:1536': ('P minimum amplitude, per lead', [3688])}, '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])}, 'PadValue': {'10:11397': ('Pad value', [3690])}, 'ParoxsysmalAtrialTachycardia': {'10:9408': ('Paroxsysmal Atrial Tachycardia', [3415])}, 'PolymorphicVentricularTachycardia': {'10:10064': ('Polymorphic Ventricular ' 'Tachycardia', [3415])}, 'PreExcitation': {'10:10096': ('pre-excitation', [3415]), '10:8624': ('pre-excitation', [3335])}, 'PrecordialLead': {'2:87': ('Precordial lead', [3001])}, 'PseudoOrthogonalXYZLeadSystem': {'10:11278': ('Pseudo-orthogonal XYZ lead ' 'system', [3263])}, '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', [3687, 3228])}, '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])}, '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])}, '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])}, 'ReentrantAVNodalTachycardia': {'10:9616': ('Reentrant AV nodal tachycardia', [3415])}, 'RespiratorySinusArrhythmia': {'10:9296': ('Respiratory Sinus Arrhythmia', [3415])}, '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])}, '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])}, 'SinusArrhythmia': {'10:9280': ('Sinus Arrhythmia', [3415])}, 'SinusBradycardia': {'10:9248': ('Sinus Bradycardia', [3415])}, 'SinusRhythm': {'10:9216': ('Sinus Rhythm', [3415])}, 'SinusTachycardia': {'10:9264': ('Sinus Tachycardia', [3415])}, 'SlowVentricularTachycardiaIdioventricularTachycardia': {'10:9904': ('Slow ' 'Ventricular ' 'Tachycardia ' '(Idioventricular ' 'Tachycardia)', [3415])}, '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])}, '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])}, 'TAxis': {'2:16136': ('T axis', [3229])}, 'TMaximumAmplitudePerLead': {'2:2560': ('T maximum amplitude, per lead', [3688])}, 'TMinimumAmplitudePerLead': {'2:2816': ('T minimum amplitude, per lead', [3688])}, '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])}, '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])}, '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])}, 'WolfParkinsonTypeA': {'10:10128': ('Wolf-Parkinson type A', [3415]), '10:8656': ('Wolf-Parkinson type A', [3335])}, 'WolfParkinsonTypeB': {'10:10144': ('Wolf-Parkinson type B', [3415]), '10:8672': ('Wolf-Parkinson type B', [3335])}, 'WolfParkinsonWhiteSyndrome': {'10:10112': ('Wolf-Parkinson-White syndrome', [3415]), '10:8640': ('Wolf-Parkinson-White syndrome', [3335])}, 'XYZLeadsDerivedFromStandard12Lead': {'10:11279': ('XYZ leads derived from ' 'standard 12-lead', [3263])}, 'ZeroOffset': {'10:11395': ('Zero offset', [3690])}, '_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])}, '_3LeadSystemCC5CM5CH5': {'10:11282': ('3-lead system, CC5-CM5-CH5', [3263])}, '_3LeadSystemCC5CM5ML': {'10:11281': ('3-lead system, CC5-CM5-ML', [3263])}} concepts['UMLS'] = \ {'Alphaxalone': {'C0051482': ('Alphaxalone', [625, 623])}, '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, 9536, 7452])}, 'DistalPhalanx': {'C3669027': ('Distal phalanx', [7483, 7482])}, 'EdotreotideGa68': {'C2713594': ('Edotreotide Ga^68^', [4021])}, 'EthidiumBromide': {'C0019873': ('Ethidium Bromide', [643, 638])}, 'FlortaucipirF18': {'C4547429': ('Flortaucipir F^18^', [4021])}, 'Fluanisone': {'C0060473': ('Fluanisone', [625, 623])}, 'FluoroestradiolFESF18': {'C1831937': ('Fluoroestradiol (FES) F^18^', [4021])}, 'FluoroetanidazoleF18': {'C1541539': ('Fluoroetanidazole F^18^', [4021])}, 'FluoropropylDihydrotetrabenazineDTBZF18': {'C2934038': ('Fluoropropyl-dihydrotetrabenazine ' '(DTBZ) 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', [620, 619])}, 'MK6240F18': {'C4506764': ('MK-6240 F^18^', [4021])}, 'Mastectomy': {'C0024881': ('Mastectomy', [6060, 6058])}, 'MedicalPhysicist': {'C1708969': ('Medical Physicist', [7450, 9536, 7452])}, 'Metomidate': {'C0025856': ('Metomidate', [625, 623])}, 'Nadir': {'C1708760': ('Nadir', [6146])}, 'NarcoticAnalgesic': {'C0027409': ('Narcotic analgesic', [621, 622])}, 'Neuroradiology': {'C2183225': ('Neuroradiology', [7030])}, 'Pretreatment': {'C3539075': ('Pretreatment', [6146])}, 'RadiationPhysicist': {'C2985483': ('Radiation Physicist', [7450, 9536, 7452])}, 'Referring': {'C1709880': ('Referring', [7453])}, 'RestrictedDiet': {'C0425422': ('Restricted diet', [609])}, 'RoomAir': {'C3846005': ('Room air', [629, 623])}, '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])}, 'Tyrosine3OctreotateGa68': {'C1742831': ('tyrosine-3-octreotate Ga^68^', [4021])}, 'UCBJC11': {'C4506788': ('UCB-J C^11^', [4021])}, 'UnknownPrimaryNeoplasiaSite': {'C0221297': ('unknown primary neoplasia site', [7601])}, 'Unscheduled': {'C1699701': ('Unscheduled', [6146])}, 'Variance': {'C1711260': ('Variance', [7464])}} concepts['BARI'] = \ {'PosteriorDescendingSeptalPerforators': {'9': ('Posterior descending septal ' 'perforators', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, 'RamusLaterals': {'28A': ('Ramus Laterals', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, '_1stDiagonalCoronaryArteryLaterals': {'15A': ('1st Diagonal Coronary Artery ' 'Laterals', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, '_1stMarginalCoronaryArteryLaterals': {'20A': ('1st Marginal Coronary Artery ' 'Laterals', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, '_2ndDiagonalCoronaryArteryLaterals': {'16A': ('2nd Diagonal Coronary Artery ' 'Laterals', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, '_2ndMarginalCoronaryArteryLaterals': {'21A': ('2nd Marginal Coronary Artery ' 'Laterals', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, '_3rdDiagonalCoronaryArteryLaterals': {'29A': ('3rd Diagonal Coronary Artery ' 'Laterals', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}, '_3rdMarginalCoronaryArteryLaterals': {'22A': ('3rd Marginal Coronary Artery ' 'Laterals', [3014, 3604, 6109, 3015, 6102, 6117, 9514, 7192, 7151, 3827])}} concepts['NCIt'] = \ {'AdLibitum': {'C64636': ('ad libitum', [609])}, 'Adjudicator': {'C96561': ('Adjudicator', [7453])}, 'BronchioloalveolarAdenocarcinoma': {'C2923': ('Bronchioloalveolar ' 'adenocarcinoma', [639, 638])}, 'DCFBCF18': {'C96234': ('DCFBC F^18^', [4021])}, 'DcfpylF18': {'C116352': ('DCFPyL F^18^', [4021])}, 'EnhancingLesion': {'C113842': ('Enhancing Lesion', [7169, 7168, 7159, 7194, 7151])}, 'Enrollment': {'C37948': ('Enrollment', [280])}, 'Erect': {'C86043': ('erect', [19])}, 'ExtraluminalRoute': {'C38213': ('Extraluminal route', [11])}, 'IntraepithelialRoute': {'C38244': ('Intraepithelial route', [11])}, 'Middle': {'C25569': ('Middle', [3019, 211, 6025, 12117, 12116, 6024, 212, 12281])}, 'MouseMammaryFatPad': {'C22550': ('Mouse mammary fat pad', [644])}, 'NativeHawaiianOrOtherPacificIslander': {'C41219': ('Native Hawaiian or other ' 'Pacific Islander', [6099])}, 'NoEvidenceOfDisease': {'C40413': ('No Evidence of Disease', [6098])}, 'NonEnhancingLesion': {'C81175': ('Non-Enhancing Lesion', [7169, 7168, 7159, 7194, 7151])}, 'PSMA11Ga68': {'C118961': ('PSMA-11 Ga^68^', [4021])}, 'RANO': {'C114879': ('RANO', [6147])}, 'Reader': {'C28747': ('Reader', [7453])}, 'RecurrentDisease': {'C38155': ('Recurrent Disease', [6098])}, 'ReferenceRegion': {'C94970': ('Reference Region', [7165, 7196, 9000, 7151])}, 'Reviewer': {'C54634': ('Reviewer', [7453])}, 'SarcosineC11': {'C122684': ('Sarcosine C^11^', [4021])}, 'Technetium99mTrofolastat': {'C116887': ('Technetium^99m Trofolastat', [25])}, 'TransluminalRoute': {'C38306': ('Transluminal route', [11])}, 'UnitConversionFactor': {'C70774': ('Unit Conversion Factor', [10069])}} concepts['NEU'] = \ {'AnteriorThalamicRadiation': {'1726': ('anterior thalamic radiation', [7702, 7710])}, 'ArcuateFasciculus': {'2063': ('arcuate fasciculus', [7703, 7710])}, 'CorticobulbarTract': {'1319': ('corticobulbar tract', [7702, 7710])}, 'CorticospinalTract': {'1320': ('corticospinal tract', [7702, 7710])}, 'InferiorOpticRadiationMeyerLoop': {'1466': ('inferior optic radiation ' "(Meyer's loop)", [7702, 7710])}, 'InferiorThalamicRadiation': {'2082': ('inferior thalamic radiation', [7702, 7710])}, 'PosteriorThalamicRadiation': {'2083': ('posterior thalamic radiation', [7702, 7710])}, 'StriaTerminalis': {'286': ('stria terminalis', [7704, 7710])}, 'SuperiorLongitudinalFasciculus': {'2080': ('superior longitudinal fasciculus', [7703, 7710])}, 'SuperiorOpticRadiationBaumLoop': {'3473': ("superior optic radiation (Baum's " 'loop)', [7702, 7710])}, 'SuperiorThalamicRadiation': {'2081': ('superior thalamic radiation', [7702, 7710])}} concepts['UCUM'] = \ {'ArbitraryUnit': {"[arb'U]": ('arbitrary unit', [7181])}, 'Becquerel': {'Bq': ('becquerel', [3083])}, 'BecquerelsMilliliter': {'Bq/ml': ('Becquerels/milliliter', [7181, 83, 84])}, 'Centimeter': {'/cm': ('/Centimeter', [7181, 83, 84]), 'cm': ('centimeter', [7460, 7181, 7183])}, 'Centimeter2': {'cm2': ('Centimeter**2', [83, 84])}, 'Centimeter2Milliliter': {'cm2/ml': ('Centimeter**2/milliliter', [7181, 83, 84])}, 'CentimeterSecond': {'cm/s': ('centimeter/second', [7181])}, 'Counts': {'{counts}': ('Counts', [7181, 83, 84])}, 'CountsPerSecond': {'{counts}/s': ('Counts per second', [7181, 83, 84])}, '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', [7456, 6046])}, 'Decibel': {'dB': ('decibel', [7181])}, 'Degree': {'deg': ('Degree', [7183])}, 'DegreesCelsius': {'Cel': ('degrees Celsius', [7181])}, 'Diopters': {'diop': ('diopters', [4267])}, 'DynScm5': {'dyn.s.cm-5': ('dyn.s.cm-5', [7181, 3502])}, 'DynScm5M2': {'dyn.s.cm-5/m2': ('dyn.s.cm-5/m2', [7181, 3503])}, 'ElectronDensity': {'10*23/ml': ('Electron Density', [301])}, 'French': {'[Ch]': ('french', [3510])}, 'Gy': {'Gy': ('Gy', [10071, 7181])}, 'Hertz': {'Hz': ('Hertz', [7181])}, 'HounsfieldUnit': {"[hnsf'U]": ('Hounsfield Unit', [7181, 83, 301])}, 'Hour': {'h': ('hour', [7456])}, 'Kilovolt': {'kV': ('Kilovolt', [9521])}, 'Kpa': {'kPa': ('kPa', [3500, 7181])}, 'M': {'m': ('m', [7063])}, 'Megabecquerel': {'MBq': ('megabecquerel', [3083])}, 'Megaelectronvolt': {'MeV': ('Megaelectronvolt', [9521])}, 'Megavolt': {'MV': ('Megavolt', [9521])}, 'Micrometer': {'um': ('micrometer', [4267, 4260, 7460, 7181, 7183])}, 'MicromoleMilliliter': {'umol/ml': ('Micromole/milliliter', [7181, 83, 84])}, 'MicromoleMinuteMilliliter': {'umol/min/ml': ('Micromole/minute/milliliter', [7181, 83, 84])}, 'Millicurie': {'mCi': ('millicurie', [3083])}, 'MilligramsMinuteMilliliter': {'mg/min/ml': ('Milligrams/minute/milliliter', [7181, 83, 84])}, 'MilliliterGram': {'ml/g': ('Milliliter/gram', [7181, 83, 84])}, 'MilliliterMinuteGram': {'ml/min/g': ('Milliliter/minute/gram', [7181, 83, 84])}, 'MilliliterPer100GramPerMinute': {'ml/[100]g/min': ('milliliter per 100 gram ' 'per minute', [7181])}, 'MilliliterPer100Milliliter': {'ml/[100]ml': ('milliliter per 100 milliliter', [7181])}, 'MilliliterPerMinute': {'ml/min': ('milliliter per minute', [7181])}, 'MilliliterPerSecond': {'ml/s': ('milliliter per second', [7181])}, 'Millimeter': {'mm': ('millimeter', [7460, 7181, 7183])}, 'MillimeterSecond': {'mm/s': ('millimeter/second', [7181])}, 'MillimolesPerkgWetWeight': {'mmol/kg{WetWeight}': ('millimoles per kg wet ' 'weight', [7181])}, 'Millisecond': {'ms': ('millisecond', [7181, 7183])}, 'Millitesla': {'mT': ('milliTesla', [7181])}, 'Min': {'/min': ('/min', [7181])}, 'Minute': {'min': ('minute', [7456])}, 'Mm2S': {'mm2/s': ('mm2/s', [7277, 7181])}, 'Mmhg': {'mm[Hg]': ('mmHg', [3500, 7181])}, 'Month': {'mo': ('month', [7456, 6046])}, 'Mph': {'[mi_i]/h': ('mph', [3212])}, 'NoUnits': {'1': ('no units', [7181])}, 'NumberParticlesPer100GramOfTissue': {'{Particles}/[100]g{Tissue}': ('number ' 'particles ' 'per 100 ' 'gram of ' 'tissue', [7181])}, 'PRU': {'[PRU]': ('P.R.U.', [7181, 3502])}, 'PRUM2': {'[PRU]/m2': ('P.R.U./m2', [7181, 3503])}, 'Percent': {'%': ('Percent', [7181, 83, 4244, 301, 84])}, 'Ppm': {'ppm': ('ppm', [7181])}, 'ProportionalToCounts': {'{propcounts}': ('Proportional to counts', [7181, 83, 84])}, 'ProportionalToCountsPerSecond': {'{propcounts}/s': ('Proportional to counts ' 'per second', [7181, 83, 84])}, 'Radian': {'rad': ('Radian', [7183])}, 'Ratio': {'{ratio}': ('ratio', [7181])}, 'S': {'/s': ('/s', [7181])}, 'Second': {'s': ('second', [7181, 7183])}, 'SecondPerSquareMillimeter': {'s/mm2': ('second per square millimeter', [7181])}, 'SquareCentimeter': {'cm2': ('square centimeter', [7181, 7461])}, 'SquareMicrometer': {'um2': ('square micrometer', [7181, 7461])}, 'SquareMillimeter': {'mm2': ('square millimeter', [7181, 7461])}, 'StandardizedUptakeValueBodySurfaceArea': {'cm2/ml{SUVbsa}': ('Standardized ' 'Uptake Value ' 'body surface ' 'area', [7181, 83, 85, 84])}, 'StandardizedUptakeValueBodyWeight': {'g/ml{SUVbw}': ('Standardized Uptake ' 'Value body weight', [7181, 83, 85, 84])}, 'StandardizedUptakeValueIdealBodyWeight': {'g/ml{SUVibw}': ('Standardized ' 'Uptake Value ' 'ideal body ' 'weight', [7181, 83, 85, 84])}, 'StandardizedUptakeValueLeanBodyMassJames': {'g/ml{SUVlbm}': ('Standardized ' 'Uptake Value ' 'lean body mass ' '(James)', [7181, 83, 85, 84])}, 'StandardizedUptakeValueLeanBodyMassJames128Multiplier': {'g/ml{SUVlbm(James128)}': ('Standardized ' 'Uptake ' 'Value ' 'lean ' 'body ' 'mass ' '(James ' '128 ' 'multiplier)', [7181, 83, 85, 84])}, 'StandardizedUptakeValueLeanBodyMassJanma': {'g/ml{SUVlbm(Janma)}': ('Standardized ' 'Uptake ' 'Value ' 'lean ' 'body ' 'mass ' '(Janma)', [7181, 83, 85, 84])}, 'Sv': {'Sv': ('Sv', [10071, 7181])}, 'Um2S': {'um2/s': ('um2/s', [7277, 7181])}, 'Um2ms': {'um2/ms': ('um2/ms', [7277, 7181])}, 'Week': {'wk': ('week', [7456, 6046])}, 'WoodU': {"[wood'U]": ('Wood U', [7181, 3502])}, 'WoodUM2': {"[wood'U]/m2": ('Wood U/m2', [7181, 3503])}, 'Year': {'a': ('year', [7456, 6046])}, '_106Mm2S': {'10-6.mm2/s': ('10-6.mm2/s', [7277, 7181])}, 'cm': {'cm': ('cm', [7063])}, 'kmH': {'km/h': ('km/h', [3212])}, 'mgcm3': {'mg/cm3': ('mg/cm^3', [301])}, 'mgml': {'mg/ml': ('mg/ml', [4244, 301])}, 'mm': {'mm': ('mm', [4267, 3510, 7063])}, 'um': {'um': ('um', [7063])}} 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])}, 'BeamHardeningArtifact': {'RID11327': ('Beam-hardening artifact', [6135])}, 'DiagnosticQuality': {'RID12': ('Diagnostic quality', [7036])}, 'LimitedQuality': {'RID13': ('Limited quality', [7036])}, 'NMHeadPerfusionBrainPETCTAV45': {'RPID5427': ('NM head perfusion brain ' 'PET-CT AV-45', [100])}, 'NonDiagnosticQuality': {'RID14': ('Non-diagnostic quality', [7036])}} concepts['NDC'] = \ {'Definity': {'11994-011-04': ('Definity', [12030])}, 'Optison': {'0407-2707-03': ('Optison', [12030])}} concepts['ITIS_TSN'] = \ {'PeromyscusLeucopusAmericanWhiteFootedMouse': {'180278': ('Peromyscus ' 'leucopus (American ' 'white-footed ' 'mouse)', [7454])}, 'PeromyscusManiculatusDeerMouse': {'180276': ('Peromyscus maniculatus (Deer ' 'mouse)', [7454])}, 'SigmodonGenus': {'180346': ('Sigmodon genus (cotton rat)', [7454])}} concepts['PUBCHEM_CID'] = \ {'_6Hydroxydopamine': {'4624': ('6-hydroxydopamine', [643, 638])}} concepts['MSH'] = \ {'MonteCarloMethod': {'D009010': ('Monte Carlo Method', [10068])}} pydicom-2.4.3/pydicom/sr/_snomed_dict.py000066400000000000000000014751031446675437500203150ustar00rootroot00000000000000# Auto-generated by generate_concept_dicts.py. # -*- coding: utf-8 -*- # 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', '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', '1346008': 'C-22921', '1368003': 'C-114B1', '1386000': 'D3-89100', '1420005': 'L-80821', '1439000': 'T-C46A0', '1483009': 'G-A160', '1514007': 'L-80715', '1522000': 'M-01470', '1663004': 'G-F212', '1710001': 'F-61470', '1732005': 'T-C6510', '1789009': 'L-80461', '1809004': 'L-80A40', '1896004': 'D4-48014', '1918003': 'T-42510', '1929004': 'M-95913', '1974006': 'L-80840', '2008008': 'C-131A2', '2048000': 'T-C5140', '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', '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', '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', '4042003': 'L-80A57', '4147007': 'M-03000', '4258007': 'T-49620', '4317002': 'T-14050', '4382004': 'C-81120', '4386001': 'F-20250', '4432005': 'T-F6845', '4525004': 'P2-10700', '4554005': 'D3-33000', '4557003': 'D3-12700', '4563007': 'P0-10210', '4574003': 'L-80346', '4596009': 'T-24100', '4631006': 'M-82113', '4656000': 'C-22963', '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', '5296000': 'T-C4361', '5306005': 'L-80800', '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', '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', '6708002': 'P1-86180', '6725000': 'C-22947', '6736007': 'G-A002', '6797001': 'F-31150', '6832004': 'P1-30350', '6866008': 'T-A4950', '6871001': 'T-39010', '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', '7623008': 'L-80409', '7657000': 'T-47400', '7770004': 'C-158A6', '7771000': 'G-A101', '7832008': 'T-42500', '7843000': 'L-80141', '7844006': 'T-15610', '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', '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', '9040008': 'T-59420', '9131007': 'L-80801', '9135003': 'L-80642', '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', '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', '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', '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', '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', '12611008': 'T-12740', '12691009': 'T-46010', '12710003': 'C-22968', '12728001': 'T-C4852', '12738006': 'T-A0100', '12800002': 'T-43212', '12801003': 'C-B0326', '12852001': 'F-10210', '12872006': 'T-11301', '12881000': 'T-1242A', '12921003': 'T-D6000', '12958003': 'T-A7020', '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', '13363002': 'T-47600', '13383001': 'T-32004', '13418002': 'T-32650', '13482005': 'T-C4100', '13487004': 'L-80455', '13544004': 'L-80131', '13561001': 'T-AA910', '13576009': 'T-F1820', '13626001': 'C-B1172', '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', '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', '15117003': 'C-A6900', '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', '16011006': 'C-B1204', '16015002': 'L-80212', '16050005': 'T-C4470', '16051009': 'T-C4740', '16228004': 'T-C46A4', '16239001': 'T-32637', '16310003': 'P5-B0000', '16349000': 'A-12000', '16356006': 'D8-20100', '16528000': 'L-80A10', '16567006': 'D4-31B24', '16630005': 'T-A2300', '16736007': 'P5-39010', '16788000': 'C-22846', '16811007': 'T-51305', '16836001': 'C-22945', '16838000': 'D2-81180', '16857009': 'G-D164', '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', '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', '18016009': 'M-52500', '18102001': 'P5-40060', '18112008': 'T-46422', '18115005': 'M-55420', '18149002': 'T-11B00', '18212001': 'L-80524', '18220004': 'F-B3000', '18234004': 'T-A8040', '18346003': 'T-14140', '18457007': 'T-C3070', '18525008': 'T-D9550', '18545000': 'T-A1120', '18546004': 'D4-31810', '18590009': 'P2-35000', '18619003': 'T-AA110', '18686000': 'T-14120', '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', '19923001': 'A-26800', '19928005': 'M-78800', '19939008': 'G-A561', '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', '20699002': 'T-49240', '20717008': 'M-52120', '20721001': 'D3-29040', '20760004': 'T-12412', '20847002': 'C-A7420', '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', '21378001': 'C-B1097', '21379009': 'D3-83660', '21381006': 'D7-90434', '21387005': 'T-11190', '21418008': 'L-80894', '21451004': 'C-B1069', '21479005': 'T-45170', '21483005': 'T-A0090', '21553004': 'L-80148', '21572004': 'C-114A4', '21576001': 'C-107A1', '21592006': 'C-22844', '21594007': 'G-A425', '21637005': 'L-80A14', '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', '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', '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', '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', '23771002': 'T-46410', '23788009': 'C-180A2', '23826000': 'L-80A00', '23995009': 'L-80730', '24010005': 'DA-73410', '24020000': 'G-A142', '24028007': 'G-A100', '24062007': 'T-14165', '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', '24484000': 'G-A003', '24511001': 'C-B1221', '24516006': 'C-22937', '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', '25062003': 'A-26430', '25064002': 'F-A2700', '25079009': 'C-22843', '25091000': 'C-22909', '25097001': 'L-80702', '25126001': 'G-A477', '25171009': 'L-80765', '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', '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', '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', '26458009': 'C-51450', '26493002': 'T-11218', '26523005': 'C-68030', '26525003': 'L-80176', '26527006': 'F-10349', '26639007': 'L-807A3', '26643006': 'G-D140', '26699009': 'L-80433', '26703007': 'T-49630', '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', '27120008': 'C-22890', '27125003': 'L-80A18', '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', '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', '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', '29426003': 'DA-26000', '29445007': 'T-AA860', '29460005': 'C-B1018', '29483008': 'M-52101', '29522004': 'C-22951', '29534007': 'T-AA400', '29660000': 'T-46940', '29700009': 'T-46110', '29707007': 'T-D9800', '29836001': 'T-D2500', '29850006': 'T-1234A', '29857009': 'F-37000', '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', '30608006': 'T-13600', '30618001': 'T-54630', '30634003': 'L-80659', '30720007': 'L-80525', '30730003': 'G-A145', '30793004': 'T-C4120', '30807003': 'G-A249', '30825005': 'C-B1063', '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', '31970009': 'C-81520', '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', '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', '34752004': 'L-80865', '34759008': 'A-26864', '34775006': 'T-C4770', '34870009': 'L-80891', '34882000': 'M-90160', '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', '35757004': 'P5-B3121', '35764002': 'T-A1600', '35783009': 'T-C4480', '35802007': 'L-807A0', '35819009': 'T-48890', '35860002': 'P1-08080', '35884005': 'C-B1109', '35917007': 'M-81403', '35918002': 'T-A1820', '35951006': 'T-A1500', '35978008': 'C-124B4', '36060005': 'M-91501', '36074003': 'L-80A05', '36086000': 'T-C4626', '36111002': 'L-80591', '36118008': 'D2-80300', '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', '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', '37024005': 'L-80910', '37035000': 'T-A2840', '37058002': 'M-44140', '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', '37437001': 'C-B1098', '37453003': 'L-80870', '37512009': 'T-B1200', '37575004': 'C-22822', '37630009': 'P5-39050', '37706002': 'F-32056', '37737002': 'G-D144', '37760005': 'D3-33140', '37783008': 'T-12390', '37899009': 'T-A8820', '37947008': 'C-B1051', '38000004': 'T-C6020', '38048003': 'S-101A2', '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', '38424001': 'C-B1181', '38449002': 'L-80842', '38543004': 'C-22914', '38586004': 'A-81080', '38707008': 'C-22936', '38713004': 'M-94003', '38717003': 'G-A143', '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', '39723000': 'T-15680', '39743006': 'T-28230', '39777001': 'C-22861', '39790008': 'A-2C141', '39844006': 'T-54420', '39855006': 'L-80350', '39882003': 'L-80877', '39937001': 'T-01000', '40005008': 'T-54510', '40020002': 'T-28825', '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', '40898002': 'L-80893', '40937006': 'C-114A5', '40983000': 'T-D8200', '41092008': 'L-80418', '41111004': 'T-12717', '41145006': 'T-C4613', '41216001': 'T-92000', '41263004': 'L-80812', '41296002': 'T-AA500', '41313007': 'T-14163', '41320000': 'L-80713', '41334000': 'D3-12002', '41440006': 'P5-D9020', '41538003': 'L-80722', '41549009': 'C-80150', '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', '43106008': 'C-22915', '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', '43863001': 'T-48530', '43899006': 'T-47500', '43914001': 'F-F7100', '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', '45316007': 'P5-D0040', '45341000': 'T-44100', '45460008': 'P2-68060', '45475000': 'C-22962', '45503006': 'D4-31120', '45559001': 'M-78266', '45561005': 'L-80762', '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', '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', '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', '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', '48006008': 'C-10001', '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', '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', '49076000': 'T-15720', '49082002': 'T-48435', '49240006': 'L-80644', '49330006': 'T-54800', '49370004': 'G-A104', '49394004': 'T-C4420', '49421002': 'L-80904', '49430005': 'M-88503', '49436004': 'D3-31520', '49460000': 'T-51120', '49462008': 'L-80576', '49530007': 'G-A127', '49608001': 'G-A402', '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', '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', '50717006': 'L-80308', '50755001': 'T-13450', '50849002': 'P0-10800', '50916005': 'M-74220', '50920009': 'D3-26000', '50959000': 'L-80173', '50960005': 'M-37000', '51023000': 'L-80459', '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', '52082005': 'T-18010', '52101004': 'G-A203', '52105008': 'L-80900', '52124006': 'A-26810', '52253003': 'L-80806', '52359001': 'T-49340', '52374004': 'T-11156', '52408003': 'C-B1111', '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', '52943005': 'T-A1710', '52946002': 'L-80705', '52952001': 'L-807C5', '52988006': 'M-01100', '53031002': 'L-80120', '53036007': 'T-D8040', '53074004': 'T-C4320', '53085002': 'T-32500', '53118009': 'T-A1720', '53120007': 'T-D8000', '53151000': 'M-52130', '53207004': 'C-B1092', '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', '53617003': 'P2-22010', '53620006': 'T-15290', '53654007': 'M-88103', '53655008': 'T-43210', '53700003': 'C-127A3', '53727004': 'T-29200', '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', '54446009': 'F-63750', '54447000': 'L-80424', '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', '56006008': 'C-B1072', '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', '56459004': 'T-D9700', '56468002': 'M-91220', '56475001': 'C-B1062', '56609000': 'C-145A4', '56757003': 'P1-03154', '56786000': 'D3-29051', '56789007': 'T-43205', '56849005': 'T-49650', '56851009': 'G-A437', '56867003': 'C-B1073', '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', '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', '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', '58888001': 'L-80887', '59011009': 'T-45800', '59057006': 'C-A7021', '59066005': 'T-11133', '59082006': 'C-A7430', '59118001': 'D3-33110', '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', '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', '60441008': 'C-22853', '60459006': 'C-B1124', '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', '60958006': 'L-80620', '60965003': 'T-C4670', '60996007': 'T-C4002', '61026006': 'G-F213', '61036003': 'L-80533', '61068006': 'C-22926', '61083001': 'L-80630', '61088005': 'C-2A000', '61242005': 'T-AA813', '61286000': 'L-80835', '61320006': 'L-80896', '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', '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', '62275004': 'D3-02004', '62296006': 'S-10116', '62372003': 'G-A137', '62413002': 'T-12420', '62442005': 'C-B0316', '62482003': 'G-A374', '62517004': 'C-B1011', '62555009': 'T-15317', '62630005': 'T-C4352', '62683002': 'T-C4360', '62736007': 'T-AA830', '62790004': 'L-80807', '62818001': 'T-B1100', '62824007': 'G-A117', '62834003': 'T-50110', '62869001': 'T-48286', '62872008': 'T-A2980', '63130001': 'M-78280', '63161005': 'G-A332', '63264007': 'M-89803', '63269002': 'L-80761', '63289001': 'A-12020', '63360001': 'C-168A4', '63390008': 'L-80834', '63467002': 'D3-33120', '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', '64957009': 'G-A648', '64991008': 'C-22975', '65026000': 'C-68050', '65054007': 'C-141A1', '65123005': 'F-61620', '65124004': 'M-02570', '65156006': 'C-B1215', '65187008': 'L-80307', '65197004': 'T-35310', '65216001': 'T-A1000', '65240009': 'P1-86E70', '65265006': 'F-D7B50', '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', '66130006': 'F-32330', '66168008': 'L-80425', '66303006': 'T-54350', '66314009': 'L-80147', '66377006': 'P5-D0042', '66459002': 'G-A103', '66495005': 'L-80738', '66559000': 'T-46421', '66562002': 'C-F3302', '66657009': 'D3-31710', '66712005': 'L-80727', '66720007': 'T-A1650', '66739002': 'G-D001', '66754008': 'T-59200', '66787007': 'G-A107', '66857006': 'F-24210', '66859009': 'C-81590', '66911005': 'L-80130', '67046006': 'T-AA621', '67088002': 'L-80782', '67170007': 'T-41100', '67338003': 'P1-31612', '67362008': 'D3-83300', '67414001': 'L-80311', '67440007': 'C-80131', '67448000': 'L-80133', '67453005': 'T-12780', '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', '68630002': 'C-114A6', '68703001': 'T-AA310', '68705008': 'T-49110', '68787002': 'T-43111', '68796002': 'P5-D1000', '68878000': 'T-C4442', '68881005': 'T-C4513', '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', '69421009': 'T-46423', '69440003': 'C-80123', '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', '70086001': 'C-B1304', '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', '70594002': 'M-87303', '70653001': 'L-80A11', '70791007': 'T-47040', '70822001': 'F-32070', '70847004': 'T-F1300', '70925003': 'T-11170', '70984001': 'M-32260', '70995007': 'D3-40300', '71173004': 'M-01460', '71175006': 'L-80736', '71232009': 'M-90201', '71252005': 'T-83200', '71271007': 'T-48411', '71341001': 'T-12710', '71384000': 'A-17450', '71388002': 'P0-00000', '71425003': 'C-127A1', '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', '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', '72381005': 'T-C4404', '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', '72696002': 'T-D9200', '72717003': 'C-14800', '72876007': 'T-54310', '73002000': 'P2-36102', '73005003': 'L-80578', '73049001': 'L-80A44', '73050001': 'T-32634', '73056007': 'T-04020', '73065000': 'C-B1041', '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', '73745003': 'C-B1093', '73774007': 'D3-28102', '73829009': 'T-32200', '73892005': 'C-22971', '73930003': 'T-14150', '73931004': 'T-48813', '73937000': 'T-54680', '73949004': 'C-67770', '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', '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', '74970001': 'L-80527', '75040000': 'T-C4143', '75042008': 'T-A1220', '75053002': 'D3-81660', '75093004': 'T-02480', '75118006': 'PA-00600', '75129005': 'T-1242B', '75245000': 'T-26500', '75294000': 'G-A600', '75319007': 'T-11219', '75367002': 'F-31000', '75397005': 'T-42340', '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', '75902001': 'T-43124', '75911001': 'L-80751', '75956008': 'C-22967', '75959001': 'C-781E0', '75976002': 'G-4041', '76001002': 'C-22916', '76015000': 'T-46420', '76025005': 'P1-31876', '76048000': 'C-22929', '76117006': 'T-45430', '76155001': 'C-B0328', '76171001': 'F-20240', '76197007': 'M-72000', '76267008': 'D3-29050', '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', '76724004': 'L-807C3', '76752008': 'T-04000', '76784001': 'T-82000', '76838003': 'T-C4220', '76848001': 'T-39000', '76862008': 'T-43105', '76878005': 'T-C4456', '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', '77510008': 'C-B1071', '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', '79197006': 'C-159A2', '79295007': 'L-80726', '79361005': 'T-15200', '79458005': 'G-A599', '79477007': 'C-131A1', '79523006': 'C-113A2', '79601000': 'T-12280', '79603002': 'L-80343', '79610008': 'C-B1216', '79619009': 'D3-29011', '79652003': 'T-AA770', '79654002': 'M-36300', '79692001': 'F-32340', '79811009': 'A-18041', '79814001': 'L-80655', '79926007': 'T-C4650', '79952001': 'A-26860', '80049006': 'T-A2750', '80084005': 'L-80612', '80131009': 'L-80600', '80140008': 'T-54480', '80144004': 'T-12770', '80243003': 'T-AA810', '80248007': 'T-04030', '80260008': 'C-B1094', '80272002': 'T-45160', '80274001': 'F-70210', '80305003': 'C-22856', '80313002': 'F-37150', '80434005': 'T-A2870', '80447000': 'T-A1800', '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', '82078001': 'PA-20110', '82206008': 'L-80885', '82264009': 'C-677C0', '82280004': 'G-A545', '82334004': 'G-A385', '82365008': 'T-C4350', '82411007': 'C-22925', '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', '82711006': 'M-85003', '82799009': 'F-32100', '82849001': 'T-D4900', '82909008': 'L-80622', '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', '83750004': 'C-80610', '83799000': 'D4-31040', '83881004': 'C-12013', '83996001': 'L-80119', '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', '84367001': 'L-80871', '84386009': 'C-6A16E', '84421000': 'T-487A0', '84514002': 'L-80708', '84528008': 'L-80603', '84548001': 'L-807D5', '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', '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', '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', '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', '87410002': 'C-B1225', '87437000': 'C-116A2', '87445005': 'C-B0335', '87463005': 'T-A2970', '87563008': 'T-A0102', '87612001': 'T-C2000', '87644002': 'T-95000', '87687004': 'G-A151', '87704003': 'T-54360', '87708000': 'F-BB000', '87731000': 'F-12300', '87737001': 'M-84903', '87759004': 'T-80020', '87811005': 'C-A7440', '87853006': 'C-B1210', '87878005': 'T-32600', '87913009': 'M-90203', '87953007': 'T-73000', '87958003': 'C-B1121', '87962009': 'L-80337', '88166005': 'C-B1016', '88176008': 'T-54170', '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', '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', '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', '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', '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', '91238003': 'T-1243B', '91295002': 'C-22881', '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', '91830000': 'T-D00AB', '92248004': 'D7-F0810', '92652009': 'D7-F0902', '93143009': 'DC-F4113', '93473009': 'D3-F0620', '94150003': 'D4-31154', '94391008': 'D2-F1106', '95217000': 'DA-73460', '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', '96329004': 'C-97302', '96387000': 'C-B0301', '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', '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', '104210008': 'P3-50495', '105371005': 'P5-0A100', '105372003': 'P5-39015', '105373008': 'P5-39191', '105376000': 'P5-B3002', '105501005': 'S-20570', '105590001': 'F-61002', '105830007': 'C-120F9', '105837005': 'C-127F9', '105840005': 'C-130F9', '105842002': 'C-132F9', '105847008': 'C-137F9', '105849006': 'C-139F9', '105860002': 'C-150F9', '105866008': 'C-156F9', '105874009': 'C-164F9', '105877002': 'C-167F9', '106233006': 'G-A1F8', '106292003': 'J-07100', '107007004': 'L-8B9F9', '107644003': 'M-020F9', '107671003': 'M-520F8', '108294005': 'P5-D30F8', '108300008': 'P5-D90F8', '108369006': 'M-8FFFF', '108371006': 'T-12761', '108502004': 'C-80349', '108602006': 'C-80680', '108880002': 'C-22AA1', '108899006': 'C-B7100', '109029006': 'C-A0005', '109066000': 'C-A0173', '109069007': 'C-A01D1', '109212003': 'C-B0314', '109218004': 'C-B0322', '109219007': 'C-B0329', '109222009': 'C-B0332', '109223004': 'C-B0339', '109888004': 'D7-F0A02', '110265006': 'DD-66A67', '110421000': 'M-32210', '110451006': 'M-78190', '110467000': 'P1-00410', '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', '112811009': 'P1-31872', '112987001': 'P1-C0020', '113011001': 'P2-01510', '113160008': 'S-10191', '113163005': 'S-11090', '113197003': 'T-11300', '113198008': 'T-11304', '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', '113338001': 'T-C4616', '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', '117590005': 'T-AB001', '117610000': 'P2-34201', '118375008': 'A-04140', '118378005': 'A-11101', '118433006': 'F-31146', '118438002': 'G-D00B', '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', '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', '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', '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', '128570000': 'D4-31022', '128572008': 'D4-31032', '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', '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', '129500005': 'C-B1034', '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', '129516007': 'C-B1046', '129517003': 'C-B1047', '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', '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', '132036007': 'L-8056C', '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', '143824007': 'T-C4147', '143925009': 'T-C4155', '144026003': 'T-C4156', '144127009': 'T-C4157', '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', '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', '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', '167364008': 'T-C4254', '167464007': 'T-C4255', '167664004': 'T-C4263', '167864002': 'T-C4018', '167965000': 'T-C421E', '168159002': 'T-C4238', '168360002': 'T-C4019', '168460001': 'T-C4244', '168557005': 'T-C401A', '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', '181768009': 'T-D03C2', '181900008': 'T-116EE', '181901007': 'T-116EF', '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', '204317008': 'D4-31012', '206034008': 'T-4630D', '213262007': 'F-01FBA', '218728005': 'D3-83001', '223366009': 'J-00552', '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', '237897009': 'D6-34737', '238108007': 'F-029F7', '238810007': 'D0-30017', '239503002': 'P1-189C2', '240946003': 'P0-05AFA', '241213007': 'P5-30031', '241434002': 'P5-0A001', '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', '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', '244251006': 'T-43002', '244252004': 'T-43003', '244411005': 'T-4940E', '244415001': 'T-4941A', '244453006': 'T-A800B', '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', '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', '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', '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', '251271006': 'F-02692', '251786004': 'F-02FA4', '251795007': 'F-02FB4', '251797004': 'F-A2143', '251799001': 'F-02FB7', '252064005': 'F-0319E', '252068008': 'F-031A2', '252129004': 'F-031F7', '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', '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', '255218000': 'R-40365', '255227004': 'G-A39A', '255235001': 'R-411C0', '255236000': 'F-32021', '255238004': 'R-40377', '255253007': 'R-4038D', '255254001': 'F-32011', '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', '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', '255809005': 'C-22820', '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', '257357007': 'A-04831', '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', '260528009': 'R-4081A', '260585005': 'G-D05F', '260590008': 'G-D067', '260601006': 'G-D071', '260674002': 'G-C048', '260787004': 'A-00004', '260858005': 'G-C093', '260867005': 'R-40861', '260870009': 'G-C09C', '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', '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', '263654008': 'R-42037', '263677008': 'R-42047', '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', '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', '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', '268461001': 'F-9B75C', '268951004': 'R-207D7', '270492004': 'D3-30001', '271593001': 'F-06001', '271594007': 'D3-00006', '271649006': 'F-008EC', '271650006': 'F-008ED', '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', '273948005': 'R-F6E36', '274022008': 'P1-34001', '274060004': 'T-4667C', '274143007': 'T-4667D', '274231001': 'T-4668A', '274303007': 'R-202A9', '274331003': 'P1-4830F', '274640006': 'F-03261', '274662006': 'F-A0846', '274668005': 'F-37015', '275035006': 'P1-32006', '275514001': 'F-300FA', '275552000': 'G-0069', '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', '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', '279549004': 'T-21301', '279609001': 'T-C4423', '279784003': 'T-C4452', '279795009': 'T-C4401', '279866008': 'T-C4453', '280062008': 'T-D3412', '280216006': 'T-C4465', '280314006': 'T-C4466', '280371009': 'T-A0109', '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', '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', '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', '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', '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', '301939004': 'F-0123A', '302924003': 'D7-9002A', '303110006': 'R-422A4', '303111005': 'R-422A5', '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', '304915008': 'G-E002', '305437000': 'T-3500E', '306783000': 'T-1273F', '307047009': 'F-00BB8', '307152002': 'R-40FB8', '307153007': 'R-40FB9', '307154001': 'R-40FBA', '307280005': 'P0-004BA', '307429007': 'R-410C3', '307486002': 'R-4112F', '307701005': 'P1-0555A', '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', '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', '313386006': 'F-029D4', '314116003': 'D3-13014', '314186008': 'D3-83602', '314348007': 'R-20839', '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', '346607007': 'R-F2989', '347379006': 'C-70434', '349947003': 'C-677B9', '349955005': 'C-51071', '350086004': 'C-B02CC', '353842007': 'C-B1130', '353903006': 'C-B0382', '353912008': 'C-B038B', '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', '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', '364644000': 'F-047E7', '365416000': 'F-38035', '365853002': 'F-01969', '365981007': 'F-93109', '366188009': 'F-30117', '367336001': 'P0-0058E', '367450005': 'R-4235F', '367567000': 'T-D03B4', '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', '371244009': 'G-A11D', '371246006': 'G-A11E', '371251000': 'G-A12B', '371252007': 'G-A12C', '371253002': 'G-A12D', '371254008': 'G-A12E', '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', '372578001': 'F-616E7', '372580007': 'F-616EB', '372602008': 'F-616FE', '372614000': 'F-6171D', '372656001': 'F-6188F', '372664007': 'R-F2B1D', '372665008': 'F-61898', '372666009': 'F-61899', '372677003': 'C-0023B', '372681003': 'F-618A5', '372693007': 'F-618AE', '372695000': 'F-618AF', '372703009': 'R-F2B1F', '372708000': 'F-618BA', '372722000': 'C-0024C', '372724004': 'F-61916', '372735009': 'C-0024E', '372787008': 'F-61957', '372788003': 'C-00257', '372790002': 'F-61959', '372798009': 'R-F2B23', '372806008': 'F-61969', '372813008': 'F-6196E', '372855004': 'F-61995', '372862008': 'F-6199A', '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', '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', '373529000': 'F-618D7', '373530005': 'F-618D8', '373646006': 'F-61968', '373682001': 'F-619B7', '373738000': 'F-61639', '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', '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', '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', '387146001': 'F-61A26', '387150008': 'F-61A28', '387176008': 'F-61A3F', '387218008': 'F-61A66', '387239001': 'F-61A76', '387258005': 'F-61A7F', '387264003': 'R-F2B2C', '387286002': 'F-61A95', '387341002': 'F-61AC4', '387351001': 'F-61AFE', '387362001': 'F-B2135', '387368002': 'F-61B0A', '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', '396339007': 'M-35001', '396345004': 'C-002B1', '396482007': 'R-10075', '396487001': 'P1-65359', '396488006': 'L-80453', '396505009': 'L-80A45', '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', '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', '398828005': 'F-61D70', '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', '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', '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', '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', '399707004': 'R-41563', '400047006': 'D3-8005B', '401303003': 'D3-15119', '401314000': 'D3-1511A', '402603005': 'D0-2202B', '403618004': 'D0-3002F', '404640003': 'F-06017', '404684003': 'R-005AE', '404706008': 'C-B10A2', '404707004': 'C-B10A4', '404846007': 'C-B014D', '405165006': 'F-0499A', '405269005': 'R-305CE', '405277009': 'J-005E6', '405279007': 'J-005E8', '405738005': 'G-A12F', '405739002': 'G-A132', '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', '406978000': 'C-2286B', '406980006': 'C-2286C', '406981005': 'C-2286D', '406982003': 'C-2286E', '406983008': 'C-2286F', '406984002': 'C-22870', '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', '408379005': 'F-04A13', '408551003': 'R-214DD', '408573005': 'F-04AB2', '408574004': 'F-04AB3', '408643008': 'D0-F0369', '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', '408744005': 'R-1022D', '408745006': 'R-10227', '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', '409688003': 'R-305D3', '409712001': 'D3-1081C', '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', '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', '410675002': 'G-C340', '410679008': 'G-A206', '410685001': 'R-1023E', '410686000': 'R-1023B', '410687009': 'R-1023D', '410688004': 'R-1023A', '410689007': 'R-1023C', '410726006': 'T-D0829', '410873007': 'C-B05A3', '410937004': 'F-61E2A', '412155002': 'F-61DF9', '413322009': 'F-04B88', '413488005': 'L-8880C', '413530006': 'R-102DD', '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', '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', '414795007': 'D3-1070D', '415070008': 'R-102B4', '415076002': 'G-03D3', '415144009': 'R-10253', '415145005': 'R-10255', '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', '416949008': 'R-FAB57', '417012009': 'L-8B103', '417136005': 'A-10029', '417277001': 'L-8880D', '417324009': 'F-CB902', '417437006': 'R-FAB52', '417696007': 'C-6A148', '417746004': 'DF-00777', '417881006': 'F-61FDB', '418326009': 'F-D7011', '418363000': 'F-A21A7', '418433008': 'R-305EB', '418760000': 'F-6205D', '418799008': 'R-005E0', '418903008': 'P5-00A25', '419099009': 'F-04DA1', '419161000': 'G-A13B', '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', '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', '423498000': 'C-B07DD', '423543007': 'C-B07DE', '423546004': 'C-B07E4', '423578007': 'C-1018D', '423720000': 'R-40A94', '423764008': 'C-135A4', '423926000': 'L-804C0', '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', '424444005': 'P2-31109', '424570009': 'C-B1135', '424622008': 'F-04ECE', '424655003': 'R-40A8F', '424705003': 'L-801E8', '424708001': 'C-B07E0', '424789007': 'C-B07E5', '424811006': 'R-40A8B', '424874008': 'C-B07E6', '424875009': 'C-1018C', '424962005': 'R-40A8C', '424979004': 'P0-05DE2', '425030002': 'R-40A91', '425035007': 'R-40A96', '425042007': 'R-40A97', '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', '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', '427886002': 'P1-36993', '427986001': 'G-4044', '427989008': 'F-380B2', '427990004': 'F-04F84', '428196007': 'D3-10711', '428247006': 'R-40AA7', '428417006': 'F-380B3', '428420003': 'F-04F92', '428531008': 'F-04F9F', '428549008': 'F-38793', '428550008': 'F-38287', '428552000': 'F-04FA0', '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', '429058004': 'R-215DC', '429060002': 'P7-00044', '429157007': 'F-04FCA', '429160000': 'F-04FCC', '429162008': 'F-04FCD', '429163003': 'P2-3120E', '429198000': 'D3-0200B', '429232006': 'R-215DE', '429310004': 'C-1190E', '429382003': 'F-04FD3', '429391004': 'R-215E0', '429477006': 'R-215E1', '429483009': 'F-04FD8', '429551001': 'G-4045', '429557002': 'G-4046', '429559004': 'D3-13037', '429560009': 'A-1002A', '429561008': 'D3-0400A', '429576000': 'F-04FE3', '429591003': 'C-1190F', '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', '439470001': 'D1-50666', '439858009': 'P5-B0128', '440252007': 'PA-30029', '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', '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', '443499004': 'G-057B', '443500008': 'G-057C', '443501007': 'R-421AA', '443562002': 'G-057D', '443591004': 'T-F6858', '443609003': 'G-057E', '443625008': 'T-D0880', '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', '443844003': 'P5-08118', '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', '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', '444850002': 'G-D1E4', '444883009': 'C-101E8', '444923006': 'C-101E9', '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', '446315002': 'P5-70694', '446406008': 'R-40B32', '446531006': 'C-114B6', '446534003': 'C-163B6', '446535002': 'C-163B7', '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', '447201007': 'C-163BD', '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', '467354001': 'R-FDF5C', '468192005': 'R-FDB79', '468440006': 'R-FD5EB', '473188002': 'DF-1147C', '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', '700032006': 'R-FB565', '701933006': 'R-FCC16', '702391001': 'R-FB83F', '702569007': 'R-FB8F1', '702767007': 'R-FB9B7', '703842006': 'R-FBDEA', '705541005': 'R-FEAEC', '706247001': 'R-FCCF2', '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', '708174004': 'R-FF0C4', '709853007': 'L-DA692', '710864009': 'D3-80086', '711101009': 'R-FF2E7', '712736002': 'C-D6858', '714754004': 'T-F6724', '714759009': 'T-F6713', '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', '717027004': 'R-FFFD9', } mapping['SRT'] = { 'T-B7000': '111002', 'C-B1123': '125001', 'C-B1021': '187006', 'S-101A9': '270002', 'A-12010': '271003', 'T-C4730': '283001', 'L-80861': '300004', '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', 'C-22921': '1346008', 'C-114B1': '1368003', 'D3-89100': '1386000', 'L-80821': '1420005', 'T-C46A0': '1439000', 'G-A160': '1483009', 'L-80715': '1514007', 'M-01470': '1522000', 'G-F212': '1663004', 'F-61470': '1710001', 'T-C6510': '1732005', 'L-80461': '1789009', 'L-80A40': '1809004', 'D4-48014': '1896004', 'T-42510': '1918003', 'M-95913': '1929004', 'L-80840': '1974006', 'C-131A2': '2008008', 'T-C5140': '2048000', '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', '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', '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', 'L-80A57': '4042003', 'M-03000': '4147007', 'T-49620': '4258007', 'T-14050': '4317002', 'C-81120': '4382004', 'F-20250': '4386001', 'T-F6845': '4432005', 'P2-10700': '4525004', 'D3-33000': '4554005', 'D3-12700': '4557003', 'P0-10210': '4563007', 'L-80346': '4574003', 'T-24100': '4596009', 'M-82113': '4631006', 'C-22963': '4656000', '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-C4361': '5296000', 'L-80800': '5306005', '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', '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', 'P1-86180': '6708002', 'C-22947': '6725000', 'G-A002': '6736007', 'F-31150': '6797001', 'P1-30350': '6832004', 'T-A4950': '6866008', 'T-39010': '6871001', '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', 'L-80409': '7623008', 'T-47400': '7657000', 'C-158A6': '7770004', 'G-A101': '7771000', 'T-42500': '7832008', 'L-80141': '7843000', 'T-15610': '7844006', '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', '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', 'T-59420': '9040008', 'L-80801': '9131007', 'L-80642': '9135003', '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', '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', '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-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', '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', 'T-12740': '12611008', 'T-46010': '12691009', 'C-22968': '12710003', 'T-C4852': '12728001', 'T-A0100': '12738006', 'T-43212': '12800002', 'C-B0326': '12801003', 'F-10210': '12852001', 'T-11301': '12872006', 'T-1242A': '12881000', 'T-D6000': '12921003', 'T-A7020': '12958003', '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', 'T-47600': '13363002', 'T-32004': '13383001', 'T-32650': '13418002', 'T-C4100': '13482005', 'L-80455': '13487004', 'L-80131': '13544004', 'T-AA910': '13561001', 'T-F1820': '13576009', 'C-B1172': '13626001', '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', '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', 'C-A6900': '15117003', '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', 'C-B1204': '16011006', 'L-80212': '16015002', 'T-C4470': '16050005', 'T-C4740': '16051009', 'T-C46A4': '16228004', 'T-32637': '16239001', 'P5-B0000': '16310003', 'A-12000': '16349000', 'D8-20100': '16356006', 'L-80A10': '16528000', 'D4-31B24': '16567006', 'T-A2300': '16630005', 'P5-39010': '16736007', 'C-22846': '16788000', 'T-51305': '16811007', 'C-22945': '16836001', 'D2-81180': '16838000', 'G-D164': '16857009', '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', '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', 'M-52500': '18016009', 'P5-40060': '18102001', 'T-46422': '18112008', 'M-55420': '18115005', 'T-11B00': '18149002', 'L-80524': '18212001', 'F-B3000': '18220004', 'T-A8040': '18234004', 'T-14140': '18346003', 'T-C3070': '18457007', 'T-D9550': '18525008', 'T-A1120': '18545000', 'D4-31810': '18546004', 'P2-35000': '18590009', 'T-AA110': '18619003', 'T-14120': '18686000', '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', 'A-26800': '19923001', 'M-78800': '19928005', 'G-A561': '19939008', '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', 'T-49240': '20699002', 'M-52120': '20717008', 'D3-29040': '20721001', 'T-12412': '20760004', 'C-A7420': '20847002', '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', 'C-B1097': '21378001', 'D3-83660': '21379009', 'D7-90434': '21381006', 'T-11190': '21387005', 'L-80894': '21418008', 'C-B1069': '21451004', 'T-45170': '21479005', 'T-A0090': '21483005', 'L-80148': '21553004', 'C-114A4': '21572004', 'C-107A1': '21576001', 'C-22844': '21592006', 'G-A425': '21594007', 'L-80A14': '21637005', '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-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', '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-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-46410': '23771002', 'C-180A2': '23788009', 'L-80A00': '23826000', 'L-80730': '23995009', 'DA-73410': '24010005', 'G-A142': '24020000', 'G-A100': '24028007', 'T-14165': '24062007', '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', 'G-A003': '24484000', 'C-B1221': '24511001', 'C-22937': '24516006', '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', 'A-26430': '25062003', 'F-A2700': '25064002', 'C-22843': '25079009', 'C-22909': '25091000', 'L-80702': '25097001', 'G-A477': '25126001', 'L-80765': '25171009', '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', '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', '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', 'C-51450': '26458009', '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-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', 'C-22890': '27120008', 'L-80A18': '27125003', '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', '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-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', 'DA-26000': '29426003', 'T-AA860': '29445007', 'C-B1018': '29460005', 'M-52101': '29483008', 'C-22951': '29522004', 'T-AA400': '29534007', 'T-46940': '29660000', 'T-46110': '29700009', 'T-D9800': '29707007', 'T-D2500': '29836001', 'T-1234A': '29850006', 'F-37000': '29857009', '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-13600': '30608006', 'T-54630': '30618001', 'L-80659': '30634003', 'L-80525': '30720007', 'G-A145': '30730003', 'T-C4120': '30793004', 'G-A249': '30807003', 'C-B1063': '30825005', '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', 'C-81520': '31970009', '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-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', 'L-80865': '34752004', 'A-26864': '34759008', 'T-C4770': '34775006', 'L-80891': '34870009', 'M-90160': '34882000', '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', 'P5-B3121': '35757004', 'T-A1600': '35764002', 'T-C4480': '35783009', 'L-807A0': '35802007', 'T-48890': '35819009', 'P1-08080': '35860002', 'C-B1109': '35884005', 'M-81403': '35917007', 'T-A1820': '35918002', 'T-A1500': '35951006', 'C-124B4': '35978008', 'M-91501': '36060005', 'L-80A05': '36074003', 'T-C4626': '36086000', 'L-80591': '36111002', 'D2-80300': '36118008', '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-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', 'L-80910': '37024005', 'T-A2840': '37035000', 'M-44140': '37058002', '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', 'C-B1098': '37437001', 'L-80870': '37453003', 'T-B1200': '37512009', 'C-22822': '37575004', 'P5-39050': '37630009', 'F-32056': '37706002', 'G-D144': '37737002', 'D3-33140': '37760005', 'T-12390': '37783008', 'T-A8820': '37899009', 'C-B1051': '37947008', 'T-C6020': '38000004', 'S-101A2': '38048003', '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', 'C-B1181': '38424001', 'L-80842': '38449002', 'C-22914': '38543004', 'A-81080': '38586004', 'C-22936': '38707008', 'M-94003': '38713004', 'G-A143': '38717003', '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-15680': '39723000', 'T-28230': '39743006', 'C-22861': '39777001', 'A-2C141': '39790008', 'T-54420': '39844006', 'L-80350': '39855006', 'L-80877': '39882003', 'T-01000': '39937001', 'T-54510': '40005008', 'T-28825': '40020002', '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', 'L-80893': '40898002', 'C-114A5': '40937006', 'T-D8200': '40983000', 'L-80418': '41092008', 'T-12717': '41111004', 'T-C4613': '41145006', 'T-92000': '41216001', 'L-80812': '41263004', 'T-AA500': '41296002', 'T-14163': '41313007', 'L-80713': '41320000', 'D3-12002': '41334000', 'P5-D9020': '41440006', 'L-80722': '41538003', 'C-80150': '41549009', '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', 'C-22915': '43106008', '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', 'T-48530': '43863001', 'T-47500': '43899006', 'F-F7100': '43914001', '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', 'P5-D0040': '45316007', 'T-44100': '45341000', 'P2-68060': '45460008', 'C-22962': '45475000', 'D4-31120': '45503006', 'M-78266': '45559001', 'L-80762': '45561005', '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-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-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', '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', 'C-10001': '48006008', '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', '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', 'T-15720': '49076000', 'T-48435': '49082002', 'L-80644': '49240006', 'T-54800': '49330006', 'G-A104': '49370004', 'T-C4420': '49394004', 'L-80904': '49421002', 'M-88503': '49430005', 'D3-31520': '49436004', 'T-51120': '49460000', 'L-80576': '49462008', 'G-A127': '49530007', 'G-A402': '49608001', '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', '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', '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-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-18010': '52082005', 'G-A203': '52101004', 'L-80900': '52105008', 'A-26810': '52124006', 'L-80806': '52253003', 'T-49340': '52359001', 'T-11156': '52374004', 'C-B1111': '52408003', '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-A1710': '52943005', 'L-80705': '52946002', 'L-807C5': '52952001', 'M-01100': '52988006', 'L-80120': '53031002', 'T-D8040': '53036007', 'T-C4320': '53074004', 'T-32500': '53085002', 'T-A1720': '53118009', 'T-D8000': '53120007', 'M-52130': '53151000', 'C-B1092': '53207004', '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', 'P2-22010': '53617003', 'T-15290': '53620006', 'M-88103': '53654007', 'T-43210': '53655008', 'C-127A3': '53700003', 'T-29200': '53727004', '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', 'F-63750': '54446009', 'L-80424': '54447000', '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', 'C-B1072': '56006008', '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-D9700': '56459004', 'M-91220': '56468002', 'C-B1062': '56475001', 'C-145A4': '56609000', 'P1-03154': '56757003', 'D3-29051': '56786000', 'T-43205': '56789007', 'T-49650': '56849005', 'G-A437': '56851009', 'C-B1073': '56867003', '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', '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', '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', 'L-80887': '58888001', 'T-45800': '59011009', 'C-A7021': '59057006', 'T-11133': '59066005', 'C-A7430': '59082006', 'D3-33110': '59118001', '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', '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', 'C-22853': '60441008', 'C-B1124': '60459006', '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', 'L-80620': '60958006', 'T-C4670': '60965003', 'T-C4002': '60996007', 'G-F213': '61026006', 'L-80533': '61036003', 'C-22926': '61068006', 'L-80630': '61083001', 'C-2A000': '61088005', 'T-AA813': '61242005', 'L-80835': '61286000', 'L-80896': '61320006', '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', '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', 'D3-02004': '62275004', 'S-10116': '62296006', 'G-A137': '62372003', 'T-12420': '62413002', 'C-B0316': '62442005', 'G-A374': '62482003', 'C-B1011': '62517004', 'T-15317': '62555009', 'T-C4352': '62630005', 'T-C4360': '62683002', 'T-AA830': '62736007', 'L-80807': '62790004', 'T-B1100': '62818001', 'G-A117': '62824007', 'T-50110': '62834003', 'T-48286': '62869001', 'T-A2980': '62872008', 'M-78280': '63130001', 'G-A332': '63161005', 'M-89803': '63264007', 'L-80761': '63269002', 'A-12020': '63289001', 'C-168A4': '63360001', 'L-80834': '63390008', 'D3-33120': '63467002', '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', 'G-A648': '64957009', 'C-22975': '64991008', 'C-68050': '65026000', 'C-141A1': '65054007', 'F-61620': '65123005', 'M-02570': '65124004', 'C-B1215': '65156006', 'L-80307': '65187008', 'T-35310': '65197004', 'T-A1000': '65216001', 'P1-86E70': '65240009', 'F-D7B50': '65265006', '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', 'F-32330': '66130006', 'L-80425': '66168008', 'T-54350': '66303006', 'L-80147': '66314009', 'P5-D0042': '66377006', 'G-A103': '66459002', 'L-80738': '66495005', 'T-46421': '66559000', 'C-F3302': '66562002', 'D3-31710': '66657009', 'L-80727': '66712005', 'T-A1650': '66720007', 'G-D001': '66739002', 'T-59200': '66754008', 'G-A107': '66787007', 'F-24210': '66857006', 'C-81590': '66859009', 'L-80130': '66911005', 'T-AA621': '67046006', 'L-80782': '67088002', 'T-41100': '67170007', 'P1-31612': '67338003', 'D3-83300': '67362008', 'L-80311': '67414001', 'C-80131': '67440007', 'L-80133': '67448000', 'T-12780': '67453005', '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', 'C-114A6': '68630002', 'T-AA310': '68703001', 'T-49110': '68705008', 'T-43111': '68787002', 'P5-D1000': '68796002', 'T-C4442': '68878000', 'T-C4513': '68881005', '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', 'T-46423': '69421009', 'C-80123': '69440003', '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', 'C-B1304': '70086001', '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', 'M-87303': '70594002', 'L-80A11': '70653001', 'T-47040': '70791007', 'F-32070': '70822001', 'T-F1300': '70847004', 'T-11170': '70925003', 'M-32260': '70984001', 'D3-40300': '70995007', 'M-01460': '71173004', 'L-80736': '71175006', 'M-90201': '71232009', 'T-83200': '71252005', 'T-48411': '71271007', 'T-12710': '71341001', 'A-17450': '71384000', 'P0-00000': '71388002', 'C-127A1': '71425003', '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', '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', 'T-C4404': '72381005', '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-D9200': '72696002', 'C-14800': '72717003', 'T-54310': '72876007', 'P2-36102': '73002000', 'L-80578': '73005003', 'L-80A44': '73049001', 'T-32634': '73050001', 'T-04020': '73056007', 'C-B1041': '73065000', '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', 'C-B1093': '73745003', 'D3-28102': '73774007', 'T-32200': '73829009', 'C-22971': '73892005', 'T-14150': '73930003', 'T-48813': '73931004', 'T-54680': '73937000', 'C-67770': '73949004', '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', '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', 'L-80527': '74970001', 'T-C4143': '75040000', 'T-A1220': '75042008', 'D3-81660': '75053002', 'T-02480': '75093004', 'PA-00600': '75118006', 'T-1242B': '75129005', 'T-26500': '75245000', 'G-A600': '75294000', 'T-11219': '75319007', 'F-31000': '75367002', 'T-42340': '75397005', '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-43124': '75902001', 'L-80751': '75911001', 'C-22967': '75956008', 'C-781E0': '75959001', 'G-4041': '75976002', 'C-22916': '76001002', 'T-46420': '76015000', 'P1-31876': '76025005', 'C-22929': '76048000', 'T-45430': '76117006', 'C-B0328': '76155001', 'F-20240': '76171001', 'M-72000': '76197007', 'D3-29050': '76267008', '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', 'L-807C3': '76724004', 'T-04000': '76752008', 'T-82000': '76784001', 'T-C4220': '76838003', 'T-39000': '76848001', 'T-43105': '76862008', 'T-C4456': '76878005', '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', 'C-B1071': '77510008', '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', 'C-159A2': '79197006', 'L-80726': '79295007', 'T-15200': '79361005', 'G-A599': '79458005', 'C-131A1': '79477007', 'C-113A2': '79523006', 'T-12280': '79601000', 'L-80343': '79603002', 'C-B1216': '79610008', 'D3-29011': '79619009', 'T-AA770': '79652003', 'M-36300': '79654002', 'F-32340': '79692001', 'A-18041': '79811009', 'L-80655': '79814001', 'T-C4650': '79926007', 'A-26860': '79952001', 'T-A2750': '80049006', 'L-80612': '80084005', 'L-80600': '80131009', 'T-54480': '80140008', 'T-12770': '80144004', 'T-AA810': '80243003', 'T-04030': '80248007', 'C-B1094': '80260008', 'T-45160': '80272002', 'F-70210': '80274001', 'C-22856': '80305003', 'F-37150': '80313002', 'T-A2870': '80434005', 'T-A1800': '80447000', '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', 'PA-20110': '82078001', 'L-80885': '82206008', 'C-677C0': '82264009', 'G-A545': '82280004', 'G-A385': '82334004', 'T-C4350': '82365008', 'C-22925': '82411007', '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', 'M-85003': '82711006', 'F-32100': '82799009', 'T-D4900': '82849001', 'L-80622': '82909008', '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', 'C-80610': '83750004', 'D4-31040': '83799000', 'C-12013': '83881004', 'L-80119': '83996001', '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', 'L-80871': '84367001', 'C-6A16E': '84386009', 'T-487A0': '84421000', 'L-80708': '84514002', 'L-80603': '84528008', 'L-807D5': '84548001', '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-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', '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', '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', 'C-B1225': '87410002', 'C-116A2': '87437000', 'C-B0335': '87445005', 'T-A2970': '87463005', 'T-A0102': '87563008', 'T-C2000': '87612001', 'T-95000': '87644002', 'G-A151': '87687004', 'T-54360': '87704003', 'F-BB000': '87708000', 'F-12300': '87731000', 'M-84903': '87737001', 'T-80020': '87759004', 'C-A7440': '87811005', 'C-B1210': '87853006', 'T-32600': '87878005', 'M-90203': '87913009', 'T-73000': '87953007', 'C-B1121': '87958003', 'L-80337': '87962009', 'C-B1016': '88166005', 'T-54170': '88176008', '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', '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', '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', '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', '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-1243B': '91238003', 'C-22881': '91295002', '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-D00AB': '91830000', 'D7-F0810': '92248004', 'D7-F0902': '92652009', 'DC-F4113': '93143009', 'D3-F0620': '93473009', 'D4-31154': '94150003', 'D2-F1106': '94391008', 'DA-73460': '95217000', '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-97302': '96329004', 'C-B0301': '96387000', '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-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-50495': '104210008', 'P5-0A100': '105371005', 'P5-39015': '105372003', 'P5-39191': '105373008', 'P5-B3002': '105376000', 'S-20570': '105501005', 'F-61002': '105590001', 'C-120F9': '105830007', 'C-127F9': '105837005', 'C-130F9': '105840005', 'C-132F9': '105842002', 'C-137F9': '105847008', 'C-139F9': '105849006', 'C-150F9': '105860002', 'C-156F9': '105866008', 'C-164F9': '105874009', 'C-167F9': '105877002', 'G-A1F8': '106233006', 'J-07100': '106292003', 'L-8B9F9': '107007004', 'M-020F9': '107644003', 'M-520F8': '107671003', 'P5-D30F8': '108294005', 'P5-D90F8': '108300008', 'M-8FFFF': '108369006', 'T-12761': '108371006', 'C-80349': '108502004', 'C-80680': '108602006', 'C-22AA1': '108880002', 'C-B7100': '108899006', 'C-A0005': '109029006', 'C-A0173': '109066000', 'C-A01D1': '109069007', 'C-B0314': '109212003', 'C-B0322': '109218004', 'C-B0329': '109219007', 'C-B0332': '109222009', 'C-B0339': '109223004', 'D7-F0A02': '109888004', 'DD-66A67': '110265006', 'M-32210': '110421000', 'M-78190': '110451006', 'P1-00410': '110467000', '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', 'P1-31872': '112811009', 'P1-C0020': '112987001', 'P2-01510': '113011001', 'S-10191': '113160008', 'S-11090': '113163005', 'T-11300': '113197003', 'T-11304': '113198008', '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-C4616': '113338001', '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-AB001': '117590005', 'P2-34201': '117610000', 'A-04140': '118375008', 'A-11101': '118378005', 'F-31146': '118433006', 'G-D00B': '118438002', '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', '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-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', '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', 'D4-31022': '128570000', 'D4-31032': '128572008', '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-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-B1034': '129500005', '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', 'C-B1046': '129516007', 'C-B1047': '129517003', '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-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-8056C': '132036007', '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', 'T-C4147': '143824007', 'T-C4155': '143925009', 'T-C4156': '144026003', 'T-C4157': '144127009', '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-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-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', 'T-C4254': '167364008', 'T-C4255': '167464007', 'T-C4263': '167664004', 'T-C4018': '167864002', 'T-C421E': '167965000', 'T-C4238': '168159002', 'T-C4019': '168360002', 'T-C4244': '168460001', 'T-C401A': '168557005', '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-D03C2': '181768009', 'T-116EE': '181900008', 'T-116EF': '181901007', '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', 'D4-31012': '204317008', 'T-4630D': '206034008', 'F-01FBA': '213262007', 'D3-83001': '218728005', 'J-00552': '223366009', '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', 'D6-34737': '237897009', 'F-029F7': '238108007', 'D0-30017': '238810007', 'P1-189C2': '239503002', 'P0-05AFA': '240946003', 'P5-30031': '241213007', 'P5-0A001': '241434002', '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', '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-43002': '244251006', 'T-43003': '244252004', 'T-4940E': '244411005', 'T-4941A': '244415001', 'T-A800B': '244453006', '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', '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-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', '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', 'F-02692': '251271006', 'F-02FA4': '251786004', 'F-02FB4': '251795007', 'F-A2143': '251797004', 'F-02FB7': '251799001', 'F-0319E': '252064005', 'F-031A2': '252068008', 'F-031F7': '252129004', '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', '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', 'R-40365': '255218000', 'G-A39A': '255227004', 'R-411C0': '255235001', 'F-32021': '255236000', 'R-40377': '255238004', 'R-4038D': '255253007', 'F-32011': '255254001', '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-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-22820': '255809005', '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-04831': '257357007', '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', 'R-4081A': '260528009', 'G-D05F': '260585005', 'G-D067': '260590008', 'G-D071': '260601006', 'G-C048': '260674002', 'A-00004': '260787004', 'G-C093': '260858005', 'R-40861': '260867005', 'G-C09C': '260870009', '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', '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-42037': '263654008', 'R-42047': '263677008', '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-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', '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', 'F-9B75C': '268461001', 'R-207D7': '268951004', 'D3-30001': '270492004', 'F-06001': '271593001', 'D3-00006': '271594007', 'F-008EC': '271649006', 'F-008ED': '271650006', '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', 'R-F6E36': '273948005', 'P1-34001': '274022008', 'T-4667C': '274060004', 'T-4667D': '274143007', 'T-4668A': '274231001', 'R-202A9': '274303007', 'P1-4830F': '274331003', 'F-03261': '274640006', 'F-A0846': '274662006', 'F-37015': '274668005', 'P1-32006': '275035006', 'F-300FA': '275514001', 'G-0069': '275552000', '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', '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-21301': '279549004', 'T-C4423': '279609001', 'T-C4452': '279784003', 'T-C4401': '279795009', 'T-C4453': '279866008', 'T-D3412': '280062008', 'T-C4465': '280216006', 'T-C4466': '280314006', 'T-A0109': '280371009', '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', '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-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', '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-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-0123A': '301939004', 'D7-9002A': '302924003', 'R-422A4': '303110006', 'R-422A5': '303111005', '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', 'G-E002': '304915008', 'T-3500E': '305437000', 'T-1273F': '306783000', 'F-00BB8': '307047009', 'R-40FB8': '307152002', 'R-40FB9': '307153007', 'R-40FBA': '307154001', 'P0-004BA': '307280005', 'R-410C3': '307429007', 'R-4112F': '307486002', 'P1-0555A': '307701005', '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', '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', 'F-029D4': '313386006', 'D3-13014': '314116003', 'D3-83602': '314186008', 'R-20839': '314348007', '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', 'R-F2989': '346607007', 'C-70434': '347379006', 'C-677B9': '349947003', 'C-51071': '349955005', 'C-B02CC': '350086004', 'C-B1130': '353842007', 'C-B0382': '353903006', 'C-B038B': '353912008', '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-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-047E7': '364644000', 'F-38035': '365416000', 'F-01969': '365853002', 'F-93109': '365981007', 'F-30117': '366188009', 'P0-0058E': '367336001', 'R-4235F': '367450005', 'T-D03B4': '367567000', '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-A11D': '371244009', 'G-A11E': '371246006', 'G-A12B': '371251000', 'G-A12C': '371252007', 'G-A12D': '371253002', 'G-A12E': '371254008', '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-616E7': '372578001', 'F-616EB': '372580007', 'F-616FE': '372602008', 'F-6171D': '372614000', 'F-6188F': '372656001', 'R-F2B1D': '372664007', 'F-61898': '372665008', 'F-61899': '372666009', 'C-0023B': '372677003', 'F-618A5': '372681003', 'F-618AE': '372693007', 'F-618AF': '372695000', 'R-F2B1F': '372703009', 'F-618BA': '372708000', 'C-0024C': '372722000', 'F-61916': '372724004', 'C-0024E': '372735009', '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-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-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-618D7': '373529000', 'F-618D8': '373530005', 'F-61968': '373646006', 'F-619B7': '373682001', 'F-61639': '373738000', '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', '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-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-61A26': '387146001', 'F-61A28': '387150008', 'F-61A3F': '387176008', 'F-61A66': '387218008', 'F-61A76': '387239001', 'F-61A7F': '387258005', 'R-F2B2C': '387264003', 'F-61A95': '387286002', 'F-61AC4': '387341002', 'F-61AFE': '387351001', 'F-B2135': '387362001', 'F-61B0A': '387368002', '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', 'M-35001': '396339007', 'C-002B1': '396345004', 'R-10075': '396482007', 'P1-65359': '396487001', 'L-80453': '396488006', 'L-80A45': '396505009', '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', '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', 'F-61D70': '398828005', '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', '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', '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', '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', 'R-41563': '399707004', 'D3-8005B': '400047006', 'D3-15119': '401303003', 'D3-1511A': '401314000', 'D0-2202B': '402603005', 'D0-3002F': '403618004', 'F-06017': '404640003', 'R-005AE': '404684003', 'C-B10A2': '404706008', 'C-B10A4': '404707004', 'C-B014D': '404846007', 'F-0499A': '405165006', 'R-305CE': '405269005', 'J-005E6': '405277009', 'J-005E8': '405279007', 'G-A12F': '405738005', 'G-A132': '405739002', '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-2286B': '406978000', 'C-2286C': '406980006', 'C-2286D': '406981005', 'C-2286E': '406982003', 'C-2286F': '406983008', 'C-22870': '406984002', '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', 'F-04A13': '408379005', 'R-214DD': '408551003', 'F-04AB2': '408573005', 'F-04AB3': '408574004', 'D0-F0369': '408643008', '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-1022D': '408744005', 'R-10227': '408745006', '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', 'R-305D3': '409688003', 'D3-1081C': '409712001', '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', '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-C340': '410675002', 'G-A206': '410679008', 'R-1023E': '410685001', 'R-1023B': '410686000', 'R-1023D': '410687009', 'R-1023A': '410688004', 'R-1023C': '410689007', 'T-D0829': '410726006', 'C-B05A3': '410873007', 'F-61E2A': '410937004', 'F-61DF9': '412155002', 'F-04B88': '413322009', 'L-8880C': '413488005', 'R-102DD': '413530006', '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', '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', 'D3-1070D': '414795007', 'R-102B4': '415070008', 'G-03D3': '415076002', 'R-10253': '415144009', 'R-10255': '415145005', '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', '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-61FDB': '417881006', 'F-D7011': '418326009', 'F-A21A7': '418363000', 'R-305EB': '418433008', 'F-6205D': '418760000', 'R-005E0': '418799008', 'P5-00A25': '418903008', 'F-04DA1': '419099009', 'G-A13B': '419161000', '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', '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', 'C-B07DD': '423498000', 'C-B07DE': '423543007', 'C-B07E4': '423546004', 'C-1018D': '423578007', 'R-40A94': '423720000', 'C-135A4': '423764008', 'L-804C0': '423926000', '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', 'P2-31109': '424444005', 'C-B1135': '424570009', 'F-04ECE': '424622008', 'R-40A8F': '424655003', 'L-801E8': '424705003', 'C-B07E0': '424708001', 'C-B07E5': '424789007', 'R-40A8B': '424811006', 'C-B07E6': '424874008', 'C-1018C': '424875009', 'R-40A8C': '424962005', 'P0-05DE2': '424979004', 'R-40A91': '425030002', 'R-40A96': '425035007', 'R-40A97': '425042007', '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', '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', 'P1-36993': '427886002', 'G-4044': '427986001', 'F-380B2': '427989008', 'F-04F84': '427990004', 'D3-10711': '428196007', 'R-40AA7': '428247006', 'F-380B3': '428417006', 'F-04F92': '428420003', 'F-04F9F': '428531008', 'F-38793': '428549008', 'F-38287': '428550008', 'F-04FA0': '428552000', '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', '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-1190E': '429310004', 'F-04FD3': '429382003', 'R-215E0': '429391004', 'R-215E1': '429477006', 'F-04FD8': '429483009', 'G-4045': '429551001', 'G-4046': '429557002', 'D3-13037': '429559004', 'A-1002A': '429560009', 'D3-0400A': '429561008', 'F-04FE3': '429576000', 'C-1190F': '429591003', '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', 'D1-50666': '439470001', 'P5-B0128': '439858009', 'PA-30029': '440252007', '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', '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', 'G-057B': '443499004', 'G-057C': '443500008', 'R-421AA': '443501007', 'G-057D': '443562002', 'T-F6858': '443591004', 'G-057E': '443609003', 'T-D0880': '443625008', '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', 'P5-08118': '443844003', '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', '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', 'G-D1E4': '444850002', 'C-101E8': '444883009', 'C-101E9': '444923006', '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', 'P5-70694': '446315002', 'R-40B32': '446406008', 'C-114B6': '446531006', 'C-163B6': '446534003', 'C-163B7': '446535002', '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', 'C-163BD': '447201007', '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-FDF5C': '467354001', 'R-FDB79': '468192005', 'R-FD5EB': '468440006', 'DF-1147C': '473188002', '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-FB565': '700032006', 'R-FCC16': '701933006', 'R-FB83F': '702391001', 'R-FB8F1': '702569007', 'R-FB9B7': '702767007', 'R-FBDEA': '703842006', 'R-FEAEC': '705541005', 'R-FCCF2': '706247001', '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-FF0C4': '708174004', 'L-DA692': '709853007', 'D3-80086': '710864009', 'R-FF2E7': '711101009', 'C-D6858': '712736002', 'T-F6724': '714754004', 'T-F6713': '714759009', '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', 'R-FFFD9': '717027004', } pydicom-2.4.3/pydicom/sr/codedict.py000066400000000000000000000254331446675437500174400ustar00rootroot00000000000000# Copyright 2008-2019 pydicom authors. See LICENSE file for details. # -*- coding: utf-8 -*- """Access code dictionary information""" from itertools import chain import inspect from typing import List, Optional, Tuple, KeysView, Iterable, Dict, cast, Union 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) ) ) ConceptsType = Dict[str, Dict[str, Dict[str, Tuple[str, List[int]]]]] SnomedMappingType = Dict[str, Dict[str, str]] class _CID_Dict: repr_format = "{} = {}" str_format = "{:20} {:12} {:8} {}\n" def __init__(self, cid: int) -> None: self.cid = cid self._concepts: Dict[str, Code] = {} def __dir__(self) -> List[str]: """Gives a list of available SR identifiers. 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 __getattr__(self, name: str) -> Code: """Return the ``Code`` for class attribute `name`.""" matches = [ scheme for scheme, keywords in CID_CONCEPTS[self.cid].items() if name in keywords ] if not matches: raise AttributeError( f"'{name}' not found in CID {self.cid}" ) if len(matches) > 1: # Should never happen, but just in case raise AttributeError( f"Multiple schemes found for '{name}' in CID {self.cid}: " f"{', '.join(matches)}" ) scheme = matches[0] identifiers = cast( Dict[str, Tuple[str, List[int]]], CONCEPTS[scheme][name] ) # Almost always only one code per identifier if len(identifiers) == 1: code, val = list(identifiers.items())[0] else: _matches = [ (code, val) for code, val in identifiers.items() if self.cid in val[1] ] if len(_matches) > 1: # Rare, but multiple codes may end up with the same identifier # See CID 12300 for example codes = ", ".join([f"'{v[0]}'" for v in _matches]) raise AttributeError( f"'{name}' has multiple code matches in CID {self.cid}: " f"{codes}" ) code, val = _matches[0] return Code(value=code, meaning=val[0], scheme_designator=scheme) @property def concepts(self) -> Dict[str, Code]: """Return a dict of {SR identifiers: codes}""" if not self._concepts: self._concepts = {name: getattr(self, name) for name in self.dir()} return self._concepts def __repr__(self) -> str: concepts = [ self.repr_format.format(name, concept) for name, concept in self.concepts.items() ] return f"CID {self.cid}\n" + "\n".join(concepts) def __str__(self) -> str: """Return a str representation of the instance.""" s = [f"CID {self.cid} ({name_for_cid[self.cid]})"] s.append( self.str_format.format( "Attribute", "Code value", "Scheme", "Meaning" ) ) s.append( self.str_format.format( "---------", "----------", "------", "-------" ) ) s.append( "\n".join( self.str_format.format(name, *concept) for name, concept in self.concepts.items() ) ) return "\n".join(s) def dir(self, *filters: str) -> List[str]: """Return an sorted list of SR identifiers 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 SR keywords. If no `filters` are used then all keywords are returned. """ # CID_CONCEPTS: Dict[int, Dict[str, List[str]]] return _filtered( chain.from_iterable(CID_CONCEPTS[self.cid].values()), filters, ) def __contains__(self, code: Code) -> bool: """Checks whether a given code is a member of the context group. Parameters ---------- code: Union[pydicom.sr.coding.Code, pydicom.sr.coding.CodedConcept] coded concept Returns ------- bool whether CID contains `code` """ return any([concept == code for concept in self.concepts.values()]) def trait_names(self) -> List[str]: """Returns 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 _CodesDict: """Interface for a concepts dictionary. Examples -------- >>> from pydicom.sr import codes >>> code = codes.SCT.Deep >>> code.value '795002' >>> code.meaning 'Deep' >>> code == codes.CID2.Deep # Or use the CID instead True >>> code = codes.SCT.FontanelOfSkull >>> code.value '79361005' >>> code.meaning 'Fontanel of skull' """ def __init__(self, scheme: Optional[str] = None) -> None: """Create a new CodesDict. Parameters ---------- scheme : str, optional The if used, then the scheme designator for the concepts dictionary. """ self.scheme = scheme self._dict = {scheme: CONCEPTS[scheme]} if scheme else CONCEPTS def __dir__(self) -> List[str]: """Gives a list of available SR identifiers. 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 __getattr__(self, name: str) -> Union["_CodesDict", _CID_Dict, Code]: """Return either a ``_CodesDict``, ``_CID_Dict`` or ``Code`` depending on the `name`. Parameters ---------- name : str One of the following: * A coding scheme designator such as ``"SCT"``. * A concept ID such as ``"CID2"``. * If ``_CodesDict.scheme`` is not ``None``, a camel case version of the concept's code meaning, such as ``"FontanelOfSkull" in the SCT coding scheme. Returns ------- pydicom.sr._CodesDict, pydicom.sr._CID_Dict or pydicom.sr.Code * If `name` is a concept ID then the ``_CID_Dict`` for the corresponding CID. * If `name` is a coding scheme designator then the ``_CodesDict`` instance for the corresponding scheme. * If ``_CodesDict.scheme`` is not ``None`` then the ``Code`` corresponding to `name`. """ # for codes.X, X must be a CID or a scheme designator if name.startswith("cid"): if not self.scheme: return _CID_Dict(int(name[3:])) raise AttributeError("Cannot use a CID with a scheme dictionary") if name in self._dict.keys(): # Return concepts limited only the specified scheme designator return _CodesDict(scheme=name) # If not already narrowed to a particular scheme, is an error if not self.scheme: raise AttributeError( f"'{name}' not recognized as a CID or scheme designator" ) # else try to find in this scheme try: val = cast( Dict[str, Tuple[str, List[int]]], self._dict[self.scheme][name] ) except KeyError: raise AttributeError( f"Unknown code name '{name}' for scheme '{self.scheme}'" ) if len(val) > 1: # val is {code value: (meaning, cid_list}, code_value: ...} code_values = ", ".join(val.keys()) raise RuntimeError( f"Multiple code values for '{name}' found: {code_values}" ) code = list(val.keys())[0] # get first and only meaning, cids = val[code] return Code(value=code, meaning=meaning, scheme_designator=self.scheme) def dir(self, *filters: str) -> List[str]: """Returns an alphabetical list of SR identifiers based on a partial match. Intended mainly for use in interactive Python sessions. 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 SR keywords. If no filters are used then all keywords are returned. """ return _filtered(chain.from_iterable(self._dict.values()), filters) def schemes(self) -> KeysView[str]: return self._dict.keys() def trait_names(self) -> List[str]: """Returns 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) codes = _CodesDict() pydicom-2.4.3/pydicom/sr/coding.py000066400000000000000000000037521446675437500171250ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. from typing import NamedTuple, Any, Optional 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: Optional[str] = None def __hash__(self) -> int: return hash(self.scheme_designator + self.value) def __eq__(self, other: Any) -> Any: if self.scheme_designator == "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": 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-2.4.3/pydicom/tag.py000066400000000000000000000205351446675437500160070ustar00rootroot00000000000000# 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 Tuple, Optional, Union, Any, Iterator, List @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: {str(exc)}\n{stack_trace}" raise type(exc)(msg) from exc # Type that can be used where a parameter is a tag or keyword TagType = Union[int, str, Tuple[int, int], "BaseTag"] TagListType = Union[ List[int], List[str], List[Tuple[int, int]], List["BaseTag"] ] def Tag(arg: TagType, arg2: Optional[int] = 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")`` .. versionchanged:: 1.3 Added support for creating a :class:`!BaseTag` using an element keyword 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: Optional[int] 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: # http://docs.python.org/dev/3.0/whatsnew/3.0.html 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 http://docs.python.org/dev/3.0/reference/ # datamodel.html#object.__hash__ __hash__ = int.__hash__ def __str__(self) -> str: """Return the tag value as a hex string '(gggg, eeee)'.""" return "({0:04x}, {1:04x})".format(self.group, self.element) __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. .. versionadded:: 1.1 """ 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)) pydicom-2.4.3/pydicom/tests/000077500000000000000000000000001446675437500160175ustar00rootroot00000000000000pydicom-2.4.3/pydicom/tests/__init__.py000066400000000000000000000000001446675437500201160ustar00rootroot00000000000000pydicom-2.4.3/pydicom/tests/_write_stds.py000066400000000000000000000056761446675437500207350ustar00rootroot00000000000000# 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-2.4.3/pydicom/tests/conftest.py000066400000000000000000000047641446675437500202310ustar00rootroot00000000000000# -*- coding: utf-8 -*- # 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 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-2.4.3/pydicom/tests/test_JPEG_LS_transfer_syntax.py000066400000000000000000000154761446675437500241020ustar00rootroot00000000000000# 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.mr_small = dcmread(mr_name) self.emri_jpeg_ls_lossless = dcmread(emri_jpeg_ls_lossless) self.emri_small = dcmread(emri_name) 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 assert a.mean() == b.mean(), \ "using GDCM Decoded pixel data is not " \ "all {0} (mean == {1})".format(b.mean(), a.mean()) @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 assert a.mean() == b.mean(), \ "using GDCM Decoded pixel data is not " \ "all {0} (mean == {1})".format(b.mean(), a.mean()) @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 assert a.mean() == b.mean(), \ "using jpeg_ls decoded pixel data is not " \ "all {0} (mean == {1})".format(b.mean(), a.mean()) @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 assert a.mean() == b.mean(), \ "using jpeg_ls decoded pixel data is not all {0} " \ "(mean == {1})".format(b.mean(), a.mean()) 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-2.4.3/pydicom/tests/test_charset.py000066400000000000000000000556341446675437500210760ustar00rootroot00000000000000# -*- coding: utf-8 -*- # 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, config 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_encoding = 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_encoding = 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""" with pytest.warns(UserWarning, match="Value 'GBK' cannot be used as " "code extension, ignoring it"): 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' b'\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' b'\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' b'\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' b'\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' b'\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() fp.is_implicit_VR = False fp.is_little_endian = True ds.save_as(fp, write_like_original=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() fp.is_implicit_VR = False fp.is_little_endian = True ds.save_as(fp, write_like_original=False) 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, write_like_original=False) 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() fp.is_implicit_VR = False fp.is_little_endian = True ds.save_as(fp, write_like_original=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-2.4.3/pydicom/tests/test_cli.py000066400000000000000000000166371446675437500202140ustar00rootroot00000000000000# -*- coding: utf-8 -*- # 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(f"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(f"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-2.4.3/pydicom/tests/test_codes.py000066400000000000000000000305461446675437500205350ustar00rootroot00000000000000 import pytest from pydicom.sr._cid_dict import cid_concepts as CID_CONCEPTS from pydicom.sr.coding import Code from pydicom.sr.codedict import codes, _CID_Dict, _CodesDict from pydicom.uid import UID @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'] 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 class TestCodesDict: def test_dcm_1(self): assert codes.DCM.Modality == Code( value="121139", scheme_designator="DCM", meaning="Modality" ) def test_dcm_2(self): assert codes.DCM.ProcedureReported == Code( value="121058", scheme_designator="DCM", meaning="Procedure Reported", ) def test_dcm_3(self): assert codes.DCM.ImagingStartDatetime == Code( value="122712", scheme_designator="DCM", meaning="Imaging Start DateTime", ) def test_sct_1(self): assert codes.SCT._1SigmaLowerValueOfPopulation == Code( value="371919006", scheme_designator="SCT", meaning="1 Sigma Lower Value of Populuation", ) def test_sct_2(self): assert codes.SCT.FindingSite == Code( value="363698007", scheme_designator="SCT", meaning="Finding Site" ) def test_cid250(self): assert codes.cid250.Positive == Code( value="10828004", scheme_designator="SCT", meaning="Positive" ) def test_cid300(self): assert codes.cid300.NickelCobaltChromium == Code( value="261249004", scheme_designator="SCT", meaning="Nickel cobalt chromium", ) def test_cid301(self): assert codes.cid301.mgcm3 == Code( value="mg/cm3", scheme_designator="UCUM", meaning="mg/cm^3" ) def test_cid402(self): assert codes.cid402.DestinationRoleID == Code( value="110152", scheme_designator="DCM", meaning="Destination Role ID", ) def test_cid405(self): assert codes.cid405.MultiMediaCard == Code( value="110035", scheme_designator="DCM", meaning="Multi-media Card" ) def test_cid610(self): assert codes.cid610.ReverseOsmosisPurifiedHclAcidifiedWater == Code( value="127291", scheme_designator="DCM", meaning="Reverse osmosis purified, HCl acidified water", ) def test_cid612(self): assert codes.cid612.MonitoredAnesthesiaCareMAC == Code( value="398239001", scheme_designator="SCT", meaning="Monitored Anesthesia Care (MAC)", ) def test_cid622(self): assert codes.cid622.NeuromuscularBlockingNMBNonDepolarizing == Code( value="372790002", scheme_designator="SCT", meaning="NeuroMuscular Blocking (NMB) - non depolarizing", ) def test_cid630(self): assert codes.cid630.LidocainePrilocaine == Code( value="346553009", scheme_designator="SCT", meaning="Lidocaine + Prilocaine", ) def test_cid643(self): assert codes.cid643._6Hydroxydopamine == Code( value="4624", scheme_designator="PUBCHEM_CID", meaning="6-Hydroxydopamine", ) def test_cid646(self): assert codes.cid646.SPECTCTOfWholeBody == Code( value="127902", scheme_designator="DCM", meaning="SPECT CT of Whole Body", ) def test_cid1003(self): assert codes.cid1003.LevelOfT11T12IntervertebralDisc == Code( value="243918001", scheme_designator="SCT", meaning="Level of T11/T12 intervertebral disc", ) def test_cid3000(self): assert codes.cid3000.OperatorNarrative == Code( value="109111", scheme_designator="DCM", meaning="Operator's Narrative", ) def test_cid3001_1(self): assert codes.cid3001.Avr == Code( value="2:65", scheme_designator="MDC", meaning="-aVR" ) def test_cid3001_2(self): assert codes.cid3001.NegativeLowRightScapulaLead == Code( value="2:124", scheme_designator="MDC", meaning="negative: low right scapula Lead", ) def test_cid3107(self): assert codes.cid3107._13Nitrogen == Code( value="21576001", scheme_designator="SCT", meaning="^13^Nitrogen" ) def test_cid3111(self): assert codes.cid3111.Tc99mTetrofosmin == Code( value="404707004", scheme_designator="SCT", meaning="Tc-99m tetrofosmin", ) def test_cid3263(self): meaning = ( "12-lead from EASI leads (ES, AS, AI)" " by Dower/EASI transformation" ) assert ( codes.cid3263._12LeadFromEASILeadsESASAIByDowerEASITransformation == Code( value="10:11284", scheme_designator="MDC", meaning=meaning, ) ) def test_cid3335(self): assert codes.cid3335.PWaveSecondDeflectionInPWave == Code( value="10:320", scheme_designator="MDC", meaning="P' wave (second deflection in P wave)", ) def test_contained(self): c = Code("24028007", "SCT", "Right") assert c in codes.cid244 def test_not_contained(self): c = Code("130290", "DCM", "Median") assert c not in codes.cid244 def test_dunder_dir(self): d = _CodesDict('UCUM') assert "ArbitraryUnit" in dir(d) assert "Year" in dir(d) assert "__delattr__" in dir(d) assert "trait_names" in dir(d) assert isinstance(dir(d), list) def test_dir(self): d = _CodesDict('UCUM') assert isinstance(d.dir(), list) assert "ArbitraryUnit" in d.dir() assert "Year" in d.dir() assert d.dir("xyz") == [] assert "Radian" in d.dir("ia") def test_schemes(self): d = _CodesDict('UCUM') assert 'UCUM' in list(d.schemes()) schemes = list(codes.schemes()) assert 'UCUM' in schemes assert 'DCM' in schemes assert 'SCT' in schemes def test_trait_names(self): d = _CodesDict('UCUM') assert "ArbitraryUnit" in d.trait_names() assert "Year" in d.trait_names() assert "__delattr__" in d.trait_names() assert "trait_names" in d.trait_names() def test_getattr_CID_with_scheme_raises(self): msg = "Cannot use a CID with a scheme dictionary" with pytest.raises(AttributeError, match=msg): _CodesDict('UCUM').cid2 def test_getattr_unknown_attr_raises(self): msg = "Unknown code name 'bar' for scheme 'UCUM'" with pytest.raises(AttributeError, match=msg): _CodesDict('UCUM').bar def test_getattr_nonunique_attr_raises(self): attr = "LeftVentricularInternalDiastolicDimensionBSA" msg = f"Multiple code values for '{attr}' found: 80009-4, 80010-2" with pytest.raises(RuntimeError, match=msg): _CodesDict('LN').LeftVentricularInternalDiastolicDimensionBSA class TestCIDDict: def test_concepts(self): d = _CID_Dict(2) assert "Afferent" in d.concepts code = d.concepts["Afferent"] assert isinstance(code, Code) assert code.value == "49530007" def test_dunder_dir(self): d = _CID_Dict(2) assert "Afferent" in dir(d) assert "Vertical" in dir(d) assert "__contains__" in dir(d) assert "trait_names" in dir(d) assert isinstance(dir(d), list) def test_dir(self): d = _CID_Dict(2) assert isinstance(d.dir(), list) assert "Afferent" in d.dir() assert "Vertical" in d.dir() assert d.dir("xyz") == [] assert "Axial" in d.dir("ia") assert "Superficial" in d.dir("ia") assert "Axial" in d.dir("IA") assert "Superficial" in d.dir("IA") def test_trait_names(self): d = _CID_Dict(2) assert isinstance(d.trait_names(), list) assert "Afferent" in d.trait_names() assert "Vertical" in d.trait_names() def test_str(self): d = _CID_Dict(2) s = str(d) assert "CID 2 (AnatomicModifier)" in s assert "Afferent 49530007 SCT Afferent" in s assert "Vertical 33096000 SCT Vertical" in s def test_repr(self): d = _CID_Dict(2) r = repr(d) assert "CID 2" in r assert "Afferent = Code(value='49530007'" in r assert "Vertical = Code(value='33096000'" in r def test_getattr_match(self): d = _CID_Dict(2) code = d.Afferent assert isinstance(code, Code) assert code.value == "49530007" def test_getattr_no_match_raises(self): d = _CID_Dict(2) msg = r"'XYZ' not found in CID 2" with pytest.raises(AttributeError, match=msg): d.XYZ def test_getattr_match_multiple_codes_raises(self): # Same attribute for multiple codes d = _CID_Dict(12300) msg = ( r"'LeftVentricularInternalDiastolicDimensionBSA' " r"has multiple code matches in CID 12300: '80009-4', '80010-2'" ) with pytest.raises(AttributeError, match=msg): d.LeftVentricularInternalDiastolicDimensionBSA def test_getattr_ambiguous_attr_raises(self, ambiguous_scheme): attr, cid = ambiguous_scheme msg = f"Multiple schemes found for '{attr}' in CID 6129: SCT, FOO" with pytest.raises(AttributeError, match=msg): getattr(_CID_Dict(cid), attr) pydicom-2.4.3/pydicom/tests/test_config.py000066400000000000000000000141131446675437500206750ustar00rootroot00000000000000# Copyright 2008-2019 pydicom authors. See LICENSE file for details. """Unit tests for the pydicom.config module.""" import logging import sys import os import importlib import pytest from pydicom import dcmread, DataElement from pydicom.config import debug from pydicom.data import get_testdata_file from pydicom import config from pydicom.dataelem import RawDataElement, DataElement_from_raw from pydicom.dataset import Dataset from pydicom.filebase import DicomBytesIO from pydicom.tag import Tag DS_PATH = get_testdata_file("CT_small.dcm") PYTEST = [int(x) for x in pytest.__version__.split(".")] @pytest.mark.skipif(PYTEST[:2] < [3, 4], reason="no caplog") 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"): ds = 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"): ds = 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"): ds = 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"): ds = 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"): ds = 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_compat_import(self, future_setter): """Import error if pydicom future behavior is set""" with pytest.raises(ImportError): import pydicom.compat def test_file_meta_class(self, future_setter): """FileMetaDataset required type in pydicom future behavior""" ds = Dataset() with pytest.raises(TypeError): ds.file_meta = Dataset() 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): DataElement_from_raw(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) with pytest.raises(KeyError): DataElement_from_raw(raw) pydicom-2.4.3/pydicom/tests/test_data_manager.py000066400000000000000000000261211446675437500220350ustar00rootroot00000000000000# 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 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 = False if 'pydicom-data' in external_data_sources(): EXT_PYDICOM = True @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 @pytest.mark.skipif(not EXT_PYDICOM, reason="pydicom-data not installed") 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 p = self.dpath / "693_UNCI.dcm" shutil.copy(p, self.dpath / "PYTEST_BACKUP") def teardown_method(self): # Restore the backed-up file p = self.dpath / "693_UNCI.dcm" shutil.copy(self.dpath / "PYTEST_BACKUP", p) os.remove(self.dpath / "PYTEST_BACKUP") 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 " r"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", "r") 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", "r") as f: filenames = json.load(f).keys() filenames = [name.lower() for name in filenames] assert len(set(filenames)) == len(filenames) pydicom-2.4.3/pydicom/tests/test_dataelem.py000066400000000000000000001332611446675437500212120ustar00rootroot00000000000000# -*- coding: utf-8 -*- # 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 datetime import math 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, DataElement_from_raw, ) from pydicom.dataset import Dataset from pydicom.errors import BytesLengthException from pydicom.filebase import DicomBytesIO from pydicom.multival import MultiValue from pydicom.tag import Tag, BaseTag from pydicom.tests.test_util import save_private_dict from pydicom.uid import UID from pydicom.valuerep import DSfloat, validate_value 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 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 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 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 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 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 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) == repr(elem.value) 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() 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() ds.is_little_endian = True # 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() 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() ds.is_little_endian = True # 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 0 == elem.VM assert elem.value == [] fp = DicomBytesIO() fp.is_little_endian = True fp.is_implicit_VR = True filewriter.write_dataset(fp, ds) ds_read = dcmread(fp, force=True) elem = ds_read['AcquisitionContextSequence'] assert 0 == elem.VM 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 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 = DataElement_from_raw(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) with pytest.raises(KeyError, match=r"\(8888, 0002\)"): DataElement_from_raw(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 = DataElement_from_raw(raw, 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 = DataElement_from_raw(raw, 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 = DataElement_from_raw(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): DataElement_from_raw(raw, 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): DataElement_from_raw(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 = DataElement_from_raw(raw) assert 'UN' == raw_elem.VR assert value == raw_elem.value def test_read_known_private_tag_implicit(self): fp = DicomBytesIO() ds = Dataset() ds.is_implicit_VR = True ds.is_little_endian = 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.is_implicit_VR = False ds.is_little_endian = 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.is_implicit_VR = False ds.is_little_endian = 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" class TestDataElementValidation: @staticmethod def check_invalid_vr(vr, value, check_warn=True): msg = fr"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 = fr"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("utf-8"), "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.is_implicit_VR = False ds.is_little_endian = 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.is_implicit_VR = True ds.is_little_endian = 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) def test_elem_description_deprecated(): """Test deprecation warning for DataElement.description()""" elem = DataElement("PatientName", "PN", "Citizen^Jan") msg = ( r"'DataElement.description\(\)' is deprecated and will be removed in " r"v3.0, use 'DataElement.name' instead" ) with pytest.warns(DeprecationWarning, match=msg): assert elem.description() == "Patient's Name" pydicom-2.4.3/pydicom/tests/test_dataset.py000066400000000000000000002466651446675437500211000ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. """Unit tests for the pydicom.dataset module.""" import copy import io import math import pickle import sys import weakref import pytest from pydicom.tests.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.overlay_data_handlers import numpy_handler as NP_HANDLER from pydicom.pixel_data_handlers.util import get_image_pixel_ids from pydicom.sequence import Sequence from pydicom.tag import Tag from pydicom.uid import ( ImplicitVRLittleEndian, ExplicitVRBigEndian, JPEGBaseline8Bit, PYDICOM_IMPLEMENTATION_UID, ExplicitVRLittleEndian, MediaStorageDirectoryStorage ) from pydicom.valuerep import DS class BadRepr: def __repr__(self): raise ValueError("bad repr") 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_from_gdcm = r"'Dataset' object has no attribute 'filename'" msg_from_numpy = (r"'FileMetaDataset' object has no attribute " "'TransferSyntaxUID'") msg_from_pillow = (r"'Dataset' object has no attribute " "'PixelRepresentation'") msg = "(" + "|".join( [msg_from_gdcm, msg_from_numpy, msg_from_pillow]) + ")" 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.is_little_endian = True dataset.is_implicit_VR = True pydicom.write_file(fp, dataset) 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 fp.close() 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 '= (3, 8): expected_diff.add('__reversed__') if sys.version_info[:2] >= (3, 9): expected_diff.update([ '__ror__', '__ior__', '__or__', '__class_getitem__' ]) assert expected_diff == set(dir(di)) - set(dir(ds)) def test_copy_filedataset(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() msg = ("The 'filename' attribute of the dataset is a " "file-like object and will be set to None") with pytest.warns(UserWarning, match=msg): ds_copy = copy.copy(ds) assert ds.filename is not None assert ds_copy.filename is None assert ds_copy == ds def test_deepcopy_filedataset(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() msg = ("The 'filename' attribute of the dataset is a " "file-like object and will be set to None") with pytest.warns(UserWarning, match=msg): ds_copy = copy.deepcopy(ds) assert ds.filename is not None assert ds_copy.filename is None assert ds_copy == ds 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.is_implicit_VR = not ds.is_implicit_VR ds.is_little_endian = not ds.is_little_endian 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) ds2 = copy.deepcopy(ds) assert ds2.filename == "" 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 class TestDatasetOverlayArray: """Tests for Dataset.overlay_array().""" def setup_method(self): """Setup the test datasets and the environment.""" self.original_handlers = pydicom.config.overlay_data_handlers pydicom.config.overlay_data_handlers = [NP_HANDLER] self.ds = dcmread( get_testdata_file("MR-SIEMENS-DICOM-WithOverlays.dcm") ) class DummyHandler: def __init__(self): self.raise_exc = False self.has_dependencies = True self.DEPENDENCIES = { 'numpy': ('http://www.numpy.org/', 'NumPy'), } self.HANDLER_NAME = 'Dummy' def supports_transfer_syntax(self, syntax): return True def is_available(self): return self.has_dependencies def get_overlay_array(self, ds, group): if self.raise_exc: raise ValueError("Dummy error message") return 'Success' self.dummy = DummyHandler() def teardown_method(self): """Restore the environment.""" pydicom.config.overlay_data_handlers = self.original_handlers def test_no_possible(self): """Test with no possible handlers available.""" pydicom.config.overlay_data_handlers = [] with pytest.raises((NotImplementedError, RuntimeError)): self.ds.overlay_array(0x6000) def test_possible_not_available(self): """Test with possible but not available handlers.""" self.dummy.has_dependencies = False pydicom.config.overlay_data_handlers = [self.dummy] msg = ( r"The following handlers are available to decode the overlay " r"data however they are missing required dependencies: " ) with pytest.raises(RuntimeError, match=msg): self.ds.overlay_array(0x6000) def test_possible_available(self): """Test with possible and available handlers.""" pydicom.config.overlay_data_handlers = [self.dummy] assert 'Success' == self.ds.overlay_array(0x6000) def test_handler_raises(self): """Test the handler raising an exception.""" self.dummy.raise_exc = True pydicom.config.overlay_data_handlers = [self.dummy] with pytest.raises(ValueError, match=r"Dummy error message"): self.ds.overlay_array(0x6000) class TestFileMeta: def test_deprecation_warning(self): """Assigning ds.file_meta warns if not FileMetaDataset instance""" ds = Dataset() with pytest.warns(DeprecationWarning): ds.file_meta = Dataset() # not FileMetaDataset 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 = Dataset() # not FileMetaDataset ds_meta.TransferSyntaxUID = "1.2" with pytest.warns(DeprecationWarning): ds.file_meta = ds_meta # Error on assigning file meta if any non-group 2 ds_meta.PatientName = "x" with pytest.raises(ValueError): ds.file_meta = ds_meta 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.is_implicit_VR = True ds.is_little_endian = True ds.read_encoding = "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]) # dereference weakrefs and check are pointing to correct objects assert ds.BeamSequence is ds.BeamSequence[0].parent_seq() assert ds is ds.BeamSequence.parent_dataset() assert ds_copy.BeamSequence is ds_copy.BeamSequence[0].parent_seq() assert ds_copy is ds_copy.BeamSequence.parent_dataset() else: # shallow copy assert id(ds_copy.BeamSequence[0]) == id(ds.BeamSequence[0]) assert ds_copy.is_implicit_VR assert ds_copy.is_little_endian assert ds_copy.read_encoding == "utf-8" @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_little_endian", "read_implicit_vr", "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() for s in CAMEL_CASE[0]: 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() for s in CAMEL_CASE[0]: 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() for s in CAMEL_CASE[0]: 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) pydicom-2.4.3/pydicom/tests/test_dicomdir.py000066400000000000000000000067021446675437500212270ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Test for dicomdir.py""" import pytest from pydicom.data import get_testdata_file from pydicom.dicomdir import DicomDir from pydicom.errors import InvalidDicomError from pydicom import config, dcmread TEST_FILE = get_testdata_file('DICOMDIR') IMPLICIT_TEST_FILE = get_testdata_file('DICOMDIR-implicit') BIGENDIAN_TEST_FILE = get_testdata_file('DICOMDIR-bigEnd') TEST_FILES = ( get_testdata_file('DICOMDIR'), get_testdata_file('DICOMDIR-reordered'), get_testdata_file('DICOMDIR-nooffset') ) @pytest.mark.filterwarnings("ignore:The 'DicomDir'") class TestDicomDir: """Test dicomdir.DicomDir class""" @pytest.mark.parametrize("testfile", TEST_FILES) def test_read_file(self, testfile): """Test creation of DicomDir instance using filereader.read_file""" ds = dcmread(testfile) assert isinstance(ds, DicomDir) def test_invalid_sop_file_meta(self): """Test exception raised if SOP Class is not Media Storage Directory""" ds = dcmread(get_testdata_file('CT_small.dcm')) msg = r"SOP Class is not Media Storage Directory \(DICOMDIR\)" with pytest.raises(InvalidDicomError, match=msg): DicomDir("some_name", ds, b'\x00' * 128, ds.file_meta, True, True) def test_invalid_sop_no_file_meta(self, allow_reading_invalid_values): """Test exception raised if invalid sop class but no file_meta""" ds = dcmread(get_testdata_file('CT_small.dcm')) with pytest.raises(AttributeError, match="'DicomDir' object has no attribute " "'DirectoryRecordSequence'"): with pytest.warns(UserWarning, match=r"Invalid transfer syntax"): DicomDir("some_name", ds, b'\x00' * 128, None, True, True) @pytest.mark.parametrize("testfile", TEST_FILES) def test_parse_records(self, testfile): """Test DicomDir.parse_records""" ds = dcmread(testfile) assert hasattr(ds, 'patient_records') # There are two top level PATIENT records assert len(ds.patient_records) == 2 assert ds.patient_records[0].PatientName == 'Doe^Archibald' assert ds.patient_records[1].PatientName == 'Doe^Peter' def test_invalid_transfer_syntax(self, allow_reading_invalid_values): with pytest.warns(UserWarning, match='Invalid transfer syntax*'): dcmread(IMPLICIT_TEST_FILE) with pytest.warns(UserWarning, match='Invalid transfer syntax*'): dcmread(BIGENDIAN_TEST_FILE) def test_empty(self): """Test that an empty DICOMDIR can be read.""" ds = dcmread(get_testdata_file('DICOMDIR-empty.dcm')) assert [] == ds.DirectoryRecordSequence def test_invalid_transfer_syntax_strict_mode(self, enforce_valid_values): with pytest.raises(InvalidDicomError, match='Invalid transfer syntax*'): dcmread(IMPLICIT_TEST_FILE) with pytest.raises(InvalidDicomError, match='Invalid transfer syntax*'): dcmread(BIGENDIAN_TEST_FILE) def test_deprecation_warning(): msg = ( r"The 'DicomDir' class is deprecated and will be removed in v3.0, " r"after which 'dcmread\(\)' will return a normal 'FileDataset' " r"instance for 'Media Storage Directory' SOP Instances." ) with pytest.warns(DeprecationWarning, match=msg): ds = dcmread(TEST_FILE) pydicom-2.4.3/pydicom/tests/test_dictionary.py000066400000000000000000000147501446675437500216040ustar00rootroot00000000000000# 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) from pydicom.datadict import add_dict_entry, add_dict_entries from pydicom.tests.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' pydicom-2.4.3/pydicom/tests/test_encaps.py000066400000000000000000001452151446675437500207110ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. """Test for encaps.py""" from struct import unpack import pytest from pydicom import dcmread from pydicom.data import get_testdata_file from pydicom.encaps import ( generate_pixel_data_fragment, get_frame_offsets, get_nr_fragments, generate_pixel_data_frame, generate_pixel_data, decode_data_sequence, defragment_data, read_item, fragment_frame, itemise_frame, encapsulate, encapsulate_extended ) from pydicom.filebase import DicomBytesIO JP2K_10FRAME_NOBOT = get_testdata_file('emri_small_jpeg_2k_lossless.dcm') class TestGetFrameOffsets: """Test encaps.get_frame_offsets""" def test_bad_tag(self): """Test raises exception if no item tag.""" # (fffe,e100) bytestream = b'\xFE\xFF\x00\xE1' \ b'\x08\x00\x00\x00' \ b'\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 Table Offset item"): get_frame_offsets(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"): get_frame_offsets(fp) def test_zero_length(self): """Test reading BOT with zero length""" bytestream = b'\xFE\xFF\x00\xE0' \ b'\x00\x00\x00\x00' fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert (False, [0]) == get_frame_offsets(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]) == get_frame_offsets(fp) def test_single_frame(self): """Test reading single-frame BOT item""" bytestream = b'\xFE\xFF\x00\xE0' \ b'\x04\x00\x00\x00' \ b'\x00\x00\x00\x00' fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert (True, [0]) == get_frame_offsets(fp) def test_not_little_endian(self): """Test reading big endian raises exception""" bytestream = b'\xFE\xFF\x00\xE0' \ b'\x00\x00\x00\x00' fp = DicomBytesIO(bytestream) fp.is_little_endian = False with pytest.raises(ValueError, match="'fp.is_little_endian' must be True"): get_frame_offsets(fp) class TestGetNrFragments: """Test encaps.get_nr_fragments""" def test_item_undefined_length(self): """Test exception raised if item length undefined.""" bytestream = ( b'\xFE\xFF\x00\xE0' b'\xFF\xFF\xFF\xFF' b'\x00\x00\x00\x01' ) fp = DicomBytesIO(bytestream) fp.is_little_endian = True with pytest.raises(ValueError): get_nr_fragments(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 == get_nr_fragments(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): get_nr_fragments(fp) def test_single_fragment_no_delimiter(self): """Test single fragment is returned OK""" bytestream = b'\xFE\xFF\x00\xE0' \ b'\x04\x00\x00\x00' \ b'\x01\x00\x00\x00' fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert 1 == get_nr_fragments(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 == get_nr_fragments(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 == get_nr_fragments(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 == get_nr_fragments(fp) def test_not_little_endian(self): """Test reading big endian raises exception""" bytestream = b'\xFE\xFF\x00\xE0' \ b'\x04\x00\x00\x00' \ b'\x01\x00\x00\x00' fp = DicomBytesIO(bytestream) fp.is_little_endian = False with pytest.raises(ValueError, match="'fp.is_little_endian' must be True"): get_nr_fragments(fp) class TestGeneratePixelDataFragment: """Test encaps.generate_pixel_data_fragment""" def test_item_undefined_length(self): """Test exception raised if item length undefined.""" bytestream = b'\xFE\xFF\x00\xE0' \ b'\xFF\xFF\xFF\xFF' \ b'\x00\x00\x00\x01' fp = DicomBytesIO(bytestream) fp.is_little_endian = True fragments = generate_pixel_data_fragment(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 = generate_pixel_data_fragment(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 = generate_pixel_data_fragment(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' \ b'\x04\x00\x00\x00' \ b'\x01\x00\x00\x00' fp = DicomBytesIO(bytestream) fp.is_little_endian = True fragments = generate_pixel_data_fragment(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 = generate_pixel_data_fragment(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 = generate_pixel_data_fragment(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 = generate_pixel_data_fragment(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' \ b'\x04\x00\x00\x00' \ b'\x01\x00\x00\x00' fp = DicomBytesIO(bytestream) fp.is_little_endian = False fragments = generate_pixel_data_fragment(fp) with pytest.raises(ValueError, match="'fp.is_little_endian' must be True"): next(fragments) pytest.raises(StopIteration, next, fragments) class TestGeneratePixelDataFrames: """Test encaps.generate_pixel_data_frames""" 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 = generate_pixel_data_frame(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 = generate_pixel_data_frame(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 = generate_pixel_data_frame(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 = generate_pixel_data_frame(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 = generate_pixel_data_frame(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'\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 = generate_pixel_data_frame(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 = generate_pixel_data_frame(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 = generate_pixel_data_frame(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 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 = generate_pixel_data(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 = generate_pixel_data(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_nr_frames_raises(self): """Test parsing raises if not BOT and no nr_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 " r"encapsulated pixel data as the Basic Offset Table is empty " r"and `nr_frames` parameter is None" ) with pytest.raises(ValueError, match=msg): next(generate_pixel_data(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 = ( r"Unable to parse encapsulated pixel data as the Basic " r"Offset Table is empty and there are fewer fragments then " r"frames; the dataset may be corrupt" ) with pytest.raises(ValueError, match=msg): next(generate_pixel_data_frame(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 = generate_pixel_data(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 = generate_pixel_data(bytestream, 4) for ii in range(3): next(frames) msg = ( r"The end of the encapsulated pixel data has been " r"reached but one or more frame boundaries may have " r"been missed; please confirm that the generated frame " r"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 not 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 = ( r"The end of the encapsulated pixel data has been " r"reached but one or more frame boundaries may have " r"been missed; please confirm that the generated frame " r"data is correct" ) with pytest.warns(UserWarning, match=msg): ii = 0 for frames in generate_pixel_data(bytestream, 4): ii += 1 assert 3 == 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 = generate_pixel_data(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 = generate_pixel_data(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 = generate_pixel_data(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'\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 = generate_pixel_data(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 = generate_pixel_data(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 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 = decode_data_sequence(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 = decode_data_sequence(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 = decode_data_sequence(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 = decode_data_sequence(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 = decode_data_sequence(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 = decode_data_sequence(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 = decode_data_sequence(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 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 defragment_data(bytestream) == reference class TestReadItem: """Test encaps.read_item""" def test_item_undefined_length(self): """Test exception raised if item length undefined.""" bytestream = b'\xFE\xFF\x00\xE0' \ b'\xFF\xFF\xFF\xFF' \ b'\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"): read_item(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 read_item(fp) == b'\x01\x00\x00\x00' assert read_item(fp) is None assert read_item(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 read_item(fp) == b'\x01\x00\x00\x00' assert read_item(fp) is None assert read_item(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 read_item(fp) == b'\x01\x00\x00\x00' assert read_item(fp) == b'\xFF\x00\xFF\x00' assert read_item(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' \ b'\x04\x00\x00\x00' \ b'\x01\x00\x00\x00' fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert read_item(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 read_item(fp) == b'\x01\x00\x00\x00' assert read_item(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 read_item(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 read_item(fp) == b'\x01\x00\x00\x00' assert read_item(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.itemise_frame.""" def test_single_item(self): """Test encapsulating into one fragment""" bytestream = b'\xFE\xFF\x00\xE1' item_generator = itemise_frame(bytestream, nr_fragments=1) item = next(item_generator) assert item == ( b'\xfe\xff\x00\xe0' b'\x04\x00\x00\x00' b'\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 = itemise_frame(bytestream, nr_fragments=2) item = next(item_generator) assert item == ( b'\xfe\xff\x00\xe0' b'\x02\x00\x00\x00' b'\xFE\xFF' ) item = next(item_generator) assert item == ( b'\xfe\xff\x00\xe0' b'\x02\x00\x00\x00' b'\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 = decode_data_sequence(ds.PixelData) assert len(frames) == 10 data = encapsulate(frames, fragments_per_frame=1, has_bot=False) test_frames = decode_data_sequence(data) 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 = decode_data_sequence(ds.PixelData) assert len(frames) == 10 data = encapsulate(frames, fragments_per_frame=1, has_bot=True) test_frames = decode_data_sequence(data) for a, b in zip(test_frames, frames): assert a == b fp = DicomBytesIO(data) fp.is_little_endian = True length, offsets = get_frame_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 = decode_data_sequence(ds.PixelData) 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 data = 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 = decode_data_sequence(ds.PixelData) assert len(frames) == 10 out = encapsulate_extended(frames) # Pixel Data encapsulated OK assert isinstance(out[0], bytes) test_frames = decode_data_sequence(out[0]) 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])) pydicom-2.4.3/pydicom/tests/test_encoders.py000066400000000000000000001176231446675437500212440ustar00rootroot00000000000000"""Unit tests for the pydicom.encoders module and Dataset.compress().""" import pytest try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False try: import pylibjpeg HAVE_PYLJ = True except ImportError: HAVE_PYLJ = False try: import gdcm HAVE_GDCM = True except ImportError: HAVE_GDCM = False from pydicom.data import get_testdata_file from pydicom.dataset import Dataset from pydicom.encoders import RLELosslessEncoder from pydicom.encoders.base import Encoder from pydicom.pixel_data_handlers.util import get_expected_length from pydicom.uid import ( UID, RLELossless, ExplicitVRLittleEndian, JPEG2000MC, JPEG2000Lossless ) class TestEncoder: """Non-encoding tests for encoders.Encoder""" def setup_method(self): self.enc = Encoder(UID('1.2.3')) 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._defaults['byteorder'] assert uid == enc._defaults['transfer_syntax_uid'] def test_properties(self): """Test Encoder properties""" enc = Encoder(RLELossless) assert 'RLELosslessEncoder' == enc.name assert RLELossless == enc.UID assert not enc.is_available @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") def test_add_plugin_available(self): """Test adding an available plugin.""" assert not self.enc.is_available self.enc.add_plugin( "foo", ('pydicom.encoders.native', '_encode_frame') ) assert "foo" in self.enc._available assert {} == self.enc._unavailable assert self.enc.is_available @pytest.mark.skipif(HAVE_NP, reason="Numpy is available") def test_add_plugin_unavailable(self): """Test adding an unavailable plugin.""" enc = Encoder(RLELossless) assert not enc.is_available enc.add_plugin( "foo", ('pydicom.encoders.pylibjpeg', 'encode_pixel_data') ) assert enc._available == {} assert "foo" in enc._unavailable assert enc._unavailable["foo"] == ( "numpy", "pylibjpeg", "pylibjpeg-rle" ) assert not enc.is_available def test_add_plugin_module_import_failure(self): """Test a module import failure when adding a plugin.""" enc = Encoder(RLELossless) msg = r"No module named 'badpath'" with pytest.raises(ModuleNotFoundError, match=msg): enc.add_plugin("foo", ('badpath', '_encode_frame')) assert {} == enc._available assert {} == enc._unavailable @pytest.mark.skipif(not HAVE_NP, reason="Numpy is available") def test_add_plugin_function_missing(self): """Test encoding function missing when adding a plugin.""" enc = Encoder(RLELossless) msg = ( r"module 'pydicom.encoders.native' has no " r"attribute 'bad_function_name'" ) with pytest.raises(AttributeError, match=msg): enc.add_plugin( "foo", ('pydicom.encoders.native', 'bad_function_name'), ) assert {} == enc._available assert {} == enc._unavailable @pytest.mark.skipif(not HAVE_NP, reason="Numpy is unavailable") def test_add_plugin_twice(self): """Test adding a plugin that already exists.""" self.enc.add_plugin( "foo", ('pydicom.encoders.native', '_encode_frame') ) assert 'foo' in self.enc._available assert {} == self.enc._unavailable msg = r"'Encoder' already has a plugin named 'foo'" with pytest.raises(ValueError, match=msg): self.enc.add_plugin( "foo", ('pydicom.encoders.native', '_encode_frame') ) assert 'foo' in self.enc._available assert {} == self.enc._unavailable @pytest.mark.skipif(not HAVE_NP, reason="Numpy is unavailable") def test_remove_plugin(self): """Test removing a plugin.""" self.enc.add_plugin( "foo", ('pydicom.encoders.native', '_encode_frame') ) self.enc.add_plugin( "bar", ('pydicom.encoders.native', '_encode_frame') ) assert 'foo' in self.enc._available assert 'bar' in self.enc._available assert {} == self.enc._unavailable assert self.enc.is_available self.enc.remove_plugin("foo") assert 'bar' in self.enc._available assert self.enc.is_available self.enc.remove_plugin("bar") assert {} == self.enc._available assert not self.enc.is_available @pytest.mark.skipif(HAVE_NP, reason="Numpy is available") def test_remove_plugin_unavailable(self): """Test removing a plugin.""" enc = Encoder(RLELossless) enc.add_plugin( "foo", ('pydicom.encoders.pylibjpeg', 'encode_pixel_data') ) assert 'foo' in enc._unavailable assert {} == enc._available enc.remove_plugin("foo") assert {} == enc._unavailable def test_remove_plugin_raises(self): """Test removing a plugin that doesn't exist raises exception""" msg = r"Unable to remove 'foo', no such plugin" with pytest.raises(ValueError, match=msg): self.enc.remove_plugin('foo') def test_check_kwargs_missing(self): """Test _check_kwargs""" enc = Encoder(RLELossless) kwargs = { 'rows': 0, 'columns': 0, 'samples_per_pixel': 0, 'bits_allocated': 0, 'bits_stored': 0, 'pixel_representation': 0, 'number_of_frames': 0, 'photometric_interpretation': 'RGB' } assert enc._check_kwargs(kwargs) is None del kwargs['columns'] del kwargs['bits_allocated'] msg = r"Missing expected arguments: 'columns', 'bits_allocated'" with pytest.raises(TypeError, match=msg): enc._check_kwargs(kwargs) def test_kwargs_from_ds(self): """Test Encoder.kwargs_from_ds()""" # Note no NumberOfFrames element ds = Dataset() ds.Rows = 10 ds.Columns = 12 ds.SamplesPerPixel = 1 ds.BitsAllocated = 8 ds.BitsStored = 8 ds.PixelRepresentation = 0 ds.PhotometricInterpretation = 'RGB' enc = Encoder(RLELossless) kwargs = enc.kwargs_from_ds(ds) assert 1 == kwargs['number_of_frames'] assert enc._check_kwargs(kwargs) is None # Test conversion of empty *Number of Frames* ds.NumberOfFrames = None kwargs = enc.kwargs_from_ds(ds) assert 1 == kwargs['number_of_frames'] # Test already present *Number of Frames* is unaffected ds.NumberOfFrames = 10 kwargs = enc.kwargs_from_ds(ds) assert 10 == kwargs['number_of_frames'] # Test missing elements del ds.Columns del ds.BitsAllocated msg = ( r"The following required elements are missing from the dataset: " r"'Columns', 'BitsAllocated'" ) with pytest.raises(AttributeError, match=msg): enc.kwargs_from_ds(ds) # Test VM 0 ds.Columns = None ds.BitsAllocated = None msg = ( r"The following required dataset elements have a VM of 0: " r"'Columns', 'BitsAllocated'" ) with pytest.raises(AttributeError, match=msg): enc.kwargs_from_ds(ds) @pytest.mark.skipif(HAVE_NP, reason="Numpy available") def test_missing_dependencies(self): """Test the required encoder being unavailable.""" enc = RLELosslessEncoder s = enc.missing_dependencies assert s[0] == "gdcm - requires gdcm" assert ( s[1] == "pylibjpeg - requires numpy, pylibjpeg and pylibjpeg-rle" ) def test_invalid_profile_raises(self): """Test an invalid encoding profile raises exception.""" ds = get_testdata_file("rtdose_1frame.dcm", read=True) assert ds.BitsAllocated == 32 # Invalid for RLE Lossless msg = ( r"Unable to encode as one or more of 'photometric " r"interpretation', 'samples per pixel', 'bits allocated', 'bits " r"stored' or 'pixel representation' is not valid for 'RLE " r"Lossless'" ) with pytest.raises(ValueError, match=msg): ds.compress(RLELossless) def test_missing_no_dependencies(self): """Test an encoder with no dependencies being unavailable.""" enc = self.enc enc._unavailable['foo'] = () s = enc.missing_dependencies assert 'foo - plugin indicating it is unavailable' == s[0] def test_missing_one_dependency(self): """Test an encoder with one dependency being unavailable.""" enc = self.enc enc._unavailable['foo'] = ('bar', ) s = enc.missing_dependencies assert 'foo - requires bar' == s[0] @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") class TestEncoder_Encode: """Tests for Encoder.encode() 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 = self.enc.kwargs_from_ds(self.ds) 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, " rf"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, " rf"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 = ( r"Unable to encode as the actual length of the frame \(32767 " r"bytes\) is less than the expected length of 32768 bytes" ) 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, idx=0, encoding_plugin='pydicom', **self.kwargs ) assert len(out) == 21350 def test_bytes_multiframe_no_idx_raises(self): """Test encoding multiframe bytes without idx raises exception""" msg = r"The frame 'idx' is required for multi-frame pixel data" with pytest.raises(ValueError, match=msg): self.enc.encode(self.bytes * 2, **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, idx=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_idx_raises(self): """Test encoding a multiframe array without idx raises""" arr = np.stack((self.arr, self.arr)) assert arr.shape == (2, 128, 128) self.kwargs['number_of_frames'] = 2 msg = r"The frame 'idx' is required for multi-frame pixel data" with pytest.raises(ValueError, match=msg): self.enc.encode(arr, **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, idx=0) assert len(self.ds.PixelData) > len(out) def test_unc_dataset_multiframe_no_idx_raises(self): """Test encoding multiframe uncompressed dataset without idx raises""" assert not self.ds.file_meta.TransferSyntaxUID.is_compressed self.ds.NumberOfFrames = 2 self.ds.PixelData = self.ds.PixelData * 2 msg = r"The frame 'idx' 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) @pytest.mark.xfail(reason="Changing compression not implemented yet") def test_enc_dataset(self): """Test encoding a compressed dataset""" ds = self.ds_enc assert ds.file_meta.TransferSyntaxUID.is_compressed out = self.enc.encode(ds) uncompressed_len = get_expected_length(ds, 'bytes') assert uncompressed_len > len(out) @pytest.mark.xfail(reason="Changing compression not implemented yet") def test_enc_dataset_specific_enc(self): """Test encoding a compressed dataset with specified encoder plugin""" ds = self.ds_enc assert ds.file_meta.TransferSyntaxUID.is_compressed out = self.enc.encode(ds, encoding_plugin='pydicom') assert len(out) == 6154 @pytest.mark.xfail(reason="Changing compression not implemented yet") def test_enc_dataset_specific_dec(self): """Test encoding a compressed dataset with specified decoder plugin""" assert self.ds_enc.file_meta.TransferSyntaxUID.is_compressed out = self.enc.encode( self.ds_enc, encoding_plugin='pydicom', decoding_plugin='rle_handler' ) assert len(out) == 6154 @pytest.mark.xfail(reason="Changing compression not implemented yet") def test_enc_dataset_multiframe(self): """Test encoding a multiframe compressed dataset""" ds = self.ds_enc_mf assert ds.file_meta.TransferSyntaxUID.is_compressed out = self.enc.encode(ds, idx=0) uncompressed_len = get_expected_length(ds, 'bytes') assert uncompressed_len / ds.NumberOfFrames > len(out) @pytest.mark.xfail(reason="Changing compression not implemented yet") def test_enc_dataset_multiframe_no_idx_raises(self): """Test encoding a multiframe compressed dataset raises if no idx""" ds = self.ds_enc_mf assert ds.file_meta.TransferSyntaxUID.is_compressed msg = r"The frame 'idx' is required for multi-frame pixel data" with pytest.raises(ValueError, match=msg): self.enc.encode(ds) @pytest.mark.xfail(reason="Changing compression not implemented yet") def test_enc_iter_encode(self): """Test iter_encode with a compressed dataset""" assert self.ds_enc.file_meta.TransferSyntaxUID.is_compressed gen = self.enc.iter_encode( self.ds_enc, encoding_plugin='pydicom', decoding_plugin='rle_handler' ) out = next(gen) assert len(out) == 6154 with pytest.raises(StopIteration): next(gen) def test_dataset_missing_elem_raises(self): """Test encode raises if missing required element""" assert not self.ds.file_meta.TransferSyntaxUID.is_compressed del self.ds.Rows msg = r"required elements are missing from the dataset: 'Rows'" with pytest.raises(AttributeError, match=msg): self.enc.encode(self.ds) @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") class TestEncoder_Preprocess: """Tests for Encoder._preprocess().""" def setup_method(self): self.e = Encoder(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_invalid_arr_shape_raises(self): """Test that an array size and dataset mismatch raise exceptions""" # 1D arrays arr = np.asarray((1, 2, 3, 4)) msg = ( r"Unable to encode as the shape of the ndarray \(4,\) " r"doesn't match the values for the rows, columns and samples " r"per pixel" ) kwargs = self.e.kwargs_from_ds(self.ds) assert arr.shape == (4, ) with pytest.raises(ValueError, match=msg): self.e._preprocess(arr, **kwargs) # 2D arrays arr = np.asarray([[1, 2, 3, 4]]) assert arr.shape == (1, 4) msg = r"Unable to encode as the shape of the ndarray \(1, 4\) " with pytest.raises(ValueError, match=msg): self.e._preprocess(arr, **kwargs) self.ds.Rows = 2 self.ds.Columns = 2 self.ds.SamplesPerPixel = 3 arr = np.asarray([[1, 2], [3, 4]]) assert arr.shape == (2, 2) msg = r"Unable to encode as the shape of the ndarray \(2, 2\) " with pytest.raises(ValueError, match=msg): self.e._preprocess(arr, **kwargs) # 3D arrays self.ds.Rows = 3 arr = np.asarray([[[1, 2, 1], [3, 4, 1]]]) assert arr.shape == (1, 2, 3) msg = r"Unable to encode as the shape of the ndarray \(1, 2, 3\) " with pytest.raises(ValueError, match=msg): self.e._preprocess(arr, **kwargs) def test_invalid_arr_dtype_raises(self): """Test an invalid arr dtype raises exception.""" arr = np.asarray(('a', 'b', 'c')) msg = ( r"Unable to encode as the ndarray's dtype 'u2', 'u2', 'i2', 'i2', 'u4', 'u4', 'i4', 'i4', ' 1""" ds = get_testdata_file("SC_rgb_small_odd.dcm", read=True) del ds.PlanarConfiguration assert ds.SamplesPerPixel == 3 assert 'PlanarConfiguration' not in ds ds.compress(RLELossless, encoding_plugin='pydicom') assert ds.file_meta.TransferSyntaxUID == RLELossless assert ds.PlanarConfiguration == 1 @pytest.mark.skipif(not HAVE_NP, reason="Numpy is unavailable") def test_override_kwargs(self): """Test we can override using kwargs.""" ds = get_testdata_file("SC_rgb_small_odd.dcm", read=True) ref = ds.pixel_array del ds.PlanarConfiguration ds.SamplesPerPixel = 1 assert 'PlanarConfiguration' not in ds ds.compress( RLELossless, encoding_plugin='pydicom', samples_per_pixel=3 ) ds.SamplesPerPixel = 3 assert np.array_equal(ref, ds.pixel_array) pydicom-2.4.3/pydicom/tests/test_encoders_gdcm.py000066400000000000000000000232631446675437500222320ustar00rootroot00000000000000"""Generic tests for RLELosslessEncoder plugins.""" import pytest from pydicom import dcmread from pydicom.data import get_testdata_file from pydicom.encoders import RLELosslessEncoder from pydicom.encoders.gdcm import _rle_encode as gdcm_rle_encode from pydicom.pixel_data_handlers.rle_handler import _rle_decode_frame from pydicom.pixel_data_handlers.util 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, '= [3, 0, 10], reason="GDCM bug fixed") def test_cycle_u32_3s_1f_raises(self): """Test that 32-bit, 3 sample/px data raises exception.""" ds = dcmread(EXPL_32_3_1F) ref = ds.pixel_array assert ds.BitsAllocated == 32 assert ds.SamplesPerPixel == 3 enc = RLELosslessEncoder kwargs = enc.kwargs_from_ds(ds) msg = ( r"The 'gdcm' plugin is unable to RLE encode 32-bit, 3 samples/px " r"data with GDCM v3.0.9 or older" ) with pytest.raises(RuntimeError, match=msg): gdcm_rle_encode(ds.PixelData, **kwargs) def test_invalid_byteorder_raises(self): """Test that big endian source raises exception.""" ds = dcmread(EXPL_8_1_1F) enc = RLELosslessEncoder kwargs = enc.kwargs_from_ds(ds) msg = ( r"Unable to encode as an exception was raised by the 'gdcm' " r"plugin's encoding function" ) with pytest.raises(RuntimeError, match=msg): enc.encode( ds.PixelData, encoding_plugin='gdcm', byteorder='>', **kwargs ) def test_above_32bit_raises(self): """Test that > 32-bit Bits Allocated raises exception.""" ds = dcmread(EXPL_8_1_1F) enc = RLELosslessEncoder kwargs = enc.kwargs_from_ds(ds) kwargs['bits_allocated'] = 64 kwargs['columns'] = 100 msg = ( r"Unable to encode as an exception was raised by the 'gdcm' " r"plugin's encoding function" ) with pytest.raises(RuntimeError, match=msg): enc.encode(ds.PixelData, encoding_plugin='gdcm', **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, } msg = ( r"An error occurred with the 'gdcm' plugin: " r"unexpected number of fragments found in the 'Pixel Data'" ) with pytest.raises(RuntimeError, match=msg): gdcm_rle_encode(b'\x00', **kwargs) 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', 'transfer_syntax_uid': JPEG2000, } msg = ( r"An error occurred with the 'gdcm' plugin: " r"ImageChangeTransferSyntax.Change\(\) returned a failure result" ) with pytest.raises(RuntimeError, match=msg): gdcm_rle_encode(b'\x00', **kwargs) def test_invalid_photometric_interpretation_raises(self): """Test an invalid photometric interpretation raises exception""" # Its either that or having to debug users getting segfaults 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': RLELossless, } msg = ( r"An error occurred with the 'gdcm' plugin: invalid photometric " r"interpretation 'PALETTE_COLOR'" ) with pytest.raises(ValueError, match=msg): gdcm_rle_encode(b'\x00', **kwargs) pydicom-2.4.3/pydicom/tests/test_encoders_pydicom.py000066400000000000000000000376671446675437500230010ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. """Tests for the 'pydicom' encoder plugin.""" from struct import pack, unpack import sys 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 defragment_data from pydicom.encoders import RLELosslessEncoder from pydicom.encoders.native import ( _encode_frame, _encode_segment, _encode_row ) from pydicom.pixel_data_handlers.rle_handler import ( _rle_decode_frame, _rle_decode_segment ) from pydicom.pixel_data_handlers.rle_handler import rle_encode_frame from pydicom.pixel_data_handlers.util 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 = RLELosslessEncoder.kwargs_from_ds(ds) encoded = _encode_frame(ds.PixelData, **kwargs) 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 = RLELosslessEncoder.kwargs_from_ds(ds) encoded = _encode_frame(ds.PixelData, **kwargs) 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 = RLELosslessEncoder.kwargs_from_ds(ds) encoded = _encode_frame(ds.PixelData, **kwargs) decoded = _rle_decode_frame( encoded, ds.Rows, ds.Columns, ds.SamplesPerPixel, ds.BitsAllocated ) arr = np.frombuffer(decoded, ' 1 kwargs = RLELosslessEncoder.kwargs_from_ds(ds) msg = ( r"Unable to encode multiple frames at once, please encode one " r"frame at a time" ) with pytest.raises(ValueError, match=msg): rle_encode_frame(ds.pixel_array) def test_functional(self): """Test function works OK.""" ds = dcmread(EXPL_16_3_1F) ref = ds.pixel_array assert ds.BitsAllocated == 16 assert ds.SamplesPerPixel == 3 assert ds.PixelRepresentation == 0 encoded = rle_encode_frame(ref) decoded = _rle_decode_frame( encoded, ds.Rows, ds.Columns, ds.SamplesPerPixel, ds.BitsAllocated ) ds.PlanarConfiguration = 1 arr = np.frombuffer(decoded, '') assert id(arr) != id(ref) assert arr.dtype == '>u2' encoded = rle_encode_frame(arr) decoded = _rle_decode_frame( encoded, ds.Rows, ds.Columns, ds.SamplesPerPixel, ds.BitsAllocated ) ds.PlanarConfiguration = 1 arr = np.frombuffer(decoded, '' def test_context(self): """Test using DicomFileLike as a context""" with DicomFileLike(BytesIO(b'\x00\x01')) as fp: assert fp.parent_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.parent.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-2.4.3/pydicom/tests/test_filereader.py000066400000000000000000001757701446675437500215530ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. # -*- coding: utf-8 -*- """Unit tests for the pydicom.filereader module.""" import gzip import io from io import BytesIO 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 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, read_dicomdir, data_element_generator ) from pydicom.dataelem import DataElement, DataElement_from_raw 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 from pydicom.uid import ImplicitVRLittleEndian 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 # NOQA 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_delimeter_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() class TestReader: 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 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.is_implicit_VR = True file_ds.is_little_endian = True file_ds.save_as(fp, write_like_original=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_unkonwn_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.is_implicit_VR = True file_ds.is_little_endian = True file_ds.save_as(fp, write_like_original=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.is_implicit_VR = False file_ds.is_little_endian = True file_ds.save_as(fp, write_like_original=True) 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.is_implicit_VR = True file_ds.is_little_endian = True file_ds.save_as(fp, write_like_original=True) 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_delimeter_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 " r"instead" ) fp = BytesIO() file_ds = FileDataset(fp, ds) with pytest.warns(UserWarning, match=msg): file_ds.save_as(fp, write_like_original=True) 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, write_like_original=True) 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 or " "a file-like, but got None"): dcmread(None) with pytest.raises(TypeError, match="dcmread: Expected a file path or " "a file-like, 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")) 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, write_like_original=True) 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.is_little_endian = True ds.is_implicit_VR = True ds.PatientName = '' assert isinstance(ds.PatientName, pydicom.valuerep.PersonName) bs = DicomBytesIO() ds.save_as(bs) out = dcmread(bs, force=True) assert isinstance(ds[0x00100010].value, pydicom.valuerep.PersonName) 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.is_implicit_VR = True ds.is_little_endian = True 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, write_like_original=False) # 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 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) class TestReadDataElement: def setup_method(self): ds = Dataset() ds.DoubleFloatPixelData = ( b"\x00\x01\x02\x03\x04\x05\x06\x07" b"\x01\x01\x02\x03\x04\x05\x06\x07" ) # OD ds.SelectorOLValue = ( b"\x00\x01\x02\x03\x04\x05\x06\x07" b"\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" b"\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.is_implicit_VR = True file_ds.is_little_endian = True file_ds.save_as(self.fp, write_like_original=True) self.fp_ex = BytesIO() # Explicit little file_ds = FileDataset(self.fp_ex, ds) file_ds.is_implicit_VR = False file_ds.is_little_endian = True file_ds.save_as(self.fp_ex, write_like_original=True) 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" b"\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" b"\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" b"\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" b"\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, write_like_original=True) 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" b"\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" b"\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 @pytest.mark.skip("No public elements with VR of SV") 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(IOError): ds.PixelData def test_values_identical(self): """Deferred values exactly matches normal read.""" ds_norm = dcmread(self.testfile_name) 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 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.""" 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) 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 length of the pixel data in the dataset \(8130 bytes\) " r"doesn't match the expected length \(8192 bytes\). " r"The dataset may be corrupted or there may be an issue with " r"the pixel data handler." ) 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\x00" b"PN" b"\x06\x00" b"ABCDEF" fp = BytesIO(bytestream) # fp, is_implicit_VR, is_little_endian, gen = data_element_generator(fp, False, True) elem = DataElement(0x00100010, "PN", "ABCDEF") assert elem == DataElement_from_raw(next(gen), "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" b"\x06\x00\x00\x00" b"ABCDEF" fp = BytesIO(bytestream) gen = data_element_generator( fp, is_implicit_VR=True, is_little_endian=True ) elem = DataElement(0x00100010, "PN", "ABCDEF") assert elem == DataElement_from_raw(next(gen), "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\x10" b"PN" b"\x00\x06" b"ABCDEF" fp = BytesIO(bytestream) # fp, is_implicit_VR, is_little_endian, gen = data_element_generator(fp, False, False) elem = DataElement(0x00100010, "PN", "ABCDEF") assert elem == DataElement_from_raw(next(gen), "ISO_IR 100") def test_read_dicomdir_deprecated(): """Test deprecation warning for read_dicomdir().""" msg = ( r"'read_dicomdir\(\)' is deprecated and will be removed in v3.0, use " r"'dcmread\(\)' instead" ) with pytest.warns(DeprecationWarning, match=msg): ds = read_dicomdir(get_testdata_file("DICOMDIR")) def test_read_file_deprecated(): """Test deprecation warning for read_file().""" if sys.version_info[:2] < (3, 7): from pydicom.filereader import read_file else: msg = ( r"'read_file' is deprecated and will be removed in v3.0, use " r"'dcmread' instead" ) with pytest.warns(DeprecationWarning, match=msg): from pydicom.filereader import read_file assert read_file == dcmread pydicom-2.4.3/pydicom/tests/test_fileset.py000066400000000000000000003117461446675437500210770ustar00rootroot00000000000000 import os import sys from pathlib import Path import shutil from tempfile import TemporaryDirectory import pytest from pydicom import config, dcmread from pydicom.data import get_testdata_file from pydicom.dataset import Dataset, FileMetaDataset from pydicom.filebase import DicomBytesIO 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, BaseTag 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() @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): """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.parent.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" bottom.ReferencedFileID = [ "TINY_ALPHA", "PT000000", "ST000000", "SE000000", "IM000000" ] 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_bottom = 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 # Redo the record parsing to reflect changes ds.parse_records() 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(24): 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)) @pytest.mark.filterwarnings("ignore:The 'DicomDir'") 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 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 fs._instances[0].node._record.add_new(0x00080000, "UL", 128) fs._instances[0].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") fs = FileSet(ds) assert fs._instances[0].node._file_id == Path("01") 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 @pytest.mark.filterwarnings("ignore:The 'DicomDir'") 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']) / Path(instance.SOPInstanceUID) ) == 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 @pytest.mark.filterwarnings("ignore:The 'DicomDir'") 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 f"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 assert 398 == ( ds.OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity ) assert 398 == ( ds.OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity ) seq = ds.DirectoryRecordSequence assert 4 == len(seq) item = seq[0] assert item.seq_item_tell == 398 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 516 == item.OffsetOfReferencedLowerLevelDirectoryEntity item = seq[1] assert item.seq_item_tell == 516 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 704 == item.OffsetOfReferencedLowerLevelDirectoryEntity item = seq[2] assert item.seq_item_tell == 704 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 852 == item.OffsetOfReferencedLowerLevelDirectoryEntity item = seq[3] assert item.seq_item_tell == 852 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"as the instance is missing a required element or value. Either " r"update the instance, 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._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._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) fs.add(get_testdata_file("MR_small.dcm")) 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\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\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\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) @pytest.mark.filterwarnings("ignore:The 'DicomDir'") 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): fs = 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 " fr"\['{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""" with pytest.warns(UserWarning): 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.""" with pytest.warns(UserWarning): 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 @pytest.mark.filterwarnings("ignore:The 'DicomDir'") 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 "IM00001D" in instance.path def my_len(self): return 36**6 + 1 FileSet.__len__ = my_len fs = FileSet(ds) assert 36**6 + 1 == len(fs) msg = ( r"pydicom doesn't support writing File-sets with more than " r"2176782336 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) with pytest.warns(UserWarning): ds = dcmread(Path(fs.path) / "DICOMDIR") assert ImplicitVRLittleEndian == ds.file_meta.TransferSyntaxUID with pytest.warns(UserWarning): 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._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._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"as the instance is missing a required element or value. Either " r"update the instance, 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"as the instance is missing a required element or value. Either " r"update the instance, 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"as the instance is missing a required element or value. Either " r"update the instance, define your own record creation function " r"or use '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 elem = ds["DirectoryRecordSequence"] 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'] @pytest.mark.filterwarnings("ignore:The 'DicomDir'") 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 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 not ds.is_implicit_VR assert ds.is_little_endian 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.is_implicit_VR assert ds.is_little_endian 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 "IM00001D" in instance.path def my_len(self): return 36**6 + 1 FileSet.__len__ = my_len fs = FileSet(tiny) assert 36**6 + 1 == len(fs) msg = ( r"pydicom doesn't support writing File-sets with more than " r"2176782336 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.filterwarnings("ignore:The 'DicomDir'") @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.filterwarnings("ignore:The 'DicomDir'") @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-2.4.3/pydicom/tests/test_fileutil.py000066400000000000000000000016741446675437500212550ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. """Test suite for util functions""" from io import BytesIO from pathlib import Path import pytest from pydicom.fileutil import path_from_pathlike 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')) pydicom-2.4.3/pydicom/tests/test_filewriter.py000066400000000000000000003265021446675437500216140ustar00rootroot00000000000000# -*- coding: utf-8 -*- # 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 from pathlib import Path from platform import python_implementation from struct import unpack from tempfile import TemporaryFile import zlib 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 ( 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_OWvalue, writers, dcmwrite ) from pydicom.multival import MultiValue from pydicom.sequence import Sequence from pydicom.tests.test_helpers import assert_no_warning from pydicom.uid import ( ImplicitVRLittleEndian, ExplicitVRBigEndian, RLELossless, PYDICOM_IMPLEMENTATION_UID, CTImageStorage, ) from pydicom.util.hexutil import hex2bytes from pydicom.valuerep import 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__) 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, write_like_original=True) 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, write_like_original=True) 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, write_like_original=True) 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, write_like_original=True) 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, write_like_original=True) 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.is_little_endian = True ds.is_implicit_VR = True ds.add_new(0xFFFFFFFF, 'LO', '123456') ds.save_as(fp, write_like_original=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, write_like_original=True) 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.""" ds = Dataset() bs = BytesIO() msg = ( r"'Dataset.is_little_endian' and 'Dataset.is_implicit_VR' must " r"be set appropriately before saving" ) with pytest.raises(AttributeError, match=msg): dcmwrite(bs, ds) def test_write_encapsulated_mismatch_encoding(self): """Test writing encapsulated dataset warns if mismatched encoding""" ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = RLELossless ds.is_implicit_VR = True ds.is_little_endian = True bs = BytesIO() msg = ( r"All encapsulated \(compressed\) transfer syntaxes must use " r"explicit VR little endian encoding for the dataset. Set " r"'Dataset.is_little_endian = True' and 'Dataset." r"is_implicit_VR = False' before saving" ) with pytest.warns(UserWarning, match=msg): dcmwrite(bs, ds) 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, write_like_original=True) 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.parent.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' # tag b'\x00\x00\x00\x00' # 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' # tag b'\x04\x00\x00\x00' # length b'REG ') 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' \ b'\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' \ b'\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' \ b'\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' \ b'\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' \ b'\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' \ b'\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' \ b'\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.is_implicit_VR = False # 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.is_implicit_VR = True ds = correct_ambiguous_vr(deepcopy(ref_ds), True) assert b'\x01\x02' == ds.WaveformData assert 'OW' == ds[0x54001010].VR ref_ds.is_implicit_VR = False # 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.is_implicit_VR = 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.is_implicit_VR = False 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.is_little_endian = True ds.is_implicit_VR = True 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()) 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' ds.is_little_endian = True 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) ds.is_implicit_VR = False fp = BytesIO() ds.save_as(fp, write_like_original=True) ds = dcmread(fp, force=True) assert 'US' == ds.ModalityLUTSequence[0][0x00283002].VR ds = self.dataset_with_modality_lut_sequence(pixel_repr=1) ds.is_implicit_VR = False fp = BytesIO() ds.save_as(fp, write_like_original=True) 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) ds.is_implicit_VR = False fp = BytesIO() ds.save_as(fp, write_like_original=True) ds = dcmread(fp, force=True) assert 'US' == ds[0x00283000][0][0x00283002].VR ds = self.dataset_with_modality_lut_sequence(pixel_repr=1) ds.is_implicit_VR = False fp = BytesIO() ds.save_as(fp, write_like_original=True) 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) ds.is_implicit_VR = True fp = BytesIO() ds.save_as(fp, write_like_original=True) ds = dcmread(fp, force=True) assert 'US' == ds.ModalityLUTSequence[0][0x00283002].VR ds = self.dataset_with_modality_lut_sequence(pixel_repr=1) ds.is_implicit_VR = True fp = BytesIO() ds.save_as(fp, write_like_original=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) ds.is_implicit_VR = True fp = BytesIO() ds.save_as(fp, write_like_original=True) ds = dcmread(fp, force=True) assert 'US' == ds[0x00283000][0][0x00283002].VR ds = self.dataset_with_modality_lut_sequence(pixel_repr=1) ds.is_implicit_VR = True fp = BytesIO() ds.save_as(fp, write_like_original=True) ds = dcmread(fp, force=True) assert 'SS' == ds[0x00283000][0][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.is_implicit_VR = False file_ds.is_little_endian = True file_ds.save_as(fp, write_like_original=True) fp.seek(0) ds = read_dataset(fp, False, True, parent_encoding='latin1') assert 256 == ds.SmallestValidPixelValue assert 'US' == ds[0x00280104].VR assert not ds.read_implicit_vr assert ds.read_little_endian 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 ref_ds = Dataset() ref_ds.PixelRepresentation = 1 ref_ds.SmallestValidPixelValue = b'\x00\x01' # Big endian 1 ref_ds.SpecificCharacterSet = b'ISO_IR 192' fp = BytesIO() file_ds = FileDataset(fp, ref_ds) file_ds.is_implicit_VR = False file_ds.is_little_endian = False file_ds.save_as(fp, write_like_original=True) fp.seek(0) ds = read_dataset(fp, False, False) assert 1 == ds.SmallestValidPixelValue assert 'SS' == ds[0x00280104].VR assert not ds.read_implicit_vr assert not ds.read_little_endian 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, write_like_original=True) 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 TestWriteToStandard: """Unit tests for writing datasets to the DICOM standard""" 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, write_like_original=False) 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, write_like_original=False) 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, write_like_original=False) fp.seek(0) assert fp.read(128) == b'\x00' * 128 def test_none_preamble(self): """Test that a default preamble is written when None.""" fp = DicomBytesIO() ds = dcmread(ct_name) ds.preamble = None ds.save_as(fp, write_like_original=False) 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) ds.preamble = b'\x00' * 127 with pytest.raises(ValueError): ds.save_as(DicomBytesIO(), write_like_original=False) ds.preamble = b'\x00' * 129 with pytest.raises(ValueError): ds.save_as(DicomBytesIO(), write_like_original=False) 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 " "or a file-like, but got None"): ds.save_as(None) with pytest.raises(TypeError, match="dcmwrite: Expected a file path " "or a file-like, but got int"): ds.save_as(42) def test_prefix(self): """Test that the 'DICM' prefix is written with preamble.""" # Has preamble fp = DicomBytesIO() ds = dcmread(ct_name) ds.preamble = b'\x00' * 128 ds.save_as(fp, write_like_original=False) fp.seek(128) assert fp.read(4) == b'DICM' def test_prefix_none(self): """Test the 'DICM' prefix is written when preamble is None""" fp = DicomBytesIO() ds = dcmread(ct_name) ds.preamble = None ds.save_as(fp, write_like_original=False) fp.seek(128) assert fp.read(4) == b'DICM' def test_ds_changed(self): """Test writing the dataset changes its file_meta.""" ds = dcmread(rtplan_name) ref_ds = dcmread(rtplan_name) for ref_elem, test_elem in zip(ref_ds.file_meta, ds.file_meta): assert ref_elem == test_elem ds.save_as(DicomBytesIO(), write_like_original=False) assert ref_ds.file_meta != ds.file_meta del ref_ds.file_meta del ds.file_meta # Ensure no RawDataElements in ref_ds and ds for _ in ref_ds: pass for _ in ds: pass assert ref_ds == ds 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 ds.save_as(DicomBytesIO(), write_like_original=False) # 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 ds.save_as(DicomBytesIO(), write_like_original=False) # 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) ds.is_implicit_VR = False ds.file_meta.TransferSyntaxUID = '1.2.840.10008.1.2.1' fp = DicomBytesIO() ds.save_as(fp, write_like_original=False) fp.seek(0) ds_out = dcmread(fp) ds_explicit = dcmread(mr_name) for elem_in, elem_out in zip(ds_explicit, ds_out): assert elem_in == elem_out 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_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) ds.is_implicit_VR = False ds.file_meta.TransferSyntaxUID = '1.2.840.10008.1.2.1' fp = DicomBytesIO() fp.is_implicit_VR = False fp.is_little_endian = True ds.save_as(fp, write_like_original=False) fp.seek(0) ds_out = dcmread(fp) 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) ds.is_implicit_VR = True ds.file_meta.TransferSyntaxUID = uid.ImplicitVRLittleEndian fp = DicomBytesIO() ds.save_as(fp, write_like_original=False) fp.seek(0) ds_out = dcmread(fp) ds_implicit = dcmread(mr_implicit_name) for elem_in, elem_out in zip(ds_implicit, ds_out): assert elem_in == elem_out def test_convert_big_to_little_endian(self): # make sure conversion from big to little endian works # except for pixel data ds = dcmread(mr_bigendian_name) ds.is_little_endian = True ds.file_meta.TransferSyntaxUID = uid.ExplicitVRLittleEndian fp = DicomBytesIO() ds.save_as(fp, write_like_original=False) fp.seek(0) ds_out = dcmread(fp) ds_explicit = dcmread(mr_name) # pixel data is not converted automatically 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_endian(self): # make sure conversion from little to big endian works # except for pixel data ds = dcmread(mr_name) ds.is_little_endian = False ds.file_meta.TransferSyntaxUID = uid.ExplicitVRBigEndian fp = DicomBytesIO() ds.save_as(fp, write_like_original=False) fp.seek(0) ds_out = dcmread(fp) ds_explicit = dcmread(mr_bigendian_name) # pixel data is not converted automatically 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_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() ds.save_as(fp, write_like_original=False) 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_transfer_syntax_added(self): """Test TransferSyntaxUID is added/updated if possible.""" # Only done for ImplVR LE and ExplVR BE # Added ds = dcmread(rtplan_name) ds.is_implicit_VR = True ds.is_little_endian = True ds.save_as(DicomBytesIO(), write_like_original=False) assert ds.file_meta.TransferSyntaxUID == ImplicitVRLittleEndian # Updated ds.is_implicit_VR = False ds.is_little_endian = False ds.save_as(DicomBytesIO(), write_like_original=False) assert ds.file_meta.TransferSyntaxUID == ExplicitVRBigEndian 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) ds_orig.is_implicit_VR = True ds_orig.is_little_endian = True fp = DicomBytesIO() ds_orig.save_as(fp, write_like_original=False) fp.seek(0) ds_impl = dcmread(fp) # convert the dataset back to explicit VR - private tag VR now unknown ds_impl.is_implicit_VR = False ds_impl.is_little_endian = True ds_impl.file_meta.TransferSyntaxUID = uid.ExplicitVRLittleEndian fp = DicomBytesIO() ds_impl.save_as(fp, write_like_original=False) fp.seek(0) ds_expl = dcmread(fp) 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) ds_orig.is_implicit_VR = True ds_orig.is_little_endian = True fp = DicomBytesIO() ds_orig.save_as(fp, write_like_original=False) fp.seek(0) ds_impl = dcmread(fp) 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.is_implicit_VR = False ds_impl.is_little_endian = True ds_impl.file_meta.TransferSyntaxUID = uid.ExplicitVRLittleEndian fp = DicomBytesIO() ds_impl.save_as(fp, write_like_original=False) fp.seek(0) # used to raise, see #620 ds_expl = dcmread(fp) for elem_orig, elem_conv in zip(ds_orig, ds_expl): assert elem_orig.value == elem_conv.value def test_transfer_syntax_not_added(self): """Test TransferSyntaxUID is not added if ExplVRLE.""" ds = dcmread(rtplan_name) del ds.file_meta.TransferSyntaxUID ds.is_implicit_VR = False ds.is_little_endian = True with pytest.raises(ValueError): ds.save_as(DicomBytesIO(), write_like_original=False) assert 'TransferSyntaxUID' not in ds.file_meta def test_transfer_syntax_raises(self): """Test TransferSyntaxUID is raises NotImplementedError if ImplVRBE.""" ds = dcmread(rtplan_name) ds.is_implicit_VR = True ds.is_little_endian = False with pytest.raises(NotImplementedError): ds.save_as(DicomBytesIO(), write_like_original=False) def test_media_storage_sop_class_uid_added(self): """Test MediaStorageSOPClassUID and InstanceUID are added.""" fp = DicomBytesIO() ds = Dataset() ds.is_little_endian = True ds.is_implicit_VR = True ds.SOPClassUID = CTImageStorage ds.SOPInstanceUID = '1.2.3' ds.save_as(fp, write_like_original=False) assert ds.file_meta.MediaStorageSOPClassUID == CTImageStorage assert ds.file_meta.MediaStorageSOPInstanceUID == '1.2.3' def test_write_no_file_meta(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, write_like_original=False) 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, write_like_original=False) 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_raise_no_file_meta(self): """Test exception is raised if trying to write with no file_meta.""" ds = dcmread(rtplan_name) del ds.SOPInstanceUID ds.file_meta = FileMetaDataset() with pytest.raises(ValueError): ds.save_as(DicomBytesIO(), write_like_original=False) del ds.file_meta with pytest.raises(ValueError): ds.save_as(DicomBytesIO(), write_like_original=False) def test_add_file_meta(self): """Test that file_meta is added if it doesn't exist""" fp = DicomBytesIO() ds = Dataset() ds.is_little_endian = True ds.is_implicit_VR = True ds.SOPClassUID = CTImageStorage ds.SOPInstanceUID = '1.2.3' ds.save_as(fp, write_like_original=False) assert isinstance(ds.file_meta, Dataset) def test_standard(self): """Test preamble + file_meta + dataset written OK.""" fp = DicomBytesIO() ds = dcmread(ct_name) preamble = ds.preamble[:] ds.save_as(fp, write_like_original=False) fp.seek(0) assert fp.read(128) == preamble assert fp.read(4) == b'DICM' fp.seek(0) ds_out = dcmread(fp) assert ds_out.preamble == preamble assert 'PatientID' in ds_out assert 'TransferSyntaxUID' in ds_out.file_meta def test_commandset_no_written(self): """Test that Command Set elements aren't written.""" fp = DicomBytesIO() ds = dcmread(ct_name) preamble = ds.preamble[:] ds.MessageID = 3 ds.save_as(fp, write_like_original=False) fp.seek(0) assert fp.read(128) == preamble assert fp.read(4) == b'DICM' assert 'MessageID' in ds fp.seek(0) ds_out = dcmread(fp) assert ds_out.preamble == preamble assert 'PatientID' in ds_out assert 'TransferSyntaxUID' in ds_out.file_meta assert 'MessageID' not in ds_out 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() with pytest.raises(ValueError): write_file_meta_info(fp, meta) meta.MediaStorageSOPClassUID = '1.1' with pytest.raises(ValueError): write_file_meta_info(fp, meta) meta.MediaStorageSOPInstanceUID = '1.2' with pytest.raises(ValueError): 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 IOError""" fp = DicomBytesIO() fp.is_little_endian = True elem = DataElement(0x00100010, 'US', b'\x00') fmt = 'H' with pytest.raises(IOError, 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' class TestWriteOtherVRs: """Tests for writing the 'O' VRs like OB, OW, OF, etc.""" 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() fp.is_little_endian = True fp.is_implicit_VR = False ds = Dataset() ds.is_little_endian = True ds.is_implicit_VR = False ds.FloatPixelData = b'\x00\x01\x02\x03' ds.save_as(fp) 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' b'\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' b'\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' b'\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' b'\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 def test_little_endian_incorrect_data(self): """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', b'\xff\xff\x00\xe0' b'\x00\x01\x02\x03' b'\xfe\xff\xdd\xe0', is_undefined_length=True) msg = ( r"Pixel Data has an undefined length indicating " r"that it's compressed, but the data isn't encapsulated" ) with pytest.raises(ValueError, match=msg): write_data_element(self.fp, pixel_data) def test_big_endian_incorrect_data(self): """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', b'\x00\x00\x00\x00' b'\x00\x01\x02\x03' b'\xff\xfe\xe0\xdd', is_undefined_length=True) msg = ( r"Pixel Data has an undefined length indicating " r"that it's compressed, but the data isn't encapsulated" ) 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, write_like_original=False) 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) pydicom-2.4.3/pydicom/tests/test_gdcm_pixel_data.py000066400000000000000000000543361446675437500225470ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. # -*- coding: utf-8 -*- """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 defragment_data from pydicom.pixel_data_handlers import numpy_handler, gdcm_handler from pydicom.pixel_data_handlers.util import ( _convert_YBR_FULL_to_RGB, 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.unicode_filename = os.path.join( tempfile.gettempdir(), "ДИКОМ.dcm") shutil.copyfile(jpeg_ls_lossless_name, self.unicode_filename) self.jpeg_ls_lossless = dcmread(self.unicode_filename) self.mr_small = dcmread(mr_name) self.emri_jpeg_ls_lossless = dcmread(emri_jpeg_ls_lossless) self.emri_small = dcmread(emri_name) 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 os.remove(self.unicode_filename) 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.mr_small = dcmread(mr_name) self.emri_jpeg_2k_lossless = dcmread(emri_jpeg_2k_lossless) self.emri_small = dcmread(emri_name) self.sc_rgb_jpeg2k_gdcm_KY = dcmread(sc_rgb_jpeg2k_gdcm_KY) 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.color_3d_jpeg = dcmread(color_3d_jpeg_baseline) 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.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): return dcmread(jpeg2000_name) @pytest.fixture def jpeg_2k_lossless(self): return dcmread(jpeg2000_lossless_name) @pytest.fixture(scope='class') def mr_small(self): return dcmread(mr_name) @pytest.fixture(scope='class') def emri_small(self): return dcmread(emri_name) @pytest.fixture def emri_jpeg_ls_lossless(self): return dcmread(emri_jpeg_ls_lossless) @pytest.fixture def emri_jpeg_2k_lossless(self): return dcmread(emri_jpeg_2k_lossless) @pytest.fixture def color_3d_jpeg(self): return dcmread(color_3d_jpeg_baseline) @pytest.fixture def jpeg_lossy(self): return dcmread(jpeg_lossy_name) @pytest.fixture def jpeg_lossless(self): return dcmread(jpeg_lossless_name) @pytest.fixture def jpeg_lossless_odd_data_size(self): return dcmread(jpeg_lossless_odd_data_size_name) 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 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) 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) assert 1 == ds.PixelRepresentation assert 13 == ds.BitsStored bs = defragment_data(ds.PixelData) 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() ) 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-2.4.3/pydicom/tests/test_handler_util.py000066400000000000000000002635751446675437500221240ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Tests for the pixel_data_handlers.util module.""" import os import random from struct import unpack, pack from sys import byteorder import pytest from pydicom.tests.test_helpers import assert_no_warning try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False from pydicom import dcmread, config from pydicom.data import get_testdata_file, get_palette_files from pydicom.dataset import Dataset, FileMetaDataset from pydicom.pixel_data_handlers.util import ( dtype_corrected_for_endianness, reshape_pixel_array, convert_color_space, pixel_dtype, get_expected_length, apply_color_lut, _expand_segmented_lut, apply_modality_lut, apply_voi_lut, get_j2k_parameters, get_nr_frames, apply_voi, apply_windowing, pack_bits, unpack_bits, expand_ybr422, ) from pydicom.uid import ( ExplicitVRLittleEndian, ImplicitVRLittleEndian, UncompressedPixelTransferSyntaxes, ) # 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") # 1/1, 1 sample/pixel, 3 frame EXPL_1_1_3F = get_testdata_file("liver.dcm") # Uncompressed YBR_FULL_422 EXPL_8_3_1F_YBR422 = get_testdata_file('SC_ybr_full_422_uncompressed.dcm') # Tests with Numpy unavailable @pytest.mark.skipif(HAVE_NP, reason='Numpy is available') class TestNoNumpy: """Tests for the util functions without numpy.""" def test_pixel_dtype_raises(self): """Test that pixel_dtype raises exception without numpy.""" with pytest.raises(ImportError, match="Numpy is required to determine the dtype"): pixel_dtype(None) def test_reshape_pixel_array_raises(self): """Test that reshape_pixel_array raises exception without numpy.""" with pytest.raises(ImportError, match="Numpy is required to reshape"): reshape_pixel_array(None, None) # Tests with Numpy available 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(not HAVE_NP, reason="Numpy is not available") class TestNumpy_PixelDtype: """Tests for util.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 # < is little, = is native, > is big if byteorder == 'little': self.ds.is_little_endian = True assert pixel_dtype(self.ds).byteorder in ['<', '='] self.ds.is_little_endian = False assert pixel_dtype(self.ds).byteorder == '>' elif byteorder == 'big': self.ds.is_little_endian = True assert pixel_dtype(self.ds).byteorder == '<' self.ds.is_little_endian = False assert pixel_dtype(self.ds).byteorder in ['>', '='] 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] ), '1frame_3sample_0config': 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] ), '1frame_3sample_1config': 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] ), '2frame_3sample_0config': 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] ), '2frame_3sample_1config': 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] ) } @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestNumpy_ReshapePixelArray: """Tests for util.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 UncompressedPixelTransferSyntaxes: 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_raises(self): """Test an invalid Number of Frames value raises exception.""" self.ds.SamplesPerPixel = 1 self.ds.NumberOfFrames = 0 # Need to escape brackets with pytest.raises(ValueError, 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']) @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestNumpy_ConvertColourSpace: """Tests for util.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(None, '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(None, '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)) 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, :]) @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) 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 util.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') @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestNumpy_ModalityLUT: """Tests for util.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.""" ds = dcmread(MOD_16_SEQ) seq = ds.ModalityLUTSequence[0] assert [4096, -2048, 16] == seq.LUTDescriptor arr = ds.pixel_array assert -2048 == arr.min() assert 4095 == arr.max() out = apply_modality_lut(arr, ds) # IV > 2047 -> LUT[4095] mapped_pixels = arr > 2047 assert seq.LUTData[-1] == out[mapped_pixels][0] assert (seq.LUTData[-1] == out[mapped_pixels]).all() assert out.flags.writeable assert out.dtype == np.uint16 assert [65535, 65535, 49147, 49147, 65535] == list(out[0, 50:55]) assert [65535, 65535, 65535, 65535, 65535] == list(out[50, 50:55]) assert [65535, 65535, 65535, 65535, 65535] == list(out[100, 50:55]) assert [65535, 65535, 49147, 49147, 65535] == list(out[150, 50:55]) assert [65535, 65535, 49147, 49147, 65535] == 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.is_little_endian is 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 4095 == arr.max() out = apply_modality_lut(arr, ds) # IV > 2047 -> LUT[4095] mapped_pixels = arr > 2047 assert 65535 == out[mapped_pixels][0] assert (65535 == out[mapped_pixels]).all() assert out.flags.writeable assert out.dtype == np.uint16 assert [65535, 65535, 49147, 49147, 65535] == list(out[0, 50:55]) assert [65535, 65535, 65535, 65535, 65535] == list(out[50, 50:55]) assert [65535, 65535, 65535, 65535, 65535] == list(out[100, 50:55]) assert [65535, 65535, 49147, 49147, 65535] == list(out[150, 50:55]) assert [65535, 65535, 49147, 49147, 65535] == 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] @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestNumpy_PaletteColor: """Tests for util.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_litle(self): """Test uint16 Pixel Data with 16-bit LUT entries.""" 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() 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 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, :]) 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 TestNumpy_ExpandSegmentedLUT: """Tests for util._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 = '<{}B'.format(len(bs)) data = unpack(fmt, bs) out = _expand_segmented_lut(data, fmt) assert [255] * 256 == out bs = ds.SegmentedGreenPaletteColorLookupTableData fmt = '<{}B'.format(len(bs)) data = unpack(fmt, bs) out = _expand_segmented_lut(data, fmt) assert list(range(0, 256)) == out bs = ds.SegmentedBluePaletteColorLookupTableData fmt = '<{}B'.format(len(bs)) 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 = '<{}B'.format(len(bs)) data = unpack(fmt, bs) out = _expand_segmented_lut(data, fmt) assert [0] * 256 == out bs = ds.SegmentedGreenPaletteColorLookupTableData fmt = '<{}B'.format(len(bs)) 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 = '<{}B'.format(len(bs)) 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 = '<{}B'.format(len(bs)) data = unpack(fmt, bs) out = _expand_segmented_lut(data, fmt) assert [255] * 256 == out bs = ds.SegmentedGreenPaletteColorLookupTableData fmt = '<{}B'.format(len(bs)) data = unpack(fmt, bs) out = _expand_segmented_lut(data, fmt) assert list(range(255, -1, -1)) == out bs = ds.SegmentedBluePaletteColorLookupTableData fmt = '<{}B'.format(len(bs)) 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 = '<{}B'.format(len(bs)) 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 = '<{}B'.format(len(bs)) data = unpack(fmt, bs) out = _expand_segmented_lut(data, fmt) assert list(range(0, 256)) == out bs = ds.SegmentedBluePaletteColorLookupTableData fmt = '<{}B'.format(len(bs)) 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 TestNumpy_ApplyWindowing: """Tests for util.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 4095 == 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 TestNumpy_ApplyVOI: """Tests for util.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 " r"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.is_little_endian = True ds.is_explicit_VR = 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() @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestNumpy_ApplyVOILUT: """Tests for util.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() 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"] # Unsigned for ii in range(7, 16): params = get_j2k_parameters(base + bytes([ii])) assert ii + 1 == params["precision"] assert not params["is_signed"] 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) 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_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 TestNumpy_PackBits: """Tests for numpy_handler.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 = dcmread(EXPL_1_1_3F) 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: def test_8bit(self): """Test 8-bit expansion.""" ds = dcmread(EXPL_8_3_1F_YBR422) assert ds.PhotometricInterpretation == 'YBR_FULL_422' 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 = dcmread(EXPL_8_3_1F_YBR422) 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, :]) pydicom-2.4.3/pydicom/tests/test_helpers.py000066400000000000000000000006521446675437500210750ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Helper functions for tests.""" import warnings from contextlib import contextmanager from typing 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-2.4.3/pydicom/tests/test_jpeg_ls_pixel_data.py000066400000000000000000000236611446675437500232550ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Unit tests for the JPEG-LS Pixel Data handler.""" import os import sys import pytest import pydicom from pydicom.filereader import dcmread from pydicom.data import get_testdata_file jpeg_ls_missing_message = ("jpeg_ls is not available " "in this test environment") jpeg_ls_present_message = "jpeg_ls is being tested" from pydicom.pixel_data_handlers import numpy_handler have_numpy_handler = numpy_handler.is_available() from pydicom.pixel_data_handlers import jpeg_ls_handler 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.mr_small = dcmread(mr_name) self.emri_jpeg_ls_lossless = dcmread(emri_jpeg_ls_lossless) self.emri_small = dcmread(emri_name) 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_lossless = dcmread(jpeg2000_lossless_name) self.mr_small = dcmread(mr_name) self.emri_jpeg_2k_lossless = dcmread(emri_jpeg_2k_lossless) self.emri_small = dcmread(emri_name) 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.color_3d_jpeg = dcmread(color_3d_jpeg_baseline) 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.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.mr_small = dcmread(mr_name) self.emri_jpeg_ls_lossless = dcmread(emri_jpeg_ls_lossless) self.emri_small = dcmread(emri_name) 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 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_lossless = dcmread(jpeg2000_lossless_name) self.mr_small = dcmread(mr_name) self.emri_jpeg_2k_lossless = dcmread(emri_jpeg_2k_lossless) self.emri_small = dcmread(emri_name) 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.color_3d_jpeg = dcmread(color_3d_jpeg_baseline) 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.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-2.4.3/pydicom/tests/test_json.py000066400000000000000000000464511446675437500204130ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright 2008-2019 pydicom authors. See LICENSE file for details. import json from unittest import mock import pytest 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 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' b'\x01\x01\x02\x03\x04\x05\x06\x07') ds.add_new(0x00091006, 'OL', b'\x00\x01\x02\x03\x04\x05\x06\x07' b'\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): """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 ) ds_json = ds.to_json_dict(suppress_invalid_tags=True) assert "00082128" not in ds_json 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_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 type(ds_json['0009100B']['Value'][0]) == int assert type(ds_json['0009100C']['Value'][0]) == int assert type(ds_json['0009100D']['Value'][0]) == int assert type(ds_json['0009100E']['Value'][0]) == int assert type(ds_json['0009100F']['Value'][0]) == float assert type(ds_json['00091010']['Value'][0]) == float assert type(ds_json['00091014']['Value'][0]) == int assert type(ds_json['00091015']['Value'][0]) == float assert type(ds_json['00091102']['Value'][0]) == int pydicom-2.4.3/pydicom/tests/test_misc.py000066400000000000000000000034571446675437500203740ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Tests for misc.py""" import os import pytest from pydicom.data import get_testdata_file from pydicom.misc import is_dicom, size_in_bytes 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(IOError): 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') pydicom-2.4.3/pydicom/tests/test_multival.py000066400000000000000000000131051446675437500212650ustar00rootroot00000000000000# 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 from pydicom.valuerep import DS, DSfloat, DSdecimal, IS 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 testLimits(self): """MultiValue: Raise error if any item outside DICOM limits....""" with pytest.raises(OverflowError): MultiValue(IS, [1, -2 ** 31 - 1], validation_mode=config.RAISE) # Overflow error not raised for IS out of DICOM valid range 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 testExtend(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] 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 pydicom-2.4.3/pydicom/tests/test_numpy_pixel_data.py000066400000000000000000001457421446675437500230070ustar00rootroot00000000000000# 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 """ from copy import deepcopy 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.pixel_data_handlers.util 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, pack_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) for uid in AllTransferSyntaxes: ds.file_meta.TransferSyntaxUID = uid with pytest.raises(NotImplementedError, match="UID of '{}'".format(uid)): ds.pixel_array def test_using_numpy_handler_raises(self): ds = dcmread(EXPL_16_1_1F) msg = ("The pixel data handler 'numpy' is not available on your " "system. Please refer to the pydicom documentation*") with pytest.raises(RuntimeError, 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) for uid in UNSUPPORTED_SYNTAXES: ds.file_meta.TransferSyntaxUID = uid with pytest.raises(NotImplementedError, match="UID of '{}'".format(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) 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) 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) 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) # 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) 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) # 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) ds.decompress(handler_name) assert (600, 800) == ds.pixel_array.shape assert 244 == ds.pixel_array[0].min() == ds.pixel_array[0].max() assert (1, 246, 1) == tuple(ds.pixel_array[300, 491:494]) assert 0 == ds.pixel_array[-1].min() == ds.pixel_array[-1].max() def test_pixel_array_16bit_un_signed(self): """Test pixel_array for 16-bit unsigned -> signed.""" ds = dcmread(EXPL_16_3_1F) # 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) # 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) 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) 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) for uid in SUPPORTED_SYNTAXES: ds.file_meta.TransferSyntaxUID = uid arr = ds.pixel_array 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) 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) 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) 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) 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) 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) 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() @pytest.mark.skip(reason='No suitable dataset available') def test_little_1bit_3sample_1frame(self): """Test pixel_array for little 1-bit, 3 sample/pixel, 1 frame.""" # Check all little endian syntaxes ds = dcmread(None) for uid in SUPPORTED_SYNTAXES[:3]: ds.file_meta.TransferSyntaxUID = uid arr = ds.pixel_array @pytest.mark.skip(reason='No suitable dataset available') def test_little_1bit_3sample_10frame(self): """Test pixel_array for little 1-bit, 3 sample/pixel, 10 frame.""" # Check all little endian syntaxes ds = dcmread(None) for uid in SUPPORTED_SYNTAXES[:3]: ds.file_meta.TransferSyntaxUID = uid arr = ds.pixel_array 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) 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) 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) 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) 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) 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) 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) 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) 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) 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.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.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.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.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) assert ds.file_meta.TransferSyntaxUID == ExplicitVRBigEndian ref = dcmread(little) 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.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) 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) 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) delattr(ds, attr) msg = ( r"Unable to convert the pixel data as the following required " r"elements are missing from the dataset: {}".format(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) 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) 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.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.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.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) # 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) # 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) 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) 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) 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) 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) 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.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.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) data1 = ds1.pixel_array ds2 = dcmread(EXPL_8_3_1F_ODD_BIGE) data2 = ds2.pixel_array assert len(data1) == len(data2) assert (data1 == data2).all() pydicom-2.4.3/pydicom/tests/test_overlay_np.py000066400000000000000000000366011446675437500216140ustar00rootroot00000000000000# Copyright 2008-2019 pydicom authors. See LICENSE file for details. """Tests for the overlay_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** * OverlayBitsAllocated * NumberOfFramesInOverlay * OverlayRows * OverlayColumns """ from importlib import reload import typing 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 setup_method(self): """Setup the environment.""" self.original_handlers = pydicom.config.overlay_data_handlers pydicom.config.overlay_data_handlers = [NP_HANDLER] def teardown_method(self): """Restore the environment.""" pydicom.config.overlay_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_overlay_array_raises(self): """Test overlay_array raises exception""" ds = dcmread(EXPL_1_1_1F) msg = r"The following handlers are available to decode" with pytest.raises(RuntimeError, match=msg): ds.overlay_array(0x6000) 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.""" def setup_method(self): """Setup the test datasets and the environment.""" self.original_handlers = pydicom.config.overlay_data_handlers pydicom.config.overlay_data_handlers = [NP_HANDLER] def teardown_method(self): """Restore the environment.""" pydicom.config.overlay_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 # 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]) @pytest.mark.skip(reason='No dataset available') def test_little_1bit_1sample_3frame(self): """Test pixel_array for little 1-bit, 1 sample/pixel, 3 frame.""" ds = dcmread(EXPL_1_1_3F) arr = ds.overlay_array(0x6000) 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) def test_old_import(self): """Test that can import using the old path.""" from pydicom.overlay_data_handlers import numpy_handler as np_old ds = dcmread(EXPL_1_1_1F) arr = np_old.get_overlay_array(ds, 0x6000) assert 0 == arr[0, 0] 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-2.4.3/pydicom/tests/test_pillow_pixel_data.py000066400000000000000000000566331446675437500231450ustar00rootroot00000000000000# 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 defragment_data from pydicom.filereader import dcmread from pydicom.pixel_data_handlers.util import ( convert_color_space, 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") # noqa # 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") # noqa JPGB_08_08_3_0_1F_YBR_FULL_422_422 = get_testdata_file("SC_rgb_dcmtk_+eb+cy+s2.dcm") # noqa JPGB_08_08_3_0_1F_YBR_FULL_411 = get_testdata_file("SC_rgb_dcmtk_+eb+cy+n1.dcm") # noqa JPGB_08_08_3_0_1F_YBR_FULL_422 = get_testdata_file("SC_rgb_dcmtk_+eb+cy+n2.dcm") # noqa JPGB_08_08_3_0_1F_YBR_FULL_444 = get_testdata_file("SC_rgb_dcmtk_+eb+cy+s4.dcm") # noqa 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") # noqa # 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) for uid in AllTransferSyntaxes: ds.file_meta.TransferSyntaxUID = uid with pytest.raises(NotImplementedError, match="UID of '{}'".format(uid)): ds.pixel_array def test_using_pillow_handler_raises(self): ds = dcmread(J2KI_08_08_3_0_1F_RGB) 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')), # noqa (JPGB_08_08_3_0_1F_YBR_FULL_422_411, (JPGB, 8, 3, 0, 1, (100, 100, 3), 'uint8')), # noqa (JPGB_08_08_3_0_1F_YBR_FULL_422_422, (JPGB, 8, 3, 0, 1, (100, 100, 3), 'uint8')), # noqa (JPGB_08_08_3_0_1F_YBR_FULL_411, (JPGB, 8, 3, 0, 1, (100, 100, 3), 'uint8')), # noqa (JPGB_08_08_3_0_1F_YBR_FULL_422, (JPGB, 8, 3, 0, 1, (100, 100, 3), 'uint8')), # noqa (JPGB_08_08_3_0_1F_YBR_FULL_444, (JPGB, 8, 3, 0, 1, (100, 100, 3), 'uint8')), # noqa (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), ], marks=pytest.mark.xfail(reason="Resulting image is a bad match") ), 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), ], marks=pytest.mark.xfail(reason="Resulting image is a bad match") ), 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), ], ), ] JPEG2K_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"), {}, ), 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) 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) 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] bs = defragment_data(ds.PixelData) 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', JPEG2K_MATCHING_DATASETS) def test_array(self, fpath, rpath, fixes): """Test pixel_array returns correct values.""" ds = dcmread(fpath) # 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) def test_warning(self): """Test that the precision warning works OK.""" ds = dcmread(J2KR_16_14_1_1_1F_M2) 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.BitsStored = 14 ds.decompress(handler_name='pillow') arr = ds.pixel_array ds = dcmread(get_testdata_file("693_UNCR.dcm")) 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) 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) assert 1 == ds.PixelRepresentation assert 13 == ds.BitsStored bs = defragment_data(ds.PixelData) 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) 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 JPEG_SUPPORTED_SYNTAXES: return ds = dcmread(fpath) 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) arr = ds.pixel_array if 'YBR' in ds.PhotometricInterpretation: arr = convert_color_space(arr, ds.PhotometricInterpretation, 'RGB') ref = dcmread(rpath).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] 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) 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) msg = ( r"1.2.840.10008.1.2.4.51 - JPEG Extended \(Process 2 and 4\) only " r"supported by Pillow if 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) 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) pixel_data = ds.pixel_array assert pixel_data.nbytes == 27 assert pixel_data.shape == (3, 3, 3) pydicom-2.4.3/pydicom/tests/test_pylibjpeg.py000066400000000000000000000742371446675437500214320ustar00rootroot00000000000000# Copyright 2020 pydicom authors. See LICENSE file for details. """Tests for the pixel_data_handlers.pylibjpeg_handler module.""" import pytest import pydicom from pydicom.data import get_testdata_file from pydicom.encaps import defragment_data from pydicom.filereader import dcmread from pydicom.pixel_data_handlers.util import ( convert_color_space, get_j2k_parameters, get_expected_length ) from pydicom.uid import ( ImplicitVRLittleEndian, JPEGBaseline8Bit, JPEGExtended12Bit, JPEGLosslessP14, 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, JPEGLosslessP14, 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") # noqa # 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") # noqa JPGB_08_08_3_0_1F_YBR_FULL_422_422 = get_testdata_file("SC_rgb_dcmtk_+eb+cy+s2.dcm") # noqa JPGB_08_08_3_0_1F_YBR_FULL_411 = get_testdata_file("SC_rgb_dcmtk_+eb+cy+n1.dcm") # noqa JPGB_08_08_3_0_1F_YBR_FULL_422 = get_testdata_file("SC_rgb_dcmtk_+eb+cy+n2.dcm") # noqa JPGB_08_08_3_0_1F_YBR_FULL_444 = get_testdata_file("SC_rgb_dcmtk_+eb+cy+s4.dcm") # noqa 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')), # noqa (JPGB_08_08_3_0_1F_YBR_FULL_422_411, (JPGB, 8, 3, 0, 1, (100, 100, 3), 'uint8')), # noqa (JPGB_08_08_3_0_1F_YBR_FULL_422_422, (JPGB, 8, 3, 0, 1, (100, 100, 3), 'uint8')), # noqa (JPGB_08_08_3_0_1F_YBR_FULL_411, (JPGB, 8, 3, 0, 1, (100, 100, 3), 'uint8')), # noqa (JPGB_08_08_3_0_1F_YBR_FULL_422, (JPGB, 8, 3, 0, 1, (100, 100, 3), 'uint8')), # noqa (JPGB_08_08_3_0_1F_YBR_FULL_444, (JPGB, 8, 3, 0, 1, (100, 100, 3), 'uint8')), # noqa (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')), ] J2K_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"), {}, ), 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 print(not HAVE_PYLIBJPEG, (HAVE_LJ or HAVE_OJ or HAVE_RLE)) @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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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_arrary(self): """Test returned array values are OK.""" ds = dcmread(JPEG_LS_LOSSLESS) 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) 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', J2K_MATCHING_DATASETS) def test_array(self, fpath, rpath, fixes): """Test pixel_array returns correct values.""" ds = dcmread(fpath) if fixes: with pytest.warns(UserWarning): arr = ds.pixel_array else: arr = ds.pixel_array ref = dcmread(rpath).pixel_array assert np.array_equal(arr, ref) @pytest.mark.parametrize('fpath, rpath, fixes', J2K_MATCHING_DATASETS) def test_generate_frames(self, fpath, rpath, fixes): """Test pixel_array returns correct values.""" ds = dcmread(fpath) 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) def test_warnings(self): """Test the plugin warnings work.""" # Bits Stored ds = dcmread(J2KR_16_14_1_1_1F_M2) 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 = 0 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) 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.decompress(handler_name='pylibjpeg') arr = ds.pixel_array ds = dcmread(get_testdata_file("MR2_J2KR.dcm")) 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) assert 1 == ds.PixelRepresentation assert 13 == ds.BitsStored bs = defragment_data(ds.PixelData) 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 '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.decompress(handler_name='pylibjpeg') arr = ds.pixel_array ds = dcmread(get_testdata_file("SC_rgb.dcm")) 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) 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) 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.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) 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) @pytest.mark.skipif(not TEST_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_bit(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' ) assert np.array_equal(ref.newbyteorder('>'), ds.pixel_array) assert ref is not ds.pixel_array pydicom-2.4.3/pydicom/tests/test_rawread.py000066400000000000000000000554301446675437500210640ustar00rootroot00000000000000# 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) 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) 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) 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) 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) 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 ) 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 ) 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 ) 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 ) 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 ) 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 ) 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-2.4.3/pydicom/tests/test_rle_pixel_data.py000066400000000000000000001273661446675437500224230ustar00rootroot00000000000000# 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 struct import pack, unpack import pytest from pydicom import dcmread import pydicom.config from pydicom.data import get_testdata_file from pydicom.encaps import defragment_data from pydicom.uid import RLELossless, AllTransferSyntaxes try: import numpy as np from pydicom.pixel_data_handlers import numpy_handler as NP_HANDLER from pydicom.pixel_data_handlers.util 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) 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) for uid in AllTransferSyntaxes: ds.file_meta.TransferSyntaxUID = uid exc_msg = ( r"Unable to decode pixel data with a transfer syntax UID of " r"'{}'".format(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) for uid in UNSUPPORTED_SYNTAXES: ds.file_meta.TransferSyntaxUID = uid exc_msg = ( r"Unable to decode pixel data with a transfer syntax UID of " r"'{}'".format(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) 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) for uid in AllTransferSyntaxes: ds.file_meta.TransferSyntaxUID = uid exc_msg = ( r"Unable to decode pixel data with a transfer syntax UID of " r"'{}'".format(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) for uid in UNSUPPORTED_SYNTAXES: ds.file_meta.TransferSyntaxUID = uid msg = ( r"Unable to decode pixel data with a transfer syntax UID of " r"'{}'".format(uid) ) with pytest.raises(NotImplementedError, match=msg): ds.pixel_array 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) # 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.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) 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) 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') 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) 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) 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) 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) 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' b'\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' b'\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' b'\xFE\x01' b'\x80' ) assert bytes(_rle_decode_segment(data)) == ( b'\x01\x02\x03\x04\x05\x06' b'\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-2.4.3/pydicom/tests/test_sequence.py000066400000000000000000000131121446675437500212360ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. """Unit tests for the pydicom.sequence module.""" import copy import weakref 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.parent_dataset = parent assert isinstance(seq.parent_dataset, weakref.ReferenceType) seq.append(ds_a) seq.append(ds_c) seq.insert(1, ds_b) assert 3 == len(seq) for ds in seq: assert isinstance(ds.parent_seq, weakref.ReferenceType) 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 for ds in seq: assert isinstance(ds.parent_seq, weakref.ReferenceType) 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.parent_dataset = parent assert isinstance(seq.parent_dataset, weakref.ReferenceType) 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 for ds in seq: assert isinstance(ds.parent_seq, weakref.ReferenceType) 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.parent_dataset = parent assert isinstance(seq.parent_dataset, weakref.ReferenceType) 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 for ds in seq: assert isinstance(ds.parent_seq, weakref.ReferenceType) 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-2.4.3/pydicom/tests/test_tag.py000066400000000000000000000375201446675437500202120ustar00rootroot00000000000000# 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., 2.]) # 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-2.4.3/pydicom/tests/test_uid.py000066400000000000000000000404451446675437500202200ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Test suite for uid.py""" from importlib import import_module import sys import uuid import pytest from pydicom._storage_sopclass_uids import CTImageStorage from pydicom.uid import UID, generate_uid, PYDICOM_ROOT_UID, JPEGLSNearLossless import pydicom.uid def test_storage_sopclass_uids(): assert CTImageStorage == pydicom.uid.CTImageStorage def test_jpeglossless_warning(): """Test warning when importing JPEGLossless for Python 3.7+.""" if sys.version_info[:2] < (3, 7): from pydicom.uid import JPEGLossless assert '1.2.840.10008.1.2.4.70' == JPEGLossless else: msg = ( r"In pydicom v3.0 the UID for 'JPEGLossless' will change " r"from '1.2.840.10008.1.2.4.70' to '1.2.840.10008.1.2.4.57' to " r"match its UID keyword. Use 'JPEGLosslessSV1' instead" ) with pytest.warns(UserWarning, match=msg): from pydicom.uid import JPEGLossless assert '1.2.840.10008.1.2.4.70' == JPEGLossless def test_deprecation_warnings(): """Test deprecations warnings for other UIDs for Python 3.7+.""" _deprecations = { "JPEGBaseline": ("1.2.840.10008.1.2.4.50", "JPEGBaseline8Bit"), "JPEGExtended": ("1.2.840.10008.1.2.4.51", "JPEGExtended12Bit"), "JPEGLSLossy": ("1.2.840.10008.1.2.4.81", "JPEGLSNearLossless"), "JPEG2000MultiComponentLossless": ( "1.2.840.10008.1.2.4.92", "JPEG2000MCLossless" ), "JPEG2000MultiComponent": ("1.2.840.10008.1.2.4.93", "JPEG2000MC"), } if sys.version_info[:2] < (3, 7): for name, (value, replacement) in _deprecations.items(): uid = getattr(pydicom.uid, name) assert value == uid else: for name, (value, replacement) in _deprecations.items(): msg = ( f"The UID constant '{name}' is deprecated and will be removed " f"in pydicom v3.0, use '{replacement}' instead" ) with pytest.warns(DeprecationWarning, match=msg): uid = getattr(pydicom.uid, name) assert value == uid 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' * 63) + '.', '', '.', '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' * 62) + '.', '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.""" with pytest.raises(ValueError): 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 pydicom-2.4.3/pydicom/tests/test_unicode.py000066400000000000000000000015151446675437500210600ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. # -*- coding: utf-8 -*- """Unit tests for unicode.""" import sys import pytest 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 IOError: pass pydicom-2.4.3/pydicom/tests/test_util.py000066400000000000000000000467031446675437500204170ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. """Test suite for util functions""" import copy from contextlib import contextmanager 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, ) from pydicom.util.dump import * 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() 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\n' out += 'from pydicom.dataset import Dataset, FileMetaDataset\n' out += 'from pydicom.sequence import Sequence' assert 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', '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 = ["--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_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 TestFixer: """Test the utils.fixer module""" def test_fix_separator_callback(self): """Test utils.fixer.fix_separator_callback""" pass def test_fix_separator(self): """Test utils.fixer.fix_separator""" pass def test_mismatch_callback(self): """Test utils.fixer.mismatch_callback""" pass def test_fix_mismatch(self): """Test utils.fixer.fix_mismatch""" pass 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' b'\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' b'\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' b'\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' b'\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' b'\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., 4., 8., 16.] 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., 64., 128., 196.] 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" b"\x04\x00\x00\x00" b"\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) 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) 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-2.4.3/pydicom/tests/test_valuerep.py000066400000000000000000001677271446675437500212770ustar00rootroot00000000000000# -*- coding: utf-8 -*- # 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 sys from typing import Union 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 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' " r"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 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 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.7976931348623157e+308, '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: Union[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') y = DSdecimal(x) 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): x = 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): x = 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: Union[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) 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) 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 '"{0}"'.format(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 '"{0}"'.format(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 '"{0}"'.format(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 '"{0}"'.format(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 '"{0}"'.format(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 '"{0}"'.format(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 '"{0}"'.format(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 '"{0}"'.format(dicom_time) == repr(tm) # Assert `tm` equals to no `time` tm = valuerep.TM("") assert tm is None def test_person_name_unicode_warns(): """Test deprecation warning for PersonNameUnicode.""" if sys.version_info[:2] < (3, 7): from pydicom.valuerep import PersonNameUnicode else: msg = ( r"'PersonNameUnicode' is deprecated and will be removed in " r"pydicom v3.0, use 'PersonName' instead" ) with pytest.warns(DeprecationWarning, match=msg): from pydicom.valuerep import PersonNameUnicode assert PersonNameUnicode == PersonName 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 == 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" 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-2.4.3/pydicom/tests/test_values.py000066400000000000000000000241141446675437500207310ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Tests for dataset.py""" import pytest from pydicom.tag import Tag from pydicom.values import ( convert_value, converters, convert_tag, convert_ATvalue, convert_DA_string, convert_text, convert_single_string, convert_AE_string, convert_PN ) 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) @pytest.mark.skip(reason='empty bytestring not handled properly') def test_empty_bytestring(self): """Test convert_tag with empty bytestring""" bytestring = b'' assert convert_tag(bytestring, True) == '' @pytest.mark.skip(reason='bad bytestring not handled properly') def test_bad_bytestring(self): """Test convert_tag with a bad bytestring""" bytestring = b'\x10\x00' 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' b'\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) == [] @pytest.mark.skip(reason='bad bytestring not handled properly') def test_bad_length(self): """Test convert_ATvalue with bad length bytestring""" bytestring = b'' assert convert_ATvalue(bytestring, True) == '' bytestring = b'\x10\x00\x20\x00\x10\x00\x30\x00\x10' convert_ATvalue(bytestring, True) 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) pydicom-2.4.3/pydicom/tests/test_waveform.py000066400000000000000000000122021446675437500212530ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. from importlib import reload import typing import pytest import pydicom 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 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) arr = ds.waveform_array(index=0) arr = 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 = ( f"Unable to convert the waveform multiplex group with index " f"0 as the following required elements are missing from " f"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 = ( f"Unable to convert the waveform multiplex group with index " f"0 as the following required elements are missing from " f"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-2.4.3/pydicom/uid.py000066400000000000000000001042501446675437500160120ustar00rootroot00000000000000# Copyright 2008-2022 pydicom authors. See LICENSE file for details. """Functions for handling DICOM unique identifiers (UIDs)""" import hashlib import os import random import re import sys import uuid import warnings from typing import Any, List, Optional, Type, TypeVar, Union 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 _deprecations = { "JPEGBaseline": "JPEGBaseline8Bit", "JPEGExtended": "JPEGExtended12Bit", "JPEGLossless": "JPEGLosslessSV1", "JPEGLSLossy": "JPEGLSNearLossless", "JPEG2000MultiComponentLossless": "JPEG2000MCLossless", "JPEG2000MultiComponent": "JPEG2000MC", } def __getattr__(name: str) -> Any: if name in _deprecations: replacement = _deprecations[name] if name == "JPEGLossless": warnings.warn( "In pydicom v3.0 the UID for 'JPEGLossless' will change " "from '1.2.840.10008.1.2.4.70' to '1.2.840.10008.1.2.4.57' to " f"match its UID keyword. Use '{replacement}' instead" ) else: warnings.warn( f"The UID constant '{name}' is deprecated and will be removed " f"in pydicom v3.0, use '{replacement}' instead", DeprecationWarning, ) return globals()[replacement] raise AttributeError(f"module {__name__} has no attribute {name}") class UID(str): """Human friendly UIDs as a Python :class:`str` subclass. Examples -------- >>> 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)' """ def __new__( cls: Type["UID"], val: str, validation_mode: int = 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) return super().__new__(cls, val.strip()) 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: # 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 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: # 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 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" raise ValueError("Can't determine UID type for private UIDs.") @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 # Many thanks to the Medical Connections for offering free # valid UIDs (http://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""" JPEGLosslessP14 = UID("1.2.840.10008.1.2.4.57") # needs to be updated """1.2.840.10008.1.2.4.57""" JPEGLosslessSV1 = UID("1.2.840.10008.1.2.4.70") # Old JPEGLossless """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""" MPEG2MPHL = UID("1.2.840.10008.1.2.4.101") """1.2.840.10008.1.2.4.101""" MPEG4HP41 = UID("1.2.840.10008.1.2.4.102") """1.2.840.10008.1.2.4.102""" MPEG4HP41BD = UID("1.2.840.10008.1.2.4.103") """1.2.840.10008.1.2.4.103""" MPEG4HP422D = UID("1.2.840.10008.1.2.4.104") """1.2.840.10008.1.2.4.104""" MPEG4HP423D = UID("1.2.840.10008.1.2.4.105") """1.2.840.10008.1.2.4.105""" MPEG4HP42STEREO = UID("1.2.840.10008.1.2.4.106") """1.2.840.10008.1.2.4.106""" 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""" RLELossless = UID("1.2.840.10008.1.2.5") """1.2.840.10008.1.2.5""" AllTransferSyntaxes = [ ImplicitVRLittleEndian, ExplicitVRLittleEndian, DeflatedExplicitVRLittleEndian, ExplicitVRBigEndian, JPEGBaseline8Bit, JPEGExtended12Bit, JPEGLosslessP14, JPEGLosslessSV1, JPEGLSLossless, JPEGLSNearLossless, JPEG2000Lossless, JPEG2000, JPEG2000MCLossless, JPEG2000MC, MPEG2MPML, MPEG2MPHL, MPEG4HP41, MPEG4HP41BD, MPEG4HP422D, MPEG4HP423D, MPEG4HP42STEREO, HEVCMP51, HEVCM10P51, RLELossless, ] """All non-retired transfer syntaxes and *Explicit VR Big Endian*.""" JPEGTransferSyntaxes = [ JPEGBaseline8Bit, JPEGExtended12Bit, JPEGLosslessP14, JPEGLosslessSV1, ] """JPEG (ISO/IEC 10918-1) transfer syntaxes""" JPEGLSTransferSyntaxes = [JPEGLSLossless, JPEGLSNearLossless] """JPEG-LS (ISO/IEC 14495-1) transfer syntaxes.""" JPEG2000TransferSyntaxes = [ JPEG2000Lossless, JPEG2000, JPEG2000MCLossless, JPEG2000MC ] """JPEG 2000 (ISO/IEC 15444-1) transfer syntaxes.""" MPEGTransferSyntaxes = [ MPEG2MPML, MPEG2MPHL, MPEG4HP41, MPEG4HP41BD, MPEG4HP422D, MPEG4HP423D, MPEG4HP42STEREO, HEVCMP51, HEVCM10P51, ] """MPEG transfer syntaxes.""" RLETransferSyntaxes = [RLELossless] """RLE transfer syntaxes.""" UncompressedTransferSyntaxes = [ ExplicitVRLittleEndian, ImplicitVRLittleEndian, DeflatedExplicitVRLittleEndian, ExplicitVRBigEndian, ] """Uncompressed (native) transfer syntaxes.""" # Deprecated if sys.version_info[:2] < (3, 7): JPEGBaseline = JPEGBaseline8Bit JPEGExtended = JPEGExtended12Bit JPEGLossless = JPEGLosslessSV1 JPEGLSLossy = JPEGLSNearLossless JPEG2000MultiComponentLossless = JPEG2000MCLossless JPEG2000MultiComponent = JPEG2000MC JPEGLossyCompressedPixelTransferSyntaxes = [ JPEGBaseline8Bit, JPEGExtended12Bit, ] JPEGLSSupportedCompressedPixelTransferSyntaxes = JPEGLSTransferSyntaxes JPEG2000CompressedPixelTransferSyntaxes = JPEG2000TransferSyntaxes PILSupportedCompressedPixelTransferSyntaxes = [ JPEGBaseline8Bit, JPEGLosslessP14, JPEGExtended12Bit, JPEG2000Lossless, JPEG2000, ] RLECompressedLosslessSyntaxes = RLETransferSyntaxes UncompressedPixelTransferSyntaxes = UncompressedTransferSyntaxes def generate_uid( prefix: Union[str, None] = PYDICOM_ROOT_UID, entropy_srcs: Optional[List[str]] = None, ) -> UID: """Return a 64 character UID which starts with `prefix`. .. versionchanged:: 1.3 When `prefix` is ``None`` a conformant UUID suffix of up to 39 characters will be used instead of a hashed value. 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 not used 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 random data will be appended instead (default). If `prefix` is not used 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 63 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 """ if prefix is None: # UUID -> as 128-bit int -> max 39 characters long return UID(f"2.25.{uuid.uuid4().int}") max_uid_len = 64 if len(prefix) > max_uid_len - 1: raise ValueError("The prefix must be less than 63 chars") if not re.match(RE_VALID_UID_PREFIX, prefix): raise ValueError("The prefix is not in a valid format") avail_digits = max_uid_len - len(prefix) if entropy_srcs is None: entropy_srcs = [ str(uuid.uuid1()), # 128-bit from MAC/time/randomness str(os.getpid()), # Current process ID hex(random.getrandbits(64)), # 64 bits randomness ] hash_val = hashlib.sha512("".join(entropy_srcs).encode("utf-8")) # Convert this to an int with the maximum available digits dicom_uid = prefix + str(int(hash_val.hexdigest(), 16))[:avail_digits] return UID(dicom_uid) # Only auto-generated Storage SOP Class UIDs below - do not edit manually MediaStorageDirectoryStorage = UID('1.2.840.10008.1.3.10') # noqa """1.2.840.10008.1.3.10""" ComputedRadiographyImageStorage = UID('1.2.840.10008.5.1.4.1.1.1') # noqa """1.2.840.10008.5.1.4.1.1.1""" DigitalXRayImageStorageForPresentation = UID('1.2.840.10008.5.1.4.1.1.1.1') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """1.2.840.10008.5.1.4.1.1.104.1""" EncapsulatedCDAStorage = UID('1.2.840.10008.5.1.4.1.1.104.2') # noqa """1.2.840.10008.5.1.4.1.1.104.2""" EncapsulatedSTLStorage = UID('1.2.840.10008.5.1.4.1.1.104.3') # noqa """1.2.840.10008.5.1.4.1.1.104.3""" EncapsulatedOBJStorage = UID('1.2.840.10008.5.1.4.1.1.104.4') # noqa """1.2.840.10008.5.1.4.1.1.104.4""" EncapsulatedMTLStorage = UID('1.2.840.10008.5.1.4.1.1.104.5') # noqa """1.2.840.10008.5.1.4.1.1.104.5""" GrayscaleSoftcopyPresentationStateStorage = UID('1.2.840.10008.5.1.4.1.1.11.1') # noqa """1.2.840.10008.5.1.4.1.1.11.1""" SegmentedVolumeRenderingVolumetricPresentationStateStorage = UID('1.2.840.10008.5.1.4.1.1.11.10') # noqa """1.2.840.10008.5.1.4.1.1.11.10""" MultipleVolumeRenderingVolumetricPresentationStateStorage = UID('1.2.840.10008.5.1.4.1.1.11.11') # noqa """1.2.840.10008.5.1.4.1.1.11.11""" ColorSoftcopyPresentationStateStorage = UID('1.2.840.10008.5.1.4.1.1.11.2') # noqa """1.2.840.10008.5.1.4.1.1.11.2""" PseudoColorSoftcopyPresentationStateStorage = UID('1.2.840.10008.5.1.4.1.1.11.3') # noqa """1.2.840.10008.5.1.4.1.1.11.3""" BlendingSoftcopyPresentationStateStorage = UID('1.2.840.10008.5.1.4.1.1.11.4') # noqa """1.2.840.10008.5.1.4.1.1.11.4""" XAXRFGrayscaleSoftcopyPresentationStateStorage = UID('1.2.840.10008.5.1.4.1.1.11.5') # noqa """1.2.840.10008.5.1.4.1.1.11.5""" GrayscalePlanarMPRVolumetricPresentationStateStorage = UID('1.2.840.10008.5.1.4.1.1.11.6') # noqa """1.2.840.10008.5.1.4.1.1.11.6""" CompositingPlanarMPRVolumetricPresentationStateStorage = UID('1.2.840.10008.5.1.4.1.1.11.7') # noqa """1.2.840.10008.5.1.4.1.1.11.7""" AdvancedBlendingPresentationStateStorage = UID('1.2.840.10008.5.1.4.1.1.11.8') # noqa """1.2.840.10008.5.1.4.1.1.11.8""" VolumeRenderingVolumetricPresentationStateStorage = UID('1.2.840.10008.5.1.4.1.1.11.9') # noqa """1.2.840.10008.5.1.4.1.1.11.9""" XRayAngiographicImageStorage = UID('1.2.840.10008.5.1.4.1.1.12.1') # noqa """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') # noqa """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') # noqa """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') # noqa """1.2.840.10008.5.1.4.1.1.12.2.1""" PositronEmissionTomographyImageStorage = UID('1.2.840.10008.5.1.4.1.1.128') # noqa """1.2.840.10008.5.1.4.1.1.128""" LegacyConvertedEnhancedPETImageStorage = UID('1.2.840.10008.5.1.4.1.1.128.1') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """1.2.840.10008.5.1.4.1.1.13.1.5""" EnhancedPETImageStorage = UID('1.2.840.10008.5.1.4.1.1.130') # noqa """1.2.840.10008.5.1.4.1.1.130""" BasicStructuredDisplayStorage = UID('1.2.840.10008.5.1.4.1.1.131') # noqa """1.2.840.10008.5.1.4.1.1.131""" IntravascularOpticalCoherenceTomographyImageStorageForPresentation = UID('1.2.840.10008.5.1.4.1.1.14.1') # noqa """1.2.840.10008.5.1.4.1.1.14.1""" IntravascularOpticalCoherenceTomographyImageStorageForProcessing = UID('1.2.840.10008.5.1.4.1.1.14.2') # noqa """1.2.840.10008.5.1.4.1.1.14.2""" CTImageStorage = UID('1.2.840.10008.5.1.4.1.1.2') # noqa """1.2.840.10008.5.1.4.1.1.2""" EnhancedCTImageStorage = UID('1.2.840.10008.5.1.4.1.1.2.1') # noqa """1.2.840.10008.5.1.4.1.1.2.1""" LegacyConvertedEnhancedCTImageStorage = UID('1.2.840.10008.5.1.4.1.1.2.2') # noqa """1.2.840.10008.5.1.4.1.1.2.2""" NuclearMedicineImageStorage = UID('1.2.840.10008.5.1.4.1.1.20') # noqa """1.2.840.10008.5.1.4.1.1.20""" CTDefinedProcedureProtocolStorage = UID('1.2.840.10008.5.1.4.1.1.200.1') # noqa """1.2.840.10008.5.1.4.1.1.200.1""" CTPerformedProcedureProtocolStorage = UID('1.2.840.10008.5.1.4.1.1.200.2') # noqa """1.2.840.10008.5.1.4.1.1.200.2""" ProtocolApprovalStorage = UID('1.2.840.10008.5.1.4.1.1.200.3') # noqa """1.2.840.10008.5.1.4.1.1.200.3""" XADefinedProcedureProtocolStorage = UID('1.2.840.10008.5.1.4.1.1.200.7') # noqa """1.2.840.10008.5.1.4.1.1.200.7""" XAPerformedProcedureProtocolStorage = UID('1.2.840.10008.5.1.4.1.1.200.8') # noqa """1.2.840.10008.5.1.4.1.1.200.8""" UltrasoundMultiFrameImageStorage = UID('1.2.840.10008.5.1.4.1.1.3.1') # noqa """1.2.840.10008.5.1.4.1.1.3.1""" ParametricMapStorage = UID('1.2.840.10008.5.1.4.1.1.30') # noqa """1.2.840.10008.5.1.4.1.1.30""" MRImageStorage = UID('1.2.840.10008.5.1.4.1.1.4') # noqa """1.2.840.10008.5.1.4.1.1.4""" EnhancedMRImageStorage = UID('1.2.840.10008.5.1.4.1.1.4.1') # noqa """1.2.840.10008.5.1.4.1.1.4.1""" MRSpectroscopyStorage = UID('1.2.840.10008.5.1.4.1.1.4.2') # noqa """1.2.840.10008.5.1.4.1.1.4.2""" EnhancedMRColorImageStorage = UID('1.2.840.10008.5.1.4.1.1.4.3') # noqa """1.2.840.10008.5.1.4.1.1.4.3""" LegacyConvertedEnhancedMRImageStorage = UID('1.2.840.10008.5.1.4.1.1.4.4') # noqa """1.2.840.10008.5.1.4.1.1.4.4""" RTImageStorage = UID('1.2.840.10008.5.1.4.1.1.481.1') # noqa """1.2.840.10008.5.1.4.1.1.481.1""" RTPhysicianIntentStorage = UID('1.2.840.10008.5.1.4.1.1.481.10') # noqa """1.2.840.10008.5.1.4.1.1.481.10""" RTSegmentAnnotationStorage = UID('1.2.840.10008.5.1.4.1.1.481.11') # noqa """1.2.840.10008.5.1.4.1.1.481.11""" RTRadiationSetStorage = UID('1.2.840.10008.5.1.4.1.1.481.12') # noqa """1.2.840.10008.5.1.4.1.1.481.12""" CArmPhotonElectronRadiationStorage = UID('1.2.840.10008.5.1.4.1.1.481.13') # noqa """1.2.840.10008.5.1.4.1.1.481.13""" TomotherapeuticRadiationStorage = UID('1.2.840.10008.5.1.4.1.1.481.14') # noqa """1.2.840.10008.5.1.4.1.1.481.14""" RoboticArmRadiationStorage = UID('1.2.840.10008.5.1.4.1.1.481.15') # noqa """1.2.840.10008.5.1.4.1.1.481.15""" RTRadiationRecordSetStorage = UID('1.2.840.10008.5.1.4.1.1.481.16') # noqa """1.2.840.10008.5.1.4.1.1.481.16""" RTRadiationSalvageRecordStorage = UID('1.2.840.10008.5.1.4.1.1.481.17') # noqa """1.2.840.10008.5.1.4.1.1.481.17""" TomotherapeuticRadiationRecordStorage = UID('1.2.840.10008.5.1.4.1.1.481.18') # noqa """1.2.840.10008.5.1.4.1.1.481.18""" CArmPhotonElectronRadiationRecordStorage = UID('1.2.840.10008.5.1.4.1.1.481.19') # noqa """1.2.840.10008.5.1.4.1.1.481.19""" RTDoseStorage = UID('1.2.840.10008.5.1.4.1.1.481.2') # noqa """1.2.840.10008.5.1.4.1.1.481.2""" RoboticRadiationRecordStorage = UID('1.2.840.10008.5.1.4.1.1.481.20') # noqa """1.2.840.10008.5.1.4.1.1.481.20""" RTRadiationSetDeliveryInstructionStorage = UID('1.2.840.10008.5.1.4.1.1.481.21') # noqa """1.2.840.10008.5.1.4.1.1.481.21""" RTTreatmentPreparationStorage = UID('1.2.840.10008.5.1.4.1.1.481.22') # noqa """1.2.840.10008.5.1.4.1.1.481.22""" RTStructureSetStorage = UID('1.2.840.10008.5.1.4.1.1.481.3') # noqa """1.2.840.10008.5.1.4.1.1.481.3""" RTBeamsTreatmentRecordStorage = UID('1.2.840.10008.5.1.4.1.1.481.4') # noqa """1.2.840.10008.5.1.4.1.1.481.4""" RTPlanStorage = UID('1.2.840.10008.5.1.4.1.1.481.5') # noqa """1.2.840.10008.5.1.4.1.1.481.5""" RTBrachyTreatmentRecordStorage = UID('1.2.840.10008.5.1.4.1.1.481.6') # noqa """1.2.840.10008.5.1.4.1.1.481.6""" RTTreatmentSummaryRecordStorage = UID('1.2.840.10008.5.1.4.1.1.481.7') # noqa """1.2.840.10008.5.1.4.1.1.481.7""" RTIonPlanStorage = UID('1.2.840.10008.5.1.4.1.1.481.8') # noqa """1.2.840.10008.5.1.4.1.1.481.8""" RTIonBeamsTreatmentRecordStorage = UID('1.2.840.10008.5.1.4.1.1.481.9') # noqa """1.2.840.10008.5.1.4.1.1.481.9""" DICOSCTImageStorage = UID('1.2.840.10008.5.1.4.1.1.501.1') # noqa """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') # noqa """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') # noqa """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') # noqa """1.2.840.10008.5.1.4.1.1.501.3""" DICOS2DAITStorage = UID('1.2.840.10008.5.1.4.1.1.501.4') # noqa """1.2.840.10008.5.1.4.1.1.501.4""" DICOS3DAITStorage = UID('1.2.840.10008.5.1.4.1.1.501.5') # noqa """1.2.840.10008.5.1.4.1.1.501.5""" DICOSQuadrupoleResonanceStorage = UID('1.2.840.10008.5.1.4.1.1.501.6') # noqa """1.2.840.10008.5.1.4.1.1.501.6""" UltrasoundImageStorage = UID('1.2.840.10008.5.1.4.1.1.6.1') # noqa """1.2.840.10008.5.1.4.1.1.6.1""" EnhancedUSVolumeStorage = UID('1.2.840.10008.5.1.4.1.1.6.2') # noqa """1.2.840.10008.5.1.4.1.1.6.2""" EddyCurrentImageStorage = UID('1.2.840.10008.5.1.4.1.1.601.1') # noqa """1.2.840.10008.5.1.4.1.1.601.1""" EddyCurrentMultiFrameImageStorage = UID('1.2.840.10008.5.1.4.1.1.601.2') # noqa """1.2.840.10008.5.1.4.1.1.601.2""" RawDataStorage = UID('1.2.840.10008.5.1.4.1.1.66') # noqa """1.2.840.10008.5.1.4.1.1.66""" SpatialRegistrationStorage = UID('1.2.840.10008.5.1.4.1.1.66.1') # noqa """1.2.840.10008.5.1.4.1.1.66.1""" SpatialFiducialsStorage = UID('1.2.840.10008.5.1.4.1.1.66.2') # noqa """1.2.840.10008.5.1.4.1.1.66.2""" DeformableSpatialRegistrationStorage = UID('1.2.840.10008.5.1.4.1.1.66.3') # noqa """1.2.840.10008.5.1.4.1.1.66.3""" SegmentationStorage = UID('1.2.840.10008.5.1.4.1.1.66.4') # noqa """1.2.840.10008.5.1.4.1.1.66.4""" SurfaceSegmentationStorage = UID('1.2.840.10008.5.1.4.1.1.66.5') # noqa """1.2.840.10008.5.1.4.1.1.66.5""" TractographyResultsStorage = UID('1.2.840.10008.5.1.4.1.1.66.6') # noqa """1.2.840.10008.5.1.4.1.1.66.6""" RealWorldValueMappingStorage = UID('1.2.840.10008.5.1.4.1.1.67') # noqa """1.2.840.10008.5.1.4.1.1.67""" SurfaceScanMeshStorage = UID('1.2.840.10008.5.1.4.1.1.68.1') # noqa """1.2.840.10008.5.1.4.1.1.68.1""" SurfaceScanPointCloudStorage = UID('1.2.840.10008.5.1.4.1.1.68.2') # noqa """1.2.840.10008.5.1.4.1.1.68.2""" SecondaryCaptureImageStorage = UID('1.2.840.10008.5.1.4.1.1.7') # noqa """1.2.840.10008.5.1.4.1.1.7""" MultiFrameSingleBitSecondaryCaptureImageStorage = UID('1.2.840.10008.5.1.4.1.1.7.1') # noqa """1.2.840.10008.5.1.4.1.1.7.1""" MultiFrameGrayscaleByteSecondaryCaptureImageStorage = UID('1.2.840.10008.5.1.4.1.1.7.2') # noqa """1.2.840.10008.5.1.4.1.1.7.2""" MultiFrameGrayscaleWordSecondaryCaptureImageStorage = UID('1.2.840.10008.5.1.4.1.1.7.3') # noqa """1.2.840.10008.5.1.4.1.1.7.3""" MultiFrameTrueColorSecondaryCaptureImageStorage = UID('1.2.840.10008.5.1.4.1.1.7.4') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """1.2.840.10008.5.1.4.1.1.77.1.7""" LensometryMeasurementsStorage = UID('1.2.840.10008.5.1.4.1.1.78.1') # noqa """1.2.840.10008.5.1.4.1.1.78.1""" AutorefractionMeasurementsStorage = UID('1.2.840.10008.5.1.4.1.1.78.2') # noqa """1.2.840.10008.5.1.4.1.1.78.2""" KeratometryMeasurementsStorage = UID('1.2.840.10008.5.1.4.1.1.78.3') # noqa """1.2.840.10008.5.1.4.1.1.78.3""" SubjectiveRefractionMeasurementsStorage = UID('1.2.840.10008.5.1.4.1.1.78.4') # noqa """1.2.840.10008.5.1.4.1.1.78.4""" VisualAcuityMeasurementsStorage = UID('1.2.840.10008.5.1.4.1.1.78.5') # noqa """1.2.840.10008.5.1.4.1.1.78.5""" SpectaclePrescriptionReportStorage = UID('1.2.840.10008.5.1.4.1.1.78.6') # noqa """1.2.840.10008.5.1.4.1.1.78.6""" OphthalmicAxialMeasurementsStorage = UID('1.2.840.10008.5.1.4.1.1.78.7') # noqa """1.2.840.10008.5.1.4.1.1.78.7""" IntraocularLensCalculationsStorage = UID('1.2.840.10008.5.1.4.1.1.78.8') # noqa """1.2.840.10008.5.1.4.1.1.78.8""" MacularGridThicknessAndVolumeReportStorage = UID('1.2.840.10008.5.1.4.1.1.79.1') # noqa """1.2.840.10008.5.1.4.1.1.79.1""" OphthalmicVisualFieldStaticPerimetryMeasurementsStorage = UID('1.2.840.10008.5.1.4.1.1.80.1') # noqa """1.2.840.10008.5.1.4.1.1.80.1""" OphthalmicThicknessMapStorage = UID('1.2.840.10008.5.1.4.1.1.81.1') # noqa """1.2.840.10008.5.1.4.1.1.81.1""" CornealTopographyMapStorage = UID('1.2.840.10008.5.1.4.1.1.82.1') # noqa """1.2.840.10008.5.1.4.1.1.82.1""" BasicTextSRStorage = UID('1.2.840.10008.5.1.4.1.1.88.11') # noqa """1.2.840.10008.5.1.4.1.1.88.11""" EnhancedSRStorage = UID('1.2.840.10008.5.1.4.1.1.88.22') # noqa """1.2.840.10008.5.1.4.1.1.88.22""" ComprehensiveSRStorage = UID('1.2.840.10008.5.1.4.1.1.88.33') # noqa """1.2.840.10008.5.1.4.1.1.88.33""" Comprehensive3DSRStorage = UID('1.2.840.10008.5.1.4.1.1.88.34') # noqa """1.2.840.10008.5.1.4.1.1.88.34""" ExtensibleSRStorage = UID('1.2.840.10008.5.1.4.1.1.88.35') # noqa """1.2.840.10008.5.1.4.1.1.88.35""" ProcedureLogStorage = UID('1.2.840.10008.5.1.4.1.1.88.40') # noqa """1.2.840.10008.5.1.4.1.1.88.40""" MammographyCADSRStorage = UID('1.2.840.10008.5.1.4.1.1.88.50') # noqa """1.2.840.10008.5.1.4.1.1.88.50""" KeyObjectSelectionDocumentStorage = UID('1.2.840.10008.5.1.4.1.1.88.59') # noqa """1.2.840.10008.5.1.4.1.1.88.59""" ChestCADSRStorage = UID('1.2.840.10008.5.1.4.1.1.88.65') # noqa """1.2.840.10008.5.1.4.1.1.88.65""" XRayRadiationDoseSRStorage = UID('1.2.840.10008.5.1.4.1.1.88.67') # noqa """1.2.840.10008.5.1.4.1.1.88.67""" RadiopharmaceuticalRadiationDoseSRStorage = UID('1.2.840.10008.5.1.4.1.1.88.68') # noqa """1.2.840.10008.5.1.4.1.1.88.68""" ColonCADSRStorage = UID('1.2.840.10008.5.1.4.1.1.88.69') # noqa """1.2.840.10008.5.1.4.1.1.88.69""" ImplantationPlanSRStorage = UID('1.2.840.10008.5.1.4.1.1.88.70') # noqa """1.2.840.10008.5.1.4.1.1.88.70""" AcquisitionContextSRStorage = UID('1.2.840.10008.5.1.4.1.1.88.71') # noqa """1.2.840.10008.5.1.4.1.1.88.71""" SimplifiedAdultEchoSRStorage = UID('1.2.840.10008.5.1.4.1.1.88.72') # noqa """1.2.840.10008.5.1.4.1.1.88.72""" PatientRadiationDoseSRStorage = UID('1.2.840.10008.5.1.4.1.1.88.73') # noqa """1.2.840.10008.5.1.4.1.1.88.73""" PlannedImagingAgentAdministrationSRStorage = UID('1.2.840.10008.5.1.4.1.1.88.74') # noqa """1.2.840.10008.5.1.4.1.1.88.74""" PerformedImagingAgentAdministrationSRStorage = UID('1.2.840.10008.5.1.4.1.1.88.75') # noqa """1.2.840.10008.5.1.4.1.1.88.75""" EnhancedXRayRadiationDoseSRStorage = UID('1.2.840.10008.5.1.4.1.1.88.76') # noqa """1.2.840.10008.5.1.4.1.1.88.76""" TwelveLeadECGWaveformStorage = UID('1.2.840.10008.5.1.4.1.1.9.1.1') # noqa """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') # noqa """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') # noqa """1.2.840.10008.5.1.4.1.1.9.1.3""" HemodynamicWaveformStorage = UID('1.2.840.10008.5.1.4.1.1.9.2.1') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """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') # noqa """1.2.840.10008.5.1.4.1.1.90.1""" MicroscopyBulkSimpleAnnotationsStorage = UID('1.2.840.10008.5.1.4.1.1.91.1') # noqa """1.2.840.10008.5.1.4.1.1.91.1""" RTBrachyApplicationSetupDeliveryInstructionStorage = UID('1.2.840.10008.5.1.4.34.10') # noqa """1.2.840.10008.5.1.4.34.10""" RTBeamsDeliveryInstructionStorage = UID('1.2.840.10008.5.1.4.34.7') # noqa """1.2.840.10008.5.1.4.34.7""" HangingProtocolStorage = UID('1.2.840.10008.5.1.4.38.1') # noqa """1.2.840.10008.5.1.4.38.1""" ColorPaletteStorage = UID('1.2.840.10008.5.1.4.39.1') # noqa """1.2.840.10008.5.1.4.39.1""" GenericImplantTemplateStorage = UID('1.2.840.10008.5.1.4.43.1') # noqa """1.2.840.10008.5.1.4.43.1""" ImplantAssemblyTemplateStorage = UID('1.2.840.10008.5.1.4.44.1') # noqa """1.2.840.10008.5.1.4.44.1""" ImplantTemplateGroupStorage = UID('1.2.840.10008.5.1.4.45.1') # noqa """1.2.840.10008.5.1.4.45.1""" pydicom-2.4.3/pydicom/util/000077500000000000000000000000001446675437500156325ustar00rootroot00000000000000pydicom-2.4.3/pydicom/util/__init__.py000066400000000000000000000000001446675437500177310ustar00rootroot00000000000000pydicom-2.4.3/pydicom/util/codify.py000066400000000000000000000420631446675437500174660ustar00rootroot00000000000000# 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 Optional, List, Callable, cast 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 http://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: Optional[int] = None, include_private: bool = False, var_names: Optional[deque] = 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 : Union[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: Union[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: Optional[int] = None, include_private: bool = False, name_filter: Callable[[str], str] = default_name_filter, var_names: Optional[deque] = 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: Union[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 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: Optional[int] = None, include_private: bool = False, is_file_meta: bool = False, var_names: Optional[deque] = 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: Optional[int] = 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 : Union[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: Optional[int] = 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 : Union[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") lines.append("ds.is_implicit_VR = " + str(ds.is_implicit_VR)) lines.append("ds.is_little_endian = " + str(ds.is_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}', write_like_original=False)" ) 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: Optional[List[str]] = 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-2.4.3/pydicom/util/dump.py000066400000000000000000000075641446675437500171650ustar00rootroot00000000000000# 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 Union, Optional, 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: Union[str, bytes, os.PathLike], start_address: int = 0, stop_address: Optional[int] = 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: Optional[int] = 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: Optional[int] = 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-2.4.3/pydicom/util/fixer.py000066400000000000000000000102431446675437500173210ustar00rootroot00000000000000# 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, Tuple 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-2.4.3/pydicom/util/hexutil.py000066400000000000000000000030501446675437500176640ustar00rootroot00000000000000# 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 typing import Union from pydicom.charset import default_encoding def hex2bytes(hexstring: Union[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-2.4.3/pydicom/util/leanread.py000066400000000000000000000145011446675437500177600ustar00rootroot00000000000000# 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 ( Iterator, Tuple, Optional, Union, Type, cast, BinaryIO, 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], Optional[bytes], int, Optional[bytes], int ] class dicomfile: """Context-manager based DICOM file object with data element iteration""" def __init__(self, filename: Union[str, bytes, os.PathLike]) -> None: self.fobj = fobj = open(filename, "rb") # Read the DICOM preamble, if present self.preamble: Optional[bytes] = 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: Optional[Type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[TracebackType] ) -> Optional[bool]: self.fobj.close() return None # noqa: PLR1711 def __iter__(self) -> Iterator[_ElementType]: # Need the transfer_syntax later tsyntax: Optional[UID] = 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: Optional[Callable[[int, int], bool]] = None, defer_size: Optional[Union[str, int, float]] = 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-2.4.3/pydicom/valuerep.py000066400000000000000000002173721446675437500170660ustar00rootroot00000000000000# 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 import sys from math import floor, isfinite, log10 from typing import ( TypeVar, Type, Tuple, Optional, List, Dict, Union, Any, Callable, MutableSequence, Sequence, cast, Iterator ) import warnings # don't import datetime_conversion directly from pydicom import config from pydicom.multival import MultiValue # 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 fr"^{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: Union[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: Union[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[Union[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: Union[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, "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: Optional[Callable[[str, Any], Tuple[bool, str]]] = 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) warnings.warn(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" # 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 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__( # type: ignore[override] self, protocol: int ) -> Tuple[Any, ...]: # 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'"{str(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: warnings.warn( "'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: warnings.warn( "'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: Union[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: Union[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( "Cannot encode non-finite floats as DICOM decimal strings. " f"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(Union[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: Union[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: Union[None, str, int, float, Decimal], auto_format: bool = False, validation_mode: int = None ) -> Optional[Union[str, "DSfloat"]]: if val is None: return val if isinstance(val, str) and val.strip() == '': return val return super().__new__(cls, val) def __init__( self, val: Union[str, int, float, Decimal], auto_format: bool = False, validation_mode: int = 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 # ... 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 "{str(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 self.auto_format and 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: Union[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: Union[None, str, int, float, Decimal], auto_format: bool = False, validation_mode: int = None ) -> Optional[Union[str, "DSdecimal"]]: """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: Union[str, int, float, Decimal], auto_format: bool = False, validation_mode: int = 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 # ... 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) warnings.warn(msg) if not is_valid_ds(repr(self).strip("'")): # This will catch nan and inf msg = ( f'Value "{str(self)}" is not valid for elements with a VR ' 'of DS' ) if validation_mode == config.RAISE: raise ValueError(msg) warnings.warn(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 self.auto_format and hasattr(self, 'original_string'): return f"'{self.original_string}'" return f"'{str(self)}'" # CHOOSE TYPE OF DS DSclass: Any if config.use_DS_decimal: DSclass = DSdecimal else: DSclass = DSfloat def DS( val: Union[None, str, int, float, Decimal], auto_format: bool = False, validation_mode: int = None ) -> Union[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: Union[str, float, Decimal], validation_mode: int = None ) -> float: return super().__new__(cls, val) def __init__(self, val: Union[str, float, Decimal], validation_mode: int = 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 "{str(self)}" is not valid for elements with a VR ' 'of IS' ) if validation_mode == config.WARN: warnings.warn(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: Union[None, str, int, float, Decimal], validation_mode: int = None ) -> Optional[Union[str, "IS", "ISfloat"]]: """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: Union[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: Union[str, int, float, Decimal], validation_mode: int = 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__()}'" _T = TypeVar('_T') def MultiString( val: str, valtype: Optional[Callable[[str], _T]] = None, validation_mode: int = None ) -> Union[_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. validation_mode : int Defines if values are validated and how validation errors are handled. Returns ------- valtype or MultiValue of valtype The split value as `valtype` or a :class:`list` of `valtype`. """ if valtype is None: valtype = cast(Callable[[str], _T], str) # Remove trailing blank used to pad to even length # 2005.05.25: also check for trailing 0, error made # in PET files we are converting while val and val.endswith((' ', '\x00')): val = val[:-1] splitup: List[str] = val.split("\\") if len(splitup) == 1: return valtype(splitup[0]) return MultiValue(valtype, splitup, validation_mode) def _verify_encodings( encodings: Optional[Union[str, Sequence[str]]] ) -> Optional[Tuple[str, ...]]: """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: Union[bytes, str, "PersonName"], encodings: Optional[Sequence[str]] = None, original_string: Optional[bytes] = None, validation_mode: int = 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: Optional[Tuple[str, ...]] = None self.encodings: Optional[Tuple[str, ...]] 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`. .. versionadded:: 1.2 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 .. versionadded:: 1.2 """ 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 .. versionadded:: 1.2 """ 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 .. versionadded:: 1.2 """ 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 .. versionadded:: 1.2 """ 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 .. versionadded:: 1.2 """ 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 .. versionadded:: 1.2 """ try: return self.components[1] except IndexError: return '' @property def phonetic(self) -> str: """Return the third (phonetic) person name component as a unicode string .. versionadded:: 1.2 """ 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: Optional[Sequence[str]] = 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: Optional[Sequence[str]] = 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[Union[str, bytes]], ideographic_group: Sequence[Union[str, bytes]], phonetic_group: Sequence[Union[str, bytes]], encodings: Optional[List[str]] = 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[Union[str, bytes]] List of components for the alphabetic group. ideographic_group: Sequence[Union[str, bytes]] List of components for the ideographic group. phonetic_group: Sequence[Union[str, bytes]] List of components for the phonetic group. encodings: Optional[List[str]] 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: Union[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[Union[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: Union[str, bytes] = '', given_name: Union[str, bytes] = '', middle_name: Union[str, bytes] = '', name_prefix: Union[str, bytes] = '', name_suffix: Union[str, bytes] = '', family_name_ideographic: Union[str, bytes] = '', given_name_ideographic: Union[str, bytes] = '', middle_name_ideographic: Union[str, bytes] = '', name_prefix_ideographic: Union[str, bytes] = '', name_suffix_ideographic: Union[str, bytes] = '', family_name_phonetic: Union[str, bytes] = '', given_name_phonetic: Union[str, bytes] = '', middle_name_phonetic: Union[str, bytes] = '', name_prefix_phonetic: Union[str, bytes] = '', name_suffix_phonetic: Union[str, bytes] = '', encodings: Optional[List[str]] = 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: Union[str, bytes] Family name in alphabetic form. given_name: Union[str, bytes] Given name in alphabetic form. middle_name: Union[str, bytes] Middle name in alphabetic form. name_prefix: Union[str, bytes] Name prefix in alphabetic form, e.g. 'Mrs.', 'Dr.', 'Sr.', 'Rev.'. name_suffix: Union[str, bytes] Name prefix in alphabetic form, e.g. 'M.D.', 'B.A., M.Div.', 'Chief Executive Officer'. family_name_ideographic: Union[str, bytes] Family name in ideographic form. given_name_ideographic: Union[str, bytes] Given name in ideographic form. middle_name_ideographic: Union[str, bytes] Middle name in ideographic form. name_prefix_ideographic: Union[str, bytes] Name prefix in ideographic form. name_suffix_ideographic: Union[str, bytes] Name suffix in ideographic form. family_name_phonetic: Union[str, bytes] Family name in phonetic form. given_name_phonetic: Union[str, bytes] Given name in phonetic form. middle_name_phonetic: Union[str, bytes] Middle name in phonetic form. name_prefix_phonetic: Union[str, bytes] Name prefix in phonetic form. name_suffix_phonetic: Union[str, bytes] Name suffix in phonetic form. encodings: Optional[List[str]] 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[Union[str, bytes]] = [ family_name, given_name, middle_name, name_prefix, name_suffix, ] # Ideographic component group ideographic_group: List[Union[str, bytes]] = [ family_name_ideographic, given_name_ideographic, middle_name_ideographic, name_prefix_ideographic, name_suffix_ideographic, ] # Phonetic component group phonetic_group: List[Union[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: Union[str, bytes] = '', patient_name: Union[str, bytes] = '', responsible_party_name_ideographic: Union[str, bytes] = '', patient_name_ideographic: Union[str, bytes] = '', responsible_party_name_phonetic: Union[str, bytes] = '', patient_name_phonetic: Union[str, bytes] = '', encodings: Optional[List[str]] = 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: Union[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: Union[str, bytes] Patient name in alphabetic form. responsible_party_name_ideographic: Union[str, bytes] Name of the responsible party in ideographic form. patient_name_ideographic: Union[str, bytes] Patient name in ideographic form. responsible_party_name_phonetic: Union[str, bytes] Name of the responsible party in phonetic form. patient_name_phonetic: Union[str, bytes] Patient name in phonetic form. encodings: Optional[List[str]] 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[Union[str, bytes]] = [ responsible_party_name, patient_name, ] ideographic_group: List[Union[str, bytes]] = [ responsible_party_name_ideographic, patient_name_ideographic, ] phonetic_group: List[Union[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) # Alias old class names for backwards compat in user code def __getattr__(name: str) -> Any: if name == "PersonNameUnicode": warnings.warn( "'PersonNameUnicode' is deprecated and will be removed in " "pydicom v3.0, use 'PersonName' instead", DeprecationWarning ) return globals()['PersonName'] raise AttributeError(f"module {__name__} has no attribute {name}") if sys.version_info[:2] < (3, 7): PersonNameUnicode = PersonName pydicom-2.4.3/pydicom/values.py000066400000000000000000000640061446675437500165340ustar00rootroot00000000000000# 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 ( Optional, Union, List, Tuple, cast, MutableSequence, Any ) # 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 ( MultiString, DA, DT, TM, TEXT_VR_DELIMS, IS, CUSTOMIZABLE_CHARSET_VR, VR as VR_, validate_value ) try: import numpy have_numpy = True except ImportError: have_numpy = False from pydicom.valuerep import PersonName def convert_tag( byte_string: bytes, is_little_endian: bool, offset: int = 0 ) -> BaseTag: """Return a decoded :class:`BaseTag` from the encoded `byte_string`. 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. """ 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: Optional[str] = None ) -> Union[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: Optional[str] = None ) -> Union[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( "Expected length to be multiple of 4 for VR 'AT', " f"got length {length}" ) 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: Optional[str] = None ) -> Union[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: Optional[str] = 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 MultiString(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: Optional[str] = None ) -> Union[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: Optional[str] = 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 MultiString(num_string, valtype=pydicom.valuerep.IS) def convert_numbers( byte_string: bytes, is_little_endian: bool, struct_format: str ) -> Union[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: Union[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: Optional[str] = None ) -> bytes: """Return encoded 'OB' value as :class:`bytes`.""" return byte_string def convert_OWvalue( byte_string: bytes, is_little_endian: bool, struct_format: Optional[str] = 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: Optional[str] = None ) -> bytes: """Return the encoded 'OV' value as :class:`bytes`. .. versionadded:: 1.4 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: Optional[List[str]] = None ) -> Union[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_splitted = decoded_value.split('\\') if len(value_splitted) == 1: return get_valtype(value_splitted[0]) return MultiValue(get_valtype, value_splitted) def convert_string( byte_string: bytes, is_little_endian: bool, struct_format: Optional[str] = None ) -> Union[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 MultiString(byte_string.decode(default_encoding)) def convert_text( byte_string: bytes, encodings: Optional[List[str]] = None, vr: str = None ) -> Union[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, validation_mode=config.settings.reading_validation_mode) def convert_single_string( byte_string: bytes, encodings: Optional[List[str]] = None, vr: str = 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: Optional[List[str]] = 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: Optional[str] = None ) -> Union[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: Optional[str] = None ) -> Union[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 MultiString(value.rstrip('\0 '), pydicom.uid.UID) def convert_UN( byte_string: bytes, is_little_endian: bool, struct_format: Optional[str] = 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: Optional[str] = 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: Optional[Union[str, MutableSequence[str]]] = None ) -> Union[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(['0x{:02x}'.format(ord(ch)) 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-2.4.3/pydicom/waveforms/000077500000000000000000000000001446675437500166665ustar00rootroot00000000000000pydicom-2.4.3/pydicom/waveforms/__init__.py000066400000000000000000000001301446675437500207710ustar00rootroot00000000000000from pydicom.waveforms.numpy_handler import ( generate_multiplex, multiplex_array ) pydicom-2.4.3/pydicom/waveforms/numpy_handler.py000066400000000000000000000206041446675437500221070ustar00rootroot00000000000000# 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, Generator, cast, List 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': ('http://www.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-2.4.3/pyproject.toml000066400000000000000000000053731446675437500161350ustar00rootroot00000000000000# [build-system] # requires = ["setuptools"] # , "setuptools-scm"] # build-backend = "setuptools.build_meta" [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.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "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"] uncomment for pydicom v3.0 keywords = ["dicom, python, medical, imaging"] license = {text = "MIT"} name = "pydicom" readme = "README.md" requires-python = ">=3.7" version = "2.4.3" [project.optional-dependencies] docs = [ "numpy", "numpydoc", "matplotlib", "pillow", "sphinx", "sphinx_rtd_theme", "sphinx-gallery", "sphinxcontrib-napoleon", "sphinx-copybutton" ] [project.urls] documentation = "https://pydicom.github.io/pydicom" download = "https://github.com/pydicom/pydicom/archive/master.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" [tool.flit.sdist] # include = ["pydicom/"] exclude = ["pydicom/tests"] [tool.setuptools] packages.find.include = ['pydicom*'] packages.find.exclude = ['pydicom*tests'] include-package-data = false [tool.setuptools_scm] # For pydicom v3.0, uncomment the following line # write_to = "pydicom/_version.py" [tool.ruff] select = [ "C9", "E", "F", "PL", "W", ] ignore = [ "E402", "F401", "F403", "F405", "F541", "F601", "F811", "F841", "PLR5501", "PLC1901", "PLR2004", "PLW0603", "PLW2901", ] line-length = 214 target-version = "py37" [tool.ruff.mccabe] max-complexity = 32 [tool.ruff.pylint] max-args = 17 max-branches = 39 max-returns = 9 max-statements = 106 [tool.ruff.per-file-ignores] "*/__init__.py" = ["F401"] "pydicom/config.py" = ["PLW0602"] pydicom-2.4.3/setup.cfg000066400000000000000000000000601446675437500150260ustar00rootroot00000000000000[aliases] test=pytest [bdist_wheel] universal=0pydicom-2.4.3/setup.py000066400000000000000000000052701446675437500147270ustar00rootroot00000000000000# Remove setup.py in pydicom v3.0 import os from pathlib import Path from setuptools import setup, find_packages try: import dicom HAVE_DICOM = True except ImportError: HAVE_DICOM = False BASE_DIR = Path(__file__).parent with open(BASE_DIR / "pydicom" / "_version.py") as f: exec(f.read()) with open(BASE_DIR / 'README.md') as f: long_description = f.read() def data_files_inventory(): root = BASE_DIR / "pydicom" / "data" files = [ f.relative_to(BASE_DIR / "pydicom") for f in root.glob("**/*") if f.is_file() and f.suffix != ".pyc" ] return [os.fspath(f) for f in files] setup( name="pydicom", version=__version__, # noqa: F821 author="Darcy Mason and contributors", author_email="darcymason@gmail.com", description="A pure Python package for reading and writing DICOM data", long_description=long_description, long_description_content_type='text/markdown', url="https://github.com/pydicom/pydicom", download_url="https://github.com/pydicom/pydicom/archive/master.zip", license="MIT", keywords="dicom python medical imaging", 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.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Operating System :: OS Independent", "Topic :: Scientific/Engineering :: Medical Science Apps.", "Topic :: Scientific/Engineering :: Physics", "Topic :: Software Development :: Libraries" ], packages=find_packages(), py_modules=[] if not HAVE_DICOM else ["dicom"], package_data={ 'pydicom': data_files_inventory() + ['py.typed'], }, include_package_data=True, zip_safe=False, python_requires='>=3.7', install_requires=[], extras_require={ "docs": [ "numpy", "numpydoc", "matplotlib", "pillow", "sphinx", "sphinx_rtd_theme", "sphinx-gallery", "sphinxcontrib-napoleon", "sphinx-copybutton", ], }, entry_points={ "console_scripts": ["pydicom=pydicom.cli.main:main"], "pydicom_subcommands": [ "codify = pydicom.cli.codify:add_subparser", "show = pydicom.cli.show:add_subparser" ], }, ) pydicom-2.4.3/source/000077500000000000000000000000001446675437500145115ustar00rootroot00000000000000pydicom-2.4.3/source/generate_cids/000077500000000000000000000000001446675437500173055ustar00rootroot00000000000000pydicom-2.4.3/source/generate_cids/generate_concept_dicts.py000077500000000000000000000332701446675437500243620ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # Encoding required to deal with 'micro' character """Script for auto-generating DICOM SR context groups from FHIR JSON value set resources. """ from io import BytesIO import json import ftplib import glob import logging import os import re import sys import tempfile from pprint import pprint from xml.etree import ElementTree as ET if sys.version_info[0] < 3: import urllib as urllib_request else: import urllib.request as urllib_request logger = logging.getLogger(__name__) # Example excerpt fhir JSON for reference """ "resourceType":"ValueSet", "id":"dicom-cid-10-InterventionalDrug", ... "name":"InterventionalDrug", ... "compose":{ "include":[ { "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', } DOC_LINES = [ '# Auto-generated by {}.\n'.format(os.path.basename(__file__)), '# -*- coding: utf-8 -*-\n', '\n', ] 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” name = name.replace("(s)", "s") # “Patient’s Name” -> “PatientName” # “Operators’ Name” -> “OperatorsName” name = name.replace("’s ", " ") name = name.replace("'s ", " ") name = name.replace("s’ ", "s ") name = name.replace("s' ", "s ") # Mathematical symbols name = name.replace("%", " Percent ") name = name.replace(">", " Greater Than ") name = name.replace("=", " Equals ") name = name.replace("<", " Lesser Than ") name = re.sub(r'([0-9]+)\.([0-9]+)', '\\1 Point \\2', name) name = re.sub(r'\s([0-9.]+)-([0-9.]+)\s', ' \\1 To \\2 ', name) name = re.sub(r'([0-9]+)day', '\\1 Day', name) name = re.sub(r'([0-9]+)y', '\\1 Years', name) # Remove category modifiers, such as "(specimen)", "(procedure)", # "(body structure)", etc. name = re.sub(r"^(.+) \([a-z ]+\)$", '\\1', name) name = camel_case(name.strip()) # Python variables must not begin with a number. if re.match(r'[0-9]', name): name = "_" + name return name def download_fhir_value_sets(local_dir): ftp_host = 'medical.nema.org' if not os.path.exists(local_dir): os.makedirs(local_dir) logger.info('storing files in ' + local_dir) logger.info('log into FTP server "{}"'.format(ftp_host)) ftp = ftplib.FTP(ftp_host, timeout=60) ftp.login('anonymous') ftp_path = 'medical/dicom/resources/valuesets/fhir/json' logger.info('list files in directory "{}"'.format(ftp_path)) fhir_value_set_files = ftp.nlst(ftp_path) try: for ftp_filepath in fhir_value_set_files: ftp_filename = os.path.basename(ftp_filepath) logger.info('retrieve value set file "{}"'.format(ftp_filename)) with BytesIO() as fp: ftp.retrbinary('RETR {}'.format(ftp_filepath), fp.write) content = fp.getvalue() local_filename = os.path.join(local_dir, ftp_filename) with open(local_filename, 'wb') as f_local: f_local.write(content) finally: ftp.quit() def _parse_html(content): # from lxml import html # doc = html.document_fromstring(content) return ET.fromstring(content, parser=ET.XMLParser(encoding='utf-8')) def _download_html(url): response = urllib_request.urlopen(url) return response.read() def _get_text(element): text = "".join(element.itertext()) return text.strip() def get_table_o1(): logger.info('process Table O1') url = 'http://dicom.nema.org/medical/dicom/current/output/chtml/part16/chapter_O.html#table_O-1' root = _parse_html(_download_html(url)) 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) data = [] for row in rows: data.append(( _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]), )) return data def get_table_d1(): logger.info('process Table D1') url = 'http://dicom.nema.org/medical/dicom/current/output/chtml/part16/chapter_D.html#table_D-1' root = _parse_html(_download_html(url)) 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, cid_concepts, cid_lists, name_for_cid): 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("_concepts_dict.py", 'w', encoding="UTF8") as f_concepts: f_concepts.writelines(lines) f_concepts.write("concepts = {}\n") # start with empty dict for scheme, value in concepts.items(): f_concepts.write("\nconcepts['{}'] = \\\n".format(scheme)) pprint(value, f_concepts) lines = (DOC_LINES + ['# Dict with cid number as keys; value format is:\n', '# {scheme designator: \n', '# scheme_designator: ...}\n', '\n', ] ) with open("_cid_dict.py", 'w', encoding="UTF8") as f_cid: f_cid.writelines(lines) f_cid.write("name_for_cid = {}\n") f_cid.write("cid_concepts = {}\n") for cid, value in cid_lists.items(): f_cid.write("\nname_for_cid[{}] = '{}'\n".format( cid, name_for_cid[cid])) f_cid.write("cid_concepts[{}] = \\\n".format(cid)) pprint(value, f_cid) def write_snomed_mapping(snomed_codes): with open("_snomed_dict.py", 'w', encoding="UTF8") as f_concepts: 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_concepts.writelines(lines) f_concepts.write("mapping = {}\n") # start with empty dict f_concepts.write("\nmapping['{}'] = {{\n".format('SCT')) for sct, srt, meaning in snomed_codes: f_concepts.write(" '{}': '{}',\n".format(sct, srt)) f_concepts.write("}\n") f_concepts.write("\nmapping['{}'] = {{\n".format('SRT')) for sct, srt, meaning in snomed_codes: f_concepts.write(" '{}': '{}',\n".format(srt, sct)) f_concepts.write("}") if __name__ == '__main__': logging.basicConfig(level=logging.INFO) local_dir = tempfile.gettempdir() fhir_dir = os.path.join(local_dir, "fhir") if not os.path.exists(fhir_dir) or not os.listdir(fhir_dir): download_fhir_value_sets(fhir_dir) else: msg = "Using locally downloaded files\n" msg += "from directory " + fhir_dir logging.info(msg) fhir_value_set_files = glob.glob(os.path.join(fhir_dir, "*")) cid_pattern = re.compile('^dicom-cid-([0-9]+)-[a-zA-Z]+') concepts = dict() cid_lists = dict() name_for_cid = dict() # XXX = 0 try: for ftp_filepath in fhir_value_set_files: ftp_filename = os.path.basename(ftp_filepath) logger.info('process file "{}"'.format(ftp_filename)) with open(ftp_filepath, 'rb') as fp: content = fp.read() value_set = json.loads(content) cid_match = cid_pattern.search(value_set['id']) cid = int(cid_match.group(1)) # can take int off to store as string name_for_cid[cid] = value_set['name'] cid_concepts = {} for group in value_set['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 ' 'has not been specified: {}'.format(system) ) if scheme_designator not in concepts: concepts[scheme_designator] = dict() for concept in group['concept']: name = keyword_from_meaning(concept['display']) code = concept['code'].strip() display = concept['display'].strip() # If new name under this scheme, start dict of codes/cids that use that code if name not in concepts[scheme_designator]: concepts[scheme_designator][name] = {code: (display, [cid])} else: prior = concepts[scheme_designator][name] if code in prior: prior[code][1].append(cid) else: prior[code] = (display, [cid]) if prior[code][0].lower() != display.lower(): # Meanings can only be different by symbols, etc. # because converted to same keyword. # Nevertheless, print as info msg = "'{}': Meaning '{}' in cid_{}, previously '{}' in cids {}" msg = msg.format(name, display, cid, prior[code][0], prior[code][1]) logger.info(msg) # Keep track of this cid referencing that name if scheme_designator not in cid_concepts: cid_concepts[scheme_designator] = [] if name in cid_concepts[scheme_designator]: msg = "'{}': Meaning '{}' in cid_{} is duplicated!" msg = msg.format(name, concept['display'], cid) logger.warning(msg) cid_concepts[scheme_designator].append(name) cid_lists[cid] = cid_concepts # if XXX > 3: # break # XXX += 1 scheme_designator = "SCT" snomed_codes = get_table_o1() for code, srt_code, meaning in snomed_codes: name = keyword_from_meaning(meaning) if name not in concepts[scheme_designator]: concepts[scheme_designator][name] = {code: (meaning, [])} else: prior = concepts[scheme_designator][name] if code not in prior: prior[code] = (meaning, []) scheme_designator = "DCM" dicom_codes = get_table_d1() for code, meaning in dicom_codes: name = keyword_from_meaning(meaning) if name not in concepts[scheme_designator]: concepts[scheme_designator][name] = {code: (meaning, [])} else: prior = concepts[scheme_designator][name] if code not in prior: prior[code] = (meaning, []) finally: # If any error or KeyboardInterrupt, close up and write what we have write_concepts(concepts, cid_concepts, cid_lists, name_for_cid) write_snomed_mapping(snomed_codes) pydicom-2.4.3/source/generate_dict/000077500000000000000000000000001446675437500173065ustar00rootroot00000000000000pydicom-2.4.3/source/generate_dict/generate_dicom_dict.py000077500000000000000000000271661446675437500236470ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # 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 / "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( ", # noqa\n ".join( entry_format.format(**attr) for attr in attributes ) ) fp.write(" # noqa\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 = "http://medical.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('{http://docbook.org/ns/docbook}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' ) f.write("from typing import Dict, Tuple\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-2.4.3/source/generate_dict/generate_private_dict.py000077500000000000000000000072711446675437500242210ustar00rootroot00000000000000"""Update the _private_dict.py file using data from the GDCM private dict.""" import os import xml.etree.ElementTree as ET try: import urllib2 # python2 except ImportError: import urllib.request as urllib2 # python3 GDCM_PRIVATE_DICT = "https://raw.githubusercontent.com/malaterre/GDCM" GDCM_PRIVATE_DICT = '%s/master/Source/DataDictionary' % (GDCM_PRIVATE_DICT) GDCM_PRIVATE_DICT = "%s/privatedicts.xml" % (GDCM_PRIVATE_DICT) PYDICOM_DICT_NAME = ( 'private_dictionaries: Dict[str, Dict[str, Tuple[str, str, str, str]]]' ) _PKG_DIRECTORY = os.path.join( os.path.dirname(__file__), '..', '..', 'pydicom' ) PYDICOM_DICT_FILENAME = os.path.join(_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). """ def parse_private_docbook(doc_root): """Return a dict containing the private dictionary data""" entries = {} for entry in root: owner = entry.attrib['owner'] if owner not in entries: entries[owner] = {} tag = entry.attrib['group'] + entry.attrib['element'] # Convert unknown element names to 'Unknown' if entry.attrib['name'] == '?': entry.attrib['name'] = 'Unknown' # Escape backslash in element names if "\\" in entry.attrib['name']: entry.attrib['name'] = entry.attrib['name'].replace("\\", "\\\\") entries[owner][tag] = (entry.attrib['vr'], entry.attrib['vm'], entry.attrib['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("\n{0} = {{\n".format(dict_name)) for owner in sorted(dict_entries): fp.write(" '{0}': {{\n".format(owner)) for entry in sorted(dict_entries[owner]): if "'" in dict_entries[owner][entry][2]: format_str = " '{0}': ('{1}', '{2}', \"{3}\", '{4}'), # noqa\n" else: format_str = " '{0}': ('{1}', '{2}', '{3}', '{4}'), # noqa\n" fp.write(format_str.format(entry, dict_entries[owner][entry][0], dict_entries[owner][entry][1], dict_entries[owner][entry][2], dict_entries[owner][entry][3])) fp.write(" },\n") fp.write("}\n") if __name__ == "__main__": response = urllib2.urlopen(GDCM_PRIVATE_DICT) tree = ET.parse(response) root = tree.getroot() entries = parse_private_docbook(root) py_file = open(PYDICOM_DICT_FILENAME, "w") py_file.write('"""' + PYDICOM_DICT_DOCSTRING + '"""') py_file.write('\n') py_file.write("from typing import Dict, Tuple\n\n") write_dict(py_file, PYDICOM_DICT_NAME, entries) py_file.close() pydicom-2.4.3/source/generate_dict/generate_uid_dict.py000077500000000000000000000170361446675437500233300ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- """ 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 / "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 Name}', '{UID Type}', '{UID Info}', '{Retired}', " "'{UID Keyword}')" ) entry_format = "'{UID Value}': %s" % (uid_entry) fp.write(f"\n{dict_name} = {{\n ") fp.write( ", # noqa\n ".join( entry_format.format(**attr) for attr in attributes ) ) fp.write(" # noqa\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('{http://docbook.org/ns/docbook}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-2.4.3/source/generate_uids/000077500000000000000000000000001446675437500173275ustar00rootroot00000000000000pydicom-2.4.3/source/generate_uids/generate_storage_sopclass_uids.py000077500000000000000000000046221446675437500261610ustar00rootroot00000000000000#!/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}') # noqa\n" def update_uids(path: Path) -> None: """Update pydicom.uid with Storage SOP Class UID definitions.""" retained_lines = [] with open(path, "r") 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, "r") 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 / "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-2.4.3/source/scripts/000077500000000000000000000000001446675437500162005ustar00rootroot00000000000000pydicom-2.4.3/source/scripts/charlist.py000066400000000000000000000032541446675437500203670ustar00rootroot00000000000000# 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" )