From 887f2944e5b295cd98a5ade9e420185756eec536 Mon Sep 17 00:00:00 2001 From: Kay Robbins <1189050+VisLab@users.noreply.github.com> Date: Fri, 27 Sep 2024 10:47:42 -0500 Subject: [PATCH] Updated value classes based on JSON (#1018) * Bump spec_tests/hed-examples from `8824691` to `7117cf9` Bumps [spec_tests/hed-examples](https://github.com/hed-standard/hed-examples) from `8824691` to `7117cf9`. - [Release notes](https://github.com/hed-standard/hed-examples/releases) - [Commits](https://github.com/hed-standard/hed-examples/compare/88246912339625df9c88554071465c14eaa68396...7117cf91ae97dcf388157242a911bfb6b2907607) --- updated-dependencies: - dependency-name: spec_tests/hed-examples dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump spec_tests/hed-specification from `5465995` to `5bc506c` Bumps [spec_tests/hed-specification](https://github.com/hed-standard/hed-specification) from `5465995` to `5bc506c`. - [Release notes](https://github.com/hed-standard/hed-specification/releases) - [Commits](https://github.com/hed-standard/hed-specification/compare/54659951ca1a2f5e481ef87d98d9de30036f9f56...5bc506ca8b98d0e44d5cb7e61f590625d73014e1) --- updated-dependencies: - dependency-name: spec_tests/hed-specification dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Improve .tsv loading to support children referenced before parent * fix typo * Fix for unknown library hedIDs, minor updates to CI workflows(run on 3.11) * Pass a tuple in word cloud, not np array * Bump spec_tests/hed-examples from `7117cf9` to `bce0c7a` Bumps [spec_tests/hed-examples](https://github.com/hed-standard/hed-examples) from `7117cf9` to `bce0c7a`. - [Release notes](https://github.com/hed-standard/hed-examples/releases) - [Commits](https://github.com/hed-standard/hed-examples/compare/7117cf91ae97dcf388157242a911bfb6b2907607...bce0c7a6e508fb349b7dfac074f9d029f5a31265) --- updated-dependencies: - dependency-name: spec_tests/hed-examples dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Cache and retrieve library_data.json from hed-schemas * Add a new add_hed_ids script. Minor documentation corrections * Bump spec_tests/hed-specification from `5bc506c` to `07812cd` Bumps [spec_tests/hed-specification](https://github.com/hed-standard/hed-specification) from `5bc506c` to `07812cd`. - [Release notes](https://github.com/hed-standard/hed-specification/releases) - [Commits](https://github.com/hed-standard/hed-specification/compare/5bc506ca8b98d0e44d5cb7e61f590625d73014e1...07812cdbd119c5ac32a2a1fd54c4b8bb3e876ff5) --- updated-dependencies: - dependency-name: spec_tests/hed-specification dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump spec_tests/hed-specification from `07812cd` to `7cf62e5` Bumps [spec_tests/hed-specification](https://github.com/hed-standard/hed-specification) from `07812cd` to `7cf62e5`. - [Release notes](https://github.com/hed-standard/hed-specification/releases) - [Commits](https://github.com/hed-standard/hed-specification/compare/07812cdbd119c5ac32a2a1fd54c4b8bb3e876ff5...7cf62e52eec29bf22053c3b13caf11a1a57cc6c5) --- updated-dependencies: - dependency-name: spec_tests/hed-specification dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Add hedId value checking to schema validation Fix version attribute for merged schemas Remove cache hit from scripts(I think it's not required, but we'll see...) rename tag_util -> util in the normal validator * Don't escape double quotes in .tsv schemas Slightly improve importing of load_dataframes/save_dataframes by adding to init * Fix crash in unmerged schema validation. Always cache with_standard schemas, even if merged * Fix create_ontology using the wrong tag range for libraries * Bump spec_tests/hed-specification from `7cf62e5` to `19b29fe` Bumps [spec_tests/hed-specification](https://github.com/hed-standard/hed-specification) from `7cf62e5` to `19b29fe`. - [Release notes](https://github.com/hed-standard/hed-specification/releases) - [Commits](https://github.com/hed-standard/hed-specification/compare/7cf62e52eec29bf22053c3b13caf11a1a57cc6c5...19b29fe972f96ef1367a7918de21d0de4ed45095) --- updated-dependencies: - dependency-name: spec_tests/hed-specification dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Fix it so it caches the local hed files when asking for all versions * More fixes for local schema caching/testing * Add optional flag to validate_schemas script to validate all 3 types always * Have the validator script save schemas merged, not unmerged, to prevent an issue where it was saved with a with_standard schema that has since changed * Bump spec_tests/hed-examples from `bce0c7a` to `6e265bf` Bumps [spec_tests/hed-examples](https://github.com/hed-standard/hed-examples) from `bce0c7a` to `6e265bf`. - [Release notes](https://github.com/hed-standard/hed-examples/releases) - [Commits](https://github.com/hed-standard/hed-examples/compare/bce0c7a6e508fb349b7dfac074f9d029f5a31265...6e265bf17dd886d1b20d97b79e2fff9c4e199bdf) --- updated-dependencies: - dependency-name: spec_tests/hed-examples dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Always save schemas with newlines, never CLRF * Update hed id verification to allow removal of tags without hedIDs * Add annotationExternal to omn generation Change how schemas are sorted(so library nodes always go to the top) Move a bunch of ontology_util to df_util * Bump spec_tests/hed-examples from `6e265bf` to `ba86a84` Bumps [spec_tests/hed-examples](https://github.com/hed-standard/hed-examples) from `6e265bf` to `ba86a84`. - [Release notes](https://github.com/hed-standard/hed-examples/releases) - [Commits](https://github.com/hed-standard/hed-examples/compare/6e265bf17dd886d1b20d97b79e2fff9c4e199bdf...ba86a84701392a19b8399dc731ff084a8ab2d284) --- updated-dependencies: - dependency-name: spec_tests/hed-examples dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump paambaati/codeclimate-action from 8.0.0 to 9.0.0 Bumps [paambaati/codeclimate-action](https://github.com/paambaati/codeclimate-action) from 8.0.0 to 9.0.0. - [Release notes](https://github.com/paambaati/codeclimate-action/releases) - [Changelog](https://github.com/paambaati/codeclimate-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/paambaati/codeclimate-action/compare/v8.0.0...v9.0.0) --- updated-dependencies: - dependency-name: paambaati/codeclimate-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Updated the spec_test with additional tests * Bump spec_tests/hed-specification from `19b29fe` to `bae5675` Bumps [spec_tests/hed-specification](https://github.com/hed-standard/hed-specification) from `19b29fe` to `bae5675`. - [Release notes](https://github.com/hed-standard/hed-specification/releases) - [Commits](https://github.com/hed-standard/hed-specification/compare/19b29fe972f96ef1367a7918de21d0de4ed45095...bae56752ae31e581ac87e2030ea79a96570caf62) --- updated-dependencies: - dependency-name: spec_tests/hed-specification dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump spec_tests/hed-specification from `bae5675` to `d3bac05` Bumps [spec_tests/hed-specification](https://github.com/hed-standard/hed-specification) from `bae5675` to `d3bac05`. - [Release notes](https://github.com/hed-standard/hed-specification/releases) - [Commits](https://github.com/hed-standard/hed-specification/compare/bae56752ae31e581ac87e2030ea79a96570caf62...d3bac05b6119988c3d8460687247413169e32c1a) --- updated-dependencies: - dependency-name: spec_tests/hed-specification dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump spec_tests/hed-specification from `d3bac05` to `abc9923` Bumps [spec_tests/hed-specification](https://github.com/hed-standard/hed-specification) from `d3bac05` to `abc9923`. - [Release notes](https://github.com/hed-standard/hed-specification/releases) - [Commits](https://github.com/hed-standard/hed-specification/compare/d3bac05b6119988c3d8460687247413169e32c1a...abc9923b0e0a7e869b73a90c60a7f3f4d8ffe2a1) --- updated-dependencies: - dependency-name: spec_tests/hed-specification dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Fixed error handling when definition has no groups * Added SCORE 2.0.0 to schema cache * Bump spec_tests/hed-specification from `abc9923` to `f633de5` Bumps [spec_tests/hed-specification](https://github.com/hed-standard/hed-specification) from `abc9923` to `f633de5`. - [Release notes](https://github.com/hed-standard/hed-specification/releases) - [Commits](https://github.com/hed-standard/hed-specification/compare/abc9923b0e0a7e869b73a90c60a7f3f4d8ffe2a1...f633de5b3209f00f1b4aa94e6342d7a2ba3a5572) --- updated-dependencies: - dependency-name: spec_tests/hed-specification dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Fixed value tests * Added support for alternate codes in the spec_tests * Updated project .toml to include json class_regex * Bump spec_tests/hed-specification from `f633de5` to `62dbcb0` Bumps [spec_tests/hed-specification](https://github.com/hed-standard/hed-specification) from `f633de5` to `62dbcb0`. - [Release notes](https://github.com/hed-standard/hed-specification/releases) - [Commits](https://github.com/hed-standard/hed-specification/compare/f633de5b3209f00f1b4aa94e6342d7a2ba3a5572...62dbcb0fafd7ba920c9b8958f1948559561f275c) --- updated-dependencies: - dependency-name: spec_tests/hed-specification dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump spec_tests/hed-examples from `ba86a84` to `f117c4d` Bumps [spec_tests/hed-examples](https://github.com/hed-standard/hed-examples) from `ba86a84` to `f117c4d`. - [Release notes](https://github.com/hed-standard/hed-examples/releases) - [Commits](https://github.com/hed-standard/hed-examples/compare/ba86a84701392a19b8399dc731ff084a8ab2d284...f117c4d669ea034053011e6d3d152b0e906c1914) --- updated-dependencies: - dependency-name: spec_tests/hed-examples dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Minor updates to test files * outputting the workspace temporarily * Cleaned up some of the lints * Updated the actions, did test cleanup * Separated coverage action from just tests * Updated the tests for remodel * Corrected continue-on-error placement * Updated spec_tests path * Updated gitactions --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: IanCa Co-authored-by: IanCa <30812436+IanCa@users.noreply.github.com> --- .github/workflows/ci.yaml | 88 +- .github/workflows/ci_cov.yaml | 79 + .github/workflows/ci_windows.yaml | 2 +- .gitignore | 251 +- hed/errors/error_messages.py | 21 +- hed/errors/error_types.py | 7 +- hed/errors/exceptions.py | 2 + hed/errors/known_error_codes.py | 4 +- hed/errors/schema_error_messages.py | 23 +- hed/models/definition_dict.py | 8 +- hed/schema/hed_cache.py | 170 +- hed/schema/hed_cache_lock.py | 90 + hed/schema/hed_schema.py | 1498 +- hed/schema/hed_schema_df_constants.py | 187 +- hed/schema/hed_schema_io.py | 11 +- hed/schema/hed_schema_section.py | 594 +- .../schema_attribute_validator_hed_id.py | 112 + hed/schema/schema_compliance.py | 10 +- hed/schema/schema_data/HED_score_2.0.0.xml | 21263 ++++++++++ .../library_data/library_data.json | 11 + hed/schema/schema_io/__init__.py | 1 + hed/schema/schema_io/df2schema.py | 529 +- hed/schema/schema_io/df_util.py | 185 + hed/schema/schema_io/ontology_util.py | 870 +- hed/schema/schema_io/schema2df.py | 757 +- hed/schema/schema_io/text2schema.py | 107 - hed/schema/schema_io/wiki2schema.py | 74 +- hed/schema/schema_validation_util.py | 328 +- hed/scripts/add_hed_ids.py | 24 + hed/scripts/convert_and_update_schema.py | 184 +- hed/scripts/create_ontology.py | 126 +- hed/scripts/script_util.py | 14 +- hed/scripts/validate_schemas.py | 17 +- hed/tools/analysis/__init__.py | 28 +- hed/tools/bids/bids_dataset.py | 6 +- hed/tools/remodeling/cli/run_remodel.py | 2 +- hed/tools/remodeling/dispatcher.py | 2 +- .../operations/summarize_definitions_op.py | 6 +- hed/tools/visualization/tag_word_cloud.py | 2 +- hed/validator/def_validator.py | 416 +- hed/validator/hed_validator.py | 21 +- hed/validator/specialTags.json | 121 + hed/validator/{tag_util => util}/__init__.py | 2 +- hed/validator/{tag_util => util}/char_util.py | 73 + hed/validator/util/class_regex.json | 62 + .../{tag_util => util}/class_util.py | 230 +- .../{tag_util => util}/group_util.py | 0 .../{tag_util => util}/string_util.py | 0 hed/validator/{tag_util => util}/tag_util.py | 0 pyproject.toml | 3 +- setup.py | 16 +- spec_tests/hed-examples | 2 +- spec_tests/hed-specification | 2 +- spec_tests/test_errors.py | 425 +- spec_tests/test_hed_cache.py | 85 +- spec_tests/validate_bids.py | 73 +- .../dataset_description.json | 46 +- .../task-FacePerception_events.json | 274 +- .../merge_tests/HED_score_lib_tags.mediawiki | 900 - .../merge_tests/HED_score_merged.mediawiki | 4354 +- .../merge_tests/HED_score_merged.xml | 35032 ++++++++-------- .../merge_tests/HED_score_unmerged.mediawiki | 900 + ...re_lib_tags.xml => HED_score_unmerged.xml} | 13650 +++--- .../merge_tests/sorted_root_merged.xml | 15038 +++---- tests/errors/test_error_reporter.py | 405 +- tests/models/test_base_input.py | 377 +- tests/models/test_basic_search.py | 727 +- tests/models/test_basic_search_util.py | 16 +- tests/models/test_column_mapper.py | 444 +- tests/models/test_definition_dict.py | 55 +- tests/models/test_definition_entry.py | 28 +- tests/models/test_df_util.py | 1201 +- tests/models/test_hed_group.py | 273 +- tests/models/test_hed_string.py | 619 +- tests/models/test_hed_tag.py | 380 +- tests/models/test_query_handler.py | 1549 +- tests/models/test_sidecar.py | 345 +- tests/models/test_spreadsheet_input.py | 450 +- tests/models/test_string_util.py | 382 +- tests/models/test_tabular_input.py | 208 +- tests/schema/test_hed_schema.py | 277 +- tests/schema/test_hed_schema_io.py | 1349 +- tests/schema/test_hed_schema_io_df.py | 262 +- tests/schema/test_ontology_util.py | 355 +- .../test_schema_attribute_validators.py | 358 +- tests/schema/test_schema_converters.py | 418 +- tests/schema/test_schema_entry.py | 92 +- tests/schema/test_schema_util.py | 85 +- tests/schema/test_schema_validation_util.py | 175 +- .../test_schema_validation_util_deprecated.py | 137 +- tests/schema/test_schema_validator_hed_id.py | 56 + tests/schema/test_schema_wiki_fatal_errors.py | 231 +- tests/schema/util_create_schemas.py | 130 +- .../scripts/test_convert_and_update_schema.py | 189 +- tests/scripts/test_script_util.py | 355 +- tests/tools/analysis/test_annotation_util.py | 11 +- tests/tools/analysis/test_hed_tag_manager.py | 30 +- tests/tools/analysis/test_hed_type_defs.py | 6 +- tests/tools/analysis/test_key_map.py | 2 +- tests/tools/analysis/test_sequence_map.py | 4 +- tests/tools/bids/test_bids_dataset.py | 6 +- .../tools/remodeling/cli/test_run_remodel.py | 11 +- .../remodeling/cli/test_run_remodel_backup.py | 2 +- .../remodeling/operations/test_base_op.py | 4 +- .../operations/test_factor_hed_tags_op.py | 4 +- .../operations/test_number_groups.py | 12 +- .../operations/test_number_rows_op.py | 1 + .../operations/test_split_rows_op.py | 1 - .../test_summarize_column_values_op.py | 1 + .../test_summarize_definitions_op.py | 1 + .../operations/test_summarize_hed_tags_op.py | 7 +- .../operations/test_summarize_hed_type_op.py | 2 +- tests/tools/remodeling/test_validator.py | 354 +- tests/tools/util/test_io_util.py | 3 +- .../visualization/test_tag_word_cloud.py | 355 +- tests/validator/test_char_validator.py | 46 + tests/validator/test_def_validator.py | 504 +- tests/validator/test_hed_validator.py | 392 +- tests/validator/test_onset_validator.py | 12 +- tests/validator/test_sidecar_validator.py | 356 +- tests/validator/test_spreadsheet_validator.py | 195 +- tests/validator/test_tag_validator.py | 2095 +- tests/validator/test_tag_validator_base.py | 203 +- tests/validator/test_tag_validator_library.py | 968 +- tests/validator/test_tag_validator_util.py | 6 +- 125 files changed, 69742 insertions(+), 47198 deletions(-) create mode 100644 .github/workflows/ci_cov.yaml create mode 100644 hed/schema/hed_cache_lock.py create mode 100644 hed/schema/schema_attribute_validator_hed_id.py create mode 100644 hed/schema/schema_data/HED_score_2.0.0.xml create mode 100644 hed/schema/schema_data/library_data/library_data.json create mode 100644 hed/schema/schema_io/df_util.py delete mode 100644 hed/schema/schema_io/text2schema.py create mode 100644 hed/scripts/add_hed_ids.py create mode 100644 hed/validator/specialTags.json rename hed/validator/{tag_util => util}/__init__.py (77%) rename hed/validator/{tag_util => util}/char_util.py (71%) create mode 100644 hed/validator/util/class_regex.json rename hed/validator/{tag_util => util}/class_util.py (50%) rename hed/validator/{tag_util => util}/group_util.py (100%) rename hed/validator/{tag_util => util}/string_util.py (100%) rename hed/validator/{tag_util => util}/tag_util.py (100%) delete mode 100644 tests/data/schema_tests/merge_tests/HED_score_lib_tags.mediawiki create mode 100644 tests/data/schema_tests/merge_tests/HED_score_unmerged.mediawiki rename tests/data/schema_tests/merge_tests/{HED_score_lib_tags.xml => HED_score_unmerged.xml} (97%) create mode 100644 tests/schema/test_schema_validator_hed_id.py create mode 100644 tests/validator/test_char_validator.py diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index bed2e1c93..b169b8f0b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -21,7 +21,7 @@ jobs: # PR to master branch echo 'matrix=["3.8", "3.9", "3.10", "3.11"]' >> $GITHUB_OUTPUT else - echo 'matrix=["3.9"]' >> $GITHUB_OUTPUT + echo 'matrix=["3.9", "3.11"]' >> $GITHUB_OUTPUT fi build: @@ -48,92 +48,24 @@ jobs: path: ${{ env.pythonLocation }} key: ${{ env.pythonLocation }}-${{ hashFiles('setup.py') }}-${{ hashFiles('docs/requirements.txt') }} + # Install dependencies - name: Install dependencies run: | python -m pip install --upgrade --upgrade-strategy eager pip - pip install flake8 - pip install coverage pip install -r requirements.txt pip install -r docs/requirements.txt - - name: Lint with flake8 - run: | - # stop the build if there are Python syntax errors or undefined names - - flake8 . --count --show-source --statistics --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide - - - name: Test with unittest + # Run spec tests without coverage for non Python 3.9 + - name: Run spec_test env: HED_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - coverage run -m unittest + continue-on-error: true + run: | + python -m unittest discover spec_tests - - name: Run spec_test coverage + # Run unittest without coverage + - name: Test with unittest env: HED_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: coverage run --append -m unittest spec_tests/test_errors.py - continue-on-error: true - - - name: Archive code coverage results - if: ${{matrix.python-version == '3.9'}} - uses: actions/upload-artifact@v4 - with: - name: code-coverage-report - path: .coverage - - check-secret: - runs-on: ubuntu-latest - outputs: - secrets-exist: ${{ steps.check-for-secrets.outputs.defined }} - steps: - - name: Check for Secret availability - id: check-for-secrets - # perform secret check & put boolean result as an output - shell: bash - run: | - if [ "${{ secrets.CC_TEST_REPORTER_ID }}" != '' ]; then - echo "defined=true" >> $GITHUB_OUTPUT; - else - echo "defined=false" >> $GITHUB_OUTPUT; - fi - - coverage: - name: Publish coverage - needs: [build, check-secret] - runs-on: ubuntu-latest - if: needs.check-secret.outputs.secrets-exist == 'true' - - steps: - - uses: actions/checkout@v4 - - name: Set up Python 3.9 - uses: actions/setup-python@v5 - with: - python-version: 3.9 - - - uses: actions/cache@v4 - with: - path: ${{ env.pythonLocation }} - key: ${{ env.pythonLocation }}-${{ hashFiles('setup.py') }}-${{ hashFiles('docs/requirements.txt') }} - - - name: Install dependencies run: | - python -m pip install --upgrade --upgrade-strategy eager pip - pip install flake8 - pip install coverage - pip install -r requirements.txt - pip install -r docs/requirements.txt - - - name: Download a single artifact - uses: actions/download-artifact@v4 - with: - name: code-coverage-report - - - name: publish-coverages - with: - coverageCommand: coverage xml - debug: true - uses: paambaati/codeclimate-action@v8.0.0 - env: - CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }} - + python -m unittest discover tests diff --git a/.github/workflows/ci_cov.yaml b/.github/workflows/ci_cov.yaml new file mode 100644 index 000000000..b63ca7a70 --- /dev/null +++ b/.github/workflows/ci_cov.yaml @@ -0,0 +1,79 @@ +name: CI_COV + +on: + push: + branches: ["*"] + pull_request: + branches: ["*"] + +jobs: + + check-secret: + runs-on: ubuntu-latest + outputs: + secrets-exist: ${{ steps.check-for-secrets.outputs.defined }} + steps: + - name: Check for Secret availability + id: check-for-secrets + # perform secret check & put boolean result as an output + shell: bash + run: | + if [ "${{ secrets.CC_TEST_REPORTER_ID }}" != '' ]; then + echo "defined=true" >> $GITHUB_OUTPUT; + else + echo "defined=false" >> $GITHUB_OUTPUT; + fi + + build: + needs: check-secret + strategy: + matrix: + platform: [ubuntu-latest] + python-version: [ "3.9" ] + + runs-on: ${{ matrix.platform }} + + steps: + - uses: actions/checkout@v4 + with: + submodules: true + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + # Install dependencies + - name: Install dependencies + run: | + python -m pip install --upgrade --upgrade-strategy eager pip + pip install flake8 coverage -r requirements.txt -r docs/requirements.txt + + # Run flake8 + - name: Lint with flake8 + run: | + flake8 . --count --show-source --statistics --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + + # Run unittest with coverage + - name: Test with unittest and coverage + env: + HED_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + continue-on-error: true + run: | + coverage run -m unittest discover tests + + # Run spec tests with coverage + - name: Run spec_test coverage + env: + HED_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + coverage run --append -m unittest discover spec_tests + coverage xml + ls -la + + # Upload coverage to Code Climate + - name: Upload coverage to Code Climate + if: needs.check-secret.outputs.secrets-exist == 'true' + uses: paambaati/codeclimate-action@v9.0.0 + env: + CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }} diff --git a/.github/workflows/ci_windows.yaml b/.github/workflows/ci_windows.yaml index 278271b99..d02dfb2e0 100644 --- a/.github/workflows/ci_windows.yaml +++ b/.github/workflows/ci_windows.yaml @@ -1,4 +1,4 @@ -name: CI +name: CI Windows on: push: diff --git a/.gitignore b/.gitignore index 6293210bc..28e9059dc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,124 +1,127 @@ -################# -## Eclipse -################# - -*.pydevproject -.project -.metadata -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.classpath -.settings/ -.loadpath - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - - -################# -## Matlab -################# -*.asv - - -################# -## Python -################# -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] - -# C extensions -*.so - -# Distribution / packaging -.Python -env/ -bin/ -build/ -develop-eggs/ -dist/ -eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -*.egg-info/ -.installed.cfg -*.egg -tests/scratch - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - - -# Translations -*.mo - -# Mr Developer -.mr.developer.cfg -.project -.pydevproject - -# Rope -.ropeproject - -# Django stuff: -*.log -*.pot - -# Sphinx documentation -docs/_build/ - -#machine specific files -.vimrc - -# Pycharm -.idea/ -/venv/ -config.py - -############ -## Windows -############ - -# Windows image file caches -Thumbs.db - -# Folder config file -Desktop.ini - -# Project specific -schema_cache_test/ -hed_cache/ +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Matlab +################# +*.asv + + +################# +## Python +################# +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +bin/ +build/ +develop-eggs/ +dist/ +eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg +tests/scratch + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + + +# Translations +*.mo + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +# Rope +.ropeproject + +# Django stuff: +*.log +*.pot + +# Sphinx documentation +docs/_build/ + +#machine specific files +.vimrc + +# Pycharm +.idea/ +/venv/ +config.py + +############ +## Windows +############ + +# Windows image file caches +Thumbs.db + +# Folder config file +Desktop.ini + +# Project specific +schema_cache_test/ +hed_cache/ +spec_tests/hed-specification/tests +spec_tests/hed-examples +spec_tests/*.json diff --git a/hed/errors/error_messages.py b/hed/errors/error_messages.py index 8c74db944..a84e9304a 100644 --- a/hed/errors/error_messages.py +++ b/hed/errors/error_messages.py @@ -52,6 +52,18 @@ def val_error_invalid_tag_character(tag, problem_tag): return f"Invalid character '{problem_tag}' in tag '{tag}'" +@hed_tag_error(ValidationErrors.INVALID_VALUE_CLASS_CHARACTER, has_sub_tag=True, + actual_code=ValidationErrors.CHARACTER_INVALID) +def val_error_INVALID_VALUE_CLASS_CHARACTER(tag, problem_tag, value_class): + return f"Invalid character '{problem_tag}' in tag '{tag}' for value class '{value_class}'" + + +@hed_tag_error(ValidationErrors.INVALID_VALUE_CLASS_VALUE, has_sub_tag=True, + actual_code=ValidationErrors.VALUE_INVALID) +def val_error_INVALID_VALUE_CLASS_VALUE(tag, problem_tag, value_class): + return f"'{tag}' has an invalid value portion for value class '{value_class}'" + + @hed_error(ValidationErrors.TILDES_UNSUPPORTED) def val_error_tildes_not_supported(source_string, char_index): character = source_string[char_index] @@ -124,8 +136,11 @@ def val_error_no_valid_tag(tag, problem_tag): @hed_tag_error(ValidationErrors.VALUE_INVALID) -def val_error_no_value(tag): - return f"'{tag}' has an invalid value portion." +def val_error_no_value(tag, value_class=''): + if value_class: + return f"'{tag}' has an invalid value portion because it is not a valid '{value_class}' value." + else: + return f"'{tag}' has an invalid value portion." @hed_error(ValidationErrors.HED_MISSING_REQUIRED_COLUMN, default_severity=ErrorSeverity.WARNING) @@ -173,7 +188,7 @@ def val_error_unknown_namespace(tag, unknown_prefix, known_prefixes): return f"Tag '{tag} has unknown namespace '{unknown_prefix}'. Valid prefixes: {known_prefixes}" -@hed_tag_error(ValidationErrors.NODE_NAME_EMPTY, has_sub_tag=True) +@hed_tag_error(ValidationErrors.NODE_NAME_EMPTY, has_sub_tag=True, actual_code=ValidationErrors.TAG_INVALID) def val_error_extra_slashes_spaces(tag, problem_tag): return f"Extra slashes or spaces '{problem_tag}' in tag '{tag}'" diff --git a/hed/errors/error_types.py b/hed/errors/error_types.py index 4a95f79d1..b07e3544d 100644 --- a/hed/errors/error_types.py +++ b/hed/errors/error_types.py @@ -31,7 +31,6 @@ class ValidationErrors: DEF_INVALID = "DEF_INVALID" DEFINITION_INVALID = "DEFINITION_INVALID" ELEMENT_DEPRECATED = "ELEMENT_DEPRECATED" - NODE_NAME_EMPTY = 'NODE_NAME_EMPTY' TEMPORAL_TAG_ERROR = 'TEMPORAL_TAG_ERROR' PARENTHESES_MISMATCH = 'PARENTHESES_MISMATCH' PLACEHOLDER_INVALID = 'PLACEHOLDER_INVALID' @@ -69,6 +68,7 @@ class ValidationErrors: INVALID_PARENT_NODE = "invalidParent" NO_VALID_TAG_FOUND = "invalidTag" + NODE_NAME_EMPTY = 'NODE_NAME_EMPTY' HED_LIBRARY_UNMATCHED = "HED_LIBRARY_UNMATCHED" @@ -88,8 +88,8 @@ class ValidationErrors: DUPLICATE_COLUMN_BETWEEN_SOURCES = "DUPLICATE_COLUMN_BETWEEN_SOURCES" HED_BLANK_COLUMN = "HED_BLANK_COLUMN" - # Below here shows what the given error maps to - + INVALID_VALUE_CLASS_CHARACTER = 'INVALID_VALUE_CLASS_CHARACTER' + INVALID_VALUE_CLASS_VALUE = 'INVALID_VALUE_CLASS_VALUE' INVALID_TAG_CHARACTER = 'invalidTagCharacter' CURLY_BRACE_UNSUPPORTED_HERE = "CURLY_BRACE_UNSUPPORTED_HERE" @@ -144,6 +144,7 @@ class SchemaAttributeErrors: SCHEMA_DEFAULT_UNITS_INVALID = "SCHEMA_DEFAULT_UNITS_INVALID" SCHEMA_DEFAULT_UNITS_DEPRECATED = "SCHEMA_DEFAULT_UNITS_DEPRECATED" SCHEMA_CONVERSION_FACTOR_NOT_POSITIVE = "SCHEMA_CONVERSION_FACTOR_NOT_POSITIVE" + SCHEMA_HED_ID_INVALID = "SCHEMA_HED_ID_INVALID" SCHEMA_GENERIC_ATTRIBUTE_VALUE_INVALID = "SCHEMA_GENERIC_ATTRIBUTE_VALUE_INVALID" diff --git a/hed/errors/exceptions.py b/hed/errors/exceptions.py index 45302f896..000e910d0 100644 --- a/hed/errors/exceptions.py +++ b/hed/errors/exceptions.py @@ -49,6 +49,8 @@ class HedExceptions: CANNOT_PARSE_RDF = "CANNOT_PARSE_RDF" SCHEMA_LOAD_FAILED = "SCHEMA_LOAD_FAILED" + SCHEMA_TAG_TSV_BAD_PARENT = "SCHEMA_TAG_TSV_BAD_PARENT" + class HedFileError(Exception): """Exception raised when a file cannot be parsed due to being malformed, file IO, etc.""" diff --git a/hed/errors/known_error_codes.py b/hed/errors/known_error_codes.py index 7ec333750..7b4a1663a 100644 --- a/hed/errors/known_error_codes.py +++ b/hed/errors/known_error_codes.py @@ -7,8 +7,7 @@ "DEF_EXPAND_INVALID", "DEF_INVALID", "DEFINITION_INVALID", - "NODE_NAME_EMPTY", - "TEMPORAL_TAG_ERROR", + "ELEMENT_DEPRECATED", "PARENTHESES_MISMATCH", "PLACEHOLDER_INVALID", "REQUIRED_TAG_MISSING", @@ -25,6 +24,7 @@ "TAG_NAMESPACE_PREFIX_INVALID", "TAG_NOT_UNIQUE", "TAG_REQUIRES_CHILD", + "TEMPORAL_TAG_ERROR", "TILDES_UNSUPPORTED", "UNITS_INVALID", "UNITS_MISSING", diff --git a/hed/errors/schema_error_messages.py b/hed/errors/schema_error_messages.py index d2e6df5a3..7c7c1fa0b 100644 --- a/hed/errors/schema_error_messages.py +++ b/hed/errors/schema_error_messages.py @@ -33,20 +33,22 @@ def schema_error_SCHEMA_INVALID_CHILD(tag, child_tag_list): @hed_error(SchemaAttributeErrors.SCHEMA_ATTRIBUTE_INVALID) def schema_error_unknown_attribute(attribute_name, source_tag): - return f"Attribute '{attribute_name}' used by '{source_tag}' was not defined in the schema, " \ - f"or was used outside of it's defined class." + return f"Attribute '{attribute_name}' used by '{source_tag}' " + \ + "was not defined in the schema, or was used outside of it's defined class." @hed_error(SchemaWarnings.SCHEMA_PRERELEASE_VERSION_USED, default_severity=ErrorSeverity.WARNING) def schema_error_SCHEMA_PRERELEASE_VERSION_USED(current_version, known_versions): - return f"Schema version {current_version} used, which is prerelease or unofficial. Known versions are: {', '.join(known_versions)}" + return f"Schema version {current_version} used, which is prerelease or unofficial. " + \ + f"Known versions are: {', '.join(known_versions)}" @hed_error(SchemaWarnings.SCHEMA_PROLOGUE_CHARACTER_INVALID, default_severity=ErrorSeverity.WARNING, actual_code=SchemaWarnings.SCHEMA_CHARACTER_INVALID) def schema_error_invalid_character_prologue(char_index, source_string, section_name): invalid_char = source_string[char_index] - return f"'{section_name}' has invalid character '{invalid_char}' at position {char_index} of string: {source_string}" + return f"'{section_name}' has invalid character '{invalid_char}' at " + \ + f"position {char_index} of string: {source_string}" @hed_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_DESC, default_severity=ErrorSeverity.WARNING, @@ -89,7 +91,7 @@ def schema_error_SCHEMA_CHILD_OF_DEPRECATED(deprecated_tag, non_deprecated_child @hed_error(SchemaAttributeErrors.SCHEMA_ATTRIBUTE_VALUE_DEPRECATED, actual_code=SchemaAttributeErrors.SCHEMA_DEPRECATION_ERROR) def schema_error_SCHEMA_ATTRIBUTE_VALUE_DEPRECATED(tag, deprecated_suggestion, attribute_name): - return (f"Tag '{tag}' {attribute_name} uses '{deprecated_suggestion}' which has been deprecated " + return (f"Tag '{tag}' {attribute_name} uses '{deprecated_suggestion}' which has been deprecated " + \ f"and an alternative method of tagging should be used.") @@ -124,6 +126,17 @@ def schema_error_SCHEMA_CONVERSION_FACTOR_NOT_POSITIVE(tag, conversion_factor): return f"Tag '{tag}' has an invalid conversionFactor '{conversion_factor}'. Conversion factor must be positive." +@hed_error(SchemaAttributeErrors.SCHEMA_HED_ID_INVALID, + actual_code=SchemaAttributeErrors.SCHEMA_ATTRIBUTE_VALUE_INVALID) +def schema_error_SCHEMA_HED_ID_INVALID(tag, new_id, old_id=None, valid_min=None, valid_max=None): + if old_id: + return f"Tag '{tag}' has an invalid hedId '{new_id}'. " \ + f"It has changed from the previous schema version. Old value: {old_id}." + elif valid_min: + return f"Tag '{tag}' has an invalid hedId '{new_id}'. It must be between {valid_min} and {valid_max}." + return f"Tag '{tag}' has an invalid hedId '{new_id}'. It must be an integer in the format of HED_XXXXXXX." + + @hed_error(SchemaAttributeErrors.SCHEMA_ALLOWED_CHARACTERS_INVALID, actual_code=SchemaAttributeErrors.SCHEMA_ATTRIBUTE_VALUE_INVALID) def schema_error_SCHEMA_ALLOWED_CHARACTERS_INVALID(tag, invalid_character): diff --git a/hed/models/definition_dict.py b/hed/models/definition_dict.py index 89dc8718e..a013d4446 100644 --- a/hed/models/definition_dict.py +++ b/hed/models/definition_dict.py @@ -209,12 +209,18 @@ def _find_group(self, definition_tag, group, error_handler): # initial validation groups = group.groups() issues = [] + # tags = group.tags() + # if len(tags) != 1: + # issues += \ + # ErrorHandler.format_error_with_context(error_handler, + # DefinitionErrors.WRONG_NUMBER_TAGS, + # def_name=definition_tag.extension, tag_list=tags) if len(groups) > 1: issues += \ ErrorHandler.format_error_with_context(error_handler, DefinitionErrors.WRONG_NUMBER_GROUPS, def_name=definition_tag.extension, tag_list=groups) - elif len(groups) == 0: + elif len(groups) == 0 and '#' in definition_tag.extension: issues += \ ErrorHandler.format_error_with_context(error_handler, DefinitionErrors.NO_DEFINITION_CONTENTS, diff --git a/hed/schema/hed_cache.py b/hed/schema/hed_cache.py index 5e3941fc8..e25c7da1d 100644 --- a/hed/schema/hed_cache.py +++ b/hed/schema/hed_cache.py @@ -6,11 +6,12 @@ import json from hashlib import sha1 from shutil import copyfile +import functools + import re from semantic_version import Version -import portalocker -import time +from hed.schema.hed_cache_lock import CacheException, CacheLock from hed.schema.schema_io.schema_util import url_to_file, make_url_request from pathlib import Path import urllib @@ -32,6 +33,7 @@ DEFAULT_HED_LIST_VERSIONS_URL = "https://api.github.com/repos/hed-standard/hed-schemas/contents/standard_schema" LIBRARY_HED_URL = "https://api.github.com/repos/hed-standard/hed-schemas/contents/library_schemas" +LIBRARY_DATA_URL = "https://raw.githubusercontent.com/hed-standard/hed-schemas/main/library_data.json" DEFAULT_URL_LIST = (DEFAULT_HED_LIST_VERSIONS_URL,) DEFAULT_LIBRARY_URL_LIST = (LIBRARY_HED_URL,) @@ -39,8 +41,6 @@ DEFAULT_SKIP_FOLDERS = ('deprecated',) HED_CACHE_DIRECTORY = os.path.join(Path.home(), '.hedtools/hed_cache/') -TIMESTAMP_FILENAME = "last_update.txt" -CACHE_TIME_THRESHOLD = 300 * 6 # This is the schemas included in the hedtools package. INSTALLED_CACHE_LOCATION = os.path.realpath(os.path.join(os.path.dirname(__file__), 'schema_data/')) @@ -86,13 +86,23 @@ def get_hed_versions(local_hed_directory=None, library_name=None, check_prerelea library_name = None all_hed_versions = {} - local_directory = local_hed_directory - if check_prerelease and not local_directory.endswith(prerelease_suffix): - local_directory += prerelease_suffix - try: - hed_files = os.listdir(local_directory) - except FileNotFoundError: - hed_files = [] + local_directories = [local_hed_directory] + if check_prerelease and not local_hed_directory.endswith(prerelease_suffix): + local_directories.append(os.path.join(local_hed_directory, "prerelease")) + + hed_files = [] + for hed_dir in local_directories: + try: + hed_files += os.listdir(hed_dir) + except FileNotFoundError: + pass + if not hed_files: + cache_local_versions(local_hed_directory) + for hed_dir in local_directories: + try: + hed_files += os.listdir(hed_dir) + except FileNotFoundError: + pass for hed_file in hed_files: expression_match = version_pattern.match(hed_file) if expression_match is not None: @@ -144,13 +154,11 @@ def cache_local_versions(cache_folder): """ if not cache_folder: cache_folder = HED_CACHE_DIRECTORY - os.makedirs(cache_folder, exist_ok=True) try: - cache_lock_filename = os.path.join(cache_folder, "cache_lock.lock") - with portalocker.Lock(cache_lock_filename, timeout=1): - _copy_installed_schemas_to_cache(cache_folder) - except portalocker.exceptions.LockException: + with CacheLock(cache_folder, write_time=False): + _copy_installed_folder_to_cache(cache_folder) + except CacheException: return -1 @@ -165,33 +173,25 @@ def cache_xml_versions(hed_base_urls=DEFAULT_URL_LIST, hed_library_urls=DEFAULT_ cache_folder (str): The folder holding the cache. Returns: - float: Returns -1 if cache failed, a positive number meaning time in seconds since last update - if it didn't cache, 0 if it cached successfully this time. + float: Returns -1 if cache failed for any reason, including having been cached too recently. + Returns 0 if it successfully cached this time. Notes: - The Default skip_folders is 'deprecated'. - The HED cache folder defaults to HED_CACHE_DIRECTORY. - The directories on GitHub are of the form: - https://api.github.com/repos/hed-standard/hed-schemas/contents/standard_schema/hedxml + https://api.github.com/repos/hed-standard/hed-schemas/contents/standard_schema """ if not cache_folder: cache_folder = HED_CACHE_DIRECTORY - if isinstance(hed_base_urls, str): - hed_base_urls = [hed_base_urls] - if isinstance(hed_library_urls, str): - hed_library_urls = [hed_library_urls] - os.makedirs(cache_folder, exist_ok=True) - last_timestamp = _read_last_cached_time(cache_folder) - current_timestamp = time.time() - time_since_update = current_timestamp - last_timestamp - if time_since_update < CACHE_TIME_THRESHOLD: - return time_since_update - try: - cache_lock_filename = os.path.join(cache_folder, "cache_lock.lock") - with portalocker.Lock(cache_lock_filename, timeout=1): + with CacheLock(cache_folder): + if isinstance(hed_base_urls, str): + hed_base_urls = [hed_base_urls] + if isinstance(hed_library_urls, str): + hed_library_urls = [hed_library_urls] all_hed_versions = {} for hed_base_url in hed_base_urls: new_hed_versions = _get_hed_xml_versions_one_library(hed_base_url) @@ -205,60 +205,78 @@ def cache_xml_versions(hed_base_urls=DEFAULT_URL_LIST, hed_library_urls=DEFAULT_ for version, version_info in hed_versions.items(): _cache_hed_version(version, library_name, version_info, cache_folder=cache_folder) - _write_last_cached_time(current_timestamp, cache_folder) - except portalocker.exceptions.LockException or ValueError or URLError: + except CacheException or ValueError or URLError: return -1 return 0 -def _copy_installed_schemas_to_cache(cache_folder): - """Copies the schemas from the install folder to the cache""" - installed_files = os.listdir(INSTALLED_CACHE_LOCATION) - for install_name in installed_files: - _, basename = os.path.split(install_name) - cache_name = os.path.join(cache_folder, basename) - install_name = os.path.join(INSTALLED_CACHE_LOCATION, basename) - if not os.path.exists(cache_name): - shutil.copy(install_name, cache_name) +@functools.lru_cache(maxsize=50) +def get_library_data(library_name, cache_folder=None): + """Retrieve the library data for the given library. + Currently, this is just the valid ID range. -def _read_last_cached_time(cache_folder): - """ Check the given cache folder to see when it was last updated. + Parameters: + library_name(str): The schema name. "" for standard schema. + cache_folder(str): The cache folder to use if not using the default. - Parameters: - cache_folder (str): The folder we're caching hed schema in. + Returns: + library_data(dict): The data for a specific library. + """ + if cache_folder is None: + cache_folder = HED_CACHE_DIRECTORY - Returns: - float: The time we last updated the cache. Zero if no update found. + cache_lib_data_folder = os.path.join(cache_folder, "library_data") - """ - timestamp_filename = os.path.join(cache_folder, TIMESTAMP_FILENAME) + local_library_data_filename = os.path.join(cache_lib_data_folder, "library_data.json") + try: + with open(local_library_data_filename) as file: + library_data = json.load(file) + specific_library = library_data[library_name] + return specific_library + except (OSError, CacheException, ValueError, KeyError): + pass try: - with open(timestamp_filename, "r") as f: - timestamp = float(f.readline()) - return timestamp - except FileNotFoundError or ValueError or IOError: - return 0 + with CacheLock(cache_lib_data_folder, write_time=False): + _copy_installed_folder_to_cache(cache_lib_data_folder, "library_data") + + with open(local_library_data_filename) as file: + library_data = json.load(file) + specific_library = library_data[library_name] + return specific_library + except (OSError, CacheException, ValueError, KeyError): + pass + try: + with CacheLock(cache_lib_data_folder): + # if this fails it'll fail to load in the next step + _cache_specific_url(LIBRARY_DATA_URL, local_library_data_filename) + with open(local_library_data_filename) as file: + library_data = json.load(file) + specific_library = library_data[library_name] + return specific_library + except (OSError, CacheException, ValueError, URLError, KeyError): + pass -def _write_last_cached_time(new_time, cache_folder): - """ Set the time of last cache update. + # This failed to get any data for some reason + return {} - Parameters: - new_time (float): The time this was updated. - cache_folder (str): The folder used for caching the hed schema. - :raises ValueError: - - something went wrong writing to the file - """ - timestamp_filename = os.path.join(cache_folder, TIMESTAMP_FILENAME) - try: - with open(timestamp_filename, "w") as f: - f.write(str(new_time)) - except Exception: - raise ValueError("Error writing timestamp to hed cache") +def _copy_installed_folder_to_cache(cache_folder, sub_folder=""): + """Copies the schemas from the install folder to the cache""" + source_folder = INSTALLED_CACHE_LOCATION + if sub_folder: + source_folder = os.path.join(INSTALLED_CACHE_LOCATION, sub_folder) + + installed_files = os.listdir(source_folder) + for install_name in installed_files: + _, basename = os.path.split(install_name) + cache_name = os.path.join(cache_folder, basename) + install_name = os.path.join(source_folder, basename) + if not os.path.isdir(install_name) and not os.path.exists(cache_name): + shutil.copy(install_name, cache_name) def _check_if_url(hed_xml_or_url): @@ -270,7 +288,7 @@ def _check_if_url(hed_xml_or_url): def _create_xml_filename(hed_xml_version, library_name=None, hed_directory=None, prerelease=False): """Returns the default file name format for the given version""" - prerelease_prefix = f"prerelease/" if prerelease else "" + prerelease_prefix = "prerelease/" if prerelease else "" if library_name: hed_xml_basename = f"{prerelease_prefix}{HED_XML_PREFIX}_{library_name}_{hed_xml_version}{HED_XML_EXTENSION}" else: @@ -435,13 +453,13 @@ def _cache_hed_version(version, library_name, version_info, cache_folder): return _cache_specific_url(download_url, possible_cache_filename) -def _cache_specific_url(hed_xml_url, cache_filename): +def _cache_specific_url(source_url, cache_filename): """Copies a specific url to the cache at the given filename""" cache_folder = cache_filename.rpartition("/")[0] os.makedirs(cache_folder, exist_ok=True) - temp_hed_xml_file = url_to_file(hed_xml_url) - if temp_hed_xml_file: - cache_filename = _safe_move_tmp_to_folder(temp_hed_xml_file, cache_filename) - os.remove(temp_hed_xml_file) + temp_filename = url_to_file(source_url) + if temp_filename: + cache_filename = _safe_move_tmp_to_folder(temp_filename, cache_filename) + os.remove(temp_filename) return cache_filename return None diff --git a/hed/schema/hed_cache_lock.py b/hed/schema/hed_cache_lock.py new file mode 100644 index 000000000..1df223cf5 --- /dev/null +++ b/hed/schema/hed_cache_lock.py @@ -0,0 +1,90 @@ +"""Support utilities for hed_cache locking""" +import time +import os +import portalocker + + +TIMESTAMP_FILENAME = "last_update.txt" +CACHE_TIME_THRESHOLD = 300 * 6 + + +class CacheException(Exception): + """Exception for cache locking or threshold errors.""" + pass + + +class CacheLock: + """Class to lock the cache folder to ensure it doesn't get hit by another version at the same time.""" + def __init__(self, cache_folder, write_time=True, time_threshold=CACHE_TIME_THRESHOLD): + """Constructor for hed locking object + + Parameters: + cache_folder(str): The folder to create the lock in(implicitly locking that folder) + write_time(bool): If true, read and write the cache time. Additionally, won't operate if too recent. + Generally False for local operations. + time_threshold(int): Time before cache is allowed to refresh again. + + """ + self.cache_folder = cache_folder + self.cache_lock_filename = os.path.join(cache_folder, "cache_lock.lock") + self.cache_lock = None + self.timestamp = None + self.write_time = write_time + self.time_threshold = time_threshold + + def __enter__(self): + os.makedirs(self.cache_folder, exist_ok=True) + last_timestamp = _read_last_cached_time(self.cache_folder) + self.current_timestamp = time.time() + time_since_update = self.current_timestamp - last_timestamp + if time_since_update < self.time_threshold: + raise CacheException(f"Last updated {time_since_update} seconds ago. Threshold is {self.time_threshold}") + + try: + self.cache_lock = portalocker.Lock(self.cache_lock_filename, timeout=1) + except portalocker.exceptions.LockException: + raise CacheException(f"Could not lock cache using {self.cache_lock_filename}") + pass + + def __exit__(self, exc_type, exc_value, traceback): + if self.write_time: + _write_last_cached_time(self.current_timestamp, self.cache_folder) + self.cache_lock.release() + + +def _read_last_cached_time(cache_folder): + """ Check the given cache folder to see when it was last updated. + + Parameters: + cache_folder (str): The folder we're caching hed schema in. + + Returns: + float: The time we last updated the cache. Zero if no update found. + + """ + timestamp_filename = os.path.join(cache_folder, TIMESTAMP_FILENAME) + + try: + with open(timestamp_filename, "r") as f: + timestamp = float(f.readline()) + return timestamp + except FileNotFoundError or ValueError or IOError: + return 0 + + +def _write_last_cached_time(new_time, cache_folder): + """ Set the time of last cache update. + + Parameters: + new_time (float): The time this was updated. + cache_folder (str): The folder used for caching the hed schema. + + :raises ValueError: + - something went wrong writing to the file + """ + timestamp_filename = os.path.join(cache_folder, TIMESTAMP_FILENAME) + try: + with open(timestamp_filename, "w") as f: + f.write(str(new_time)) + except Exception: + raise ValueError("Error writing timestamp to hed cache") diff --git a/hed/schema/hed_schema.py b/hed/schema/hed_schema.py index 851dbdcea..bbb16fa30 100644 --- a/hed/schema/hed_schema.py +++ b/hed/schema/hed_schema.py @@ -1,748 +1,750 @@ -import json - -from hed.schema.hed_schema_constants import HedKey, HedSectionKey, HedKeyOld -from hed.schema import hed_schema_constants as constants -from hed.schema.schema_io import schema_util -from hed.schema.schema_io.schema2xml import Schema2XML -from hed.schema.schema_io.schema2wiki import Schema2Wiki -from hed.schema.schema_io.schema2df import Schema2DF -from hed.schema.schema_io import ontology_util - - -from hed.schema.hed_schema_section import (HedSchemaSection, HedSchemaTagSection, HedSchemaUnitClassSection, - HedSchemaUnitSection) -from hed.errors import ErrorHandler -from hed.errors.error_types import ValidationErrors -from hed.schema.hed_schema_base import HedSchemaBase -from hed.errors.exceptions import HedFileError, HedExceptions - - -class HedSchema(HedSchemaBase): - """ A HED schema suitable for processing. """ - - def __init__(self): - """ Constructor for the HedSchema class. - - A HedSchema can be used for validation, checking tag attributes, parsing tags, etc. - """ - super().__init__() - self.header_attributes = {} - self.filename = None - self.prologue = "" - self.epilogue = "" - - # This is the specified library name_prefix - tags will be {schema_namespace}:{tag_name} - self._namespace = "" - - self._sections = self._create_empty_sections() - self.source_format = None # The type of file this was loaded from(mediawiki, xml, or owl - None if mixed) - - # =============================================== - # Basic schema properties - # =============================================== - @property - def version_number(self): - """ The HED version of this schema. - - Returns: - str: The version of this schema. - - """ - return self.header_attributes['version'] - - @property - def version(self): - """The complete schema version, including prefix and library name(if applicable)""" - library = self.library - if library: - library = library + '_' - return self._namespace + library + self.version_number - - @property - def library(self): - """ The name of this library schema if one exists. - - Returns: - str: Library name if any. - """ - return self.header_attributes.get(constants.LIBRARY_ATTRIBUTE, "") - - @property - def schema_namespace(self): - """Returns the schema namespace prefix""" - return self._namespace - - def can_save(self): - """ Returns if it's legal to save this schema. - - You cannot save schemas loaded as merged from multiple library schemas. - - Returns: - bool: True if this can be saved - """ - return not self.library or "," not in self.library - - @property - def with_standard(self): - """ The version of the base schema this is extended from, if it exists. - - Returns: - str: HED version or "" - - """ - return self.header_attributes.get(constants.WITH_STANDARD_ATTRIBUTE, "") - - @property - def merged(self): - """ Returns if this schema was loaded from a merged file - - Returns: - bool: True if file was loaded from a merged file - - - """ - return not self.header_attributes.get(constants.UNMERGED_ATTRIBUTE, "") - - @property - def tags(self): - """ Return the tag schema section. - - Returns: - HedSchemaTagSection: The tag section. - """ - return self._sections[HedSectionKey.Tags] - - @property - def unit_classes(self): - """ Return the unit classes schema section. - - Returns: - HedSchemaUnitClassSection: The unit classes section. - """ - return self._sections[HedSectionKey.UnitClasses] - - @property - def units(self): - """ Return the unit schema section. - - Returns: - HedSchemaSection: The unit section. - """ - return self._sections[HedSectionKey.Units] - - @property - def unit_modifiers(self): - """ Return the modifiers classes schema section - - Returns: - HedSchemaSection: The unit modifiers section. - """ - return self._sections[HedSectionKey.UnitModifiers] - - @property - def value_classes(self): - """ Return the value classes schema section. - - Returns: - HedSchemaSection: The value classes section. - """ - return self._sections[HedSectionKey.ValueClasses] - - @property - def attributes(self): - """ Return the attributes schema section. - - Returns: - HedSchemaSection: The attributes section. - """ - return self._sections[HedSectionKey.Attributes] - - @property - def properties(self): - """ Return the properties schema section. - - Returns: - HedSchemaSection: The properties section. - """ - return self._sections[HedSectionKey.Properties] - - def get_schema_versions(self): - """ A list of HED version strings including namespace and library name if any of this schema. - - Returns: - list: The complete version of this schema including library name and namespace. - """ - return [self.get_formatted_version()] - - def get_formatted_version(self): - """ The HED version string including namespace and library name if any of this schema. - - Returns: - str: A json formatted string of the complete version of this schema including library name and namespace. - """ - - return json.dumps(self.version) - - def get_save_header_attributes(self, save_merged=False): - """ returns the attributes that should be saved. - - """ - sort_to_start = "!!!!!!!!!!!!!!" - header_attributes = dict(sorted(self.header_attributes.items(), - key=lambda x: sort_to_start if x[0] == constants.VERSION_ATTRIBUTE else x[0], - reverse=False)) - if save_merged: - header_attributes.pop(constants.UNMERGED_ATTRIBUTE, None) - else: - # make sure it's the last attribute(just to make sure it's in an order) - header_attributes.pop(constants.UNMERGED_ATTRIBUTE, None) - header_attributes[constants.UNMERGED_ATTRIBUTE] = "True" - - return header_attributes - - def schema_for_namespace(self, namespace): - """ Return HedSchema object for this namespace. - - Parameters: - namespace (str): The schema library name namespace. - - Returns: - HedSchema: The HED schema object for this schema. - """ - if self._namespace != namespace: - return None - return self - - @property - def valid_prefixes(self): - """ Return a list of all prefixes this schema will accept - - Returns: - list: A list of valid tag prefixes for this schema. - - Notes: - - The return value is always length 1 if using a HedSchema. - """ - return [self._namespace] - - # =============================================== - # Creation and saving functions - # =============================================== - - # todo: we may want to collapse these 6 functions into one like this - # def serialize(self, filename=None, save_merged=False, file_format=whatever is default): - # pass - - def get_as_mediawiki_string(self, save_merged=False): - """ Return the schema to a mediawiki string. - - Parameters: - save_merged (bool): If True, this will save the schema as a merged schema if it is a "withStandard" schema. - If it is not a "withStandard" schema, this setting has no effect. - - Returns: - str: The schema as a string in mediawiki format. - - """ - output_strings = Schema2Wiki().process_schema(self, save_merged) - return '\n'.join(output_strings) - - def get_as_xml_string(self, save_merged=True): - """ Return the schema to an XML string. - - Parameters: - save_merged (bool): - If True, this will save the schema as a merged schema if it is a "withStandard" schema. - If it is not a "withStandard" schema, this setting has no effect. - Returns: - str: Return the schema as an XML string. - - """ - xml_tree = Schema2XML().process_schema(self, save_merged) - return schema_util.xml_element_2_str(xml_tree) - - def get_as_dataframes(self, save_merged=False): - """ Get a dict of dataframes representing this file - - save_merged: bool - If True, this will save the schema as a merged schema if it is a "withStandard" schema. - If it is not a "withStandard" schema, this setting has no effect. - - Returns: - dataframes(dict): a dict of dataframes you can load as a schema - """ - output_dfs = Schema2DF().process_schema(self, save_merged) - return output_dfs - - def save_as_mediawiki(self, filename, save_merged=False): - """ Save as mediawiki to a file. - - filename: str - save location - save_merged: bool - If True, this will save the schema as a merged schema if it is a "withStandard" schema. - If it is not a "withStandard" schema, this setting has no effect. - - :raises OSError: - - File cannot be saved for some reason. - """ - output_strings = Schema2Wiki().process_schema(self, save_merged) - with open(filename, mode='w', encoding='utf-8') as opened_file: - for string in output_strings: - opened_file.write(string) - opened_file.write('\n') - - def save_as_xml(self, filename, save_merged=True): - """ Save as XML to a file. - - filename: str - save location - save_merged: bool - If true, this will save the schema as a merged schema if it is a "withStandard" schema. - If it is not a "withStandard" schema, this setting has no effect. - - :raises OSError: - - File cannot be saved for some reason - """ - xml_tree = Schema2XML().process_schema(self, save_merged) - with open(filename, mode='w', encoding='utf-8') as opened_file: - xml_string = schema_util.xml_element_2_str(xml_tree) - opened_file.write(xml_string) - - def save_as_dataframes(self, base_filename, save_merged=False): - """ Save as dataframes to a folder of files. - - If base_filename has a .tsv suffix, save directly to the indicated location. - If base_filename is a directory(does NOT have a .tsv suffix), save the contents into a directory named that. - The subfiles are named the same. e.g. HED8.3.0/HED8.3.0_Tag.tsv - - base_filename: str - save filename. A suffix will be added to most, e.g. _Tag - save_merged: bool - If True, this will save the schema as a merged schema if it is a "withStandard" schema. - If it is not a "withStandard" schema, this setting has no effect. - - :raises OSError: - - File cannot be saved for some reason. - """ - output_dfs = Schema2DF().process_schema(self, save_merged) - ontology_util.save_dataframes(base_filename, output_dfs) - - def set_schema_prefix(self, schema_namespace): - """ Set library namespace associated for this schema. - - Parameters: - schema_namespace (str): Should be empty, or end with a colon.(Colon will be automated added if missing). - - :raises HedFileError: - - The prefix is invalid - """ - if schema_namespace and schema_namespace[-1] != ":": - schema_namespace += ":" - - if schema_namespace and not schema_namespace[:-1].isalpha(): - raise HedFileError(HedExceptions.INVALID_LIBRARY_PREFIX, - "Schema namespace must contain only alpha characters", - self.filename) - - self._namespace = schema_namespace - - def __eq__(self, other): - """ Return True if these schema match exactly. - - Parameters: - other (HedSchema): The schema to be compared. - - Returns: - bool: True if other exactly matches this schema. - - Notes: - - Matches must include attributes, tag names, etc. - - """ - if other is None: - return False - if self.get_save_header_attributes() != other.get_save_header_attributes(): - return False - if self.has_duplicates() != other.has_duplicates(): - return False - if self.prologue.strip() != other.prologue.strip(): - return False - if self.epilogue.strip() != other.epilogue.strip(): - return False - if self._sections != other._sections: - # This block is useful for debugging when modifying the schema class itself. - # for section1, section2 in zip(self._sections.values(), other._sections.values()): - # if section1 != section2: - # dict1 = section1.all_names - # dict2 = section2.all_names - # if dict1 != dict2: - # print(f"DICT {section1._section_key} NOT EQUAL") - # key_union = set(list(dict1.keys()) + list(dict2.keys())) - # for key in key_union: - # if key not in dict1: - # print(f"{key} not in dict1") - # continue - # if key not in dict2: - # print(f"{key} not in dict2") - # continue - # if dict1[key] != dict2[key]: - # s = f"{key} unmatched: '{str(dict1[key].name)}' vs '{str(dict2[key].name)}'" - # print(s) - return False - if self._namespace != other._namespace: - return False - return True - - def __getitem__(self, section_key): - return self._sections[section_key] - - def check_compliance(self, check_for_warnings=True, name=None, error_handler=None): - """ Check for HED3 compliance of this schema. - - Parameters: - check_for_warnings (bool): If True, checks for formatting issues like invalid characters, capitalization. - name (str): If present, use as the filename for context, rather than using the actual filename. - Useful for temp filenames when supporting web services. - error_handler (ErrorHandler or None): Used to report errors. Uses a default one if none passed in. - - Returns: - list: A list of all warnings and errors found in the file. Each issue is a dictionary. - """ - from hed.schema import schema_compliance - return schema_compliance.check_compliance(self, check_for_warnings, name, error_handler) - - def get_tags_with_attribute(self, attribute, key_class=HedSectionKey.Tags): - """ Return tag entries with the given attribute. - - Parameters: - attribute (str): A tag attribute. Eg HedKey.ExtensionAllowed - key_class (HedSectionKey): The HedSectionKey for the section to retrieve from. - - Returns: - list: A list of all tags with this attribute. - - Notes: - - The result is cached so will be fast after first call. - """ - return self._sections[key_class].get_entries_with_attribute(attribute, return_name_only=True, - schema_namespace=self._namespace) - - def get_tag_entry(self, name, key_class=HedSectionKey.Tags, schema_namespace=""): - """ Return the schema entry for this tag, if one exists. - - Parameters: - name (str): Any form of basic tag(or other section entry) to look up. - This will not handle extensions or similar. - If this is a tag, it can have a schema namespace, but it's not required - key_class (HedSectionKey or str): The type of entry to return. - schema_namespace (str): Only used on Tags. If incorrect, will return None. - - Returns: - HedSchemaEntry: The schema entry for the given tag. - """ - if key_class == HedSectionKey.Tags: - if schema_namespace != self._namespace: - return None - if name.startswith(self._namespace): - name = name[len(self._namespace):] - - return self._get_tag_entry(name, key_class) - - def find_tag_entry(self, tag, schema_namespace=""): - """ Find the schema entry for a given source tag. - - Parameters: - tag (str, HedTag): Any form of tag to look up. Can have an extension, value, etc. - schema_namespace (str): The schema namespace of the tag, if any. - - Returns: - HedTagEntry: The located tag entry for this tag. - str: The remainder of the tag that isn't part of the base tag. - list: A list of errors while converting. - - Notes: - Works left to right (which is mostly relevant for errors). - """ - if schema_namespace != self._namespace: - validation_issues = ErrorHandler.format_error(ValidationErrors.HED_LIBRARY_UNMATCHED, tag, - schema_namespace, self.valid_prefixes) - return None, None, validation_issues - return self._find_tag_entry(tag, schema_namespace) - - # =============================================== - # Private utility functions for getting/finding tags - # =============================================== - def _get_tag_entry(self, name, key_class=HedSectionKey.Tags): - """ Return the schema entry for this tag, if one exists. - - Parameters: - name (str): Any form of basic tag(or other section entry) to look up. - This will not handle extensions or similar. - key_class (HedSectionKey or str): The type of entry to return. - - Returns: - HedSchemaEntry: The schema entry for the given tag. - - """ - return self._sections[key_class].get(name) - - def _find_tag_entry(self, tag, schema_namespace=""): - """ Find the schema entry for a given source tag. - - Parameters: - tag (str, HedTag): Any form of tag to look up. Can have an extension, value, etc. - schema_namespace (str): The schema namespace of the tag, if any. - - Returns: - HedTagEntry: The located tag entry for this tag. - str: The remainder of the tag that isn't part of the base tag. - list: A list of errors while converting. - - Notes: - Works left to right (which is mostly relevant for errors). - - """ - clean_tag = str(tag) - namespace = schema_namespace - clean_tag = clean_tag[len(namespace):] - working_tag = clean_tag.casefold() - - # Most tags are in the schema directly, so test that first - found_entry = self._get_tag_entry(working_tag) - if found_entry: - # this handles the one special case where the actual tag contains "/#" instead of something specific. - if working_tag.endswith("/#"): - remainder = working_tag[-2:] - else: - remainder = "" - - return found_entry, remainder, [] - - prefix_tag_adj = len(namespace) - - try: - found_entry, current_slash_index = self._find_tag_subfunction(tag, working_tag, prefix_tag_adj) - except self._TagIdentifyError as e: - issue = e.issue - return None, None, issue - - remainder = None - if current_slash_index != -1: - remainder = clean_tag[current_slash_index:] - if remainder and found_entry.takes_value_child_entry: - found_entry = found_entry.takes_value_child_entry - - return found_entry, remainder, [] - - def _find_tag_subfunction(self, tag, working_tag, prefix_tag_adj): - """Finds the base tag and remainder from the left, raising exception on issues""" - current_slash_index = -1 - current_entry = None - # Loop left to right, checking each word. Once we find an invalid word, we stop. - while True: - next_index = working_tag.find("/", current_slash_index + 1) - if next_index == -1: - next_index = len(working_tag) - parent_name = working_tag[:next_index] - parent_entry = self._get_tag_entry(parent_name) - - if not parent_entry: - # We haven't found any tag at all yet - if current_entry is None: - error = ErrorHandler.format_error(ValidationErrors.NO_VALID_TAG_FOUND, - tag, - index_in_tag=prefix_tag_adj, - index_in_tag_end=prefix_tag_adj + next_index) - raise self._TagIdentifyError(error) - # If this is not a takes value node, validate each term in the remainder. - if not current_entry.takes_value_child_entry: - # This will raise _TagIdentifyError on any issues - self._validate_remaining_terms(tag, working_tag, prefix_tag_adj, current_slash_index) - break - - current_entry = parent_entry - current_slash_index = next_index - if next_index == len(working_tag): - break - - return current_entry, current_slash_index - - def _validate_remaining_terms(self, tag, working_tag, prefix_tag_adj, current_slash_index): - """ Validates the terms past current_slash_index. - - :raises _TagIdentifyError: - - One of the extension terms already exists as a schema term. - """ - child_names = working_tag[current_slash_index + 1:].split("/") - word_start_index = current_slash_index + 1 + prefix_tag_adj - for name in child_names: - if self._get_tag_entry(name): - error = ErrorHandler.format_error(ValidationErrors.INVALID_PARENT_NODE, - tag, - index_in_tag=word_start_index, - index_in_tag_end=word_start_index + len(name), - expected_parent_tag=self.tags[name].name) - raise self._TagIdentifyError(error) - word_start_index += len(name) + 1 - - def has_duplicates(self): - """Returns the first duplicate tag/unit/etc. if any section has a duplicate name""" - for section in self._sections.values(): - has_duplicates = bool(section.duplicate_names) - if has_duplicates: - # Return first entry of dict - return next(iter(section.duplicate_names)) - - return False - - # =============================================== - # Semi-private creation finalizing functions - # =============================================== - def finalize_dictionaries(self): - """ Call to finish loading. """ - # Kludge - Reset this here so it recalculates while having all properties - self._schema83 = None - self._update_all_entries() - - def _update_all_entries(self): - """ Call finalize_entry on every schema entry(tag, unit, etc). """ - for key_class, section in self._sections.items(): - self._initialize_attributes(key_class) - section._finalize_section(self) - - def _initialize_attributes(self, key_class): - """ Set the valid attributes for a section. - - Parameters: - key_class (HedSectionKey): The section key for the section to update. - - """ - self._sections[key_class].valid_attributes = self._get_attributes_for_section(key_class) - - # =============================================== - # Getters used to write out schema primarily. - # =============================================== - def get_tag_attribute_names_old(self): - """ Return a dict of all allowed tag attributes. - - Returns: - dict: A dictionary whose keys are attribute names and values are HedSchemaEntry object. - - """ - return {tag_entry.name: tag_entry for tag_entry in self._sections[HedSectionKey.Attributes].values() - if not tag_entry.has_attribute(HedKeyOld.UnitClassProperty) - and not tag_entry.has_attribute(HedKeyOld.UnitProperty) - and not tag_entry.has_attribute(HedKeyOld.UnitModifierProperty) - and not tag_entry.has_attribute(HedKeyOld.ValueClassProperty)} - - # =============================================== - # Private utility functions - # =============================================== - @staticmethod - def _create_empty_sections(): - dictionaries = {} - # Add main sections - dictionaries[HedSectionKey.Properties] = HedSchemaSection(HedSectionKey.Properties) - dictionaries[HedSectionKey.Attributes] = HedSchemaSection(HedSectionKey.Attributes) - dictionaries[HedSectionKey.UnitModifiers] = HedSchemaSection(HedSectionKey.UnitModifiers) - dictionaries[HedSectionKey.Units] = HedSchemaUnitSection(HedSectionKey.Units) - dictionaries[HedSectionKey.UnitClasses] = HedSchemaUnitClassSection(HedSectionKey.UnitClasses) - dictionaries[HedSectionKey.ValueClasses] = HedSchemaSection(HedSectionKey.ValueClasses) - dictionaries[HedSectionKey.Tags] = HedSchemaTagSection(HedSectionKey.Tags, case_sensitive=False) - - return dictionaries - - def _get_modifiers_for_unit(self, unit): - """ Return the valid modifiers for the given unit - - Parameters: - unit (str): A known unit. - - Returns: - derived_unit_list(list of HedSchemaEntry): The derived units for this unit - - Notes: - This is a lower level one that doesn't rely on the Unit entries being fully setup. - """ - unit_entry = self.get_tag_entry(unit, HedSectionKey.Units) - if unit_entry is None: - return [] - is_si_unit = unit_entry.has_attribute(HedKey.SIUnit) - is_unit_symbol = unit_entry.has_attribute(HedKey.UnitSymbol) - if not is_si_unit: - return [] - if is_unit_symbol: - modifier_attribute_name = HedKey.SIUnitSymbolModifier - else: - modifier_attribute_name = HedKey.SIUnitModifier - valid_modifiers = self.unit_modifiers.get_entries_with_attribute(modifier_attribute_name) - return valid_modifiers - - def _add_element_property_attributes(self, attribute_dict, attribute_name): - attributes = {attribute: entry for attribute, entry in self._sections[HedSectionKey.Attributes].items() - if entry.has_attribute(attribute_name)} - - attribute_dict.update(attributes) - - def _get_attributes_for_section(self, key_class): - """Return the valid attributes for this section. - - Parameters: - key_class (HedSectionKey): The HedKey for this section. - - Returns: - dict: A dict of all the attributes for this section. - """ - element_prop_key = HedKey.ElementDomain if self.schema_83_props else HedKeyOld.ElementProperty - - # Common logic for Attributes and Properties - if key_class in [HedSectionKey.Attributes, HedSectionKey.Properties]: - prop_added_dict = {} - if key_class == HedSectionKey.Attributes: - prop_added_dict = {key: value for key, value in self._sections[HedSectionKey.Properties].items()} - self._add_element_property_attributes(prop_added_dict, element_prop_key) - return prop_added_dict - - if self.schema_83_props: - attrib_classes = { - HedSectionKey.UnitClasses: HedKey.UnitClassDomain, - HedSectionKey.Units: HedKey.UnitDomain, - HedSectionKey.UnitModifiers: HedKey.UnitModifierDomain, - HedSectionKey.ValueClasses: HedKey.ValueClassDomain, - HedSectionKey.Tags: HedKey.TagDomain - } - else: - attrib_classes = { - HedSectionKey.UnitClasses: HedKeyOld.UnitClassProperty, - HedSectionKey.Units: HedKeyOld.UnitProperty, - HedSectionKey.UnitModifiers: HedKeyOld.UnitModifierProperty, - HedSectionKey.ValueClasses: HedKeyOld.ValueClassProperty - } - if key_class == HedSectionKey.Tags: - return self.get_tag_attribute_names_old() - - # Retrieve attributes based on the determined class - attrib_class = attrib_classes.get(key_class) - if not attrib_class: - return [] - - attributes = {attribute: entry for attribute, entry in self._sections[HedSectionKey.Attributes].items() - if entry.has_attribute(attrib_class) or entry.has_attribute(element_prop_key)} - return attributes - - # =============================================== - # Semi private function used to create a schema in memory(usually from a source file) - # =============================================== - def _add_tag_to_dict(self, long_tag_name, new_entry, key_class): - section = self._sections[key_class] - return section._add_to_dict(long_tag_name, new_entry) - - def _create_tag_entry(self, long_tag_name, key_class): - section = self._sections[key_class] - return section._create_tag_entry(long_tag_name) - - class _TagIdentifyError(Exception): - """Used internally to note when a tag cannot be identified.""" - def __init__(self, issue): - self.issue = issue +import json + + +from hed.schema.hed_schema_constants import HedKey, HedSectionKey, HedKeyOld +from hed.schema import hed_schema_constants as constants +from hed.schema.schema_io import schema_util, df_util +from hed.schema.schema_io.schema2xml import Schema2XML +from hed.schema.schema_io.schema2wiki import Schema2Wiki +from hed.schema.schema_io.schema2df import Schema2DF + +from hed.schema.hed_schema_section import (HedSchemaSection, HedSchemaTagSection, HedSchemaUnitClassSection, + HedSchemaUnitSection) +from hed.errors import ErrorHandler +from hed.errors.error_types import ValidationErrors +from hed.schema.hed_schema_base import HedSchemaBase +from hed.errors.exceptions import HedFileError, HedExceptions + + +class HedSchema(HedSchemaBase): + """ A HED schema suitable for processing. """ + + def __init__(self): + """ Constructor for the HedSchema class. + + A HedSchema can be used for validation, checking tag attributes, parsing tags, etc. + """ + super().__init__() + self.header_attributes = {} + self.filename = None + self.prologue = "" + self.epilogue = "" + + # This is the specified library name_prefix - tags will be {schema_namespace}:{tag_name} + self._namespace = "" + + self._sections = self._create_empty_sections() + self.source_format = None # The type of file this was loaded from(mediawiki, xml, or owl - None if mixed) + + # =============================================== + # Basic schema properties + # =============================================== + @property + def version_number(self): + """ The HED version of this schema. + + Returns: + str: The version of this schema. + + """ + return self.header_attributes['version'] + + @property + def version(self): + """The complete schema version, including prefix and library name(if applicable)""" + libraries = self.library.split(",") + versions = self.version_number.split(",") + namespace = self._namespace + combined_versions = [f"{namespace}{version}" if not library else f"{namespace}{library}_{version}" + for library, version in zip(libraries, versions)] + + return ",".join(combined_versions) + + @property + def library(self): + """ The name of this library schema if one exists. + + Returns: + str: Library name if any. + """ + return self.header_attributes.get(constants.LIBRARY_ATTRIBUTE, "") + + @property + def schema_namespace(self): + """Returns the schema namespace prefix""" + return self._namespace + + def can_save(self): + """ Returns if it's legal to save this schema. + + You cannot save schemas loaded as merged from multiple library schemas. + + Returns: + bool: True if this can be saved + """ + return not self.library or "," not in self.library + + @property + def with_standard(self): + """ The version of the base schema this is extended from, if it exists. + + Returns: + str: HED version or "" + + """ + return self.header_attributes.get(constants.WITH_STANDARD_ATTRIBUTE, "") + + @property + def merged(self): + """ Returns if this schema was loaded from a merged file + + Returns: + bool: True if file was loaded from a merged file + + + """ + return not self.header_attributes.get(constants.UNMERGED_ATTRIBUTE, "") + + @property + def tags(self): + """ Return the tag schema section. + + Returns: + HedSchemaTagSection: The tag section. + """ + return self._sections[HedSectionKey.Tags] + + @property + def unit_classes(self): + """ Return the unit classes schema section. + + Returns: + HedSchemaUnitClassSection: The unit classes section. + """ + return self._sections[HedSectionKey.UnitClasses] + + @property + def units(self): + """ Return the unit schema section. + + Returns: + HedSchemaSection: The unit section. + """ + return self._sections[HedSectionKey.Units] + + @property + def unit_modifiers(self): + """ Return the modifiers classes schema section + + Returns: + HedSchemaSection: The unit modifiers section. + """ + return self._sections[HedSectionKey.UnitModifiers] + + @property + def value_classes(self): + """ Return the value classes schema section. + + Returns: + HedSchemaSection: The value classes section. + """ + return self._sections[HedSectionKey.ValueClasses] + + @property + def attributes(self): + """ Return the attributes schema section. + + Returns: + HedSchemaSection: The attributes section. + """ + return self._sections[HedSectionKey.Attributes] + + @property + def properties(self): + """ Return the properties schema section. + + Returns: + HedSchemaSection: The properties section. + """ + return self._sections[HedSectionKey.Properties] + + def get_schema_versions(self): + """ A list of HED version strings including namespace and library name if any of this schema. + + Returns: + list: The complete version of this schema including library name and namespace. + """ + return [self.get_formatted_version()] + + def get_formatted_version(self): + """ The HED version string including namespace and library name if any of this schema. + + Returns: + str: A json formatted string of the complete version of this schema including library name and namespace. + """ + + return json.dumps(self.version) + + def get_save_header_attributes(self, save_merged=False): + """ returns the attributes that should be saved. + + """ + sort_to_start = "!!!!!!!!!!!!!!" + header_attributes = dict(sorted(self.header_attributes.items(), + key=lambda x: sort_to_start if x[0] == constants.VERSION_ATTRIBUTE else x[0], + reverse=False)) + if save_merged: + header_attributes.pop(constants.UNMERGED_ATTRIBUTE, None) + else: + # make sure it's the last attribute(just to make sure it's in an order) + header_attributes.pop(constants.UNMERGED_ATTRIBUTE, None) + header_attributes[constants.UNMERGED_ATTRIBUTE] = "True" + + return header_attributes + + def schema_for_namespace(self, namespace): + """ Return HedSchema object for this namespace. + + Parameters: + namespace (str): The schema library name namespace. + + Returns: + HedSchema: The HED schema object for this schema. + """ + if self._namespace != namespace: + return None + return self + + @property + def valid_prefixes(self): + """ Return a list of all prefixes this schema will accept + + Returns: + list: A list of valid tag prefixes for this schema. + + Notes: + - The return value is always length 1 if using a HedSchema. + """ + return [self._namespace] + + # =============================================== + # Creation and saving functions + # =============================================== + + # todo: we may want to collapse these 6 functions into one like this + # def serialize(self, filename=None, save_merged=False, file_format=whatever is default): + # pass + + def get_as_mediawiki_string(self, save_merged=False): + """ Return the schema to a mediawiki string. + + Parameters: + save_merged (bool): If True, this will save the schema as a merged schema if it is a "withStandard" schema. + If it is not a "withStandard" schema, this setting has no effect. + + Returns: + str: The schema as a string in mediawiki format. + + """ + output_strings = Schema2Wiki().process_schema(self, save_merged) + return '\n'.join(output_strings) + + def get_as_xml_string(self, save_merged=True): + """ Return the schema to an XML string. + + Parameters: + save_merged (bool): + If True, this will save the schema as a merged schema if it is a "withStandard" schema. + If it is not a "withStandard" schema, this setting has no effect. + Returns: + str: Return the schema as an XML string. + + """ + xml_tree = Schema2XML().process_schema(self, save_merged) + return schema_util.xml_element_2_str(xml_tree) + + def get_as_dataframes(self, save_merged=False): + """ Get a dict of dataframes representing this file + + save_merged: bool + If True, this will save the schema as a merged schema if it is a "withStandard" schema. + If it is not a "withStandard" schema, this setting has no effect. + + Returns: + dataframes(dict): a dict of dataframes you can load as a schema + """ + output_dfs = Schema2DF().process_schema(self, save_merged) + return output_dfs + + def save_as_mediawiki(self, filename, save_merged=False): + """ Save as mediawiki to a file. + + filename: str + save location + save_merged: bool + If True, this will save the schema as a merged schema if it is a "withStandard" schema. + If it is not a "withStandard" schema, this setting has no effect. + + :raises OSError: + - File cannot be saved for some reason. + """ + output_strings = Schema2Wiki().process_schema(self, save_merged) + with open(filename, mode='w', encoding='utf-8') as opened_file: + for string in output_strings: + opened_file.write(string) + opened_file.write('\n') + + def save_as_xml(self, filename, save_merged=True): + """ Save as XML to a file. + + filename: str + save location + save_merged: bool + If true, this will save the schema as a merged schema if it is a "withStandard" schema. + If it is not a "withStandard" schema, this setting has no effect. + + :raises OSError: + - File cannot be saved for some reason + """ + xml_tree = Schema2XML().process_schema(self, save_merged) + with open(filename, mode='w', encoding='utf-8') as opened_file: + xml_string = schema_util.xml_element_2_str(xml_tree) + opened_file.write(xml_string) + + def save_as_dataframes(self, base_filename, save_merged=False): + """ Save as dataframes to a folder of files. + + If base_filename has a .tsv suffix, save directly to the indicated location. + If base_filename is a directory(does NOT have a .tsv suffix), save the contents into a directory named that. + The subfiles are named the same. e.g. HED8.3.0/HED8.3.0_Tag.tsv + + base_filename: str + save filename. A suffix will be added to most, e.g. _Tag + save_merged: bool + If True, this will save the schema as a merged schema if it is a "withStandard" schema. + If it is not a "withStandard" schema, this setting has no effect. + + :raises OSError: + - File cannot be saved for some reason. + """ + output_dfs = Schema2DF().process_schema(self, save_merged) + df_util.save_dataframes(base_filename, output_dfs) + + def set_schema_prefix(self, schema_namespace): + """ Set library namespace associated for this schema. + + Parameters: + schema_namespace (str): Should be empty, or end with a colon.(Colon will be automated added if missing). + + :raises HedFileError: + - The prefix is invalid + """ + if schema_namespace and schema_namespace[-1] != ":": + schema_namespace += ":" + + if schema_namespace and not schema_namespace[:-1].isalpha(): + raise HedFileError(HedExceptions.INVALID_LIBRARY_PREFIX, + "Schema namespace must contain only alpha characters", + self.filename) + + self._namespace = schema_namespace + + def __eq__(self, other): + """ Return True if these schema match exactly. + + Parameters: + other (HedSchema): The schema to be compared. + + Returns: + bool: True if other exactly matches this schema. + + Notes: + - Matches must include attributes, tag names, etc. + + """ + if other is None: + return False + if self.get_save_header_attributes() != other.get_save_header_attributes(): + return False + if self.has_duplicates() != other.has_duplicates(): + return False + if self.prologue.strip() != other.prologue.strip(): + return False + if self.epilogue.strip() != other.epilogue.strip(): + return False + if self._sections != other._sections: + # This block is useful for debugging when modifying the schema class itself. + # for section1, section2 in zip(self._sections.values(), other._sections.values()): + # if section1 != section2: + # dict1 = section1.all_names + # dict2 = section2.all_names + # if dict1 != dict2: + # print(f"DICT {section1._section_key} NOT EQUAL") + # key_union = set(list(dict1.keys()) + list(dict2.keys())) + # for key in key_union: + # if key not in dict1: + # print(f"{key} not in dict1") + # continue + # if key not in dict2: + # print(f"{key} not in dict2") + # continue + # if dict1[key] != dict2[key]: + # s = f"{key} unmatched: '{str(dict1[key].name)}' vs '{str(dict2[key].name)}'" + # print(s) + return False + if self._namespace != other._namespace: + return False + return True + + def __getitem__(self, section_key): + return self._sections[section_key] + + def check_compliance(self, check_for_warnings=True, name=None, error_handler=None): + """ Check for HED3 compliance of this schema. + + Parameters: + check_for_warnings (bool): If True, checks for formatting issues like invalid characters, capitalization. + name (str): If present, use as the filename for context, rather than using the actual filename. + Useful for temp filenames when supporting web services. + error_handler (ErrorHandler or None): Used to report errors. Uses a default one if none passed in. + + Returns: + list: A list of all warnings and errors found in the file. Each issue is a dictionary. + """ + from hed.schema import schema_compliance + return schema_compliance.check_compliance(self, check_for_warnings, name, error_handler) + + def get_tags_with_attribute(self, attribute, key_class=HedSectionKey.Tags): + """ Return tag entries with the given attribute. + + Parameters: + attribute (str): A tag attribute. Eg HedKey.ExtensionAllowed + key_class (HedSectionKey): The HedSectionKey for the section to retrieve from. + + Returns: + list: A list of all tags with this attribute. + + Notes: + - The result is cached so will be fast after first call. + """ + return self._sections[key_class].get_entries_with_attribute(attribute, return_name_only=True, + schema_namespace=self._namespace) + + def get_tag_entry(self, name, key_class=HedSectionKey.Tags, schema_namespace=""): + """ Return the schema entry for this tag, if one exists. + + Parameters: + name (str): Any form of basic tag(or other section entry) to look up. + This will not handle extensions or similar. + If this is a tag, it can have a schema namespace, but it's not required + key_class (HedSectionKey or str): The type of entry to return. + schema_namespace (str): Only used on Tags. If incorrect, will return None. + + Returns: + HedSchemaEntry: The schema entry for the given tag. + """ + if key_class == HedSectionKey.Tags: + if schema_namespace != self._namespace: + return None + if name.startswith(self._namespace): + name = name[len(self._namespace):] + + return self._get_tag_entry(name, key_class) + + def find_tag_entry(self, tag, schema_namespace=""): + """ Find the schema entry for a given source tag. + + Parameters: + tag (str, HedTag): Any form of tag to look up. Can have an extension, value, etc. + schema_namespace (str): The schema namespace of the tag, if any. + + Returns: + HedTagEntry: The located tag entry for this tag. + str: The remainder of the tag that isn't part of the base tag. + list: A list of errors while converting. + + Notes: + Works left to right (which is mostly relevant for errors). + """ + if schema_namespace != self._namespace: + validation_issues = ErrorHandler.format_error(ValidationErrors.HED_LIBRARY_UNMATCHED, tag, + schema_namespace, self.valid_prefixes) + return None, None, validation_issues + return self._find_tag_entry(tag, schema_namespace) + + # =============================================== + # Private utility functions for getting/finding tags + # =============================================== + def _get_tag_entry(self, name, key_class=HedSectionKey.Tags): + """ Return the schema entry for this tag, if one exists. + + Parameters: + name (str): Any form of basic tag(or other section entry) to look up. + This will not handle extensions or similar. + key_class (HedSectionKey or str): The type of entry to return. + + Returns: + HedSchemaEntry: The schema entry for the given tag. + + """ + return self._sections[key_class].get(name) + + def _find_tag_entry(self, tag, schema_namespace=""): + """ Find the schema entry for a given source tag. + + Parameters: + tag (str, HedTag): Any form of tag to look up. Can have an extension, value, etc. + schema_namespace (str): The schema namespace of the tag, if any. + + Returns: + HedTagEntry: The located tag entry for this tag. + str: The remainder of the tag that isn't part of the base tag. + list: A list of errors while converting. + + Notes: + Works left to right (which is mostly relevant for errors). + + """ + clean_tag = str(tag) + namespace = schema_namespace + clean_tag = clean_tag[len(namespace):] + working_tag = clean_tag.casefold() + + # Most tags are in the schema directly, so test that first + found_entry = self._get_tag_entry(working_tag) + if found_entry: + # this handles the one special case where the actual tag contains "/#" instead of something specific. + if working_tag.endswith("/#"): + remainder = working_tag[-2:] + else: + remainder = "" + + return found_entry, remainder, [] + + prefix_tag_adj = len(namespace) + + try: + found_entry, current_slash_index = self._find_tag_subfunction(tag, working_tag, prefix_tag_adj) + except self._TagIdentifyError as e: + issue = e.issue + return None, None, issue + + remainder = None + if current_slash_index != -1: + remainder = clean_tag[current_slash_index:] + if remainder and found_entry.takes_value_child_entry: + found_entry = found_entry.takes_value_child_entry + + return found_entry, remainder, [] + + def _find_tag_subfunction(self, tag, working_tag, prefix_tag_adj): + """Finds the base tag and remainder from the left, raising exception on issues""" + current_slash_index = -1 + current_entry = None + # Loop left to right, checking each word. Once we find an invalid word, we stop. + while True: + next_index = working_tag.find("/", current_slash_index + 1) + if next_index == -1: + next_index = len(working_tag) + parent_name = working_tag[:next_index] + parent_entry = self._get_tag_entry(parent_name) + + if not parent_entry: + # We haven't found any tag at all yet + if current_entry is None: + error = ErrorHandler.format_error(ValidationErrors.NO_VALID_TAG_FOUND, + tag, + index_in_tag=prefix_tag_adj, + index_in_tag_end=prefix_tag_adj + next_index) + raise self._TagIdentifyError(error) + # If this is not a takes value node, validate each term in the remainder. + if not current_entry.takes_value_child_entry: + # This will raise _TagIdentifyError on any issues + self._validate_remaining_terms(tag, working_tag, prefix_tag_adj, current_slash_index) + break + + current_entry = parent_entry + current_slash_index = next_index + if next_index == len(working_tag): + break + + return current_entry, current_slash_index + + def _validate_remaining_terms(self, tag, working_tag, prefix_tag_adj, current_slash_index): + """ Validates the terms past current_slash_index. + + :raises _TagIdentifyError: + - One of the extension terms already exists as a schema term. + """ + child_names = working_tag[current_slash_index + 1:].split("/") + word_start_index = current_slash_index + 1 + prefix_tag_adj + for name in child_names: + if self._get_tag_entry(name): + error = ErrorHandler.format_error(ValidationErrors.INVALID_PARENT_NODE, + tag, + index_in_tag=word_start_index, + index_in_tag_end=word_start_index + len(name), + expected_parent_tag=self.tags[name].name) + raise self._TagIdentifyError(error) + word_start_index += len(name) + 1 + + def has_duplicates(self): + """Returns the first duplicate tag/unit/etc. if any section has a duplicate name""" + for section in self._sections.values(): + has_duplicates = bool(section.duplicate_names) + if has_duplicates: + # Return first entry of dict + return next(iter(section.duplicate_names)) + + return False + + # =============================================== + # Semi-private creation finalizing functions + # =============================================== + def finalize_dictionaries(self): + """ Call to finish loading. """ + # Kludge - Reset this here so it recalculates while having all properties + self._schema83 = None + self._update_all_entries() + + def _update_all_entries(self): + """ Call finalize_entry on every schema entry(tag, unit, etc). """ + for key_class, section in self._sections.items(): + self._initialize_attributes(key_class) + section._finalize_section(self) + + def _initialize_attributes(self, key_class): + """ Set the valid attributes for a section. + + Parameters: + key_class (HedSectionKey): The section key for the section to update. + + """ + self._sections[key_class].valid_attributes = self._get_attributes_for_section(key_class) + + # =============================================== + # Getters used to write out schema primarily. + # =============================================== + def get_tag_attribute_names_old(self): + """ Return a dict of all allowed tag attributes. + + Returns: + dict: A dictionary whose keys are attribute names and values are HedSchemaEntry object. + + """ + return {tag_entry.name: tag_entry for tag_entry in self._sections[HedSectionKey.Attributes].values() + if not tag_entry.has_attribute(HedKeyOld.UnitClassProperty) + and not tag_entry.has_attribute(HedKeyOld.UnitProperty) + and not tag_entry.has_attribute(HedKeyOld.UnitModifierProperty) + and not tag_entry.has_attribute(HedKeyOld.ValueClassProperty)} + + # =============================================== + # Private utility functions + # =============================================== + @staticmethod + def _create_empty_sections(): + dictionaries = {} + # Add main sections + dictionaries[HedSectionKey.Properties] = HedSchemaSection(HedSectionKey.Properties) + dictionaries[HedSectionKey.Attributes] = HedSchemaSection(HedSectionKey.Attributes) + dictionaries[HedSectionKey.UnitModifiers] = HedSchemaSection(HedSectionKey.UnitModifiers) + dictionaries[HedSectionKey.Units] = HedSchemaUnitSection(HedSectionKey.Units) + dictionaries[HedSectionKey.UnitClasses] = HedSchemaUnitClassSection(HedSectionKey.UnitClasses) + dictionaries[HedSectionKey.ValueClasses] = HedSchemaSection(HedSectionKey.ValueClasses) + dictionaries[HedSectionKey.Tags] = HedSchemaTagSection(HedSectionKey.Tags, case_sensitive=False) + + return dictionaries + + def _get_modifiers_for_unit(self, unit): + """ Return the valid modifiers for the given unit + + Parameters: + unit (str): A known unit. + + Returns: + derived_unit_list(list of HedSchemaEntry): The derived units for this unit + + Notes: + This is a lower level one that doesn't rely on the Unit entries being fully setup. + """ + unit_entry = self.get_tag_entry(unit, HedSectionKey.Units) + if unit_entry is None: + return [] + is_si_unit = unit_entry.has_attribute(HedKey.SIUnit) + is_unit_symbol = unit_entry.has_attribute(HedKey.UnitSymbol) + if not is_si_unit: + return [] + if is_unit_symbol: + modifier_attribute_name = HedKey.SIUnitSymbolModifier + else: + modifier_attribute_name = HedKey.SIUnitModifier + valid_modifiers = self.unit_modifiers.get_entries_with_attribute(modifier_attribute_name) + return valid_modifiers + + def _add_element_property_attributes(self, attribute_dict, attribute_name): + attributes = {attribute: entry for attribute, entry in self._sections[HedSectionKey.Attributes].items() + if entry.has_attribute(attribute_name)} + + attribute_dict.update(attributes) + + def _get_attributes_for_section(self, key_class): + """Return the valid attributes for this section. + + Parameters: + key_class (HedSectionKey): The HedKey for this section. + + Returns: + dict: A dict of all the attributes for this section. + """ + element_prop_key = HedKey.ElementDomain if self.schema_83_props else HedKeyOld.ElementProperty + + # Common logic for Attributes and Properties + if key_class in [HedSectionKey.Attributes, HedSectionKey.Properties]: + prop_added_dict = {} + if key_class == HedSectionKey.Attributes: + prop_added_dict = {key: value for key, value in self._sections[HedSectionKey.Properties].items()} + self._add_element_property_attributes(prop_added_dict, element_prop_key) + return prop_added_dict + + if self.schema_83_props: + attrib_classes = { + HedSectionKey.UnitClasses: HedKey.UnitClassDomain, + HedSectionKey.Units: HedKey.UnitDomain, + HedSectionKey.UnitModifiers: HedKey.UnitModifierDomain, + HedSectionKey.ValueClasses: HedKey.ValueClassDomain, + HedSectionKey.Tags: HedKey.TagDomain + } + else: + attrib_classes = { + HedSectionKey.UnitClasses: HedKeyOld.UnitClassProperty, + HedSectionKey.Units: HedKeyOld.UnitProperty, + HedSectionKey.UnitModifiers: HedKeyOld.UnitModifierProperty, + HedSectionKey.ValueClasses: HedKeyOld.ValueClassProperty + } + if key_class == HedSectionKey.Tags: + return self.get_tag_attribute_names_old() + + # Retrieve attributes based on the determined class + attrib_class = attrib_classes.get(key_class) + if not attrib_class: + return [] + + attributes = {attribute: entry for attribute, entry in self._sections[HedSectionKey.Attributes].items() + if entry.has_attribute(attrib_class) or entry.has_attribute(element_prop_key)} + return attributes + + # =============================================== + # Semi private function used to create a schema in memory(usually from a source file) + # =============================================== + def _add_tag_to_dict(self, long_tag_name, new_entry, key_class): + section = self._sections[key_class] + return section._add_to_dict(long_tag_name, new_entry) + + def _create_tag_entry(self, long_tag_name, key_class): + section = self._sections[key_class] + return section._create_tag_entry(long_tag_name) + + class _TagIdentifyError(Exception): + """Used internally to note when a tag cannot be identified.""" + def __init__(self, issue): + self.issue = issue diff --git a/hed/schema/hed_schema_df_constants.py b/hed/schema/hed_schema_df_constants.py index c0b7e8a66..cdee94291 100644 --- a/hed/schema/hed_schema_df_constants.py +++ b/hed/schema/hed_schema_df_constants.py @@ -1,86 +1,101 @@ -from hed.schema.hed_schema_constants import HedSectionKey -from hed.schema import hed_schema_constants - -# Known tsv format suffixes - -STRUCT_KEY = "Structure" -TAG_KEY = "Tag" -UNIT_KEY = "Unit" -UNIT_CLASS_KEY = "UnitClass" -UNIT_MODIFIER_KEY = "UnitModifier" -VALUE_CLASS_KEY = "ValueClass" - -ANNOTATION_KEY = "AnnotationProperty" -DATA_KEY = "DataProperty" -OBJECT_KEY = "ObjectProperty" - -ATTRIBUTE_PROPERTY_KEY = "AttributeProperty" - -PROPERTY_KEYS = [ANNOTATION_KEY, DATA_KEY, OBJECT_KEY] -DF_SUFFIXES = {TAG_KEY, STRUCT_KEY, VALUE_CLASS_KEY, - UNIT_CLASS_KEY, UNIT_KEY, UNIT_MODIFIER_KEY, - *PROPERTY_KEYS, ATTRIBUTE_PROPERTY_KEY} - -section_mapping = { - STRUCT_KEY: None, - TAG_KEY: HedSectionKey.Tags, - VALUE_CLASS_KEY: HedSectionKey.ValueClasses, - UNIT_CLASS_KEY: HedSectionKey.UnitClasses, - UNIT_KEY: HedSectionKey.Units, - UNIT_MODIFIER_KEY: HedSectionKey.UnitModifiers, - ANNOTATION_KEY: HedSectionKey.Attributes, - DATA_KEY: HedSectionKey.Attributes, - OBJECT_KEY: HedSectionKey.Attributes, - ATTRIBUTE_PROPERTY_KEY: HedSectionKey.Properties, -} - -# Spreadsheet column ids -hed_id = "hedId" -level = "Level" -name = "rdfs:label" -subclass_of = "omn:SubClassOf" -attributes = "Attributes" -description = "dc:description" -equivalent_to = "omn:EquivalentTo" -has_unit_class = "hasUnitClass" - -struct_columns = [hed_id, name, attributes, subclass_of, description, equivalent_to] -tag_columns = [hed_id, name, level, subclass_of, attributes, description, equivalent_to] -unit_columns = [hed_id, name, subclass_of, has_unit_class, attributes, description, equivalent_to] - -# The columns for unit class, value class, and unit modifier -other_columns = [hed_id, name, subclass_of, attributes, description, equivalent_to] - -# for schema attributes -property_type = "Type" -property_domain = "omn:Domain" -property_range = "omn:Range" -properties = "Properties" -property_columns = [hed_id, name, property_type, property_domain, property_range, properties, description] - -# For the schema properties -property_columns_reduced = [hed_id, name, property_type, description] - -# HED_00X__YY where X is the library starting index, and Y is the entity number below. -struct_base_ids = { - "HedEntity": 1, - "HedStructure": 2, - "HedElement": 3, - "HedSchema": 4, - "HedTag": 5, - "HedUnitClass": 6, - "HedUnit": 7, - "HedUnitModifier": 8, - "HedValueClass": 9, - "HedHeader": 10, - "HedPrologue": 11, - "HedEpilogue": 12 -} - -# todo: this should be retrieved directly from the appropriate spreadsheet -valid_omn_attributes = { - hed_schema_constants.VERSION_ATTRIBUTE: "HED_0000300", - hed_schema_constants.LIBRARY_ATTRIBUTE: "HED_0000301", - hed_schema_constants.WITH_STANDARD_ATTRIBUTE: "HED_0000302", - hed_schema_constants.UNMERGED_ATTRIBUTE: "HED_0000303" -} +from hed.schema.hed_schema_constants import HedSectionKey +from hed.schema import hed_schema_constants + +# Known tsv format suffixes + +STRUCT_KEY = "Structure" +TAG_KEY = "Tag" +UNIT_KEY = "Unit" +UNIT_CLASS_KEY = "UnitClass" +UNIT_MODIFIER_KEY = "UnitModifier" +VALUE_CLASS_KEY = "ValueClass" + +ANNOTATION_KEY = "AnnotationProperty" +DATA_KEY = "DataProperty" +OBJECT_KEY = "ObjectProperty" + +ATTRIBUTE_PROPERTY_KEY = "AttributeProperty" + +PREFIXES_KEY = "Prefixes" +EXTERNAL_ANNOTATION_KEY = "AnnotationPropertyExternal" + +PROPERTY_KEYS = [ANNOTATION_KEY, DATA_KEY, OBJECT_KEY] +DF_SUFFIXES = {TAG_KEY, STRUCT_KEY, VALUE_CLASS_KEY, + UNIT_CLASS_KEY, UNIT_KEY, UNIT_MODIFIER_KEY, + *PROPERTY_KEYS, ATTRIBUTE_PROPERTY_KEY} + + +DF_EXTRA_SUFFIXES = {PREFIXES_KEY, EXTERNAL_ANNOTATION_KEY} +DF_SUFFIXES_OMN = {*DF_SUFFIXES, *DF_EXTRA_SUFFIXES} + + +section_mapping_hed_id = { + STRUCT_KEY: None, + TAG_KEY: HedSectionKey.Tags, + VALUE_CLASS_KEY: HedSectionKey.ValueClasses, + UNIT_CLASS_KEY: HedSectionKey.UnitClasses, + UNIT_KEY: HedSectionKey.Units, + UNIT_MODIFIER_KEY: HedSectionKey.UnitModifiers, + ANNOTATION_KEY: HedSectionKey.Attributes, + DATA_KEY: HedSectionKey.Attributes, + OBJECT_KEY: HedSectionKey.Attributes, + ATTRIBUTE_PROPERTY_KEY: HedSectionKey.Properties, +} + +# Spreadsheet column ids +hed_id = "hedId" +level = "Level" +name = "rdfs:label" +subclass_of = "omn:SubClassOf" +attributes = "Attributes" +description = "dc:description" +equivalent_to = "omn:EquivalentTo" +has_unit_class = "hasUnitClass" +annotations = "Annotations" + + +struct_columns = [hed_id, name, attributes, subclass_of, description, equivalent_to] +tag_columns = [hed_id, name, level, subclass_of, attributes, description, equivalent_to] +unit_columns = [hed_id, name, subclass_of, has_unit_class, attributes, description, equivalent_to] + +# The columns for unit class, value class, and unit modifier +other_columns = [hed_id, name, subclass_of, attributes, description, equivalent_to] + +# for schema attributes +property_type = "Type" +property_domain = "omn:Domain" +property_range = "omn:Range" +properties = "Properties" +property_columns = [hed_id, name, property_type, property_domain, property_range, properties, description] + +# For the schema properties +property_columns_reduced = [hed_id, name, property_type, description] + +# HED_00X__YY where X is the library starting index, and Y is the entity number below. +struct_base_ids = { + "HedEntity": 1, + "HedStructure": 2, + "HedElement": 3, + "HedSchema": 4, + "HedTag": 5, + "HedUnitClass": 6, + "HedUnit": 7, + "HedUnitModifier": 8, + "HedValueClass": 9, + "HedHeader": 10, + "HedPrologue": 11, + "HedEpilogue": 12 +} + +# todo: this should be retrieved directly from the appropriate spreadsheet +valid_omn_attributes = { + hed_schema_constants.VERSION_ATTRIBUTE: "HED_0000300", + hed_schema_constants.LIBRARY_ATTRIBUTE: "HED_0000301", + hed_schema_constants.WITH_STANDARD_ATTRIBUTE: "HED_0000302", + hed_schema_constants.UNMERGED_ATTRIBUTE: "HED_0000303" +} + +# Extra spreadsheet column ideas +Prefix = "Prefix" +ID = "ID" +NamespaceIRI = "Namespace IRI" diff --git a/hed/schema/hed_schema_io.py b/hed/schema/hed_schema_io.py index 736004573..478c51c30 100644 --- a/hed/schema/hed_schema_io.py +++ b/hed/schema/hed_schema_io.py @@ -65,6 +65,7 @@ def load_schema(hed_path, schema_namespace=None, schema=None, name=None): hed_path (str): A filepath or url to open a schema from. If loading a TSV file, this should be a single filename where: Template: basename.tsv, where files are named basename_Struct.tsv, basename_Tag.tsv, etc. + Alternatively, you can point to a directory containing the .tsv files. schema_namespace (str or None): The name_prefix all tags in this schema will accept. schema(HedSchema or None): A hed schema to merge this new file into It must be a with-standard schema with the same value. @@ -324,20 +325,16 @@ def _load_schema_version_sub(xml_version, schema_namespace="", xml_folder=None, f"Must specify a schema version by number, found no version on {xml_version} schema.", filename=name) try: - # 1. Try fully local copy + # 1. Try fully local(or from direct cache) final_hed_xml_file = hed_cache.get_hed_version_path(xml_version, library_name, xml_folder) - if not final_hed_xml_file: - hed_cache.cache_local_versions(xml_folder) - # 2. Cache the schemas included in hedtools and try local again - final_hed_xml_file = hed_cache.get_hed_version_path(xml_version, library_name, xml_folder) hed_schema = load_schema(final_hed_xml_file, schema=schema, name=name) except HedFileError as e: if e.code == HedExceptions.FILE_NOT_FOUND: # Cache all schemas if we haven't recently. hed_cache.cache_xml_versions(cache_folder=xml_folder) - # 3. See if we got a copy from online + # 2. See if we got a copy from online final_hed_xml_file = hed_cache.get_hed_version_path(xml_version, library_name, xml_folder) - # 4. Finally check for a pre-release one + # 3. Finally check for a pre-release one if not final_hed_xml_file: final_hed_xml_file = hed_cache.get_hed_version_path(xml_version, library_name, xml_folder, check_prerelease=True) diff --git a/hed/schema/hed_schema_section.py b/hed/schema/hed_schema_section.py index 4923c4acb..d48349532 100644 --- a/hed/schema/hed_schema_section.py +++ b/hed/schema/hed_schema_section.py @@ -1,299 +1,295 @@ -from hed.schema.hed_schema_entry import HedSchemaEntry, UnitClassEntry, UnitEntry, HedTagEntry -from hed.schema.hed_schema_constants import HedSectionKey, HedKey, HedKeyOld - -entries_by_section = { - HedSectionKey.Properties: HedSchemaEntry, - HedSectionKey.Attributes: HedSchemaEntry, - HedSectionKey.UnitModifiers: HedSchemaEntry, - HedSectionKey.Units: UnitEntry, - HedSectionKey.UnitClasses: UnitClassEntry, - HedSectionKey.ValueClasses: HedSchemaEntry, - HedSectionKey.Tags: HedTagEntry, -} - - -class HedSchemaSection: - """Container with entries in one section of the schema. """ - - def __init__(self, section_key, case_sensitive=True): - """ Construct schema section. - - Parameters: - section_key (HedSectionKey): Name of the schema section. - case_sensitive (bool): If True, names are case-sensitive. - - """ - # {lower_case_name: HedSchemaEntry} - self.all_names = {} - self._section_key = section_key - self.case_sensitive = case_sensitive - - # Points to the entries in attributes - self.valid_attributes = {} - self._attribute_cache = {} - - self._section_entry = entries_by_section.get(section_key) - self._duplicate_names = {} - - self.all_entries = [] - - @property - def section_key(self): - return self._section_key - - @property - def duplicate_names(self): - return self._duplicate_names - - def _create_tag_entry(self, name): - new_entry = self._section_entry(name, self) - return new_entry - - def _check_if_duplicate(self, name_key, new_entry): - return_entry = new_entry - if name_key in self.all_names: - if name_key not in self._duplicate_names: - self._duplicate_names[name_key] = [self.all_names[name_key]] - self._duplicate_names[name_key].append(new_entry) - else: - self.all_names[name_key] = new_entry - - return return_entry - - def _add_to_dict(self, name, new_entry): - """ Add a name to the dictionary for this section. """ - name_key = name - if not self.case_sensitive: - name_key = name.casefold() - - return_entry = self._check_if_duplicate(name_key, new_entry) - - self.all_entries.append(new_entry) - return return_entry - - def get_entries_with_attribute(self, attribute_name, return_name_only=False, schema_namespace=""): - """ Return entries or names with given attribute. - - Parameters: - attribute_name (str): The name of the attribute(generally a HedKey entry). - return_name_only (bool): If True, return the name as a string rather than the tag entry. - schema_namespace (str): Prepends given namespace to each name if returning names. - - Returns: - list: List of HedSchemaEntry or strings representing the names. - - """ - if attribute_name not in self._attribute_cache: - new_val = [tag_entry for tag_entry in self.values() if tag_entry.has_attribute(attribute_name)] - self._attribute_cache[attribute_name] = new_val - - cache_val = self._attribute_cache[attribute_name] - if return_name_only: - return [f"{schema_namespace}{tag_entry.name}" for tag_entry in cache_val] - return cache_val - - # =============================================== - # Simple wrapper functions to make this class primarily function as a dict - # =============================================== - def __iter__(self): - return iter(self.all_names) - - def __len__(self): - return len(self.all_names) - - def items(self): - """ Return the items. """ - return self.all_names.items() - - def values(self): - """ All names of the sections. """ - return self.all_names.values() - - def keys(self): - """ The names of the keys. """ - return self.all_names.keys() - - def __getitem__(self, key): - if not self.case_sensitive: - key = key.casefold() - return self.all_names[key] - - def get(self, key): - """ Return the name associated with key. - - Parameters: - key (str): The name of the key. - - """ - try: - return self.__getitem__(key) - except KeyError: - return None - - def __eq__(self, other): - if self.all_names != other.all_names: - return False - if self._section_key != other._section_key: - return False - if self.case_sensitive != other.case_sensitive: - return False - if self.duplicate_names != other.duplicate_names: - return False - return True - - def __bool__(self): - return bool(self.all_names) - - def _finalize_section(self, hed_schema): - for entry in self.all_entries: - entry.finalize_entry(hed_schema) - - -class HedSchemaUnitSection(HedSchemaSection): - """The schema section containing units.""" - def _check_if_duplicate(self, name_key, new_entry): - """We need to mark duplicate units(units with unitSymbol are case sensitive, while others are not.""" - if not new_entry.has_attribute(HedKey.UnitSymbol): - name_key = name_key.casefold() - return super()._check_if_duplicate(name_key, new_entry) - - def __getitem__(self, key): - """Check the case of the key appropriately for symbols/not symbols, and return the matching entry.""" - unit_entry = self.all_names.get(key) - if unit_entry is None: - unit_entry = self.all_names.get(key.casefold()) - # Unit symbols must match exactly - if unit_entry is None or unit_entry.has_attribute(HedKey.UnitSymbol): - return None - return unit_entry - - -class HedSchemaUnitClassSection(HedSchemaSection): - """The schema section containing unit classes.""" - def _check_if_duplicate(self, name_key, new_entry): - """Allow adding units to existing unit classes, using a placeholder one with no attributes.""" - if name_key in self and len(new_entry.attributes) == 1 \ - and HedKey.InLibrary in new_entry.attributes: - return self.all_names[name_key] - return super()._check_if_duplicate(name_key, new_entry) - - -class HedSchemaTagSection(HedSchemaSection): - """The schema section containing all tags.""" - - def __init__(self, *args, case_sensitive=False, **kwargs): - super().__init__(*args, **kwargs, case_sensitive=case_sensitive) - # This dict contains all forms of all tags. The .all_names variable has ONLY the long forms. - self.long_form_tags = {} - self.inheritable_attributes = {} - self.root_tags = {} - - @staticmethod - def _get_tag_forms(name): - name_key = name - tag_forms = [] - while name_key: - tag_forms.append(name_key) - slash_index = name_key.find("/") - if slash_index == -1: - break - else: - name_key = name_key[slash_index + 1:] - - # We can't add value tags by themselves - if tag_forms[-1] == "#": - tag_forms = tag_forms[:-1] - - return name_key, tag_forms - - def _create_tag_entry(self, name): - new_entry = super()._create_tag_entry(name) - - _, tag_forms = self._get_tag_forms(name) - # remove the /# if present, but only from the entry, not from the lookups - # This lets us easily use source_tag + remainder instead of having to strip off the /# later. - short_name = tag_forms[-1] - long_tag_name = name - if long_tag_name.endswith("/#"): - long_tag_name = long_tag_name[:-2] - short_name = short_name[:-2] - new_entry.long_tag_name = long_tag_name - new_entry.short_tag_name = short_name - - return new_entry - - def _check_if_duplicate(self, name, new_entry): - name_key, tag_forms = self._get_tag_forms(name) - if name_key in self: - if name_key not in self._duplicate_names: - self._duplicate_names[name_key] = [self.get(name_key)] - self._duplicate_names[name_key].append(new_entry) - else: - self.all_names[name] = new_entry - for tag_key in tag_forms: - name_key = tag_key.casefold() - self.long_form_tags[name_key] = new_entry - - return new_entry - - def get(self, key): - if not self.case_sensitive: - key = key.casefold() - return self.long_form_tags.get(key) - - def __getitem__(self, key): - if not self.case_sensitive: - key = key.casefold() - return self.long_form_tags[key] - - def __contains__(self, key): - if not self.case_sensitive: - key = key.casefold() - return key in self.long_form_tags - - @staticmethod - def _group_by_top_level_tag(divide_list): - result = {} - for item in divide_list: - key, _, value = item.long_tag_name.partition('/') - if key not in result: - result[key] = [] - result[key].append(item) - - return list(result.values()) - - def _finalize_section(self, hed_schema): - # Find the attributes with the inherited property - attribute_section = hed_schema.attributes - if hed_schema.schema_83_props: - self.inheritable_attributes = [name for name, value in attribute_section.items() - if not value.has_attribute(HedKey.AnnotationProperty)] - else: - self.inheritable_attributes = [name for name, value in attribute_section.items() - if value.has_attribute(HedKeyOld.IsInheritedProperty)] - - # Hardcode in extension allowed as it is critical for validation in older schemas - if not self.inheritable_attributes: - self.inheritable_attributes = [HedKey.ExtensionAllowed] - - split_list = self._group_by_top_level_tag(self.all_entries) - # Sort the extension allowed lists - extension_allowed_node = 0 - for values in split_list: - node = values[0] - if node.has_attribute(HedKey.ExtensionAllowed): - # Make sure we sort / characters to the front. - values.sort(key=lambda x: x.long_tag_name.replace("/", "\0")) - extension_allowed_node += 1 - - # sort the top level nodes so extension allowed is at the bottom - split_list.sort(key=lambda x: x[0].has_attribute(HedKey.ExtensionAllowed)) - - # sort the extension allowed top level nodes - if extension_allowed_node: - split_list[extension_allowed_node:] = sorted(split_list[extension_allowed_node:], - key=lambda x: x[0].long_tag_name) - self.all_entries = [subitem for tag_list in split_list for subitem in tag_list] - - super()._finalize_section(hed_schema) - self.root_tags = {tag.short_tag_name: tag for tag in self.all_entries if not tag._parent_tag} +from hed.schema.hed_schema_entry import HedSchemaEntry, UnitClassEntry, UnitEntry, HedTagEntry +from hed.schema.hed_schema_constants import HedSectionKey, HedKey, HedKeyOld + +entries_by_section = { + HedSectionKey.Properties: HedSchemaEntry, + HedSectionKey.Attributes: HedSchemaEntry, + HedSectionKey.UnitModifiers: HedSchemaEntry, + HedSectionKey.Units: UnitEntry, + HedSectionKey.UnitClasses: UnitClassEntry, + HedSectionKey.ValueClasses: HedSchemaEntry, + HedSectionKey.Tags: HedTagEntry, +} + + +class HedSchemaSection: + """Container with entries in one section of the schema. """ + + def __init__(self, section_key, case_sensitive=True): + """ Construct schema section. + + Parameters: + section_key (HedSectionKey): Name of the schema section. + case_sensitive (bool): If True, names are case-sensitive. + + """ + # {lower_case_name: HedSchemaEntry} + self.all_names = {} + self._section_key = section_key + self.case_sensitive = case_sensitive + + # Points to the entries in attributes + self.valid_attributes = {} + self._attribute_cache = {} + + self._section_entry = entries_by_section.get(section_key) + self._duplicate_names = {} + + self.all_entries = [] + + @property + def section_key(self): + return self._section_key + + @property + def duplicate_names(self): + return self._duplicate_names + + def _create_tag_entry(self, name): + new_entry = self._section_entry(name, self) + return new_entry + + def _check_if_duplicate(self, name_key, new_entry): + return_entry = new_entry + if name_key in self.all_names: + if name_key not in self._duplicate_names: + self._duplicate_names[name_key] = [self.all_names[name_key]] + self._duplicate_names[name_key].append(new_entry) + else: + self.all_names[name_key] = new_entry + + return return_entry + + def _add_to_dict(self, name, new_entry): + """ Add a name to the dictionary for this section. """ + name_key = name + if not self.case_sensitive: + name_key = name.casefold() + + return_entry = self._check_if_duplicate(name_key, new_entry) + + self.all_entries.append(new_entry) + return return_entry + + def get_entries_with_attribute(self, attribute_name, return_name_only=False, schema_namespace=""): + """ Return entries or names with given attribute. + + Parameters: + attribute_name (str): The name of the attribute(generally a HedKey entry). + return_name_only (bool): If True, return the name as a string rather than the tag entry. + schema_namespace (str): Prepends given namespace to each name if returning names. + + Returns: + list: List of HedSchemaEntry or strings representing the names. + + """ + if attribute_name not in self._attribute_cache: + new_val = [tag_entry for tag_entry in self.values() if tag_entry.has_attribute(attribute_name)] + self._attribute_cache[attribute_name] = new_val + + cache_val = self._attribute_cache[attribute_name] + if return_name_only: + return [f"{schema_namespace}{tag_entry.name}" for tag_entry in cache_val] + return cache_val + + # =============================================== + # Simple wrapper functions to make this class primarily function as a dict + # =============================================== + def __iter__(self): + return iter(self.all_names) + + def __len__(self): + return len(self.all_names) + + def items(self): + """ Return the items. """ + return self.all_names.items() + + def values(self): + """ All names of the sections. """ + return self.all_names.values() + + def keys(self): + """ The names of the keys. """ + return self.all_names.keys() + + def __getitem__(self, key): + if not self.case_sensitive: + key = key.casefold() + return self.all_names[key] + + def get(self, key): + """ Return the name associated with key. + + Parameters: + key (str): The name of the key. + + """ + try: + return self.__getitem__(key) + except KeyError: + return None + + def __eq__(self, other): + if self.all_names != other.all_names: + return False + if self._section_key != other._section_key: + return False + if self.case_sensitive != other.case_sensitive: + return False + if self.duplicate_names != other.duplicate_names: + return False + return True + + def __bool__(self): + return bool(self.all_names) + + def _finalize_section(self, hed_schema): + for entry in self.all_entries: + entry.finalize_entry(hed_schema) + + +class HedSchemaUnitSection(HedSchemaSection): + """The schema section containing units.""" + def _check_if_duplicate(self, name_key, new_entry): + """We need to mark duplicate units(units with unitSymbol are case sensitive, while others are not.""" + if not new_entry.has_attribute(HedKey.UnitSymbol): + name_key = name_key.casefold() + return super()._check_if_duplicate(name_key, new_entry) + + def __getitem__(self, key): + """Check the case of the key appropriately for symbols/not symbols, and return the matching entry.""" + unit_entry = self.all_names.get(key) + if unit_entry is None: + unit_entry = self.all_names.get(key.casefold()) + # Unit symbols must match exactly + if unit_entry is None or unit_entry.has_attribute(HedKey.UnitSymbol): + return None + return unit_entry + + +class HedSchemaUnitClassSection(HedSchemaSection): + """The schema section containing unit classes.""" + def _check_if_duplicate(self, name_key, new_entry): + """Allow adding units to existing unit classes, using a placeholder one with no attributes.""" + if name_key in self and len(new_entry.attributes) == 1 \ + and HedKey.InLibrary in new_entry.attributes: + return self.all_names[name_key] + return super()._check_if_duplicate(name_key, new_entry) + + +class HedSchemaTagSection(HedSchemaSection): + """The schema section containing all tags.""" + + def __init__(self, *args, case_sensitive=False, **kwargs): + super().__init__(*args, **kwargs, case_sensitive=case_sensitive) + # This dict contains all forms of all tags. The .all_names variable has ONLY the long forms. + self.long_form_tags = {} + self.inheritable_attributes = {} + self.root_tags = {} + + @staticmethod + def _get_tag_forms(name): + name_key = name + tag_forms = [] + while name_key: + tag_forms.append(name_key) + slash_index = name_key.find("/") + if slash_index == -1: + break + else: + name_key = name_key[slash_index + 1:] + + # We can't add value tags by themselves + if tag_forms[-1] == "#": + tag_forms = tag_forms[:-1] + + return name_key, tag_forms + + def _create_tag_entry(self, name): + new_entry = super()._create_tag_entry(name) + + _, tag_forms = self._get_tag_forms(name) + # remove the /# if present, but only from the entry, not from the lookups + # This lets us easily use source_tag + remainder instead of having to strip off the /# later. + short_name = tag_forms[-1] + long_tag_name = name + if long_tag_name.endswith("/#"): + long_tag_name = long_tag_name[:-2] + short_name = short_name[:-2] + new_entry.long_tag_name = long_tag_name + new_entry.short_tag_name = short_name + + return new_entry + + def _check_if_duplicate(self, name, new_entry): + name_key, tag_forms = self._get_tag_forms(name) + if name_key in self: + if name_key not in self._duplicate_names: + self._duplicate_names[name_key] = [self.get(name_key)] + self._duplicate_names[name_key].append(new_entry) + else: + self.all_names[name] = new_entry + for tag_key in tag_forms: + name_key = tag_key.casefold() + self.long_form_tags[name_key] = new_entry + + return new_entry + + def get(self, key): + if not self.case_sensitive: + key = key.casefold() + return self.long_form_tags.get(key) + + def __getitem__(self, key): + if not self.case_sensitive: + key = key.casefold() + return self.long_form_tags[key] + + def __contains__(self, key): + if not self.case_sensitive: + key = key.casefold() + return key in self.long_form_tags + + @staticmethod + def _group_by_top_level_tag(divide_list): + result = {} + for item in divide_list: + key, _, value = item.long_tag_name.partition('/') + if key not in result: + result[key] = [] + result[key].append(item) + + return list(result.values()) + + def _finalize_section(self, hed_schema): + # Find the attributes with the inherited property + attribute_section = hed_schema.attributes + if hed_schema.schema_83_props: + self.inheritable_attributes = [name for name, value in attribute_section.items() + if not value.has_attribute(HedKey.AnnotationProperty)] + else: + self.inheritable_attributes = [name for name, value in attribute_section.items() + if value.has_attribute(HedKeyOld.IsInheritedProperty)] + + # Hardcode in extension allowed as it is critical for validation in older schemas + if not self.inheritable_attributes: + self.inheritable_attributes = [HedKey.ExtensionAllowed] + + split_list = self._group_by_top_level_tag(self.all_entries) + # Sort the extension allowed lists + for values in split_list: + node = values[0] + if node.has_attribute(HedKey.ExtensionAllowed): + # Make sure we sort / characters to the front. + values.sort(key=lambda x: x.long_tag_name.replace("/", "\0")) + + # Sort ones without inLibrary to the end, and then sort library ones at the top. + split_list.sort(key=lambda x: (x[0].has_attribute(HedKey.InLibrary, return_value=True) is None, + x[0].has_attribute(HedKey.InLibrary, return_value=True))) + + # split_list.sort(key=lambda x: x[0].has_attribute(HedKey.ExtensionAllowed)) + self.all_entries = [subitem for tag_list in split_list for subitem in tag_list] + + super()._finalize_section(hed_schema) + self.root_tags = {tag.short_tag_name: tag for tag in self.all_entries if not tag._parent_tag} diff --git a/hed/schema/schema_attribute_validator_hed_id.py b/hed/schema/schema_attribute_validator_hed_id.py new file mode 100644 index 000000000..5391ef4fa --- /dev/null +++ b/hed/schema/schema_attribute_validator_hed_id.py @@ -0,0 +1,112 @@ +from hed.schema.schema_io.ontology_util import get_library_data +from hed.schema.schema_io.df_util import remove_prefix +from semantic_version import Version +from hed.schema.hed_schema_io import load_schema_version +from hed.schema.hed_cache import get_hed_versions +from hed.schema.hed_schema_constants import HedKey +from hed.errors.error_types import SchemaAttributeErrors +from hed.errors.error_reporter import ErrorHandler + + +class HedIDValidator: + """Support class to validate hedIds in schemas""" + def __init__(self, hed_schema): + """Support class to validate hedIds in schemas + + Parameters: + hed_schema(HedSchemaBase): The schema we're validating. + It uses this to derive the version number(s) of the previous schema. + """ + self.hed_schema = hed_schema + self._previous_schemas = {} + + versions = self.hed_schema.version_number.split(",") + libraries = self.hed_schema.library.split(",") + + prev_versions = {} + self.library_data = {} + for version, library in zip(versions, libraries): + prev_version = self._get_previous_version(version, library) + if prev_version: + prev_versions[library] = prev_version + library_data = get_library_data(library) + if library_data: + self.library_data[library] = library_data + + # Add the standard schema if we have a with_standard + if "" not in prev_versions and self.hed_schema.with_standard: + prev_version = self._get_previous_version(self.hed_schema.with_standard, "") + if prev_version: + prev_versions[""] = prev_version + library_data = get_library_data("") + if library_data: + self.library_data[""] = get_library_data("") + + if prev_versions: + self._previous_schemas = {library: load_schema_version(full_version) for library, full_version in + prev_versions.items()} + + @staticmethod + def _get_previous_version(version, library): + current_version = Version(version) + all_schema_versions = get_hed_versions(library_name=library) + for old_version in all_schema_versions: + if Version(old_version) < current_version: + prev_version = old_version + if library: + prev_version = f"{library}_{prev_version}" + return prev_version + + def verify_tag_id(self, hed_schema, tag_entry, attribute_name): + """Validates the hedID attribute values + + This follows the template from schema_attribute_validators.py + + Parameters: + hed_schema (HedSchema): The schema to use for validation + tag_entry (HedSchemaEntry): The schema entry for this tag. + attribute_name (str): The name of this attribute + Returns: + issues(list): A list of issues from validating this attribute. + """ + # todo: If you have a way to know the schema should have 100% ids, you could check for that and flag missing + new_id = tag_entry.attributes.get(attribute_name, "") + old_id = None + tag_library = tag_entry.has_attribute(HedKey.InLibrary, return_value=True) + if not tag_library: + tag_library = "" + + previous_schema = self._previous_schemas.get(tag_library) + if previous_schema: + old_entry = previous_schema.get_tag_entry(tag_entry.name, key_class=tag_entry.section_key) + if old_entry: + old_id = old_entry.attributes.get(HedKey.HedID) + + if old_id: + try: + old_id = int(remove_prefix(old_id, "HED_")) + except ValueError: + # Just silently ignore invalid old_id values(this shouldn't happen) + pass + if new_id: + try: + new_id = int(remove_prefix(new_id, "HED_")) + except ValueError: + return ErrorHandler.format_error(SchemaAttributeErrors.SCHEMA_HED_ID_INVALID, tag_entry.name, new_id) + # Nothing to verify + if new_id is None and old_id is None: + return [] + + issues = [] + if old_id and old_id != new_id: + issues += ErrorHandler.format_error(SchemaAttributeErrors.SCHEMA_HED_ID_INVALID, tag_entry.name, new_id, + old_id=old_id) + + library_data = self.library_data.get(tag_library) + if library_data and new_id is not None: + starting_id, ending_id = library_data["id_range"] + if new_id < starting_id or new_id > ending_id: + issues += ErrorHandler.format_error(SchemaAttributeErrors.SCHEMA_HED_ID_INVALID, tag_entry.name, + new_id, valid_min=starting_id, valid_max=ending_id) + + return issues diff --git a/hed/schema/schema_compliance.py b/hed/schema/schema_compliance.py index 02a7a4931..0e011b4c4 100644 --- a/hed/schema/schema_compliance.py +++ b/hed/schema/schema_compliance.py @@ -11,6 +11,7 @@ from functools import partial from hed.schema import hed_cache from semantic_version import Version +from hed.schema.schema_attribute_validator_hed_id import HedIDValidator def check_compliance(hed_schema, check_for_warnings=True, name=None, error_handler=None): @@ -90,6 +91,7 @@ def __init__(self, hed_schema, error_handler): self.hed_schema = hed_schema self.error_handler = error_handler self._new_character_validation = hed_schema.schema_83_props + self._id_validator = HedIDValidator(hed_schema) def check_if_prerelease_version(self): issues = [] @@ -159,6 +161,8 @@ def _get_validators(self, attribute_name): if self._new_character_validation: validators = self.attribute_validators.get(attribute_name, []) + [ schema_attribute_validators.attribute_is_deprecated] + if attribute_name == HedKey.HedID: + validators += [self._id_validator.verify_tag_id] attribute_entry = self.hed_schema.get_tag_entry(attribute_name, HedSectionKey.Attributes) if attribute_entry: validators += self._get_range_validators(attribute_entry) @@ -205,9 +209,9 @@ def check_duplicate_names(self): error_code = SchemaErrors.SCHEMA_DUPLICATE_NODE if len(values) == 2: error_code = SchemaErrors.SCHEMA_DUPLICATE_FROM_LIBRARY - issues_list += self.error_handler.format_error_with_context(error_code, name, - duplicate_tag_list=[entry.name for entry in duplicate_entries], - section=section_key) + issues_list += self.error_handler.format_error_with_context( + error_code, name, duplicate_tag_list=[entry.name for entry in duplicate_entries], + section=section_key) return issues_list def check_invalid_chars(self): diff --git a/hed/schema/schema_data/HED_score_2.0.0.xml b/hed/schema/schema_data/HED_score_2.0.0.xml new file mode 100644 index 000000000..3e9d47b5b --- /dev/null +++ b/hed/schema/schema_data/HED_score_2.0.0.xml @@ -0,0 +1,21263 @@ + + + This schema is a Hierarchical Event Descriptors (HED) Library Schema implementation of Standardized Computer-based Organized Reporting of EEG (SCORE)(1-2) for describing events occurring during neuroimaging time series recordings. +The HED-SCORE library schema allows the annotation of electrophysiology recordings using terms from an internationally accepted set of defined terms (SCORE) compatible with the HED framework . +The resulting annotations are understandable to clinicians and directly usable in computer analysis. + +Future extensions may be implemented in the HED-SCORE library schema. +For more information see https://hed-schema-library.readthedocs.io/en/latest/index.html. + + + Modulator + External stimuli / interventions or changes in the alertness level (sleep) that modify: the background activity, or how often a graphoelement is occurring, or change other features of the graphoelement (like intra-burst frequency). For each observed feature, there is an option of specifying how they are influenced by the modulators and procedures that were done during the recording. + + hedId + HED_0042001 + + + inLibrary + score + + + Sleep-modulator + When sleep/drowsiness features are scored during drowsiness, Drowsy should be listed as a modulator (Source: Beniczky ea 2017, Section 7 and Table 2). + + suggestedTag + Drowsy + + + hedId + HED_0042002 + + + inLibrary + score + + + Sleep-deprivation + Source: Beniczky ea 2017, Table 2. + + hedId + HED_0042003 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042004 + + + inLibrary + score + + + + + Sleep-following-sleep-deprivation + Source: Beniczky ea 2017, Table 2. + + hedId + HED_0042005 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042006 + + + inLibrary + score + + + + + Natural-sleep + Source: Beniczky ea 2017, Table 2. + + hedId + HED_0042007 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042008 + + + inLibrary + score + + + + + Induced-sleep + Source: Beniczky ea 2017, Table 2. + + hedId + HED_0042009 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042010 + + + inLibrary + score + + + + + Awakening + Source: Beniczky ea 2017, Table 2. + + hedId + HED_0042011 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042012 + + + inLibrary + score + + + + + + Medication-modulator + + hedId + HED_0042013 + + + inLibrary + score + + + Medication-administered-during-recording + Source: Beniczky ea 2017, Table 2. + + hedId + HED_0042014 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042015 + + + inLibrary + score + + + + + Medication-withdrawal-or-reduction-during-recording + Source: Beniczky ea 2017, Table 2. + + hedId + HED_0042016 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042017 + + + inLibrary + score + + + + + + Eye-modulator + + hedId + HED_0042018 + + + inLibrary + score + + + Manual-eye-closure + Source: Beniczky ea 2017, Table 2. + + hedId + HED_0042019 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042020 + + + inLibrary + score + + + + + Manual-eye-opening + Source: Beniczky ea 2017, Table 2. + + hedId + HED_0042021 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042022 + + + inLibrary + score + + + + + + Stimulation-modulator + + hedId + HED_0042023 + + + inLibrary + score + + + Intermittent-photic-stimulation + Source: Beniczky ea 2017, Table 2. + + suggestedTag + Intermittent-photic-stimulation-effect + + + hedId + HED_0042024 + + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + hedId + HED_0042025 + + + inLibrary + score + + + + + Auditory-stimulation + Source: Beniczky ea 2017, Table 2. + + hedId + HED_0042026 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042027 + + + inLibrary + score + + + + + Nociceptive-stimulation + Source: Beniczky ea 2017, Table 2. + + hedId + HED_0042028 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042029 + + + inLibrary + score + + + + + + Hyperventilation + When selecting hyperventilation from the list, the user is prompted to score the quality of the hyperventilation (excellent effort, good effort, poor effort, refused the procedure, unable to do the procedure). (Source: Beniczky ea 2017, Section 4, Table 2.) + + hedId + HED_0042030 + + + inLibrary + score + + + Hyperventilation-refused-procedure + + hedId + HED_0042031 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042032 + + + inLibrary + score + + + + + Hyperventilation-poor-effort + + hedId + HED_0042033 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042034 + + + inLibrary + score + + + + + Hyperventilation-good-effort + + hedId + HED_0042035 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042036 + + + inLibrary + score + + + + + Hyperventilation-excellent-effort + + hedId + HED_0042037 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042038 + + + inLibrary + score + + + + + + Physical-effort + Source: Beniczky ea 2017, Table 2. + + hedId + HED_0042039 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042040 + + + inLibrary + score + + + + + Cognitive-task + Source: Beniczky ea 2017, Table 2. + + hedId + HED_0042041 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042042 + + + inLibrary + score + + + + + Other-modulator-or-procedure + Free text describing other modulators or procedures. (Source: Beniczky ea 2017, Table 2.) + + requireChild + + + hedId + HED_0042043 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042044 + + + inLibrary + score + + + + + + Background-activity + An EEG activity representing the setting in which a given normal or abnormal pattern appears and from which such pattern is distinguished (Source: Beniczky ea 2013, Appendix S1.) + + hedId + HED_0042045 + + + inLibrary + score + + + Posterior-dominant-rhythm + Rhythmic activity occurring during wakefulness over the posterior regions of the head, generally with maximum amplitudes over the occipital areas. Amplitude varies. Best seen with eyes closed and during physical relaxation and relative mental inactivity. Blocked or attenuated by attention, especially visual, and mental effort. In adults this is the alpha rhythm, and the frequency is 8 to 13 Hz. However the frequency can be higher or lower than this range (often a supra or sub harmonic of alpha frequency) and is called alpha variant rhythm (fast and slow alpha variant rhythm). In children, the normal range of the frequency of the posterior dominant rhythm is age-dependant. (Source: Beniczky ea 2013, Appendix S2; suggested tags from Beniczky ea 2017, Table 4.) + + suggestedTag + Feature-significance-to-recording + Feature-frequency + Posterior-dominant-rhythm-property + + + hedId + HED_0042046 + + + inLibrary + score + + + + Mu-rhythm + EEG rhythm at 7-11 Hz composed of arch-shaped waves occurring over the central or centro-parietal regions of the scalp during wakefulness. Amplitudes varies but is mostly below 50 microV. Blocked or attenuated most clearly by contralateral movement, thought of movement, readiness to move or tactile stimulation. (Source: Beniczky ea 2013, Appendix S2.) + + suggestedTag + Feature-frequency + Feature-significance-to-recording + Categorical-location-value + Sensor-list + + + hedId + HED_0042047 + + + inLibrary + score + + + + Other-organized-rhythm + EEG activity consisting of waves of approximately constant period that are considered part of the background (ongoing) activity, but do not fulfill the criteria of the posterior dominant rhythm. (Source: Beniczky ea 2013, Appendix S2.) + + requireChild + + + suggestedTag + Rhythmic-property + Feature-significance-to-recording + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + + + hedId + HED_0042048 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042049 + + + inLibrary + score + + + + + Background-activity-special-feature + Special features provide scoring options for the background activity of critically ill patients. (Source: Beniczky ea 2017, Section 6.) + + hedId + HED_0042050 + + + inLibrary + score + + + Continuous-background-activity + Source: Beniczky ea 2017, Section 6. + + suggestedTag + Rhythmic-property + Categorical-location-value + Sensor-list + + + hedId + HED_0042051 + + + inLibrary + score + + + + Nearly-continuous-background-activity + Source: Beniczky ea 2017, Section 6. + + suggestedTag + Rhythmic-property + Categorical-location-value + Sensor-list + + + hedId + HED_0042052 + + + inLibrary + score + + + + Discontinuous-background-activity + Source: Beniczky ea 2017, Section 6. + + suggestedTag + Rhythmic-property + Categorical-location-value + Sensor-list + + + hedId + HED_0042053 + + + inLibrary + score + + + + Background-burst-suppression + EEG pattern consisting of bursts (activity appearing and disappearing abruptly) interrupted by periods of low amplitude (below 20 microV). This pattern occurs simultaneously over all head regions. (Source: Beniczky ea 2013, Appendix S2; Beniczky ea 2017, Section 6.) + + suggestedTag + Categorical-location-value + Sensor-list + + + hedId + HED_0042054 + + + inLibrary + score + + + + Background-burst-attenuation + Source: Beniczky ea 2017, Section 6. + + suggestedTag + Categorical-location-value + Sensor-list + + + hedId + HED_0042055 + + + inLibrary + score + + + + Background-activity-suppression + Periods showing activity under 10 microV (referential montage) and interrupting the background (ongoing) activity. (Source: Beniczky ea 2013, Appendix S2; Beniczky ea 2017, Section 6.) + + suggestedTag + Categorical-location-value + Sensor-list + Appearance-mode + + + hedId + HED_0042056 + + + inLibrary + score + + + + Electrocerebral-inactivity + Absence of any ongoing cortical electric activities; in all leads EEG is isoelectric or only contains artifacts. Sensitivity has to be increased up to 2 microV/mm; recording time: at least 30 minutes. (Source: Beniczky ea 2013, Appendix S2; Beniczky ea 2017, Section 6.) + + hedId + HED_0042057 + + + inLibrary + score + + + + + + Critically-ill-patient-patterns + Rhythmic or periodic patterns in critically ill patients (RPPs) are scored according to the 2012 version of the American Clinical Neurophysiology Society Standardized Critical Care EEG Terminology (Source: Hirsch ea 2013; Beniczky ea 2017, Section 9). + + hedId + HED_0042058 + + + inLibrary + score + + + Critically-ill-patient-periodic-discharges + Periodic discharges (PDs): Periodic - repetition of a waveform with relatively uniform morphology and duration with a quantifiable inter-discharge interval between consecutive waveforms and recurrence of the waveform at nearly regular intervals. (Source: Hirsch ea 2013; Suggested tags from Beniczky ea 2017, Table 8.) + + suggestedTag + RPP-morphology + Categorical-location-value + Sensor-list + Feature-frequency + RPP-time-related-feature + + + hedId + HED_0042059 + + + inLibrary + score + + + + Rhythmic-delta-activity + Rhythmic Delta Activity (RDA): Rhythmic - repetition of a waveform with relatively uniform morphology and duration, and without an interval between consecutive waveforms. RDA - rhythmic activity less than or equal to 4 Hz. The duration of one cycle (i.e., the period) of the rhythmic pattern should vary by less than 50 percent from the duration of the subsequent cycle for the majority (greater than 50 percent) of cycle pairs to qualify as rhythmic. (Source: Hirsch ea 2013; Suggested tags from Beniczky ea 2017, Table 8.) + + suggestedTag + RPP-with-superimposed-activity + RPP-absolute-amplitude + Categorical-location-value + Sensor-list + Feature-frequency + RPP-time-related-feature + + + hedId + HED_0042060 + + + inLibrary + score + + + + Spike-or-sharp-and-wave + Spike-and-wave or Sharp-and-wave (SW) - polyspike, spike or sharp wave consistently followed by a slow wave in a regularly repeating and alternating pattern (spike-wave-spike-wave-spike-wave), with a consistent relationship between the spike (or polyspike or sharp wave) component and the slow wave; and with no interval between one spike-wave complex and the next (if there is an interval, this would qualify as PDs, where each discharge is a spike-and- wave). (Source: Hirsch ea 2013; Suggested tags from Beniczky ea 2017, Table 8.) + + suggestedTag + RPP-sharpness + Number-of-RPP-phases + Triphasic-morphology + RPP-absolute-amplitude + RPP-relative-amplitude + RPP-polarity + Categorical-location-value + Sensor-list + Multifocal-feature + Feature-frequency + RPP-time-related-feature + + + hedId + HED_0042061 + + + inLibrary + score + + + + + Episode + Clinical episode or electrographic seizure. (Source: Beniczky ea 2013, Appendix S1.) + + hedId + HED_0042062 + + + inLibrary + score + + + Epileptic-seizure + The ILAE seizure classification divides seizures into focal, generalized onset, or unknown onset. (Source: Beniczky ea 2017, Table 9, Supplement 1; Selection-tree and list of seizure-types, according to the current ILAE seizure classification, Fisher ea 2017.) + + suggestedTag + Episode-consciousness-affected + Episode-awareness + Episode-prodrome + Episode-tongue-biting + + + hedId + HED_0042063 + + + inLibrary + score + + + Focal-onset-epileptic-seizure + A focal seizure originates within networks limited to one hemisphere. They may be discretely localized or more widely distributed. Focal seizures may originate in subcortical structures. Focal seizures are optionally subdivided into focal aware and focal impaired awareness seizures. Specific motor and nonmotor classifiers may be added. (Source: Fisher ea 2017, Table 2 and Key Points; Suggested tags from Fisher ea 2017, Figure 2; Beniczky ea 2017, Supplement 1, ILAE seizure classification code I.) + + suggestedTag + Automatism-seizure + Atonic-seizure + Clonic-seizure + Epileptic-spasm + Hyperkinetic-seizure + Myoclonic-seizure + Tonic-seizure + Autonomic-seizure + Behavior-arrest-seizure + Cognitive-seizure + Emotional-seizure + Sensory-seizure + + + hedId + HED_0042064 + + + inLibrary + score + + + Aware-focal-onset-epileptic-seizure + Focal onset and maintained awareness (knowledge of self or environment). (Source: Fisher ea 2017, Table 2; Beniczky ea 2017, Supplement 1, ILAE seizure classification code I.A.) + + hedId + HED_0042065 + + + inLibrary + score + + + + Impaired-awareness-focal-onset-epileptic-seizure + Focal onset and impaired or lost awareness (knowledge of self or environment) is a feature of focal impaired awareness seizures, previously called complex partial seizures. (Source: Fisher ea 2017, Table 2; Beniczky ea 2017, Supplement 1, ILAE seizure classification code I.B.) + + hedId + HED_0042066 + + + inLibrary + score + + + + Awareness-unknown-focal-onset-epileptic-seizure + Focal onset and awareness (knowledge of self or environment) unknown or not specified. (Source: Fisher ea 2017, Table 2; Beniczky ea 2017, Supplement 1, ILAE seizure classification code I.C.) + + hedId + HED_0042067 + + + inLibrary + score + + + + Focal-to-bilateral-tonic-clonic-focal-onset-epileptic-seizure + A seizure type with focal onset, with awareness or impaired awareness, either motor or non-motor, progressing to bilateral tonic clonic activity. The prior term was seizure with partial onset with secondary generalization. (Source: Fisher ea 2017, Table 2; Beniczky ea 2017, Supplement 1, ILAE seizure classification code I.D.01.) + + hedId + HED_0042068 + + + inLibrary + score + + + + + Generalized-onset-epileptic-seizure + Generalized seizures originate at some point within, and rapidly engaging, bilaterally distributed networks. Generalized onset seizures can be motor: tonic clonic, clonic, tonic, myoclonic, myoclonic tonic clonic, myoclonic atonic, atonic, and epileptic spasms. Generalized onset seizures can also be nonmotor (absence): typical absence, atypical absence, myoclonic absence, or absence with eyelid myoclonia. (Source: Fisher ea 2017, Table 2 and Key Points; Suggested tags from Fisher ea 2017, Figure 2; Beniczky ea 2017, Supplement 1, ILAE seizure classification code II.) + + suggestedTag + Tonic-clonic-seizure + Clonic-seizure + Tonic-seizure + Myoclonic-seizure + Myoclonic-tonic-clonic-seizure + Myoclonic-atonic-seizure + Atonic-seizure + Epileptic-spasm + Typical-absence-seizure + Atypical-absence-seizure + Myoclonic-absence-seizure + Eyelid-myoclonia-seizure + + + hedId + HED_0042069 + + + inLibrary + score + + + + Unknown-onset-epileptic-seizure + A seizure of unknown onset may still evidence certain defining motor (e.g., tonic clonic) or nonmotor (e.g., behavior arrest) characteristics. With further information or future observed seizures, a reclassification of unknown-onset seizures into focal or generalized-onset categories may become possible. Therefore, “unknown-onset” is not a characteristic of the seizure, but a convenient placeholder for our ignorance. (Source: Fisher ea 2017, page 532; Suggested tags from Fisher ea 2017, Figure 2; Beniczky ea 2017, Supplement 1, ILAE seizure classification code III.) + + suggestedTag + Tonic-clonic-seizure + Epileptic-spasm + Behavior-arrest-seizure + + + hedId + HED_0042070 + + + inLibrary + score + + + Unclassified-epileptic-seizure + Referring to a seizure type that cannot be described by the ILAE 2017 classification either because of inadequate information or unusual clinical features. (Source: Fisher ea 2017, Table 2; Beniczky ea 2017, Supplement 1, ILAE seizure classification code III.C.01) + + hedId + HED_0042071 + + + inLibrary + score + + + + + + Electroencephalographic-seizure + Refers usually to non convulsive status. Ictal EEG: rhythmic discharge or spike and wave pattern with definite evolution in frequency, location, or morphology lasting at least 10 s; evolution in amplitude alone did not qualify. (Source: Beniczky ea 2013, Appendix S5; Beniczky ea 2017, Table 9.) + + suggestedTag + Episode-consciousness-affected + Episode-awareness + Episode-prodrome + Episode-tongue-biting + + + hedId + HED_0042072 + + + inLibrary + score + + + + Seizure-PNES + Psychogenic non-epileptic seizure. Paroxysmal events that mimic (or are confused with) epileptic seizures, but which do not result from epileptic activity; they lack the EEG ictal features during the ictus. (Source: Beniczky ea 2013, Appendix S5; Beniczky ea 2017, Table 9.) + + suggestedTag + Feature-significance-to-recording + Episode-consciousness-affected + Episode-awareness + Episode-prodrome + Episode-tongue-biting + + + hedId + HED_0042073 + + + inLibrary + score + + + + Sleep-related-episode + (Source: Beniczky ea 2017, Table 9.) + + suggestedTag + Feature-significance-to-recording + Episode-consciousness-affected + Episode-awareness + Episode-prodrome + Episode-tongue-biting + + + hedId + HED_0042074 + + + inLibrary + score + + + Sleep-related-arousal + Normal arousal. (Source: Beniczky ea 2017, Table 9.) + + hedId + HED_0042075 + + + inLibrary + score + + + + Benign-sleep-myoclonus + A distinctive disorder of sleep characterized by a) neonatal onset, b) rhythmic myoclonic jerks only during sleep and c) abrupt and consistent cessation with arousal, d) absence of concomitant electrographic changes suggestive of seizures, and e) good outcome. (Source: Beniczky ea 2017, Table 9; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042076 + + + inLibrary + score + + + + Confusional-arousal + Episode of non epileptic nature included in NREM parasomnias, characterized by sudden arousal and complex behavior but without full alertness, usually lasting a few minutes and occurring almost in all children at least occasionally. Amnesia of the episode is the rule. (Source: Beniczky ea 2017, Table 9; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042077 + + + inLibrary + score + + + + Cataplexy + A sudden decrement in muscle tone and loss of deep tendon reflexes, leading to muscle weakness, paralysis, or postural collapse. Cataplexy usually is precipitated by an outburst of emotional expression-notably laughter, anger, or startle. It is one of the tetrad of symptoms of narcolepsy. During cataplexy, respiration and voluntary eye movements are not compromised. Consciousness is preserved. (Source: Beniczky ea 2017, Table 9; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Feature-significance-to-recording + Episode-consciousness-affected + Episode-awareness + Episode-prodrome + Episode-tongue-biting + + + hedId + HED_0042078 + + + inLibrary + score + + + + Sleep-periodic-limb-movement + PLMS. Periodic limb movement in sleep. Episodes are characterized by brief (0.5- to 5.0-second) lower-extremity movements during sleep, which typically occur at 20- to 40-second intervals, most commonly during the first 3 hours of sleep. The affected individual is usually not aware of the movements or of the transient partial arousals. (Source: Beniczky ea 2017, Table 9; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042079 + + + inLibrary + score + + + + REM-sleep-behavioral-disorder + REM sleep behavioral disorder. Episodes characterized by: a) presence of REM sleep without atonia (RSWA) on polysomnography (PSG); b) presence of at least 1 of the following conditions - (1) Sleep-related behaviors, by history, that have been injurious, potentially injurious, or disruptive (example: dream enactment behavior); (2) abnormal REM sleep behavior documented during PSG monitoring; (3) absence of epileptiform activity on electroencephalogram (EEG) during REM sleep (unless RBD can be clearly distinguished from any concurrent REM sleep-related seizure disorder); (4) sleep disorder not better explained by another sleep disorder, a medical or neurologic disorder, a mental disorder, medication use, or a substance use disorder. (Source: Beniczky ea 2017, Table 9; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042080 + + + inLibrary + score + + + + Sleep-walking + Episodes characterized by ambulation during sleep; the patient is difficult to arouse during an episode, and is usually amnesic following the episode. Episodes usually occur in the first third of the night during slow wave sleep. Polysomnographic recordings demonstrate 2 abnormalities during the first sleep cycle: frequent, brief, non-behavioral EEG-defined arousals prior to the somnambulistic episode and abnormally low gamma (0.75-2.0 Hz) EEG power on spectral analysis, correlating with high-voltage (hyper-synchronic gamma) waves lasting 10 to 15 s occurring just prior to the movement. This is followed by stage I NREM sleep, and there is no evidence of complete awakening. (Source: Beniczky ea 2017, Table 9; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042081 + + + inLibrary + score + + + + + Pediatric-episode + (Source: Beniczky ea 2017, Table 9.) + + suggestedTag + Feature-significance-to-recording + Episode-consciousness-affected + Episode-awareness + Episode-prodrome + Episode-tongue-biting + + + hedId + HED_0042082 + + + inLibrary + score + + + Hyperekplexia + Disorder characterized by exaggerated startle response and hypertonicity that may occur during the first year of life and in severe cases during the neonatal period. Children usually present with marked irritability and recurrent startles in response to handling and sounds. Severely affected infants can have severe jerks and stiffening, sometimes with breath-holding spells. (Source: Beniczky ea 2017, Table 9; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042083 + + + inLibrary + score + + + + Jactatio-capitis-nocturna + Relatively common in normal children at the time of going to bed, especially during the first year of life, the rhythmic head movements persist during sleep. Usually, these phenomena disappear before 3 years of age. (Source: Beniczky ea 2017, Table 9; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042084 + + + inLibrary + score + + + + Pavor-nocturnus + A nocturnal episode characterized by age of onset of less than five years (mean age 18 months, with peak prevalence at five to seven years), appearance of signs of panic two hours after falling asleep with crying, screams, a fearful expression, inability to recognize other people including parents (for a duration of 5-15 minutes), amnesia upon awakening. Pavor nocturnus occurs in patients almost every night for months or years (but the frequency is highly variable and may be as low as once a month) and is likely to disappear spontaneously at the age of six to eight years. (Source: Beniczky ea 2017, Table 9; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042085 + + + inLibrary + score + + + + Pediatric-stereotypical-behavior-episode + Repetitive motor behavior in children, typically rhythmic and persistent; usually not paroxysmal and rarely suggest epilepsy. They include headbanging, head-rolling, jactatio capitis nocturna, body rocking, buccal or lingual movements, hand flapping and related mannerisms, repetitive hand-waving (to self-induce photosensitive seizures).(Source: Beniczky ea 2017, Table 9; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042086 + + + inLibrary + score + + + + + Paroxysmal-motor-event + Paroxysmal phenomena during neonatal or childhood periods characterized by recurrent motor or behavioral signs or symptoms that must be distinguished from epileptic disorders. (Source: Beniczky ea 2017, Table 9; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Feature-significance-to-recording + Episode-consciousness-affected + Episode-awareness + Episode-prodrome + Episode-tongue-biting + + + hedId + HED_0042087 + + + inLibrary + score + + + + Syncope + Episode with loss of consciousness and muscle tone that is abrupt in onset, of short duration and followed by rapid recovery; it occurs in response to transient impairment of cerebral perfusion. Typical prodromal symptoms often herald onset of syncope and postictal symptoms are minimal. Syncopal convulsions resulting from cerebral anoxia are common but are not a form of epilepsy, nor are there any accompanying EEG ictal discharges. (Source: Beniczky ea 2017, Table 9; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Feature-significance-to-recording + Episode-consciousness-affected + Episode-awareness + Episode-prodrome + Episode-tongue-biting + + + hedId + HED_0042088 + + + inLibrary + score + + + + Other-episode + + requireChild + + + hedId + HED_0042089 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042090 + + + inLibrary + score + + + + + + Feature-property + Descriptive element similar to main HED /Property. Something that pertains to a thing. A characteristic of some entity. A quality or feature regarded as a characteristic or inherent part of someone or something. HED attributes are adjectives or adverbs. + + hedId + HED_0042091 + + + inLibrary + score + + + Signal-morphology-property + Signal morphology attributes relevant to features of background, interictal or ictal activity. (Source: Beniczky ea 2017, Table 5, Table 8, Table 12.) + + hedId + HED_0042092 + + + inLibrary + score + + + Rhythmic-property + Rhythmic activity can be observed during background, interictal or ictal activity and HED-SCORE therefore describes this as an property/attribute. (Source: Beniczky ea 2017, Table 5, Table 12, Table 14.) + + hedId + HED_0042093 + + + inLibrary + score + + + Delta-activity + Rhythmic activity in the delta frequency range (under 4 Hz). (Source: Beniczky ea 2017, Table 5; Beniczky ea 2013, Appendix S2, S6.) + + suggestedTag + Feature-frequency + Feature-amplitude + + + hedId + HED_0042094 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042095 + + + inLibrary + score + + + + + Theta-activity + Rhythmic activity in the theta frequency range (4-8 Hz). (Source: Beniczky ea 2017, Table 5; Beniczky ea 2013, Appendix S2, S6.) + + suggestedTag + Feature-frequency + Feature-amplitude + + + hedId + HED_0042096 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042097 + + + inLibrary + score + + + + + Alpha-activity + Rhythmic activity in the alpha frequency range (8-13 Hz), but not a part of the posterior dominant rhythm. (Source: Beniczky ea 2017, Table 5; Beniczky ea 2013, Appendix S2, S6.) + + suggestedTag + Feature-frequency + Feature-amplitude + + + hedId + HED_0042098 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042099 + + + inLibrary + score + + + + + Beta-activity + Rhythmic activity in the beta frequency range (14-40 Hz). (Source: Beniczky ea 2017, Table 5; Beniczky ea 2013, Appendix S2, S6.) + + suggestedTag + Feature-frequency + Feature-amplitude + + + hedId + HED_0042100 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042101 + + + inLibrary + score + + + + + Gamma-activity + Rhythmic activity in the gamma frequency range. (Source: Beniczky ea 2017, Table 5.) + + suggestedTag + Feature-frequency + Feature-amplitude + + + hedId + HED_0042102 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042103 + + + inLibrary + score + + + + + Polymorphic-delta-activity + EEG activity consisting of waves in the delta range (over 250 ms duration for each wave) but of different morphology. (Source: Beniczky ea 2017, Table 5; Beniczky ea 2013, Appendix S4.) + + hedId + HED_0042104 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042105 + + + inLibrary + score + + + + + Frontal-intermittent-rhythmic-delta-activity + Frontal intermittent rhythmic delta activity (FIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at 1.5-2.5 Hz over the frontal areas of one or both sides of the head. Comment: most commonly associated with unspecified encephalopathy, in adults. (Source: Beniczky ea 2017, Table 5; Beniczky ea 2013, Appendix S4.) + + hedId + HED_0042106 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042107 + + + inLibrary + score + + + + + Occipital-intermittent-rhythmic-delta-activity + Occipital intermittent rhythmic delta activity (OIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at 2-3 Hz over the occipital or posterior head regions of one or both sides of the head. Frequently blocked or attenuated by opening the eyes. Comment: most commonly associated with unspecified encephalopathy, in children. (Source: Beniczky ea 2017, Table 5; Beniczky ea 2013, Appendix S4.) + + hedId + HED_0042108 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042109 + + + inLibrary + score + + + + + Temporal-intermittent-rhythmic-delta-activity + Temporal intermittent rhythmic delta activity (TIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at over the temporal areas of one side of the head. Comment: most commonly associated with temporal lobe epilepsy. (Source: Beniczky ea 2017, Table 5; Beniczky ea 2013, Appendix S4.) + + hedId + HED_0042110 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042111 + + + inLibrary + score + + + + + + Spike + A transient, clearly distinguished from background activity, with pointed peak at a conventional paper speed or time scale and duration from 20 to under 70 ms, i.e. 1/50-1/15 s approximately. Main component is generally negative relative to other areas. Amplitude varies. (Source: Beniczky ea 2017, Table 5; Beniczky ea 2013, Appendix S4.) + + hedId + HED_0042112 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042113 + + + inLibrary + score + + + + + Spike-and-slow-wave + A pattern consisting of a spike followed by a slow wave. (Source: Beniczky ea 2017, Table 5; Beniczky ea 2013, Appendix S4.) + + hedId + HED_0042114 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042115 + + + inLibrary + score + + + + + Runs-of-rapid-spikes + Bursts of spike discharges at a rate from 10 to 25/sec (in most cases somewhat irregular). The bursts last more than 2 seconds (usually 2 to 10 seconds) and the runs are typically seen in sleep. Synonyms: rhythmic spikes, generalized paroxysmal fast activity, fast paroxysmal rhythms, grand mal discharge, fast beta activity. (Source: Beniczky ea 2017, Table 5; Beniczky ea 2013, Appendix S4.) + + hedId + HED_0042116 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042117 + + + inLibrary + score + + + + + Polyspikes + Two or more consecutive spikes. (Source: Beniczky ea 2017, Table 5; Beniczky ea 2013, Appendix S4.) + + hedId + HED_0042118 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042119 + + + inLibrary + score + + + + + Polyspike-and-slow-wave + Two or more consecutive spikes associated with one or more slow waves. (Source: Beniczky ea 2017, Table 5; Beniczky ea 2013, Appendix S4.) + + hedId + HED_0042120 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042121 + + + inLibrary + score + + + + + Sharp-wave + A transient clearly distinguished from background activity, with pointed peak at a conventional paper speed or time scale, and duration of 70-200 ms, i.e. over 1/4-1/5 s approximately. Main component is generally negative relative to other areas. Amplitude varies. (Source: Beniczky ea 2017, Table 5; Beniczky ea 2013, Appendix S4.) + + hedId + HED_0042122 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042123 + + + inLibrary + score + + + + + Sharp-and-slow-wave + A sequence of a sharp wave and a slow wave. (Source: Beniczky ea 2017, Table 5; Beniczky ea 2013, Appendix S4.) + + hedId + HED_0042124 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042125 + + + inLibrary + score + + + + + Slow-sharp-wave + A transient that bears all the characteristics of a sharp-wave, but exceeds 200 ms. Synonym: blunted sharp wave. (Source: Beniczky ea 2017, Table 5; Beniczky ea 2013, Appendix S4.) + + hedId + HED_0042126 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042127 + + + inLibrary + score + + + + + High-frequency-oscillation + High Frequency Oscillation (HFO). Oscillations with a frequency higher than 80 Hz. (Source: Wikipedia; Beniczky ea 2017, Table 5.) + + hedId + HED_0042128 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042129 + + + inLibrary + score + + + + + Hypsarrhythmia-classic + Pattern consisting of diffuse chaotic high voltage (more than 300 μV) irregular slow waves interspersed with multiregional spikes and sharp waves over both hemispheres. (Source: Beniczky ea 2017, Table 5; Beniczky ea 2013, Appendix S4.) + + hedId + HED_0042130 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042131 + + + inLibrary + score + + + + + Hypsarrhythmia-modified + Pattern consisting of diffuse chaotic high voltage (more than 300 μV) irregular slow waves interspersed with multiregional spikes and sharp waves over both hemispheres. (Source: Beniczky ea 2017, Table 5; Beniczky ea 2013, Appendix S4.) + + hedId + HED_0042132 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042133 + + + inLibrary + score + + + + + Fast-spike-activity + A burst consisting of a sequence of spikes. Duration greater than 1 s. Frequency at least in the alpha range. (Source: Beniczky ea 2017, Table 12; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042134 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042135 + + + inLibrary + score + + + + + Low-voltage-fast-activity + Refers to the fast, and often recruiting activity which can be recorded at the onset of an ictal discharge, particularly in invasive EEG recording of a seizure. (Source: Beniczky ea 2017, Table 12; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042136 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042137 + + + inLibrary + score + + + + + Polysharp-waves + A sequence of two or more sharp-waves. (Source: Beniczky ea 2017, Table 12; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042138 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042139 + + + inLibrary + score + + + + + Slow-wave-large-amplitude + Slow wave of large amplitude. (Source: Beniczky ea 2017, Table 12.) + + hedId + HED_0042140 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042141 + + + inLibrary + score + + + + + Irregular-delta-or-theta-activity + EEG activity consisting of repetitive waves of inconsistent wave-duration but in delta and/or theta range (greater than 125 ms). (Source: Beniczky ea 2017, Table 12; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042142 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042143 + + + inLibrary + score + + + + + Electrodecremental-change + Sudden desynchronization of electrical activity. (Source: Beniczky ea 2017, Table 12; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042144 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042145 + + + inLibrary + score + + + + + DC-shift + Shift of negative polarity of the direct current recordings, during seizures. (Source: Beniczky ea 2017, Table 12; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042146 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042147 + + + inLibrary + score + + + + + Disappearance-of-ongoing-activity + Disappearance of the EEG activity that preceded the ictal event but still remnants of background activity (thus not enough to name it electrodecremental change). (Source: Beniczky ea 2017, Table 12; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042148 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042149 + + + inLibrary + score + + + + + RPP-morphology + Modifier terms for Rhythmic or Periodic Patterns in critically ill patients (RPPs). (Source: Beniczky ea 2017, Table 8.) + + suggestedTag + Feature-amplitude + + + hedId + HED_0042150 + + + inLibrary + score + + + RPP-with-superimposed-activity + Superimposed activity (for PDs and RDA). (Source: Beniczky ea 2017, Table 8.) + + suggestedTag + Property-not-possible-to-determine + + + hedId + HED_0042151 + + + inLibrary + score + + + Superimposed-fast-activity + Superimposed fast activity. (Source: Beniczky ea 2017, Table 8.) + + suggestedTag + Feature-frequency + + + hedId + HED_0042152 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042153 + + + inLibrary + score + + + + + Superimposed-rhythmic-activity + Superimposed rhythmic activity (for PDs only). (Source: Beniczky ea 2017, Table 8.) + + suggestedTag + Feature-frequency + + + hedId + HED_0042154 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042155 + + + inLibrary + score + + + + + Superimposed-sharp-waves-or-spikes + Superimposed sharp waves or spikes (for RDA only). (Source: Beniczky ea 2017, Table 8.) + + hedId + HED_0042156 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042157 + + + inLibrary + score + + + + + + RPP-sharpness + Sharpness (for PDs and SW). (Source: Beniczky ea 2017, Table 8.) + + suggestedTag + Property-not-possible-to-determine + + + hedId + HED_0042158 + + + inLibrary + score + + + RPP-spiky + Spiky (<70 ms, measured at the baseline). (Source: Beniczky ea 2017, Table 8.) + + hedId + HED_0042159 + + + inLibrary + score + + + + RPP-sharp + Sharp (70–200 ms). (Source: Beniczky ea 2017, Table 8.) + + hedId + HED_0042160 + + + inLibrary + score + + + + RPP-sharply-contoured + Sharply contoured. (Source: Beniczky ea 2017, Table 8.) + + hedId + HED_0042161 + + + inLibrary + score + + + + RPP-blunt + Blunt. (Source: Beniczky ea 2017, Table 8.) + + hedId + HED_0042162 + + + inLibrary + score + + + + + Number-of-RPP-phases + Number of phases (for PDs and SW): 1, 2 or 3. (Source: Beniczky ea 2017, Table 8.) + + suggestedTag + Property-not-possible-to-determine + Greater-than + + + hedId + HED_0042163 + + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0042164 + + + inLibrary + score + + + + + Triphasic-morphology + Waves with three distinct phases (for PDs and SW). (Source: Beniczky ea 2017, Table 8.) + + hedId + HED_0042165 + + + inLibrary + score + + + + RPP-absolute-amplitude + Absolute amplitude (for PDs, RDA, SW). Can use suggested tags for amplitude range. Very low, (Feature-amplitude, (Less-than, (Feature-amplitude/20 uv))): less than 20 microV, Low: 20 to 49 microV, Medium: 50 to 199 microV, High: Greater than 200 microV. (Source: Beniczky ea 2017, Table 8.) + + suggestedTag + Property-not-possible-to-determine + Low + Medium + High + + + hedId + HED_0042166 + + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + electricPotentialUnits + + + hedId + HED_0042167 + + + inLibrary + score + + + + + RPP-relative-amplitude + Relative amplitude (for PDs), should indicate if it's less than or equal to 2 or greater than 2. (Source: Beniczky ea 2017, Table 8.) + + suggestedTag + Property-not-possible-to-determine + Less-than-or-equal-to + Greater-than + + + hedId + HED_0042168 + + + inLibrary + score + + + + RPP-polarity + Polarity (for PDs and SW). (Source: Beniczky ea 2017, Table 8.) + + suggestedTag + Positive + Negative + Property-not-possible-to-determine + + + hedId + HED_0042169 + + + inLibrary + score + + + RPP-tangential-polarity + Tangential/horizontal dipole. (Source: Beniczky ea 2017, Table 8.) + + hedId + HED_0042170 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042171 + + + inLibrary + score + + + + + + + + Sensor-list + Lists all corresponding sensors (electrodes/channels in montage). The sensor-group is selected from a list defined in the site-settings for each EEG-lab. + + requireChild + + + hedId + HED_0042172 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042173 + + + inLibrary + score + + + + + Source-analysis-property + In case source imaging is done, the results are scored at sublobar level: frontal (perisylvian-superior surface; lateral; mesial; polar; orbitofrontal), temporal (polar; basal, lateral-anterior; lateral-posterior; perisylvian-inferior surface), central (lateral convexity; mesial; central sulcus – anterior surface, central sulcus – posterior surface; opercular), parietal (lateral-convexity; mesial; opercular), occipital (lateral; mesial, basal) and insula. (Source: Beniczky ea 2017, Section 8.) + + hedId + HED_0042174 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042175 + + + inLibrary + score + + + + + Location-property + Location can be scored for features. Semiologic feature can also be characterized by the somatotopic modifier (i.e. the part of the body where it occurs). In this respect, laterality (left, right, symmetric, asymmetric, left greater than right, right greater than left), body part (eyelid, face, arm, leg, trunk, visceral, left/right) and centricity (axial (trunk), proximal limb, distal limb). (Source: Beniczky ea 2017, Sections 8 and 10) + + suggestedTag + Left + Right + Body-part + + + hedId + HED_0042176 + + + inLibrary + score + + + Feature-propagation + When propagation within the graphoelement is observed, first the location of the onset region is scored. Then, the location of the propagation can be noted. + + suggestedTag + Body-part + Sensor-list + + + hedId + HED_0042177 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042178 + + + inLibrary + score + + + + + Multifocal-feature + When the same interictal graphoelement is observed bilaterally and at least in three independent locations, can score them using one entry, and choosing multifocal as a descriptor of the locations of the given interictal graphoelements, optionally emphasizing the involved, and the most active sites. + + suggestedTag + Property-not-possible-to-determine + + + hedId + HED_0042179 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042180 + + + inLibrary + score + + + + + + Modulators-property + For each described graphoelement, the influence of the modulators can be scored. Only modulators present in the recording are scored. (Source: Beniczky ea 2017, Section 10.) + + hedId + HED_0042181 + + + inLibrary + score + + + Modulators-reactivity + Susceptibility of individual rhythms or the EEG as a whole to change following sensory stimulation or other physiologic actions (Source: Beniczky ea 2013, Appendix S2). The type of stimulus can be a modulator or can be specified in free-text. + + suggestedTag + Modulator + Feature-stopped-by + Increasing + Decreasing + + + hedId + HED_0042182 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042183 + + + inLibrary + score + + + + + Facilitating-factor + The facilitating factors (if known) can be selected: alcohol (Suggested tag: Intoxicated), awakening, catamenial, fever, sleep, sleep-deprivation, other (free text). Facilitating factors are defined as transient and sporadic endogenous or exogenous elements capable of augmenting seizure incidence (increasing the likelihood of seizure occurrence). (Source: Beniczky ea 2013.) + + suggestedTag + Catamenial + Fever + Intoxicated + Awake + Asleep + Sleep-deprivation + + + hedId + HED_0042184 + + + inLibrary + score + + + Other-facilitating-factor + + hedId + HED_0042185 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042186 + + + inLibrary + score + + + + + + Provocative-factor + Provocative factors are defined as transient and sporadic endogenous or exogenous elements capable of evoking/triggering seizures immediately following the exposure to it. (Source: Beniczky ea 2013.) + + suggestedTag + Hyperventilation + + + hedId + HED_0042187 + + + inLibrary + score + + + Reflex-provoked + + hedId + HED_0042188 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042189 + + + inLibrary + score + + + + + Other-provocative-factor + + hedId + HED_0042190 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042191 + + + inLibrary + score + + + + + + Intermittent-photic-stimulation-effect + The effect of Intermittent Photic Stimulation (IPS) is scored according to the terminology proposed by Kasteleijn-Nolst Trenité ea (2001). (Source: Beniczky ea 2017.) + + suggestedTag + Normal + + + hedId + HED_0042192 + + + inLibrary + score + + + Posterior-stimulus-dependent-response + Anomalous steady-state VEPs, of unusually sharp waveform or high amplitude. Some types have clinical correlates, for instance, occipital spikes after suppression of generalized PPR by medication and high-amplitude VEPs in neuronal ceroid lipofuscinosis. (Source: Trenité ea 2001; Beniczky ea 2017, Table 7.) + + suggestedTag + Feature-frequency + + + hedId + HED_0042193 + + + inLibrary + score + + + + Posterior-stimulus-independent-response-limited + Limited to the stimulus train: Activity confined to or maximal at the back of the head and not at the flash frequency or at a harmonic thereof. The term includes delta and theta activity and frank epileptiform patterns. (Source: Trenité ea 2001; Beniczky ea 2017, Table 7.) + + suggestedTag + Feature-frequency + + + hedId + HED_0042194 + + + inLibrary + score + + + + Posterior-stimulus-independent-response-self-sustained + Self-sustaining: Self-sustaining posterior stimulus-independent responses that outlast the stimulus train. These often last many seconds and may evolve to an overt seizure. (Source: Trenité ea 2001; Beniczky ea 2017, Table 7.) + + suggestedTag + Feature-frequency + + + hedId + HED_0042195 + + + inLibrary + score + + + + Generalized-photoparoxysmal-response-limited + Limited to the stimulus train: Comprises multiple spikes or spike-and-wave activity, which are apparently generalized, but may be of greater amplitude at the front or back of the head. It is termed a photoconvulsive response (PCR) by Bickford et al., and corresponds to type 4 response of Waltz et al. (Source: Trenité ea 2001; Beniczky ea 2017, Table 7.) + + suggestedTag + Feature-frequency + + + hedId + HED_0042196 + + + inLibrary + score + + + + Generalized-photoparoxysmal-response-self-sustained + Self-sustaining: Generalized PPR continuing after stimulation. This may not be demonstrated unless the stimulus train is terminated as soon as a generalized PPR is identified. It was termed prolonged photoconvulsive response by Reilly and Peters, and has a strong association with epilepsy and visually induced seizures in patients referred for clinical EEG examination. Its prevalence in asymptomatic general populations is unknown, but was found in five of 13,658 apparently healthy aircrew by Gregory et al. (Source: Trenité ea 2001; Beniczky ea 2017, Table 7.) + + suggestedTag + Feature-frequency + + + hedId + HED_0042197 + + + inLibrary + score + + + + Activation-of-pre-existing-epileptogenic-area + Rarely, photic stimulation may activate an epileptogenic cortex, which is also spontaneously active; IPS could then also elicit a seizure by stimulating this, usually posterior located, area. It is questionable whether this should be considered a photoparoxysmal response (PPR), and it does not figure in established classifications. (Source: Trenité ea 2001; Beniczky ea 2017, Table 7.) + + suggestedTag + Feature-frequency + + + hedId + HED_0042198 + + + inLibrary + score + + + + + + Time-related-property + Estimates of how often a graphoelement is seen in the recording. (Source: Beniczky ea 2017, Table 6, Table 8.) + + hedId + HED_0042199 + + + inLibrary + score + + + Appearance-mode + Describes how the non-ictal EEG pattern/graphoelement is distributed through the recording. Occurrence of the non-ictal EEG pattern / graphoelement can be Random, Repetitive or Varying. Random: occurring without any rhythmicity / periodicity, Repetitive: occurring at an approximately regular rate / interval (generally of 1 to several seconds). Variable: occurring sometimes rhythmic or periodic, other times random, throughout the recording. (Source: Beniczky ea 2017, Table 6; Beniczky ea 2013, Appendix 4.) + + suggestedTag + Property-not-possible-to-determine + Random + Repetitive + Varying + + + hedId + HED_0042200 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042201 + + + inLibrary + score + + + + + Discharge-pattern + Describes the organization of the EEG signal within the discharge (distinguish between single and repetitive discharges). (Source: Beniczky ea 2017, Table 6; Beniczky ea 2013, Appendix 4.) + + hedId + HED_0042202 + + + inLibrary + score + + + Single-discharge + Applies to the intra-burst pattern: a graphoelement that is not repetitive; before and after the graphoelement one can distinguish the background activity. (Source: Beniczky ea 2017, Table 6; Beniczky ea 2013, Appendix 4.) + + suggestedTag + Feature-incidence + + + hedId + HED_0042203 + + + inLibrary + score + + + + Rhythmic-trains-or-bursts + Applies to the intra-burst pattern: a non-ictal graphoelement that repeats itself without returning to the background activity between them. The graphoelements within this repetition occur at approximately constant period. (Source: Beniczky ea 2017, Table 6; Beniczky ea 2013, Appendix 4.) + + suggestedTag + Feature-prevalence + Feature-frequency + + + hedId + HED_0042204 + + + inLibrary + score + + + + Arrhythmic-trains-or-bursts + Applies to the intra-burst pattern: a non-ictal graphoelement that repeats itself without returning to the background activity between them. The graphoelements within this repetition occur at inconstant period. (Source: Beniczky ea 2017, Table 6; Beniczky ea 2013, Appendix 4.) + + suggestedTag + Feature-prevalence + + + hedId + HED_0042205 + + + inLibrary + score + + + + Fragmented-discharge + Source: Beniczky ea 2017, Table 6. + + hedId + HED_0042206 + + + inLibrary + score + + + + + RPP-time-related-feature + Time related feature for Rhythmic or Periodic Patterns in critically ill patients (RPPs). (Source: Beniczky ea 2017, Table 8.) + + hedId + HED_0042207 + + + inLibrary + score + + + RPP-duration + Duration (for PDs, RDA and SW). The suggestedTag Property-not-possible-to-determine may be used if it is not possible to determine. (Source: Beniczky ea 2017, Table 8.) + + hedId + HED_0042208 + + + inLibrary + score + + + Very-brief-RPP-duration + Less than 10 sec. (Source: Beniczky ea 2017, Table 8.) + + hedId + HED_0042209 + + + inLibrary + score + + + + Brief-RPP-duration + 10 to 59 sec. (Source: Beniczky ea 2017, Table 8.) + + hedId + HED_0042210 + + + inLibrary + score + + + + Intermediate-RPP-duration + 1 to 4.9 min. (Source: Beniczky ea 2017, Table 8.) + + hedId + HED_0042211 + + + inLibrary + score + + + + Long-RPP-duration + 5 to 59 min. (Source: Beniczky ea 2017, Table 8.) + + hedId + HED_0042212 + + + inLibrary + score + + + + Very-long-RPP-duration + Greater than 1 hour. (Source: Beniczky ea 2017, Table 8.) + + hedId + HED_0042213 + + + inLibrary + score + + + + + RPP-onset + Onset (for PDs, RDA and SW). The suggestedTag Property-not-possible-to-determine may be used if it is not possible to determine. (Source: Beniczky ea 2017, Table 8.) + + hedId + HED_0042214 + + + inLibrary + score + + + Sudden-RPP-onset + Sudden (progressing from absent to well developed within 3 s.). (Source: Beniczky ea 2017, Table 8.) + + hedId + HED_0042215 + + + inLibrary + score + + + + Gradual-RPP-onset + Gradual onset. (Source: Beniczky ea 2017, Table 8.) + + hedId + HED_0042216 + + + inLibrary + score + + + + + RPP-dynamics + Dynamics (for PDs, RDA and SW). The suggestedTag Property-not-possible-to-determine may be used if it is not possible to determine. (Source: Beniczky ea 2017, Table 8.) + + hedId + HED_0042217 + + + inLibrary + score + + + Evolving-RPP-dynamics + Source: Beniczky ea 2017, Table 8. + + hedId + HED_0042218 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042219 + + + inLibrary + score + + + + + Fluctuating-RPP-dynamics + Source: Beniczky ea 2017, Table 8. + + hedId + HED_0042220 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042221 + + + inLibrary + score + + + + + Static-RPP-dynamics + Source: Beniczky ea 2017, Table 8. + + hedId + HED_0042222 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042223 + + + inLibrary + score + + + + + + + Feature-incidence + For single discharges, estimates of how often features are seen in the recording are scored as incidence (how often it occurs/time-epoch). (Source: Beniczky ea 2017, Section 8, Table 6.) + + hedId + HED_0042224 + + + inLibrary + score + + + One-time-incidence + Source: Beniczky ea 2017, Table 6. + + hedId + HED_0042225 + + + inLibrary + score + + + + Rare-feature-incidence + Less than 1/h. (Source: Beniczky ea 2017, Table 6.) + + hedId + HED_0042226 + + + inLibrary + score + + + + Uncommon-feature-incidence + 1/5 min to 1/h. (Source: Beniczky ea 2017, Table 6.) + + hedId + HED_0042227 + + + inLibrary + score + + + + Occasional-feature-incidence + 1/min to 1/5min. (Source: Beniczky ea 2017, Table 6.) + + hedId + HED_0042228 + + + inLibrary + score + + + + Frequent-feature-incidence + 1/10 s to 1/min. (Source: Beniczky ea 2017, Table 6.) + + hedId + HED_0042229 + + + inLibrary + score + + + + Abundant-feature-incidence + Greater than 1/10 s. (Source: Beniczky ea 2017, Table 6.) + + hedId + HED_0042230 + + + inLibrary + score + + + + + Feature-prevalence + For trains or bursts, estimates of how often features are seen in the recording are scored as prevalence (the percentage of the recording covered by the train/burst). (Source: Beniczky ea 2017, Section 8, Table 6, Table 8.) + + hedId + HED_0042231 + + + inLibrary + score + + + Rare-prevalence + Less than 1 percent. (Source: Beniczky ea 2017, Table 6, Table 8). + + hedId + HED_0042232 + + + inLibrary + score + + + + Occasional-prevalence + 1 to 9 percent. (Source: Beniczky ea 2017, Table 6, Table 8) + + hedId + HED_0042233 + + + inLibrary + score + + + + Frequent-prevalence + 10 to 49 percent. (Source: Beniczky ea 2017, Table 6, Table 8) + + hedId + HED_0042234 + + + inLibrary + score + + + + Abundant-prevalence + 50 to 89 percent. (Source: Beniczky ea 2017, Table 6, Table 8) + + hedId + HED_0042235 + + + inLibrary + score + + + + Continuous-prevalence + Greater than 90 percent. (Source: Beniczky ea 2017, Table 6, Table 8) + + hedId + HED_0042236 + + + inLibrary + score + + + + + + Posterior-dominant-rhythm-property + Posterior dominant rhythm is the most often scored EEG feature in clinical practice. Therefore, there are specific terms that can be chosen for characterizing the PDR. Note that frequency and amplitude can be further described to be symmetrical or asymmetrical. (Source: Beniczky ea 2017, Section 6, Table 4.) + + suggestedTag + Feature-frequency + Feature-amplitude + + + hedId + HED_0042237 + + + inLibrary + score + + + Posterior-dominant-rhythm-amplitude-range + Low: less than 20 microV, Medium: 20 to 70 microVSource, High: more than 70 microV. (Source: Beniczky ea 2017, Table 4.) + + suggestedTag + Low + Medium + High + + + hedId + HED_0042238 + + + inLibrary + score + + + + Posterior-dominant-rhythm-eye-opening-reactivity + Change (disappearance or measurable decrease in amplitude) of a posterior dominant rhythm following eye-opening. Eye closure has the opposite effect. (Source: Beniczky ea 2013, Appendix S2; Beniczky ea 2017, Table 4.) + + suggestedTag + Property-not-possible-to-determine + Left + Right + + + hedId + HED_0042239 + + + inLibrary + score + + + + Posterior-dominant-rhythm-organization + Posterior dominant rhythm organization. When normal could be labeled with suggested tag. (Source: Beniczky ea 2017, Table 4.) + + suggestedTag + Normal + + + hedId + HED_0042240 + + + inLibrary + score + + + Posterior-dominant-rhythm-organization-poorly-organized + Poorly organized. (Source: Beniczky ea 2017, Table 4.) + + hedId + HED_0042241 + + + inLibrary + score + + + + Posterior-dominant-rhythm-organization-disorganized + Disorganized. (Source: Beniczky ea 2017, Table 4.) + + hedId + HED_0042242 + + + inLibrary + score + + + + Posterior-dominant-rhythm-organization-markedly-disorganized + Markedly disorganized. (Source: Beniczky ea 2017, Table 4.) + + hedId + HED_0042243 + + + inLibrary + score + + + + + Posterior-dominant-rhythm-caveat + Caveats for PDR annotation, use suggestedTags to indicate whether there were: no caveats, only open eyes during the recording, sleep-deprived, drowsy or only following hyperventilation. (Source: Beniczky ea 2017, Table 4.) + + suggestedTag + None + Eyes-open + Sleep-deprivation + Drowsy + Hyperventilation + + + hedId + HED_0042244 + + + inLibrary + score + + + + Absence-of-posterior-dominant-rhythm + Reason for absence of PDR. (Source: Beniczky ea 2017, Table 4.) + + suggestedTag + Data-artifact + Asleep + + + hedId + HED_0042245 + + + inLibrary + score + + + Absence-of-posterior-dominant-rhythm-extreme-low-voltage + Source: Beniczky ea 2017, Table 4. + + hedId + HED_0042246 + + + inLibrary + score + + + + Absence-of-posterior-dominant-rhythm-eye-closure-could-not-be-achieved + Source: Beniczky ea 2017, Table 4. + + hedId + HED_0042247 + + + inLibrary + score + + + + Absence-of-posterior-dominant-rhythm-lack-of-compliance + Source: Beniczky ea 2017, Table 4. + + hedId + HED_0042248 + + + inLibrary + score + + + + Absence-of-posterior-dominant-rhythm-other-causes + Source: Beniczky ea 2017, Table 4. + + requireChild + + + hedId + HED_0042249 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042250 + + + inLibrary + score + + + + + + + Episode-property + Episode property pertains to the set of characteristics that collectively depict different aspects of an episode, encompassing its manifestations and phases. + + hedId + HED_0042251 + + + inLibrary + score + + + Seizure-classification + Seizure classification refers to the grouping of seizures based on their clinical features, EEG patterns, and other characteristics. Epileptic seizures are named using the current ILAE seizure classification (Fisher et al., 2017, Beniczky et al., 2017). + + hedId + HED_0042252 + + + inLibrary + score + + + Myoclonic-seizure + Sudden, brief (lower than 100 msec) involuntary single or multiple contraction(s) of muscles(s) or muscle groups of variable topography (axial, proximal limb, distal). Myoclonus is less regularly repetitive and less sustained than is clonus. Definition from ILAE 2017 Classification of Seizure Types Expanded Version. (Source: Fisher ea 2017, Table 2; Duration tag from Beniczky ea Table 13.) + + suggestedTag + Duration + + + hedId + HED_0042253 + + + inLibrary + score + + + + Negative-myoclonic-seizure + Source: Beniczky ea 2017, Supplement 1; Duration tag from Beniczky ea Table 13. + + suggestedTag + Duration + + + hedId + HED_0042254 + + + inLibrary + score + + + + Motor-seizure + Involves musculature in any form. The motor event could consist of an increase (positive) or decrease (negative) in muscle contraction to produce a movement. Definition from ILAE 2017 Classification of Seizure Types Expanded Version. (Source: Fisher ea 2017, Table 2; Duration tag from Beniczky ea Table 13.) + + suggestedTag + Duration + + + hedId + HED_0042255 + + + inLibrary + score + + + Clonic-seizure + Jerking, either symmetric or asymmetric, that is regularly repetitive and involves the same muscle groups. Definition from ILAE 2017 Classification of Seizure Types Expanded Version. (Source: Fisher ea 2017, Table 2.) + + hedId + HED_0042256 + + + inLibrary + score + + + + Tonic-seizure + A sustained increase in muscle contraction lasting a few seconds to minutes. Definition from ILAE 2017 Classification of Seizure Types Expanded Version. (Source: Fisher ea 2017, Table 2.) + + hedId + HED_0042257 + + + inLibrary + score + + + + Atonic-seizure + Sudden loss or diminution of muscle tone without apparent preceding myoclonic or tonic event lasting about 1 to 2 s, involving head, trunk, jaw, or limb musculature. Definition from ILAE 2017 Classification of Seizure Types Expanded Version. (Source: Fisher ea 2017, Table 2.) + + hedId + HED_0042258 + + + inLibrary + score + + + + Myoclonic-atonic-seizure + A generalized seizure type with a myoclonic jerk leading to an atonic motor component. This type was previously called myoclonic astatic. Definition from ILAE 2017 Classification of Seizure Types Expanded Version. (Source: Fisher ea 2017, Table 2.) + + hedId + HED_0042259 + + + inLibrary + score + + + + Myoclonic-tonic-clonic-seizure + One or a few jerks of limbs bilaterally, followed by a tonic clonic seizure. The initial jerks can be considered to be either a brief period of clonus or myoclonus. Seizures with this characteristic are common in juvenile myoclonic epilepsy. Definition from ILAE 2017 Classification of Seizure Types Expanded Version. (Source: Fisher ea 2017, Table 2.) + + hedId + HED_0042260 + + + inLibrary + score + + + + Tonic-clonic-seizure + A sequence consisting of a tonic followed by a clonic phase. Definition from ILAE 2017 Classification of Seizure Types Expanded Version. (Source: Fisher ea 2017, Table 2.) + + hedId + HED_0042261 + + + inLibrary + score + + + + Automatism-seizure + A more or less coordinated motor activity usually occurring when cognition is impaired and for which the subject is usually (but not always) amnesic afterward. This often resembles a voluntary movement and may consist of an inappropriate continuation of preictal motor activity. Definition from ILAE 2017 Classification of Seizure Types Expanded Version. (Source: Fisher ea 2017, Table 2.) + + hedId + HED_0042262 + + + inLibrary + score + + + + Hyperkinetic-seizure + (Source: Fisher ea 2017, Table 2.) + + hedId + HED_0042263 + + + inLibrary + score + + + + Epileptic-spasm + A sudden flexion, extension, or mixed extension flexion of predominantly proximal and truncal muscles that is usually more sustained than a myoclonic movement but not as sustained as a tonic seizure. Limited forms may occur: Grimacing, head nodding, or subtle eye movements. Epileptic spasms frequently occur in clusters. Infantile spasms are the best known form, but spasms can occur at all ages. Definition from ILAE 2017 Classification of Seizure Types Expanded Version. (Source: Fisher ea 2017, Table 2.) + + hedId + HED_0042264 + + + inLibrary + score + + + + + Nonmotor-seizure + Focal or generalized seizure types in which motor activity is not prominent. Definition from ILAE 2017 Classification of Seizure Types Expanded Version. (Source: Fisher ea 2017, Table 2; Duration tag from Beniczky ea Table 13.) + + suggestedTag + Duration + + + hedId + HED_0042265 + + + inLibrary + score + + + Behavior-arrest-seizure + Arrest (pause) of activities, freezing, immobilization, as in behavior arrest seizure. A focal behavior arrest seizure shows arrest of behavior as the prominent feature of the entire seizure. Definition from ILAE 2017 Classification of Seizure Types Expanded Version. (Source: Fisher ea 2017.) + + hedId + HED_0042266 + + + inLibrary + score + + + + Sensory-seizure + A perceptual experience not caused by appropriate stimuli in the external world. Definition from ILAE 2017 Classification of Seizure Types Expanded Version. (Source: Fisher ea 2017, Table 2.) + + hedId + HED_0042267 + + + inLibrary + score + + + + Emotional-seizure + Seizures presenting with an emotion or the appearance of having an emotion as an early prominent feature, such as fear, spontaneous joy or euphoria, laughing (gelastic), or crying (dacrystic). Definition from ILAE 2017 Classification of Seizure Types Expanded Version. (Source: Fisher ea 2017, Table 2.) + + hedId + HED_0042268 + + + inLibrary + score + + + + Cognitive-seizure + Pertaining to thinking and higher cortical functions, such as language, spatial perception, memory, and praxis. The previous term for similar usage as a seizure type was psychic. Definition from ILAE 2017 Classification of Seizure Types Expanded Version. (Source: Fisher ea 2017, Table 2.) + + hedId + HED_0042269 + + + inLibrary + score + + + + Autonomic-seizure + A distinct alteration of autonomic nervous system function involving cardiovascular, pupillary, gastrointestinal, sudomotor, vasomotor, and thermoregulatory functions. Definition from ILAE 2017 Classification of Seizure Types Expanded Version. (Source: Fisher ea 2017, Table 2.) + + hedId + HED_0042270 + + + inLibrary + score + + + + + Absence-seizure + Absence seizures present with a sudden cessation of activity and awareness. Absence seizures tend to occur in younger age groups, have more sudden start and termination, and they usually display less complex automatisms than do focal seizures with impaired awareness, but the distinctions are not absolute. EEG information may be required for accurate classification. Definition from ILAE 2017 Classification of Seizure Types Expanded Version. (Source: Fisher ea 2017, Table 2; Duration tag from Beniczky ea Table 13.) + + suggestedTag + Duration + + + hedId + HED_0042271 + + + inLibrary + score + + + Typical-absence-seizure + A sudden onset, interruption of ongoing activities, a blank stare, possibly a brief upward deviation of the eyes. Usually the patient will be unresponsive when spoken to. Duration is a few seconds to half a minute with very rapid recovery. Although not always available, an EEG would show generalized epileptiform discharges during the event. An absence seizure is by definition a seizure of generalized onset. The word is not synonymous with a blank stare, which also can be encountered with focal onset seizures. Definition from ILAE 2017 Classification of Seizure Types Expanded Version. (Source: Fisher ea 2017, Table 2.) + + hedId + HED_0042272 + + + inLibrary + score + + + + Atypical-absence-seizure + An absence seizure with changes in tone that are more pronounced than in typical absence or the onset and/or cessation is not abrupt, often associated with slow, irregular, generalized spike-wave activity. Definition from ILAE 2017 Classification of Seizure Types Expanded Version. (Source: Fisher ea 2017, Table 2.) + + hedId + HED_0042273 + + + inLibrary + score + + + + Myoclonic-absence-seizure + A myoclonic absence seizure refers to an absence seizure with rhythmic three-per-second myoclonic movements, causing ratcheting abduction of the upper limbs leading to progressive arm elevation, and associated with three-per-second generalized spike-wave discharges. Duration is typically 10 to 60 s. Impairment of consciousness may not be obvious. Definition from ILAE 2017 Classification of Seizure Types Expanded Version. (Source: Fisher ea 2017, page 536.) + + hedId + HED_0042274 + + + inLibrary + score + + + + Eyelid-myoclonia-seizure + Jerking of the eyelids at frequencies of at least 3 per second, commonly with upward eye deviation, usually lasting <10 s, often precipitated by eye closure. There may or may not be associated brief loss of awareness. Definition from ILAE 2017 Classification of Seizure Types Expanded Version. (Source: Fisher ea 2017, Table 2.) + + hedId + HED_0042275 + + + inLibrary + score + + + + + + Seizure-semiology + Seizure semiology refers to the clinical signs and sympoms that are observed during a seizure. Semiology is described according to the ILAE Glossary of Descriptive Terminology for Ictal Semiology (Blume et al., 2001). Besides the name, the semiologic feature can also be characterized by the somatotopic modifier, laterality, body part and centricity. Uses Location-property tags. (Source: Beniczky ea 2017, Section 10; Duration tag from Beniczky ea Table 13.) + + suggestedTag + None + Duration + + + hedId + HED_0042276 + + + inLibrary + score + + + Semiology-motor-behavioral-arrest + Interruption of ongoing motor activity or of ongoing behaviors with fixed gaze, without movement of the head or trunk (oro-alimentary and hand automatisms may continue). (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + Body-part + + + hedId + HED_0042277 + + + inLibrary + score + + + + Semiology-dyscognitive + The term describes events in which (1) disturbance of cognition is the predominant or most apparent feature, and (2a) two or more of the following components are involved, or (2b) involvement of such components remains undetermined. Otherwise, use the more specific term (e.g., mnemonic experiential seizure or hallucinatory experiential seizure). Components of cognition: ++ perception: symbolic conception of sensory information ++ attention: appropriate selection of a principal perception or task ++ emotion: appropriate affective significance of a perception ++ memory: ability to store and retrieve percepts or concepts ++ executive function: anticipation, selection, monitoring of consequences, and initiation of motor activity including praxis, speech. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042278 + + + inLibrary + score + + + + Semiology-elementary-motor + A single type of contraction of a muscle or group of muscles that is usually stereotyped and not decomposable into phases. However, see tonic-clonic, an elementary motor sequence. (Source: Blume ea 2001, 1.1; Beniczky ea 2017, Table 10.) + + hedId + HED_0042279 + + + inLibrary + score + + + Semiology-myoclonic-jerk + Characterized by myoclonus. MYOCLONUS : sudden, brief (lower than 100 ms) involuntary single or multiple contraction(s) of muscles(s) or muscle groups of variable topography (axial, proximal limb, distal). (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + Body-part + + + hedId + HED_0042280 + + + inLibrary + score + + + + Semiology-negative-myoclonus + Characterized by negative myoclonus. NEGATIVE MYOCLONUS: interruption of tonic muscular activity for lower than 500 ms without evidence of preceding myoclonia. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + Body-part + + + hedId + HED_0042281 + + + inLibrary + score + + + + Semiology-clonic + Myoclonus that is regularly repetitive, involves the same muscle groups, at a frequency of about 2 to 3 c/s, and is prolonged. Synonym: rhythmic myoclonus. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + Body-part + + + hedId + HED_0042282 + + + inLibrary + score + + + + Semiology-jacksonian-march + Term indicating spread of clonic movements through contiguous body parts unilaterally. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + Body-part + + + hedId + HED_0042283 + + + inLibrary + score + + + + Semiology-epileptic-spasm + A sudden flexion, extension, or mixed extension flexion of predominantly proximal and truncal muscles that is usually more sustained than a myoclonic movement but not so sustained as a tonic seizure (i.e., about 1 s). Limited forms may occur: grimacing, head nodding. Frequent occurrence in clusters. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + Body-part + + + hedId + HED_0042284 + + + inLibrary + score + + + + Semiology-tonic + A sustained increase in muscle contraction lasting a few seconds to minutes. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + Body-part + + + hedId + HED_0042285 + + + inLibrary + score + + + + Semiology-dystonic + Sustained contractions of both agonist and antagonist muscles producing athetoid or twisting movements, which, when prolonged, may produce abnormal postures. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + Body-part + + + hedId + HED_0042286 + + + inLibrary + score + + + + Semiology-postural + Adoption of a posture that may be bilaterally symmetric or asymmetric (as in a fencing posture). (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + Body-part + + + hedId + HED_0042287 + + + inLibrary + score + + + + Semiology-versive + A sustained, forced conjugate ocular, cephalic, and/or truncal rotation or lateral deviation from the midline. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Body-part + + + hedId + HED_0042288 + + + inLibrary + score + + + + Semiology-tonic-clonic + A sequence consisting of a tonic followed by a clonic phase. Variants such as clonic-tonic-clonic may be seen. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + Body-part + + + hedId + HED_0042289 + + + inLibrary + score + + + Semiology-tonic-clonic-without-figure-of-four + Without figure of four: Asymmetry of limb posture during the tonic phase of a GTC: one arm is rigidly extended at the elbow (often with the fist clenched tightly and flexed at the wrist), whereas the opposite arm is flexed at the elbow. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042290 + + + inLibrary + score + + + + Semiology-tonic-clonic-with-figure-of-four-extension-left-elbow + With figure of four: Asymmetry of limb posture during the tonic phase of a GTC: one arm is rigidly extended at the elbow (often with the fist clenched tightly and flexed at the wrist), whereas the opposite arm is flexed at the elbow. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042291 + + + inLibrary + score + + + + Semiology-tonic-clonic-with-figure-of-four-extension-right-elbow + With figure of four: Asymmetry of limb posture during the tonic phase of a GTC: one arm is rigidly extended at the elbow (often with the fist clenched tightly and flexed at the wrist), whereas the opposite arm is flexed at the elbow. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042292 + + + inLibrary + score + + + + + Semiology-astatic + Loss of erect posture that results from an atonic, myoclonic, or tonic mechanism. Synonym: drop attack. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + Body-part + + + hedId + HED_0042293 + + + inLibrary + score + + + + Semiology-atonic + Sudden loss or diminution of muscle tone without apparent preceding myoclonic or tonic event lasting greater or equal to 1 to 2 s, involving head, trunk, jaw, or limb musculature. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + Body-part + + + hedId + HED_0042294 + + + inLibrary + score + + + + Semiology-eye-blinking + Source: Beniczky ea 2017, Table 10. + + suggestedTag + Categorical-location-value + + + hedId + HED_0042295 + + + inLibrary + score + + + + Semiology-subtle-motor-phenomena + Source: Beniczky ea 2017, Table 10. + + requireChild + + + suggestedTag + Categorical-location-value + + + hedId + HED_0042296 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042297 + + + inLibrary + score + + + + + Semiology-other-elementary-motor + + requireChild + + + hedId + HED_0042298 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042299 + + + inLibrary + score + + + + + + Semiology-automatisms + A more or less coordinated, repetitive, motor activity usually occurring when cognition is impaired and for which the subject is usually amnesic afterward. This often resembles a voluntary movement and may consist of an inappropriate continuation of ongoing preictal motor activity. (Source: Beniczky ea 2017, Table 10; Fisher ea 2017, Table 2.) + + hedId + HED_0042300 + + + inLibrary + score + + + Semiology-mimetic + Facial expression suggesting an emotional state, often fear. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042301 + + + inLibrary + score + + + + Semiology-oroalimentary + Lip smacking, lip pursing, chewing, licking, tooth grinding, or swallowing. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042302 + + + inLibrary + score + + + + Semiology-dacrystic + Bursts of crying. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042303 + + + inLibrary + score + + + + Semiology-manual + 1. Indicates principally distal components, bilateral or unilateral. 2. Fumbling, tapping, manipulating movements. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + + + hedId + HED_0042304 + + + inLibrary + score + + + + Semiology-gestural + Semipurposive, asynchronous hand movements. Often unilateral. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + + + hedId + HED_0042305 + + + inLibrary + score + + + + Semiology-hypermotor + 1. Involves predominantly proximal limb or axial muscles producing irregular sequential ballistic movements, such as pedaling, pelvic thrusting, thrashing, rocking movements. 2. Increase in rate of ongoing movements or inappropriately rapid performance of a movement. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + Body-part + + + hedId + HED_0042306 + + + inLibrary + score + + + + Semiology-hypokinetic + A decrease in amplitude and/or rate or arrest of ongoing motor activity. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + Body-part + + + hedId + HED_0042307 + + + inLibrary + score + + + + Semiology-gelastic + Bursts of laughter or giggling, usually without an appropriate affective tone. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042308 + + + inLibrary + score + + + + Semiology-other-automatisms + Source: Beniczky ea 2017, Table 10. + + requireChild + + + hedId + HED_0042309 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042310 + + + inLibrary + score + + + + + + Semiology-sensory + A perceptual experience not caused by appropriate stimuli in the external world. Modifies seizure or aura. (Source: Beniczky ea 2017, Table 10; Blume ea 2001, 2.2.) + + hedId + HED_0042311 + + + inLibrary + score + + + Semiology-headache + Headache occurring in close temporal proximity to the seizure or as the sole seizure manifestation. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + + + hedId + HED_0042312 + + + inLibrary + score + + + + Semiology-visual + Flashing or flickering lights, spots, simple patterns, scotomata, or amaurosis. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + + + hedId + HED_0042313 + + + inLibrary + score + + + + Semiology-auditory + Buzzing, drumming sounds or single tones. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + + + hedId + HED_0042314 + + + inLibrary + score + + + + Semiology-olfactory + Source: Beniczky ea 2017, Table 10. + + hedId + HED_0042315 + + + inLibrary + score + + + + Semiology-gustatory + Taste sensations including acidic, bitter, salty, sweet, or metallic. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042316 + + + inLibrary + score + + + + Semiology-epigastric + Abdominal discomfort including nausea, emptiness, tightness, churning, butterflies, malaise, pain, and hunger; sensation may rise to chest or throat. Some phenomena may reflect ictal autonomic dysfunction. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042317 + + + inLibrary + score + + + + Semiology-somatosensory + Tingling, numbness, electric-shock sensation, sense of movement or desire to move. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + Body-part + + + hedId + HED_0042318 + + + inLibrary + score + + + + Semiology-autonomic-sensation + Viscerosensitive. A sensation consistent with involvement of the autonomic nervous system, including cardiovascular, gastrointestinal, sudomotor, vasomotor, and thermoregulatory functions. (Thus autonomic aura; cf. autonomic events 3.0/Semiology-autonomic). (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5; Blume ea 2001, 2.2.1.8.) + + hedId + HED_0042319 + + + inLibrary + score + + + + Semiology-sensory-other + Source: Beniczky ea 2017, Table 10. + + requireChild + + + hedId + HED_0042320 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042321 + + + inLibrary + score + + + + + + Semiology-experiential + Affective, mnemonic, or composite perceptual phenomena including illusory or composite hallucinatory events; these may appear alone or in combination. Included are feelings of depersonalization. These phenomena have subjective qualities similar to those experienced in life but are recognized by the subject as occurring outside of actual context. (Source: Beniczky ea 2017, Table 10; Blume ea 2001, 2.2.2.) + + hedId + HED_0042322 + + + inLibrary + score + + + Semiology-affective-emotional + Components include fear, depression, joy, and (rarely) anger. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042323 + + + inLibrary + score + + + + Semiology-hallucinatory + Composite perceptions without corresponding external stimuli involving visual, auditory, somatosensory, olfactory, and/or gustatory phenomena. Example: hearing and seeing people talking. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042324 + + + inLibrary + score + + + + Semiology-illusory + An alteration of actual percepts involving the visual, auditory, somatosensory, olfactory, or gustatory systems. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042325 + + + inLibrary + score + + + + Semiology-mnemonic + Components that reflect ictal dysmnesia such as feelings of familiarity (deja-vu) and unfamiliarity (jamais-vu). Use suggested tags to indicate Familiar (deja-vu) or Unfamiliar (jamais-vu). (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Familiar + Unfamiliar + + + hedId + HED_0042326 + + + inLibrary + score + + + + Semiology-experiential-other + Source: Beniczky ea 2017, Table 10. + + requireChild + + + hedId + HED_0042327 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042328 + + + inLibrary + score + + + + + + Semiology-language + Source: Beniczky ea 2017, Table 10. + + hedId + HED_0042329 + + + inLibrary + score + + + Semiology-vocalization + Single or repetitive utterances consisting of sounds such as grunts or shrieks. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042330 + + + inLibrary + score + + + + Semiology-verbalization + Single or repetitive utterances consisting of words, phrases, or brief sentences. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042331 + + + inLibrary + score + + + + Semiology-dysphasia + Partially impaired communication involving language without dysfunction of relevant primary motor or sensory pathways, manifested as impaired comprehension, anomia, paraphasic errors, or a combination of these. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042332 + + + inLibrary + score + + + + Semiology-aphasia + Fully impaired communication involving language without dysfunction of relevant primary motor or sensory pathways, manifested as impaired comprehension, anomia, paraphasic errors, or a combination of these. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042333 + + + inLibrary + score + + + + Semiology-language-other + Source: Beniczky ea 2017, Table 10. + + requireChild + + + hedId + HED_0042334 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042335 + + + inLibrary + score + + + + + + Semiology-autonomic + An objectively documented and distinct alteration of autonomic nervous system function involving cardiovascular, pupillary, gastrointestinal, sudomotor, vasomotor, and thermoregularity functions (cf. Semiology-autonomic-sensation). (Source: Beniczky ea 2017, Table 10; Blume ea 2001, 3.2.) + + hedId + HED_0042336 + + + inLibrary + score + + + Semiology-pupillary + Mydriasis, miosis (either bilateral or unilateral). (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + + + hedId + HED_0042337 + + + inLibrary + score + + + + Semiology-hypersalivation + Increase in production of saliva leading to uncontrollable drooling. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042338 + + + inLibrary + score + + + + Semiology-respiratory-apnoeic + Subjective shortness of breath, hyperventilation, stridor, coughing, choking, apnea, oxygen desaturation, neurogenic pulmonary edema. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042339 + + + inLibrary + score + + + + Semiology-cardiovascular + Modifications of heart rate (tachycardia, bradycardia), cardiac arrhythmias (such as sinus arrhythmia, sinus arrest, supraventricular tachycardia, atrial premature depolarizations, ventricular premature depolarizations, atrio-ventricular block, bundle branch block, atrioventricular nodal escape rhythm, asystole). (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042340 + + + inLibrary + score + + + + Semiology-gastrointestinal + Nausea, eructation, vomiting, retching, abdominal sensations, abdominal pain, flatulence, spitting, diarrhea. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042341 + + + inLibrary + score + + + + Semiology-urinary-incontinence + Urinary urge (intense urinary urge at the beginning of seizures), urinary incontinence, ictal urination (rare symptom of partial seizures without loss of consciousness). (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042342 + + + inLibrary + score + + + + Semiology-genital + Sexual auras (erotic thoughts and feelings, sexual arousal and orgasm). Genital auras (unpleasant, sometimes painful, frightening or emotionally neutral somatosensory sensations in the genitals that can be accompanied by ictal orgasm). Sexual automatisms (hypermotor movements consisting of writhing, thrusting, rhythmic movements of the pelvis, arms and legs, sometimes associated with picking and rhythmic manipulation of the groin or genitalia, exhibitionism and masturbation). (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042343 + + + inLibrary + score + + + + Semiology-vasomotor + Flushing or pallor (may be accompanied by feelings of warmth, cold and pain). (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042344 + + + inLibrary + score + + + + Semiology-sudomotor + Sweating and piloerection (may be accompanied by feelings of warmth, cold and pain). (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + + + hedId + HED_0042345 + + + inLibrary + score + + + + Semiology-thermoregulatory + Hyperthermia, fever. (Source: Beniczky ea 2017, Table 10; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042346 + + + inLibrary + score + + + + Semiology-autonomic-other + + requireChild + + + hedId + HED_0042347 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042348 + + + inLibrary + score + + + + + + Semiology-manifestation-other + + requireChild + + + hedId + HED_0042349 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042350 + + + inLibrary + score + + + + + + Postictal-semiology + A transient clinical abnormality of central nervous system function that appears or becomes accentuated when clinical signs of the ictus have ended. (Source: Blume ea 2001; Beniczky ea 2017, Table 11; Duration tag from Beniczky ea Table 13.) + + suggestedTag + None + Duration + + + hedId + HED_0042351 + + + inLibrary + score + + + Postictal-unconscious + Unawareness and unresponsiveness. (Source: Beniczky ea 2017, Table 11; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042352 + + + inLibrary + score + + + + Postictal-quick-recovery-of-consciousness + Quick recovery of awareness and responsiveness. (Source: Beniczky ea 2017, Table 11; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042353 + + + inLibrary + score + + + + Postictal-aphasia-or-dysphasia + Impaired communication involving language without dysfunction of relevant primary motor or sensory pathways, manifested as impaired comprehension, anomia, parahasic errors or a combination of these. (Source: Beniczky ea 2017, Table 11; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042354 + + + inLibrary + score + + + + Postictal-behavioral-change + Occurring immediately after a seizure. Including psychosis, hypomanina, obsessive-compulsive behavior. (Source: Beniczky ea 2017, Table 11; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042355 + + + inLibrary + score + + + + Postictal-hemianopia + Postictal visual loss in a a hemi field. (Source: Beniczky ea 2017, Table 11; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042356 + + + inLibrary + score + + + + Postictal-impaired-cognition + Decreased Cognitive performance involving one or more of perception, attention, emotion, memory, execution, praxis, speech. (Source: Beniczky ea 2017, Table 11; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042357 + + + inLibrary + score + + + + Postictal-dysphoria + Depression, irritability, euphoric mood, fear, anxiety. (Source: Beniczky ea 2017, Table 11; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042358 + + + inLibrary + score + + + + Postictal-headache + Headache with features of tension-type or migraine headache that develops within 3 h following the seizure and resolves within 72 h after seizure. (Source: Beniczky ea 2017, Table 11; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042359 + + + inLibrary + score + + + + Postictal-nose-wiping + Noes-wiping usually within 60 sec of seizure offset, usually with the hand ipsilateral to the seizure onset. (Source: Beniczky ea 2017, Table 11; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + + + hedId + HED_0042360 + + + inLibrary + score + + + + Postictal-anterograde-amnesia + Impaired ability to remember new material. (Source: Beniczky ea 2017, Table 11; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042361 + + + inLibrary + score + + + + Postictal-retrograde-amnesia + Impaired ability to recall previously remember material. (Source: Beniczky ea 2017, Table 11; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042362 + + + inLibrary + score + + + + Postictal-paresis + Todds palsy. Any unilateral postictal dysfunction relating to motor, language, sensory and/or integrative functions. (Source: Beniczky ea 2017, Table 11; Beniczky ea 2013, Appendix S5.) + + suggestedTag + Categorical-location-value + Body-part + + + hedId + HED_0042363 + + + inLibrary + score + + + + Postictal-sleep + Invincible need to sleep after a seizure. (Source: Beniczky ea 2017, Table 11; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042364 + + + inLibrary + score + + + + Postictal-unilateral-myoclonic-jerks + Unilateral myoclonic jerks. Myoclonus: sudden, brief (<100 ms) involuntary single or multiple contraction(s) of muscles(s) or muscle groups of variable topography (axial, proximal limb, distal). (Source: Beniczky ea 2017, Table 11; Beniczky ea 2013, Appendix S5.) + + hedId + HED_0042365 + + + inLibrary + score + + + + Postictal-other-unilateral-motor-phenomena + Unilateral motor phenomena, other then specified above, occurring in the postictal phase. (Source: Beniczky ea 2017, Table 11; Beniczky ea 2013, Appendix S5.) + + requireChild + + + hedId + HED_0042366 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042367 + + + inLibrary + score + + + + + + Episode-time-context-property + Additional clinically relevant features related to episodes can be scored under timing and context. If needed, episode duration can be tagged with suggested tag. (Source: Beniczky ea 2017, Section 10.) + + hedId + HED_0042368 + + + inLibrary + score + + + Episode-consciousness-affected + Source: Beniczky ea 2017, Table 13. + + suggestedTag + False + Some + True + Property-not-possible-to-determine + + + hedId + HED_0042369 + + + inLibrary + score + + + + Episode-awareness + False: the patient is not aware of the episode. True: the patient is aware of the episode. (Source: Beniczky ea 2017, Table 13.) + + suggestedTag + True + False + + + hedId + HED_0042370 + + + inLibrary + score + + + + Episode-event-count + Number of stereotypical episodes during the recording. (Source: Beniczky ea 2017, Table 13.) + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + hedId + HED_0042371 + + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0042372 + + + inLibrary + score + + + + + Status-epilepticus + Episode with duration >30 min but not precisely determined (status epilepticus). (Source: Beniczky ea 2017, Table 13.) + + hedId + HED_0042373 + + + inLibrary + score + + + + Episode-prodrome + Prodrome is a preictal phenomenon, and it is defined as a subjective or objective clinical alteration (e.g., ill-localized sensation or agitation) that heralds the onset of an epileptic seizure but does not form part of it (Blume ea 2001). Therefore, prodrome should be distinguished from aura (which is an ictal phenomenon). If prodrome present/true + free text. (Source: Blume ea 2001; Beniczky ea 2017, Table 13.) + + suggestedTag + True + False + + + hedId + HED_0042374 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042375 + + + inLibrary + score + + + + + Initial-ictal-phase + + suggestedTag + Asleep + Awake + + + hedId + HED_0042376 + + + inLibrary + score + + + + Subsequent-ictal-phase + + hedId + HED_0042377 + + + inLibrary + score + + + + Post-ictal-phase + + hedId + HED_0042378 + + + inLibrary + score + + + + Episode-tongue-biting + Beniczky ea 2017, Table 13. + + suggestedTag + True + False + + + hedId + HED_0042379 + + + inLibrary + score + + + + + + Other-feature-property + + requireChild + + + hedId + HED_0042380 + + + inLibrary + score + + + Artifact-significance-to-recording + It is important to score the significance of the described artifacts: recording is not interpretable, recording of reduced diagnostic value, does not interfere with the interpretation of the recording. (Source: Beniczky ea 2017, Section 12) + + hedId + HED_0042381 + + + inLibrary + score + + + Recording-not-interpretable-due-to-artifact + + hedId + HED_0042382 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042383 + + + inLibrary + score + + + + + Recording-of-reduced-diagnostic-value-due-to-artifact + + hedId + HED_0042384 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042385 + + + inLibrary + score + + + + + Artifact-does-not-interfere-recording + + hedId + HED_0042386 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042387 + + + inLibrary + score + + + + + + Feature-significance-to-recording + Significance of feature. When normal/abnormal could be labeled with with suggested tags. + + suggestedTag + Normal + Abnormal + Property-not-possible-to-determine + + + hedId + HED_0042388 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042389 + + + inLibrary + score + + + + + Feature-frequency + Value in Hz (number) typed in. + + requireChild + + + suggestedTag + Symmetrical + Asymmetrical + + + hedId + HED_0042390 + + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + hedId + HED_0042391 + + + inLibrary + score + + + + + Feature-amplitude + Value in microvolts (number) typed in, e.g. (Feature-amplitude/number uv) + + requireChild + + + suggestedTag + Symmetrical + Asymmetrical + + + hedId + HED_0042392 + + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + electricPotentialUnits + + + hedId + HED_0042393 + + + inLibrary + score + + + + + Feature-stopped-by + + requireChild + + + hedId + HED_0042394 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042395 + + + inLibrary + score + + + + + Property-not-possible-to-determine + Not possible to determine. + + hedId + HED_0042396 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042397 + + + inLibrary + score + + + + + + + Interictal-activity + EEG pattern / transient that is distinguished from the background activity, considered abnormal, but is not recorded during ictal period (seizure) or postictal period; the presence of interictal activity does not necessarily imply that the patient has epilepsy. (Source: Beniczky ea 2013, Appendix S1; Beniczky ea 2017, Table 5.) + + hedId + HED_0042398 + + + inLibrary + score + + + Epileptiform-interictal-activity + Transients distinguishable from background activity, with characteristic spiky morphology, typically, but neither exclusively, nor invariably found in interictal EEGs of people with epilepsy. (Source: Beniczky ea 2013, Appendix S4; Morphologies from Beniczky ea 2017, Table 5; Suggested tags from Beniczky ea 2017, Section 8.) + + suggestedTag + Spike + Spike-and-slow-wave + Runs-of-rapid-spikes + Polyspikes + Polyspike-and-slow-wave + Sharp-wave + Sharp-and-slow-wave + Slow-sharp-wave + High-frequency-oscillation + Hypsarrhythmia-classic + Hypsarrhythmia-modified + Categorical-location-value + Sensor-list + Feature-propagation + Multifocal-feature + Appearance-mode + Discharge-pattern + Feature-incidence + + + hedId + HED_0042399 + + + inLibrary + score + + + + Abnormal-interictal-rhythmic-activity + Activity of frequency lower than alpha, that clearly exceeds the amount considered physiologically normal for patient age and state of alertness. (Source: Beniczky ea 2013, Appendix S4; Morphologies from Beniczky ea 2017, Table 5; Suggested tags from Beniczky ea 2017, Section 8.) + + suggestedTag + Rhythmic-property + Polymorphic-delta-activity + Frontal-intermittent-rhythmic-delta-activity + Occipital-intermittent-rhythmic-delta-activity + Temporal-intermittent-rhythmic-delta-activity + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + Feature-incidence + + + hedId + HED_0042400 + + + inLibrary + score + + + + Interictal-special-patterns + (Source: Beniczky ea 2017, Table 5.) + + hedId + HED_0042401 + + + inLibrary + score + + + Interictal-periodic-discharges + Periodic discharge not further specified (PDs). (Source: Beniczky ea 2017, Table 5.) + + suggestedTag + RPP-morphology + Categorical-location-value + Sensor-list + RPP-time-related-feature + + + hedId + HED_0042402 + + + inLibrary + score + + + Generalized-periodic-discharges + GPDs. The term generalized refers to any bilateral, bisynchronous and symmetric pattern, even if it has a restricted field (e.g. bifrontal). (Source: Beniczky ea 2017, Table 5; Hirsch ea 2013.) + + hedId + HED_0042403 + + + inLibrary + score + + + + Lateralized-periodic-discharges + LPDs. Lateralized includes unilateral and bilateral synchronous but asymmetric; includes focal, regional and hemispheric patterns. (Source: Beniczky ea 2017, Table 5; Hirsch ea 2013.) + + hedId + HED_0042404 + + + inLibrary + score + + + + Bilateral-independent-periodic-discharges + BIPDs. Bilateral Independent refers to the presence of 2 independent (asynchronous) lateralized patterns, one in each hemisphere. (Source: Beniczky ea 2017, Table 5; Hirsch ea 2013.) + + hedId + HED_0042405 + + + inLibrary + score + + + + Multifocal-periodic-discharges + MfPDs. Multifocal refers to the presence of at least three independent lateralized patterns with at least one in each hemisphere. (Source: Beniczky ea 2017, Table 5; Hirsch ea 2013.) + + hedId + HED_0042406 + + + inLibrary + score + + + + + Extreme-delta-brush + (Source: Beniczky ea 2017, Table 5.) + + suggestedTag + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + + + hedId + HED_0042407 + + + inLibrary + score + + + + + + Physiologic-pattern + EEG graphoelements or rhythms that are considered normal. They only should be scored if the physician considers that they have a specific clinical significance for the recording. (Source: Beniczky ea 2013, Appendix S1; Beniczky ea 2017, Table 14.) + + hedId + HED_0042408 + + + inLibrary + score + + + Rhythmic-activity-pattern + Rhythmic activity. (Source: Beniczky ea 2017, Table 14.) + + suggestedTag + Rhythmic-property + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + + + hedId + HED_0042409 + + + inLibrary + score + + + + Slow-alpha-variant-rhythm + Characteristic rhythms mostly at 4-5 Hz, recorded most prominently over the posterior regions of the head. The signals generally alternate or are intermixed with the alpha rhythm to which they are often harmonically related. Amplitude varies but is frequently close to 50 micro V. Blocked or attenuated by attention, especially visual, and mental effort. Comment: slow alpha variant rhythms should be distinguished from posterior slow waves characteristic of children and adolescents and occasionally seen in young adults. (Source: Beniczky ea 2013, Appendix S6; Beniczky ea 2017, Table 14.) + + suggestedTag + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + + + hedId + HED_0042410 + + + inLibrary + score + + + + Fast-alpha-variant-rhythm + Characteristic rhythm at 14-20 Hz, detected most prominently over the posterior regions of the head. May alternate or be intermixed with alpha rhythm. Blocked or attenuated by attention, especially visual, and mental effort. (Source: Beniczky ea 2013, Appendix S6; Beniczky ea 2017, Table 14.) + + suggestedTag + Appearance-mode + Discharge-pattern + + + hedId + HED_0042411 + + + inLibrary + score + + + + Lambda-wave + Diphasic sharp transient occurring over occipital regions of the head of waking subjects during visual exploration. The main component is positive relative to other areas. Time-locked to saccadic eye movement. Amplitude varies but is generally below 50 microV. (Source: Beniczky ea 2013; Appendix S6, Beniczky ea 2017, Table 14.) + + suggestedTag + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + + + hedId + HED_0042412 + + + inLibrary + score + + + + Posterior-slow-waves-youth + Waves in the delta and theta range, of variable form, lasting 0.35 to 0.5 s or longer without any consistent periodicity, found in the range of 6-12 years (occasionally seen in young adults). Alpha waves are almost always intermingled or superimposed. Reactive similar to alpha activity. (Source: Beniczky ea 2013; Appendix S6, Beniczky ea 2017, Table 14.) + + suggestedTag + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + + + hedId + HED_0042413 + + + inLibrary + score + + + + Diffuse-slowing-hyperventilation + Bilateral, diffuse slowing of brain signals during hyperventilation. Recorded in 70 percent of normal children (3-5 years) and less then 10 percent of adults. Slowing usually appears in the posterior regions and spreads forward in younger age groups, whereas slowing tends to appear in the frontal regions and spreads backward in the older age group. (Source: Beniczky ea 2013, Appendix S6; Beniczky ea 2017, Table 14.) + + suggestedTag + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + + + hedId + HED_0042414 + + + inLibrary + score + + + + Photic-driving + Physiologic response consisting of rhythmic activity elicited over the posterior regions of the head by repetitive photic stimulation at frequencies of about 5-30 Hz. Comments: term should be limited to activity time-locked to the stimulus and of frequency identical or harmonically related to the stimulus frequency. Photic driving should be distinguished from the visual evoked potentials elicited by isolated flashes of light or flashes repeated at very low frequency. (Source: Beniczky ea 2013; Appendix S6, Beniczky ea 2017, Table 14.) + + suggestedTag + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + + + hedId + HED_0042415 + + + inLibrary + score + + + + Photomyogenic-response + A response to intermittent photic stimulation characterized by the appearance in the record of brief, repetitive muscular artifacts (spikes) over the anterior regions of the head. These often increase gradually in amplitude as stimuli are continued and cease promptly when the stimulus is withdrawn. Comment: this response is frequently associated with flutter of the eyelids and vertical oscillations of the eyeballs and sometimes with discrete jerking mostly involving the musculature of the face and head. (Preferred to synonym: photo-myoclonic response). (Source: Beniczky ea 2013; Appendix S6, Beniczky ea 2017, Table 14.) + + suggestedTag + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + + + hedId + HED_0042416 + + + inLibrary + score + + + + Arousal-pattern + Arousal pattern in children. Prolonged, marked high voltage 4-6/s activity in all leads with some intermixed slower frequencies. (Source: Beniczky ea 2013, Appendix S6; Beniczky ea 2017, Table 14.) + + suggestedTag + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + + + hedId + HED_0042417 + + + inLibrary + score + + + + Frontal-arousal-rhythm + Prolonged (up to 20s) rhythmical sharp or spiky activity over the frontal areas (maximum over the frontal midline) seen at arousal from sleep in children with minimal cerebral dysfunction. (Source: Beniczky ea 2013, Appendix S6; Beniczky ea 2017, Table 14.) + + suggestedTag + Appearance-mode + Discharge-pattern + + + hedId + HED_0042418 + + + inLibrary + score + + + + Other-physiologic-pattern + + requireChild + + + hedId + HED_0042419 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042420 + + + inLibrary + score + + + + + + Polygraphic-channel-feature + Changes observed in polygraphic channels can be scored: EOG, Respiration, ECG, EMG, other polygraphic channel (+ free text), and their significance logged (normal, abnormal, no definite abnormality). (Source: Beniczky ea 2017, Section 13.) + + hedId + HED_0042421 + + + inLibrary + score + + + EOG-channel-feature + Electrooculogram (EOG) channel features. (Source: Beniczky ea 2017, Section 13.) + + suggestedTag + Feature-significance-to-recording + + + hedId + HED_0042422 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042423 + + + inLibrary + score + + + + + Respiration-channel-feature + Findings in respiration sensors. (Source: Beniczky ea 2017, Section 13, Table 16.) + + suggestedTag + Feature-significance-to-recording + + + hedId + HED_0042424 + + + inLibrary + score + + + Oxygen-saturation + Percentage. (Source: Beniczky ea 2013, Table 9; Beniczky ea 2017, Table 16.) + + requireChild + + + hedId + HED_0042425 + + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0042426 + + + inLibrary + score + + + + + Apnea + Temporary cessation of breathing (Source: Wikipedia). Duration (range in seconds). (Source: Beniczky ea 2013, Table 9.) + + hedId + HED_0042427 + + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0042428 + + + inLibrary + score + + + + + Hypopnea + Overly shallow breathing or an abnormally low respiratory rate. Duration (range in seconds). (Source: Wikipedia; Beniczky ea 2013, Table 9.) + + hedId + HED_0042429 + + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0042430 + + + inLibrary + score + + + + + Apnea-hypopnea-index + Events/hour as calculated by dividing the number of apnoea and hypopnoea events by the number of hours of sleep. (Source: Wikipedia; Beniczky ea 2013, Table 9.) + + suggestedTag + Frequency + + + hedId + HED_0042431 + + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0042432 + + + inLibrary + score + + + + + Periodic-respiration + Three or more episodes of central apnea lasting at least 4 seconds, separated by no more than 30 seconds of normal breathing. (Source:Wikipedia, Source: Beniczky ea 2017, Table 16 + + hedId + HED_0042433 + + + inLibrary + score + + + # + Free text.(Source: Beniczky ea 2017, Table 16.) + + takesValue + + + valueClass + textClass + + + hedId + HED_0042434 + + + inLibrary + score + + + + + Tachypnea + Numerical value for cycles / minute. (Source: Beniczky ea 2017, Table 16.) + + suggestedTag + Frequency + + + hedId + HED_0042435 + + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0042436 + + + inLibrary + score + + + + + Other-respiration-feature + Source: Beniczky ea 2017, Table 16 + + requireChild + + + hedId + HED_0042437 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042438 + + + inLibrary + score + + + + + + ECG-channel-feature + Findings in Electrocardiogram recordings. (Source: Beniczky ea 2017, Section 13, Table 16.) + + suggestedTag + Feature-significance-to-recording + + + hedId + HED_0042439 + + + inLibrary + score + + + ECG-QT-period + The time from the start of the Q wave to the end of the T wave (Source: Wikipedia; Beniczky ea 2013, Table 9; Beniczky ea 2017, Table 16.) + + requireChild + + + hedId + HED_0042440 + + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + hedId + HED_0042441 + + + inLibrary + score + + + + + ECG-normal-rhythm + Normal rhythm. (Source: Beniczky ea 2017, Table 16.) + + suggestedTag + Frequency + + + hedId + HED_0042442 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042443 + + + inLibrary + score + + + + + ECG-arrhythmia + Free text annotating characteristics of arrythymia. (Source: Beniczky ea 2017, Table 16.) + + hedId + HED_0042444 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042445 + + + inLibrary + score + + + + + ECG-asystolia + Absence of ventricular contractions in the context of a lethal heart arrhythmia. Duration in seconds of the absence. (Source: Wikipedia; Beniczky ea 2013, Table 9.) + + hedId + HED_0042446 + + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + hedId + HED_0042447 + + + inLibrary + score + + + + + ECG-bradycardia + A resting heart rate under 60 beats per minute. Numerical value for frequency in beats/minute. (Source: Wikipedia; Beniczky ea 2017, Table 16; Beniczky ea 2013, Table 9.) + + suggestedTag + Frequency + + + hedId + HED_0042448 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042449 + + + inLibrary + score + + + + + ECG-extrasystole + A heart rhythm disorder corresponding to a premature contraction of one of the chambers of the heart. (Source: Wikipedia; Beniczky ea 2017, Table 16.) + + hedId + HED_0042450 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042451 + + + inLibrary + score + + + + + ECG-ventricular-premature-depolarization + A premature ventricular contraction (PVC) is a common event where the heartbeat is initiated by Purkinje fibers in the ventricles rather than by the sinoatrial node. (Source: Wikipedia; Beniczky ea 2017, Table 16.) + + hedId + HED_0042452 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042453 + + + inLibrary + score + + + + + ECG-tachycardia + A resting heart rate over 100 beats per minute. Numerical value for frequency in beats/minute. (Source: Wikipedia, Source: Beniczky ea 2017, Table 16; Beniczky ea 2013, Table 9.) + + suggestedTag + Frequency + + + hedId + HED_0042454 + + + inLibrary + score + + + # + + takesValue + + + valueClass + textClass + + + hedId + HED_0042455 + + + inLibrary + score + + + + + Other-ECG-feature + Source: Beniczky ea 2017, Table 16. + + requireChild + + + hedId + HED_0042456 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042457 + + + inLibrary + score + + + + + + EMG-channel-feature + Findings in Electromyography recordings (Source: Beniczky ea 2017, Section 13, Table 16.). Suggested tags can be used to note the side of the muscle (Left or Right). The order of activation may be indicated using Temporal-relation: (Left, (Before,Right)). + + suggestedTag + Feature-significance-to-recording + Symmetrical + Left + Right + + + hedId + HED_0042458 + + + inLibrary + score + + + EMG-muscle-name + Source: Beniczky ea 2017, Table 16. + + requireChild + + + hedId + HED_0042459 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042460 + + + inLibrary + score + + + + + Myoclonus + Source: Beniczky ea 2017, Table 16. + + hedId + HED_0042461 + + + inLibrary + score + + + Negative-myoclonus + Source: Beniczky ea 2017, Table 16. + + hedId + HED_0042462 + + + inLibrary + score + + + + Myoclonus-rhythmic + Numerical value for frequency. (Source: Beniczky ea 2017, Table 16.) + + hedId + HED_0042463 + + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + hedId + HED_0042464 + + + inLibrary + score + + + + + Myoclonus-arrhythmic + Source: Beniczky ea 2017, Table 16. + + hedId + HED_0042465 + + + inLibrary + score + + + + Myoclonus-synchronous + Source: Beniczky ea 2017, Table 16. + + hedId + HED_0042466 + + + inLibrary + score + + + + Myoclonus-asynchronous + Source: Beniczky ea 2017, Table 16. + + hedId + HED_0042467 + + + inLibrary + score + + + + + PLMS + Periodic limb movements in sleep. (Source: Beniczky ea 2017, Table 16.) + + hedId + HED_0042468 + + + inLibrary + score + + + + Spasm + Source: Beniczky ea 2017, Table 16. + + hedId + HED_0042469 + + + inLibrary + score + + + + Tonic-contraction + Source: Beniczky ea 2017, Table 16. + + hedId + HED_0042470 + + + inLibrary + score + + + + Other-EMG-features + Source: Beniczky ea 2017, Table 16. + + requireChild + + + hedId + HED_0042471 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042472 + + + inLibrary + score + + + + + + Other-polygraphic-channel-feature + Add the name and type of the polygraphic channel as well as the feature in the description. (Source: Beniczky ea 2017, Section 13.) + + requireChild + + + hedId + HED_0042473 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042474 + + + inLibrary + score + + + + + + Sleep-and-drowsiness + The features of the ongoing activity during sleep are scored here. If abnormal graphoelements appear, disappear or change their morphology during sleep, that is not scored here but at the entry corresponding to that graphoelement (as a modulator). (Source: Beniczky ea 2013. Appendix S1.) + + hedId + HED_0042475 + + + inLibrary + score + + + Sleep-architecture + For longer recordings. Only to be scored if whole-night sleep is part of the recording. It is a global descriptor of the structure and pattern of sleep: estimation of the amount of time spent in REM and NREM sleep, sleep duration, NREM-REM cycle. (Source: Beniczky ea 2013, Appendix S3.) + + suggestedTag + Property-not-possible-to-determine + + + hedId + HED_0042476 + + + inLibrary + score + + + Normal-sleep-architecture + Recording containing sleep-patterns that are considered normal for the attained sleep stages and for the age. (Source: Benizcky ea 2013, Appendix S3.) + + hedId + HED_0042477 + + + inLibrary + score + + + + Abnormal-sleep-architecture + Absence or consistently marked amplitude asymmetry (>50%) of a normal sleep graphoelement. (Source: Benizcky ea 2013, Appendix S3.) + + hedId + HED_0042478 + + + inLibrary + score + + + + + Sleep-stage-reached + For normal sleep patterns the sleep stages reached during the recording can be specified. (Source: Beniczky ea 2017, Section 7.) + + requireChild + + + suggestedTag + Property-not-possible-to-determine + Feature-significance-to-recording + + + hedId + HED_0042479 + + + inLibrary + score + + + Sleep-stage-N1 + Sleep stage 1. (Source: Beniczky ea 2017, Section 7.) + + hedId + HED_0042480 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042481 + + + inLibrary + score + + + + + Sleep-stage-N2 + Sleep stage 2. (Source: Beniczky ea 2017, Section 7.) + + hedId + HED_0042482 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042483 + + + inLibrary + score + + + + + Sleep-stage-N3 + Sleep stage 3. (Source: Beniczky ea 2017, Section 7.) + + hedId + HED_0042484 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042485 + + + inLibrary + score + + + + + Sleep-stage-REM + Rapid eye movement. (Source: Beniczky ea 2017, Section 7.) + + hedId + HED_0042486 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042487 + + + inLibrary + score + + + + + + Sleep-spindles + Burst at 11-15 Hz but mostly at 12-14 Hz generally diffuse but of higher voltage over the central regions of the head, occurring during sleep. Amplitude varies but is mostly below 50 microV in the adult. (Source: Beniczky ea 2013, Appendix S3; Beniczky ea 2017, Section 7.) + + suggestedTag + Feature-significance-to-recording + Categorical-location-value + Sensor-list + Asymmetrical + Symmetrical + + + hedId + HED_0042488 + + + inLibrary + score + + + + Vertex-wave + Sharp potential, maximal at the vertex, negative relative to other areas, apparently occurring spontaneously during sleep or in response to a sensory stimulus during sleep or wakefulness. May be single or repetitive. Amplitude varies but rarely exceeds 250 microV. Abbreviation: V wave. Synonym: vertex sharp wave. (Source: Beniczky ea 2013, Appendix S3; Beniczky ea 2017, Section 7.) + + suggestedTag + Feature-significance-to-recording + Categorical-location-value + Sensor-list + Asymmetrical + Symmetrical + + + hedId + HED_0042489 + + + inLibrary + score + + + + K-complex + A burst of somewhat variable appearance, consisting most commonly of a high voltage negative slow wave followed by a smaller positive slow wave frequently associated with a sleep spindle. Duration greater than 0.5 s. Amplitude is generally maximal in the frontal vertex. K complexes occur during nonREM sleep, apparently spontaneously, or in response to sudden sensory / auditory stimuli, and are not specific for any individual sensory modality. (Source: Beniczky ea 2013, Appendix S3; Beniczky ea 2017, Section 7.) + + suggestedTag + Feature-significance-to-recording + Categorical-location-value + Sensor-list + Asymmetrical + Symmetrical + + + hedId + HED_0042490 + + + inLibrary + score + + + + Saw-tooth-waves + Vertex negative 2-5 Hz waves occurring in series during REM sleep. (Source: Beniczky ea 2013, Appendix S3; Beniczky ea 2017, Section 7.) + + suggestedTag + Feature-significance-to-recording + Categorical-location-value + Sensor-list + Asymmetrical + Symmetrical + + + hedId + HED_0042491 + + + inLibrary + score + + + + POSTS + Positive occipital sharp transients of sleep. Sharp transient maximal over the occipital regions, positive relative to other areas, apparently occurring spontaneously during sleep. May be single or repetitive. Amplitude varies but is generally below 50 microV. (Source: Beniczky ea 2013, Appendix S3; Beniczky ea 2017, Section 7.) + + suggestedTag + Feature-significance-to-recording + Categorical-location-value + Sensor-list + Asymmetrical + Symmetrical + + + hedId + HED_0042492 + + + inLibrary + score + + + + Hypnagogic-hypersynchrony + Hypnagogic/hypnopompic hypersynchrony in children. Bursts of bilateral, synchronous delta or theta activity of large amplitude, occasionally with superimposed faster components, occurring during falling asleep or during awakening, in children. (Source: Beniczky ea 2013, Appendix S3; Beniczky ea 2017, Section 7.) + + suggestedTag + Feature-significance-to-recording + Categorical-location-value + Sensor-list + Asymmetrical + Symmetrical + + + hedId + HED_0042493 + + + inLibrary + score + + + + Non-reactive-sleep + EEG activity consisting of normal sleep graphoelements, but which cannot be interrupted by external stimuli/ the patient cannot be wakened. (Source: Beniczky ea 2013, Appendix S3; Beniczky ea 2017, Section 7.) + + hedId + HED_0042494 + + + inLibrary + score + + + + + Uncertain-significant-pattern + EEG graphoelements or rhythms that resemble abnormal patterns but that are not necessarily associated with a pathology, and the physician does not consider them abnormal in the context of the scored recording (like normal variants and patterns). (Source: Beniczky ea 2013, Appendix S1; Beniczky ea 2017, Table 14.) + + hedId + HED_0042495 + + + inLibrary + score + + + Sharp-transient-pattern + Sharp transient. (Source: Beniczky ea 2017, Table 14.) + + suggestedTag + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + + + hedId + HED_0042496 + + + inLibrary + score + + + + Wicket-spikes + Spike-like monophasic negative single waves or trains of waves occurring over the temporal regions during drowsiness that have an arcuate or mu-like appearance. These are mainly seen in older individuals and represent a benign variant that is of little clinical significance. (Source: Beniczky ea 2013, Appendix S6; Beniczky ea 2017, Table 14.) + + hedId + HED_0042497 + + + inLibrary + score + + + + Small-sharp-spikes + Benign Epileptiform Transients of Sleep (BETS). Small Sharp Spikes (SSS) of very short duration and low amplitude, often followed by a small theta wave, occurring in the temporal regions during drowsiness and light sleep. They occur on one or both sides (often asynchronously). The main negative and positive components are of about equally spiky character. Rarely seen in children, they are seen most often in adults and the elderly. Two thirds of the patients have a history of epileptic seizures. (Source: Beniczky ea 2013, Appendix S6; Beniczky ea 2017, Table 14.) + + suggestedTag + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + + + hedId + HED_0042498 + + + inLibrary + score + + + + Fourteen-six-Hz-positive-burst + Burst of arch-shaped waves at 13-17 Hz and/or 5-7-Hz but most commonly at 14 and/or 6 Hz seen generally over the posterior temporal and adjacent areas of one or both sides of the head during sleep. The sharp peaks of its component waves are positive with respect to other regions. Amplitude varies but is generally below 75 micro V. Comments: (1) best demonstrated by referential recording using contralateral earlobe or other remote, reference electrodes. (2) This pattern has no established clinical significance. (Source: Beniczky ea 2013, Appendix S6; Beniczky ea 2017, Table 14.) + + suggestedTag + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + + + hedId + HED_0042499 + + + inLibrary + score + + + + Six-Hz-spike-slow-wave + Spike and slow wave complexes at 4-7 Hz, but mostly at 6 Hz occurring generally in brief bursts bilaterally and synchronously, symmetrically or asymmetrically, and either confined to or of larger amplitude over the posterior or anterior regions of the head. The spike has a strong positive component. Amplitude varies but is generally smaller than that of spike-and slow-wave complexes repeating at slower rates. Comment: this pattern should be distinguished from epileptiform discharges. Synonym: wave and spike phantom. (Source: Beniczky ea 2013, Appendix S6; Beniczky ea 2017, Table 14.) + + suggestedTag + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + + + hedId + HED_0042500 + + + inLibrary + score + + + + Rudimentary-spike-wave-complex + Synonym: pseudo petit mal discharge. Paroxysmal discharge that consists of generalized or nearly generalized high voltage 3 to 4/sec waves with poorly developed spike in the positive trough between the slow waves, occurring in drowsiness only. It is found only in infancy and early childhood when marked hypnagogic rhythmical theta activity is paramount in the drowsy state. (Source: Beniczky ea 2013, Appendix S6; Beniczky ea 2017, Table 14.) + + suggestedTag + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + + + hedId + HED_0042501 + + + inLibrary + score + + + + Slow-fused-transient + A posterior slow-wave preceded by a sharp-contoured potential that blends together with the ensuing slow wave, in children. (Source: Beniczky ea 2013, Appendix S6; Beniczky ea 2017, Table 14.) + + suggestedTag + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + + + hedId + HED_0042502 + + + inLibrary + score + + + + Needle-like-occipital-spikes-blind + Spike discharges of a particularly fast and needle-like character develop over the occipital region in most congenitally blind children. Completely disappear during childhood or adolescence. (Source: Beniczky ea 2013, Appendix S6; Beniczky ea 2017, Table 14.) + + suggestedTag + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + + + hedId + HED_0042503 + + + inLibrary + score + + + + Subclinical-rhythmic-EEG-discharge-adults + Subclinical Rhythmic EEG Discharge of Adults (SERDA). A rhythmic pattern seen in adults, mainly in the waking state or drowsiness. It consists of a mixture of frequencies, often predominant in the theta range. The onset may be fairly abrupt with widespread sharp rhythmical theta and occasionally with delta activity. As to the spatial distribution, a maximum of this discharge is usually found over the centroparietal region and especially over the vertex. It may resemble a seizure discharge but is not accompanied by any clinical signs or symptoms. (Source: Beniczky ea 2013, Appendix S6; Beniczky ea 2017, Table 14.) + + suggestedTag + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + + + hedId + HED_0042504 + + + inLibrary + score + + + + Rhythmic-temporal-theta-burst-drowsiness + Rhythmic temporal theta burst of drowsiness (RTTD). Characteristic burst of 4-7 Hz waves frequently notched by faster waves, occurring over the temporal regions of the head during drowsiness. Synonym: psychomotor variant pattern. Comment: this is a pattern of drowsiness that is of no clinical significance. (Source: Beniczky ea 2013, Appendix S6; Beniczky ea 2017, Table 14.) + + hedId + HED_0042505 + + + inLibrary + score + + + + Ciganek-rhythm + Ciganek rhythm (midline central theta) (Source: Beniczky ea 2017, Table 14.) + + suggestedTag + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + + + hedId + HED_0042506 + + + inLibrary + score + + + + Temporal-slowing-elderly + Focal theta and/or delta activity over the temporal regions, especially the left, in persons over the age of 60. Amplitudes are low/similar to the background activity. Comment: focal temporal theta was found in 20 percent of people between the ages of 40-59 years, and 40 percent of people between 60 and 79 years. One third of people older than 60 years had focal temporal delta activity. (Source: Beniczky ea 2013, Appendix S6; Beniczky ea 2017, Table 14.) + + suggestedTag + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + + + hedId + HED_0042507 + + + inLibrary + score + + + + Breach-rhythm + Rhythmical activity recorded over cranial bone defects. Usually it is in the 6 to 11/sec range and does not respond to movements. (Source: Beniczky ea 2013, Appendix S6; Beniczky ea 2017, Table 14.) + + suggestedTag + Categorical-location-value + Sensor-list + Appearance-mode + Discharge-pattern + + + hedId + HED_0042508 + + + inLibrary + score + + + + Other-uncertain-significant-pattern + + requireChild + + + hedId + HED_0042509 + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + hedId + HED_0042510 + + + inLibrary + score + + + + + + Event + Something that happens at a given time and (typically) place. Elements of this tag subtree designate the general category in which an event falls. + + suggestedTag + Task-property + + + hedId + HED_0012001 + + + Sensory-event + Something perceivable by the participant. An event meant to be an experimental stimulus should include the tag Task-property/Task-event-role/Experimental-stimulus. + + suggestedTag + Task-event-role + Sensory-presentation + + + hedId + HED_0012002 + + + + Agent-action + Any action engaged in by an agent (see the Agent subtree for agent categories). A participant response to an experiment stimulus should include the tag Agent-property/Agent-task-role/Experiment-participant. + + suggestedTag + Task-event-role + Agent + + + hedId + HED_0012003 + + + + Data-feature + An event marking the occurrence of a data feature such as an interictal spike or alpha burst that is often added post hoc to the data record. + + suggestedTag + Data-property + + + hedId + HED_0012004 + + + + Experiment-control + An event pertaining to the physical control of the experiment during its operation. + + hedId + HED_0012005 + + + + Experiment-procedure + An event indicating an experimental procedure, as in performing a saliva swab during the experiment or administering a survey. + + hedId + HED_0012006 + + + + Experiment-structure + An event specifying a change-point of the structure of experiment. This event is typically used to indicate a change in experimental conditions or tasks. + + hedId + HED_0012007 + + + + Measurement-event + A discrete measure returned by an instrument. + + suggestedTag + Data-property + + + hedId + HED_0012008 + + + + + Agent + Someone or something that takes an active role or produces a specified effect.The role or effect may be implicit. Being alive or performing an activity such as a computation may qualify something to be an agent. An agent may also be something that simulates something else. + + suggestedTag + Agent-property + + + hedId + HED_0012009 + + + Animal-agent + An agent that is an animal. + + hedId + HED_0012010 + + + + Avatar-agent + An agent associated with an icon or avatar representing another agent. + + hedId + HED_0012011 + + + + Controller-agent + Experiment control software or hardware. + + hedId + HED_0012012 + + + + Human-agent + A person who takes an active role or produces a specified effect. + + hedId + HED_0012013 + + + + Robotic-agent + An agent mechanical device capable of performing a variety of often complex tasks on command or by being programmed in advance. + + hedId + HED_0012014 + + + + Software-agent + An agent computer program that interacts with the participant in an active role such as an AI advisor. + + hedId + HED_0012015 + + + + + Action + Do something. + + extensionAllowed + + + hedId + HED_0012016 + + + Communicate + Action conveying knowledge of or about something. + + hedId + HED_0012017 + + + Communicate-gesturally + Communicate non-verbally using visible bodily actions, either in place of speech or together and in parallel with spoken words. Gestures include movement of the hands, face, or other parts of the body. + + relatedTag + Move-face + Move-upper-extremity + + + hedId + HED_0012018 + + + Clap-hands + Strike the palms of against one another resoundingly, and usually repeatedly, especially to express approval. + + hedId + HED_0012019 + + + + Clear-throat + Cough slightly so as to speak more clearly, attract attention, or to express hesitancy before saying something awkward. + + relatedTag + Move-face + Move-head + + + hedId + HED_0012020 + + + + Frown + Express disapproval, displeasure, or concentration, typically by turning down the corners of the mouth. + + relatedTag + Move-face + + + hedId + HED_0012021 + + + + Grimace + Make a twisted expression, typically expressing disgust, pain, or wry amusement. + + relatedTag + Move-face + + + hedId + HED_0012022 + + + + Nod-head + Tilt head in alternating up and down arcs along the sagittal plane. It is most commonly, but not universally, used to indicate agreement, acceptance, or acknowledgement. + + relatedTag + Move-head + + + hedId + HED_0012023 + + + + Pump-fist + Raise with fist clenched in triumph or affirmation. + + relatedTag + Move-upper-extremity + + + hedId + HED_0012024 + + + + Raise-eyebrows + Move eyebrows upward. + + relatedTag + Move-face + Move-eyes + + + hedId + HED_0012025 + + + + Shake-fist + Clench hand into a fist and shake to demonstrate anger. + + relatedTag + Move-upper-extremity + + + hedId + HED_0012026 + + + + Shake-head + Turn head from side to side as a way of showing disagreement or refusal. + + relatedTag + Move-head + + + hedId + HED_0012027 + + + + Shhh + Place finger over lips and possibly uttering the syllable shhh to indicate the need to be quiet. + + relatedTag + Move-upper-extremity + + + hedId + HED_0012028 + + + + Shrug + Lift shoulders up towards head to indicate a lack of knowledge about a particular topic. + + relatedTag + Move-upper-extremity + Move-torso + + + hedId + HED_0012029 + + + + Smile + Form facial features into a pleased, kind, or amused expression, typically with the corners of the mouth turned up and the front teeth exposed. + + relatedTag + Move-face + + + hedId + HED_0012030 + + + + Spread-hands + Spread hands apart to indicate ignorance. + + relatedTag + Move-upper-extremity + + + hedId + HED_0012031 + + + + Thumb-up + Extend the thumb upward to indicate approval. + + relatedTag + Move-upper-extremity + + + hedId + HED_0012032 + + + + Thumbs-down + Extend the thumb downward to indicate disapproval. + + relatedTag + Move-upper-extremity + + + hedId + HED_0012033 + + + + Wave + Raise hand and move left and right, as a greeting or sign of departure. + + relatedTag + Move-upper-extremity + + + hedId + HED_0012034 + + + + Widen-eyes + Open eyes and possibly with eyebrows lifted especially to express surprise or fear. + + relatedTag + Move-face + Move-eyes + + + hedId + HED_0012035 + + + + Wink + Close and open one eye quickly, typically to indicate that something is a joke or a secret or as a signal of affection or greeting. + + relatedTag + Move-face + Move-eyes + + + hedId + HED_0012036 + + + + + Communicate-musically + Communicate using music. + + hedId + HED_0012037 + + + Hum + Make a low, steady continuous sound like that of a bee. Sing with the lips closed and without uttering speech. + + hedId + HED_0012038 + + + + Play-instrument + Make musical sounds using an instrument. + + hedId + HED_0012039 + + + + Sing + Produce musical tones by means of the voice. + + hedId + HED_0012040 + + + + Vocalize + Utter vocal sounds. + + hedId + HED_0012041 + + + + Whistle + Produce a shrill clear sound by forcing breath out or air in through the puckered lips. + + hedId + HED_0012042 + + + + + Communicate-vocally + Communicate using mouth or vocal cords. + + hedId + HED_0012043 + + + Cry + Shed tears associated with emotions, usually sadness but also joy or frustration. + + hedId + HED_0012044 + + + + Groan + Make a deep inarticulate sound in response to pain or despair. + + hedId + HED_0012045 + + + + Laugh + Make the spontaneous sounds and movements of the face and body that are the instinctive expressions of lively amusement and sometimes also of contempt or derision. + + hedId + HED_0012046 + + + + Scream + Make loud, vociferous cries or yells to express pain, excitement, or fear. + + hedId + HED_0012047 + + + + Shout + Say something very loudly. + + hedId + HED_0012048 + + + + Sigh + Emit a long, deep, audible breath expressing sadness, relief, tiredness, or a similar feeling. + + hedId + HED_0012049 + + + + Speak + Communicate using spoken language. + + hedId + HED_0012050 + + + + Whisper + Speak very softly using breath without vocal cords. + + hedId + HED_0012051 + + + + + + Move + Move in a specified direction or manner. Change position or posture. + + hedId + HED_0012052 + + + Breathe + Inhale or exhale during respiration. + + hedId + HED_0012053 + + + Blow + Expel air through pursed lips. + + hedId + HED_0012054 + + + + Cough + Suddenly and audibly expel air from the lungs through a partially closed glottis, preceded by inhalation. + + hedId + HED_0012055 + + + + Exhale + Blow out or expel breath. + + hedId + HED_0012056 + + + + Hiccup + Involuntarily spasm the diaphragm and respiratory organs, with a sudden closure of the glottis and a characteristic sound like that of a cough. + + hedId + HED_0012057 + + + + Hold-breath + Interrupt normal breathing by ceasing to inhale or exhale. + + hedId + HED_0012058 + + + + Inhale + Draw in with the breath through the nose or mouth. + + hedId + HED_0012059 + + + + Sneeze + Suddenly and violently expel breath through the nose and mouth. + + hedId + HED_0012060 + + + + Sniff + Draw in air audibly through the nose to detect a smell, to stop it from running, or to express contempt. + + hedId + HED_0012061 + + + + + Move-body + Move entire body. + + hedId + HED_0012062 + + + Bend + Move body in a bowed or curved manner. + + hedId + HED_0012063 + + + + Dance + Perform a purposefully selected sequences of human movement often with aesthetic or symbolic value. Move rhythmically to music, typically following a set sequence of steps. + + hedId + HED_0012064 + + + + Fall-down + Lose balance and collapse. + + hedId + HED_0012065 + + + + Flex + Cause a muscle to stand out by contracting or tensing it. Bend a limb or joint. + + hedId + HED_0012066 + + + + Jerk + Make a quick, sharp, sudden movement. + + hedId + HED_0012067 + + + + Lie-down + Move to a horizontal or resting position. + + hedId + HED_0012068 + + + + Recover-balance + Return to a stable, upright body position. + + hedId + HED_0012069 + + + + Shudder + Tremble convulsively, sometimes as a result of fear or revulsion. + + hedId + HED_0012070 + + + + Sit-down + Move from a standing to a sitting position. + + hedId + HED_0012071 + + + + Sit-up + Move from lying down to a sitting position. + + hedId + HED_0012072 + + + + Stand-up + Move from a sitting to a standing position. + + hedId + HED_0012073 + + + + Stretch + Straighten or extend body or a part of body to its full length, typically so as to tighten muscles or in order to reach something. + + hedId + HED_0012074 + + + + Stumble + Trip or momentarily lose balance and almost fall. + + hedId + HED_0012075 + + + + Turn + Change or cause to change direction. + + hedId + HED_0012076 + + + + + Move-body-part + Move one part of a body. + + hedId + HED_0012077 + + + Move-eyes + Move eyes. + + hedId + HED_0012078 + + + Blink + Shut and open the eyes quickly. + + hedId + HED_0012079 + + + + Close-eyes + Lower and keep eyelids in a closed position. + + hedId + HED_0012080 + + + + Fixate + Direct eyes to a specific point or target. + + hedId + HED_0012081 + + + + Inhibit-blinks + Purposely prevent blinking. + + hedId + HED_0012082 + + + + Open-eyes + Raise eyelids to expose pupil. + + hedId + HED_0012083 + + + + Saccade + Move eyes rapidly between fixation points. + + hedId + HED_0012084 + + + + Squint + Squeeze one or both eyes partly closed in an attempt to see more clearly or as a reaction to strong light. + + hedId + HED_0012085 + + + + Stare + Look fixedly or vacantly at someone or something with eyes wide open. + + hedId + HED_0012086 + + + + + Move-face + Move the face or jaw. + + hedId + HED_0012087 + + + Bite + Seize with teeth or jaws an object or organism so as to grip or break the surface covering. + + hedId + HED_0012088 + + + + Burp + Noisily release air from the stomach through the mouth. Belch. + + hedId + HED_0012089 + + + + Chew + Repeatedly grinding, tearing, and or crushing with teeth or jaws. + + hedId + HED_0012090 + + + + Gurgle + Make a hollow bubbling sound like that made by water running out of a bottle. + + hedId + HED_0012091 + + + + Swallow + Cause or allow something, especially food or drink to pass down the throat. + + hedId + HED_0012092 + + + Gulp + Swallow quickly or in large mouthfuls, often audibly, sometimes to indicate apprehension. + + hedId + HED_0012093 + + + + + Yawn + Take a deep involuntary inhalation with the mouth open often as a sign of drowsiness or boredom. + + hedId + HED_0012094 + + + + + Move-head + Move head. + + hedId + HED_0012095 + + + Lift-head + Tilt head back lifting chin. + + hedId + HED_0012096 + + + + Lower-head + Move head downward so that eyes are in a lower position. + + hedId + HED_0012097 + + + + Turn-head + Rotate head horizontally to look in a different direction. + + hedId + HED_0012098 + + + + + Move-lower-extremity + Move leg and/or foot. + + hedId + HED_0012099 + + + Curl-toes + Bend toes sometimes to grip. + + hedId + HED_0012100 + + + + Hop + Jump on one foot. + + hedId + HED_0012101 + + + + Jog + Run at a trot to exercise. + + hedId + HED_0012102 + + + + Jump + Move off the ground or other surface through sudden muscular effort in the legs. + + hedId + HED_0012103 + + + + Kick + Strike out or flail with the foot or feet.Strike using the leg, in unison usually with an area of the knee or lower using the foot. + + hedId + HED_0012104 + + + + Pedal + Move by working the pedals of a bicycle or other machine. + + hedId + HED_0012105 + + + + Press-foot + Move by pressing foot. + + hedId + HED_0012106 + + + + Run + Travel on foot at a fast pace. + + hedId + HED_0012107 + + + + Step + Put one leg in front of the other and shift weight onto it. + + hedId + HED_0012108 + + + Heel-strike + Strike the ground with the heel during a step. + + hedId + HED_0012109 + + + + Toe-off + Push with toe as part of a stride. + + hedId + HED_0012110 + + + + + Trot + Run at a moderate pace, typically with short steps. + + hedId + HED_0012111 + + + + Walk + Move at a regular pace by lifting and setting down each foot in turn never having both feet off the ground at once. + + hedId + HED_0012112 + + + + + Move-torso + Move body trunk. + + hedId + HED_0012113 + + + + Move-upper-extremity + Move arm, shoulder, and/or hand. + + hedId + HED_0012114 + + + Drop + Let or cause to fall vertically. + + hedId + HED_0012115 + + + + Grab + Seize suddenly or quickly. Snatch or clutch. + + hedId + HED_0012116 + + + + Grasp + Seize and hold firmly. + + hedId + HED_0012117 + + + + Hold-down + Prevent someone or something from moving by holding them firmly. + + hedId + HED_0012118 + + + + Lift + Raising something to higher position. + + hedId + HED_0012119 + + + + Make-fist + Close hand tightly with the fingers bent against the palm. + + hedId + HED_0012120 + + + + Point + Draw attention to something by extending a finger or arm. + + hedId + HED_0012121 + + + + Press + Apply pressure to something to flatten, shape, smooth or depress it. This action tag should be used to indicate key presses and mouse clicks. + + relatedTag + Push + + + hedId + HED_0012122 + + + + Push + Apply force in order to move something away. Use Press to indicate a key press or mouse click. + + relatedTag + Press + + + hedId + HED_0012123 + + + + Reach + Stretch out your arm in order to get or touch something. + + hedId + HED_0012124 + + + + Release + Make available or set free. + + hedId + HED_0012125 + + + + Retract + Draw or pull back. + + hedId + HED_0012126 + + + + Scratch + Drag claws or nails over a surface or on skin. + + hedId + HED_0012127 + + + + Snap-fingers + Make a noise by pushing second finger hard against thumb and then releasing it suddenly so that it hits the base of the thumb. + + hedId + HED_0012128 + + + + Touch + Come into or be in contact with. + + hedId + HED_0012129 + + + + + + + Perceive + Produce an internal, conscious image through stimulating a sensory system. + + hedId + HED_0012130 + + + Hear + Give attention to a sound. + + hedId + HED_0012131 + + + + See + Direct gaze toward someone or something or in a specified direction. + + hedId + HED_0012132 + + + + Sense-by-touch + Sense something through receptors in the skin. + + hedId + HED_0012133 + + + + Smell + Inhale in order to ascertain an odor or scent. + + hedId + HED_0012134 + + + + Taste + Sense a flavor in the mouth and throat on contact with a substance. + + hedId + HED_0012135 + + + + + Perform + Carry out or accomplish an action, task, or function. + + hedId + HED_0012136 + + + Close + Act as to blocked against entry or passage. + + hedId + HED_0012137 + + + + Collide-with + Hit with force when moving. + + hedId + HED_0012138 + + + + Halt + Bring or come to an abrupt stop. + + hedId + HED_0012139 + + + + Modify + Change something. + + hedId + HED_0012140 + + + + Open + Widen an aperture, door, or gap, especially one allowing access to something. + + hedId + HED_0012141 + + + + Operate + Control the functioning of a machine, process, or system. + + hedId + HED_0012142 + + + + Play + Engage in activity for enjoyment and recreation rather than a serious or practical purpose. + + hedId + HED_0012143 + + + + Read + Interpret something that is written or printed. + + hedId + HED_0012144 + + + + Repeat + Make do or perform again. + + hedId + HED_0012145 + + + + Rest + Be inactive in order to regain strength, health, or energy. + + hedId + HED_0012146 + + + + Ride + Ride on an animal or in a vehicle. Ride conveys some notion that another agent has partial or total control of the motion. + + hedId + HED_0012147 + + + + Write + Communicate or express by means of letters or symbols written or imprinted on a surface. + + hedId + HED_0012148 + + + + + Think + Direct the mind toward someone or something or use the mind actively to form connected ideas. + + hedId + HED_0012149 + + + Allow + Allow access to something such as allowing a car to pass. + + hedId + HED_0012150 + + + + Attend-to + Focus mental experience on specific targets. + + hedId + HED_0012151 + + + + Count + Tally items either silently or aloud. + + hedId + HED_0012152 + + + + Deny + Refuse to give or grant something requested or desired by someone. + + hedId + HED_0012153 + + + + Detect + Discover or identify the presence or existence of something. + + hedId + HED_0012154 + + + + Discriminate + Recognize a distinction. + + hedId + HED_0012155 + + + + Encode + Convert information or an instruction into a particular form. + + hedId + HED_0012156 + + + + Evade + Escape or avoid, especially by cleverness or trickery. + + hedId + HED_0012157 + + + + Generate + Cause something, especially an emotion or situation to arise or come about. + + hedId + HED_0012158 + + + + Identify + Establish or indicate who or what someone or something is. + + hedId + HED_0012159 + + + + Imagine + Form a mental image or concept of something. + + hedId + HED_0012160 + + + + Judge + Evaluate evidence to make a decision or form a belief. + + hedId + HED_0012161 + + + + Learn + Adaptively change behavior as the result of experience. + + hedId + HED_0012162 + + + + Memorize + Adaptively change behavior as the result of experience. + + hedId + HED_0012163 + + + + Plan + Think about the activities required to achieve a desired goal. + + hedId + HED_0012164 + + + + Predict + Say or estimate that something will happen or will be a consequence of something without having exact information. + + hedId + HED_0012165 + + + + Recall + Remember information by mental effort. + + hedId + HED_0012166 + + + + Recognize + Identify someone or something from having encountered them before. + + hedId + HED_0012167 + + + + Respond + React to something such as a treatment or a stimulus. + + hedId + HED_0012168 + + + + Switch-attention + Transfer attention from one focus to another. + + hedId + HED_0012169 + + + + Track + Follow a person, animal, or object through space or time. + + hedId + HED_0012170 + + + + + + Item + An independently existing thing (living or nonliving). + + extensionAllowed + + + hedId + HED_0012171 + + + Biological-item + An entity that is biological, that is related to living organisms. + + hedId + HED_0012172 + + + Anatomical-item + A biological structure, system, fluid or other substance excluding single molecular entities. + + hedId + HED_0012173 + + + Body + The biological structure representing an organism. + + hedId + HED_0012174 + + + + Body-part + Any part of an organism. + + hedId + HED_0012175 + + + Head + The upper part of the human body, or the front or upper part of the body of an animal, typically separated from the rest of the body by a neck, and containing the brain, mouth, and sense organs. + + hedId + HED_0012176 + + + + Head-part + A part of the head. + + hedId + HED_0013200 + + + Brain + Organ inside the head that is made up of nerve cells and controls the body. + + hedId + HED_0012177 + + + + Brain-region + A region of the brain. + + hedId + HED_0013201 + + + Cerebellum + A major structure of the brain located near the brainstem. It plays a key role in motor control, coordination, precision, with contributions to different cognitive functions. + + hedId + HED_0013202 + + + + Frontal-lobe + + hedId + HED_0012178 + + + + Occipital-lobe + + hedId + HED_0012179 + + + + Parietal-lobe + + hedId + HED_0012180 + + + + Temporal-lobe + + hedId + HED_0012181 + + + + + Ear + A sense organ needed for the detection of sound and for establishing balance. + + hedId + HED_0012182 + + + + Face + The anterior portion of the head extending from the forehead to the chin and ear to ear. The facial structures contain the eyes, nose and mouth, cheeks and jaws. + + hedId + HED_0012183 + + + + Face-part + A part of the face. + + hedId + HED_0013203 + + + Cheek + The fleshy part of the face bounded by the eyes, nose, ear, and jawline. + + hedId + HED_0012184 + + + + Chin + The part of the face below the lower lip and including the protruding part of the lower jaw. + + hedId + HED_0012185 + + + + Eye + The organ of sight or vision. + + hedId + HED_0012186 + + + + Eyebrow + The arched strip of hair on the bony ridge above each eye socket. + + hedId + HED_0012187 + + + + Eyelid + The folds of the skin that cover the eye when closed. + + hedId + HED_0012188 + + + + Forehead + The part of the face between the eyebrows and the normal hairline. + + hedId + HED_0012189 + + + + Lip + Fleshy fold which surrounds the opening of the mouth. + + hedId + HED_0012190 + + + + Mouth + The proximal portion of the digestive tract, containing the oral cavity and bounded by the oral opening. + + hedId + HED_0012191 + + + + Mouth-part + A part of the mouth. + + hedId + HED_0013204 + + + Teeth + The hard bone-like structures in the jaws. A collection of teeth arranged in some pattern in the mouth or other part of the body. + + hedId + HED_0012193 + + + + Tongue + A muscular organ in the mouth with significant role in mastication, swallowing, speech, and taste. + + hedId + HED_0013205 + + + + + Nose + A structure of special sense serving as an organ of the sense of smell and as an entrance to the respiratory tract. + + hedId + HED_0012192 + + + + + Hair + The filamentous outgrowth of the epidermis. + + hedId + HED_0012194 + + + + + Lower-extremity + Refers to the whole inferior limb (leg and/or foot). + + hedId + HED_0012195 + + + + Lower-extremity-part + A part of the lower extremity. + + hedId + HED_0013206 + + + Ankle + A gliding joint between the distal ends of the tibia and fibula and the proximal end of the talus. + + hedId + HED_0012196 + + + + Foot + The structure found below the ankle joint required for locomotion. + + hedId + HED_0012198 + + + + Foot-part + A part of the foot. + + hedId + HED_0013207 + + + Heel + The back of the foot below the ankle. + + hedId + HED_0012200 + + + + Instep + The part of the foot between the ball and the heel on the inner side. + + hedId + HED_0012201 + + + + Toe + A digit of the foot. + + hedId + HED_0013208 + + + Big-toe + The largest toe on the inner side of the foot. + + hedId + HED_0012199 + + + + Little-toe + The smallest toe located on the outer side of the foot. + + hedId + HED_0012202 + + + + + Toes + The terminal digits of the foot. Used to describe collective attributes of all toes, such as bending all toes + + relatedTag + Toe + + + hedId + HED_0012203 + + + + + Knee + A joint connecting the lower part of the femur with the upper part of the tibia. + + hedId + HED_0012204 + + + + Lower-leg + The part of the leg between the knee and the ankle. + + hedId + HED_0013209 + + + + Lower-leg-part + A part of the lower leg. + + hedId + HED_0013210 + + + Calf + The fleshy part at the back of the leg below the knee. + + hedId + HED_0012197 + + + + Shin + Front part of the leg below the knee. + + hedId + HED_0012205 + + + + + Upper-leg + The part of the leg between the hip and the knee. + + hedId + HED_0013211 + + + + Upper-leg-part + A part of the upper leg. + + hedId + HED_0013212 + + + Thigh + Upper part of the leg between hip and knee. + + hedId + HED_0012206 + + + + + + Neck + The part of the body connecting the head to the torso, containing the cervical spine and vital pathways of nerves, blood vessels, and the airway. + + hedId + HED_0013213 + + + + Torso + The body excluding the head and neck and limbs. + + hedId + HED_0012207 + + + + Torso-part + A part of the torso. + + hedId + HED_0013214 + + + Abdomen + The part of the body between the thorax and the pelvis. + + hedId + HED_0013215 + + + + Navel + The central mark on the abdomen created by the detachment of the umbilical cord after birth. + + hedId + HED_0013216 + + + + Pelvis + The bony structure at the base of the spine supporting the legs. + + hedId + HED_0013217 + + + + Pelvis-part + A part of the pelvis. + + hedId + HED_0013218 + + + Buttocks + The round fleshy parts that form the lower rear area of a human trunk. + + hedId + HED_0012208 + + + + Genitalia + The external organs of reproduction and urination, located in the pelvic region. This includes both male and female genital structures. + + hedId + HED_0013219 + + + + Gentalia + The external organs of reproduction. Deprecated due to spelling error. Use Genitalia. + + deprecatedFrom + 8.1.0 + + + hedId + HED_0012209 + + + + Hip + The lateral prominence of the pelvis from the waist to the thigh. + + hedId + HED_0012210 + + + + + Torso-back + The rear surface of the human body from the shoulders to the hips. + + hedId + HED_0012211 + + + + Torso-chest + The anterior side of the thorax from the neck to the abdomen. + + hedId + HED_0012212 + + + + Viscera + Internal organs of the body. + + hedId + HED_0012213 + + + + Waist + The abdominal circumference at the navel. + + hedId + HED_0012214 + + + + + Upper-extremity + Refers to the whole superior limb (shoulder, arm, elbow, wrist, hand). + + hedId + HED_0012215 + + + + Upper-extremity-part + A part of the upper extremity. + + hedId + HED_0013220 + + + Elbow + A type of hinge joint located between the forearm and upper arm. + + hedId + HED_0012216 + + + + Forearm + Lower part of the arm between the elbow and wrist. + + hedId + HED_0012217 + + + + Forearm-part + A part of the forearm. + + hedId + HED_0013221 + + + + Hand + The distal portion of the upper extremity. It consists of the carpus, metacarpus, and digits. + + hedId + HED_0012218 + + + + Hand-part + A part of the hand. + + hedId + HED_0013222 + + + Finger + Any of the digits of the hand. + + hedId + HED_0012219 + + + Index-finger + The second finger from the radial side of the hand, next to the thumb. + + hedId + HED_0012220 + + + + Little-finger + The fifth and smallest finger from the radial side of the hand. + + hedId + HED_0012221 + + + + Middle-finger + The middle or third finger from the radial side of the hand. + + hedId + HED_0012222 + + + + Ring-finger + The fourth finger from the radial side of the hand. + + hedId + HED_0012223 + + + + Thumb + The thick and short hand digit which is next to the index finger in humans. + + hedId + HED_0012224 + + + + + Fingers + The terminal digits of the hand. Used to describe collective attributes of all fingers, such as bending all fingers + + relatedTag + Finger + + + hedId + HED_0013223 + + + + Knuckles + A part of a finger at a joint where the bone is near the surface, especially where the finger joins the hand. + + hedId + HED_0012225 + + + + Palm + The part of the inner surface of the hand that extends from the wrist to the bases of the fingers. + + hedId + HED_0012226 + + + + + Shoulder + Joint attaching upper arm to trunk. + + hedId + HED_0012227 + + + + Upper-arm + Portion of arm between shoulder and elbow. + + hedId + HED_0012228 + + + + Upper-arm-part + A part of the upper arm. + + hedId + HED_0013224 + + + + Wrist + A joint between the distal end of the radius and the proximal row of carpal bones. + + hedId + HED_0012229 + + + + + + + Organism + A living entity, more specifically a biological entity that consists of one or more cells and is capable of genomic replication (independently or not). + + hedId + HED_0012230 + + + Animal + A living organism that has membranous cell walls, requires oxygen and organic foods, and is capable of voluntary movement. + + hedId + HED_0012231 + + + + Human + The bipedal primate mammal Homo sapiens. + + hedId + HED_0012232 + + + + Plant + Any living organism that typically synthesizes its food from inorganic substances and possesses cellulose cell walls. + + hedId + HED_0012233 + + + + + + Language-item + An entity related to a systematic means of communicating by the use of sounds, symbols, or gestures. + + suggestedTag + Sensory-presentation + + + hedId + HED_0012234 + + + Character + A mark or symbol used in writing. + + hedId + HED_0012235 + + + + Clause + A unit of grammatical organization next below the sentence in rank, usually consisting of a subject and predicate. + + hedId + HED_0012236 + + + + Glyph + A hieroglyphic character, symbol, or pictograph. + + hedId + HED_0012237 + + + + Nonword + An unpronounceable group of letters or speech sounds that is surrounded by white space when written, is not accepted as a word by native speakers. + + hedId + HED_0012238 + + + + Paragraph + A distinct section of a piece of writing, usually dealing with a single theme. + + hedId + HED_0012239 + + + + Phoneme + Any of the minimally distinct units of sound in a specified language that distinguish one word from another. + + hedId + HED_0012240 + + + + Phrase + A phrase is a group of words functioning as a single unit in the syntax of a sentence. + + hedId + HED_0012241 + + + + Pseudoword + A pronounceable group of letters or speech sounds that looks or sounds like a word but that is not accepted as such by native speakers. + + hedId + HED_0012242 + + + + Sentence + A set of words that is complete in itself, conveying a statement, question, exclamation, or command and typically containing an explicit or implied subject and a predicate containing a finite verb. + + hedId + HED_0012243 + + + + Syllable + A unit of pronunciation having a vowel or consonant sound, with or without surrounding consonants, forming the whole or a part of a word. + + hedId + HED_0012244 + + + + Textblock + A block of text. + + hedId + HED_0012245 + + + + Word + A single distinct meaningful element of speech or writing, used with others (or sometimes alone) to form a sentence and typically surrounded by white space when written or printed. + + hedId + HED_0012246 + + + + + Object + Something perceptible by one or more of the senses, especially by vision or touch. A material thing. + + suggestedTag + Sensory-presentation + + + hedId + HED_0012247 + + + Geometric-object + An object or a representation that has structure and topology in space. + + hedId + HED_0012248 + + + 2D-shape + A planar, two-dimensional shape. + + hedId + HED_0012249 + + + Arrow + A shape with a pointed end indicating direction. + + hedId + HED_0012250 + + + + Clockface + The dial face of a clock. A location identifier based on clock-face-position numbering or anatomic subregion. + + hedId + HED_0012251 + + + + Cross + A figure or mark formed by two intersecting lines crossing at their midpoints. + + hedId + HED_0012252 + + + + Dash + A horizontal stroke in writing or printing to mark a pause or break in sense or to represent omitted letters or words. + + hedId + HED_0012253 + + + + Ellipse + A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base. + + hedId + HED_0012254 + + + Circle + A ring-shaped structure with every point equidistant from the center. + + hedId + HED_0012255 + + + + + Rectangle + A parallelogram with four right angles. + + hedId + HED_0012256 + + + Square + A square is a special rectangle with four equal sides. + + hedId + HED_0012257 + + + + + Single-point + A point is a geometric entity that is located in a zero-dimensional spatial region and whose position is defined by its coordinates in some coordinate system. + + hedId + HED_0012258 + + + + Star + A conventional or stylized representation of a star, typically one having five or more points. + + hedId + HED_0012259 + + + + Triangle + A three-sided polygon. + + hedId + HED_0012260 + + + + + 3D-shape + A geometric three-dimensional shape. + + hedId + HED_0012261 + + + Box + A square or rectangular vessel, usually made of cardboard or plastic. + + hedId + HED_0012262 + + + Cube + A solid or semi-solid in the shape of a three dimensional square. + + hedId + HED_0012263 + + + + + Cone + A shape whose base is a circle and whose sides taper up to a point. + + hedId + HED_0012264 + + + + Cylinder + A surface formed by circles of a given radius that are contained in a plane perpendicular to a given axis, whose centers align on the axis. + + hedId + HED_0012265 + + + + Ellipsoid + A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base. + + hedId + HED_0012266 + + + Sphere + A solid or hollow three-dimensional object bounded by a closed surface such that every point on the surface is equidistant from the center. + + hedId + HED_0012267 + + + + + Pyramid + A polyhedron of which one face is a polygon of any number of sides, and the other faces are triangles with a common vertex. + + hedId + HED_0012268 + + + + + Pattern + An arrangement of objects, facts, behaviors, or other things which have scientific, mathematical, geometric, statistical, or other meaning. + + hedId + HED_0012269 + + + Dots + A small round mark or spot. + + hedId + HED_0012270 + + + + LED-pattern + A pattern created by lighting selected members of a fixed light emitting diode array. + + hedId + HED_0012271 + + + + + + Ingestible-object + Something that can be taken into the body by the mouth for digestion or absorption. + + hedId + HED_0012272 + + + + Man-made-object + Something constructed by human means. + + hedId + HED_0012273 + + + Building + A structure that has a roof and walls and stands more or less permanently in one place. + + hedId + HED_0012274 + + + Attic + A room or a space immediately below the roof of a building. + + hedId + HED_0012275 + + + + Basement + The part of a building that is wholly or partly below ground level. + + hedId + HED_0012276 + + + + Entrance + The means or place of entry. + + hedId + HED_0012277 + + + + Roof + A roof is the covering on the uppermost part of a building which provides protection from animals and weather, notably rain, but also heat, wind and sunlight. + + hedId + HED_0012278 + + + + Room + An area within a building enclosed by walls and floor and ceiling. + + hedId + HED_0012279 + + + + + Clothing + A covering designed to be worn on the body. + + hedId + HED_0012280 + + + + Device + An object contrived for a specific purpose. + + hedId + HED_0012281 + + + Assistive-device + A device that help an individual accomplish a task. + + hedId + HED_0012282 + + + Glasses + Frames with lenses worn in front of the eye for vision correction, eye protection, or protection from UV rays. + + hedId + HED_0012283 + + + + Writing-device + A device used for writing. + + hedId + HED_0012284 + + + Pen + A common writing instrument used to apply ink to a surface for writing or drawing. + + hedId + HED_0012285 + + + + Pencil + An implement for writing or drawing that is constructed of a narrow solid pigment core in a protective casing that prevents the core from being broken or marking the hand. + + hedId + HED_0012286 + + + + + + Computing-device + An electronic device which take inputs and processes results from the inputs. + + hedId + HED_0012287 + + + Cellphone + A telephone with access to a cellular radio system so it can be used over a wide area, without a physical connection to a network. + + hedId + HED_0012288 + + + + Desktop-computer + A computer suitable for use at an ordinary desk. + + hedId + HED_0012289 + + + + Laptop-computer + A computer that is portable and suitable for use while traveling. + + hedId + HED_0012290 + + + + Tablet-computer + A small portable computer that accepts input directly on to its screen rather than via a keyboard or mouse. + + hedId + HED_0012291 + + + + + Engine + A motor is a machine designed to convert one or more forms of energy into mechanical energy. + + hedId + HED_0012292 + + + + IO-device + Hardware used by a human (or other system) to communicate with a computer. + + hedId + HED_0012293 + + + Input-device + A piece of equipment used to provide data and control signals to an information processing system such as a computer or information appliance. + + hedId + HED_0012294 + + + Computer-mouse + A hand-held pointing device that detects two-dimensional motion relative to a surface. + + hedId + HED_0012295 + + + Mouse-button + An electric switch on a computer mouse which can be pressed or clicked to select or interact with an element of a graphical user interface. + + hedId + HED_0012296 + + + + Scroll-wheel + A scroll wheel or mouse wheel is a wheel used for scrolling made of hard plastic with a rubbery surface usually located between the left and right mouse buttons and is positioned perpendicular to the mouse surface. + + hedId + HED_0012297 + + + + + Joystick + A control device that uses a movable handle to create two-axis input for a computer device. + + hedId + HED_0012298 + + + + Keyboard + A device consisting of mechanical keys that are pressed to create input to a computer. + + hedId + HED_0012299 + + + Keyboard-key + A button on a keyboard usually representing letters, numbers, functions, or symbols. + + hedId + HED_0012300 + + + # + Value of a keyboard key. + + takesValue + + + hedId + HED_0012301 + + + + + + Keypad + A device consisting of keys, usually in a block arrangement, that provides limited input to a system. + + hedId + HED_0012302 + + + Keypad-key + A key on a separate section of a computer keyboard that groups together numeric keys and those for mathematical or other special functions in an arrangement like that of a calculator. + + hedId + HED_0012303 + + + # + Value of keypad key. + + takesValue + + + hedId + HED_0012304 + + + + + + Microphone + A device designed to convert sound to an electrical signal. + + hedId + HED_0012305 + + + + Push-button + A switch designed to be operated by pressing a button. + + hedId + HED_0012306 + + + + + Output-device + Any piece of computer hardware equipment which converts information into human understandable form. + + hedId + HED_0012307 + + + Auditory-device + A device designed to produce sound. + + hedId + HED_0012308 + + + Headphones + An instrument that consists of a pair of small loudspeakers, or less commonly a single speaker, held close to ears and connected to a signal source such as an audio amplifier, radio, CD player or portable media player. + + hedId + HED_0012309 + + + + Loudspeaker + A device designed to convert electrical signals to sounds that can be heard. + + hedId + HED_0012310 + + + + + Display-device + An output device for presentation of information in visual or tactile form the latter used for example in tactile electronic displays for blind people. + + hedId + HED_0012311 + + + Computer-screen + An electronic device designed as a display or a physical device designed to be a protective mesh work. + + hedId + HED_0012312 + + + Screen-window + A part of a computer screen that contains a display different from the rest of the screen. A window is a graphical control element consisting of a visual area containing some of the graphical user interface of the program it belongs to and is framed by a window decoration. + + hedId + HED_0012313 + + + + + Head-mounted-display + An instrument that functions as a display device, worn on the head or as part of a helmet, that has a small display optic in front of one (monocular HMD) or each eye (binocular HMD). + + hedId + HED_0012314 + + + + LED-display + A LED display is a flat panel display that uses an array of light-emitting diodes as pixels for a video display. + + hedId + HED_0012315 + + + + + + Recording-device + A device that copies information in a signal into a persistent information bearer. + + hedId + HED_0012316 + + + EEG-recorder + A device for recording electric currents in the brain using electrodes applied to the scalp, to the surface of the brain, or placed within the substance of the brain. + + hedId + HED_0012317 + + + + EMG-recorder + A device for recording electrical activity of muscles using electrodes on the body surface or within the muscular mass. + + hedId + HED_0013225 + + + + File-storage + A device for recording digital information to a permanent media. + + hedId + HED_0012318 + + + + MEG-recorder + A device for measuring the magnetic fields produced by electrical activity in the brain, usually conducted externally. + + hedId + HED_0012319 + + + + Motion-capture + A device for recording the movement of objects or people. + + hedId + HED_0012320 + + + + Tape-recorder + A device for recording and reproduction usually using magnetic tape for storage that can be saved and played back. + + hedId + HED_0012321 + + + + + Touchscreen + A control component that operates an electronic device by pressing the display on the screen. + + hedId + HED_0012322 + + + + + Machine + A human-made device that uses power to apply forces and control movement to perform an action. + + hedId + HED_0012323 + + + + Measurement-device + A device that measures something. + + hedId + HED_0012324 + + + Clock + A device designed to indicate the time of day or to measure the time duration of an event or action. + + hedId + HED_0012325 + + + + + Robot + A mechanical device that sometimes resembles a living animal and is capable of performing a variety of often complex human tasks on command or by being programmed in advance. + + hedId + HED_0012327 + + + + Tool + A component that is not part of a device but is designed to support its assembly or operation. + + hedId + HED_0012328 + + + + + Document + A physical object, or electronic counterpart, that is characterized by containing writing which is meant to be human-readable. + + hedId + HED_0012329 + + + Book + A volume made up of pages fastened along one edge and enclosed between protective covers. + + hedId + HED_0012330 + + + + Letter + A written message addressed to a person or organization. + + hedId + HED_0012331 + + + + Note + A brief written record. + + hedId + HED_0012332 + + + + Notebook + A book for notes or memoranda. + + hedId + HED_0012333 + + + + Questionnaire + A document consisting of questions and possibly responses, depending on whether it has been filled out. + + hedId + HED_0012334 + + + + + Furnishing + Furniture, fittings, and other decorative accessories, such as curtains and carpets, for a house or room. + + hedId + HED_0012335 + + + + Manufactured-material + Substances created or extracted from raw materials. + + hedId + HED_0012336 + + + Ceramic + A hard, brittle, heat-resistant and corrosion-resistant material made by shaping and then firing a nonmetallic mineral, such as clay, at a high temperature. + + hedId + HED_0012337 + + + + Glass + A brittle transparent solid with irregular atomic structure. + + hedId + HED_0012338 + + + + Paper + A thin sheet material produced by mechanically or chemically processing cellulose fibres derived from wood, rags, grasses or other vegetable sources in water. + + hedId + HED_0012339 + + + + Plastic + Various high-molecular-weight thermoplastic or thermo-setting polymers that are capable of being molded, extruded, drawn, or otherwise shaped and then hardened into a form. + + hedId + HED_0012340 + + + + Steel + An alloy made up of iron with typically a few tenths of a percent of carbon to improve its strength and fracture resistance compared to iron. + + hedId + HED_0012341 + + + + + Media + Media are audio/visual/audiovisual modes of communicating information for mass consumption. + + hedId + HED_0012342 + + + Media-clip + A short segment of media. + + hedId + HED_0012343 + + + Audio-clip + A short segment of audio. + + hedId + HED_0012344 + + + + Audiovisual-clip + A short media segment containing both audio and video. + + hedId + HED_0012345 + + + + Video-clip + A short segment of video. + + hedId + HED_0012346 + + + + + Visualization + An planned process that creates images, diagrams or animations from the input data. + + hedId + HED_0012347 + + + Animation + A form of graphical illustration that changes with time to give a sense of motion or represent dynamic changes in the portrayal. + + hedId + HED_0012348 + + + + Art-installation + A large-scale, mixed-media constructions, often designed for a specific place or for a temporary period of time. + + hedId + HED_0012349 + + + + Braille + A display using a system of raised dots that can be read with the fingers by people who are blind. + + hedId + HED_0012350 + + + + Image + Any record of an imaging event whether physical or electronic. + + hedId + HED_0012351 + + + Cartoon + A type of illustration, sometimes animated, typically in a non-realistic or semi-realistic style. The specific meaning has evolved over time, but the modern usage usually refers to either an image or series of images intended for satire, caricature, or humor. A motion picture that relies on a sequence of illustrations for its animation. + + hedId + HED_0012352 + + + + Drawing + A representation of an object or outlining a figure, plan, or sketch by means of lines. + + hedId + HED_0012353 + + + + Icon + A sign (such as a word or graphic symbol) whose form suggests its meaning. + + hedId + HED_0012354 + + + + Painting + A work produced through the art of painting. + + hedId + HED_0012355 + + + + Photograph + An image recorded by a camera. + + hedId + HED_0012356 + + + + + Movie + A sequence of images displayed in succession giving the illusion of continuous movement. + + hedId + HED_0012357 + + + + Outline-visualization + A visualization consisting of a line or set of lines enclosing or indicating the shape of an object in a sketch or diagram. + + hedId + HED_0012358 + + + + Point-light-visualization + A display in which action is depicted using a few points of light, often generated from discrete sensors in motion capture. + + hedId + HED_0012359 + + + + Sculpture + A two- or three-dimensional representative or abstract forms, especially by carving stone or wood or by casting metal or plaster. + + hedId + HED_0012360 + + + + Stick-figure-visualization + A drawing showing the head of a human being or animal as a circle and all other parts as straight lines. + + hedId + HED_0012361 + + + + + + Navigational-object + An object whose purpose is to assist directed movement from one location to another. + + hedId + HED_0012362 + + + Path + A trodden way. A way or track laid down for walking or made by continual treading. + + hedId + HED_0012363 + + + + Road + An open way for the passage of vehicles, persons, or animals on land. + + hedId + HED_0012364 + + + Lane + A defined path with physical dimensions through which an object or substance may traverse. + + hedId + HED_0012365 + + + + + Runway + A paved strip of ground on a landing field for the landing and takeoff of aircraft. + + hedId + HED_0012366 + + + + + Vehicle + A mobile machine which transports people or cargo. + + hedId + HED_0012367 + + + Aircraft + A vehicle which is able to travel through air in an atmosphere. + + hedId + HED_0012368 + + + + Bicycle + A human-powered, pedal-driven, single-track vehicle, having two wheels attached to a frame, one behind the other. + + hedId + HED_0012369 + + + + Boat + A watercraft of any size which is able to float or plane on water. + + hedId + HED_0012370 + + + + Car + A wheeled motor vehicle used primarily for the transportation of human passengers. + + hedId + HED_0012371 + + + + Cart + A cart is a vehicle which has two wheels and is designed to transport human passengers or cargo. + + hedId + HED_0012372 + + + + Tractor + A mobile machine specifically designed to deliver a high tractive effort at slow speeds, and mainly used for the purposes of hauling a trailer or machinery used in agriculture or construction. + + hedId + HED_0012373 + + + + Train + A connected line of railroad cars with or without a locomotive. + + hedId + HED_0012374 + + + + Truck + A motor vehicle which, as its primary function, transports cargo rather than human passengers. + + hedId + HED_0012375 + + + + + + Natural-object + Something that exists in or is produced by nature, and is not artificial or man-made. + + hedId + HED_0012376 + + + Mineral + A solid, homogeneous, inorganic substance occurring in nature and having a definite chemical composition. + + hedId + HED_0012377 + + + + Natural-feature + A feature that occurs in nature. A prominent or identifiable aspect, region, or site of interest. + + hedId + HED_0012378 + + + Field + An unbroken expanse as of ice or grassland. + + hedId + HED_0012379 + + + + Hill + A rounded elevation of limited extent rising above the surrounding land with local relief of less than 300m. + + hedId + HED_0012380 + + + + Mountain + A landform that extends above the surrounding terrain in a limited area. + + hedId + HED_0012381 + + + + River + A natural freshwater surface stream of considerable volume and a permanent or seasonal flow, moving in a definite channel toward a sea, lake, or another river. + + hedId + HED_0012382 + + + + Waterfall + A sudden descent of water over a step or ledge in the bed of a river. + + hedId + HED_0012383 + + + + + + + Sound + Mechanical vibrations transmitted by an elastic medium. Something that can be heard. + + hedId + HED_0012384 + + + Environmental-sound + Sounds occurring in the environment. An accumulation of noise pollution that occurs outside. This noise can be caused by transport, industrial, and recreational activities. + + hedId + HED_0012385 + + + Crowd-sound + Noise produced by a mixture of sounds from a large group of people. + + hedId + HED_0012386 + + + + Signal-noise + Any part of a signal that is not the true or original signal but is introduced by the communication mechanism. + + hedId + HED_0012387 + + + + + Musical-sound + Sound produced by continuous and regular vibrations, as opposed to noise. + + hedId + HED_0012388 + + + Instrument-sound + Sound produced by a musical instrument. + + hedId + HED_0012389 + + + + Tone + A musical note, warble, or other sound used as a particular signal on a telephone or answering machine. + + hedId + HED_0012390 + + + + Vocalized-sound + Musical sound produced by vocal cords in a biological agent. + + hedId + HED_0012391 + + + + + Named-animal-sound + A sound recognizable as being associated with particular animals. + + hedId + HED_0012392 + + + Barking + Sharp explosive cries like sounds made by certain animals, especially a dog, fox, or seal. + + hedId + HED_0012393 + + + + Bleating + Wavering cries like sounds made by a sheep, goat, or calf. + + hedId + HED_0012394 + + + + Chirping + Short, sharp, high-pitched noises like sounds made by small birds or an insects. + + hedId + HED_0012395 + + + + Crowing + Loud shrill sounds characteristic of roosters. + + hedId + HED_0012396 + + + + Growling + Low guttural sounds like those that made in the throat by a hostile dog or other animal. + + hedId + HED_0012397 + + + + Meowing + Vocalizations like those made by as those cats. These sounds have diverse tones and are sometimes chattered, murmured or whispered. The purpose can be assertive. + + hedId + HED_0012398 + + + + Mooing + Deep vocal sounds like those made by a cow. + + hedId + HED_0012399 + + + + Purring + Low continuous vibratory sound such as those made by cats. The sound expresses contentment. + + hedId + HED_0012400 + + + + Roaring + Loud, deep, or harsh prolonged sounds such as those made by big cats and bears for long-distance communication and intimidation. + + hedId + HED_0012401 + + + + Squawking + Loud, harsh noises such as those made by geese. + + hedId + HED_0012402 + + + + + Named-object-sound + A sound identifiable as coming from a particular type of object. + + hedId + HED_0012403 + + + Alarm-sound + A loud signal often loud continuous ringing to alert people to a problem or condition that requires urgent attention. + + hedId + HED_0012404 + + + + Beep + A short, single tone, that is typically high-pitched and generally made by a computer or other machine. + + hedId + HED_0012405 + + + + Buzz + A persistent vibratory sound often made by a buzzer device and used to indicate something incorrect. + + hedId + HED_0012406 + + + + Click + The sound made by a mechanical cash register, often to designate a reward. + + hedId + HED_0012407 + + + + Ding + A short ringing sound such as that made by a bell, often to indicate a correct response or the expiration of time. + + hedId + HED_0012408 + + + + Horn-blow + A loud sound made by forcing air through a sound device that funnels air to create the sound, often used to sound an alert. + + hedId + HED_0012409 + + + + Ka-ching + The sound made by a mechanical cash register, often to designate a reward. + + hedId + HED_0012410 + + + + Siren + A loud, continuous sound often varying in frequency designed to indicate an emergency. + + hedId + HED_0012411 + + + + + + + Property + Something that pertains to a thing. A characteristic of some entity. A quality or feature regarded as a characteristic or inherent part of someone or something. HED attributes are adjectives or adverbs. + + extensionAllowed + + + hedId + HED_0012412 + + + Agent-property + Something that pertains to or describes an agent. + + hedId + HED_0012413 + + + Agent-state + The state of the agent. + + hedId + HED_0012414 + + + Agent-cognitive-state + The state of the cognitive processes or state of mind of the agent. + + hedId + HED_0012415 + + + Alert + Condition of heightened watchfulness or preparation for action. + + hedId + HED_0012416 + + + + Anesthetized + Having lost sensation to pain or having senses dulled due to the effects of an anesthetic. + + hedId + HED_0012417 + + + + Asleep + Having entered a periodic, readily reversible state of reduced awareness and metabolic activity, usually accompanied by physical relaxation and brain activity. + + hedId + HED_0012418 + + + + Attentive + Concentrating and focusing mental energy on the task or surroundings. + + hedId + HED_0012419 + + + + Awake + In a non sleeping state. + + hedId + HED_0012420 + + + + Brain-dead + Characterized by the irreversible absence of cortical and brain stem functioning. + + hedId + HED_0012421 + + + + Comatose + In a state of profound unconsciousness associated with markedly depressed cerebral activity. + + hedId + HED_0012422 + + + + Distracted + Lacking in concentration because of being preoccupied. + + hedId + HED_0012423 + + + + Drowsy + In a state of near-sleep, a strong desire for sleep, or sleeping for unusually long periods. + + hedId + HED_0012424 + + + + Intoxicated + In a state with disturbed psychophysiological functions and responses as a result of administration or ingestion of a psychoactive substance. + + hedId + HED_0012425 + + + + Locked-in + In a state of complete paralysis of all voluntary muscles except for the ones that control the movements of the eyes. + + hedId + HED_0012426 + + + + Passive + Not responding or initiating an action in response to a stimulus. + + hedId + HED_0012427 + + + + Resting + A state in which the agent is not exhibiting any physical exertion. + + hedId + HED_0012428 + + + + Vegetative + A state of wakefulness and conscience, but (in contrast to coma) with involuntary opening of the eyes and movements (such as teeth grinding, yawning, or thrashing of the extremities). + + hedId + HED_0012429 + + + + + Agent-emotional-state + The status of the general temperament and outlook of an agent. + + hedId + HED_0012430 + + + Angry + Experiencing emotions characterized by marked annoyance or hostility. + + hedId + HED_0012431 + + + + Aroused + In a state reactive to stimuli leading to increased heart rate and blood pressure, sensory alertness, mobility and readiness to respond. + + hedId + HED_0012432 + + + + Awed + Filled with wonder. Feeling grand, sublime or powerful emotions characterized by a combination of joy, fear, admiration, reverence, and/or respect. + + hedId + HED_0012433 + + + + Compassionate + Feeling or showing sympathy and concern for others often evoked for a person who is in distress and associated with altruistic motivation. + + hedId + HED_0012434 + + + + Content + Feeling satisfaction with things as they are. + + hedId + HED_0012435 + + + + Disgusted + Feeling revulsion or profound disapproval aroused by something unpleasant or offensive. + + hedId + HED_0012436 + + + + Emotionally-neutral + Feeling neither satisfied nor dissatisfied. + + hedId + HED_0012437 + + + + Empathetic + Understanding and sharing the feelings of another. Being aware of, being sensitive to, and vicariously experiencing the feelings, thoughts, and experience of another. + + hedId + HED_0012438 + + + + Excited + Feeling great enthusiasm and eagerness. + + hedId + HED_0012439 + + + + Fearful + Feeling apprehension that one may be in danger. + + hedId + HED_0012440 + + + + Frustrated + Feeling annoyed as a result of being blocked, thwarted, disappointed or defeated. + + hedId + HED_0012441 + + + + Grieving + Feeling sorrow in response to loss, whether physical or abstract. + + hedId + HED_0012442 + + + + Happy + Feeling pleased and content. + + hedId + HED_0012443 + + + + Jealous + Feeling threatened by a rival in a relationship with another individual, in particular an intimate partner, usually involves feelings of threat, fear, suspicion, distrust, anxiety, anger, betrayal, and rejection. + + hedId + HED_0012444 + + + + Joyful + Feeling delight or intense happiness. + + hedId + HED_0012445 + + + + Loving + Feeling a strong positive emotion of affection and attraction. + + hedId + HED_0012446 + + + + Relieved + No longer feeling pain, distress,anxiety, or reassured. + + hedId + HED_0012447 + + + + Sad + Feeling grief or unhappiness. + + hedId + HED_0012448 + + + + Stressed + Experiencing mental or emotional strain or tension. + + hedId + HED_0012449 + + + + + Agent-physiological-state + Having to do with the mechanical, physical, or biochemical function of an agent. + + hedId + HED_0012450 + + + Catamenial + Related to menstruation. + + hedId + HED_0013226 + + + + Fever + Body temperature above the normal range. + + relatedTag + Sick + + + hedId + HED_0013227 + + + + Healthy + Having no significant health-related issues. + + relatedTag + Sick + + + hedId + HED_0012451 + + + + Hungry + Being in a state of craving or desiring food. + + relatedTag + Sated + Thirsty + + + hedId + HED_0012452 + + + + Rested + Feeling refreshed and relaxed. + + relatedTag + Tired + + + hedId + HED_0012453 + + + + Sated + Feeling full. + + relatedTag + Hungry + + + hedId + HED_0012454 + + + + Sick + Being in a state of ill health, bodily malfunction, or discomfort. + + relatedTag + Healthy + + + hedId + HED_0012455 + + + + Thirsty + Feeling a need to drink. + + relatedTag + Hungry + + + hedId + HED_0012456 + + + + Tired + Feeling in need of sleep or rest. + + relatedTag + Rested + + + hedId + HED_0012457 + + + + + Agent-postural-state + Pertaining to the position in which agent holds their body. + + hedId + HED_0012458 + + + Crouching + Adopting a position where the knees are bent and the upper body is brought forward and down, sometimes to avoid detection or to defend oneself. + + hedId + HED_0012459 + + + + Eyes-closed + Keeping eyes closed with no blinking. + + hedId + HED_0012460 + + + + Eyes-open + Keeping eyes open with occasional blinking. + + hedId + HED_0012461 + + + + Kneeling + Positioned where one or both knees are on the ground. + + hedId + HED_0012462 + + + + On-treadmill + Ambulation on an exercise apparatus with an endless moving belt to support moving in place. + + hedId + HED_0012463 + + + + Prone + Positioned in a recumbent body position whereby the person lies on its stomach and faces downward. + + hedId + HED_0012464 + + + + Seated-with-chin-rest + Using a device that supports the chin and head. + + hedId + HED_0012465 + + + + Sitting + In a seated position. + + hedId + HED_0012466 + + + + Standing + Assuming or maintaining an erect upright position. + + hedId + HED_0012467 + + + + + + Agent-task-role + The function or part that is ascribed to an agent in performing the task. + + hedId + HED_0012468 + + + Experiment-actor + An agent who plays a predetermined role to create the experiment scenario. + + hedId + HED_0012469 + + + + Experiment-controller + An agent exerting control over some aspect of the experiment. + + hedId + HED_0012470 + + + + Experiment-participant + Someone who takes part in an activity related to an experiment. + + hedId + HED_0012471 + + + + Experimenter + Person who is the owner of the experiment and has its responsibility. + + hedId + HED_0012472 + + + + + Agent-trait + A genetically, environmentally, or socially determined characteristic of an agent. + + hedId + HED_0012473 + + + Age + Length of time elapsed time since birth of the agent. + + hedId + HED_0012474 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012475 + + + + + Agent-experience-level + Amount of skill or knowledge that the agent has as pertains to the task. + + hedId + HED_0012476 + + + Expert-level + Having comprehensive and authoritative knowledge of or skill in a particular area related to the task. + + relatedTag + Intermediate-experience-level + Novice-level + + + hedId + HED_0012477 + + + + Intermediate-experience-level + Having a moderate amount of knowledge or skill related to the task. + + relatedTag + Expert-level + Novice-level + + + hedId + HED_0012478 + + + + Novice-level + Being inexperienced in a field or situation related to the task. + + relatedTag + Expert-level + Intermediate-experience-level + + + hedId + HED_0012479 + + + + + Ethnicity + Belong to a social group that has a common national or cultural tradition. Use with Label to avoid extension. + + hedId + HED_0012480 + + + + Gender + Characteristics that are socially constructed, including norms, behaviors, and roles based on sex. + + hedId + HED_0012481 + + + + Handedness + Individual preference for use of a hand, known as the dominant hand. + + hedId + HED_0012482 + + + Ambidextrous + Having no overall dominance in the use of right or left hand or foot in the performance of tasks that require one hand or foot. + + hedId + HED_0012483 + + + + Left-handed + Preference for using the left hand or foot for tasks requiring the use of a single hand or foot. + + hedId + HED_0012484 + + + + Right-handed + Preference for using the right hand or foot for tasks requiring the use of a single hand or foot. + + hedId + HED_0012485 + + + + + Race + Belonging to a group sharing physical or social qualities as defined within a specified society. Use with Label to avoid extension. + + hedId + HED_0012486 + + + + Sex + Physical properties or qualities by which male is distinguished from female. + + hedId + HED_0012487 + + + Female + Biological sex of an individual with female sexual organs such ova. + + hedId + HED_0012488 + + + + Intersex + Having genitalia and/or secondary sexual characteristics of indeterminate sex. + + hedId + HED_0012489 + + + + Male + Biological sex of an individual with male sexual organs producing sperm. + + hedId + HED_0012490 + + + + Other-sex + A non-specific designation of sexual traits. + + hedId + HED_0012491 + + + + + + + Data-property + Something that pertains to data or information. + + extensionAllowed + + + hedId + HED_0012492 + + + Data-artifact + An anomalous, interfering, or distorting signal originating from a source other than the item being studied. + + hedId + HED_0012493 + + + Biological-artifact + A data artifact arising from a biological entity being measured. + + hedId + HED_0012494 + + + Chewing-artifact + Artifact from moving the jaw in a chewing motion. + + hedId + HED_0012495 + + + + ECG-artifact + An electrical artifact from the far-field potential from pulsation of the heart, time locked to QRS complex. + + hedId + HED_0012496 + + + + EMG-artifact + Artifact from muscle activity and myogenic potentials at the measurements site. In EEG, myogenic potentials are the most common artifacts. Frontalis and temporalis muscles (e.g. clenching of jaw muscles) are common causes. Generally, the potentials generated in the muscles are of shorter duration than those generated in the brain. The frequency components are usually beyond 30-50 Hz, and the bursts are arrhythmic. + + hedId + HED_0012497 + + + + Eye-artifact + Ocular movements and blinks can result in artifacts in different types of data. In electrophysiology data, these can result transients and offsets the signal. + + hedId + HED_0012498 + + + Eye-blink-artifact + Artifact from eye blinking. In EEG, Fp1/Fp2 electrodes become electro-positive with eye closure because the cornea is positively charged causing a negative deflection in Fp1/Fp2. If the eye blink is unilateral, consider prosthetic eye. + + hedId + HED_0012499 + + + + Eye-movement-artifact + Eye movements can cause artifacts on recordings. The charge of the eye can especially cause artifacts in electrophysiology data. + + hedId + HED_0012500 + + + Horizontal-eye-movement-artifact + Artifact from moving eyes left-to-right and right-to-left. In EEG, there is an upward deflection in the Fp2-F8 derivation, when the eyes move to the right side. In this case F8 becomes more positive and therefore. When the eyes move to the left, F7 becomes more positive and there is an upward deflection in the Fp1-F7 derivation. + + hedId + HED_0012501 + + + + Nystagmus-artifact + Artifact from nystagmus (a vision condition in which the eyes make repetitive, uncontrolled movements). + + hedId + HED_0012502 + + + + Slow-eye-movement-artifact + Artifacts originating from slow, rolling eye-movements, seen during drowsiness. + + hedId + HED_0012503 + + + + Vertical-eye-movement-artifact + Artifact from moving eyes up and down. In EEG, this causes positive potentials (50-100 micro V) with bi-frontal distribution, maximum at Fp1 and Fp2, when the eyeball rotates upward. The downward rotation of the eyeball is associated with the negative deflection. The time course of the deflections is similar to the time course of the eyeball movement. + + hedId + HED_0012504 + + + + + + Movement-artifact + Artifact in the measured data generated by motion of the subject. + + hedId + HED_0012505 + + + + Pulse-artifact + A mechanical artifact from a pulsating blood vessel near a measurement site, cardio-ballistic artifact. + + hedId + HED_0012506 + + + + Respiration-artifact + Artifact from breathing. + + hedId + HED_0012507 + + + + Rocking-patting-artifact + Quasi-rhythmical artifacts in recordings most commonly seen in infants. Typically caused by a caregiver rocking or patting the infant. + + hedId + HED_0012508 + + + + Sucking-artifact + Artifact from sucking, typically seen in very young cases. + + hedId + HED_0012509 + + + + Sweat-artifact + Artifact from sweating. In EEG, this is a low amplitude undulating waveform that is usually greater than 2 seconds and may appear to be an unstable baseline. + + hedId + HED_0012510 + + + + Tongue-movement-artifact + Artifact from tongue movement (Glossokinetic). The tongue functions as a dipole, with the tip negative with respect to the base. In EEG, the artifact produced by the tongue has a broad potential field that drops from frontal to occipital areas, although it is less steep than that produced by eye movement artifacts. The amplitude of the potentials is greater inferiorly than in parasagittal regions; the frequency is variable but usually in the delta range. Chewing and sucking can produce similar artifacts. + + hedId + HED_0012511 + + + + + Nonbiological-artifact + A data artifact arising from a non-biological source. + + hedId + HED_0012512 + + + Artificial-ventilation-artifact + Artifact stemming from mechanical ventilation. These can occur at the same rate as the ventilator, but also have other patterns. + + hedId + HED_0012513 + + + + Dialysis-artifact + Artifacts seen in recordings during continuous renal replacement therapy (dialysis). + + hedId + HED_0012514 + + + + Electrode-movement-artifact + Artifact from electrode movement. + + hedId + HED_0012515 + + + + Electrode-pops-artifact + Brief artifact with a steep rise and slow fall of an electrophysiological signal, most often caused by a loose electrode. + + hedId + HED_0012516 + + + + Induction-artifact + Artifacts induced by nearby equipment. In EEG, these are usually of high frequency. + + hedId + HED_0012517 + + + + Line-noise-artifact + Power line noise at 50 Hz or 60 Hz. + + hedId + HED_0012518 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + hedId + HED_0012519 + + + + + Salt-bridge-artifact + Artifact from salt-bridge between EEG electrodes. + + hedId + HED_0012520 + + + + + + Data-marker + An indicator placed to mark something. + + hedId + HED_0012521 + + + Data-break-marker + An indicator place to indicate a gap in the data. + + hedId + HED_0012522 + + + + Temporal-marker + An indicator placed at a particular time in the data. + + hedId + HED_0012523 + + + Inset + Marks an intermediate point in an ongoing event of temporal extent. + + topLevelTagGroup + + + reserved + + + relatedTag + Onset + Offset + + + hedId + HED_0012524 + + + + Offset + Marks the end of an event of temporal extent. + + topLevelTagGroup + + + reserved + + + relatedTag + Onset + Inset + + + hedId + HED_0012525 + + + + Onset + Marks the start of an ongoing event of temporal extent. + + topLevelTagGroup + + + reserved + + + relatedTag + Inset + Offset + + + hedId + HED_0012526 + + + + Pause + Indicates the temporary interruption of the operation of a process and subsequently a wait for a signal to continue. + + hedId + HED_0012527 + + + + Time-out + A cancellation or cessation that automatically occurs when a predefined interval of time has passed without a certain event occurring. + + hedId + HED_0012528 + + + + Time-sync + A synchronization signal whose purpose is to help synchronize different signals or processes. Often used to indicate a marker inserted into the recorded data to allow post hoc synchronization of concurrently recorded data streams. + + hedId + HED_0012529 + + + + + + Data-resolution + Smallest change in a quality being measured by an sensor that causes a perceptible change. + + hedId + HED_0012530 + + + Printer-resolution + Resolution of a printer, usually expressed as the number of dots-per-inch for a printer. + + hedId + HED_0012531 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012532 + + + + + Screen-resolution + Resolution of a screen, usually expressed as the of pixels in a dimension for a digital display device. + + hedId + HED_0012533 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012534 + + + + + Sensory-resolution + Resolution of measurements by a sensing device. + + hedId + HED_0012535 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012536 + + + + + Spatial-resolution + Linear spacing of a spatial measurement. + + hedId + HED_0012537 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012538 + + + + + Spectral-resolution + Measures the ability of a sensor to resolve features in the electromagnetic spectrum. + + hedId + HED_0012539 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012540 + + + + + Temporal-resolution + Measures the ability of a sensor to resolve features in time. + + hedId + HED_0012541 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012542 + + + + + + Data-source-type + The type of place, person, or thing from which the data comes or can be obtained. + + hedId + HED_0012543 + + + Computed-feature + A feature computed from the data by a tool. This tag should be grouped with a label of the form Toolname_propertyName. + + hedId + HED_0012544 + + + + Computed-prediction + A computed extrapolation of known data. + + hedId + HED_0012545 + + + + Expert-annotation + An explanatory or critical comment or other in-context information provided by an authority. + + hedId + HED_0012546 + + + + Instrument-measurement + Information obtained from a device that is used to measure material properties or make other observations. + + hedId + HED_0012547 + + + + Observation + Active acquisition of information from a primary source. Should be grouped with a label of the form AgentID_featureName. + + hedId + HED_0012548 + + + + + Data-value + Designation of the type of a data item. + + hedId + HED_0012549 + + + Categorical-value + Indicates that something can take on a limited and usually fixed number of possible values. + + hedId + HED_0012550 + + + Categorical-class-value + Categorical values that fall into discrete classes such as true or false. The grouping is absolute in the sense that it is the same for all participants. + + hedId + HED_0012551 + + + All + To a complete degree or to the full or entire extent. + + relatedTag + Some + None + + + hedId + HED_0012552 + + + + Correct + Free from error. Especially conforming to fact or truth. + + relatedTag + Wrong + + + hedId + HED_0012553 + + + + Explicit + Stated clearly and in detail, leaving no room for confusion or doubt. + + relatedTag + Implicit + + + hedId + HED_0012554 + + + + False + Not in accordance with facts, reality or definitive criteria. + + relatedTag + True + + + hedId + HED_0012555 + + + + Implicit + Implied though not plainly expressed. + + relatedTag + Explicit + + + hedId + HED_0012556 + + + + Invalid + Not allowed or not conforming to the correct format or specifications. + + relatedTag + Valid + + + hedId + HED_0012557 + + + + None + No person or thing, nobody, not any. + + relatedTag + All + Some + + + hedId + HED_0012558 + + + + Some + At least a small amount or number of, but not a large amount of, or often. + + relatedTag + All + None + + + hedId + HED_0012559 + + + + True + Conforming to facts, reality or definitive criteria. + + relatedTag + False + + + hedId + HED_0012560 + + + + Unknown + The information has not been provided. + + relatedTag + Invalid + + + hedId + HED_0012561 + + + + Valid + Allowable, usable, or acceptable. + + relatedTag + Invalid + + + hedId + HED_0012562 + + + + Wrong + Inaccurate or not correct. + + relatedTag + Correct + + + hedId + HED_0012563 + + + + + Categorical-judgment-value + Categorical values that are based on the judgment or perception of the participant such familiar and famous. + + hedId + HED_0012564 + + + Abnormal + Deviating in any way from the state, position, structure, condition, behavior, or rule which is considered a norm. + + relatedTag + Normal + + + hedId + HED_0012565 + + + + Asymmetrical + Lacking symmetry or having parts that fail to correspond to one another in shape, size, or arrangement. + + relatedTag + Symmetrical + + + hedId + HED_0012566 + + + + Audible + A sound that can be perceived by the participant. + + relatedTag + Inaudible + + + hedId + HED_0012567 + + + + Complex + Hard, involved or complicated, elaborate, having many parts. + + relatedTag + Simple + + + hedId + HED_0012568 + + + + Congruent + Concordance of multiple evidence lines. In agreement or harmony. + + relatedTag + Incongruent + + + hedId + HED_0012569 + + + + Constrained + Keeping something within particular limits or bounds. + + relatedTag + Unconstrained + + + hedId + HED_0012570 + + + + Disordered + Not neatly arranged. Confused and untidy. A structural quality in which the parts of an object are non-rigid. + + relatedTag + Ordered + + + hedId + HED_0012571 + + + + Familiar + Recognized, familiar, or within the scope of knowledge. + + relatedTag + Unfamiliar + Famous + + + hedId + HED_0012572 + + + + Famous + A person who has a high degree of recognition by the general population for his or her success or accomplishments. A famous person. + + relatedTag + Familiar + Unfamiliar + + + hedId + HED_0012573 + + + + Inaudible + A sound below the threshold of perception of the participant. + + relatedTag + Audible + + + hedId + HED_0012574 + + + + Incongruent + Not in agreement or harmony. + + relatedTag + Congruent + + + hedId + HED_0012575 + + + + Involuntary + An action that is not made by choice. In the body, involuntary actions (such as blushing) occur automatically, and cannot be controlled by choice. + + relatedTag + Voluntary + + + hedId + HED_0012576 + + + + Masked + Information exists but is not provided or is partially obscured due to security,privacy, or other concerns. + + relatedTag + Unmasked + + + hedId + HED_0012577 + + + + Normal + Being approximately average or within certain limits. Conforming with or constituting a norm or standard or level or type or social norm. + + relatedTag + Abnormal + + + hedId + HED_0012578 + + + + Ordered + Conforming to a logical or comprehensible arrangement of separate elements. + + relatedTag + Disordered + + + hedId + HED_0012579 + + + + Simple + Easily understood or presenting no difficulties. + + relatedTag + Complex + + + hedId + HED_0012580 + + + + Symmetrical + Made up of exactly similar parts facing each other or around an axis. Showing aspects of symmetry. + + relatedTag + Asymmetrical + + + hedId + HED_0012581 + + + + Unconstrained + Moving without restriction. + + relatedTag + Constrained + + + hedId + HED_0012582 + + + + Unfamiliar + Not having knowledge or experience of. + + relatedTag + Familiar + Famous + + + hedId + HED_0012583 + + + + Unmasked + Information is revealed. + + relatedTag + Masked + + + hedId + HED_0012584 + + + + Voluntary + Using free will or design; not forced or compelled; controlled by individual volition. + + relatedTag + Involuntary + + + hedId + HED_0012585 + + + + + Categorical-level-value + Categorical values based on dividing a continuous variable into levels such as high and low. + + hedId + HED_0012586 + + + Cold + Having an absence of heat. + + relatedTag + Hot + + + hedId + HED_0012587 + + + + Deep + Extending relatively far inward or downward. + + relatedTag + Shallow + + + hedId + HED_0012588 + + + + High + Having a greater than normal degree, intensity, or amount. + + relatedTag + Low + Medium + + + hedId + HED_0012589 + + + + Hot + Having an excess of heat. + + relatedTag + Cold + + + hedId + HED_0012590 + + + + Large + Having a great extent such as in physical dimensions, period of time, amplitude or frequency. + + relatedTag + Small + + + hedId + HED_0012591 + + + + Liminal + Situated at a sensory threshold that is barely perceptible or capable of eliciting a response. + + relatedTag + Subliminal + Supraliminal + + + hedId + HED_0012592 + + + + Loud + Having a perceived high intensity of sound. + + relatedTag + Quiet + + + hedId + HED_0012593 + + + + Low + Less than normal in degree, intensity or amount. + + relatedTag + High + + + hedId + HED_0012594 + + + + Medium + Mid-way between small and large in number, quantity, magnitude or extent. + + relatedTag + Low + High + + + hedId + HED_0012595 + + + + Negative + Involving disadvantage or harm. + + relatedTag + Positive + + + hedId + HED_0012596 + + + + Positive + Involving advantage or good. + + relatedTag + Negative + + + hedId + HED_0012597 + + + + Quiet + Characterizing a perceived low intensity of sound. + + relatedTag + Loud + + + hedId + HED_0012598 + + + + Rough + Having a surface with perceptible bumps, ridges, or irregularities. + + relatedTag + Smooth + + + hedId + HED_0012599 + + + + Shallow + Having a depth which is relatively low. + + relatedTag + Deep + + + hedId + HED_0012600 + + + + Small + Having a small extent such as in physical dimensions, period of time, amplitude or frequency. + + relatedTag + Large + + + hedId + HED_0012601 + + + + Smooth + Having a surface free from bumps, ridges, or irregularities. + + relatedTag + Rough + + + hedId + HED_0012602 + + + + Subliminal + Situated below a sensory threshold that is imperceptible or not capable of eliciting a response. + + relatedTag + Liminal + Supraliminal + + + hedId + HED_0012603 + + + + Supraliminal + Situated above a sensory threshold that is perceptible or capable of eliciting a response. + + relatedTag + Liminal + Subliminal + + + hedId + HED_0012604 + + + + Thick + Wide in width, extent or cross-section. + + relatedTag + Thin + + + hedId + HED_0012605 + + + + Thin + Narrow in width, extent or cross-section. + + relatedTag + Thick + + + hedId + HED_0012606 + + + + + Categorical-location-value + Value indicating the location of something, primarily as an identifier rather than an expression of where the item is relative to something else. + + hedId + HED_0012607 + + + Anterior + Relating to an item on the front of an agent body (from the point of view of the agent) or on the front of an object from the point of view of an agent. This pertains to the identity of an agent or a thing. + + hedId + HED_0012608 + + + + Lateral + Identifying the portion of an object away from the midline, particularly applied to the (anterior-posterior, superior-inferior) surface of a brain. + + hedId + HED_0012609 + + + + Left + Relating to an item on the left side of an agent body (from the point of view of the agent) or the left side of an object from the point of view of an agent. This pertains to the identity of an agent or a thing, for example (Left, Hand) as an identifier for the left hand. HED spatial relations should be used for relative positions such as (Hand, (Left-side-of, Keyboard)), which denotes the hand placed on the left side of the keyboard, which could be either the identified left hand or right hand. + + hedId + HED_0012610 + + + + Medial + Identifying the portion of an object towards the center, particularly applied to the (anterior-posterior, superior-inferior) surface of a brain. + + hedId + HED_0012611 + + + + Posterior + Relating to an item on the back of an agent body (from the point of view of the agent) or on the back of an object from the point of view of an agent. This pertains to the identity of an agent or a thing. + + hedId + HED_0012612 + + + + Right + Relating to an item on the right side of an agent body (from the point of view of the agent) or the right side of an object from the point of view of an agent. This pertains to the identity of an agent or a thing, for example (Right, Hand) as an identifier for the right hand. HED spatial relations should be used for relative positions such as (Hand, (Right-side-of, Keyboard)), which denotes the hand placed on the right side of the keyboard, which could be either the identified left hand or right hand. + + hedId + HED_0012613 + + + + + Categorical-orientation-value + Value indicating the orientation or direction of something. + + hedId + HED_0012614 + + + Backward + Directed behind or to the rear. + + relatedTag + Forward + + + hedId + HED_0012615 + + + + Downward + Moving or leading toward a lower place or level. + + relatedTag + Leftward + Rightward + Upward + + + hedId + HED_0012616 + + + + Forward + At or near or directed toward the front. + + relatedTag + Backward + + + hedId + HED_0012617 + + + + Horizontally-oriented + Oriented parallel to or in the plane of the horizon. + + relatedTag + Vertically-oriented + + + hedId + HED_0012618 + + + + Leftward + Going toward or facing the left. + + relatedTag + Downward + Rightward + Upward + + + hedId + HED_0012619 + + + + Oblique + Slanting or inclined in direction, course, or position that is neither parallel nor perpendicular nor right-angular. + + relatedTag + Rotated + + + hedId + HED_0012620 + + + + Rightward + Going toward or situated on the right. + + relatedTag + Downward + Leftward + Upward + + + hedId + HED_0012621 + + + + Rotated + Positioned offset around an axis or center. + + hedId + HED_0012622 + + + + Upward + Moving, pointing, or leading to a higher place, point, or level. + + relatedTag + Downward + Leftward + Rightward + + + hedId + HED_0012623 + + + + Vertically-oriented + Oriented perpendicular to the plane of the horizon. + + relatedTag + Horizontally-oriented + + + hedId + HED_0012624 + + + + + + Physical-value + The value of some physical property of something. + + hedId + HED_0012625 + + + Temperature + A measure of hot or cold based on the average kinetic energy of the atoms or molecules in the system. + + hedId + HED_0012626 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + temperatureUnits + + + hedId + HED_0012627 + + + + + Weight + The relative mass or the quantity of matter contained by something. + + hedId + HED_0012628 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + weightUnits + + + hedId + HED_0012629 + + + + + + Quantitative-value + Something capable of being estimated or expressed with numeric values. + + hedId + HED_0012630 + + + Fraction + A numerical value between 0 and 1. + + hedId + HED_0012631 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012632 + + + + + Item-count + The integer count of something which is usually grouped with the entity it is counting. (Item-count/3, A) indicates that 3 of A have occurred up to this point. + + hedId + HED_0012633 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012634 + + + + + Item-index + The index of an item in a collection, sequence or other structure. (A (Item-index/3, B)) means that A is item number 3 in B. + + hedId + HED_0012635 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012636 + + + + + Item-interval + An integer indicating how many items or entities have passed since the last one of these. An item interval of 0 indicates the current item. + + hedId + HED_0012637 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012638 + + + + + Percentage + A fraction or ratio with 100 understood as the denominator. + + hedId + HED_0012639 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012640 + + + + + Ratio + A quotient of quantities of the same kind for different components within the same system. + + hedId + HED_0012641 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012642 + + + + + + Spatiotemporal-value + A property relating to space and/or time. + + hedId + HED_0012643 + + + Rate-of-change + The amount of change accumulated per unit time. + + hedId + HED_0012644 + + + Acceleration + Magnitude of the rate of change in either speed or direction. The direction of change should be given separately. + + hedId + HED_0012645 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + accelerationUnits + + + hedId + HED_0012646 + + + + + Frequency + Frequency is the number of occurrences of a repeating event per unit time. + + hedId + HED_0012647 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + hedId + HED_0012648 + + + + + Jerk-rate + Magnitude of the rate at which the acceleration of an object changes with respect to time. The direction of change should be given separately. + + hedId + HED_0012649 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + jerkUnits + + + hedId + HED_0012650 + + + + + Refresh-rate + The frequency with which the image on a computer monitor or similar electronic display screen is refreshed, usually expressed in hertz. + + hedId + HED_0012651 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012652 + + + + + Sampling-rate + The number of digital samples taken or recorded per unit of time. + + hedId + HED_0012653 + + + # + + takesValue + + + unitClass + frequencyUnits + + + hedId + HED_0012654 + + + + + Speed + A scalar measure of the rate of movement of the object expressed either as the distance traveled divided by the time taken (average speed) or the rate of change of position with respect to time at a particular point (instantaneous speed). The direction of change should be given separately. + + hedId + HED_0012655 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + speedUnits + + + hedId + HED_0012656 + + + + + Temporal-rate + The number of items per unit of time. + + hedId + HED_0012657 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + hedId + HED_0012658 + + + + + + Spatial-value + Value of an item involving space. + + hedId + HED_0012659 + + + Angle + The amount of inclination of one line to another or the plane of one object to another. + + hedId + HED_0012660 + + + # + + takesValue + + + unitClass + angleUnits + + + valueClass + numericClass + + + hedId + HED_0012661 + + + + + Distance + A measure of the space separating two objects or points. + + hedId + HED_0012662 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + hedId + HED_0012663 + + + + + Position + A reference to the alignment of an object, a particular situation or view of a situation, or the location of an object. Coordinates with respect a specified frame of reference or the default Screen-frame if no frame is given. + + hedId + HED_0012664 + + + Clock-face + A location identifier based on clock-face numbering or anatomic subregion. Replaced by Clock-face-position. + + deprecatedFrom + 8.2.0 + + + hedId + HED_0012326 + + + # + + deprecatedFrom + 8.2.0 + + + takesValue + + + valueClass + numericClass + + + hedId + HED_0013228 + + + + + Clock-face-position + A location identifier based on clock-face numbering or anatomic subregion. As an object, just use the tag Clock. + + hedId + HED_0013229 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0013230 + + + + + X-position + The position along the x-axis of the frame of reference. + + hedId + HED_0012665 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + hedId + HED_0012666 + + + + + Y-position + The position along the y-axis of the frame of reference. + + hedId + HED_0012667 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + hedId + HED_0012668 + + + + + Z-position + The position along the z-axis of the frame of reference. + + hedId + HED_0012669 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + hedId + HED_0012670 + + + + + + Size + The physical magnitude of something. + + hedId + HED_0012671 + + + Area + The extent of a 2-dimensional surface enclosed within a boundary. + + hedId + HED_0012672 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + areaUnits + + + hedId + HED_0012673 + + + + + Depth + The distance from the surface of something especially from the perspective of looking from the front. + + hedId + HED_0012674 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + hedId + HED_0012675 + + + + + Height + The vertical measurement or distance from the base to the top of an object. + + hedId + HED_0012676 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + hedId + HED_0012677 + + + + + Length + The linear extent in space from one end of something to the other end, or the extent of something from beginning to end. + + hedId + HED_0012678 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + hedId + HED_0012679 + + + + + Perimeter + The minimum length of paths enclosing a 2D shape. + + hedId + HED_0012680 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + hedId + HED_0012681 + + + + + Radius + The distance of the line from the center of a circle or a sphere to its perimeter or outer surface, respectively. + + hedId + HED_0012682 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + hedId + HED_0012683 + + + + + Volume + The amount of three dimensional space occupied by an object or the capacity of a space or container. + + hedId + HED_0012684 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + volumeUnits + + + hedId + HED_0012685 + + + + + Width + The extent or measurement of something from side to side. + + hedId + HED_0012686 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + hedId + HED_0012687 + + + + + + + Temporal-value + A characteristic of or relating to time or limited by time. + + hedId + HED_0012688 + + + Delay + The time at which an event start time is delayed from the current onset time. This tag defines the start time of an event of temporal extent and may be used with the Duration tag. + + topLevelTagGroup + + + reserved + + + requireChild + + + relatedTag + Duration + + + hedId + HED_0012689 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + hedId + HED_0012690 + + + + + Duration + The period of time during which an event occurs. This tag defines the end time of an event of temporal extent and may be used with the Delay tag. + + topLevelTagGroup + + + reserved + + + requireChild + + + relatedTag + Delay + + + hedId + HED_0012691 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + hedId + HED_0012692 + + + + + Time-interval + The period of time separating two instances, events, or occurrences. + + hedId + HED_0012693 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + hedId + HED_0012694 + + + + + Time-value + A value with units of time. Usually grouped with tags identifying what the value represents. + + hedId + HED_0012695 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + hedId + HED_0012696 + + + + + + + Statistical-value + A value based on or employing the principles of statistics. + + extensionAllowed + + + hedId + HED_0012697 + + + Data-maximum + The largest possible quantity or degree. + + hedId + HED_0012698 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012699 + + + + + Data-mean + The sum of a set of values divided by the number of values in the set. + + hedId + HED_0012700 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012701 + + + + + Data-median + The value which has an equal number of values greater and less than it. + + hedId + HED_0012702 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012703 + + + + + Data-minimum + The smallest possible quantity. + + hedId + HED_0012704 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012705 + + + + + Probability + A measure of the expectation of the occurrence of a particular event. + + hedId + HED_0012706 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012707 + + + + + Standard-deviation + A measure of the range of values in a set of numbers. Standard deviation is a statistic used as a measure of the dispersion or variation in a distribution, equal to the square root of the arithmetic mean of the squares of the deviations from the arithmetic mean. + + hedId + HED_0012708 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012709 + + + + + Statistical-accuracy + A measure of closeness to true value expressed as a number between 0 and 1. + + hedId + HED_0012710 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012711 + + + + + Statistical-precision + A quantitative representation of the degree of accuracy necessary for or associated with a particular action. + + hedId + HED_0012712 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012713 + + + + + Statistical-recall + Sensitivity is a measurement datum qualifying a binary classification test and is computed by subtracting the false negative rate to the integral numeral 1. + + hedId + HED_0012714 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012715 + + + + + Statistical-uncertainty + A measure of the inherent variability of repeated observation measurements of a quantity including quantities evaluated by statistical methods and by other means. + + hedId + HED_0012716 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0012717 + + + + + + + Data-variability-attribute + An attribute describing how something changes or varies. + + hedId + HED_0012718 + + + Abrupt + Marked by sudden change. + + hedId + HED_0012719 + + + + Constant + Continually recurring or continuing without interruption. Not changing in time or space. + + hedId + HED_0012720 + + + + Continuous + Uninterrupted in time, sequence, substance, or extent. + + relatedTag + Discrete + Discontinuous + + + hedId + HED_0012721 + + + + Decreasing + Becoming smaller or fewer in size, amount, intensity, or degree. + + relatedTag + Increasing + + + hedId + HED_0012722 + + + + Deterministic + No randomness is involved in the development of the future states of the element. + + relatedTag + Random + Stochastic + + + hedId + HED_0012723 + + + + Discontinuous + Having a gap in time, sequence, substance, or extent. + + relatedTag + Continuous + + + hedId + HED_0012724 + + + + Discrete + Constituting a separate entities or parts. + + relatedTag + Continuous + Discontinuous + + + hedId + HED_0012725 + + + + Estimated-value + Something that has been calculated or measured approximately. + + hedId + HED_0012726 + + + + Exact-value + A value that is viewed to the true value according to some standard. + + hedId + HED_0012727 + + + + Flickering + Moving irregularly or unsteadily or burning or shining fitfully or with a fluctuating light. + + hedId + HED_0012728 + + + + Fractal + Having extremely irregular curves or shapes for which any suitably chosen part is similar in shape to a given larger or smaller part when magnified or reduced to the same size. + + hedId + HED_0012729 + + + + Increasing + Becoming greater in size, amount, or degree. + + relatedTag + Decreasing + + + hedId + HED_0012730 + + + + Random + Governed by or depending on chance. Lacking any definite plan or order or purpose. + + relatedTag + Deterministic + Stochastic + + + hedId + HED_0012731 + + + + Repetitive + A recurring action that is often non-purposeful. + + hedId + HED_0012732 + + + + Stochastic + Uses a random probability distribution or pattern that may be analyzed statistically but may not be predicted precisely to determine future states. + + relatedTag + Deterministic + Random + + + hedId + HED_0012733 + + + + Varying + Differing in size, amount, degree, or nature. + + hedId + HED_0012734 + + + + + + Environmental-property + Relating to or arising from the surroundings of an agent. + + hedId + HED_0012735 + + + Augmented-reality + Using technology that enhances real-world experiences with computer-derived digital overlays to change some aspects of perception of the natural environment. The digital content is shown to the user through a smart device or glasses and responds to changes in the environment. + + hedId + HED_0012736 + + + + Indoors + Located inside a building or enclosure. + + hedId + HED_0012737 + + + + Motion-platform + A mechanism that creates the feelings of being in a real motion environment. + + hedId + HED_0012738 + + + + Outdoors + Any area outside a building or shelter. + + hedId + HED_0012739 + + + + Real-world + Located in a place that exists in real space and time under realistic conditions. + + hedId + HED_0012740 + + + + Rural + Of or pertaining to the country as opposed to the city. + + hedId + HED_0012741 + + + + Terrain + Characterization of the physical features of a tract of land. + + hedId + HED_0012742 + + + Composite-terrain + Tracts of land characterized by a mixture of physical features. + + hedId + HED_0012743 + + + + Dirt-terrain + Tracts of land characterized by a soil surface and lack of vegetation. + + hedId + HED_0012744 + + + + Grassy-terrain + Tracts of land covered by grass. + + hedId + HED_0012745 + + + + Gravel-terrain + Tracts of land covered by a surface consisting a loose aggregation of small water-worn or pounded stones. + + hedId + HED_0012746 + + + + Leaf-covered-terrain + Tracts of land covered by leaves and composited organic material. + + hedId + HED_0012747 + + + + Muddy-terrain + Tracts of land covered by a liquid or semi-liquid mixture of water and some combination of soil, silt, and clay. + + hedId + HED_0012748 + + + + Paved-terrain + Tracts of land covered with concrete, asphalt, stones, or bricks. + + hedId + HED_0012749 + + + + Rocky-terrain + Tracts of land consisting or full of rock or rocks. + + hedId + HED_0012750 + + + + Sloped-terrain + Tracts of land arranged in a sloping or inclined position. + + hedId + HED_0012751 + + + + Uneven-terrain + Tracts of land that are not level, smooth, or regular. + + hedId + HED_0012752 + + + + + Urban + Relating to, located in, or characteristic of a city or densely populated area. + + hedId + HED_0012753 + + + + Virtual-world + Using technology that creates immersive, computer-generated experiences that a person can interact with and navigate through. The digital content is generally delivered to the user through some type of headset and responds to changes in head position or through interaction with other types of sensors. Existing in a virtual setting such as a simulation or game environment. + + hedId + HED_0012754 + + + + + Informational-property + Something that pertains to a task. + + extensionAllowed + + + hedId + HED_0012755 + + + Description + An explanation of what the tag group it is in means. If the description is at the top-level of an event string, the description applies to the event. + + hedId + HED_0012756 + + + # + + takesValue + + + valueClass + textClass + + + hedId + HED_0012757 + + + + + ID + An alphanumeric name that identifies either a unique object or a unique class of objects. Here the object or class may be an idea, physical countable object (or class), or physical uncountable substance (or class). + + hedId + HED_0012758 + + + # + + takesValue + + + valueClass + textClass + + + hedId + HED_0012759 + + + + + Label + A string of 20 or fewer characters identifying something. Labels usually refer to general classes of things while IDs refer to specific instances. A term that is associated with some entity. A brief description given for purposes of identification. An identifying or descriptive marker that is attached to an object. + + hedId + HED_0012760 + + + # + + takesValue + + + valueClass + nameClass + + + hedId + HED_0012761 + + + + + Metadata + Data about data. Information that describes another set of data. + + hedId + HED_0012762 + + + Creation-date + The date on which the creation of this item began. + + hedId + HED_0012763 + + + # + + takesValue + + + valueClass + dateTimeClass + + + hedId + HED_0012764 + + + + + Experimental-note + A brief written record about the experiment. + + hedId + HED_0012765 + + + # + + takesValue + + + valueClass + textClass + + + hedId + HED_0012766 + + + + + Library-name + Official name of a HED library. + + hedId + HED_0012767 + + + # + + takesValue + + + valueClass + nameClass + + + hedId + HED_0012768 + + + + + Metadata-identifier + Identifier (usually unique) from another metadata source. + + hedId + HED_0012769 + + + CogAtlas + The Cognitive Atlas ID number of something. + + hedId + HED_0012770 + + + # + + takesValue + + + hedId + HED_0012771 + + + + + CogPo + The CogPO ID number of something. + + hedId + HED_0012772 + + + # + + takesValue + + + hedId + HED_0012773 + + + + + DOI + Digital object identifier for an object. + + hedId + HED_0012774 + + + # + + takesValue + + + hedId + HED_0012775 + + + + + OBO-identifier + The identifier of a term in some Open Biology Ontology (OBO) ontology. + + hedId + HED_0012776 + + + # + + takesValue + + + valueClass + nameClass + + + hedId + HED_0012777 + + + + + Species-identifier + A binomial species name from the NCBI Taxonomy, for example, homo sapiens, mus musculus, or rattus norvegicus. + + hedId + HED_0012778 + + + # + + takesValue + + + hedId + HED_0012779 + + + + + Subject-identifier + A sequence of characters used to identify, name, or characterize a trial or study subject. + + hedId + HED_0012780 + + + # + + takesValue + + + hedId + HED_0012781 + + + + + UUID + A unique universal identifier. + + hedId + HED_0012782 + + + # + + takesValue + + + hedId + HED_0012783 + + + + + Version-identifier + An alphanumeric character string that identifies a form or variant of a type or original. + + hedId + HED_0012784 + + + # + Usually is a semantic version. + + takesValue + + + hedId + HED_0012785 + + + + + + Modified-date + The date on which the item was modified (usually the last-modified data unless a complete record of dated modifications is kept. + + hedId + HED_0012786 + + + # + + takesValue + + + valueClass + dateTimeClass + + + hedId + HED_0012787 + + + + + Pathname + The specification of a node (file or directory) in a hierarchical file system, usually specified by listing the nodes top-down. + + hedId + HED_0012788 + + + # + + takesValue + + + hedId + HED_0012789 + + + + + URL + A valid URL. + + hedId + HED_0012790 + + + # + + takesValue + + + hedId + HED_0012791 + + + + + + Parameter + Something user-defined for this experiment. + + hedId + HED_0012792 + + + Parameter-label + The name of the parameter. + + hedId + HED_0012793 + + + # + + takesValue + + + valueClass + nameClass + + + hedId + HED_0012794 + + + + + Parameter-value + The value of the parameter. + + hedId + HED_0012795 + + + # + + takesValue + + + valueClass + textClass + + + hedId + HED_0012796 + + + + + + + Organizational-property + Relating to an organization or the action of organizing something. + + hedId + HED_0012797 + + + Collection + A tag designating a grouping of items such as in a set or list. + + reserved + + + hedId + HED_0012798 + + + # + Name of the collection. + + takesValue + + + valueClass + nameClass + + + hedId + HED_0012799 + + + + + Condition-variable + An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent variables or contrasts. + + reserved + + + hedId + HED_0012800 + + + # + Name of the condition variable. + + takesValue + + + valueClass + nameClass + + + hedId + HED_0012801 + + + + + Control-variable + An aspect of the experiment that is fixed throughout the study and usually is explicitly controlled. + + reserved + + + hedId + HED_0012802 + + + # + Name of the control variable. + + takesValue + + + valueClass + nameClass + + + hedId + HED_0012803 + + + + + Def + A HED-specific utility tag used with a defined name to represent the tags associated with that definition. + + requireChild + + + reserved + + + hedId + HED_0012804 + + + # + Name of the definition. + + takesValue + + + valueClass + nameClass + + + hedId + HED_0012805 + + + + + Def-expand + A HED specific utility tag that is grouped with an expanded definition. The child value of the Def-expand is the name of the expanded definition. + + requireChild + + + reserved + + + tagGroup + + + hedId + HED_0012806 + + + # + + takesValue + + + valueClass + nameClass + + + hedId + HED_0012807 + + + + + Definition + A HED-specific utility tag whose child value is the name of the concept and the tag group associated with the tag is an English language explanation of a concept. + + requireChild + + + reserved + + + topLevelTagGroup + + + hedId + HED_0012808 + + + # + Name of the definition. + + takesValue + + + valueClass + nameClass + + + hedId + HED_0012809 + + + + + Event-context + A special HED tag inserted as part of a top-level tag group to contain information about the interrelated conditions under which the event occurs. The event context includes information about other events that are ongoing when this event happens. + + reserved + + + topLevelTagGroup + + + unique + + + hedId + HED_0012810 + + + + Event-stream + A special HED tag indicating that this event is a member of an ordered succession of events. + + reserved + + + hedId + HED_0012811 + + + # + Name of the event stream. + + takesValue + + + valueClass + nameClass + + + hedId + HED_0012812 + + + + + Experimental-intertrial + A tag used to indicate a part of the experiment between trials usually where nothing is happening. + + reserved + + + hedId + HED_0012813 + + + # + Optional label for the intertrial block. + + takesValue + + + valueClass + nameClass + + + hedId + HED_0012814 + + + + + Experimental-trial + Designates a run or execution of an activity, for example, one execution of a script. A tag used to indicate a particular organizational part in the experimental design often containing a stimulus-response pair or stimulus-response-feedback triad. + + reserved + + + hedId + HED_0012815 + + + # + Optional label for the trial (often a numerical string). + + takesValue + + + valueClass + nameClass + + + hedId + HED_0012816 + + + + + Indicator-variable + An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent variables. + + reserved + + + hedId + HED_0012817 + + + # + Name of the indicator variable. + + takesValue + + + valueClass + nameClass + + + hedId + HED_0012818 + + + + + Recording + A tag designating the data recording. Recording tags are usually have temporal scope which is the entire recording. + + reserved + + + hedId + HED_0012819 + + + # + Optional label for the recording. + + takesValue + + + valueClass + nameClass + + + hedId + HED_0012820 + + + + + Task + An assigned piece of work, usually with a time allotment. A tag used to indicate a linkage the structured activities performed as part of the experiment. + + reserved + + + hedId + HED_0012821 + + + # + Optional label for the task block. + + takesValue + + + valueClass + nameClass + + + hedId + HED_0012822 + + + + + Time-block + A tag used to indicate a contiguous time block in the experiment during which something is fixed or noted. + + reserved + + + hedId + HED_0012823 + + + # + Optional label for the task block. + + takesValue + + + valueClass + nameClass + + + hedId + HED_0012824 + + + + + + Sensory-property + Relating to sensation or the physical senses. + + hedId + HED_0012825 + + + Sensory-attribute + A sensory characteristic associated with another entity. + + hedId + HED_0012826 + + + Auditory-attribute + Pertaining to the sense of hearing. + + hedId + HED_0012827 + + + Loudness + Perceived intensity of a sound. + + hedId + HED_0012828 + + + # + + takesValue + + + valueClass + numericClass + nameClass + + + hedId + HED_0012829 + + + + + Pitch + A perceptual property that allows the user to order sounds on a frequency scale. + + hedId + HED_0012830 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + hedId + HED_0012831 + + + + + Sound-envelope + Description of how a sound changes over time. + + hedId + HED_0012832 + + + Sound-envelope-attack + The time taken for initial run-up of level from nil to peak usually beginning when the key on a musical instrument is pressed. + + hedId + HED_0012833 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + hedId + HED_0012834 + + + + + Sound-envelope-decay + The time taken for the subsequent run down from the attack level to the designated sustain level. + + hedId + HED_0012835 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + hedId + HED_0012836 + + + + + Sound-envelope-release + The time taken for the level to decay from the sustain level to zero after the key is released. + + hedId + HED_0012837 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + hedId + HED_0012838 + + + + + Sound-envelope-sustain + The time taken for the main sequence of the sound duration, until the key is released. + + hedId + HED_0012839 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + hedId + HED_0012840 + + + + + + Sound-volume + The sound pressure level (SPL) usually the ratio to a reference signal estimated as the lower bound of hearing. + + hedId + HED_0012841 + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + intensityUnits + + + hedId + HED_0012842 + + + + + Timbre + The perceived sound quality of a singing voice or musical instrument. + + hedId + HED_0012843 + + + # + + takesValue + + + valueClass + nameClass + + + hedId + HED_0012844 + + + + + + Gustatory-attribute + Pertaining to the sense of taste. + + hedId + HED_0012845 + + + Bitter + Having a sharp, pungent taste. + + hedId + HED_0012846 + + + + Salty + Tasting of or like salt. + + hedId + HED_0012847 + + + + Savory + Belonging to a taste that is salty or spicy rather than sweet. + + hedId + HED_0012848 + + + + Sour + Having a sharp, acidic taste. + + hedId + HED_0012849 + + + + Sweet + Having or resembling the taste of sugar. + + hedId + HED_0012850 + + + + + Olfactory-attribute + Having a smell. + + hedId + HED_0012851 + + + + Somatic-attribute + Pertaining to the feelings in the body or of the nervous system. + + hedId + HED_0012852 + + + Pain + The sensation of discomfort, distress, or agony, resulting from the stimulation of specialized nerve endings. + + hedId + HED_0012853 + + + + Stress + The negative mental, emotional, and physical reactions that occur when environmental stressors are perceived as exceeding the adaptive capacities of the individual. + + hedId + HED_0012854 + + + + + Tactile-attribute + Pertaining to the sense of touch. + + hedId + HED_0012855 + + + Tactile-pressure + Having a feeling of heaviness. + + hedId + HED_0012856 + + + + Tactile-temperature + Having a feeling of hotness or coldness. + + hedId + HED_0012857 + + + + Tactile-texture + Having a feeling of roughness. + + hedId + HED_0012858 + + + + Tactile-vibration + Having a feeling of mechanical oscillation. + + hedId + HED_0012859 + + + + + Vestibular-attribute + Pertaining to the sense of balance or body position. + + hedId + HED_0012860 + + + + Visual-attribute + Pertaining to the sense of sight. + + hedId + HED_0012861 + + + Color + The appearance of objects (or light sources) described in terms of perception of their hue and lightness (or brightness) and saturation. + + hedId + HED_0012862 + + + CSS-color + One of 140 colors supported by all browsers. For more details such as the color RGB or HEX values,check:https://www.w3schools.com/colors/colors_groups.asp. + + hedId + HED_0012863 + + + Blue-color + CSS color group. + + hedId + HED_0012864 + + + Blue + CSS-color 0x0000FF. + + hedId + HED_0012865 + + + + CadetBlue + CSS-color 0x5F9EA0. + + hedId + HED_0012866 + + + + CornflowerBlue + CSS-color 0x6495ED. + + hedId + HED_0012867 + + + + DarkBlue + CSS-color 0x00008B. + + hedId + HED_0012868 + + + + DeepSkyBlue + CSS-color 0x00BFFF. + + hedId + HED_0012869 + + + + DodgerBlue + CSS-color 0x1E90FF. + + hedId + HED_0012870 + + + + LightBlue + CSS-color 0xADD8E6. + + hedId + HED_0012871 + + + + LightSkyBlue + CSS-color 0x87CEFA. + + hedId + HED_0012872 + + + + LightSteelBlue + CSS-color 0xB0C4DE. + + hedId + HED_0012873 + + + + MediumBlue + CSS-color 0x0000CD. + + hedId + HED_0012874 + + + + MidnightBlue + CSS-color 0x191970. + + hedId + HED_0012875 + + + + Navy + CSS-color 0x000080. + + hedId + HED_0012876 + + + + PowderBlue + CSS-color 0xB0E0E6. + + hedId + HED_0012877 + + + + RoyalBlue + CSS-color 0x4169E1. + + hedId + HED_0012878 + + + + SkyBlue + CSS-color 0x87CEEB. + + hedId + HED_0012879 + + + + SteelBlue + CSS-color 0x4682B4. + + hedId + HED_0012880 + + + + + Brown-color + CSS color group. + + hedId + HED_0012881 + + + Bisque + CSS-color 0xFFE4C4. + + hedId + HED_0012882 + + + + BlanchedAlmond + CSS-color 0xFFEBCD. + + hedId + HED_0012883 + + + + Brown + CSS-color 0xA52A2A. + + hedId + HED_0012884 + + + + BurlyWood + CSS-color 0xDEB887. + + hedId + HED_0012885 + + + + Chocolate + CSS-color 0xD2691E. + + hedId + HED_0012886 + + + + Cornsilk + CSS-color 0xFFF8DC. + + hedId + HED_0012887 + + + + DarkGoldenRod + CSS-color 0xB8860B. + + hedId + HED_0012888 + + + + GoldenRod + CSS-color 0xDAA520. + + hedId + HED_0012889 + + + + Maroon + CSS-color 0x800000. + + hedId + HED_0012890 + + + + NavajoWhite + CSS-color 0xFFDEAD. + + hedId + HED_0012891 + + + + Olive + CSS-color 0x808000. + + hedId + HED_0012892 + + + + Peru + CSS-color 0xCD853F. + + hedId + HED_0012893 + + + + RosyBrown + CSS-color 0xBC8F8F. + + hedId + HED_0012894 + + + + SaddleBrown + CSS-color 0x8B4513. + + hedId + HED_0012895 + + + + SandyBrown + CSS-color 0xF4A460. + + hedId + HED_0012896 + + + + Sienna + CSS-color 0xA0522D. + + hedId + HED_0012897 + + + + Tan + CSS-color 0xD2B48C. + + hedId + HED_0012898 + + + + Wheat + CSS-color 0xF5DEB3. + + hedId + HED_0012899 + + + + + Cyan-color + CSS color group. + + hedId + HED_0012900 + + + Aqua + CSS-color 0x00FFFF. + + hedId + HED_0012901 + + + + Aquamarine + CSS-color 0x7FFFD4. + + hedId + HED_0012902 + + + + Cyan + CSS-color 0x00FFFF. + + hedId + HED_0012903 + + + + DarkTurquoise + CSS-color 0x00CED1. + + hedId + HED_0012904 + + + + LightCyan + CSS-color 0xE0FFFF. + + hedId + HED_0012905 + + + + MediumTurquoise + CSS-color 0x48D1CC. + + hedId + HED_0012906 + + + + PaleTurquoise + CSS-color 0xAFEEEE. + + hedId + HED_0012907 + + + + Turquoise + CSS-color 0x40E0D0. + + hedId + HED_0012908 + + + + + Gray-color + CSS color group. + + hedId + HED_0012909 + + + Black + CSS-color 0x000000. + + hedId + HED_0012910 + + + + DarkGray + CSS-color 0xA9A9A9. + + hedId + HED_0012911 + + + + DarkSlateGray + CSS-color 0x2F4F4F. + + hedId + HED_0012912 + + + + DimGray + CSS-color 0x696969. + + hedId + HED_0012913 + + + + Gainsboro + CSS-color 0xDCDCDC. + + hedId + HED_0012914 + + + + Gray + CSS-color 0x808080. + + hedId + HED_0012915 + + + + LightGray + CSS-color 0xD3D3D3. + + hedId + HED_0012916 + + + + LightSlateGray + CSS-color 0x778899. + + hedId + HED_0012917 + + + + Silver + CSS-color 0xC0C0C0. + + hedId + HED_0012918 + + + + SlateGray + CSS-color 0x708090. + + hedId + HED_0012919 + + + + + Green-color + CSS color group. + + hedId + HED_0012920 + + + Chartreuse + CSS-color 0x7FFF00. + + hedId + HED_0012921 + + + + DarkCyan + CSS-color 0x008B8B. + + hedId + HED_0012922 + + + + DarkGreen + CSS-color 0x006400. + + hedId + HED_0012923 + + + + DarkOliveGreen + CSS-color 0x556B2F. + + hedId + HED_0012924 + + + + DarkSeaGreen + CSS-color 0x8FBC8F. + + hedId + HED_0012925 + + + + ForestGreen + CSS-color 0x228B22. + + hedId + HED_0012926 + + + + Green + CSS-color 0x008000. + + hedId + HED_0012927 + + + + GreenYellow + CSS-color 0xADFF2F. + + hedId + HED_0012928 + + + + LawnGreen + CSS-color 0x7CFC00. + + hedId + HED_0012929 + + + + LightGreen + CSS-color 0x90EE90. + + hedId + HED_0012930 + + + + LightSeaGreen + CSS-color 0x20B2AA. + + hedId + HED_0012931 + + + + Lime + CSS-color 0x00FF00. + + hedId + HED_0012932 + + + + LimeGreen + CSS-color 0x32CD32. + + hedId + HED_0012933 + + + + MediumAquaMarine + CSS-color 0x66CDAA. + + hedId + HED_0012934 + + + + MediumSeaGreen + CSS-color 0x3CB371. + + hedId + HED_0012935 + + + + MediumSpringGreen + CSS-color 0x00FA9A. + + hedId + HED_0012936 + + + + OliveDrab + CSS-color 0x6B8E23. + + hedId + HED_0012937 + + + + PaleGreen + CSS-color 0x98FB98. + + hedId + HED_0012938 + + + + SeaGreen + CSS-color 0x2E8B57. + + hedId + HED_0012939 + + + + SpringGreen + CSS-color 0x00FF7F. + + hedId + HED_0012940 + + + + Teal + CSS-color 0x008080. + + hedId + HED_0012941 + + + + YellowGreen + CSS-color 0x9ACD32. + + hedId + HED_0012942 + + + + + Orange-color + CSS color group. + + hedId + HED_0012943 + + + Coral + CSS-color 0xFF7F50. + + hedId + HED_0012944 + + + + DarkOrange + CSS-color 0xFF8C00. + + hedId + HED_0012945 + + + + Orange + CSS-color 0xFFA500. + + hedId + HED_0012946 + + + + OrangeRed + CSS-color 0xFF4500. + + hedId + HED_0012947 + + + + Tomato + CSS-color 0xFF6347. + + hedId + HED_0012948 + + + + + Pink-color + CSS color group. + + hedId + HED_0012949 + + + DeepPink + CSS-color 0xFF1493. + + hedId + HED_0012950 + + + + HotPink + CSS-color 0xFF69B4. + + hedId + HED_0012951 + + + + LightPink + CSS-color 0xFFB6C1. + + hedId + HED_0012952 + + + + MediumVioletRed + CSS-color 0xC71585. + + hedId + HED_0012953 + + + + PaleVioletRed + CSS-color 0xDB7093. + + hedId + HED_0012954 + + + + Pink + CSS-color 0xFFC0CB. + + hedId + HED_0012955 + + + + + Purple-color + CSS color group. + + hedId + HED_0012956 + + + BlueViolet + CSS-color 0x8A2BE2. + + hedId + HED_0012957 + + + + DarkMagenta + CSS-color 0x8B008B. + + hedId + HED_0012958 + + + + DarkOrchid + CSS-color 0x9932CC. + + hedId + HED_0012959 + + + + DarkSlateBlue + CSS-color 0x483D8B. + + hedId + HED_0012960 + + + + DarkViolet + CSS-color 0x9400D3. + + hedId + HED_0012961 + + + + Fuchsia + CSS-color 0xFF00FF. + + hedId + HED_0012962 + + + + Indigo + CSS-color 0x4B0082. + + hedId + HED_0012963 + + + + Lavender + CSS-color 0xE6E6FA. + + hedId + HED_0012964 + + + + Magenta + CSS-color 0xFF00FF. + + hedId + HED_0012965 + + + + MediumOrchid + CSS-color 0xBA55D3. + + hedId + HED_0012966 + + + + MediumPurple + CSS-color 0x9370DB. + + hedId + HED_0012967 + + + + MediumSlateBlue + CSS-color 0x7B68EE. + + hedId + HED_0012968 + + + + Orchid + CSS-color 0xDA70D6. + + hedId + HED_0012969 + + + + Plum + CSS-color 0xDDA0DD. + + hedId + HED_0012970 + + + + Purple + CSS-color 0x800080. + + hedId + HED_0012971 + + + + RebeccaPurple + CSS-color 0x663399. + + hedId + HED_0012972 + + + + SlateBlue + CSS-color 0x6A5ACD. + + hedId + HED_0012973 + + + + Thistle + CSS-color 0xD8BFD8. + + hedId + HED_0012974 + + + + Violet + CSS-color 0xEE82EE. + + hedId + HED_0012975 + + + + + Red-color + CSS color group. + + hedId + HED_0012976 + + + Crimson + CSS-color 0xDC143C. + + hedId + HED_0012977 + + + + DarkRed + CSS-color 0x8B0000. + + hedId + HED_0012978 + + + + DarkSalmon + CSS-color 0xE9967A. + + hedId + HED_0012979 + + + + FireBrick + CSS-color 0xB22222. + + hedId + HED_0012980 + + + + IndianRed + CSS-color 0xCD5C5C. + + hedId + HED_0012981 + + + + LightCoral + CSS-color 0xF08080. + + hedId + HED_0012982 + + + + LightSalmon + CSS-color 0xFFA07A. + + hedId + HED_0012983 + + + + Red + CSS-color 0xFF0000. + + hedId + HED_0012984 + + + + Salmon + CSS-color 0xFA8072. + + hedId + HED_0012985 + + + + + White-color + CSS color group. + + hedId + HED_0012986 + + + AliceBlue + CSS-color 0xF0F8FF. + + hedId + HED_0012987 + + + + AntiqueWhite + CSS-color 0xFAEBD7. + + hedId + HED_0012988 + + + + Azure + CSS-color 0xF0FFFF. + + hedId + HED_0012989 + + + + Beige + CSS-color 0xF5F5DC. + + hedId + HED_0012990 + + + + FloralWhite + CSS-color 0xFFFAF0. + + hedId + HED_0012991 + + + + GhostWhite + CSS-color 0xF8F8FF. + + hedId + HED_0012992 + + + + HoneyDew + CSS-color 0xF0FFF0. + + hedId + HED_0012993 + + + + Ivory + CSS-color 0xFFFFF0. + + hedId + HED_0012994 + + + + LavenderBlush + CSS-color 0xFFF0F5. + + hedId + HED_0012995 + + + + Linen + CSS-color 0xFAF0E6. + + hedId + HED_0012996 + + + + MintCream + CSS-color 0xF5FFFA. + + hedId + HED_0012997 + + + + MistyRose + CSS-color 0xFFE4E1. + + hedId + HED_0012998 + + + + OldLace + CSS-color 0xFDF5E6. + + hedId + HED_0012999 + + + + SeaShell + CSS-color 0xFFF5EE. + + hedId + HED_0013000 + + + + Snow + CSS-color 0xFFFAFA. + + hedId + HED_0013001 + + + + White + CSS-color 0xFFFFFF. + + hedId + HED_0013002 + + + + WhiteSmoke + CSS-color 0xF5F5F5. + + hedId + HED_0013003 + + + + + Yellow-color + CSS color group. + + hedId + HED_0013004 + + + DarkKhaki + CSS-color 0xBDB76B. + + hedId + HED_0013005 + + + + Gold + CSS-color 0xFFD700. + + hedId + HED_0013006 + + + + Khaki + CSS-color 0xF0E68C. + + hedId + HED_0013007 + + + + LemonChiffon + CSS-color 0xFFFACD. + + hedId + HED_0013008 + + + + LightGoldenRodYellow + CSS-color 0xFAFAD2. + + hedId + HED_0013009 + + + + LightYellow + CSS-color 0xFFFFE0. + + hedId + HED_0013010 + + + + Moccasin + CSS-color 0xFFE4B5. + + hedId + HED_0013011 + + + + PaleGoldenRod + CSS-color 0xEEE8AA. + + hedId + HED_0013012 + + + + PapayaWhip + CSS-color 0xFFEFD5. + + hedId + HED_0013013 + + + + PeachPuff + CSS-color 0xFFDAB9. + + hedId + HED_0013014 + + + + Yellow + CSS-color 0xFFFF00. + + hedId + HED_0013015 + + + + + + Color-shade + A slight degree of difference between colors, especially with regard to how light or dark it is or as distinguished from one nearly like it. + + hedId + HED_0013016 + + + Dark-shade + A color tone not reflecting much light. + + hedId + HED_0013017 + + + + Light-shade + A color tone reflecting more light. + + hedId + HED_0013018 + + + + + Grayscale + Using a color map composed of shades of gray, varying from black at the weakest intensity to white at the strongest. + + hedId + HED_0013019 + + + # + White intensity between 0 and 1. + + takesValue + + + valueClass + numericClass + + + hedId + HED_0013020 + + + + + HSV-color + A color representation that models how colors appear under light. + + hedId + HED_0013021 + + + HSV-value + An attribute of a visual sensation according to which an area appears to emit more or less light. + + hedId + HED_0013022 + + + # + + takesValue + + + valueClass + numericClass + + + hedId + HED_0013023 + + + + + Hue + Attribute of a visual sensation according to which an area appears to be similar to one of the perceived colors. + + hedId + HED_0013024 + + + # + Angular value between 0 and 360. + + takesValue + + + valueClass + numericClass + + + hedId + HED_0013025 + + + + + Saturation + Colorfulness of a stimulus relative to its own brightness. + + hedId + HED_0013026 + + + # + B value of RGB between 0 and 1. + + takesValue + + + valueClass + numericClass + + + hedId + HED_0013027 + + + + + + RGB-color + A color from the RGB schema. + + hedId + HED_0013028 + + + RGB-blue + The blue component. + + hedId + HED_0013029 + + + # + B value of RGB between 0 and 1. + + takesValue + + + valueClass + numericClass + + + hedId + HED_0013030 + + + + + RGB-green + The green component. + + hedId + HED_0013031 + + + # + G value of RGB between 0 and 1. + + takesValue + + + valueClass + numericClass + + + hedId + HED_0013032 + + + + + RGB-red + The red component. + + hedId + HED_0013033 + + + # + R value of RGB between 0 and 1. + + takesValue + + + valueClass + numericClass + + + hedId + HED_0013034 + + + + + + + Luminance + A quality that exists by virtue of the luminous intensity per unit area projected in a given direction. + + hedId + HED_0013035 + + + + Luminance-contrast + The difference in luminance in specific portions of a scene or image. + + suggestedTag + Percentage + Ratio + + + hedId + HED_0013036 + + + # + A non-negative value, usually in the range 0 to 1 or alternative 0 to 100, if representing a percentage. + + takesValue + + + valueClass + numericClass + + + hedId + HED_0013037 + + + + + Opacity + A measure of impenetrability to light. + + hedId + HED_0013038 + + + + + + Sensory-presentation + The entity has a sensory manifestation. + + hedId + HED_0013039 + + + Auditory-presentation + The sense of hearing is used in the presentation to the user. + + hedId + HED_0013040 + + + Loudspeaker-separation + The distance between two loudspeakers. Grouped with the Distance tag. + + suggestedTag + Distance + + + hedId + HED_0013041 + + + + Monophonic + Relating to sound transmission, recording, or reproduction involving a single transmission path. + + hedId + HED_0013042 + + + + Silent + The absence of ambient audible sound or the state of having ceased to produce sounds. + + hedId + HED_0013043 + + + + Stereophonic + Relating to, or constituting sound reproduction involving the use of separated microphones and two transmission channels to achieve the sound separation of a live hearing. + + hedId + HED_0013044 + + + + + Gustatory-presentation + The sense of taste used in the presentation to the user. + + hedId + HED_0013045 + + + + Olfactory-presentation + The sense of smell used in the presentation to the user. + + hedId + HED_0013046 + + + + Somatic-presentation + The nervous system is used in the presentation to the user. + + hedId + HED_0013047 + + + + Tactile-presentation + The sense of touch used in the presentation to the user. + + hedId + HED_0013048 + + + + Vestibular-presentation + The sense balance used in the presentation to the user. + + hedId + HED_0013049 + + + + Visual-presentation + The sense of sight used in the presentation to the user. + + hedId + HED_0013050 + + + 2D-view + A view showing only two dimensions. + + hedId + HED_0013051 + + + + 3D-view + A view showing three dimensions. + + hedId + HED_0013052 + + + + Background-view + Parts of the view that are farthest from the viewer and usually the not part of the visual focus. + + hedId + HED_0013053 + + + + Bistable-view + Something having two stable visual forms that have two distinguishable stable forms as in optical illusions. + + hedId + HED_0013054 + + + + Foreground-view + Parts of the view that are closest to the viewer and usually the most important part of the visual focus. + + hedId + HED_0013055 + + + + Foveal-view + Visual presentation directly on the fovea. A view projected on the small depression in the retina containing only cones and where vision is most acute. + + hedId + HED_0013056 + + + + Map-view + A diagrammatic representation of an area of land or sea showing physical features, cities, roads. + + hedId + HED_0013057 + + + Aerial-view + Elevated view of an object from above, with a perspective as though the observer were a bird. + + hedId + HED_0013058 + + + + Satellite-view + A representation as captured by technology such as a satellite. + + hedId + HED_0013059 + + + + Street-view + A 360-degrees panoramic view from a position on the ground. + + hedId + HED_0013060 + + + + + Peripheral-view + Indirect vision as it occurs outside the point of fixation. + + hedId + HED_0013061 + + + + + + + Task-property + Something that pertains to a task. + + extensionAllowed + + + hedId + HED_0013062 + + + Task-action-type + How an agent action should be interpreted in terms of the task specification. + + hedId + HED_0013063 + + + Appropriate-action + An action suitable or proper in the circumstances. + + relatedTag + Inappropriate-action + + + hedId + HED_0013064 + + + + Correct-action + An action that was a correct response in the context of the task. + + relatedTag + Incorrect-action + Indeterminate-action + + + hedId + HED_0013065 + + + + Correction + An action offering an improvement to replace a mistake or error. + + hedId + HED_0013066 + + + + Done-indication + An action that indicates that the participant has completed this step in the task. + + relatedTag + Ready-indication + + + hedId + HED_0013067 + + + + Imagined-action + Form a mental image or concept of something. This is used to identity something that only happened in the imagination of the participant as in imagined movements in motor imagery paradigms. + + hedId + HED_0013068 + + + + Inappropriate-action + An action not in keeping with what is correct or proper for the task. + + relatedTag + Appropriate-action + + + hedId + HED_0013069 + + + + Incorrect-action + An action considered wrong or incorrect in the context of the task. + + relatedTag + Correct-action + Indeterminate-action + + + hedId + HED_0013070 + + + + Indeterminate-action + An action that cannot be distinguished between two or more possibilities in the current context. This tag might be applied when an outside evaluator or a classification algorithm cannot determine a definitive result. + + relatedTag + Correct-action + Incorrect-action + Miss + Near-miss + + + hedId + HED_0013071 + + + + Miss + An action considered to be a failure in the context of the task. For example, if the agent is supposed to try to hit a target and misses. + + relatedTag + Near-miss + + + hedId + HED_0013072 + + + + Near-miss + An action barely satisfied the requirements of the task. In a driving experiment for example this could pertain to a narrowly avoided collision or other accident. + + relatedTag + Miss + + + hedId + HED_0013073 + + + + Omitted-action + An expected response was skipped. + + hedId + HED_0013074 + + + + Ready-indication + An action that indicates that the participant is ready to perform the next step in the task. + + relatedTag + Done-indication + + + hedId + HED_0013075 + + + + + Task-attentional-demand + Strategy for allocating attention toward goal-relevant information. + + hedId + HED_0013076 + + + Bottom-up-attention + Attentional guidance purely by externally driven factors to stimuli that are salient because of their inherent properties relative to the background. Sometimes this is referred to as stimulus driven. + + relatedTag + Top-down-attention + + + hedId + HED_0013077 + + + + Covert-attention + Paying attention without moving the eyes. + + relatedTag + Overt-attention + + + hedId + HED_0013078 + + + + Divided-attention + Integrating parallel multiple stimuli. Behavior involving responding simultaneously to multiple tasks or multiple task demands. + + relatedTag + Focused-attention + + + hedId + HED_0013079 + + + + Focused-attention + Responding discretely to specific visual, auditory, or tactile stimuli. + + relatedTag + Divided-attention + + + hedId + HED_0013080 + + + + Orienting-attention + Directing attention to a target stimulus. + + hedId + HED_0013081 + + + + Overt-attention + Selectively processing one location over others by moving the eyes to point at that location. + + relatedTag + Covert-attention + + + hedId + HED_0013082 + + + + Selective-attention + Maintaining a behavioral or cognitive set in the face of distracting or competing stimuli. Ability to pay attention to a limited array of all available sensory information. + + hedId + HED_0013083 + + + + Sustained-attention + Maintaining a consistent behavioral response during continuous and repetitive activity. + + hedId + HED_0013084 + + + + Switched-attention + Having to switch attention between two or more modalities of presentation. + + hedId + HED_0013085 + + + + Top-down-attention + Voluntary allocation of attention to certain features. Sometimes this is referred to goal-oriented attention. + + relatedTag + Bottom-up-attention + + + hedId + HED_0013086 + + + + + Task-effect-evidence + The evidence supporting the conclusion that the event had the specified effect. + + hedId + HED_0013087 + + + Behavioral-evidence + An indication or conclusion based on the behavior of an agent. + + hedId + HED_0013088 + + + + Computational-evidence + A type of evidence in which data are produced, and/or generated, and/or analyzed on a computer. + + hedId + HED_0013089 + + + + External-evidence + A phenomenon that follows and is caused by some previous phenomenon. + + hedId + HED_0013090 + + + + Intended-effect + A phenomenon that is intended to follow and be caused by some previous phenomenon. + + hedId + HED_0013091 + + + + + Task-event-role + The purpose of an event with respect to the task. + + hedId + HED_0013092 + + + Experimental-stimulus + Part of something designed to elicit a response in the experiment. + + hedId + HED_0013093 + + + + Incidental + A sensory or other type of event that is unrelated to the task or experiment. + + hedId + HED_0013094 + + + + Instructional + Usually associated with a sensory event intended to give instructions to the participant about the task or behavior. + + hedId + HED_0013095 + + + + Mishap + Unplanned disruption such as an equipment or experiment control abnormality or experimenter error. + + hedId + HED_0013096 + + + + Participant-response + Something related to a participant actions in performing the task. + + hedId + HED_0013097 + + + + Task-activity + Something that is part of the overall task or is necessary to the overall experiment but is not directly part of a stimulus-response cycle. Examples would be taking a survey or provided providing a silva sample. + + hedId + HED_0013098 + + + + Warning + Something that should warn the participant that the parameters of the task have been or are about to be exceeded such as a warning message about getting too close to the shoulder of the road in a driving task. + + hedId + HED_0013099 + + + + + Task-relationship + Specifying organizational importance of sub-tasks. + + hedId + HED_0013100 + + + Background-subtask + A part of the task which should be performed in the background as for example inhibiting blinks due to instruction while performing the primary task. + + hedId + HED_0013101 + + + + Primary-subtask + A part of the task which should be the primary focus of the participant. + + hedId + HED_0013102 + + + + + Task-stimulus-role + The role the stimulus plays in the task. + + hedId + HED_0013103 + + + Cue + A signal for an action, a pattern of stimuli indicating a particular response. + + hedId + HED_0013104 + + + + Distractor + A person or thing that distracts or a plausible but incorrect option in a multiple-choice question. In psychological studies this is sometimes referred to as a foil. + + hedId + HED_0013105 + + + + Expected + Considered likely, probable or anticipated. Something of low information value as in frequent non-targets in an RSVP paradigm. + + relatedTag + Unexpected + + + suggestedTag + Target + + + hedId + HED_0013106 + + + + Extraneous + Irrelevant or unrelated to the subject being dealt with. + + hedId + HED_0013107 + + + + Feedback + An evaluative response to an inquiry, process, event, or activity. + + hedId + HED_0013108 + + + + Go-signal + An indicator to proceed with a planned action. + + relatedTag + Stop-signal + + + hedId + HED_0013109 + + + + Meaningful + Conveying significant or relevant information. + + hedId + HED_0013110 + + + + Newly-learned + Representing recently acquired information or understanding. + + hedId + HED_0013111 + + + + Non-informative + Something that is not useful in forming an opinion or judging an outcome. + + hedId + HED_0013112 + + + + Non-target + Something other than that done or looked for. Also tag Expected if the Non-target is frequent. + + relatedTag + Target + + + hedId + HED_0013113 + + + + Not-meaningful + Not having a serious, important, or useful quality or purpose. + + hedId + HED_0013114 + + + + Novel + Having no previous example or precedent or parallel. + + hedId + HED_0013115 + + + + Oddball + Something unusual, or infrequent. + + relatedTag + Unexpected + + + suggestedTag + Target + + + hedId + HED_0013116 + + + + Penalty + A disadvantage, loss, or hardship due to some action. + + hedId + HED_0013117 + + + + Planned + Something that was decided on or arranged in advance. + + relatedTag + Unplanned + + + hedId + HED_0013118 + + + + Priming + An implicit memory effect in which exposure to a stimulus influences response to a later stimulus. + + hedId + HED_0013119 + + + + Query + A sentence of inquiry that asks for a reply. + + hedId + HED_0013120 + + + + Reward + A positive reinforcement for a desired action, behavior or response. + + hedId + HED_0013121 + + + + Stop-signal + An indicator that the agent should stop the current activity. + + relatedTag + Go-signal + + + hedId + HED_0013122 + + + + Target + Something fixed as a goal, destination, or point of examination. + + hedId + HED_0013123 + + + + Threat + An indicator that signifies hostility and predicts an increased probability of attack. + + hedId + HED_0013124 + + + + Timed + Something planned or scheduled to be done at a particular time or lasting for a specified amount of time. + + hedId + HED_0013125 + + + + Unexpected + Something that is not anticipated. + + relatedTag + Expected + + + hedId + HED_0013126 + + + + Unplanned + Something that has not been planned as part of the task. + + relatedTag + Planned + + + hedId + HED_0013127 + + + + + + + Relation + Concerns the way in which two or more people or things are connected. + + extensionAllowed + + + hedId + HED_0013128 + + + Comparative-relation + Something considered in comparison to something else. The first entity is the focus. + + hedId + HED_0013129 + + + Approximately-equal-to + (A, (Approximately-equal-to, B)) indicates that A and B have almost the same value. Here A and B could refer to sizes, orders, positions or other quantities. + + hedId + HED_0013130 + + + + Equal-to + (A, (Equal-to, B)) indicates that the size or order of A is the same as that of B. + + hedId + HED_0013131 + + + + Greater-than + (A, (Greater-than, B)) indicates that the relative size or order of A is bigger than that of B. + + hedId + HED_0013132 + + + + Greater-than-or-equal-to + (A, (Greater-than-or-equal-to, B)) indicates that the relative size or order of A is bigger than or the same as that of B. + + hedId + HED_0013133 + + + + Less-than + (A, (Less-than, B)) indicates that A is smaller than B. Here A and B could refer to sizes, orders, positions or other quantities. + + hedId + HED_0013134 + + + + Less-than-or-equal-to + (A, (Less-than-or-equal-to, B)) indicates that the relative size or order of A is smaller than or equal to B. + + hedId + HED_0013135 + + + + Not-equal-to + (A, (Not-equal-to, B)) indicates that the size or order of A is not the same as that of B. + + hedId + HED_0013136 + + + + + Connective-relation + Indicates two entities are related in some way. The first entity is the focus. + + hedId + HED_0013137 + + + Belongs-to + (A, (Belongs-to, B)) indicates that A is a member of B. + + hedId + HED_0013138 + + + + Connected-to + (A, (Connected-to, B)) indicates that A is related to B in some respect, usually through a direct link. + + hedId + HED_0013139 + + + + Contained-in + (A, (Contained-in, B)) indicates that A is completely inside of B. + + hedId + HED_0013140 + + + + Described-by + (A, (Described-by, B)) indicates that B provides information about A. + + hedId + HED_0013141 + + + + From-to + (A, (From-to, B)) indicates a directional relation from A to B. A is considered the source. + + hedId + HED_0013142 + + + + Group-of + (A, (Group-of, B)) indicates A is a group of items of type B. + + hedId + HED_0013143 + + + + Implied-by + (A, (Implied-by, B)) indicates B is suggested by A. + + hedId + HED_0013144 + + + + Includes + (A, (Includes, B)) indicates that A has B as a member or part. + + hedId + HED_0013145 + + + + Interacts-with + (A, (Interacts-with, B)) indicates A and B interact, possibly reciprocally. + + hedId + HED_0013146 + + + + Member-of + (A, (Member-of, B)) indicates A is a member of group B. + + hedId + HED_0013147 + + + + Part-of + (A, (Part-of, B)) indicates A is a part of the whole B. + + hedId + HED_0013148 + + + + Performed-by + (A, (Performed-by, B)) indicates that the action or procedure A was carried out by agent B. + + hedId + HED_0013149 + + + + Performed-using + (A, (Performed-using, B)) indicates that the action or procedure A was accomplished using B. + + hedId + HED_0013150 + + + + Related-to + (A, (Related-to, B)) indicates A has some relationship to B. + + hedId + HED_0013151 + + + + Unrelated-to + (A, (Unrelated-to, B)) indicates that A is not related to B.For example, A is not related to Task. + + hedId + HED_0013152 + + + + + Directional-relation + A relationship indicating direction of change of one entity relative to another. The first entity is the focus. + + hedId + HED_0013153 + + + Away-from + (A, (Away-from, B)) indicates that A is going or has moved away from B. The meaning depends on A and B. + + hedId + HED_0013154 + + + + Towards + (A, (Towards, B)) indicates that A is going to or has moved to B. The meaning depends on A and B. + + hedId + HED_0013155 + + + + + Logical-relation + Indicating a logical relationship between entities. The first entity is usually the focus. + + hedId + HED_0013156 + + + And + (A, (And, B)) means A and B are both in effect. + + hedId + HED_0013157 + + + + Or + (A, (Or, B)) means at least one of A and B are in effect. + + hedId + HED_0013158 + + + + + Spatial-relation + Indicating a relationship about position between entities. + + hedId + HED_0013159 + + + Above + (A, (Above, B)) means A is in a place or position that is higher than B. + + hedId + HED_0013160 + + + + Across-from + (A, (Across-from, B)) means A is on the opposite side of something from B. + + hedId + HED_0013161 + + + + Adjacent-to + (A, (Adjacent-to, B)) indicates that A is next to B in time or space. + + hedId + HED_0013162 + + + + Ahead-of + (A, (Ahead-of, B)) indicates that A is further forward in time or space in B. + + hedId + HED_0013163 + + + + Around + (A, (Around, B)) means A is in or near the present place or situation of B. + + hedId + HED_0013164 + + + + Behind + (A, (Behind, B)) means A is at or to the far side of B, typically so as to be hidden by it. + + hedId + HED_0013165 + + + + Below + (A, (Below, B)) means A is in a place or position that is lower than the position of B. + + hedId + HED_0013166 + + + + Between + (A, (Between, (B, C))) means A is in the space or interval separating B and C. + + hedId + HED_0013167 + + + + Bilateral-to + (A, (Bilateral, B)) means A is on both sides of B or affects both sides of B. + + hedId + HED_0013168 + + + + Bottom-edge-of + (A, (Bottom-edge-of, B)) means A is on the bottom most part or or near the boundary of B. + + relatedTag + Left-edge-of + Right-edge-of + Top-edge-of + + + hedId + HED_0013169 + + + + Boundary-of + (A, (Boundary-of, B)) means A is on or part of the edge or boundary of B. + + hedId + HED_0013170 + + + + Center-of + (A, (Center-of, B)) means A is at a point or or in an area that is approximately central within B. + + hedId + HED_0013171 + + + + Close-to + (A, (Close-to, B)) means A is at a small distance from or is located near in space to B. + + hedId + HED_0013172 + + + + Far-from + (A, (Far-from, B)) means A is at a large distance from or is not located near in space to B. + + hedId + HED_0013173 + + + + In-front-of + (A, (In-front-of, B)) means A is in a position just ahead or at the front part of B, potentially partially blocking B from view. + + hedId + HED_0013174 + + + + Left-edge-of + (A, (Left-edge-of, B)) means A is located on the left side of B on or near the boundary of B. + + relatedTag + Bottom-edge-of + Right-edge-of + Top-edge-of + + + hedId + HED_0013175 + + + + Left-side-of + (A, (Left-side-of, B)) means A is located on the left side of B usually as part of B. + + relatedTag + Right-side-of + + + hedId + HED_0013176 + + + + Lower-center-of + (A, (Lower-center-of, B)) means A is situated on the lower center part of B (due south). This relation is often used to specify qualitative information about screen position. + + relatedTag + Center-of + Lower-left-of + Lower-right-of + Upper-center-of + Upper-right-of + + + hedId + HED_0013177 + + + + Lower-left-of + (A, (Lower-left-of, B)) means A is situated on the lower left part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Center-of + Lower-center-of + Lower-right-of + Upper-center-of + Upper-left-of + Upper-right-of + + + hedId + HED_0013178 + + + + Lower-right-of + (A, (Lower-right-of, B)) means A is situated on the lower right part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Center-of + Lower-center-of + Lower-left-of + Upper-left-of + Upper-center-of + Upper-left-of + Lower-right-of + + + hedId + HED_0013179 + + + + Outside-of + (A, (Outside-of, B)) means A is located in the space around but not including B. + + hedId + HED_0013180 + + + + Over + (A, (Over, B)) means A above is above B so as to cover or protect or A extends over the a general area as from a from a vantage point. + + hedId + HED_0013181 + + + + Right-edge-of + (A, (Right-edge-of, B)) means A is located on the right side of B on or near the boundary of B. + + relatedTag + Bottom-edge-of + Left-edge-of + Top-edge-of + + + hedId + HED_0013182 + + + + Right-side-of + (A, (Right-side-of, B)) means A is located on the right side of B usually as part of B. + + relatedTag + Left-side-of + + + hedId + HED_0013183 + + + + To-left-of + (A, (To-left-of, B)) means A is located on or directed toward the side to the west of B when B is facing north. This term is used when A is not part of B. + + hedId + HED_0013184 + + + + To-right-of + (A, (To-right-of, B)) means A is located on or directed toward the side to the east of B when B is facing north. This term is used when A is not part of B. + + hedId + HED_0013185 + + + + Top-edge-of + (A, (Top-edge-of, B)) means A is on the uppermost part or or near the boundary of B. + + relatedTag + Left-edge-of + Right-edge-of + Bottom-edge-of + + + hedId + HED_0013186 + + + + Top-of + (A, (Top-of, B)) means A is on the uppermost part, side, or surface of B. + + hedId + HED_0013187 + + + + Underneath + (A, (Underneath, B)) means A is situated directly below and may be concealed by B. + + hedId + HED_0013188 + + + + Upper-center-of + (A, (Upper-center-of, B)) means A is situated on the upper center part of B (due north). This relation is often used to specify qualitative information about screen position. + + relatedTag + Center-of + Lower-center-of + Lower-left-of + Lower-right-of + Upper-center-of + Upper-right-of + + + hedId + HED_0013189 + + + + Upper-left-of + (A, (Upper-left-of, B)) means A is situated on the upper left part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Center-of + Lower-center-of + Lower-left-of + Lower-right-of + Upper-center-of + Upper-right-of + + + hedId + HED_0013190 + + + + Upper-right-of + (A, (Upper-right-of, B)) means A is situated on the upper right part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Center-of + Lower-center-of + Lower-left-of + Upper-left-of + Upper-center-of + Lower-right-of + + + hedId + HED_0013191 + + + + Within + (A, (Within, B)) means A is on the inside of or contained in B. + + hedId + HED_0013192 + + + + + Temporal-relation + A relationship that includes a temporal or time-based component. + + hedId + HED_0013193 + + + After + (A, (After, B)) means A happens at a time subsequent to a reference time related to B. + + hedId + HED_0013194 + + + + Asynchronous-with + (A, (Asynchronous-with, B)) means A happens at times not occurring at the same time or having the same period or phase as B. + + hedId + HED_0013195 + + + + Before + (A, (Before, B)) means A happens at a time earlier in time or order than B. + + hedId + HED_0013196 + + + + During + (A, (During, B)) means A happens at some point in a given period of time in which B is ongoing. + + hedId + HED_0013197 + + + + Synchronous-with + (A, (Synchronous-with, B)) means A happens at occurs at the same time or rate as B. + + hedId + HED_0013198 + + + + Waiting-for + (A, (Waiting-for, B)) means A pauses for something to happen in B. + + hedId + HED_0013199 + + + + + + + + accelerationUnits + + defaultUnits + m-per-s^2 + + + hedId + HED_0011500 + + + m-per-s^2 + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + allowedCharacter + caret + + + hedId + HED_0011600 + + + + + angleUnits + + defaultUnits + radian + + + hedId + HED_0011501 + + + radian + + SIUnit + + + conversionFactor + 1.0 + + + hedId + HED_0011601 + + + + rad + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + hedId + HED_0011602 + + + + degree + + conversionFactor + 0.0174533 + + + hedId + HED_0011603 + + + + + areaUnits + + defaultUnits + m^2 + + + hedId + HED_0011502 + + + m^2 + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + allowedCharacter + caret + + + hedId + HED_0011604 + + + + + currencyUnits + Units indicating the worth of something. + + defaultUnits + $ + + + hedId + HED_0011503 + + + dollar + + conversionFactor + 1.0 + + + hedId + HED_0011605 + + + + $ + + unitPrefix + + + unitSymbol + + + conversionFactor + 1.0 + + + allowedCharacter + dollar + + + hedId + HED_0011606 + + + + euro + The official currency of a large subset of member countries of the European Union. + + hedId + HED_0011607 + + + + point + An arbitrary unit of value, usually an integer indicating reward or penalty. + + hedId + HED_0011608 + + + + + electricPotentialUnits + + defaultUnits + uV + + + hedId + HED_0011504 + + + V + + SIUnit + + + unitSymbol + + + conversionFactor + 0.000001 + + + hedId + HED_0011609 + + + + uV + Added as a direct unit because it is the default unit. + + conversionFactor + 1.0 + + + hedId + HED_0011644 + + + + volt + + SIUnit + + + conversionFactor + 0.000001 + + + hedId + HED_0011610 + + + + + frequencyUnits + + defaultUnits + Hz + + + hedId + HED_0011505 + + + hertz + + SIUnit + + + conversionFactor + 1.0 + + + hedId + HED_0011611 + + + + Hz + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + hedId + HED_0011612 + + + + + intensityUnits + + defaultUnits + dB + + + hedId + HED_0011506 + + + dB + Intensity expressed as ratio to a threshold. May be used for sound intensity. + + unitSymbol + + + conversionFactor + 1.0 + + + hedId + HED_0011613 + + + + candela + Units used to express light intensity. + + SIUnit + + + hedId + HED_0011614 + + + + cd + Units used to express light intensity. + + SIUnit + + + unitSymbol + + + hedId + HED_0011615 + + + + + jerkUnits + + defaultUnits + m-per-s^3 + + + hedId + HED_0011507 + + + m-per-s^3 + + unitSymbol + + + conversionFactor + 1.0 + + + allowedCharacter + caret + + + hedId + HED_0011616 + + + + + magneticFieldUnits + + defaultUnits + T + + + hedId + HED_0011508 + + + tesla + + SIUnit + + + conversionFactor + 10e-15 + + + hedId + HED_0011617 + + + + T + + SIUnit + + + unitSymbol + + + conversionFactor + 10e-15 + + + hedId + HED_0011618 + + + + + memorySizeUnits + + defaultUnits + B + + + hedId + HED_0011509 + + + byte + + SIUnit + + + conversionFactor + 1.0 + + + hedId + HED_0011619 + + + + B + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + hedId + HED_0011620 + + + + + physicalLengthUnits + + defaultUnits + m + + + hedId + HED_0011510 + + + foot + + conversionFactor + 0.3048 + + + hedId + HED_0011621 + + + + inch + + conversionFactor + 0.0254 + + + hedId + HED_0011622 + + + + meter + + SIUnit + + + conversionFactor + 1.0 + + + hedId + HED_0011623 + + + + metre + + SIUnit + + + conversionFactor + 1.0 + + + hedId + HED_0011624 + + + + m + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + hedId + HED_0011625 + + + + mile + + conversionFactor + 1609.34 + + + hedId + HED_0011626 + + + + + speedUnits + + defaultUnits + m-per-s + + + hedId + HED_0011511 + + + m-per-s + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + hedId + HED_0011627 + + + + mph + + unitSymbol + + + conversionFactor + 0.44704 + + + hedId + HED_0011628 + + + + kph + + unitSymbol + + + conversionFactor + 0.277778 + + + hedId + HED_0011629 + + + + + temperatureUnits + + defaultUnits + degree-Celsius + + + hedId + HED_0011512 + + + degree-Celsius + + SIUnit + + + conversionFactor + 1.0 + + + hedId + HED_0011630 + + + + degree Celsius + Units are not allowed to have spaces. Use degree-Celsius or oC instead. + + deprecatedFrom + 8.2.0 + + + SIUnit + + + conversionFactor + 1.0 + + + hedId + HED_0011631 + + + + oC + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + hedId + HED_0011632 + + + + + timeUnits + + defaultUnits + s + + + hedId + HED_0011513 + + + second + + SIUnit + + + conversionFactor + 1.0 + + + hedId + HED_0011633 + + + + s + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + hedId + HED_0011634 + + + + day + + conversionFactor + 86400 + + + hedId + HED_0011635 + + + + month + + hedId + HED_0011645 + + + + minute + + conversionFactor + 60 + + + hedId + HED_0011636 + + + + hour + Should be in 24-hour format. + + conversionFactor + 3600 + + + hedId + HED_0011637 + + + + year + Years do not have a constant conversion factor to seconds. + + hedId + HED_0011638 + + + + + volumeUnits + + defaultUnits + m^3 + + + hedId + HED_0011514 + + + m^3 + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + allowedCharacter + caret + + + hedId + HED_0011639 + + + + + weightUnits + + defaultUnits + g + + + hedId + HED_0011515 + + + g + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + hedId + HED_0011640 + + + + gram + + SIUnit + + + conversionFactor + 1.0 + + + hedId + HED_0011641 + + + + pound + + conversionFactor + 453.592 + + + hedId + HED_0011642 + + + + lb + + conversionFactor + 453.592 + + + hedId + HED_0011643 + + + + + + + deca + SI unit multiple representing 10e1. + + SIUnitModifier + + + conversionFactor + 10.0 + + + hedId + HED_0011400 + + + + da + SI unit multiple representing 10e1. + + SIUnitSymbolModifier + + + conversionFactor + 10.0 + + + hedId + HED_0011401 + + + + hecto + SI unit multiple representing 10e2. + + SIUnitModifier + + + conversionFactor + 100.0 + + + hedId + HED_0011402 + + + + h + SI unit multiple representing 10e2. + + SIUnitSymbolModifier + + + conversionFactor + 100.0 + + + hedId + HED_0011403 + + + + kilo + SI unit multiple representing 10e3. + + SIUnitModifier + + + conversionFactor + 1000.0 + + + hedId + HED_0011404 + + + + k + SI unit multiple representing 10e3. + + SIUnitSymbolModifier + + + conversionFactor + 1000.0 + + + hedId + HED_0011405 + + + + mega + SI unit multiple representing 10e6. + + SIUnitModifier + + + conversionFactor + 10e6 + + + hedId + HED_0011406 + + + + M + SI unit multiple representing 10e6. + + SIUnitSymbolModifier + + + conversionFactor + 10e6 + + + hedId + HED_0011407 + + + + giga + SI unit multiple representing 10e9. + + SIUnitModifier + + + conversionFactor + 10e9 + + + hedId + HED_0011408 + + + + G + SI unit multiple representing 10e9. + + SIUnitSymbolModifier + + + conversionFactor + 10e9 + + + hedId + HED_0011409 + + + + tera + SI unit multiple representing 10e12. + + SIUnitModifier + + + conversionFactor + 10e12 + + + hedId + HED_0011410 + + + + T + SI unit multiple representing 10e12. + + SIUnitSymbolModifier + + + conversionFactor + 10e12 + + + hedId + HED_0011411 + + + + peta + SI unit multiple representing 10e15. + + SIUnitModifier + + + conversionFactor + 10e15 + + + hedId + HED_0011412 + + + + P + SI unit multiple representing 10e15. + + SIUnitSymbolModifier + + + conversionFactor + 10e15 + + + hedId + HED_0011413 + + + + exa + SI unit multiple representing 10e18. + + SIUnitModifier + + + conversionFactor + 10e18 + + + hedId + HED_0011414 + + + + E + SI unit multiple representing 10e18. + + SIUnitSymbolModifier + + + conversionFactor + 10e18 + + + hedId + HED_0011415 + + + + zetta + SI unit multiple representing 10e21. + + SIUnitModifier + + + conversionFactor + 10e21 + + + hedId + HED_0011416 + + + + Z + SI unit multiple representing 10e21. + + SIUnitSymbolModifier + + + conversionFactor + 10e21 + + + hedId + HED_0011417 + + + + yotta + SI unit multiple representing 10e24. + + SIUnitModifier + + + conversionFactor + 10e24 + + + hedId + HED_0011418 + + + + Y + SI unit multiple representing 10e24. + + SIUnitSymbolModifier + + + conversionFactor + 10e24 + + + hedId + HED_0011419 + + + + deci + SI unit submultiple representing 10e-1. + + SIUnitModifier + + + conversionFactor + 0.1 + + + hedId + HED_0011420 + + + + d + SI unit submultiple representing 10e-1. + + SIUnitSymbolModifier + + + conversionFactor + 0.1 + + + hedId + HED_0011421 + + + + centi + SI unit submultiple representing 10e-2. + + SIUnitModifier + + + conversionFactor + 0.01 + + + hedId + HED_0011422 + + + + c + SI unit submultiple representing 10e-2. + + SIUnitSymbolModifier + + + conversionFactor + 0.01 + + + hedId + HED_0011423 + + + + milli + SI unit submultiple representing 10e-3. + + SIUnitModifier + + + conversionFactor + 0.001 + + + hedId + HED_0011424 + + + + m + SI unit submultiple representing 10e-3. + + SIUnitSymbolModifier + + + conversionFactor + 0.001 + + + hedId + HED_0011425 + + + + micro + SI unit submultiple representing 10e-6. + + SIUnitModifier + + + conversionFactor + 10e-6 + + + hedId + HED_0011426 + + + + u + SI unit submultiple representing 10e-6. + + SIUnitSymbolModifier + + + conversionFactor + 10e-6 + + + hedId + HED_0011427 + + + + nano + SI unit submultiple representing 10e-9. + + SIUnitModifier + + + conversionFactor + 10e-9 + + + hedId + HED_0011428 + + + + n + SI unit submultiple representing 10e-9. + + SIUnitSymbolModifier + + + conversionFactor + 10e-9 + + + hedId + HED_0011429 + + + + pico + SI unit submultiple representing 10e-12. + + SIUnitModifier + + + conversionFactor + 10e-12 + + + hedId + HED_0011430 + + + + p + SI unit submultiple representing 10e-12. + + SIUnitSymbolModifier + + + conversionFactor + 10e-12 + + + hedId + HED_0011431 + + + + femto + SI unit submultiple representing 10e-15. + + SIUnitModifier + + + conversionFactor + 10e-15 + + + hedId + HED_0011432 + + + + f + SI unit submultiple representing 10e-15. + + SIUnitSymbolModifier + + + conversionFactor + 10e-15 + + + hedId + HED_0011433 + + + + atto + SI unit submultiple representing 10e-18. + + SIUnitModifier + + + conversionFactor + 10e-18 + + + hedId + HED_0011434 + + + + a + SI unit submultiple representing 10e-18. + + SIUnitSymbolModifier + + + conversionFactor + 10e-18 + + + hedId + HED_0011435 + + + + zepto + SI unit submultiple representing 10e-21. + + SIUnitModifier + + + conversionFactor + 10e-21 + + + hedId + HED_0011436 + + + + z + SI unit submultiple representing 10e-21. + + SIUnitSymbolModifier + + + conversionFactor + 10e-21 + + + hedId + HED_0011437 + + + + yocto + SI unit submultiple representing 10e-24. + + SIUnitModifier + + + conversionFactor + 10e-24 + + + hedId + HED_0011438 + + + + y + SI unit submultiple representing 10e-24. + + SIUnitSymbolModifier + + + conversionFactor + 10e-24 + + + hedId + HED_0011439 + + + + + + dateTimeClass + Date-times should conform to ISO8601 date-time format YYYY-MM-DDThh:mm:ss.000000Z (year, month, day, hour (24h), minute, second, optional fractional seconds, and optional UTC time indicator. Any variation on the full form is allowed. + + allowedCharacter + digits + T + hyphen + colon + + + hedId + HED_0011301 + + + + nameClass + Value class designating values that have the characteristics of node names. The allowed characters are alphanumeric, hyphen, and underscore. + + allowedCharacter + letters + digits + underscore + hyphen + + + hedId + HED_0011302 + + + + numericClass + Value must be a valid numerical value. + + allowedCharacter + digits + E + e + plus + hyphen + period + + + hedId + HED_0011303 + + + + posixPath + Posix path specification. + + allowedCharacter + digits + letters + slash + colon + + + hedId + HED_0011304 + + + + textClass + Values that have the characteristics of text such as in descriptions. The text characters include printable characters (32 <= ASCII< 127) excluding comma, square bracket and curly braces as well as non ASCII (ASCII codes > 127). + + allowedCharacter + text + + + hedId + HED_0011305 + + + + + + hedId + The unique identifier of this element in the HED namespace. + + elementDomain + + + stringRange + + + hedId + HED_0010500 + + + annotationProperty + + + + requireChild + This tag must have a descendent. + + tagDomain + + + boolRange + + + hedId + HED_0010501 + + + annotationProperty + + + + rooted + This top-level library schema node should have a parent which is the indicated node in the partnered standard schema. + + tagDomain + + + tagRange + + + hedId + HED_0010502 + + + annotationProperty + + + + takesValue + This tag is a hashtag placeholder that is expected to be replaced with a user-defined value. + + tagDomain + + + boolRange + + + hedId + HED_0010503 + + + annotationProperty + + + + defaultUnits + The default units to use if the placeholder has a unit class but the substituted value has no units. + + unitClassDomain + + + unitRange + + + hedId + HED_0010104 + + + + isPartOf + This tag is part of the indicated tag -- as in the nose is part of the face. + + tagDomain + + + tagRange + + + hedId + HED_0010109 + + + + relatedTag + A HED tag that is closely related to this tag. This attribute is used by tagging tools. + + tagDomain + + + tagRange + + + hedId + HED_0010105 + + + + suggestedTag + A tag that is often associated with this tag. This attribute is used by tagging tools to provide tagging suggestions. + + tagDomain + + + tagRange + + + hedId + HED_0010106 + + + + unitClass + The unit class that the value of a placeholder node can belong to. + + tagDomain + + + unitClassRange + + + hedId + HED_0010107 + + + + valueClass + Type of value taken on by the value of a placeholder node. + + tagDomain + + + valueClassRange + + + hedId + HED_0010108 + + + + allowedCharacter + A special character that is allowed in expressing the value of a placeholder of a specified value class. Allowed characters may be listed individual, named individually, or named as a group as specified in Section 2.2 Character sets and restrictions of the HED specification. + + unitDomain + + + unitModifierDomain + + + valueClassDomain + + + stringRange + + + hedId + HED_0010304 + + + + conversionFactor + The factor to multiply these units or unit modifiers by to convert to default units. + + unitDomain + + + unitModifierDomain + + + numericRange + + + hedId + HED_0010305 + + + + deprecatedFrom + The latest schema version in which the element was not deprecated. + + elementDomain + + + stringRange + + + hedId + HED_0010306 + + + + extensionAllowed + Users can add unlimited levels of child nodes under this tag. This tag is propagated to child nodes except for hashtag placeholders. + + tagDomain + + + boolRange + + + hedId + HED_0010307 + + + + inLibrary + The named library schema that this schema element is from. This attribute is added by tools when a library schema is merged into its partnered standard schema. + + elementDomain + + + stringRange + + + hedId + HED_0010309 + + + + reserved + This tag has special meaning and requires special handling by tools. + + tagDomain + + + boolRange + + + hedId + HED_0010310 + + + + SIUnit + This unit element is an SI unit and can be modified by multiple and sub-multiple names. Note that some units such as byte are designated as SI units although they are not part of the standard. + + unitDomain + + + boolRange + + + hedId + HED_0010311 + + + + SIUnitModifier + This SI unit modifier represents a multiple or sub-multiple of a base unit rather than a unit symbol. + + unitModifierDomain + + + boolRange + + + hedId + HED_0010312 + + + + SIUnitSymbolModifier + This SI unit modifier represents a multiple or sub-multiple of a unit symbol rather than a base symbol. + + unitModifierDomain + + + boolRange + + + hedId + HED_0010313 + + + + tagGroup + This tag can only appear inside a tag group. + + tagDomain + + + boolRange + + + hedId + HED_0010314 + + + + topLevelTagGroup + This tag (or its descendants) can only appear in a top-level tag group. There are additional tag-specific restrictions on what other tags can appear in the group with this tag. + + tagDomain + + + boolRange + + + hedId + HED_0010315 + + + + unique + Only one of this tag or its descendants can be used in the event-level HED string. + + tagDomain + + + boolRange + + + hedId + HED_0010316 + + + + unitPrefix + This unit is a prefix unit (e.g., dollar sign in the currency units). + + unitDomain + + + boolRange + + + hedId + HED_0010317 + + + + unitSymbol + This tag is an abbreviation or symbol representing a type of unit. Unit symbols represent both the singular and the plural and thus cannot be pluralized. + + unitDomain + + + boolRange + + + hedId + HED_0010318 + + + + + + annotationProperty + The value is not inherited by child nodes. + + hedId + HED_0010701 + + + + boolRange + This schema attribute's value can be true or false. This property was formerly named boolProperty. + + hedId + HED_0010702 + + + + elementDomain + This schema attribute can apply to any type of element class (i.e., tag, unit, unit class, unit modifier, or value class). This property was formerly named elementProperty. + + hedId + HED_0010703 + + + + tagDomain + This schema attribute can apply to node (tag-term) elements. This was added so attributes could apply to multiple types of elements. This property was formerly named nodeProperty. + + hedId + HED_0010704 + + + + tagRange + This schema attribute's value can be a node. This property was formerly named nodeProperty. + + hedId + HED_0010705 + + + + numericRange + This schema attribute's value can be numeric. + + hedId + HED_0010706 + + + + stringRange + This schema attribute's value can be a string. + + hedId + HED_0010707 + + + + unitClassDomain + This schema attribute can apply to unit classes. This property was formerly named unitClassProperty. + + hedId + HED_0010708 + + + + unitClassRange + This schema attribute's value can be a unit class. + + hedId + HED_0010709 + + + + unitModifierDomain + This schema attribute can apply to unit modifiers. This property was formerly named unitModifierProperty. + + hedId + HED_0010710 + + + + unitDomain + This schema attribute can apply to units. This property was formerly named unitProperty. + + hedId + HED_0010711 + + + + unitRange + This schema attribute's value can be units. + + hedId + HED_0010712 + + + + valueClassDomain + This schema attribute can apply to value classes. This property was formerly named valueClassProperty. + + hedId + HED_0010713 + + + + valueClassRange + This schema attribute's value can be a value class. + + hedId + HED_0010714 + + + + The Standardized Computer-based Organized Reporting of EEG (SCORE) is a standard terminology for scalp EEG data assessment designed for use in clinical practice that may also be used for research purposes. +The SCORE standard defines terms for describing phenomena observed in scalp EEG data. It is also potentially applicable (with some suitable extensions) to EEG recorded in critical care and neonatal settings. +The SCORE standard received European consensus and has been endorsed by the European Chapter of the International Federation of Clinical Neurophysiology (IFCN) and the International League Against Epilepsy (ILAE) Commission on European Affairs. +A second revised and extended version of SCORE achieved international consensus. + +1 Beniczky ea 2013: "Standardized computer based organized reporting of EEG: SCORE." Epilepsia 54(6) pp.1112-1124. +2 Beniczky ea 2017: "Standardized computer based organized reporting of EEG: SCORE second version." Clinical Neurophysiology 128(11) pp.2334-2346. +3 Hirsch ea 2013: "American Clinical Neurophysiology Society's Standardized Critical Care EEG Terminology: 2012 version." Journal of clinical neurophysiology 30(1) pp.1-27. +4 Fisher ea 2017: "Instruction manual for the ILAE 2017 operational classification of seizure types." Epilepsia 58(4) pp.531-542. +5 Trenité ea 2001: "Visual sensitivity and epilepsy: a proposed terminology and classification for clinical and EEG phenomenology." Epilepsia 42(5) pp.692-701. +6 Blume ea 2001: "Glossary of descriptive terminology for ictal semiology: report of the ILAE task force on classification and terminology." Epilepsia 42(9) pp.1212-1218. + +TPA KR DH SM July 2024 + diff --git a/hed/schema/schema_data/library_data/library_data.json b/hed/schema/schema_data/library_data/library_data.json new file mode 100644 index 000000000..3b5ca5e0e --- /dev/null +++ b/hed/schema/schema_data/library_data/library_data.json @@ -0,0 +1,11 @@ +{ + "": { + "id_range":[10000, 39999] + }, + "score": { + "id_range":[40000, 59999] + }, + "lang": { + "id_range":[60000, 79999] + } +} \ No newline at end of file diff --git a/hed/schema/schema_io/__init__.py b/hed/schema/schema_io/__init__.py index e69de29bb..8094ab86f 100644 --- a/hed/schema/schema_io/__init__.py +++ b/hed/schema/schema_io/__init__.py @@ -0,0 +1 @@ +from hed.schema.schema_io.df_util import save_dataframes, load_dataframes diff --git a/hed/schema/schema_io/df2schema.py b/hed/schema/schema_io/df2schema.py index 5b26c19f6..db43ec6f4 100644 --- a/hed/schema/schema_io/df2schema.py +++ b/hed/schema/schema_io/df2schema.py @@ -1,251 +1,278 @@ -""" -This module is used to create a HedSchema object from a set of .tsv files. -""" -import io -import os - -from hed.schema.schema_io import ontology_util -from hed.schema.hed_schema_constants import HedSectionKey, HedKey -from hed.errors.exceptions import HedFileError, HedExceptions -from hed.schema.schema_io.text2schema import SchemaLoaderText -import pandas as pd -import hed.schema.hed_schema_df_constants as constants -from hed.errors import error_reporter -from hed.schema.schema_io import text_util - - -class SchemaLoaderDF(SchemaLoaderText): - """ Load dataframe schemas from filenames - - Expected usage is SchemaLoaderDF.load(filenames) - - Note: due to supporting multiple files, this one differs from the other schema loaders - """ - - def __init__(self, filenames, schema_as_strings_or_df, name=""): - self.filenames = self.convert_filenames_to_dict(filenames) - self.schema_as_strings_or_df = schema_as_strings_or_df - if self.filenames: - reported_filename = self.filenames.get(constants.STRUCT_KEY) - else: - reported_filename = "from_strings" - super().__init__(reported_filename, None, None, None, name) - self._schema.source_format = "spreadsheet" - - @classmethod - def load_spreadsheet(cls, filenames=None, schema_as_strings_or_df=None, name=""): - """ Loads and returns the schema, including partnered schema if applicable. - - Parameters: - filenames(str or None or dict of str): A valid set of schema spreadsheet filenames - If a single filename string, assumes the standard filename suffixes. - schema_as_strings_or_df(None or dict of str): A valid set of schema spreadsheet files(tsv as strings) - name (str): what to identify this schema as - Returns: - schema(HedSchema): The new schema - """ - loader = cls(filenames, schema_as_strings_or_df=schema_as_strings_or_df, name=name) - return loader._load() - - @staticmethod - def convert_filenames_to_dict(filenames): - """Infers filename meaning based on suffix, e.g. _Tag for the tags sheet - - Parameters: - filenames(str or None or list or dict): The list to convert to a dict - If a string with a .tsv suffix: Save to that location, adding the suffix to each .tsv file - If a string with no .tsv suffix: Save to that folder, with the contents being the separate .tsv files. - Returns: - filename_dict(str: str): The required suffix to filename mapping""" - result_filenames = {} - if isinstance(filenames, str): - if filenames.endswith(".tsv"): - base, base_ext = os.path.splitext(filenames) - else: - # Load as foldername/foldername_suffix.tsv - base_dir = filenames - base_filename = os.path.split(base_dir)[1] - base = os.path.join(base_dir, base_filename) - for suffix in constants.DF_SUFFIXES: - filename = f"{base}_{suffix}.tsv" - result_filenames[suffix] = filename - filenames = result_filenames - elif isinstance(filenames, list): - for filename in filenames: - remainder, suffix = filename.replace("_", "-").rsplit("-") - for needed_suffix in constants.DF_SUFFIXES: - if needed_suffix in suffix: - result_filenames[needed_suffix] = filename - filenames = result_filenames - - return filenames - - def _open_file(self): - if self.filenames: - dataframes = load_dataframes(self.filenames) - else: - dataframes = load_dataframes_from_strings(self.schema_as_strings_or_df) - - return dataframes - - def _get_header_attributes(self, file_data): - header_attributes = {} - for row_number, row in file_data[constants.STRUCT_KEY].iterrows(): - cls = row[constants.subclass_of] - attributes = row[constants.attributes] - if cls == "HedHeader" and attributes: - header_attributes, _ = text_util._parse_header_attributes_line(attributes) - continue - - return header_attributes - - def _parse_data(self): - self._schema.prologue, self._schema.epilogue = self._get_prologue_epilogue(self.input_data) - self._schema._initialize_attributes(HedSectionKey.Properties) - self._read_attribute_section(self.input_data[constants.ATTRIBUTE_PROPERTY_KEY], - section_key=HedSectionKey.Properties) - self._read_attributes() - self._read_section(self.input_data[constants.UNIT_MODIFIER_KEY], HedSectionKey.UnitModifiers) - self._read_section(self.input_data[constants.VALUE_CLASS_KEY], HedSectionKey.ValueClasses) - self._read_section(self.input_data[constants.UNIT_CLASS_KEY], HedSectionKey.UnitClasses) - self._read_units(self.input_data[constants.UNIT_KEY]) - # This one is a special case - self._read_schema(self.input_data) - if self.fatal_errors: - self.fatal_errors = error_reporter.sort_issues(self.fatal_errors) - raise HedFileError(self.fatal_errors[0]['code'], - f"{len(self.fatal_errors)} issues found when parsing schema. See the .issues " - f"parameter on this exception for more details.", self.name, - issues=self.fatal_errors) - - def _get_prologue_epilogue(self, file_data): - prologue, epilogue = "", "" - for row_number, row in file_data[constants.STRUCT_KEY].iterrows(): - cls = row[constants.subclass_of] - description = row[constants.description] - if cls == "HedPrologue" and description: - prologue = description.replace("\\n", "\n") - continue - elif cls == "HedEpilogue" and description: - epilogue = description.replace("\\n", "\n") - - return prologue, epilogue - - def _read_schema(self, dataframe): - """Add the main schema section - - Parameters: - dataframe (pd.DataFrame): The dataframe for the main tags section - """ - self._schema._initialize_attributes(HedSectionKey.Tags) - known_parent_tags = {"HedTag": []} - level_adj = 0 - for row_number, row in dataframe[constants.TAG_KEY].iterrows(): - # skip blank rows, though there shouldn't be any - if not any(row): - continue - parent_tag = row[constants.subclass_of] - org_parent_tags = known_parent_tags.get(parent_tag, []).copy() - - tag_entry, parent_tags, _ = self._add_tag_meta(org_parent_tags, row_number, row, level_adj) - if tag_entry: - known_parent_tags[tag_entry.short_tag_name] = parent_tags.copy() - - def _read_section(self, df, section_key): - self._schema._initialize_attributes(section_key) - - for row_number, row in df.iterrows(): - new_entry = self._create_entry(row_number, row, section_key) - self._add_to_dict(row_number, row, new_entry, section_key) - - def _read_units(self, df): - self._schema._initialize_attributes(HedSectionKey.Units) - - for row_number, row in df.iterrows(): - new_entry = self._create_entry(row_number, row, HedSectionKey.Units) - unit_class_name = row[constants.has_unit_class] - unit_class_entry = self._schema.get_tag_entry(unit_class_name, HedSectionKey.UnitClasses) - unit_class_entry.add_unit(new_entry) - self._add_to_dict(row_number, row, new_entry, HedSectionKey.Units) - - def _read_attributes(self): - self._schema._initialize_attributes(HedSectionKey.Attributes) - self._read_attribute_section(self.input_data[constants.ANNOTATION_KEY], True) - self._read_attribute_section(self.input_data[constants.OBJECT_KEY]) - self._read_attribute_section(self.input_data[constants.DATA_KEY]) - - def _read_attribute_section(self, df, annotation_property=False, section_key=HedSectionKey.Attributes): - # todo: this needs to ALSO check range/domain(and verify they match) - for row_number, row in df.iterrows(): - new_entry = self._create_entry(row_number, row, section_key) - if annotation_property: - new_entry._set_attribute_value(HedKey.AnnotationProperty, True) - self._add_to_dict(row_number, row, new_entry, section_key) - - def _get_tag_name(self, row): - base_tag_name = row[constants.name] - if base_tag_name.endswith("-#"): - return "#", 0 - return base_tag_name, 0 - - def _create_entry(self, row_number, row, key_class, full_tag_name=None): - element_name, _ = self._get_tag_name(row) - if full_tag_name: - element_name = full_tag_name - - node_attributes = self._get_tag_attributes(row_number, row) - - hed_id = row[constants.hed_id] - if hed_id: - node_attributes[HedKey.HedID] = hed_id - - description = row[constants.description] - tag_entry = self._schema._create_tag_entry(element_name, key_class) - - if description: - tag_entry.description = description.strip() - - for attribute_name, attribute_value in node_attributes.items(): - tag_entry._set_attribute_value(attribute_name, attribute_value) - - return tag_entry - - def _get_tag_attributes(self, row_number, row): - """ Get the tag attributes from a row. - - Parameters: - row_number (int): The row number to report errors as. - row (pd.Series): A tag row. - Returns: - dict: Dictionary of attributes. - """ - try: - return ontology_util.get_attributes_from_row(row) - except ValueError as e: - self._add_fatal_error(row_number, str(row), str(e)) - - -def load_dataframes(filenames): - dict_filenames = SchemaLoaderDF.convert_filenames_to_dict(filenames) - dataframes = ontology_util.create_empty_dataframes() - for key, filename in dict_filenames.items(): - try: - dataframes[key] = pd.read_csv(filename, sep="\t", dtype=str, na_filter=False) - except OSError: - # todo: consider if we want to report this error(we probably do) - pass # We will use a blank one for this - return dataframes - - -def load_dataframes_from_strings(schema_data): - """ Load the given strings/dataframes as dataframes. - - Parameters: - schema_data(dict): The dict of files(strings or pd.DataFrames) key being constants like TAG_KEY - - Returns: - schema_data(dict): A dict with the same keys as schema_data, but values are dataframes if not before - """ - return {key: value if isinstance(value, pd.DataFrame) else pd.read_csv(io.StringIO(value), sep="\t", - dtype=str, na_filter=False) - for key, value in schema_data.items()} +""" +This module is used to create a HedSchema object from a set of .tsv files. +""" +import io + +from hed.schema.schema_io import df_util, load_dataframes +from hed.schema.hed_schema_constants import HedSectionKey, HedKey +from hed.errors.exceptions import HedFileError, HedExceptions +from hed.schema.schema_io.base2schema import SchemaLoader +import pandas as pd +import hed.schema.hed_schema_df_constants as constants +from hed.errors import error_reporter +from hed.schema.schema_io import text_util + + +class SchemaLoaderDF(SchemaLoader): + """ Load dataframe schemas from filenames + + Expected usage is SchemaLoaderDF.load(filenames) + + Note: due to supporting multiple files, this one differs from the other schema loaders + """ + + def __init__(self, filenames, schema_as_strings_or_df, name=""): + self.filenames = df_util.convert_filenames_to_dict(filenames) + self.schema_as_strings_or_df = schema_as_strings_or_df + if self.filenames: + reported_filename = self.filenames.get(constants.STRUCT_KEY) + else: + reported_filename = "from_strings" + super().__init__(reported_filename, None, None, None, name) + self._schema.source_format = "spreadsheet" + + @classmethod + def load_spreadsheet(cls, filenames=None, schema_as_strings_or_df=None, name=""): + """ Loads and returns the schema, including partnered schema if applicable. + + Parameters: + filenames(str or None or dict of str): A valid set of schema spreadsheet filenames + If a single filename string, assumes the standard filename suffixes. + schema_as_strings_or_df(None or dict of str): A valid set of schema spreadsheet files(tsv as strings) + name (str): what to identify this schema as + Returns: + schema(HedSchema): The new schema + """ + loader = cls(filenames, schema_as_strings_or_df=schema_as_strings_or_df, name=name) + return loader._load() + + def _open_file(self): + if self.filenames: + dataframes = load_dataframes(self.filenames) + else: + dataframes = load_dataframes_from_strings(self.schema_as_strings_or_df) + + return dataframes + + def _get_header_attributes(self, file_data): + header_attributes = {} + for row_number, row in file_data[constants.STRUCT_KEY].iterrows(): + cls = row[constants.subclass_of] + attributes = row[constants.attributes] + if cls == "HedHeader" and attributes: + header_attributes, _ = text_util._parse_header_attributes_line(attributes) + continue + + return header_attributes + + def _parse_data(self): + self._schema.prologue, self._schema.epilogue = self._get_prologue_epilogue(self.input_data) + self._schema._initialize_attributes(HedSectionKey.Properties) + self._read_attribute_section(self.input_data[constants.ATTRIBUTE_PROPERTY_KEY], + section_key=HedSectionKey.Properties) + self._read_attributes() + self._read_section(self.input_data[constants.UNIT_MODIFIER_KEY], HedSectionKey.UnitModifiers) + self._read_section(self.input_data[constants.VALUE_CLASS_KEY], HedSectionKey.ValueClasses) + self._read_section(self.input_data[constants.UNIT_CLASS_KEY], HedSectionKey.UnitClasses) + self._read_units(self.input_data[constants.UNIT_KEY]) + # This one is a special case + self._read_schema(self.input_data) + if self.fatal_errors: + self.fatal_errors = error_reporter.sort_issues(self.fatal_errors) + raise HedFileError(self.fatal_errors[0]['code'], + f"{len(self.fatal_errors)} issues found when parsing schema. See the .issues " + f"parameter on this exception for more details.", self.name, + issues=self.fatal_errors) + + def _get_prologue_epilogue(self, file_data): + prologue, epilogue = "", "" + for row_number, row in file_data[constants.STRUCT_KEY].iterrows(): + cls = row[constants.subclass_of] + description = row[constants.description] + if cls == "HedPrologue" and description: + prologue = description.replace("\\n", "\n") + continue + elif cls == "HedEpilogue" and description: + epilogue = description.replace("\\n", "\n") + + return prologue, epilogue + + def _read_schema(self, dataframe): + """Add the main schema section + + Parameters: + dataframe (pd.DataFrame): The dataframe for the main tags section + """ + self._schema._initialize_attributes(HedSectionKey.Tags) + known_parent_tags = {"HedTag": []} + iterations = 0 + # Handle this over multiple iterations in case tags have parent tags listed later in the file. + # A properly formatted .tsv file will never have parents after the child. + current_rows = list(dataframe[constants.TAG_KEY].iterrows()) + while current_rows: + iterations += 1 + next_round_rows = [] + for row_number, row in current_rows: + # skip blank rows, though there shouldn't be any + if not any(row): + continue + + parent_tag = row[constants.subclass_of] + org_parent_tags = known_parent_tags.get(parent_tag) + tag_entry = self._create_tag_entry(org_parent_tags, row_number, row) + if not tag_entry: + # This will have already raised an error + continue + + # If this is NOT a rooted tag and we have no parent, try it in another round. + if org_parent_tags is None and not tag_entry.has_attribute(HedKey.Rooted): + next_round_rows.append((row_number, row)) + continue + + tag_entry = self._add_tag_entry(tag_entry, row_number, row) + if tag_entry: + known_parent_tags[tag_entry.short_tag_name] = tag_entry.name.split("/") + + if len(next_round_rows) == len(current_rows): + for row_number, row in current_rows: + tag_name = self._get_tag_name(row) + msg = (f"Cannot resolve parent tag. " + f"There is probably an issue with circular parent tags of {tag_name} on row {row_number}.") + self._add_fatal_error(row_number, row, msg, HedExceptions.SCHEMA_TAG_TSV_BAD_PARENT) + break + current_rows = next_round_rows + + def _add_tag_entry(self, tag_entry, row_number, row): + try: + rooted_entry = self.find_rooted_entry(tag_entry, self._schema, self._loading_merged) + if rooted_entry: + parent_tags = rooted_entry.long_tag_name.split("/") + # Create the entry again for rooted tags, to get the full name. + tag_entry = self._create_tag_entry(parent_tags, row_number, row) + except HedFileError as e: + self._add_fatal_error(row_number, row, e.message, e.code) + return None + + tag_entry = self._add_to_dict(row_number, row, tag_entry, HedSectionKey.Tags) + + return tag_entry + + def _create_tag_entry(self, parent_tags, row_number, row): + """ Create a tag entry(does not add to dict) + + Parameters: + parent_tags (list): A list of parent tags in order. + row_number (int): The row number to report errors as + row (str or pd.Series): A tag row or pandas series(depends on format) + + Returns: + HedSchemaEntry: The entry for the added tag. + + Notes: + Includes attributes and description. + """ + tag_name = self._get_tag_name(row) + if tag_name: + if parent_tags: + long_tag_name = "/".join(parent_tags) + "/" + tag_name + else: + long_tag_name = tag_name + return self._create_entry(row_number, row, HedSectionKey.Tags, long_tag_name) + + self._add_fatal_error(row_number, row, "No tag name found in row.", + error_code=HedExceptions.GENERIC_ERROR) + + def _read_section(self, df, section_key): + self._schema._initialize_attributes(section_key) + + for row_number, row in df.iterrows(): + new_entry = self._create_entry(row_number, row, section_key) + self._add_to_dict(row_number, row, new_entry, section_key) + + def _read_units(self, df): + self._schema._initialize_attributes(HedSectionKey.Units) + + for row_number, row in df.iterrows(): + new_entry = self._create_entry(row_number, row, HedSectionKey.Units) + unit_class_name = row[constants.has_unit_class] + unit_class_entry = self._schema.get_tag_entry(unit_class_name, HedSectionKey.UnitClasses) + unit_class_entry.add_unit(new_entry) + self._add_to_dict(row_number, row, new_entry, HedSectionKey.Units) + + def _read_attributes(self): + self._schema._initialize_attributes(HedSectionKey.Attributes) + self._read_attribute_section(self.input_data[constants.ANNOTATION_KEY], True) + self._read_attribute_section(self.input_data[constants.OBJECT_KEY]) + self._read_attribute_section(self.input_data[constants.DATA_KEY]) + + def _read_attribute_section(self, df, annotation_property=False, section_key=HedSectionKey.Attributes): + # todo: this needs to ALSO check range/domain(and verify they match) + for row_number, row in df.iterrows(): + new_entry = self._create_entry(row_number, row, section_key) + if annotation_property: + new_entry._set_attribute_value(HedKey.AnnotationProperty, True) + self._add_to_dict(row_number, row, new_entry, section_key) + + def _get_tag_name(self, row): + base_tag_name = row[constants.name] + if base_tag_name.endswith("-#"): + return "#" + return base_tag_name + + def _create_entry(self, row_number, row, key_class, full_tag_name=None): + element_name = self._get_tag_name(row) + if full_tag_name: + element_name = full_tag_name + + node_attributes = self._get_tag_attributes(row_number, row) + + hed_id = row[constants.hed_id] + if hed_id: + node_attributes[HedKey.HedID] = hed_id + + description = row[constants.description] + tag_entry = self._schema._create_tag_entry(element_name, key_class) + + if description: + tag_entry.description = description.strip() + + for attribute_name, attribute_value in node_attributes.items(): + tag_entry._set_attribute_value(attribute_name, attribute_value) + + return tag_entry + + def _get_tag_attributes(self, row_number, row): + """ Get the tag attributes from a row. + + Parameters: + row_number (int): The row number to report errors as. + row (pd.Series): A tag row. + Returns: + dict: Dictionary of attributes. + """ + try: + return df_util.get_attributes_from_row(row) + except ValueError as e: + self._add_fatal_error(row_number, str(row), str(e)) + + def _add_to_dict(self, row_number, row, entry, key_class): + if entry.has_attribute(HedKey.InLibrary) and not self._loading_merged and not self.appending_to_schema: + self._add_fatal_error(row_number, row, + "Library tag in unmerged schema has InLibrary attribute", + HedExceptions.IN_LIBRARY_IN_UNMERGED) + + return self._add_to_dict_base(entry, key_class) + + +def load_dataframes_from_strings(schema_data): + """ Load the given strings/dataframes as dataframes. + + Parameters: + schema_data(dict): The dict of files(strings or pd.DataFrames) key being constants like TAG_KEY + + Returns: + schema_data(dict): A dict with the same keys as schema_data, but values are dataframes if not before + """ + return {key: value if isinstance(value, pd.DataFrame) else pd.read_csv(io.StringIO(value), sep="\t", + dtype=str, na_filter=False) + for key, value in schema_data.items()} diff --git a/hed/schema/schema_io/df_util.py b/hed/schema/schema_io/df_util.py new file mode 100644 index 000000000..00e2011b9 --- /dev/null +++ b/hed/schema/schema_io/df_util.py @@ -0,0 +1,185 @@ +import csv +import os + +import pandas as pd + +from hed.errors import HedFileError, HedExceptions +from hed.schema import hed_schema_df_constants as constants +from hed.schema.hed_schema_constants import HedKey +from hed.schema.hed_cache import get_library_data +from hed.schema.schema_io.text_util import parse_attribute_string, _parse_header_attributes_line + +UNKNOWN_LIBRARY_VALUE = 0 + + +def save_dataframes(base_filename, dataframe_dict): + """ Writes out the dataframes using the provided suffixes. + + Does not validate contents or suffixes. + + If base_filename has a .tsv suffix, save directly to the indicated location. + If base_filename is a directory(does NOT have a .tsv suffix), save the contents into a directory named that. + The subfiles are named the same. e.g. HED8.3.0/HED8.3.0_Tag.tsv + + Parameters: + base_filename(str): The base filename to use. Output is {base_filename}_{suffix}.tsv + See DF_SUFFIXES for all expected names. + dataframe_dict(dict of str: df.DataFrame): The list of files to save out. No validation is done. + """ + if base_filename.lower().endswith(".tsv"): + base, base_ext = os.path.splitext(base_filename) + base_dir, base_name = os.path.split(base) + else: + # Assumed as a directory name + base_dir = base_filename + base_filename = os.path.split(base_dir)[1] + base = os.path.join(base_dir, base_filename) + os.makedirs(base_dir, exist_ok=True) + for suffix, dataframe in dataframe_dict.items(): + filename = f"{base}_{suffix}.tsv" + with open(filename, mode='w', encoding='utf-8') as opened_file: + dataframe.to_csv(opened_file, sep='\t', index=False, header=True, quoting=csv.QUOTE_NONE, + lineterminator="\n") + + +def convert_filenames_to_dict(filenames, include_prefix_dfs=False): + """Infers filename meaning based on suffix, e.g. _Tag for the tags sheet + + Parameters: + filenames(str or None or list or dict): The list to convert to a dict + If a string with a .tsv suffix: Save to that location, adding the suffix to each .tsv file + If a string with no .tsv suffix: Save to that folder, with the contents being the separate .tsv files. + include_prefix_dfs(bool): If True, include the prefixes and external annotation dataframes. + Returns: + filename_dict(str: str): The required suffix to filename mapping""" + result_filenames = {} + dataframe_names = constants.DF_SUFFIXES_OMN if include_prefix_dfs else constants.DF_SUFFIXES + if isinstance(filenames, str): + if filenames.endswith(".tsv"): + base, base_ext = os.path.splitext(filenames) + else: + # Load as foldername/foldername_suffix.tsv + base_dir = filenames + base_filename = os.path.split(base_dir)[1] + base = os.path.join(base_dir, base_filename) + for suffix in dataframe_names: + filename = f"{base}_{suffix}.tsv" + result_filenames[suffix] = filename + filenames = result_filenames + elif isinstance(filenames, list): + for filename in filenames: + remainder, suffix = filename.replace("_", "-").rsplit("-") + for needed_suffix in dataframe_names: + if needed_suffix in suffix: + result_filenames[needed_suffix] = filename + filenames = result_filenames + + return filenames + + +def create_empty_dataframes(): + """Returns the default empty dataframes""" + base_dfs = {constants.STRUCT_KEY: pd.DataFrame(columns=constants.struct_columns, dtype=str), + constants.TAG_KEY: pd.DataFrame(columns=constants.tag_columns, dtype=str), + constants.UNIT_KEY: pd.DataFrame(columns=constants.unit_columns, dtype=str), + constants.UNIT_CLASS_KEY: pd.DataFrame(columns=constants.other_columns, dtype=str), + constants.UNIT_MODIFIER_KEY: pd.DataFrame(columns=constants.other_columns, dtype=str), + constants.VALUE_CLASS_KEY: pd.DataFrame(columns=constants.other_columns, dtype=str), + constants.ANNOTATION_KEY: pd.DataFrame(columns=constants.property_columns, dtype=str), + constants.DATA_KEY: pd.DataFrame(columns=constants.property_columns, dtype=str), + constants.OBJECT_KEY: pd.DataFrame(columns=constants.property_columns, dtype=str), + constants.ATTRIBUTE_PROPERTY_KEY: pd.DataFrame(columns=constants.property_columns_reduced, dtype=str), } + return base_dfs + + +def load_dataframes(filenames, include_prefix_dfs=False): + """Load the dataframes from the source folder or series of files. + + Parameters: + filenames(str or None or list or dict): The input filenames + If a string with a .tsv suffix: Save to that location, adding the suffix to each .tsv file + If a string with no .tsv suffix: Save to that folder, with the contents being the separate .tsv files. + include_prefix_dfs(bool): If True, include the prefixes and external annotation dataframes. + Returns: + dataframes_dict(str: dataframes): The suffix:dataframe dict + """ + dict_filenames = convert_filenames_to_dict(filenames, include_prefix_dfs=include_prefix_dfs) + dataframes = create_empty_dataframes() + for key, filename in dict_filenames.items(): + try: + loaded_dataframe = pd.read_csv(filename, sep="\t", dtype=str, na_filter=False) + if key in dataframes: + columns_not_in_loaded = dataframes[key].columns[~dataframes[key].columns.isin(loaded_dataframe.columns)] + # and not dataframes[key].columns.isin(loaded_dataframe.columns).all(): + if columns_not_in_loaded.any(): + raise HedFileError(HedExceptions.SCHEMA_LOAD_FAILED, + f"Required column(s) {list(columns_not_in_loaded)} missing from {filename}. " + f"The required columns are {list(dataframes[key].columns)}", filename=filename) + dataframes[key] = loaded_dataframe + except OSError: + # todo: consider if we want to report this error(we probably do) + pass # We will use a blank one for this + return dataframes + + +def get_library_name_and_id(schema): + """ Get the library("Standard" for the standard schema) and first id for a schema range + + Parameters: + schema(HedSchema): The schema to check + + Returns: + library_name(str): The capitalized library name + first_id(int): the first id for a given library + """ + + name = schema.library + + library_data = get_library_data(name) + starting_id, _ = library_data.get("id_range", (UNKNOWN_LIBRARY_VALUE, UNKNOWN_LIBRARY_VALUE)) + if not name: + name = "standard" + return name.capitalize(), starting_id + + +# todo: Replace this once we no longer support < python 3.9 +def remove_prefix(text, prefix): + if text and text.startswith(prefix): + return text[len(prefix):] + return text + + +def calculate_attribute_type(attribute_entry): + """Returns the type of this attribute(annotation, object, data) + + Returns: + attribute_type(str): "annotation", "object", or "data". + """ + attributes = attribute_entry.attributes + object_ranges = {HedKey.TagRange, HedKey.UnitRange, HedKey.UnitClassRange, HedKey.ValueClassRange} + if HedKey.AnnotationProperty in attributes: + return "annotation" + elif any(attribute in object_ranges for attribute in attributes): + return "object" + return "data" + + +def get_attributes_from_row(row): + """ Get the tag attributes from a line. + + Parameters: + row (pd.Series): A tag line. + Returns: + dict: Dictionary of attributes. + """ + if constants.properties in row.index: + attr_string = row[constants.properties] + elif constants.attributes in row.index: + attr_string = row[constants.attributes] + else: + attr_string = "" + + if constants.subclass_of in row.index and row[constants.subclass_of] == "HedHeader": + header_attributes, _ = _parse_header_attributes_line(attr_string) + return header_attributes + return parse_attribute_string(attr_string) \ No newline at end of file diff --git a/hed/schema/schema_io/ontology_util.py b/hed/schema/schema_io/ontology_util.py index bb27c881e..278f52173 100644 --- a/hed/schema/schema_io/ontology_util.py +++ b/hed/schema/schema_io/ontology_util.py @@ -1,429 +1,441 @@ -"""Utility functions for saving as an ontology or dataframe.""" -import os - -import pandas as pd - -from hed.schema.schema_io import schema_util -from hed.errors.exceptions import HedFileError -from hed.schema import hed_schema_df_constants as constants -from hed.schema.hed_schema_constants import HedKey -from hed.schema.schema_io.text_util import parse_attribute_string, _parse_header_attributes_line - -library_index_ranges = { - "": (10000, 40000), - "score": (40000, 60000), - "lang": (60000, 80000) -} -UNKNOWN_LIBRARY_VALUE = 9910000 - -object_type_id_offset = { - constants.OBJECT_KEY: (100, 300), - constants.DATA_KEY: (300, 500), - constants.ANNOTATION_KEY: (500, 700), - constants.ATTRIBUTE_PROPERTY_KEY: (700, 900), - constants.VALUE_CLASS_KEY: (1300, 1400), - constants.UNIT_MODIFIER_KEY: (1400, 1500), - constants.UNIT_CLASS_KEY: (1500, 1600), - constants.UNIT_KEY: (1600, 1700), - constants.TAG_KEY: (2000, -1), # -1 = go to end of range -} - - -def get_library_name_and_id(schema): - """ Get the library("Standard" for the standard schema) and first id for a schema range - - Parameters: - schema(HedSchema): The schema to check - - Returns: - library_name(str): The capitalized library name - first_id(int): the first id for a given library - """ - name = schema.library - - starting_id, _ = library_index_ranges.get(name, (UNKNOWN_LIBRARY_VALUE, 0)) - - if not name: - name = "standard" - return name.capitalize(), starting_id - - -def _get_hedid_range(schema_name, df_key): - """ Get the set of HedId's for this object type/schema name. - - Parameters: - schema_name(str): The known schema name with an assigned id range - df_key(str): The dataframe range type we're interested in. a key from constants.DF_SUFFIXES - - Returns: - number_set(set): A set of all id's in the requested range - """ - if df_key == constants.STRUCT_KEY: - raise NotImplementedError("Cannot assign hed_ids struct section") - - starting_id, ending_id = library_index_ranges[schema_name] - - start_object_range, end_object_range = object_type_id_offset[df_key] - if df_key == constants.TAG_KEY: - initial_tag_adj = 1 # We always skip 1 for tags - else: - initial_tag_adj = 0 - final_start = starting_id + start_object_range + initial_tag_adj - final_end = starting_id + end_object_range - if end_object_range == -1: - final_end = ending_id - return set(range(final_start, final_end)) - - -# todo: Replace this once we no longer support < python 3.9 -def remove_prefix(text, prefix): - if text and text.startswith(prefix): - return text[len(prefix):] - return text - - -def get_all_ids(df): - """Returns a set of all unique hedIds in the dataframe - - Parameters: - df(pd.DataFrame): The dataframe - - Returns: - numbers(Set or None): None if this has no hed column, otherwise all unique numbers as a set. - """ - if constants.hed_id in df.columns: - modified_df = df[constants.hed_id].apply(lambda x: remove_prefix(x, "HED_")) - modified_df = pd.to_numeric(modified_df, errors="coerce").dropna().astype(int) - return set(modified_df.unique()) - return None - - -def update_dataframes_from_schema(dataframes, schema, schema_name="", get_as_ids=False, - assign_missing_ids=False): - """ Write out schema as a dataframe, then merge in extra columns from dataframes. - - Parameters: - dataframes(dict): A full set of schema spreadsheet formatted dataframes - schema(HedSchema): The schema to write into the dataframes: - schema_name(str): The name to use to find the schema id range. - get_as_ids(bool): If True, replace all known references with HedIds - assign_missing_ids(bool): If True, replacing any blank(new) HedIds with valid ones - - Returns: - dataframes(dict of str:pd.DataFrames): The updated dataframes - These dataframes can potentially have extra columns - """ - hedid_errors = [] - # 1. Verify existing hed ids don't conflict between schema/dataframes - for df_key, df in dataframes.items(): - section_key = constants.section_mapping.get(df_key) - if not section_key: - continue - section = schema[section_key] - - unused_tag_ids = _get_hedid_range(schema_name, df_key) - hedid_errors += _verify_hedid_matches(section, df, unused_tag_ids) - - if hedid_errors: - raise HedFileError(hedid_errors[0]['code'], - f"{len(hedid_errors)} issues found with hedId mismatches. See the .issues " - f"parameter on this exception for more details.", schema.name, - issues=hedid_errors) - - # 2. Get the new schema as DFs - from hed.schema.schema_io.schema2df import Schema2DF # Late import as this is recursive - output_dfs = Schema2DF(get_as_ids=get_as_ids).process_schema(schema, save_merged=False) - - if assign_missing_ids: - # 3: Add any hed ID's as needed to these generated dfs - for df_key, df in output_dfs.items(): - if df_key == constants.STRUCT_KEY: - continue - unused_tag_ids = _get_hedid_range(schema_name, df_key) - - # If no errors, assign new hed ID's - assign_hed_ids_section(df, unused_tag_ids) - - # 4: Merge the dataframes - for df_key in output_dfs.keys(): - out_df = output_dfs[df_key] - df = dataframes[df_key] - merge_dfs(out_df, df) - - return output_dfs - - -def _verify_hedid_matches(section, df, unused_tag_ids): - """ Verify ID's in both have the same label, and verify all entries in the dataframe are already in the schema - - Parameters: - section(HedSchemaSection): The loaded schema section to compare ID's with - df(pd.DataFrame): The loaded spreadsheet dataframe to compare with - unused_tag_ids(set): The valid range of ID's for this df - - Returns: - error_list(list of str): A list of errors found matching id's - """ - hedid_errors = [] - for row_number, row in df.iterrows(): - if not any(row): - continue - label = row[constants.name] - if label.endswith("-#"): - label = label.replace("-#", "/#") - df_id = row[constants.hed_id] - entry = section.get(label) - if not entry: - hedid_errors += schema_util.format_error(row_number, row, - f"'{label}' does not exist in schema file only the spreadsheet.") - continue - entry_id = entry.attributes.get(HedKey.HedID) - if df_id: - if not (df_id.startswith("HED_") and len(df_id) == len("HED_0000000")): - hedid_errors += schema_util.format_error(row_number, row, - f"'{label}' has an improperly formatted hedID in dataframe.") - continue - id_value = remove_prefix(df_id, "HED_") - try: - id_int = int(id_value) - if id_int not in unused_tag_ids: - hedid_errors += schema_util.format_error(row_number, row, - f"'{label}' has id {id_int} which is outside of the valid range for this type. Valid range is: {min(unused_tag_ids)} to {max(unused_tag_ids)}") - continue - except ValueError: - hedid_errors += schema_util.format_error(row_number, row, - f"'{label}' has a non-numeric hedID in the dataframe.") - continue - - if entry_id and entry_id != df_id: - hedid_errors += schema_util.format_error(row_number, row, - f"'{label}' has hedID '{df_id}' in dataframe, but '{entry_id}' in schema.") - continue - - return hedid_errors - - -def assign_hed_ids_section(df, unused_tag_ids): - """ Adds missing HedIds to dataframe. - - Parameters: - df(pd.DataFrame): The dataframe to add id's to. - unused_tag_ids(set of int): The possible hed id's to assign from - """ - # Remove already used ids - unused_tag_ids -= get_all_ids(df) - sorted_unused_ids = sorted(unused_tag_ids, reverse=True) - - for row_number, row in df.iterrows(): - hed_id = row[constants.hed_id] - # we already verified existing ones - if hed_id: - continue - hed_id = f"HED_{sorted_unused_ids.pop():07d}" - row[constants.hed_id] = hed_id - - -def merge_dfs(dest_df, source_df): - """ Merges extra columns from source_df into dest_df, adding the extra columns from the ontology to the schema df. - - Args: - dest_df: The dataframe to add extra columns to - source_df: The dataframe to get extra columns from - """ - # todo: vectorize this at some point - save_df1_columns = dest_df.columns.copy() - for index, row in source_df.iterrows(): - # Find matching index in df1 based on 'rdfs:label' - match_index = dest_df[dest_df['rdfs:label'] == row['rdfs:label']].index - if not match_index.empty: - for col in source_df.columns: - if col not in save_df1_columns: - dest_df.at[match_index[0], col] = row[col] - - -def _get_annotation_prop_ids(dataframes): - annotation_props = {key: value for key, value in zip(dataframes[constants.ANNOTATION_KEY][constants.name], - dataframes[constants.ANNOTATION_KEY][constants.hed_id])} - # Also add schema properties - annotation_props.update( - {key: value for key, value in zip(dataframes[constants.ATTRIBUTE_PROPERTY_KEY][constants.name], - dataframes[constants.ATTRIBUTE_PROPERTY_KEY][constants.hed_id])}) - - return annotation_props - - -def convert_df_to_omn(dataframes): - """ Convert the dataframe format schema to omn format. - - Parameters: - dataframes(dict): A set of dataframes representing a schema, potentially including extra columns - - Returns: - tuple: - omn_file(str): A combined string representing (most of) a schema omn file. - omn_data(dict): a dict of DF_SUFFIXES:str, representing each .tsv file in omn format. - """ - from hed.schema.hed_schema_io import from_dataframes - # Load the schema, so we can save it out with ID's - schema = from_dataframes(dataframes) - # Convert dataframes to hedId format, and add any missing hedId's(generally, they should be replaced before here) - dataframes = update_dataframes_from_schema(dataframes, schema, get_as_ids=True) - - # Write out the new dataframes in omn format - annotation_props = _get_annotation_prop_ids(dataframes) - full_text = "" - omn_data = {} - for suffix, dataframe in dataframes.items(): - output_text = _convert_df_to_omn(dataframes[suffix], annotation_properties=annotation_props) - omn_data[suffix] = output_text - full_text += output_text + "\n" - - return full_text, omn_data - - -def _convert_df_to_omn(df, annotation_properties=("",)): - """Takes a single df format schema and converts it to omn. - - This is one section, e.g. tags, units, etc. - - Note: This mostly assumes a fully valid df. A df missing a required column will raise an error. - - Parameters: - df(pd.DataFrame): the dataframe to turn into omn - annotation_properties(dict): Known annotation properties, with the values being their hedId. - Returns: - omn_text(str): the omn formatted text for this section - """ - output_text = "" - for index, row in df.iterrows(): - prop_type = _get_property_type(row) - hed_id = row[constants.hed_id] - output_text += f"{prop_type}: hed:{hed_id}\n" - output_text += _add_annotation_lines(row, annotation_properties) - - if prop_type != "AnnotationProperty": - if constants.property_domain in row.index: - prop_domain = row[constants.property_domain] - output_text += "\tDomain:\n" - output_text += f"\t\t{prop_domain}\n" - if constants.property_range in row.index: - prop_range = row[constants.property_range] - output_text += "\tRange:\n" - output_text += f"\t\t{prop_range}\n" - output_text += "\n" - - if constants.equivalent_to in row.index: - equivalent_to = row[constants.equivalent_to] - equivalent_to = equivalent_to.replace(" and ", "\n\t\tand ") - subclass_of = row[constants.subclass_of] - if equivalent_to: - output_text += "\tEquivalentTo:\n" - output_text += f"\t\t{equivalent_to}" - else: - output_text += "\tSubClassOf:\n" - output_text += f"\t\t{subclass_of}" - output_text += "\n" - - output_text += "\n" - return output_text - - -def _add_annotation_lines(row, annotation_properties): - annotation_lines = [] - description = row[constants.description] - if description: - annotation_lines.append(f"\t\t{constants.description} \"{description}\"") - name = row[constants.name] - if name: - annotation_lines.append(f"\t\t{constants.name} \"{name}\"") - - # Add annotation properties(other than HedId) - attributes = get_attributes_from_row(row) - for attribute in attributes: - if attribute in annotation_properties and attribute != HedKey.HedID: - annotation_id = f"hed:{annotation_properties[attribute]}" - value = attributes[attribute] - if value is True: - value = "true" - else: - value = f'"{value}"' - annotation_lines.append(f"\t\t{annotation_id} {value}") - - output_text = "" - if annotation_lines: - output_text += "\tAnnotations:\n" - output_text += ",\n".join(annotation_lines) - output_text += "\n" - - return output_text - - -def _get_property_type(row): - """Gets the property type from the row.""" - return row[constants.property_type] if constants.property_type in row.index else "Class" - - -def save_dataframes(base_filename, dataframe_dict): - """ Writes out the dataframes using the provided suffixes. - - Does not validate contents or suffixes. - - If base_filename has a .tsv suffix, save directly to the indicated location. - If base_filename is a directory(does NOT have a .tsv suffix), save the contents into a directory named that. - The subfiles are named the same. e.g. HED8.3.0/HED8.3.0_Tag.tsv - - Parameters: - base_filename(str): The base filename to use. Output is {base_filename}_{suffix}.tsv - See DF_SUFFIXES for all expected names. - dataframe_dict(dict of str: df.DataFrame): The list of files to save out. No validation is done. - """ - if base_filename.lower().endswith(".tsv"): - base, base_ext = os.path.splitext(base_filename) - base_dir, base_name = os.path.split(base) - else: - # Assumed as a directory name - base_dir = base_filename - base_filename = os.path.split(base_dir)[1] - base = os.path.join(base_dir, base_filename) - os.makedirs(base_dir, exist_ok=True) - for suffix, dataframe in dataframe_dict.items(): - filename = f"{base}_{suffix}.tsv" - with open(filename, mode='w', encoding='utf-8') as opened_file: - dataframe.to_csv(opened_file, sep='\t', index=False, header=True) - - -def get_attributes_from_row(row): - """ Get the tag attributes from a line. - - Parameters: - row (pd.Series): A tag line. - Returns: - dict: Dictionary of attributes. - """ - if constants.properties in row.index: - attr_string = row[constants.properties] - elif constants.attributes in row.index: - attr_string = row[constants.attributes] - else: - attr_string = "" - - if constants.subclass_of in row.index and row[constants.subclass_of] == "HedHeader": - header_attributes, _ = _parse_header_attributes_line(attr_string) - return header_attributes - return parse_attribute_string(attr_string) - - -def create_empty_dataframes(): - """Returns the default empty dataframes""" - return { - constants.STRUCT_KEY: pd.DataFrame(columns=constants.struct_columns, dtype=str), - constants.TAG_KEY: pd.DataFrame(columns=constants.tag_columns, dtype=str), - constants.UNIT_KEY: pd.DataFrame(columns=constants.unit_columns, dtype=str), - constants.UNIT_CLASS_KEY: pd.DataFrame(columns=constants.other_columns, dtype=str), - constants.UNIT_MODIFIER_KEY: pd.DataFrame(columns=constants.other_columns, dtype=str), - constants.VALUE_CLASS_KEY: pd.DataFrame(columns=constants.other_columns, dtype=str), - constants.ANNOTATION_KEY: pd.DataFrame(columns=constants.property_columns, dtype=str), - constants.DATA_KEY: pd.DataFrame(columns=constants.property_columns, dtype=str), - constants.OBJECT_KEY: pd.DataFrame(columns=constants.property_columns, dtype=str), - constants.ATTRIBUTE_PROPERTY_KEY: pd.DataFrame(columns=constants.property_columns_reduced, dtype=str), - } +"""Utility functions for saving as an ontology or dataframe.""" + +import pandas as pd + +from hed.schema.schema_io import schema_util +from hed.errors.exceptions import HedFileError +from hed.schema import hed_schema_df_constants as constants +from hed.schema.hed_schema_constants import HedKey +from hed.schema.schema_io.df_util import remove_prefix, calculate_attribute_type, get_attributes_from_row +from hed.schema.hed_cache import get_library_data + +object_type_id_offset = { + constants.OBJECT_KEY: (100, 300), + constants.DATA_KEY: (300, 500), + constants.ANNOTATION_KEY: (500, 700), + constants.ATTRIBUTE_PROPERTY_KEY: (700, 900), + constants.VALUE_CLASS_KEY: (1300, 1400), + constants.UNIT_MODIFIER_KEY: (1400, 1500), + constants.UNIT_CLASS_KEY: (1500, 1600), + constants.UNIT_KEY: (1600, 1700), + constants.TAG_KEY: (2000, -1), # -1 = go to end of range +} + + +def _get_hedid_range(schema_name, df_key): + """ Get the set of HedId's for this object type/schema name. + + Parameters: + schema_name(str): The known schema name with an assigned id range + df_key(str): The dataframe range type we're interested in. a key from constants.DF_SUFFIXES + + Returns: + number_set(set): A set of all id's in the requested range + """ + if df_key == constants.STRUCT_KEY: + raise NotImplementedError("Cannot assign hed_ids struct section") + + library_data = get_library_data(schema_name) + if not library_data: + return set() + starting_id, ending_id = library_data["id_range"] + + start_object_range, end_object_range = object_type_id_offset[df_key] + if df_key == constants.TAG_KEY: + initial_tag_adj = 1 # We always skip 1 for tags + else: + initial_tag_adj = 0 + final_start = starting_id + start_object_range + initial_tag_adj + final_end = starting_id + end_object_range + if end_object_range == -1: + # Add one since the versions on hed-schemas are set to max_value - 1 + final_end = ending_id + 1 + return set(range(final_start, final_end)) + + +def get_all_ids(df): + """Returns a set of all unique hedIds in the dataframe + + Parameters: + df(pd.DataFrame): The dataframe + + Returns: + numbers(Set or None): None if this has no hed column, otherwise all unique numbers as a set. + """ + if constants.hed_id in df.columns: + modified_df = df[constants.hed_id].apply(lambda x: remove_prefix(x, "HED_")) + modified_df = pd.to_numeric(modified_df, errors="coerce").dropna().astype(int) + return set(modified_df.unique()) + return None + + +def update_dataframes_from_schema(dataframes, schema, schema_name="", get_as_ids=False, assign_missing_ids=False): + """ Write out schema as a dataframe, then merge in extra columns from dataframes. + + Parameters: + dataframes(dict): A full set of schema spreadsheet formatted dataframes + schema(HedSchema): The schema to write into the dataframes: + schema_name(str): The name to use to find the schema id range. + get_as_ids(bool): If True, replace all known references with HedIds + assign_missing_ids(bool): If True, replacing any blank(new) HedIds with valid ones + + Returns: + dataframes(dict of str:pd.DataFrames): The updated dataframes + These dataframes can potentially have extra columns + """ + hedid_errors = [] + if not schema_name: + schema_name = schema.library + # 1. Verify existing hed ids don't conflict between schema/dataframes + for df_key, df in dataframes.items(): + section_key = constants.section_mapping_hed_id.get(df_key) + if not section_key: + continue + section = schema[section_key] + + unused_tag_ids = _get_hedid_range(schema_name, df_key) + hedid_errors += _verify_hedid_matches(section, df, unused_tag_ids) + + if hedid_errors: + raise HedFileError(hedid_errors[0]['code'], + f"{len(hedid_errors)} issues found with hedId mismatches. See the .issues " + f"parameter on this exception for more details.", schema.name, issues=hedid_errors) + + # 2. Get the new schema as DFs + from hed.schema.schema_io.schema2df import Schema2DF # Late import as this is recursive + output_dfs = Schema2DF(get_as_ids=get_as_ids).process_schema(schema, save_merged=False) + + if assign_missing_ids: + # 3: Add any hed ID's as needed to these generated dfs + for df_key, df in output_dfs.items(): + if df_key == constants.STRUCT_KEY: + continue + unused_tag_ids = _get_hedid_range(schema_name, df_key) + + # If no errors, assign new hed ID's + assign_hed_ids_section(df, unused_tag_ids) + + # 4: Merge the dataframes + for df_key in output_dfs.keys(): + out_df = output_dfs[df_key] + df = dataframes[df_key] + merge_dfs(out_df, df) + + return output_dfs + + +def _verify_hedid_matches(section, df, unused_tag_ids): + """ Verify ID's in both have the same label, and verify all entries in the dataframe are already in the schema + + Parameters: + section(HedSchemaSection): The loaded schema section to compare ID's with + df(pd.DataFrame): The loaded spreadsheet dataframe to compare with + unused_tag_ids(set): The valid range of ID's for this df + + Returns: + error_list(list of str): A list of errors found matching id's + """ + hedid_errors = [] + for row_number, row in df.iterrows(): + if not any(row): + continue + label = row[constants.name] + if label.endswith("-#"): + label = label.replace("-#", "/#") + df_id = row[constants.hed_id] + entry = section.get(label) + if not entry: + # Neither side has a hedID, so nothing to do. + if not df_id: + continue + hedid_errors += schema_util.format_error(row_number, row, + f"'{label}' does not exist in schema file only the spreadsheet.") + continue + entry_id = entry.attributes.get(HedKey.HedID) + if df_id: + if not (df_id.startswith("HED_") and len(df_id) == len("HED_0000000")): + hedid_errors += schema_util.format_error(row_number, row, + f"'{label}' has an improperly formatted hedID in dataframe.") + continue + id_value = remove_prefix(df_id, "HED_") + try: + id_int = int(id_value) + if id_int not in unused_tag_ids: + hedid_errors += schema_util.format_error( + row_number, row, f"'{label}' has id {id_int} which is outside " + + f"of the valid range for this type. Valid range is: " + + f"{min(unused_tag_ids)} to {max(unused_tag_ids)}") + continue + except ValueError: + hedid_errors += schema_util.format_error( + row_number, row, f"'{label}' has a non-numeric hedID in the dataframe.") + continue + + if entry_id and entry_id != df_id: + hedid_errors += schema_util.format_error( + row_number, row, f"'{label}' has hedID '{df_id}' in dataframe, but '{entry_id}' in schema.") + continue + + return hedid_errors + + +def assign_hed_ids_section(df, unused_tag_ids): + """ Adds missing HedIds to dataframe. + + Parameters: + df(pd.DataFrame): The dataframe to add id's to. + unused_tag_ids(set of int): The possible hed id's to assign from + """ + # Remove already used ids + unused_tag_ids -= get_all_ids(df) + sorted_unused_ids = sorted(unused_tag_ids, reverse=True) + + for row_number, row in df.iterrows(): + hed_id = row[constants.hed_id] + # we already verified existing ones + if hed_id: + continue + hed_id = f"HED_{sorted_unused_ids.pop():07d}" + row[constants.hed_id] = hed_id + + +def merge_dfs(dest_df, source_df): + """ Merges extra columns from source_df into dest_df, adding the extra columns from the ontology to the schema df. + + Args: + dest_df: The dataframe to add extra columns to + source_df: The dataframe to get extra columns from + """ + # todo: vectorize this at some point + save_df1_columns = dest_df.columns.copy() + for index, row in source_df.iterrows(): + # Find matching index in df1 based on 'rdfs:label' + match_index = dest_df[dest_df['rdfs:label'] == row['rdfs:label']].index + if not match_index.empty: + for col in source_df.columns: + if col not in save_df1_columns: + dest_df.at[match_index[0], col] = row[col] + + +def _get_annotation_prop_ids(schema): + annotation_props = dict() + for entry in schema.attributes.values(): + attribute_type = calculate_attribute_type(entry) + + if attribute_type == "annotation": + annotation_props[entry.name] = entry.attributes[HedKey.HedID] + + for entry in schema.properties.values(): + annotation_props[entry.name] = entry.attributes[HedKey.HedID] + + return annotation_props + + +def get_prefixes(dataframes): + prefixes = dataframes.get(constants.PREFIXES_KEY) + extensions = dataframes.get(constants.EXTERNAL_ANNOTATION_KEY) + if prefixes is None or extensions is None: + return {} + all_prefixes = {prefix.Prefix: prefix[2] for prefix in prefixes.itertuples()} + annotation_terms = {} + for row in extensions.itertuples(): + annotation_terms[row.Prefix + row.ID] = all_prefixes[row.Prefix] + + return annotation_terms + + +def convert_df_to_omn(dataframes): + """ Convert the dataframe format schema to omn format. + + Parameters: + dataframes(dict): A set of dataframes representing a schema, potentially including extra columns + + Returns: + tuple: + omn_file(str): A combined string representing (most of) a schema omn file. + omn_data(dict): a dict of DF_SUFFIXES:str, representing each .tsv file in omn format. + """ + from hed.schema.hed_schema_io import from_dataframes + + annotation_terms = get_prefixes(dataframes) + + # Load the schema, so we can save it out with ID's + schema = from_dataframes(dataframes) + # Convert dataframes to hedId format, and add any missing hedId's(generally, they should be replaced before here) + dataframes_u = update_dataframes_from_schema(dataframes, schema, get_as_ids=True) + + # Copy over remaining non schema dataframes. + if constants.PREFIXES_KEY in dataframes: + dataframes_u[constants.PREFIXES_KEY] = dataframes[constants.PREFIXES_KEY] + dataframes_u[constants.EXTERNAL_ANNOTATION_KEY] = dataframes[constants.EXTERNAL_ANNOTATION_KEY] + + # Write out the new dataframes in omn format + annotation_props = _get_annotation_prop_ids(schema) + full_text = "" + omn_data = {} + for suffix, dataframe in dataframes_u.items(): + if suffix in constants.DF_EXTRA_SUFFIXES: + output_text = _convert_extra_df_to_omn(dataframes_u[suffix], suffix) + else: + output_text = _convert_df_to_omn(dataframes_u[suffix], annotation_properties=annotation_props, + annotation_terms=annotation_terms) + omn_data[suffix] = output_text + full_text += output_text + "\n" + + return full_text, omn_data + + +def _convert_df_to_omn(df, annotation_properties=("",), annotation_terms=None): + """Takes a single df format schema and converts it to omn. + + This is one section, e.g. tags, units, etc. + + Note: This mostly assumes a fully valid df. A df missing a required column will raise an error. + + Parameters: + df(pd.DataFrame): the dataframe to turn into omn + annotation_properties(dict): Known annotation properties, with the values being their hedId. + annotation_terms(dict): The list of valid external omn tags, such as "dc:source" + Returns: + omn_text(str): the omn formatted text for this section + """ + output_text = "" + for index, row in df.iterrows(): + prop_type = _get_property_type(row) + hed_id = row[constants.hed_id] + output_text += f"{prop_type}: hed:{hed_id}\n" + output_text += _add_annotation_lines(row, annotation_properties, annotation_terms) + + if prop_type != "AnnotationProperty": + if constants.property_domain in row.index: + prop_domain = row[constants.property_domain] + output_text += "\tDomain:\n" + output_text += f"\t\t{prop_domain}\n" + if constants.property_range in row.index: + prop_range = row[constants.property_range] + output_text += "\tRange:\n" + output_text += f"\t\t{prop_range}\n" + output_text += "\n" + + if constants.equivalent_to in row.index: + equivalent_to = row[constants.equivalent_to] + equivalent_to = equivalent_to.replace(" and ", "\n\t\tand ") + subclass_of = row[constants.subclass_of] + if equivalent_to: + output_text += "\tEquivalentTo:\n" + output_text += f"\t\t{equivalent_to}" + else: + output_text += "\tSubClassOf:\n" + output_text += f"\t\t{subclass_of}" + output_text += "\n" + + output_text += "\n" + return output_text + + +def _convert_extra_df_to_omn(df, suffix): + """Takes a single df format schema and converts it to omn. + + This is one section, e.g. tags, units, etc. + + Note: This mostly assumes a fully valid df. A df missing a required column will raise an error. + + Parameters: + df(pd.DataFrame): the dataframe to turn into omn + suffix(dict): Known annotation properties, with the values being their hedId. + Returns: + omn_text(str): the omn formatted text for this section + """ + output_text = "" + for index, row in df.iterrows(): + if suffix == constants.PREFIXES_KEY: + output_text += f"Prefix: {row[constants.Prefix]} <{row[constants.NamespaceIRI]}>" + elif suffix == constants.EXTERNAL_ANNOTATION_KEY: + output_text += f"AnnotationProperty: {row[constants.Prefix]}{row[constants.ID]}" + else: + raise ValueError(f"Unknown tsv suffix attempting to be converted {suffix}") + + output_text += "\n" + return output_text + + +def _split_on_unquoted_commas(input_string): + """ Splits the given string into comma separated portions, ignoring commas inside double quotes. + + Parameters: + input_string: The string to split + + Returns: + parts(list): The split apart string. + """ + # Note: does not handle escaped double quotes. + parts = [] + current = [] + in_quotes = False + + for char in input_string: + if char == '"': + in_quotes = not in_quotes + if char == ',' and not in_quotes: + parts.append(''.join(current).strip()) + current = [] + else: + current.append(char) + + if current: # Add the last part if there is any. + parts.append(''.join(current).strip()) + + return parts + + +def _split_annotation_values(parts): + annotations = dict() + for part in parts: + key, value = part.split(" ", 1) + annotations[key] = value + + return annotations + + +def _add_annotation_lines(row, annotation_properties, annotation_terms): + annotation_lines = [] + description = row[constants.description] + if description: + annotation_lines.append(f"\t\t{constants.description} \"{description}\"") + name = row[constants.name] + if name: + annotation_lines.append(f"\t\t{constants.name} \"{name}\"") + + # Add annotation properties(other than HedId) + attributes = get_attributes_from_row(row) + for attribute in attributes: + if attribute in annotation_properties and attribute != HedKey.HedID: + annotation_id = f"hed:{annotation_properties[attribute]}" + value = attributes[attribute] + if value is True: + value = "true" + else: + value = f'"{value}"' + annotation_lines.append(f"\t\t{annotation_id} {value}") + + if constants.annotations in row.index: + portions = _split_on_unquoted_commas(row[constants.annotations]) + annotations = _split_annotation_values(portions) + + for key, value in annotations.items(): + if key not in annotation_terms: + raise ValueError(f"Problem. Found {key} which is not in the prefix/annotation list.") + annotation_lines.append(f"\t\t{key} {value}") + + output_text = "" + if annotation_lines: + output_text += "\tAnnotations:\n" + output_text += ",\n".join(annotation_lines) + output_text += "\n" + + return output_text + + +def _get_property_type(row): + """Gets the property type from the row.""" + return row[constants.property_type] if constants.property_type in row.index else "Class" diff --git a/hed/schema/schema_io/schema2df.py b/hed/schema/schema_io/schema2df.py index e2832e1aa..1b8f800c2 100644 --- a/hed/schema/schema_io/schema2df.py +++ b/hed/schema/schema_io/schema2df.py @@ -1,383 +1,374 @@ -"""Allows output of HedSchema objects as .tsv format""" - -from hed.schema.hed_schema_constants import HedSectionKey, HedKey -from hed.schema.schema_io.ontology_util import get_library_name_and_id, remove_prefix, create_empty_dataframes -from hed.schema.schema_io.schema2base import Schema2Base -from hed.schema.schema_io import text_util -import pandas as pd -import hed.schema.hed_schema_df_constants as constants -from hed.schema.hed_schema_entry import HedTagEntry - -section_key_to_df = { - HedSectionKey.Tags: constants.TAG_KEY, - HedSectionKey.Units: constants.UNIT_KEY, - HedSectionKey.UnitClasses: constants.UNIT_CLASS_KEY, - HedSectionKey.UnitModifiers: constants.UNIT_MODIFIER_KEY, - HedSectionKey.ValueClasses: constants.VALUE_CLASS_KEY, - HedSectionKey.Attributes: HedSectionKey.Attributes, - HedSectionKey.Properties: HedSectionKey.Properties -} - - -class Schema2DF(Schema2Base): - def __init__(self, get_as_ids=False): - """ Constructor for schema to dataframe converter - - Parameters: - get_as_ids(bool): If true, return the hedId rather than name in most places - This is mostly relevant for creating an ontology. - """ - super().__init__() - self._get_as_ids = get_as_ids - self._tag_rows = [] - - def _get_object_name_and_id(self, object_name, include_prefix=False): - """ Get the adjusted name and ID for the given object type. - - Parameters: - object_name(str): The name of the base hed object, e.g. HedHeader, HedUnit - include_prefix(bool): If True, include the "hed:" - Returns: - object_name(str): The inherited object name, e.g. StandardHeader - hed_id(str): The full formatted hed_id - """ - prefix, obj_id = get_library_name_and_id(self._schema) - name = f"{prefix}{remove_prefix(object_name, 'Hed')}" - full_hed_id = self._get_object_id(object_name, obj_id, include_prefix) - return name, full_hed_id - - def _get_object_id(self, object_name, base_id=0, include_prefix=False): - prefix = "" - if include_prefix: - prefix = "hed:" - return f"{prefix}HED_{base_id + constants.struct_base_ids[object_name]:07d}" - - # ========================================= - # Required baseclass function - # ========================================= - def _initialize_output(self): - self.output = create_empty_dataframes() - self._tag_rows = [] - - def _create_and_add_object_row(self, base_object, attributes="", description=""): - name, full_hed_id = self._get_object_name_and_id(base_object) - new_row = { - constants.hed_id: full_hed_id, - constants.name: name, - constants.attributes: attributes, - constants.subclass_of: base_object, - constants.description: description.replace("\n", "\\n"), - constants.equivalent_to: self._get_header_equivalent_to(attributes, base_object) - } - self.output[constants.STRUCT_KEY].loc[len(self.output[constants.STRUCT_KEY])] = new_row - - def _output_header(self, attributes, prologue): - base_object = "HedHeader" - attributes_string = self._get_attribs_string_from_schema(attributes, sep=", ") - self._create_and_add_object_row(base_object, attributes_string) - - base_object = "HedPrologue" - self._create_and_add_object_row(base_object, description=prologue) - - def _output_footer(self, epilogue): - base_object = "HedEpilogue" - self._create_and_add_object_row(base_object, description=epilogue) - - def _start_section(self, key_class): - pass - - def _end_tag_section(self): - self.output[constants.TAG_KEY] = pd.DataFrame(self._tag_rows, columns=constants.tag_columns, dtype=str) - - def _write_tag_entry(self, tag_entry, parent_node=None, level=0): - tag_id = tag_entry.attributes.get(HedKey.HedID, "") - new_row = { - constants.hed_id: f"{tag_id}", - constants.level: f"{level}", - constants.name: - tag_entry.short_tag_name if not tag_entry.name.endswith("#") - else tag_entry.short_tag_name + "-#", - constants.subclass_of: self._get_subclass_of(tag_entry), - constants.attributes: self._format_tag_attributes(tag_entry.attributes), - constants.description: tag_entry.description, - constants.equivalent_to: self._get_tag_equivalent_to(tag_entry), - } - # Todo: do other sections like this as well for efficiency - self._tag_rows.append(new_row) - - def _write_entry(self, entry, parent_node, include_props=True): - df_key = section_key_to_df.get(entry.section_key) - if not df_key: - return - - # Special case - if df_key == HedSectionKey.Properties: - return self._write_property_entry(entry) - elif df_key == HedSectionKey.Attributes: - return self._write_attribute_entry(entry, include_props=include_props) - df = self.output[df_key] - tag_id = entry.attributes.get(HedKey.HedID, "") - new_row = { - constants.hed_id: f"{tag_id}", - constants.name: entry.name, - constants.subclass_of: self._get_subclass_of(entry), - constants.attributes: self._format_tag_attributes(entry.attributes), - constants.description: entry.description, - constants.equivalent_to: self._get_tag_equivalent_to(entry), - } - # Handle the special case of units, which have the extra unit class - if hasattr(entry, "unit_class_entry"): - class_entry_name = entry.unit_class_entry.name - if self._get_as_ids: - class_entry_name = f"{entry.unit_class_entry.attributes.get(constants.hed_id)}" - new_row[constants.has_unit_class] = class_entry_name - df.loc[len(df)] = new_row - pass - - def _write_attribute_entry(self, entry, include_props): - df_key = constants.OBJECT_KEY - property_type = "ObjectProperty" - if HedKey.AnnotationProperty in entry.attributes: - df_key = constants.ANNOTATION_KEY - property_type = "AnnotationProperty" - elif (HedKey.NumericRange in entry.attributes - or HedKey.StringRange in entry.attributes - or HedKey.BoolRange in entry.attributes): - df_key = constants.DATA_KEY - property_type = "DataProperty" - - hed_id_mapping = { - "HedTag": self._get_object_id("HedTag", include_prefix=True), - "HedUnit": self._get_object_id("HedUnit", include_prefix=True), - "HedUnitClass": self._get_object_id("HedUnitClass", include_prefix=True), - "HedUnitModifier": self._get_object_id("HedUnitModifier", include_prefix=True), - "HedValueClass": self._get_object_id("HedValueClass", include_prefix=True), - "HedElement": self._get_object_id("HedElement", include_prefix=True), - "string": "xsd:string", - "boolean": "xsd:boolean", - "float": "xsd:float" - } - - domain_attributes = { - HedKey.TagDomain: "HedTag", - HedKey.UnitDomain: "HedUnit", - HedKey.UnitClassDomain: "HedUnitClass", - HedKey.UnitModifierDomain: "HedUnitModifier", - HedKey.ValueClassDomain: "HedValueClass", - HedKey.ElementDomain: "HedElement" - } - range_attributes = { - HedKey.StringRange: "string", - HedKey.TagRange: "HedTag", - HedKey.NumericRange: "float", - HedKey.BoolRange: "boolean", - HedKey.UnitRange: "HedUnit", - HedKey.UnitClassRange: "HedUnitClass", - HedKey.ValueClassRange: "HedValueClass" - } - - domain_keys = [key for key in entry.attributes if key in domain_attributes] - range_keys = [key for key in entry.attributes if key in range_attributes] - - if self._get_as_ids: - domain_string = " or ".join(hed_id_mapping[domain_attributes[key]] for key in domain_keys) - range_string = " or ".join(hed_id_mapping[range_attributes[key]] for key in range_keys) - else: - domain_string = " or ".join(domain_attributes[key] for key in domain_keys) - range_string = " or ".join(range_attributes[key] for key in range_keys) - - df = self.output[df_key] - tag_id = entry.attributes.get(HedKey.HedID, "") - new_row = { - constants.hed_id: f"{tag_id}", - constants.name: entry.name, - constants.property_type: property_type, - constants.property_domain: domain_string, - constants.property_range: range_string, - constants.properties: self._format_tag_attributes(entry.attributes) if include_props else "", - constants.description: entry.description, - } - df.loc[len(df)] = new_row - - def _write_property_entry(self, entry): - df_key = constants.ATTRIBUTE_PROPERTY_KEY - property_type = "AnnotationProperty" - df = self.output[df_key] - tag_id = entry.attributes.get(HedKey.HedID, "") - new_row = { - constants.hed_id: f"{tag_id}", - constants.name: entry.name, - constants.property_type: property_type, - constants.description: entry.description, - } - df.loc[len(df)] = new_row - - def _attribute_disallowed(self, attribute): - if super()._attribute_disallowed(attribute): - return True - # strip out hedID in dataframe format - return attribute in [HedKey.HedID, HedKey.AnnotationProperty] - - def _get_header_equivalent_to(self, attributes_string, subclass_of): - attribute_strings = [] - - attributes, _ = text_util._parse_header_attributes_line(attributes_string) - schema_name, schema_id = self._get_object_name_and_id("HedSchema", include_prefix=True) - - if self._get_as_ids: - attribute_strings.append(f"(hed:HED_0000102 some {schema_id})") - else: - attribute_strings.append(f"(inHedSchema some {schema_name})") - - for attribute, value in attributes.items(): - if attribute not in constants.valid_omn_attributes: - continue - - if self._get_as_ids: - attribute = f"hed:{constants.valid_omn_attributes[attribute]}" - attribute_strings.append(f'({attribute} value "{value}")') - - if self._get_as_ids: - # we just want the ID for normal hed objects, not schema specific - subclass_of = self._get_object_id(subclass_of, base_id=0, include_prefix=True) - - # If they match, we want to leave equivalent_to blank - final_out = " and ".join([subclass_of] + attribute_strings) - if final_out == subclass_of: - return "" - return final_out - - def _get_tag_equivalent_to(self, tag_entry): - subclass = self._get_subclass_of(tag_entry) - attribute_strings = [] - - attribute_strings.extend(self._process_attributes(tag_entry)) - attribute_strings.extend(self._process_unit_class_entry(tag_entry)) - attribute_strings.extend(self._process_schema_parent(tag_entry)) - - final_out = " and ".join([subclass] + attribute_strings) - if final_out == subclass: - return "" - return final_out - - def _process_attributes(self, tag_entry): - attribute_strings = [] - attribute_types = { - "object": "some", - "data": "value" - } - range_types = { - HedKey.TagRange: HedSectionKey.Tags, - HedKey.UnitRange: HedSectionKey.Units, - HedKey.UnitClassRange: HedSectionKey.UnitClasses, - HedKey.ValueClassRange: HedSectionKey.ValueClasses, - HedKey.NumericRange: HedKey.NumericRange - } - - for attribute, value in tag_entry.attributes.items(): - attribute_entry = self._schema.attributes.get(attribute) - attribute_type = self._calculate_attribute_type(attribute_entry) - - if self._attribute_disallowed(attribute) or attribute_type == "annotation": - continue - - values = self._prepare_values(attribute_entry, value, range_types) - - for v in values: - if self._get_as_ids: - attribute = f"hed:{attribute_entry.attributes[HedKey.HedID]}" - attribute_strings.append(f"({attribute} {attribute_types[attribute_type]} {v})") - - return attribute_strings - - def _prepare_values(self, attribute_entry, value, range_types): - if isinstance(value, str): - values = value.split(",") - values = [v.strip() for v in values] - - found_range = self._find_range(attribute_entry, range_types) - if self._get_as_ids and found_range and found_range != HedKey.NumericRange: - section = self._schema[found_range] - if any(section.get(v) is None for v in values): - raise ValueError(f"Cannot find schema entry for {values}") - for v in values: - test_id = section.get(v).attributes.get(HedKey.HedID) - if not test_id: - raise ValueError(f"Schema entry {v} has no hedId.") - values = [f"hed:{section.get(v).attributes[HedKey.HedID]}" for v in values] - elif not found_range: - values = [f'"{v}"' for v in values] - else: - if value is True: - value = 'true' - values = [value] - - return values - - def _find_range(self, attribute_entry, range_types): - for range_type in range_types: - if range_type in attribute_entry.attributes: - return range_types[range_type] - return None - - def _process_unit_class_entry(self, tag_entry): - attribute_strings = [] - - if hasattr(tag_entry, "unit_class_entry"): - class_entry_name = tag_entry.unit_class_entry.name - if self._get_as_ids: - class_entry_name = f"hed:{tag_entry.unit_class_entry.attributes.get(constants.hed_id)}" - - if self._get_as_ids: - attribute_strings.append(f"(hed:HED_0000103 some {class_entry_name})") - else: - attribute_strings.append(f"({constants.has_unit_class} some {class_entry_name})") - - return attribute_strings - - def _process_schema_parent(self, tag_entry): - attribute_strings = [] - - if hasattr(tag_entry, "parent") and not tag_entry.parent: - schema_name, schema_id = self._get_object_name_and_id("HedSchema", include_prefix=True) - if self._get_as_ids: - attribute_strings.append(f"(hed:HED_0000102 some {schema_id})") - else: - attribute_strings.append(f"(inHedSchema some {schema_name})") - - return attribute_strings - - def _get_subclass_of(self, tag_entry): - # Special case for HedTag - if isinstance(tag_entry, HedTagEntry): - if self._get_as_ids: - parent_entry = tag_entry.parent - if parent_entry: - return f"hed:{parent_entry.attributes[HedKey.HedID]}" - - # HedTag always returns as base object - return "hed:HED_0000005" - else: - return tag_entry.parent.short_tag_name if tag_entry.parent else "HedTag" - - base_objects = { - HedSectionKey.Units: f"HedUnit", - HedSectionKey.UnitClasses: f"HedUnitClass", - HedSectionKey.UnitModifiers: f"HedUnitModifier", - HedSectionKey.ValueClasses: f"HedValueClass" - } - name, obj_id = self._get_object_name_and_id(base_objects[tag_entry.section_key], include_prefix=True) - - if self._get_as_ids: - return obj_id - return name - - @staticmethod - def _calculate_attribute_type(attribute_entry): - attributes = attribute_entry.attributes - object_ranges = {HedKey.TagRange, HedKey.UnitRange, HedKey.UnitClassRange, HedKey.ValueClassRange} - if HedKey.AnnotationProperty in attributes: - return "annotation" - elif any(attribute in object_ranges for attribute in attributes): - return "object" - return "data" +"""Allows output of HedSchema objects as .tsv format""" + +from hed.schema.hed_schema_constants import HedSectionKey, HedKey +from hed.schema.schema_io.df_util import create_empty_dataframes, get_library_name_and_id, remove_prefix, \ + calculate_attribute_type +from hed.schema.schema_io.schema2base import Schema2Base +from hed.schema.schema_io import text_util +import pandas as pd +import hed.schema.hed_schema_df_constants as constants +from hed.schema.hed_schema_entry import HedTagEntry + +section_key_to_df = { + HedSectionKey.Tags: constants.TAG_KEY, + HedSectionKey.Units: constants.UNIT_KEY, + HedSectionKey.UnitClasses: constants.UNIT_CLASS_KEY, + HedSectionKey.UnitModifiers: constants.UNIT_MODIFIER_KEY, + HedSectionKey.ValueClasses: constants.VALUE_CLASS_KEY, + HedSectionKey.Attributes: HedSectionKey.Attributes, + HedSectionKey.Properties: HedSectionKey.Properties +} + + +class Schema2DF(Schema2Base): + def __init__(self, get_as_ids=False): + """ Constructor for schema to dataframe converter + + Parameters: + get_as_ids(bool): If true, return the hedId rather than name in most places + This is mostly relevant for creating an ontology. + """ + super().__init__() + self._get_as_ids = get_as_ids + self._tag_rows = [] + + def _get_object_name_and_id(self, object_name, include_prefix=False): + """ Get the adjusted name and ID for the given object type. + + Parameters: + object_name(str): The name of the base hed object, e.g. HedHeader, HedUnit + include_prefix(bool): If True, include the "hed:" + Returns: + object_name(str): The inherited object name, e.g. StandardHeader + hed_id(str): The full formatted hed_id + """ + prefix, obj_id = get_library_name_and_id(self._schema) + name = f"{prefix}{remove_prefix(object_name, 'Hed')}" + full_hed_id = self._get_object_id(object_name, obj_id, include_prefix) + return name, full_hed_id + + def _get_object_id(self, object_name, base_id=0, include_prefix=False): + prefix = "" + if include_prefix: + prefix = "hed:" + return f"{prefix}HED_{base_id + constants.struct_base_ids[object_name]:07d}" + + # ========================================= + # Required baseclass function + # ========================================= + def _initialize_output(self): + self.output = create_empty_dataframes() + self._tag_rows = [] + + def _create_and_add_object_row(self, base_object, attributes="", description=""): + name, full_hed_id = self._get_object_name_and_id(base_object) + new_row = { + constants.hed_id: full_hed_id, + constants.name: name, + constants.attributes: attributes, + constants.subclass_of: base_object, + constants.description: description.replace("\n", "\\n"), + constants.equivalent_to: self._get_header_equivalent_to(attributes, base_object) + } + self.output[constants.STRUCT_KEY].loc[len(self.output[constants.STRUCT_KEY])] = new_row + + def _output_header(self, attributes, prologue): + base_object = "HedHeader" + attributes_string = self._get_attribs_string_from_schema(attributes, sep=", ") + self._create_and_add_object_row(base_object, attributes_string) + + base_object = "HedPrologue" + self._create_and_add_object_row(base_object, description=prologue) + + def _output_footer(self, epilogue): + base_object = "HedEpilogue" + self._create_and_add_object_row(base_object, description=epilogue) + + def _start_section(self, key_class): + pass + + def _end_tag_section(self): + self.output[constants.TAG_KEY] = pd.DataFrame(self._tag_rows, columns=constants.tag_columns, dtype=str) + + def _write_tag_entry(self, tag_entry, parent_node=None, level=0): + tag_id = tag_entry.attributes.get(HedKey.HedID, "") + new_row = { + constants.hed_id: f"{tag_id}", + constants.level: f"{level}", + constants.name: + tag_entry.short_tag_name if not tag_entry.name.endswith("#") + else tag_entry.short_tag_name + "-#", + constants.subclass_of: self._get_subclass_of(tag_entry), + constants.attributes: self._format_tag_attributes(tag_entry.attributes), + constants.description: tag_entry.description, + constants.equivalent_to: self._get_tag_equivalent_to(tag_entry), + } + # Todo: do other sections like this as well for efficiency + self._tag_rows.append(new_row) + + def _write_entry(self, entry, parent_node, include_props=True): + df_key = section_key_to_df.get(entry.section_key) + if not df_key: + return + + # Special case + if df_key == HedSectionKey.Properties: + return self._write_property_entry(entry) + elif df_key == HedSectionKey.Attributes: + return self._write_attribute_entry(entry, include_props=include_props) + df = self.output[df_key] + tag_id = entry.attributes.get(HedKey.HedID, "") + new_row = { + constants.hed_id: f"{tag_id}", + constants.name: entry.name, + constants.subclass_of: self._get_subclass_of(entry), + constants.attributes: self._format_tag_attributes(entry.attributes), + constants.description: entry.description, + constants.equivalent_to: self._get_tag_equivalent_to(entry), + } + # Handle the special case of units, which have the extra unit class + if hasattr(entry, "unit_class_entry"): + class_entry_name = entry.unit_class_entry.name + if self._get_as_ids: + class_entry_name = f"{entry.unit_class_entry.attributes.get(constants.hed_id)}" + new_row[constants.has_unit_class] = class_entry_name + df.loc[len(df)] = new_row + pass + + def _write_attribute_entry(self, entry, include_props): + df_key = constants.OBJECT_KEY + property_type = "ObjectProperty" + if HedKey.AnnotationProperty in entry.attributes: + df_key = constants.ANNOTATION_KEY + property_type = "AnnotationProperty" + elif (HedKey.NumericRange in entry.attributes + or HedKey.StringRange in entry.attributes + or HedKey.BoolRange in entry.attributes): + df_key = constants.DATA_KEY + property_type = "DataProperty" + + hed_id_mapping = { + "HedTag": self._get_object_id("HedTag", include_prefix=True), + "HedUnit": self._get_object_id("HedUnit", include_prefix=True), + "HedUnitClass": self._get_object_id("HedUnitClass", include_prefix=True), + "HedUnitModifier": self._get_object_id("HedUnitModifier", include_prefix=True), + "HedValueClass": self._get_object_id("HedValueClass", include_prefix=True), + "HedElement": self._get_object_id("HedElement", include_prefix=True), + "string": "xsd:string", + "boolean": "xsd:boolean", + "float": "xsd:float" + } + + domain_attributes = { + HedKey.TagDomain: "HedTag", + HedKey.UnitDomain: "HedUnit", + HedKey.UnitClassDomain: "HedUnitClass", + HedKey.UnitModifierDomain: "HedUnitModifier", + HedKey.ValueClassDomain: "HedValueClass", + HedKey.ElementDomain: "HedElement" + } + range_attributes = { + HedKey.StringRange: "string", + HedKey.TagRange: "HedTag", + HedKey.NumericRange: "float", + HedKey.BoolRange: "boolean", + HedKey.UnitRange: "HedUnit", + HedKey.UnitClassRange: "HedUnitClass", + HedKey.ValueClassRange: "HedValueClass" + } + + domain_keys = [key for key in entry.attributes if key in domain_attributes] + range_keys = [key for key in entry.attributes if key in range_attributes] + + if self._get_as_ids: + domain_string = " or ".join(hed_id_mapping[domain_attributes[key]] for key in domain_keys) + range_string = " or ".join(hed_id_mapping[range_attributes[key]] for key in range_keys) + else: + domain_string = " or ".join(domain_attributes[key] for key in domain_keys) + range_string = " or ".join(range_attributes[key] for key in range_keys) + + df = self.output[df_key] + tag_id = entry.attributes.get(HedKey.HedID, "") + new_row = { + constants.hed_id: f"{tag_id}", + constants.name: entry.name, + constants.property_type: property_type, + constants.property_domain: domain_string, + constants.property_range: range_string, + constants.properties: self._format_tag_attributes(entry.attributes) if include_props else "", + constants.description: entry.description, + } + df.loc[len(df)] = new_row + + def _write_property_entry(self, entry): + df_key = constants.ATTRIBUTE_PROPERTY_KEY + property_type = "AnnotationProperty" + df = self.output[df_key] + tag_id = entry.attributes.get(HedKey.HedID, "") + new_row = { + constants.hed_id: f"{tag_id}", + constants.name: entry.name, + constants.property_type: property_type, + constants.description: entry.description, + } + df.loc[len(df)] = new_row + + def _attribute_disallowed(self, attribute): + if super()._attribute_disallowed(attribute): + return True + # strip out hedID in dataframe format + return attribute in [HedKey.HedID, HedKey.AnnotationProperty] + + def _get_header_equivalent_to(self, attributes_string, subclass_of): + attribute_strings = [] + + attributes, _ = text_util._parse_header_attributes_line(attributes_string) + schema_name, schema_id = self._get_object_name_and_id("HedSchema", include_prefix=True) + + if self._get_as_ids: + attribute_strings.append(f"(hed:HED_0000102 some {schema_id})") + else: + attribute_strings.append(f"(inHedSchema some {schema_name})") + + for attribute, value in attributes.items(): + if attribute not in constants.valid_omn_attributes: + continue + + if self._get_as_ids: + attribute = f"hed:{constants.valid_omn_attributes[attribute]}" + attribute_strings.append(f'({attribute} value "{value}")') + + if self._get_as_ids: + # we just want the ID for normal hed objects, not schema specific + subclass_of = self._get_object_id(subclass_of, base_id=0, include_prefix=True) + + # If they match, we want to leave equivalent_to blank + final_out = " and ".join([subclass_of] + attribute_strings) + if final_out == subclass_of: + return "" + return final_out + + def _get_tag_equivalent_to(self, tag_entry): + subclass = self._get_subclass_of(tag_entry) + attribute_strings = [] + + attribute_strings.extend(self._process_attributes(tag_entry)) + attribute_strings.extend(self._process_unit_class_entry(tag_entry)) + attribute_strings.extend(self._process_schema_parent(tag_entry)) + + final_out = " and ".join([subclass] + attribute_strings) + if final_out == subclass: + return "" + return final_out + + def _process_attributes(self, tag_entry): + attribute_strings = [] + attribute_types = { + "object": "some", + "data": "value" + } + range_types = { + HedKey.TagRange: HedSectionKey.Tags, + HedKey.UnitRange: HedSectionKey.Units, + HedKey.UnitClassRange: HedSectionKey.UnitClasses, + HedKey.ValueClassRange: HedSectionKey.ValueClasses, + HedKey.NumericRange: HedKey.NumericRange + } + + for attribute, value in tag_entry.attributes.items(): + attribute_entry = self._schema.attributes.get(attribute) + attribute_type = calculate_attribute_type(attribute_entry) + + if self._attribute_disallowed(attribute) or attribute_type == "annotation": + continue + + values = self._prepare_values(attribute_entry, value, range_types) + + for v in values: + if self._get_as_ids: + attribute = f"hed:{attribute_entry.attributes[HedKey.HedID]}" + attribute_strings.append(f"({attribute} {attribute_types[attribute_type]} {v})") + + return attribute_strings + + def _prepare_values(self, attribute_entry, value, range_types): + if isinstance(value, str): + values = value.split(",") + values = [v.strip() for v in values] + + found_range = self._find_range(attribute_entry, range_types) + if self._get_as_ids and found_range and found_range != HedKey.NumericRange: + section = self._schema[found_range] + if any(section.get(v) is None for v in values): + raise ValueError(f"Cannot find schema entry for {values}") + for v in values: + test_id = section.get(v).attributes.get(HedKey.HedID) + if not test_id: + raise ValueError(f"Schema entry {v} has no hedId.") + values = [f"hed:{section.get(v).attributes[HedKey.HedID]}" for v in values] + elif not found_range: + values = [f'"{v}"' for v in values] + else: + if value is True: + value = 'true' + values = [value] + + return values + + def _find_range(self, attribute_entry, range_types): + for range_type in range_types: + if range_type in attribute_entry.attributes: + return range_types[range_type] + return None + + def _process_unit_class_entry(self, tag_entry): + attribute_strings = [] + + if hasattr(tag_entry, "unit_class_entry"): + class_entry_name = tag_entry.unit_class_entry.name + if self._get_as_ids: + class_entry_name = f"hed:{tag_entry.unit_class_entry.attributes.get(constants.hed_id)}" + + if self._get_as_ids: + attribute_strings.append(f"(hed:HED_0000103 some {class_entry_name})") + else: + attribute_strings.append(f"({constants.has_unit_class} some {class_entry_name})") + + return attribute_strings + + def _process_schema_parent(self, tag_entry): + attribute_strings = [] + + if hasattr(tag_entry, "parent") and not tag_entry.parent: + schema_name, schema_id = self._get_object_name_and_id("HedSchema", include_prefix=True) + if self._get_as_ids: + attribute_strings.append(f"(hed:HED_0000102 some {schema_id})") + else: + attribute_strings.append(f"(inHedSchema some {schema_name})") + + return attribute_strings + + def _get_subclass_of(self, tag_entry): + # Special case for HedTag + if isinstance(tag_entry, HedTagEntry): + if self._get_as_ids: + parent_entry = tag_entry.parent + if parent_entry: + return f"hed:{parent_entry.attributes[HedKey.HedID]}" + + # HedTag always returns as base object + return "hed:HED_0000005" + else: + return tag_entry.parent.short_tag_name if tag_entry.parent else "HedTag" + + base_objects = { + HedSectionKey.Units: "HedUnit", + HedSectionKey.UnitClasses: "HedUnitClass", + HedSectionKey.UnitModifiers: "HedUnitModifier", + HedSectionKey.ValueClasses: "HedValueClass" + } + name, obj_id = self._get_object_name_and_id(base_objects[tag_entry.section_key], include_prefix=True) + + if self._get_as_ids: + return obj_id + return name diff --git a/hed/schema/schema_io/text2schema.py b/hed/schema/schema_io/text2schema.py deleted file mode 100644 index 7db35ec73..000000000 --- a/hed/schema/schema_io/text2schema.py +++ /dev/null @@ -1,107 +0,0 @@ -""" -Create a HedSchema object from a .mediawiki file. -""" - -from abc import abstractmethod -from hed.schema.hed_schema_constants import HedSectionKey, HedKey -from hed.errors.exceptions import HedFileError, HedExceptions -from hed.schema.schema_io.base2schema import SchemaLoader - - -class SchemaLoaderText(SchemaLoader): - """ Intermediate class to handle text based formats(tsv, wiki) - - Cannot be used directly - """ - def __init__(self, filename, schema_as_string=None, schema=None, file_format=None, name=""): - super().__init__(filename, schema_as_string, schema, file_format, name) - self._no_name_msg = f"No tag name found in row." - self._no_name_error = HedExceptions.GENERIC_ERROR - - def _add_tag_meta(self, parent_tags, row_number, row, level_adj): - tag_entry = self._add_tag_line(parent_tags, row_number, row) - if not tag_entry: - # This will have already raised an error - return None, parent_tags, level_adj - - try: - rooted_entry = self.find_rooted_entry(tag_entry, self._schema, self._loading_merged) - if rooted_entry: - parent_tags = rooted_entry.long_tag_name.split("/") - level_adj = len(parent_tags) - # Create the entry again for rooted tags, to get the full name. - tag_entry = self._add_tag_line(parent_tags, row_number, row) - except HedFileError as e: - self._add_fatal_error(row_number, row, e.message, e.code) - return None, parent_tags, level_adj - - tag_entry = self._add_to_dict(row_number, row, tag_entry, HedSectionKey.Tags) - - if tag_entry.name.endswith("/#"): - parent_tags.append("#") - else: - parent_tags.append(tag_entry.short_tag_name) - - return tag_entry, parent_tags, level_adj - - def _add_tag_line(self, parent_tags, row_number, row): - """ Add a tag to the dictionaries. - - Parameters: - parent_tags (list): A list of parent tags in order. - row_number (int): The row number to report errors as - row (str or pd.Series): A tag row or pandas series(depends on format) - - Returns: - HedSchemaEntry: The entry for the added tag. - - Notes: - Includes attributes and description. - """ - tag_name, _ = self._get_tag_name(row) - if tag_name: - if parent_tags: - long_tag_name = "/".join(parent_tags) + "/" + tag_name - else: - long_tag_name = tag_name - return self._create_entry(row_number, row, HedSectionKey.Tags, long_tag_name) - - self._add_fatal_error(row_number, row, self._no_name_msg, error_code=self._no_name_error) - - def _add_to_dict(self, row_number, row, entry, key_class): - if entry.has_attribute(HedKey.InLibrary) and not self._loading_merged and not self.appending_to_schema: - self._add_fatal_error(row_number, row, - "Library tag in unmerged schema has InLibrary attribute", - HedExceptions.IN_LIBRARY_IN_UNMERGED) - - return self._add_to_dict_base(entry, key_class) - - @abstractmethod - def _create_entry(self, row_number, row, key_class, full_tag_name=None): - """ Create a tag entry from the given row - - Parameters: - row_number (int): The row number to report errors as - row (str or pd.Series): A tag row or pandas series(depends on format) - key_class(HedSectionKey): The HedSectionKey for this object - full_tag_name (str): The full long form tag name, overrides value found in row. - - Returns: - HedSchemaEntry or None: The entry for the added tag. - """ - raise NotImplementedError("Required in subclass") - - @abstractmethod - def _get_tag_name(self, row): - """ Returns the tag name for the given row - - Parameters: - row (str or pd.Series): A tag row or pandas series(depends on format) - - Returns: - entry_name(str): The tag name for the given row - - Notes: - Should be set to add a fatal error if no name returned - """ - raise NotImplementedError("Required in subclass") diff --git a/hed/schema/schema_io/wiki2schema.py b/hed/schema/schema_io/wiki2schema.py index 7cb71b349..73b201cfb 100644 --- a/hed/schema/schema_io/wiki2schema.py +++ b/hed/schema/schema_io/wiki2schema.py @@ -3,11 +3,11 @@ """ import re -from hed.schema.hed_schema_constants import HedSectionKey +from hed.schema.hed_schema_constants import HedSectionKey, HedKey from hed.errors.exceptions import HedFileError, HedExceptions from hed.errors import error_reporter from hed.schema.schema_io import wiki_constants -from hed.schema.schema_io.text2schema import SchemaLoaderText +from hed.schema.schema_io.base2schema import SchemaLoader from hed.schema.schema_io.wiki_constants import HedWikiSection, SectionStarts, SectionNames from hed.schema.schema_io import text_util @@ -34,7 +34,7 @@ ] -class SchemaLoaderWiki(SchemaLoaderText): +class SchemaLoaderWiki(SchemaLoader): """ Load MediaWiki schemas from filenames or strings. Expected usage is SchemaLoaderWiki.load(filename) @@ -45,8 +45,6 @@ class SchemaLoaderWiki(SchemaLoaderText): def __init__(self, filename, schema_as_string=None, schema=None, file_format=None, name=""): super().__init__(filename, schema_as_string, schema, file_format, name) self._schema.source_format = ".mediawiki" - self._no_name_msg = "Schema term is empty or the line is malformed", - self._no_name_error = HedExceptions.WIKI_DELIMITERS_INVALID def _open_file(self): if self.filename: @@ -151,22 +149,29 @@ def _read_schema(self, lines): self._schema._initialize_attributes(HedSectionKey.Tags) parent_tags = [] level_adj = 0 - for line_number, line in lines: - if line.startswith(wiki_constants.ROOT_TAG): + for row_number, row in lines: + if row.startswith(wiki_constants.ROOT_TAG): parent_tags = [] level_adj = 0 else: - level = self._get_tag_level(line) + level_adj + level = self._get_tag_level(row) + level_adj if level < len(parent_tags): parent_tags = parent_tags[:level] elif level > len(parent_tags): - self._add_fatal_error(line_number, line, + self._add_fatal_error(row_number, row, "Line has too many *'s at front. You cannot skip a level.", HedExceptions.WIKI_LINE_START_INVALID) continue # Create the entry - tag_entry, parent_tags, level_adj = self._add_tag_meta(parent_tags, line_number, line, level_adj) + tag_entry = self._create_tag_entry(parent_tags, row_number, row) + if not tag_entry: + # This will have already raised an error + continue + + tag_entry, level_adj = self._add_tag_entry(tag_entry, row_number, row, level_adj) + if tag_entry: + parent_tags = tag_entry.name.split("/") def _read_unit_classes(self, lines): """Add the unit classes section. @@ -468,3 +473,52 @@ def _split_lines_into_sections(self, wiki_lines): strings_for_section[current_section].append((line_number + 1, line)) return strings_for_section + + def _add_tag_entry(self, tag_entry, row_number, row, level_adj): + try: + rooted_entry = self.find_rooted_entry(tag_entry, self._schema, self._loading_merged) + if rooted_entry: + parent_tags = rooted_entry.long_tag_name.split("/") + level_adj = len(parent_tags) + # Create the entry again for rooted tags, to get the full name. + tag_entry = self._create_tag_entry(parent_tags, row_number, row) + except HedFileError as e: + self._add_fatal_error(row_number, row, e.message, e.code) + return None, level_adj + + tag_entry = self._add_to_dict(row_number, row, tag_entry, HedSectionKey.Tags) + + return tag_entry, level_adj + + def _create_tag_entry(self, parent_tags, row_number, row): + """ Create a tag entry(does not add to schema) + + Parameters: + parent_tags (list): A list of parent tags in order. + row_number (int): The row number to report errors as + row (str or pd.Series): A tag row or pandas series(depends on format) + + Returns: + HedSchemaEntry: The entry for the added tag. + + Notes: + Includes attributes and description. + """ + tag_name, _ = self._get_tag_name(row) + if tag_name: + if parent_tags: + long_tag_name = "/".join(parent_tags) + "/" + tag_name + else: + long_tag_name = tag_name + return self._create_entry(row_number, row, HedSectionKey.Tags, long_tag_name) + + self._add_fatal_error(row_number, row, "Schema term is empty or the line is malformed", + error_code=HedExceptions.WIKI_DELIMITERS_INVALID) + + def _add_to_dict(self, row_number, row, entry, key_class): + if entry.has_attribute(HedKey.InLibrary) and not self._loading_merged and not self.appending_to_schema: + self._add_fatal_error(row_number, row, + "Library tag in unmerged schema has InLibrary attribute", + HedExceptions.IN_LIBRARY_IN_UNMERGED) + + return self._add_to_dict_base(entry, key_class) diff --git a/hed/schema/schema_validation_util.py b/hed/schema/schema_validation_util.py index 2d9802bd6..e241fd502 100644 --- a/hed/schema/schema_validation_util.py +++ b/hed/schema/schema_validation_util.py @@ -1,164 +1,164 @@ -"""Utilities used in HED validation/loading using a HED schema.""" - -from hed.errors.error_reporter import ErrorHandler -from hed.errors.error_types import SchemaWarnings -from hed.schema import hed_schema_constants as constants -from hed.schema.hed_schema_constants import character_types -from hed.schema.hed_schema import HedSchema - - -def validate_schema_tag_new(hed_entry): - """ Check tag entry for capitalization and illegal characters. - - Parameters: - hed_entry (HedTagEntry): A single tag entry - - Returns: - list: A list of all formatting issues found in the term. Each issue is a dictionary. - """ - issues_list = [] - hed_term = hed_entry.short_tag_name - # Any # terms will have already been validated as the previous entry. - if hed_term == "#": - return issues_list - - if hed_term and hed_term[0] and not (hed_term[0].isdigit() or hed_term[0].isupper()): - issues_list += ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CAPITALIZATION, - hed_term, char_index=0, problem_char=hed_term[0]) - issues_list += validate_schema_term_new(hed_entry, hed_term) - return issues_list - - -def validate_schema_term_new(hed_entry, hed_term=None): - """ Check the term for invalid character issues - - Parameters: - hed_entry (HedSchemaEntry): A single schema entry - hed_term (str or None): Use instead of hed_entry.name if present. - - Returns: - list: A list of all formatting issues found in the term. Each issue is a dictionary. - """ - if not hed_term: - hed_term = hed_entry.name - issues_list = [] - # todo: potentially optimize this someday, as most values are the same - character_set = get_allowed_characters_by_name(["name"] + - hed_entry.attributes.get("allowedCharacter", "").split(",")) - indexes = get_problem_indexes(hed_term, character_set) - for char, index in indexes: - issues_list += ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_TAG, - hed_term, char_index=index, problem_char=char) - return issues_list - - -def validate_schema_description_new(hed_entry): - """ Check the description of the entry for invalid character issues - - Parameters: - hed_entry (HedSchemaEntry): A single schema entry - - Returns: - list: A list of all invalid characters found in description. Each issue is a dictionary. - """ - if not hed_entry.description: - return [] - issues_list = [] - character_set = get_allowed_characters_by_name(["text", "comma"]) - indexes = get_problem_indexes(hed_entry.description, character_set) - # Kludge, just get short name here if we have it for error reporting - name = hed_entry.name - if hasattr(hed_entry, "short_tag_name"): - name = hed_entry.short_tag_name - for char, index in indexes: - - issues_list += ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_DESC, - hed_entry.description, name, problem_char=char, char_index=index) - return issues_list - - -def schema_version_for_library(hed_schema, library_name): - """ Given the library name and hed schema object, return the version - - Parameters: - hed_schema (HedSchema): the schema object - library_name (str or None): The library name you're interested in. "" for the standard schema. - - Returns: - version_number (str): The version number of the given library name. Returns None if unknown library_name. - """ - if library_name is None: - library_name = "" - names = hed_schema.library.split(",") - versions = hed_schema.version_number.split(",") - for name, version in zip(names, versions): - if name == library_name: - return version - - # Return the partnered schema version - if library_name == "" and hed_schema.with_standard: - return hed_schema.with_standard - return None - - -def get_allowed_characters(value_classes): - """Returns the allowed characters in a given container of value classes - - Parameters: - value_classes(list of HedSchemaEntry): A list of schema entries that should have the allowedCharacter attribute - - Returns: - character_set(set): The set of all characters from the given classes - """ - # This could be pre-computed - character_set_names = [] - - for value_class in value_classes: - allowed_types = value_class.attributes.get(constants.HedKey.AllowedCharacter, "").split(",") - character_set_names.extend(allowed_types) - - character_set = get_allowed_characters_by_name(character_set_names) - # for now, just always allow these special cases(it's validated extensively elsewhere) - character_set.update("#/") - return character_set - - -def get_allowed_characters_by_name(character_set_names): - """Returns the allowed characters from a list of character set names - - Note: "nonascii" is a special case "character" that can be included as well - - Parameters: - character_set_names(list of str): A list of character sets to allow. See hed_schema_constants.character_types - - Returns: - character_set(set): The set of all characters from the names - """ - character_set = set() - for name in character_set_names: - if name in character_types and name != "nonascii": - character_set.update(character_types[name]) - else: - character_set.add(name) - return character_set - - -def get_problem_indexes(validation_string, character_set, index_adj=0): - """Finds indexes with values not in character set - - Parameters: - validation_string(str): The string to check characters in - character_set(set): the list of valid characters(or the value "nonascii" as a set entry) - index_adj(int): the value to adjust the reported indices by, if this isn't the start of a string. - - Returns: - index_list(tuple of (str, int)): The list of problematic characters and indices - """ - if not character_set: - return [] - - indexes = [(char, index + index_adj) for index, char in enumerate(validation_string) if char not in character_set] - if "nonascii" in character_set: - indexes = [(char, index) for char, index in indexes if not ord(char) > 127] - - return indexes +"""Utilities used in HED validation/loading using a HED schema.""" + +from hed.errors.error_reporter import ErrorHandler +from hed.errors.error_types import SchemaWarnings +from hed.schema import hed_schema_constants as constants +from hed.schema.hed_schema_constants import character_types +from hed.schema.hed_schema import HedSchema + + +def validate_schema_tag_new(hed_entry): + """ Check tag entry for capitalization and illegal characters. + + Parameters: + hed_entry (HedTagEntry): A single tag entry + + Returns: + list: A list of all formatting issues found in the term. Each issue is a dictionary. + """ + issues_list = [] + hed_term = hed_entry.short_tag_name + # Any # terms will have already been validated as the previous entry. + if hed_term == "#": + return issues_list + + if hed_term and hed_term[0] and not (hed_term[0].isdigit() or hed_term[0].isupper()): + issues_list += ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CAPITALIZATION, + hed_term, char_index=0, problem_char=hed_term[0]) + issues_list += validate_schema_term_new(hed_entry, hed_term) + return issues_list + + +def validate_schema_term_new(hed_entry, hed_term=None): + """ Check the term for invalid character issues + + Parameters: + hed_entry (HedSchemaEntry): A single schema entry + hed_term (str or None): Use instead of hed_entry.name if present. + + Returns: + list: A list of all formatting issues found in the term. Each issue is a dictionary. + """ + if not hed_term: + hed_term = hed_entry.name + issues_list = [] + # todo: potentially optimize this someday, as most values are the same + character_set = get_allowed_characters_by_name(["name"] + + hed_entry.attributes.get("allowedCharacter", "").split(",")) + indexes = get_problem_indexes(hed_term, character_set) + for char, index in indexes: + issues_list += ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_TAG, + hed_term, char_index=index, problem_char=char) + return issues_list + + +def validate_schema_description_new(hed_entry): + """ Check the description of the entry for invalid character issues + + Parameters: + hed_entry (HedSchemaEntry): A single schema entry + + Returns: + list: A list of all invalid characters found in description. Each issue is a dictionary. + """ + if not hed_entry.description: + return [] + issues_list = [] + character_set = get_allowed_characters_by_name(["text", "comma"]) + indexes = get_problem_indexes(hed_entry.description, character_set) + # Kludge, just get short name here if we have it for error reporting + name = hed_entry.name + if hasattr(hed_entry, "short_tag_name"): + name = hed_entry.short_tag_name + for char, index in indexes: + + issues_list += ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_DESC, + hed_entry.description, name, problem_char=char, char_index=index) + return issues_list + + +def schema_version_for_library(hed_schema, library_name): + """ Given the library name and hed schema object, return the version + + Parameters: + hed_schema (HedSchema): the schema object + library_name (str or None): The library name you're interested in. "" for the standard schema. + + Returns: + version_number (str): The version number of the given library name. Returns None if unknown library_name. + """ + if library_name is None: + library_name = "" + names = hed_schema.library.split(",") + versions = hed_schema.version_number.split(",") + for name, version in zip(names, versions): + if name == library_name: + return version + + # Return the partnered schema version + if library_name == "" and hed_schema.with_standard: + return hed_schema.with_standard + return None + + +def get_allowed_characters(value_classes): + """Returns the allowed characters in a given container of value classes + + Parameters: + value_classes(list of HedSchemaEntry): A list of schema entries that should have the allowedCharacter attribute + + Returns: + character_set(set): The set of all characters from the given classes + """ + # This could be pre-computed + character_set_names = [] + + for value_class in value_classes: + allowed_types = value_class.attributes.get(constants.HedKey.AllowedCharacter, "").split(",") + character_set_names.extend(allowed_types) + + character_set = get_allowed_characters_by_name(character_set_names) + # for now, just always allow these special cases(it's validated extensively elsewhere) + character_set.update("#/") + return character_set + + +def get_allowed_characters_by_name(character_set_names): + """Returns the allowed characters from a list of character set names + + Note: "nonascii" is a special case "character" that can be included as well + + Parameters: + character_set_names(list of str): A list of character sets to allow. See hed_schema_constants.character_types + + Returns: + character_set(set): The set of all characters from the names + """ + character_set = set() + for name in character_set_names: + if name in character_types and name != "nonascii": + character_set.update(character_types[name]) + else: + character_set.add(name) + return character_set + + +def get_problem_indexes(validation_string, character_set, index_adj=0): + """Finds indexes with values not in character set + + Parameters: + validation_string(str): The string to check characters in + character_set(set): the list of valid characters(or the value "nonascii" as a set entry) + index_adj(int): the value to adjust the reported indices by, if this isn't the start of a string. + + Returns: + index_list(tuple of (str, int)): The list of problematic characters and indices + """ + if not character_set: + return [] + + indexes = [(char, index + index_adj) for index, char in enumerate(validation_string) if char not in character_set] + if "nonascii" in character_set: + indexes = [(char, index) for char, index in indexes if not ord(char) > 127] + + return indexes diff --git a/hed/scripts/add_hed_ids.py b/hed/scripts/add_hed_ids.py new file mode 100644 index 000000000..4019aa53e --- /dev/null +++ b/hed/scripts/add_hed_ids.py @@ -0,0 +1,24 @@ +from hed.scripts.script_util import get_prerelease_path +from hed.scripts.convert_and_update_schema import convert_and_update +import argparse +from hed.schema.schema_io.df_util import convert_filenames_to_dict + + +# Slightly tweaked version of convert_and_update_schema.py with a new main function to allow different parameters. +def main(): + parser = argparse.ArgumentParser(description='Add hed ids to a specific schema.') + parser.add_argument('repo_path', help='The location of the hed-schemas directory') + parser.add_argument('schema_name', help='The name of the schema("standard" for standard schema) to modify') + parser.add_argument('schema_version', help='The schema version to modify') + + args = parser.parse_args() + + basepath = get_prerelease_path(args.repo_path, schema_name=args.schema_name, schema_version=args.schema_version) + filenames = list(convert_filenames_to_dict(basepath).values()) + set_ids = True + + return convert_and_update(filenames, set_ids) + + +if __name__ == "__main__": + exit(main()) diff --git a/hed/scripts/convert_and_update_schema.py b/hed/scripts/convert_and_update_schema.py index a9891ad1f..0debdd488 100644 --- a/hed/scripts/convert_and_update_schema.py +++ b/hed/scripts/convert_and_update_schema.py @@ -1,94 +1,90 @@ -from hed.schema import load_schema_version -from hed.scripts.script_util import sort_base_schemas, validate_all_schemas, add_extension -from hed.schema.schema_io.df2schema import load_dataframes -from hed.schema.schema_io.ontology_util import update_dataframes_from_schema, save_dataframes -from hed.schema.hed_schema_io import load_schema, from_dataframes -from hed.errors import get_printable_issue_string, HedFileError -import argparse - - -def convert_and_update(filenames, set_ids): - """ Validate, convert, and update as needed all schemas listed in filenames - - If any schema fails to validate, no schemas will be updated. - - Parameters: - filenames(list of str): A list of filenames that have been updated - set_ids(bool): If True, assign missing hedIds - """ - # Find and group the changed files - schema_files = sort_base_schemas(filenames) - all_issues = validate_all_schemas(schema_files) - - if not schema_files: - print("No schema file changes found in the file list") - return 0 - - if all_issues: - print("Did not attempt to update schemas due to validation failures") - return 1 - - updated = [] - # If we are here, we have validated the schemas(and if there's more than one version changed, that they're the same) - for basename, extensions in schema_files.items(): - # Skip any with multiple extensions or not in pre-release - if "prerelease" not in basename: - print(f"Skipping updates on {basename}, not in a prerelease folder.") - continue - source_filename = add_extension(basename, - list(extensions)[0]) # Load any changed schema version, they're all the same - - # todo: more properly decide how we want to handle non lowercase extensions. - tsv_extension = ".tsv" - for extension in extensions: - if extension.lower() == ".tsv": - tsv_extension = extension - - source_df_filename = add_extension(basename, tsv_extension) - schema = load_schema(source_filename) - print(f"Trying to convert/update file {source_filename}") - source_dataframes = load_dataframes(source_df_filename) - # todo: We need a more robust system for if some files are missing - # (especially for library schemas which will probably lack some) - if any(value is None for value in source_dataframes.values()): - source_dataframes = schema.get_as_dataframes() - - try: - result = update_dataframes_from_schema(source_dataframes, schema, schema.library, - assign_missing_ids=set_ids) - except HedFileError as e: - print(get_printable_issue_string(e.issues, title="Issues updating schema:")) - raise e - schema_reloaded = from_dataframes(result) - schema_reloaded.save_as_mediawiki(basename + ".mediawiki") - schema_reloaded.save_as_xml(basename + ".xml") - - save_dataframes(source_df_filename, result) - updated.append(basename) - - for basename in updated: - print(f"Schema {basename} updated.") - - if not updated: - print("Did not update any schemas") - return 0 - - -def main(): - parser = argparse.ArgumentParser(description='Update other schema formats based on the changed one.') - parser.add_argument('filenames', nargs='*', help='List of files to process') - parser.add_argument('--set-ids', action='store_true', help='Add missing hed ids') - - args = parser.parse_args() - - filenames = args.filenames - set_ids = args.set_ids - - # Trigger a local cache hit (this ensures trying to load withStandard schemas will work properly) - _ = load_schema_version("8.2.0") - - return convert_and_update(filenames, set_ids) - - -if __name__ == "__main__": - exit(main()) +from hed.scripts.script_util import sort_base_schemas, validate_all_schemas, add_extension +from hed.schema.schema_io import load_dataframes, save_dataframes +from hed.schema.schema_io.ontology_util import update_dataframes_from_schema +from hed.schema.hed_schema_io import load_schema, from_dataframes +from hed.errors import get_printable_issue_string, HedFileError +import argparse + + +def convert_and_update(filenames, set_ids): + """ Validate, convert, and update as needed all schemas listed in filenames + + If any schema fails to validate, no schemas will be updated. + + Parameters: + filenames(list of str): A list of filenames that have been updated + set_ids(bool): If True, assign missing hedIds + """ + # Find and group the changed files + schema_files = sort_base_schemas(filenames) + all_issues = validate_all_schemas(schema_files) + + if not schema_files: + print("No schema file changes found in the file list") + return 0 + + if all_issues: + print("Did not attempt to update schemas due to validation failures") + return 1 + + updated = [] + # If we are here, we have validated the schemas(and if there's more than one version changed, that they're the same) + for basename, extensions in schema_files.items(): + # Skip any with multiple extensions or not in pre-release + if "prerelease" not in basename: + print(f"Skipping updates on {basename}, not in a prerelease folder.") + continue + source_filename = add_extension(basename, + list(extensions)[0]) # Load any changed schema version, they're all the same + + # todo: more properly decide how we want to handle non lowercase extensions. + tsv_extension = ".tsv" + for extension in extensions: + if extension.lower() == ".tsv": + tsv_extension = extension + + source_df_filename = add_extension(basename, tsv_extension) + schema = load_schema(source_filename) + print(f"Trying to convert/update file {source_filename}") + source_dataframes = load_dataframes(source_df_filename) + # todo: We need a more robust system for if some files are missing + # (especially for library schemas which will probably lack some) + if any(value is None for value in source_dataframes.values()): + source_dataframes = schema.get_as_dataframes() + + try: + result = update_dataframes_from_schema(source_dataframes, schema, schema.library, + assign_missing_ids=set_ids) + except HedFileError as e: + print(get_printable_issue_string(e.issues, title="Issues updating schema:")) + raise e + schema_reloaded = from_dataframes(result) + schema_reloaded.save_as_mediawiki(basename + ".mediawiki") + schema_reloaded.save_as_xml(basename + ".xml") + + save_dataframes(source_df_filename, result) + updated.append(basename) + + for basename in updated: + print(f"Schema {basename} updated.") + + if not updated: + print("Did not update any schemas") + return 0 + + +def main(): + parser = argparse.ArgumentParser(description='Update other schema formats based on the changed one.') + parser.add_argument('filenames', nargs='*', help='List of files to process') + parser.add_argument('--set-ids', action='store_true', help='Add missing hed ids') + + args = parser.parse_args() + + filenames = args.filenames + set_ids = args.set_ids + + return convert_and_update(filenames, set_ids) + + +if __name__ == "__main__": + exit(main()) diff --git a/hed/scripts/create_ontology.py b/hed/scripts/create_ontology.py index 601bd0db1..731d70537 100644 --- a/hed/scripts/create_ontology.py +++ b/hed/scripts/create_ontology.py @@ -1,65 +1,61 @@ -from hed.schema import load_schema_version -from hed.errors import HedFileError, get_printable_issue_string -from hed.schema.schema_io.df2schema import load_dataframes -from hed.schema.schema_io.ontology_util import convert_df_to_omn -from hed.scripts.script_util import get_prerelease_path, get_schema_filename -import argparse -import os - - -def create_ontology(repo_path, schema_name, schema_version, dest): - """ Creates an ontology out of the given schema - - Parameters: - repo_path(str): the location of the hed-schemas folder relative to this one. Should point into the folder. - schema_name(str): The name of the schema we're interested in. "standard" for the standard schema - schema_version(str): The semantic version number - dest(str): Location for output - - Returns: - error(int): 0 on success. Raises an exception otherwise. - """ - final_source = get_prerelease_path(repo_path, schema_name, schema_version) - # print(f"Creating ontology from {final_source}") - - dataframes = load_dataframes(final_source) - try: - _, omn_dict = convert_df_to_omn(dataframes) - except HedFileError as e: - if e.issues: - print(get_printable_issue_string(e.issues, title="Issues converting schema:")) - raise e - - base = get_schema_filename(schema_name, schema_version) - output_dest = os.path.join(dest, base, "generated_omn") - os.makedirs(output_dest, exist_ok=True) - for suffix, omn_text in omn_dict.items(): - filename = os.path.join(output_dest, f"{base}_{suffix}.omn") - with open(filename, mode='w', encoding='utf-8') as opened_file: - opened_file.writelines(omn_text) - - return 0 - - -def main(): - parser = argparse.ArgumentParser(description='Convert a specified schema in the prerelease folder to an ontology.') - parser.add_argument('repo_path', help='The location of the hed-schemas directory') - parser.add_argument('schema_name', help='The name of the schema to convert("standard" for standard schema)') - parser.add_argument('schema_version', help='The location of the hed-schemas directory') - parser.add_argument('--dest', default=os.path.join("src", "ontology"), help='The base location to save to') - - args = parser.parse_args() - - repo_path = args.repo_path - schema_name = args.schema_name - schema_version = args.schema_version - dest = args.dest - - # Trigger a local cache hit (this ensures trying to load withStandard schemas will work properly) - _ = load_schema_version("8.2.0") - - return create_ontology(repo_path, schema_name, schema_version, dest) - - -if __name__ == "__main__": - exit(main()) +from hed.errors import HedFileError, get_printable_issue_string +from hed.schema.schema_io import load_dataframes +from hed.schema.schema_io.ontology_util import convert_df_to_omn +from hed.scripts.script_util import get_prerelease_path, get_schema_filename +import argparse +import os + + +def create_ontology(repo_path, schema_name, schema_version, dest): + """ Creates an ontology out of the given schema + + Parameters: + repo_path(str): the location of the hed-schemas folder relative to this one. Should point into the folder. + schema_name(str): The name of the schema we're interested in. "standard" for the standard schema + schema_version(str): The semantic version number + dest(str): Location for output + + Returns: + error(int): 0 on success. Raises an exception otherwise. + """ + final_source = get_prerelease_path(repo_path, schema_name, schema_version) + # print(f"Creating ontology from {final_source}") + + dataframes = load_dataframes(final_source, include_prefix_dfs=True) + try: + _, omn_dict = convert_df_to_omn(dataframes) + except HedFileError as e: + if e.issues: + print(get_printable_issue_string(e.issues, title="Issues converting schema:")) + raise e + + base = get_schema_filename(schema_name, schema_version) + output_dest = os.path.join(dest, base, "generated_omn") + os.makedirs(output_dest, exist_ok=True) + for suffix, omn_text in omn_dict.items(): + filename = os.path.join(output_dest, f"{base}_{suffix}.omn") + with open(filename, mode='w', encoding='utf-8') as opened_file: + opened_file.writelines(omn_text) + + return 0 + + +def main(): + parser = argparse.ArgumentParser(description='Convert a specified schema in the prerelease folder to an ontology.') + parser.add_argument('repo_path', help='The location of the hed-schemas directory') + parser.add_argument('schema_name', help='The name of the schema to convert("standard" for standard schema)') + parser.add_argument('schema_version', help='The schema version to modify') + parser.add_argument('--dest', default=os.path.join("src", "ontology"), help='The base location to save to') + + args = parser.parse_args() + + repo_path = args.repo_path + schema_name = args.schema_name + schema_version = args.schema_version + dest = args.dest + + return create_ontology(repo_path, schema_name, schema_version, dest) + + +if __name__ == "__main__": + exit(main()) diff --git a/hed/scripts/script_util.py b/hed/scripts/script_util.py index 842b5e769..95d538589 100644 --- a/hed/scripts/script_util.py +++ b/hed/scripts/script_util.py @@ -33,17 +33,17 @@ def validate_schema(file_path): validation_issues.append(error_message) return validation_issues - mediawiki_string = base_schema.get_as_mediawiki_string() + mediawiki_string = base_schema.get_as_mediawiki_string(save_merged=True) reloaded_schema = from_string(mediawiki_string, schema_format=".mediawiki") validation_issues += _get_schema_comparison(base_schema, reloaded_schema, file_path, "mediawiki") - xml_string = base_schema.get_as_xml_string() + xml_string = base_schema.get_as_xml_string(save_merged=True) reloaded_schema = from_string(xml_string, schema_format=".xml") validation_issues += _get_schema_comparison(base_schema, reloaded_schema, file_path, "xml") - tsv_dataframes = base_schema.get_as_dataframes() + tsv_dataframes = base_schema.get_as_dataframes(save_merged=True) reloaded_schema = from_dataframes(tsv_dataframes) validation_issues += _get_schema_comparison(base_schema, reloaded_schema, file_path, "tsv") @@ -65,7 +65,7 @@ def add_extension(basename, extension): return basename + extension -def sort_base_schemas(filenames): +def sort_base_schemas(filenames, add_all_extensions=False): """ Sort and group the changed files based on basename Example input: ["test_schema.mediawiki", "hedtsv/test_schema/test_schema_Tag.tsv", "other_schema.xml"] @@ -78,6 +78,7 @@ def sort_base_schemas(filenames): Parameters: filenames(list or container): The changed filenames + add_all_extensions(bool): If True, always return all 3 filenames for any schemas found. Returns: sorted_files(dict): A dictionary where keys are the basename, and the values are a set of extensions modified @@ -108,6 +109,11 @@ def sort_base_schemas(filenames): else: print(f"Ignoring file {file_path}") + if add_all_extensions: + for schema_name in schema_files: + for extension in all_extensions: + schema_files[schema_name].add(extension) + return schema_files diff --git a/hed/scripts/validate_schemas.py b/hed/scripts/validate_schemas.py index 43c2bf173..189157206 100644 --- a/hed/scripts/validate_schemas.py +++ b/hed/scripts/validate_schemas.py @@ -1,16 +1,17 @@ import sys -from hed.schema import load_schema_version from hed.scripts.script_util import validate_all_schemas, sort_base_schemas +import argparse -def main(arg_list=None): - # Trigger a local cache hit - _ = load_schema_version("8.2.0") +def main(): + parser = argparse.ArgumentParser(description='Validate schema files.') + parser.add_argument('schema_files', nargs='+', help='List of schema files to validate.') + parser.add_argument('--add-all-extensions', action='store_true', + help='Always verify all versions of the same schema are equal.') - if not arg_list: - arg_list = sys.argv[1:] + args = parser.parse_args() - schema_files = sort_base_schemas(arg_list) + schema_files = sort_base_schemas(args.schema_files, args.add_all_extensions) issues = validate_all_schemas(schema_files) if issues: @@ -19,4 +20,4 @@ def main(arg_list=None): if __name__ == "__main__": - exit(main()) + sys.exit(main()) diff --git a/hed/tools/analysis/__init__.py b/hed/tools/analysis/__init__.py index 30c11f83a..bf4eb6ead 100644 --- a/hed/tools/analysis/__init__.py +++ b/hed/tools/analysis/__init__.py @@ -1,14 +1,14 @@ -""" Basic analysis tools. """ -from .file_dictionary import FileDictionary -from .annotation_util import (check_df_columns, df_to_hed, extract_tags, generate_sidecar_entry, get_bids_dataset, - hed_to_df, str_to_tabular, strs_to_sidecar, to_strlist) -from .event_manager import EventManager -from .hed_tag_manager import HedTagManager -from .hed_type_defs import HedTypeDefs -from .hed_type_factors import HedTypeFactors -from .hed_type import HedType -from .hed_type_manager import HedTypeManager -from .hed_type_counts import HedTypeCount -from .key_map import KeyMap -from .tabular_summary import TabularSummary -from .temporal_event import TemporalEvent \ No newline at end of file +""" Basic analysis tools. """ +from .file_dictionary import FileDictionary +from .annotation_util import (check_df_columns, df_to_hed, extract_tags, generate_sidecar_entry, get_bids_dataset, + hed_to_df, str_to_tabular, strs_to_sidecar, to_strlist) +from .event_manager import EventManager +from .hed_tag_manager import HedTagManager +from .hed_type_defs import HedTypeDefs +from .hed_type_factors import HedTypeFactors +from .hed_type import HedType +from .hed_type_manager import HedTypeManager +from .hed_type_counts import HedTypeCount +from .key_map import KeyMap +from .tabular_summary import TabularSummary +from .temporal_event import TemporalEvent diff --git a/hed/tools/bids/bids_dataset.py b/hed/tools/bids/bids_dataset.py index fa58af8f1..01ec6297f 100644 --- a/hed/tools/bids/bids_dataset.py +++ b/hed/tools/bids/bids_dataset.py @@ -12,9 +12,9 @@ class BidsDataset: """ A BIDS dataset representation primarily focused on HED evaluation. Attributes: - root_path (str): Real root path of the BIDS dataset. - schema (HedSchema or HedSchemaGroup): The schema used for evaluation. - tabular_files (dict): A dictionary of BidsTabularDictionary objects containing a given type. + root_path (str): Real root path of the BIDS dataset. + schema (HedSchema or HedSchemaGroup): The schema used for evaluation. + tabular_files (dict): A dictionary of BidsTabularDictionary objects containing a given type. """ diff --git a/hed/tools/remodeling/cli/run_remodel.py b/hed/tools/remodeling/cli/run_remodel.py index edf0482e5..8b4036b11 100644 --- a/hed/tools/remodeling/cli/run_remodel.py +++ b/hed/tools/remodeling/cli/run_remodel.py @@ -231,7 +231,7 @@ def main(arg_list=None): if not args.no_summaries: dispatch.save_summaries(args.save_formats, individual_summaries=args.individual_summaries, summary_dir=save_dir, task_name=task) - except Exception as ex: + except Exception: if args.log_dir: log_name = io_util.get_alphanumeric_path(os.path.realpath(args.data_dir)) + '_' + timestamp + '.txt' logging.basicConfig(filename=os.path.join(args.log_dir, log_name), level=logging.ERROR) diff --git a/hed/tools/remodeling/dispatcher.py b/hed/tools/remodeling/dispatcher.py index 04e6d8091..6632f7447 100644 --- a/hed/tools/remodeling/dispatcher.py +++ b/hed/tools/remodeling/dispatcher.py @@ -130,7 +130,7 @@ def get_summary_save_dir(self): if self.data_root: return os.path.realpath(os.path.join(self.data_root, 'derivatives', Dispatcher.REMODELING_SUMMARY_PATH)) - raise HedFileError("NoDataRoot", f"Dispatcher must have a data root to produce directories", "") + raise HedFileError("NoDataRoot", "Dispatcher must have a data root to produce directories", "") def run_operations(self, file_path, sidecar=None, verbose=False): """ Run the dispatcher operations on a file. diff --git a/hed/tools/remodeling/operations/summarize_definitions_op.py b/hed/tools/remodeling/operations/summarize_definitions_op.py index 76b3a5072..f953d593e 100644 --- a/hed/tools/remodeling/operations/summarize_definitions_op.py +++ b/hed/tools/remodeling/operations/summarize_definitions_op.py @@ -10,8 +10,8 @@ class SummarizeDefinitionsOp(BaseOp): """ Summarize the definitions used in the dataset based on Def and Def-expand. Required remodeling parameters: - - **summary_name** (*str*): The name of the summary. - - **summary_filename** (*str*): Base filename of the summary. + - **summary_name** (*str*): The name of the summary. + - **summary_filename** (*str*): Base filename of the summary. Optional remodeling parameters: - **append_timecode** (*bool*): If False (default), the timecode is not appended to the summary filename. @@ -20,7 +20,7 @@ class SummarizeDefinitionsOp(BaseOp): """ NAME = "summarize_definitions" - + PARAMS = { "type": "object", "properties": { diff --git a/hed/tools/visualization/tag_word_cloud.py b/hed/tools/visualization/tag_word_cloud.py index 90a06a877..6f6619bf4 100644 --- a/hed/tools/visualization/tag_word_cloud.py +++ b/hed/tools/visualization/tag_word_cloud.py @@ -103,7 +103,7 @@ def load_and_resize_mask(mask_path, width=None, height=None): scale = original_size[1] / height output_size = original_size / scale - mask_image = mask_image.resize(output_size.astype(int), Image.LANCZOS) + mask_image = mask_image.resize(tuple(output_size.astype(int)), Image.LANCZOS) mask_image_array = np.array(mask_image) # Treat transparency (alpha < 128) or white (R>127, G>127, B>127) as white, else black diff --git a/hed/validator/def_validator.py b/hed/validator/def_validator.py index 7768abdab..4c24f7374 100644 --- a/hed/validator/def_validator.py +++ b/hed/validator/def_validator.py @@ -1,207 +1,209 @@ -""" Validates of Def, Def-expand and Temporal groups. """ -from hed.models.hed_group import HedGroup -from hed.models.hed_tag import HedTag -from hed.models.definition_dict import DefinitionDict -from hed.errors.error_types import ValidationErrors -from hed.errors.error_reporter import ErrorHandler -from hed.models.model_constants import DefTagNames -from hed.errors.error_types import TemporalErrors - - -class DefValidator(DefinitionDict): - """ Validates Def/ and Def-expand/, as well as Temporal groups: Onset, Inset, and Offset - - """ - - def __init__(self, def_dicts=None, hed_schema=None): - """ Initialize for definitions in hed strings. - - Parameters: - def_dicts (list or DefinitionDict or str): DefinitionDicts containing the definitions to pass to baseclass - hed_schema(HedSchema or None): Required if passing strings or lists of strings, unused otherwise. - """ - super().__init__(def_dicts, hed_schema=hed_schema) - - def validate_def_tags(self, hed_string_obj, hed_validator=None): - """ Validate Def/Def-Expand tags. - - Parameters: - hed_string_obj (HedString): The hed string to process. - hed_validator (HedValidator): Used to validate the placeholder replacement. - Returns: - list: Issues found related to validating defs. Each issue is a dictionary. - """ - # This is needed primarily to validate the contents of a def-expand matches the default. - def_issues = [] - # We need to check for labels to expand in ALL groups - for def_tag, def_expand_group, def_group in hed_string_obj.find_def_tags(recursive=True): - def_issues += self._validate_def_contents(def_tag, def_expand_group, hed_validator) - - return def_issues - - @staticmethod - def _report_missing_or_invalid_value(def_tag, def_entry, is_def_expand_tag): - """Returns the correct error for this type of def tag - - Parameters: - def_tag(HedTag): The source tag - def_entry(DefinitionEntry): The entry for this definition - is_def_expand_tag(bool): If the given def_tag is a def-expand tag or not. - - Returns: - issues(list): Issues found from validating placeholders. - """ - def_issues = [] - if def_entry.takes_value: - error_code = ValidationErrors.HED_DEF_VALUE_MISSING - if is_def_expand_tag: - error_code = ValidationErrors.HED_DEF_EXPAND_VALUE_MISSING - else: - error_code = ValidationErrors.HED_DEF_VALUE_EXTRA - if is_def_expand_tag: - error_code = ValidationErrors.HED_DEF_EXPAND_VALUE_EXTRA - def_issues += ErrorHandler.format_error(error_code, tag=def_tag) - return def_issues - - def _validate_def_contents(self, def_tag, def_expand_group, hed_validator): - """ Check for issues with expanding a tag from Def to a Def-expand tag group - - Parameters: - def_tag (HedTag): Source hed tag that may be a Def or Def-expand tag. - def_expand_group (HedGroup or HedTag): Source group for this def-expand tag. - Same as def_tag if this is not a def-expand tag. - hed_validator (HedValidator): Used to validate the placeholder replacement. - - Returns: - issues(list): Issues found from validating placeholders. - """ - def_issues = [] - is_def_expand_tag = def_expand_group != def_tag - tag_label, _, placeholder = def_tag.extension.partition('/') - - label_tag_lower = tag_label.casefold() - def_entry = self.defs.get(label_tag_lower) - if def_entry is None: - error_code = ValidationErrors.HED_DEF_UNMATCHED - if is_def_expand_tag: - error_code = ValidationErrors.HED_DEF_EXPAND_UNMATCHED - def_issues += ErrorHandler.format_error(error_code, tag=def_tag) - else: - def_contents = def_entry.get_definition(def_tag, placeholder_value=placeholder, - return_copy_of_tag=True) - if def_contents is not None: - if is_def_expand_tag and def_expand_group != def_contents: - def_issues += ErrorHandler.format_error(ValidationErrors.HED_DEF_EXPAND_INVALID, - tag=def_tag, actual_def=def_contents, - found_def=def_expand_group) - else: - def_issues += self._report_missing_or_invalid_value(def_tag, def_entry, is_def_expand_tag) - - return def_issues - - def validate_def_value_units(self, def_tag, hed_validator): - """Equivalent to HedValidator.validate_units for the special case of a Def or Def-expand tag""" - tag_label, _, placeholder = def_tag.extension.partition('/') - is_def_expand_tag = def_tag.short_base_tag == DefTagNames.DEF_EXPAND_KEY - - def_entry = self.defs.get(tag_label.casefold()) - # These errors will be caught as can't match definition - if def_entry is None: - return [] - - error_code = ValidationErrors.DEF_INVALID - if is_def_expand_tag: - error_code = ValidationErrors.DEF_EXPAND_INVALID - - def_issues = [] - - # Validate the def name vs the name class - def_issues += hed_validator.validate_units(def_tag, - tag_label, - error_code=error_code) - - def_contents = def_entry.get_definition(def_tag, placeholder_value=placeholder, return_copy_of_tag=True) - if def_contents and def_entry.takes_value and hed_validator: - placeholder_tag = def_contents.get_first_group().find_placeholder_tag() - # Handle the case where they're adding a unit as part of a placeholder. eg Speed/# mph - if placeholder_tag: - placeholder = placeholder_tag.extension - def_issues += hed_validator.validate_units(placeholder_tag, - placeholder, - report_as=def_tag, - error_code=error_code, - index_offset=len(tag_label) + 1) - - return def_issues - - def validate_onset_offset(self, hed_string_obj): - """ Validate onset/offset - - Parameters: - hed_string_obj (HedString): The hed string to check. - - Returns: - list: A list of issues found in validating onsets (i.e., out of order onsets, unknown def names). - """ - onset_issues = [] - for found_onset, found_group in self._find_onset_tags(hed_string_obj): - if not found_onset: - return [] - - def_tags = found_group.find_def_tags() - if not def_tags: - onset_issues += ErrorHandler.format_error(TemporalErrors.ONSET_NO_DEF_TAG_FOUND, found_onset) - continue - - if len(def_tags) > 1: - onset_issues += ErrorHandler.format_error(TemporalErrors.ONSET_TOO_MANY_DEFS, - tag=def_tags[0][0], - tag_list=[tag[0] for tag in def_tags[1:]]) - continue - - # Get all children but def group and onset/offset, then validate #/type of children. - def_tag, def_group, _ = def_tags[0] - if def_group is None: - def_group = def_tag - children = [child for child in found_group.children if - def_group is not child and found_onset is not child] - - # Delay tag is checked for uniqueness elsewhere, so we can safely remove all of them - children = [child for child in children - if not isinstance(child, HedTag) or child.short_base_tag != DefTagNames.DELAY_KEY] - max_children = 1 - if found_onset.short_base_tag == DefTagNames.OFFSET_KEY: - max_children = 0 - if len(children) > max_children: - onset_issues += ErrorHandler.format_error(TemporalErrors.ONSET_WRONG_NUMBER_GROUPS, - def_tag, - found_group.children) - continue - - if children: - # Make this a loop if max_children can be > 1 - child = children[0] - if not isinstance(child, HedGroup): - onset_issues += ErrorHandler.format_error(TemporalErrors.ONSET_TAG_OUTSIDE_OF_GROUP, - child, - def_tag) - - # At this point we have either an onset or offset tag and it's name - onset_issues += self._handle_onset_or_offset(def_tag) - - return onset_issues - - def _find_onset_tags(self, hed_string_obj): - return hed_string_obj.find_top_level_tags(anchor_tags=DefTagNames.TEMPORAL_KEYS) - - def _handle_onset_or_offset(self, def_tag): - def_name, _, placeholder = def_tag.extension.partition('/') - - def_entry = self.defs.get(def_name.casefold()) - if def_entry is None: - return ErrorHandler.format_error(TemporalErrors.ONSET_DEF_UNMATCHED, tag=def_tag) - if bool(def_entry.takes_value) != bool(placeholder): - return ErrorHandler.format_error(TemporalErrors.ONSET_PLACEHOLDER_WRONG, tag=def_tag, - has_placeholder=bool(def_entry.takes_value)) - - return [] +""" Validates of Def, Def-expand and Temporal groups. """ +from hed.models.hed_group import HedGroup +from hed.models.hed_tag import HedTag +from hed.models.definition_dict import DefinitionDict +from hed.errors.error_types import ValidationErrors +from hed.errors.error_reporter import ErrorHandler +from hed.models.model_constants import DefTagNames +from hed.errors.error_types import TemporalErrors + + +class DefValidator(DefinitionDict): + """ Validates Def/ and Def-expand/, as well as Temporal groups: Onset, Inset, and Offset + + """ + + def __init__(self, def_dicts=None, hed_schema=None): + """ Initialize for definitions in hed strings. + + Parameters: + def_dicts (list or DefinitionDict or str): DefinitionDicts containing the definitions to pass to baseclass + hed_schema(HedSchema or None): Required if passing strings or lists of strings, unused otherwise. + """ + super().__init__(def_dicts, hed_schema=hed_schema) + + def validate_def_tags(self, hed_string_obj, hed_validator=None): + """ Validate Def/Def-Expand tags. + + Parameters: + hed_string_obj (HedString): The hed string to process. + hed_validator (HedValidator): Used to validate the placeholder replacement. + Returns: + list: Issues found related to validating defs. Each issue is a dictionary. + """ + # This is needed primarily to validate the contents of a def-expand matches the default. + def_issues = [] + # We need to check for labels to expand in ALL groups + for def_tag, def_expand_group, def_group in hed_string_obj.find_def_tags(recursive=True): + def_issues += self._validate_def_contents(def_tag, def_expand_group, hed_validator) + + return def_issues + + @staticmethod + def _report_missing_or_invalid_value(def_tag, def_entry, is_def_expand_tag): + """Returns the correct error for this type of def tag + + Parameters: + def_tag(HedTag): The source tag + def_entry(DefinitionEntry): The entry for this definition + is_def_expand_tag(bool): If the given def_tag is a def-expand tag or not. + + Returns: + issues(list): Issues found from validating placeholders. + """ + def_issues = [] + if def_entry.takes_value: + error_code = ValidationErrors.HED_DEF_VALUE_MISSING + if is_def_expand_tag: + error_code = ValidationErrors.HED_DEF_EXPAND_VALUE_MISSING + else: + error_code = ValidationErrors.HED_DEF_VALUE_EXTRA + if is_def_expand_tag: + error_code = ValidationErrors.HED_DEF_EXPAND_VALUE_EXTRA + def_issues += ErrorHandler.format_error(error_code, tag=def_tag) + return def_issues + + def _validate_def_contents(self, def_tag, def_expand_group, hed_validator): + """ Check for issues with expanding a tag from Def to a Def-expand tag group + + Parameters: + def_tag (HedTag): Source hed tag that may be a Def or Def-expand tag. + def_expand_group (HedGroup or HedTag): Source group for this def-expand tag. + Same as def_tag if this is not a def-expand tag. + hed_validator (HedValidator): Used to validate the placeholder replacement. + + Returns: + issues(list): Issues found from validating placeholders. + """ + def_issues = [] + is_def_expand_tag = def_expand_group != def_tag + tag_label, _, placeholder = def_tag.extension.partition('/') + + label_tag_lower = tag_label.casefold() + def_entry = self.defs.get(label_tag_lower) + if def_entry is None: + error_code = ValidationErrors.HED_DEF_UNMATCHED + if is_def_expand_tag: + error_code = ValidationErrors.HED_DEF_EXPAND_UNMATCHED + def_issues += ErrorHandler.format_error(error_code, tag=def_tag) + else: + def_contents = def_entry.get_definition(def_tag, placeholder_value=placeholder, + return_copy_of_tag=True) + if def_contents is not None: + if is_def_expand_tag and def_expand_group != def_contents: + def_issues += ErrorHandler.format_error(ValidationErrors.HED_DEF_EXPAND_INVALID, + tag=def_tag, actual_def=def_contents, + found_def=def_expand_group) + else: + def_issues += self._report_missing_or_invalid_value(def_tag, def_entry, is_def_expand_tag) + + return def_issues + + def validate_def_value_units(self, def_tag, hed_validator, allow_placeholders=False): + """Equivalent to HedValidator.validate_units for the special case of a Def or Def-expand tag""" + tag_label, _, placeholder = def_tag.extension.partition('/') + is_def_expand_tag = def_tag.short_base_tag == DefTagNames.DEF_EXPAND_KEY + + def_entry = self.defs.get(tag_label.casefold()) + # These errors will be caught as can't match definition + if def_entry is None: + return [] + + error_code = ValidationErrors.DEF_INVALID + if is_def_expand_tag: + error_code = ValidationErrors.DEF_EXPAND_INVALID + + # Validate the def name vs the name class + def_issues = hed_validator._unit_validator._check_value_class(def_tag, tag_label, report_as=None, + error_code=error_code, index_offset=0) + # def_issues += hed_validator.validate_units(def_tag, + # tag_label, + # error_code=error_code) + + def_contents = def_entry.get_definition(def_tag, placeholder_value=placeholder, return_copy_of_tag=True) + if def_contents and def_entry.takes_value and hed_validator: + placeholder_tag = def_contents.get_first_group().find_placeholder_tag() + # Handle the case where they're adding a unit as part of a placeholder. eg Speed/# mph + if placeholder_tag: + placeholder = placeholder_tag.extension + if placeholder.startswith('# '): + placeholder = placeholder[2:] + def_issues += hed_validator.validate_units(placeholder_tag, + placeholder, + report_as=def_tag, + error_code=error_code, + index_offset=len(tag_label) + 1) + + return def_issues + + def validate_onset_offset(self, hed_string_obj): + """ Validate onset/offset + + Parameters: + hed_string_obj (HedString): The hed string to check. + + Returns: + list: A list of issues found in validating onsets (i.e., out of order onsets, unknown def names). + """ + onset_issues = [] + for found_onset, found_group in self._find_onset_tags(hed_string_obj): + if not found_onset: + return [] + + def_tags = found_group.find_def_tags() + if not def_tags: + onset_issues += ErrorHandler.format_error(TemporalErrors.ONSET_NO_DEF_TAG_FOUND, found_onset) + continue + + if len(def_tags) > 1: + onset_issues += ErrorHandler.format_error(TemporalErrors.ONSET_TOO_MANY_DEFS, + tag=def_tags[0][0], + tag_list=[tag[0] for tag in def_tags[1:]]) + continue + + # Get all children but def group and onset/offset, then validate #/type of children. + def_tag, def_group, _ = def_tags[0] + if def_group is None: + def_group = def_tag + children = [child for child in found_group.children if + def_group is not child and found_onset is not child] + + # Delay tag is checked for uniqueness elsewhere, so we can safely remove all of them + children = [child for child in children + if not isinstance(child, HedTag) or child.short_base_tag != DefTagNames.DELAY_KEY] + max_children = 1 + if found_onset.short_base_tag == DefTagNames.OFFSET_KEY: + max_children = 0 + if len(children) > max_children: + onset_issues += ErrorHandler.format_error(TemporalErrors.ONSET_WRONG_NUMBER_GROUPS, + def_tag, + found_group.children) + continue + + if children: + # Make this a loop if max_children can be > 1 + child = children[0] + if not isinstance(child, HedGroup): + onset_issues += ErrorHandler.format_error(TemporalErrors.ONSET_TAG_OUTSIDE_OF_GROUP, + child, + def_tag) + + # At this point we have either an onset or offset tag and it's name + onset_issues += self._handle_onset_or_offset(def_tag) + + return onset_issues + + def _find_onset_tags(self, hed_string_obj): + return hed_string_obj.find_top_level_tags(anchor_tags=DefTagNames.TEMPORAL_KEYS) + + def _handle_onset_or_offset(self, def_tag): + def_name, _, placeholder = def_tag.extension.partition('/') + + def_entry = self.defs.get(def_name.casefold()) + if def_entry is None: + return ErrorHandler.format_error(TemporalErrors.ONSET_DEF_UNMATCHED, tag=def_tag) + if bool(def_entry.takes_value) != bool(placeholder): + return ErrorHandler.format_error(TemporalErrors.ONSET_PLACEHOLDER_WRONG, tag=def_tag, + has_placeholder=bool(def_entry.takes_value)) + + return [] diff --git a/hed/validator/hed_validator.py b/hed/validator/hed_validator.py index e0b70a7ad..321accfbe 100644 --- a/hed/validator/hed_validator.py +++ b/hed/validator/hed_validator.py @@ -5,7 +5,7 @@ from hed.errors import error_reporter from hed.validator.def_validator import DefValidator -from hed.validator.tag_util import UnitValueValidator, CharValidator, StringValidator, TagValidator, GroupValidator +from hed.validator.util import UnitValueValidator, CharRexValidator, StringValidator, TagValidator, GroupValidator from hed.schema.hed_schema import HedSchema @@ -36,7 +36,7 @@ def __init__(self, hed_schema, def_dicts=None, definitions_allowed=False): self._validate_characters = hed_schema.schema_83_props self._unit_validator = UnitValueValidator(modern_allowed_char_rules=self._validate_characters) - self._char_validator = CharValidator(modern_allowed_char_rules=self._validate_characters) + self._char_validator = CharRexValidator(modern_allowed_char_rules=self._validate_characters) self._string_validator = StringValidator() self._tag_validator = TagValidator() self._group_validator = GroupValidator(hed_schema) @@ -158,6 +158,8 @@ def validate_units(self, original_tag, validate_text=None, report_as=None, error if validate_text is None: validate_text = original_tag.extension issues = [] + if validate_text == '#': + return [] if original_tag.is_unit_class_tag(): issues += self._unit_validator.check_tag_unit_class_units_are_valid(original_tag, validate_text, @@ -205,14 +207,17 @@ def _validate_individual_tags_in_hed_string(self, hed_string_obj, allow_placehol # run_individual_tag_validators(tag, allow_placeholders=allow_placeholders, # is_definition=is_definition) # else: - validation_issues += self._tag_validator. \ - run_individual_tag_validators(hed_tag, - allow_placeholders=allow_placeholders, - is_definition=is_definition) + validation_issues += \ + self._tag_validator.run_individual_tag_validators(hed_tag, allow_placeholders=allow_placeholders, + is_definition=is_definition) if (hed_tag.short_base_tag == DefTagNames.DEF_KEY or hed_tag.short_base_tag == DefTagNames.DEF_EXPAND_KEY): - validation_issues += self._def_validator.validate_def_value_units(hed_tag, self) - else: + validation_issues += ( + self._def_validator.validate_def_value_units(hed_tag, + self, allow_placeholders=allow_placeholders)) + elif (hed_tag.short_base_tag == DefTagNames.DEFINITION_KEY) and hed_tag.extension.endswith("/#"): + validation_issues += self.validate_units(hed_tag, hed_tag.extension[:-2]) + elif not (allow_placeholders and '#' in hed_tag.extension): validation_issues += self.validate_units(hed_tag) return validation_issues diff --git a/hed/validator/specialTags.json b/hed/validator/specialTags.json new file mode 100644 index 000000000..7190340a5 --- /dev/null +++ b/hed/validator/specialTags.json @@ -0,0 +1,121 @@ +{ + "Definition": { + "child": true, + "requireChild": true, + "tagGroup": true, + "topLevelTagGroup": true, + "maxNumberSubgroups": 1, + "minNumberSubgroups": 0, + "ERROR_CODE": "DEFINITION_INVALID", + "subgroupTagsNotAllowed": [ + "Def", + "Def-expand", + "Event-context", + "Definition", + "Onset", + "Inset", + "Offset", + "Delay", + "Duration" + ], + "defTagRequired": false, + "otherAllowedTags": [] + }, + "Def": { + "child": true, + "tagGroup": false, + "topLevelTagGroup": false, + "maxNumberSubgroups": null, + "minNumberSubgroups": null, + "ERROR_CODE": "DEF_INVALID", + "subgroupTagsNotAllowed": [], + "defTagRequired": false, + "otherAllowedTags": null + }, + "Def-expand": { + "child": true, + "tagGroup": true, + "topLevelTagGroup": false, + "maxNumberSubgroups": 1, + "minNumberSubgroups": 0, + "ERROR_CODE": "DEF_EXPAND_INVALID", + "subgroupTagsNotAllowed": [ + "Def", + "Def-expand", + "Event-context", + "Definition", + "Onset", + "Inset", + "Offset", + "Delay", + "Duration" + ], + "defTagRequired": false, + "otherAllowedTags": [] + }, + "Onset": { + "child": false, + "tagGroup": true, + "topLevelTagGroup": true, + "maxNumberSubgroups": 1, + "minNumberSubgroups": 0, + "ERROR_CODE": "TEMPORAL_TAG_ERROR", + "subgroupTagsNotAllowed": ["Event-context", "Definition", "Onset", "Inset", "Offset", "Delay", "Duration"], + "defTagRequired": true, + "otherAllowedTags": [] + }, + "Inset": { + "child": false, + "tagGroup": true, + "topLevelTagGroup": true, + "maxNumberSubgroups": 1, + "minNumberSubgroups": 0, + "ERROR_CODE": "TEMPORAL_TAG_ERROR", + "subgroupTagsNotAllowed": ["Event-context", "Definition", "Onset", "Inset", "Offset", "Delay", "Duration"], + "defTagRequired": true, + "otherAllowedTags": [] + }, + "Offset": { + "child": false, + "tagGroup": true, + "topLevelTagGroup": true, + "maxNumberSubgroups": 0, + "minNumberSubgroups": 0, + "ERROR_CODE": "TEMPORAL_TAG_ERROR", + "subgroupTagsNotAllowed": [], + "defTagRequired": true, + "otherAllowedTags": [] + }, + "Delay": { + "child": true, + "tagGroup": true, + "topLevelTagGroup": true, + "maxNumberSubgroups": 1, + "minNumberSubgroups": 1, + "ERROR_CODE": "TEMPORAL_TAG_ERROR", + "subgroupTagsNotAllowed": ["Event-context", "Definition", "Onset", "Inset", "Offset", "Delay", "Duration"], + "defTagRequired": false, + "otherAllowedTags": ["Duration"] + }, + "Duration": { + "child": true, + "topLevelTagGroup": true, + "maxNumberSubgroups": 1, + "minNumberSubgroups": 1, + "ERROR_CODE": "TEMPORAL_TAG_ERROR", + "subgroupTagsNotAllowed": ["Event-context", "Definition", "Onset", "Inset", "Offset", "Delay", "Duration"], + "defTagRequired": false, + "otherAllowedTags": ["Delay"] + }, + "Event-context": { + "child": false, + "tagGroup": true, + "topLevelTagGroup": true, + "maxNumberSubgroups": null, + "minNumberSubgroups": 0, + "ERROR_CODE": "TAG_GROUP_ERROR", + "subgroupTagsNotAllowed": ["Event-context", "Definition", "Onset", "Inset", "Offset", "Delay", "Duration"], + "defTagRequired": false, + "otherAllowedTags": [] + } +} diff --git a/hed/validator/tag_util/__init__.py b/hed/validator/util/__init__.py similarity index 77% rename from hed/validator/tag_util/__init__.py rename to hed/validator/util/__init__.py index 0f108a3ac..9d182bc9b 100644 --- a/hed/validator/tag_util/__init__.py +++ b/hed/validator/util/__init__.py @@ -1,6 +1,6 @@ """Validation of HED tags.""" -from .char_util import CharValidator +from .char_util import CharValidator, CharRexValidator from .string_util import StringValidator from .class_util import UnitValueValidator from .tag_util import TagValidator diff --git a/hed/validator/tag_util/char_util.py b/hed/validator/util/char_util.py similarity index 71% rename from hed/validator/tag_util/char_util.py rename to hed/validator/util/char_util.py index 7cca86a8a..7e1d90555 100644 --- a/hed/validator/tag_util/char_util.py +++ b/hed/validator/util/char_util.py @@ -1,7 +1,13 @@ """ Classes responsible for basic character validation of a string or tag.""" +import json +import re +import os + from hed.errors.error_reporter import ErrorHandler from hed.errors.error_types import ValidationErrors +CLASS_REX_FILENAME = 'class_regex.json' + class CharValidator: """Class responsible for basic character level validation of a string or tag.""" @@ -152,3 +158,70 @@ def _report_invalid_character_error(hed_string, index): error_type = ValidationErrors.TILDES_UNSUPPORTED return ErrorHandler.format_error(error_type, char_index=index, source_string=hed_string) + + +class CharRexValidator(CharValidator): + """Class responsible for basic character level validation of a string or tag.""" + + def __init__(self, modern_allowed_char_rules=False): + """Does basic character validation for HED strings/tags + + Parameters: + modern_allowed_char_rules(bool): If True, use 8.3 style rules for unicode characters. + """ + super().__init__(modern_allowed_char_rules) + self._rex_dict = self._get_rex_dict() + + def get_problem_chars(self, input_string, class_name): + + # List to store problem indices and characters + bad_indices = [] + + # Retrieve the allowed character classes for the given class_name + allowed_classes = self._rex_dict["class_chars"].get(class_name, []) + if not allowed_classes: + return bad_indices + # Combine the corresponding regular expressions from the char_regex section + allowed_regex_parts = [self._rex_dict["char_regex"][char_class] for char_class in allowed_classes] + + # Create one combined regex that matches any of the allowed character classes + combined_regex = "|".join(allowed_regex_parts) + + # Compile the combined regular expression + compiled_regex = re.compile(combined_regex) + + # Iterate through the input string, checking each character + for index, char in enumerate(input_string): + # If the character doesn't match the combined regex, it's a problem + if not compiled_regex.match(char): + bad_indices.append((index, char)) + + return bad_indices + + def is_valid_value(self, input_string, class_name): + # Retrieve the allowed character classes for the given class_name + class_regex = self._rex_dict["class_words"].get(class_name, []) + if not class_regex: + return True + match = re.match(class_regex, input_string) + match = match if match else False + return match + + @staticmethod + def _get_rex_dict(): + current_dir = os.path.dirname(os.path.abspath(__file__)) + json_path = os.path.realpath(os.path.join(current_dir, CLASS_REX_FILENAME)) + with open(json_path, 'r', encoding='utf-8') as f: + return json.load(f) + + +if __name__ == "__main__": + # Example input string + input_string = "Hello World123" + + # Class name (e.g., "nameClass" or "testClass") + class_name = "nameClass" + + # Call the function and print the result + # problem_indices = get_problem_chars(input_string, class_name, json_data) + # print(problem_indices) diff --git a/hed/validator/util/class_regex.json b/hed/validator/util/class_regex.json new file mode 100644 index 000000000..81f49f022 --- /dev/null +++ b/hed/validator/util/class_regex.json @@ -0,0 +1,62 @@ +{ + "char_regex": { + "alphanumeric": "[A-Za-z0-9]", + "ampersand": "&", + "ascii": "[\\x00-\\x7F]", + "asterisk": "\\*", + "at-sign": "@", + "backslash": "\\", + "blank": " ", + "caret": "\\^", + "colon": ":", + "comma": ",", + "date-time": "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})?", + "dollar": "\\$", + "digits": "[0-9]", + "double-quote": "\"", + "equals": "=", + "exclamation": "!", + "greater-than": ">", + "hyphen": "-", + "left-paren": "(", + "less-than": "<", + "letters": "[A-Za-z]", + "lowercase": "[a-z]", + "name": "[\\w\\-\\u0080-\\uFFFF]", + "newline": "\\n", + "nonascii": "[\\u0080-\\uFFFF]", + "number-sign": "#", + "numeric": "[0-9.\\-+^Ee]", + "percent-sign": "%", + "period": "\\.", + "plus": "\\+", + "printable": "[\\x20-\\x7E]", + "question-mark": "\\?", + "right-paren": "(", + "semicolon": ";", + "single-quote": "'", + "forward-slash": "/", + "tab": "\\t", + "text": "[^\\x00-\\x1F\\x7F,{}]", + "tilde": "~", + "underscore": "_", + "uppercase": "[A-Z]", + "vertical-bar": "|" + }, + "class_chars": { + "dateTimeClass": [], + "nameClass": [ + "alphanumeric", + "underscore", + "hyphen", + "nonascii" + ], + "numericClass": [], + "textClass": ["text"], + "testClass": ["newline", "tab", "nonascii"] + }, + "class_words": { + "dateTimeClass": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})?$", + "numericClass": "^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?$" + } +} \ No newline at end of file diff --git a/hed/validator/tag_util/class_util.py b/hed/validator/util/class_util.py similarity index 50% rename from hed/validator/tag_util/class_util.py rename to hed/validator/util/class_util.py index efdc90c49..9152234b6 100644 --- a/hed/validator/tag_util/class_util.py +++ b/hed/validator/util/class_util.py @@ -2,10 +2,9 @@ import datetime import re -from hed.schema import schema_validation_util -from hed.schema import schema_validation_util_deprecated from hed.errors.error_reporter import ErrorHandler from hed.errors.error_types import ValidationErrors +from hed.validator.util.char_util import CharRexValidator class UnitValueValidator: @@ -24,8 +23,10 @@ def __init__(self, modern_allowed_char_rules=False, value_validators=None): value_validators(dict or None): Override or add value class validators """ + self._validate_characters = modern_allowed_char_rules self._value_validators = self._get_default_value_class_validators() + self._char_validator = CharRexValidator() if value_validators and isinstance(value_validators, dict): self._value_validators.update(value_validators) @@ -36,10 +37,10 @@ def _get_default_value_class_validators(self): dict: Dictionary of value class validator functions. """ validator_dict = { - self.DATE_TIME_VALUE_CLASS: is_date_time, - self.NUMERIC_VALUE_CLASS: validate_numeric_value_class, - self.TEXT_VALUE_CLASS: validate_text_value_class, - self.NAME_VALUE_CLASS: validate_text_value_class + self.DATE_TIME_VALUE_CLASS: is_date_time_value_class, + self.NUMERIC_VALUE_CLASS: is_numeric_value_class, + self.TEXT_VALUE_CLASS: is_text_value_class, + self.NAME_VALUE_CLASS: is_name_value_class } return validator_dict @@ -96,28 +97,72 @@ def check_tag_value_class_valid(self, original_tag, validate_text, report_as=Non """ return self._check_value_class(original_tag, validate_text, report_as, error_code, index_offset) - @staticmethod - def _get_tag_problem_indexes(original_tag, stripped_value, validate_characters): - """ Return list of problem indices for error messages. - - Parameters: - original_tag (HedTag): The original tag that is used to report the error. - stripped_value (str): value without units - - Returns: - list: List of int locations in which error occurred. - """ - indexes = [] - # Extra +1 for the slash - start_index = original_tag.extension.find(stripped_value) + len(original_tag.org_base_tag) + 1 - if start_index == -1: - return indexes - - if validate_characters: - allowed_characters = schema_validation_util.get_allowed_characters(original_tag.value_classes.values()) - return schema_validation_util.get_problem_indexes(stripped_value, allowed_characters, index_adj=start_index) - else: - return schema_validation_util_deprecated._get_disallowed_character_indexes(stripped_value, start_index) + # def _get_tag_problem_indexes(self, original_tag, stripped_value, validation=True): + # """ Return list of problem indices for error messages. + # + # Parameters: + # original_tag (HedTag): The original tag that is used to report the error. + # stripped_value (str): value without units + # validation (bool): + # + # Returns: + # list: List of int locations in which error occurred. + # """ + # indexes = [] + # # Extra +1 for the slash + # start_index = original_tag.extension.find(stripped_value) + len(original_tag.org_base_tag) + 1 + # if start_index == -1: + # return indexes + # + # if not validation: + # return schema_validation_util_deprecated._get_disallowed_character_indexes(stripped_value, start_index) + # + # return self._get_problem_indices(stripped_value, "nameClass", start_index=start_index) + # classes = list(original_tag.value_classes.keys()) + # problems = {} + # okay_count = len(classes) + # for class_name in classes: + # indices = self._char_validator.get_problem_chars(stripped_value, class_name) + # if indices: + # problems[class_name] = [(char, index + start_index) for index, char in indices] + # else: + # okay_count -= 1 + # if okay_count: # At least one value class has an issue + # return problems + # else: + # return {} + + def _get_problem_indices(self, stripped_value, class_name, start_index=0): + indices = self._char_validator.get_problem_chars(stripped_value, class_name) + if indices: + indices = [(char, index + start_index) for index, char in indices] + return indices + # value_classes = original_tag.value_classes.values() + # allowed_characters = schema_validation_util.get_allowed_characters(original_tag.value_classes.values()) + + # return schema_validation_util.get_problem_indexes(stripped_value, allowed_characters, index_adj=start_index) + + # @staticmethod + # def get_problem_index(validation_string, reg_ex, index_adj=0): + # """Finds indexes with values not in character set + # + # Parameters: + # validation_string(str): The string to check characters in + # character_set(set): the list of valid characters(or the value "nonascii" as a set entry) + # index_adj(int): the value to adjust the reported indices by, if this isn't the start of a string. + # + # Returns: + # index_list(tuple of (str, int)): The list of problematic characters and indices + # """ + # invalid_positions = [] + # + # # Iterate over the string, check each character + # for i, char in enumerate(validation_string): + # if not re.match(reg_ex, char): + # # If the character does not match, record its position and value + # invalid_positions.append((i, char)) + # + # return invalid_positions def _check_value_class(self, original_tag, stripped_value, report_as, error_code=None, index_offset=0): """ Return any issues found if this is a value tag, @@ -134,25 +179,97 @@ def _check_value_class(self, original_tag, stripped_value, report_as, error_code """ + if not original_tag.is_takes_value_tag(): + return [] + + classes = list(original_tag.value_classes.keys()) + if not classes: + return [] + start_index = original_tag.extension.find(stripped_value) + len(original_tag.org_base_tag) + 1 + + report_as = report_as if report_as else original_tag + class_valid = {} + for class_name in classes: + class_valid[class_name] = self._char_validator.is_valid_value(stripped_value, class_name) + + char_errors = {} + for class_name in classes: + char_errors[class_name] = self._get_problem_indices(stripped_value, class_name, start_index=start_index) + if class_valid[class_name] and not char_errors[class_name]: # We have found a valid class + return [] + index_adj = len(report_as.org_base_tag) - len(original_tag.org_base_tag) + validation_issues = self.report_value_errors(char_errors, class_valid, report_as, index_adj) + return validation_issues + + @staticmethod + def report_value_errors(error_dict, class_valid, report_as, index_adj): + validation_issues = [] + for class_name, errors in error_dict.items(): + if not errors and class_valid[class_name]: + continue + elif not class_valid[class_name]: + validation_issues += ErrorHandler.format_error(ValidationErrors.INVALID_VALUE_CLASS_VALUE, + index_in_tag=0, index_in_tag_end=len(report_as.org_tag), + value_class=class_name, tag=report_as) + elif errors: + validation_issues.extend(UnitValueValidator.report_value_char_errors(class_name, errors, + report_as, index_adj)) + return validation_issues + + @staticmethod + def report_value_char_errors(class_name, errors, report_as, index_adj): validation_issues = [] - if original_tag.is_takes_value_tag(): - report_as = report_as if report_as else original_tag - problem_indexes = self._get_tag_problem_indexes(original_tag, stripped_value, self._validate_characters) - for char, index in problem_indexes: - tag_code = ValidationErrors.CURLY_BRACE_UNSUPPORTED_HERE if ( - char in "{}") else ValidationErrors.INVALID_TAG_CHARACTER - - index_adj = len(report_as.org_base_tag) - len(original_tag.org_base_tag) - index += index_adj + index_offset - validation_issues += ErrorHandler.format_error(tag_code, + for value in errors: + index = value[1] + index_adj + if value[0] in "{}": + validation_issues += ErrorHandler.format_error(ValidationErrors.CURLY_BRACE_UNSUPPORTED_HERE, tag=report_as, index_in_tag=index, index_in_tag_end=index + 1) - if not self._validate_value_class_portion(original_tag, stripped_value): - validation_issues += ErrorHandler.format_error(ValidationErrors.VALUE_INVALID, report_as) - if error_code: - validation_issues += ErrorHandler.format_error(ValidationErrors.VALUE_INVALID, - report_as, actual_error=error_code) + else: + validation_issues += ErrorHandler.format_error(ValidationErrors.INVALID_VALUE_CLASS_CHARACTER, + value_class=class_name, tag=report_as, + index_in_tag=index, index_in_tag_end=index + 1) return validation_issues + # @staticmethod + # def report_class_errors(error_dict, report_as): + # validation_issues = [] + # for class_name, errors in error_dict.items(): + + # def _check_value_class(self, original_tag, stripped_value, report_as, error_code=None, index_offset=0): + + # """ Return any issues found if this is a value tag, + # + # Parameters: + # original_tag (HedTag): The original tag that is used to report the error. + # stripped_value (str): value without units + # report_as (HedTag): Report as this tag. + # error_code(str): The code to override the error as. Again mostly for def/def-expand tags. + # index_offset(int): Offset into the extension validate_text starts at. + # + # Returns: + # list: List of dictionaries of validation issues. + # + # """ + # + # validation_issues = [] + # if original_tag.is_takes_value_tag(): + # report_as = report_as if report_as else original_tag + # problem_indexes = self._get_tag_problem_indexes(original_tag, stripped_value, self._validate_characters) + # for char, index in problem_indexes: + # tag_code = ValidationErrors.CURLY_BRACE_UNSUPPORTED_HERE if ( + # char in "{}") else ValidationErrors.INVALID_TAG_CHARACTER + # + # index_adj = len(report_as.org_base_tag) - len(original_tag.org_base_tag) + # index += index_adj + index_offset + # validation_issues += ErrorHandler.format_error(tag_code, + # tag=report_as, index_in_tag=index, + # index_in_tag_end=index + 1) + # if not self._validate_value_class_portion(original_tag, stripped_value): + # validation_issues += ErrorHandler.format_error(ValidationErrors.VALUE_INVALID, report_as) + # if error_code: + # validation_issues += ErrorHandler.format_error(ValidationErrors.VALUE_INVALID, + # report_as, actual_error=error_code) + # return validation_issues @staticmethod def _check_units(original_tag, bad_units, report_as): @@ -206,7 +323,20 @@ def validate_value_class_type(self, unit_or_value_portion, valid_types): return not has_valid_func -def is_date_time(date_time_string): +def find_invalid_positions(s, pattern): + # List to store positions of invalid characters + invalid_positions = [] + + # Iterate over the string, check each character + for i, char in enumerate(s): + if not re.match(pattern, char): + # If the character does not match, record its position and value + invalid_positions.append((i, char)) + + return invalid_positions + + +def is_date_time_value_class(date_time_string): """Check if the specified string is a valid datetime. Parameters: @@ -226,7 +356,15 @@ def is_date_time(date_time_string): return False -def validate_numeric_value_class(numeric_string): +def is_name_value_class(name_str): + pattern = r'^[\w\-\u0080-\uFFFF]+$' + if re.fullmatch(pattern, name_str): + return True + else: + return False + + +def is_numeric_value_class(numeric_string): """ Check to see if valid numeric value. Parameters: @@ -242,7 +380,7 @@ def validate_numeric_value_class(numeric_string): return False -def validate_text_value_class(text_string): +def is_text_value_class(text_string): """ Placeholder for eventual text value class validation. Parameters: diff --git a/hed/validator/tag_util/group_util.py b/hed/validator/util/group_util.py similarity index 100% rename from hed/validator/tag_util/group_util.py rename to hed/validator/util/group_util.py diff --git a/hed/validator/tag_util/string_util.py b/hed/validator/util/string_util.py similarity index 100% rename from hed/validator/tag_util/string_util.py rename to hed/validator/util/string_util.py diff --git a/hed/validator/tag_util/tag_util.py b/hed/validator/util/tag_util.py similarity index 100% rename from hed/validator/tag_util/tag_util.py rename to hed/validator/util/tag_util.py diff --git a/pyproject.toml b/pyproject.toml index 67f8bc46c..233be6c24 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,6 +57,7 @@ run_remodel_backup = "hed.tools.remodeling.cli.run_remodel_backup:main" run_remodel_restore = "hed.tools.remodeling.cli.run_remodel_restore:main" hed_validate_schemas = "hed.scripts.validate_schemas:main" hed_update_schemas = "hed.scripts.convert_and_update_schema:main" +hed_add_ids = "hed.scripts.add_hed_ids:main" hed_create_ontology = "hed.scripts.create_ontology:main" [tool.versioneer] @@ -74,7 +75,7 @@ include = ["hed*"] namespaces = false [tool.setuptools.package-data] -hed = ["schema/schema_data/*.xml", "resources/*.png"] +hed = ["schema/schema_data/*.xml", "resources/*.png", "validator/util/class_regex.json"] [tool.codespell] skip = '*.git,*.pdf,*.svg,versioneer.py,venv*,*.tsv,*.yaml,*.yml,*.json,*.rdf,*.jsonld,spec_tests,,*.xml,*.mediawiki,*.omn,*.toml' diff --git a/setup.py b/setup.py index 2341aa921..e76cc57c2 100644 --- a/setup.py +++ b/setup.py @@ -1,8 +1,8 @@ -# dummy setup file for versioneer - -import versioneer -from setuptools import setup - -if __name__ == "__main__": - setup(version=versioneer.get_version(), - cmdclass=versioneer.get_cmdclass()) \ No newline at end of file +# dummy setup file for versioneer + +import versioneer +from setuptools import setup + +if __name__ == "__main__": + setup(version=versioneer.get_version(), + cmdclass=versioneer.get_cmdclass()) diff --git a/spec_tests/hed-examples b/spec_tests/hed-examples index 882469123..f117c4d66 160000 --- a/spec_tests/hed-examples +++ b/spec_tests/hed-examples @@ -1 +1 @@ -Subproject commit 88246912339625df9c88554071465c14eaa68396 +Subproject commit f117c4d669ea034053011e6d3d152b0e906c1914 diff --git a/spec_tests/hed-specification b/spec_tests/hed-specification index 54659951c..62dbcb0fa 160000 --- a/spec_tests/hed-specification +++ b/spec_tests/hed-specification @@ -1 +1 @@ -Subproject commit 54659951ca1a2f5e481ef87d98d9de30036f9f56 +Subproject commit 62dbcb0fafd7ba920c9b8958f1948559561f275c diff --git a/spec_tests/test_errors.py b/spec_tests/test_errors.py index 6d503bdf0..73fef09f1 100644 --- a/spec_tests/test_errors.py +++ b/spec_tests/test_errors.py @@ -1,205 +1,220 @@ -import os -import unittest -import urllib.error - -from hed.models import DefinitionDict - -from hed import load_schema_version, HedString -from hed.schema import from_string -from hed.validator import HedValidator -from hed import Sidecar -import io -import json -from hed import HedFileError -from hed.errors import ErrorHandler, get_printable_issue_string, SchemaWarnings - - -skip_tests = { - "VERSION_DEPRECATED": "Not applicable", - "tag-extension-invalid-bad-node-name": "Part of character invalid checking/didn't get to it yet", -} - -class MyTestCase(unittest.TestCase): - @classmethod - def setUpClass(cls): - test_dir = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), - 'hed-specification/tests/json_tests')) - cls.test_files = [os.path.join(test_dir, f) for f in os.listdir(test_dir) - if os.path.isfile(os.path.join(test_dir, f))] - cls.fail_count = [] - cls.default_sidecar = Sidecar(os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'test_sidecar.json'))) - - @classmethod - def tearDownClass(cls): - pass - - def run_single_test(self, test_file): - with open(test_file, "r") as fp: - test_info = json.load(fp) - for info in test_info: - error_code = info['error_code'] - if error_code in skip_tests: - print(f"Skipping {error_code} test because: {skip_tests[error_code]}") - continue - name = info.get('name', '') - if name in skip_tests: - print(f"Skipping {name} test because: {skip_tests[name]}") - continue - - # if name != "library-invalid-bad_with-standard-version": - # continue - description = info['description'] - schema = info['schema'] - check_for_warnings = info.get("warning", False) - error_handler = ErrorHandler(check_for_warnings) - if schema: - try: - schema = load_schema_version(schema) - except HedFileError as e: - issues = e.issues - if not issues: - issues += [{"code": e.code, - "message": e.message}] - self.report_result("fails", issues, error_code, description, name, "dummy", "Schema") - # self.fail_count.append(name) - continue - definitions = info.get('definitions', None) - def_dict = DefinitionDict(definitions, schema) - self.assertFalse(def_dict.issues) - else: - def_dict = DefinitionDict() - for section_name, section in info["tests"].items(): - if section_name == "string_tests": - self._run_single_string_test(section, schema, def_dict, error_code, description, name, error_handler) - if section_name == "sidecar_tests": - self._run_single_sidecar_test(section, schema, def_dict, error_code, description, name, error_handler) - if section_name == "event_tests": - self._run_single_events_test(section, schema, def_dict, error_code, description, name, error_handler) - if section_name == "combo_tests": - self._run_single_combo_test(section, schema, def_dict, error_code, description, name, error_handler) - if section_name == "schema_tests": - self._run_single_schema_test(section, error_code, description, name, error_handler) - - def report_result(self, expected_result, issues, error_code, description, name, test, test_type): - # Filter out pre-release warnings, we don't care about them. - issues = [issue for issue in issues if issue["code"] != SchemaWarnings.SCHEMA_PRERELEASE_VERSION_USED] - if expected_result == "fails": - if not issues: - print(f"{error_code}: {description}") - print(f"Passed '{test_type}' (which should fail) '{name}': {test}") - print(get_printable_issue_string(issues)) - self.fail_count.append(name) - else: - if any(issue['code'] == error_code for issue in issues): - return - print(f"{error_code}: {description}") - print(f"Failed '{test_type}' (unexpected errors found) '{name}': {test}") - print(get_printable_issue_string(issues)) - self.fail_count.append(name) - else: - if issues: - print(f"{error_code}: {description}") - print(f"Failed '{test_type}' test '{name}': {test}") - print(get_printable_issue_string(issues)) - self.fail_count.append(name) - - def _run_single_string_test(self, info, schema, def_dict, error_code, description, name, error_handler): - string_validator = HedValidator(hed_schema=schema, def_dicts=def_dict) - for result, tests in info.items(): - for test in tests: - test_string = HedString(test, schema) - - issues = string_validator.run_basic_checks(test_string, False) - issues += string_validator.run_full_string_checks(test_string) - error_handler.add_context_and_filter(issues) - self.report_result(result, issues, error_code, description, name, test, "string_test") - - def _run_single_sidecar_test(self, info, schema, def_dict, error_code, description, name, error_handler): - for result, tests in info.items(): - for test in tests: - buffer = io.BytesIO(json.dumps(test).encode("utf-8")) - sidecar = Sidecar(buffer) - issues = sidecar.validate(hed_schema=schema, extra_def_dicts=def_dict, error_handler=error_handler) - self.report_result(result, issues, error_code, description, name, test, "sidecar_test") - - def _run_single_events_test(self, info, schema, def_dict, error_code, description,name, error_handler): - from hed import TabularInput - for result, tests in info.items(): - for test in tests: - string = "" - for row in test: - if not isinstance(row, list): - print(f"Improper grouping in test: {error_code}:{name}") - print(f"This is probably a missing set of square brackets.") - break - string += "\t".join(str(x) for x in row) + "\n" - - if not string: - print(F"Invalid blank events found in test: {error_code}:{name}") - continue - file_obj = io.BytesIO(string.encode("utf-8")) - - file = TabularInput(file_obj, sidecar=self.default_sidecar) - issues = file.validate(hed_schema=schema, extra_def_dicts=def_dict, error_handler=error_handler) - self.report_result(result, issues, error_code, description, name, test, "events_test") - - def _run_single_combo_test(self, info, schema, def_dict, error_code, description,name, error_handler): - from hed import TabularInput - for result, tests in info.items(): - for test in tests: - buffer = io.BytesIO(json.dumps(test['sidecar']).encode("utf-8")) - sidecar = Sidecar(buffer) - sidecar.loaded_dict.update(self.default_sidecar.loaded_dict) - issues = sidecar.validate(hed_schema=schema, extra_def_dicts=def_dict, error_handler=error_handler) - string = "" - try: - for row in test['events']: - if not isinstance(row, list): - print(f"Improper grouping in test: {error_code}:{name}") - print(f"Improper data for test {name}: {test}") - print(f"This is probably a missing set of square brackets.") - break - string += "\t".join(str(x) for x in row) + "\n" - - if not string: - print(F"Invalid blank events found in test: {error_code}:{name}") - continue - file_obj = io.BytesIO(string.encode("utf-8")) - - file = TabularInput(file_obj, sidecar=sidecar) - except HedFileError: - print(f"{error_code}: {description}") - print(f"Improper data for test {name}: {test}") - print(f"This is probably a missing set of square brackets.") - continue - issues += file.validate(hed_schema=schema, extra_def_dicts=def_dict, error_handler=error_handler) - self.report_result(result, issues, error_code, description, name, test, "combo_tests") - - def _run_single_schema_test(self, info, error_code, description,name, error_handler): - for result, tests in info.items(): - for test in tests: - schema_string = "\n".join(test) - issues = [] - try: - loaded_schema = from_string(schema_string, schema_format=".mediawiki") - issues = loaded_schema.check_compliance() - except HedFileError as e: - issues = e.issues - if not issues: - issues += [{"code": e.code, - "message": e.message}] - except urllib.error.HTTPError: - issues += [{"code": "Http_error", - "message": "HTTP error in testing, probably due to rate limiting for local testing."}] - self.report_result(result, issues, error_code, description, name, test, "schema_tests") - - def test_errors(self): - for test_file in self.test_files: - self.run_single_test(test_file) - print(f"{len(self.fail_count)} tests got an unexpected result") - print("\n".join(self.fail_count)) - self.assertEqual(len(self.fail_count), 0) - -if __name__ == '__main__': - unittest.main() - +import os +import unittest +import urllib.error + +from hed.models import DefinitionDict + +from hed import load_schema_version, HedString +from hed.schema import from_string +from hed.validator import HedValidator +from hed import Sidecar +import io +import json +from hed import HedFileError +from hed.errors import ErrorHandler, get_printable_issue_string, SchemaWarnings + + +skip_tests = { + "VERSION_DEPRECATED": "Not applicable", + # "tag-extension-invalid-bad-node-name": "Part of character invalid checking/didn't get to it yet", + "curly-braces-has-no-hed": "Need to fix issue #1006", + # "character-invalid-non-printing appears": "Need to recheck how this is verified for textClass", + "invalid-character-name-value-class-deprecated": "Removing support for 8.2.0 or earlier name classes" +} + + +class MyTestCase(unittest.TestCase): + @classmethod + def setUpClass(cls): + test_dir = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), + 'hed-specification/tests/json_tests')) + cls.test_files = [os.path.join(test_dir, f) for f in os.listdir(test_dir) + if os.path.isfile(os.path.join(test_dir, f))] + cls.fail_count = [] + cls.default_sidecar = Sidecar(os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), + 'test_sidecar.json'))) + + @classmethod + def tearDownClass(cls): + pass + + def run_single_test(self, test_file): + with open(test_file, "r") as fp: + test_info = json.load(fp) + for info in test_info: + error_code = info['error_code'] + all_codes = [error_code] + info.get('alt_codes', []) + if error_code in skip_tests: + print(f"Skipping {error_code} test because: {skip_tests[error_code]}") + continue + name = info.get('name', '') + if name in skip_tests: + print(f"Skipping {name} test because: {skip_tests[name]}") + continue + + # if name != "library-invalid-bad_with-standard-version": + # continue + description = info['description'] + schema = info['schema'] + check_for_warnings = info.get("warning", False) + error_handler = ErrorHandler(check_for_warnings) + if schema: + try: + schema = load_schema_version(schema) + except HedFileError as e: + issues = e.issues + if not issues: + issues += [{"code": e.code, + "message": e.message}] + self.report_result("fails", issues, error_code, all_codes, description, name, "dummy", "Schema") + # self.fail_count.append(name) + continue + definitions = info.get('definitions', None) + def_dict = DefinitionDict(definitions, schema) + self.assertFalse(def_dict.issues) + + else: + def_dict = DefinitionDict() + for section_name, section in info["tests"].items(): + if section_name == "string_tests": + self._run_single_string_test(section, schema, def_dict, error_code, all_codes, + description, name, error_handler) + if section_name == "sidecar_tests": + self._run_single_sidecar_test(section, schema, def_dict, error_code, all_codes, + description, name, error_handler) + if section_name == "event_tests": + self._run_single_events_test(section, schema, def_dict, error_code, all_codes, + description, name, error_handler) + if section_name == "combo_tests": + self._run_single_combo_test(section, schema, def_dict, error_code, all_codes, + description, name, error_handler) + if section_name == "schema_tests": + self._run_single_schema_test(section, error_code, all_codes, description, name, error_handler) + + def report_result(self, expected_result, issues, error_code, all_codes, description, name, test, test_type): + # Filter out pre-release warnings, we don't care about them. + issues = [issue for issue in issues if issue["code"] != SchemaWarnings.SCHEMA_PRERELEASE_VERSION_USED] + if expected_result == "fails": + if not issues: + print(f"{error_code}: {description}") + print(f"Passed '{test_type}' (which should fail) '{name}': {test}") + print(get_printable_issue_string(issues)) + self.fail_count.append(name) + else: + if any(issue['code'] in all_codes for issue in issues): + return + print(f"{error_code}: {description} all codes:[{str(all_codes)}]") + print(f"Failed '{test_type}' (unexpected errors found) '{name}': {test}") + print(get_printable_issue_string(issues)) + self.fail_count.append(name) + else: + if issues: + print(f"{error_code}: {description}") + print(f"Failed '{test_type}' test '{name}': {test}") + print(get_printable_issue_string(issues)) + self.fail_count.append(name) + + def _run_single_string_test(self, info, schema, def_dict, error_code, all_codes, description, name, error_handler): + string_validator = HedValidator(hed_schema=schema, def_dicts=def_dict) + for result, tests in info.items(): + for test in tests: + test_string = HedString(test, schema) + + issues = string_validator.run_basic_checks(test_string, False) + issues += string_validator.run_full_string_checks(test_string) + error_handler.add_context_and_filter(issues) + self.report_result(result, issues, error_code, all_codes, description, name, test, "string_test") + + def _run_single_sidecar_test(self, info, schema, def_dict, error_code, all_codes, description, name, error_handler): + for result, tests in info.items(): + for test in tests: + # print(f"{error_code}: {name}") + buffer = io.BytesIO(json.dumps(test).encode("utf-8")) + sidecar = Sidecar(buffer) + issues = sidecar.validate(hed_schema=schema, extra_def_dicts=def_dict, error_handler=error_handler) + self.report_result(result, issues, error_code, all_codes, description, name, test, "sidecar_test") + + def _run_single_events_test(self, info, schema, def_dict, error_code, all_codes, description, name, error_handler): + from hed import TabularInput + for result, tests in info.items(): + for test in tests: + string = "" + for row in test: + if not isinstance(row, list): + print(f"Improper grouping in test: {error_code}:{name}") + print(f"This is probably a missing set of square brackets.") + break + string += "\t".join(str(x) for x in row) + "\n" + + if not string: + print(F"Invalid blank events found in test: {error_code}:{name}") + continue + file_obj = io.BytesIO(string.encode("utf-8")) + + file = TabularInput(file_obj, sidecar=self.default_sidecar) + issues = file.validate(hed_schema=schema, extra_def_dicts=def_dict, error_handler=error_handler) + self.report_result(result, issues, error_code, all_codes, description, name, test, "events_test") + + def _run_single_combo_test(self, info, schema, def_dict, error_code, all_codes, description, name, error_handler): + from hed import TabularInput + for result, tests in info.items(): + for test in tests: + buffer = io.BytesIO(json.dumps(test['sidecar']).encode("utf-8")) + sidecar = Sidecar(buffer) + sidecar.loaded_dict.update(self.default_sidecar.loaded_dict) + issues = sidecar.validate(hed_schema=schema, extra_def_dicts=def_dict, error_handler=error_handler) + string = "" + try: + for row in test['events']: + if not isinstance(row, list): + print(f"Improper grouping in test: {error_code}:{name}") + print(f"Improper data for test {name}: {test}") + print(f"This is probably a missing set of square brackets.") + break + string += "\t".join(str(x) for x in row) + "\n" + + if not string: + print(F"Invalid blank events found in test: {error_code}:{name}") + continue + file_obj = io.BytesIO(string.encode("utf-8")) + + file = TabularInput(file_obj, sidecar=sidecar) + except HedFileError: + print(f"{error_code}: {description}") + print(f"Improper data for test {name}: {test}") + print("This is probably a missing set of square brackets.") + continue + issues += file.validate(hed_schema=schema, extra_def_dicts=def_dict, error_handler=error_handler) + self.report_result(result, issues, error_code, all_codes, description, name, test, "combo_tests") + + def _run_single_schema_test(self, info, error_code, all_codes, description, name, error_handler): + for result, tests in info.items(): + for test in tests: + schema_string = "\n".join(test) + issues = [] + try: + loaded_schema = from_string(schema_string, schema_format=".mediawiki") + issues = loaded_schema.check_compliance() + except HedFileError as e: + issues = e.issues + if not issues: + issues += [{"code": e.code, + "message": e.message}] + except urllib.error.HTTPError: + issues += [{"code": "Http_error", + "message": "HTTP error in testing, probably due to rate limiting for local testing."}] + self.report_result(result, issues, error_code, all_codes, description, name, test, "schema_tests") + + def test_errors(self): + for test_file in self.test_files: + self.run_single_test(test_file) + # test_file = './temp.json' + self.run_single_test(test_file) + print(f"{len(self.fail_count)} tests got an unexpected result") + print("\n".join(self.fail_count)) + self.assertEqual(len(self.fail_count), 0) + + +if __name__ == '__main__': + + unittest.main() diff --git a/spec_tests/test_hed_cache.py b/spec_tests/test_hed_cache.py index f9910d158..814bd994b 100644 --- a/spec_tests/test_hed_cache.py +++ b/spec_tests/test_hed_cache.py @@ -27,7 +27,8 @@ def setUpClass(cls): cls.semantic_version_three = '1.2.5' cls.semantic_version_list = ['1.2.3', '1.2.4', '1.2.5'] cls.specific_base_url = "https://api.github.com/repos/hed-standard/hed-schemas/contents/standard_schema/hedxml" - cls.specific_hed_url = "https://raw.githubusercontent.com/hed-standard/hed-schemas/master/standard_schema/hedxml/HED8.0.0.xml" + cls.specific_hed_url = \ + "https://raw.githubusercontent.com/hed-standard/hed-schemas/master/standard_schema/hedxml/HED8.0.0.xml" try: hed_cache.cache_xml_versions(cache_folder=cls.hed_cache_dir) except HedFileError as e: @@ -41,8 +42,8 @@ def tearDownClass(cls): def test_cache_again(self): time_since_update = hed_cache.cache_xml_versions(cache_folder=self.hed_cache_dir) - self.assertGreater(time_since_update, 0) - + # this should fail to cache, since it was cached too recently. + self.assertEqual(time_since_update, -1) def test_get_cache_directory(self): from hed.schema import get_cache_directory @@ -75,6 +76,12 @@ def test_get_hed_versions_library(self): self.assertIsInstance(cached_versions, list) self.assertTrue(len(cached_versions) > 0) + def test_get_hed_versions_library_prerelease(self): + # Todo: improve this code to actually test it. + cached_versions = hed_cache.get_hed_versions(self.hed_cache_dir, library_name="score", check_prerelease=True) + self.assertIsInstance(cached_versions, list) + self.assertTrue(len(cached_versions) > 0) + def test_sort_version_list(self): valid_versions = ["8.1.0", "8.0.0", "8.0.0-alpha.1", "7.1.1", "1.0.0"] for shuffled_versions in itertools.permutations(valid_versions): @@ -91,6 +98,7 @@ def test_find_hed_expression(self): final_version = f"HED{version}.xml" self.assertFalse(hed_cache.version_pattern.match(final_version)) + class TestLocal(unittest.TestCase): @classmethod def setUpClass(cls): @@ -107,9 +115,6 @@ def tearDownClass(cls): schema.set_cache_directory(cls.saved_cache_folder) def test_local_cache(self): - final_hed_xml_file = hed_cache.get_hed_version_path("8.2.0", None, local_hed_directory=self.hed_cache_dir) - self.assertFalse(final_hed_xml_file) - hed_cache.cache_local_versions(self.hed_cache_dir) final_hed_xml_file = hed_cache.get_hed_version_path("8.2.0", None, local_hed_directory=self.hed_cache_dir) self.assertTrue(final_hed_xml_file) @@ -143,6 +148,72 @@ def test_schema_load_schema_version_invalid(self): load_schema_version(["8.1.0", "notreallibrary_1.0.0"]) self.assertEqual(context8.exception.args[0], 'fileNotFound') + +class TestLibraryDataCache(unittest.TestCase): + # Verify get_library_data properly caches from the internet and locally + @classmethod + def setUpClass(cls): + hed_cache_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../schema_cache_test_get_library_data/') + if os.path.exists(hed_cache_dir) and os.path.isdir(hed_cache_dir): + shutil.rmtree(hed_cache_dir) + hed_cache.get_library_data.cache_clear() + cls.hed_cache_dir = hed_cache_dir + cls.saved_cache_folder = hed_cache.HED_CACHE_DIRECTORY + schema.set_cache_directory(cls.hed_cache_dir) + cls.saved_install_cache = hed_cache.INSTALLED_CACHE_LOCATION + cls.empty_source_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), + "../schema_install_empty_local/") + if os.path.exists(cls.empty_source_dir) and os.path.isdir(cls.empty_source_dir): + shutil.rmtree(cls.empty_source_dir) + os.makedirs(cls.empty_source_dir) + + @classmethod + def tearDownClass(cls): + shutil.rmtree(cls.hed_cache_dir) + schema.set_cache_directory(cls.saved_cache_folder) + shutil.rmtree(cls.empty_source_dir) + hed_cache.INSTALLED_CACHE_LOCATION = cls.saved_install_cache + hed_cache.get_library_data.cache_clear() + + def test_local_cache_off(self): + hed_cache.get_library_data.cache_clear() + shutil.rmtree(self.hed_cache_dir) + saved_url = hed_cache.LIBRARY_DATA_URL + try: + hed_cache.LIBRARY_DATA_URL = "" + hed_cache.INSTALLED_CACHE_LOCATION = self.empty_source_dir + self.assertEqual(hed_cache.get_library_data(""), {}) + self.assertEqual(hed_cache.get_library_data("score"), {}) + self.assertEqual(hed_cache.get_library_data("not_real_library_name"), {}) + finally: + hed_cache.LIBRARY_DATA_URL = saved_url + hed_cache.INSTALLED_CACHE_LOCATION = self.saved_install_cache + + def test_local_cache_on(self): + hed_cache.get_library_data.cache_clear() + shutil.rmtree(self.hed_cache_dir) + saved_url = hed_cache.LIBRARY_DATA_URL + try: + hed_cache.LIBRARY_DATA_URL = "" + self.assertTrue(hed_cache.get_library_data("")) + self.assertTrue(hed_cache.get_library_data("score")) + self.assertEqual(hed_cache.get_library_data("not_real_library_name"), {}) + finally: + hed_cache.LIBRARY_DATA_URL = saved_url + + def test_url_cache(self): + hed_cache.get_library_data.cache_clear() + shutil.rmtree(self.hed_cache_dir) + hed_cache.INSTALLED_CACHE_LOCATION = self.empty_source_dir + try: + # hed_cache.LIBRARY_DATA_URL = "" + self.assertTrue(hed_cache.get_library_data("")) + self.assertTrue(hed_cache.get_library_data("score")) + self.assertEqual(hed_cache.get_library_data("not_real_library_name"), {}) + finally: + hed_cache.INSTALLED_CACHE_LOCATION = self.saved_install_cache + + if __name__ == '__main__': unittest.main() - diff --git a/spec_tests/validate_bids.py b/spec_tests/validate_bids.py index 0ee852934..9dac90f24 100644 --- a/spec_tests/validate_bids.py +++ b/spec_tests/validate_bids.py @@ -1,35 +1,38 @@ -import os -import unittest - -from hed.tools import BidsDataset -from hed.errors import get_printable_issue_string - - -class MyTestCase(unittest.TestCase): - @classmethod - def setUpClass(cls): - cls.base_dir = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), - 'hed-examples/datasets')) - cls.fail_count = [] - - @classmethod - def tearDownClass(cls): - pass - - def test_validation(self): - base_dir = self.base_dir - for directory in os.listdir(base_dir): - dataset_path = os.path.join(base_dir, directory) - if not os.path.isdir(dataset_path): - continue - - bids_data = BidsDataset(dataset_path) - issues = bids_data.validate(check_for_warnings=False) - if issues: - self.fail_count.append((directory, issues)) - print(f"{len(self.fail_count)} tests got an unexpected result") - print("\n".join(get_printable_issue_string(issue, f"Errors in directory: {title}", skip_filename=False) for title, issue in self.fail_count)) - self.assertEqual(0, len(self.fail_count)) - -if __name__ == '__main__': - unittest.main() +import os +import unittest + +from hed.tools import BidsDataset +from hed.errors import get_printable_issue_string + + +class MyTestCase(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.base_dir = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), + 'hed-examples/datasets')) + cls.fail_count = [] + + @classmethod + def tearDownClass(cls): + pass + + def test_validation(self): + base_dir = self.base_dir + for directory in os.listdir(base_dir): + dataset_path = os.path.join(base_dir, directory) + if not os.path.isdir(dataset_path): + continue + + bids_data = BidsDataset(dataset_path) + issues = bids_data.validate(check_for_warnings=False) + if issues: + self.fail_count.append((directory, issues)) + print(f"{len(self.fail_count)} tests got an unexpected result") + print("\n".join(get_printable_issue_string(issue, + f"Errors in directory: {title}", + skip_filename=False) for title, issue in self.fail_count)) + self.assertEqual(0, len(self.fail_count)) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/data/bids_tests/eeg_ds003645s_hed_library/dataset_description.json b/tests/data/bids_tests/eeg_ds003645s_hed_library/dataset_description.json index bdf62c28d..5b1a510e9 100644 --- a/tests/data/bids_tests/eeg_ds003645s_hed_library/dataset_description.json +++ b/tests/data/bids_tests/eeg_ds003645s_hed_library/dataset_description.json @@ -1,24 +1,24 @@ -{ - "Name": "Face processing MEEG dataset with HED annotation", - "BIDSVersion": "1.9.0", - "HEDVersion": ["8.2.0", "sc:score_1.0.0", "test:testlib_1.0.2"], - "License": "CC0", - "Authors": [ - "Daniel G. Wakeman", - "Richard N Henson", - "Dung Truong (curation)", - "Kay Robbins (curation)", - "Scott Makeig (curation)", - "Arno Delorme (curation)" - ], - "ReferencesAndLinks": [ - "Wakeman, D., Henson, R. (2015). A multi-subject, multi-modal human neuroimaging dataset. Sci Data 2, 150001. https://doi.org/10.1038/sdata.2015.1", - "Robbins, K., Truong, D., Appelhoff, S., Delorme, A., & Makeig, S. (2021). Capturing the nature of events and event context using Hierarchical Event Descriptors (HED). In press for NeuroImage Special Issue Practice in MEEG. NeuroImage 245 (2021) 118766. Online: https://www.sciencedirect.com/science/article/pii/S1053811921010387.", - "Robbins, K., Truong, D., Jones, A., Callanan, I., & Makeig, S. (2021). Building FAIR functionality: Annotating events in time series data using Hierarchical Event Descriptors (HED). Neuroinformatics Special Issue Building the NeuroCommons. Neuroinformatics https://doi.org/10.1007/s12021-021-09537-4. Online: https://link.springer.com/article/10.1007/s12021-021-09537-4." - ], - "Funding": [ - "Experiment was supported by the UK Medical Research Council (MC_A060_5PR10) and Elekta Ltd.", - "Curation was supported by: Army Research Laboratory W911NF-10-2-0022, NIH R01 EB023297-03, NIH R01 NS047293-l4, and NIH R24 MH120037-01." - ], - "DatasetDOI": "10.18112/openneuro.ds003645.v1.0.0" +{ + "Name": "Face processing MEEG dataset with HED annotation", + "BIDSVersion": "1.10.0", + "HEDVersion": ["score_2.0.0", "test:testlib_1.0.2"], + "License": "CC0", + "Authors": [ + "Daniel G. Wakeman", + "Richard N Henson", + "Dung Truong (curation)", + "Kay Robbins (curation)", + "Scott Makeig (curation)", + "Arno Delorme (curation)" + ], + "ReferencesAndLinks": [ + "Wakeman, D., Henson, R. (2015). A multi-subject, multi-modal human neuroimaging dataset. Sci Data 2, 150001. https://doi.org/10.1038/sdata.2015.1", + "Robbins, K., Truong, D., Appelhoff, S., Delorme, A., & Makeig, S. (2021). Capturing the nature of events and event context using Hierarchical Event Descriptors (HED). In press for NeuroImage Special Issue Practice in MEEG. NeuroImage 245 (2021) 118766. Online: https://www.sciencedirect.com/science/article/pii/S1053811921010387.", + "Robbins, K., Truong, D., Jones, A., Callanan, I., & Makeig, S. (2021). Building FAIR functionality: Annotating events in time series data using Hierarchical Event Descriptors (HED). Neuroinformatics Special Issue Building the NeuroCommons. Neuroinformatics https://doi.org/10.1007/s12021-021-09537-4. Online: https://link.springer.com/article/10.1007/s12021-021-09537-4." + ], + "Funding": [ + "Experiment was supported by the UK Medical Research Council (MC_A060_5PR10) and Elekta Ltd.", + "Curation was supported by: Army Research Laboratory W911NF-10-2-0022, NIH R01 EB023297-03, NIH R01 NS047293-l4, and NIH R24 MH120037-01." + ], + "DatasetDOI": "10.18112/openneuro.ds003645.v1.0.0" } \ No newline at end of file diff --git a/tests/data/bids_tests/eeg_ds003645s_hed_library/task-FacePerception_events.json b/tests/data/bids_tests/eeg_ds003645s_hed_library/task-FacePerception_events.json index ab39a1085..03e4bfaab 100644 --- a/tests/data/bids_tests/eeg_ds003645s_hed_library/task-FacePerception_events.json +++ b/tests/data/bids_tests/eeg_ds003645s_hed_library/task-FacePerception_events.json @@ -1,137 +1,137 @@ -{ - "onset": { - "Description": "Position of event marker in seconds relative to the start.", - "Units": "s" - }, - "duration": { - "Description": "Duration of the event in seconds.", - "Units": "s" - }, - "event_type": { - "LongName": "Event category", - "Description": "The main category of the event.", - "Levels": { - "show_face": "Display a face to mark end of pre-stimulus and start of blink-inhibition.", - "show_face_initial": "Display a face at the beginning of the recording.", - "show_circle": "Display a white circle to mark end of the stimulus and blink inhibition.", - "show_cross": "Display only a white cross to mark start of trial and fixation.", - "left_press": "Experiment participant presses a key with left index finger.", - "right_press": "Experiment participant presses a key with right index finger.", - "setup_left_sym": "Setup for experiment with pressing key with left index finger means a face with above average symmetry.", - "setup_right_sym": "Setup for experiment with pressing key with right index finger means a face with above average symmetry.", - "double_press": "Experiment participant presses both keys ." - }, - "HED": { - "show_face": "Sensory-event, test:Experimental-stimulus, (Def/Face-image, Onset), (Def/Blink-inhibition-task,Onset),(Def/Cross-only, Offset)", - "show_face_initial": "Sensory-event, Experimental-stimulus, (Def/Face-image, Onset), (Def/Blink-inhibition-task,Onset), (Def/Fixation-task, Onset)", - "show_circle": "Sensory-event, (Intended-effect, Cue), (Def/Circle-only, Onset), (Def/Face-image, Offset), (Def/Blink-inhibition-task, Offset), (Def/Fixation-task, Offset)", - "show_cross": "Sensory-event, (Intended-effect, Cue), (Def/Cross-only, Onset), (Def/Fixation-task, Onset), (Def/Circle-only, Offset), sc:Hyperventilation-refused-procedure/Could not comply", - "left_press": "Agent-action, Participant-response, Def/Press-left-finger", - "right_press": "Agent-action, Participant-response, Def/Press-right-finger", - "setup_left_sym": "Experiment-structure, (Def/Left-sym-cond, Onset), (Def/Initialize-recording, Onset)", - "setup_right_sym": "Experiment-structure, (Def/Right-sym-cond, Onset), (Def/Initialize-recording, Onset)", - "double_press": "Agent-action, Indeterminate-action, sc:Sleep-architecture, (Press, Keyboard-key)" - } - }, - "face_type": { - "Description": "Factor indicating type of face image being displayed.", - "Levels": { - "famous_face": "A face that should be recognized by the participants.", - "unfamiliar_face": "A face that should not be recognized by the participants.", - "scrambled_face": "A scrambled face image generated by taking face 2D FFT." - }, - "HED": { - "famous_face": "Def/Famous-face-cond", - "unfamiliar_face": "Def/Unfamiliar-face-cond", - "scrambled_face": "Def/Scrambled-face-cond" - } - }, - "rep_status": { - "Description": "Factor indicating whether this image has been already seen.", - "Levels": { - "first_show": "Factor level indicating the first display of this face.", - "immediate_repeat": "Factor level indicating this face was the same as previous one.", - "delayed_repeat": "Factor level indicating face was seen 5 to 15 trials ago." - }, - "HED": { - "first_show": "Def/First-show-cond", - "immediate_repeat": "Def/Immediate-repeat-cond", - "delayed_repeat": "Def/Delayed-repeat-cond" - } - }, - "trial": { - "Description": "Indicates which trial this event belongs to." - }, - "rep_lag": { - "Description": "How face images before this one was the image was previously presented.", - "HED": "(Face, Item-interval/#)" - }, - "stim_file": { - "Description": "Path of the stimulus file in the stimuli directory.", - "HED": "(Image, Pathname/#), test:Image" - }, - "hed_def_sensory": { - "Description": "Metadata dictionary for gathering sensory definitions", - "HED": { - "cross_only_def": "(Definition/Cross-only, (Visual-presentation, (Foreground-view, (White, Cross), (Center-of, Computer-screen)), sc:Sleep-architecture, (Background-view, Black), test:Cue, Description/A white fixation cross on a black background in the center of the screen.))", - "face_image_def": "(Definition/Face-image, (Visual-presentation, (Foreground-view, ((Image, Face, Hair), Color/Grayscale), ((White, Cross), (Center-of, Computer-screen))), (Background-view, Black), Description/A happy or neutral face in frontal or three-quarters frontal pose with long hair cropped presented as an achromatic foreground image on a black background with a white fixation cross superposed.))", - "circle_only_def": "(Definition/Circle-only, (Visual-presentation, (Foreground-view, ((White, Circle), (Center-of, Computer-screen))), (Background-view, Black), Description/A white circle on a black background in the center of the screen.))" - } - }, - "hed_def_actions": { - "Description": "Metadata dictionary for gathering participant action definitions", - "HED": { - "press_left_finger_def": "(Definition/Press-left-finger, ((Index-finger, (Left-side-of, Experiment-participant)), (Press, Keyboard-key), Description/The participant presses a key with the left index finger to indicate a face symmetry judgment.))", - "press_right_finger_def": "(Definition/Press-right-finger, ((Index-finger, (Right-side-of, Experiment-participant)), (Press, Keyboard-key), Description/The participant presses a key with the right index finger to indicate a face symmetry evaluation.))" - } - }, - "hed_def_conds": { - "Description": "Metadata dictionary for gathering experimental condition definitions", - "HED": { - "famous_face_cond_def": "(Definition/Famous-face-cond, (Condition-variable/Face-type, (Image, (Face, Famous)), Description/A face that should be recognized by the participants))", - "unfamiliar_face_cond_def": "(Definition/Unfamiliar-face-cond, (Condition-variable/Face-type, (Image, (Face, Unfamiliar)), Description/A face that should not be recognized by the participants.))", - "scrambled_face_cond_def": "(Definition/Scrambled-face-cond, (Condition-variable/Face-type, (Image, (Face, Disordered)), Description/A scrambled face image generated by taking face 2D FFT.))", - "first_show_cond_def": "(Definition/First-show-cond, ((Condition-variable/Repetition-type, (Item-count/1, Face), Item-interval/0), Description/Factor level indicating the first display of this face.))", - "immediate_repeat_cond_def": "(Definition/Immediate-repeat-cond, ((Condition-variable/Repetition-type, (Item-count/2, Face), Item-interval/1), Description/Factor level indicating this face was the same as previous one.))", - "delayed_repeat_cond_def": "(Definition/Delayed-repeat-cond, (Condition-variable/Repetition-type, (Item-count/2, Face), (Item-interval, (Greater-than-or-equal-to, Item-interval/5)), Description/Factor level indicating face was seen 5 to 15 trials ago.))", - "left_sym_cond_def": "(Definition/Left-sym-cond, (Condition-variable/Key-assignment, ((Index-finger, (Left-side-of, Experiment-participant)), (Behavioral-evidence, Symmetrical)), ((Index-finger, (Right-side-of, Experiment-participant)), (Behavioral-evidence, Asymmetrical)), Description/Left index finger key press indicates a face with above average symmetry.))", - "right_sym_cond_def": "(Definition/Right-sym-cond, (Condition-variable/Key-assignment, ((Index-finger, (Right-side-of, Experiment-participant)), (Behavioral-evidence, Symmetrical)), ((Index-finger, (Left-side-of, Experiment-participant)), (Behavioral-evidence, Asymmetrical)), Description/Right index finger key press indicates a face with above average symmetry.))" - } - }, - "hed_def_tasks": { - "Description": "Metadata dictionary for gathering task definitions", - "HED": { - "face_symmetry_evaluation_task_def": "(Definition/Face-symmetry-evaluation-task, (Task, Experiment-participant, (See, Face), (Discriminate, (Face, Symmetrical)), (Press, Keyboard-key), Description/Evaluate degree of image symmetry and respond with key press evaluation.))", - "blink_inhibition_task_def": "(Definition/Blink-inhibition-task, (Task, Experiment-participant, Inhibit-blinks, Description/Do not blink while the face image is displayed.))", - "fixation_task_def": "(Definition/Fixation-task, (Task, Experiment-participant, (Fixate, Cross), Description/Fixate on the cross at the screen center.))" - } - }, - "hed_def_setup": { - "Description": "Metadata dictionary for gathering setup definitions", - "HED": { - "setup_def": "(Definition/Initialize-recording, (Recording))" - } - - }, - "value": { - "Description": "Numerical event marker", - "Levels": { - "x0": "Disappearance of face image and display of the inter-stimulus circle simultaneously", - "x1": "Disappearance of face image and display of the inter-stimulus circle simultaneously", - "x2": "Initial setup with left finger key press indicating above average symmetry", - "x3": "Initial setup with right finger key press indicating above average symmetry", - "x5": "Initial presentation of famous face", - "x6": "Immediate repeated presentation of famous face", - "x7": "Delayed repeated presentation of famous face", - "x13": "Initial presentation of unfamiliar face", - "x14": "Immediate repeated presentation of unfamiliar face", - "x15": "Delayed repeated presentation of unfamiliar face", - "x17": "Initial presentation of scrambled face", - "x18": "Immediate repeated presentation of scrambled face", - "x19": "Delayed repeated presentation of scrambled face", - "x256": "Left finger key press", - "x4096": "Right finger key press", - "x4352": "Left and right finger key presses" - } - } -} +{ + "onset": { + "Description": "Position of event marker in seconds relative to the start.", + "Units": "s" + }, + "duration": { + "Description": "Duration of the event in seconds.", + "Units": "s" + }, + "event_type": { + "LongName": "Event category", + "Description": "The main category of the event.", + "Levels": { + "show_face": "Display a face to mark end of pre-stimulus and start of blink-inhibition.", + "show_face_initial": "Display a face at the beginning of the recording.", + "show_circle": "Display a white circle to mark end of the stimulus and blink inhibition.", + "show_cross": "Display only a white cross to mark start of trial and fixation.", + "left_press": "Experiment participant presses a key with left index finger.", + "right_press": "Experiment participant presses a key with right index finger.", + "setup_left_sym": "Setup for experiment with pressing key with left index finger means a face with above average symmetry.", + "setup_right_sym": "Setup for experiment with pressing key with right index finger means a face with above average symmetry.", + "double_press": "Experiment participant presses both keys ." + }, + "HED": { + "show_face": "Sensory-event, test:Experimental-stimulus, (Def/Face-image, Onset), (Def/Blink-inhibition-task,Onset),(Def/Cross-only, Offset)", + "show_face_initial": "Sensory-event, Experimental-stimulus, (Def/Face-image, Onset), (Def/Blink-inhibition-task,Onset), (Def/Fixation-task, Onset)", + "show_circle": "Sensory-event, (Intended-effect, Cue), (Def/Circle-only, Onset), (Def/Face-image, Offset), (Def/Blink-inhibition-task, Offset), (Def/Fixation-task, Offset)", + "show_cross": "Sensory-event, (Intended-effect, Cue), (Def/Cross-only, Onset), (Def/Fixation-task, Onset), (Def/Circle-only, Offset), Hyperventilation-refused-procedure/Could not comply", + "left_press": "Agent-action, Participant-response, Def/Press-left-finger", + "right_press": "Agent-action, Participant-response, Def/Press-right-finger", + "setup_left_sym": "Experiment-structure, (Def/Left-sym-cond, Onset), (Def/Initialize-recording, Onset)", + "setup_right_sym": "Experiment-structure, (Def/Right-sym-cond, Onset), (Def/Initialize-recording, Onset)", + "double_press": "Agent-action, Indeterminate-action, Sleep-architecture, (Press, Keyboard-key)" + } + }, + "face_type": { + "Description": "Factor indicating type of face image being displayed.", + "Levels": { + "famous_face": "A face that should be recognized by the participants.", + "unfamiliar_face": "A face that should not be recognized by the participants.", + "scrambled_face": "A scrambled face image generated by taking face 2D FFT." + }, + "HED": { + "famous_face": "Def/Famous-face-cond", + "unfamiliar_face": "Def/Unfamiliar-face-cond", + "scrambled_face": "Def/Scrambled-face-cond" + } + }, + "rep_status": { + "Description": "Factor indicating whether this image has been already seen.", + "Levels": { + "first_show": "Factor level indicating the first display of this face.", + "immediate_repeat": "Factor level indicating this face was the same as previous one.", + "delayed_repeat": "Factor level indicating face was seen 5 to 15 trials ago." + }, + "HED": { + "first_show": "Def/First-show-cond", + "immediate_repeat": "Def/Immediate-repeat-cond", + "delayed_repeat": "Def/Delayed-repeat-cond" + } + }, + "trial": { + "Description": "Indicates which trial this event belongs to." + }, + "rep_lag": { + "Description": "How face images before this one was the image was previously presented.", + "HED": "(Face, Item-interval/#)" + }, + "stim_file": { + "Description": "Path of the stimulus file in the stimuli directory.", + "HED": "(Image, Pathname/#), test:Image" + }, + "hed_def_sensory": { + "Description": "Metadata dictionary for gathering sensory definitions", + "HED": { + "cross_only_def": "(Definition/Cross-only, (Visual-presentation, (Foreground-view, (White, Cross), (Center-of, Computer-screen)), Sleep-architecture, (Background-view, Black), test:Cue, Description/A white fixation cross on a black background in the center of the screen.))", + "face_image_def": "(Definition/Face-image, (Visual-presentation, (Foreground-view, ((Image, Face, Hair), Color/Grayscale), ((White, Cross), (Center-of, Computer-screen))), (Background-view, Black), Description/A happy or neutral face in frontal or three-quarters frontal pose with long hair cropped presented as an achromatic foreground image on a black background with a white fixation cross superposed.))", + "circle_only_def": "(Definition/Circle-only, (Visual-presentation, (Foreground-view, ((White, Circle), (Center-of, Computer-screen))), (Background-view, Black), Description/A white circle on a black background in the center of the screen.))" + } + }, + "hed_def_actions": { + "Description": "Metadata dictionary for gathering participant action definitions", + "HED": { + "press_left_finger_def": "(Definition/Press-left-finger, ((Index-finger, (Left-side-of, Experiment-participant)), (Press, Keyboard-key), Description/The participant presses a key with the left index finger to indicate a face symmetry judgment.))", + "press_right_finger_def": "(Definition/Press-right-finger, ((Index-finger, (Right-side-of, Experiment-participant)), (Press, Keyboard-key), Description/The participant presses a key with the right index finger to indicate a face symmetry evaluation.))" + } + }, + "hed_def_conds": { + "Description": "Metadata dictionary for gathering experimental condition definitions", + "HED": { + "famous_face_cond_def": "(Definition/Famous-face-cond, (Condition-variable/Face-type, (Image, (Face, Famous)), Description/A face that should be recognized by the participants))", + "unfamiliar_face_cond_def": "(Definition/Unfamiliar-face-cond, (Condition-variable/Face-type, (Image, (Face, Unfamiliar)), Description/A face that should not be recognized by the participants.))", + "scrambled_face_cond_def": "(Definition/Scrambled-face-cond, (Condition-variable/Face-type, (Image, (Face, Disordered)), Description/A scrambled face image generated by taking face 2D FFT.))", + "first_show_cond_def": "(Definition/First-show-cond, ((Condition-variable/Repetition-type, (Item-count/1, Face), Item-interval/0), Description/Factor level indicating the first display of this face.))", + "immediate_repeat_cond_def": "(Definition/Immediate-repeat-cond, ((Condition-variable/Repetition-type, (Item-count/2, Face), Item-interval/1), Description/Factor level indicating this face was the same as previous one.))", + "delayed_repeat_cond_def": "(Definition/Delayed-repeat-cond, (Condition-variable/Repetition-type, (Item-count/2, Face), (Item-interval, (Greater-than-or-equal-to, Item-interval/5)), Description/Factor level indicating face was seen 5 to 15 trials ago.))", + "left_sym_cond_def": "(Definition/Left-sym-cond, (Condition-variable/Key-assignment, ((Index-finger, (Left-side-of, Experiment-participant)), (Behavioral-evidence, Symmetrical)), ((Index-finger, (Right-side-of, Experiment-participant)), (Behavioral-evidence, Asymmetrical)), Description/Left index finger key press indicates a face with above average symmetry.))", + "right_sym_cond_def": "(Definition/Right-sym-cond, (Condition-variable/Key-assignment, ((Index-finger, (Right-side-of, Experiment-participant)), (Behavioral-evidence, Symmetrical)), ((Index-finger, (Left-side-of, Experiment-participant)), (Behavioral-evidence, Asymmetrical)), Description/Right index finger key press indicates a face with above average symmetry.))" + } + }, + "hed_def_tasks": { + "Description": "Metadata dictionary for gathering task definitions", + "HED": { + "face_symmetry_evaluation_task_def": "(Definition/Face-symmetry-evaluation-task, (Task, Experiment-participant, (See, Face), (Discriminate, (Face, Symmetrical)), (Press, Keyboard-key), Description/Evaluate degree of image symmetry and respond with key press evaluation.))", + "blink_inhibition_task_def": "(Definition/Blink-inhibition-task, (Task, Experiment-participant, Inhibit-blinks, Description/Do not blink while the face image is displayed.))", + "fixation_task_def": "(Definition/Fixation-task, (Task, Experiment-participant, (Fixate, Cross), Description/Fixate on the cross at the screen center.))" + } + }, + "hed_def_setup": { + "Description": "Metadata dictionary for gathering setup definitions", + "HED": { + "setup_def": "(Definition/Initialize-recording, (Recording))" + } + + }, + "value": { + "Description": "Numerical event marker", + "Levels": { + "x0": "Disappearance of face image and display of the inter-stimulus circle simultaneously", + "x1": "Disappearance of face image and display of the inter-stimulus circle simultaneously", + "x2": "Initial setup with left finger key press indicating above average symmetry", + "x3": "Initial setup with right finger key press indicating above average symmetry", + "x5": "Initial presentation of famous face", + "x6": "Immediate repeated presentation of famous face", + "x7": "Delayed repeated presentation of famous face", + "x13": "Initial presentation of unfamiliar face", + "x14": "Immediate repeated presentation of unfamiliar face", + "x15": "Delayed repeated presentation of unfamiliar face", + "x17": "Initial presentation of scrambled face", + "x18": "Immediate repeated presentation of scrambled face", + "x19": "Delayed repeated presentation of scrambled face", + "x256": "Left finger key press", + "x4096": "Right finger key press", + "x4352": "Left and right finger key presses" + } + } +} diff --git a/tests/data/schema_tests/merge_tests/HED_score_lib_tags.mediawiki b/tests/data/schema_tests/merge_tests/HED_score_lib_tags.mediawiki deleted file mode 100644 index 619933408..000000000 --- a/tests/data/schema_tests/merge_tests/HED_score_lib_tags.mediawiki +++ /dev/null @@ -1,900 +0,0 @@ -HED version="1.1.0" library="score" withStandard="8.2.0" unmerged="True" - -'''Prologue''' -This schema is a Hierarchical Event Descriptors (HED) Library Schema implementation of Standardized Computer-based Organized Reporting of EEG (SCORE)[1,2] for describing events occurring during neuroimaging time series recordings. -The HED-SCORE library schema allows neurologists, neurophysiologists, and brain researchers to annotate electrophysiology recordings using terms from an internationally accepted set of defined terms (SCORE) compatible with the HED framework. -The resulting annotations are understandable to clinicians and directly usable in computer analysis. - -Future extensions may be implemented in the HED-SCORE library schema. -For more information see https://hed-schema-library.readthedocs.io/en/latest/index.html. - -!# start schema - -'''Modulator''' {requireChild} [External stimuli / interventions or changes in the alertness level (sleep) that modify: the background activity, or how often a graphoelement is occurring, or change other features of the graphoelement (like intra-burst frequency). For each observed finding, there is an option of specifying how they are influenced by the modulators and procedures that were done during the recording.] - * Sleep-modulator - ** Sleep-deprivation - *** # {takesValue, valueClass=textClass} [Free text.] - ** Sleep-following-sleep-deprivation - *** # {takesValue, valueClass=textClass} [Free text.] - ** Natural-sleep - *** # {takesValue, valueClass=textClass} [Free text.] - ** Induced-sleep - *** # {takesValue, valueClass=textClass} [Free text.] - ** Drowsiness - *** # {takesValue, valueClass=textClass} [Free text.] - ** Awakening - *** # {takesValue, valueClass=textClass} [Free text.] - * Medication-modulator - ** Medication-administered-during-recording - *** # {takesValue, valueClass=textClass} [Free text.] - ** Medication-withdrawal-or-reduction-during-recording - *** # {takesValue, valueClass=textClass} [Free text.] - * Eye-modulator - ** Manual-eye-closure - *** # {takesValue, valueClass=textClass} [Free text.] - ** Manual-eye-opening - *** # {takesValue, valueClass=textClass} [Free text.] - * Stimulation-modulator - ** Intermittent-photic-stimulation {requireChild, suggestedTag=Intermittent-photic-stimulation-effect} - *** # {takesValue, valueClass=numericClass, unitClass=frequencyUnits} - ** Auditory-stimulation - *** # {takesValue, valueClass=textClass} [Free text.] - ** Nociceptive-stimulation - *** # {takesValue, valueClass=textClass} [Free text.] - * Hyperventilation - ** # {takesValue, valueClass=textClass} [Free text.] - * Physical-effort - ** # {takesValue, valueClass=textClass} [Free text.] - * Cognitive-task - ** # {takesValue, valueClass=textClass} [Free text.] - * Other-modulator-or-procedure {requireChild} - ** # {takesValue, valueClass=textClass} [Free text.] - -'''Background-activity''' {requireChild} [An EEG activity representing the setting in which a given normal or abnormal pattern appears and from which such pattern is distinguished.] - * Posterior-dominant-rhythm {suggestedTag=Finding-significance-to-recording, suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude-asymmetry, suggestedTag=Posterior-dominant-rhythm-property} [Rhythmic activity occurring during wakefulness over the posterior regions of the head, generally with maximum amplitudes over the occipital areas. Amplitude varies. Best seen with eyes closed and during physical relaxation and relative mental inactivity. Blocked or attenuated by attention, especially visual, and mental effort. In adults this is the alpha rhythm, and the frequency is 8 to 13 Hz. However the frequency can be higher or lower than this range (often a supra or sub harmonic of alpha frequency) and is called alpha variant rhythm (fast and slow alpha variant rhythm). In children, the normal range of the frequency of the posterior dominant rhythm is age-dependant.] - * Mu-rhythm {suggestedTag=Finding-frequency, suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors} [EEG rhythm at 7-11 Hz composed of arch-shaped waves occurring over the central or centro-parietal regions of the scalp during wakefulness. Amplitudes varies but is mostly below 50 microV. Blocked or attenuated most clearly by contralateral movement, thought of movement, readiness to move or tactile stimulation.] - * Other-organized-rhythm {requireChild, suggestedTag=Rhythmic-activity-morphology, suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [EEG activity that consisting of waves of approximately constant period, which is considered as part of the background (ongoing) activity, but does not fulfill the criteria of the posterior dominant rhythm.] - ** # {takesValue, valueClass=textClass} [Free text.] - * Background-activity-special-feature {requireChild} [Special Features. Special features contains scoring options for the background activity of critically ill patients.] - ** Continuous-background-activity {suggestedTag=Rhythmic-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent} - ** Nearly-continuous-background-activity {suggestedTag=Rhythmic-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent} - ** Discontinuous-background-activity {suggestedTag=Rhythmic-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent} - ** Background-burst-suppression {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent} [EEG pattern consisting of bursts (activity appearing and disappearing abruptly) interrupted by periods of low amplitude (below 20 microV) and which occurs simultaneously over all head regions.] - ** Background-burst-attenuation {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent} - ** Background-activity-suppression {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent, suggestedTag=Appearance-mode} [Periods showing activity under 10 microV (referential montage) and interrupting the background (ongoing) activity.] - ** Electrocerebral-inactivity [Absence of any ongoing cortical electric activities; in all leads EEG is isoelectric or only contains artifacts. Sensitivity has to be increased up to 2 microV/mm; recording time: at least 30 minutes.] - -'''Artifact''' {requireChild} [When relevant for the clinical interpretation, artifacts can be scored by specifying the type and the location.] - * Biological-artifact {requireChild} - ** Eye-blink-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Example for EEG: Fp1/Fp2 become electropositive with eye closure because the cornea is positively charged causing a negative deflection in Fp1/Fp2. If the eye blink is unilateral, consider prosthetic eye. If it is in F8 rather than Fp2 then the electrodes are plugged in wrong.] - ** Eye-movement-horizontal-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Example for EEG: There is an upward deflection in the Fp2-F8 derivation, when the eyes move to the right side. In this case F8 becomes more positive and therefore. When the eyes move to the left, F7 becomes more positive and there is an upward deflection in the Fp1-F7 derivation.] - ** Eye-movement-vertical-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Example for EEG: The EEG shows positive potentials (50-100 micro V) with bi-frontal distribution, maximum at Fp1 and Fp2, when the eyeball rotated upward. The downward rotation of the eyeball was associated with the negative deflection. The time course of the deflections was similar to the time course of the eyeball movement.] - ** Slow-eye-movement-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Slow, rolling eye-movements, seen during drowsiness.] - ** Nystagmus-artifact {suggestedTag=Artifact-significance-to-recording} - ** Chewing-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} - ** Sucking-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} - ** Glossokinetic-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [The tongue functions as a dipole, with the tip negative with respect to the base. The artifact produced by the tongue has a broad potential field that drops from frontal to occipital areas, although it is less steep than that produced by eye movement artifacts. The amplitude of the potentials is greater inferiorly than in parasagittal regions; the frequency is variable but usually in the delta range. Chewing and sucking can produce similar artifacts.] - ** Rocking-patting-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Quasi-rhythmical artifacts in recordings from infants caused by rocking/patting.] - ** Movement-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Example for EEG: Large amplitude artifact, with irregular morphology (usually resembling a slow-wave or a wave with complex morphology) seen in one or several channels, due to movement. If the causing movement is repetitive, the artifact might resemble a rhythmic EEG activity.] - ** Respiration-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Respiration can produce 2 kinds of artifacts. One type is in the form of slow and rhythmic activity, synchronous with the body movements of respiration and mechanically affecting the impedance of (usually) one electrode. The other type can be slow or sharp waves that occur synchronously with inhalation or exhalation and involve those electrodes on which the patient is lying.] - ** Pulse-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Example for EEG: Occurs when an EEG electrode is placed over a pulsating vessel. The pulsation can cause slow waves that may simulate EEG activity. A direct relationship exists between ECG and the pulse waves (200-300 millisecond delay after ECG equals QRS complex).] - ** ECG-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Example for EEG: Far-field potential generated in the heart. The voltage and apparent surface of the artifact vary from derivation to derivation and, consequently, from montage to montage. The artifact is observed best in referential montages using earlobe electrodes A1 and A2. ECG artifact is recognized easily by its rhythmicity/regularity and coincidence with the ECG tracing.] - ** Sweat-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Is a low amplitude undulating waveform that is usually greater than 2 seconds and may appear to be an unstable baseline.] - ** EMG-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Myogenic potentials are the most common artifacts. Frontalis and temporalis muscles (ex..: clenching of jaw muscles) are common causes. Generally, the potentials generated in the muscles are of shorter duration than those generated in the brain. The frequency components are usually beyond 30-50 Hz, and the bursts are arrhythmic.] - * Non-biological-artifact {requireChild} - ** Power-supply-artifact {suggestedTag=Artifact-significance-to-recording} [50-60 Hz artifact. Monomorphic waveform due to 50 or 60 Hz A/C power supply.] - ** Induction-artifact {suggestedTag=Artifact-significance-to-recording} [Artifacts (usually of high frequency) induced by nearby equipment (like in the intensive care unit).] - ** Dialysis-artifact {suggestedTag=Artifact-significance-to-recording} - ** Artificial-ventilation-artifact {suggestedTag=Artifact-significance-to-recording} - ** Electrode-pops-artifact {suggestedTag=Artifact-significance-to-recording} [Are brief discharges with a very steep upslope and shallow fall that occur in all leads which include that electrode.] - ** Salt-bridge-artifact {suggestedTag=Artifact-significance-to-recording} [Typically occurs in 1 channel which may appear isoelectric. Only seen in bipolar montage.] - * Other-artifact {requireChild, suggestedTag=Artifact-significance-to-recording} - ** # {takesValue, valueClass=textClass} [Free text.] - -'''Critically-ill-patients-patterns''' {requireChild} [Rhythmic or periodic patterns in critically ill patients (RPPs) are scored according to the 2012 version of the American Clinical Neurophysiology Society Standardized Critical Care EEG Terminology (Hirsch et al., 2013).] - * Critically-ill-patients-periodic-discharges {suggestedTag=Periodic-discharge-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-frequency, suggestedTag=Periodic-discharge-time-related-features} [Periodic discharges (PDs).] - * Rhythmic-delta-activity {suggestedTag=Periodic-discharge-superimposed-activity, suggestedTag=Periodic-discharge-absolute-amplitude, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-frequency, suggestedTag=Periodic-discharge-time-related-features} [RDA] - * Spike-or-sharp-and-wave {suggestedTag=Periodic-discharge-sharpness, suggestedTag=Number-of-periodic-discharge-phases, suggestedTag=Periodic-discharge-triphasic-morphology, suggestedTag=Periodic-discharge-absolute-amplitude, suggestedTag=Periodic-discharge-relative-amplitude, suggestedTag=Periodic-discharge-polarity, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Finding-frequency, suggestedTag=Periodic-discharge-time-related-features} [SW] - -'''Episode''' {requireChild} [Clinical episode or electrographic seizure.] - * Epileptic-seizure {requireChild} [The ILAE presented a revised seizure classification that divides seizures into focal, generalized onset, or unknown onset.] - ** Focal-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Automatism-motor-seizure, suggestedTag=Atonic-motor-seizure, suggestedTag=Clonic-motor-seizure, suggestedTag=Epileptic-spasm-episode, suggestedTag=Hyperkinetic-motor-seizure, suggestedTag=Myoclonic-motor-seizure, suggestedTag=Tonic-motor-seizure, suggestedTag=Autonomic-nonmotor-seizure, suggestedTag=Behavior-arrest-nonmotor-seizure, suggestedTag=Cognitive-nonmotor-seizure, suggestedTag=Emotional-nonmotor-seizure, suggestedTag=Sensory-nonmotor-seizure, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Focal seizures can be divided into focal aware and impaired awareness seizures, with additional motor and nonmotor classifications.] - *** Aware-focal-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} - *** Impaired-awareness-focal-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} - *** Awareness-unknown-focal-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} - *** Focal-to-bilateral-tonic-clonic-focal-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [A seizure type with focal onset, with awareness or impaired awareness, either motor or non-motor, progressing to bilateral tonic clonic activity. The prior term was seizure with partial onset with secondary generalization. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - ** Generalized-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Tonic-clonic-motor-seizure, suggestedTag=Clonic-motor-seizure, suggestedTag=Tonic-motor-seizure, suggestedTag=Myoclonic-motor-seizure, suggestedTag=Myoclonic-tonic-clonic-motor-seizure, suggestedTag=Myoclonic-atonic-motor-seizure, suggestedTag=Atonic-motor-seizure, suggestedTag=Epileptic-spasm-episode, suggestedTag=Typical-absence-seizure, suggestedTag=Atypical-absence-seizure, suggestedTag=Myoclonic-absence-seizure, suggestedTag=Eyelid-myoclonia-absence-seizure, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Generalized-onset seizures are classified as motor or nonmotor (absence), without using awareness level as a classifier, as most but not all of these seizures are linked with impaired awareness.] - ** Unknown-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Tonic-clonic-motor-seizure, suggestedTag=Epileptic-spasm-episode, suggestedTag=Behavior-arrest-nonmotor-seizure, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Even if the onset of seizures is unknown, they may exhibit characteristics that fall into categories such as motor, nonmotor, tonic-clonic, epileptic spasms, or behavior arrest.] - ** Unclassified-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Referring to a seizure type that cannot be described by the ILAE 2017 classification either because of inadequate information or unusual clinical features.] - * Subtle-seizure {suggestedTag=Episode-phase, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Seizure type frequent in neonates, sometimes referred to as motor automatisms; they may include random and roving eye movements, sucking, chewing motions, tongue protrusion, rowing or swimming or boxing movements of the arms, pedaling and bicycling movements of the lower limbs; apneic seizures are relatively common. Although some subtle seizures are associated with rhythmic ictal EEG discharges, and are clearly epileptic, ictal EEG often does not show typical epileptic activity.] - * Electrographic-seizure {suggestedTag=Episode-phase, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Referred usually to non convulsive status. Ictal EEG: rhythmic discharge or spike and wave pattern with definite evolution in frequency, location, or morphology lasting at least 10 s; evolution in amplitude alone did not qualify.] - * Seizure-PNES {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Psychogenic non-epileptic seizure.] - * Sleep-related-episode {requireChild} - ** Sleep-related-arousal {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Normal.] - ** Benign-sleep-myoclonus {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [A distinctive disorder of sleep characterized by a) neonatal onset, b) rhythmic myoclonic jerks only during sleep and c) abrupt and consistent cessation with arousal, d) absence of concomitant electrographic changes suggestive of seizures, and e) good outcome.] - ** Confusional-awakening {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Episode of non epileptic nature included in NREM parasomnias, characterized by sudden arousal and complex behavior but without full alertness, usually lasting a few minutes and occurring almost in all children at least occasionally. Amnesia of the episode is the rule.] - ** Sleep-periodic-limb-movement {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [PLMS. Periodic limb movement in sleep. Episodes are characterized by brief (0.5- to 5.0-second) lower-extremity movements during sleep, which typically occur at 20- to 40-second intervals, most commonly during the first 3 hours of sleep. The affected individual is usually not aware of the movements or of the transient partial arousals.] - ** REM-sleep-behavioral-disorder {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [REM sleep behavioral disorder. Episodes characterized by: a) presence of REM sleep without atonia (RSWA) on polysomnography (PSG); b) presence of at least 1 of the following conditions - (1) Sleep-related behaviors, by history, that have been injurious, potentially injurious, or disruptive (example: dream enactment behavior); (2) abnormal REM sleep behavior documented during PSG monitoring; (3) absence of epileptiform activity on electroencephalogram (EEG) during REM sleep (unless RBD can be clearly distinguished from any concurrent REM sleep-related seizure disorder); (4) sleep disorder not better explained by another sleep disorder, a medical or neurologic disorder, a mental disorder, medication use, or a substance use disorder.] - ** Sleep-walking {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Episodes characterized by ambulation during sleep; the patient is difficult to arouse during an episode, and is usually amnesic following the episode. Episodes usually occur in the first third of the night during slow wave sleep. Polysomnographic recordings demonstrate 2 abnormalities during the first sleep cycle: frequent, brief, non-behavioral EEG-defined arousals prior to the somnambulistic episode and abnormally low gamma (0.75-2.0 Hz) EEG power on spectral analysis, correlating with high-voltage (hyper-synchronic gamma) waves lasting 10 to 15 s occurring just prior to the movement. This is followed by stage I NREM sleep, and there is no evidence of complete awakening.] - * Pediatric-episode {requireChild} - ** Hyperekplexia {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Disorder characterized by exaggerated startle response and hypertonicity that may occur during the first year of life and in severe cases during the neonatal period. Children usually present with marked irritability and recurrent startles in response to handling and sounds. Severely affected infants can have severe jerks and stiffening, sometimes with breath-holding spells.] - ** Jactatio-capitis-nocturna {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Relatively common in normal children at the time of going to bed, especially during the first year of life, the rhythmic head movements persist during sleep. Usually, these phenomena disappear before 3 years of age.] - ** Pavor-nocturnus {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [A nocturnal episode characterized by age of onset of less than five years (mean age 18 months, with peak prevalence at five to seven years), appearance of signs of panic two hours after falling asleep with crying, screams, a fearful expression, inability to recognize other people including parents (for a duration of 5-15 minutes), amnesia upon awakening. Pavor nocturnus occurs in patients almost every night for months or years (but the frequency is highly variable and may be as low as once a month) and is likely to disappear spontaneously at the age of six to eight years.] - ** Pediatric-stereotypical-behavior-episode {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Repetitive motor behavior in children, typically rhythmic and persistent; usually not paroxysmal and rarely suggest epilepsy. They include headbanging, head-rolling, jactatio capitis nocturna, body rocking, buccal or lingual movements, hand flapping and related mannerisms, repetitive hand-waving (to self-induce photosensitive seizures).] - * Paroxysmal-motor-event {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Paroxysmal phenomena during neonatal or childhood periods characterized by recurrent motor or behavioral signs or symptoms that must be distinguishes from epileptic disorders.] - * Syncope {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Episode with loss of consciousness and muscle tone that is abrupt in onset, of short duration and followed by rapid recovery; it occurs in response to transient impairment of cerebral perfusion. Typical prodromal symptoms often herald onset of syncope and postictal symptoms are minimal. Syncopal convulsions resulting from cerebral anoxia are common but are not a form of epilepsy, nor are there any accompanying EEG ictal discharges.] - * Cataplexy {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [A sudden decrement in muscle tone and loss of deep tendon reflexes, leading to muscle weakness, paralysis, or postural collapse. Cataplexy usually is precipitated by an outburst of emotional expression-notably laughter, anger, or startle. It is one of the tetrad of symptoms of narcolepsy. During cataplexy, respiration and voluntary eye movements are not compromised. Consciousness is preserved.] - * Other-episode {requireChild} - ** # {takesValue, valueClass=textClass} [Free text.] - -'''Finding-property''' {requireChild} [Descriptive element similar to main HED /Property. Something that pertains to a thing. A characteristic of some entity. A quality or feature regarded as a characteristic or inherent part of someone or something. HED attributes are adjectives or adverbs.] - * Signal-morphology-property {requireChild} - ** Rhythmic-activity-morphology [EEG activity consisting of a sequence of waves approximately constant period.] - *** Delta-activity-morphology {suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude} [EEG rhythm in the delta (under 4 Hz) range that does not belong to the posterior dominant rhythm (scored under other organized rhythms).] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Theta-activity-morphology {suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude} [EEG rhythm in the theta (4-8 Hz) range that does not belong to the posterior dominant rhythm (scored under other organized rhythm).] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Alpha-activity-morphology {suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude} [EEG rhythm in the alpha range (8-13 Hz) which is considered part of the background (ongoing) activity but does not fulfill the criteria of the posterior dominant rhythm (alpha rhythm).] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Beta-activity-morphology {suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude} [EEG rhythm between 14 and 40 Hz, which is considered part of the background (ongoing) activity but does not fulfill the criteria of the posterior dominant rhythm. Most characteristically: a rhythm from 14 to 40 Hz recorded over the fronto-central regions of the head during wakefulness. Amplitude of the beta rhythm varies but is mostly below 30 microV. Other beta rhythms are most prominent in other locations or are diffuse.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Gamma-activity-morphology {suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude} - **** # {takesValue, valueClass=textClass} [Free text.] - ** Spike-morphology [A transient, clearly distinguished from background activity, with pointed peak at a conventional paper speed or time scale and duration from 20 to under 70 ms, i.e. 1/50-1/15 s approximately. Main component is generally negative relative to other areas. Amplitude varies.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Spike-and-slow-wave-morphology [A pattern consisting of a spike followed by a slow wave.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Runs-of-rapid-spikes-morphology [Bursts of spike discharges at a rate from 10 to 25/sec (in most cases somewhat irregular). The bursts last more than 2 seconds (usually 2 to 10 seconds) and it is typically seen in sleep. Synonyms: rhythmic spikes, generalized paroxysmal fast activity, fast paroxysmal rhythms, grand mal discharge, fast beta activity.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Polyspikes-morphology [Two or more consecutive spikes.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Polyspike-and-slow-wave-morphology [Two or more consecutive spikes associated with one or more slow waves.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Sharp-wave-morphology [A transient clearly distinguished from background activity, with pointed peak at a conventional paper speed or time scale, and duration of 70-200 ms, i.e. over 1/4-1/5 s approximately. Main component is generally negative relative to other areas. Amplitude varies.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Sharp-and-slow-wave-morphology [A sequence of a sharp wave and a slow wave.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Slow-sharp-wave-morphology [A transient that bears all the characteristics of a sharp-wave, but exceeds 200 ms. Synonym: blunted sharp wave.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** High-frequency-oscillation-morphology [HFO.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Hypsarrhythmia-classic-morphology [Abnormal interictal high amplitude waves and a background of irregular spikes.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Hypsarrhythmia-modified-morphology - *** # {takesValue, valueClass=textClass} [Free text.] - ** Fast-spike-activity-morphology [A burst consisting of a sequence of spikes. Duration greater than 1 s. Frequency at least in the alpha range.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Low-voltage-fast-activity-morphology [Refers to the fast, and often recruiting activity which can be recorded at the onset of an ictal discharge, particularly in invasive EEG recording of a seizure.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Polysharp-waves-morphology [A sequence of two or more sharp-waves.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Slow-wave-large-amplitude-morphology - *** # {takesValue, valueClass=textClass} [Free text.] - ** Irregular-delta-or-theta-activity-morphology [EEG activity consisting of repetitive waves of inconsistent wave-duration but in delta and/or theta rang (greater than 125 ms).] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Electrodecremental-change-morphology [Sudden desynchronization of electrical activity.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** DC-shift-morphology [Shift of negative polarity of the direct current recordings, during seizures.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Disappearance-of-ongoing-activity-morphology [Disappearance of the EEG activity that preceded the ictal event but still remnants of background activity (thus not enough to name it electrodecremental change).] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Polymorphic-delta-activity-morphology [EEG activity consisting of waves in the delta range (over 250 ms duration for each wave) but of different morphology.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Frontal-intermittent-rhythmic-delta-activity-morphology [Frontal intermittent rhythmic delta activity (FIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at 1.5-2.5 Hz over the frontal areas of one or both sides of the head. Comment: most commonly associated with unspecified encephalopathy, in adults.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Occipital-intermittent-rhythmic-delta-activity-morphology [Occipital intermittent rhythmic delta activity (OIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at 2-3 Hz over the occipital or posterior head regions of one or both sides of the head. Frequently blocked or attenuated by opening the eyes. Comment: most commonly associated with unspecified encephalopathy, in children.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Temporal-intermittent-rhythmic-delta-activity-morphology [Temporal intermittent rhythmic delta activity (TIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at over the temporal areas of one side of the head. Comment: most commonly associated with temporal lobe epilepsy.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Periodic-discharge-morphology {requireChild} [Periodic discharges not further specified (PDs).] - *** Periodic-discharge-superimposed-activity {requireChild, suggestedTag=Property-not-possible-to-determine} - **** Periodic-discharge-fast-superimposed-activity {suggestedTag=Finding-frequency} - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Periodic-discharge-rhythmic-superimposed-activity {suggestedTag=Finding-frequency} - ***** # {takesValue, valueClass=textClass} [Free text.] - *** Periodic-discharge-sharpness {requireChild, suggestedTag=Property-not-possible-to-determine} - **** Spiky-periodic-discharge-sharpness - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Sharp-periodic-discharge-sharpness - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Sharply-contoured-periodic-discharge-sharpness - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Blunt-periodic-discharge-sharpness - ***** # {takesValue, valueClass=textClass} [Free text.] - *** Number-of-periodic-discharge-phases {requireChild, suggestedTag=Property-not-possible-to-determine} - **** 1-periodic-discharge-phase - ***** # {takesValue, valueClass=textClass} [Free text.] - **** 2-periodic-discharge-phases - ***** # {takesValue, valueClass=textClass} [Free text.] - **** 3-periodic-discharge-phases - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Greater-than-3-periodic-discharge-phases - ***** # {takesValue, valueClass=textClass} [Free text.] - *** Periodic-discharge-triphasic-morphology {suggestedTag=Property-not-possible-to-determine, suggestedTag=Property-exists, suggestedTag=Property-absence} - **** # {takesValue, valueClass=textClass} [Free text.] - *** Periodic-discharge-absolute-amplitude {requireChild, suggestedTag=Property-not-possible-to-determine} - **** Periodic-discharge-absolute-amplitude-very-low [Lower than 20 microV.] - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Low-periodic-discharge-absolute-amplitude [20 to 49 microV.] - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Medium-periodic-discharge-absolute-amplitude [50 to 199 microV.] - ***** # {takesValue, valueClass=textClass} [Free text.] - **** High-periodic-discharge-absolute-amplitude [Greater than 200 microV.] - ***** # {takesValue, valueClass=textClass} [Free text.] - *** Periodic-discharge-relative-amplitude {requireChild, suggestedTag=Property-not-possible-to-determine} - **** Periodic-discharge-relative-amplitude-less-than-equal-2 - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Periodic-discharge-relative-amplitude-greater-than-2 - ***** # {takesValue, valueClass=textClass} [Free text.] - *** Periodic-discharge-polarity {requireChild} - **** Periodic-discharge-postitive-polarity - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Periodic-discharge-negative-polarity - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Periodic-discharge-unclear-polarity - ***** # {takesValue, valueClass=textClass} [Free text.] - * Source-analysis-property {requireChild} [How the current in the brain reaches the electrode sensors.] - ** Source-analysis-laterality {requireChild, suggestedTag=Brain-laterality} - ** Source-analysis-brain-region {requireChild} - *** Source-analysis-frontal-perisylvian-superior-surface - *** Source-analysis-frontal-lateral - *** Source-analysis-frontal-mesial - *** Source-analysis-frontal-polar - *** Source-analysis-frontal-orbitofrontal - *** Source-analysis-temporal-polar - *** Source-analysis-temporal-basal - *** Source-analysis-temporal-lateral-anterior - *** Source-analysis-temporal-lateral-posterior - *** Source-analysis-temporal-perisylvian-inferior-surface - *** Source-analysis-central-lateral-convexity - *** Source-analysis-central-mesial - *** Source-analysis-central-sulcus-anterior-surface - *** Source-analysis-central-sulcus-posterior-surface - *** Source-analysis-central-opercular - *** Source-analysis-parietal-lateral-convexity - *** Source-analysis-parietal-mesial - *** Source-analysis-parietal-opercular - *** Source-analysis-occipital-lateral - *** Source-analysis-occipital-mesial - *** Source-analysis-occipital-basal - *** Source-analysis-insula - * Location-property {requireChild} [Location can be scored for findings. Semiologic finding can also be characterized by the somatotopic modifier (i.e. the part of the body where it occurs). In this respect, laterality (left, right, symmetric, asymmetric, left greater than right, right greater than left), body part (eyelid, face, arm, leg, trunk, visceral, hemi-) and centricity (axial, proximal limb, distal limb) can be scored.] - ** Brain-laterality {requireChild} - *** Brain-laterality-left - **** # {takesValue, valueClass=textClass} [Free text.] - *** Brain-laterality-left-greater-right - **** # {takesValue, valueClass=textClass} [Free text.] - *** Brain-laterality-right - **** # {takesValue, valueClass=textClass} [Free text.] - *** Brain-laterality-right-greater-left - **** # {takesValue, valueClass=textClass} [Free text.] - *** Brain-laterality-midline - **** # {takesValue, valueClass=textClass} [Free text.] - *** Brain-laterality-diffuse-asynchronous - **** # {takesValue, valueClass=textClass} [Free text.] - ** Brain-region {requireChild} - *** Brain-region-frontal - **** # {takesValue, valueClass=textClass} [Free text.] - *** Brain-region-temporal - **** # {takesValue, valueClass=textClass} [Free text.] - *** Brain-region-central - **** # {takesValue, valueClass=textClass} [Free text.] - *** Brain-region-parietal - **** # {takesValue, valueClass=textClass} [Free text.] - *** Brain-region-occipital - **** # {takesValue, valueClass=textClass} [Free text.] - ** Body-part-location {requireChild} - *** Eyelid-location - **** # {takesValue, valueClass=textClass} [Free text.] - *** Face-location - **** # {takesValue, valueClass=textClass} [Free text.] - *** Arm-location - **** # {takesValue, valueClass=textClass} [Free text.] - *** Leg-location - **** # {takesValue, valueClass=textClass} [Free text.] - *** Trunk-location - **** # {takesValue, valueClass=textClass} [Free text.] - *** Visceral-location - **** # {takesValue, valueClass=textClass} [Free text.] - *** Hemi-location - **** # {takesValue, valueClass=textClass} [Free text.] - ** Brain-centricity {requireChild} - *** Brain-centricity-axial - **** # {takesValue, valueClass=textClass} [Free text.] - *** Brain-centricity-proximal-limb - **** # {takesValue, valueClass=textClass} [Free text.] - *** Brain-centricity-distal-limb - **** # {takesValue, valueClass=textClass} [Free text.] - ** Sensors {requireChild} [Lists all corresponding sensors (electrodes/channels in montage). The sensor-group is selected from a list defined in the site-settings for each EEG-lab.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Finding-propagation {suggestedTag=Property-exists, suggestedTag=Property-absence, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors} [When propagation within the graphoelement is observed, first the location of the onset region is scored. Then, the location of the propagation can be noted.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Multifocal-finding {suggestedTag=Property-not-possible-to-determine, suggestedTag=Property-exists, suggestedTag=Property-absence} [When the same interictal graphoelement is observed bilaterally and at least in three independent locations, can score them using one entry, and choosing multifocal as a descriptor of the locations of the given interictal graphoelements, optionally emphasizing the involved, and the most active sites.] - *** # {takesValue, valueClass=textClass} [Free text.] - * Modulators-property {requireChild} [For each described graphoelement, the influence of the modulators can be scored. Only modulators present in the recording are scored.] - ** Modulators-reactivity {requireChild, suggestedTag=Property-exists, suggestedTag=Property-absence} [Susceptibility of individual rhythms or the EEG as a whole to change following sensory stimulation or other physiologic actions.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Eye-closure-sensitivity {suggestedTag=Property-exists, suggestedTag=Property-absence} [Eye closure sensitivity.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Eye-opening-passive {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, suggestedTag=Finding-triggered-by} [Passive eye opening. Used with base schema Increasing/Decreasing.] - ** Medication-effect-EEG {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified} [Medications effect on EEG. Used with base schema Increasing/Decreasing.] - ** Medication-reduction-effect-EEG {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified} [Medications reduction or withdrawal effect on EEG. Used with base schema Increasing/Decreasing.] - ** Auditive-stimuli-effect {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified} [Used with base schema Increasing/Decreasing.] - ** Nociceptive-stimuli-effect {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, suggestedTag=Finding-triggered-by} [Used with base schema Increasing/Decreasing.] - ** Physical-effort-effect {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, suggestedTag=Finding-triggered-by} [Used with base schema Increasing/Decreasing] - ** Cognitive-task-effect {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, suggestedTag=Finding-triggered-by} [Used with base schema Increasing/Decreasing.] - ** Other-modulators-effect-EEG {requireChild} - *** # {takesValue, valueClass=textClass} [Free text.] - ** Facilitating-factor [Facilitating factors are defined as transient and sporadic endogenous or exogenous elements capable of augmenting seizure incidence (increasing the likelihood of seizure occurrence).] - *** Facilitating-factor-alcohol - **** # {takesValue, valueClass=textClass} [Free text.] - *** Facilitating-factor-awake - **** # {takesValue, valueClass=textClass} [Free text.] - *** Facilitating-factor-catamenial - **** # {takesValue, valueClass=textClass} [Free text.] - *** Facilitating-factor-fever - **** # {takesValue, valueClass=textClass} [Free text.] - *** Facilitating-factor-sleep - **** # {takesValue, valueClass=textClass} [Free text.] - *** Facilitating-factor-sleep-deprived - **** # {takesValue, valueClass=textClass} [Free text.] - *** Facilitating-factor-other {requireChild} - **** # {takesValue, valueClass=textClass} [Free text.] - ** Provocative-factor {requireChild} [Provocative factors are defined as transient and sporadic endogenous or exogenous elements capable of evoking/triggering seizures immediately following the exposure to it.] - *** Hyperventilation-provoked - **** # {takesValue, valueClass=textClass} [Free text.] - *** Reflex-provoked - **** # {takesValue, valueClass=textClass} [Free text.] - ** Medication-effect-clinical {suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified} [Medications clinical effect. Used with base schema Increasing/Decreasing.] - ** Medication-reduction-effect-clinical {suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified} [Medications reduction or withdrawal clinical effect. Used with base schema Increasing/Decreasing.] - ** Other-modulators-effect-clinical {requireChild} - *** # {takesValue, valueClass=textClass} [Free text.] - ** Intermittent-photic-stimulation-effect {requireChild} - *** Posterior-stimulus-dependent-intermittent-photic-stimulation-response {suggestedTag=Finding-frequency} - **** # {takesValue, valueClass=textClass} [Free text.] - *** Posterior-stimulus-independent-intermittent-photic-stimulation-response-limited {suggestedTag=Finding-frequency} [limited to the stimulus-train] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Posterior-stimulus-independent-intermittent-photic-stimulation-response-self-sustained {suggestedTag=Finding-frequency} - **** # {takesValue, valueClass=textClass} [Free text.] - *** Generalized-photoparoxysmal-intermittent-photic-stimulation-response-limited {suggestedTag=Finding-frequency} [Limited to the stimulus-train.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Generalized-photoparoxysmal-intermittent-photic-stimulation-response-self-sustained {suggestedTag=Finding-frequency} - **** # {takesValue, valueClass=textClass} [Free text.] - *** Activation-of-pre-existing-epileptogenic-area-intermittent-photic-stimulation-effect {suggestedTag=Finding-frequency} - **** # {takesValue, valueClass=textClass} [Free text.] - *** Unmodified-intermittent-photic-stimulation-effect - **** # {takesValue, valueClass=textClass} [Free text.] - ** Quality-of-hyperventilation {requireChild} - *** Hyperventilation-refused-procedure - **** # {takesValue, valueClass=textClass} [Free text.] - *** Hyperventilation-poor-effort - **** # {takesValue, valueClass=textClass} [Free text.] - *** Hyperventilation-good-effort - **** # {takesValue, valueClass=textClass} [Free text.] - *** Hyperventilation-excellent-effort - **** # {takesValue, valueClass=textClass} [Free text.] - ** Modulators-effect {requireChild} [Tags for describing the influence of the modulators] - *** Modulators-effect-continuous-during-NRS [Continuous during non-rapid-eye-movement-sleep (NRS)] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Modulators-effect-only-during - **** # {takesValue, valueClass=textClass} [Only during Sleep/Awakening/Hyperventilation/Physical effort/Cognitive task. Free text.] - *** Modulators-effect-change-of-patterns [Change of patterns during sleep/awakening.] - **** # {takesValue, valueClass=textClass} [Free text.] - * Time-related-property {requireChild} [Important to estimate how often an interictal abnormality is seen in the recording.] - ** Appearance-mode {requireChild, suggestedTag=Property-not-possible-to-determine} [Describes how the non-ictal EEG pattern/graphoelement is distributed through the recording.] - *** Random-appearance-mode [Occurrence of the non-ictal EEG pattern / graphoelement without any rhythmicity / periodicity.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Periodic-appearance-mode [Non-ictal EEG pattern / graphoelement occurring at an approximately regular rate / interval (generally of 1 to several seconds).] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Variable-appearance-mode [Occurrence of non-ictal EEG pattern / graphoelements, that is sometimes rhythmic or periodic, other times random, throughout the recording.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Intermittent-appearance-mode - **** # {takesValue, valueClass=textClass} [Free text.] - *** Continuous-appearance-mode - **** # {takesValue, valueClass=textClass} [Free text.] - ** Discharge-pattern {requireChild} [Describes the organization of the EEG signal within the discharge (distinguish between single and repetitive discharges)] - *** Single-discharge-pattern {suggestedTag=Finding-incidence} [Applies to the intra-burst pattern: a graphoelement that is not repetitive; before and after the graphoelement one can distinguish the background activity.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Rhythmic-trains-or-bursts-discharge-pattern {suggestedTag=Finding-prevalence, suggestedTag=Finding-frequency} [Applies to the intra-burst pattern: a non-ictal graphoelement that repeats itself without returning to the background activity between them. The graphoelements within this repetition occur at approximately constant period.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Arrhythmic-trains-or-bursts-discharge-pattern {suggestedTag=Finding-prevalence} [Applies to the intra-burst pattern: a non-ictal graphoelement that repeats itself without returning to the background activity between them. The graphoelements within this repetition occur at inconstant period.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Fragmented-discharge-pattern - **** # {takesValue, valueClass=textClass} [Free text.] - ** Periodic-discharge-time-related-features {requireChild} [Periodic discharges not further specified (PDs) time-relayed features tags.] - *** Periodic-discharge-duration {requireChild, suggestedTag=Property-not-possible-to-determine} - **** Very-brief-periodic-discharge-duration [Less than 10 sec.] - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Brief-periodic-discharge-duration [10 to 59 sec.] - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Intermediate-periodic-discharge-duration [1 to 4.9 min.] - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Long-periodic-discharge-duration [5 to 59 min.] - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Very-long-periodic-discharge-duration [Greater than 1 hour.] - ***** # {takesValue, valueClass=textClass} [Free text.] - *** Periodic-discharge-onset {requireChild, suggestedTag=Property-not-possible-to-determine} - **** Sudden-periodic-discharge-onset - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Gradual-periodic-discharge-onset - ***** # {takesValue, valueClass=textClass} [Free text.] - *** Periodic-discharge-dynamics {requireChild, suggestedTag=Property-not-possible-to-determine} - **** Evolving-periodic-discharge-dynamics - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Fluctuating-periodic-discharge-dynamics - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Static-periodic-discharge-dynamics - ***** # {takesValue, valueClass=textClass} [Free text.] - ** Finding-extent [Percentage of occurrence during the recording (background activity and interictal finding).] - *** # {takesValue, valueClass=numericClass} - ** Finding-incidence {requireChild} [How often it occurs/time-epoch.] - *** Only-once-finding-incidence - **** # {takesValue, valueClass=textClass} [Free text.] - *** Rare-finding-incidence [less than 1/h] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Uncommon-finding-incidence [1/5 min to 1/h.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Occasional-finding-incidence [1/min to 1/5min.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Frequent-finding-incidence [1/10 s to 1/min.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Abundant-finding-incidence [Greater than 1/10 s).] - **** # {takesValue, valueClass=textClass} [Free text.] - ** Finding-prevalence {requireChild} [The percentage of the recording covered by the train/burst.] - *** Rare-finding-prevalence [Less than 1 percent.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Occasional-finding-prevalence [1 to 9 percent.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Frequent-finding-prevalence [10 to 49 percent.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Abundant-finding-prevalence [50 to 89 percent.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Continuous-finding-prevalence [Greater than 90 percent.] - **** # {takesValue, valueClass=textClass} [Free text.] - * Posterior-dominant-rhythm-property {requireChild} [Posterior dominant rhythm is the most often scored EEG feature in clinical practice. Therefore, there are specific terms that can be chosen for characterizing the PDR.] - ** Posterior-dominant-rhythm-amplitude-range {requireChild, suggestedTag=Property-not-possible-to-determine} - *** Low-posterior-dominant-rhythm-amplitude-range [Low (less than 20 microV).] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Medium-posterior-dominant-rhythm-amplitude-range [Medium (between 20 and 70 microV).] - **** # {takesValue, valueClass=textClass} [Free text.] - *** High-posterior-dominant-rhythm-amplitude-range [High (more than 70 microV).] - **** # {takesValue, valueClass=textClass} [Free text.] - ** Posterior-dominant-rhythm-frequency-asymmetry {requireChild} [When symmetrical could be labeled with base schema Symmetrical tag.] - *** Posterior-dominant-rhythm-frequency-asymmetry-lower-left [Hz lower on the left side.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Posterior-dominant-rhythm-frequency-asymmetry-lower-right [Hz lower on the right side.] - **** # {takesValue, valueClass=textClass} [Free text.] - ** Posterior-dominant-rhythm-eye-opening-reactivity {suggestedTag=Property-not-possible-to-determine} [Change (disappearance or measurable decrease in amplitude) of a posterior dominant rhythm following eye-opening. Eye closure has the opposite effect.] - *** Posterior-dominant-rhythm-eye-opening-reactivity-reduced-left [Reduced left side reactivity.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Posterior-dominant-rhythm-eye-opening-reactivity-reduced-right [Reduced right side reactivity.] - **** # {takesValue, valueClass=textClass} [free text] - *** Posterior-dominant-rhythm-eye-opening-reactivity-reduced-both [Reduced reactivity on both sides.] - **** # {takesValue, valueClass=textClass} [Free text.] - ** Posterior-dominant-rhythm-organization {requireChild} [When normal could be labeled with base schema Normal tag.] - *** Posterior-dominant-rhythm-organization-poorly-organized [Poorly organized.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Posterior-dominant-rhythm-organization-disorganized [Disorganized.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Posterior-dominant-rhythm-organization-markedly-disorganized [Markedly disorganized.] - **** # {takesValue, valueClass=textClass} [Free text.] - ** Posterior-dominant-rhythm-caveat {requireChild} [Caveat to the annotation of PDR.] - *** No-posterior-dominant-rhythm-caveat - **** # {takesValue, valueClass=textClass} [Free text.] - *** Posterior-dominant-rhythm-caveat-only-open-eyes-during-the-recording - **** # {takesValue, valueClass=textClass} [Free text.] - *** Posterior-dominant-rhythm-caveat-sleep-deprived-caveat - **** # {takesValue, valueClass=textClass} [Free text.] - *** Posterior-dominant-rhythm-caveat-drowsy - **** # {takesValue, valueClass=textClass} [Free text.] - *** Posterior-dominant-rhythm-caveat-only-following-hyperventilation - ** Absence-of-posterior-dominant-rhythm {requireChild} [Reason for absence of PDR.] - *** Absence-of-posterior-dominant-rhythm-artifacts - **** # {takesValue, valueClass=textClass} [Free text.] - *** Absence-of-posterior-dominant-rhythm-extreme-low-voltage - **** # {takesValue, valueClass=textClass} [Free text.] - *** Absence-of-posterior-dominant-rhythm-eye-closure-could-not-be-achieved - **** # {takesValue, valueClass=textClass} [Free text.] - *** Absence-of-posterior-dominant-rhythm-lack-of-awake-period - **** # {takesValue, valueClass=textClass} [Free text.] - *** Absence-of-posterior-dominant-rhythm-lack-of-compliance - **** # {takesValue, valueClass=textClass} [Free text.] - *** Absence-of-posterior-dominant-rhythm-other-causes {requireChild} - **** # {takesValue, valueClass=textClass} [Free text.] - * Episode-property {requireChild} - ** Seizure-classification {requireChild} [Seizure classification refers to the grouping of seizures based on their clinical features, EEG patterns, and other characteristics. Epileptic seizures are named using the current ILAE seizure classification (Fisher et al., 2017, Beniczky et al., 2017).] - *** Motor-seizure [Involves musculature in any form. The motor event could consist of an increase (positive) or decrease (negative) in muscle contraction to produce a movement. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - *** Motor-onset-seizure {deprecatedFrom=1.0.0} - **** Myoclonic-motor-seizure [Sudden, brief ( lower than 100 msec) involuntary single or multiple contraction(s) of muscles(s) or muscle groups of variable topography (axial, proximal limb, distal). Myoclonus is less regularly repetitive and less sustained than is clonus. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Myoclonic-motor-onset-seizure {deprecatedFrom=1.0.0} - **** Negative-myoclonic-motor-seizure - **** Negative-myoclonic-motor-onset-seizure {deprecatedFrom=1.0.0} - **** Clonic-motor-seizure [Jerking, either symmetric or asymmetric, that is regularly repetitive and involves the same muscle groups. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Clonic-motor-onset-seizure {deprecatedFrom=1.0.0} - **** Tonic-motor-seizure [A sustained increase in muscle contraction lasting a few seconds to minutes. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Tonic-motor-onset-seizure {deprecatedFrom=1.0.0} - **** Atonic-motor-seizure [Sudden loss or diminution of muscle tone without apparent preceding myoclonic or tonic event lasting about 1 to 2 s, involving head, trunk, jaw, or limb musculature. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Atonic-motor-onset-seizure {deprecatedFrom=1.0.0} - **** Myoclonic-atonic-motor-seizure [A generalized seizure type with a myoclonic jerk leading to an atonic motor component. This type was previously called myoclonic astatic. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Myoclonic-atonic-motor-onset-seizure {deprecatedFrom=1.0.0} - **** Myoclonic-tonic-clonic-motor-seizure [One or a few jerks of limbs bilaterally, followed by a tonic clonic seizure. The initial jerks can be considered to be either a brief period of clonus or myoclonus. Seizures with this characteristic are common in juvenile myoclonic epilepsy. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Myoclonic-tonic-clonic-motor-onset-seizure {deprecatedFrom=1.0.0} - **** Tonic-clonic-motor-seizure [A sequence consisting of a tonic followed by a clonic phase. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Tonic-clonic-motor-onset-seizure {deprecatedFrom=1.0.0} - **** Automatism-motor-seizure [A more or less coordinated motor activity usually occurring when cognition is impaired and for which the subject is usually (but not always) amnesic afterward. This often resembles a voluntary movement and may consist of an inappropriate continuation of preictal motor activity. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Automatism-motor-onset-seizure {deprecatedFrom=1.0.0} - **** Hyperkinetic-motor-seizure - **** Hyperkinetic-motor-onset-seizure {deprecatedFrom=1.0.0} - **** Epileptic-spasm-episode [A sudden flexion, extension, or mixed extension flexion of predominantly proximal and truncal muscles that is usually more sustained than a myoclonic movement but not as sustained as a tonic seizure. Limited forms may occur: Grimacing, head nodding, or subtle eye movements. Epileptic spasms frequently occur in clusters. Infantile spasms are the best known form, but spasms can occur at all ages. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - *** Nonmotor-seizure [Focal or generalized seizure types in which motor activity is not prominent. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Behavior-arrest-nonmotor-seizure [Arrest (pause) of activities, freezing, immobilization, as in behavior arrest seizure. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Sensory-nonmotor-seizure [A perceptual experience not caused by appropriate stimuli in the external world. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Emotional-nonmotor-seizure [Seizures presenting with an emotion or the appearance of having an emotion as an early prominent feature, such as fear, spontaneous joy or euphoria, laughing (gelastic), or crying (dacrystic). Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Cognitive-nonmotor-seizure [Pertaining to thinking and higher cortical functions, such as language, spatial perception, memory, and praxis. The previous term for similar usage as a seizure type was psychic. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Autonomic-nonmotor-seizure [A distinct alteration of autonomic nervous system function involving cardiovascular, pupillary, gastrointestinal, sudomotor, vasomotor, and thermoregulatory functions. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - *** Absence-seizure [Absence seizures present with a sudden cessation of activity and awareness. Absence seizures tend to occur in younger age groups, have more sudden start and termination, and they usually display less complex automatisms than do focal seizures with impaired awareness, but the distinctions are not absolute. EEG information may be required for accurate classification. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Typical-absence-seizure [A sudden onset, interruption of ongoing activities, a blank stare, possibly a brief upward deviation of the eyes. Usually the patient will be unresponsive when spoken to. Duration is a few seconds to half a minute with very rapid recovery. Although not always available, an EEG would show generalized epileptiform discharges during the event. An absence seizure is by definition a seizure of generalized onset. The word is not synonymous with a blank stare, which also can be encountered with focal onset seizures. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Atypical-absence-seizure [An absence seizure with changes in tone that are more pronounced than in typical absence or the onset and/or cessation is not abrupt, often associated with slow, irregular, generalized spike-wave activity. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Myoclonic-absence-seizure [A myoclonic absence seizure refers to an absence seizure with rhythmic three-per-second myoclonic movements, causing ratcheting abduction of the upper limbs leading to progressive arm elevation, and associated with three-per-second generalized spike-wave discharges. Duration is typically 10 to 60 s. Impairment of consciousness may not be obvious. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Eyelid-myoclonia-absence-seizure [Eyelid myoclonia are myoclonic jerks of the eyelids and upward deviation of the eyes, often precipitated by closing the eyes or by light. Eyelid myoclonia can be associated with absences, but also can be motor seizures without a corresponding absence, making them difficult to categorize. The 2017 classification groups them with nonmotor (absence) seizures, which may seem counterintuitive, but the myoclonia in this instance is meant to link with absence, rather than with nonmotor. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - ** Episode-phase {requireChild, suggestedTag=Seizure-semiology-manifestation, suggestedTag=Postictal-semiology-manifestation, suggestedTag=Ictal-EEG-patterns} [The electroclinical findings (i.e., the seizure semiology and the ictal EEG) are divided in three phases: onset, propagation, and postictal.] - *** Episode-phase-initial - *** Episode-phase-subsequent - *** Episode-phase-postictal - ** Seizure-semiology-manifestation {requireChild} [Seizure semiology refers to the clinical features or signs that are observed during a seizure, such as the type of movements or behaviors exhibited by the person having the seizure, the duration of the seizure, the level of consciousness, and any associated symptoms such as aura or postictal confusion. In other words, seizure semiology describes the physical manifestations of a seizure. Semiology is described according to the ILAE Glossary of Descriptive Terminology for Ictal Semiology (Blume et al., 2001). Besides the name, the semiologic finding can also be characterized by the somatotopic modifier, laterality, body part and centricity. Uses Location-property tags.] - *** Semiology-motor-manifestation - **** Semiology-elementary-motor - ***** Semiology-motor-tonic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [A sustained increase in muscle contraction lasting a few seconds to minutes.] - ***** Semiology-motor-dystonic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Sustained contractions of both agonist and antagonist muscles producing athetoid or twisting movements, which, when prolonged, may produce abnormal postures.] - ***** Semiology-motor-epileptic-spasm {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [A sudden flexion, extension, or mixed extension flexion of predominantly proximal and truncal muscles that is usually more sustained than a myoclonic movement but not so sustained as a tonic seizure (i.e., about 1 s). Limited forms may occur: grimacing, head nodding. Frequent occurrence in clusters.] - ***** Semiology-motor-postural {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Adoption of a posture that may be bilaterally symmetric or asymmetric (as in a fencing posture).] - ***** Semiology-motor-versive {suggestedTag=Body-part-location, suggestedTag=Episode-event-count} [A sustained, forced conjugate ocular, cephalic, and/or truncal rotation or lateral deviation from the midline.] - ***** Semiology-motor-clonic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Myoclonus that is regularly repetitive, involves the same muscle groups, at a frequency of about 2 to 3 c/s, and is prolonged. Synonym: rhythmic myoclonus .] - ***** Semiology-motor-myoclonic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Characterized by myoclonus. MYOCLONUS : sudden, brief (lower than 100 ms) involuntary single or multiple contraction(s) of muscles(s) or muscle groups of variable topography (axial, proximal limb, distal).] - ***** Semiology-motor-jacksonian-march {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Term indicating spread of clonic movements through contiguous body parts unilaterally.] - ***** Semiology-motor-negative-myoclonus {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Characterized by negative myoclonus. NEGATIVE MYOCLONUS: interruption of tonic muscular activity for lower than 500 ms without evidence of preceding myoclonia.] - ***** Semiology-motor-tonic-clonic {requireChild} [A sequence consisting of a tonic followed by a clonic phase. Variants such as clonic-tonic-clonic may be seen. Asymmetry of limb posture during the tonic phase of a GTC: one arm is rigidly extended at the elbow (often with the fist clenched tightly and flexed at the wrist), whereas the opposite arm is flexed at the elbow.] - ****** Semiology-motor-tonic-clonic-without-figure-of-four {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} - ****** Semiology-motor-tonic-clonic-with-figure-of-four-extension-left-elbow {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} - ****** Semiology-motor-tonic-clonic-with-figure-of-four-extension-right-elbow {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} - ***** Semiology-motor-astatic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Loss of erect posture that results from an atonic, myoclonic, or tonic mechanism. Synonym: drop attack.] - ***** Semiology-motor-atonic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Sudden loss or diminution of muscle tone without apparent preceding myoclonic or tonic event lasting greater or equal to 1 to 2 s, involving head, trunk, jaw, or limb musculature.] - ***** Semiology-motor-eye-blinking {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count} - ***** Semiology-motor-other-elementary-motor {requireChild} - ****** # {takesValue, valueClass=textClass} [Free text.] - **** Semiology-motor-automatisms - ***** Semiology-motor-automatisms-mimetic {suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count} [Facial expression suggesting an emotional state, often fear.] - ***** Semiology-motor-automatisms-oroalimentary {suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count} [Lip smacking, lip pursing, chewing, licking, tooth grinding, or swallowing.] - ***** Semiology-motor-automatisms-dacrystic {suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count} [Bursts of crying.] - ***** Semiology-motor-automatisms-dyspraxic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count} [Inability to perform learned movements spontaneously or on command or imitation despite intact relevant motor and sensory systems and adequate comprehension and cooperation.] - ***** Semiology-motor-automatisms-manual {suggestedTag=Brain-laterality, suggestedTag=Brain-centricity, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count} [1. Indicates principally distal components, bilateral or unilateral. 2. Fumbling, tapping, manipulating movements.] - ***** Semiology-motor-automatisms-gestural {suggestedTag=Brain-laterality, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count} [Semipurposive, asynchronous hand movements. Often unilateral.] - ***** Semiology-motor-automatisms-pedal {suggestedTag=Brain-laterality, suggestedTag=Brain-centricity, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count} [1. Indicates principally distal components, bilateral or unilateral. 2. Fumbling, tapping, manipulating movements.] - ***** Semiology-motor-automatisms-hypermotor {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count} [1. Involves predominantly proximal limb or axial muscles producing irregular sequential ballistic movements, such as pedaling, pelvic thrusting, thrashing, rocking movements. 2. Increase in rate of ongoing movements or inappropriately rapid performance of a movement.] - ***** Semiology-motor-automatisms-hypokinetic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count} [A decrease in amplitude and/or rate or arrest of ongoing motor activity.] - ***** Semiology-motor-automatisms-gelastic {suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count} [Bursts of laughter or giggling, usually without an appropriate affective tone.] - ***** Semiology-motor-other-automatisms {requireChild} - ****** # {takesValue, valueClass=textClass} [Free text.] - **** Semiology-motor-behavioral-arrest {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Interruption of ongoing motor activity or of ongoing behaviors with fixed gaze, without movement of the head or trunk (oro-alimentary and hand automatisms may continue).] - *** Semiology-non-motor-manifestation - **** Semiology-sensory - ***** Semiology-sensory-headache {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count} [Headache occurring in close temporal proximity to the seizure or as the sole seizure manifestation.] - ***** Semiology-sensory-visual {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count} [Flashing or flickering lights, spots, simple patterns, scotomata, or amaurosis.] - ***** Semiology-sensory-auditory {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count} [Buzzing, drumming sounds or single tones.] - ***** Semiology-sensory-olfactory {suggestedTag=Body-part-location, suggestedTag=Episode-event-count} - ***** Semiology-sensory-gustatory {suggestedTag=Episode-event-count} [Taste sensations including acidic, bitter, salty, sweet, or metallic.] - ***** Semiology-sensory-epigastric {suggestedTag=Episode-event-count} [Abdominal discomfort including nausea, emptiness, tightness, churning, butterflies, malaise, pain, and hunger; sensation may rise to chest or throat. Some phenomena may reflect ictal autonomic dysfunction.] - ***** Semiology-sensory-somatosensory {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Tingling, numbness, electric-shock sensation, sense of movement or desire to move.] - ***** Semiology-sensory-painful {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Peripheral (lateralized/bilateral), cephalic, abdominal.] - ***** Semiology-sensory-autonomic-sensation {suggestedTag=Episode-event-count} [A sensation consistent with involvement of the autonomic nervous system, including cardiovascular, gastrointestinal, sudomotor, vasomotor, and thermoregulatory functions. (Thus autonomic aura; cf. autonomic events 3.0).] - ***** Semiology-sensory-other {requireChild} - ****** # {takesValue, valueClass=textClass} [Free text.] - **** Semiology-experiential - ***** Semiology-experiential-affective-emotional {suggestedTag=Episode-event-count} [Components include fear, depression, joy, and (rarely) anger.] - ***** Semiology-experiential-hallucinatory {suggestedTag=Episode-event-count} [Composite perceptions without corresponding external stimuli involving visual, auditory, somatosensory, olfactory, and/or gustatory phenomena. Example: hearing and seeing people talking.] - ***** Semiology-experiential-illusory {suggestedTag=Episode-event-count} [An alteration of actual percepts involving the visual, auditory, somatosensory, olfactory, or gustatory systems.] - ***** Semiology-experiential-mnemonic [Components that reflect ictal dysmnesia such as feelings of familiarity (deja-vu) and unfamiliarity (jamais-vu).] - ****** Semiology-experiential-mnemonic-Deja-vu {suggestedTag=Episode-event-count} - ****** Semiology-experiential-mnemonic-Jamais-vu {suggestedTag=Episode-event-count} - ***** Semiology-experiential-other {requireChild} - ****** # {takesValue, valueClass=textClass} [Free text.] - **** Semiology-dyscognitive {suggestedTag=Episode-event-count} [The term describes events in which (1) disturbance of cognition is the predominant or most apparent feature, and (2a) two or more of the following components are involved, or (2b) involvement of such components remains undetermined. Otherwise, use the more specific term (e.g., mnemonic experiential seizure or hallucinatory experiential seizure). Components of cognition: ++ perception: symbolic conception of sensory information ++ attention: appropriate selection of a principal perception or task ++ emotion: appropriate affective significance of a perception ++ memory: ability to store and retrieve percepts or concepts ++ executive function: anticipation, selection, monitoring of consequences, and initiation of motor activity including praxis, speech.] - **** Semiology-language-related - ***** Semiology-language-related-vocalization {suggestedTag=Episode-event-count} - ***** Semiology-language-related-verbalization {suggestedTag=Episode-event-count} - ***** Semiology-language-related-dysphasia {suggestedTag=Episode-event-count} - ***** Semiology-language-related-aphasia {suggestedTag=Episode-event-count} - ***** Semiology-language-related-other {requireChild} - ****** # {takesValue, valueClass=textClass} [Free text.] - **** Semiology-autonomic - ***** Semiology-autonomic-pupillary {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count} [Mydriasis, miosis (either bilateral or unilateral).] - ***** Semiology-autonomic-hypersalivation {suggestedTag=Episode-event-count} [Increase in production of saliva leading to uncontrollable drooling] - ***** Semiology-autonomic-respiratory-apnoeic {suggestedTag=Episode-event-count} [subjective shortness of breath, hyperventilation, stridor, coughing, choking, apnea, oxygen desaturation, neurogenic pulmonary edema.] - ***** Semiology-autonomic-cardiovascular {suggestedTag=Episode-event-count} [Modifications of heart rate (tachycardia, bradycardia), cardiac arrhythmias (such as sinus arrhythmia, sinus arrest, supraventricular tachycardia, atrial premature depolarizations, ventricular premature depolarizations, atrio-ventricular block, bundle branch block, atrioventricular nodal escape rhythm, asystole).] - ***** Semiology-autonomic-gastrointestinal {suggestedTag=Episode-event-count} [Nausea, eructation, vomiting, retching, abdominal sensations, abdominal pain, flatulence, spitting, diarrhea.] - ***** Semiology-autonomic-urinary-incontinence {suggestedTag=Episode-event-count} [urinary urge (intense urinary urge at the beginning of seizures), urinary incontinence, ictal urination (rare symptom of partial seizures without loss of consciousness).] - ***** Semiology-autonomic-genital {suggestedTag=Episode-event-count} [Sexual auras (erotic thoughts and feelings, sexual arousal and orgasm). Genital auras (unpleasant, sometimes painful, frightening or emotionally neutral somatosensory sensations in the genitals that can be accompanied by ictal orgasm). Sexual automatisms (hypermotor movements consisting of writhing, thrusting, rhythmic movements of the pelvis, arms and legs, sometimes associated with picking and rhythmic manipulation of the groin or genitalia, exhibitionism and masturbation).] - ***** Semiology-autonomic-vasomotor {suggestedTag=Episode-event-count} [Flushing or pallor (may be accompanied by feelings of warmth, cold and pain).] - ***** Semiology-autonomic-sudomotor {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count} [Sweating and piloerection (may be accompanied by feelings of warmth, cold and pain).] - ***** Semiology-autonomic-thermoregulatory {suggestedTag=Episode-event-count} [Hyperthermia, fever.] - ***** Semiology-autonomic-other {requireChild} - ****** # {takesValue, valueClass=textClass} [Free text.] - *** Semiology-manifestation-other {requireChild} - **** # {takesValue, valueClass=textClass} [Free text.] - ** Postictal-semiology-manifestation {requireChild} - *** Postictal-semiology-unconscious {suggestedTag=Episode-event-count} - *** Postictal-semiology-quick-recovery-of-consciousness {suggestedTag=Episode-event-count} [Quick recovery of awareness and responsiveness.] - *** Postictal-semiology-aphasia-or-dysphasia {suggestedTag=Episode-event-count} [Impaired communication involving language without dysfunction of relevant primary motor or sensory pathways, manifested as impaired comprehension, anomia, parahasic errors or a combination of these.] - *** Postictal-semiology-behavioral-change {suggestedTag=Episode-event-count} [Occurring immediately after a aseizure. Including psychosis, hypomanina, obsessive-compulsive behavior.] - *** Postictal-semiology-hemianopia {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count} [Postictal visual loss in a a hemi field.] - *** Postictal-semiology-impaired-cognition {suggestedTag=Episode-event-count} [Decreased Cognitive performance involving one or more of perception, attention, emotion, memory, execution, praxis, speech.] - *** Postictal-semiology-dysphoria {suggestedTag=Episode-event-count} [Depression, irritability, euphoric mood, fear, anxiety.] - *** Postictal-semiology-headache {suggestedTag=Episode-event-count} [Headache with features of tension-type or migraine headache that develops within 3 h following the seizure and resolves within 72 h after seizure.] - *** Postictal-semiology-nose-wiping {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count} [Noes-wiping usually within 60 sec of seizure offset, usually with the hand ipsilateral to the seizure onset.] - *** Postictal-semiology-anterograde-amnesia {suggestedTag=Episode-event-count} [Impaired ability to remember new material.] - *** Postictal-semiology-retrograde-amnesia {suggestedTag=Episode-event-count} [Impaired ability to recall previously remember material.] - *** Postictal-semiology-paresis {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Todds palsy. Any unilateral postictal dysfunction relating to motor, language, sensory and/or integrative functions.] - *** Postictal-semiology-sleep [Invincible need to sleep after a seizure.] - *** Postictal-semiology-unilateral-myoclonic-jerks [unilateral motor phenomena, other then specified, occurring in postictal phase.] - *** Postictal-semiology-other-unilateral-motor-phenomena {requireChild} - **** # {takesValue, valueClass=textClass} [Free text.] - ** Polygraphic-channel-relation-to-episode {requireChild, suggestedTag=Property-not-possible-to-determine} - *** Polygraphic-channel-cause-to-episode - *** Polygraphic-channel-consequence-of-episode - ** Ictal-EEG-patterns - *** Ictal-EEG-patterns-obscured-by-artifacts [The interpretation of the EEG is not possible due to artifacts.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Ictal-EEG-activity {suggestedTag=Polyspikes-morphology, suggestedTag=Fast-spike-activity-morphology, suggestedTag=Low-voltage-fast-activity-morphology, suggestedTag=Polysharp-waves-morphology, suggestedTag=Spike-and-slow-wave-morphology, suggestedTag=Polyspike-and-slow-wave-morphology, suggestedTag=Sharp-and-slow-wave-morphology, suggestedTag=Rhythmic-activity-morphology, suggestedTag=Slow-wave-large-amplitude-morphology, suggestedTag=Irregular-delta-or-theta-activity-morphology, suggestedTag=Electrodecremental-change-morphology, suggestedTag=DC-shift-morphology, suggestedTag=Disappearance-of-ongoing-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Source-analysis-laterality, suggestedTag=Source-analysis-brain-region, suggestedTag=Episode-event-count} - *** Postictal-EEG-activity {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity} - ** Episode-time-context-property [Additional clinically relevant features related to episodes can be scored under timing and context. If needed, episode duration can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Temporal-value/Duration.] - *** Episode-consciousness {requireChild, suggestedTag=Property-not-possible-to-determine} - **** Episode-consciousness-not-tested - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Episode-consciousness-affected - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Episode-consciousness-mildly-affected - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Episode-consciousness-not-affected - ***** # {takesValue, valueClass=textClass} [Free text.] - *** Episode-awareness {suggestedTag=Property-not-possible-to-determine, suggestedTag=Property-exists, suggestedTag=Property-absence} - **** # {takesValue, valueClass=textClass} [Free text.] - *** Clinical-EEG-temporal-relationship {suggestedTag=Property-not-possible-to-determine} - **** Clinical-start-followed-EEG [Clinical start, followed by EEG start by X seconds.] - ***** # {takesValue, valueClass=numericClass, unitClass=timeUnits} - **** EEG-start-followed-clinical [EEG start, followed by clinical start by X seconds.] - ***** # {takesValue, valueClass=numericClass, unitClass=timeUnits} - **** Simultaneous-start-clinical-EEG - **** Clinical-EEG-temporal-relationship-notes [Clinical notes to annotate the clinical-EEG temporal relationship.] - ***** # {takesValue, valueClass=textClass} - *** Episode-event-count {suggestedTag=Property-not-possible-to-determine} [Number of stereotypical episodes during the recording.] - **** # {takesValue, valueClass=numericClass} - *** State-episode-start {requireChild, suggestedTag=Property-not-possible-to-determine} [State at the start of the episode.] - **** Episode-start-from-sleep - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Episode-start-from-awake - ***** # {takesValue, valueClass=textClass} [Free text.] - *** Episode-postictal-phase {suggestedTag=Property-not-possible-to-determine} - **** # {takesValue, valueClass=numericClass, unitClass=timeUnits} - *** Episode-prodrome {suggestedTag=Property-exists, suggestedTag=Property-absence} [Prodrome is a preictal phenomenon, and it is defined as a subjective or objective clinical alteration (e.g., ill-localized sensation or agitation) that heralds the onset of an epileptic seizure but does not form part of it (Blume et al., 2001). Therefore, prodrome should be distinguished from aura (which is an ictal phenomenon).] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Episode-tongue-biting {suggestedTag=Property-exists, suggestedTag=Property-absence} - **** # {takesValue, valueClass=textClass} [Free text.] - *** Episode-responsiveness {requireChild, suggestedTag=Property-not-possible-to-determine} - **** Episode-responsiveness-preserved - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Episode-responsiveness-affected - ***** # {takesValue, valueClass=textClass} [Free text.] - *** Episode-appearance {requireChild} - **** Episode-appearance-interactive - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Episode-appearance-spontaneous - ***** # {takesValue, valueClass=textClass} [Free text.] - *** Seizure-dynamics {requireChild} [Spatiotemporal dynamics can be scored (evolution in morphology; evolution in frequency; evolution in location).] - **** Seizure-dynamics-evolution-morphology - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Seizure-dynamics-evolution-frequency - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Seizure-dynamics-evolution-location - ***** # {takesValue, valueClass=textClass} [Free text.] - **** Seizure-dynamics-not-possible-to-determine [Not possible to determine.] - ***** # {takesValue, valueClass=textClass} [Free text.] - * Other-finding-property {requireChild} - ** Artifact-significance-to-recording {requireChild} [It is important to score the significance of the described artifacts: recording is not interpretable, recording of reduced diagnostic value, does not interfere with the interpretation of the recording.] - *** Recording-not-interpretable-due-to-artifact - **** # {takesValue, valueClass=textClass} [Free text.] - *** Recording-of-reduced-diagnostic-value-due-to-artifact - **** # {takesValue, valueClass=textClass} [Free text.] - *** Artifact-does-not-interfere-recording - **** # {takesValue, valueClass=textClass} [Free text.] - ** Finding-significance-to-recording {requireChild} [Significance of finding. When normal/abnormal could be labeled with base schema Normal/Abnormal tags.] - *** Finding-no-definite-abnormality - **** # {takesValue, valueClass=textClass} [Free text.] - *** Finding-significance-not-possible-to-determine [Not possible to determine.] - **** # {takesValue, valueClass=textClass} [Free text.] - ** Finding-frequency [Value in Hz (number) typed in.] - *** # {takesValue, valueClass=numericClass, unitClass=frequencyUnits} - ** Finding-amplitude [Value in microvolts (number) typed in.] - *** # {takesValue, valueClass=numericClass, unitClass=electricPotentialUnits} - ** Finding-amplitude-asymmetry {requireChild} [For posterior dominant rhythm: a difference in amplitude between the homologous area on opposite sides of the head that consistently exceeds 50 percent. When symmetrical could be labeled with base schema Symmetrical tag. For sleep: Absence or consistently marked amplitude asymmetry (greater than 50 percent) of a normal sleep graphoelement.] - *** Finding-amplitude-asymmetry-lower-left [Amplitude lower on the left side.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Finding-amplitude-asymmetry-lower-right [Amplitude lower on the right side.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Finding-amplitude-asymmetry-not-possible-to-determine [Not possible to determine.] - **** # {takesValue, valueClass=textClass} [Free text.] - ** Finding-stopped-by - *** # {takesValue, valueClass=textClass} [Free text.] - ** Finding-triggered-by - *** # {takesValue, valueClass=textClass} [Free text.] - ** Finding-unmodified - *** # {takesValue, valueClass=textClass} [Free text.] - ** Property-not-possible-to-determine [Not possible to determine.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Property-exists - *** # {takesValue, valueClass=textClass} [Free text.] - ** Property-absence - *** # {takesValue, valueClass=textClass} [Free text.] - -'''Interictal-finding''' {requireChild} [EEG pattern / transient that is distinguished form the background activity, considered abnormal, but is not recorded during ictal period (seizure) or postictal period; the presence of an interictal finding does not necessarily imply that the patient has epilepsy.] - * Epileptiform-interictal-activity {suggestedTag=Spike-morphology, suggestedTag=Spike-and-slow-wave-morphology, suggestedTag=Runs-of-rapid-spikes-morphology, suggestedTag=Polyspikes-morphology, suggestedTag=Polyspike-and-slow-wave-morphology, suggestedTag=Sharp-wave-morphology, suggestedTag=Sharp-and-slow-wave-morphology, suggestedTag=Slow-sharp-wave-morphology, suggestedTag=High-frequency-oscillation-morphology, suggestedTag=Hypsarrhythmia-classic-morphology, suggestedTag=Hypsarrhythmia-modified-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-propagation, suggestedTag=Multifocal-finding, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, suggestedTag=Finding-incidence} - * Abnormal-interictal-rhythmic-activity {suggestedTag=Rhythmic-activity-morphology, suggestedTag=Polymorphic-delta-activity-morphology, suggestedTag=Frontal-intermittent-rhythmic-delta-activity-morphology, suggestedTag=Occipital-intermittent-rhythmic-delta-activity-morphology, suggestedTag=Temporal-intermittent-rhythmic-delta-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, suggestedTag=Finding-incidence} - * Interictal-special-patterns {requireChild} - ** Interictal-periodic-discharges {suggestedTag=Periodic-discharge-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Periodic-discharge-time-related-features} [Periodic discharge not further specified (PDs).] - *** Generalized-periodic-discharges [GPDs.] - *** Lateralized-periodic-discharges [LPDs.] - *** Bilateral-independent-periodic-discharges [BIPDs.] - *** Multifocal-periodic-discharges [MfPDs.] - ** Extreme-delta-brush {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} - -'''Physiologic-pattern''' {requireChild} [EEG graphoelements or rhythms that are considered normal. They only should be scored if the physician considers that they have a specific clinical significance for the recording.] - * Rhythmic-activity-pattern {suggestedTag=Rhythmic-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Not further specified.] - * Slow-alpha-variant-rhythm {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Characteristic rhythms mostly at 4-5 Hz, recorded most prominently over the posterior regions of the head. Generally alternate, or are intermixed, with alpha rhythm to which they often are harmonically related. Amplitude varies but is frequently close to 50 micro V. Blocked or attenuated by attention, especially visual, and mental effort. Comment: slow alpha variant rhythms should be distinguished from posterior slow waves characteristic of children and adolescents and occasionally seen in young adults.] - * Fast-alpha-variant-rhythm {suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Characteristic rhythm at 14-20 Hz, detected most prominently over the posterior regions of the head. May alternate or be intermixed with alpha rhythm. Blocked or attenuated by attention, especially visual, and mental effort.] - * Ciganek-rhythm {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Midline theta rhythm (Ciganek rhythm) may be observed during wakefulness or drowsiness. The frequency is 4-7 Hz, and the location is midline (ie, vertex). The morphology is rhythmic, smooth, sinusoidal, arciform, spiky, or mu-like.] - * Lambda-wave {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Diphasic sharp transient occurring over occipital regions of the head of waking subjects during visual exploration. The main component is positive relative to other areas. Time-locked to saccadic eye movement. Amplitude varies but is generally below 50 micro V.] - * Posterior-slow-waves-youth {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Waves in the delta and theta range, of variable form, lasting 0.35 to 0.5 s or longer without any consistent periodicity, found in the range of 6-12 years (occasionally seen in young adults). Alpha waves are almost always intermingled or superimposed. Reactive similar to alpha activity.] - * Diffuse-slowing-hyperventilation {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Diffuse slowing induced by hyperventilation. Bilateral, diffuse slowing during hyperventilation. Recorded in 70 percent of normal children (3-5 years) and less then 10 percent of adults. Usually appear in the posterior regions and spread forward in younger age group, whereas they tend to appear in the frontal regions and spread backward in the older age group.] - * Photic-driving {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Physiologic response consisting of rhythmic activity elicited over the posterior regions of the head by repetitive photic stimulation at frequencies of about 5-30 Hz. Comments: term should be limited to activity time-locked to the stimulus and of frequency identical or harmonically related to the stimulus frequency. Photic driving should be distinguished from the visual evoked potentials elicited by isolated flashes of light or flashes repeated at very low frequency.] - * Photomyogenic-response {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [A response to intermittent photic stimulation characterized by the appearance in the record of brief, repetitive muscular artifacts (spikes) over the anterior regions of the head. These often increase gradually in amplitude as stimuli are continued and cease promptly when the stimulus is withdrawn. Comment: this response is frequently associated with flutter of the eyelids and vertical oscillations of the eyeballs and sometimes with discrete jerking mostly involving the musculature of the face and head. (Preferred to synonym: photo-myoclonic response).] - * Other-physiologic-pattern {requireChild} - ** # {takesValue, valueClass=textClass} [Free text.] - -'''Polygraphic-channel-finding''' {requireChild} [Changes observed in polygraphic channels can be scored: EOG, Respiration, ECG, EMG, other polygraphic channel (+ free text), and their significance logged (normal, abnormal, no definite abnormality).] - * EOG-channel-finding {suggestedTag=Finding-significance-to-recording} [ElectroOculoGraphy.] - ** # {takesValue, valueClass=textClass} [Free text.] - * Respiration-channel-finding {suggestedTag=Finding-significance-to-recording} - ** Respiration-oxygen-saturation - *** # {takesValue, valueClass=numericClass} - ** Respiration-feature - *** Apnoe-respiration [Add duration (range in seconds) and comments in free text.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Hypopnea-respiration [Add duration (range in seconds) and comments in free text] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Apnea-hypopnea-index-respiration {requireChild} [Events/h. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Periodic-respiration - **** # {takesValue, valueClass=textClass} [Free text.] - *** Tachypnea-respiration {requireChild} [Cycles/min. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Other-respiration-feature {requireChild} - **** # {takesValue, valueClass=textClass} [Free text.] - * ECG-channel-finding {suggestedTag=Finding-significance-to-recording} [Electrocardiography.] - ** ECG-QT-period - *** # {takesValue, valueClass=textClass} [Free text.] - ** ECG-feature - *** ECG-sinus-rhythm [Normal rhythm. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] - **** # {takesValue, valueClass=textClass} [Free text.] - *** ECG-arrhythmia - **** # {takesValue, valueClass=textClass} [Free text.] - *** ECG-asystolia [Add duration (range in seconds) and comments in free text.] - **** # {takesValue, valueClass=textClass} [Free text.] - *** ECG-bradycardia [Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] - **** # {takesValue, valueClass=textClass} [Free text.] - *** ECG-extrasystole - **** # {takesValue, valueClass=textClass} [Free text.] - *** ECG-ventricular-premature-depolarization [Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] - **** # {takesValue, valueClass=textClass} [Free text.] - *** ECG-tachycardia [Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] - **** # {takesValue, valueClass=textClass} [Free text.] - *** Other-ECG-feature {requireChild} - **** # {takesValue, valueClass=textClass} [Free text.] - * EMG-channel-finding {suggestedTag=Finding-significance-to-recording} [electromyography] - ** EMG-muscle-side - *** EMG-left-muscle - **** # {takesValue, valueClass=textClass} [Free text.] - *** EMG-right-muscle - **** # {takesValue, valueClass=textClass} [Free text.] - *** EMG-bilateral-muscle - **** # {takesValue, valueClass=textClass} [Free text.] - ** EMG-muscle-name - *** # {takesValue, valueClass=textClass} [Free text.] - ** EMG-feature - *** EMG-myoclonus - **** Negative-myoclonus - ***** # {takesValue, valueClass=textClass} [Free text.] - **** EMG-myoclonus-rhythmic - ***** # {takesValue, valueClass=textClass} [Free text.] - **** EMG-myoclonus-arrhythmic - ***** # {takesValue, valueClass=textClass} [Free text.] - **** EMG-myoclonus-synchronous - ***** # {takesValue, valueClass=textClass} [Free text.] - **** EMG-myoclonus-asynchronous - ***** # {takesValue, valueClass=textClass} [Free text.] - *** EMG-PLMS [Periodic limb movements in sleep.] - *** EMG-spasm - **** # {takesValue, valueClass=textClass} [Free text.] - *** EMG-tonic-contraction - **** # {takesValue, valueClass=textClass} [Free text.] - *** EMG-asymmetric-activation {requireChild} - **** EMG-asymmetric-activation-left-first - ***** # {takesValue, valueClass=textClass} [Free text.] - **** EMG-asymmetric-activation-right-first - ***** # {takesValue, valueClass=textClass} [Free text.] - *** Other-EMG-features {requireChild} - **** # {takesValue, valueClass=textClass} [Free text.] - * Other-polygraphic-channel {requireChild} - ** # {takesValue, valueClass=textClass} [Free text.] - -'''Sleep-and-drowsiness''' {requireChild} [The features of the ongoing activity during sleep are scored here. If abnormal graphoelements appear, disappear or change their morphology during sleep, that is not scored here but at the entry corresponding to that graphooelement (as a modulator).] - * Sleep-architecture {suggestedTag=Property-not-possible-to-determine} [For longer recordings. Only to be scored if whole-night sleep is part of the recording. It is a global descriptor of the structure and pattern of sleep: estimation of the amount of time spent in REM and NREM sleep, sleep duration, NREM-REM cycle.] - ** Normal-sleep-architecture - ** Abnormal-sleep-architecture - * Sleep-stage-reached {requireChild, suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-significance-to-recording} [For normal sleep patterns the sleep stages reached during the recording can be specified] - ** Sleep-stage-N1 [Sleep stage 1.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Sleep-stage-N2 [Sleep stage 2.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Sleep-stage-N3 [Sleep stage 3.] - *** # {takesValue, valueClass=textClass} [Free text.] - ** Sleep-stage-REM [Rapid eye movement.] - *** # {takesValue, valueClass=textClass} [Free text.] - * Sleep-spindles {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry} [Burst at 11-15 Hz but mostly at 12-14 Hz generally diffuse but of higher voltage over the central regions of the head, occurring during sleep. Amplitude varies but is mostly below 50 microV in the adult.] - * Arousal-pattern {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Arousal pattern in children. Prolonged, marked high voltage 4-6/s activity in all leads with some intermixed slower frequencies, in children.] - * Frontal-arousal-rhythm {suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Prolonged (up to 20s) rhythmical sharp or spiky activity over the frontal areas (maximum over the frontal midline) seen at arousal from sleep in children with minimal cerebral dysfunction.] - * Vertex-wave {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry} [Sharp potential, maximal at the vertex, negative relative to other areas, apparently occurring spontaneously during sleep or in response to a sensory stimulus during sleep or wakefulness. May be single or repetitive. Amplitude varies but rarely exceeds 250 microV. Abbreviation: V wave. Synonym: vertex sharp wave.] - * K-complex {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry} [A burst of somewhat variable appearance, consisting most commonly of a high voltage negative slow wave followed by a smaller positive slow wave frequently associated with a sleep spindle. Duration greater than 0.5 s. Amplitude is generally maximal in the frontal vertex. K complexes occur during nonREM sleep, apparently spontaneously, or in response to sudden sensory / auditory stimuli, and are not specific for any individual sensory modality.] - * Saw-tooth-waves {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry} [Vertex negative 2-5 Hz waves occuring in series during REM sleep] - * POSTS {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry} [Positive occipital sharp transients of sleep. Sharp transient maximal over the occipital regions, positive relative to other areas, apparently occurring spontaneously during sleep. May be single or repetitive. Amplitude varies but is generally bellow 50 microV.] - * Hypnagogic-hypersynchrony {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry} [Bursts of bilateral, synchronous delta or theta activity of large amplitude, occasionally with superimposed faster components, occurring during falling asleep or during awakening, in children.] - * Non-reactive-sleep [EEG activity consisting of normal sleep graphoelements, but which cannot be interrupted by external stimuli/ the patient cannot be waken.] - -'''Uncertain-significant-pattern''' {requireChild} [EEG graphoelements or rhythms that resemble abnormal patterns but that are not necessarily associated with a pathology, and the physician does not consider them abnormal in the context of the scored recording (like normal variants and patterns).] - * Sharp-transient-pattern {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} - * Wicket-spikes [Spike-like monophasic negative single waves or trains of waves occurring over the temporal regions during drowsiness that have an arcuate or mu-like appearance. These are mainly seen in older individuals and represent a benign variant that is of little clinical significance.] - * Small-sharp-spikes {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Benign epileptiform Transients of Sleep (BETS). Small sharp spikes (SSS) of very short duration and low amplitude, often followed by a small theta wave, occurring in the temporal regions during drowsiness and light sleep. They occur on one or both sides (often asynchronously). The main negative and positive components are of about equally spiky character. Rarely seen in children, they are seen most often in adults and the elderly. Two thirds of the patients have a history of epileptic seizures.] - * Fourteen-six-Hz-positive-burst {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Burst of arch-shaped waves at 13-17 Hz and/or 5-7-Hz but most commonly at 14 and or 6 Hz seen generally over the posterior temporal and adjacent areas of one or both sides of the head during sleep. The sharp peaks of its component waves are positive with respect to other regions. Amplitude varies but is generally below 75 micro V. Comments: (1) best demonstrated by referential recording using contralateral earlobe or other remote, reference electrodes. (2) This pattern has no established clinical significance.] - * Six-Hz-spike-slow-wave {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Spike and slow wave complexes at 4-7Hz, but mostly at 6 Hz occurring generally in brief bursts bilaterally and synchronously, symmetrically or asymmetrically, and either confined to or of larger amplitude over the posterior or anterior regions of the head. The spike has a strong positive component. Amplitude varies but is generally smaller than that of spike-and slow-wave complexes repeating at slower rates. Comment: this pattern should be distinguished from epileptiform discharges. Synonym: wave and spike phantom.] - * Rudimentary-spike-wave-complex {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Synonym: Pseudo petit mal discharge. Paroxysmal discharge that consists of generalized or nearly generalized high voltage 3 to 4/sec waves with poorly developed spike in the positive trough between the slow waves, occurring in drowsiness only. It is found only in infancy and early childhood when marked hypnagogic rhythmical theta activity is paramount in the drowsy state.] - * Slow-fused-transient {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [A posterior slow-wave preceded by a sharp-contoured potential that blends together with the ensuing slow wave, in children.] - * Needle-like-occipital-spikes-blind {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Spike discharges of a particularly fast and needle-like character develop over the occipital region in most congenitally blind children. Completely disappear during childhood or adolescence.] - * Subclinical-rhythmic-EEG-discharge-adults {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Subclinical rhythmic EEG discharge of adults (SERDA). A rhythmic pattern seen in the adult age group, mainly in the waking state or drowsiness. It consists of a mixture of frequencies, often predominant in the theta range. The onset may be fairly abrupt with widespread sharp rhythmical theta and occasionally with delta activity. As to the spatial distribution, a maximum of this discharge is usually found over the centroparietal region and especially over the vertex. It may resemble a seizure discharge but is not accompanied by any clinical signs or symptoms.] - * Rhythmic-temporal-theta-burst-drowsiness [Rhythmic temporal theta burst of drowsiness (RTTD). Characteristic burst of 4-7 Hz waves frequently notched by faster waves, occurring over the temporal regions of the head during drowsiness. Synonym: psychomotor variant pattern. Comment: this is a pattern of drowsiness that is of no clinical significance.] - * Temporal-slowing-elderly {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Focal theta and/or delta activity over the temporal regions, especially the left, in persons over the age of 60. Amplitudes are low/similar to the background activity. Comment: focal temporal theta was found in 20 percent of people between the ages of 40-59 years, and 40 percent of people between 60 and 79 years. One third of people older than 60 years had focal temporal delta activity.] - * Breach-rhythm {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Rhythmical activity recorded over cranial bone defects. Usually it is in the 6 to 11/sec range, does not respond to movements.] - * Other-uncertain-significant-pattern {requireChild} - ** # {takesValue, valueClass=textClass} [Free text.] - - -!# end schema - -'''Unit classes''' - -'''Unit modifiers''' - -'''Value classes''' - -'''Schema attributes''' - -'''Properties''' -'''Epilogue''' -The Standardized Computer-based Organized Reporting of EEG (SCORE) is a standard terminology for scalp EEG data assessment designed for use in clinical practice that may also be used for research purposes. -The SCORE standard defines terms for describing phenomena observed in scalp EEG data. It is also potentially applicable (with some suitable extensions) to EEG recorded in critical care and neonatal settings. -The SCORE standard received European consensus and has been endorsed by the European Chapter of the International Federation of Clinical Neurophysiology (IFCN) and the International League Against Epilepsy (ILAE) Commission on European Affairs. -A second revised and extended version of SCORE achieved international consensus. - -[1] Beniczky, Sandor, et al. "Standardized computer based organized reporting of EEG: SCORE." Epilepsia 54.6 (2013). -[2] Beniczky, Sandor, et al. "Standardized computer based organized reporting of EEG: SCORE second version." Clinical Neurophysiology 128.11 (2017). - -TPA, March 2023 - -!# end hed diff --git a/tests/data/schema_tests/merge_tests/HED_score_merged.mediawiki b/tests/data/schema_tests/merge_tests/HED_score_merged.mediawiki index 6415eb02a..b11dd9830 100644 --- a/tests/data/schema_tests/merge_tests/HED_score_merged.mediawiki +++ b/tests/data/schema_tests/merge_tests/HED_score_merged.mediawiki @@ -1,2177 +1,2177 @@ -HED version="1.1.0" library="score" withStandard="8.2.0" - -'''Prologue''' -This schema is a Hierarchical Event Descriptors (HED) Library Schema implementation of Standardized Computer-based Organized Reporting of EEG (SCORE)[1,2] for describing events occurring during neuroimaging time series recordings. -The HED-SCORE library schema allows neurologists, neurophysiologists, and brain researchers to annotate electrophysiology recordings using terms from an internationally accepted set of defined terms (SCORE) compatible with the HED framework. -The resulting annotations are understandable to clinicians and directly usable in computer analysis. - -Future extensions may be implemented in the HED-SCORE library schema. -For more information see https://hed-schema-library.readthedocs.io/en/latest/index.html. - -!# start schema - -'''Event''' {suggestedTag=Task-property} [Something that happens at a given time and (typically) place. Elements of this tag subtree designate the general category in which an event falls.] - * Sensory-event {suggestedTag=Task-event-role, suggestedTag=Sensory-presentation} [Something perceivable by the participant. An event meant to be an experimental stimulus should include the tag Task-property/Task-event-role/Experimental-stimulus.] - * Agent-action {suggestedTag=Task-event-role, suggestedTag=Agent} [Any action engaged in by an agent (see the Agent subtree for agent categories). A participant response to an experiment stimulus should include the tag Agent-property/Agent-task-role/Experiment-participant.] - * Data-feature {suggestedTag=Data-property} [An event marking the occurrence of a data feature such as an interictal spike or alpha burst that is often added post hoc to the data record.] - * Experiment-control [An event pertaining to the physical control of the experiment during its operation.] - * Experiment-procedure [An event indicating an experimental procedure, as in performing a saliva swab during the experiment or administering a survey.] - * Experiment-structure [An event specifying a change-point of the structure of experiment. This event is typically used to indicate a change in experimental conditions or tasks.] - * Measurement-event {suggestedTag=Data-property} [A discrete measure returned by an instrument.] - -'''Agent''' {suggestedTag=Agent-property} [Someone or something that takes an active role or produces a specified effect.The role or effect may be implicit. Being alive or performing an activity such as a computation may qualify something to be an agent. An agent may also be something that simulates something else.] - * Animal-agent [An agent that is an animal.] - * Avatar-agent [An agent associated with an icon or avatar representing another agent.] - * Controller-agent [An agent experiment control software or hardware.] - * Human-agent [A person who takes an active role or produces a specified effect.] - * Robotic-agent [An agent mechanical device capable of performing a variety of often complex tasks on command or by being programmed in advance.] - * Software-agent [An agent computer program.] - -'''Modulator''' {requireChild, inLibrary=score} [External stimuli / interventions or changes in the alertness level (sleep) that modify: the background activity, or how often a graphoelement is occurring, or change other features of the graphoelement (like intra-burst frequency). For each observed finding, there is an option of specifying how they are influenced by the modulators and procedures that were done during the recording.] - * Sleep-modulator {inLibrary=score} - ** Sleep-deprivation {inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Sleep-following-sleep-deprivation {inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Natural-sleep {inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Induced-sleep {inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Drowsiness {inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Awakening {inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - * Medication-modulator {inLibrary=score} - ** Medication-administered-during-recording {inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Medication-withdrawal-or-reduction-during-recording {inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - * Eye-modulator {inLibrary=score} - ** Manual-eye-closure {inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Manual-eye-opening {inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - * Stimulation-modulator {inLibrary=score} - ** Intermittent-photic-stimulation {requireChild, suggestedTag=Intermittent-photic-stimulation-effect, inLibrary=score} - *** # {takesValue, valueClass=numericClass, unitClass=frequencyUnits, inLibrary=score} - ** Auditory-stimulation {inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Nociceptive-stimulation {inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - * Hyperventilation {inLibrary=score} - ** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - * Physical-effort {inLibrary=score} - ** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - * Cognitive-task {inLibrary=score} - ** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - * Other-modulator-or-procedure {requireChild, inLibrary=score} - ** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - -'''Background-activity''' {requireChild, inLibrary=score} [An EEG activity representing the setting in which a given normal or abnormal pattern appears and from which such pattern is distinguished.] - * Posterior-dominant-rhythm {suggestedTag=Finding-significance-to-recording, suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude-asymmetry, suggestedTag=Posterior-dominant-rhythm-property, inLibrary=score} [Rhythmic activity occurring during wakefulness over the posterior regions of the head, generally with maximum amplitudes over the occipital areas. Amplitude varies. Best seen with eyes closed and during physical relaxation and relative mental inactivity. Blocked or attenuated by attention, especially visual, and mental effort. In adults this is the alpha rhythm, and the frequency is 8 to 13 Hz. However the frequency can be higher or lower than this range (often a supra or sub harmonic of alpha frequency) and is called alpha variant rhythm (fast and slow alpha variant rhythm). In children, the normal range of the frequency of the posterior dominant rhythm is age-dependant.] - * Mu-rhythm {suggestedTag=Finding-frequency, suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, inLibrary=score} [EEG rhythm at 7-11 Hz composed of arch-shaped waves occurring over the central or centro-parietal regions of the scalp during wakefulness. Amplitudes varies but is mostly below 50 microV. Blocked or attenuated most clearly by contralateral movement, thought of movement, readiness to move or tactile stimulation.] - * Other-organized-rhythm {requireChild, suggestedTag=Rhythmic-activity-morphology, suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [EEG activity that consisting of waves of approximately constant period, which is considered as part of the background (ongoing) activity, but does not fulfill the criteria of the posterior dominant rhythm.] - ** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - * Background-activity-special-feature {requireChild, inLibrary=score} [Special Features. Special features contains scoring options for the background activity of critically ill patients.] - ** Continuous-background-activity {suggestedTag=Rhythmic-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent, inLibrary=score} - ** Nearly-continuous-background-activity {suggestedTag=Rhythmic-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent, inLibrary=score} - ** Discontinuous-background-activity {suggestedTag=Rhythmic-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent, inLibrary=score} - ** Background-burst-suppression {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent, inLibrary=score} [EEG pattern consisting of bursts (activity appearing and disappearing abruptly) interrupted by periods of low amplitude (below 20 microV) and which occurs simultaneously over all head regions.] - ** Background-burst-attenuation {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent, inLibrary=score} - ** Background-activity-suppression {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent, suggestedTag=Appearance-mode, inLibrary=score} [Periods showing activity under 10 microV (referential montage) and interrupting the background (ongoing) activity.] - ** Electrocerebral-inactivity {inLibrary=score} [Absence of any ongoing cortical electric activities; in all leads EEG is isoelectric or only contains artifacts. Sensitivity has to be increased up to 2 microV/mm; recording time: at least 30 minutes.] - -'''Action''' {extensionAllowed} [Do something.] - * Communicate [Convey knowledge of or information about something.] - ** Communicate-gesturally {relatedTag=Move-face, relatedTag=Move-upper-extremity} [Communicate nonverbally using visible bodily actions, either in place of speech or together and in parallel with spoken words. Gestures include movement of the hands, face, or other parts of the body.] - *** Clap-hands [Strike the palms of against one another resoundingly, and usually repeatedly, especially to express approval.] - *** Clear-throat {relatedTag=Move-face, relatedTag=Move-head} [Cough slightly so as to speak more clearly, attract attention, or to express hesitancy before saying something awkward.] - *** Frown {relatedTag=Move-face} [Express disapproval, displeasure, or concentration, typically by turning down the corners of the mouth.] - *** Grimace {relatedTag=Move-face} [Make a twisted expression, typically expressing disgust, pain, or wry amusement.] - *** Nod-head {relatedTag=Move-head} [Tilt head in alternating up and down arcs along the sagittal plane. It is most commonly, but not universally, used to indicate agreement, acceptance, or acknowledgement.] - *** Pump-fist {relatedTag=Move-upper-extremity} [Raise with fist clenched in triumph or affirmation.] - *** Raise-eyebrows {relatedTag=Move-face, relatedTag=Move-eyes} [Move eyebrows upward.] - *** Shake-fist {relatedTag=Move-upper-extremity} [Clench hand into a fist and shake to demonstrate anger.] - *** Shake-head {relatedTag=Move-head} [Turn head from side to side as a way of showing disagreement or refusal.] - *** Shhh {relatedTag=Move-upper-extremity} [Place finger over lips and possibly uttering the syllable shhh to indicate the need to be quiet.] - *** Shrug {relatedTag=Move-upper-extremity, relatedTag=Move-torso} [Lift shoulders up towards head to indicate a lack of knowledge about a particular topic.] - *** Smile {relatedTag=Move-face} [Form facial features into a pleased, kind, or amused expression, typically with the corners of the mouth turned up and the front teeth exposed.] - *** Spread-hands {relatedTag=Move-upper-extremity} [Spread hands apart to indicate ignorance.] - *** Thumb-up {relatedTag=Move-upper-extremity} [Extend the thumb upward to indicate approval.] - *** Thumbs-down {relatedTag=Move-upper-extremity} [Extend the thumb downward to indicate disapproval.] - *** Wave {relatedTag=Move-upper-extremity} [Raise hand and move left and right, as a greeting or sign of departure.] - *** Widen-eyes {relatedTag=Move-face, relatedTag=Move-eyes} [Open eyes and possibly with eyebrows lifted especially to express surprise or fear.] - *** Wink {relatedTag=Move-face, relatedTag=Move-eyes} [Close and open one eye quickly, typically to indicate that something is a joke or a secret or as a signal of affection or greeting.] - ** Communicate-musically [Communicate using music.] - *** Hum [Make a low, steady continuous sound like that of a bee. Sing with the lips closed and without uttering speech.] - *** Play-instrument [Make musical sounds using an instrument.] - *** Sing [Produce musical tones by means of the voice.] - *** Vocalize [Utter vocal sounds.] - *** Whistle [Produce a shrill clear sound by forcing breath out or air in through the puckered lips.] - ** Communicate-vocally [Communicate using mouth or vocal cords.] - *** Cry [Shed tears associated with emotions, usually sadness but also joy or frustration.] - *** Groan [Make a deep inarticulate sound in response to pain or despair.] - *** Laugh [Make the spontaneous sounds and movements of the face and body that are the instinctive expressions of lively amusement and sometimes also of contempt or derision.] - *** Scream [Make loud, vociferous cries or yells to express pain, excitement, or fear.] - *** Shout [Say something very loudly.] - *** Sigh [Emit a long, deep, audible breath expressing sadness, relief, tiredness, or a similar feeling.] - *** Speak [Communicate using spoken language.] - *** Whisper [Speak very softly using breath without vocal cords.] - * Move [Move in a specified direction or manner. Change position or posture.] - ** Breathe [Inhale or exhale during respiration.] - *** Blow [Expel air through pursed lips.] - *** Cough [Suddenly and audibly expel air from the lungs through a partially closed glottis, preceded by inhalation.] - *** Exhale [Blow out or expel breath.] - *** Hiccup [Involuntarily spasm the diaphragm and respiratory organs, with a sudden closure of the glottis and a characteristic sound like that of a cough.] - *** Hold-breath [Interrupt normal breathing by ceasing to inhale or exhale.] - *** Inhale [Draw in with the breath through the nose or mouth.] - *** Sneeze [Suddenly and violently expel breath through the nose and mouth.] - *** Sniff [Draw in air audibly through the nose to detect a smell, to stop it from running, or to express contempt.] - ** Move-body [Move entire body.] - *** Bend [Move body in a bowed or curved manner.] - *** Dance [Perform a purposefully selected sequences of human movement often with aesthetic or symbolic value. Move rhythmically to music, typically following a set sequence of steps.] - *** Fall-down [Lose balance and collapse.] - *** Flex [Cause a muscle to stand out by contracting or tensing it. Bend a limb or joint.] - *** Jerk [Make a quick, sharp, sudden movement.] - *** Lie-down [Move to a horizontal or resting position.] - *** Recover-balance [Return to a stable, upright body position.] - *** Shudder [Tremble convulsively, sometimes as a result of fear or revulsion.] - *** Sit-down [Move from a standing to a sitting position.] - *** Sit-up [Move from lying down to a sitting position.] - *** Stand-up [Move from a sitting to a standing position.] - *** Stretch [Straighten or extend body or a part of body to its full length, typically so as to tighten muscles or in order to reach something.] - *** Stumble [Trip or momentarily lose balance and almost fall.] - *** Turn [Change or cause to change direction.] - ** Move-body-part [Move one part of a body.] - *** Move-eyes [Move eyes.] - **** Blink [Shut and open the eyes quickly.] - **** Close-eyes [Lower and keep eyelids in a closed position.] - **** Fixate [Direct eyes to a specific point or target.] - **** Inhibit-blinks [Purposely prevent blinking.] - **** Open-eyes [Raise eyelids to expose pupil.] - **** Saccade [Move eyes rapidly between fixation points.] - **** Squint [Squeeze one or both eyes partly closed in an attempt to see more clearly or as a reaction to strong light.] - **** Stare [Look fixedly or vacantly at someone or something with eyes wide open.] - *** Move-face [Move the face or jaw.] - **** Bite [Seize with teeth or jaws an object or organism so as to grip or break the surface covering.] - **** Burp [Noisily release air from the stomach through the mouth. Belch.] - **** Chew [Repeatedly grinding, tearing, and or crushing with teeth or jaws.] - **** Gurgle [Make a hollow bubbling sound like that made by water running out of a bottle.] - **** Swallow [Cause or allow something, especially food or drink to pass down the throat.] - ***** Gulp [Swallow quickly or in large mouthfuls, often audibly, sometimes to indicate apprehension.] - **** Yawn [Take a deep involuntary inhalation with the mouth open often as a sign of drowsiness or boredom.] - *** Move-head [Move head.] - **** Lift-head [Tilt head back lifting chin.] - **** Lower-head [Move head downward so that eyes are in a lower position.] - **** Turn-head [Rotate head horizontally to look in a different direction.] - *** Move-lower-extremity [Move leg and/or foot.] - **** Curl-toes [Bend toes sometimes to grip.] - **** Hop [Jump on one foot.] - **** Jog [Run at a trot to exercise.] - **** Jump [Move off the ground or other surface through sudden muscular effort in the legs.] - **** Kick [Strike out or flail with the foot or feet. Strike using the leg, in unison usually with an area of the knee or lower using the foot.] - **** Pedal [Move by working the pedals of a bicycle or other machine.] - **** Press-foot [Move by pressing foot.] - **** Run [Travel on foot at a fast pace.] - **** Step [Put one leg in front of the other and shift weight onto it.] - ***** Heel-strike [Strike the ground with the heel during a step.] - ***** Toe-off [Push with toe as part of a stride.] - **** Trot [Run at a moderate pace, typically with short steps.] - **** Walk [Move at a regular pace by lifting and setting down each foot in turn never having both feet off the ground at once.] - *** Move-torso [Move body trunk.] - *** Move-upper-extremity [Move arm, shoulder, and/or hand.] - **** Drop [Let or cause to fall vertically.] - **** Grab [Seize suddenly or quickly. Snatch or clutch.] - **** Grasp [Seize and hold firmly.] - **** Hold-down [Prevent someone or something from moving by holding them firmly.] - **** Lift [Raising something to higher position.] - **** Make-fist [Close hand tightly with the fingers bent against the palm.] - **** Point [Draw attention to something by extending a finger or arm.] - **** Press {relatedTag=Push} [Apply pressure to something to flatten, shape, smooth or depress it. This action tag should be used to indicate key presses and mouse clicks.] - **** Push {relatedTag=Press} [Apply force in order to move something away. Use Press to indicate a key press or mouse click.] - **** Reach [Stretch out your arm in order to get or touch something.] - **** Release [Make available or set free.] - **** Retract [Draw or pull back.] - **** Scratch [Drag claws or nails over a surface or on skin.] - **** Snap-fingers [Make a noise by pushing second finger hard against thumb and then releasing it suddenly so that it hits the base of the thumb.] - **** Touch [Come into or be in contact with.] - * Perceive [Produce an internal, conscious image through stimulating a sensory system.] - ** Hear [Give attention to a sound.] - ** See [Direct gaze toward someone or something or in a specified direction.] - ** Sense-by-touch [Sense something through receptors in the skin.] - ** Smell [Inhale in order to ascertain an odor or scent.] - ** Taste [Sense a flavor in the mouth and throat on contact with a substance.] - * Perform [Carry out or accomplish an action, task, or function.] - ** Close [Act as to blocked against entry or passage.] - ** Collide-with [Hit with force when moving.] - ** Halt [Bring or come to an abrupt stop.] - ** Modify [Change something.] - ** Open [Widen an aperture, door, or gap, especially one allowing access to something.] - ** Operate [Control the functioning of a machine, process, or system.] - ** Play [Engage in activity for enjoyment and recreation rather than a serious or practical purpose.] - ** Read [Interpret something that is written or printed.] - ** Repeat [Make do or perform again.] - ** Rest [Be inactive in order to regain strength, health, or energy.] - ** Write [Communicate or express by means of letters or symbols written or imprinted on a surface.] - * Think [Direct the mind toward someone or something or use the mind actively to form connected ideas.] - ** Allow [Allow access to something such as allowing a car to pass.] - ** Attend-to [Focus mental experience on specific targets.] - ** Count [Tally items either silently or aloud.] - ** Deny [Refuse to give or grant something requested or desired by someone.] - ** Detect [Discover or identify the presence or existence of something.] - ** Discriminate [Recognize a distinction.] - ** Encode [Convert information or an instruction into a particular form.] - ** Evade [Escape or avoid, especially by cleverness or trickery.] - ** Generate [Cause something, especially an emotion or situation to arise or come about.] - ** Identify [Establish or indicate who or what someone or something is.] - ** Imagine [Form a mental image or concept of something.] - ** Judge [Evaluate evidence to make a decision or form a belief.] - ** Learn [Adaptively change behavior as the result of experience.] - ** Memorize [Adaptively change behavior as the result of experience.] - ** Plan [Think about the activities required to achieve a desired goal.] - ** Predict [Say or estimate that something will happen or will be a consequence of something without having exact informaton.] - ** Recall [Remember information by mental effort.] - ** Recognize [Identify someone or something from having encountered them before.] - ** Respond [React to something such as a treatment or a stimulus.] - ** Switch-attention [Transfer attention from one focus to another.] - ** Track [Follow a person, animal, or object through space or time.] - -'''Artifact''' {requireChild, inLibrary=score} [When relevant for the clinical interpretation, artifacts can be scored by specifying the type and the location.] - * Biological-artifact {requireChild, inLibrary=score} - ** Eye-blink-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Example for EEG: Fp1/Fp2 become electropositive with eye closure because the cornea is positively charged causing a negative deflection in Fp1/Fp2. If the eye blink is unilateral, consider prosthetic eye. If it is in F8 rather than Fp2 then the electrodes are plugged in wrong.] - ** Eye-movement-horizontal-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Example for EEG: There is an upward deflection in the Fp2-F8 derivation, when the eyes move to the right side. In this case F8 becomes more positive and therefore. When the eyes move to the left, F7 becomes more positive and there is an upward deflection in the Fp1-F7 derivation.] - ** Eye-movement-vertical-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Example for EEG: The EEG shows positive potentials (50-100 micro V) with bi-frontal distribution, maximum at Fp1 and Fp2, when the eyeball rotated upward. The downward rotation of the eyeball was associated with the negative deflection. The time course of the deflections was similar to the time course of the eyeball movement.] - ** Slow-eye-movement-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Slow, rolling eye-movements, seen during drowsiness.] - ** Nystagmus-artifact {suggestedTag=Artifact-significance-to-recording, inLibrary=score} - ** Chewing-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} - ** Sucking-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} - ** Glossokinetic-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [The tongue functions as a dipole, with the tip negative with respect to the base. The artifact produced by the tongue has a broad potential field that drops from frontal to occipital areas, although it is less steep than that produced by eye movement artifacts. The amplitude of the potentials is greater inferiorly than in parasagittal regions; the frequency is variable but usually in the delta range. Chewing and sucking can produce similar artifacts.] - ** Rocking-patting-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Quasi-rhythmical artifacts in recordings from infants caused by rocking/patting.] - ** Movement-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Example for EEG: Large amplitude artifact, with irregular morphology (usually resembling a slow-wave or a wave with complex morphology) seen in one or several channels, due to movement. If the causing movement is repetitive, the artifact might resemble a rhythmic EEG activity.] - ** Respiration-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Respiration can produce 2 kinds of artifacts. One type is in the form of slow and rhythmic activity, synchronous with the body movements of respiration and mechanically affecting the impedance of (usually) one electrode. The other type can be slow or sharp waves that occur synchronously with inhalation or exhalation and involve those electrodes on which the patient is lying.] - ** Pulse-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Example for EEG: Occurs when an EEG electrode is placed over a pulsating vessel. The pulsation can cause slow waves that may simulate EEG activity. A direct relationship exists between ECG and the pulse waves (200-300 millisecond delay after ECG equals QRS complex).] - ** ECG-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Example for EEG: Far-field potential generated in the heart. The voltage and apparent surface of the artifact vary from derivation to derivation and, consequently, from montage to montage. The artifact is observed best in referential montages using earlobe electrodes A1 and A2. ECG artifact is recognized easily by its rhythmicity/regularity and coincidence with the ECG tracing.] - ** Sweat-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Is a low amplitude undulating waveform that is usually greater than 2 seconds and may appear to be an unstable baseline.] - ** EMG-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Myogenic potentials are the most common artifacts. Frontalis and temporalis muscles (ex..: clenching of jaw muscles) are common causes. Generally, the potentials generated in the muscles are of shorter duration than those generated in the brain. The frequency components are usually beyond 30-50 Hz, and the bursts are arrhythmic.] - * Non-biological-artifact {requireChild, inLibrary=score} - ** Power-supply-artifact {suggestedTag=Artifact-significance-to-recording, inLibrary=score} [50-60 Hz artifact. Monomorphic waveform due to 50 or 60 Hz A/C power supply.] - ** Induction-artifact {suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Artifacts (usually of high frequency) induced by nearby equipment (like in the intensive care unit).] - ** Dialysis-artifact {suggestedTag=Artifact-significance-to-recording, inLibrary=score} - ** Artificial-ventilation-artifact {suggestedTag=Artifact-significance-to-recording, inLibrary=score} - ** Electrode-pops-artifact {suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Are brief discharges with a very steep upslope and shallow fall that occur in all leads which include that electrode.] - ** Salt-bridge-artifact {suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Typically occurs in 1 channel which may appear isoelectric. Only seen in bipolar montage.] - * Other-artifact {requireChild, suggestedTag=Artifact-significance-to-recording, inLibrary=score} - ** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - -'''Critically-ill-patients-patterns''' {requireChild, inLibrary=score} [Rhythmic or periodic patterns in critically ill patients (RPPs) are scored according to the 2012 version of the American Clinical Neurophysiology Society Standardized Critical Care EEG Terminology (Hirsch et al., 2013).] - * Critically-ill-patients-periodic-discharges {suggestedTag=Periodic-discharge-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-frequency, suggestedTag=Periodic-discharge-time-related-features, inLibrary=score} [Periodic discharges (PDs).] - * Rhythmic-delta-activity {suggestedTag=Periodic-discharge-superimposed-activity, suggestedTag=Periodic-discharge-absolute-amplitude, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-frequency, suggestedTag=Periodic-discharge-time-related-features, inLibrary=score} [RDA] - * Spike-or-sharp-and-wave {suggestedTag=Periodic-discharge-sharpness, suggestedTag=Number-of-periodic-discharge-phases, suggestedTag=Periodic-discharge-triphasic-morphology, suggestedTag=Periodic-discharge-absolute-amplitude, suggestedTag=Periodic-discharge-relative-amplitude, suggestedTag=Periodic-discharge-polarity, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Finding-frequency, suggestedTag=Periodic-discharge-time-related-features, inLibrary=score} [SW] - -'''Episode''' {requireChild, inLibrary=score} [Clinical episode or electrographic seizure.] - * Epileptic-seizure {requireChild, inLibrary=score} [The ILAE presented a revised seizure classification that divides seizures into focal, generalized onset, or unknown onset.] - ** Focal-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Automatism-motor-seizure, suggestedTag=Atonic-motor-seizure, suggestedTag=Clonic-motor-seizure, suggestedTag=Epileptic-spasm-episode, suggestedTag=Hyperkinetic-motor-seizure, suggestedTag=Myoclonic-motor-seizure, suggestedTag=Tonic-motor-seizure, suggestedTag=Autonomic-nonmotor-seizure, suggestedTag=Behavior-arrest-nonmotor-seizure, suggestedTag=Cognitive-nonmotor-seizure, suggestedTag=Emotional-nonmotor-seizure, suggestedTag=Sensory-nonmotor-seizure, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Focal seizures can be divided into focal aware and impaired awareness seizures, with additional motor and nonmotor classifications.] - *** Aware-focal-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} - *** Impaired-awareness-focal-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} - *** Awareness-unknown-focal-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} - *** Focal-to-bilateral-tonic-clonic-focal-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [A seizure type with focal onset, with awareness or impaired awareness, either motor or non-motor, progressing to bilateral tonic clonic activity. The prior term was seizure with partial onset with secondary generalization. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - ** Generalized-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Tonic-clonic-motor-seizure, suggestedTag=Clonic-motor-seizure, suggestedTag=Tonic-motor-seizure, suggestedTag=Myoclonic-motor-seizure, suggestedTag=Myoclonic-tonic-clonic-motor-seizure, suggestedTag=Myoclonic-atonic-motor-seizure, suggestedTag=Atonic-motor-seizure, suggestedTag=Epileptic-spasm-episode, suggestedTag=Typical-absence-seizure, suggestedTag=Atypical-absence-seizure, suggestedTag=Myoclonic-absence-seizure, suggestedTag=Eyelid-myoclonia-absence-seizure, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Generalized-onset seizures are classified as motor or nonmotor (absence), without using awareness level as a classifier, as most but not all of these seizures are linked with impaired awareness.] - ** Unknown-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Tonic-clonic-motor-seizure, suggestedTag=Epileptic-spasm-episode, suggestedTag=Behavior-arrest-nonmotor-seizure, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Even if the onset of seizures is unknown, they may exhibit characteristics that fall into categories such as motor, nonmotor, tonic-clonic, epileptic spasms, or behavior arrest.] - ** Unclassified-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Referring to a seizure type that cannot be described by the ILAE 2017 classification either because of inadequate information or unusual clinical features.] - * Subtle-seizure {suggestedTag=Episode-phase, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Seizure type frequent in neonates, sometimes referred to as motor automatisms; they may include random and roving eye movements, sucking, chewing motions, tongue protrusion, rowing or swimming or boxing movements of the arms, pedaling and bicycling movements of the lower limbs; apneic seizures are relatively common. Although some subtle seizures are associated with rhythmic ictal EEG discharges, and are clearly epileptic, ictal EEG often does not show typical epileptic activity.] - * Electrographic-seizure {suggestedTag=Episode-phase, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Referred usually to non convulsive status. Ictal EEG: rhythmic discharge or spike and wave pattern with definite evolution in frequency, location, or morphology lasting at least 10 s; evolution in amplitude alone did not qualify.] - * Seizure-PNES {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Psychogenic non-epileptic seizure.] - * Sleep-related-episode {requireChild, inLibrary=score} - ** Sleep-related-arousal {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Normal.] - ** Benign-sleep-myoclonus {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [A distinctive disorder of sleep characterized by a) neonatal onset, b) rhythmic myoclonic jerks only during sleep and c) abrupt and consistent cessation with arousal, d) absence of concomitant electrographic changes suggestive of seizures, and e) good outcome.] - ** Confusional-awakening {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Episode of non epileptic nature included in NREM parasomnias, characterized by sudden arousal and complex behavior but without full alertness, usually lasting a few minutes and occurring almost in all children at least occasionally. Amnesia of the episode is the rule.] - ** Sleep-periodic-limb-movement {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [PLMS. Periodic limb movement in sleep. Episodes are characterized by brief (0.5- to 5.0-second) lower-extremity movements during sleep, which typically occur at 20- to 40-second intervals, most commonly during the first 3 hours of sleep. The affected individual is usually not aware of the movements or of the transient partial arousals.] - ** REM-sleep-behavioral-disorder {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [REM sleep behavioral disorder. Episodes characterized by: a) presence of REM sleep without atonia (RSWA) on polysomnography (PSG); b) presence of at least 1 of the following conditions - (1) Sleep-related behaviors, by history, that have been injurious, potentially injurious, or disruptive (example: dream enactment behavior); (2) abnormal REM sleep behavior documented during PSG monitoring; (3) absence of epileptiform activity on electroencephalogram (EEG) during REM sleep (unless RBD can be clearly distinguished from any concurrent REM sleep-related seizure disorder); (4) sleep disorder not better explained by another sleep disorder, a medical or neurologic disorder, a mental disorder, medication use, or a substance use disorder.] - ** Sleep-walking {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Episodes characterized by ambulation during sleep; the patient is difficult to arouse during an episode, and is usually amnesic following the episode. Episodes usually occur in the first third of the night during slow wave sleep. Polysomnographic recordings demonstrate 2 abnormalities during the first sleep cycle: frequent, brief, non-behavioral EEG-defined arousals prior to the somnambulistic episode and abnormally low gamma (0.75-2.0 Hz) EEG power on spectral analysis, correlating with high-voltage (hyper-synchronic gamma) waves lasting 10 to 15 s occurring just prior to the movement. This is followed by stage I NREM sleep, and there is no evidence of complete awakening.] - * Pediatric-episode {requireChild, inLibrary=score} - ** Hyperekplexia {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Disorder characterized by exaggerated startle response and hypertonicity that may occur during the first year of life and in severe cases during the neonatal period. Children usually present with marked irritability and recurrent startles in response to handling and sounds. Severely affected infants can have severe jerks and stiffening, sometimes with breath-holding spells.] - ** Jactatio-capitis-nocturna {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Relatively common in normal children at the time of going to bed, especially during the first year of life, the rhythmic head movements persist during sleep. Usually, these phenomena disappear before 3 years of age.] - ** Pavor-nocturnus {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [A nocturnal episode characterized by age of onset of less than five years (mean age 18 months, with peak prevalence at five to seven years), appearance of signs of panic two hours after falling asleep with crying, screams, a fearful expression, inability to recognize other people including parents (for a duration of 5-15 minutes), amnesia upon awakening. Pavor nocturnus occurs in patients almost every night for months or years (but the frequency is highly variable and may be as low as once a month) and is likely to disappear spontaneously at the age of six to eight years.] - ** Pediatric-stereotypical-behavior-episode {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Repetitive motor behavior in children, typically rhythmic and persistent; usually not paroxysmal and rarely suggest epilepsy. They include headbanging, head-rolling, jactatio capitis nocturna, body rocking, buccal or lingual movements, hand flapping and related mannerisms, repetitive hand-waving (to self-induce photosensitive seizures).] - * Paroxysmal-motor-event {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Paroxysmal phenomena during neonatal or childhood periods characterized by recurrent motor or behavioral signs or symptoms that must be distinguishes from epileptic disorders.] - * Syncope {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Episode with loss of consciousness and muscle tone that is abrupt in onset, of short duration and followed by rapid recovery; it occurs in response to transient impairment of cerebral perfusion. Typical prodromal symptoms often herald onset of syncope and postictal symptoms are minimal. Syncopal convulsions resulting from cerebral anoxia are common but are not a form of epilepsy, nor are there any accompanying EEG ictal discharges.] - * Cataplexy {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [A sudden decrement in muscle tone and loss of deep tendon reflexes, leading to muscle weakness, paralysis, or postural collapse. Cataplexy usually is precipitated by an outburst of emotional expression-notably laughter, anger, or startle. It is one of the tetrad of symptoms of narcolepsy. During cataplexy, respiration and voluntary eye movements are not compromised. Consciousness is preserved.] - * Other-episode {requireChild, inLibrary=score} - ** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - -'''Finding-property''' {requireChild, inLibrary=score} [Descriptive element similar to main HED /Property. Something that pertains to a thing. A characteristic of some entity. A quality or feature regarded as a characteristic or inherent part of someone or something. HED attributes are adjectives or adverbs.] - * Signal-morphology-property {requireChild, inLibrary=score} - ** Rhythmic-activity-morphology {inLibrary=score} [EEG activity consisting of a sequence of waves approximately constant period.] - *** Delta-activity-morphology {suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude, inLibrary=score} [EEG rhythm in the delta (under 4 Hz) range that does not belong to the posterior dominant rhythm (scored under other organized rhythms).] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Theta-activity-morphology {suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude, inLibrary=score} [EEG rhythm in the theta (4-8 Hz) range that does not belong to the posterior dominant rhythm (scored under other organized rhythm).] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Alpha-activity-morphology {suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude, inLibrary=score} [EEG rhythm in the alpha range (8-13 Hz) which is considered part of the background (ongoing) activity but does not fulfill the criteria of the posterior dominant rhythm (alpha rhythm).] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Beta-activity-morphology {suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude, inLibrary=score} [EEG rhythm between 14 and 40 Hz, which is considered part of the background (ongoing) activity but does not fulfill the criteria of the posterior dominant rhythm. Most characteristically: a rhythm from 14 to 40 Hz recorded over the fronto-central regions of the head during wakefulness. Amplitude of the beta rhythm varies but is mostly below 30 microV. Other beta rhythms are most prominent in other locations or are diffuse.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Gamma-activity-morphology {suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude, inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Spike-morphology {inLibrary=score} [A transient, clearly distinguished from background activity, with pointed peak at a conventional paper speed or time scale and duration from 20 to under 70 ms, i.e. 1/50-1/15 s approximately. Main component is generally negative relative to other areas. Amplitude varies.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Spike-and-slow-wave-morphology {inLibrary=score} [A pattern consisting of a spike followed by a slow wave.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Runs-of-rapid-spikes-morphology {inLibrary=score} [Bursts of spike discharges at a rate from 10 to 25/sec (in most cases somewhat irregular). The bursts last more than 2 seconds (usually 2 to 10 seconds) and it is typically seen in sleep. Synonyms: rhythmic spikes, generalized paroxysmal fast activity, fast paroxysmal rhythms, grand mal discharge, fast beta activity.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Polyspikes-morphology {inLibrary=score} [Two or more consecutive spikes.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Polyspike-and-slow-wave-morphology {inLibrary=score} [Two or more consecutive spikes associated with one or more slow waves.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Sharp-wave-morphology {inLibrary=score} [A transient clearly distinguished from background activity, with pointed peak at a conventional paper speed or time scale, and duration of 70-200 ms, i.e. over 1/4-1/5 s approximately. Main component is generally negative relative to other areas. Amplitude varies.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Sharp-and-slow-wave-morphology {inLibrary=score} [A sequence of a sharp wave and a slow wave.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Slow-sharp-wave-morphology {inLibrary=score} [A transient that bears all the characteristics of a sharp-wave, but exceeds 200 ms. Synonym: blunted sharp wave.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** High-frequency-oscillation-morphology {inLibrary=score} [HFO.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Hypsarrhythmia-classic-morphology {inLibrary=score} [Abnormal interictal high amplitude waves and a background of irregular spikes.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Hypsarrhythmia-modified-morphology {inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Fast-spike-activity-morphology {inLibrary=score} [A burst consisting of a sequence of spikes. Duration greater than 1 s. Frequency at least in the alpha range.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Low-voltage-fast-activity-morphology {inLibrary=score} [Refers to the fast, and often recruiting activity which can be recorded at the onset of an ictal discharge, particularly in invasive EEG recording of a seizure.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Polysharp-waves-morphology {inLibrary=score} [A sequence of two or more sharp-waves.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Slow-wave-large-amplitude-morphology {inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Irregular-delta-or-theta-activity-morphology {inLibrary=score} [EEG activity consisting of repetitive waves of inconsistent wave-duration but in delta and/or theta rang (greater than 125 ms).] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Electrodecremental-change-morphology {inLibrary=score} [Sudden desynchronization of electrical activity.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** DC-shift-morphology {inLibrary=score} [Shift of negative polarity of the direct current recordings, during seizures.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Disappearance-of-ongoing-activity-morphology {inLibrary=score} [Disappearance of the EEG activity that preceded the ictal event but still remnants of background activity (thus not enough to name it electrodecremental change).] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Polymorphic-delta-activity-morphology {inLibrary=score} [EEG activity consisting of waves in the delta range (over 250 ms duration for each wave) but of different morphology.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Frontal-intermittent-rhythmic-delta-activity-morphology {inLibrary=score} [Frontal intermittent rhythmic delta activity (FIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at 1.5-2.5 Hz over the frontal areas of one or both sides of the head. Comment: most commonly associated with unspecified encephalopathy, in adults.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Occipital-intermittent-rhythmic-delta-activity-morphology {inLibrary=score} [Occipital intermittent rhythmic delta activity (OIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at 2-3 Hz over the occipital or posterior head regions of one or both sides of the head. Frequently blocked or attenuated by opening the eyes. Comment: most commonly associated with unspecified encephalopathy, in children.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Temporal-intermittent-rhythmic-delta-activity-morphology {inLibrary=score} [Temporal intermittent rhythmic delta activity (TIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at over the temporal areas of one side of the head. Comment: most commonly associated with temporal lobe epilepsy.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Periodic-discharge-morphology {requireChild, inLibrary=score} [Periodic discharges not further specified (PDs).] - *** Periodic-discharge-superimposed-activity {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} - **** Periodic-discharge-fast-superimposed-activity {suggestedTag=Finding-frequency, inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Periodic-discharge-rhythmic-superimposed-activity {suggestedTag=Finding-frequency, inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Periodic-discharge-sharpness {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} - **** Spiky-periodic-discharge-sharpness {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Sharp-periodic-discharge-sharpness {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Sharply-contoured-periodic-discharge-sharpness {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Blunt-periodic-discharge-sharpness {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Number-of-periodic-discharge-phases {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} - **** 1-periodic-discharge-phase {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** 2-periodic-discharge-phases {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** 3-periodic-discharge-phases {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Greater-than-3-periodic-discharge-phases {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Periodic-discharge-triphasic-morphology {suggestedTag=Property-not-possible-to-determine, suggestedTag=Property-exists, suggestedTag=Property-absence, inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Periodic-discharge-absolute-amplitude {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} - **** Periodic-discharge-absolute-amplitude-very-low {inLibrary=score} [Lower than 20 microV.] - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Low-periodic-discharge-absolute-amplitude {inLibrary=score} [20 to 49 microV.] - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Medium-periodic-discharge-absolute-amplitude {inLibrary=score} [50 to 199 microV.] - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** High-periodic-discharge-absolute-amplitude {inLibrary=score} [Greater than 200 microV.] - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Periodic-discharge-relative-amplitude {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} - **** Periodic-discharge-relative-amplitude-less-than-equal-2 {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Periodic-discharge-relative-amplitude-greater-than-2 {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Periodic-discharge-polarity {requireChild, inLibrary=score} - **** Periodic-discharge-postitive-polarity {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Periodic-discharge-negative-polarity {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Periodic-discharge-unclear-polarity {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - * Source-analysis-property {requireChild, inLibrary=score} [How the current in the brain reaches the electrode sensors.] - ** Source-analysis-laterality {requireChild, suggestedTag=Brain-laterality, inLibrary=score} - ** Source-analysis-brain-region {requireChild, inLibrary=score} - *** Source-analysis-frontal-perisylvian-superior-surface {inLibrary=score} - *** Source-analysis-frontal-lateral {inLibrary=score} - *** Source-analysis-frontal-mesial {inLibrary=score} - *** Source-analysis-frontal-polar {inLibrary=score} - *** Source-analysis-frontal-orbitofrontal {inLibrary=score} - *** Source-analysis-temporal-polar {inLibrary=score} - *** Source-analysis-temporal-basal {inLibrary=score} - *** Source-analysis-temporal-lateral-anterior {inLibrary=score} - *** Source-analysis-temporal-lateral-posterior {inLibrary=score} - *** Source-analysis-temporal-perisylvian-inferior-surface {inLibrary=score} - *** Source-analysis-central-lateral-convexity {inLibrary=score} - *** Source-analysis-central-mesial {inLibrary=score} - *** Source-analysis-central-sulcus-anterior-surface {inLibrary=score} - *** Source-analysis-central-sulcus-posterior-surface {inLibrary=score} - *** Source-analysis-central-opercular {inLibrary=score} - *** Source-analysis-parietal-lateral-convexity {inLibrary=score} - *** Source-analysis-parietal-mesial {inLibrary=score} - *** Source-analysis-parietal-opercular {inLibrary=score} - *** Source-analysis-occipital-lateral {inLibrary=score} - *** Source-analysis-occipital-mesial {inLibrary=score} - *** Source-analysis-occipital-basal {inLibrary=score} - *** Source-analysis-insula {inLibrary=score} - * Location-property {requireChild, inLibrary=score} [Location can be scored for findings. Semiologic finding can also be characterized by the somatotopic modifier (i.e. the part of the body where it occurs). In this respect, laterality (left, right, symmetric, asymmetric, left greater than right, right greater than left), body part (eyelid, face, arm, leg, trunk, visceral, hemi-) and centricity (axial, proximal limb, distal limb) can be scored.] - ** Brain-laterality {requireChild, inLibrary=score} - *** Brain-laterality-left {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Brain-laterality-left-greater-right {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Brain-laterality-right {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Brain-laterality-right-greater-left {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Brain-laterality-midline {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Brain-laterality-diffuse-asynchronous {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Brain-region {requireChild, inLibrary=score} - *** Brain-region-frontal {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Brain-region-temporal {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Brain-region-central {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Brain-region-parietal {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Brain-region-occipital {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Body-part-location {requireChild, inLibrary=score} - *** Eyelid-location {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Face-location {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Arm-location {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Leg-location {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Trunk-location {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Visceral-location {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Hemi-location {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Brain-centricity {requireChild, inLibrary=score} - *** Brain-centricity-axial {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Brain-centricity-proximal-limb {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Brain-centricity-distal-limb {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Sensors {requireChild, inLibrary=score} [Lists all corresponding sensors (electrodes/channels in montage). The sensor-group is selected from a list defined in the site-settings for each EEG-lab.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Finding-propagation {suggestedTag=Property-exists, suggestedTag=Property-absence, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, inLibrary=score} [When propagation within the graphoelement is observed, first the location of the onset region is scored. Then, the location of the propagation can be noted.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Multifocal-finding {suggestedTag=Property-not-possible-to-determine, suggestedTag=Property-exists, suggestedTag=Property-absence, inLibrary=score} [When the same interictal graphoelement is observed bilaterally and at least in three independent locations, can score them using one entry, and choosing multifocal as a descriptor of the locations of the given interictal graphoelements, optionally emphasizing the involved, and the most active sites.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - * Modulators-property {requireChild, inLibrary=score} [For each described graphoelement, the influence of the modulators can be scored. Only modulators present in the recording are scored.] - ** Modulators-reactivity {requireChild, suggestedTag=Property-exists, suggestedTag=Property-absence, inLibrary=score} [Susceptibility of individual rhythms or the EEG as a whole to change following sensory stimulation or other physiologic actions.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Eye-closure-sensitivity {suggestedTag=Property-exists, suggestedTag=Property-absence, inLibrary=score} [Eye closure sensitivity.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Eye-opening-passive {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, suggestedTag=Finding-triggered-by, inLibrary=score} [Passive eye opening. Used with base schema Increasing/Decreasing.] - ** Medication-effect-EEG {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, inLibrary=score} [Medications effect on EEG. Used with base schema Increasing/Decreasing.] - ** Medication-reduction-effect-EEG {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, inLibrary=score} [Medications reduction or withdrawal effect on EEG. Used with base schema Increasing/Decreasing.] - ** Auditive-stimuli-effect {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, inLibrary=score} [Used with base schema Increasing/Decreasing.] - ** Nociceptive-stimuli-effect {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, suggestedTag=Finding-triggered-by, inLibrary=score} [Used with base schema Increasing/Decreasing.] - ** Physical-effort-effect {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, suggestedTag=Finding-triggered-by, inLibrary=score} [Used with base schema Increasing/Decreasing] - ** Cognitive-task-effect {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, suggestedTag=Finding-triggered-by, inLibrary=score} [Used with base schema Increasing/Decreasing.] - ** Other-modulators-effect-EEG {requireChild, inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Facilitating-factor {inLibrary=score} [Facilitating factors are defined as transient and sporadic endogenous or exogenous elements capable of augmenting seizure incidence (increasing the likelihood of seizure occurrence).] - *** Facilitating-factor-alcohol {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Facilitating-factor-awake {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Facilitating-factor-catamenial {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Facilitating-factor-fever {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Facilitating-factor-sleep {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Facilitating-factor-sleep-deprived {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Facilitating-factor-other {requireChild, inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Provocative-factor {requireChild, inLibrary=score} [Provocative factors are defined as transient and sporadic endogenous or exogenous elements capable of evoking/triggering seizures immediately following the exposure to it.] - *** Hyperventilation-provoked {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Reflex-provoked {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Medication-effect-clinical {suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, inLibrary=score} [Medications clinical effect. Used with base schema Increasing/Decreasing.] - ** Medication-reduction-effect-clinical {suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, inLibrary=score} [Medications reduction or withdrawal clinical effect. Used with base schema Increasing/Decreasing.] - ** Other-modulators-effect-clinical {requireChild, inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Intermittent-photic-stimulation-effect {requireChild, inLibrary=score} - *** Posterior-stimulus-dependent-intermittent-photic-stimulation-response {suggestedTag=Finding-frequency, inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Posterior-stimulus-independent-intermittent-photic-stimulation-response-limited {suggestedTag=Finding-frequency, inLibrary=score} [limited to the stimulus-train] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Posterior-stimulus-independent-intermittent-photic-stimulation-response-self-sustained {suggestedTag=Finding-frequency, inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Generalized-photoparoxysmal-intermittent-photic-stimulation-response-limited {suggestedTag=Finding-frequency, inLibrary=score} [Limited to the stimulus-train.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Generalized-photoparoxysmal-intermittent-photic-stimulation-response-self-sustained {suggestedTag=Finding-frequency, inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Activation-of-pre-existing-epileptogenic-area-intermittent-photic-stimulation-effect {suggestedTag=Finding-frequency, inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Unmodified-intermittent-photic-stimulation-effect {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Quality-of-hyperventilation {requireChild, inLibrary=score} - *** Hyperventilation-refused-procedure {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Hyperventilation-poor-effort {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Hyperventilation-good-effort {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Hyperventilation-excellent-effort {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Modulators-effect {requireChild, inLibrary=score} [Tags for describing the influence of the modulators] - *** Modulators-effect-continuous-during-NRS {inLibrary=score} [Continuous during non-rapid-eye-movement-sleep (NRS)] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Modulators-effect-only-during {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Only during Sleep/Awakening/Hyperventilation/Physical effort/Cognitive task. Free text.] - *** Modulators-effect-change-of-patterns {inLibrary=score} [Change of patterns during sleep/awakening.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - * Time-related-property {requireChild, inLibrary=score} [Important to estimate how often an interictal abnormality is seen in the recording.] - ** Appearance-mode {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} [Describes how the non-ictal EEG pattern/graphoelement is distributed through the recording.] - *** Random-appearance-mode {inLibrary=score} [Occurrence of the non-ictal EEG pattern / graphoelement without any rhythmicity / periodicity.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Periodic-appearance-mode {inLibrary=score} [Non-ictal EEG pattern / graphoelement occurring at an approximately regular rate / interval (generally of 1 to several seconds).] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Variable-appearance-mode {inLibrary=score} [Occurrence of non-ictal EEG pattern / graphoelements, that is sometimes rhythmic or periodic, other times random, throughout the recording.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Intermittent-appearance-mode {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Continuous-appearance-mode {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Discharge-pattern {requireChild, inLibrary=score} [Describes the organization of the EEG signal within the discharge (distinguish between single and repetitive discharges)] - *** Single-discharge-pattern {suggestedTag=Finding-incidence, inLibrary=score} [Applies to the intra-burst pattern: a graphoelement that is not repetitive; before and after the graphoelement one can distinguish the background activity.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Rhythmic-trains-or-bursts-discharge-pattern {suggestedTag=Finding-prevalence, suggestedTag=Finding-frequency, inLibrary=score} [Applies to the intra-burst pattern: a non-ictal graphoelement that repeats itself without returning to the background activity between them. The graphoelements within this repetition occur at approximately constant period.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Arrhythmic-trains-or-bursts-discharge-pattern {suggestedTag=Finding-prevalence, inLibrary=score} [Applies to the intra-burst pattern: a non-ictal graphoelement that repeats itself without returning to the background activity between them. The graphoelements within this repetition occur at inconstant period.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Fragmented-discharge-pattern {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Periodic-discharge-time-related-features {requireChild, inLibrary=score} [Periodic discharges not further specified (PDs) time-relayed features tags.] - *** Periodic-discharge-duration {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} - **** Very-brief-periodic-discharge-duration {inLibrary=score} [Less than 10 sec.] - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Brief-periodic-discharge-duration {inLibrary=score} [10 to 59 sec.] - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Intermediate-periodic-discharge-duration {inLibrary=score} [1 to 4.9 min.] - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Long-periodic-discharge-duration {inLibrary=score} [5 to 59 min.] - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Very-long-periodic-discharge-duration {inLibrary=score} [Greater than 1 hour.] - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Periodic-discharge-onset {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} - **** Sudden-periodic-discharge-onset {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Gradual-periodic-discharge-onset {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Periodic-discharge-dynamics {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} - **** Evolving-periodic-discharge-dynamics {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Fluctuating-periodic-discharge-dynamics {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Static-periodic-discharge-dynamics {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Finding-extent {inLibrary=score} [Percentage of occurrence during the recording (background activity and interictal finding).] - *** # {takesValue, valueClass=numericClass, inLibrary=score} - ** Finding-incidence {requireChild, inLibrary=score} [How often it occurs/time-epoch.] - *** Only-once-finding-incidence {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Rare-finding-incidence {inLibrary=score} [less than 1/h] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Uncommon-finding-incidence {inLibrary=score} [1/5 min to 1/h.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Occasional-finding-incidence {inLibrary=score} [1/min to 1/5min.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Frequent-finding-incidence {inLibrary=score} [1/10 s to 1/min.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Abundant-finding-incidence {inLibrary=score} [Greater than 1/10 s).] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Finding-prevalence {requireChild, inLibrary=score} [The percentage of the recording covered by the train/burst.] - *** Rare-finding-prevalence {inLibrary=score} [Less than 1 percent.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Occasional-finding-prevalence {inLibrary=score} [1 to 9 percent.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Frequent-finding-prevalence {inLibrary=score} [10 to 49 percent.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Abundant-finding-prevalence {inLibrary=score} [50 to 89 percent.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Continuous-finding-prevalence {inLibrary=score} [Greater than 90 percent.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - * Posterior-dominant-rhythm-property {requireChild, inLibrary=score} [Posterior dominant rhythm is the most often scored EEG feature in clinical practice. Therefore, there are specific terms that can be chosen for characterizing the PDR.] - ** Posterior-dominant-rhythm-amplitude-range {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} - *** Low-posterior-dominant-rhythm-amplitude-range {inLibrary=score} [Low (less than 20 microV).] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Medium-posterior-dominant-rhythm-amplitude-range {inLibrary=score} [Medium (between 20 and 70 microV).] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** High-posterior-dominant-rhythm-amplitude-range {inLibrary=score} [High (more than 70 microV).] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Posterior-dominant-rhythm-frequency-asymmetry {requireChild, inLibrary=score} [When symmetrical could be labeled with base schema Symmetrical tag.] - *** Posterior-dominant-rhythm-frequency-asymmetry-lower-left {inLibrary=score} [Hz lower on the left side.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Posterior-dominant-rhythm-frequency-asymmetry-lower-right {inLibrary=score} [Hz lower on the right side.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Posterior-dominant-rhythm-eye-opening-reactivity {suggestedTag=Property-not-possible-to-determine, inLibrary=score} [Change (disappearance or measurable decrease in amplitude) of a posterior dominant rhythm following eye-opening. Eye closure has the opposite effect.] - *** Posterior-dominant-rhythm-eye-opening-reactivity-reduced-left {inLibrary=score} [Reduced left side reactivity.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Posterior-dominant-rhythm-eye-opening-reactivity-reduced-right {inLibrary=score} [Reduced right side reactivity.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [free text] - *** Posterior-dominant-rhythm-eye-opening-reactivity-reduced-both {inLibrary=score} [Reduced reactivity on both sides.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Posterior-dominant-rhythm-organization {requireChild, inLibrary=score} [When normal could be labeled with base schema Normal tag.] - *** Posterior-dominant-rhythm-organization-poorly-organized {inLibrary=score} [Poorly organized.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Posterior-dominant-rhythm-organization-disorganized {inLibrary=score} [Disorganized.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Posterior-dominant-rhythm-organization-markedly-disorganized {inLibrary=score} [Markedly disorganized.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Posterior-dominant-rhythm-caveat {requireChild, inLibrary=score} [Caveat to the annotation of PDR.] - *** No-posterior-dominant-rhythm-caveat {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Posterior-dominant-rhythm-caveat-only-open-eyes-during-the-recording {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Posterior-dominant-rhythm-caveat-sleep-deprived-caveat {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Posterior-dominant-rhythm-caveat-drowsy {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Posterior-dominant-rhythm-caveat-only-following-hyperventilation {inLibrary=score} - ** Absence-of-posterior-dominant-rhythm {requireChild, inLibrary=score} [Reason for absence of PDR.] - *** Absence-of-posterior-dominant-rhythm-artifacts {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Absence-of-posterior-dominant-rhythm-extreme-low-voltage {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Absence-of-posterior-dominant-rhythm-eye-closure-could-not-be-achieved {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Absence-of-posterior-dominant-rhythm-lack-of-awake-period {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Absence-of-posterior-dominant-rhythm-lack-of-compliance {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Absence-of-posterior-dominant-rhythm-other-causes {requireChild, inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - * Episode-property {requireChild, inLibrary=score} - ** Seizure-classification {requireChild, inLibrary=score} [Seizure classification refers to the grouping of seizures based on their clinical features, EEG patterns, and other characteristics. Epileptic seizures are named using the current ILAE seizure classification (Fisher et al., 2017, Beniczky et al., 2017).] - *** Motor-seizure {inLibrary=score} [Involves musculature in any form. The motor event could consist of an increase (positive) or decrease (negative) in muscle contraction to produce a movement. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - *** Motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} - **** Myoclonic-motor-seizure {inLibrary=score} [Sudden, brief ( lower than 100 msec) involuntary single or multiple contraction(s) of muscles(s) or muscle groups of variable topography (axial, proximal limb, distal). Myoclonus is less regularly repetitive and less sustained than is clonus. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Myoclonic-motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} - **** Negative-myoclonic-motor-seizure {inLibrary=score} - **** Negative-myoclonic-motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} - **** Clonic-motor-seizure {inLibrary=score} [Jerking, either symmetric or asymmetric, that is regularly repetitive and involves the same muscle groups. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Clonic-motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} - **** Tonic-motor-seizure {inLibrary=score} [A sustained increase in muscle contraction lasting a few seconds to minutes. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Tonic-motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} - **** Atonic-motor-seizure {inLibrary=score} [Sudden loss or diminution of muscle tone without apparent preceding myoclonic or tonic event lasting about 1 to 2 s, involving head, trunk, jaw, or limb musculature. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Atonic-motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} - **** Myoclonic-atonic-motor-seizure {inLibrary=score} [A generalized seizure type with a myoclonic jerk leading to an atonic motor component. This type was previously called myoclonic astatic. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Myoclonic-atonic-motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} - **** Myoclonic-tonic-clonic-motor-seizure {inLibrary=score} [One or a few jerks of limbs bilaterally, followed by a tonic clonic seizure. The initial jerks can be considered to be either a brief period of clonus or myoclonus. Seizures with this characteristic are common in juvenile myoclonic epilepsy. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Myoclonic-tonic-clonic-motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} - **** Tonic-clonic-motor-seizure {inLibrary=score} [A sequence consisting of a tonic followed by a clonic phase. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Tonic-clonic-motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} - **** Automatism-motor-seizure {inLibrary=score} [A more or less coordinated motor activity usually occurring when cognition is impaired and for which the subject is usually (but not always) amnesic afterward. This often resembles a voluntary movement and may consist of an inappropriate continuation of preictal motor activity. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Automatism-motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} - **** Hyperkinetic-motor-seizure {inLibrary=score} - **** Hyperkinetic-motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} - **** Epileptic-spasm-episode {inLibrary=score} [A sudden flexion, extension, or mixed extension flexion of predominantly proximal and truncal muscles that is usually more sustained than a myoclonic movement but not as sustained as a tonic seizure. Limited forms may occur: Grimacing, head nodding, or subtle eye movements. Epileptic spasms frequently occur in clusters. Infantile spasms are the best known form, but spasms can occur at all ages. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - *** Nonmotor-seizure {inLibrary=score} [Focal or generalized seizure types in which motor activity is not prominent. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Behavior-arrest-nonmotor-seizure {inLibrary=score} [Arrest (pause) of activities, freezing, immobilization, as in behavior arrest seizure. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Sensory-nonmotor-seizure {inLibrary=score} [A perceptual experience not caused by appropriate stimuli in the external world. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Emotional-nonmotor-seizure {inLibrary=score} [Seizures presenting with an emotion or the appearance of having an emotion as an early prominent feature, such as fear, spontaneous joy or euphoria, laughing (gelastic), or crying (dacrystic). Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Cognitive-nonmotor-seizure {inLibrary=score} [Pertaining to thinking and higher cortical functions, such as language, spatial perception, memory, and praxis. The previous term for similar usage as a seizure type was psychic. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Autonomic-nonmotor-seizure {inLibrary=score} [A distinct alteration of autonomic nervous system function involving cardiovascular, pupillary, gastrointestinal, sudomotor, vasomotor, and thermoregulatory functions. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - *** Absence-seizure {inLibrary=score} [Absence seizures present with a sudden cessation of activity and awareness. Absence seizures tend to occur in younger age groups, have more sudden start and termination, and they usually display less complex automatisms than do focal seizures with impaired awareness, but the distinctions are not absolute. EEG information may be required for accurate classification. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Typical-absence-seizure {inLibrary=score} [A sudden onset, interruption of ongoing activities, a blank stare, possibly a brief upward deviation of the eyes. Usually the patient will be unresponsive when spoken to. Duration is a few seconds to half a minute with very rapid recovery. Although not always available, an EEG would show generalized epileptiform discharges during the event. An absence seizure is by definition a seizure of generalized onset. The word is not synonymous with a blank stare, which also can be encountered with focal onset seizures. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Atypical-absence-seizure {inLibrary=score} [An absence seizure with changes in tone that are more pronounced than in typical absence or the onset and/or cessation is not abrupt, often associated with slow, irregular, generalized spike-wave activity. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Myoclonic-absence-seizure {inLibrary=score} [A myoclonic absence seizure refers to an absence seizure with rhythmic three-per-second myoclonic movements, causing ratcheting abduction of the upper limbs leading to progressive arm elevation, and associated with three-per-second generalized spike-wave discharges. Duration is typically 10 to 60 s. Impairment of consciousness may not be obvious. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - **** Eyelid-myoclonia-absence-seizure {inLibrary=score} [Eyelid myoclonia are myoclonic jerks of the eyelids and upward deviation of the eyes, often precipitated by closing the eyes or by light. Eyelid myoclonia can be associated with absences, but also can be motor seizures without a corresponding absence, making them difficult to categorize. The 2017 classification groups them with nonmotor (absence) seizures, which may seem counterintuitive, but the myoclonia in this instance is meant to link with absence, rather than with nonmotor. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] - ** Episode-phase {requireChild, suggestedTag=Seizure-semiology-manifestation, suggestedTag=Postictal-semiology-manifestation, suggestedTag=Ictal-EEG-patterns, inLibrary=score} [The electroclinical findings (i.e., the seizure semiology and the ictal EEG) are divided in three phases: onset, propagation, and postictal.] - *** Episode-phase-initial {inLibrary=score} - *** Episode-phase-subsequent {inLibrary=score} - *** Episode-phase-postictal {inLibrary=score} - ** Seizure-semiology-manifestation {requireChild, inLibrary=score} [Seizure semiology refers to the clinical features or signs that are observed during a seizure, such as the type of movements or behaviors exhibited by the person having the seizure, the duration of the seizure, the level of consciousness, and any associated symptoms such as aura or postictal confusion. In other words, seizure semiology describes the physical manifestations of a seizure. Semiology is described according to the ILAE Glossary of Descriptive Terminology for Ictal Semiology (Blume et al., 2001). Besides the name, the semiologic finding can also be characterized by the somatotopic modifier, laterality, body part and centricity. Uses Location-property tags.] - *** Semiology-motor-manifestation {inLibrary=score} - **** Semiology-elementary-motor {inLibrary=score} - ***** Semiology-motor-tonic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [A sustained increase in muscle contraction lasting a few seconds to minutes.] - ***** Semiology-motor-dystonic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Sustained contractions of both agonist and antagonist muscles producing athetoid or twisting movements, which, when prolonged, may produce abnormal postures.] - ***** Semiology-motor-epileptic-spasm {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [A sudden flexion, extension, or mixed extension flexion of predominantly proximal and truncal muscles that is usually more sustained than a myoclonic movement but not so sustained as a tonic seizure (i.e., about 1 s). Limited forms may occur: grimacing, head nodding. Frequent occurrence in clusters.] - ***** Semiology-motor-postural {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Adoption of a posture that may be bilaterally symmetric or asymmetric (as in a fencing posture).] - ***** Semiology-motor-versive {suggestedTag=Body-part-location, suggestedTag=Episode-event-count, inLibrary=score} [A sustained, forced conjugate ocular, cephalic, and/or truncal rotation or lateral deviation from the midline.] - ***** Semiology-motor-clonic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Myoclonus that is regularly repetitive, involves the same muscle groups, at a frequency of about 2 to 3 c/s, and is prolonged. Synonym: rhythmic myoclonus .] - ***** Semiology-motor-myoclonic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Characterized by myoclonus. MYOCLONUS : sudden, brief (lower than 100 ms) involuntary single or multiple contraction(s) of muscles(s) or muscle groups of variable topography (axial, proximal limb, distal).] - ***** Semiology-motor-jacksonian-march {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Term indicating spread of clonic movements through contiguous body parts unilaterally.] - ***** Semiology-motor-negative-myoclonus {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Characterized by negative myoclonus. NEGATIVE MYOCLONUS: interruption of tonic muscular activity for lower than 500 ms without evidence of preceding myoclonia.] - ***** Semiology-motor-tonic-clonic {requireChild, inLibrary=score} [A sequence consisting of a tonic followed by a clonic phase. Variants such as clonic-tonic-clonic may be seen. Asymmetry of limb posture during the tonic phase of a GTC: one arm is rigidly extended at the elbow (often with the fist clenched tightly and flexed at the wrist), whereas the opposite arm is flexed at the elbow.] - ****** Semiology-motor-tonic-clonic-without-figure-of-four {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} - ****** Semiology-motor-tonic-clonic-with-figure-of-four-extension-left-elbow {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} - ****** Semiology-motor-tonic-clonic-with-figure-of-four-extension-right-elbow {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} - ***** Semiology-motor-astatic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Loss of erect posture that results from an atonic, myoclonic, or tonic mechanism. Synonym: drop attack.] - ***** Semiology-motor-atonic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Sudden loss or diminution of muscle tone without apparent preceding myoclonic or tonic event lasting greater or equal to 1 to 2 s, involving head, trunk, jaw, or limb musculature.] - ***** Semiology-motor-eye-blinking {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count, inLibrary=score} - ***** Semiology-motor-other-elementary-motor {requireChild, inLibrary=score} - ****** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Semiology-motor-automatisms {inLibrary=score} - ***** Semiology-motor-automatisms-mimetic {suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count, inLibrary=score} [Facial expression suggesting an emotional state, often fear.] - ***** Semiology-motor-automatisms-oroalimentary {suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count, inLibrary=score} [Lip smacking, lip pursing, chewing, licking, tooth grinding, or swallowing.] - ***** Semiology-motor-automatisms-dacrystic {suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count, inLibrary=score} [Bursts of crying.] - ***** Semiology-motor-automatisms-dyspraxic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count, inLibrary=score} [Inability to perform learned movements spontaneously or on command or imitation despite intact relevant motor and sensory systems and adequate comprehension and cooperation.] - ***** Semiology-motor-automatisms-manual {suggestedTag=Brain-laterality, suggestedTag=Brain-centricity, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count, inLibrary=score} [1. Indicates principally distal components, bilateral or unilateral. 2. Fumbling, tapping, manipulating movements.] - ***** Semiology-motor-automatisms-gestural {suggestedTag=Brain-laterality, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count, inLibrary=score} [Semipurposive, asynchronous hand movements. Often unilateral.] - ***** Semiology-motor-automatisms-pedal {suggestedTag=Brain-laterality, suggestedTag=Brain-centricity, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count, inLibrary=score} [1. Indicates principally distal components, bilateral or unilateral. 2. Fumbling, tapping, manipulating movements.] - ***** Semiology-motor-automatisms-hypermotor {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count, inLibrary=score} [1. Involves predominantly proximal limb or axial muscles producing irregular sequential ballistic movements, such as pedaling, pelvic thrusting, thrashing, rocking movements. 2. Increase in rate of ongoing movements or inappropriately rapid performance of a movement.] - ***** Semiology-motor-automatisms-hypokinetic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count, inLibrary=score} [A decrease in amplitude and/or rate or arrest of ongoing motor activity.] - ***** Semiology-motor-automatisms-gelastic {suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count, inLibrary=score} [Bursts of laughter or giggling, usually without an appropriate affective tone.] - ***** Semiology-motor-other-automatisms {requireChild, inLibrary=score} - ****** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Semiology-motor-behavioral-arrest {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Interruption of ongoing motor activity or of ongoing behaviors with fixed gaze, without movement of the head or trunk (oro-alimentary and hand automatisms may continue).] - *** Semiology-non-motor-manifestation {inLibrary=score} - **** Semiology-sensory {inLibrary=score} - ***** Semiology-sensory-headache {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count, inLibrary=score} [Headache occurring in close temporal proximity to the seizure or as the sole seizure manifestation.] - ***** Semiology-sensory-visual {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count, inLibrary=score} [Flashing or flickering lights, spots, simple patterns, scotomata, or amaurosis.] - ***** Semiology-sensory-auditory {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count, inLibrary=score} [Buzzing, drumming sounds or single tones.] - ***** Semiology-sensory-olfactory {suggestedTag=Body-part-location, suggestedTag=Episode-event-count, inLibrary=score} - ***** Semiology-sensory-gustatory {suggestedTag=Episode-event-count, inLibrary=score} [Taste sensations including acidic, bitter, salty, sweet, or metallic.] - ***** Semiology-sensory-epigastric {suggestedTag=Episode-event-count, inLibrary=score} [Abdominal discomfort including nausea, emptiness, tightness, churning, butterflies, malaise, pain, and hunger; sensation may rise to chest or throat. Some phenomena may reflect ictal autonomic dysfunction.] - ***** Semiology-sensory-somatosensory {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Tingling, numbness, electric-shock sensation, sense of movement or desire to move.] - ***** Semiology-sensory-painful {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Peripheral (lateralized/bilateral), cephalic, abdominal.] - ***** Semiology-sensory-autonomic-sensation {suggestedTag=Episode-event-count, inLibrary=score} [A sensation consistent with involvement of the autonomic nervous system, including cardiovascular, gastrointestinal, sudomotor, vasomotor, and thermoregulatory functions. (Thus autonomic aura; cf. autonomic events 3.0).] - ***** Semiology-sensory-other {requireChild, inLibrary=score} - ****** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Semiology-experiential {inLibrary=score} - ***** Semiology-experiential-affective-emotional {suggestedTag=Episode-event-count, inLibrary=score} [Components include fear, depression, joy, and (rarely) anger.] - ***** Semiology-experiential-hallucinatory {suggestedTag=Episode-event-count, inLibrary=score} [Composite perceptions without corresponding external stimuli involving visual, auditory, somatosensory, olfactory, and/or gustatory phenomena. Example: hearing and seeing people talking.] - ***** Semiology-experiential-illusory {suggestedTag=Episode-event-count, inLibrary=score} [An alteration of actual percepts involving the visual, auditory, somatosensory, olfactory, or gustatory systems.] - ***** Semiology-experiential-mnemonic {inLibrary=score} [Components that reflect ictal dysmnesia such as feelings of familiarity (deja-vu) and unfamiliarity (jamais-vu).] - ****** Semiology-experiential-mnemonic-Deja-vu {suggestedTag=Episode-event-count, inLibrary=score} - ****** Semiology-experiential-mnemonic-Jamais-vu {suggestedTag=Episode-event-count, inLibrary=score} - ***** Semiology-experiential-other {requireChild, inLibrary=score} - ****** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Semiology-dyscognitive {suggestedTag=Episode-event-count, inLibrary=score} [The term describes events in which (1) disturbance of cognition is the predominant or most apparent feature, and (2a) two or more of the following components are involved, or (2b) involvement of such components remains undetermined. Otherwise, use the more specific term (e.g., mnemonic experiential seizure or hallucinatory experiential seizure). Components of cognition: ++ perception: symbolic conception of sensory information ++ attention: appropriate selection of a principal perception or task ++ emotion: appropriate affective significance of a perception ++ memory: ability to store and retrieve percepts or concepts ++ executive function: anticipation, selection, monitoring of consequences, and initiation of motor activity including praxis, speech.] - **** Semiology-language-related {inLibrary=score} - ***** Semiology-language-related-vocalization {suggestedTag=Episode-event-count, inLibrary=score} - ***** Semiology-language-related-verbalization {suggestedTag=Episode-event-count, inLibrary=score} - ***** Semiology-language-related-dysphasia {suggestedTag=Episode-event-count, inLibrary=score} - ***** Semiology-language-related-aphasia {suggestedTag=Episode-event-count, inLibrary=score} - ***** Semiology-language-related-other {requireChild, inLibrary=score} - ****** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Semiology-autonomic {inLibrary=score} - ***** Semiology-autonomic-pupillary {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count, inLibrary=score} [Mydriasis, miosis (either bilateral or unilateral).] - ***** Semiology-autonomic-hypersalivation {suggestedTag=Episode-event-count, inLibrary=score} [Increase in production of saliva leading to uncontrollable drooling] - ***** Semiology-autonomic-respiratory-apnoeic {suggestedTag=Episode-event-count, inLibrary=score} [subjective shortness of breath, hyperventilation, stridor, coughing, choking, apnea, oxygen desaturation, neurogenic pulmonary edema.] - ***** Semiology-autonomic-cardiovascular {suggestedTag=Episode-event-count, inLibrary=score} [Modifications of heart rate (tachycardia, bradycardia), cardiac arrhythmias (such as sinus arrhythmia, sinus arrest, supraventricular tachycardia, atrial premature depolarizations, ventricular premature depolarizations, atrio-ventricular block, bundle branch block, atrioventricular nodal escape rhythm, asystole).] - ***** Semiology-autonomic-gastrointestinal {suggestedTag=Episode-event-count, inLibrary=score} [Nausea, eructation, vomiting, retching, abdominal sensations, abdominal pain, flatulence, spitting, diarrhea.] - ***** Semiology-autonomic-urinary-incontinence {suggestedTag=Episode-event-count, inLibrary=score} [urinary urge (intense urinary urge at the beginning of seizures), urinary incontinence, ictal urination (rare symptom of partial seizures without loss of consciousness).] - ***** Semiology-autonomic-genital {suggestedTag=Episode-event-count, inLibrary=score} [Sexual auras (erotic thoughts and feelings, sexual arousal and orgasm). Genital auras (unpleasant, sometimes painful, frightening or emotionally neutral somatosensory sensations in the genitals that can be accompanied by ictal orgasm). Sexual automatisms (hypermotor movements consisting of writhing, thrusting, rhythmic movements of the pelvis, arms and legs, sometimes associated with picking and rhythmic manipulation of the groin or genitalia, exhibitionism and masturbation).] - ***** Semiology-autonomic-vasomotor {suggestedTag=Episode-event-count, inLibrary=score} [Flushing or pallor (may be accompanied by feelings of warmth, cold and pain).] - ***** Semiology-autonomic-sudomotor {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count, inLibrary=score} [Sweating and piloerection (may be accompanied by feelings of warmth, cold and pain).] - ***** Semiology-autonomic-thermoregulatory {suggestedTag=Episode-event-count, inLibrary=score} [Hyperthermia, fever.] - ***** Semiology-autonomic-other {requireChild, inLibrary=score} - ****** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Semiology-manifestation-other {requireChild, inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Postictal-semiology-manifestation {requireChild, inLibrary=score} - *** Postictal-semiology-unconscious {suggestedTag=Episode-event-count, inLibrary=score} - *** Postictal-semiology-quick-recovery-of-consciousness {suggestedTag=Episode-event-count, inLibrary=score} [Quick recovery of awareness and responsiveness.] - *** Postictal-semiology-aphasia-or-dysphasia {suggestedTag=Episode-event-count, inLibrary=score} [Impaired communication involving language without dysfunction of relevant primary motor or sensory pathways, manifested as impaired comprehension, anomia, parahasic errors or a combination of these.] - *** Postictal-semiology-behavioral-change {suggestedTag=Episode-event-count, inLibrary=score} [Occurring immediately after a aseizure. Including psychosis, hypomanina, obsessive-compulsive behavior.] - *** Postictal-semiology-hemianopia {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count, inLibrary=score} [Postictal visual loss in a a hemi field.] - *** Postictal-semiology-impaired-cognition {suggestedTag=Episode-event-count, inLibrary=score} [Decreased Cognitive performance involving one or more of perception, attention, emotion, memory, execution, praxis, speech.] - *** Postictal-semiology-dysphoria {suggestedTag=Episode-event-count, inLibrary=score} [Depression, irritability, euphoric mood, fear, anxiety.] - *** Postictal-semiology-headache {suggestedTag=Episode-event-count, inLibrary=score} [Headache with features of tension-type or migraine headache that develops within 3 h following the seizure and resolves within 72 h after seizure.] - *** Postictal-semiology-nose-wiping {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count, inLibrary=score} [Noes-wiping usually within 60 sec of seizure offset, usually with the hand ipsilateral to the seizure onset.] - *** Postictal-semiology-anterograde-amnesia {suggestedTag=Episode-event-count, inLibrary=score} [Impaired ability to remember new material.] - *** Postictal-semiology-retrograde-amnesia {suggestedTag=Episode-event-count, inLibrary=score} [Impaired ability to recall previously remember material.] - *** Postictal-semiology-paresis {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Todds palsy. Any unilateral postictal dysfunction relating to motor, language, sensory and/or integrative functions.] - *** Postictal-semiology-sleep {inLibrary=score} [Invincible need to sleep after a seizure.] - *** Postictal-semiology-unilateral-myoclonic-jerks {inLibrary=score} [unilateral motor phenomena, other then specified, occurring in postictal phase.] - *** Postictal-semiology-other-unilateral-motor-phenomena {requireChild, inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Polygraphic-channel-relation-to-episode {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} - *** Polygraphic-channel-cause-to-episode {inLibrary=score} - *** Polygraphic-channel-consequence-of-episode {inLibrary=score} - ** Ictal-EEG-patterns {inLibrary=score} - *** Ictal-EEG-patterns-obscured-by-artifacts {inLibrary=score} [The interpretation of the EEG is not possible due to artifacts.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Ictal-EEG-activity {suggestedTag=Polyspikes-morphology, suggestedTag=Fast-spike-activity-morphology, suggestedTag=Low-voltage-fast-activity-morphology, suggestedTag=Polysharp-waves-morphology, suggestedTag=Spike-and-slow-wave-morphology, suggestedTag=Polyspike-and-slow-wave-morphology, suggestedTag=Sharp-and-slow-wave-morphology, suggestedTag=Rhythmic-activity-morphology, suggestedTag=Slow-wave-large-amplitude-morphology, suggestedTag=Irregular-delta-or-theta-activity-morphology, suggestedTag=Electrodecremental-change-morphology, suggestedTag=DC-shift-morphology, suggestedTag=Disappearance-of-ongoing-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Source-analysis-laterality, suggestedTag=Source-analysis-brain-region, suggestedTag=Episode-event-count, inLibrary=score} - *** Postictal-EEG-activity {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, inLibrary=score} - ** Episode-time-context-property {inLibrary=score} [Additional clinically relevant features related to episodes can be scored under timing and context. If needed, episode duration can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Temporal-value/Duration.] - *** Episode-consciousness {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} - **** Episode-consciousness-not-tested {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Episode-consciousness-affected {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Episode-consciousness-mildly-affected {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Episode-consciousness-not-affected {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Episode-awareness {suggestedTag=Property-not-possible-to-determine, suggestedTag=Property-exists, suggestedTag=Property-absence, inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Clinical-EEG-temporal-relationship {suggestedTag=Property-not-possible-to-determine, inLibrary=score} - **** Clinical-start-followed-EEG {inLibrary=score} [Clinical start, followed by EEG start by X seconds.] - ***** # {takesValue, valueClass=numericClass, unitClass=timeUnits, inLibrary=score} - **** EEG-start-followed-clinical {inLibrary=score} [EEG start, followed by clinical start by X seconds.] - ***** # {takesValue, valueClass=numericClass, unitClass=timeUnits, inLibrary=score} - **** Simultaneous-start-clinical-EEG {inLibrary=score} - **** Clinical-EEG-temporal-relationship-notes {inLibrary=score} [Clinical notes to annotate the clinical-EEG temporal relationship.] - ***** # {takesValue, valueClass=textClass, inLibrary=score} - *** Episode-event-count {suggestedTag=Property-not-possible-to-determine, inLibrary=score} [Number of stereotypical episodes during the recording.] - **** # {takesValue, valueClass=numericClass, inLibrary=score} - *** State-episode-start {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} [State at the start of the episode.] - **** Episode-start-from-sleep {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Episode-start-from-awake {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Episode-postictal-phase {suggestedTag=Property-not-possible-to-determine, inLibrary=score} - **** # {takesValue, valueClass=numericClass, unitClass=timeUnits, inLibrary=score} - *** Episode-prodrome {suggestedTag=Property-exists, suggestedTag=Property-absence, inLibrary=score} [Prodrome is a preictal phenomenon, and it is defined as a subjective or objective clinical alteration (e.g., ill-localized sensation or agitation) that heralds the onset of an epileptic seizure but does not form part of it (Blume et al., 2001). Therefore, prodrome should be distinguished from aura (which is an ictal phenomenon).] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Episode-tongue-biting {suggestedTag=Property-exists, suggestedTag=Property-absence, inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Episode-responsiveness {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} - **** Episode-responsiveness-preserved {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Episode-responsiveness-affected {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Episode-appearance {requireChild, inLibrary=score} - **** Episode-appearance-interactive {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Episode-appearance-spontaneous {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Seizure-dynamics {requireChild, inLibrary=score} [Spatiotemporal dynamics can be scored (evolution in morphology; evolution in frequency; evolution in location).] - **** Seizure-dynamics-evolution-morphology {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Seizure-dynamics-evolution-frequency {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Seizure-dynamics-evolution-location {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** Seizure-dynamics-not-possible-to-determine {inLibrary=score} [Not possible to determine.] - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - * Other-finding-property {requireChild, inLibrary=score} - ** Artifact-significance-to-recording {requireChild, inLibrary=score} [It is important to score the significance of the described artifacts: recording is not interpretable, recording of reduced diagnostic value, does not interfere with the interpretation of the recording.] - *** Recording-not-interpretable-due-to-artifact {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Recording-of-reduced-diagnostic-value-due-to-artifact {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Artifact-does-not-interfere-recording {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Finding-significance-to-recording {requireChild, inLibrary=score} [Significance of finding. When normal/abnormal could be labeled with base schema Normal/Abnormal tags.] - *** Finding-no-definite-abnormality {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Finding-significance-not-possible-to-determine {inLibrary=score} [Not possible to determine.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Finding-frequency {inLibrary=score} [Value in Hz (number) typed in.] - *** # {takesValue, valueClass=numericClass, unitClass=frequencyUnits, inLibrary=score} - ** Finding-amplitude {inLibrary=score} [Value in microvolts (number) typed in.] - *** # {takesValue, valueClass=numericClass, unitClass=electricPotentialUnits, inLibrary=score} - ** Finding-amplitude-asymmetry {requireChild, inLibrary=score} [For posterior dominant rhythm: a difference in amplitude between the homologous area on opposite sides of the head that consistently exceeds 50 percent. When symmetrical could be labeled with base schema Symmetrical tag. For sleep: Absence or consistently marked amplitude asymmetry (greater than 50 percent) of a normal sleep graphoelement.] - *** Finding-amplitude-asymmetry-lower-left {inLibrary=score} [Amplitude lower on the left side.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Finding-amplitude-asymmetry-lower-right {inLibrary=score} [Amplitude lower on the right side.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Finding-amplitude-asymmetry-not-possible-to-determine {inLibrary=score} [Not possible to determine.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Finding-stopped-by {inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Finding-triggered-by {inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Finding-unmodified {inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Property-not-possible-to-determine {inLibrary=score} [Not possible to determine.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Property-exists {inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Property-absence {inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - -'''Interictal-finding''' {requireChild, inLibrary=score} [EEG pattern / transient that is distinguished form the background activity, considered abnormal, but is not recorded during ictal period (seizure) or postictal period; the presence of an interictal finding does not necessarily imply that the patient has epilepsy.] - * Epileptiform-interictal-activity {suggestedTag=Spike-morphology, suggestedTag=Spike-and-slow-wave-morphology, suggestedTag=Runs-of-rapid-spikes-morphology, suggestedTag=Polyspikes-morphology, suggestedTag=Polyspike-and-slow-wave-morphology, suggestedTag=Sharp-wave-morphology, suggestedTag=Sharp-and-slow-wave-morphology, suggestedTag=Slow-sharp-wave-morphology, suggestedTag=High-frequency-oscillation-morphology, suggestedTag=Hypsarrhythmia-classic-morphology, suggestedTag=Hypsarrhythmia-modified-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-propagation, suggestedTag=Multifocal-finding, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, suggestedTag=Finding-incidence, inLibrary=score} - * Abnormal-interictal-rhythmic-activity {suggestedTag=Rhythmic-activity-morphology, suggestedTag=Polymorphic-delta-activity-morphology, suggestedTag=Frontal-intermittent-rhythmic-delta-activity-morphology, suggestedTag=Occipital-intermittent-rhythmic-delta-activity-morphology, suggestedTag=Temporal-intermittent-rhythmic-delta-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, suggestedTag=Finding-incidence, inLibrary=score} - * Interictal-special-patterns {requireChild, inLibrary=score} - ** Interictal-periodic-discharges {suggestedTag=Periodic-discharge-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Periodic-discharge-time-related-features, inLibrary=score} [Periodic discharge not further specified (PDs).] - *** Generalized-periodic-discharges {inLibrary=score} [GPDs.] - *** Lateralized-periodic-discharges {inLibrary=score} [LPDs.] - *** Bilateral-independent-periodic-discharges {inLibrary=score} [BIPDs.] - *** Multifocal-periodic-discharges {inLibrary=score} [MfPDs.] - ** Extreme-delta-brush {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} - -'''Item''' {extensionAllowed} [An independently existing thing (living or nonliving).] - * Biological-item [An entity that is biological, that is related to living organisms.] - ** Anatomical-item [A biological structure, system, fluid or other substance excluding single molecular entities.] - *** Body [The biological structure representing an organism.] - *** Body-part [Any part of an organism.] - **** Head [The upper part of the human body, or the front or upper part of the body of an animal, typically separated from the rest of the body by a neck, and containing the brain, mouth, and sense organs.] - ***** Ear [A sense organ needed for the detection of sound and for establishing balance.] - ***** Face [The anterior portion of the head extending from the forehead to the chin and ear to ear. The facial structures contain the eyes, nose and mouth, cheeks and jaws.] - ****** Cheek [The fleshy part of the face bounded by the eyes, nose, ear, and jaw line.] - ****** Chin [The part of the face below the lower lip and including the protruding part of the lower jaw.] - ****** Eye [The organ of sight or vision.] - ****** Eyebrow [The arched strip of hair on the bony ridge above each eye socket.] - ****** Forehead [The part of the face between the eyebrows and the normal hairline.] - ****** Lip [Fleshy fold which surrounds the opening of the mouth.] - ****** Mouth [The proximal portion of the digestive tract, containing the oral cavity and bounded by the oral opening.] - ****** Nose [A structure of special sense serving as an organ of the sense of smell and as an entrance to the respiratory tract.] - ****** Teeth [The hard bonelike structures in the jaws. A collection of teeth arranged in some pattern in the mouth or other part of the body.] - ***** Hair [The filamentous outgrowth of the epidermis.] - **** Lower-extremity [Refers to the whole inferior limb (leg and/or foot).] - ***** Ankle [A gliding joint between the distal ends of the tibia and fibula and the proximal end of the talus.] - ***** Calf [The fleshy part at the back of the leg below the knee.] - ***** Foot [The structure found below the ankle joint required for locomotion.] - ****** Big-toe [The largest toe on the inner side of the foot.] - ****** Heel [The back of the foot below the ankle.] - ****** Instep [The part of the foot between the ball and the heel on the inner side.] - ****** Little-toe [The smallest toe located on the outer side of the foot.] - ****** Toes [The terminal digits of the foot.] - ***** Knee [A joint connecting the lower part of the femur with the upper part of the tibia.] - ***** Shin [Front part of the leg below the knee.] - ***** Thigh [Upper part of the leg between hip and knee.] - **** Torso [The body excluding the head and neck and limbs.] - ***** Buttocks [The round fleshy parts that form the lower rear area of a human trunk.] - ***** Gentalia {deprecatedFrom=8.1.0} [The external organs of reproduction.] - ***** Hip [The lateral prominence of the pelvis from the waist to the thigh.] - ***** Torso-back [The rear surface of the human body from the shoulders to the hips.] - ***** Torso-chest [The anterior side of the thorax from the neck to the abdomen.] - ***** Waist [The abdominal circumference at the navel.] - **** Upper-extremity [Refers to the whole superior limb (shoulder, arm, elbow, wrist, hand).] - ***** Elbow [A type of hinge joint located between the forearm and upper arm.] - ***** Forearm [Lower part of the arm between the elbow and wrist.] - ***** Hand [The distal portion of the upper extremity. It consists of the carpus, metacarpus, and digits.] - ****** Finger [Any of the digits of the hand.] - ******* Index-finger [The second finger from the radial side of the hand, next to the thumb.] - ******* Little-finger [The fifth and smallest finger from the radial side of the hand.] - ******* Middle-finger [The middle or third finger from the radial side of the hand.] - ******* Ring-finger [The fourth finger from the radial side of the hand.] - ******* Thumb [The thick and short hand digit which is next to the index finger in humans.] - ****** Knuckles [A part of a finger at a joint where the bone is near the surface, especially where the finger joins the hand.] - ****** Palm [The part of the inner surface of the hand that extends from the wrist to the bases of the fingers.] - ***** Shoulder [Joint attaching upper arm to trunk.] - ***** Upper-arm [Portion of arm between shoulder and elbow.] - ***** Wrist [A joint between the distal end of the radius and the proximal row of carpal bones.] - ** Organism [A living entity, more specifically a biological entity that consists of one or more cells and is capable of genomic replication (independently or not).] - *** Animal [A living organism that has membranous cell walls, requires oxygen and organic foods, and is capable of voluntary movement.] - *** Human [The bipedal primate mammal Homo sapiens.] - *** Plant [Any living organism that typically synthesizes its food from inorganic substances and possesses cellulose cell walls.] - * Language-item {suggestedTag=Sensory-presentation} [An entity related to a systematic means of communicating by the use of sounds, symbols, or gestures.] - ** Character [A mark or symbol used in writing.] - ** Clause [A unit of grammatical organization next below the sentence in rank, usually consisting of a subject and predicate.] - ** Glyph [A hieroglyphic character, symbol, or pictograph.] - ** Nonword [A group of letters or speech sounds that looks or sounds like a word but that is not accepted as such by native speakers.] - ** Paragraph [A distinct section of a piece of writing, usually dealing with a single theme.] - ** Phoneme [A speech sound that is distinguished by the speakers of a particular language.] - ** Phrase [A phrase is a group of words functioning as a single unit in the syntax of a sentence.] - ** Sentence [A set of words that is complete in itself, conveying a statement, question, exclamation, or command and typically containing an explicit or implied subject and a predicate containing a finite verb.] - ** Syllable [A unit of spoken language larger than a phoneme.] - ** Textblock [A block of text.] - ** Word [A word is the smallest free form (an item that may be expressed in isolation with semantic or pragmatic content) in a language.] - * Object {suggestedTag=Sensory-presentation} [Something perceptible by one or more of the senses, especially by vision or touch. A material thing.] - ** Geometric-object [An object or a representation that has structure and topology in space.] - *** 2D-shape [A planar, two-dimensional shape.] - **** Arrow [A shape with a pointed end indicating direction.] - **** Clockface [The dial face of a clock. A location identifier based on clockface numbering or anatomic subregion.] - **** Cross [A figure or mark formed by two intersecting lines crossing at their midpoints.] - **** Dash [A horizontal stroke in writing or printing to mark a pause or break in sense or to represent omitted letters or words.] - **** Ellipse [A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base.] - ***** Circle [A ring-shaped structure with every point equidistant from the center.] - **** Rectangle [A parallelogram with four right angles.] - ***** Square [A square is a special rectangle with four equal sides.] - **** Single-point [A point is a geometric entity that is located in a zero-dimensional spatial region and whose position is defined by its coordinates in some coordinate system.] - **** Star [A conventional or stylized representation of a star, typically one having five or more points.] - **** Triangle [A three-sided polygon.] - *** 3D-shape [A geometric three-dimensional shape.] - **** Box [A square or rectangular vessel, usually made of cardboard or plastic.] - ***** Cube [A solid or semi-solid in the shape of a three dimensional square.] - **** Cone [A shape whose base is a circle and whose sides taper up to a point.] - **** Cylinder [A surface formed by circles of a given radius that are contained in a plane perpendicular to a given axis, whose centers align on the axis.] - **** Ellipsoid [A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base.] - ***** Sphere [A solid or hollow three-dimensional object bounded by a closed surface such that every point on the surface is equidistant from the center.] - **** Pyramid [A polyhedron of which one face is a polygon of any number of sides, and the other faces are triangles with a common vertex.] - *** Pattern [An arrangement of objects, facts, behaviors, or other things which have scientific, mathematical, geometric, statistical, or other meaning.] - **** Dots [A small round mark or spot.] - **** LED-pattern [A pattern created by lighting selected members of a fixed light emitting diode array.] - ** Ingestible-object [Something that can be taken into the body by the mouth for digestion or absorption.] - ** Man-made-object [Something constructed by human means.] - *** Building [A structure that has a roof and walls and stands more or less permanently in one place.] - **** Attic [A room or a space immediately below the roof of a building.] - **** Basement [The part of a building that is wholly or partly below ground level.] - **** Entrance [The means or place of entry.] - **** Roof [A roof is the covering on the uppermost part of a building which provides protection from animals and weather, notably rain, but also heat, wind and sunlight.] - **** Room [An area within a building enclosed by walls and floor and ceiling.] - *** Clothing [A covering designed to be worn on the body.] - *** Device [An object contrived for a specific purpose.] - **** Assistive-device [A device that help an individual accomplish a task.] - ***** Glasses [Frames with lenses worn in front of the eye for vision correction, eye protection, or protection from UV rays.] - ***** Writing-device [A device used for writing.] - ****** Pen [A common writing instrument used to apply ink to a surface for writing or drawing.] - ****** Pencil [An implement for writing or drawing that is constructed of a narrow solid pigment core in a protective casing that prevents the core from being broken or marking the hand.] - **** Computing-device [An electronic device which take inputs and processes results from the inputs.] - ***** Cellphone [A telephone with access to a cellular radio system so it can be used over a wide area, without a physical connection to a network.] - ***** Desktop-computer [A computer suitable for use at an ordinary desk.] - ***** Laptop-computer [A computer that is portable and suitable for use while traveling.] - ***** Tablet-computer [A small portable computer that accepts input directly on to its screen rather than via a keyboard or mouse.] - **** Engine [A motor is a machine designed to convert one or more forms of energy into mechanical energy.] - **** IO-device [Hardware used by a human (or other system) to communicate with a computer.] - ***** Input-device [A piece of equipment used to provide data and control signals to an information processing system such as a computer or information appliance.] - ****** Computer-mouse [A hand-held pointing device that detects two-dimensional motion relative to a surface.] - ******* Mouse-button [An electric switch on a computer mouse which can be pressed or clicked to select or interact with an element of a graphical user interface.] - ******* Scroll-wheel [A scroll wheel or mouse wheel is a wheel used for scrolling made of hard plastic with a rubbery surface usually located between the left and right mouse buttons and is positioned perpendicular to the mouse surface.] - ****** Joystick [A control device that uses a movable handle to create two-axis input for a computer device.] - ****** Keyboard [A device consisting of mechanical keys that are pressed to create input to a computer.] - ******* Keyboard-key [A button on a keyboard usually representing letters, numbers, functions, or symbols.] - ******** # {takesValue} [Value of a keyboard key.] - ****** Keypad [A device consisting of keys, usually in a block arrangement, that provides limited input to a system.] - ******* Keypad-key [A key on a separate section of a computer keyboard that groups together numeric keys and those for mathematical or other special functions in an arrangement like that of a calculator.] - ******** # {takesValue} [Value of keypad key.] - ****** Microphone [A device designed to convert sound to an electrical signal.] - ****** Push-button [A switch designed to be operated by pressing a button.] - ***** Output-device [Any piece of computer hardware equipment which converts information into human understandable form.] - ****** Auditory-device [A device designed to produce sound.] - ******* Headphones [An instrument that consists of a pair of small loudspeakers, or less commonly a single speaker, held close to ears and connected to a signal source such as an audio amplifier, radio, CD player or portable media player.] - ******* Loudspeaker [A device designed to convert electrical signals to sounds that can be heard.] - ****** Display-device [An output device for presentation of information in visual or tactile form the latter used for example in tactile electronic displays for blind people.] - ******* Computer-screen [An electronic device designed as a display or a physical device designed to be a protective meshwork.] - ******** Screen-window [A part of a computer screen that contains a display different from the rest of the screen. A window is a graphical control element consisting of a visual area containing some of the graphical user interface of the program it belongs to and is framed by a window decoration.] - ******* Head-mounted-display [An instrument that functions as a display device, worn on the head or as part of a helmet, that has a small display optic in front of one (monocular HMD) or each eye (binocular HMD).] - ******* LED-display [A LED display is a flat panel display that uses an array of light-emitting diodes as pixels for a video display.] - ***** Recording-device [A device that copies information in a signal into a persistent information bearer.] - ****** EEG-recorder [A device for recording electric currents in the brain using electrodes applied to the scalp, to the surface of the brain, or placed within the substance of the brain.] - ****** File-storage [A device for recording digital information to a permanent media.] - ****** MEG-recorder [A device for measuring the magnetic fields produced by electrical activity in the brain, usually conducted externally.] - ****** Motion-capture [A device for recording the movement of objects or people.] - ****** Tape-recorder [A device for recording and reproduction usually using magnetic tape for storage that can be saved and played back.] - ***** Touchscreen [A control component that operates an electronic device by pressing the display on the screen.] - **** Machine [A human-made device that uses power to apply forces and control movement to perform an action.] - **** Measurement-device [A device in which a measure function inheres.] - ***** Clock [A device designed to indicate the time of day or to measure the time duration of an event or action.] - ****** Clock-face [A location identifier based on clockface numbering or anatomic subregion.] - **** Robot [A mechanical device that sometimes resembles a living animal and is capable of performing a variety of often complex human tasks on command or by being programmed in advance.] - **** Tool [A component that is not part of a device but is designed to support its assemby or operation.] - *** Document [A physical object, or electronic counterpart, that is characterized by containing writing which is meant to be human-readable.] - **** Book [A volume made up of pages fastened along one edge and enclosed between protective covers.] - **** Letter [A written message addressed to a person or organization.] - **** Note [A brief written record.] - **** Notebook [A book for notes or memoranda.] - **** Questionnaire [A document consisting of questions and possibly responses, depending on whether it has been filled out.] - *** Furnishing [Furniture, fittings, and other decorative accessories, such as curtains and carpets, for a house or room.] - *** Manufactured-material [Substances created or extracted from raw materials.] - **** Ceramic [A hard, brittle, heat-resistant and corrosion-resistant material made by shaping and then firing a nonmetallic mineral, such as clay, at a high temperature.] - **** Glass [A brittle transparent solid with irregular atomic structure.] - **** Paper [A thin sheet material produced by mechanically or chemically processing cellulose fibres derived from wood, rags, grasses or other vegetable sources in water.] - **** Plastic [Various high-molecular-weight thermoplastic or thermosetting polymers that are capable of being molded, extruded, drawn, or otherwise shaped and then hardened into a form.] - **** Steel [An alloy made up of iron with typically a few tenths of a percent of carbon to improve its strength and fracture resistance compared to iron.] - *** Media [Media are audo/visual/audiovisual modes of communicating information for mass consumption.] - **** Media-clip [A short segment of media.] - ***** Audio-clip [A short segment of audio.] - ***** Audiovisual-clip [A short media segment containing both audio and video.] - ***** Video-clip [A short segment of video.] - **** Visualization [An planned process that creates images, diagrams or animations from the input data.] - ***** Animation [A form of graphical illustration that changes with time to give a sense of motion or represent dynamic changes in the portrayal.] - ***** Art-installation [A large-scale, mixed-media constructions, often designed for a specific place or for a temporary period of time.] - ***** Braille [A display using a system of raised dots that can be read with the fingers by people who are blind.] - ***** Image [Any record of an imaging event whether physical or electronic.] - ****** Cartoon [A type of illustration, sometimes animated, typically in a non-realistic or semi-realistic style. The specific meaning has evolved over time, but the modern usage usually refers to either an image or series of images intended for satire, caricature, or humor. A motion picture that relies on a sequence of illustrations for its animation.] - ****** Drawing [A representation of an object or outlining a figure, plan, or sketch by means of lines.] - ****** Icon [A sign (such as a word or graphic symbol) whose form suggests its meaning.] - ****** Painting [A work produced through the art of painting.] - ****** Photograph [An image recorded by a camera.] - ***** Movie [A sequence of images displayed in succession giving the illusion of continuous movement.] - ***** Outline-visualization [A visualization consisting of a line or set of lines enclosing or indicating the shape of an object in a sketch or diagram.] - ***** Point-light-visualization [A display in which action is depicted using a few points of light, often generated from discrete sensors in motion capture.] - ***** Sculpture [A two- or three-dimensional representative or abstract forms, especially by carving stone or wood or by casting metal or plaster.] - ***** Stick-figure-visualization [A drawing showing the head of a human being or animal as a circle and all other parts as straight lines.] - *** Navigational-object [An object whose purpose is to assist directed movement from one location to another.] - **** Path [A trodden way. A way or track laid down for walking or made by continual treading.] - **** Road [An open way for the passage of vehicles, persons, or animals on land.] - ***** Lane [A defined path with physical dimensions through which an object or substance may traverse.] - **** Runway [A paved strip of ground on a landing field for the landing and takeoff of aircraft.] - *** Vehicle [A mobile machine which transports people or cargo.] - **** Aircraft [A vehicle which is able to travel through air in an atmosphere.] - **** Bicycle [A human-powered, pedal-driven, single-track vehicle, having two wheels attached to a frame, one behind the other.] - **** Boat [A watercraft of any size which is able to float or plane on water.] - **** Car [A wheeled motor vehicle used primarily for the transportation of human passengers.] - **** Cart [A cart is a vehicle which has two wheels and is designed to transport human passengers or cargo.] - **** Tractor [A mobile machine specifically designed to deliver a high tractive effort at slow speeds, and mainly used for the purposes of hauling a trailer or machinery used in agriculture or construction.] - **** Train [A connected line of railroad cars with or without a locomotive.] - **** Truck [A motor vehicle which, as its primary funcion, transports cargo rather than human passangers.] - ** Natural-object [Something that exists in or is produced by nature, and is not artificial or man-made.] - *** Mineral [A solid, homogeneous, inorganic substance occurring in nature and having a definite chemical composition.] - *** Natural-feature [A feature that occurs in nature. A prominent or identifiable aspect, region, or site of interest.] - **** Field [An unbroken expanse as of ice or grassland.] - **** Hill [A rounded elevation of limited extent rising above the surrounding land with local relief of less than 300m.] - **** Mountain [A landform that extends above the surrounding terrain in a limited area.] - **** River [A natural freshwater surface stream of considerable volume and a permanent or seasonal flow, moving in a definite channel toward a sea, lake, or another river.] - **** Waterfall [A sudden descent of water over a step or ledge in the bed of a river.] - * Sound [Mechanical vibrations transmitted by an elastic medium. Something that can be heard.] - ** Environmental-sound [Sounds occuring in the environment. An accumulation of noise pollution that occurs outside. This noise can be caused by transport, industrial, and recreational activities.] - *** Crowd-sound [Noise produced by a mixture of sounds from a large group of people.] - *** Signal-noise [Any part of a signal that is not the true or original signal but is introduced by the communication mechanism.] - ** Musical-sound [Sound produced by continuous and regular vibrations, as opposed to noise.] - *** Instrument-sound [Sound produced by a musical instrument.] - *** Tone [A musical note, warble, or other sound used as a particular signal on a telephone or answering machine.] - *** Vocalized-sound [Musical sound produced by vocal cords in a biological agent.] - ** Named-animal-sound [A sound recognizable as being associated with particular animals.] - *** Barking [Sharp explosive cries like sounds made by certain animals, especially a dog, fox, or seal.] - *** Bleating [Wavering cries like sounds made by a sheep, goat, or calf.] - *** Chirping [Short, sharp, high-pitched noises like sounds made by small birds or an insects.] - *** Crowing [Loud shrill sounds characteristic of roosters.] - *** Growling [Low guttural sounds like those that made in the throat by a hostile dog or other animal.] - *** Meowing [Vocalizations like those made by as those cats. These sounds have diverse tones and are sometimes chattered, murmured or whispered. The purpose can be assertive.] - *** Mooing [Deep vocal sounds like those made by a cow.] - *** Purring [Low continuous vibratory sound such as those made by cats. The sound expresses contentment.] - *** Roaring [Loud, deep, or harsh prolonged sounds such as those made by big cats and bears for long-distance communication and intimidation.] - *** Squawking [Loud, harsh noises such as those made by geese.] - ** Named-object-sound [A sound identifiable as coming from a particular type of object.] - *** Alarm-sound [A loud signal often loud continuous ringing to alert people to a problem or condition that requires urgent attention.] - *** Beep [A short, single tone, that is typically high-pitched and generally made by a computer or other machine.] - *** Buzz [A persistent vibratory sound often made by a buzzer device and used to indicate something incorrect.] - *** Click [The sound made by a mechanical cash register, often to designate a reward.] - *** Ding [A short ringing sound such as that made by a bell, often to indicate a correct response or the expiration of time.] - *** Horn-blow [A loud sound made by forcing air through a sound device that funnels air to create the sound, often used to sound an alert.] - *** Ka-ching [The sound made by a mechanical cash register, often to designate a reward.] - *** Siren [A loud, continuous sound often varying in frequency designed to indicate an emergency.] - -'''Physiologic-pattern''' {requireChild, inLibrary=score} [EEG graphoelements or rhythms that are considered normal. They only should be scored if the physician considers that they have a specific clinical significance for the recording.] - * Rhythmic-activity-pattern {suggestedTag=Rhythmic-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Not further specified.] - * Slow-alpha-variant-rhythm {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Characteristic rhythms mostly at 4-5 Hz, recorded most prominently over the posterior regions of the head. Generally alternate, or are intermixed, with alpha rhythm to which they often are harmonically related. Amplitude varies but is frequently close to 50 micro V. Blocked or attenuated by attention, especially visual, and mental effort. Comment: slow alpha variant rhythms should be distinguished from posterior slow waves characteristic of children and adolescents and occasionally seen in young adults.] - * Fast-alpha-variant-rhythm {suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Characteristic rhythm at 14-20 Hz, detected most prominently over the posterior regions of the head. May alternate or be intermixed with alpha rhythm. Blocked or attenuated by attention, especially visual, and mental effort.] - * Ciganek-rhythm {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Midline theta rhythm (Ciganek rhythm) may be observed during wakefulness or drowsiness. The frequency is 4-7 Hz, and the location is midline (ie, vertex). The morphology is rhythmic, smooth, sinusoidal, arciform, spiky, or mu-like.] - * Lambda-wave {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Diphasic sharp transient occurring over occipital regions of the head of waking subjects during visual exploration. The main component is positive relative to other areas. Time-locked to saccadic eye movement. Amplitude varies but is generally below 50 micro V.] - * Posterior-slow-waves-youth {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Waves in the delta and theta range, of variable form, lasting 0.35 to 0.5 s or longer without any consistent periodicity, found in the range of 6-12 years (occasionally seen in young adults). Alpha waves are almost always intermingled or superimposed. Reactive similar to alpha activity.] - * Diffuse-slowing-hyperventilation {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Diffuse slowing induced by hyperventilation. Bilateral, diffuse slowing during hyperventilation. Recorded in 70 percent of normal children (3-5 years) and less then 10 percent of adults. Usually appear in the posterior regions and spread forward in younger age group, whereas they tend to appear in the frontal regions and spread backward in the older age group.] - * Photic-driving {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Physiologic response consisting of rhythmic activity elicited over the posterior regions of the head by repetitive photic stimulation at frequencies of about 5-30 Hz. Comments: term should be limited to activity time-locked to the stimulus and of frequency identical or harmonically related to the stimulus frequency. Photic driving should be distinguished from the visual evoked potentials elicited by isolated flashes of light or flashes repeated at very low frequency.] - * Photomyogenic-response {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [A response to intermittent photic stimulation characterized by the appearance in the record of brief, repetitive muscular artifacts (spikes) over the anterior regions of the head. These often increase gradually in amplitude as stimuli are continued and cease promptly when the stimulus is withdrawn. Comment: this response is frequently associated with flutter of the eyelids and vertical oscillations of the eyeballs and sometimes with discrete jerking mostly involving the musculature of the face and head. (Preferred to synonym: photo-myoclonic response).] - * Other-physiologic-pattern {requireChild, inLibrary=score} - ** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - -'''Polygraphic-channel-finding''' {requireChild, inLibrary=score} [Changes observed in polygraphic channels can be scored: EOG, Respiration, ECG, EMG, other polygraphic channel (+ free text), and their significance logged (normal, abnormal, no definite abnormality).] - * EOG-channel-finding {suggestedTag=Finding-significance-to-recording, inLibrary=score} [ElectroOculoGraphy.] - ** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - * Respiration-channel-finding {suggestedTag=Finding-significance-to-recording, inLibrary=score} - ** Respiration-oxygen-saturation {inLibrary=score} - *** # {takesValue, valueClass=numericClass, inLibrary=score} - ** Respiration-feature {inLibrary=score} - *** Apnoe-respiration {inLibrary=score} [Add duration (range in seconds) and comments in free text.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Hypopnea-respiration {inLibrary=score} [Add duration (range in seconds) and comments in free text] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Apnea-hypopnea-index-respiration {requireChild, inLibrary=score} [Events/h. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Periodic-respiration {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Tachypnea-respiration {requireChild, inLibrary=score} [Cycles/min. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Other-respiration-feature {requireChild, inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - * ECG-channel-finding {suggestedTag=Finding-significance-to-recording, inLibrary=score} [Electrocardiography.] - ** ECG-QT-period {inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** ECG-feature {inLibrary=score} - *** ECG-sinus-rhythm {inLibrary=score} [Normal rhythm. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** ECG-arrhythmia {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** ECG-asystolia {inLibrary=score} [Add duration (range in seconds) and comments in free text.] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** ECG-bradycardia {inLibrary=score} [Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** ECG-extrasystole {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** ECG-ventricular-premature-depolarization {inLibrary=score} [Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** ECG-tachycardia {inLibrary=score} [Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Other-ECG-feature {requireChild, inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - * EMG-channel-finding {suggestedTag=Finding-significance-to-recording, inLibrary=score} [electromyography] - ** EMG-muscle-side {inLibrary=score} - *** EMG-left-muscle {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** EMG-right-muscle {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** EMG-bilateral-muscle {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** EMG-muscle-name {inLibrary=score} - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** EMG-feature {inLibrary=score} - *** EMG-myoclonus {inLibrary=score} - **** Negative-myoclonus {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** EMG-myoclonus-rhythmic {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** EMG-myoclonus-arrhythmic {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** EMG-myoclonus-synchronous {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** EMG-myoclonus-asynchronous {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** EMG-PLMS {inLibrary=score} [Periodic limb movements in sleep.] - *** EMG-spasm {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** EMG-tonic-contraction {inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** EMG-asymmetric-activation {requireChild, inLibrary=score} - **** EMG-asymmetric-activation-left-first {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - **** EMG-asymmetric-activation-right-first {inLibrary=score} - ***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - *** Other-EMG-features {requireChild, inLibrary=score} - **** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - * Other-polygraphic-channel {requireChild, inLibrary=score} - ** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - -'''Property''' {extensionAllowed} [Something that pertains to a thing. A characteristic of some entity. A quality or feature regarded as a characteristic or inherent part of someone or something. HED attributes are adjectives or adverbs.] - * Agent-property {extensionAllowed} [Something that pertains to an agent.] - ** Agent-state [The state of the agent.] - *** Agent-cognitive-state [The state of the cognitive processes or state of mind of the agent.] - **** Alert [Condition of heightened watchfulness or preparation for action.] - **** Anesthetized [Having lost sensation to pain or having senses dulled due to the effects of an anesthetic.] - **** Asleep [Having entered a periodic, readily reversible state of reduced awareness and metabolic activity, usually accompanied by physical relaxation and brain activity.] - **** Attentive [Concentrating and focusing mental energy on the task or surroundings.] - **** Awake [In a non sleeping state.] - **** Brain-dead [Characterized by the irreversible absence of cortical and brain stem functioning.] - **** Comatose [In a state of profound unconsciousness associated with markedly depressed cerebral activity.] - **** Distracted [Lacking in concentration because of being preoccupied.] - **** Drowsy [In a state of near-sleep, a strong desire for sleep, or sleeping for unusually long periods.] - **** Intoxicated [In a state with disturbed psychophysiological functions and responses as a result of administration or ingestion of a psychoactive substance.] - **** Locked-in [In a state of complete paralysis of all voluntary muscles except for the ones that control the movements of the eyes.] - **** Passive [Not responding or initiating an action in response to a stimulus.] - **** Resting [A state in which the agent is not exhibiting any physical exertion.] - **** Vegetative [A state of wakefulness and conscience, but (in contrast to coma) with involuntary opening of the eyes and movements (such as teeth grinding, yawning, or thrashing of the extremities).] - *** Agent-emotional-state [The status of the general temperament and outlook of an agent.] - **** Angry [Experiencing emotions characterized by marked annoyance or hostility.] - **** Aroused [In a state reactive to stimuli leading to increased heart rate and blood pressure, sensory alertness, mobility and readiness to respond.] - **** Awed [Filled with wonder. Feeling grand, sublime or powerful emotions characterized by a combination of joy, fear, admiration, reverence, and/or respect.] - **** Compassionate [Feeling or showing sympathy and concern for others often evoked for a person who is in distress and associated with altruistic motivation.] - **** Content [Feeling satisfaction with things as they are.] - **** Disgusted [Feeling revulsion or profound disapproval aroused by something unpleasant or offensive.] - **** Emotionally-neutral [Feeling neither satisfied nor dissatisfied.] - **** Empathetic [Understanding and sharing the feelings of another. Being aware of, being sensitive to, and vicariously experiencing the feelings, thoughts, and experience of another.] - **** Excited [Feeling great enthusiasm and eagerness.] - **** Fearful [Feeling apprehension that one may be in danger.] - **** Frustrated [Feeling annoyed as a result of being blocked, thwarted, disappointed or defeated.] - **** Grieving [Feeling sorrow in response to loss, whether physical or abstract.] - **** Happy [Feeling pleased and content.] - **** Jealous [Feeling threatened by a rival in a relationship with another individual, in particular an intimate partner, usually involves feelings of threat, fear, suspicion, distrust, anxiety, anger, betrayal, and rejection.] - **** Joyful [Feeling delight or intense happiness.] - **** Loving [Feeling a strong positive emotion of affection and attraction.] - **** Relieved [No longer feeling pain, distress, anxiety, or reassured.] - **** Sad [Feeling grief or unhappiness.] - **** Stressed [Experiencing mental or emotional strain or tension.] - *** Agent-physiological-state [Having to do with the mechanical, physical, or biochemical function of an agent.] - **** Healthy {relatedTag=Sick} [Having no significant health-related issues.] - **** Hungry {relatedTag=Sated, relatedTag=Thirsty} [Being in a state of craving or desiring food.] - **** Rested {relatedTag=Tired} [Feeling refreshed and relaxed.] - **** Sated {relatedTag=Hungry} [Feeling full.] - **** Sick {relatedTag=Healthy} [Being in a state of ill health, bodily malfunction, or discomfort.] - **** Thirsty {relatedTag=Hungry} [Feeling a need to drink.] - **** Tired {relatedTag=Rested} [Feeling in need of sleep or rest.] - *** Agent-postural-state [Pertaining to the position in which agent holds their body.] - **** Crouching [Adopting a position where the knees are bent and the upper body is brought forward and down, sometimes to avoid detection or to defend oneself.] - **** Eyes-closed [Keeping eyes closed with no blinking.] - **** Eyes-open [Keeping eyes open with occasional blinking.] - **** Kneeling [Positioned where one or both knees are on the ground.] - **** On-treadmill [Ambulation on an exercise apparatus with an endless moving belt to support moving in place.] - **** Prone [Positioned in a recumbent body position whereby the person lies on its stomach and faces downward.] - **** Seated-with-chin-rest [Using a device that supports the chin and head.] - **** Sitting [In a seated position.] - **** Standing [Assuming or maintaining an erect upright position.] - ** Agent-task-role [The function or part that is ascribed to an agent in performing the task.] - *** Experiment-actor [An agent who plays a predetermined role to create the experiment scenario.] - *** Experiment-controller [An agent exerting control over some aspect of the experiment.] - *** Experiment-participant [Someone who takes part in an activity related to an experiment.] - *** Experimenter [Person who is the owner of the experiment and has its responsibility.] - ** Agent-trait [A genetically, environmentally, or socially determined characteristic of an agent.] - *** Age [Length of time elapsed time since birth of the agent.] - **** # {takesValue, valueClass=numericClass} - *** Agent-experience-level [Amount of skill or knowledge that the agent has as pertains to the task.] - **** Expert-level {relatedTag=Intermediate-experience-level, relatedTag=Novice-level} [Having comprehensive and authoritative knowledge of or skill in a particular area related to the task.] - **** Intermediate-experience-level {relatedTag=Expert-level, relatedTag=Novice-level} [Having a moderate amount of knowledge or skill related to the task.] - **** Novice-level {relatedTag=Expert-level, relatedTag=Intermediate-experience-level} [Being inexperienced in a field or situation related to the task.] - *** Ethnicity [Belong to a social group that has a common national or cultural tradition. Use with Label to avoid extension.] - *** Gender [Characteristics that are socially constructed, including norms, behaviors, and roles based on sex.] - *** Handedness [Individual preference for use of a hand, known as the dominant hand.] - **** Ambidextrous [Having no overall dominance in the use of right or left hand or foot in the performance of tasks that require one hand or foot.] - **** Left-handed [Preference for using the left hand or foot for tasks requiring the use of a single hand or foot.] - **** Right-handed [Preference for using the right hand or foot for tasks requiring the use of a single hand or foot.] - *** Race [Belonging to a group sharing physical or social qualities as defined within a specified society. Use with Label to avoid extension.] - *** Sex [Physical properties or qualities by which male is distinguished from female.] - **** Female [Biological sex of an individual with female sexual organs such ova.] - **** Intersex [Having genitalia and/or secondary sexual characteristics of indeterminate sex.] - **** Male [Biological sex of an individual with male sexual organs producing sperm.] - * Data-property {extensionAllowed} [Something that pertains to data or information.] - ** Data-marker [An indicator placed to mark something.] - *** Data-break-marker [An indicator place to indicate a gap in the data.] - *** Temporal-marker [An indicator placed at a particular time in the data.] - **** Inset {topLevelTagGroup, reserved, relatedTag=Onset, relatedTag=Offset} [Marks an intermediate point in an ongoing event of temporal extent.] - **** Offset {topLevelTagGroup, reserved, relatedTag=Onset, relatedTag=Inset} [Marks the end of an event of temporal extent.] - **** Onset {topLevelTagGroup, reserved, relatedTag=Inset, relatedTag=Offset} [Marks the start of an ongoing event of temporal extent.] - **** Pause [Indicates the temporary interruption of the operation a process and subsequently wait for a signal to continue.] - **** Time-out [A cancellation or cessation that automatically occurs when a predefined interval of time has passed without a certain event occurring.] - **** Time-sync [A synchronization signal whose purpose to help synchronize different signals or processes. Often used to indicate a marker inserted into the recorded data to allow post hoc synchronization of concurrently recorded data streams.] - ** Data-resolution [Smallest change in a quality being measured by an sensor that causes a perceptible change.] - *** Printer-resolution [Resolution of a printer, usually expressed as the number of dots-per-inch for a printer.] - **** # {takesValue, valueClass=numericClass} - *** Screen-resolution [Resolution of a screen, usually expressed as the of pixels in a dimension for a digital display device.] - **** # {takesValue, valueClass=numericClass} - *** Sensory-resolution [Resolution of measurements by a sensing device.] - **** # {takesValue, valueClass=numericClass} - *** Spatial-resolution [Linear spacing of a spatial measurement.] - **** # {takesValue, valueClass=numericClass} - *** Spectral-resolution [Measures the ability of a sensor to resolve features in the electromagnetic spectrum.] - **** # {takesValue, valueClass=numericClass} - *** Temporal-resolution [Measures the ability of a sensor to resolve features in time.] - **** # {takesValue, valueClass=numericClass} - ** Data-source-type [The type of place, person, or thing from which the data comes or can be obtained.] - *** Computed-feature [A feature computed from the data by a tool. This tag should be grouped with a label of the form Toolname_propertyName.] - *** Computed-prediction [A computed extrapolation of known data.] - *** Expert-annotation [An explanatory or critical comment or other in-context information provided by an authority.] - *** Instrument-measurement [Information obtained from a device that is used to measure material properties or make other observations.] - *** Observation [Active acquisition of information from a primary source. Should be grouped with a label of the form AgentID_featureName.] - ** Data-value [Designation of the type of a data item.] - *** Categorical-value [Indicates that something can take on a limited and usually fixed number of possible values.] - **** Categorical-class-value [Categorical values that fall into discrete classes such as true or false. The grouping is absolute in the sense that it is the same for all participants.] - ***** All {relatedTag=Some, relatedTag=None} [To a complete degree or to the full or entire extent.] - ***** Correct {relatedTag=Wrong} [Free from error. Especially conforming to fact or truth.] - ***** Explicit {relatedTag=Implicit} [Stated clearly and in detail, leaving no room for confusion or doubt.] - ***** False {relatedTag=True} [Not in accordance with facts, reality or definitive criteria.] - ***** Implicit {relatedTag=Explicit} [Implied though not plainly expressed.] - ***** Invalid {relatedTag=Valid} [Not allowed or not conforming to the correct format or specifications.] - ***** None {relatedTag=All, relatedTag=Some} [No person or thing, nobody, not any.] - ***** Some {relatedTag=All, relatedTag=None} [At least a small amount or number of, but not a large amount of, or often.] - ***** True {relatedTag=False} [Conforming to facts, reality or definitive criteria.] - ***** Valid {relatedTag=Invalid} [Allowable, usable, or acceptable.] - ***** Wrong {relatedTag=Correct} [Inaccurate or not correct.] - **** Categorical-judgment-value [Categorical values that are based on the judgment or perception of the participant such familiar and famous.] - ***** Abnormal {relatedTag=Normal} [Deviating in any way from the state, position, structure, condition, behavior, or rule which is considered a norm.] - ***** Asymmetrical {relatedTag=Symmetrical} [Lacking symmetry or having parts that fail to correspond to one another in shape, size, or arrangement.] - ***** Audible {relatedTag=Inaudible} [A sound that can be perceived by the participant.] - ***** Complex {relatedTag=Simple} [Hard, involved or complicated, elaborate, having many parts.] - ***** Congruent {relatedTag=Incongruent} [Concordance of multiple evidence lines. In agreement or harmony.] - ***** Constrained {relatedTag=Unconstrained} [Keeping something within particular limits or bounds.] - ***** Disordered {relatedTag=Ordered} [Not neatly arranged. Confused and untidy. A structural quality in which the parts of an object are non-rigid.] - ***** Familiar {relatedTag=Unfamiliar, relatedTag=Famous} [Recognized, familiar, or within the scope of knowledge.] - ***** Famous {relatedTag=Familiar, relatedTag=Unfamiliar} [A person who has a high degree of recognition by the general population for his or her success or accomplishments. A famous person.] - ***** Inaudible {relatedTag=Audible} [A sound below the threshold of perception of the participant.] - ***** Incongruent {relatedTag=Congruent} [Not in agreement or harmony.] - ***** Involuntary {relatedTag=Voluntary} [An action that is not made by choice. In the body, involuntary actions (such as blushing) occur automatically, and cannot be controlled by choice.] - ***** Masked {relatedTag=Unmasked} [Information exists but is not provided or is partially obscured due to security, privacy, or other concerns.] - ***** Normal {relatedTag=Abnormal} [Being approximately average or within certain limits. Conforming with or constituting a norm or standard or level or type or social norm.] - ***** Ordered {relatedTag=Disordered} [Conforming to a logical or comprehensible arrangement of separate elements.] - ***** Simple {relatedTag=Complex} [Easily understood or presenting no difficulties.] - ***** Symmetrical {relatedTag=Asymmetrical} [Made up of exactly similar parts facing each other or around an axis. Showing aspects of symmetry.] - ***** Unconstrained {relatedTag=Constrained} [Moving without restriction.] - ***** Unfamiliar {relatedTag=Familiar, relatedTag=Famous} [Not having knowledge or experience of.] - ***** Unmasked {relatedTag=Masked} [Information is revealed.] - ***** Voluntary {relatedTag=Involuntary} [Using free will or design; not forced or compelled; controlled by individual volition.] - **** Categorical-level-value [Categorical values based on dividing a continuous variable into levels such as high and low.] - ***** Cold {relatedTag=Hot} [Having an absence of heat.] - ***** Deep {relatedTag=Shallow} [Extending relatively far inward or downward.] - ***** High {relatedTag=Low, relatedTag=Medium} [Having a greater than normal degree, intensity, or amount.] - ***** Hot {relatedTag=Cold} [Having an excess of heat.] - ***** Large {relatedTag=Small} [Having a great extent such as in physical dimensions, period of time, amplitude or frequency.] - ***** Liminal {relatedTag=Subliminal, relatedTag=Supraliminal} [Situated at a sensory threshold that is barely perceptible or capable of eliciting a response.] - ***** Loud {relatedTag=Quiet} [Having a perceived high intensity of sound.] - ***** Low {relatedTag=High} [Less than normal in degree, intensity or amount.] - ***** Medium {relatedTag=Low, relatedTag=High} [Mid-way between small and large in number, quantity, magnitude or extent.] - ***** Negative {relatedTag=Positive} [Involving disadvantage or harm.] - ***** Positive {relatedTag=Negative} [Involving advantage or good.] - ***** Quiet {relatedTag=Loud} [Characterizing a perceived low intensity of sound.] - ***** Rough {relatedTag=Smooth} [Having a surface with perceptible bumps, ridges, or irregularities.] - ***** Shallow {relatedTag=Deep} [Having a depth which is relatively low.] - ***** Small {relatedTag=Large} [Having a small extent such as in physical dimensions, period of time, amplitude or frequency.] - ***** Smooth {relatedTag=Rough} [Having a surface free from bumps, ridges, or irregularities.] - ***** Subliminal {relatedTag=Liminal, relatedTag=Supraliminal} [Situated below a sensory threshold that is imperceptible or not capable of eliciting a response.] - ***** Supraliminal {relatedTag=Liminal, relatedTag=Subliminal} [Situated above a sensory threshold that is perceptible or capable of eliciting a response.] - ***** Thick {relatedTag=Thin} [Wide in width, extent or cross-section.] - ***** Thin {relatedTag=Thick} [Narrow in width, extent or cross-section.] - **** Categorical-orientation-value [Value indicating the orientation or direction of something.] - ***** Backward {relatedTag=Forward} [Directed behind or to the rear.] - ***** Downward {relatedTag=Leftward, relatedTag=Rightward, relatedTag=Upward} [Moving or leading toward a lower place or level.] - ***** Forward {relatedTag=Backward} [At or near or directed toward the front.] - ***** Horizontally-oriented {relatedTag=Vertically-oriented} [Oriented parallel to or in the plane of the horizon.] - ***** Leftward {relatedTag=Downward, relatedTag=Rightward, relatedTag=Upward} [Going toward or facing the left.] - ***** Oblique {relatedTag=Rotated} [Slanting or inclined in direction, course, or position that is neither parallel nor perpendicular nor right-angular.] - ***** Rightward {relatedTag=Downward, relatedTag=Leftward, relatedTag=Upward} [Going toward or situated on the right.] - ***** Rotated [Positioned offset around an axis or center.] - ***** Upward {relatedTag=Downward, relatedTag=Leftward, relatedTag=Rightward} [Moving, pointing, or leading to a higher place, point, or level.] - ***** Vertically-oriented {relatedTag=Horizontally-oriented} [Oriented perpendicular to the plane of the horizon.] - *** Physical-value [The value of some physical property of something.] - **** Temperature [A measure of hot or cold based on the average kinetic energy of the atoms or molecules in the system.] - ***** # {takesValue, valueClass=numericClass, unitClass=temperatureUnits} - **** Weight [The relative mass or the quantity of matter contained by something.] - ***** # {takesValue, valueClass=numericClass, unitClass=weightUnits} - *** Quantitative-value [Something capable of being estimated or expressed with numeric values.] - **** Fraction [A numerical value between 0 and 1.] - ***** # {takesValue, valueClass=numericClass} - **** Item-count [The integer count of something which is usually grouped with the entity it is counting. (Item-count/3, A) indicates that 3 of A have occurred up to this point.] - ***** # {takesValue, valueClass=numericClass} - **** Item-index [The index of an item in a collection, sequence or other structure. (A (Item-index/3, B)) means that A is item number 3 in B.] - ***** # {takesValue, valueClass=numericClass} - **** Item-interval [An integer indicating how many items or entities have passed since the last one of these. An item interval of 0 indicates the current item.] - ***** # {takesValue, valueClass=numericClass} - **** Percentage [A fraction or ratio with 100 understood as the denominator.] - ***** # {takesValue, valueClass=numericClass} - **** Ratio [A quotient of quantities of the same kind for different components within the same system.] - ***** # {takesValue, valueClass=numericClass} - *** Spatiotemporal-value [A property relating to space and/or time.] - **** Rate-of-change [The amount of change accumulated per unit time.] - ***** Acceleration [Magnitude of the rate of change in either speed or direction. The direction of change should be given separately.] - ****** # {takesValue, valueClass=numericClass, unitClass=accelerationUnits} - ***** Frequency [Frequency is the number of occurrences of a repeating event per unit time.] - ****** # {takesValue, valueClass=numericClass, unitClass=frequencyUnits} - ***** Jerk-rate [Magnitude of the rate at which the acceleration of an object changes with respect to time. The direction of change should be given separately.] - ****** # {takesValue, valueClass=numericClass, unitClass=jerkUnits} - ***** Refresh-rate [The frequency with which the image on a computer monitor or similar electronic display screen is refreshed, usually expressed in hertz.] - ****** # {takesValue, valueClass=numericClass} - ***** Sampling-rate [The number of digital samples taken or recorded per unit of time.] - ****** # {takesValue, unitClass=frequencyUnits} - ***** Speed [A scalar measure of the rate of movement of the object expressed either as the distance travelled divided by the time taken (average speed) or the rate of change of position with respect to time at a particular point (instantaneous speed). The direction of change should be given separately.] - ****** # {takesValue, valueClass=numericClass, unitClass=speedUnits} - ***** Temporal-rate [The number of items per unit of time.] - ****** # {takesValue, valueClass=numericClass, unitClass=frequencyUnits} - **** Spatial-value [Value of an item involving space.] - ***** Angle [The amount of inclination of one line to another or the plane of one object to another.] - ****** # {takesValue, unitClass=angleUnits, valueClass=numericClass} - ***** Distance [A measure of the space separating two objects or points.] - ****** # {takesValue, valueClass=numericClass, unitClass=physicalLengthUnits} - ***** Position [A reference to the alignment of an object, a particular situation or view of a situation, or the location of an object. Coordinates with respect a specified frame of reference or the default Screen-frame if no frame is given.] - ****** X-position [The position along the x-axis of the frame of reference.] - ******* # {takesValue, valueClass=numericClass, unitClass=physicalLengthUnits} - ****** Y-position [The position along the y-axis of the frame of reference.] - ******* # {takesValue, valueClass=numericClass, unitClass=physicalLengthUnits} - ****** Z-position [The position along the z-axis of the frame of reference.] - ******* # {takesValue, valueClass=numericClass, unitClass=physicalLengthUnits} - ***** Size [The physical magnitude of something.] - ****** Area [The extent of a 2-dimensional surface enclosed within a boundary.] - ******* # {takesValue, valueClass=numericClass, unitClass=areaUnits} - ****** Depth [The distance from the surface of something especially from the perspective of looking from the front.] - ******* # {takesValue, valueClass=numericClass, unitClass=physicalLengthUnits} - ****** Height [The vertical measurement or distance from the base to the top of an object.] - ******* # {takesValue, valueClass=numericClass, unitClass=physicalLengthUnits} - ****** Length [The linear extent in space from one end of something to the other end, or the extent of something from beginning to end.] - ******* # {takesValue, valueClass=numericClass, unitClass=physicalLengthUnits} - ****** Volume [The amount of three dimensional space occupied by an object or the capacity of a space or container.] - ******* # {takesValue, valueClass=numericClass, unitClass=volumeUnits} - ****** Width [The extent or measurement of something from side to side.] - ******* # {takesValue, valueClass=numericClass, unitClass=physicalLengthUnits} - **** Temporal-value [A characteristic of or relating to time or limited by time.] - ***** Delay {topLevelTagGroup, reserved, relatedTag=Duration} [The time at which an event start time is delayed from the current onset time. This tag defines the start time of an event of temporal extent and may be used with the Duration tag.] - ****** # {takesValue, valueClass=numericClass, unitClass=timeUnits} - ***** Duration {topLevelTagGroup, reserved, relatedTag=Delay} [The period of time during which an event occurs. This tag defines the end time of an event of temporal extent and may be used with the Delay tag.] - ****** # {takesValue, valueClass=numericClass, unitClass=timeUnits} - ***** Time-interval [The period of time separating two instances, events, or occurrences.] - ****** # {takesValue, valueClass=numericClass, unitClass=timeUnits} - ***** Time-value [A value with units of time. Usually grouped with tags identifying what the value represents.] - ****** # {takesValue, valueClass=numericClass, unitClass=timeUnits} - *** Statistical-value {extensionAllowed} [A value based on or employing the principles of statistics.] - **** Data-maximum [The largest possible quantity or degree.] - ***** # {takesValue, valueClass=numericClass} - **** Data-mean [The sum of a set of values divided by the number of values in the set.] - ***** # {takesValue, valueClass=numericClass} - **** Data-median [The value which has an equal number of values greater and less than it.] - ***** # {takesValue, valueClass=numericClass} - **** Data-minimum [The smallest possible quantity.] - ***** # {takesValue, valueClass=numericClass} - **** Probability [A measure of the expectation of the occurrence of a particular event.] - ***** # {takesValue, valueClass=numericClass} - **** Standard-deviation [A measure of the range of values in a set of numbers. Standard deviation is a statistic used as a measure of the dispersion or variation in a distribution, equal to the square root of the arithmetic mean of the squares of the deviations from the arithmetic mean.] - ***** # {takesValue, valueClass=numericClass} - **** Statistical-accuracy [A measure of closeness to true value expressed as a number between 0 and 1.] - ***** # {takesValue, valueClass=numericClass} - **** Statistical-precision [A quantitative representation of the degree of accuracy necessary for or associated with a particular action.] - ***** # {takesValue, valueClass=numericClass} - **** Statistical-recall [Sensitivity is a measurement datum qualifying a binary classification test and is computed by substracting the false negative rate to the integral numeral 1.] - ***** # {takesValue, valueClass=numericClass} - **** Statistical-uncertainty [A measure of the inherent variability of repeated observation measurements of a quantity including quantities evaluated by statistical methods and by other means.] - ***** # {takesValue, valueClass=numericClass} - ** Data-variability-attribute [An attribute describing how something changes or varies.] - *** Abrupt [Marked by sudden change.] - *** Constant [Continually recurring or continuing without interruption. Not changing in time or space.] - *** Continuous {relatedTag=Discrete, relatedTag=Discontinuous} [Uninterrupted in time, sequence, substance, or extent.] - *** Decreasing {relatedTag=Increasing} [Becoming smaller or fewer in size, amount, intensity, or degree.] - *** Deterministic {relatedTag=Random, relatedTag=Stochastic} [No randomness is involved in the development of the future states of the element.] - *** Discontinuous {relatedTag=Continuous} [Having a gap in time, sequence, substance, or extent.] - *** Discrete {relatedTag=Continuous, relatedTag=Discontinuous} [Constituting a separate entities or parts.] - *** Estimated-value [Something that has been calculated or measured approximately.] - *** Exact-value [A value that is viewed to the true value according to some standard.] - *** Flickering [Moving irregularly or unsteadily or burning or shining fitfully or with a fluctuating light.] - *** Fractal [Having extremely irregular curves or shapes for which any suitably chosen part is similar in shape to a given larger or smaller part when magnified or reduced to the same size.] - *** Increasing {relatedTag=Decreasing} [Becoming greater in size, amount, or degree.] - *** Random {relatedTag=Deterministic, relatedTag=Stochastic} [Governed by or depending on chance. Lacking any definite plan or order or purpose.] - *** Repetitive [A recurring action that is often non-purposeful.] - *** Stochastic {relatedTag=Deterministic, relatedTag=Random} [Uses a random probability distribution or pattern that may be analysed statistically but may not be predicted precisely to determine future states.] - *** Varying [Differing in size, amount, degree, or nature.] - * Environmental-property [Relating to or arising from the surroundings of an agent.] - ** Augmented-reality [Using technology that enhances real-world experiences with computer-derived digital overlays to change some aspects of perception of the natural environment. The digital content is shown to the user through a smart device or glasses and responds to changes in the environment.] - ** Indoors [Located inside a building or enclosure.] - ** Motion-platform [A mechanism that creates the feelings of being in a real motion environment.] - ** Outdoors [Any area outside a building or shelter.] - ** Real-world [Located in a place that exists in real space and time under realistic conditions.] - ** Rural [Of or pertaining to the country as opposed to the city.] - ** Terrain [Characterization of the physical features of a tract of land.] - *** Composite-terrain [Tracts of land characterized by a mixure of physical features.] - *** Dirt-terrain [Tracts of land characterized by a soil surface and lack of vegetation.] - *** Grassy-terrain [Tracts of land covered by grass.] - *** Gravel-terrain [Tracts of land covered by a surface consisting a loose aggregation of small water-worn or pounded stones.] - *** Leaf-covered-terrain [Tracts of land covered by leaves and composited organic material.] - *** Muddy-terrain [Tracts of land covered by a liquid or semi-liquid mixture of water and some combination of soil, silt, and clay.] - *** Paved-terrain [Tracts of land covered with concrete, asphalt, stones, or bricks.] - *** Rocky-terrain [Tracts of land consisting or full of rock or rocks.] - *** Sloped-terrain [Tracts of land arranged in a sloping or inclined position.] - *** Uneven-terrain [Tracts of land that are not level, smooth, or regular.] - ** Urban [Relating to, located in, or characteristic of a city or densely populated area.] - ** Virtual-world [Using technology that creates immersive, computer-generated experiences that a person can interact with and navigate through. The digital content is generally delivered to the user through some type of headset and responds to changes in head position or through interaction with other types of sensors. Existing in a virtual setting such as a simulation or game environment.] - * Informational-property {extensionAllowed} [Something that pertains to a task.] - ** Description {requireChild} [An explanation of what the tag group it is in means. If the description is at the top-level of an event string, the description applies to the event.] - *** # {takesValue, valueClass=textClass} - ** ID {requireChild} [An alphanumeric name that identifies either a unique object or a unique class of objects. Here the object or class may be an idea, physical countable object (or class), or physical uncountable substance (or class).] - *** # {takesValue, valueClass=textClass} - ** Label {requireChild} [A string of 20 or fewer characters identifying something. Labels usually refer to general classes of things while IDs refer to specific instances. A term that is associated with some entity. A brief description given for purposes of identification. An identifying or descriptive marker that is attached to an object.] - *** # {takesValue, valueClass=nameClass} - ** Metadata [Data about data. Information that describes another set of data.] - *** CogAtlas [The Cognitive Atlas ID number of something.] - **** # {takesValue} - *** CogPo [The CogPO ID number of something.] - **** # {takesValue} - *** Creation-date {requireChild} [The date on which data creation of this element began.] - **** # {takesValue, valueClass=dateTimeClass} - *** Experimental-note [A brief written record about the experiment.] - **** # {takesValue, valueClass=textClass} - *** Library-name [Official name of a HED library.] - **** # {takesValue, valueClass=nameClass} - *** OBO-identifier [The identifier of a term in some Open Biology Ontology (OBO) ontology.] - **** # {takesValue, valueClass=nameClass} - *** Pathname [The specification of a node (file or directory) in a hierarchical file system, usually specified by listing the nodes top-down.] - **** # {takesValue} - *** Subject-identifier [A sequence of characters used to identify, name, or characterize a trial or study subject.] - **** # {takesValue} - *** Version-identifier [An alphanumeric character string that identifies a form or variant of a type or original.] - **** # {takesValue} [Usually is a semantic version.] - ** Parameter [Something user-defined for this experiment.] - *** Parameter-label [The name of the parameter.] - **** # {takesValue, valueClass=nameClass} - *** Parameter-value [The value of the parameter.] - **** # {takesValue, valueClass=textClass} - * Organizational-property [Relating to an organization or the action of organizing something.] - ** Collection [A tag designating a grouping of items such as in a set or list.] - *** # {takesValue, valueClass=nameClass} [Name of the collection.] - ** Condition-variable [An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent variables or contrasts.] - *** # {takesValue, valueClass=nameClass} [Name of the condition variable.] - ** Control-variable [An aspect of the experiment that is fixed throughout the study and usually is explicitly controlled.] - *** # {takesValue, valueClass=nameClass} [Name of the control variable.] - ** Def {requireChild, reserved} [A HED-specific utility tag used with a defined name to represent the tags associated with that definition.] - *** # {takesValue, valueClass=nameClass} [Name of the definition.] - ** Def-expand {requireChild, reserved, tagGroup} [A HED specific utility tag that is grouped with an expanded definition. The child value of the Def-expand is the name of the expanded definition.] - *** # {takesValue, valueClass=nameClass} - ** Definition {requireChild, reserved, topLevelTagGroup} [A HED-specific utility tag whose child value is the name of the concept and the tag group associated with the tag is an English language explanation of a concept.] - *** # {takesValue, valueClass=nameClass} [Name of the definition.] - ** Event-context {reserved, topLevelTagGroup, unique} [A special HED tag inserted as part of a top-level tag group to contain information about the interrelated conditions under which the event occurs. The event context includes information about other events that are ongoing when this event happens.] - ** Event-stream [A special HED tag indicating that this event is a member of an ordered succession of events.] - *** # {takesValue, valueClass=nameClass} [Name of the event stream.] - ** Experimental-intertrial [A tag used to indicate a part of the experiment between trials usually where nothing is happening.] - *** # {takesValue, valueClass=nameClass} [Optional label for the intertrial block.] - ** Experimental-trial [Designates a run or execution of an activity, for example, one execution of a script. A tag used to indicate a particular organizational part in the experimental design often containing a stimulus-response pair or stimulus-response-feedback triad.] - *** # {takesValue, valueClass=nameClass} [Optional label for the trial (often a numerical string).] - ** Indicator-variable [An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent variables.] - *** # {takesValue, valueClass=nameClass} [Name of the indicator variable.] - ** Recording [A tag designating the data recording. Recording tags are usually have temporal scope which is the entire recording.] - *** # {takesValue, valueClass=nameClass} [Optional label for the recording.] - ** Task [An assigned piece of work, usually with a time allotment. A tag used to indicate a linkage the structured activities performed as part of the experiment.] - *** # {takesValue, valueClass=nameClass} [Optional label for the task block.] - ** Time-block [A tag used to indicate a contiguous time block in the experiment during which something is fixed or noted.] - *** # {takesValue, valueClass=nameClass} [Optional label for the task block.] - * Sensory-property [Relating to sensation or the physical senses.] - ** Sensory-attribute [A sensory characteristic associated with another entity.] - *** Auditory-attribute [Pertaining to the sense of hearing.] - **** Loudness [Perceived intensity of a sound.] - ***** # {takesValue, valueClass=numericClass, valueClass=nameClass} - **** Pitch [A perceptual property that allows the user to order sounds on a frequency scale.] - ***** # {takesValue, valueClass=numericClass, unitClass=frequencyUnits} - **** Sound-envelope [Description of how a sound changes over time.] - ***** Sound-envelope-attack [The time taken for initial run-up of level from nil to peak usually beginning when the key on a musical instrument is pressed.] - ****** # {takesValue, valueClass=numericClass, unitClass=timeUnits} - ***** Sound-envelope-decay [The time taken for the subsequent run down from the attack level to the designated sustain level.] - ****** # {takesValue, valueClass=numericClass, unitClass=timeUnits} - ***** Sound-envelope-release [The time taken for the level to decay from the sustain level to zero after the key is released.] - ****** # {takesValue, valueClass=numericClass, unitClass=timeUnits} - ***** Sound-envelope-sustain [The time taken for the main sequence of the sound duration, until the key is released.] - ****** # {takesValue, valueClass=numericClass, unitClass=timeUnits} - **** Sound-volume [The sound pressure level (SPL) usually the ratio to a reference signal estimated as the lower bound of hearing.] - ***** # {takesValue, valueClass=numericClass, unitClass=intensityUnits} - **** Timbre [The perceived sound quality of a singing voice or musical instrument.] - ***** # {takesValue, valueClass=nameClass} - *** Gustatory-attribute [Pertaining to the sense of taste.] - **** Bitter [Having a sharp, pungent taste.] - **** Salty [Tasting of or like salt.] - **** Savory [Belonging to a taste that is salty or spicy rather than sweet.] - **** Sour [Having a sharp, acidic taste.] - **** Sweet [Having or resembling the taste of sugar.] - *** Olfactory-attribute [Having a smell.] - *** Somatic-attribute [Pertaining to the feelings in the body or of the nervous system.] - **** Pain [The sensation of discomfort, distress, or agony, resulting from the stimulation of specialized nerve endings.] - **** Stress [The negative mental, emotional, and physical reactions that occur when environmental stressors are perceived as exceeding the adaptive capacities of the individual.] - *** Tactile-attribute [Pertaining to the sense of touch.] - **** Tactile-pressure [Having a feeling of heaviness.] - **** Tactile-temperature [Having a feeling of hotness or coldness.] - **** Tactile-texture [Having a feeling of roughness.] - **** Tactile-vibration [Having a feeling of mechanical oscillation.] - *** Vestibular-attribute [Pertaining to the sense of balance or body position.] - *** Visual-attribute [Pertaining to the sense of sight.] - **** Color [The appearance of objects (or light sources) described in terms of perception of their hue and lightness (or brightness) and saturation.] - ***** CSS-color [One of 140 colors supported by all browsers. For more details such as the color RGB or HEX values, check: https://www.w3schools.com/colors/colors_groups.asp.] - ****** Blue-color [CSS color group.] - ******* Blue [CSS-color 0x0000FF.] - ******* CadetBlue [CSS-color 0x5F9EA0.] - ******* CornflowerBlue [CSS-color 0x6495ED.] - ******* DarkBlue [CSS-color 0x00008B.] - ******* DeepSkyBlue [CSS-color 0x00BFFF.] - ******* DodgerBlue [CSS-color 0x1E90FF.] - ******* LightBlue [CSS-color 0xADD8E6.] - ******* LightSkyBlue [CSS-color 0x87CEFA.] - ******* LightSteelBlue [CSS-color 0xB0C4DE.] - ******* MediumBlue [CSS-color 0x0000CD.] - ******* MidnightBlue [CSS-color 0x191970.] - ******* Navy [CSS-color 0x000080.] - ******* PowderBlue [CSS-color 0xB0E0E6.] - ******* RoyalBlue [CSS-color 0x4169E1.] - ******* SkyBlue [CSS-color 0x87CEEB.] - ******* SteelBlue [CSS-color 0x4682B4.] - ****** Brown-color [CSS color group.] - ******* Bisque [CSS-color 0xFFE4C4.] - ******* BlanchedAlmond [CSS-color 0xFFEBCD.] - ******* Brown [CSS-color 0xA52A2A.] - ******* BurlyWood [CSS-color 0xDEB887.] - ******* Chocolate [CSS-color 0xD2691E.] - ******* Cornsilk [CSS-color 0xFFF8DC.] - ******* DarkGoldenRod [CSS-color 0xB8860B.] - ******* GoldenRod [CSS-color 0xDAA520.] - ******* Maroon [CSS-color 0x800000.] - ******* NavajoWhite [CSS-color 0xFFDEAD.] - ******* Olive [CSS-color 0x808000.] - ******* Peru [CSS-color 0xCD853F.] - ******* RosyBrown [CSS-color 0xBC8F8F.] - ******* SaddleBrown [CSS-color 0x8B4513.] - ******* SandyBrown [CSS-color 0xF4A460.] - ******* Sienna [CSS-color 0xA0522D.] - ******* Tan [CSS-color 0xD2B48C.] - ******* Wheat [CSS-color 0xF5DEB3.] - ****** Cyan-color [CSS color group.] - ******* Aqua [CSS-color 0x00FFFF.] - ******* Aquamarine [CSS-color 0x7FFFD4.] - ******* Cyan [CSS-color 0x00FFFF.] - ******* DarkTurquoise [CSS-color 0x00CED1.] - ******* LightCyan [CSS-color 0xE0FFFF.] - ******* MediumTurquoise [CSS-color 0x48D1CC.] - ******* PaleTurquoise [CSS-color 0xAFEEEE.] - ******* Turquoise [CSS-color 0x40E0D0.] - ****** Gray-color [CSS color group.] - ******* Black [CSS-color 0x000000.] - ******* DarkGray [CSS-color 0xA9A9A9.] - ******* DarkSlateGray [CSS-color 0x2F4F4F.] - ******* DimGray [CSS-color 0x696969.] - ******* Gainsboro [CSS-color 0xDCDCDC.] - ******* Gray [CSS-color 0x808080.] - ******* LightGray [CSS-color 0xD3D3D3.] - ******* LightSlateGray [CSS-color 0x778899.] - ******* Silver [CSS-color 0xC0C0C0.] - ******* SlateGray [CSS-color 0x708090.] - ****** Green-color [CSS color group.] - ******* Chartreuse [CSS-color 0x7FFF00.] - ******* DarkCyan [CSS-color 0x008B8B.] - ******* DarkGreen [CSS-color 0x006400.] - ******* DarkOliveGreen [CSS-color 0x556B2F.] - ******* DarkSeaGreen [CSS-color 0x8FBC8F.] - ******* ForestGreen [CSS-color 0x228B22.] - ******* Green [CSS-color 0x008000.] - ******* GreenYellow [CSS-color 0xADFF2F.] - ******* LawnGreen [CSS-color 0x7CFC00.] - ******* LightGreen [CSS-color 0x90EE90.] - ******* LightSeaGreen [CSS-color 0x20B2AA.] - ******* Lime [CSS-color 0x00FF00.] - ******* LimeGreen [CSS-color 0x32CD32.] - ******* MediumAquaMarine [CSS-color 0x66CDAA.] - ******* MediumSeaGreen [CSS-color 0x3CB371.] - ******* MediumSpringGreen [CSS-color 0x00FA9A.] - ******* OliveDrab [CSS-color 0x6B8E23.] - ******* PaleGreen [CSS-color 0x98FB98.] - ******* SeaGreen [CSS-color 0x2E8B57.] - ******* SpringGreen [CSS-color 0x00FF7F.] - ******* Teal [CSS-color 0x008080.] - ******* YellowGreen [CSS-color 0x9ACD32.] - ****** Orange-color [CSS color group.] - ******* Coral [CSS-color 0xFF7F50.] - ******* DarkOrange [CSS-color 0xFF8C00.] - ******* Orange [CSS-color 0xFFA500.] - ******* OrangeRed [CSS-color 0xFF4500.] - ******* Tomato [CSS-color 0xFF6347.] - ****** Pink-color [CSS color group.] - ******* DeepPink [CSS-color 0xFF1493.] - ******* HotPink [CSS-color 0xFF69B4.] - ******* LightPink [CSS-color 0xFFB6C1.] - ******* MediumVioletRed [CSS-color 0xC71585.] - ******* PaleVioletRed [CSS-color 0xDB7093.] - ******* Pink [CSS-color 0xFFC0CB.] - ****** Purple-color [CSS color group.] - ******* BlueViolet [CSS-color 0x8A2BE2.] - ******* DarkMagenta [CSS-color 0x8B008B.] - ******* DarkOrchid [CSS-color 0x9932CC.] - ******* DarkSlateBlue [CSS-color 0x483D8B.] - ******* DarkViolet [CSS-color 0x9400D3.] - ******* Fuchsia [CSS-color 0xFF00FF.] - ******* Indigo [CSS-color 0x4B0082.] - ******* Lavender [CSS-color 0xE6E6FA.] - ******* Magenta [CSS-color 0xFF00FF.] - ******* MediumOrchid [CSS-color 0xBA55D3.] - ******* MediumPurple [CSS-color 0x9370DB.] - ******* MediumSlateBlue [CSS-color 0x7B68EE.] - ******* Orchid [CSS-color 0xDA70D6.] - ******* Plum [CSS-color 0xDDA0DD.] - ******* Purple [CSS-color 0x800080.] - ******* RebeccaPurple [CSS-color 0x663399.] - ******* SlateBlue [CSS-color 0x6A5ACD.] - ******* Thistle [CSS-color 0xD8BFD8.] - ******* Violet [CSS-color 0xEE82EE.] - ****** Red-color [CSS color group.] - ******* Crimson [CSS-color 0xDC143C.] - ******* DarkRed [CSS-color 0x8B0000.] - ******* DarkSalmon [CSS-color 0xE9967A.] - ******* FireBrick [CSS-color 0xB22222.] - ******* IndianRed [CSS-color 0xCD5C5C.] - ******* LightCoral [CSS-color 0xF08080.] - ******* LightSalmon [CSS-color 0xFFA07A.] - ******* Red [CSS-color 0xFF0000.] - ******* Salmon [CSS-color 0xFA8072.] - ****** White-color [CSS color group.] - ******* AliceBlue [CSS-color 0xF0F8FF.] - ******* AntiqueWhite [CSS-color 0xFAEBD7.] - ******* Azure [CSS-color 0xF0FFFF.] - ******* Beige [CSS-color 0xF5F5DC.] - ******* FloralWhite [CSS-color 0xFFFAF0.] - ******* GhostWhite [CSS-color 0xF8F8FF.] - ******* HoneyDew [CSS-color 0xF0FFF0.] - ******* Ivory [CSS-color 0xFFFFF0.] - ******* LavenderBlush [CSS-color 0xFFF0F5.] - ******* Linen [CSS-color 0xFAF0E6.] - ******* MintCream [CSS-color 0xF5FFFA.] - ******* MistyRose [CSS-color 0xFFE4E1.] - ******* OldLace [CSS-color 0xFDF5E6.] - ******* SeaShell [CSS-color 0xFFF5EE.] - ******* Snow [CSS-color 0xFFFAFA.] - ******* White [CSS-color 0xFFFFFF.] - ******* WhiteSmoke [CSS-color 0xF5F5F5.] - ****** Yellow-color [CSS color group.] - ******* DarkKhaki [CSS-color 0xBDB76B.] - ******* Gold [CSS-color 0xFFD700.] - ******* Khaki [CSS-color 0xF0E68C.] - ******* LemonChiffon [CSS-color 0xFFFACD.] - ******* LightGoldenRodYellow [CSS-color 0xFAFAD2.] - ******* LightYellow [CSS-color 0xFFFFE0.] - ******* Moccasin [CSS-color 0xFFE4B5.] - ******* PaleGoldenRod [CSS-color 0xEEE8AA.] - ******* PapayaWhip [CSS-color 0xFFEFD5.] - ******* PeachPuff [CSS-color 0xFFDAB9.] - ******* Yellow [CSS-color 0xFFFF00.] - ***** Color-shade [A slight degree of difference between colors, especially with regard to how light or dark it is or as distinguished from one nearly like it.] - ****** Dark-shade [A color tone not reflecting much light.] - ****** Light-shade [A color tone reflecting more light.] - ***** Grayscale [Using a color map composed of shades of gray, varying from black at the weakest intensity to white at the strongest.] - ****** # {takesValue, valueClass=numericClass} [White intensity between 0 and 1.] - ***** HSV-color [A color representation that models how colors appear under light.] - ****** HSV-value [An attribute of a visual sensation according to which an area appears to emit more or less light.] - ******* # {takesValue, valueClass=numericClass} - ****** Hue [Attribute of a visual sensation according to which an area appears to be similar to one of the perceived colors.] - ******* # {takesValue, valueClass=numericClass} [Angular value between 0 and 360.] - ****** Saturation [Colorfulness of a stimulus relative to its own brightness.] - ******* # {takesValue, valueClass=numericClass} [B value of RGB between 0 and 1.] - ***** RGB-color [A color from the RGB schema.] - ****** RGB-blue [The blue component.] - ******* # {takesValue, valueClass=numericClass} [B value of RGB between 0 and 1.] - ****** RGB-green [The green component.] - ******* # {takesValue, valueClass=numericClass} [G value of RGB between 0 and 1.] - ****** RGB-red [The red component.] - ******* # {takesValue, valueClass=numericClass} [R value of RGB between 0 and 1.] - **** Luminance [A quality that exists by virtue of the luminous intensity per unit area projected in a given direction.] - **** Opacity [A measure of impenetrability to light.] - ** Sensory-presentation [The entity has a sensory manifestation.] - *** Auditory-presentation [The sense of hearing is used in the presentation to the user.] - **** Loudspeaker-separation {suggestedTag=Distance} [The distance between two loudspeakers. Grouped with the Distance tag.] - **** Monophonic [Relating to sound transmission, recording, or reproduction involving a single transmission path.] - **** Silent [The absence of ambient audible sound or the state of having ceased to produce sounds.] - **** Stereophonic [Relating to, or constituting sound reproduction involving the use of separated microphones and two transmission channels to achieve the sound separation of a live hearing.] - *** Gustatory-presentation [The sense of taste used in the presentation to the user.] - *** Olfactory-presentation [The sense of smell used in the presentation to the user.] - *** Somatic-presentation [The nervous system is used in the presentation to the user.] - *** Tactile-presentation [The sense of touch used in the presentation to the user.] - *** Vestibular-presentation [The sense balance used in the presentation to the user.] - *** Visual-presentation [The sense of sight used in the presentation to the user.] - **** 2D-view [A view showing only two dimensions.] - **** 3D-view [A view showing three dimensions.] - **** Background-view [Parts of the view that are farthest from the viewer and usually the not part of the visual focus.] - **** Bistable-view [Something having two stable visual forms that have two distinguishable stable forms as in optical illusions.] - **** Foreground-view [Parts of the view that are closest to the viewer and usually the most important part of the visual focus.] - **** Foveal-view [Visual presentation directly on the fovea. A view projected on the small depression in the retina containing only cones and where vision is most acute.] - **** Map-view [A diagrammatic representation of an area of land or sea showing physical features, cities, roads.] - ***** Aerial-view [Elevated view of an object from above, with a perspective as though the observer were a bird.] - ***** Satellite-view [A representation as captured by technology such as a satellite.] - ***** Street-view [A 360-degrees panoramic view from a position on the ground.] - **** Peripheral-view [Indirect vision as it occurs outside the point of fixation.] - * Task-property {extensionAllowed} [Something that pertains to a task.] - ** Task-action-type [How an agent action should be interpreted in terms of the task specification.] - *** Appropriate-action {relatedTag=Inappropriate-action} [An action suitable or proper in the circumstances.] - *** Correct-action {relatedTag=Incorrect-action, relatedTag=Indeterminate-action} [An action that was a correct response in the context of the task.] - *** Correction [An action offering an improvement to replace a mistake or error.] - *** Done-indication {relatedTag=Ready-indication} [An action that indicates that the participant has completed this step in the task.] - *** Imagined-action [Form a mental image or concept of something. This is used to identity something that only happened in the imagination of the participant as in imagined movements in motor imagery paradigms.] - *** Inappropriate-action {relatedTag=Appropriate-action} [An action not in keeping with what is correct or proper for the task.] - *** Incorrect-action {relatedTag=Correct-action, relatedTag=Indeterminate-action} [An action considered wrong or incorrect in the context of the task.] - *** Indeterminate-action {relatedTag=Correct-action, relatedTag=Incorrect-action, relatedTag=Miss, relatedTag=Near-miss} [An action that cannot be distinguished between two or more possibibities in the current context. This tag might be applied when an outside evaluator or a classification algorithm cannot determine a definitive result.] - *** Miss {relatedTag=Near-miss} [An action considered to be a failure in the context of the task. For example, if the agent is supposed to try to hit a target and misses.] - *** Near-miss {relatedTag=Miss} [An action barely satisfied the requirements of the task. In a driving experiment for example this could pertain to a narrowly avoided collision or other accident.] - *** Omitted-action [An expected response was skipped.] - *** Ready-indication {relatedTag=Done-indication} [An action that indicates that the participant is ready to perform the next step in the task.] - ** Task-attentional-demand [Strategy for allocating attention toward goal-relevant information.] - *** Bottom-up-attention {relatedTag=Top-down-attention} [Attentional guidance purely by externally driven factors to stimuli that are salient because of their inherent properties relative to the background. Sometimes this is referred to as stimulus driven.] - *** Covert-attention {relatedTag=Overt-attention} [Paying attention without moving the eyes.] - *** Divided-attention {relatedTag=Focused-attention} [Integrating parallel multiple stimuli. Behavior involving responding simultaneously to multiple tasks or multiple task demands.] - *** Focused-attention {relatedTag=Divided-attention} [Responding discretely to specific visual, auditory, or tactile stimuli.] - *** Orienting-attention [Directing attention to a target stimulus.] - *** Overt-attention {relatedTag=Covert-attention} [Selectively processing one location over others by moving the eyes to point at that location.] - *** Selective-attention [Maintaining a behavioral or cognitive set in the face of distracting or competing stimuli. Ability to pay attention to a limited array of all available sensory information.] - *** Sustained-attention [Maintaining a consistent behavioral response during continuous and repetitive activity.] - *** Switched-attention [Having to switch attention between two or more modalities of presentation.] - *** Top-down-attention {relatedTag=Bottom-up-attention} [Voluntary allocation of attention to certain features. Sometimes this is referred to goal-oriented attention.] - ** Task-effect-evidence [The evidence supporting the conclusion that the event had the specified effect.] - *** Behavioral-evidence [An indication or conclusion based on the behavior of an agent.] - *** Computational-evidence [A type of evidence in which data are produced, and/or generated, and/or analyzed on a computer.] - *** External-evidence [A phenomenon that follows and is caused by some previous phenomenon.] - *** Intended-effect [A phenomenon that is intended to follow and be caused by some previous phenomenon.] - ** Task-event-role [The purpose of an event with respect to the task.] - *** Experimental-stimulus [Part of something designed to elicit a response in the experiment.] - *** Incidental [A sensory or other type of event that is unrelated to the task or experiment.] - *** Instructional [Usually associated with a sensory event intended to give instructions to the participant about the task or behavior.] - *** Mishap [Unplanned disruption such as an equipment or experiment control abnormality or experimenter error.] - *** Participant-response [Something related to a participant actions in performing the task.] - *** Task-activity [Something that is part of the overall task or is necessary to the overall experiment but is not directly part of a stimulus-response cycle. Examples would be taking a survey or provided providing a silva sample.] - *** Warning [Something that should warn the participant that the parameters of the task have been or are about to be exceeded such as a warning message about getting too close to the shoulder of the road in a driving task.] - ** Task-relationship [Specifying organizational importance of sub-tasks.] - *** Background-subtask [A part of the task which should be performed in the background as for example inhibiting blinks due to instruction while performing the primary task.] - *** Primary-subtask [A part of the task which should be the primary focus of the participant.] - ** Task-stimulus-role [The role the stimulus plays in the task.] - *** Cue [A signal for an action, a pattern of stimuli indicating a particular response.] - *** Distractor [A person or thing that distracts or a plausible but incorrect option in a multiple-choice question. In pyschological studies this is sometimes referred to as a foil.] - *** Expected {relatedTag=Unexpected, suggestedTag=Target} [Considered likely, probable or anticipated. Something of low information value as in frequent non-targets in an RSVP paradigm.] - *** Extraneous [Irrelevant or unrelated to the subject being dealt with.] - *** Feedback [An evaluative response to an inquiry, process, event, or activity.] - *** Go-signal {relatedTag=Stop-signal} [An indicator to proceed with a planned action.] - *** Meaningful [Conveying significant or relevant information.] - *** Newly-learned [Representing recently acquired information or understanding.] - *** Non-informative [Something that is not useful in forming an opinion or judging an outcome.] - *** Non-target {relatedTag=Target} [Something other than that done or looked for. Also tag Expected if the Non-target is frequent.] - *** Not-meaningful [Not having a serious, important, or useful quality or purpose.] - *** Novel [Having no previous example or precedent or parallel.] - *** Oddball {relatedTag=Unexpected, suggestedTag=Target} [Something unusual, or infrequent.] - *** Penalty [A disadvantage, loss, or hardship due to some action.] - *** Planned {relatedTag=Unplanned} [Something that was decided on or arranged in advance.] - *** Priming [An implicit memory effect in which exposure to a stimulus influences response to a later stimulus.] - *** Query [A sentence of inquiry that asks for a reply.] - *** Reward [A positive reinforcement for a desired action, behavior or response.] - *** Stop-signal {relatedTag=Go-signal} [An indicator that the agent should stop the current activity.] - *** Target [Something fixed as a goal, destination, or point of examination.] - *** Threat [An indicator that signifies hostility and predicts an increased probability of attack.] - *** Timed [Something planned or scheduled to be done at a particular time or lasting for a specified amount of time.] - *** Unexpected {relatedTag=Expected} [Something that is not anticipated.] - *** Unplanned {relatedTag=Planned} [Something that has not been planned as part of the task.] - -'''Relation''' {extensionAllowed} [Concerns the way in which two or more people or things are connected.] - * Comparative-relation [Something considered in comparison to something else. The first entity is the focus.] - ** Approximately-equal-to [(A, (Approximately-equal-to, B)) indicates that A and B have almost the same value. Here A and B could refer to sizes, orders, positions or other quantities.] - ** Equal-to [(A, (Equal-to, B)) indicates that the size or order of A is the same as that of B.] - ** Greater-than [(A, (Greater-than, B)) indicates that the relative size or order of A is bigger than that of B.] - ** Greater-than-or-equal-to [(A, (Greater-than-or-equal-to, B)) indicates that the relative size or order of A is bigger than or the same as that of B.] - ** Less-than [(A, (Less-than, B)) indicates that A is smaller than B. Here A and B could refer to sizes, orders, positions or other quantities.] - ** Less-than-or-equal-to [(A, (Less-than-or-equal-to, B)) indicates that the relative size or order of A is smaller than or equal to B.] - ** Not-equal-to [(A, (Not-equal-to, B)) indicates that the size or order of A is not the same as that of B.] - * Connective-relation [Indicates two entities are related in some way. The first entity is the focus.] - ** Belongs-to [(A, (Belongs-to, B)) indicates that A is a member of B.] - ** Connected-to [(A, (Connected-to, B)) indicates that A is related to B in some respect, usually through a direct link.] - ** Contained-in [(A, (Contained-in, B)) indicates that A is completely inside of B.] - ** Described-by [(A, (Described-by, B)) indicates that B provides information about A.] - ** From-to [(A, (From-to, B)) indicates a directional relation from A to B. A is considered the source.] - ** Group-of [(A, (Group-of, B)) indicates A is a group of items of type B.] - ** Implied-by [(A, (Implied-by, B)) indicates B is suggested by A.] - ** Includes [(A, (Includes, B)) indicates that A has B as a member or part.] - ** Interacts-with [(A, (Interacts-with, B)) indicates A and B interact, possibly reciprocally.] - ** Member-of [(A, (Member-of, B)) indicates A is a member of group B.] - ** Part-of [(A, (Part-of, B)) indicates A is a part of the whole B.] - ** Performed-by [(A, (Performed-by, B)) indicates that the action or procedure A was carried out by agent B.] - ** Performed-using [(A, (Performed-using, B)) indicates that the action or procedure A was accomplished using B.] - ** Related-to [(A, (Related-to, B)) indicates A has some relationship to B.] - ** Unrelated-to [(A, (Unrelated-to, B)) indicates that A is not related to B. For example, A is not related to Task.] - * Directional-relation [A relationship indicating direction of change of one entity relative to another. The first entity is the focus.] - ** Away-from [(A, (Away-from, B)) indicates that A is going or has moved away from B. The meaning depends on A and B.] - ** Towards [(A, (Towards, B)) indicates that A is going to or has moved to B. The meaning depends on A and B.] - * Logical-relation [Indicating a logical relationship between entities. The first entity is usually the focus.] - ** And [(A, (And, B)) means A and B are both in effect.] - ** Or [(A, (Or, B)) means at least one of A and B are in effect.] - * Spatial-relation [Indicating a relationship about position between entities.] - ** Above [(A, (Above, B)) means A is in a place or position that is higher than B.] - ** Across-from [(A, (Across-from, B)) means A is on the opposite side of something from B.] - ** Adjacent-to [(A, (Adjacent-to, B)) indicates that A is next to B in time or space.] - ** Ahead-of [(A, (Ahead-of, B)) indicates that A is further forward in time or space in B.] - ** Around [(A, (Around, B)) means A is in or near the present place or situation of B.] - ** Behind [(A, (Behind, B)) means A is at or to the far side of B, typically so as to be hidden by it.] - ** Below [(A, (Below, B)) means A is in a place or position that is lower than the position of B.] - ** Between [(A, (Between, (B, C))) means A is in the space or interval separating B and C.] - ** Bilateral-to [(A, (Bilateral, B)) means A is on both sides of B or affects both sides of B.] - ** Bottom-edge-of {relatedTag=Left-edge-of, relatedTag=Right-edge-of, relatedTag=Top-edge-of} [(A, (Bottom-edge-of, B)) means A is on the bottom most part or or near the boundary of B.] - ** Boundary-of [(A, (Boundary-of, B)) means A is on or part of the edge or boundary of B.] - ** Center-of [(A, (Center-of, B)) means A is at a point or or in an area that is approximately central within B.] - ** Close-to [(A, (Close-to, B)) means A is at a small distance from or is located near in space to B.] - ** Far-from [(A, (Far-from, B)) means A is at a large distance from or is not located near in space to B.] - ** In-front-of [(A, (In-front-of, B)) means A is in a position just ahead or at the front part of B, potentially partially blocking B from view.] - ** Left-edge-of {relatedTag=Bottom-edge-of, relatedTag=Right-edge-of, relatedTag=Top-edge-of} [(A, (Left-edge-of, B)) means A is located on the left side of B on or near the boundary of B.] - ** Left-side-of {relatedTag=Right-side-of} [(A, (Left-side-of, B)) means A is located on the left side of B usually as part of B.] - ** Lower-center-of {relatedTag=Center-of, relatedTag=Lower-left-of, relatedTag=Lower-right-of, relatedTag=Upper-center-of, relatedTag=Upper-right-of} [(A, (Lower-center-of, B)) means A is situated on the lower center part of B (due south). This relation is often used to specify qualitative information about screen position.] - ** Lower-left-of {relatedTag=Center-of, relatedTag=Lower-center-of, relatedTag=Lower-right-of, relatedTag=Upper-center-of, relatedTag=Upper-left-of, relatedTag=Upper-right-of} [(A, (Lower-left-of, B)) means A is situated on the lower left part of B. This relation is often used to specify qualitative information about screen position.] - ** Lower-right-of {relatedTag=Center-of, relatedTag=Lower-center-of, relatedTag=Lower-left-of, relatedTag=Upper-left-of, relatedTag=Upper-center-of, relatedTag=Upper-left-of, relatedTag=Lower-right-of} [(A, (Lower-right-of, B)) means A is situated on the lower right part of B. This relation is often used to specify qualitative information about screen position.] - ** Outside-of [(A, (Outside-of, B)) means A is located in the space around but not including B.] - ** Over [(A, (Over, B)) means A above is above B so as to cover or protect or A extends over the a general area as from a from a vantage point.] - ** Right-edge-of {relatedTag=Bottom-edge-of, relatedTag=Left-edge-of, relatedTag=Top-edge-of} [(A, (Right-edge-of, B)) means A is located on the right side of B on or near the boundary of B.] - ** Right-side-of {relatedTag=Left-side-of} [(A, (Right-side-of, B)) means A is located on the right side of B usually as part of B.] - ** To-left-of [(A, (To-left-of, B)) means A is located on or directed toward the side to the west of B when B is facing north. This term is used when A is not part of B.] - ** To-right-of [(A, (To-right-of, B)) means A is located on or directed toward the side to the east of B when B is facing north. This term is used when A is not part of B.] - ** Top-edge-of {relatedTag=Left-edge-of, relatedTag=Right-edge-of, relatedTag=Bottom-edge-of} [(A, (Top-edge-of, B)) means A is on the uppermost part or or near the boundary of B.] - ** Top-of [(A, (Top-of, B)) means A is on the uppermost part, side, or surface of B.] - ** Underneath [(A, (Underneath, B)) means A is situated directly below and may be concealed by B.] - ** Upper-center-of {relatedTag=Center-of, relatedTag=Lower-center-of, relatedTag=Lower-left-of, relatedTag=Lower-right-of, relatedTag=Upper-center-of, relatedTag=Upper-right-of} [(A, (Upper-center-of, B)) means A is situated on the upper center part of B (due north). This relation is often used to specify qualitative information about screen position.] - ** Upper-left-of {relatedTag=Center-of, relatedTag=Lower-center-of, relatedTag=Lower-left-of, relatedTag=Lower-right-of, relatedTag=Upper-center-of, relatedTag=Upper-right-of} [(A, (Upper-left-of, B)) means A is situated on the upper left part of B. This relation is often used to specify qualitative information about screen position.] - ** Upper-right-of {relatedTag=Center-of, relatedTag=Lower-center-of, relatedTag=Lower-left-of, relatedTag=Upper-left-of, relatedTag=Upper-center-of, relatedTag=Lower-right-of} [(A, (Upper-right-of, B)) means A is situated on the upper right part of B. This relation is often used to specify qualitative information about screen position.] - ** Within [(A, (Within, B)) means A is on the inside of or contained in B.] - * Temporal-relation [A relationship that includes a temporal or time-based component.] - ** After [(A, (After B)) means A happens at a time subsequent to a reference time related to B.] - ** Asynchronous-with [(A, (Asynchronous-with, B)) means A happens at times not occurring at the same time or having the same period or phase as B.] - ** Before [(A, (Before B)) means A happens at a time earlier in time or order than B.] - ** During [(A, (During, B)) means A happens at some point in a given period of time in which B is ongoing.] - ** Synchronous-with [(A, (Synchronous-with, B)) means A happens at occurs at the same time or rate as B.] - ** Waiting-for [(A, (Waiting-for, B)) means A pauses for something to happen in B.] - -'''Sleep-and-drowsiness''' {requireChild, inLibrary=score} [The features of the ongoing activity during sleep are scored here. If abnormal graphoelements appear, disappear or change their morphology during sleep, that is not scored here but at the entry corresponding to that graphooelement (as a modulator).] - * Sleep-architecture {suggestedTag=Property-not-possible-to-determine, inLibrary=score} [For longer recordings. Only to be scored if whole-night sleep is part of the recording. It is a global descriptor of the structure and pattern of sleep: estimation of the amount of time spent in REM and NREM sleep, sleep duration, NREM-REM cycle.] - ** Normal-sleep-architecture {inLibrary=score} - ** Abnormal-sleep-architecture {inLibrary=score} - * Sleep-stage-reached {requireChild, suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-significance-to-recording, inLibrary=score} [For normal sleep patterns the sleep stages reached during the recording can be specified] - ** Sleep-stage-N1 {inLibrary=score} [Sleep stage 1.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Sleep-stage-N2 {inLibrary=score} [Sleep stage 2.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Sleep-stage-N3 {inLibrary=score} [Sleep stage 3.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - ** Sleep-stage-REM {inLibrary=score} [Rapid eye movement.] - *** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - * Sleep-spindles {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry, inLibrary=score} [Burst at 11-15 Hz but mostly at 12-14 Hz generally diffuse but of higher voltage over the central regions of the head, occurring during sleep. Amplitude varies but is mostly below 50 microV in the adult.] - * Arousal-pattern {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Arousal pattern in children. Prolonged, marked high voltage 4-6/s activity in all leads with some intermixed slower frequencies, in children.] - * Frontal-arousal-rhythm {suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Prolonged (up to 20s) rhythmical sharp or spiky activity over the frontal areas (maximum over the frontal midline) seen at arousal from sleep in children with minimal cerebral dysfunction.] - * Vertex-wave {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry, inLibrary=score} [Sharp potential, maximal at the vertex, negative relative to other areas, apparently occurring spontaneously during sleep or in response to a sensory stimulus during sleep or wakefulness. May be single or repetitive. Amplitude varies but rarely exceeds 250 microV. Abbreviation: V wave. Synonym: vertex sharp wave.] - * K-complex {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry, inLibrary=score} [A burst of somewhat variable appearance, consisting most commonly of a high voltage negative slow wave followed by a smaller positive slow wave frequently associated with a sleep spindle. Duration greater than 0.5 s. Amplitude is generally maximal in the frontal vertex. K complexes occur during nonREM sleep, apparently spontaneously, or in response to sudden sensory / auditory stimuli, and are not specific for any individual sensory modality.] - * Saw-tooth-waves {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry, inLibrary=score} [Vertex negative 2-5 Hz waves occuring in series during REM sleep] - * POSTS {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry, inLibrary=score} [Positive occipital sharp transients of sleep. Sharp transient maximal over the occipital regions, positive relative to other areas, apparently occurring spontaneously during sleep. May be single or repetitive. Amplitude varies but is generally bellow 50 microV.] - * Hypnagogic-hypersynchrony {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry, inLibrary=score} [Bursts of bilateral, synchronous delta or theta activity of large amplitude, occasionally with superimposed faster components, occurring during falling asleep or during awakening, in children.] - * Non-reactive-sleep {inLibrary=score} [EEG activity consisting of normal sleep graphoelements, but which cannot be interrupted by external stimuli/ the patient cannot be waken.] - -'''Uncertain-significant-pattern''' {requireChild, inLibrary=score} [EEG graphoelements or rhythms that resemble abnormal patterns but that are not necessarily associated with a pathology, and the physician does not consider them abnormal in the context of the scored recording (like normal variants and patterns).] - * Sharp-transient-pattern {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} - * Wicket-spikes {inLibrary=score} [Spike-like monophasic negative single waves or trains of waves occurring over the temporal regions during drowsiness that have an arcuate or mu-like appearance. These are mainly seen in older individuals and represent a benign variant that is of little clinical significance.] - * Small-sharp-spikes {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Benign epileptiform Transients of Sleep (BETS). Small sharp spikes (SSS) of very short duration and low amplitude, often followed by a small theta wave, occurring in the temporal regions during drowsiness and light sleep. They occur on one or both sides (often asynchronously). The main negative and positive components are of about equally spiky character. Rarely seen in children, they are seen most often in adults and the elderly. Two thirds of the patients have a history of epileptic seizures.] - * Fourteen-six-Hz-positive-burst {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Burst of arch-shaped waves at 13-17 Hz and/or 5-7-Hz but most commonly at 14 and or 6 Hz seen generally over the posterior temporal and adjacent areas of one or both sides of the head during sleep. The sharp peaks of its component waves are positive with respect to other regions. Amplitude varies but is generally below 75 micro V. Comments: (1) best demonstrated by referential recording using contralateral earlobe or other remote, reference electrodes. (2) This pattern has no established clinical significance.] - * Six-Hz-spike-slow-wave {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Spike and slow wave complexes at 4-7Hz, but mostly at 6 Hz occurring generally in brief bursts bilaterally and synchronously, symmetrically or asymmetrically, and either confined to or of larger amplitude over the posterior or anterior regions of the head. The spike has a strong positive component. Amplitude varies but is generally smaller than that of spike-and slow-wave complexes repeating at slower rates. Comment: this pattern should be distinguished from epileptiform discharges. Synonym: wave and spike phantom.] - * Rudimentary-spike-wave-complex {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Synonym: Pseudo petit mal discharge. Paroxysmal discharge that consists of generalized or nearly generalized high voltage 3 to 4/sec waves with poorly developed spike in the positive trough between the slow waves, occurring in drowsiness only. It is found only in infancy and early childhood when marked hypnagogic rhythmical theta activity is paramount in the drowsy state.] - * Slow-fused-transient {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [A posterior slow-wave preceded by a sharp-contoured potential that blends together with the ensuing slow wave, in children.] - * Needle-like-occipital-spikes-blind {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Spike discharges of a particularly fast and needle-like character develop over the occipital region in most congenitally blind children. Completely disappear during childhood or adolescence.] - * Subclinical-rhythmic-EEG-discharge-adults {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Subclinical rhythmic EEG discharge of adults (SERDA). A rhythmic pattern seen in the adult age group, mainly in the waking state or drowsiness. It consists of a mixture of frequencies, often predominant in the theta range. The onset may be fairly abrupt with widespread sharp rhythmical theta and occasionally with delta activity. As to the spatial distribution, a maximum of this discharge is usually found over the centroparietal region and especially over the vertex. It may resemble a seizure discharge but is not accompanied by any clinical signs or symptoms.] - * Rhythmic-temporal-theta-burst-drowsiness {inLibrary=score} [Rhythmic temporal theta burst of drowsiness (RTTD). Characteristic burst of 4-7 Hz waves frequently notched by faster waves, occurring over the temporal regions of the head during drowsiness. Synonym: psychomotor variant pattern. Comment: this is a pattern of drowsiness that is of no clinical significance.] - * Temporal-slowing-elderly {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Focal theta and/or delta activity over the temporal regions, especially the left, in persons over the age of 60. Amplitudes are low/similar to the background activity. Comment: focal temporal theta was found in 20 percent of people between the ages of 40-59 years, and 40 percent of people between 60 and 79 years. One third of people older than 60 years had focal temporal delta activity.] - * Breach-rhythm {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Rhythmical activity recorded over cranial bone defects. Usually it is in the 6 to 11/sec range, does not respond to movements.] - * Other-uncertain-significant-pattern {requireChild, inLibrary=score} - ** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] - - -!# end schema - -'''Unit classes''' -* accelerationUnits {defaultUnits=m-per-s^2} -** m-per-s^2 {SIUnit, unitSymbol, conversionFactor=1.0} -* angleUnits {defaultUnits=radian} -** radian {SIUnit, conversionFactor=1.0} -** rad {SIUnit, unitSymbol, conversionFactor=1.0} -** degree {conversionFactor=0.0174533} -* areaUnits {defaultUnits=m^2} -** m^2 {SIUnit, unitSymbol, conversionFactor=1.0} -* currencyUnits {defaultUnits=$} [Units indicating the worth of something.] -** dollar {conversionFactor=1.0} -** $ {unitPrefix, unitSymbol, conversionFactor=1.0} -** euro -** point -* electricPotentialUnits {defaultUnits=uv} -** v {SIUnit, unitSymbol, conversionFactor=0.000001} -** Volt {SIUnit, conversionFactor=0.000001} -* frequencyUnits {defaultUnits=Hz} -** hertz {SIUnit, conversionFactor=1.0} -** Hz {SIUnit, unitSymbol, conversionFactor=1.0} -* intensityUnits {defaultUnits=dB} -** dB {unitSymbol, conversionFactor=1.0} [Intensity expressed as ratio to a threshold. May be used for sound intensity.] -** candela {SIUnit} [Units used to express light intensity.] -** cd {SIUnit, unitSymbol} [Units used to express light intensity.] -* jerkUnits {defaultUnits=m-per-s^3} -** m-per-s^3 {unitSymbol, conversionFactor=1.0} -* magneticFieldUnits {defaultUnits=fT} [Units used to magnetic field intensity.] -** tesla {SIUnit, conversionFactor=10^-15} -** T {SIUnit, unitSymbol, conversionFactor=10^-15} -* memorySizeUnits {defaultUnits=B} -** byte {SIUnit, conversionFactor=1.0} -** B {SIUnit, unitSymbol, conversionFactor=1.0} -* physicalLengthUnits {defaultUnits=m} -** foot {conversionFactor=0.3048} -** inch {conversionFactor=0.0254} -** meter {SIUnit, conversionFactor=1.0} -** metre {SIUnit, conversionFactor=1.0} -** m {SIUnit, unitSymbol, conversionFactor=1.0} -** mile {conversionFactor=1609.34} -* speedUnits {defaultUnits=m-per-s} -** m-per-s {SIUnit, unitSymbol, conversionFactor=1.0} -** mph {unitSymbol, conversionFactor=0.44704} -** kph {unitSymbol, conversionFactor=0.277778} -* temperatureUnits -** degree Celsius {SIUnit, conversionFactor=1.0} -** oC {SIUnit, unitSymbol, conversionFactor=1.0} -* timeUnits {defaultUnits=s} -** second {SIUnit, conversionFactor=1.0} -** s {SIUnit, unitSymbol, conversionFactor=1.0} -** day {conversionFactor=86400} -** minute {conversionFactor=60} -** hour {conversionFactor=3600} [Should be in 24-hour format.] -* volumeUnits {defaultUnits=m^3} -** m^3 {SIUnit, unitSymbol, conversionFactor=1.0} -* weightUnits {defaultUnits=g} -** g {SIUnit, unitSymbol, conversionFactor=1.0} -** gram {SIUnit, conversionFactor=1.0} -** pound {conversionFactor=453.592} -** lb {conversionFactor=453.592} - -'''Unit modifiers''' -* deca {SIUnitModifier, conversionFactor=10.0} [SI unit multiple representing 10^1.] -* da {SIUnitSymbolModifier, conversionFactor=10.0} [SI unit multiple representing 10^1.] -* hecto {SIUnitModifier, conversionFactor=100.0} [SI unit multiple representing 10^2.] -* h {SIUnitSymbolModifier, conversionFactor=100.0} [SI unit multiple representing 10^2.] -* kilo {SIUnitModifier, conversionFactor=1000.0} [SI unit multiple representing 10^3.] -* k {SIUnitSymbolModifier, conversionFactor=1000.0} [SI unit multiple representing 10^3.] -* mega {SIUnitModifier, conversionFactor=10^6} [SI unit multiple representing 10^6.] -* M {SIUnitSymbolModifier, conversionFactor=10^6} [SI unit multiple representing 10^6.] -* giga {SIUnitModifier, conversionFactor=10^9} [SI unit multiple representing 10^9.] -* G {SIUnitSymbolModifier, conversionFactor=10^9} [SI unit multiple representing 10^9.] -* tera {SIUnitModifier, conversionFactor=10^12} [SI unit multiple representing 10^12.] -* T {SIUnitSymbolModifier, conversionFactor=10^12} [SI unit multiple representing 10^12.] -* peta {SIUnitModifier, conversionFactor=10^15} [SI unit multiple representing 10^15.] -* P {SIUnitSymbolModifier, conversionFactor=10^15} [SI unit multiple representing 10^15.] -* exa {SIUnitModifier, conversionFactor=10^18} [SI unit multiple representing 10^18.] -* E {SIUnitSymbolModifier, conversionFactor=10^18} [SI unit multiple representing 10^18.] -* zetta {SIUnitModifier, conversionFactor=10^21} [SI unit multiple representing 10^21.] -* Z {SIUnitSymbolModifier, conversionFactor=10^21} [SI unit multiple representing 10^21.] -* yotta {SIUnitModifier, conversionFactor=10^24} [SI unit multiple representing 10^24.] -* Y {SIUnitSymbolModifier, conversionFactor=10^24} [SI unit multiple representing 10^24.] -* deci {SIUnitModifier, conversionFactor=0.1} [SI unit submultiple representing 10^-1.] -* d {SIUnitSymbolModifier, conversionFactor=0.1} [SI unit submultiple representing 10^-1.] -* centi {SIUnitModifier, conversionFactor=0.01} [SI unit submultiple representing 10^-2.] -* c {SIUnitSymbolModifier, conversionFactor=0.01} [SI unit submultiple representing 10^-2.] -* milli {SIUnitModifier, conversionFactor=0.001} [SI unit submultiple representing 10^-3.] -* m {SIUnitSymbolModifier, conversionFactor=0.001} [SI unit submultiple representing 10^-3.] -* micro {SIUnitModifier, conversionFactor=10^-6} [SI unit submultiple representing 10^-6.] -* u {SIUnitSymbolModifier, conversionFactor=10^-6} [SI unit submultiple representing 10^-6.] -* nano {SIUnitModifier, conversionFactor=10^-9} [SI unit submultiple representing 10^-9.] -* n {SIUnitSymbolModifier, conversionFactor=10^-9} [SI unit submultiple representing 10^-9.] -* pico {SIUnitModifier, conversionFactor=10^-12} [SI unit submultiple representing 10^-12.] -* p {SIUnitSymbolModifier, conversionFactor=10^-12} [SI unit submultiple representing 10^-12.] -* femto {SIUnitModifier, conversionFactor=10^-15} [SI unit submultiple representing 10^-15.] -* f {SIUnitSymbolModifier, conversionFactor=10^-15} [SI unit submultiple representing 10^-15.] -* atto {SIUnitModifier, conversionFactor=10^-18} [SI unit submultiple representing 10^-18.] -* a {SIUnitSymbolModifier, conversionFactor=10^-18} [SI unit submultiple representing 10^-18.] -* zepto {SIUnitModifier, conversionFactor=10^-21} [SI unit submultiple representing 10^-21.] -* z {SIUnitSymbolModifier, conversionFactor=10^-21} [SI unit submultiple representing 10^-21.] -* yocto {SIUnitModifier, conversionFactor=10^-24} [SI unit submultiple representing 10^-24.] -* y {SIUnitSymbolModifier, conversionFactor=10^-24} [SI unit submultiple representing 10^-24.] - -'''Value classes''' -* dateTimeClass {allowedCharacter=digits, allowedCharacter=T, allowedCharacter=-, allowedCharacter=:} [Date-times should conform to ISO8601 date-time format YYYY-MM-DDThh:mm:ss. Any variation on the full form is allowed.] -* nameClass {allowedCharacter=letters, allowedCharacter=digits, allowedCharacter=_, allowedCharacter=-} [Value class designating values that have the characteristics of node names. The allowed characters are alphanumeric, hyphen, and underbar.] -* numericClass {allowedCharacter=digits, allowedCharacter=E, allowedCharacter=e, allowedCharacter=+, allowedCharacter=-, allowedCharacter=.} [Value must be a valid numerical value.] -* posixPath {allowedCharacter=digits, allowedCharacter=letters, allowedCharacter=/, allowedCharacter=:} [Posix path specification.] -* textClass {allowedCharacter=letters, allowedCharacter=digits, allowedCharacter=blank, allowedCharacter=+, allowedCharacter=-, allowedCharacter=:, allowedCharacter=;, allowedCharacter=., allowedCharacter=/, allowedCharacter=(, allowedCharacter=), allowedCharacter=?, allowedCharacter=*, allowedCharacter=%, allowedCharacter=$, allowedCharacter=@} [Value class designating values that have the characteristics of text such as in descriptions.] - -'''Schema attributes''' -* allowedCharacter {valueClassProperty} [A schema attribute of value classes specifying a special character that is allowed in expressing the value of a placeholder. Normally the allowed characters are listed individually. However, the word letters designates the upper and lower case alphabetic characters and the word digits designates the digits 0-9. The word blank designates the blank character.] -* conversionFactor {unitProperty, unitModifierProperty} [The multiplicative factor to multiply these units to convert to default units.] -* deprecatedFrom {elementProperty} [Indicates that this element is deprecated. The value of the attribute is the latest schema version in which the element appeared in undeprecated form.] -* defaultUnits {unitClassProperty} [A schema attribute of unit classes specifying the default units to use if the placeholder has a unit class but the substituted value has no units.] -* extensionAllowed {boolProperty, nodeProperty, isInheritedProperty} [A schema attribute indicating that users can add unlimited levels of child nodes under this tag. This tag is propagated to child nodes with the exception of the hashtag placeholders.] -* inLibrary {elementProperty} [Indicates this schema element came from the named library schema, not the standard schema. This attribute is added by tools when a library schema is merged into its partnered standard schema.] -* recommended {boolProperty, nodeProperty} [A schema attribute indicating that the event-level HED string should include this tag.] -* relatedTag {nodeProperty, isInheritedProperty} [A schema attribute suggesting HED tags that are closely related to this tag. This attribute is used by tagging tools.] -* requireChild {boolProperty, nodeProperty} [A schema attribute indicating that one of the node elements descendants must be included when using this tag.] -* required {boolProperty, nodeProperty} [A schema attribute indicating that every event-level HED string should include this tag.] -* reserved {boolProperty, nodeProperty} [A schema attribute indicating that this tag has special meaning and requires special handling by tools.] -* rooted {nodeProperty} [Indicates a top-level library schema node is identical to a node of the same name in the partnered standard schema. This attribute can only appear in nodes that have the inLibrary schema attribute.] -* SIUnit {boolProperty, unitProperty} [A schema attribute indicating that this unit element is an SI unit and can be modified by multiple and submultiple names. Note that some units such as byte are designated as SI units although they are not part of the standard.] -* SIUnitModifier {boolProperty, unitModifierProperty} [A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a base unit rather than a unit symbol.] -* SIUnitSymbolModifier {boolProperty, unitModifierProperty} [A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a unit symbol rather than a base symbol.] -* suggestedTag {nodeProperty, isInheritedProperty} [A schema attribute that indicates another tag that is often associated with this tag. This attribute is used by tagging tools to provide tagging suggestions.] -* tagGroup {boolProperty, nodeProperty} [A schema attribute indicating the tag can only appear inside a tag group.] -* takesValue {boolProperty, nodeProperty} [A schema attribute indicating the tag is a hashtag placeholder that is expected to be replaced with a user-defined value.] -* topLevelTagGroup {boolProperty, nodeProperty} [A schema attribute indicating that this tag (or its descendants) can only appear in a top-level tag group. A tag group can have at most one tag with this attribute.] -* unique {boolProperty, nodeProperty} [A schema attribute indicating that only one of this tag or its descendants can be used in the event-level HED string.] -* unitClass {nodeProperty} [A schema attribute specifying which unit class this value tag belongs to.] -* unitPrefix {boolProperty, unitProperty} [A schema attribute applied specifically to unit elements to designate that the unit indicator is a prefix (e.g., dollar sign in the currency units).] -* unitSymbol {boolProperty, unitProperty} [A schema attribute indicating this tag is an abbreviation or symbol representing a type of unit. Unit symbols represent both the singular and the plural and thus cannot be pluralized.] -* valueClass {nodeProperty} [A schema attribute specifying which value class this value tag belongs to.] - -'''Properties''' -* boolProperty [Indicates that the schema attribute represents something that is either true or false and does not have a value. Attributes without this value are assumed to have string values.] -* elementProperty [Indicates this schema attribute can apply to any type of element(tag term, unit class, etc).] -* isInheritedProperty [Indicates that this attribute is inherited by child nodes. This property only applies to schema attributes for nodes.] -* nodeProperty [Indicates this schema attribute applies to node (tag-term) elements. This was added to allow for an attribute to apply to multiple elements.] -* unitClassProperty [Indicates that the schema attribute is meant to be applied to unit classes.] -* unitModifierProperty [Indicates that the schema attribute is meant to be applied to unit modifier classes.] -* unitProperty [Indicates that the schema attribute is meant to be applied to units within a unit class.] -* valueClassProperty [Indicates that the schema attribute is meant to be applied to value classes.] -'''Epilogue''' -The Standardized Computer-based Organized Reporting of EEG (SCORE) is a standard terminology for scalp EEG data assessment designed for use in clinical practice that may also be used for research purposes. -The SCORE standard defines terms for describing phenomena observed in scalp EEG data. It is also potentially applicable (with some suitable extensions) to EEG recorded in critical care and neonatal settings. -The SCORE standard received European consensus and has been endorsed by the European Chapter of the International Federation of Clinical Neurophysiology (IFCN) and the International League Against Epilepsy (ILAE) Commission on European Affairs. -A second revised and extended version of SCORE achieved international consensus. - -[1] Beniczky, Sandor, et al. "Standardized computer based organized reporting of EEG: SCORE." Epilepsia 54.6 (2013). -[2] Beniczky, Sandor, et al. "Standardized computer based organized reporting of EEG: SCORE second version." Clinical Neurophysiology 128.11 (2017). - -TPA, March 2023 - -!# end hed +HED version="1.1.0" library="score" withStandard="8.2.0" + +'''Prologue''' +This schema is a Hierarchical Event Descriptors (HED) Library Schema implementation of Standardized Computer-based Organized Reporting of EEG (SCORE)[1,2] for describing events occurring during neuroimaging time series recordings. +The HED-SCORE library schema allows neurologists, neurophysiologists, and brain researchers to annotate electrophysiology recordings using terms from an internationally accepted set of defined terms (SCORE) compatible with the HED framework. +The resulting annotations are understandable to clinicians and directly usable in computer analysis. + +Future extensions may be implemented in the HED-SCORE library schema. +For more information see https://hed-schema-library.readthedocs.io/en/latest/index.html. + +!# start schema + +'''Modulator''' {requireChild, inLibrary=score} [External stimuli / interventions or changes in the alertness level (sleep) that modify: the background activity, or how often a graphoelement is occurring, or change other features of the graphoelement (like intra-burst frequency). For each observed finding, there is an option of specifying how they are influenced by the modulators and procedures that were done during the recording.] +* Sleep-modulator {inLibrary=score} +** Sleep-deprivation {inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Sleep-following-sleep-deprivation {inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Natural-sleep {inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Induced-sleep {inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Drowsiness {inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Awakening {inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +* Medication-modulator {inLibrary=score} +** Medication-administered-during-recording {inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Medication-withdrawal-or-reduction-during-recording {inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +* Eye-modulator {inLibrary=score} +** Manual-eye-closure {inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Manual-eye-opening {inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +* Stimulation-modulator {inLibrary=score} +** Intermittent-photic-stimulation {requireChild, suggestedTag=Intermittent-photic-stimulation-effect, inLibrary=score} +*** # {takesValue, valueClass=numericClass, unitClass=frequencyUnits, inLibrary=score} +** Auditory-stimulation {inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Nociceptive-stimulation {inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +* Hyperventilation {inLibrary=score} +** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +* Physical-effort {inLibrary=score} +** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +* Cognitive-task {inLibrary=score} +** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +* Other-modulator-or-procedure {requireChild, inLibrary=score} +** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] + +'''Background-activity''' {requireChild, inLibrary=score} [An EEG activity representing the setting in which a given normal or abnormal pattern appears and from which such pattern is distinguished.] +* Posterior-dominant-rhythm {suggestedTag=Finding-significance-to-recording, suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude-asymmetry, suggestedTag=Posterior-dominant-rhythm-property, inLibrary=score} [Rhythmic activity occurring during wakefulness over the posterior regions of the head, generally with maximum amplitudes over the occipital areas. Amplitude varies. Best seen with eyes closed and during physical relaxation and relative mental inactivity. Blocked or attenuated by attention, especially visual, and mental effort. In adults this is the alpha rhythm, and the frequency is 8 to 13 Hz. However the frequency can be higher or lower than this range (often a supra or sub harmonic of alpha frequency) and is called alpha variant rhythm (fast and slow alpha variant rhythm). In children, the normal range of the frequency of the posterior dominant rhythm is age-dependant.] +* Mu-rhythm {suggestedTag=Finding-frequency, suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, inLibrary=score} [EEG rhythm at 7-11 Hz composed of arch-shaped waves occurring over the central or centro-parietal regions of the scalp during wakefulness. Amplitudes varies but is mostly below 50 microV. Blocked or attenuated most clearly by contralateral movement, thought of movement, readiness to move or tactile stimulation.] +* Other-organized-rhythm {requireChild, suggestedTag=Rhythmic-activity-morphology, suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [EEG activity that consisting of waves of approximately constant period, which is considered as part of the background (ongoing) activity, but does not fulfill the criteria of the posterior dominant rhythm.] +** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +* Background-activity-special-feature {requireChild, inLibrary=score} [Special Features. Special features contains scoring options for the background activity of critically ill patients.] +** Continuous-background-activity {suggestedTag=Rhythmic-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent, inLibrary=score} +** Nearly-continuous-background-activity {suggestedTag=Rhythmic-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent, inLibrary=score} +** Discontinuous-background-activity {suggestedTag=Rhythmic-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent, inLibrary=score} +** Background-burst-suppression {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent, inLibrary=score} [EEG pattern consisting of bursts (activity appearing and disappearing abruptly) interrupted by periods of low amplitude (below 20 microV) and which occurs simultaneously over all head regions.] +** Background-burst-attenuation {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent, inLibrary=score} +** Background-activity-suppression {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent, suggestedTag=Appearance-mode, inLibrary=score} [Periods showing activity under 10 microV (referential montage) and interrupting the background (ongoing) activity.] +** Electrocerebral-inactivity {inLibrary=score} [Absence of any ongoing cortical electric activities; in all leads EEG is isoelectric or only contains artifacts. Sensitivity has to be increased up to 2 microV/mm; recording time: at least 30 minutes.] + +'''Sleep-and-drowsiness''' {requireChild, inLibrary=score} [The features of the ongoing activity during sleep are scored here. If abnormal graphoelements appear, disappear or change their morphology during sleep, that is not scored here but at the entry corresponding to that graphooelement (as a modulator).] +* Sleep-architecture {suggestedTag=Property-not-possible-to-determine, inLibrary=score} [For longer recordings. Only to be scored if whole-night sleep is part of the recording. It is a global descriptor of the structure and pattern of sleep: estimation of the amount of time spent in REM and NREM sleep, sleep duration, NREM-REM cycle.] +** Normal-sleep-architecture {inLibrary=score} +** Abnormal-sleep-architecture {inLibrary=score} +* Sleep-stage-reached {requireChild, suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-significance-to-recording, inLibrary=score} [For normal sleep patterns the sleep stages reached during the recording can be specified] +** Sleep-stage-N1 {inLibrary=score} [Sleep stage 1.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Sleep-stage-N2 {inLibrary=score} [Sleep stage 2.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Sleep-stage-N3 {inLibrary=score} [Sleep stage 3.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Sleep-stage-REM {inLibrary=score} [Rapid eye movement.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +* Sleep-spindles {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry, inLibrary=score} [Burst at 11-15 Hz but mostly at 12-14 Hz generally diffuse but of higher voltage over the central regions of the head, occurring during sleep. Amplitude varies but is mostly below 50 microV in the adult.] +* Arousal-pattern {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Arousal pattern in children. Prolonged, marked high voltage 4-6/s activity in all leads with some intermixed slower frequencies, in children.] +* Frontal-arousal-rhythm {suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Prolonged (up to 20s) rhythmical sharp or spiky activity over the frontal areas (maximum over the frontal midline) seen at arousal from sleep in children with minimal cerebral dysfunction.] +* Vertex-wave {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry, inLibrary=score} [Sharp potential, maximal at the vertex, negative relative to other areas, apparently occurring spontaneously during sleep or in response to a sensory stimulus during sleep or wakefulness. May be single or repetitive. Amplitude varies but rarely exceeds 250 microV. Abbreviation: V wave. Synonym: vertex sharp wave.] +* K-complex {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry, inLibrary=score} [A burst of somewhat variable appearance, consisting most commonly of a high voltage negative slow wave followed by a smaller positive slow wave frequently associated with a sleep spindle. Duration greater than 0.5 s. Amplitude is generally maximal in the frontal vertex. K complexes occur during nonREM sleep, apparently spontaneously, or in response to sudden sensory / auditory stimuli, and are not specific for any individual sensory modality.] +* Saw-tooth-waves {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry, inLibrary=score} [Vertex negative 2-5 Hz waves occuring in series during REM sleep] +* POSTS {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry, inLibrary=score} [Positive occipital sharp transients of sleep. Sharp transient maximal over the occipital regions, positive relative to other areas, apparently occurring spontaneously during sleep. May be single or repetitive. Amplitude varies but is generally bellow 50 microV.] +* Hypnagogic-hypersynchrony {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry, inLibrary=score} [Bursts of bilateral, synchronous delta or theta activity of large amplitude, occasionally with superimposed faster components, occurring during falling asleep or during awakening, in children.] +* Non-reactive-sleep {inLibrary=score} [EEG activity consisting of normal sleep graphoelements, but which cannot be interrupted by external stimuli/ the patient cannot be waken.] + +'''Interictal-finding''' {requireChild, inLibrary=score} [EEG pattern / transient that is distinguished form the background activity, considered abnormal, but is not recorded during ictal period (seizure) or postictal period; the presence of an interictal finding does not necessarily imply that the patient has epilepsy.] +* Epileptiform-interictal-activity {suggestedTag=Spike-morphology, suggestedTag=Spike-and-slow-wave-morphology, suggestedTag=Runs-of-rapid-spikes-morphology, suggestedTag=Polyspikes-morphology, suggestedTag=Polyspike-and-slow-wave-morphology, suggestedTag=Sharp-wave-morphology, suggestedTag=Sharp-and-slow-wave-morphology, suggestedTag=Slow-sharp-wave-morphology, suggestedTag=High-frequency-oscillation-morphology, suggestedTag=Hypsarrhythmia-classic-morphology, suggestedTag=Hypsarrhythmia-modified-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-propagation, suggestedTag=Multifocal-finding, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, suggestedTag=Finding-incidence, inLibrary=score} +* Abnormal-interictal-rhythmic-activity {suggestedTag=Rhythmic-activity-morphology, suggestedTag=Polymorphic-delta-activity-morphology, suggestedTag=Frontal-intermittent-rhythmic-delta-activity-morphology, suggestedTag=Occipital-intermittent-rhythmic-delta-activity-morphology, suggestedTag=Temporal-intermittent-rhythmic-delta-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, suggestedTag=Finding-incidence, inLibrary=score} +* Interictal-special-patterns {requireChild, inLibrary=score} +** Interictal-periodic-discharges {suggestedTag=Periodic-discharge-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Periodic-discharge-time-related-features, inLibrary=score} [Periodic discharge not further specified (PDs).] +*** Generalized-periodic-discharges {inLibrary=score} [GPDs.] +*** Lateralized-periodic-discharges {inLibrary=score} [LPDs.] +*** Bilateral-independent-periodic-discharges {inLibrary=score} [BIPDs.] +*** Multifocal-periodic-discharges {inLibrary=score} [MfPDs.] +** Extreme-delta-brush {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} + +'''Critically-ill-patients-patterns''' {requireChild, inLibrary=score} [Rhythmic or periodic patterns in critically ill patients (RPPs) are scored according to the 2012 version of the American Clinical Neurophysiology Society Standardized Critical Care EEG Terminology (Hirsch et al., 2013).] +* Critically-ill-patients-periodic-discharges {suggestedTag=Periodic-discharge-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-frequency, suggestedTag=Periodic-discharge-time-related-features, inLibrary=score} [Periodic discharges (PDs).] +* Rhythmic-delta-activity {suggestedTag=Periodic-discharge-superimposed-activity, suggestedTag=Periodic-discharge-absolute-amplitude, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-frequency, suggestedTag=Periodic-discharge-time-related-features, inLibrary=score} [RDA] +* Spike-or-sharp-and-wave {suggestedTag=Periodic-discharge-sharpness, suggestedTag=Number-of-periodic-discharge-phases, suggestedTag=Periodic-discharge-triphasic-morphology, suggestedTag=Periodic-discharge-absolute-amplitude, suggestedTag=Periodic-discharge-relative-amplitude, suggestedTag=Periodic-discharge-polarity, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Finding-frequency, suggestedTag=Periodic-discharge-time-related-features, inLibrary=score} [SW] + +'''Episode''' {requireChild, inLibrary=score} [Clinical episode or electrographic seizure.] +* Epileptic-seizure {requireChild, inLibrary=score} [The ILAE presented a revised seizure classification that divides seizures into focal, generalized onset, or unknown onset.] +** Focal-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Automatism-motor-seizure, suggestedTag=Atonic-motor-seizure, suggestedTag=Clonic-motor-seizure, suggestedTag=Epileptic-spasm-episode, suggestedTag=Hyperkinetic-motor-seizure, suggestedTag=Myoclonic-motor-seizure, suggestedTag=Tonic-motor-seizure, suggestedTag=Autonomic-nonmotor-seizure, suggestedTag=Behavior-arrest-nonmotor-seizure, suggestedTag=Cognitive-nonmotor-seizure, suggestedTag=Emotional-nonmotor-seizure, suggestedTag=Sensory-nonmotor-seizure, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Focal seizures can be divided into focal aware and impaired awareness seizures, with additional motor and nonmotor classifications.] +*** Aware-focal-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} +*** Impaired-awareness-focal-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} +*** Awareness-unknown-focal-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} +*** Focal-to-bilateral-tonic-clonic-focal-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [A seizure type with focal onset, with awareness or impaired awareness, either motor or non-motor, progressing to bilateral tonic clonic activity. The prior term was seizure with partial onset with secondary generalization. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +** Generalized-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Tonic-clonic-motor-seizure, suggestedTag=Clonic-motor-seizure, suggestedTag=Tonic-motor-seizure, suggestedTag=Myoclonic-motor-seizure, suggestedTag=Myoclonic-tonic-clonic-motor-seizure, suggestedTag=Myoclonic-atonic-motor-seizure, suggestedTag=Atonic-motor-seizure, suggestedTag=Epileptic-spasm-episode, suggestedTag=Typical-absence-seizure, suggestedTag=Atypical-absence-seizure, suggestedTag=Myoclonic-absence-seizure, suggestedTag=Eyelid-myoclonia-absence-seizure, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Generalized-onset seizures are classified as motor or nonmotor (absence), without using awareness level as a classifier, as most but not all of these seizures are linked with impaired awareness.] +** Unknown-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Tonic-clonic-motor-seizure, suggestedTag=Epileptic-spasm-episode, suggestedTag=Behavior-arrest-nonmotor-seizure, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Even if the onset of seizures is unknown, they may exhibit characteristics that fall into categories such as motor, nonmotor, tonic-clonic, epileptic spasms, or behavior arrest.] +** Unclassified-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Referring to a seizure type that cannot be described by the ILAE 2017 classification either because of inadequate information or unusual clinical features.] +* Subtle-seizure {suggestedTag=Episode-phase, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Seizure type frequent in neonates, sometimes referred to as motor automatisms; they may include random and roving eye movements, sucking, chewing motions, tongue protrusion, rowing or swimming or boxing movements of the arms, pedaling and bicycling movements of the lower limbs; apneic seizures are relatively common. Although some subtle seizures are associated with rhythmic ictal EEG discharges, and are clearly epileptic, ictal EEG often does not show typical epileptic activity.] +* Electrographic-seizure {suggestedTag=Episode-phase, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Referred usually to non convulsive status. Ictal EEG: rhythmic discharge or spike and wave pattern with definite evolution in frequency, location, or morphology lasting at least 10 s; evolution in amplitude alone did not qualify.] +* Seizure-PNES {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Psychogenic non-epileptic seizure.] +* Sleep-related-episode {requireChild, inLibrary=score} +** Sleep-related-arousal {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Normal.] +** Benign-sleep-myoclonus {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [A distinctive disorder of sleep characterized by a) neonatal onset, b) rhythmic myoclonic jerks only during sleep and c) abrupt and consistent cessation with arousal, d) absence of concomitant electrographic changes suggestive of seizures, and e) good outcome.] +** Confusional-awakening {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Episode of non epileptic nature included in NREM parasomnias, characterized by sudden arousal and complex behavior but without full alertness, usually lasting a few minutes and occurring almost in all children at least occasionally. Amnesia of the episode is the rule.] +** Sleep-periodic-limb-movement {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [PLMS. Periodic limb movement in sleep. Episodes are characterized by brief (0.5- to 5.0-second) lower-extremity movements during sleep, which typically occur at 20- to 40-second intervals, most commonly during the first 3 hours of sleep. The affected individual is usually not aware of the movements or of the transient partial arousals.] +** REM-sleep-behavioral-disorder {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [REM sleep behavioral disorder. Episodes characterized by: a) presence of REM sleep without atonia (RSWA) on polysomnography (PSG); b) presence of at least 1 of the following conditions - (1) Sleep-related behaviors, by history, that have been injurious, potentially injurious, or disruptive (example: dream enactment behavior); (2) abnormal REM sleep behavior documented during PSG monitoring; (3) absence of epileptiform activity on electroencephalogram (EEG) during REM sleep (unless RBD can be clearly distinguished from any concurrent REM sleep-related seizure disorder); (4) sleep disorder not better explained by another sleep disorder, a medical or neurologic disorder, a mental disorder, medication use, or a substance use disorder.] +** Sleep-walking {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Episodes characterized by ambulation during sleep; the patient is difficult to arouse during an episode, and is usually amnesic following the episode. Episodes usually occur in the first third of the night during slow wave sleep. Polysomnographic recordings demonstrate 2 abnormalities during the first sleep cycle: frequent, brief, non-behavioral EEG-defined arousals prior to the somnambulistic episode and abnormally low gamma (0.75-2.0 Hz) EEG power on spectral analysis, correlating with high-voltage (hyper-synchronic gamma) waves lasting 10 to 15 s occurring just prior to the movement. This is followed by stage I NREM sleep, and there is no evidence of complete awakening.] +* Pediatric-episode {requireChild, inLibrary=score} +** Hyperekplexia {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Disorder characterized by exaggerated startle response and hypertonicity that may occur during the first year of life and in severe cases during the neonatal period. Children usually present with marked irritability and recurrent startles in response to handling and sounds. Severely affected infants can have severe jerks and stiffening, sometimes with breath-holding spells.] +** Jactatio-capitis-nocturna {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Relatively common in normal children at the time of going to bed, especially during the first year of life, the rhythmic head movements persist during sleep. Usually, these phenomena disappear before 3 years of age.] +** Pavor-nocturnus {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [A nocturnal episode characterized by age of onset of less than five years (mean age 18 months, with peak prevalence at five to seven years), appearance of signs of panic two hours after falling asleep with crying, screams, a fearful expression, inability to recognize other people including parents (for a duration of 5-15 minutes), amnesia upon awakening. Pavor nocturnus occurs in patients almost every night for months or years (but the frequency is highly variable and may be as low as once a month) and is likely to disappear spontaneously at the age of six to eight years.] +** Pediatric-stereotypical-behavior-episode {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Repetitive motor behavior in children, typically rhythmic and persistent; usually not paroxysmal and rarely suggest epilepsy. They include headbanging, head-rolling, jactatio capitis nocturna, body rocking, buccal or lingual movements, hand flapping and related mannerisms, repetitive hand-waving (to self-induce photosensitive seizures).] +* Paroxysmal-motor-event {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Paroxysmal phenomena during neonatal or childhood periods characterized by recurrent motor or behavioral signs or symptoms that must be distinguishes from epileptic disorders.] +* Syncope {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [Episode with loss of consciousness and muscle tone that is abrupt in onset, of short duration and followed by rapid recovery; it occurs in response to transient impairment of cerebral perfusion. Typical prodromal symptoms often herald onset of syncope and postictal symptoms are minimal. Syncopal convulsions resulting from cerebral anoxia are common but are not a form of epilepsy, nor are there any accompanying EEG ictal discharges.] +* Cataplexy {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting, inLibrary=score} [A sudden decrement in muscle tone and loss of deep tendon reflexes, leading to muscle weakness, paralysis, or postural collapse. Cataplexy usually is precipitated by an outburst of emotional expression-notably laughter, anger, or startle. It is one of the tetrad of symptoms of narcolepsy. During cataplexy, respiration and voluntary eye movements are not compromised. Consciousness is preserved.] +* Other-episode {requireChild, inLibrary=score} +** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] + +'''Physiologic-pattern''' {requireChild, inLibrary=score} [EEG graphoelements or rhythms that are considered normal. They only should be scored if the physician considers that they have a specific clinical significance for the recording.] +* Rhythmic-activity-pattern {suggestedTag=Rhythmic-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Not further specified.] +* Slow-alpha-variant-rhythm {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Characteristic rhythms mostly at 4-5 Hz, recorded most prominently over the posterior regions of the head. Generally alternate, or are intermixed, with alpha rhythm to which they often are harmonically related. Amplitude varies but is frequently close to 50 micro V. Blocked or attenuated by attention, especially visual, and mental effort. Comment: slow alpha variant rhythms should be distinguished from posterior slow waves characteristic of children and adolescents and occasionally seen in young adults.] +* Fast-alpha-variant-rhythm {suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Characteristic rhythm at 14-20 Hz, detected most prominently over the posterior regions of the head. May alternate or be intermixed with alpha rhythm. Blocked or attenuated by attention, especially visual, and mental effort.] +* Ciganek-rhythm {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Midline theta rhythm (Ciganek rhythm) may be observed during wakefulness or drowsiness. The frequency is 4-7 Hz, and the location is midline (ie, vertex). The morphology is rhythmic, smooth, sinusoidal, arciform, spiky, or mu-like.] +* Lambda-wave {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Diphasic sharp transient occurring over occipital regions of the head of waking subjects during visual exploration. The main component is positive relative to other areas. Time-locked to saccadic eye movement. Amplitude varies but is generally below 50 micro V.] +* Posterior-slow-waves-youth {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Waves in the delta and theta range, of variable form, lasting 0.35 to 0.5 s or longer without any consistent periodicity, found in the range of 6-12 years (occasionally seen in young adults). Alpha waves are almost always intermingled or superimposed. Reactive similar to alpha activity.] +* Diffuse-slowing-hyperventilation {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Diffuse slowing induced by hyperventilation. Bilateral, diffuse slowing during hyperventilation. Recorded in 70 percent of normal children (3-5 years) and less then 10 percent of adults. Usually appear in the posterior regions and spread forward in younger age group, whereas they tend to appear in the frontal regions and spread backward in the older age group.] +* Photic-driving {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Physiologic response consisting of rhythmic activity elicited over the posterior regions of the head by repetitive photic stimulation at frequencies of about 5-30 Hz. Comments: term should be limited to activity time-locked to the stimulus and of frequency identical or harmonically related to the stimulus frequency. Photic driving should be distinguished from the visual evoked potentials elicited by isolated flashes of light or flashes repeated at very low frequency.] +* Photomyogenic-response {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [A response to intermittent photic stimulation characterized by the appearance in the record of brief, repetitive muscular artifacts (spikes) over the anterior regions of the head. These often increase gradually in amplitude as stimuli are continued and cease promptly when the stimulus is withdrawn. Comment: this response is frequently associated with flutter of the eyelids and vertical oscillations of the eyeballs and sometimes with discrete jerking mostly involving the musculature of the face and head. (Preferred to synonym: photo-myoclonic response).] +* Other-physiologic-pattern {requireChild, inLibrary=score} +** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] + +'''Uncertain-significant-pattern''' {requireChild, inLibrary=score} [EEG graphoelements or rhythms that resemble abnormal patterns but that are not necessarily associated with a pathology, and the physician does not consider them abnormal in the context of the scored recording (like normal variants and patterns).] +* Sharp-transient-pattern {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} +* Wicket-spikes {inLibrary=score} [Spike-like monophasic negative single waves or trains of waves occurring over the temporal regions during drowsiness that have an arcuate or mu-like appearance. These are mainly seen in older individuals and represent a benign variant that is of little clinical significance.] +* Small-sharp-spikes {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Benign epileptiform Transients of Sleep (BETS). Small sharp spikes (SSS) of very short duration and low amplitude, often followed by a small theta wave, occurring in the temporal regions during drowsiness and light sleep. They occur on one or both sides (often asynchronously). The main negative and positive components are of about equally spiky character. Rarely seen in children, they are seen most often in adults and the elderly. Two thirds of the patients have a history of epileptic seizures.] +* Fourteen-six-Hz-positive-burst {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Burst of arch-shaped waves at 13-17 Hz and/or 5-7-Hz but most commonly at 14 and or 6 Hz seen generally over the posterior temporal and adjacent areas of one or both sides of the head during sleep. The sharp peaks of its component waves are positive with respect to other regions. Amplitude varies but is generally below 75 micro V. Comments: (1) best demonstrated by referential recording using contralateral earlobe or other remote, reference electrodes. (2) This pattern has no established clinical significance.] +* Six-Hz-spike-slow-wave {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Spike and slow wave complexes at 4-7Hz, but mostly at 6 Hz occurring generally in brief bursts bilaterally and synchronously, symmetrically or asymmetrically, and either confined to or of larger amplitude over the posterior or anterior regions of the head. The spike has a strong positive component. Amplitude varies but is generally smaller than that of spike-and slow-wave complexes repeating at slower rates. Comment: this pattern should be distinguished from epileptiform discharges. Synonym: wave and spike phantom.] +* Rudimentary-spike-wave-complex {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Synonym: Pseudo petit mal discharge. Paroxysmal discharge that consists of generalized or nearly generalized high voltage 3 to 4/sec waves with poorly developed spike in the positive trough between the slow waves, occurring in drowsiness only. It is found only in infancy and early childhood when marked hypnagogic rhythmical theta activity is paramount in the drowsy state.] +* Slow-fused-transient {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [A posterior slow-wave preceded by a sharp-contoured potential that blends together with the ensuing slow wave, in children.] +* Needle-like-occipital-spikes-blind {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Spike discharges of a particularly fast and needle-like character develop over the occipital region in most congenitally blind children. Completely disappear during childhood or adolescence.] +* Subclinical-rhythmic-EEG-discharge-adults {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Subclinical rhythmic EEG discharge of adults (SERDA). A rhythmic pattern seen in the adult age group, mainly in the waking state or drowsiness. It consists of a mixture of frequencies, often predominant in the theta range. The onset may be fairly abrupt with widespread sharp rhythmical theta and occasionally with delta activity. As to the spatial distribution, a maximum of this discharge is usually found over the centroparietal region and especially over the vertex. It may resemble a seizure discharge but is not accompanied by any clinical signs or symptoms.] +* Rhythmic-temporal-theta-burst-drowsiness {inLibrary=score} [Rhythmic temporal theta burst of drowsiness (RTTD). Characteristic burst of 4-7 Hz waves frequently notched by faster waves, occurring over the temporal regions of the head during drowsiness. Synonym: psychomotor variant pattern. Comment: this is a pattern of drowsiness that is of no clinical significance.] +* Temporal-slowing-elderly {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Focal theta and/or delta activity over the temporal regions, especially the left, in persons over the age of 60. Amplitudes are low/similar to the background activity. Comment: focal temporal theta was found in 20 percent of people between the ages of 40-59 years, and 40 percent of people between 60 and 79 years. One third of people older than 60 years had focal temporal delta activity.] +* Breach-rhythm {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, inLibrary=score} [Rhythmical activity recorded over cranial bone defects. Usually it is in the 6 to 11/sec range, does not respond to movements.] +* Other-uncertain-significant-pattern {requireChild, inLibrary=score} +** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] + +'''Artifact''' {requireChild, inLibrary=score} [When relevant for the clinical interpretation, artifacts can be scored by specifying the type and the location.] +* Biological-artifact {requireChild, inLibrary=score} +** Eye-blink-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Example for EEG: Fp1/Fp2 become electropositive with eye closure because the cornea is positively charged causing a negative deflection in Fp1/Fp2. If the eye blink is unilateral, consider prosthetic eye. If it is in F8 rather than Fp2 then the electrodes are plugged in wrong.] +** Eye-movement-horizontal-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Example for EEG: There is an upward deflection in the Fp2-F8 derivation, when the eyes move to the right side. In this case F8 becomes more positive and therefore. When the eyes move to the left, F7 becomes more positive and there is an upward deflection in the Fp1-F7 derivation.] +** Eye-movement-vertical-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Example for EEG: The EEG shows positive potentials (50-100 micro V) with bi-frontal distribution, maximum at Fp1 and Fp2, when the eyeball rotated upward. The downward rotation of the eyeball was associated with the negative deflection. The time course of the deflections was similar to the time course of the eyeball movement.] +** Slow-eye-movement-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Slow, rolling eye-movements, seen during drowsiness.] +** Nystagmus-artifact {suggestedTag=Artifact-significance-to-recording, inLibrary=score} +** Chewing-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} +** Sucking-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} +** Glossokinetic-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [The tongue functions as a dipole, with the tip negative with respect to the base. The artifact produced by the tongue has a broad potential field that drops from frontal to occipital areas, although it is less steep than that produced by eye movement artifacts. The amplitude of the potentials is greater inferiorly than in parasagittal regions; the frequency is variable but usually in the delta range. Chewing and sucking can produce similar artifacts.] +** Rocking-patting-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Quasi-rhythmical artifacts in recordings from infants caused by rocking/patting.] +** Movement-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Example for EEG: Large amplitude artifact, with irregular morphology (usually resembling a slow-wave or a wave with complex morphology) seen in one or several channels, due to movement. If the causing movement is repetitive, the artifact might resemble a rhythmic EEG activity.] +** Respiration-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Respiration can produce 2 kinds of artifacts. One type is in the form of slow and rhythmic activity, synchronous with the body movements of respiration and mechanically affecting the impedance of (usually) one electrode. The other type can be slow or sharp waves that occur synchronously with inhalation or exhalation and involve those electrodes on which the patient is lying.] +** Pulse-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Example for EEG: Occurs when an EEG electrode is placed over a pulsating vessel. The pulsation can cause slow waves that may simulate EEG activity. A direct relationship exists between ECG and the pulse waves (200-300 millisecond delay after ECG equals QRS complex).] +** ECG-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Example for EEG: Far-field potential generated in the heart. The voltage and apparent surface of the artifact vary from derivation to derivation and, consequently, from montage to montage. The artifact is observed best in referential montages using earlobe electrodes A1 and A2. ECG artifact is recognized easily by its rhythmicity/regularity and coincidence with the ECG tracing.] +** Sweat-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Is a low amplitude undulating waveform that is usually greater than 2 seconds and may appear to be an unstable baseline.] +** EMG-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Myogenic potentials are the most common artifacts. Frontalis and temporalis muscles (ex..: clenching of jaw muscles) are common causes. Generally, the potentials generated in the muscles are of shorter duration than those generated in the brain. The frequency components are usually beyond 30-50 Hz, and the bursts are arrhythmic.] +* Non-biological-artifact {requireChild, inLibrary=score} +** Power-supply-artifact {suggestedTag=Artifact-significance-to-recording, inLibrary=score} [50-60 Hz artifact. Monomorphic waveform due to 50 or 60 Hz A/C power supply.] +** Induction-artifact {suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Artifacts (usually of high frequency) induced by nearby equipment (like in the intensive care unit).] +** Dialysis-artifact {suggestedTag=Artifact-significance-to-recording, inLibrary=score} +** Artificial-ventilation-artifact {suggestedTag=Artifact-significance-to-recording, inLibrary=score} +** Electrode-pops-artifact {suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Are brief discharges with a very steep upslope and shallow fall that occur in all leads which include that electrode.] +** Salt-bridge-artifact {suggestedTag=Artifact-significance-to-recording, inLibrary=score} [Typically occurs in 1 channel which may appear isoelectric. Only seen in bipolar montage.] +* Other-artifact {requireChild, suggestedTag=Artifact-significance-to-recording, inLibrary=score} +** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] + +'''Polygraphic-channel-finding''' {requireChild, inLibrary=score} [Changes observed in polygraphic channels can be scored: EOG, Respiration, ECG, EMG, other polygraphic channel (+ free text), and their significance logged (normal, abnormal, no definite abnormality).] +* EOG-channel-finding {suggestedTag=Finding-significance-to-recording, inLibrary=score} [ElectroOculoGraphy.] +** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +* Respiration-channel-finding {suggestedTag=Finding-significance-to-recording, inLibrary=score} +** Respiration-oxygen-saturation {inLibrary=score} +*** # {takesValue, valueClass=numericClass, inLibrary=score} +** Respiration-feature {inLibrary=score} +*** Apnoe-respiration {inLibrary=score} [Add duration (range in seconds) and comments in free text.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Hypopnea-respiration {inLibrary=score} [Add duration (range in seconds) and comments in free text] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Apnea-hypopnea-index-respiration {requireChild, inLibrary=score} [Events/h. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Periodic-respiration {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Tachypnea-respiration {requireChild, inLibrary=score} [Cycles/min. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Other-respiration-feature {requireChild, inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +* ECG-channel-finding {suggestedTag=Finding-significance-to-recording, inLibrary=score} [Electrocardiography.] +** ECG-QT-period {inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** ECG-feature {inLibrary=score} +*** ECG-sinus-rhythm {inLibrary=score} [Normal rhythm. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** ECG-arrhythmia {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** ECG-asystolia {inLibrary=score} [Add duration (range in seconds) and comments in free text.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** ECG-bradycardia {inLibrary=score} [Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** ECG-extrasystole {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** ECG-ventricular-premature-depolarization {inLibrary=score} [Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** ECG-tachycardia {inLibrary=score} [Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Other-ECG-feature {requireChild, inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +* EMG-channel-finding {suggestedTag=Finding-significance-to-recording, inLibrary=score} [electromyography] +** EMG-muscle-side {inLibrary=score} +*** EMG-left-muscle {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** EMG-right-muscle {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** EMG-bilateral-muscle {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** EMG-muscle-name {inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** EMG-feature {inLibrary=score} +*** EMG-myoclonus {inLibrary=score} +**** Negative-myoclonus {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** EMG-myoclonus-rhythmic {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** EMG-myoclonus-arrhythmic {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** EMG-myoclonus-synchronous {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** EMG-myoclonus-asynchronous {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** EMG-PLMS {inLibrary=score} [Periodic limb movements in sleep.] +*** EMG-spasm {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** EMG-tonic-contraction {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** EMG-asymmetric-activation {requireChild, inLibrary=score} +**** EMG-asymmetric-activation-left-first {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** EMG-asymmetric-activation-right-first {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Other-EMG-features {requireChild, inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +* Other-polygraphic-channel {requireChild, inLibrary=score} +** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] + +'''Finding-property''' {requireChild, inLibrary=score} [Descriptive element similar to main HED /Property. Something that pertains to a thing. A characteristic of some entity. A quality or feature regarded as a characteristic or inherent part of someone or something. HED attributes are adjectives or adverbs.] +* Signal-morphology-property {requireChild, inLibrary=score} +** Rhythmic-activity-morphology {inLibrary=score} [EEG activity consisting of a sequence of waves approximately constant period.] +*** Delta-activity-morphology {suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude, inLibrary=score} [EEG rhythm in the delta (under 4 Hz) range that does not belong to the posterior dominant rhythm (scored under other organized rhythms).] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Theta-activity-morphology {suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude, inLibrary=score} [EEG rhythm in the theta (4-8 Hz) range that does not belong to the posterior dominant rhythm (scored under other organized rhythm).] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Alpha-activity-morphology {suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude, inLibrary=score} [EEG rhythm in the alpha range (8-13 Hz) which is considered part of the background (ongoing) activity but does not fulfill the criteria of the posterior dominant rhythm (alpha rhythm).] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Beta-activity-morphology {suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude, inLibrary=score} [EEG rhythm between 14 and 40 Hz, which is considered part of the background (ongoing) activity but does not fulfill the criteria of the posterior dominant rhythm. Most characteristically: a rhythm from 14 to 40 Hz recorded over the fronto-central regions of the head during wakefulness. Amplitude of the beta rhythm varies but is mostly below 30 microV. Other beta rhythms are most prominent in other locations or are diffuse.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Gamma-activity-morphology {suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude, inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Spike-morphology {inLibrary=score} [A transient, clearly distinguished from background activity, with pointed peak at a conventional paper speed or time scale and duration from 20 to under 70 ms, i.e. 1/50-1/15 s approximately. Main component is generally negative relative to other areas. Amplitude varies.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Spike-and-slow-wave-morphology {inLibrary=score} [A pattern consisting of a spike followed by a slow wave.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Runs-of-rapid-spikes-morphology {inLibrary=score} [Bursts of spike discharges at a rate from 10 to 25/sec (in most cases somewhat irregular). The bursts last more than 2 seconds (usually 2 to 10 seconds) and it is typically seen in sleep. Synonyms: rhythmic spikes, generalized paroxysmal fast activity, fast paroxysmal rhythms, grand mal discharge, fast beta activity.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Polyspikes-morphology {inLibrary=score} [Two or more consecutive spikes.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Polyspike-and-slow-wave-morphology {inLibrary=score} [Two or more consecutive spikes associated with one or more slow waves.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Sharp-wave-morphology {inLibrary=score} [A transient clearly distinguished from background activity, with pointed peak at a conventional paper speed or time scale, and duration of 70-200 ms, i.e. over 1/4-1/5 s approximately. Main component is generally negative relative to other areas. Amplitude varies.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Sharp-and-slow-wave-morphology {inLibrary=score} [A sequence of a sharp wave and a slow wave.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Slow-sharp-wave-morphology {inLibrary=score} [A transient that bears all the characteristics of a sharp-wave, but exceeds 200 ms. Synonym: blunted sharp wave.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** High-frequency-oscillation-morphology {inLibrary=score} [HFO.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Hypsarrhythmia-classic-morphology {inLibrary=score} [Abnormal interictal high amplitude waves and a background of irregular spikes.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Hypsarrhythmia-modified-morphology {inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Fast-spike-activity-morphology {inLibrary=score} [A burst consisting of a sequence of spikes. Duration greater than 1 s. Frequency at least in the alpha range.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Low-voltage-fast-activity-morphology {inLibrary=score} [Refers to the fast, and often recruiting activity which can be recorded at the onset of an ictal discharge, particularly in invasive EEG recording of a seizure.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Polysharp-waves-morphology {inLibrary=score} [A sequence of two or more sharp-waves.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Slow-wave-large-amplitude-morphology {inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Irregular-delta-or-theta-activity-morphology {inLibrary=score} [EEG activity consisting of repetitive waves of inconsistent wave-duration but in delta and/or theta rang (greater than 125 ms).] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Electrodecremental-change-morphology {inLibrary=score} [Sudden desynchronization of electrical activity.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** DC-shift-morphology {inLibrary=score} [Shift of negative polarity of the direct current recordings, during seizures.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Disappearance-of-ongoing-activity-morphology {inLibrary=score} [Disappearance of the EEG activity that preceded the ictal event but still remnants of background activity (thus not enough to name it electrodecremental change).] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Polymorphic-delta-activity-morphology {inLibrary=score} [EEG activity consisting of waves in the delta range (over 250 ms duration for each wave) but of different morphology.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Frontal-intermittent-rhythmic-delta-activity-morphology {inLibrary=score} [Frontal intermittent rhythmic delta activity (FIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at 1.5-2.5 Hz over the frontal areas of one or both sides of the head. Comment: most commonly associated with unspecified encephalopathy, in adults.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Occipital-intermittent-rhythmic-delta-activity-morphology {inLibrary=score} [Occipital intermittent rhythmic delta activity (OIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at 2-3 Hz over the occipital or posterior head regions of one or both sides of the head. Frequently blocked or attenuated by opening the eyes. Comment: most commonly associated with unspecified encephalopathy, in children.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Temporal-intermittent-rhythmic-delta-activity-morphology {inLibrary=score} [Temporal intermittent rhythmic delta activity (TIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at over the temporal areas of one side of the head. Comment: most commonly associated with temporal lobe epilepsy.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Periodic-discharge-morphology {requireChild, inLibrary=score} [Periodic discharges not further specified (PDs).] +*** Periodic-discharge-superimposed-activity {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} +**** Periodic-discharge-fast-superimposed-activity {suggestedTag=Finding-frequency, inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Periodic-discharge-rhythmic-superimposed-activity {suggestedTag=Finding-frequency, inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Periodic-discharge-sharpness {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} +**** Spiky-periodic-discharge-sharpness {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Sharp-periodic-discharge-sharpness {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Sharply-contoured-periodic-discharge-sharpness {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Blunt-periodic-discharge-sharpness {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Number-of-periodic-discharge-phases {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} +**** 1-periodic-discharge-phase {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** 2-periodic-discharge-phases {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** 3-periodic-discharge-phases {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Greater-than-3-periodic-discharge-phases {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Periodic-discharge-triphasic-morphology {suggestedTag=Property-not-possible-to-determine, suggestedTag=Property-exists, suggestedTag=Property-absence, inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Periodic-discharge-absolute-amplitude {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} +**** Periodic-discharge-absolute-amplitude-very-low {inLibrary=score} [Lower than 20 microV.] +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Low-periodic-discharge-absolute-amplitude {inLibrary=score} [20 to 49 microV.] +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Medium-periodic-discharge-absolute-amplitude {inLibrary=score} [50 to 199 microV.] +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** High-periodic-discharge-absolute-amplitude {inLibrary=score} [Greater than 200 microV.] +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Periodic-discharge-relative-amplitude {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} +**** Periodic-discharge-relative-amplitude-less-than-equal-2 {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Periodic-discharge-relative-amplitude-greater-than-2 {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Periodic-discharge-polarity {requireChild, inLibrary=score} +**** Periodic-discharge-postitive-polarity {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Periodic-discharge-negative-polarity {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Periodic-discharge-unclear-polarity {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +* Source-analysis-property {requireChild, inLibrary=score} [How the current in the brain reaches the electrode sensors.] +** Source-analysis-laterality {requireChild, suggestedTag=Brain-laterality, inLibrary=score} +** Source-analysis-brain-region {requireChild, inLibrary=score} +*** Source-analysis-frontal-perisylvian-superior-surface {inLibrary=score} +*** Source-analysis-frontal-lateral {inLibrary=score} +*** Source-analysis-frontal-mesial {inLibrary=score} +*** Source-analysis-frontal-polar {inLibrary=score} +*** Source-analysis-frontal-orbitofrontal {inLibrary=score} +*** Source-analysis-temporal-polar {inLibrary=score} +*** Source-analysis-temporal-basal {inLibrary=score} +*** Source-analysis-temporal-lateral-anterior {inLibrary=score} +*** Source-analysis-temporal-lateral-posterior {inLibrary=score} +*** Source-analysis-temporal-perisylvian-inferior-surface {inLibrary=score} +*** Source-analysis-central-lateral-convexity {inLibrary=score} +*** Source-analysis-central-mesial {inLibrary=score} +*** Source-analysis-central-sulcus-anterior-surface {inLibrary=score} +*** Source-analysis-central-sulcus-posterior-surface {inLibrary=score} +*** Source-analysis-central-opercular {inLibrary=score} +*** Source-analysis-parietal-lateral-convexity {inLibrary=score} +*** Source-analysis-parietal-mesial {inLibrary=score} +*** Source-analysis-parietal-opercular {inLibrary=score} +*** Source-analysis-occipital-lateral {inLibrary=score} +*** Source-analysis-occipital-mesial {inLibrary=score} +*** Source-analysis-occipital-basal {inLibrary=score} +*** Source-analysis-insula {inLibrary=score} +* Location-property {requireChild, inLibrary=score} [Location can be scored for findings. Semiologic finding can also be characterized by the somatotopic modifier (i.e. the part of the body where it occurs). In this respect, laterality (left, right, symmetric, asymmetric, left greater than right, right greater than left), body part (eyelid, face, arm, leg, trunk, visceral, hemi-) and centricity (axial, proximal limb, distal limb) can be scored.] +** Brain-laterality {requireChild, inLibrary=score} +*** Brain-laterality-left {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Brain-laterality-left-greater-right {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Brain-laterality-right {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Brain-laterality-right-greater-left {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Brain-laterality-midline {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Brain-laterality-diffuse-asynchronous {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Brain-region {requireChild, inLibrary=score} +*** Brain-region-frontal {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Brain-region-temporal {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Brain-region-central {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Brain-region-parietal {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Brain-region-occipital {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Body-part-location {requireChild, inLibrary=score} +*** Eyelid-location {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Face-location {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Arm-location {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Leg-location {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Trunk-location {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Visceral-location {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Hemi-location {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Brain-centricity {requireChild, inLibrary=score} +*** Brain-centricity-axial {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Brain-centricity-proximal-limb {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Brain-centricity-distal-limb {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Sensors {requireChild, inLibrary=score} [Lists all corresponding sensors (electrodes/channels in montage). The sensor-group is selected from a list defined in the site-settings for each EEG-lab.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Finding-propagation {suggestedTag=Property-exists, suggestedTag=Property-absence, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, inLibrary=score} [When propagation within the graphoelement is observed, first the location of the onset region is scored. Then, the location of the propagation can be noted.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Multifocal-finding {suggestedTag=Property-not-possible-to-determine, suggestedTag=Property-exists, suggestedTag=Property-absence, inLibrary=score} [When the same interictal graphoelement is observed bilaterally and at least in three independent locations, can score them using one entry, and choosing multifocal as a descriptor of the locations of the given interictal graphoelements, optionally emphasizing the involved, and the most active sites.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +* Modulators-property {requireChild, inLibrary=score} [For each described graphoelement, the influence of the modulators can be scored. Only modulators present in the recording are scored.] +** Modulators-reactivity {requireChild, suggestedTag=Property-exists, suggestedTag=Property-absence, inLibrary=score} [Susceptibility of individual rhythms or the EEG as a whole to change following sensory stimulation or other physiologic actions.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Eye-closure-sensitivity {suggestedTag=Property-exists, suggestedTag=Property-absence, inLibrary=score} [Eye closure sensitivity.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Eye-opening-passive {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, suggestedTag=Finding-triggered-by, inLibrary=score} [Passive eye opening. Used with base schema Increasing/Decreasing.] +** Medication-effect-EEG {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, inLibrary=score} [Medications effect on EEG. Used with base schema Increasing/Decreasing.] +** Medication-reduction-effect-EEG {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, inLibrary=score} [Medications reduction or withdrawal effect on EEG. Used with base schema Increasing/Decreasing.] +** Auditive-stimuli-effect {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, inLibrary=score} [Used with base schema Increasing/Decreasing.] +** Nociceptive-stimuli-effect {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, suggestedTag=Finding-triggered-by, inLibrary=score} [Used with base schema Increasing/Decreasing.] +** Physical-effort-effect {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, suggestedTag=Finding-triggered-by, inLibrary=score} [Used with base schema Increasing/Decreasing] +** Cognitive-task-effect {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, suggestedTag=Finding-triggered-by, inLibrary=score} [Used with base schema Increasing/Decreasing.] +** Other-modulators-effect-EEG {requireChild, inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Facilitating-factor {inLibrary=score} [Facilitating factors are defined as transient and sporadic endogenous or exogenous elements capable of augmenting seizure incidence (increasing the likelihood of seizure occurrence).] +*** Facilitating-factor-alcohol {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Facilitating-factor-awake {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Facilitating-factor-catamenial {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Facilitating-factor-fever {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Facilitating-factor-sleep {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Facilitating-factor-sleep-deprived {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Facilitating-factor-other {requireChild, inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Provocative-factor {requireChild, inLibrary=score} [Provocative factors are defined as transient and sporadic endogenous or exogenous elements capable of evoking/triggering seizures immediately following the exposure to it.] +*** Hyperventilation-provoked {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Reflex-provoked {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Medication-effect-clinical {suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, inLibrary=score} [Medications clinical effect. Used with base schema Increasing/Decreasing.] +** Medication-reduction-effect-clinical {suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, inLibrary=score} [Medications reduction or withdrawal clinical effect. Used with base schema Increasing/Decreasing.] +** Other-modulators-effect-clinical {requireChild, inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Intermittent-photic-stimulation-effect {requireChild, inLibrary=score} +*** Posterior-stimulus-dependent-intermittent-photic-stimulation-response {suggestedTag=Finding-frequency, inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Posterior-stimulus-independent-intermittent-photic-stimulation-response-limited {suggestedTag=Finding-frequency, inLibrary=score} [limited to the stimulus-train] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Posterior-stimulus-independent-intermittent-photic-stimulation-response-self-sustained {suggestedTag=Finding-frequency, inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Generalized-photoparoxysmal-intermittent-photic-stimulation-response-limited {suggestedTag=Finding-frequency, inLibrary=score} [Limited to the stimulus-train.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Generalized-photoparoxysmal-intermittent-photic-stimulation-response-self-sustained {suggestedTag=Finding-frequency, inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Activation-of-pre-existing-epileptogenic-area-intermittent-photic-stimulation-effect {suggestedTag=Finding-frequency, inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Unmodified-intermittent-photic-stimulation-effect {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Quality-of-hyperventilation {requireChild, inLibrary=score} +*** Hyperventilation-refused-procedure {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Hyperventilation-poor-effort {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Hyperventilation-good-effort {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Hyperventilation-excellent-effort {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Modulators-effect {requireChild, inLibrary=score} [Tags for describing the influence of the modulators] +*** Modulators-effect-continuous-during-NRS {inLibrary=score} [Continuous during non-rapid-eye-movement-sleep (NRS)] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Modulators-effect-only-during {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Only during Sleep/Awakening/Hyperventilation/Physical effort/Cognitive task. Free text.] +*** Modulators-effect-change-of-patterns {inLibrary=score} [Change of patterns during sleep/awakening.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +* Time-related-property {requireChild, inLibrary=score} [Important to estimate how often an interictal abnormality is seen in the recording.] +** Appearance-mode {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} [Describes how the non-ictal EEG pattern/graphoelement is distributed through the recording.] +*** Random-appearance-mode {inLibrary=score} [Occurrence of the non-ictal EEG pattern / graphoelement without any rhythmicity / periodicity.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Periodic-appearance-mode {inLibrary=score} [Non-ictal EEG pattern / graphoelement occurring at an approximately regular rate / interval (generally of 1 to several seconds).] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Variable-appearance-mode {inLibrary=score} [Occurrence of non-ictal EEG pattern / graphoelements, that is sometimes rhythmic or periodic, other times random, throughout the recording.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Intermittent-appearance-mode {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Continuous-appearance-mode {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Discharge-pattern {requireChild, inLibrary=score} [Describes the organization of the EEG signal within the discharge (distinguish between single and repetitive discharges)] +*** Single-discharge-pattern {suggestedTag=Finding-incidence, inLibrary=score} [Applies to the intra-burst pattern: a graphoelement that is not repetitive; before and after the graphoelement one can distinguish the background activity.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Rhythmic-trains-or-bursts-discharge-pattern {suggestedTag=Finding-prevalence, suggestedTag=Finding-frequency, inLibrary=score} [Applies to the intra-burst pattern: a non-ictal graphoelement that repeats itself without returning to the background activity between them. The graphoelements within this repetition occur at approximately constant period.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Arrhythmic-trains-or-bursts-discharge-pattern {suggestedTag=Finding-prevalence, inLibrary=score} [Applies to the intra-burst pattern: a non-ictal graphoelement that repeats itself without returning to the background activity between them. The graphoelements within this repetition occur at inconstant period.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Fragmented-discharge-pattern {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Periodic-discharge-time-related-features {requireChild, inLibrary=score} [Periodic discharges not further specified (PDs) time-relayed features tags.] +*** Periodic-discharge-duration {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} +**** Very-brief-periodic-discharge-duration {inLibrary=score} [Less than 10 sec.] +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Brief-periodic-discharge-duration {inLibrary=score} [10 to 59 sec.] +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Intermediate-periodic-discharge-duration {inLibrary=score} [1 to 4.9 min.] +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Long-periodic-discharge-duration {inLibrary=score} [5 to 59 min.] +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Very-long-periodic-discharge-duration {inLibrary=score} [Greater than 1 hour.] +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Periodic-discharge-onset {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} +**** Sudden-periodic-discharge-onset {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Gradual-periodic-discharge-onset {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Periodic-discharge-dynamics {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} +**** Evolving-periodic-discharge-dynamics {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Fluctuating-periodic-discharge-dynamics {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Static-periodic-discharge-dynamics {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Finding-extent {inLibrary=score} [Percentage of occurrence during the recording (background activity and interictal finding).] +*** # {takesValue, valueClass=numericClass, inLibrary=score} +** Finding-incidence {requireChild, inLibrary=score} [How often it occurs/time-epoch.] +*** Only-once-finding-incidence {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Rare-finding-incidence {inLibrary=score} [less than 1/h] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Uncommon-finding-incidence {inLibrary=score} [1/5 min to 1/h.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Occasional-finding-incidence {inLibrary=score} [1/min to 1/5min.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Frequent-finding-incidence {inLibrary=score} [1/10 s to 1/min.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Abundant-finding-incidence {inLibrary=score} [Greater than 1/10 s).] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Finding-prevalence {requireChild, inLibrary=score} [The percentage of the recording covered by the train/burst.] +*** Rare-finding-prevalence {inLibrary=score} [Less than 1 percent.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Occasional-finding-prevalence {inLibrary=score} [1 to 9 percent.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Frequent-finding-prevalence {inLibrary=score} [10 to 49 percent.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Abundant-finding-prevalence {inLibrary=score} [50 to 89 percent.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Continuous-finding-prevalence {inLibrary=score} [Greater than 90 percent.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +* Posterior-dominant-rhythm-property {requireChild, inLibrary=score} [Posterior dominant rhythm is the most often scored EEG feature in clinical practice. Therefore, there are specific terms that can be chosen for characterizing the PDR.] +** Posterior-dominant-rhythm-amplitude-range {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} +*** Low-posterior-dominant-rhythm-amplitude-range {inLibrary=score} [Low (less than 20 microV).] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Medium-posterior-dominant-rhythm-amplitude-range {inLibrary=score} [Medium (between 20 and 70 microV).] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** High-posterior-dominant-rhythm-amplitude-range {inLibrary=score} [High (more than 70 microV).] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Posterior-dominant-rhythm-frequency-asymmetry {requireChild, inLibrary=score} [When symmetrical could be labeled with base schema Symmetrical tag.] +*** Posterior-dominant-rhythm-frequency-asymmetry-lower-left {inLibrary=score} [Hz lower on the left side.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Posterior-dominant-rhythm-frequency-asymmetry-lower-right {inLibrary=score} [Hz lower on the right side.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Posterior-dominant-rhythm-eye-opening-reactivity {suggestedTag=Property-not-possible-to-determine, inLibrary=score} [Change (disappearance or measurable decrease in amplitude) of a posterior dominant rhythm following eye-opening. Eye closure has the opposite effect.] +*** Posterior-dominant-rhythm-eye-opening-reactivity-reduced-left {inLibrary=score} [Reduced left side reactivity.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Posterior-dominant-rhythm-eye-opening-reactivity-reduced-right {inLibrary=score} [Reduced right side reactivity.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [free text] +*** Posterior-dominant-rhythm-eye-opening-reactivity-reduced-both {inLibrary=score} [Reduced reactivity on both sides.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Posterior-dominant-rhythm-organization {requireChild, inLibrary=score} [When normal could be labeled with base schema Normal tag.] +*** Posterior-dominant-rhythm-organization-poorly-organized {inLibrary=score} [Poorly organized.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Posterior-dominant-rhythm-organization-disorganized {inLibrary=score} [Disorganized.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Posterior-dominant-rhythm-organization-markedly-disorganized {inLibrary=score} [Markedly disorganized.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Posterior-dominant-rhythm-caveat {requireChild, inLibrary=score} [Caveat to the annotation of PDR.] +*** No-posterior-dominant-rhythm-caveat {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Posterior-dominant-rhythm-caveat-only-open-eyes-during-the-recording {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Posterior-dominant-rhythm-caveat-sleep-deprived-caveat {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Posterior-dominant-rhythm-caveat-drowsy {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Posterior-dominant-rhythm-caveat-only-following-hyperventilation {inLibrary=score} +** Absence-of-posterior-dominant-rhythm {requireChild, inLibrary=score} [Reason for absence of PDR.] +*** Absence-of-posterior-dominant-rhythm-artifacts {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Absence-of-posterior-dominant-rhythm-extreme-low-voltage {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Absence-of-posterior-dominant-rhythm-eye-closure-could-not-be-achieved {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Absence-of-posterior-dominant-rhythm-lack-of-awake-period {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Absence-of-posterior-dominant-rhythm-lack-of-compliance {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Absence-of-posterior-dominant-rhythm-other-causes {requireChild, inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +* Episode-property {requireChild, inLibrary=score} +** Seizure-classification {requireChild, inLibrary=score} [Seizure classification refers to the grouping of seizures based on their clinical features, EEG patterns, and other characteristics. Epileptic seizures are named using the current ILAE seizure classification (Fisher et al., 2017, Beniczky et al., 2017).] +*** Motor-seizure {inLibrary=score} [Involves musculature in any form. The motor event could consist of an increase (positive) or decrease (negative) in muscle contraction to produce a movement. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +*** Motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} +**** Myoclonic-motor-seizure {inLibrary=score} [Sudden, brief ( lower than 100 msec) involuntary single or multiple contraction(s) of muscles(s) or muscle groups of variable topography (axial, proximal limb, distal). Myoclonus is less regularly repetitive and less sustained than is clonus. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Myoclonic-motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} +**** Negative-myoclonic-motor-seizure {inLibrary=score} +**** Negative-myoclonic-motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} +**** Clonic-motor-seizure {inLibrary=score} [Jerking, either symmetric or asymmetric, that is regularly repetitive and involves the same muscle groups. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Clonic-motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} +**** Tonic-motor-seizure {inLibrary=score} [A sustained increase in muscle contraction lasting a few seconds to minutes. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Tonic-motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} +**** Atonic-motor-seizure {inLibrary=score} [Sudden loss or diminution of muscle tone without apparent preceding myoclonic or tonic event lasting about 1 to 2 s, involving head, trunk, jaw, or limb musculature. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Atonic-motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} +**** Myoclonic-atonic-motor-seizure {inLibrary=score} [A generalized seizure type with a myoclonic jerk leading to an atonic motor component. This type was previously called myoclonic astatic. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Myoclonic-atonic-motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} +**** Myoclonic-tonic-clonic-motor-seizure {inLibrary=score} [One or a few jerks of limbs bilaterally, followed by a tonic clonic seizure. The initial jerks can be considered to be either a brief period of clonus or myoclonus. Seizures with this characteristic are common in juvenile myoclonic epilepsy. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Myoclonic-tonic-clonic-motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} +**** Tonic-clonic-motor-seizure {inLibrary=score} [A sequence consisting of a tonic followed by a clonic phase. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Tonic-clonic-motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} +**** Automatism-motor-seizure {inLibrary=score} [A more or less coordinated motor activity usually occurring when cognition is impaired and for which the subject is usually (but not always) amnesic afterward. This often resembles a voluntary movement and may consist of an inappropriate continuation of preictal motor activity. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Automatism-motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} +**** Hyperkinetic-motor-seizure {inLibrary=score} +**** Hyperkinetic-motor-onset-seizure {deprecatedFrom=1.0.0, inLibrary=score} +**** Epileptic-spasm-episode {inLibrary=score} [A sudden flexion, extension, or mixed extension flexion of predominantly proximal and truncal muscles that is usually more sustained than a myoclonic movement but not as sustained as a tonic seizure. Limited forms may occur: Grimacing, head nodding, or subtle eye movements. Epileptic spasms frequently occur in clusters. Infantile spasms are the best known form, but spasms can occur at all ages. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +*** Nonmotor-seizure {inLibrary=score} [Focal or generalized seizure types in which motor activity is not prominent. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Behavior-arrest-nonmotor-seizure {inLibrary=score} [Arrest (pause) of activities, freezing, immobilization, as in behavior arrest seizure. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Sensory-nonmotor-seizure {inLibrary=score} [A perceptual experience not caused by appropriate stimuli in the external world. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Emotional-nonmotor-seizure {inLibrary=score} [Seizures presenting with an emotion or the appearance of having an emotion as an early prominent feature, such as fear, spontaneous joy or euphoria, laughing (gelastic), or crying (dacrystic). Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Cognitive-nonmotor-seizure {inLibrary=score} [Pertaining to thinking and higher cortical functions, such as language, spatial perception, memory, and praxis. The previous term for similar usage as a seizure type was psychic. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Autonomic-nonmotor-seizure {inLibrary=score} [A distinct alteration of autonomic nervous system function involving cardiovascular, pupillary, gastrointestinal, sudomotor, vasomotor, and thermoregulatory functions. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +*** Absence-seizure {inLibrary=score} [Absence seizures present with a sudden cessation of activity and awareness. Absence seizures tend to occur in younger age groups, have more sudden start and termination, and they usually display less complex automatisms than do focal seizures with impaired awareness, but the distinctions are not absolute. EEG information may be required for accurate classification. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Typical-absence-seizure {inLibrary=score} [A sudden onset, interruption of ongoing activities, a blank stare, possibly a brief upward deviation of the eyes. Usually the patient will be unresponsive when spoken to. Duration is a few seconds to half a minute with very rapid recovery. Although not always available, an EEG would show generalized epileptiform discharges during the event. An absence seizure is by definition a seizure of generalized onset. The word is not synonymous with a blank stare, which also can be encountered with focal onset seizures. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Atypical-absence-seizure {inLibrary=score} [An absence seizure with changes in tone that are more pronounced than in typical absence or the onset and/or cessation is not abrupt, often associated with slow, irregular, generalized spike-wave activity. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Myoclonic-absence-seizure {inLibrary=score} [A myoclonic absence seizure refers to an absence seizure with rhythmic three-per-second myoclonic movements, causing ratcheting abduction of the upper limbs leading to progressive arm elevation, and associated with three-per-second generalized spike-wave discharges. Duration is typically 10 to 60 s. Impairment of consciousness may not be obvious. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Eyelid-myoclonia-absence-seizure {inLibrary=score} [Eyelid myoclonia are myoclonic jerks of the eyelids and upward deviation of the eyes, often precipitated by closing the eyes or by light. Eyelid myoclonia can be associated with absences, but also can be motor seizures without a corresponding absence, making them difficult to categorize. The 2017 classification groups them with nonmotor (absence) seizures, which may seem counterintuitive, but the myoclonia in this instance is meant to link with absence, rather than with nonmotor. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +** Episode-phase {requireChild, suggestedTag=Seizure-semiology-manifestation, suggestedTag=Postictal-semiology-manifestation, suggestedTag=Ictal-EEG-patterns, inLibrary=score} [The electroclinical findings (i.e., the seizure semiology and the ictal EEG) are divided in three phases: onset, propagation, and postictal.] +*** Episode-phase-initial {inLibrary=score} +*** Episode-phase-subsequent {inLibrary=score} +*** Episode-phase-postictal {inLibrary=score} +** Seizure-semiology-manifestation {requireChild, inLibrary=score} [Seizure semiology refers to the clinical features or signs that are observed during a seizure, such as the type of movements or behaviors exhibited by the person having the seizure, the duration of the seizure, the level of consciousness, and any associated symptoms such as aura or postictal confusion. In other words, seizure semiology describes the physical manifestations of a seizure. Semiology is described according to the ILAE Glossary of Descriptive Terminology for Ictal Semiology (Blume et al., 2001). Besides the name, the semiologic finding can also be characterized by the somatotopic modifier, laterality, body part and centricity. Uses Location-property tags.] +*** Semiology-motor-manifestation {inLibrary=score} +**** Semiology-elementary-motor {inLibrary=score} +***** Semiology-motor-tonic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [A sustained increase in muscle contraction lasting a few seconds to minutes.] +***** Semiology-motor-dystonic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Sustained contractions of both agonist and antagonist muscles producing athetoid or twisting movements, which, when prolonged, may produce abnormal postures.] +***** Semiology-motor-epileptic-spasm {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [A sudden flexion, extension, or mixed extension flexion of predominantly proximal and truncal muscles that is usually more sustained than a myoclonic movement but not so sustained as a tonic seizure (i.e., about 1 s). Limited forms may occur: grimacing, head nodding. Frequent occurrence in clusters.] +***** Semiology-motor-postural {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Adoption of a posture that may be bilaterally symmetric or asymmetric (as in a fencing posture).] +***** Semiology-motor-versive {suggestedTag=Body-part-location, suggestedTag=Episode-event-count, inLibrary=score} [A sustained, forced conjugate ocular, cephalic, and/or truncal rotation or lateral deviation from the midline.] +***** Semiology-motor-clonic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Myoclonus that is regularly repetitive, involves the same muscle groups, at a frequency of about 2 to 3 c/s, and is prolonged. Synonym: rhythmic myoclonus .] +***** Semiology-motor-myoclonic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Characterized by myoclonus. MYOCLONUS : sudden, brief (lower than 100 ms) involuntary single or multiple contraction(s) of muscles(s) or muscle groups of variable topography (axial, proximal limb, distal).] +***** Semiology-motor-jacksonian-march {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Term indicating spread of clonic movements through contiguous body parts unilaterally.] +***** Semiology-motor-negative-myoclonus {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Characterized by negative myoclonus. NEGATIVE MYOCLONUS: interruption of tonic muscular activity for lower than 500 ms without evidence of preceding myoclonia.] +***** Semiology-motor-tonic-clonic {requireChild, inLibrary=score} [A sequence consisting of a tonic followed by a clonic phase. Variants such as clonic-tonic-clonic may be seen. Asymmetry of limb posture during the tonic phase of a GTC: one arm is rigidly extended at the elbow (often with the fist clenched tightly and flexed at the wrist), whereas the opposite arm is flexed at the elbow.] +****** Semiology-motor-tonic-clonic-without-figure-of-four {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} +****** Semiology-motor-tonic-clonic-with-figure-of-four-extension-left-elbow {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} +****** Semiology-motor-tonic-clonic-with-figure-of-four-extension-right-elbow {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} +***** Semiology-motor-astatic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Loss of erect posture that results from an atonic, myoclonic, or tonic mechanism. Synonym: drop attack.] +***** Semiology-motor-atonic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Sudden loss or diminution of muscle tone without apparent preceding myoclonic or tonic event lasting greater or equal to 1 to 2 s, involving head, trunk, jaw, or limb musculature.] +***** Semiology-motor-eye-blinking {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count, inLibrary=score} +***** Semiology-motor-other-elementary-motor {requireChild, inLibrary=score} +****** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Semiology-motor-automatisms {inLibrary=score} +***** Semiology-motor-automatisms-mimetic {suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count, inLibrary=score} [Facial expression suggesting an emotional state, often fear.] +***** Semiology-motor-automatisms-oroalimentary {suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count, inLibrary=score} [Lip smacking, lip pursing, chewing, licking, tooth grinding, or swallowing.] +***** Semiology-motor-automatisms-dacrystic {suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count, inLibrary=score} [Bursts of crying.] +***** Semiology-motor-automatisms-dyspraxic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count, inLibrary=score} [Inability to perform learned movements spontaneously or on command or imitation despite intact relevant motor and sensory systems and adequate comprehension and cooperation.] +***** Semiology-motor-automatisms-manual {suggestedTag=Brain-laterality, suggestedTag=Brain-centricity, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count, inLibrary=score} [1. Indicates principally distal components, bilateral or unilateral. 2. Fumbling, tapping, manipulating movements.] +***** Semiology-motor-automatisms-gestural {suggestedTag=Brain-laterality, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count, inLibrary=score} [Semipurposive, asynchronous hand movements. Often unilateral.] +***** Semiology-motor-automatisms-pedal {suggestedTag=Brain-laterality, suggestedTag=Brain-centricity, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count, inLibrary=score} [1. Indicates principally distal components, bilateral or unilateral. 2. Fumbling, tapping, manipulating movements.] +***** Semiology-motor-automatisms-hypermotor {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count, inLibrary=score} [1. Involves predominantly proximal limb or axial muscles producing irregular sequential ballistic movements, such as pedaling, pelvic thrusting, thrashing, rocking movements. 2. Increase in rate of ongoing movements or inappropriately rapid performance of a movement.] +***** Semiology-motor-automatisms-hypokinetic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count, inLibrary=score} [A decrease in amplitude and/or rate or arrest of ongoing motor activity.] +***** Semiology-motor-automatisms-gelastic {suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count, inLibrary=score} [Bursts of laughter or giggling, usually without an appropriate affective tone.] +***** Semiology-motor-other-automatisms {requireChild, inLibrary=score} +****** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Semiology-motor-behavioral-arrest {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Interruption of ongoing motor activity or of ongoing behaviors with fixed gaze, without movement of the head or trunk (oro-alimentary and hand automatisms may continue).] +*** Semiology-non-motor-manifestation {inLibrary=score} +**** Semiology-sensory {inLibrary=score} +***** Semiology-sensory-headache {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count, inLibrary=score} [Headache occurring in close temporal proximity to the seizure or as the sole seizure manifestation.] +***** Semiology-sensory-visual {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count, inLibrary=score} [Flashing or flickering lights, spots, simple patterns, scotomata, or amaurosis.] +***** Semiology-sensory-auditory {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count, inLibrary=score} [Buzzing, drumming sounds or single tones.] +***** Semiology-sensory-olfactory {suggestedTag=Body-part-location, suggestedTag=Episode-event-count, inLibrary=score} +***** Semiology-sensory-gustatory {suggestedTag=Episode-event-count, inLibrary=score} [Taste sensations including acidic, bitter, salty, sweet, or metallic.] +***** Semiology-sensory-epigastric {suggestedTag=Episode-event-count, inLibrary=score} [Abdominal discomfort including nausea, emptiness, tightness, churning, butterflies, malaise, pain, and hunger; sensation may rise to chest or throat. Some phenomena may reflect ictal autonomic dysfunction.] +***** Semiology-sensory-somatosensory {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Tingling, numbness, electric-shock sensation, sense of movement or desire to move.] +***** Semiology-sensory-painful {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Peripheral (lateralized/bilateral), cephalic, abdominal.] +***** Semiology-sensory-autonomic-sensation {suggestedTag=Episode-event-count, inLibrary=score} [A sensation consistent with involvement of the autonomic nervous system, including cardiovascular, gastrointestinal, sudomotor, vasomotor, and thermoregulatory functions. (Thus autonomic aura; cf. autonomic events 3.0).] +***** Semiology-sensory-other {requireChild, inLibrary=score} +****** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Semiology-experiential {inLibrary=score} +***** Semiology-experiential-affective-emotional {suggestedTag=Episode-event-count, inLibrary=score} [Components include fear, depression, joy, and (rarely) anger.] +***** Semiology-experiential-hallucinatory {suggestedTag=Episode-event-count, inLibrary=score} [Composite perceptions without corresponding external stimuli involving visual, auditory, somatosensory, olfactory, and/or gustatory phenomena. Example: hearing and seeing people talking.] +***** Semiology-experiential-illusory {suggestedTag=Episode-event-count, inLibrary=score} [An alteration of actual percepts involving the visual, auditory, somatosensory, olfactory, or gustatory systems.] +***** Semiology-experiential-mnemonic {inLibrary=score} [Components that reflect ictal dysmnesia such as feelings of familiarity (deja-vu) and unfamiliarity (jamais-vu).] +****** Semiology-experiential-mnemonic-Deja-vu {suggestedTag=Episode-event-count, inLibrary=score} +****** Semiology-experiential-mnemonic-Jamais-vu {suggestedTag=Episode-event-count, inLibrary=score} +***** Semiology-experiential-other {requireChild, inLibrary=score} +****** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Semiology-dyscognitive {suggestedTag=Episode-event-count, inLibrary=score} [The term describes events in which (1) disturbance of cognition is the predominant or most apparent feature, and (2a) two or more of the following components are involved, or (2b) involvement of such components remains undetermined. Otherwise, use the more specific term (e.g., mnemonic experiential seizure or hallucinatory experiential seizure). Components of cognition: ++ perception: symbolic conception of sensory information ++ attention: appropriate selection of a principal perception or task ++ emotion: appropriate affective significance of a perception ++ memory: ability to store and retrieve percepts or concepts ++ executive function: anticipation, selection, monitoring of consequences, and initiation of motor activity including praxis, speech.] +**** Semiology-language-related {inLibrary=score} +***** Semiology-language-related-vocalization {suggestedTag=Episode-event-count, inLibrary=score} +***** Semiology-language-related-verbalization {suggestedTag=Episode-event-count, inLibrary=score} +***** Semiology-language-related-dysphasia {suggestedTag=Episode-event-count, inLibrary=score} +***** Semiology-language-related-aphasia {suggestedTag=Episode-event-count, inLibrary=score} +***** Semiology-language-related-other {requireChild, inLibrary=score} +****** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Semiology-autonomic {inLibrary=score} +***** Semiology-autonomic-pupillary {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count, inLibrary=score} [Mydriasis, miosis (either bilateral or unilateral).] +***** Semiology-autonomic-hypersalivation {suggestedTag=Episode-event-count, inLibrary=score} [Increase in production of saliva leading to uncontrollable drooling] +***** Semiology-autonomic-respiratory-apnoeic {suggestedTag=Episode-event-count, inLibrary=score} [subjective shortness of breath, hyperventilation, stridor, coughing, choking, apnea, oxygen desaturation, neurogenic pulmonary edema.] +***** Semiology-autonomic-cardiovascular {suggestedTag=Episode-event-count, inLibrary=score} [Modifications of heart rate (tachycardia, bradycardia), cardiac arrhythmias (such as sinus arrhythmia, sinus arrest, supraventricular tachycardia, atrial premature depolarizations, ventricular premature depolarizations, atrio-ventricular block, bundle branch block, atrioventricular nodal escape rhythm, asystole).] +***** Semiology-autonomic-gastrointestinal {suggestedTag=Episode-event-count, inLibrary=score} [Nausea, eructation, vomiting, retching, abdominal sensations, abdominal pain, flatulence, spitting, diarrhea.] +***** Semiology-autonomic-urinary-incontinence {suggestedTag=Episode-event-count, inLibrary=score} [urinary urge (intense urinary urge at the beginning of seizures), urinary incontinence, ictal urination (rare symptom of partial seizures without loss of consciousness).] +***** Semiology-autonomic-genital {suggestedTag=Episode-event-count, inLibrary=score} [Sexual auras (erotic thoughts and feelings, sexual arousal and orgasm). Genital auras (unpleasant, sometimes painful, frightening or emotionally neutral somatosensory sensations in the genitals that can be accompanied by ictal orgasm). Sexual automatisms (hypermotor movements consisting of writhing, thrusting, rhythmic movements of the pelvis, arms and legs, sometimes associated with picking and rhythmic manipulation of the groin or genitalia, exhibitionism and masturbation).] +***** Semiology-autonomic-vasomotor {suggestedTag=Episode-event-count, inLibrary=score} [Flushing or pallor (may be accompanied by feelings of warmth, cold and pain).] +***** Semiology-autonomic-sudomotor {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count, inLibrary=score} [Sweating and piloerection (may be accompanied by feelings of warmth, cold and pain).] +***** Semiology-autonomic-thermoregulatory {suggestedTag=Episode-event-count, inLibrary=score} [Hyperthermia, fever.] +***** Semiology-autonomic-other {requireChild, inLibrary=score} +****** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Semiology-manifestation-other {requireChild, inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Postictal-semiology-manifestation {requireChild, inLibrary=score} +*** Postictal-semiology-unconscious {suggestedTag=Episode-event-count, inLibrary=score} +*** Postictal-semiology-quick-recovery-of-consciousness {suggestedTag=Episode-event-count, inLibrary=score} [Quick recovery of awareness and responsiveness.] +*** Postictal-semiology-aphasia-or-dysphasia {suggestedTag=Episode-event-count, inLibrary=score} [Impaired communication involving language without dysfunction of relevant primary motor or sensory pathways, manifested as impaired comprehension, anomia, parahasic errors or a combination of these.] +*** Postictal-semiology-behavioral-change {suggestedTag=Episode-event-count, inLibrary=score} [Occurring immediately after a aseizure. Including psychosis, hypomanina, obsessive-compulsive behavior.] +*** Postictal-semiology-hemianopia {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count, inLibrary=score} [Postictal visual loss in a a hemi field.] +*** Postictal-semiology-impaired-cognition {suggestedTag=Episode-event-count, inLibrary=score} [Decreased Cognitive performance involving one or more of perception, attention, emotion, memory, execution, praxis, speech.] +*** Postictal-semiology-dysphoria {suggestedTag=Episode-event-count, inLibrary=score} [Depression, irritability, euphoric mood, fear, anxiety.] +*** Postictal-semiology-headache {suggestedTag=Episode-event-count, inLibrary=score} [Headache with features of tension-type or migraine headache that develops within 3 h following the seizure and resolves within 72 h after seizure.] +*** Postictal-semiology-nose-wiping {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count, inLibrary=score} [Noes-wiping usually within 60 sec of seizure offset, usually with the hand ipsilateral to the seizure onset.] +*** Postictal-semiology-anterograde-amnesia {suggestedTag=Episode-event-count, inLibrary=score} [Impaired ability to remember new material.] +*** Postictal-semiology-retrograde-amnesia {suggestedTag=Episode-event-count, inLibrary=score} [Impaired ability to recall previously remember material.] +*** Postictal-semiology-paresis {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count, inLibrary=score} [Todds palsy. Any unilateral postictal dysfunction relating to motor, language, sensory and/or integrative functions.] +*** Postictal-semiology-sleep {inLibrary=score} [Invincible need to sleep after a seizure.] +*** Postictal-semiology-unilateral-myoclonic-jerks {inLibrary=score} [unilateral motor phenomena, other then specified, occurring in postictal phase.] +*** Postictal-semiology-other-unilateral-motor-phenomena {requireChild, inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Polygraphic-channel-relation-to-episode {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} +*** Polygraphic-channel-cause-to-episode {inLibrary=score} +*** Polygraphic-channel-consequence-of-episode {inLibrary=score} +** Ictal-EEG-patterns {inLibrary=score} +*** Ictal-EEG-patterns-obscured-by-artifacts {inLibrary=score} [The interpretation of the EEG is not possible due to artifacts.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Ictal-EEG-activity {suggestedTag=Polyspikes-morphology, suggestedTag=Fast-spike-activity-morphology, suggestedTag=Low-voltage-fast-activity-morphology, suggestedTag=Polysharp-waves-morphology, suggestedTag=Spike-and-slow-wave-morphology, suggestedTag=Polyspike-and-slow-wave-morphology, suggestedTag=Sharp-and-slow-wave-morphology, suggestedTag=Rhythmic-activity-morphology, suggestedTag=Slow-wave-large-amplitude-morphology, suggestedTag=Irregular-delta-or-theta-activity-morphology, suggestedTag=Electrodecremental-change-morphology, suggestedTag=DC-shift-morphology, suggestedTag=Disappearance-of-ongoing-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Source-analysis-laterality, suggestedTag=Source-analysis-brain-region, suggestedTag=Episode-event-count, inLibrary=score} +*** Postictal-EEG-activity {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, inLibrary=score} +** Episode-time-context-property {inLibrary=score} [Additional clinically relevant features related to episodes can be scored under timing and context. If needed, episode duration can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Temporal-value/Duration.] +*** Episode-consciousness {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} +**** Episode-consciousness-not-tested {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Episode-consciousness-affected {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Episode-consciousness-mildly-affected {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Episode-consciousness-not-affected {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Episode-awareness {suggestedTag=Property-not-possible-to-determine, suggestedTag=Property-exists, suggestedTag=Property-absence, inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Clinical-EEG-temporal-relationship {suggestedTag=Property-not-possible-to-determine, inLibrary=score} +**** Clinical-start-followed-EEG {inLibrary=score} [Clinical start, followed by EEG start by X seconds.] +***** # {takesValue, valueClass=numericClass, unitClass=timeUnits, inLibrary=score} +**** EEG-start-followed-clinical {inLibrary=score} [EEG start, followed by clinical start by X seconds.] +***** # {takesValue, valueClass=numericClass, unitClass=timeUnits, inLibrary=score} +**** Simultaneous-start-clinical-EEG {inLibrary=score} +**** Clinical-EEG-temporal-relationship-notes {inLibrary=score} [Clinical notes to annotate the clinical-EEG temporal relationship.] +***** # {takesValue, valueClass=textClass, inLibrary=score} +*** Episode-event-count {suggestedTag=Property-not-possible-to-determine, inLibrary=score} [Number of stereotypical episodes during the recording.] +**** # {takesValue, valueClass=numericClass, inLibrary=score} +*** State-episode-start {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} [State at the start of the episode.] +**** Episode-start-from-sleep {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Episode-start-from-awake {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Episode-postictal-phase {suggestedTag=Property-not-possible-to-determine, inLibrary=score} +**** # {takesValue, valueClass=numericClass, unitClass=timeUnits, inLibrary=score} +*** Episode-prodrome {suggestedTag=Property-exists, suggestedTag=Property-absence, inLibrary=score} [Prodrome is a preictal phenomenon, and it is defined as a subjective or objective clinical alteration (e.g., ill-localized sensation or agitation) that heralds the onset of an epileptic seizure but does not form part of it (Blume et al., 2001). Therefore, prodrome should be distinguished from aura (which is an ictal phenomenon).] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Episode-tongue-biting {suggestedTag=Property-exists, suggestedTag=Property-absence, inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Episode-responsiveness {requireChild, suggestedTag=Property-not-possible-to-determine, inLibrary=score} +**** Episode-responsiveness-preserved {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Episode-responsiveness-affected {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Episode-appearance {requireChild, inLibrary=score} +**** Episode-appearance-interactive {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Episode-appearance-spontaneous {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Seizure-dynamics {requireChild, inLibrary=score} [Spatiotemporal dynamics can be scored (evolution in morphology; evolution in frequency; evolution in location).] +**** Seizure-dynamics-evolution-morphology {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Seizure-dynamics-evolution-frequency {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Seizure-dynamics-evolution-location {inLibrary=score} +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +**** Seizure-dynamics-not-possible-to-determine {inLibrary=score} [Not possible to determine.] +***** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +* Other-finding-property {requireChild, inLibrary=score} +** Artifact-significance-to-recording {requireChild, inLibrary=score} [It is important to score the significance of the described artifacts: recording is not interpretable, recording of reduced diagnostic value, does not interfere with the interpretation of the recording.] +*** Recording-not-interpretable-due-to-artifact {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Recording-of-reduced-diagnostic-value-due-to-artifact {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Artifact-does-not-interfere-recording {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Finding-significance-to-recording {requireChild, inLibrary=score} [Significance of finding. When normal/abnormal could be labeled with base schema Normal/Abnormal tags.] +*** Finding-no-definite-abnormality {inLibrary=score} +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Finding-significance-not-possible-to-determine {inLibrary=score} [Not possible to determine.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Finding-frequency {inLibrary=score} [Value in Hz (number) typed in.] +*** # {takesValue, valueClass=numericClass, unitClass=frequencyUnits, inLibrary=score} +** Finding-amplitude {inLibrary=score} [Value in microvolts (number) typed in.] +*** # {takesValue, valueClass=numericClass, unitClass=electricPotentialUnits, inLibrary=score} +** Finding-amplitude-asymmetry {requireChild, inLibrary=score} [For posterior dominant rhythm: a difference in amplitude between the homologous area on opposite sides of the head that consistently exceeds 50 percent. When symmetrical could be labeled with base schema Symmetrical tag. For sleep: Absence or consistently marked amplitude asymmetry (greater than 50 percent) of a normal sleep graphoelement.] +*** Finding-amplitude-asymmetry-lower-left {inLibrary=score} [Amplitude lower on the left side.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Finding-amplitude-asymmetry-lower-right {inLibrary=score} [Amplitude lower on the right side.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +*** Finding-amplitude-asymmetry-not-possible-to-determine {inLibrary=score} [Not possible to determine.] +**** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Finding-stopped-by {inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Finding-triggered-by {inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Finding-unmodified {inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Property-not-possible-to-determine {inLibrary=score} [Not possible to determine.] +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Property-exists {inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] +** Property-absence {inLibrary=score} +*** # {takesValue, valueClass=textClass, inLibrary=score} [Free text.] + +'''Event''' {suggestedTag=Task-property} [Something that happens at a given time and (typically) place. Elements of this tag subtree designate the general category in which an event falls.] +* Sensory-event {suggestedTag=Task-event-role, suggestedTag=Sensory-presentation} [Something perceivable by the participant. An event meant to be an experimental stimulus should include the tag Task-property/Task-event-role/Experimental-stimulus.] +* Agent-action {suggestedTag=Task-event-role, suggestedTag=Agent} [Any action engaged in by an agent (see the Agent subtree for agent categories). A participant response to an experiment stimulus should include the tag Agent-property/Agent-task-role/Experiment-participant.] +* Data-feature {suggestedTag=Data-property} [An event marking the occurrence of a data feature such as an interictal spike or alpha burst that is often added post hoc to the data record.] +* Experiment-control [An event pertaining to the physical control of the experiment during its operation.] +* Experiment-procedure [An event indicating an experimental procedure, as in performing a saliva swab during the experiment or administering a survey.] +* Experiment-structure [An event specifying a change-point of the structure of experiment. This event is typically used to indicate a change in experimental conditions or tasks.] +* Measurement-event {suggestedTag=Data-property} [A discrete measure returned by an instrument.] + +'''Agent''' {suggestedTag=Agent-property} [Someone or something that takes an active role or produces a specified effect.The role or effect may be implicit. Being alive or performing an activity such as a computation may qualify something to be an agent. An agent may also be something that simulates something else.] +* Animal-agent [An agent that is an animal.] +* Avatar-agent [An agent associated with an icon or avatar representing another agent.] +* Controller-agent [An agent experiment control software or hardware.] +* Human-agent [A person who takes an active role or produces a specified effect.] +* Robotic-agent [An agent mechanical device capable of performing a variety of often complex tasks on command or by being programmed in advance.] +* Software-agent [An agent computer program.] + +'''Action''' {extensionAllowed} [Do something.] +* Communicate [Convey knowledge of or information about something.] +** Communicate-gesturally {relatedTag=Move-face, relatedTag=Move-upper-extremity} [Communicate nonverbally using visible bodily actions, either in place of speech or together and in parallel with spoken words. Gestures include movement of the hands, face, or other parts of the body.] +*** Clap-hands [Strike the palms of against one another resoundingly, and usually repeatedly, especially to express approval.] +*** Clear-throat {relatedTag=Move-face, relatedTag=Move-head} [Cough slightly so as to speak more clearly, attract attention, or to express hesitancy before saying something awkward.] +*** Frown {relatedTag=Move-face} [Express disapproval, displeasure, or concentration, typically by turning down the corners of the mouth.] +*** Grimace {relatedTag=Move-face} [Make a twisted expression, typically expressing disgust, pain, or wry amusement.] +*** Nod-head {relatedTag=Move-head} [Tilt head in alternating up and down arcs along the sagittal plane. It is most commonly, but not universally, used to indicate agreement, acceptance, or acknowledgement.] +*** Pump-fist {relatedTag=Move-upper-extremity} [Raise with fist clenched in triumph or affirmation.] +*** Raise-eyebrows {relatedTag=Move-face, relatedTag=Move-eyes} [Move eyebrows upward.] +*** Shake-fist {relatedTag=Move-upper-extremity} [Clench hand into a fist and shake to demonstrate anger.] +*** Shake-head {relatedTag=Move-head} [Turn head from side to side as a way of showing disagreement or refusal.] +*** Shhh {relatedTag=Move-upper-extremity} [Place finger over lips and possibly uttering the syllable shhh to indicate the need to be quiet.] +*** Shrug {relatedTag=Move-upper-extremity, relatedTag=Move-torso} [Lift shoulders up towards head to indicate a lack of knowledge about a particular topic.] +*** Smile {relatedTag=Move-face} [Form facial features into a pleased, kind, or amused expression, typically with the corners of the mouth turned up and the front teeth exposed.] +*** Spread-hands {relatedTag=Move-upper-extremity} [Spread hands apart to indicate ignorance.] +*** Thumb-up {relatedTag=Move-upper-extremity} [Extend the thumb upward to indicate approval.] +*** Thumbs-down {relatedTag=Move-upper-extremity} [Extend the thumb downward to indicate disapproval.] +*** Wave {relatedTag=Move-upper-extremity} [Raise hand and move left and right, as a greeting or sign of departure.] +*** Widen-eyes {relatedTag=Move-face, relatedTag=Move-eyes} [Open eyes and possibly with eyebrows lifted especially to express surprise or fear.] +*** Wink {relatedTag=Move-face, relatedTag=Move-eyes} [Close and open one eye quickly, typically to indicate that something is a joke or a secret or as a signal of affection or greeting.] +** Communicate-musically [Communicate using music.] +*** Hum [Make a low, steady continuous sound like that of a bee. Sing with the lips closed and without uttering speech.] +*** Play-instrument [Make musical sounds using an instrument.] +*** Sing [Produce musical tones by means of the voice.] +*** Vocalize [Utter vocal sounds.] +*** Whistle [Produce a shrill clear sound by forcing breath out or air in through the puckered lips.] +** Communicate-vocally [Communicate using mouth or vocal cords.] +*** Cry [Shed tears associated with emotions, usually sadness but also joy or frustration.] +*** Groan [Make a deep inarticulate sound in response to pain or despair.] +*** Laugh [Make the spontaneous sounds and movements of the face and body that are the instinctive expressions of lively amusement and sometimes also of contempt or derision.] +*** Scream [Make loud, vociferous cries or yells to express pain, excitement, or fear.] +*** Shout [Say something very loudly.] +*** Sigh [Emit a long, deep, audible breath expressing sadness, relief, tiredness, or a similar feeling.] +*** Speak [Communicate using spoken language.] +*** Whisper [Speak very softly using breath without vocal cords.] +* Move [Move in a specified direction or manner. Change position or posture.] +** Breathe [Inhale or exhale during respiration.] +*** Blow [Expel air through pursed lips.] +*** Cough [Suddenly and audibly expel air from the lungs through a partially closed glottis, preceded by inhalation.] +*** Exhale [Blow out or expel breath.] +*** Hiccup [Involuntarily spasm the diaphragm and respiratory organs, with a sudden closure of the glottis and a characteristic sound like that of a cough.] +*** Hold-breath [Interrupt normal breathing by ceasing to inhale or exhale.] +*** Inhale [Draw in with the breath through the nose or mouth.] +*** Sneeze [Suddenly and violently expel breath through the nose and mouth.] +*** Sniff [Draw in air audibly through the nose to detect a smell, to stop it from running, or to express contempt.] +** Move-body [Move entire body.] +*** Bend [Move body in a bowed or curved manner.] +*** Dance [Perform a purposefully selected sequences of human movement often with aesthetic or symbolic value. Move rhythmically to music, typically following a set sequence of steps.] +*** Fall-down [Lose balance and collapse.] +*** Flex [Cause a muscle to stand out by contracting or tensing it. Bend a limb or joint.] +*** Jerk [Make a quick, sharp, sudden movement.] +*** Lie-down [Move to a horizontal or resting position.] +*** Recover-balance [Return to a stable, upright body position.] +*** Shudder [Tremble convulsively, sometimes as a result of fear or revulsion.] +*** Sit-down [Move from a standing to a sitting position.] +*** Sit-up [Move from lying down to a sitting position.] +*** Stand-up [Move from a sitting to a standing position.] +*** Stretch [Straighten or extend body or a part of body to its full length, typically so as to tighten muscles or in order to reach something.] +*** Stumble [Trip or momentarily lose balance and almost fall.] +*** Turn [Change or cause to change direction.] +** Move-body-part [Move one part of a body.] +*** Move-eyes [Move eyes.] +**** Blink [Shut and open the eyes quickly.] +**** Close-eyes [Lower and keep eyelids in a closed position.] +**** Fixate [Direct eyes to a specific point or target.] +**** Inhibit-blinks [Purposely prevent blinking.] +**** Open-eyes [Raise eyelids to expose pupil.] +**** Saccade [Move eyes rapidly between fixation points.] +**** Squint [Squeeze one or both eyes partly closed in an attempt to see more clearly or as a reaction to strong light.] +**** Stare [Look fixedly or vacantly at someone or something with eyes wide open.] +*** Move-face [Move the face or jaw.] +**** Bite [Seize with teeth or jaws an object or organism so as to grip or break the surface covering.] +**** Burp [Noisily release air from the stomach through the mouth. Belch.] +**** Chew [Repeatedly grinding, tearing, and or crushing with teeth or jaws.] +**** Gurgle [Make a hollow bubbling sound like that made by water running out of a bottle.] +**** Swallow [Cause or allow something, especially food or drink to pass down the throat.] +***** Gulp [Swallow quickly or in large mouthfuls, often audibly, sometimes to indicate apprehension.] +**** Yawn [Take a deep involuntary inhalation with the mouth open often as a sign of drowsiness or boredom.] +*** Move-head [Move head.] +**** Lift-head [Tilt head back lifting chin.] +**** Lower-head [Move head downward so that eyes are in a lower position.] +**** Turn-head [Rotate head horizontally to look in a different direction.] +*** Move-lower-extremity [Move leg and/or foot.] +**** Curl-toes [Bend toes sometimes to grip.] +**** Hop [Jump on one foot.] +**** Jog [Run at a trot to exercise.] +**** Jump [Move off the ground or other surface through sudden muscular effort in the legs.] +**** Kick [Strike out or flail with the foot or feet. Strike using the leg, in unison usually with an area of the knee or lower using the foot.] +**** Pedal [Move by working the pedals of a bicycle or other machine.] +**** Press-foot [Move by pressing foot.] +**** Run [Travel on foot at a fast pace.] +**** Step [Put one leg in front of the other and shift weight onto it.] +***** Heel-strike [Strike the ground with the heel during a step.] +***** Toe-off [Push with toe as part of a stride.] +**** Trot [Run at a moderate pace, typically with short steps.] +**** Walk [Move at a regular pace by lifting and setting down each foot in turn never having both feet off the ground at once.] +*** Move-torso [Move body trunk.] +*** Move-upper-extremity [Move arm, shoulder, and/or hand.] +**** Drop [Let or cause to fall vertically.] +**** Grab [Seize suddenly or quickly. Snatch or clutch.] +**** Grasp [Seize and hold firmly.] +**** Hold-down [Prevent someone or something from moving by holding them firmly.] +**** Lift [Raising something to higher position.] +**** Make-fist [Close hand tightly with the fingers bent against the palm.] +**** Point [Draw attention to something by extending a finger or arm.] +**** Press {relatedTag=Push} [Apply pressure to something to flatten, shape, smooth or depress it. This action tag should be used to indicate key presses and mouse clicks.] +**** Push {relatedTag=Press} [Apply force in order to move something away. Use Press to indicate a key press or mouse click.] +**** Reach [Stretch out your arm in order to get or touch something.] +**** Release [Make available or set free.] +**** Retract [Draw or pull back.] +**** Scratch [Drag claws or nails over a surface or on skin.] +**** Snap-fingers [Make a noise by pushing second finger hard against thumb and then releasing it suddenly so that it hits the base of the thumb.] +**** Touch [Come into or be in contact with.] +* Perceive [Produce an internal, conscious image through stimulating a sensory system.] +** Hear [Give attention to a sound.] +** See [Direct gaze toward someone or something or in a specified direction.] +** Sense-by-touch [Sense something through receptors in the skin.] +** Smell [Inhale in order to ascertain an odor or scent.] +** Taste [Sense a flavor in the mouth and throat on contact with a substance.] +* Perform [Carry out or accomplish an action, task, or function.] +** Close [Act as to blocked against entry or passage.] +** Collide-with [Hit with force when moving.] +** Halt [Bring or come to an abrupt stop.] +** Modify [Change something.] +** Open [Widen an aperture, door, or gap, especially one allowing access to something.] +** Operate [Control the functioning of a machine, process, or system.] +** Play [Engage in activity for enjoyment and recreation rather than a serious or practical purpose.] +** Read [Interpret something that is written or printed.] +** Repeat [Make do or perform again.] +** Rest [Be inactive in order to regain strength, health, or energy.] +** Write [Communicate or express by means of letters or symbols written or imprinted on a surface.] +* Think [Direct the mind toward someone or something or use the mind actively to form connected ideas.] +** Allow [Allow access to something such as allowing a car to pass.] +** Attend-to [Focus mental experience on specific targets.] +** Count [Tally items either silently or aloud.] +** Deny [Refuse to give or grant something requested or desired by someone.] +** Detect [Discover or identify the presence or existence of something.] +** Discriminate [Recognize a distinction.] +** Encode [Convert information or an instruction into a particular form.] +** Evade [Escape or avoid, especially by cleverness or trickery.] +** Generate [Cause something, especially an emotion or situation to arise or come about.] +** Identify [Establish or indicate who or what someone or something is.] +** Imagine [Form a mental image or concept of something.] +** Judge [Evaluate evidence to make a decision or form a belief.] +** Learn [Adaptively change behavior as the result of experience.] +** Memorize [Adaptively change behavior as the result of experience.] +** Plan [Think about the activities required to achieve a desired goal.] +** Predict [Say or estimate that something will happen or will be a consequence of something without having exact informaton.] +** Recall [Remember information by mental effort.] +** Recognize [Identify someone or something from having encountered them before.] +** Respond [React to something such as a treatment or a stimulus.] +** Switch-attention [Transfer attention from one focus to another.] +** Track [Follow a person, animal, or object through space or time.] + +'''Item''' {extensionAllowed} [An independently existing thing (living or nonliving).] +* Biological-item [An entity that is biological, that is related to living organisms.] +** Anatomical-item [A biological structure, system, fluid or other substance excluding single molecular entities.] +*** Body [The biological structure representing an organism.] +*** Body-part [Any part of an organism.] +**** Head [The upper part of the human body, or the front or upper part of the body of an animal, typically separated from the rest of the body by a neck, and containing the brain, mouth, and sense organs.] +***** Ear [A sense organ needed for the detection of sound and for establishing balance.] +***** Face [The anterior portion of the head extending from the forehead to the chin and ear to ear. The facial structures contain the eyes, nose and mouth, cheeks and jaws.] +****** Cheek [The fleshy part of the face bounded by the eyes, nose, ear, and jaw line.] +****** Chin [The part of the face below the lower lip and including the protruding part of the lower jaw.] +****** Eye [The organ of sight or vision.] +****** Eyebrow [The arched strip of hair on the bony ridge above each eye socket.] +****** Forehead [The part of the face between the eyebrows and the normal hairline.] +****** Lip [Fleshy fold which surrounds the opening of the mouth.] +****** Mouth [The proximal portion of the digestive tract, containing the oral cavity and bounded by the oral opening.] +****** Nose [A structure of special sense serving as an organ of the sense of smell and as an entrance to the respiratory tract.] +****** Teeth [The hard bonelike structures in the jaws. A collection of teeth arranged in some pattern in the mouth or other part of the body.] +***** Hair [The filamentous outgrowth of the epidermis.] +**** Lower-extremity [Refers to the whole inferior limb (leg and/or foot).] +***** Ankle [A gliding joint between the distal ends of the tibia and fibula and the proximal end of the talus.] +***** Calf [The fleshy part at the back of the leg below the knee.] +***** Foot [The structure found below the ankle joint required for locomotion.] +****** Big-toe [The largest toe on the inner side of the foot.] +****** Heel [The back of the foot below the ankle.] +****** Instep [The part of the foot between the ball and the heel on the inner side.] +****** Little-toe [The smallest toe located on the outer side of the foot.] +****** Toes [The terminal digits of the foot.] +***** Knee [A joint connecting the lower part of the femur with the upper part of the tibia.] +***** Shin [Front part of the leg below the knee.] +***** Thigh [Upper part of the leg between hip and knee.] +**** Torso [The body excluding the head and neck and limbs.] +***** Buttocks [The round fleshy parts that form the lower rear area of a human trunk.] +***** Gentalia {deprecatedFrom=8.1.0} [The external organs of reproduction.] +***** Hip [The lateral prominence of the pelvis from the waist to the thigh.] +***** Torso-back [The rear surface of the human body from the shoulders to the hips.] +***** Torso-chest [The anterior side of the thorax from the neck to the abdomen.] +***** Waist [The abdominal circumference at the navel.] +**** Upper-extremity [Refers to the whole superior limb (shoulder, arm, elbow, wrist, hand).] +***** Elbow [A type of hinge joint located between the forearm and upper arm.] +***** Forearm [Lower part of the arm between the elbow and wrist.] +***** Hand [The distal portion of the upper extremity. It consists of the carpus, metacarpus, and digits.] +****** Finger [Any of the digits of the hand.] +******* Index-finger [The second finger from the radial side of the hand, next to the thumb.] +******* Little-finger [The fifth and smallest finger from the radial side of the hand.] +******* Middle-finger [The middle or third finger from the radial side of the hand.] +******* Ring-finger [The fourth finger from the radial side of the hand.] +******* Thumb [The thick and short hand digit which is next to the index finger in humans.] +****** Knuckles [A part of a finger at a joint where the bone is near the surface, especially where the finger joins the hand.] +****** Palm [The part of the inner surface of the hand that extends from the wrist to the bases of the fingers.] +***** Shoulder [Joint attaching upper arm to trunk.] +***** Upper-arm [Portion of arm between shoulder and elbow.] +***** Wrist [A joint between the distal end of the radius and the proximal row of carpal bones.] +** Organism [A living entity, more specifically a biological entity that consists of one or more cells and is capable of genomic replication (independently or not).] +*** Animal [A living organism that has membranous cell walls, requires oxygen and organic foods, and is capable of voluntary movement.] +*** Human [The bipedal primate mammal Homo sapiens.] +*** Plant [Any living organism that typically synthesizes its food from inorganic substances and possesses cellulose cell walls.] +* Language-item {suggestedTag=Sensory-presentation} [An entity related to a systematic means of communicating by the use of sounds, symbols, or gestures.] +** Character [A mark or symbol used in writing.] +** Clause [A unit of grammatical organization next below the sentence in rank, usually consisting of a subject and predicate.] +** Glyph [A hieroglyphic character, symbol, or pictograph.] +** Nonword [A group of letters or speech sounds that looks or sounds like a word but that is not accepted as such by native speakers.] +** Paragraph [A distinct section of a piece of writing, usually dealing with a single theme.] +** Phoneme [A speech sound that is distinguished by the speakers of a particular language.] +** Phrase [A phrase is a group of words functioning as a single unit in the syntax of a sentence.] +** Sentence [A set of words that is complete in itself, conveying a statement, question, exclamation, or command and typically containing an explicit or implied subject and a predicate containing a finite verb.] +** Syllable [A unit of spoken language larger than a phoneme.] +** Textblock [A block of text.] +** Word [A word is the smallest free form (an item that may be expressed in isolation with semantic or pragmatic content) in a language.] +* Object {suggestedTag=Sensory-presentation} [Something perceptible by one or more of the senses, especially by vision or touch. A material thing.] +** Geometric-object [An object or a representation that has structure and topology in space.] +*** 2D-shape [A planar, two-dimensional shape.] +**** Arrow [A shape with a pointed end indicating direction.] +**** Clockface [The dial face of a clock. A location identifier based on clockface numbering or anatomic subregion.] +**** Cross [A figure or mark formed by two intersecting lines crossing at their midpoints.] +**** Dash [A horizontal stroke in writing or printing to mark a pause or break in sense or to represent omitted letters or words.] +**** Ellipse [A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base.] +***** Circle [A ring-shaped structure with every point equidistant from the center.] +**** Rectangle [A parallelogram with four right angles.] +***** Square [A square is a special rectangle with four equal sides.] +**** Single-point [A point is a geometric entity that is located in a zero-dimensional spatial region and whose position is defined by its coordinates in some coordinate system.] +**** Star [A conventional or stylized representation of a star, typically one having five or more points.] +**** Triangle [A three-sided polygon.] +*** 3D-shape [A geometric three-dimensional shape.] +**** Box [A square or rectangular vessel, usually made of cardboard or plastic.] +***** Cube [A solid or semi-solid in the shape of a three dimensional square.] +**** Cone [A shape whose base is a circle and whose sides taper up to a point.] +**** Cylinder [A surface formed by circles of a given radius that are contained in a plane perpendicular to a given axis, whose centers align on the axis.] +**** Ellipsoid [A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base.] +***** Sphere [A solid or hollow three-dimensional object bounded by a closed surface such that every point on the surface is equidistant from the center.] +**** Pyramid [A polyhedron of which one face is a polygon of any number of sides, and the other faces are triangles with a common vertex.] +*** Pattern [An arrangement of objects, facts, behaviors, or other things which have scientific, mathematical, geometric, statistical, or other meaning.] +**** Dots [A small round mark or spot.] +**** LED-pattern [A pattern created by lighting selected members of a fixed light emitting diode array.] +** Ingestible-object [Something that can be taken into the body by the mouth for digestion or absorption.] +** Man-made-object [Something constructed by human means.] +*** Building [A structure that has a roof and walls and stands more or less permanently in one place.] +**** Attic [A room or a space immediately below the roof of a building.] +**** Basement [The part of a building that is wholly or partly below ground level.] +**** Entrance [The means or place of entry.] +**** Roof [A roof is the covering on the uppermost part of a building which provides protection from animals and weather, notably rain, but also heat, wind and sunlight.] +**** Room [An area within a building enclosed by walls and floor and ceiling.] +*** Clothing [A covering designed to be worn on the body.] +*** Device [An object contrived for a specific purpose.] +**** Assistive-device [A device that help an individual accomplish a task.] +***** Glasses [Frames with lenses worn in front of the eye for vision correction, eye protection, or protection from UV rays.] +***** Writing-device [A device used for writing.] +****** Pen [A common writing instrument used to apply ink to a surface for writing or drawing.] +****** Pencil [An implement for writing or drawing that is constructed of a narrow solid pigment core in a protective casing that prevents the core from being broken or marking the hand.] +**** Computing-device [An electronic device which take inputs and processes results from the inputs.] +***** Cellphone [A telephone with access to a cellular radio system so it can be used over a wide area, without a physical connection to a network.] +***** Desktop-computer [A computer suitable for use at an ordinary desk.] +***** Laptop-computer [A computer that is portable and suitable for use while traveling.] +***** Tablet-computer [A small portable computer that accepts input directly on to its screen rather than via a keyboard or mouse.] +**** Engine [A motor is a machine designed to convert one or more forms of energy into mechanical energy.] +**** IO-device [Hardware used by a human (or other system) to communicate with a computer.] +***** Input-device [A piece of equipment used to provide data and control signals to an information processing system such as a computer or information appliance.] +****** Computer-mouse [A hand-held pointing device that detects two-dimensional motion relative to a surface.] +******* Mouse-button [An electric switch on a computer mouse which can be pressed or clicked to select or interact with an element of a graphical user interface.] +******* Scroll-wheel [A scroll wheel or mouse wheel is a wheel used for scrolling made of hard plastic with a rubbery surface usually located between the left and right mouse buttons and is positioned perpendicular to the mouse surface.] +****** Joystick [A control device that uses a movable handle to create two-axis input for a computer device.] +****** Keyboard [A device consisting of mechanical keys that are pressed to create input to a computer.] +******* Keyboard-key [A button on a keyboard usually representing letters, numbers, functions, or symbols.] +******** # {takesValue} [Value of a keyboard key.] +****** Keypad [A device consisting of keys, usually in a block arrangement, that provides limited input to a system.] +******* Keypad-key [A key on a separate section of a computer keyboard that groups together numeric keys and those for mathematical or other special functions in an arrangement like that of a calculator.] +******** # {takesValue} [Value of keypad key.] +****** Microphone [A device designed to convert sound to an electrical signal.] +****** Push-button [A switch designed to be operated by pressing a button.] +***** Output-device [Any piece of computer hardware equipment which converts information into human understandable form.] +****** Auditory-device [A device designed to produce sound.] +******* Headphones [An instrument that consists of a pair of small loudspeakers, or less commonly a single speaker, held close to ears and connected to a signal source such as an audio amplifier, radio, CD player or portable media player.] +******* Loudspeaker [A device designed to convert electrical signals to sounds that can be heard.] +****** Display-device [An output device for presentation of information in visual or tactile form the latter used for example in tactile electronic displays for blind people.] +******* Computer-screen [An electronic device designed as a display or a physical device designed to be a protective meshwork.] +******** Screen-window [A part of a computer screen that contains a display different from the rest of the screen. A window is a graphical control element consisting of a visual area containing some of the graphical user interface of the program it belongs to and is framed by a window decoration.] +******* Head-mounted-display [An instrument that functions as a display device, worn on the head or as part of a helmet, that has a small display optic in front of one (monocular HMD) or each eye (binocular HMD).] +******* LED-display [A LED display is a flat panel display that uses an array of light-emitting diodes as pixels for a video display.] +***** Recording-device [A device that copies information in a signal into a persistent information bearer.] +****** EEG-recorder [A device for recording electric currents in the brain using electrodes applied to the scalp, to the surface of the brain, or placed within the substance of the brain.] +****** File-storage [A device for recording digital information to a permanent media.] +****** MEG-recorder [A device for measuring the magnetic fields produced by electrical activity in the brain, usually conducted externally.] +****** Motion-capture [A device for recording the movement of objects or people.] +****** Tape-recorder [A device for recording and reproduction usually using magnetic tape for storage that can be saved and played back.] +***** Touchscreen [A control component that operates an electronic device by pressing the display on the screen.] +**** Machine [A human-made device that uses power to apply forces and control movement to perform an action.] +**** Measurement-device [A device in which a measure function inheres.] +***** Clock [A device designed to indicate the time of day or to measure the time duration of an event or action.] +****** Clock-face [A location identifier based on clockface numbering or anatomic subregion.] +**** Robot [A mechanical device that sometimes resembles a living animal and is capable of performing a variety of often complex human tasks on command or by being programmed in advance.] +**** Tool [A component that is not part of a device but is designed to support its assemby or operation.] +*** Document [A physical object, or electronic counterpart, that is characterized by containing writing which is meant to be human-readable.] +**** Book [A volume made up of pages fastened along one edge and enclosed between protective covers.] +**** Letter [A written message addressed to a person or organization.] +**** Note [A brief written record.] +**** Notebook [A book for notes or memoranda.] +**** Questionnaire [A document consisting of questions and possibly responses, depending on whether it has been filled out.] +*** Furnishing [Furniture, fittings, and other decorative accessories, such as curtains and carpets, for a house or room.] +*** Manufactured-material [Substances created or extracted from raw materials.] +**** Ceramic [A hard, brittle, heat-resistant and corrosion-resistant material made by shaping and then firing a nonmetallic mineral, such as clay, at a high temperature.] +**** Glass [A brittle transparent solid with irregular atomic structure.] +**** Paper [A thin sheet material produced by mechanically or chemically processing cellulose fibres derived from wood, rags, grasses or other vegetable sources in water.] +**** Plastic [Various high-molecular-weight thermoplastic or thermosetting polymers that are capable of being molded, extruded, drawn, or otherwise shaped and then hardened into a form.] +**** Steel [An alloy made up of iron with typically a few tenths of a percent of carbon to improve its strength and fracture resistance compared to iron.] +*** Media [Media are audo/visual/audiovisual modes of communicating information for mass consumption.] +**** Media-clip [A short segment of media.] +***** Audio-clip [A short segment of audio.] +***** Audiovisual-clip [A short media segment containing both audio and video.] +***** Video-clip [A short segment of video.] +**** Visualization [An planned process that creates images, diagrams or animations from the input data.] +***** Animation [A form of graphical illustration that changes with time to give a sense of motion or represent dynamic changes in the portrayal.] +***** Art-installation [A large-scale, mixed-media constructions, often designed for a specific place or for a temporary period of time.] +***** Braille [A display using a system of raised dots that can be read with the fingers by people who are blind.] +***** Image [Any record of an imaging event whether physical or electronic.] +****** Cartoon [A type of illustration, sometimes animated, typically in a non-realistic or semi-realistic style. The specific meaning has evolved over time, but the modern usage usually refers to either an image or series of images intended for satire, caricature, or humor. A motion picture that relies on a sequence of illustrations for its animation.] +****** Drawing [A representation of an object or outlining a figure, plan, or sketch by means of lines.] +****** Icon [A sign (such as a word or graphic symbol) whose form suggests its meaning.] +****** Painting [A work produced through the art of painting.] +****** Photograph [An image recorded by a camera.] +***** Movie [A sequence of images displayed in succession giving the illusion of continuous movement.] +***** Outline-visualization [A visualization consisting of a line or set of lines enclosing or indicating the shape of an object in a sketch or diagram.] +***** Point-light-visualization [A display in which action is depicted using a few points of light, often generated from discrete sensors in motion capture.] +***** Sculpture [A two- or three-dimensional representative or abstract forms, especially by carving stone or wood or by casting metal or plaster.] +***** Stick-figure-visualization [A drawing showing the head of a human being or animal as a circle and all other parts as straight lines.] +*** Navigational-object [An object whose purpose is to assist directed movement from one location to another.] +**** Path [A trodden way. A way or track laid down for walking or made by continual treading.] +**** Road [An open way for the passage of vehicles, persons, or animals on land.] +***** Lane [A defined path with physical dimensions through which an object or substance may traverse.] +**** Runway [A paved strip of ground on a landing field for the landing and takeoff of aircraft.] +*** Vehicle [A mobile machine which transports people or cargo.] +**** Aircraft [A vehicle which is able to travel through air in an atmosphere.] +**** Bicycle [A human-powered, pedal-driven, single-track vehicle, having two wheels attached to a frame, one behind the other.] +**** Boat [A watercraft of any size which is able to float or plane on water.] +**** Car [A wheeled motor vehicle used primarily for the transportation of human passengers.] +**** Cart [A cart is a vehicle which has two wheels and is designed to transport human passengers or cargo.] +**** Tractor [A mobile machine specifically designed to deliver a high tractive effort at slow speeds, and mainly used for the purposes of hauling a trailer or machinery used in agriculture or construction.] +**** Train [A connected line of railroad cars with or without a locomotive.] +**** Truck [A motor vehicle which, as its primary funcion, transports cargo rather than human passangers.] +** Natural-object [Something that exists in or is produced by nature, and is not artificial or man-made.] +*** Mineral [A solid, homogeneous, inorganic substance occurring in nature and having a definite chemical composition.] +*** Natural-feature [A feature that occurs in nature. A prominent or identifiable aspect, region, or site of interest.] +**** Field [An unbroken expanse as of ice or grassland.] +**** Hill [A rounded elevation of limited extent rising above the surrounding land with local relief of less than 300m.] +**** Mountain [A landform that extends above the surrounding terrain in a limited area.] +**** River [A natural freshwater surface stream of considerable volume and a permanent or seasonal flow, moving in a definite channel toward a sea, lake, or another river.] +**** Waterfall [A sudden descent of water over a step or ledge in the bed of a river.] +* Sound [Mechanical vibrations transmitted by an elastic medium. Something that can be heard.] +** Environmental-sound [Sounds occuring in the environment. An accumulation of noise pollution that occurs outside. This noise can be caused by transport, industrial, and recreational activities.] +*** Crowd-sound [Noise produced by a mixture of sounds from a large group of people.] +*** Signal-noise [Any part of a signal that is not the true or original signal but is introduced by the communication mechanism.] +** Musical-sound [Sound produced by continuous and regular vibrations, as opposed to noise.] +*** Instrument-sound [Sound produced by a musical instrument.] +*** Tone [A musical note, warble, or other sound used as a particular signal on a telephone or answering machine.] +*** Vocalized-sound [Musical sound produced by vocal cords in a biological agent.] +** Named-animal-sound [A sound recognizable as being associated with particular animals.] +*** Barking [Sharp explosive cries like sounds made by certain animals, especially a dog, fox, or seal.] +*** Bleating [Wavering cries like sounds made by a sheep, goat, or calf.] +*** Chirping [Short, sharp, high-pitched noises like sounds made by small birds or an insects.] +*** Crowing [Loud shrill sounds characteristic of roosters.] +*** Growling [Low guttural sounds like those that made in the throat by a hostile dog or other animal.] +*** Meowing [Vocalizations like those made by as those cats. These sounds have diverse tones and are sometimes chattered, murmured or whispered. The purpose can be assertive.] +*** Mooing [Deep vocal sounds like those made by a cow.] +*** Purring [Low continuous vibratory sound such as those made by cats. The sound expresses contentment.] +*** Roaring [Loud, deep, or harsh prolonged sounds such as those made by big cats and bears for long-distance communication and intimidation.] +*** Squawking [Loud, harsh noises such as those made by geese.] +** Named-object-sound [A sound identifiable as coming from a particular type of object.] +*** Alarm-sound [A loud signal often loud continuous ringing to alert people to a problem or condition that requires urgent attention.] +*** Beep [A short, single tone, that is typically high-pitched and generally made by a computer or other machine.] +*** Buzz [A persistent vibratory sound often made by a buzzer device and used to indicate something incorrect.] +*** Click [The sound made by a mechanical cash register, often to designate a reward.] +*** Ding [A short ringing sound such as that made by a bell, often to indicate a correct response or the expiration of time.] +*** Horn-blow [A loud sound made by forcing air through a sound device that funnels air to create the sound, often used to sound an alert.] +*** Ka-ching [The sound made by a mechanical cash register, often to designate a reward.] +*** Siren [A loud, continuous sound often varying in frequency designed to indicate an emergency.] + +'''Property''' {extensionAllowed} [Something that pertains to a thing. A characteristic of some entity. A quality or feature regarded as a characteristic or inherent part of someone or something. HED attributes are adjectives or adverbs.] +* Agent-property {extensionAllowed} [Something that pertains to an agent.] +** Agent-state [The state of the agent.] +*** Agent-cognitive-state [The state of the cognitive processes or state of mind of the agent.] +**** Alert [Condition of heightened watchfulness or preparation for action.] +**** Anesthetized [Having lost sensation to pain or having senses dulled due to the effects of an anesthetic.] +**** Asleep [Having entered a periodic, readily reversible state of reduced awareness and metabolic activity, usually accompanied by physical relaxation and brain activity.] +**** Attentive [Concentrating and focusing mental energy on the task or surroundings.] +**** Awake [In a non sleeping state.] +**** Brain-dead [Characterized by the irreversible absence of cortical and brain stem functioning.] +**** Comatose [In a state of profound unconsciousness associated with markedly depressed cerebral activity.] +**** Distracted [Lacking in concentration because of being preoccupied.] +**** Drowsy [In a state of near-sleep, a strong desire for sleep, or sleeping for unusually long periods.] +**** Intoxicated [In a state with disturbed psychophysiological functions and responses as a result of administration or ingestion of a psychoactive substance.] +**** Locked-in [In a state of complete paralysis of all voluntary muscles except for the ones that control the movements of the eyes.] +**** Passive [Not responding or initiating an action in response to a stimulus.] +**** Resting [A state in which the agent is not exhibiting any physical exertion.] +**** Vegetative [A state of wakefulness and conscience, but (in contrast to coma) with involuntary opening of the eyes and movements (such as teeth grinding, yawning, or thrashing of the extremities).] +*** Agent-emotional-state [The status of the general temperament and outlook of an agent.] +**** Angry [Experiencing emotions characterized by marked annoyance or hostility.] +**** Aroused [In a state reactive to stimuli leading to increased heart rate and blood pressure, sensory alertness, mobility and readiness to respond.] +**** Awed [Filled with wonder. Feeling grand, sublime or powerful emotions characterized by a combination of joy, fear, admiration, reverence, and/or respect.] +**** Compassionate [Feeling or showing sympathy and concern for others often evoked for a person who is in distress and associated with altruistic motivation.] +**** Content [Feeling satisfaction with things as they are.] +**** Disgusted [Feeling revulsion or profound disapproval aroused by something unpleasant or offensive.] +**** Emotionally-neutral [Feeling neither satisfied nor dissatisfied.] +**** Empathetic [Understanding and sharing the feelings of another. Being aware of, being sensitive to, and vicariously experiencing the feelings, thoughts, and experience of another.] +**** Excited [Feeling great enthusiasm and eagerness.] +**** Fearful [Feeling apprehension that one may be in danger.] +**** Frustrated [Feeling annoyed as a result of being blocked, thwarted, disappointed or defeated.] +**** Grieving [Feeling sorrow in response to loss, whether physical or abstract.] +**** Happy [Feeling pleased and content.] +**** Jealous [Feeling threatened by a rival in a relationship with another individual, in particular an intimate partner, usually involves feelings of threat, fear, suspicion, distrust, anxiety, anger, betrayal, and rejection.] +**** Joyful [Feeling delight or intense happiness.] +**** Loving [Feeling a strong positive emotion of affection and attraction.] +**** Relieved [No longer feeling pain, distress, anxiety, or reassured.] +**** Sad [Feeling grief or unhappiness.] +**** Stressed [Experiencing mental or emotional strain or tension.] +*** Agent-physiological-state [Having to do with the mechanical, physical, or biochemical function of an agent.] +**** Healthy {relatedTag=Sick} [Having no significant health-related issues.] +**** Hungry {relatedTag=Sated, relatedTag=Thirsty} [Being in a state of craving or desiring food.] +**** Rested {relatedTag=Tired} [Feeling refreshed and relaxed.] +**** Sated {relatedTag=Hungry} [Feeling full.] +**** Sick {relatedTag=Healthy} [Being in a state of ill health, bodily malfunction, or discomfort.] +**** Thirsty {relatedTag=Hungry} [Feeling a need to drink.] +**** Tired {relatedTag=Rested} [Feeling in need of sleep or rest.] +*** Agent-postural-state [Pertaining to the position in which agent holds their body.] +**** Crouching [Adopting a position where the knees are bent and the upper body is brought forward and down, sometimes to avoid detection or to defend oneself.] +**** Eyes-closed [Keeping eyes closed with no blinking.] +**** Eyes-open [Keeping eyes open with occasional blinking.] +**** Kneeling [Positioned where one or both knees are on the ground.] +**** On-treadmill [Ambulation on an exercise apparatus with an endless moving belt to support moving in place.] +**** Prone [Positioned in a recumbent body position whereby the person lies on its stomach and faces downward.] +**** Seated-with-chin-rest [Using a device that supports the chin and head.] +**** Sitting [In a seated position.] +**** Standing [Assuming or maintaining an erect upright position.] +** Agent-task-role [The function or part that is ascribed to an agent in performing the task.] +*** Experiment-actor [An agent who plays a predetermined role to create the experiment scenario.] +*** Experiment-controller [An agent exerting control over some aspect of the experiment.] +*** Experiment-participant [Someone who takes part in an activity related to an experiment.] +*** Experimenter [Person who is the owner of the experiment and has its responsibility.] +** Agent-trait [A genetically, environmentally, or socially determined characteristic of an agent.] +*** Age [Length of time elapsed time since birth of the agent.] +**** # {takesValue, valueClass=numericClass} +*** Agent-experience-level [Amount of skill or knowledge that the agent has as pertains to the task.] +**** Expert-level {relatedTag=Intermediate-experience-level, relatedTag=Novice-level} [Having comprehensive and authoritative knowledge of or skill in a particular area related to the task.] +**** Intermediate-experience-level {relatedTag=Expert-level, relatedTag=Novice-level} [Having a moderate amount of knowledge or skill related to the task.] +**** Novice-level {relatedTag=Expert-level, relatedTag=Intermediate-experience-level} [Being inexperienced in a field or situation related to the task.] +*** Ethnicity [Belong to a social group that has a common national or cultural tradition. Use with Label to avoid extension.] +*** Gender [Characteristics that are socially constructed, including norms, behaviors, and roles based on sex.] +*** Handedness [Individual preference for use of a hand, known as the dominant hand.] +**** Ambidextrous [Having no overall dominance in the use of right or left hand or foot in the performance of tasks that require one hand or foot.] +**** Left-handed [Preference for using the left hand or foot for tasks requiring the use of a single hand or foot.] +**** Right-handed [Preference for using the right hand or foot for tasks requiring the use of a single hand or foot.] +*** Race [Belonging to a group sharing physical or social qualities as defined within a specified society. Use with Label to avoid extension.] +*** Sex [Physical properties or qualities by which male is distinguished from female.] +**** Female [Biological sex of an individual with female sexual organs such ova.] +**** Intersex [Having genitalia and/or secondary sexual characteristics of indeterminate sex.] +**** Male [Biological sex of an individual with male sexual organs producing sperm.] +* Data-property {extensionAllowed} [Something that pertains to data or information.] +** Data-marker [An indicator placed to mark something.] +*** Data-break-marker [An indicator place to indicate a gap in the data.] +*** Temporal-marker [An indicator placed at a particular time in the data.] +**** Inset {topLevelTagGroup, reserved, relatedTag=Onset, relatedTag=Offset} [Marks an intermediate point in an ongoing event of temporal extent.] +**** Offset {topLevelTagGroup, reserved, relatedTag=Onset, relatedTag=Inset} [Marks the end of an event of temporal extent.] +**** Onset {topLevelTagGroup, reserved, relatedTag=Inset, relatedTag=Offset} [Marks the start of an ongoing event of temporal extent.] +**** Pause [Indicates the temporary interruption of the operation a process and subsequently wait for a signal to continue.] +**** Time-out [A cancellation or cessation that automatically occurs when a predefined interval of time has passed without a certain event occurring.] +**** Time-sync [A synchronization signal whose purpose to help synchronize different signals or processes. Often used to indicate a marker inserted into the recorded data to allow post hoc synchronization of concurrently recorded data streams.] +** Data-resolution [Smallest change in a quality being measured by an sensor that causes a perceptible change.] +*** Printer-resolution [Resolution of a printer, usually expressed as the number of dots-per-inch for a printer.] +**** # {takesValue, valueClass=numericClass} +*** Screen-resolution [Resolution of a screen, usually expressed as the of pixels in a dimension for a digital display device.] +**** # {takesValue, valueClass=numericClass} +*** Sensory-resolution [Resolution of measurements by a sensing device.] +**** # {takesValue, valueClass=numericClass} +*** Spatial-resolution [Linear spacing of a spatial measurement.] +**** # {takesValue, valueClass=numericClass} +*** Spectral-resolution [Measures the ability of a sensor to resolve features in the electromagnetic spectrum.] +**** # {takesValue, valueClass=numericClass} +*** Temporal-resolution [Measures the ability of a sensor to resolve features in time.] +**** # {takesValue, valueClass=numericClass} +** Data-source-type [The type of place, person, or thing from which the data comes or can be obtained.] +*** Computed-feature [A feature computed from the data by a tool. This tag should be grouped with a label of the form Toolname_propertyName.] +*** Computed-prediction [A computed extrapolation of known data.] +*** Expert-annotation [An explanatory or critical comment or other in-context information provided by an authority.] +*** Instrument-measurement [Information obtained from a device that is used to measure material properties or make other observations.] +*** Observation [Active acquisition of information from a primary source. Should be grouped with a label of the form AgentID_featureName.] +** Data-value [Designation of the type of a data item.] +*** Categorical-value [Indicates that something can take on a limited and usually fixed number of possible values.] +**** Categorical-class-value [Categorical values that fall into discrete classes such as true or false. The grouping is absolute in the sense that it is the same for all participants.] +***** All {relatedTag=Some, relatedTag=None} [To a complete degree or to the full or entire extent.] +***** Correct {relatedTag=Wrong} [Free from error. Especially conforming to fact or truth.] +***** Explicit {relatedTag=Implicit} [Stated clearly and in detail, leaving no room for confusion or doubt.] +***** False {relatedTag=True} [Not in accordance with facts, reality or definitive criteria.] +***** Implicit {relatedTag=Explicit} [Implied though not plainly expressed.] +***** Invalid {relatedTag=Valid} [Not allowed or not conforming to the correct format or specifications.] +***** None {relatedTag=All, relatedTag=Some} [No person or thing, nobody, not any.] +***** Some {relatedTag=All, relatedTag=None} [At least a small amount or number of, but not a large amount of, or often.] +***** True {relatedTag=False} [Conforming to facts, reality or definitive criteria.] +***** Valid {relatedTag=Invalid} [Allowable, usable, or acceptable.] +***** Wrong {relatedTag=Correct} [Inaccurate or not correct.] +**** Categorical-judgment-value [Categorical values that are based on the judgment or perception of the participant such familiar and famous.] +***** Abnormal {relatedTag=Normal} [Deviating in any way from the state, position, structure, condition, behavior, or rule which is considered a norm.] +***** Asymmetrical {relatedTag=Symmetrical} [Lacking symmetry or having parts that fail to correspond to one another in shape, size, or arrangement.] +***** Audible {relatedTag=Inaudible} [A sound that can be perceived by the participant.] +***** Complex {relatedTag=Simple} [Hard, involved or complicated, elaborate, having many parts.] +***** Congruent {relatedTag=Incongruent} [Concordance of multiple evidence lines. In agreement or harmony.] +***** Constrained {relatedTag=Unconstrained} [Keeping something within particular limits or bounds.] +***** Disordered {relatedTag=Ordered} [Not neatly arranged. Confused and untidy. A structural quality in which the parts of an object are non-rigid.] +***** Familiar {relatedTag=Unfamiliar, relatedTag=Famous} [Recognized, familiar, or within the scope of knowledge.] +***** Famous {relatedTag=Familiar, relatedTag=Unfamiliar} [A person who has a high degree of recognition by the general population for his or her success or accomplishments. A famous person.] +***** Inaudible {relatedTag=Audible} [A sound below the threshold of perception of the participant.] +***** Incongruent {relatedTag=Congruent} [Not in agreement or harmony.] +***** Involuntary {relatedTag=Voluntary} [An action that is not made by choice. In the body, involuntary actions (such as blushing) occur automatically, and cannot be controlled by choice.] +***** Masked {relatedTag=Unmasked} [Information exists but is not provided or is partially obscured due to security, privacy, or other concerns.] +***** Normal {relatedTag=Abnormal} [Being approximately average or within certain limits. Conforming with or constituting a norm or standard or level or type or social norm.] +***** Ordered {relatedTag=Disordered} [Conforming to a logical or comprehensible arrangement of separate elements.] +***** Simple {relatedTag=Complex} [Easily understood or presenting no difficulties.] +***** Symmetrical {relatedTag=Asymmetrical} [Made up of exactly similar parts facing each other or around an axis. Showing aspects of symmetry.] +***** Unconstrained {relatedTag=Constrained} [Moving without restriction.] +***** Unfamiliar {relatedTag=Familiar, relatedTag=Famous} [Not having knowledge or experience of.] +***** Unmasked {relatedTag=Masked} [Information is revealed.] +***** Voluntary {relatedTag=Involuntary} [Using free will or design; not forced or compelled; controlled by individual volition.] +**** Categorical-level-value [Categorical values based on dividing a continuous variable into levels such as high and low.] +***** Cold {relatedTag=Hot} [Having an absence of heat.] +***** Deep {relatedTag=Shallow} [Extending relatively far inward or downward.] +***** High {relatedTag=Low, relatedTag=Medium} [Having a greater than normal degree, intensity, or amount.] +***** Hot {relatedTag=Cold} [Having an excess of heat.] +***** Large {relatedTag=Small} [Having a great extent such as in physical dimensions, period of time, amplitude or frequency.] +***** Liminal {relatedTag=Subliminal, relatedTag=Supraliminal} [Situated at a sensory threshold that is barely perceptible or capable of eliciting a response.] +***** Loud {relatedTag=Quiet} [Having a perceived high intensity of sound.] +***** Low {relatedTag=High} [Less than normal in degree, intensity or amount.] +***** Medium {relatedTag=Low, relatedTag=High} [Mid-way between small and large in number, quantity, magnitude or extent.] +***** Negative {relatedTag=Positive} [Involving disadvantage or harm.] +***** Positive {relatedTag=Negative} [Involving advantage or good.] +***** Quiet {relatedTag=Loud} [Characterizing a perceived low intensity of sound.] +***** Rough {relatedTag=Smooth} [Having a surface with perceptible bumps, ridges, or irregularities.] +***** Shallow {relatedTag=Deep} [Having a depth which is relatively low.] +***** Small {relatedTag=Large} [Having a small extent such as in physical dimensions, period of time, amplitude or frequency.] +***** Smooth {relatedTag=Rough} [Having a surface free from bumps, ridges, or irregularities.] +***** Subliminal {relatedTag=Liminal, relatedTag=Supraliminal} [Situated below a sensory threshold that is imperceptible or not capable of eliciting a response.] +***** Supraliminal {relatedTag=Liminal, relatedTag=Subliminal} [Situated above a sensory threshold that is perceptible or capable of eliciting a response.] +***** Thick {relatedTag=Thin} [Wide in width, extent or cross-section.] +***** Thin {relatedTag=Thick} [Narrow in width, extent or cross-section.] +**** Categorical-orientation-value [Value indicating the orientation or direction of something.] +***** Backward {relatedTag=Forward} [Directed behind or to the rear.] +***** Downward {relatedTag=Leftward, relatedTag=Rightward, relatedTag=Upward} [Moving or leading toward a lower place or level.] +***** Forward {relatedTag=Backward} [At or near or directed toward the front.] +***** Horizontally-oriented {relatedTag=Vertically-oriented} [Oriented parallel to or in the plane of the horizon.] +***** Leftward {relatedTag=Downward, relatedTag=Rightward, relatedTag=Upward} [Going toward or facing the left.] +***** Oblique {relatedTag=Rotated} [Slanting or inclined in direction, course, or position that is neither parallel nor perpendicular nor right-angular.] +***** Rightward {relatedTag=Downward, relatedTag=Leftward, relatedTag=Upward} [Going toward or situated on the right.] +***** Rotated [Positioned offset around an axis or center.] +***** Upward {relatedTag=Downward, relatedTag=Leftward, relatedTag=Rightward} [Moving, pointing, or leading to a higher place, point, or level.] +***** Vertically-oriented {relatedTag=Horizontally-oriented} [Oriented perpendicular to the plane of the horizon.] +*** Physical-value [The value of some physical property of something.] +**** Temperature [A measure of hot or cold based on the average kinetic energy of the atoms or molecules in the system.] +***** # {takesValue, valueClass=numericClass, unitClass=temperatureUnits} +**** Weight [The relative mass or the quantity of matter contained by something.] +***** # {takesValue, valueClass=numericClass, unitClass=weightUnits} +*** Quantitative-value [Something capable of being estimated or expressed with numeric values.] +**** Fraction [A numerical value between 0 and 1.] +***** # {takesValue, valueClass=numericClass} +**** Item-count [The integer count of something which is usually grouped with the entity it is counting. (Item-count/3, A) indicates that 3 of A have occurred up to this point.] +***** # {takesValue, valueClass=numericClass} +**** Item-index [The index of an item in a collection, sequence or other structure. (A (Item-index/3, B)) means that A is item number 3 in B.] +***** # {takesValue, valueClass=numericClass} +**** Item-interval [An integer indicating how many items or entities have passed since the last one of these. An item interval of 0 indicates the current item.] +***** # {takesValue, valueClass=numericClass} +**** Percentage [A fraction or ratio with 100 understood as the denominator.] +***** # {takesValue, valueClass=numericClass} +**** Ratio [A quotient of quantities of the same kind for different components within the same system.] +***** # {takesValue, valueClass=numericClass} +*** Spatiotemporal-value [A property relating to space and/or time.] +**** Rate-of-change [The amount of change accumulated per unit time.] +***** Acceleration [Magnitude of the rate of change in either speed or direction. The direction of change should be given separately.] +****** # {takesValue, valueClass=numericClass, unitClass=accelerationUnits} +***** Frequency [Frequency is the number of occurrences of a repeating event per unit time.] +****** # {takesValue, valueClass=numericClass, unitClass=frequencyUnits} +***** Jerk-rate [Magnitude of the rate at which the acceleration of an object changes with respect to time. The direction of change should be given separately.] +****** # {takesValue, valueClass=numericClass, unitClass=jerkUnits} +***** Refresh-rate [The frequency with which the image on a computer monitor or similar electronic display screen is refreshed, usually expressed in hertz.] +****** # {takesValue, valueClass=numericClass} +***** Sampling-rate [The number of digital samples taken or recorded per unit of time.] +****** # {takesValue, unitClass=frequencyUnits} +***** Speed [A scalar measure of the rate of movement of the object expressed either as the distance travelled divided by the time taken (average speed) or the rate of change of position with respect to time at a particular point (instantaneous speed). The direction of change should be given separately.] +****** # {takesValue, valueClass=numericClass, unitClass=speedUnits} +***** Temporal-rate [The number of items per unit of time.] +****** # {takesValue, valueClass=numericClass, unitClass=frequencyUnits} +**** Spatial-value [Value of an item involving space.] +***** Angle [The amount of inclination of one line to another or the plane of one object to another.] +****** # {takesValue, unitClass=angleUnits, valueClass=numericClass} +***** Distance [A measure of the space separating two objects or points.] +****** # {takesValue, valueClass=numericClass, unitClass=physicalLengthUnits} +***** Position [A reference to the alignment of an object, a particular situation or view of a situation, or the location of an object. Coordinates with respect a specified frame of reference or the default Screen-frame if no frame is given.] +****** X-position [The position along the x-axis of the frame of reference.] +******* # {takesValue, valueClass=numericClass, unitClass=physicalLengthUnits} +****** Y-position [The position along the y-axis of the frame of reference.] +******* # {takesValue, valueClass=numericClass, unitClass=physicalLengthUnits} +****** Z-position [The position along the z-axis of the frame of reference.] +******* # {takesValue, valueClass=numericClass, unitClass=physicalLengthUnits} +***** Size [The physical magnitude of something.] +****** Area [The extent of a 2-dimensional surface enclosed within a boundary.] +******* # {takesValue, valueClass=numericClass, unitClass=areaUnits} +****** Depth [The distance from the surface of something especially from the perspective of looking from the front.] +******* # {takesValue, valueClass=numericClass, unitClass=physicalLengthUnits} +****** Height [The vertical measurement or distance from the base to the top of an object.] +******* # {takesValue, valueClass=numericClass, unitClass=physicalLengthUnits} +****** Length [The linear extent in space from one end of something to the other end, or the extent of something from beginning to end.] +******* # {takesValue, valueClass=numericClass, unitClass=physicalLengthUnits} +****** Volume [The amount of three dimensional space occupied by an object or the capacity of a space or container.] +******* # {takesValue, valueClass=numericClass, unitClass=volumeUnits} +****** Width [The extent or measurement of something from side to side.] +******* # {takesValue, valueClass=numericClass, unitClass=physicalLengthUnits} +**** Temporal-value [A characteristic of or relating to time or limited by time.] +***** Delay {topLevelTagGroup, reserved, relatedTag=Duration} [The time at which an event start time is delayed from the current onset time. This tag defines the start time of an event of temporal extent and may be used with the Duration tag.] +****** # {takesValue, valueClass=numericClass, unitClass=timeUnits} +***** Duration {topLevelTagGroup, reserved, relatedTag=Delay} [The period of time during which an event occurs. This tag defines the end time of an event of temporal extent and may be used with the Delay tag.] +****** # {takesValue, valueClass=numericClass, unitClass=timeUnits} +***** Time-interval [The period of time separating two instances, events, or occurrences.] +****** # {takesValue, valueClass=numericClass, unitClass=timeUnits} +***** Time-value [A value with units of time. Usually grouped with tags identifying what the value represents.] +****** # {takesValue, valueClass=numericClass, unitClass=timeUnits} +*** Statistical-value {extensionAllowed} [A value based on or employing the principles of statistics.] +**** Data-maximum [The largest possible quantity or degree.] +***** # {takesValue, valueClass=numericClass} +**** Data-mean [The sum of a set of values divided by the number of values in the set.] +***** # {takesValue, valueClass=numericClass} +**** Data-median [The value which has an equal number of values greater and less than it.] +***** # {takesValue, valueClass=numericClass} +**** Data-minimum [The smallest possible quantity.] +***** # {takesValue, valueClass=numericClass} +**** Probability [A measure of the expectation of the occurrence of a particular event.] +***** # {takesValue, valueClass=numericClass} +**** Standard-deviation [A measure of the range of values in a set of numbers. Standard deviation is a statistic used as a measure of the dispersion or variation in a distribution, equal to the square root of the arithmetic mean of the squares of the deviations from the arithmetic mean.] +***** # {takesValue, valueClass=numericClass} +**** Statistical-accuracy [A measure of closeness to true value expressed as a number between 0 and 1.] +***** # {takesValue, valueClass=numericClass} +**** Statistical-precision [A quantitative representation of the degree of accuracy necessary for or associated with a particular action.] +***** # {takesValue, valueClass=numericClass} +**** Statistical-recall [Sensitivity is a measurement datum qualifying a binary classification test and is computed by substracting the false negative rate to the integral numeral 1.] +***** # {takesValue, valueClass=numericClass} +**** Statistical-uncertainty [A measure of the inherent variability of repeated observation measurements of a quantity including quantities evaluated by statistical methods and by other means.] +***** # {takesValue, valueClass=numericClass} +** Data-variability-attribute [An attribute describing how something changes or varies.] +*** Abrupt [Marked by sudden change.] +*** Constant [Continually recurring or continuing without interruption. Not changing in time or space.] +*** Continuous {relatedTag=Discrete, relatedTag=Discontinuous} [Uninterrupted in time, sequence, substance, or extent.] +*** Decreasing {relatedTag=Increasing} [Becoming smaller or fewer in size, amount, intensity, or degree.] +*** Deterministic {relatedTag=Random, relatedTag=Stochastic} [No randomness is involved in the development of the future states of the element.] +*** Discontinuous {relatedTag=Continuous} [Having a gap in time, sequence, substance, or extent.] +*** Discrete {relatedTag=Continuous, relatedTag=Discontinuous} [Constituting a separate entities or parts.] +*** Estimated-value [Something that has been calculated or measured approximately.] +*** Exact-value [A value that is viewed to the true value according to some standard.] +*** Flickering [Moving irregularly or unsteadily or burning or shining fitfully or with a fluctuating light.] +*** Fractal [Having extremely irregular curves or shapes for which any suitably chosen part is similar in shape to a given larger or smaller part when magnified or reduced to the same size.] +*** Increasing {relatedTag=Decreasing} [Becoming greater in size, amount, or degree.] +*** Random {relatedTag=Deterministic, relatedTag=Stochastic} [Governed by or depending on chance. Lacking any definite plan or order or purpose.] +*** Repetitive [A recurring action that is often non-purposeful.] +*** Stochastic {relatedTag=Deterministic, relatedTag=Random} [Uses a random probability distribution or pattern that may be analysed statistically but may not be predicted precisely to determine future states.] +*** Varying [Differing in size, amount, degree, or nature.] +* Environmental-property [Relating to or arising from the surroundings of an agent.] +** Augmented-reality [Using technology that enhances real-world experiences with computer-derived digital overlays to change some aspects of perception of the natural environment. The digital content is shown to the user through a smart device or glasses and responds to changes in the environment.] +** Indoors [Located inside a building or enclosure.] +** Motion-platform [A mechanism that creates the feelings of being in a real motion environment.] +** Outdoors [Any area outside a building or shelter.] +** Real-world [Located in a place that exists in real space and time under realistic conditions.] +** Rural [Of or pertaining to the country as opposed to the city.] +** Terrain [Characterization of the physical features of a tract of land.] +*** Composite-terrain [Tracts of land characterized by a mixure of physical features.] +*** Dirt-terrain [Tracts of land characterized by a soil surface and lack of vegetation.] +*** Grassy-terrain [Tracts of land covered by grass.] +*** Gravel-terrain [Tracts of land covered by a surface consisting a loose aggregation of small water-worn or pounded stones.] +*** Leaf-covered-terrain [Tracts of land covered by leaves and composited organic material.] +*** Muddy-terrain [Tracts of land covered by a liquid or semi-liquid mixture of water and some combination of soil, silt, and clay.] +*** Paved-terrain [Tracts of land covered with concrete, asphalt, stones, or bricks.] +*** Rocky-terrain [Tracts of land consisting or full of rock or rocks.] +*** Sloped-terrain [Tracts of land arranged in a sloping or inclined position.] +*** Uneven-terrain [Tracts of land that are not level, smooth, or regular.] +** Urban [Relating to, located in, or characteristic of a city or densely populated area.] +** Virtual-world [Using technology that creates immersive, computer-generated experiences that a person can interact with and navigate through. The digital content is generally delivered to the user through some type of headset and responds to changes in head position or through interaction with other types of sensors. Existing in a virtual setting such as a simulation or game environment.] +* Informational-property {extensionAllowed} [Something that pertains to a task.] +** Description {requireChild} [An explanation of what the tag group it is in means. If the description is at the top-level of an event string, the description applies to the event.] +*** # {takesValue, valueClass=textClass} +** ID {requireChild} [An alphanumeric name that identifies either a unique object or a unique class of objects. Here the object or class may be an idea, physical countable object (or class), or physical uncountable substance (or class).] +*** # {takesValue, valueClass=textClass} +** Label {requireChild} [A string of 20 or fewer characters identifying something. Labels usually refer to general classes of things while IDs refer to specific instances. A term that is associated with some entity. A brief description given for purposes of identification. An identifying or descriptive marker that is attached to an object.] +*** # {takesValue, valueClass=nameClass} +** Metadata [Data about data. Information that describes another set of data.] +*** CogAtlas [The Cognitive Atlas ID number of something.] +**** # {takesValue} +*** CogPo [The CogPO ID number of something.] +**** # {takesValue} +*** Creation-date {requireChild} [The date on which data creation of this element began.] +**** # {takesValue, valueClass=dateTimeClass} +*** Experimental-note [A brief written record about the experiment.] +**** # {takesValue, valueClass=textClass} +*** Library-name [Official name of a HED library.] +**** # {takesValue, valueClass=nameClass} +*** OBO-identifier [The identifier of a term in some Open Biology Ontology (OBO) ontology.] +**** # {takesValue, valueClass=nameClass} +*** Pathname [The specification of a node (file or directory) in a hierarchical file system, usually specified by listing the nodes top-down.] +**** # {takesValue} +*** Subject-identifier [A sequence of characters used to identify, name, or characterize a trial or study subject.] +**** # {takesValue} +*** Version-identifier [An alphanumeric character string that identifies a form or variant of a type or original.] +**** # {takesValue} [Usually is a semantic version.] +** Parameter [Something user-defined for this experiment.] +*** Parameter-label [The name of the parameter.] +**** # {takesValue, valueClass=nameClass} +*** Parameter-value [The value of the parameter.] +**** # {takesValue, valueClass=textClass} +* Organizational-property [Relating to an organization or the action of organizing something.] +** Collection [A tag designating a grouping of items such as in a set or list.] +*** # {takesValue, valueClass=nameClass} [Name of the collection.] +** Condition-variable [An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent variables or contrasts.] +*** # {takesValue, valueClass=nameClass} [Name of the condition variable.] +** Control-variable [An aspect of the experiment that is fixed throughout the study and usually is explicitly controlled.] +*** # {takesValue, valueClass=nameClass} [Name of the control variable.] +** Def {requireChild, reserved} [A HED-specific utility tag used with a defined name to represent the tags associated with that definition.] +*** # {takesValue, valueClass=nameClass} [Name of the definition.] +** Def-expand {requireChild, reserved, tagGroup} [A HED specific utility tag that is grouped with an expanded definition. The child value of the Def-expand is the name of the expanded definition.] +*** # {takesValue, valueClass=nameClass} +** Definition {requireChild, reserved, topLevelTagGroup} [A HED-specific utility tag whose child value is the name of the concept and the tag group associated with the tag is an English language explanation of a concept.] +*** # {takesValue, valueClass=nameClass} [Name of the definition.] +** Event-context {reserved, topLevelTagGroup, unique} [A special HED tag inserted as part of a top-level tag group to contain information about the interrelated conditions under which the event occurs. The event context includes information about other events that are ongoing when this event happens.] +** Event-stream [A special HED tag indicating that this event is a member of an ordered succession of events.] +*** # {takesValue, valueClass=nameClass} [Name of the event stream.] +** Experimental-intertrial [A tag used to indicate a part of the experiment between trials usually where nothing is happening.] +*** # {takesValue, valueClass=nameClass} [Optional label for the intertrial block.] +** Experimental-trial [Designates a run or execution of an activity, for example, one execution of a script. A tag used to indicate a particular organizational part in the experimental design often containing a stimulus-response pair or stimulus-response-feedback triad.] +*** # {takesValue, valueClass=nameClass} [Optional label for the trial (often a numerical string).] +** Indicator-variable [An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent variables.] +*** # {takesValue, valueClass=nameClass} [Name of the indicator variable.] +** Recording [A tag designating the data recording. Recording tags are usually have temporal scope which is the entire recording.] +*** # {takesValue, valueClass=nameClass} [Optional label for the recording.] +** Task [An assigned piece of work, usually with a time allotment. A tag used to indicate a linkage the structured activities performed as part of the experiment.] +*** # {takesValue, valueClass=nameClass} [Optional label for the task block.] +** Time-block [A tag used to indicate a contiguous time block in the experiment during which something is fixed or noted.] +*** # {takesValue, valueClass=nameClass} [Optional label for the task block.] +* Sensory-property [Relating to sensation or the physical senses.] +** Sensory-attribute [A sensory characteristic associated with another entity.] +*** Auditory-attribute [Pertaining to the sense of hearing.] +**** Loudness [Perceived intensity of a sound.] +***** # {takesValue, valueClass=numericClass, valueClass=nameClass} +**** Pitch [A perceptual property that allows the user to order sounds on a frequency scale.] +***** # {takesValue, valueClass=numericClass, unitClass=frequencyUnits} +**** Sound-envelope [Description of how a sound changes over time.] +***** Sound-envelope-attack [The time taken for initial run-up of level from nil to peak usually beginning when the key on a musical instrument is pressed.] +****** # {takesValue, valueClass=numericClass, unitClass=timeUnits} +***** Sound-envelope-decay [The time taken for the subsequent run down from the attack level to the designated sustain level.] +****** # {takesValue, valueClass=numericClass, unitClass=timeUnits} +***** Sound-envelope-release [The time taken for the level to decay from the sustain level to zero after the key is released.] +****** # {takesValue, valueClass=numericClass, unitClass=timeUnits} +***** Sound-envelope-sustain [The time taken for the main sequence of the sound duration, until the key is released.] +****** # {takesValue, valueClass=numericClass, unitClass=timeUnits} +**** Sound-volume [The sound pressure level (SPL) usually the ratio to a reference signal estimated as the lower bound of hearing.] +***** # {takesValue, valueClass=numericClass, unitClass=intensityUnits} +**** Timbre [The perceived sound quality of a singing voice or musical instrument.] +***** # {takesValue, valueClass=nameClass} +*** Gustatory-attribute [Pertaining to the sense of taste.] +**** Bitter [Having a sharp, pungent taste.] +**** Salty [Tasting of or like salt.] +**** Savory [Belonging to a taste that is salty or spicy rather than sweet.] +**** Sour [Having a sharp, acidic taste.] +**** Sweet [Having or resembling the taste of sugar.] +*** Olfactory-attribute [Having a smell.] +*** Somatic-attribute [Pertaining to the feelings in the body or of the nervous system.] +**** Pain [The sensation of discomfort, distress, or agony, resulting from the stimulation of specialized nerve endings.] +**** Stress [The negative mental, emotional, and physical reactions that occur when environmental stressors are perceived as exceeding the adaptive capacities of the individual.] +*** Tactile-attribute [Pertaining to the sense of touch.] +**** Tactile-pressure [Having a feeling of heaviness.] +**** Tactile-temperature [Having a feeling of hotness or coldness.] +**** Tactile-texture [Having a feeling of roughness.] +**** Tactile-vibration [Having a feeling of mechanical oscillation.] +*** Vestibular-attribute [Pertaining to the sense of balance or body position.] +*** Visual-attribute [Pertaining to the sense of sight.] +**** Color [The appearance of objects (or light sources) described in terms of perception of their hue and lightness (or brightness) and saturation.] +***** CSS-color [One of 140 colors supported by all browsers. For more details such as the color RGB or HEX values, check: https://www.w3schools.com/colors/colors_groups.asp.] +****** Blue-color [CSS color group.] +******* Blue [CSS-color 0x0000FF.] +******* CadetBlue [CSS-color 0x5F9EA0.] +******* CornflowerBlue [CSS-color 0x6495ED.] +******* DarkBlue [CSS-color 0x00008B.] +******* DeepSkyBlue [CSS-color 0x00BFFF.] +******* DodgerBlue [CSS-color 0x1E90FF.] +******* LightBlue [CSS-color 0xADD8E6.] +******* LightSkyBlue [CSS-color 0x87CEFA.] +******* LightSteelBlue [CSS-color 0xB0C4DE.] +******* MediumBlue [CSS-color 0x0000CD.] +******* MidnightBlue [CSS-color 0x191970.] +******* Navy [CSS-color 0x000080.] +******* PowderBlue [CSS-color 0xB0E0E6.] +******* RoyalBlue [CSS-color 0x4169E1.] +******* SkyBlue [CSS-color 0x87CEEB.] +******* SteelBlue [CSS-color 0x4682B4.] +****** Brown-color [CSS color group.] +******* Bisque [CSS-color 0xFFE4C4.] +******* BlanchedAlmond [CSS-color 0xFFEBCD.] +******* Brown [CSS-color 0xA52A2A.] +******* BurlyWood [CSS-color 0xDEB887.] +******* Chocolate [CSS-color 0xD2691E.] +******* Cornsilk [CSS-color 0xFFF8DC.] +******* DarkGoldenRod [CSS-color 0xB8860B.] +******* GoldenRod [CSS-color 0xDAA520.] +******* Maroon [CSS-color 0x800000.] +******* NavajoWhite [CSS-color 0xFFDEAD.] +******* Olive [CSS-color 0x808000.] +******* Peru [CSS-color 0xCD853F.] +******* RosyBrown [CSS-color 0xBC8F8F.] +******* SaddleBrown [CSS-color 0x8B4513.] +******* SandyBrown [CSS-color 0xF4A460.] +******* Sienna [CSS-color 0xA0522D.] +******* Tan [CSS-color 0xD2B48C.] +******* Wheat [CSS-color 0xF5DEB3.] +****** Cyan-color [CSS color group.] +******* Aqua [CSS-color 0x00FFFF.] +******* Aquamarine [CSS-color 0x7FFFD4.] +******* Cyan [CSS-color 0x00FFFF.] +******* DarkTurquoise [CSS-color 0x00CED1.] +******* LightCyan [CSS-color 0xE0FFFF.] +******* MediumTurquoise [CSS-color 0x48D1CC.] +******* PaleTurquoise [CSS-color 0xAFEEEE.] +******* Turquoise [CSS-color 0x40E0D0.] +****** Gray-color [CSS color group.] +******* Black [CSS-color 0x000000.] +******* DarkGray [CSS-color 0xA9A9A9.] +******* DarkSlateGray [CSS-color 0x2F4F4F.] +******* DimGray [CSS-color 0x696969.] +******* Gainsboro [CSS-color 0xDCDCDC.] +******* Gray [CSS-color 0x808080.] +******* LightGray [CSS-color 0xD3D3D3.] +******* LightSlateGray [CSS-color 0x778899.] +******* Silver [CSS-color 0xC0C0C0.] +******* SlateGray [CSS-color 0x708090.] +****** Green-color [CSS color group.] +******* Chartreuse [CSS-color 0x7FFF00.] +******* DarkCyan [CSS-color 0x008B8B.] +******* DarkGreen [CSS-color 0x006400.] +******* DarkOliveGreen [CSS-color 0x556B2F.] +******* DarkSeaGreen [CSS-color 0x8FBC8F.] +******* ForestGreen [CSS-color 0x228B22.] +******* Green [CSS-color 0x008000.] +******* GreenYellow [CSS-color 0xADFF2F.] +******* LawnGreen [CSS-color 0x7CFC00.] +******* LightGreen [CSS-color 0x90EE90.] +******* LightSeaGreen [CSS-color 0x20B2AA.] +******* Lime [CSS-color 0x00FF00.] +******* LimeGreen [CSS-color 0x32CD32.] +******* MediumAquaMarine [CSS-color 0x66CDAA.] +******* MediumSeaGreen [CSS-color 0x3CB371.] +******* MediumSpringGreen [CSS-color 0x00FA9A.] +******* OliveDrab [CSS-color 0x6B8E23.] +******* PaleGreen [CSS-color 0x98FB98.] +******* SeaGreen [CSS-color 0x2E8B57.] +******* SpringGreen [CSS-color 0x00FF7F.] +******* Teal [CSS-color 0x008080.] +******* YellowGreen [CSS-color 0x9ACD32.] +****** Orange-color [CSS color group.] +******* Coral [CSS-color 0xFF7F50.] +******* DarkOrange [CSS-color 0xFF8C00.] +******* Orange [CSS-color 0xFFA500.] +******* OrangeRed [CSS-color 0xFF4500.] +******* Tomato [CSS-color 0xFF6347.] +****** Pink-color [CSS color group.] +******* DeepPink [CSS-color 0xFF1493.] +******* HotPink [CSS-color 0xFF69B4.] +******* LightPink [CSS-color 0xFFB6C1.] +******* MediumVioletRed [CSS-color 0xC71585.] +******* PaleVioletRed [CSS-color 0xDB7093.] +******* Pink [CSS-color 0xFFC0CB.] +****** Purple-color [CSS color group.] +******* BlueViolet [CSS-color 0x8A2BE2.] +******* DarkMagenta [CSS-color 0x8B008B.] +******* DarkOrchid [CSS-color 0x9932CC.] +******* DarkSlateBlue [CSS-color 0x483D8B.] +******* DarkViolet [CSS-color 0x9400D3.] +******* Fuchsia [CSS-color 0xFF00FF.] +******* Indigo [CSS-color 0x4B0082.] +******* Lavender [CSS-color 0xE6E6FA.] +******* Magenta [CSS-color 0xFF00FF.] +******* MediumOrchid [CSS-color 0xBA55D3.] +******* MediumPurple [CSS-color 0x9370DB.] +******* MediumSlateBlue [CSS-color 0x7B68EE.] +******* Orchid [CSS-color 0xDA70D6.] +******* Plum [CSS-color 0xDDA0DD.] +******* Purple [CSS-color 0x800080.] +******* RebeccaPurple [CSS-color 0x663399.] +******* SlateBlue [CSS-color 0x6A5ACD.] +******* Thistle [CSS-color 0xD8BFD8.] +******* Violet [CSS-color 0xEE82EE.] +****** Red-color [CSS color group.] +******* Crimson [CSS-color 0xDC143C.] +******* DarkRed [CSS-color 0x8B0000.] +******* DarkSalmon [CSS-color 0xE9967A.] +******* FireBrick [CSS-color 0xB22222.] +******* IndianRed [CSS-color 0xCD5C5C.] +******* LightCoral [CSS-color 0xF08080.] +******* LightSalmon [CSS-color 0xFFA07A.] +******* Red [CSS-color 0xFF0000.] +******* Salmon [CSS-color 0xFA8072.] +****** White-color [CSS color group.] +******* AliceBlue [CSS-color 0xF0F8FF.] +******* AntiqueWhite [CSS-color 0xFAEBD7.] +******* Azure [CSS-color 0xF0FFFF.] +******* Beige [CSS-color 0xF5F5DC.] +******* FloralWhite [CSS-color 0xFFFAF0.] +******* GhostWhite [CSS-color 0xF8F8FF.] +******* HoneyDew [CSS-color 0xF0FFF0.] +******* Ivory [CSS-color 0xFFFFF0.] +******* LavenderBlush [CSS-color 0xFFF0F5.] +******* Linen [CSS-color 0xFAF0E6.] +******* MintCream [CSS-color 0xF5FFFA.] +******* MistyRose [CSS-color 0xFFE4E1.] +******* OldLace [CSS-color 0xFDF5E6.] +******* SeaShell [CSS-color 0xFFF5EE.] +******* Snow [CSS-color 0xFFFAFA.] +******* White [CSS-color 0xFFFFFF.] +******* WhiteSmoke [CSS-color 0xF5F5F5.] +****** Yellow-color [CSS color group.] +******* DarkKhaki [CSS-color 0xBDB76B.] +******* Gold [CSS-color 0xFFD700.] +******* Khaki [CSS-color 0xF0E68C.] +******* LemonChiffon [CSS-color 0xFFFACD.] +******* LightGoldenRodYellow [CSS-color 0xFAFAD2.] +******* LightYellow [CSS-color 0xFFFFE0.] +******* Moccasin [CSS-color 0xFFE4B5.] +******* PaleGoldenRod [CSS-color 0xEEE8AA.] +******* PapayaWhip [CSS-color 0xFFEFD5.] +******* PeachPuff [CSS-color 0xFFDAB9.] +******* Yellow [CSS-color 0xFFFF00.] +***** Color-shade [A slight degree of difference between colors, especially with regard to how light or dark it is or as distinguished from one nearly like it.] +****** Dark-shade [A color tone not reflecting much light.] +****** Light-shade [A color tone reflecting more light.] +***** Grayscale [Using a color map composed of shades of gray, varying from black at the weakest intensity to white at the strongest.] +****** # {takesValue, valueClass=numericClass} [White intensity between 0 and 1.] +***** HSV-color [A color representation that models how colors appear under light.] +****** HSV-value [An attribute of a visual sensation according to which an area appears to emit more or less light.] +******* # {takesValue, valueClass=numericClass} +****** Hue [Attribute of a visual sensation according to which an area appears to be similar to one of the perceived colors.] +******* # {takesValue, valueClass=numericClass} [Angular value between 0 and 360.] +****** Saturation [Colorfulness of a stimulus relative to its own brightness.] +******* # {takesValue, valueClass=numericClass} [B value of RGB between 0 and 1.] +***** RGB-color [A color from the RGB schema.] +****** RGB-blue [The blue component.] +******* # {takesValue, valueClass=numericClass} [B value of RGB between 0 and 1.] +****** RGB-green [The green component.] +******* # {takesValue, valueClass=numericClass} [G value of RGB between 0 and 1.] +****** RGB-red [The red component.] +******* # {takesValue, valueClass=numericClass} [R value of RGB between 0 and 1.] +**** Luminance [A quality that exists by virtue of the luminous intensity per unit area projected in a given direction.] +**** Opacity [A measure of impenetrability to light.] +** Sensory-presentation [The entity has a sensory manifestation.] +*** Auditory-presentation [The sense of hearing is used in the presentation to the user.] +**** Loudspeaker-separation {suggestedTag=Distance} [The distance between two loudspeakers. Grouped with the Distance tag.] +**** Monophonic [Relating to sound transmission, recording, or reproduction involving a single transmission path.] +**** Silent [The absence of ambient audible sound or the state of having ceased to produce sounds.] +**** Stereophonic [Relating to, or constituting sound reproduction involving the use of separated microphones and two transmission channels to achieve the sound separation of a live hearing.] +*** Gustatory-presentation [The sense of taste used in the presentation to the user.] +*** Olfactory-presentation [The sense of smell used in the presentation to the user.] +*** Somatic-presentation [The nervous system is used in the presentation to the user.] +*** Tactile-presentation [The sense of touch used in the presentation to the user.] +*** Vestibular-presentation [The sense balance used in the presentation to the user.] +*** Visual-presentation [The sense of sight used in the presentation to the user.] +**** 2D-view [A view showing only two dimensions.] +**** 3D-view [A view showing three dimensions.] +**** Background-view [Parts of the view that are farthest from the viewer and usually the not part of the visual focus.] +**** Bistable-view [Something having two stable visual forms that have two distinguishable stable forms as in optical illusions.] +**** Foreground-view [Parts of the view that are closest to the viewer and usually the most important part of the visual focus.] +**** Foveal-view [Visual presentation directly on the fovea. A view projected on the small depression in the retina containing only cones and where vision is most acute.] +**** Map-view [A diagrammatic representation of an area of land or sea showing physical features, cities, roads.] +***** Aerial-view [Elevated view of an object from above, with a perspective as though the observer were a bird.] +***** Satellite-view [A representation as captured by technology such as a satellite.] +***** Street-view [A 360-degrees panoramic view from a position on the ground.] +**** Peripheral-view [Indirect vision as it occurs outside the point of fixation.] +* Task-property {extensionAllowed} [Something that pertains to a task.] +** Task-action-type [How an agent action should be interpreted in terms of the task specification.] +*** Appropriate-action {relatedTag=Inappropriate-action} [An action suitable or proper in the circumstances.] +*** Correct-action {relatedTag=Incorrect-action, relatedTag=Indeterminate-action} [An action that was a correct response in the context of the task.] +*** Correction [An action offering an improvement to replace a mistake or error.] +*** Done-indication {relatedTag=Ready-indication} [An action that indicates that the participant has completed this step in the task.] +*** Imagined-action [Form a mental image or concept of something. This is used to identity something that only happened in the imagination of the participant as in imagined movements in motor imagery paradigms.] +*** Inappropriate-action {relatedTag=Appropriate-action} [An action not in keeping with what is correct or proper for the task.] +*** Incorrect-action {relatedTag=Correct-action, relatedTag=Indeterminate-action} [An action considered wrong or incorrect in the context of the task.] +*** Indeterminate-action {relatedTag=Correct-action, relatedTag=Incorrect-action, relatedTag=Miss, relatedTag=Near-miss} [An action that cannot be distinguished between two or more possibibities in the current context. This tag might be applied when an outside evaluator or a classification algorithm cannot determine a definitive result.] +*** Miss {relatedTag=Near-miss} [An action considered to be a failure in the context of the task. For example, if the agent is supposed to try to hit a target and misses.] +*** Near-miss {relatedTag=Miss} [An action barely satisfied the requirements of the task. In a driving experiment for example this could pertain to a narrowly avoided collision or other accident.] +*** Omitted-action [An expected response was skipped.] +*** Ready-indication {relatedTag=Done-indication} [An action that indicates that the participant is ready to perform the next step in the task.] +** Task-attentional-demand [Strategy for allocating attention toward goal-relevant information.] +*** Bottom-up-attention {relatedTag=Top-down-attention} [Attentional guidance purely by externally driven factors to stimuli that are salient because of their inherent properties relative to the background. Sometimes this is referred to as stimulus driven.] +*** Covert-attention {relatedTag=Overt-attention} [Paying attention without moving the eyes.] +*** Divided-attention {relatedTag=Focused-attention} [Integrating parallel multiple stimuli. Behavior involving responding simultaneously to multiple tasks or multiple task demands.] +*** Focused-attention {relatedTag=Divided-attention} [Responding discretely to specific visual, auditory, or tactile stimuli.] +*** Orienting-attention [Directing attention to a target stimulus.] +*** Overt-attention {relatedTag=Covert-attention} [Selectively processing one location over others by moving the eyes to point at that location.] +*** Selective-attention [Maintaining a behavioral or cognitive set in the face of distracting or competing stimuli. Ability to pay attention to a limited array of all available sensory information.] +*** Sustained-attention [Maintaining a consistent behavioral response during continuous and repetitive activity.] +*** Switched-attention [Having to switch attention between two or more modalities of presentation.] +*** Top-down-attention {relatedTag=Bottom-up-attention} [Voluntary allocation of attention to certain features. Sometimes this is referred to goal-oriented attention.] +** Task-effect-evidence [The evidence supporting the conclusion that the event had the specified effect.] +*** Behavioral-evidence [An indication or conclusion based on the behavior of an agent.] +*** Computational-evidence [A type of evidence in which data are produced, and/or generated, and/or analyzed on a computer.] +*** External-evidence [A phenomenon that follows and is caused by some previous phenomenon.] +*** Intended-effect [A phenomenon that is intended to follow and be caused by some previous phenomenon.] +** Task-event-role [The purpose of an event with respect to the task.] +*** Experimental-stimulus [Part of something designed to elicit a response in the experiment.] +*** Incidental [A sensory or other type of event that is unrelated to the task or experiment.] +*** Instructional [Usually associated with a sensory event intended to give instructions to the participant about the task or behavior.] +*** Mishap [Unplanned disruption such as an equipment or experiment control abnormality or experimenter error.] +*** Participant-response [Something related to a participant actions in performing the task.] +*** Task-activity [Something that is part of the overall task or is necessary to the overall experiment but is not directly part of a stimulus-response cycle. Examples would be taking a survey or provided providing a silva sample.] +*** Warning [Something that should warn the participant that the parameters of the task have been or are about to be exceeded such as a warning message about getting too close to the shoulder of the road in a driving task.] +** Task-relationship [Specifying organizational importance of sub-tasks.] +*** Background-subtask [A part of the task which should be performed in the background as for example inhibiting blinks due to instruction while performing the primary task.] +*** Primary-subtask [A part of the task which should be the primary focus of the participant.] +** Task-stimulus-role [The role the stimulus plays in the task.] +*** Cue [A signal for an action, a pattern of stimuli indicating a particular response.] +*** Distractor [A person or thing that distracts or a plausible but incorrect option in a multiple-choice question. In pyschological studies this is sometimes referred to as a foil.] +*** Expected {relatedTag=Unexpected, suggestedTag=Target} [Considered likely, probable or anticipated. Something of low information value as in frequent non-targets in an RSVP paradigm.] +*** Extraneous [Irrelevant or unrelated to the subject being dealt with.] +*** Feedback [An evaluative response to an inquiry, process, event, or activity.] +*** Go-signal {relatedTag=Stop-signal} [An indicator to proceed with a planned action.] +*** Meaningful [Conveying significant or relevant information.] +*** Newly-learned [Representing recently acquired information or understanding.] +*** Non-informative [Something that is not useful in forming an opinion or judging an outcome.] +*** Non-target {relatedTag=Target} [Something other than that done or looked for. Also tag Expected if the Non-target is frequent.] +*** Not-meaningful [Not having a serious, important, or useful quality or purpose.] +*** Novel [Having no previous example or precedent or parallel.] +*** Oddball {relatedTag=Unexpected, suggestedTag=Target} [Something unusual, or infrequent.] +*** Penalty [A disadvantage, loss, or hardship due to some action.] +*** Planned {relatedTag=Unplanned} [Something that was decided on or arranged in advance.] +*** Priming [An implicit memory effect in which exposure to a stimulus influences response to a later stimulus.] +*** Query [A sentence of inquiry that asks for a reply.] +*** Reward [A positive reinforcement for a desired action, behavior or response.] +*** Stop-signal {relatedTag=Go-signal} [An indicator that the agent should stop the current activity.] +*** Target [Something fixed as a goal, destination, or point of examination.] +*** Threat [An indicator that signifies hostility and predicts an increased probability of attack.] +*** Timed [Something planned or scheduled to be done at a particular time or lasting for a specified amount of time.] +*** Unexpected {relatedTag=Expected} [Something that is not anticipated.] +*** Unplanned {relatedTag=Planned} [Something that has not been planned as part of the task.] + +'''Relation''' {extensionAllowed} [Concerns the way in which two or more people or things are connected.] +* Comparative-relation [Something considered in comparison to something else. The first entity is the focus.] +** Approximately-equal-to [(A, (Approximately-equal-to, B)) indicates that A and B have almost the same value. Here A and B could refer to sizes, orders, positions or other quantities.] +** Equal-to [(A, (Equal-to, B)) indicates that the size or order of A is the same as that of B.] +** Greater-than [(A, (Greater-than, B)) indicates that the relative size or order of A is bigger than that of B.] +** Greater-than-or-equal-to [(A, (Greater-than-or-equal-to, B)) indicates that the relative size or order of A is bigger than or the same as that of B.] +** Less-than [(A, (Less-than, B)) indicates that A is smaller than B. Here A and B could refer to sizes, orders, positions or other quantities.] +** Less-than-or-equal-to [(A, (Less-than-or-equal-to, B)) indicates that the relative size or order of A is smaller than or equal to B.] +** Not-equal-to [(A, (Not-equal-to, B)) indicates that the size or order of A is not the same as that of B.] +* Connective-relation [Indicates two entities are related in some way. The first entity is the focus.] +** Belongs-to [(A, (Belongs-to, B)) indicates that A is a member of B.] +** Connected-to [(A, (Connected-to, B)) indicates that A is related to B in some respect, usually through a direct link.] +** Contained-in [(A, (Contained-in, B)) indicates that A is completely inside of B.] +** Described-by [(A, (Described-by, B)) indicates that B provides information about A.] +** From-to [(A, (From-to, B)) indicates a directional relation from A to B. A is considered the source.] +** Group-of [(A, (Group-of, B)) indicates A is a group of items of type B.] +** Implied-by [(A, (Implied-by, B)) indicates B is suggested by A.] +** Includes [(A, (Includes, B)) indicates that A has B as a member or part.] +** Interacts-with [(A, (Interacts-with, B)) indicates A and B interact, possibly reciprocally.] +** Member-of [(A, (Member-of, B)) indicates A is a member of group B.] +** Part-of [(A, (Part-of, B)) indicates A is a part of the whole B.] +** Performed-by [(A, (Performed-by, B)) indicates that the action or procedure A was carried out by agent B.] +** Performed-using [(A, (Performed-using, B)) indicates that the action or procedure A was accomplished using B.] +** Related-to [(A, (Related-to, B)) indicates A has some relationship to B.] +** Unrelated-to [(A, (Unrelated-to, B)) indicates that A is not related to B. For example, A is not related to Task.] +* Directional-relation [A relationship indicating direction of change of one entity relative to another. The first entity is the focus.] +** Away-from [(A, (Away-from, B)) indicates that A is going or has moved away from B. The meaning depends on A and B.] +** Towards [(A, (Towards, B)) indicates that A is going to or has moved to B. The meaning depends on A and B.] +* Logical-relation [Indicating a logical relationship between entities. The first entity is usually the focus.] +** And [(A, (And, B)) means A and B are both in effect.] +** Or [(A, (Or, B)) means at least one of A and B are in effect.] +* Spatial-relation [Indicating a relationship about position between entities.] +** Above [(A, (Above, B)) means A is in a place or position that is higher than B.] +** Across-from [(A, (Across-from, B)) means A is on the opposite side of something from B.] +** Adjacent-to [(A, (Adjacent-to, B)) indicates that A is next to B in time or space.] +** Ahead-of [(A, (Ahead-of, B)) indicates that A is further forward in time or space in B.] +** Around [(A, (Around, B)) means A is in or near the present place or situation of B.] +** Behind [(A, (Behind, B)) means A is at or to the far side of B, typically so as to be hidden by it.] +** Below [(A, (Below, B)) means A is in a place or position that is lower than the position of B.] +** Between [(A, (Between, (B, C))) means A is in the space or interval separating B and C.] +** Bilateral-to [(A, (Bilateral, B)) means A is on both sides of B or affects both sides of B.] +** Bottom-edge-of {relatedTag=Left-edge-of, relatedTag=Right-edge-of, relatedTag=Top-edge-of} [(A, (Bottom-edge-of, B)) means A is on the bottom most part or or near the boundary of B.] +** Boundary-of [(A, (Boundary-of, B)) means A is on or part of the edge or boundary of B.] +** Center-of [(A, (Center-of, B)) means A is at a point or or in an area that is approximately central within B.] +** Close-to [(A, (Close-to, B)) means A is at a small distance from or is located near in space to B.] +** Far-from [(A, (Far-from, B)) means A is at a large distance from or is not located near in space to B.] +** In-front-of [(A, (In-front-of, B)) means A is in a position just ahead or at the front part of B, potentially partially blocking B from view.] +** Left-edge-of {relatedTag=Bottom-edge-of, relatedTag=Right-edge-of, relatedTag=Top-edge-of} [(A, (Left-edge-of, B)) means A is located on the left side of B on or near the boundary of B.] +** Left-side-of {relatedTag=Right-side-of} [(A, (Left-side-of, B)) means A is located on the left side of B usually as part of B.] +** Lower-center-of {relatedTag=Center-of, relatedTag=Lower-left-of, relatedTag=Lower-right-of, relatedTag=Upper-center-of, relatedTag=Upper-right-of} [(A, (Lower-center-of, B)) means A is situated on the lower center part of B (due south). This relation is often used to specify qualitative information about screen position.] +** Lower-left-of {relatedTag=Center-of, relatedTag=Lower-center-of, relatedTag=Lower-right-of, relatedTag=Upper-center-of, relatedTag=Upper-left-of, relatedTag=Upper-right-of} [(A, (Lower-left-of, B)) means A is situated on the lower left part of B. This relation is often used to specify qualitative information about screen position.] +** Lower-right-of {relatedTag=Center-of, relatedTag=Lower-center-of, relatedTag=Lower-left-of, relatedTag=Upper-left-of, relatedTag=Upper-center-of, relatedTag=Upper-left-of, relatedTag=Lower-right-of} [(A, (Lower-right-of, B)) means A is situated on the lower right part of B. This relation is often used to specify qualitative information about screen position.] +** Outside-of [(A, (Outside-of, B)) means A is located in the space around but not including B.] +** Over [(A, (Over, B)) means A above is above B so as to cover or protect or A extends over the a general area as from a from a vantage point.] +** Right-edge-of {relatedTag=Bottom-edge-of, relatedTag=Left-edge-of, relatedTag=Top-edge-of} [(A, (Right-edge-of, B)) means A is located on the right side of B on or near the boundary of B.] +** Right-side-of {relatedTag=Left-side-of} [(A, (Right-side-of, B)) means A is located on the right side of B usually as part of B.] +** To-left-of [(A, (To-left-of, B)) means A is located on or directed toward the side to the west of B when B is facing north. This term is used when A is not part of B.] +** To-right-of [(A, (To-right-of, B)) means A is located on or directed toward the side to the east of B when B is facing north. This term is used when A is not part of B.] +** Top-edge-of {relatedTag=Left-edge-of, relatedTag=Right-edge-of, relatedTag=Bottom-edge-of} [(A, (Top-edge-of, B)) means A is on the uppermost part or or near the boundary of B.] +** Top-of [(A, (Top-of, B)) means A is on the uppermost part, side, or surface of B.] +** Underneath [(A, (Underneath, B)) means A is situated directly below and may be concealed by B.] +** Upper-center-of {relatedTag=Center-of, relatedTag=Lower-center-of, relatedTag=Lower-left-of, relatedTag=Lower-right-of, relatedTag=Upper-center-of, relatedTag=Upper-right-of} [(A, (Upper-center-of, B)) means A is situated on the upper center part of B (due north). This relation is often used to specify qualitative information about screen position.] +** Upper-left-of {relatedTag=Center-of, relatedTag=Lower-center-of, relatedTag=Lower-left-of, relatedTag=Lower-right-of, relatedTag=Upper-center-of, relatedTag=Upper-right-of} [(A, (Upper-left-of, B)) means A is situated on the upper left part of B. This relation is often used to specify qualitative information about screen position.] +** Upper-right-of {relatedTag=Center-of, relatedTag=Lower-center-of, relatedTag=Lower-left-of, relatedTag=Upper-left-of, relatedTag=Upper-center-of, relatedTag=Lower-right-of} [(A, (Upper-right-of, B)) means A is situated on the upper right part of B. This relation is often used to specify qualitative information about screen position.] +** Within [(A, (Within, B)) means A is on the inside of or contained in B.] +* Temporal-relation [A relationship that includes a temporal or time-based component.] +** After [(A, (After B)) means A happens at a time subsequent to a reference time related to B.] +** Asynchronous-with [(A, (Asynchronous-with, B)) means A happens at times not occurring at the same time or having the same period or phase as B.] +** Before [(A, (Before B)) means A happens at a time earlier in time or order than B.] +** During [(A, (During, B)) means A happens at some point in a given period of time in which B is ongoing.] +** Synchronous-with [(A, (Synchronous-with, B)) means A happens at occurs at the same time or rate as B.] +** Waiting-for [(A, (Waiting-for, B)) means A pauses for something to happen in B.] + + +!# end schema + +'''Unit classes''' +* accelerationUnits {defaultUnits=m-per-s^2} +** m-per-s^2 {SIUnit, unitSymbol, conversionFactor=1.0} +* angleUnits {defaultUnits=radian} +** radian {SIUnit, conversionFactor=1.0} +** rad {SIUnit, unitSymbol, conversionFactor=1.0} +** degree {conversionFactor=0.0174533} +* areaUnits {defaultUnits=m^2} +** m^2 {SIUnit, unitSymbol, conversionFactor=1.0} +* currencyUnits {defaultUnits=$} [Units indicating the worth of something.] +** dollar {conversionFactor=1.0} +** $ {unitPrefix, unitSymbol, conversionFactor=1.0} +** euro +** point +* electricPotentialUnits {defaultUnits=uv} +** v {SIUnit, unitSymbol, conversionFactor=0.000001} +** Volt {SIUnit, conversionFactor=0.000001} +* frequencyUnits {defaultUnits=Hz} +** hertz {SIUnit, conversionFactor=1.0} +** Hz {SIUnit, unitSymbol, conversionFactor=1.0} +* intensityUnits {defaultUnits=dB} +** dB {unitSymbol, conversionFactor=1.0} [Intensity expressed as ratio to a threshold. May be used for sound intensity.] +** candela {SIUnit} [Units used to express light intensity.] +** cd {SIUnit, unitSymbol} [Units used to express light intensity.] +* jerkUnits {defaultUnits=m-per-s^3} +** m-per-s^3 {unitSymbol, conversionFactor=1.0} +* magneticFieldUnits {defaultUnits=fT} [Units used to magnetic field intensity.] +** tesla {SIUnit, conversionFactor=10^-15} +** T {SIUnit, unitSymbol, conversionFactor=10^-15} +* memorySizeUnits {defaultUnits=B} +** byte {SIUnit, conversionFactor=1.0} +** B {SIUnit, unitSymbol, conversionFactor=1.0} +* physicalLengthUnits {defaultUnits=m} +** foot {conversionFactor=0.3048} +** inch {conversionFactor=0.0254} +** meter {SIUnit, conversionFactor=1.0} +** metre {SIUnit, conversionFactor=1.0} +** m {SIUnit, unitSymbol, conversionFactor=1.0} +** mile {conversionFactor=1609.34} +* speedUnits {defaultUnits=m-per-s} +** m-per-s {SIUnit, unitSymbol, conversionFactor=1.0} +** mph {unitSymbol, conversionFactor=0.44704} +** kph {unitSymbol, conversionFactor=0.277778} +* temperatureUnits +** degree Celsius {SIUnit, conversionFactor=1.0} +** oC {SIUnit, unitSymbol, conversionFactor=1.0} +* timeUnits {defaultUnits=s} +** second {SIUnit, conversionFactor=1.0} +** s {SIUnit, unitSymbol, conversionFactor=1.0} +** day {conversionFactor=86400} +** minute {conversionFactor=60} +** hour {conversionFactor=3600} [Should be in 24-hour format.] +* volumeUnits {defaultUnits=m^3} +** m^3 {SIUnit, unitSymbol, conversionFactor=1.0} +* weightUnits {defaultUnits=g} +** g {SIUnit, unitSymbol, conversionFactor=1.0} +** gram {SIUnit, conversionFactor=1.0} +** pound {conversionFactor=453.592} +** lb {conversionFactor=453.592} + +'''Unit modifiers''' +* deca {SIUnitModifier, conversionFactor=10.0} [SI unit multiple representing 10^1.] +* da {SIUnitSymbolModifier, conversionFactor=10.0} [SI unit multiple representing 10^1.] +* hecto {SIUnitModifier, conversionFactor=100.0} [SI unit multiple representing 10^2.] +* h {SIUnitSymbolModifier, conversionFactor=100.0} [SI unit multiple representing 10^2.] +* kilo {SIUnitModifier, conversionFactor=1000.0} [SI unit multiple representing 10^3.] +* k {SIUnitSymbolModifier, conversionFactor=1000.0} [SI unit multiple representing 10^3.] +* mega {SIUnitModifier, conversionFactor=10^6} [SI unit multiple representing 10^6.] +* M {SIUnitSymbolModifier, conversionFactor=10^6} [SI unit multiple representing 10^6.] +* giga {SIUnitModifier, conversionFactor=10^9} [SI unit multiple representing 10^9.] +* G {SIUnitSymbolModifier, conversionFactor=10^9} [SI unit multiple representing 10^9.] +* tera {SIUnitModifier, conversionFactor=10^12} [SI unit multiple representing 10^12.] +* T {SIUnitSymbolModifier, conversionFactor=10^12} [SI unit multiple representing 10^12.] +* peta {SIUnitModifier, conversionFactor=10^15} [SI unit multiple representing 10^15.] +* P {SIUnitSymbolModifier, conversionFactor=10^15} [SI unit multiple representing 10^15.] +* exa {SIUnitModifier, conversionFactor=10^18} [SI unit multiple representing 10^18.] +* E {SIUnitSymbolModifier, conversionFactor=10^18} [SI unit multiple representing 10^18.] +* zetta {SIUnitModifier, conversionFactor=10^21} [SI unit multiple representing 10^21.] +* Z {SIUnitSymbolModifier, conversionFactor=10^21} [SI unit multiple representing 10^21.] +* yotta {SIUnitModifier, conversionFactor=10^24} [SI unit multiple representing 10^24.] +* Y {SIUnitSymbolModifier, conversionFactor=10^24} [SI unit multiple representing 10^24.] +* deci {SIUnitModifier, conversionFactor=0.1} [SI unit submultiple representing 10^-1.] +* d {SIUnitSymbolModifier, conversionFactor=0.1} [SI unit submultiple representing 10^-1.] +* centi {SIUnitModifier, conversionFactor=0.01} [SI unit submultiple representing 10^-2.] +* c {SIUnitSymbolModifier, conversionFactor=0.01} [SI unit submultiple representing 10^-2.] +* milli {SIUnitModifier, conversionFactor=0.001} [SI unit submultiple representing 10^-3.] +* m {SIUnitSymbolModifier, conversionFactor=0.001} [SI unit submultiple representing 10^-3.] +* micro {SIUnitModifier, conversionFactor=10^-6} [SI unit submultiple representing 10^-6.] +* u {SIUnitSymbolModifier, conversionFactor=10^-6} [SI unit submultiple representing 10^-6.] +* nano {SIUnitModifier, conversionFactor=10^-9} [SI unit submultiple representing 10^-9.] +* n {SIUnitSymbolModifier, conversionFactor=10^-9} [SI unit submultiple representing 10^-9.] +* pico {SIUnitModifier, conversionFactor=10^-12} [SI unit submultiple representing 10^-12.] +* p {SIUnitSymbolModifier, conversionFactor=10^-12} [SI unit submultiple representing 10^-12.] +* femto {SIUnitModifier, conversionFactor=10^-15} [SI unit submultiple representing 10^-15.] +* f {SIUnitSymbolModifier, conversionFactor=10^-15} [SI unit submultiple representing 10^-15.] +* atto {SIUnitModifier, conversionFactor=10^-18} [SI unit submultiple representing 10^-18.] +* a {SIUnitSymbolModifier, conversionFactor=10^-18} [SI unit submultiple representing 10^-18.] +* zepto {SIUnitModifier, conversionFactor=10^-21} [SI unit submultiple representing 10^-21.] +* z {SIUnitSymbolModifier, conversionFactor=10^-21} [SI unit submultiple representing 10^-21.] +* yocto {SIUnitModifier, conversionFactor=10^-24} [SI unit submultiple representing 10^-24.] +* y {SIUnitSymbolModifier, conversionFactor=10^-24} [SI unit submultiple representing 10^-24.] + +'''Value classes''' +* dateTimeClass {allowedCharacter=digits, allowedCharacter=T, allowedCharacter=-, allowedCharacter=:} [Date-times should conform to ISO8601 date-time format YYYY-MM-DDThh:mm:ss. Any variation on the full form is allowed.] +* nameClass {allowedCharacter=letters, allowedCharacter=digits, allowedCharacter=_, allowedCharacter=-} [Value class designating values that have the characteristics of node names. The allowed characters are alphanumeric, hyphen, and underbar.] +* numericClass {allowedCharacter=digits, allowedCharacter=E, allowedCharacter=e, allowedCharacter=+, allowedCharacter=-, allowedCharacter=.} [Value must be a valid numerical value.] +* posixPath {allowedCharacter=digits, allowedCharacter=letters, allowedCharacter=/, allowedCharacter=:} [Posix path specification.] +* textClass {allowedCharacter=letters, allowedCharacter=digits, allowedCharacter=blank, allowedCharacter=+, allowedCharacter=-, allowedCharacter=:, allowedCharacter=;, allowedCharacter=., allowedCharacter=/, allowedCharacter=(, allowedCharacter=), allowedCharacter=?, allowedCharacter=*, allowedCharacter=%, allowedCharacter=$, allowedCharacter=@} [Value class designating values that have the characteristics of text such as in descriptions.] + +'''Schema attributes''' +* allowedCharacter {valueClassProperty} [A schema attribute of value classes specifying a special character that is allowed in expressing the value of a placeholder. Normally the allowed characters are listed individually. However, the word letters designates the upper and lower case alphabetic characters and the word digits designates the digits 0-9. The word blank designates the blank character.] +* conversionFactor {unitProperty, unitModifierProperty} [The multiplicative factor to multiply these units to convert to default units.] +* deprecatedFrom {elementProperty} [Indicates that this element is deprecated. The value of the attribute is the latest schema version in which the element appeared in undeprecated form.] +* defaultUnits {unitClassProperty} [A schema attribute of unit classes specifying the default units to use if the placeholder has a unit class but the substituted value has no units.] +* extensionAllowed {boolProperty, nodeProperty, isInheritedProperty} [A schema attribute indicating that users can add unlimited levels of child nodes under this tag. This tag is propagated to child nodes with the exception of the hashtag placeholders.] +* inLibrary {elementProperty} [Indicates this schema element came from the named library schema, not the standard schema. This attribute is added by tools when a library schema is merged into its partnered standard schema.] +* recommended {boolProperty, nodeProperty} [A schema attribute indicating that the event-level HED string should include this tag.] +* relatedTag {nodeProperty, isInheritedProperty} [A schema attribute suggesting HED tags that are closely related to this tag. This attribute is used by tagging tools.] +* requireChild {boolProperty, nodeProperty} [A schema attribute indicating that one of the node elements descendants must be included when using this tag.] +* required {boolProperty, nodeProperty} [A schema attribute indicating that every event-level HED string should include this tag.] +* reserved {boolProperty, nodeProperty} [A schema attribute indicating that this tag has special meaning and requires special handling by tools.] +* rooted {nodeProperty} [Indicates a top-level library schema node is identical to a node of the same name in the partnered standard schema. This attribute can only appear in nodes that have the inLibrary schema attribute.] +* SIUnit {boolProperty, unitProperty} [A schema attribute indicating that this unit element is an SI unit and can be modified by multiple and submultiple names. Note that some units such as byte are designated as SI units although they are not part of the standard.] +* SIUnitModifier {boolProperty, unitModifierProperty} [A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a base unit rather than a unit symbol.] +* SIUnitSymbolModifier {boolProperty, unitModifierProperty} [A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a unit symbol rather than a base symbol.] +* suggestedTag {nodeProperty, isInheritedProperty} [A schema attribute that indicates another tag that is often associated with this tag. This attribute is used by tagging tools to provide tagging suggestions.] +* tagGroup {boolProperty, nodeProperty} [A schema attribute indicating the tag can only appear inside a tag group.] +* takesValue {boolProperty, nodeProperty} [A schema attribute indicating the tag is a hashtag placeholder that is expected to be replaced with a user-defined value.] +* topLevelTagGroup {boolProperty, nodeProperty} [A schema attribute indicating that this tag (or its descendants) can only appear in a top-level tag group. A tag group can have at most one tag with this attribute.] +* unique {boolProperty, nodeProperty} [A schema attribute indicating that only one of this tag or its descendants can be used in the event-level HED string.] +* unitClass {nodeProperty} [A schema attribute specifying which unit class this value tag belongs to.] +* unitPrefix {boolProperty, unitProperty} [A schema attribute applied specifically to unit elements to designate that the unit indicator is a prefix (e.g., dollar sign in the currency units).] +* unitSymbol {boolProperty, unitProperty} [A schema attribute indicating this tag is an abbreviation or symbol representing a type of unit. Unit symbols represent both the singular and the plural and thus cannot be pluralized.] +* valueClass {nodeProperty} [A schema attribute specifying which value class this value tag belongs to.] + +'''Properties''' +* boolProperty [Indicates that the schema attribute represents something that is either true or false and does not have a value. Attributes without this value are assumed to have string values.] +* elementProperty [Indicates this schema attribute can apply to any type of element(tag term, unit class, etc).] +* isInheritedProperty [Indicates that this attribute is inherited by child nodes. This property only applies to schema attributes for nodes.] +* nodeProperty [Indicates this schema attribute applies to node (tag-term) elements. This was added to allow for an attribute to apply to multiple elements.] +* unitClassProperty [Indicates that the schema attribute is meant to be applied to unit classes.] +* unitModifierProperty [Indicates that the schema attribute is meant to be applied to unit modifier classes.] +* unitProperty [Indicates that the schema attribute is meant to be applied to units within a unit class.] +* valueClassProperty [Indicates that the schema attribute is meant to be applied to value classes.] +'''Epilogue''' +The Standardized Computer-based Organized Reporting of EEG (SCORE) is a standard terminology for scalp EEG data assessment designed for use in clinical practice that may also be used for research purposes. +The SCORE standard defines terms for describing phenomena observed in scalp EEG data. It is also potentially applicable (with some suitable extensions) to EEG recorded in critical care and neonatal settings. +The SCORE standard received European consensus and has been endorsed by the European Chapter of the International Federation of Clinical Neurophysiology (IFCN) and the International League Against Epilepsy (ILAE) Commission on European Affairs. +A second revised and extended version of SCORE achieved international consensus. + +[1] Beniczky, Sandor, et al. "Standardized computer based organized reporting of EEG: SCORE." Epilepsia 54.6 (2013). +[2] Beniczky, Sandor, et al. "Standardized computer based organized reporting of EEG: SCORE second version." Clinical Neurophysiology 128.11 (2017). + +TPA, March 2023 + +!# end hed diff --git a/tests/data/schema_tests/merge_tests/HED_score_merged.xml b/tests/data/schema_tests/merge_tests/HED_score_merged.xml index 52731f8ee..a99b692d0 100644 --- a/tests/data/schema_tests/merge_tests/HED_score_merged.xml +++ b/tests/data/schema_tests/merge_tests/HED_score_merged.xml @@ -1,17516 +1,17516 @@ - - - This schema is a Hierarchical Event Descriptors (HED) Library Schema implementation of Standardized Computer-based Organized Reporting of EEG (SCORE)[1,2] for describing events occurring during neuroimaging time series recordings. -The HED-SCORE library schema allows neurologists, neurophysiologists, and brain researchers to annotate electrophysiology recordings using terms from an internationally accepted set of defined terms (SCORE) compatible with the HED framework. -The resulting annotations are understandable to clinicians and directly usable in computer analysis. - -Future extensions may be implemented in the HED-SCORE library schema. -For more information see https://hed-schema-library.readthedocs.io/en/latest/index.html. - - - Event - Something that happens at a given time and (typically) place. Elements of this tag subtree designate the general category in which an event falls. - - suggestedTag - Task-property - - - Sensory-event - Something perceivable by the participant. An event meant to be an experimental stimulus should include the tag Task-property/Task-event-role/Experimental-stimulus. - - suggestedTag - Task-event-role - Sensory-presentation - - - - Agent-action - Any action engaged in by an agent (see the Agent subtree for agent categories). A participant response to an experiment stimulus should include the tag Agent-property/Agent-task-role/Experiment-participant. - - suggestedTag - Task-event-role - Agent - - - - Data-feature - An event marking the occurrence of a data feature such as an interictal spike or alpha burst that is often added post hoc to the data record. - - suggestedTag - Data-property - - - - Experiment-control - An event pertaining to the physical control of the experiment during its operation. - - - Experiment-procedure - An event indicating an experimental procedure, as in performing a saliva swab during the experiment or administering a survey. - - - Experiment-structure - An event specifying a change-point of the structure of experiment. This event is typically used to indicate a change in experimental conditions or tasks. - - - Measurement-event - A discrete measure returned by an instrument. - - suggestedTag - Data-property - - - - - Agent - Someone or something that takes an active role or produces a specified effect.The role or effect may be implicit. Being alive or performing an activity such as a computation may qualify something to be an agent. An agent may also be something that simulates something else. - - suggestedTag - Agent-property - - - Animal-agent - An agent that is an animal. - - - Avatar-agent - An agent associated with an icon or avatar representing another agent. - - - Controller-agent - An agent experiment control software or hardware. - - - Human-agent - A person who takes an active role or produces a specified effect. - - - Robotic-agent - An agent mechanical device capable of performing a variety of often complex tasks on command or by being programmed in advance. - - - Software-agent - An agent computer program. - - - - Modulator - External stimuli / interventions or changes in the alertness level (sleep) that modify: the background activity, or how often a graphoelement is occurring, or change other features of the graphoelement (like intra-burst frequency). For each observed finding, there is an option of specifying how they are influenced by the modulators and procedures that were done during the recording. - - requireChild - - - inLibrary - score - - - Sleep-modulator - - inLibrary - score - - - Sleep-deprivation - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Sleep-following-sleep-deprivation - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Natural-sleep - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Induced-sleep - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Drowsiness - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Awakening - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Medication-modulator - - inLibrary - score - - - Medication-administered-during-recording - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Medication-withdrawal-or-reduction-during-recording - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Eye-modulator - - inLibrary - score - - - Manual-eye-closure - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Manual-eye-opening - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Stimulation-modulator - - inLibrary - score - - - Intermittent-photic-stimulation - - requireChild - - - suggestedTag - Intermittent-photic-stimulation-effect - - - inLibrary - score - - - # - - takesValue - - - valueClass - numericClass - - - unitClass - frequencyUnits - - - inLibrary - score - - - - - Auditory-stimulation - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Nociceptive-stimulation - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Hyperventilation - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Physical-effort - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Cognitive-task - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Other-modulator-or-procedure - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Background-activity - An EEG activity representing the setting in which a given normal or abnormal pattern appears and from which such pattern is distinguished. - - requireChild - - - inLibrary - score - - - Posterior-dominant-rhythm - Rhythmic activity occurring during wakefulness over the posterior regions of the head, generally with maximum amplitudes over the occipital areas. Amplitude varies. Best seen with eyes closed and during physical relaxation and relative mental inactivity. Blocked or attenuated by attention, especially visual, and mental effort. In adults this is the alpha rhythm, and the frequency is 8 to 13 Hz. However the frequency can be higher or lower than this range (often a supra or sub harmonic of alpha frequency) and is called alpha variant rhythm (fast and slow alpha variant rhythm). In children, the normal range of the frequency of the posterior dominant rhythm is age-dependant. - - suggestedTag - Finding-significance-to-recording - Finding-frequency - Finding-amplitude-asymmetry - Posterior-dominant-rhythm-property - - - inLibrary - score - - - - Mu-rhythm - EEG rhythm at 7-11 Hz composed of arch-shaped waves occurring over the central or centro-parietal regions of the scalp during wakefulness. Amplitudes varies but is mostly below 50 microV. Blocked or attenuated most clearly by contralateral movement, thought of movement, readiness to move or tactile stimulation. - - suggestedTag - Finding-frequency - Finding-significance-to-recording - Brain-laterality - Brain-region - Sensors - - - inLibrary - score - - - - Other-organized-rhythm - EEG activity that consisting of waves of approximately constant period, which is considered as part of the background (ongoing) activity, but does not fulfill the criteria of the posterior dominant rhythm. - - requireChild - - - suggestedTag - Rhythmic-activity-morphology - Finding-significance-to-recording - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Background-activity-special-feature - Special Features. Special features contains scoring options for the background activity of critically ill patients. - - requireChild - - - inLibrary - score - - - Continuous-background-activity - - suggestedTag - Rhythmic-activity-morphology - Brain-laterality - Brain-region - Sensors - Finding-extent - - - inLibrary - score - - - - Nearly-continuous-background-activity - - suggestedTag - Rhythmic-activity-morphology - Brain-laterality - Brain-region - Sensors - Finding-extent - - - inLibrary - score - - - - Discontinuous-background-activity - - suggestedTag - Rhythmic-activity-morphology - Brain-laterality - Brain-region - Sensors - Finding-extent - - - inLibrary - score - - - - Background-burst-suppression - EEG pattern consisting of bursts (activity appearing and disappearing abruptly) interrupted by periods of low amplitude (below 20 microV) and which occurs simultaneously over all head regions. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Finding-extent - - - inLibrary - score - - - - Background-burst-attenuation - - suggestedTag - Brain-laterality - Brain-region - Sensors - Finding-extent - - - inLibrary - score - - - - Background-activity-suppression - Periods showing activity under 10 microV (referential montage) and interrupting the background (ongoing) activity. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Finding-extent - Appearance-mode - - - inLibrary - score - - - - Electrocerebral-inactivity - Absence of any ongoing cortical electric activities; in all leads EEG is isoelectric or only contains artifacts. Sensitivity has to be increased up to 2 microV/mm; recording time: at least 30 minutes. - - inLibrary - score - - - - - - Action - Do something. - - extensionAllowed - - - Communicate - Convey knowledge of or information about something. - - Communicate-gesturally - Communicate nonverbally using visible bodily actions, either in place of speech or together and in parallel with spoken words. Gestures include movement of the hands, face, or other parts of the body. - - relatedTag - Move-face - Move-upper-extremity - - - Clap-hands - Strike the palms of against one another resoundingly, and usually repeatedly, especially to express approval. - - - Clear-throat - Cough slightly so as to speak more clearly, attract attention, or to express hesitancy before saying something awkward. - - relatedTag - Move-face - Move-head - - - - Frown - Express disapproval, displeasure, or concentration, typically by turning down the corners of the mouth. - - relatedTag - Move-face - - - - Grimace - Make a twisted expression, typically expressing disgust, pain, or wry amusement. - - relatedTag - Move-face - - - - Nod-head - Tilt head in alternating up and down arcs along the sagittal plane. It is most commonly, but not universally, used to indicate agreement, acceptance, or acknowledgement. - - relatedTag - Move-head - - - - Pump-fist - Raise with fist clenched in triumph or affirmation. - - relatedTag - Move-upper-extremity - - - - Raise-eyebrows - Move eyebrows upward. - - relatedTag - Move-face - Move-eyes - - - - Shake-fist - Clench hand into a fist and shake to demonstrate anger. - - relatedTag - Move-upper-extremity - - - - Shake-head - Turn head from side to side as a way of showing disagreement or refusal. - - relatedTag - Move-head - - - - Shhh - Place finger over lips and possibly uttering the syllable shhh to indicate the need to be quiet. - - relatedTag - Move-upper-extremity - - - - Shrug - Lift shoulders up towards head to indicate a lack of knowledge about a particular topic. - - relatedTag - Move-upper-extremity - Move-torso - - - - Smile - Form facial features into a pleased, kind, or amused expression, typically with the corners of the mouth turned up and the front teeth exposed. - - relatedTag - Move-face - - - - Spread-hands - Spread hands apart to indicate ignorance. - - relatedTag - Move-upper-extremity - - - - Thumb-up - Extend the thumb upward to indicate approval. - - relatedTag - Move-upper-extremity - - - - Thumbs-down - Extend the thumb downward to indicate disapproval. - - relatedTag - Move-upper-extremity - - - - Wave - Raise hand and move left and right, as a greeting or sign of departure. - - relatedTag - Move-upper-extremity - - - - Widen-eyes - Open eyes and possibly with eyebrows lifted especially to express surprise or fear. - - relatedTag - Move-face - Move-eyes - - - - Wink - Close and open one eye quickly, typically to indicate that something is a joke or a secret or as a signal of affection or greeting. - - relatedTag - Move-face - Move-eyes - - - - - Communicate-musically - Communicate using music. - - Hum - Make a low, steady continuous sound like that of a bee. Sing with the lips closed and without uttering speech. - - - Play-instrument - Make musical sounds using an instrument. - - - Sing - Produce musical tones by means of the voice. - - - Vocalize - Utter vocal sounds. - - - Whistle - Produce a shrill clear sound by forcing breath out or air in through the puckered lips. - - - - Communicate-vocally - Communicate using mouth or vocal cords. - - Cry - Shed tears associated with emotions, usually sadness but also joy or frustration. - - - Groan - Make a deep inarticulate sound in response to pain or despair. - - - Laugh - Make the spontaneous sounds and movements of the face and body that are the instinctive expressions of lively amusement and sometimes also of contempt or derision. - - - Scream - Make loud, vociferous cries or yells to express pain, excitement, or fear. - - - Shout - Say something very loudly. - - - Sigh - Emit a long, deep, audible breath expressing sadness, relief, tiredness, or a similar feeling. - - - Speak - Communicate using spoken language. - - - Whisper - Speak very softly using breath without vocal cords. - - - - - Move - Move in a specified direction or manner. Change position or posture. - - Breathe - Inhale or exhale during respiration. - - Blow - Expel air through pursed lips. - - - Cough - Suddenly and audibly expel air from the lungs through a partially closed glottis, preceded by inhalation. - - - Exhale - Blow out or expel breath. - - - Hiccup - Involuntarily spasm the diaphragm and respiratory organs, with a sudden closure of the glottis and a characteristic sound like that of a cough. - - - Hold-breath - Interrupt normal breathing by ceasing to inhale or exhale. - - - Inhale - Draw in with the breath through the nose or mouth. - - - Sneeze - Suddenly and violently expel breath through the nose and mouth. - - - Sniff - Draw in air audibly through the nose to detect a smell, to stop it from running, or to express contempt. - - - - Move-body - Move entire body. - - Bend - Move body in a bowed or curved manner. - - - Dance - Perform a purposefully selected sequences of human movement often with aesthetic or symbolic value. Move rhythmically to music, typically following a set sequence of steps. - - - Fall-down - Lose balance and collapse. - - - Flex - Cause a muscle to stand out by contracting or tensing it. Bend a limb or joint. - - - Jerk - Make a quick, sharp, sudden movement. - - - Lie-down - Move to a horizontal or resting position. - - - Recover-balance - Return to a stable, upright body position. - - - Shudder - Tremble convulsively, sometimes as a result of fear or revulsion. - - - Sit-down - Move from a standing to a sitting position. - - - Sit-up - Move from lying down to a sitting position. - - - Stand-up - Move from a sitting to a standing position. - - - Stretch - Straighten or extend body or a part of body to its full length, typically so as to tighten muscles or in order to reach something. - - - Stumble - Trip or momentarily lose balance and almost fall. - - - Turn - Change or cause to change direction. - - - - Move-body-part - Move one part of a body. - - Move-eyes - Move eyes. - - Blink - Shut and open the eyes quickly. - - - Close-eyes - Lower and keep eyelids in a closed position. - - - Fixate - Direct eyes to a specific point or target. - - - Inhibit-blinks - Purposely prevent blinking. - - - Open-eyes - Raise eyelids to expose pupil. - - - Saccade - Move eyes rapidly between fixation points. - - - Squint - Squeeze one or both eyes partly closed in an attempt to see more clearly or as a reaction to strong light. - - - Stare - Look fixedly or vacantly at someone or something with eyes wide open. - - - - Move-face - Move the face or jaw. - - Bite - Seize with teeth or jaws an object or organism so as to grip or break the surface covering. - - - Burp - Noisily release air from the stomach through the mouth. Belch. - - - Chew - Repeatedly grinding, tearing, and or crushing with teeth or jaws. - - - Gurgle - Make a hollow bubbling sound like that made by water running out of a bottle. - - - Swallow - Cause or allow something, especially food or drink to pass down the throat. - - Gulp - Swallow quickly or in large mouthfuls, often audibly, sometimes to indicate apprehension. - - - - Yawn - Take a deep involuntary inhalation with the mouth open often as a sign of drowsiness or boredom. - - - - Move-head - Move head. - - Lift-head - Tilt head back lifting chin. - - - Lower-head - Move head downward so that eyes are in a lower position. - - - Turn-head - Rotate head horizontally to look in a different direction. - - - - Move-lower-extremity - Move leg and/or foot. - - Curl-toes - Bend toes sometimes to grip. - - - Hop - Jump on one foot. - - - Jog - Run at a trot to exercise. - - - Jump - Move off the ground or other surface through sudden muscular effort in the legs. - - - Kick - Strike out or flail with the foot or feet. Strike using the leg, in unison usually with an area of the knee or lower using the foot. - - - Pedal - Move by working the pedals of a bicycle or other machine. - - - Press-foot - Move by pressing foot. - - - Run - Travel on foot at a fast pace. - - - Step - Put one leg in front of the other and shift weight onto it. - - Heel-strike - Strike the ground with the heel during a step. - - - Toe-off - Push with toe as part of a stride. - - - - Trot - Run at a moderate pace, typically with short steps. - - - Walk - Move at a regular pace by lifting and setting down each foot in turn never having both feet off the ground at once. - - - - Move-torso - Move body trunk. - - - Move-upper-extremity - Move arm, shoulder, and/or hand. - - Drop - Let or cause to fall vertically. - - - Grab - Seize suddenly or quickly. Snatch or clutch. - - - Grasp - Seize and hold firmly. - - - Hold-down - Prevent someone or something from moving by holding them firmly. - - - Lift - Raising something to higher position. - - - Make-fist - Close hand tightly with the fingers bent against the palm. - - - Point - Draw attention to something by extending a finger or arm. - - - Press - Apply pressure to something to flatten, shape, smooth or depress it. This action tag should be used to indicate key presses and mouse clicks. - - relatedTag - Push - - - - Push - Apply force in order to move something away. Use Press to indicate a key press or mouse click. - - relatedTag - Press - - - - Reach - Stretch out your arm in order to get or touch something. - - - Release - Make available or set free. - - - Retract - Draw or pull back. - - - Scratch - Drag claws or nails over a surface or on skin. - - - Snap-fingers - Make a noise by pushing second finger hard against thumb and then releasing it suddenly so that it hits the base of the thumb. - - - Touch - Come into or be in contact with. - - - - - - Perceive - Produce an internal, conscious image through stimulating a sensory system. - - Hear - Give attention to a sound. - - - See - Direct gaze toward someone or something or in a specified direction. - - - Sense-by-touch - Sense something through receptors in the skin. - - - Smell - Inhale in order to ascertain an odor or scent. - - - Taste - Sense a flavor in the mouth and throat on contact with a substance. - - - - Perform - Carry out or accomplish an action, task, or function. - - Close - Act as to blocked against entry or passage. - - - Collide-with - Hit with force when moving. - - - Halt - Bring or come to an abrupt stop. - - - Modify - Change something. - - - Open - Widen an aperture, door, or gap, especially one allowing access to something. - - - Operate - Control the functioning of a machine, process, or system. - - - Play - Engage in activity for enjoyment and recreation rather than a serious or practical purpose. - - - Read - Interpret something that is written or printed. - - - Repeat - Make do or perform again. - - - Rest - Be inactive in order to regain strength, health, or energy. - - - Write - Communicate or express by means of letters or symbols written or imprinted on a surface. - - - - Think - Direct the mind toward someone or something or use the mind actively to form connected ideas. - - Allow - Allow access to something such as allowing a car to pass. - - - Attend-to - Focus mental experience on specific targets. - - - Count - Tally items either silently or aloud. - - - Deny - Refuse to give or grant something requested or desired by someone. - - - Detect - Discover or identify the presence or existence of something. - - - Discriminate - Recognize a distinction. - - - Encode - Convert information or an instruction into a particular form. - - - Evade - Escape or avoid, especially by cleverness or trickery. - - - Generate - Cause something, especially an emotion or situation to arise or come about. - - - Identify - Establish or indicate who or what someone or something is. - - - Imagine - Form a mental image or concept of something. - - - Judge - Evaluate evidence to make a decision or form a belief. - - - Learn - Adaptively change behavior as the result of experience. - - - Memorize - Adaptively change behavior as the result of experience. - - - Plan - Think about the activities required to achieve a desired goal. - - - Predict - Say or estimate that something will happen or will be a consequence of something without having exact informaton. - - - Recall - Remember information by mental effort. - - - Recognize - Identify someone or something from having encountered them before. - - - Respond - React to something such as a treatment or a stimulus. - - - Switch-attention - Transfer attention from one focus to another. - - - Track - Follow a person, animal, or object through space or time. - - - - - Artifact - When relevant for the clinical interpretation, artifacts can be scored by specifying the type and the location. - - requireChild - - - inLibrary - score - - - Biological-artifact - - requireChild - - - inLibrary - score - - - Eye-blink-artifact - Example for EEG: Fp1/Fp2 become electropositive with eye closure because the cornea is positively charged causing a negative deflection in Fp1/Fp2. If the eye blink is unilateral, consider prosthetic eye. If it is in F8 rather than Fp2 then the electrodes are plugged in wrong. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - inLibrary - score - - - - Eye-movement-horizontal-artifact - Example for EEG: There is an upward deflection in the Fp2-F8 derivation, when the eyes move to the right side. In this case F8 becomes more positive and therefore. When the eyes move to the left, F7 becomes more positive and there is an upward deflection in the Fp1-F7 derivation. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - inLibrary - score - - - - Eye-movement-vertical-artifact - Example for EEG: The EEG shows positive potentials (50-100 micro V) with bi-frontal distribution, maximum at Fp1 and Fp2, when the eyeball rotated upward. The downward rotation of the eyeball was associated with the negative deflection. The time course of the deflections was similar to the time course of the eyeball movement. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - inLibrary - score - - - - Slow-eye-movement-artifact - Slow, rolling eye-movements, seen during drowsiness. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - inLibrary - score - - - - Nystagmus-artifact - - suggestedTag - Artifact-significance-to-recording - - - inLibrary - score - - - - Chewing-artifact - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - inLibrary - score - - - - Sucking-artifact - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - inLibrary - score - - - - Glossokinetic-artifact - The tongue functions as a dipole, with the tip negative with respect to the base. The artifact produced by the tongue has a broad potential field that drops from frontal to occipital areas, although it is less steep than that produced by eye movement artifacts. The amplitude of the potentials is greater inferiorly than in parasagittal regions; the frequency is variable but usually in the delta range. Chewing and sucking can produce similar artifacts. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - inLibrary - score - - - - Rocking-patting-artifact - Quasi-rhythmical artifacts in recordings from infants caused by rocking/patting. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - inLibrary - score - - - - Movement-artifact - Example for EEG: Large amplitude artifact, with irregular morphology (usually resembling a slow-wave or a wave with complex morphology) seen in one or several channels, due to movement. If the causing movement is repetitive, the artifact might resemble a rhythmic EEG activity. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - inLibrary - score - - - - Respiration-artifact - Respiration can produce 2 kinds of artifacts. One type is in the form of slow and rhythmic activity, synchronous with the body movements of respiration and mechanically affecting the impedance of (usually) one electrode. The other type can be slow or sharp waves that occur synchronously with inhalation or exhalation and involve those electrodes on which the patient is lying. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - inLibrary - score - - - - Pulse-artifact - Example for EEG: Occurs when an EEG electrode is placed over a pulsating vessel. The pulsation can cause slow waves that may simulate EEG activity. A direct relationship exists between ECG and the pulse waves (200-300 millisecond delay after ECG equals QRS complex). - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - inLibrary - score - - - - ECG-artifact - Example for EEG: Far-field potential generated in the heart. The voltage and apparent surface of the artifact vary from derivation to derivation and, consequently, from montage to montage. The artifact is observed best in referential montages using earlobe electrodes A1 and A2. ECG artifact is recognized easily by its rhythmicity/regularity and coincidence with the ECG tracing. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - inLibrary - score - - - - Sweat-artifact - Is a low amplitude undulating waveform that is usually greater than 2 seconds and may appear to be an unstable baseline. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - inLibrary - score - - - - EMG-artifact - Myogenic potentials are the most common artifacts. Frontalis and temporalis muscles (ex..: clenching of jaw muscles) are common causes. Generally, the potentials generated in the muscles are of shorter duration than those generated in the brain. The frequency components are usually beyond 30-50 Hz, and the bursts are arrhythmic. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - inLibrary - score - - - - - Non-biological-artifact - - requireChild - - - inLibrary - score - - - Power-supply-artifact - 50-60 Hz artifact. Monomorphic waveform due to 50 or 60 Hz A/C power supply. - - suggestedTag - Artifact-significance-to-recording - - - inLibrary - score - - - - Induction-artifact - Artifacts (usually of high frequency) induced by nearby equipment (like in the intensive care unit). - - suggestedTag - Artifact-significance-to-recording - - - inLibrary - score - - - - Dialysis-artifact - - suggestedTag - Artifact-significance-to-recording - - - inLibrary - score - - - - Artificial-ventilation-artifact - - suggestedTag - Artifact-significance-to-recording - - - inLibrary - score - - - - Electrode-pops-artifact - Are brief discharges with a very steep upslope and shallow fall that occur in all leads which include that electrode. - - suggestedTag - Artifact-significance-to-recording - - - inLibrary - score - - - - Salt-bridge-artifact - Typically occurs in 1 channel which may appear isoelectric. Only seen in bipolar montage. - - suggestedTag - Artifact-significance-to-recording - - - inLibrary - score - - - - - Other-artifact - - requireChild - - - suggestedTag - Artifact-significance-to-recording - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Critically-ill-patients-patterns - Rhythmic or periodic patterns in critically ill patients (RPPs) are scored according to the 2012 version of the American Clinical Neurophysiology Society Standardized Critical Care EEG Terminology (Hirsch et al., 2013). - - requireChild - - - inLibrary - score - - - Critically-ill-patients-periodic-discharges - Periodic discharges (PDs). - - suggestedTag - Periodic-discharge-morphology - Brain-laterality - Brain-region - Sensors - Finding-frequency - Periodic-discharge-time-related-features - - - inLibrary - score - - - - Rhythmic-delta-activity - RDA - - suggestedTag - Periodic-discharge-superimposed-activity - Periodic-discharge-absolute-amplitude - Brain-laterality - Brain-region - Sensors - Finding-frequency - Periodic-discharge-time-related-features - - - inLibrary - score - - - - Spike-or-sharp-and-wave - SW - - suggestedTag - Periodic-discharge-sharpness - Number-of-periodic-discharge-phases - Periodic-discharge-triphasic-morphology - Periodic-discharge-absolute-amplitude - Periodic-discharge-relative-amplitude - Periodic-discharge-polarity - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Finding-frequency - Periodic-discharge-time-related-features - - - inLibrary - score - - - - - Episode - Clinical episode or electrographic seizure. - - requireChild - - - inLibrary - score - - - Epileptic-seizure - The ILAE presented a revised seizure classification that divides seizures into focal, generalized onset, or unknown onset. - - requireChild - - - inLibrary - score - - - Focal-onset-epileptic-seizure - Focal seizures can be divided into focal aware and impaired awareness seizures, with additional motor and nonmotor classifications. - - suggestedTag - Episode-phase - Automatism-motor-seizure - Atonic-motor-seizure - Clonic-motor-seizure - Epileptic-spasm-episode - Hyperkinetic-motor-seizure - Myoclonic-motor-seizure - Tonic-motor-seizure - Autonomic-nonmotor-seizure - Behavior-arrest-nonmotor-seizure - Cognitive-nonmotor-seizure - Emotional-nonmotor-seizure - Sensory-nonmotor-seizure - Seizure-dynamics - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - Aware-focal-onset-epileptic-seizure - - suggestedTag - Episode-phase - Seizure-dynamics - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - Impaired-awareness-focal-onset-epileptic-seizure - - suggestedTag - Episode-phase - Seizure-dynamics - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - Awareness-unknown-focal-onset-epileptic-seizure - - suggestedTag - Episode-phase - Seizure-dynamics - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - Focal-to-bilateral-tonic-clonic-focal-onset-epileptic-seizure - A seizure type with focal onset, with awareness or impaired awareness, either motor or non-motor, progressing to bilateral tonic clonic activity. The prior term was seizure with partial onset with secondary generalization. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - suggestedTag - Episode-phase - Seizure-dynamics - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - - Generalized-onset-epileptic-seizure - Generalized-onset seizures are classified as motor or nonmotor (absence), without using awareness level as a classifier, as most but not all of these seizures are linked with impaired awareness. - - suggestedTag - Episode-phase - Tonic-clonic-motor-seizure - Clonic-motor-seizure - Tonic-motor-seizure - Myoclonic-motor-seizure - Myoclonic-tonic-clonic-motor-seizure - Myoclonic-atonic-motor-seizure - Atonic-motor-seizure - Epileptic-spasm-episode - Typical-absence-seizure - Atypical-absence-seizure - Myoclonic-absence-seizure - Eyelid-myoclonia-absence-seizure - Seizure-dynamics - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - Unknown-onset-epileptic-seizure - Even if the onset of seizures is unknown, they may exhibit characteristics that fall into categories such as motor, nonmotor, tonic-clonic, epileptic spasms, or behavior arrest. - - suggestedTag - Episode-phase - Tonic-clonic-motor-seizure - Epileptic-spasm-episode - Behavior-arrest-nonmotor-seizure - Seizure-dynamics - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - Unclassified-epileptic-seizure - Referring to a seizure type that cannot be described by the ILAE 2017 classification either because of inadequate information or unusual clinical features. - - suggestedTag - Episode-phase - Seizure-dynamics - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - - Subtle-seizure - Seizure type frequent in neonates, sometimes referred to as motor automatisms; they may include random and roving eye movements, sucking, chewing motions, tongue protrusion, rowing or swimming or boxing movements of the arms, pedaling and bicycling movements of the lower limbs; apneic seizures are relatively common. Although some subtle seizures are associated with rhythmic ictal EEG discharges, and are clearly epileptic, ictal EEG often does not show typical epileptic activity. - - suggestedTag - Episode-phase - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - Electrographic-seizure - Referred usually to non convulsive status. Ictal EEG: rhythmic discharge or spike and wave pattern with definite evolution in frequency, location, or morphology lasting at least 10 s; evolution in amplitude alone did not qualify. - - suggestedTag - Episode-phase - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - Seizure-PNES - Psychogenic non-epileptic seizure. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - Sleep-related-episode - - requireChild - - - inLibrary - score - - - Sleep-related-arousal - Normal. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - Benign-sleep-myoclonus - A distinctive disorder of sleep characterized by a) neonatal onset, b) rhythmic myoclonic jerks only during sleep and c) abrupt and consistent cessation with arousal, d) absence of concomitant electrographic changes suggestive of seizures, and e) good outcome. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - Confusional-awakening - Episode of non epileptic nature included in NREM parasomnias, characterized by sudden arousal and complex behavior but without full alertness, usually lasting a few minutes and occurring almost in all children at least occasionally. Amnesia of the episode is the rule. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - Sleep-periodic-limb-movement - PLMS. Periodic limb movement in sleep. Episodes are characterized by brief (0.5- to 5.0-second) lower-extremity movements during sleep, which typically occur at 20- to 40-second intervals, most commonly during the first 3 hours of sleep. The affected individual is usually not aware of the movements or of the transient partial arousals. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - REM-sleep-behavioral-disorder - REM sleep behavioral disorder. Episodes characterized by: a) presence of REM sleep without atonia (RSWA) on polysomnography (PSG); b) presence of at least 1 of the following conditions - (1) Sleep-related behaviors, by history, that have been injurious, potentially injurious, or disruptive (example: dream enactment behavior); (2) abnormal REM sleep behavior documented during PSG monitoring; (3) absence of epileptiform activity on electroencephalogram (EEG) during REM sleep (unless RBD can be clearly distinguished from any concurrent REM sleep-related seizure disorder); (4) sleep disorder not better explained by another sleep disorder, a medical or neurologic disorder, a mental disorder, medication use, or a substance use disorder. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - Sleep-walking - Episodes characterized by ambulation during sleep; the patient is difficult to arouse during an episode, and is usually amnesic following the episode. Episodes usually occur in the first third of the night during slow wave sleep. Polysomnographic recordings demonstrate 2 abnormalities during the first sleep cycle: frequent, brief, non-behavioral EEG-defined arousals prior to the somnambulistic episode and abnormally low gamma (0.75-2.0 Hz) EEG power on spectral analysis, correlating with high-voltage (hyper-synchronic gamma) waves lasting 10 to 15 s occurring just prior to the movement. This is followed by stage I NREM sleep, and there is no evidence of complete awakening. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - - Pediatric-episode - - requireChild - - - inLibrary - score - - - Hyperekplexia - Disorder characterized by exaggerated startle response and hypertonicity that may occur during the first year of life and in severe cases during the neonatal period. Children usually present with marked irritability and recurrent startles in response to handling and sounds. Severely affected infants can have severe jerks and stiffening, sometimes with breath-holding spells. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - Jactatio-capitis-nocturna - Relatively common in normal children at the time of going to bed, especially during the first year of life, the rhythmic head movements persist during sleep. Usually, these phenomena disappear before 3 years of age. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - Pavor-nocturnus - A nocturnal episode characterized by age of onset of less than five years (mean age 18 months, with peak prevalence at five to seven years), appearance of signs of panic two hours after falling asleep with crying, screams, a fearful expression, inability to recognize other people including parents (for a duration of 5-15 minutes), amnesia upon awakening. Pavor nocturnus occurs in patients almost every night for months or years (but the frequency is highly variable and may be as low as once a month) and is likely to disappear spontaneously at the age of six to eight years. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - Pediatric-stereotypical-behavior-episode - Repetitive motor behavior in children, typically rhythmic and persistent; usually not paroxysmal and rarely suggest epilepsy. They include headbanging, head-rolling, jactatio capitis nocturna, body rocking, buccal or lingual movements, hand flapping and related mannerisms, repetitive hand-waving (to self-induce photosensitive seizures). - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - - Paroxysmal-motor-event - Paroxysmal phenomena during neonatal or childhood periods characterized by recurrent motor or behavioral signs or symptoms that must be distinguishes from epileptic disorders. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - Syncope - Episode with loss of consciousness and muscle tone that is abrupt in onset, of short duration and followed by rapid recovery; it occurs in response to transient impairment of cerebral perfusion. Typical prodromal symptoms often herald onset of syncope and postictal symptoms are minimal. Syncopal convulsions resulting from cerebral anoxia are common but are not a form of epilepsy, nor are there any accompanying EEG ictal discharges. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - Cataplexy - A sudden decrement in muscle tone and loss of deep tendon reflexes, leading to muscle weakness, paralysis, or postural collapse. Cataplexy usually is precipitated by an outburst of emotional expression-notably laughter, anger, or startle. It is one of the tetrad of symptoms of narcolepsy. During cataplexy, respiration and voluntary eye movements are not compromised. Consciousness is preserved. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - inLibrary - score - - - - Other-episode - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Finding-property - Descriptive element similar to main HED /Property. Something that pertains to a thing. A characteristic of some entity. A quality or feature regarded as a characteristic or inherent part of someone or something. HED attributes are adjectives or adverbs. - - requireChild - - - inLibrary - score - - - Signal-morphology-property - - requireChild - - - inLibrary - score - - - Rhythmic-activity-morphology - EEG activity consisting of a sequence of waves approximately constant period. - - inLibrary - score - - - Delta-activity-morphology - EEG rhythm in the delta (under 4 Hz) range that does not belong to the posterior dominant rhythm (scored under other organized rhythms). - - suggestedTag - Finding-frequency - Finding-amplitude - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Theta-activity-morphology - EEG rhythm in the theta (4-8 Hz) range that does not belong to the posterior dominant rhythm (scored under other organized rhythm). - - suggestedTag - Finding-frequency - Finding-amplitude - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Alpha-activity-morphology - EEG rhythm in the alpha range (8-13 Hz) which is considered part of the background (ongoing) activity but does not fulfill the criteria of the posterior dominant rhythm (alpha rhythm). - - suggestedTag - Finding-frequency - Finding-amplitude - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Beta-activity-morphology - EEG rhythm between 14 and 40 Hz, which is considered part of the background (ongoing) activity but does not fulfill the criteria of the posterior dominant rhythm. Most characteristically: a rhythm from 14 to 40 Hz recorded over the fronto-central regions of the head during wakefulness. Amplitude of the beta rhythm varies but is mostly below 30 microV. Other beta rhythms are most prominent in other locations or are diffuse. - - suggestedTag - Finding-frequency - Finding-amplitude - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Gamma-activity-morphology - - suggestedTag - Finding-frequency - Finding-amplitude - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Spike-morphology - A transient, clearly distinguished from background activity, with pointed peak at a conventional paper speed or time scale and duration from 20 to under 70 ms, i.e. 1/50-1/15 s approximately. Main component is generally negative relative to other areas. Amplitude varies. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Spike-and-slow-wave-morphology - A pattern consisting of a spike followed by a slow wave. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Runs-of-rapid-spikes-morphology - Bursts of spike discharges at a rate from 10 to 25/sec (in most cases somewhat irregular). The bursts last more than 2 seconds (usually 2 to 10 seconds) and it is typically seen in sleep. Synonyms: rhythmic spikes, generalized paroxysmal fast activity, fast paroxysmal rhythms, grand mal discharge, fast beta activity. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Polyspikes-morphology - Two or more consecutive spikes. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Polyspike-and-slow-wave-morphology - Two or more consecutive spikes associated with one or more slow waves. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Sharp-wave-morphology - A transient clearly distinguished from background activity, with pointed peak at a conventional paper speed or time scale, and duration of 70-200 ms, i.e. over 1/4-1/5 s approximately. Main component is generally negative relative to other areas. Amplitude varies. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Sharp-and-slow-wave-morphology - A sequence of a sharp wave and a slow wave. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Slow-sharp-wave-morphology - A transient that bears all the characteristics of a sharp-wave, but exceeds 200 ms. Synonym: blunted sharp wave. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - High-frequency-oscillation-morphology - HFO. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Hypsarrhythmia-classic-morphology - Abnormal interictal high amplitude waves and a background of irregular spikes. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Hypsarrhythmia-modified-morphology - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Fast-spike-activity-morphology - A burst consisting of a sequence of spikes. Duration greater than 1 s. Frequency at least in the alpha range. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Low-voltage-fast-activity-morphology - Refers to the fast, and often recruiting activity which can be recorded at the onset of an ictal discharge, particularly in invasive EEG recording of a seizure. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Polysharp-waves-morphology - A sequence of two or more sharp-waves. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Slow-wave-large-amplitude-morphology - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Irregular-delta-or-theta-activity-morphology - EEG activity consisting of repetitive waves of inconsistent wave-duration but in delta and/or theta rang (greater than 125 ms). - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Electrodecremental-change-morphology - Sudden desynchronization of electrical activity. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - DC-shift-morphology - Shift of negative polarity of the direct current recordings, during seizures. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Disappearance-of-ongoing-activity-morphology - Disappearance of the EEG activity that preceded the ictal event but still remnants of background activity (thus not enough to name it electrodecremental change). - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Polymorphic-delta-activity-morphology - EEG activity consisting of waves in the delta range (over 250 ms duration for each wave) but of different morphology. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Frontal-intermittent-rhythmic-delta-activity-morphology - Frontal intermittent rhythmic delta activity (FIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at 1.5-2.5 Hz over the frontal areas of one or both sides of the head. Comment: most commonly associated with unspecified encephalopathy, in adults. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Occipital-intermittent-rhythmic-delta-activity-morphology - Occipital intermittent rhythmic delta activity (OIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at 2-3 Hz over the occipital or posterior head regions of one or both sides of the head. Frequently blocked or attenuated by opening the eyes. Comment: most commonly associated with unspecified encephalopathy, in children. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Temporal-intermittent-rhythmic-delta-activity-morphology - Temporal intermittent rhythmic delta activity (TIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at over the temporal areas of one side of the head. Comment: most commonly associated with temporal lobe epilepsy. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Periodic-discharge-morphology - Periodic discharges not further specified (PDs). - - requireChild - - - inLibrary - score - - - Periodic-discharge-superimposed-activity - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - inLibrary - score - - - Periodic-discharge-fast-superimposed-activity - - suggestedTag - Finding-frequency - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Periodic-discharge-rhythmic-superimposed-activity - - suggestedTag - Finding-frequency - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Periodic-discharge-sharpness - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - inLibrary - score - - - Spiky-periodic-discharge-sharpness - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Sharp-periodic-discharge-sharpness - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Sharply-contoured-periodic-discharge-sharpness - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Blunt-periodic-discharge-sharpness - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Number-of-periodic-discharge-phases - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - inLibrary - score - - - 1-periodic-discharge-phase - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - 2-periodic-discharge-phases - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - 3-periodic-discharge-phases - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Greater-than-3-periodic-discharge-phases - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Periodic-discharge-triphasic-morphology - - suggestedTag - Property-not-possible-to-determine - Property-exists - Property-absence - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Periodic-discharge-absolute-amplitude - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - inLibrary - score - - - Periodic-discharge-absolute-amplitude-very-low - Lower than 20 microV. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Low-periodic-discharge-absolute-amplitude - 20 to 49 microV. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Medium-periodic-discharge-absolute-amplitude - 50 to 199 microV. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - High-periodic-discharge-absolute-amplitude - Greater than 200 microV. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Periodic-discharge-relative-amplitude - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - inLibrary - score - - - Periodic-discharge-relative-amplitude-less-than-equal-2 - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Periodic-discharge-relative-amplitude-greater-than-2 - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Periodic-discharge-polarity - - requireChild - - - inLibrary - score - - - Periodic-discharge-postitive-polarity - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Periodic-discharge-negative-polarity - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Periodic-discharge-unclear-polarity - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - - - Source-analysis-property - How the current in the brain reaches the electrode sensors. - - requireChild - - - inLibrary - score - - - Source-analysis-laterality - - requireChild - - - suggestedTag - Brain-laterality - - - inLibrary - score - - - - Source-analysis-brain-region - - requireChild - - - inLibrary - score - - - Source-analysis-frontal-perisylvian-superior-surface - - inLibrary - score - - - - Source-analysis-frontal-lateral - - inLibrary - score - - - - Source-analysis-frontal-mesial - - inLibrary - score - - - - Source-analysis-frontal-polar - - inLibrary - score - - - - Source-analysis-frontal-orbitofrontal - - inLibrary - score - - - - Source-analysis-temporal-polar - - inLibrary - score - - - - Source-analysis-temporal-basal - - inLibrary - score - - - - Source-analysis-temporal-lateral-anterior - - inLibrary - score - - - - Source-analysis-temporal-lateral-posterior - - inLibrary - score - - - - Source-analysis-temporal-perisylvian-inferior-surface - - inLibrary - score - - - - Source-analysis-central-lateral-convexity - - inLibrary - score - - - - Source-analysis-central-mesial - - inLibrary - score - - - - Source-analysis-central-sulcus-anterior-surface - - inLibrary - score - - - - Source-analysis-central-sulcus-posterior-surface - - inLibrary - score - - - - Source-analysis-central-opercular - - inLibrary - score - - - - Source-analysis-parietal-lateral-convexity - - inLibrary - score - - - - Source-analysis-parietal-mesial - - inLibrary - score - - - - Source-analysis-parietal-opercular - - inLibrary - score - - - - Source-analysis-occipital-lateral - - inLibrary - score - - - - Source-analysis-occipital-mesial - - inLibrary - score - - - - Source-analysis-occipital-basal - - inLibrary - score - - - - Source-analysis-insula - - inLibrary - score - - - - - - Location-property - Location can be scored for findings. Semiologic finding can also be characterized by the somatotopic modifier (i.e. the part of the body where it occurs). In this respect, laterality (left, right, symmetric, asymmetric, left greater than right, right greater than left), body part (eyelid, face, arm, leg, trunk, visceral, hemi-) and centricity (axial, proximal limb, distal limb) can be scored. - - requireChild - - - inLibrary - score - - - Brain-laterality - - requireChild - - - inLibrary - score - - - Brain-laterality-left - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Brain-laterality-left-greater-right - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Brain-laterality-right - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Brain-laterality-right-greater-left - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Brain-laterality-midline - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Brain-laterality-diffuse-asynchronous - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Brain-region - - requireChild - - - inLibrary - score - - - Brain-region-frontal - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Brain-region-temporal - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Brain-region-central - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Brain-region-parietal - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Brain-region-occipital - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Body-part-location - - requireChild - - - inLibrary - score - - - Eyelid-location - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Face-location - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Arm-location - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Leg-location - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Trunk-location - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Visceral-location - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Hemi-location - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Brain-centricity - - requireChild - - - inLibrary - score - - - Brain-centricity-axial - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Brain-centricity-proximal-limb - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Brain-centricity-distal-limb - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Sensors - Lists all corresponding sensors (electrodes/channels in montage). The sensor-group is selected from a list defined in the site-settings for each EEG-lab. - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Finding-propagation - When propagation within the graphoelement is observed, first the location of the onset region is scored. Then, the location of the propagation can be noted. - - suggestedTag - Property-exists - Property-absence - Brain-laterality - Brain-region - Sensors - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Multifocal-finding - When the same interictal graphoelement is observed bilaterally and at least in three independent locations, can score them using one entry, and choosing multifocal as a descriptor of the locations of the given interictal graphoelements, optionally emphasizing the involved, and the most active sites. - - suggestedTag - Property-not-possible-to-determine - Property-exists - Property-absence - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Modulators-property - For each described graphoelement, the influence of the modulators can be scored. Only modulators present in the recording are scored. - - requireChild - - - inLibrary - score - - - Modulators-reactivity - Susceptibility of individual rhythms or the EEG as a whole to change following sensory stimulation or other physiologic actions. - - requireChild - - - suggestedTag - Property-exists - Property-absence - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Eye-closure-sensitivity - Eye closure sensitivity. - - suggestedTag - Property-exists - Property-absence - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Eye-opening-passive - Passive eye opening. Used with base schema Increasing/Decreasing. - - suggestedTag - Property-not-possible-to-determine - Finding-stopped-by - Finding-unmodified - Finding-triggered-by - - - inLibrary - score - - - - Medication-effect-EEG - Medications effect on EEG. Used with base schema Increasing/Decreasing. - - suggestedTag - Property-not-possible-to-determine - Finding-stopped-by - Finding-unmodified - - - inLibrary - score - - - - Medication-reduction-effect-EEG - Medications reduction or withdrawal effect on EEG. Used with base schema Increasing/Decreasing. - - suggestedTag - Property-not-possible-to-determine - Finding-stopped-by - Finding-unmodified - - - inLibrary - score - - - - Auditive-stimuli-effect - Used with base schema Increasing/Decreasing. - - suggestedTag - Property-not-possible-to-determine - Finding-stopped-by - Finding-unmodified - - - inLibrary - score - - - - Nociceptive-stimuli-effect - Used with base schema Increasing/Decreasing. - - suggestedTag - Property-not-possible-to-determine - Finding-stopped-by - Finding-unmodified - Finding-triggered-by - - - inLibrary - score - - - - Physical-effort-effect - Used with base schema Increasing/Decreasing - - suggestedTag - Property-not-possible-to-determine - Finding-stopped-by - Finding-unmodified - Finding-triggered-by - - - inLibrary - score - - - - Cognitive-task-effect - Used with base schema Increasing/Decreasing. - - suggestedTag - Property-not-possible-to-determine - Finding-stopped-by - Finding-unmodified - Finding-triggered-by - - - inLibrary - score - - - - Other-modulators-effect-EEG - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Facilitating-factor - Facilitating factors are defined as transient and sporadic endogenous or exogenous elements capable of augmenting seizure incidence (increasing the likelihood of seizure occurrence). - - inLibrary - score - - - Facilitating-factor-alcohol - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Facilitating-factor-awake - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Facilitating-factor-catamenial - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Facilitating-factor-fever - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Facilitating-factor-sleep - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Facilitating-factor-sleep-deprived - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Facilitating-factor-other - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Provocative-factor - Provocative factors are defined as transient and sporadic endogenous or exogenous elements capable of evoking/triggering seizures immediately following the exposure to it. - - requireChild - - - inLibrary - score - - - Hyperventilation-provoked - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Reflex-provoked - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Medication-effect-clinical - Medications clinical effect. Used with base schema Increasing/Decreasing. - - suggestedTag - Finding-stopped-by - Finding-unmodified - - - inLibrary - score - - - - Medication-reduction-effect-clinical - Medications reduction or withdrawal clinical effect. Used with base schema Increasing/Decreasing. - - suggestedTag - Finding-stopped-by - Finding-unmodified - - - inLibrary - score - - - - Other-modulators-effect-clinical - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Intermittent-photic-stimulation-effect - - requireChild - - - inLibrary - score - - - Posterior-stimulus-dependent-intermittent-photic-stimulation-response - - suggestedTag - Finding-frequency - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Posterior-stimulus-independent-intermittent-photic-stimulation-response-limited - limited to the stimulus-train - - suggestedTag - Finding-frequency - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Posterior-stimulus-independent-intermittent-photic-stimulation-response-self-sustained - - suggestedTag - Finding-frequency - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Generalized-photoparoxysmal-intermittent-photic-stimulation-response-limited - Limited to the stimulus-train. - - suggestedTag - Finding-frequency - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Generalized-photoparoxysmal-intermittent-photic-stimulation-response-self-sustained - - suggestedTag - Finding-frequency - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Activation-of-pre-existing-epileptogenic-area-intermittent-photic-stimulation-effect - - suggestedTag - Finding-frequency - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Unmodified-intermittent-photic-stimulation-effect - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Quality-of-hyperventilation - - requireChild - - - inLibrary - score - - - Hyperventilation-refused-procedure - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Hyperventilation-poor-effort - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Hyperventilation-good-effort - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Hyperventilation-excellent-effort - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Modulators-effect - Tags for describing the influence of the modulators - - requireChild - - - inLibrary - score - - - Modulators-effect-continuous-during-NRS - Continuous during non-rapid-eye-movement-sleep (NRS) - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Modulators-effect-only-during - - inLibrary - score - - - # - Only during Sleep/Awakening/Hyperventilation/Physical effort/Cognitive task. Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Modulators-effect-change-of-patterns - Change of patterns during sleep/awakening. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - - Time-related-property - Important to estimate how often an interictal abnormality is seen in the recording. - - requireChild - - - inLibrary - score - - - Appearance-mode - Describes how the non-ictal EEG pattern/graphoelement is distributed through the recording. - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - inLibrary - score - - - Random-appearance-mode - Occurrence of the non-ictal EEG pattern / graphoelement without any rhythmicity / periodicity. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Periodic-appearance-mode - Non-ictal EEG pattern / graphoelement occurring at an approximately regular rate / interval (generally of 1 to several seconds). - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Variable-appearance-mode - Occurrence of non-ictal EEG pattern / graphoelements, that is sometimes rhythmic or periodic, other times random, throughout the recording. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Intermittent-appearance-mode - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Continuous-appearance-mode - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Discharge-pattern - Describes the organization of the EEG signal within the discharge (distinguish between single and repetitive discharges) - - requireChild - - - inLibrary - score - - - Single-discharge-pattern - Applies to the intra-burst pattern: a graphoelement that is not repetitive; before and after the graphoelement one can distinguish the background activity. - - suggestedTag - Finding-incidence - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Rhythmic-trains-or-bursts-discharge-pattern - Applies to the intra-burst pattern: a non-ictal graphoelement that repeats itself without returning to the background activity between them. The graphoelements within this repetition occur at approximately constant period. - - suggestedTag - Finding-prevalence - Finding-frequency - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Arrhythmic-trains-or-bursts-discharge-pattern - Applies to the intra-burst pattern: a non-ictal graphoelement that repeats itself without returning to the background activity between them. The graphoelements within this repetition occur at inconstant period. - - suggestedTag - Finding-prevalence - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Fragmented-discharge-pattern - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Periodic-discharge-time-related-features - Periodic discharges not further specified (PDs) time-relayed features tags. - - requireChild - - - inLibrary - score - - - Periodic-discharge-duration - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - inLibrary - score - - - Very-brief-periodic-discharge-duration - Less than 10 sec. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Brief-periodic-discharge-duration - 10 to 59 sec. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Intermediate-periodic-discharge-duration - 1 to 4.9 min. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Long-periodic-discharge-duration - 5 to 59 min. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Very-long-periodic-discharge-duration - Greater than 1 hour. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Periodic-discharge-onset - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - inLibrary - score - - - Sudden-periodic-discharge-onset - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Gradual-periodic-discharge-onset - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Periodic-discharge-dynamics - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - inLibrary - score - - - Evolving-periodic-discharge-dynamics - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Fluctuating-periodic-discharge-dynamics - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Static-periodic-discharge-dynamics - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - - Finding-extent - Percentage of occurrence during the recording (background activity and interictal finding). - - inLibrary - score - - - # - - takesValue - - - valueClass - numericClass - - - inLibrary - score - - - - - Finding-incidence - How often it occurs/time-epoch. - - requireChild - - - inLibrary - score - - - Only-once-finding-incidence - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Rare-finding-incidence - less than 1/h - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Uncommon-finding-incidence - 1/5 min to 1/h. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Occasional-finding-incidence - 1/min to 1/5min. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Frequent-finding-incidence - 1/10 s to 1/min. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Abundant-finding-incidence - Greater than 1/10 s). - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Finding-prevalence - The percentage of the recording covered by the train/burst. - - requireChild - - - inLibrary - score - - - Rare-finding-prevalence - Less than 1 percent. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Occasional-finding-prevalence - 1 to 9 percent. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Frequent-finding-prevalence - 10 to 49 percent. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Abundant-finding-prevalence - 50 to 89 percent. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Continuous-finding-prevalence - Greater than 90 percent. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - - Posterior-dominant-rhythm-property - Posterior dominant rhythm is the most often scored EEG feature in clinical practice. Therefore, there are specific terms that can be chosen for characterizing the PDR. - - requireChild - - - inLibrary - score - - - Posterior-dominant-rhythm-amplitude-range - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - inLibrary - score - - - Low-posterior-dominant-rhythm-amplitude-range - Low (less than 20 microV). - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Medium-posterior-dominant-rhythm-amplitude-range - Medium (between 20 and 70 microV). - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - High-posterior-dominant-rhythm-amplitude-range - High (more than 70 microV). - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Posterior-dominant-rhythm-frequency-asymmetry - When symmetrical could be labeled with base schema Symmetrical tag. - - requireChild - - - inLibrary - score - - - Posterior-dominant-rhythm-frequency-asymmetry-lower-left - Hz lower on the left side. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Posterior-dominant-rhythm-frequency-asymmetry-lower-right - Hz lower on the right side. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Posterior-dominant-rhythm-eye-opening-reactivity - Change (disappearance or measurable decrease in amplitude) of a posterior dominant rhythm following eye-opening. Eye closure has the opposite effect. - - suggestedTag - Property-not-possible-to-determine - - - inLibrary - score - - - Posterior-dominant-rhythm-eye-opening-reactivity-reduced-left - Reduced left side reactivity. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Posterior-dominant-rhythm-eye-opening-reactivity-reduced-right - Reduced right side reactivity. - - inLibrary - score - - - # - free text - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Posterior-dominant-rhythm-eye-opening-reactivity-reduced-both - Reduced reactivity on both sides. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Posterior-dominant-rhythm-organization - When normal could be labeled with base schema Normal tag. - - requireChild - - - inLibrary - score - - - Posterior-dominant-rhythm-organization-poorly-organized - Poorly organized. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Posterior-dominant-rhythm-organization-disorganized - Disorganized. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Posterior-dominant-rhythm-organization-markedly-disorganized - Markedly disorganized. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Posterior-dominant-rhythm-caveat - Caveat to the annotation of PDR. - - requireChild - - - inLibrary - score - - - No-posterior-dominant-rhythm-caveat - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Posterior-dominant-rhythm-caveat-only-open-eyes-during-the-recording - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Posterior-dominant-rhythm-caveat-sleep-deprived-caveat - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Posterior-dominant-rhythm-caveat-drowsy - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Posterior-dominant-rhythm-caveat-only-following-hyperventilation - - inLibrary - score - - - - - Absence-of-posterior-dominant-rhythm - Reason for absence of PDR. - - requireChild - - - inLibrary - score - - - Absence-of-posterior-dominant-rhythm-artifacts - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Absence-of-posterior-dominant-rhythm-extreme-low-voltage - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Absence-of-posterior-dominant-rhythm-eye-closure-could-not-be-achieved - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Absence-of-posterior-dominant-rhythm-lack-of-awake-period - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Absence-of-posterior-dominant-rhythm-lack-of-compliance - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Absence-of-posterior-dominant-rhythm-other-causes - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - - Episode-property - - requireChild - - - inLibrary - score - - - Seizure-classification - Seizure classification refers to the grouping of seizures based on their clinical features, EEG patterns, and other characteristics. Epileptic seizures are named using the current ILAE seizure classification (Fisher et al., 2017, Beniczky et al., 2017). - - requireChild - - - inLibrary - score - - - Motor-seizure - Involves musculature in any form. The motor event could consist of an increase (positive) or decrease (negative) in muscle contraction to produce a movement. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - inLibrary - score - - - - Motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - inLibrary - score - - - Myoclonic-motor-seizure - Sudden, brief ( lower than 100 msec) involuntary single or multiple contraction(s) of muscles(s) or muscle groups of variable topography (axial, proximal limb, distal). Myoclonus is less regularly repetitive and less sustained than is clonus. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - inLibrary - score - - - - Myoclonic-motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - inLibrary - score - - - - Negative-myoclonic-motor-seizure - - inLibrary - score - - - - Negative-myoclonic-motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - inLibrary - score - - - - Clonic-motor-seizure - Jerking, either symmetric or asymmetric, that is regularly repetitive and involves the same muscle groups. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - inLibrary - score - - - - Clonic-motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - inLibrary - score - - - - Tonic-motor-seizure - A sustained increase in muscle contraction lasting a few seconds to minutes. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - inLibrary - score - - - - Tonic-motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - inLibrary - score - - - - Atonic-motor-seizure - Sudden loss or diminution of muscle tone without apparent preceding myoclonic or tonic event lasting about 1 to 2 s, involving head, trunk, jaw, or limb musculature. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - inLibrary - score - - - - Atonic-motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - inLibrary - score - - - - Myoclonic-atonic-motor-seizure - A generalized seizure type with a myoclonic jerk leading to an atonic motor component. This type was previously called myoclonic astatic. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - inLibrary - score - - - - Myoclonic-atonic-motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - inLibrary - score - - - - Myoclonic-tonic-clonic-motor-seizure - One or a few jerks of limbs bilaterally, followed by a tonic clonic seizure. The initial jerks can be considered to be either a brief period of clonus or myoclonus. Seizures with this characteristic are common in juvenile myoclonic epilepsy. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - inLibrary - score - - - - Myoclonic-tonic-clonic-motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - inLibrary - score - - - - Tonic-clonic-motor-seizure - A sequence consisting of a tonic followed by a clonic phase. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - inLibrary - score - - - - Tonic-clonic-motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - inLibrary - score - - - - Automatism-motor-seizure - A more or less coordinated motor activity usually occurring when cognition is impaired and for which the subject is usually (but not always) amnesic afterward. This often resembles a voluntary movement and may consist of an inappropriate continuation of preictal motor activity. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - inLibrary - score - - - - Automatism-motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - inLibrary - score - - - - Hyperkinetic-motor-seizure - - inLibrary - score - - - - Hyperkinetic-motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - inLibrary - score - - - - Epileptic-spasm-episode - A sudden flexion, extension, or mixed extension flexion of predominantly proximal and truncal muscles that is usually more sustained than a myoclonic movement but not as sustained as a tonic seizure. Limited forms may occur: Grimacing, head nodding, or subtle eye movements. Epileptic spasms frequently occur in clusters. Infantile spasms are the best known form, but spasms can occur at all ages. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - inLibrary - score - - - - - Nonmotor-seizure - Focal or generalized seizure types in which motor activity is not prominent. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - inLibrary - score - - - Behavior-arrest-nonmotor-seizure - Arrest (pause) of activities, freezing, immobilization, as in behavior arrest seizure. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - inLibrary - score - - - - Sensory-nonmotor-seizure - A perceptual experience not caused by appropriate stimuli in the external world. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - inLibrary - score - - - - Emotional-nonmotor-seizure - Seizures presenting with an emotion or the appearance of having an emotion as an early prominent feature, such as fear, spontaneous joy or euphoria, laughing (gelastic), or crying (dacrystic). Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - inLibrary - score - - - - Cognitive-nonmotor-seizure - Pertaining to thinking and higher cortical functions, such as language, spatial perception, memory, and praxis. The previous term for similar usage as a seizure type was psychic. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - inLibrary - score - - - - Autonomic-nonmotor-seizure - A distinct alteration of autonomic nervous system function involving cardiovascular, pupillary, gastrointestinal, sudomotor, vasomotor, and thermoregulatory functions. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - inLibrary - score - - - - - Absence-seizure - Absence seizures present with a sudden cessation of activity and awareness. Absence seizures tend to occur in younger age groups, have more sudden start and termination, and they usually display less complex automatisms than do focal seizures with impaired awareness, but the distinctions are not absolute. EEG information may be required for accurate classification. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - inLibrary - score - - - Typical-absence-seizure - A sudden onset, interruption of ongoing activities, a blank stare, possibly a brief upward deviation of the eyes. Usually the patient will be unresponsive when spoken to. Duration is a few seconds to half a minute with very rapid recovery. Although not always available, an EEG would show generalized epileptiform discharges during the event. An absence seizure is by definition a seizure of generalized onset. The word is not synonymous with a blank stare, which also can be encountered with focal onset seizures. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - inLibrary - score - - - - Atypical-absence-seizure - An absence seizure with changes in tone that are more pronounced than in typical absence or the onset and/or cessation is not abrupt, often associated with slow, irregular, generalized spike-wave activity. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - inLibrary - score - - - - Myoclonic-absence-seizure - A myoclonic absence seizure refers to an absence seizure with rhythmic three-per-second myoclonic movements, causing ratcheting abduction of the upper limbs leading to progressive arm elevation, and associated with three-per-second generalized spike-wave discharges. Duration is typically 10 to 60 s. Impairment of consciousness may not be obvious. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - inLibrary - score - - - - Eyelid-myoclonia-absence-seizure - Eyelid myoclonia are myoclonic jerks of the eyelids and upward deviation of the eyes, often precipitated by closing the eyes or by light. Eyelid myoclonia can be associated with absences, but also can be motor seizures without a corresponding absence, making them difficult to categorize. The 2017 classification groups them with nonmotor (absence) seizures, which may seem counterintuitive, but the myoclonia in this instance is meant to link with absence, rather than with nonmotor. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - inLibrary - score - - - - - - Episode-phase - The electroclinical findings (i.e., the seizure semiology and the ictal EEG) are divided in three phases: onset, propagation, and postictal. - - requireChild - - - suggestedTag - Seizure-semiology-manifestation - Postictal-semiology-manifestation - Ictal-EEG-patterns - - - inLibrary - score - - - Episode-phase-initial - - inLibrary - score - - - - Episode-phase-subsequent - - inLibrary - score - - - - Episode-phase-postictal - - inLibrary - score - - - - - Seizure-semiology-manifestation - Seizure semiology refers to the clinical features or signs that are observed during a seizure, such as the type of movements or behaviors exhibited by the person having the seizure, the duration of the seizure, the level of consciousness, and any associated symptoms such as aura or postictal confusion. In other words, seizure semiology describes the physical manifestations of a seizure. Semiology is described according to the ILAE Glossary of Descriptive Terminology for Ictal Semiology (Blume et al., 2001). Besides the name, the semiologic finding can also be characterized by the somatotopic modifier, laterality, body part and centricity. Uses Location-property tags. - - requireChild - - - inLibrary - score - - - Semiology-motor-manifestation - - inLibrary - score - - - Semiology-elementary-motor - - inLibrary - score - - - Semiology-motor-tonic - A sustained increase in muscle contraction lasting a few seconds to minutes. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-dystonic - Sustained contractions of both agonist and antagonist muscles producing athetoid or twisting movements, which, when prolonged, may produce abnormal postures. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-epileptic-spasm - A sudden flexion, extension, or mixed extension flexion of predominantly proximal and truncal muscles that is usually more sustained than a myoclonic movement but not so sustained as a tonic seizure (i.e., about 1 s). Limited forms may occur: grimacing, head nodding. Frequent occurrence in clusters. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-postural - Adoption of a posture that may be bilaterally symmetric or asymmetric (as in a fencing posture). - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-versive - A sustained, forced conjugate ocular, cephalic, and/or truncal rotation or lateral deviation from the midline. - - suggestedTag - Body-part-location - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-clonic - Myoclonus that is regularly repetitive, involves the same muscle groups, at a frequency of about 2 to 3 c/s, and is prolonged. Synonym: rhythmic myoclonus . - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-myoclonic - Characterized by myoclonus. MYOCLONUS : sudden, brief (lower than 100 ms) involuntary single or multiple contraction(s) of muscles(s) or muscle groups of variable topography (axial, proximal limb, distal). - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-jacksonian-march - Term indicating spread of clonic movements through contiguous body parts unilaterally. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-negative-myoclonus - Characterized by negative myoclonus. NEGATIVE MYOCLONUS: interruption of tonic muscular activity for lower than 500 ms without evidence of preceding myoclonia. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-tonic-clonic - A sequence consisting of a tonic followed by a clonic phase. Variants such as clonic-tonic-clonic may be seen. Asymmetry of limb posture during the tonic phase of a GTC: one arm is rigidly extended at the elbow (often with the fist clenched tightly and flexed at the wrist), whereas the opposite arm is flexed at the elbow. - - requireChild - - - inLibrary - score - - - Semiology-motor-tonic-clonic-without-figure-of-four - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-tonic-clonic-with-figure-of-four-extension-left-elbow - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-tonic-clonic-with-figure-of-four-extension-right-elbow - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - inLibrary - score - - - - - Semiology-motor-astatic - Loss of erect posture that results from an atonic, myoclonic, or tonic mechanism. Synonym: drop attack. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-atonic - Sudden loss or diminution of muscle tone without apparent preceding myoclonic or tonic event lasting greater or equal to 1 to 2 s, involving head, trunk, jaw, or limb musculature. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-eye-blinking - - suggestedTag - Brain-laterality - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-other-elementary-motor - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Semiology-motor-automatisms - - inLibrary - score - - - Semiology-motor-automatisms-mimetic - Facial expression suggesting an emotional state, often fear. - - suggestedTag - Episode-responsiveness - Episode-appearance - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-automatisms-oroalimentary - Lip smacking, lip pursing, chewing, licking, tooth grinding, or swallowing. - - suggestedTag - Episode-responsiveness - Episode-appearance - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-automatisms-dacrystic - Bursts of crying. - - suggestedTag - Episode-responsiveness - Episode-appearance - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-automatisms-dyspraxic - Inability to perform learned movements spontaneously or on command or imitation despite intact relevant motor and sensory systems and adequate comprehension and cooperation. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-responsiveness - Episode-appearance - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-automatisms-manual - 1. Indicates principally distal components, bilateral or unilateral. 2. Fumbling, tapping, manipulating movements. - - suggestedTag - Brain-laterality - Brain-centricity - Episode-responsiveness - Episode-appearance - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-automatisms-gestural - Semipurposive, asynchronous hand movements. Often unilateral. - - suggestedTag - Brain-laterality - Episode-responsiveness - Episode-appearance - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-automatisms-pedal - 1. Indicates principally distal components, bilateral or unilateral. 2. Fumbling, tapping, manipulating movements. - - suggestedTag - Brain-laterality - Brain-centricity - Episode-responsiveness - Episode-appearance - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-automatisms-hypermotor - 1. Involves predominantly proximal limb or axial muscles producing irregular sequential ballistic movements, such as pedaling, pelvic thrusting, thrashing, rocking movements. 2. Increase in rate of ongoing movements or inappropriately rapid performance of a movement. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-responsiveness - Episode-appearance - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-automatisms-hypokinetic - A decrease in amplitude and/or rate or arrest of ongoing motor activity. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-responsiveness - Episode-appearance - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-automatisms-gelastic - Bursts of laughter or giggling, usually without an appropriate affective tone. - - suggestedTag - Episode-responsiveness - Episode-appearance - Episode-event-count - - - inLibrary - score - - - - Semiology-motor-other-automatisms - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Semiology-motor-behavioral-arrest - Interruption of ongoing motor activity or of ongoing behaviors with fixed gaze, without movement of the head or trunk (oro-alimentary and hand automatisms may continue). - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - inLibrary - score - - - - - Semiology-non-motor-manifestation - - inLibrary - score - - - Semiology-sensory - - inLibrary - score - - - Semiology-sensory-headache - Headache occurring in close temporal proximity to the seizure or as the sole seizure manifestation. - - suggestedTag - Brain-laterality - Episode-event-count - - - inLibrary - score - - - - Semiology-sensory-visual - Flashing or flickering lights, spots, simple patterns, scotomata, or amaurosis. - - suggestedTag - Brain-laterality - Episode-event-count - - - inLibrary - score - - - - Semiology-sensory-auditory - Buzzing, drumming sounds or single tones. - - suggestedTag - Brain-laterality - Episode-event-count - - - inLibrary - score - - - - Semiology-sensory-olfactory - - suggestedTag - Body-part-location - Episode-event-count - - - inLibrary - score - - - - Semiology-sensory-gustatory - Taste sensations including acidic, bitter, salty, sweet, or metallic. - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Semiology-sensory-epigastric - Abdominal discomfort including nausea, emptiness, tightness, churning, butterflies, malaise, pain, and hunger; sensation may rise to chest or throat. Some phenomena may reflect ictal autonomic dysfunction. - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Semiology-sensory-somatosensory - Tingling, numbness, electric-shock sensation, sense of movement or desire to move. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - inLibrary - score - - - - Semiology-sensory-painful - Peripheral (lateralized/bilateral), cephalic, abdominal. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - inLibrary - score - - - - Semiology-sensory-autonomic-sensation - A sensation consistent with involvement of the autonomic nervous system, including cardiovascular, gastrointestinal, sudomotor, vasomotor, and thermoregulatory functions. (Thus autonomic aura; cf. autonomic events 3.0). - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Semiology-sensory-other - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Semiology-experiential - - inLibrary - score - - - Semiology-experiential-affective-emotional - Components include fear, depression, joy, and (rarely) anger. - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Semiology-experiential-hallucinatory - Composite perceptions without corresponding external stimuli involving visual, auditory, somatosensory, olfactory, and/or gustatory phenomena. Example: hearing and seeing people talking. - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Semiology-experiential-illusory - An alteration of actual percepts involving the visual, auditory, somatosensory, olfactory, or gustatory systems. - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Semiology-experiential-mnemonic - Components that reflect ictal dysmnesia such as feelings of familiarity (deja-vu) and unfamiliarity (jamais-vu). - - inLibrary - score - - - Semiology-experiential-mnemonic-Deja-vu - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Semiology-experiential-mnemonic-Jamais-vu - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - - Semiology-experiential-other - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Semiology-dyscognitive - The term describes events in which (1) disturbance of cognition is the predominant or most apparent feature, and (2a) two or more of the following components are involved, or (2b) involvement of such components remains undetermined. Otherwise, use the more specific term (e.g., mnemonic experiential seizure or hallucinatory experiential seizure). Components of cognition: ++ perception: symbolic conception of sensory information ++ attention: appropriate selection of a principal perception or task ++ emotion: appropriate affective significance of a perception ++ memory: ability to store and retrieve percepts or concepts ++ executive function: anticipation, selection, monitoring of consequences, and initiation of motor activity including praxis, speech. - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Semiology-language-related - - inLibrary - score - - - Semiology-language-related-vocalization - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Semiology-language-related-verbalization - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Semiology-language-related-dysphasia - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Semiology-language-related-aphasia - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Semiology-language-related-other - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Semiology-autonomic - - inLibrary - score - - - Semiology-autonomic-pupillary - Mydriasis, miosis (either bilateral or unilateral). - - suggestedTag - Brain-laterality - Episode-event-count - - - inLibrary - score - - - - Semiology-autonomic-hypersalivation - Increase in production of saliva leading to uncontrollable drooling - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Semiology-autonomic-respiratory-apnoeic - subjective shortness of breath, hyperventilation, stridor, coughing, choking, apnea, oxygen desaturation, neurogenic pulmonary edema. - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Semiology-autonomic-cardiovascular - Modifications of heart rate (tachycardia, bradycardia), cardiac arrhythmias (such as sinus arrhythmia, sinus arrest, supraventricular tachycardia, atrial premature depolarizations, ventricular premature depolarizations, atrio-ventricular block, bundle branch block, atrioventricular nodal escape rhythm, asystole). - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Semiology-autonomic-gastrointestinal - Nausea, eructation, vomiting, retching, abdominal sensations, abdominal pain, flatulence, spitting, diarrhea. - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Semiology-autonomic-urinary-incontinence - urinary urge (intense urinary urge at the beginning of seizures), urinary incontinence, ictal urination (rare symptom of partial seizures without loss of consciousness). - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Semiology-autonomic-genital - Sexual auras (erotic thoughts and feelings, sexual arousal and orgasm). Genital auras (unpleasant, sometimes painful, frightening or emotionally neutral somatosensory sensations in the genitals that can be accompanied by ictal orgasm). Sexual automatisms (hypermotor movements consisting of writhing, thrusting, rhythmic movements of the pelvis, arms and legs, sometimes associated with picking and rhythmic manipulation of the groin or genitalia, exhibitionism and masturbation). - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Semiology-autonomic-vasomotor - Flushing or pallor (may be accompanied by feelings of warmth, cold and pain). - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Semiology-autonomic-sudomotor - Sweating and piloerection (may be accompanied by feelings of warmth, cold and pain). - - suggestedTag - Brain-laterality - Episode-event-count - - - inLibrary - score - - - - Semiology-autonomic-thermoregulatory - Hyperthermia, fever. - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Semiology-autonomic-other - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - - Semiology-manifestation-other - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Postictal-semiology-manifestation - - requireChild - - - inLibrary - score - - - Postictal-semiology-unconscious - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Postictal-semiology-quick-recovery-of-consciousness - Quick recovery of awareness and responsiveness. - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Postictal-semiology-aphasia-or-dysphasia - Impaired communication involving language without dysfunction of relevant primary motor or sensory pathways, manifested as impaired comprehension, anomia, parahasic errors or a combination of these. - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Postictal-semiology-behavioral-change - Occurring immediately after a aseizure. Including psychosis, hypomanina, obsessive-compulsive behavior. - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Postictal-semiology-hemianopia - Postictal visual loss in a a hemi field. - - suggestedTag - Brain-laterality - Episode-event-count - - - inLibrary - score - - - - Postictal-semiology-impaired-cognition - Decreased Cognitive performance involving one or more of perception, attention, emotion, memory, execution, praxis, speech. - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Postictal-semiology-dysphoria - Depression, irritability, euphoric mood, fear, anxiety. - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Postictal-semiology-headache - Headache with features of tension-type or migraine headache that develops within 3 h following the seizure and resolves within 72 h after seizure. - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Postictal-semiology-nose-wiping - Noes-wiping usually within 60 sec of seizure offset, usually with the hand ipsilateral to the seizure onset. - - suggestedTag - Brain-laterality - Episode-event-count - - - inLibrary - score - - - - Postictal-semiology-anterograde-amnesia - Impaired ability to remember new material. - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Postictal-semiology-retrograde-amnesia - Impaired ability to recall previously remember material. - - suggestedTag - Episode-event-count - - - inLibrary - score - - - - Postictal-semiology-paresis - Todds palsy. Any unilateral postictal dysfunction relating to motor, language, sensory and/or integrative functions. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - inLibrary - score - - - - Postictal-semiology-sleep - Invincible need to sleep after a seizure. - - inLibrary - score - - - - Postictal-semiology-unilateral-myoclonic-jerks - unilateral motor phenomena, other then specified, occurring in postictal phase. - - inLibrary - score - - - - Postictal-semiology-other-unilateral-motor-phenomena - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Polygraphic-channel-relation-to-episode - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - inLibrary - score - - - Polygraphic-channel-cause-to-episode - - inLibrary - score - - - - Polygraphic-channel-consequence-of-episode - - inLibrary - score - - - - - Ictal-EEG-patterns - - inLibrary - score - - - Ictal-EEG-patterns-obscured-by-artifacts - The interpretation of the EEG is not possible due to artifacts. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Ictal-EEG-activity - - suggestedTag - Polyspikes-morphology - Fast-spike-activity-morphology - Low-voltage-fast-activity-morphology - Polysharp-waves-morphology - Spike-and-slow-wave-morphology - Polyspike-and-slow-wave-morphology - Sharp-and-slow-wave-morphology - Rhythmic-activity-morphology - Slow-wave-large-amplitude-morphology - Irregular-delta-or-theta-activity-morphology - Electrodecremental-change-morphology - DC-shift-morphology - Disappearance-of-ongoing-activity-morphology - Brain-laterality - Brain-region - Sensors - Source-analysis-laterality - Source-analysis-brain-region - Episode-event-count - - - inLibrary - score - - - - Postictal-EEG-activity - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - - - inLibrary - score - - - - - Episode-time-context-property - Additional clinically relevant features related to episodes can be scored under timing and context. If needed, episode duration can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Temporal-value/Duration. - - inLibrary - score - - - Episode-consciousness - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - inLibrary - score - - - Episode-consciousness-not-tested - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Episode-consciousness-affected - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Episode-consciousness-mildly-affected - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Episode-consciousness-not-affected - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Episode-awareness - - suggestedTag - Property-not-possible-to-determine - Property-exists - Property-absence - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Clinical-EEG-temporal-relationship - - suggestedTag - Property-not-possible-to-determine - - - inLibrary - score - - - Clinical-start-followed-EEG - Clinical start, followed by EEG start by X seconds. - - inLibrary - score - - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - inLibrary - score - - - - - EEG-start-followed-clinical - EEG start, followed by clinical start by X seconds. - - inLibrary - score - - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - inLibrary - score - - - - - Simultaneous-start-clinical-EEG - - inLibrary - score - - - - Clinical-EEG-temporal-relationship-notes - Clinical notes to annotate the clinical-EEG temporal relationship. - - inLibrary - score - - - # - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Episode-event-count - Number of stereotypical episodes during the recording. - - suggestedTag - Property-not-possible-to-determine - - - inLibrary - score - - - # - - takesValue - - - valueClass - numericClass - - - inLibrary - score - - - - - State-episode-start - State at the start of the episode. - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - inLibrary - score - - - Episode-start-from-sleep - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Episode-start-from-awake - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Episode-postictal-phase - - suggestedTag - Property-not-possible-to-determine - - - inLibrary - score - - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - inLibrary - score - - - - - Episode-prodrome - Prodrome is a preictal phenomenon, and it is defined as a subjective or objective clinical alteration (e.g., ill-localized sensation or agitation) that heralds the onset of an epileptic seizure but does not form part of it (Blume et al., 2001). Therefore, prodrome should be distinguished from aura (which is an ictal phenomenon). - - suggestedTag - Property-exists - Property-absence - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Episode-tongue-biting - - suggestedTag - Property-exists - Property-absence - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Episode-responsiveness - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - inLibrary - score - - - Episode-responsiveness-preserved - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Episode-responsiveness-affected - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Episode-appearance - - requireChild - - - inLibrary - score - - - Episode-appearance-interactive - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Episode-appearance-spontaneous - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Seizure-dynamics - Spatiotemporal dynamics can be scored (evolution in morphology; evolution in frequency; evolution in location). - - requireChild - - - inLibrary - score - - - Seizure-dynamics-evolution-morphology - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Seizure-dynamics-evolution-frequency - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Seizure-dynamics-evolution-location - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Seizure-dynamics-not-possible-to-determine - Not possible to determine. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - - - Other-finding-property - - requireChild - - - inLibrary - score - - - Artifact-significance-to-recording - It is important to score the significance of the described artifacts: recording is not interpretable, recording of reduced diagnostic value, does not interfere with the interpretation of the recording. - - requireChild - - - inLibrary - score - - - Recording-not-interpretable-due-to-artifact - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Recording-of-reduced-diagnostic-value-due-to-artifact - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Artifact-does-not-interfere-recording - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Finding-significance-to-recording - Significance of finding. When normal/abnormal could be labeled with base schema Normal/Abnormal tags. - - requireChild - - - inLibrary - score - - - Finding-no-definite-abnormality - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Finding-significance-not-possible-to-determine - Not possible to determine. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Finding-frequency - Value in Hz (number) typed in. - - inLibrary - score - - - # - - takesValue - - - valueClass - numericClass - - - unitClass - frequencyUnits - - - inLibrary - score - - - - - Finding-amplitude - Value in microvolts (number) typed in. - - inLibrary - score - - - # - - takesValue - - - valueClass - numericClass - - - unitClass - electricPotentialUnits - - - inLibrary - score - - - - - Finding-amplitude-asymmetry - For posterior dominant rhythm: a difference in amplitude between the homologous area on opposite sides of the head that consistently exceeds 50 percent. When symmetrical could be labeled with base schema Symmetrical tag. For sleep: Absence or consistently marked amplitude asymmetry (greater than 50 percent) of a normal sleep graphoelement. - - requireChild - - - inLibrary - score - - - Finding-amplitude-asymmetry-lower-left - Amplitude lower on the left side. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Finding-amplitude-asymmetry-lower-right - Amplitude lower on the right side. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Finding-amplitude-asymmetry-not-possible-to-determine - Not possible to determine. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Finding-stopped-by - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Finding-triggered-by - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Finding-unmodified - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Property-not-possible-to-determine - Not possible to determine. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Property-exists - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Property-absence - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - - Interictal-finding - EEG pattern / transient that is distinguished form the background activity, considered abnormal, but is not recorded during ictal period (seizure) or postictal period; the presence of an interictal finding does not necessarily imply that the patient has epilepsy. - - requireChild - - - inLibrary - score - - - Epileptiform-interictal-activity - - suggestedTag - Spike-morphology - Spike-and-slow-wave-morphology - Runs-of-rapid-spikes-morphology - Polyspikes-morphology - Polyspike-and-slow-wave-morphology - Sharp-wave-morphology - Sharp-and-slow-wave-morphology - Slow-sharp-wave-morphology - High-frequency-oscillation-morphology - Hypsarrhythmia-classic-morphology - Hypsarrhythmia-modified-morphology - Brain-laterality - Brain-region - Sensors - Finding-propagation - Multifocal-finding - Appearance-mode - Discharge-pattern - Finding-incidence - - - inLibrary - score - - - - Abnormal-interictal-rhythmic-activity - - suggestedTag - Rhythmic-activity-morphology - Polymorphic-delta-activity-morphology - Frontal-intermittent-rhythmic-delta-activity-morphology - Occipital-intermittent-rhythmic-delta-activity-morphology - Temporal-intermittent-rhythmic-delta-activity-morphology - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - Finding-incidence - - - inLibrary - score - - - - Interictal-special-patterns - - requireChild - - - inLibrary - score - - - Interictal-periodic-discharges - Periodic discharge not further specified (PDs). - - suggestedTag - Periodic-discharge-morphology - Brain-laterality - Brain-region - Sensors - Periodic-discharge-time-related-features - - - inLibrary - score - - - Generalized-periodic-discharges - GPDs. - - inLibrary - score - - - - Lateralized-periodic-discharges - LPDs. - - inLibrary - score - - - - Bilateral-independent-periodic-discharges - BIPDs. - - inLibrary - score - - - - Multifocal-periodic-discharges - MfPDs. - - inLibrary - score - - - - - Extreme-delta-brush - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - - - Item - An independently existing thing (living or nonliving). - - extensionAllowed - - - Biological-item - An entity that is biological, that is related to living organisms. - - Anatomical-item - A biological structure, system, fluid or other substance excluding single molecular entities. - - Body - The biological structure representing an organism. - - - Body-part - Any part of an organism. - - Head - The upper part of the human body, or the front or upper part of the body of an animal, typically separated from the rest of the body by a neck, and containing the brain, mouth, and sense organs. - - Ear - A sense organ needed for the detection of sound and for establishing balance. - - - Face - The anterior portion of the head extending from the forehead to the chin and ear to ear. The facial structures contain the eyes, nose and mouth, cheeks and jaws. - - Cheek - The fleshy part of the face bounded by the eyes, nose, ear, and jaw line. - - - Chin - The part of the face below the lower lip and including the protruding part of the lower jaw. - - - Eye - The organ of sight or vision. - - - Eyebrow - The arched strip of hair on the bony ridge above each eye socket. - - - Forehead - The part of the face between the eyebrows and the normal hairline. - - - Lip - Fleshy fold which surrounds the opening of the mouth. - - - Mouth - The proximal portion of the digestive tract, containing the oral cavity and bounded by the oral opening. - - - Nose - A structure of special sense serving as an organ of the sense of smell and as an entrance to the respiratory tract. - - - Teeth - The hard bonelike structures in the jaws. A collection of teeth arranged in some pattern in the mouth or other part of the body. - - - - Hair - The filamentous outgrowth of the epidermis. - - - - Lower-extremity - Refers to the whole inferior limb (leg and/or foot). - - Ankle - A gliding joint between the distal ends of the tibia and fibula and the proximal end of the talus. - - - Calf - The fleshy part at the back of the leg below the knee. - - - Foot - The structure found below the ankle joint required for locomotion. - - Big-toe - The largest toe on the inner side of the foot. - - - Heel - The back of the foot below the ankle. - - - Instep - The part of the foot between the ball and the heel on the inner side. - - - Little-toe - The smallest toe located on the outer side of the foot. - - - Toes - The terminal digits of the foot. - - - - Knee - A joint connecting the lower part of the femur with the upper part of the tibia. - - - Shin - Front part of the leg below the knee. - - - Thigh - Upper part of the leg between hip and knee. - - - - Torso - The body excluding the head and neck and limbs. - - Buttocks - The round fleshy parts that form the lower rear area of a human trunk. - - - Gentalia - The external organs of reproduction. - - deprecatedFrom - 8.1.0 - - - - Hip - The lateral prominence of the pelvis from the waist to the thigh. - - - Torso-back - The rear surface of the human body from the shoulders to the hips. - - - Torso-chest - The anterior side of the thorax from the neck to the abdomen. - - - Waist - The abdominal circumference at the navel. - - - - Upper-extremity - Refers to the whole superior limb (shoulder, arm, elbow, wrist, hand). - - Elbow - A type of hinge joint located between the forearm and upper arm. - - - Forearm - Lower part of the arm between the elbow and wrist. - - - Hand - The distal portion of the upper extremity. It consists of the carpus, metacarpus, and digits. - - Finger - Any of the digits of the hand. - - Index-finger - The second finger from the radial side of the hand, next to the thumb. - - - Little-finger - The fifth and smallest finger from the radial side of the hand. - - - Middle-finger - The middle or third finger from the radial side of the hand. - - - Ring-finger - The fourth finger from the radial side of the hand. - - - Thumb - The thick and short hand digit which is next to the index finger in humans. - - - - Knuckles - A part of a finger at a joint where the bone is near the surface, especially where the finger joins the hand. - - - Palm - The part of the inner surface of the hand that extends from the wrist to the bases of the fingers. - - - - Shoulder - Joint attaching upper arm to trunk. - - - Upper-arm - Portion of arm between shoulder and elbow. - - - Wrist - A joint between the distal end of the radius and the proximal row of carpal bones. - - - - - - Organism - A living entity, more specifically a biological entity that consists of one or more cells and is capable of genomic replication (independently or not). - - Animal - A living organism that has membranous cell walls, requires oxygen and organic foods, and is capable of voluntary movement. - - - Human - The bipedal primate mammal Homo sapiens. - - - Plant - Any living organism that typically synthesizes its food from inorganic substances and possesses cellulose cell walls. - - - - - Language-item - An entity related to a systematic means of communicating by the use of sounds, symbols, or gestures. - - suggestedTag - Sensory-presentation - - - Character - A mark or symbol used in writing. - - - Clause - A unit of grammatical organization next below the sentence in rank, usually consisting of a subject and predicate. - - - Glyph - A hieroglyphic character, symbol, or pictograph. - - - Nonword - A group of letters or speech sounds that looks or sounds like a word but that is not accepted as such by native speakers. - - - Paragraph - A distinct section of a piece of writing, usually dealing with a single theme. - - - Phoneme - A speech sound that is distinguished by the speakers of a particular language. - - - Phrase - A phrase is a group of words functioning as a single unit in the syntax of a sentence. - - - Sentence - A set of words that is complete in itself, conveying a statement, question, exclamation, or command and typically containing an explicit or implied subject and a predicate containing a finite verb. - - - Syllable - A unit of spoken language larger than a phoneme. - - - Textblock - A block of text. - - - Word - A word is the smallest free form (an item that may be expressed in isolation with semantic or pragmatic content) in a language. - - - - Object - Something perceptible by one or more of the senses, especially by vision or touch. A material thing. - - suggestedTag - Sensory-presentation - - - Geometric-object - An object or a representation that has structure and topology in space. - - 2D-shape - A planar, two-dimensional shape. - - Arrow - A shape with a pointed end indicating direction. - - - Clockface - The dial face of a clock. A location identifier based on clockface numbering or anatomic subregion. - - - Cross - A figure or mark formed by two intersecting lines crossing at their midpoints. - - - Dash - A horizontal stroke in writing or printing to mark a pause or break in sense or to represent omitted letters or words. - - - Ellipse - A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base. - - Circle - A ring-shaped structure with every point equidistant from the center. - - - - Rectangle - A parallelogram with four right angles. - - Square - A square is a special rectangle with four equal sides. - - - - Single-point - A point is a geometric entity that is located in a zero-dimensional spatial region and whose position is defined by its coordinates in some coordinate system. - - - Star - A conventional or stylized representation of a star, typically one having five or more points. - - - Triangle - A three-sided polygon. - - - - 3D-shape - A geometric three-dimensional shape. - - Box - A square or rectangular vessel, usually made of cardboard or plastic. - - Cube - A solid or semi-solid in the shape of a three dimensional square. - - - - Cone - A shape whose base is a circle and whose sides taper up to a point. - - - Cylinder - A surface formed by circles of a given radius that are contained in a plane perpendicular to a given axis, whose centers align on the axis. - - - Ellipsoid - A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base. - - Sphere - A solid or hollow three-dimensional object bounded by a closed surface such that every point on the surface is equidistant from the center. - - - - Pyramid - A polyhedron of which one face is a polygon of any number of sides, and the other faces are triangles with a common vertex. - - - - Pattern - An arrangement of objects, facts, behaviors, or other things which have scientific, mathematical, geometric, statistical, or other meaning. - - Dots - A small round mark or spot. - - - LED-pattern - A pattern created by lighting selected members of a fixed light emitting diode array. - - - - - Ingestible-object - Something that can be taken into the body by the mouth for digestion or absorption. - - - Man-made-object - Something constructed by human means. - - Building - A structure that has a roof and walls and stands more or less permanently in one place. - - Attic - A room or a space immediately below the roof of a building. - - - Basement - The part of a building that is wholly or partly below ground level. - - - Entrance - The means or place of entry. - - - Roof - A roof is the covering on the uppermost part of a building which provides protection from animals and weather, notably rain, but also heat, wind and sunlight. - - - Room - An area within a building enclosed by walls and floor and ceiling. - - - - Clothing - A covering designed to be worn on the body. - - - Device - An object contrived for a specific purpose. - - Assistive-device - A device that help an individual accomplish a task. - - Glasses - Frames with lenses worn in front of the eye for vision correction, eye protection, or protection from UV rays. - - - Writing-device - A device used for writing. - - Pen - A common writing instrument used to apply ink to a surface for writing or drawing. - - - Pencil - An implement for writing or drawing that is constructed of a narrow solid pigment core in a protective casing that prevents the core from being broken or marking the hand. - - - - - Computing-device - An electronic device which take inputs and processes results from the inputs. - - Cellphone - A telephone with access to a cellular radio system so it can be used over a wide area, without a physical connection to a network. - - - Desktop-computer - A computer suitable for use at an ordinary desk. - - - Laptop-computer - A computer that is portable and suitable for use while traveling. - - - Tablet-computer - A small portable computer that accepts input directly on to its screen rather than via a keyboard or mouse. - - - - Engine - A motor is a machine designed to convert one or more forms of energy into mechanical energy. - - - IO-device - Hardware used by a human (or other system) to communicate with a computer. - - Input-device - A piece of equipment used to provide data and control signals to an information processing system such as a computer or information appliance. - - Computer-mouse - A hand-held pointing device that detects two-dimensional motion relative to a surface. - - Mouse-button - An electric switch on a computer mouse which can be pressed or clicked to select or interact with an element of a graphical user interface. - - - Scroll-wheel - A scroll wheel or mouse wheel is a wheel used for scrolling made of hard plastic with a rubbery surface usually located between the left and right mouse buttons and is positioned perpendicular to the mouse surface. - - - - Joystick - A control device that uses a movable handle to create two-axis input for a computer device. - - - Keyboard - A device consisting of mechanical keys that are pressed to create input to a computer. - - Keyboard-key - A button on a keyboard usually representing letters, numbers, functions, or symbols. - - # - Value of a keyboard key. - - takesValue - - - - - - Keypad - A device consisting of keys, usually in a block arrangement, that provides limited input to a system. - - Keypad-key - A key on a separate section of a computer keyboard that groups together numeric keys and those for mathematical or other special functions in an arrangement like that of a calculator. - - # - Value of keypad key. - - takesValue - - - - - - Microphone - A device designed to convert sound to an electrical signal. - - - Push-button - A switch designed to be operated by pressing a button. - - - - Output-device - Any piece of computer hardware equipment which converts information into human understandable form. - - Auditory-device - A device designed to produce sound. - - Headphones - An instrument that consists of a pair of small loudspeakers, or less commonly a single speaker, held close to ears and connected to a signal source such as an audio amplifier, radio, CD player or portable media player. - - - Loudspeaker - A device designed to convert electrical signals to sounds that can be heard. - - - - Display-device - An output device for presentation of information in visual or tactile form the latter used for example in tactile electronic displays for blind people. - - Computer-screen - An electronic device designed as a display or a physical device designed to be a protective meshwork. - - Screen-window - A part of a computer screen that contains a display different from the rest of the screen. A window is a graphical control element consisting of a visual area containing some of the graphical user interface of the program it belongs to and is framed by a window decoration. - - - - Head-mounted-display - An instrument that functions as a display device, worn on the head or as part of a helmet, that has a small display optic in front of one (monocular HMD) or each eye (binocular HMD). - - - LED-display - A LED display is a flat panel display that uses an array of light-emitting diodes as pixels for a video display. - - - - - Recording-device - A device that copies information in a signal into a persistent information bearer. - - EEG-recorder - A device for recording electric currents in the brain using electrodes applied to the scalp, to the surface of the brain, or placed within the substance of the brain. - - - File-storage - A device for recording digital information to a permanent media. - - - MEG-recorder - A device for measuring the magnetic fields produced by electrical activity in the brain, usually conducted externally. - - - Motion-capture - A device for recording the movement of objects or people. - - - Tape-recorder - A device for recording and reproduction usually using magnetic tape for storage that can be saved and played back. - - - - Touchscreen - A control component that operates an electronic device by pressing the display on the screen. - - - - Machine - A human-made device that uses power to apply forces and control movement to perform an action. - - - Measurement-device - A device in which a measure function inheres. - - Clock - A device designed to indicate the time of day or to measure the time duration of an event or action. - - Clock-face - A location identifier based on clockface numbering or anatomic subregion. - - - - - Robot - A mechanical device that sometimes resembles a living animal and is capable of performing a variety of often complex human tasks on command or by being programmed in advance. - - - Tool - A component that is not part of a device but is designed to support its assemby or operation. - - - - Document - A physical object, or electronic counterpart, that is characterized by containing writing which is meant to be human-readable. - - Book - A volume made up of pages fastened along one edge and enclosed between protective covers. - - - Letter - A written message addressed to a person or organization. - - - Note - A brief written record. - - - Notebook - A book for notes or memoranda. - - - Questionnaire - A document consisting of questions and possibly responses, depending on whether it has been filled out. - - - - Furnishing - Furniture, fittings, and other decorative accessories, such as curtains and carpets, for a house or room. - - - Manufactured-material - Substances created or extracted from raw materials. - - Ceramic - A hard, brittle, heat-resistant and corrosion-resistant material made by shaping and then firing a nonmetallic mineral, such as clay, at a high temperature. - - - Glass - A brittle transparent solid with irregular atomic structure. - - - Paper - A thin sheet material produced by mechanically or chemically processing cellulose fibres derived from wood, rags, grasses or other vegetable sources in water. - - - Plastic - Various high-molecular-weight thermoplastic or thermosetting polymers that are capable of being molded, extruded, drawn, or otherwise shaped and then hardened into a form. - - - Steel - An alloy made up of iron with typically a few tenths of a percent of carbon to improve its strength and fracture resistance compared to iron. - - - - Media - Media are audo/visual/audiovisual modes of communicating information for mass consumption. - - Media-clip - A short segment of media. - - Audio-clip - A short segment of audio. - - - Audiovisual-clip - A short media segment containing both audio and video. - - - Video-clip - A short segment of video. - - - - Visualization - An planned process that creates images, diagrams or animations from the input data. - - Animation - A form of graphical illustration that changes with time to give a sense of motion or represent dynamic changes in the portrayal. - - - Art-installation - A large-scale, mixed-media constructions, often designed for a specific place or for a temporary period of time. - - - Braille - A display using a system of raised dots that can be read with the fingers by people who are blind. - - - Image - Any record of an imaging event whether physical or electronic. - - Cartoon - A type of illustration, sometimes animated, typically in a non-realistic or semi-realistic style. The specific meaning has evolved over time, but the modern usage usually refers to either an image or series of images intended for satire, caricature, or humor. A motion picture that relies on a sequence of illustrations for its animation. - - - Drawing - A representation of an object or outlining a figure, plan, or sketch by means of lines. - - - Icon - A sign (such as a word or graphic symbol) whose form suggests its meaning. - - - Painting - A work produced through the art of painting. - - - Photograph - An image recorded by a camera. - - - - Movie - A sequence of images displayed in succession giving the illusion of continuous movement. - - - Outline-visualization - A visualization consisting of a line or set of lines enclosing or indicating the shape of an object in a sketch or diagram. - - - Point-light-visualization - A display in which action is depicted using a few points of light, often generated from discrete sensors in motion capture. - - - Sculpture - A two- or three-dimensional representative or abstract forms, especially by carving stone or wood or by casting metal or plaster. - - - Stick-figure-visualization - A drawing showing the head of a human being or animal as a circle and all other parts as straight lines. - - - - - Navigational-object - An object whose purpose is to assist directed movement from one location to another. - - Path - A trodden way. A way or track laid down for walking or made by continual treading. - - - Road - An open way for the passage of vehicles, persons, or animals on land. - - Lane - A defined path with physical dimensions through which an object or substance may traverse. - - - - Runway - A paved strip of ground on a landing field for the landing and takeoff of aircraft. - - - - Vehicle - A mobile machine which transports people or cargo. - - Aircraft - A vehicle which is able to travel through air in an atmosphere. - - - Bicycle - A human-powered, pedal-driven, single-track vehicle, having two wheels attached to a frame, one behind the other. - - - Boat - A watercraft of any size which is able to float or plane on water. - - - Car - A wheeled motor vehicle used primarily for the transportation of human passengers. - - - Cart - A cart is a vehicle which has two wheels and is designed to transport human passengers or cargo. - - - Tractor - A mobile machine specifically designed to deliver a high tractive effort at slow speeds, and mainly used for the purposes of hauling a trailer or machinery used in agriculture or construction. - - - Train - A connected line of railroad cars with or without a locomotive. - - - Truck - A motor vehicle which, as its primary funcion, transports cargo rather than human passangers. - - - - - Natural-object - Something that exists in or is produced by nature, and is not artificial or man-made. - - Mineral - A solid, homogeneous, inorganic substance occurring in nature and having a definite chemical composition. - - - Natural-feature - A feature that occurs in nature. A prominent or identifiable aspect, region, or site of interest. - - Field - An unbroken expanse as of ice or grassland. - - - Hill - A rounded elevation of limited extent rising above the surrounding land with local relief of less than 300m. - - - Mountain - A landform that extends above the surrounding terrain in a limited area. - - - River - A natural freshwater surface stream of considerable volume and a permanent or seasonal flow, moving in a definite channel toward a sea, lake, or another river. - - - Waterfall - A sudden descent of water over a step or ledge in the bed of a river. - - - - - - Sound - Mechanical vibrations transmitted by an elastic medium. Something that can be heard. - - Environmental-sound - Sounds occuring in the environment. An accumulation of noise pollution that occurs outside. This noise can be caused by transport, industrial, and recreational activities. - - Crowd-sound - Noise produced by a mixture of sounds from a large group of people. - - - Signal-noise - Any part of a signal that is not the true or original signal but is introduced by the communication mechanism. - - - - Musical-sound - Sound produced by continuous and regular vibrations, as opposed to noise. - - Instrument-sound - Sound produced by a musical instrument. - - - Tone - A musical note, warble, or other sound used as a particular signal on a telephone or answering machine. - - - Vocalized-sound - Musical sound produced by vocal cords in a biological agent. - - - - Named-animal-sound - A sound recognizable as being associated with particular animals. - - Barking - Sharp explosive cries like sounds made by certain animals, especially a dog, fox, or seal. - - - Bleating - Wavering cries like sounds made by a sheep, goat, or calf. - - - Chirping - Short, sharp, high-pitched noises like sounds made by small birds or an insects. - - - Crowing - Loud shrill sounds characteristic of roosters. - - - Growling - Low guttural sounds like those that made in the throat by a hostile dog or other animal. - - - Meowing - Vocalizations like those made by as those cats. These sounds have diverse tones and are sometimes chattered, murmured or whispered. The purpose can be assertive. - - - Mooing - Deep vocal sounds like those made by a cow. - - - Purring - Low continuous vibratory sound such as those made by cats. The sound expresses contentment. - - - Roaring - Loud, deep, or harsh prolonged sounds such as those made by big cats and bears for long-distance communication and intimidation. - - - Squawking - Loud, harsh noises such as those made by geese. - - - - Named-object-sound - A sound identifiable as coming from a particular type of object. - - Alarm-sound - A loud signal often loud continuous ringing to alert people to a problem or condition that requires urgent attention. - - - Beep - A short, single tone, that is typically high-pitched and generally made by a computer or other machine. - - - Buzz - A persistent vibratory sound often made by a buzzer device and used to indicate something incorrect. - - - Click - The sound made by a mechanical cash register, often to designate a reward. - - - Ding - A short ringing sound such as that made by a bell, often to indicate a correct response or the expiration of time. - - - Horn-blow - A loud sound made by forcing air through a sound device that funnels air to create the sound, often used to sound an alert. - - - Ka-ching - The sound made by a mechanical cash register, often to designate a reward. - - - Siren - A loud, continuous sound often varying in frequency designed to indicate an emergency. - - - - - - Physiologic-pattern - EEG graphoelements or rhythms that are considered normal. They only should be scored if the physician considers that they have a specific clinical significance for the recording. - - requireChild - - - inLibrary - score - - - Rhythmic-activity-pattern - Not further specified. - - suggestedTag - Rhythmic-activity-morphology - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - Slow-alpha-variant-rhythm - Characteristic rhythms mostly at 4-5 Hz, recorded most prominently over the posterior regions of the head. Generally alternate, or are intermixed, with alpha rhythm to which they often are harmonically related. Amplitude varies but is frequently close to 50 micro V. Blocked or attenuated by attention, especially visual, and mental effort. Comment: slow alpha variant rhythms should be distinguished from posterior slow waves characteristic of children and adolescents and occasionally seen in young adults. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - Fast-alpha-variant-rhythm - Characteristic rhythm at 14-20 Hz, detected most prominently over the posterior regions of the head. May alternate or be intermixed with alpha rhythm. Blocked or attenuated by attention, especially visual, and mental effort. - - suggestedTag - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - Ciganek-rhythm - Midline theta rhythm (Ciganek rhythm) may be observed during wakefulness or drowsiness. The frequency is 4-7 Hz, and the location is midline (ie, vertex). The morphology is rhythmic, smooth, sinusoidal, arciform, spiky, or mu-like. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - Lambda-wave - Diphasic sharp transient occurring over occipital regions of the head of waking subjects during visual exploration. The main component is positive relative to other areas. Time-locked to saccadic eye movement. Amplitude varies but is generally below 50 micro V. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - Posterior-slow-waves-youth - Waves in the delta and theta range, of variable form, lasting 0.35 to 0.5 s or longer without any consistent periodicity, found in the range of 6-12 years (occasionally seen in young adults). Alpha waves are almost always intermingled or superimposed. Reactive similar to alpha activity. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - Diffuse-slowing-hyperventilation - Diffuse slowing induced by hyperventilation. Bilateral, diffuse slowing during hyperventilation. Recorded in 70 percent of normal children (3-5 years) and less then 10 percent of adults. Usually appear in the posterior regions and spread forward in younger age group, whereas they tend to appear in the frontal regions and spread backward in the older age group. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - Photic-driving - Physiologic response consisting of rhythmic activity elicited over the posterior regions of the head by repetitive photic stimulation at frequencies of about 5-30 Hz. Comments: term should be limited to activity time-locked to the stimulus and of frequency identical or harmonically related to the stimulus frequency. Photic driving should be distinguished from the visual evoked potentials elicited by isolated flashes of light or flashes repeated at very low frequency. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - Photomyogenic-response - A response to intermittent photic stimulation characterized by the appearance in the record of brief, repetitive muscular artifacts (spikes) over the anterior regions of the head. These often increase gradually in amplitude as stimuli are continued and cease promptly when the stimulus is withdrawn. Comment: this response is frequently associated with flutter of the eyelids and vertical oscillations of the eyeballs and sometimes with discrete jerking mostly involving the musculature of the face and head. (Preferred to synonym: photo-myoclonic response). - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - Other-physiologic-pattern - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Polygraphic-channel-finding - Changes observed in polygraphic channels can be scored: EOG, Respiration, ECG, EMG, other polygraphic channel (+ free text), and their significance logged (normal, abnormal, no definite abnormality). - - requireChild - - - inLibrary - score - - - EOG-channel-finding - ElectroOculoGraphy. - - suggestedTag - Finding-significance-to-recording - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Respiration-channel-finding - - suggestedTag - Finding-significance-to-recording - - - inLibrary - score - - - Respiration-oxygen-saturation - - inLibrary - score - - - # - - takesValue - - - valueClass - numericClass - - - inLibrary - score - - - - - Respiration-feature - - inLibrary - score - - - Apnoe-respiration - Add duration (range in seconds) and comments in free text. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Hypopnea-respiration - Add duration (range in seconds) and comments in free text - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Apnea-hypopnea-index-respiration - Events/h. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Periodic-respiration - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Tachypnea-respiration - Cycles/min. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Other-respiration-feature - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - - ECG-channel-finding - Electrocardiography. - - suggestedTag - Finding-significance-to-recording - - - inLibrary - score - - - ECG-QT-period - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - ECG-feature - - inLibrary - score - - - ECG-sinus-rhythm - Normal rhythm. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - ECG-arrhythmia - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - ECG-asystolia - Add duration (range in seconds) and comments in free text. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - ECG-bradycardia - Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - ECG-extrasystole - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - ECG-ventricular-premature-depolarization - Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - ECG-tachycardia - Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Other-ECG-feature - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - - EMG-channel-finding - electromyography - - suggestedTag - Finding-significance-to-recording - - - inLibrary - score - - - EMG-muscle-side - - inLibrary - score - - - EMG-left-muscle - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - EMG-right-muscle - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - EMG-bilateral-muscle - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - EMG-muscle-name - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - EMG-feature - - inLibrary - score - - - EMG-myoclonus - - inLibrary - score - - - Negative-myoclonus - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - EMG-myoclonus-rhythmic - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - EMG-myoclonus-arrhythmic - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - EMG-myoclonus-synchronous - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - EMG-myoclonus-asynchronous - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - EMG-PLMS - Periodic limb movements in sleep. - - inLibrary - score - - - - EMG-spasm - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - EMG-tonic-contraction - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - EMG-asymmetric-activation - - requireChild - - - inLibrary - score - - - EMG-asymmetric-activation-left-first - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - EMG-asymmetric-activation-right-first - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Other-EMG-features - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - - Other-polygraphic-channel - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Property - Something that pertains to a thing. A characteristic of some entity. A quality or feature regarded as a characteristic or inherent part of someone or something. HED attributes are adjectives or adverbs. - - extensionAllowed - - - Agent-property - Something that pertains to an agent. - - extensionAllowed - - - Agent-state - The state of the agent. - - Agent-cognitive-state - The state of the cognitive processes or state of mind of the agent. - - Alert - Condition of heightened watchfulness or preparation for action. - - - Anesthetized - Having lost sensation to pain or having senses dulled due to the effects of an anesthetic. - - - Asleep - Having entered a periodic, readily reversible state of reduced awareness and metabolic activity, usually accompanied by physical relaxation and brain activity. - - - Attentive - Concentrating and focusing mental energy on the task or surroundings. - - - Awake - In a non sleeping state. - - - Brain-dead - Characterized by the irreversible absence of cortical and brain stem functioning. - - - Comatose - In a state of profound unconsciousness associated with markedly depressed cerebral activity. - - - Distracted - Lacking in concentration because of being preoccupied. - - - Drowsy - In a state of near-sleep, a strong desire for sleep, or sleeping for unusually long periods. - - - Intoxicated - In a state with disturbed psychophysiological functions and responses as a result of administration or ingestion of a psychoactive substance. - - - Locked-in - In a state of complete paralysis of all voluntary muscles except for the ones that control the movements of the eyes. - - - Passive - Not responding or initiating an action in response to a stimulus. - - - Resting - A state in which the agent is not exhibiting any physical exertion. - - - Vegetative - A state of wakefulness and conscience, but (in contrast to coma) with involuntary opening of the eyes and movements (such as teeth grinding, yawning, or thrashing of the extremities). - - - - Agent-emotional-state - The status of the general temperament and outlook of an agent. - - Angry - Experiencing emotions characterized by marked annoyance or hostility. - - - Aroused - In a state reactive to stimuli leading to increased heart rate and blood pressure, sensory alertness, mobility and readiness to respond. - - - Awed - Filled with wonder. Feeling grand, sublime or powerful emotions characterized by a combination of joy, fear, admiration, reverence, and/or respect. - - - Compassionate - Feeling or showing sympathy and concern for others often evoked for a person who is in distress and associated with altruistic motivation. - - - Content - Feeling satisfaction with things as they are. - - - Disgusted - Feeling revulsion or profound disapproval aroused by something unpleasant or offensive. - - - Emotionally-neutral - Feeling neither satisfied nor dissatisfied. - - - Empathetic - Understanding and sharing the feelings of another. Being aware of, being sensitive to, and vicariously experiencing the feelings, thoughts, and experience of another. - - - Excited - Feeling great enthusiasm and eagerness. - - - Fearful - Feeling apprehension that one may be in danger. - - - Frustrated - Feeling annoyed as a result of being blocked, thwarted, disappointed or defeated. - - - Grieving - Feeling sorrow in response to loss, whether physical or abstract. - - - Happy - Feeling pleased and content. - - - Jealous - Feeling threatened by a rival in a relationship with another individual, in particular an intimate partner, usually involves feelings of threat, fear, suspicion, distrust, anxiety, anger, betrayal, and rejection. - - - Joyful - Feeling delight or intense happiness. - - - Loving - Feeling a strong positive emotion of affection and attraction. - - - Relieved - No longer feeling pain, distress, anxiety, or reassured. - - - Sad - Feeling grief or unhappiness. - - - Stressed - Experiencing mental or emotional strain or tension. - - - - Agent-physiological-state - Having to do with the mechanical, physical, or biochemical function of an agent. - - Healthy - Having no significant health-related issues. - - relatedTag - Sick - - - - Hungry - Being in a state of craving or desiring food. - - relatedTag - Sated - Thirsty - - - - Rested - Feeling refreshed and relaxed. - - relatedTag - Tired - - - - Sated - Feeling full. - - relatedTag - Hungry - - - - Sick - Being in a state of ill health, bodily malfunction, or discomfort. - - relatedTag - Healthy - - - - Thirsty - Feeling a need to drink. - - relatedTag - Hungry - - - - Tired - Feeling in need of sleep or rest. - - relatedTag - Rested - - - - - Agent-postural-state - Pertaining to the position in which agent holds their body. - - Crouching - Adopting a position where the knees are bent and the upper body is brought forward and down, sometimes to avoid detection or to defend oneself. - - - Eyes-closed - Keeping eyes closed with no blinking. - - - Eyes-open - Keeping eyes open with occasional blinking. - - - Kneeling - Positioned where one or both knees are on the ground. - - - On-treadmill - Ambulation on an exercise apparatus with an endless moving belt to support moving in place. - - - Prone - Positioned in a recumbent body position whereby the person lies on its stomach and faces downward. - - - Seated-with-chin-rest - Using a device that supports the chin and head. - - - Sitting - In a seated position. - - - Standing - Assuming or maintaining an erect upright position. - - - - - Agent-task-role - The function or part that is ascribed to an agent in performing the task. - - Experiment-actor - An agent who plays a predetermined role to create the experiment scenario. - - - Experiment-controller - An agent exerting control over some aspect of the experiment. - - - Experiment-participant - Someone who takes part in an activity related to an experiment. - - - Experimenter - Person who is the owner of the experiment and has its responsibility. - - - - Agent-trait - A genetically, environmentally, or socially determined characteristic of an agent. - - Age - Length of time elapsed time since birth of the agent. - - # - - takesValue - - - valueClass - numericClass - - - - - Agent-experience-level - Amount of skill or knowledge that the agent has as pertains to the task. - - Expert-level - Having comprehensive and authoritative knowledge of or skill in a particular area related to the task. - - relatedTag - Intermediate-experience-level - Novice-level - - - - Intermediate-experience-level - Having a moderate amount of knowledge or skill related to the task. - - relatedTag - Expert-level - Novice-level - - - - Novice-level - Being inexperienced in a field or situation related to the task. - - relatedTag - Expert-level - Intermediate-experience-level - - - - - Ethnicity - Belong to a social group that has a common national or cultural tradition. Use with Label to avoid extension. - - - Gender - Characteristics that are socially constructed, including norms, behaviors, and roles based on sex. - - - Handedness - Individual preference for use of a hand, known as the dominant hand. - - Ambidextrous - Having no overall dominance in the use of right or left hand or foot in the performance of tasks that require one hand or foot. - - - Left-handed - Preference for using the left hand or foot for tasks requiring the use of a single hand or foot. - - - Right-handed - Preference for using the right hand or foot for tasks requiring the use of a single hand or foot. - - - - Race - Belonging to a group sharing physical or social qualities as defined within a specified society. Use with Label to avoid extension. - - - Sex - Physical properties or qualities by which male is distinguished from female. - - Female - Biological sex of an individual with female sexual organs such ova. - - - Intersex - Having genitalia and/or secondary sexual characteristics of indeterminate sex. - - - Male - Biological sex of an individual with male sexual organs producing sperm. - - - - - - Data-property - Something that pertains to data or information. - - extensionAllowed - - - Data-marker - An indicator placed to mark something. - - Data-break-marker - An indicator place to indicate a gap in the data. - - - Temporal-marker - An indicator placed at a particular time in the data. - - Inset - Marks an intermediate point in an ongoing event of temporal extent. - - topLevelTagGroup - - - reserved - - - relatedTag - Onset - Offset - - - - Offset - Marks the end of an event of temporal extent. - - topLevelTagGroup - - - reserved - - - relatedTag - Onset - Inset - - - - Onset - Marks the start of an ongoing event of temporal extent. - - topLevelTagGroup - - - reserved - - - relatedTag - Inset - Offset - - - - Pause - Indicates the temporary interruption of the operation a process and subsequently wait for a signal to continue. - - - Time-out - A cancellation or cessation that automatically occurs when a predefined interval of time has passed without a certain event occurring. - - - Time-sync - A synchronization signal whose purpose to help synchronize different signals or processes. Often used to indicate a marker inserted into the recorded data to allow post hoc synchronization of concurrently recorded data streams. - - - - - Data-resolution - Smallest change in a quality being measured by an sensor that causes a perceptible change. - - Printer-resolution - Resolution of a printer, usually expressed as the number of dots-per-inch for a printer. - - # - - takesValue - - - valueClass - numericClass - - - - - Screen-resolution - Resolution of a screen, usually expressed as the of pixels in a dimension for a digital display device. - - # - - takesValue - - - valueClass - numericClass - - - - - Sensory-resolution - Resolution of measurements by a sensing device. - - # - - takesValue - - - valueClass - numericClass - - - - - Spatial-resolution - Linear spacing of a spatial measurement. - - # - - takesValue - - - valueClass - numericClass - - - - - Spectral-resolution - Measures the ability of a sensor to resolve features in the electromagnetic spectrum. - - # - - takesValue - - - valueClass - numericClass - - - - - Temporal-resolution - Measures the ability of a sensor to resolve features in time. - - # - - takesValue - - - valueClass - numericClass - - - - - - Data-source-type - The type of place, person, or thing from which the data comes or can be obtained. - - Computed-feature - A feature computed from the data by a tool. This tag should be grouped with a label of the form Toolname_propertyName. - - - Computed-prediction - A computed extrapolation of known data. - - - Expert-annotation - An explanatory or critical comment or other in-context information provided by an authority. - - - Instrument-measurement - Information obtained from a device that is used to measure material properties or make other observations. - - - Observation - Active acquisition of information from a primary source. Should be grouped with a label of the form AgentID_featureName. - - - - Data-value - Designation of the type of a data item. - - Categorical-value - Indicates that something can take on a limited and usually fixed number of possible values. - - Categorical-class-value - Categorical values that fall into discrete classes such as true or false. The grouping is absolute in the sense that it is the same for all participants. - - All - To a complete degree or to the full or entire extent. - - relatedTag - Some - None - - - - Correct - Free from error. Especially conforming to fact or truth. - - relatedTag - Wrong - - - - Explicit - Stated clearly and in detail, leaving no room for confusion or doubt. - - relatedTag - Implicit - - - - False - Not in accordance with facts, reality or definitive criteria. - - relatedTag - True - - - - Implicit - Implied though not plainly expressed. - - relatedTag - Explicit - - - - Invalid - Not allowed or not conforming to the correct format or specifications. - - relatedTag - Valid - - - - None - No person or thing, nobody, not any. - - relatedTag - All - Some - - - - Some - At least a small amount or number of, but not a large amount of, or often. - - relatedTag - All - None - - - - True - Conforming to facts, reality or definitive criteria. - - relatedTag - False - - - - Valid - Allowable, usable, or acceptable. - - relatedTag - Invalid - - - - Wrong - Inaccurate or not correct. - - relatedTag - Correct - - - - - Categorical-judgment-value - Categorical values that are based on the judgment or perception of the participant such familiar and famous. - - Abnormal - Deviating in any way from the state, position, structure, condition, behavior, or rule which is considered a norm. - - relatedTag - Normal - - - - Asymmetrical - Lacking symmetry or having parts that fail to correspond to one another in shape, size, or arrangement. - - relatedTag - Symmetrical - - - - Audible - A sound that can be perceived by the participant. - - relatedTag - Inaudible - - - - Complex - Hard, involved or complicated, elaborate, having many parts. - - relatedTag - Simple - - - - Congruent - Concordance of multiple evidence lines. In agreement or harmony. - - relatedTag - Incongruent - - - - Constrained - Keeping something within particular limits or bounds. - - relatedTag - Unconstrained - - - - Disordered - Not neatly arranged. Confused and untidy. A structural quality in which the parts of an object are non-rigid. - - relatedTag - Ordered - - - - Familiar - Recognized, familiar, or within the scope of knowledge. - - relatedTag - Unfamiliar - Famous - - - - Famous - A person who has a high degree of recognition by the general population for his or her success or accomplishments. A famous person. - - relatedTag - Familiar - Unfamiliar - - - - Inaudible - A sound below the threshold of perception of the participant. - - relatedTag - Audible - - - - Incongruent - Not in agreement or harmony. - - relatedTag - Congruent - - - - Involuntary - An action that is not made by choice. In the body, involuntary actions (such as blushing) occur automatically, and cannot be controlled by choice. - - relatedTag - Voluntary - - - - Masked - Information exists but is not provided or is partially obscured due to security, privacy, or other concerns. - - relatedTag - Unmasked - - - - Normal - Being approximately average or within certain limits. Conforming with or constituting a norm or standard or level or type or social norm. - - relatedTag - Abnormal - - - - Ordered - Conforming to a logical or comprehensible arrangement of separate elements. - - relatedTag - Disordered - - - - Simple - Easily understood or presenting no difficulties. - - relatedTag - Complex - - - - Symmetrical - Made up of exactly similar parts facing each other or around an axis. Showing aspects of symmetry. - - relatedTag - Asymmetrical - - - - Unconstrained - Moving without restriction. - - relatedTag - Constrained - - - - Unfamiliar - Not having knowledge or experience of. - - relatedTag - Familiar - Famous - - - - Unmasked - Information is revealed. - - relatedTag - Masked - - - - Voluntary - Using free will or design; not forced or compelled; controlled by individual volition. - - relatedTag - Involuntary - - - - - Categorical-level-value - Categorical values based on dividing a continuous variable into levels such as high and low. - - Cold - Having an absence of heat. - - relatedTag - Hot - - - - Deep - Extending relatively far inward or downward. - - relatedTag - Shallow - - - - High - Having a greater than normal degree, intensity, or amount. - - relatedTag - Low - Medium - - - - Hot - Having an excess of heat. - - relatedTag - Cold - - - - Large - Having a great extent such as in physical dimensions, period of time, amplitude or frequency. - - relatedTag - Small - - - - Liminal - Situated at a sensory threshold that is barely perceptible or capable of eliciting a response. - - relatedTag - Subliminal - Supraliminal - - - - Loud - Having a perceived high intensity of sound. - - relatedTag - Quiet - - - - Low - Less than normal in degree, intensity or amount. - - relatedTag - High - - - - Medium - Mid-way between small and large in number, quantity, magnitude or extent. - - relatedTag - Low - High - - - - Negative - Involving disadvantage or harm. - - relatedTag - Positive - - - - Positive - Involving advantage or good. - - relatedTag - Negative - - - - Quiet - Characterizing a perceived low intensity of sound. - - relatedTag - Loud - - - - Rough - Having a surface with perceptible bumps, ridges, or irregularities. - - relatedTag - Smooth - - - - Shallow - Having a depth which is relatively low. - - relatedTag - Deep - - - - Small - Having a small extent such as in physical dimensions, period of time, amplitude or frequency. - - relatedTag - Large - - - - Smooth - Having a surface free from bumps, ridges, or irregularities. - - relatedTag - Rough - - - - Subliminal - Situated below a sensory threshold that is imperceptible or not capable of eliciting a response. - - relatedTag - Liminal - Supraliminal - - - - Supraliminal - Situated above a sensory threshold that is perceptible or capable of eliciting a response. - - relatedTag - Liminal - Subliminal - - - - Thick - Wide in width, extent or cross-section. - - relatedTag - Thin - - - - Thin - Narrow in width, extent or cross-section. - - relatedTag - Thick - - - - - Categorical-orientation-value - Value indicating the orientation or direction of something. - - Backward - Directed behind or to the rear. - - relatedTag - Forward - - - - Downward - Moving or leading toward a lower place or level. - - relatedTag - Leftward - Rightward - Upward - - - - Forward - At or near or directed toward the front. - - relatedTag - Backward - - - - Horizontally-oriented - Oriented parallel to or in the plane of the horizon. - - relatedTag - Vertically-oriented - - - - Leftward - Going toward or facing the left. - - relatedTag - Downward - Rightward - Upward - - - - Oblique - Slanting or inclined in direction, course, or position that is neither parallel nor perpendicular nor right-angular. - - relatedTag - Rotated - - - - Rightward - Going toward or situated on the right. - - relatedTag - Downward - Leftward - Upward - - - - Rotated - Positioned offset around an axis or center. - - - Upward - Moving, pointing, or leading to a higher place, point, or level. - - relatedTag - Downward - Leftward - Rightward - - - - Vertically-oriented - Oriented perpendicular to the plane of the horizon. - - relatedTag - Horizontally-oriented - - - - - - Physical-value - The value of some physical property of something. - - Temperature - A measure of hot or cold based on the average kinetic energy of the atoms or molecules in the system. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - temperatureUnits - - - - - Weight - The relative mass or the quantity of matter contained by something. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - weightUnits - - - - - - Quantitative-value - Something capable of being estimated or expressed with numeric values. - - Fraction - A numerical value between 0 and 1. - - # - - takesValue - - - valueClass - numericClass - - - - - Item-count - The integer count of something which is usually grouped with the entity it is counting. (Item-count/3, A) indicates that 3 of A have occurred up to this point. - - # - - takesValue - - - valueClass - numericClass - - - - - Item-index - The index of an item in a collection, sequence or other structure. (A (Item-index/3, B)) means that A is item number 3 in B. - - # - - takesValue - - - valueClass - numericClass - - - - - Item-interval - An integer indicating how many items or entities have passed since the last one of these. An item interval of 0 indicates the current item. - - # - - takesValue - - - valueClass - numericClass - - - - - Percentage - A fraction or ratio with 100 understood as the denominator. - - # - - takesValue - - - valueClass - numericClass - - - - - Ratio - A quotient of quantities of the same kind for different components within the same system. - - # - - takesValue - - - valueClass - numericClass - - - - - - Spatiotemporal-value - A property relating to space and/or time. - - Rate-of-change - The amount of change accumulated per unit time. - - Acceleration - Magnitude of the rate of change in either speed or direction. The direction of change should be given separately. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - accelerationUnits - - - - - Frequency - Frequency is the number of occurrences of a repeating event per unit time. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - frequencyUnits - - - - - Jerk-rate - Magnitude of the rate at which the acceleration of an object changes with respect to time. The direction of change should be given separately. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - jerkUnits - - - - - Refresh-rate - The frequency with which the image on a computer monitor or similar electronic display screen is refreshed, usually expressed in hertz. - - # - - takesValue - - - valueClass - numericClass - - - - - Sampling-rate - The number of digital samples taken or recorded per unit of time. - - # - - takesValue - - - unitClass - frequencyUnits - - - - - Speed - A scalar measure of the rate of movement of the object expressed either as the distance travelled divided by the time taken (average speed) or the rate of change of position with respect to time at a particular point (instantaneous speed). The direction of change should be given separately. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - speedUnits - - - - - Temporal-rate - The number of items per unit of time. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - frequencyUnits - - - - - - Spatial-value - Value of an item involving space. - - Angle - The amount of inclination of one line to another or the plane of one object to another. - - # - - takesValue - - - unitClass - angleUnits - - - valueClass - numericClass - - - - - Distance - A measure of the space separating two objects or points. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - physicalLengthUnits - - - - - Position - A reference to the alignment of an object, a particular situation or view of a situation, or the location of an object. Coordinates with respect a specified frame of reference or the default Screen-frame if no frame is given. - - X-position - The position along the x-axis of the frame of reference. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - physicalLengthUnits - - - - - Y-position - The position along the y-axis of the frame of reference. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - physicalLengthUnits - - - - - Z-position - The position along the z-axis of the frame of reference. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - physicalLengthUnits - - - - - - Size - The physical magnitude of something. - - Area - The extent of a 2-dimensional surface enclosed within a boundary. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - areaUnits - - - - - Depth - The distance from the surface of something especially from the perspective of looking from the front. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - physicalLengthUnits - - - - - Height - The vertical measurement or distance from the base to the top of an object. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - physicalLengthUnits - - - - - Length - The linear extent in space from one end of something to the other end, or the extent of something from beginning to end. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - physicalLengthUnits - - - - - Volume - The amount of three dimensional space occupied by an object or the capacity of a space or container. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - volumeUnits - - - - - Width - The extent or measurement of something from side to side. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - physicalLengthUnits - - - - - - - Temporal-value - A characteristic of or relating to time or limited by time. - - Delay - The time at which an event start time is delayed from the current onset time. This tag defines the start time of an event of temporal extent and may be used with the Duration tag. - - topLevelTagGroup - - - reserved - - - relatedTag - Duration - - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - - - Duration - The period of time during which an event occurs. This tag defines the end time of an event of temporal extent and may be used with the Delay tag. - - topLevelTagGroup - - - reserved - - - relatedTag - Delay - - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - - - Time-interval - The period of time separating two instances, events, or occurrences. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - - - Time-value - A value with units of time. Usually grouped with tags identifying what the value represents. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - - - - - Statistical-value - A value based on or employing the principles of statistics. - - extensionAllowed - - - Data-maximum - The largest possible quantity or degree. - - # - - takesValue - - - valueClass - numericClass - - - - - Data-mean - The sum of a set of values divided by the number of values in the set. - - # - - takesValue - - - valueClass - numericClass - - - - - Data-median - The value which has an equal number of values greater and less than it. - - # - - takesValue - - - valueClass - numericClass - - - - - Data-minimum - The smallest possible quantity. - - # - - takesValue - - - valueClass - numericClass - - - - - Probability - A measure of the expectation of the occurrence of a particular event. - - # - - takesValue - - - valueClass - numericClass - - - - - Standard-deviation - A measure of the range of values in a set of numbers. Standard deviation is a statistic used as a measure of the dispersion or variation in a distribution, equal to the square root of the arithmetic mean of the squares of the deviations from the arithmetic mean. - - # - - takesValue - - - valueClass - numericClass - - - - - Statistical-accuracy - A measure of closeness to true value expressed as a number between 0 and 1. - - # - - takesValue - - - valueClass - numericClass - - - - - Statistical-precision - A quantitative representation of the degree of accuracy necessary for or associated with a particular action. - - # - - takesValue - - - valueClass - numericClass - - - - - Statistical-recall - Sensitivity is a measurement datum qualifying a binary classification test and is computed by substracting the false negative rate to the integral numeral 1. - - # - - takesValue - - - valueClass - numericClass - - - - - Statistical-uncertainty - A measure of the inherent variability of repeated observation measurements of a quantity including quantities evaluated by statistical methods and by other means. - - # - - takesValue - - - valueClass - numericClass - - - - - - - Data-variability-attribute - An attribute describing how something changes or varies. - - Abrupt - Marked by sudden change. - - - Constant - Continually recurring or continuing without interruption. Not changing in time or space. - - - Continuous - Uninterrupted in time, sequence, substance, or extent. - - relatedTag - Discrete - Discontinuous - - - - Decreasing - Becoming smaller or fewer in size, amount, intensity, or degree. - - relatedTag - Increasing - - - - Deterministic - No randomness is involved in the development of the future states of the element. - - relatedTag - Random - Stochastic - - - - Discontinuous - Having a gap in time, sequence, substance, or extent. - - relatedTag - Continuous - - - - Discrete - Constituting a separate entities or parts. - - relatedTag - Continuous - Discontinuous - - - - Estimated-value - Something that has been calculated or measured approximately. - - - Exact-value - A value that is viewed to the true value according to some standard. - - - Flickering - Moving irregularly or unsteadily or burning or shining fitfully or with a fluctuating light. - - - Fractal - Having extremely irregular curves or shapes for which any suitably chosen part is similar in shape to a given larger or smaller part when magnified or reduced to the same size. - - - Increasing - Becoming greater in size, amount, or degree. - - relatedTag - Decreasing - - - - Random - Governed by or depending on chance. Lacking any definite plan or order or purpose. - - relatedTag - Deterministic - Stochastic - - - - Repetitive - A recurring action that is often non-purposeful. - - - Stochastic - Uses a random probability distribution or pattern that may be analysed statistically but may not be predicted precisely to determine future states. - - relatedTag - Deterministic - Random - - - - Varying - Differing in size, amount, degree, or nature. - - - - - Environmental-property - Relating to or arising from the surroundings of an agent. - - Augmented-reality - Using technology that enhances real-world experiences with computer-derived digital overlays to change some aspects of perception of the natural environment. The digital content is shown to the user through a smart device or glasses and responds to changes in the environment. - - - Indoors - Located inside a building or enclosure. - - - Motion-platform - A mechanism that creates the feelings of being in a real motion environment. - - - Outdoors - Any area outside a building or shelter. - - - Real-world - Located in a place that exists in real space and time under realistic conditions. - - - Rural - Of or pertaining to the country as opposed to the city. - - - Terrain - Characterization of the physical features of a tract of land. - - Composite-terrain - Tracts of land characterized by a mixure of physical features. - - - Dirt-terrain - Tracts of land characterized by a soil surface and lack of vegetation. - - - Grassy-terrain - Tracts of land covered by grass. - - - Gravel-terrain - Tracts of land covered by a surface consisting a loose aggregation of small water-worn or pounded stones. - - - Leaf-covered-terrain - Tracts of land covered by leaves and composited organic material. - - - Muddy-terrain - Tracts of land covered by a liquid or semi-liquid mixture of water and some combination of soil, silt, and clay. - - - Paved-terrain - Tracts of land covered with concrete, asphalt, stones, or bricks. - - - Rocky-terrain - Tracts of land consisting or full of rock or rocks. - - - Sloped-terrain - Tracts of land arranged in a sloping or inclined position. - - - Uneven-terrain - Tracts of land that are not level, smooth, or regular. - - - - Urban - Relating to, located in, or characteristic of a city or densely populated area. - - - Virtual-world - Using technology that creates immersive, computer-generated experiences that a person can interact with and navigate through. The digital content is generally delivered to the user through some type of headset and responds to changes in head position or through interaction with other types of sensors. Existing in a virtual setting such as a simulation or game environment. - - - - Informational-property - Something that pertains to a task. - - extensionAllowed - - - Description - An explanation of what the tag group it is in means. If the description is at the top-level of an event string, the description applies to the event. - - requireChild - - - # - - takesValue - - - valueClass - textClass - - - - - ID - An alphanumeric name that identifies either a unique object or a unique class of objects. Here the object or class may be an idea, physical countable object (or class), or physical uncountable substance (or class). - - requireChild - - - # - - takesValue - - - valueClass - textClass - - - - - Label - A string of 20 or fewer characters identifying something. Labels usually refer to general classes of things while IDs refer to specific instances. A term that is associated with some entity. A brief description given for purposes of identification. An identifying or descriptive marker that is attached to an object. - - requireChild - - - # - - takesValue - - - valueClass - nameClass - - - - - Metadata - Data about data. Information that describes another set of data. - - CogAtlas - The Cognitive Atlas ID number of something. - - # - - takesValue - - - - - CogPo - The CogPO ID number of something. - - # - - takesValue - - - - - Creation-date - The date on which data creation of this element began. - - requireChild - - - # - - takesValue - - - valueClass - dateTimeClass - - - - - Experimental-note - A brief written record about the experiment. - - # - - takesValue - - - valueClass - textClass - - - - - Library-name - Official name of a HED library. - - # - - takesValue - - - valueClass - nameClass - - - - - OBO-identifier - The identifier of a term in some Open Biology Ontology (OBO) ontology. - - # - - takesValue - - - valueClass - nameClass - - - - - Pathname - The specification of a node (file or directory) in a hierarchical file system, usually specified by listing the nodes top-down. - - # - - takesValue - - - - - Subject-identifier - A sequence of characters used to identify, name, or characterize a trial or study subject. - - # - - takesValue - - - - - Version-identifier - An alphanumeric character string that identifies a form or variant of a type or original. - - # - Usually is a semantic version. - - takesValue - - - - - - Parameter - Something user-defined for this experiment. - - Parameter-label - The name of the parameter. - - # - - takesValue - - - valueClass - nameClass - - - - - Parameter-value - The value of the parameter. - - # - - takesValue - - - valueClass - textClass - - - - - - - Organizational-property - Relating to an organization or the action of organizing something. - - Collection - A tag designating a grouping of items such as in a set or list. - - # - Name of the collection. - - takesValue - - - valueClass - nameClass - - - - - Condition-variable - An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent variables or contrasts. - - # - Name of the condition variable. - - takesValue - - - valueClass - nameClass - - - - - Control-variable - An aspect of the experiment that is fixed throughout the study and usually is explicitly controlled. - - # - Name of the control variable. - - takesValue - - - valueClass - nameClass - - - - - Def - A HED-specific utility tag used with a defined name to represent the tags associated with that definition. - - requireChild - - - reserved - - - # - Name of the definition. - - takesValue - - - valueClass - nameClass - - - - - Def-expand - A HED specific utility tag that is grouped with an expanded definition. The child value of the Def-expand is the name of the expanded definition. - - requireChild - - - reserved - - - tagGroup - - - # - - takesValue - - - valueClass - nameClass - - - - - Definition - A HED-specific utility tag whose child value is the name of the concept and the tag group associated with the tag is an English language explanation of a concept. - - requireChild - - - reserved - - - topLevelTagGroup - - - # - Name of the definition. - - takesValue - - - valueClass - nameClass - - - - - Event-context - A special HED tag inserted as part of a top-level tag group to contain information about the interrelated conditions under which the event occurs. The event context includes information about other events that are ongoing when this event happens. - - reserved - - - topLevelTagGroup - - - unique - - - - Event-stream - A special HED tag indicating that this event is a member of an ordered succession of events. - - # - Name of the event stream. - - takesValue - - - valueClass - nameClass - - - - - Experimental-intertrial - A tag used to indicate a part of the experiment between trials usually where nothing is happening. - - # - Optional label for the intertrial block. - - takesValue - - - valueClass - nameClass - - - - - Experimental-trial - Designates a run or execution of an activity, for example, one execution of a script. A tag used to indicate a particular organizational part in the experimental design often containing a stimulus-response pair or stimulus-response-feedback triad. - - # - Optional label for the trial (often a numerical string). - - takesValue - - - valueClass - nameClass - - - - - Indicator-variable - An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent variables. - - # - Name of the indicator variable. - - takesValue - - - valueClass - nameClass - - - - - Recording - A tag designating the data recording. Recording tags are usually have temporal scope which is the entire recording. - - # - Optional label for the recording. - - takesValue - - - valueClass - nameClass - - - - - Task - An assigned piece of work, usually with a time allotment. A tag used to indicate a linkage the structured activities performed as part of the experiment. - - # - Optional label for the task block. - - takesValue - - - valueClass - nameClass - - - - - Time-block - A tag used to indicate a contiguous time block in the experiment during which something is fixed or noted. - - # - Optional label for the task block. - - takesValue - - - valueClass - nameClass - - - - - - Sensory-property - Relating to sensation or the physical senses. - - Sensory-attribute - A sensory characteristic associated with another entity. - - Auditory-attribute - Pertaining to the sense of hearing. - - Loudness - Perceived intensity of a sound. - - # - - takesValue - - - valueClass - numericClass - nameClass - - - - - Pitch - A perceptual property that allows the user to order sounds on a frequency scale. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - frequencyUnits - - - - - Sound-envelope - Description of how a sound changes over time. - - Sound-envelope-attack - The time taken for initial run-up of level from nil to peak usually beginning when the key on a musical instrument is pressed. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - - - Sound-envelope-decay - The time taken for the subsequent run down from the attack level to the designated sustain level. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - - - Sound-envelope-release - The time taken for the level to decay from the sustain level to zero after the key is released. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - - - Sound-envelope-sustain - The time taken for the main sequence of the sound duration, until the key is released. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - - - - Sound-volume - The sound pressure level (SPL) usually the ratio to a reference signal estimated as the lower bound of hearing. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - intensityUnits - - - - - Timbre - The perceived sound quality of a singing voice or musical instrument. - - # - - takesValue - - - valueClass - nameClass - - - - - - Gustatory-attribute - Pertaining to the sense of taste. - - Bitter - Having a sharp, pungent taste. - - - Salty - Tasting of or like salt. - - - Savory - Belonging to a taste that is salty or spicy rather than sweet. - - - Sour - Having a sharp, acidic taste. - - - Sweet - Having or resembling the taste of sugar. - - - - Olfactory-attribute - Having a smell. - - - Somatic-attribute - Pertaining to the feelings in the body or of the nervous system. - - Pain - The sensation of discomfort, distress, or agony, resulting from the stimulation of specialized nerve endings. - - - Stress - The negative mental, emotional, and physical reactions that occur when environmental stressors are perceived as exceeding the adaptive capacities of the individual. - - - - Tactile-attribute - Pertaining to the sense of touch. - - Tactile-pressure - Having a feeling of heaviness. - - - Tactile-temperature - Having a feeling of hotness or coldness. - - - Tactile-texture - Having a feeling of roughness. - - - Tactile-vibration - Having a feeling of mechanical oscillation. - - - - Vestibular-attribute - Pertaining to the sense of balance or body position. - - - Visual-attribute - Pertaining to the sense of sight. - - Color - The appearance of objects (or light sources) described in terms of perception of their hue and lightness (or brightness) and saturation. - - CSS-color - One of 140 colors supported by all browsers. For more details such as the color RGB or HEX values, check: https://www.w3schools.com/colors/colors_groups.asp. - - Blue-color - CSS color group. - - Blue - CSS-color 0x0000FF. - - - CadetBlue - CSS-color 0x5F9EA0. - - - CornflowerBlue - CSS-color 0x6495ED. - - - DarkBlue - CSS-color 0x00008B. - - - DeepSkyBlue - CSS-color 0x00BFFF. - - - DodgerBlue - CSS-color 0x1E90FF. - - - LightBlue - CSS-color 0xADD8E6. - - - LightSkyBlue - CSS-color 0x87CEFA. - - - LightSteelBlue - CSS-color 0xB0C4DE. - - - MediumBlue - CSS-color 0x0000CD. - - - MidnightBlue - CSS-color 0x191970. - - - Navy - CSS-color 0x000080. - - - PowderBlue - CSS-color 0xB0E0E6. - - - RoyalBlue - CSS-color 0x4169E1. - - - SkyBlue - CSS-color 0x87CEEB. - - - SteelBlue - CSS-color 0x4682B4. - - - - Brown-color - CSS color group. - - Bisque - CSS-color 0xFFE4C4. - - - BlanchedAlmond - CSS-color 0xFFEBCD. - - - Brown - CSS-color 0xA52A2A. - - - BurlyWood - CSS-color 0xDEB887. - - - Chocolate - CSS-color 0xD2691E. - - - Cornsilk - CSS-color 0xFFF8DC. - - - DarkGoldenRod - CSS-color 0xB8860B. - - - GoldenRod - CSS-color 0xDAA520. - - - Maroon - CSS-color 0x800000. - - - NavajoWhite - CSS-color 0xFFDEAD. - - - Olive - CSS-color 0x808000. - - - Peru - CSS-color 0xCD853F. - - - RosyBrown - CSS-color 0xBC8F8F. - - - SaddleBrown - CSS-color 0x8B4513. - - - SandyBrown - CSS-color 0xF4A460. - - - Sienna - CSS-color 0xA0522D. - - - Tan - CSS-color 0xD2B48C. - - - Wheat - CSS-color 0xF5DEB3. - - - - Cyan-color - CSS color group. - - Aqua - CSS-color 0x00FFFF. - - - Aquamarine - CSS-color 0x7FFFD4. - - - Cyan - CSS-color 0x00FFFF. - - - DarkTurquoise - CSS-color 0x00CED1. - - - LightCyan - CSS-color 0xE0FFFF. - - - MediumTurquoise - CSS-color 0x48D1CC. - - - PaleTurquoise - CSS-color 0xAFEEEE. - - - Turquoise - CSS-color 0x40E0D0. - - - - Gray-color - CSS color group. - - Black - CSS-color 0x000000. - - - DarkGray - CSS-color 0xA9A9A9. - - - DarkSlateGray - CSS-color 0x2F4F4F. - - - DimGray - CSS-color 0x696969. - - - Gainsboro - CSS-color 0xDCDCDC. - - - Gray - CSS-color 0x808080. - - - LightGray - CSS-color 0xD3D3D3. - - - LightSlateGray - CSS-color 0x778899. - - - Silver - CSS-color 0xC0C0C0. - - - SlateGray - CSS-color 0x708090. - - - - Green-color - CSS color group. - - Chartreuse - CSS-color 0x7FFF00. - - - DarkCyan - CSS-color 0x008B8B. - - - DarkGreen - CSS-color 0x006400. - - - DarkOliveGreen - CSS-color 0x556B2F. - - - DarkSeaGreen - CSS-color 0x8FBC8F. - - - ForestGreen - CSS-color 0x228B22. - - - Green - CSS-color 0x008000. - - - GreenYellow - CSS-color 0xADFF2F. - - - LawnGreen - CSS-color 0x7CFC00. - - - LightGreen - CSS-color 0x90EE90. - - - LightSeaGreen - CSS-color 0x20B2AA. - - - Lime - CSS-color 0x00FF00. - - - LimeGreen - CSS-color 0x32CD32. - - - MediumAquaMarine - CSS-color 0x66CDAA. - - - MediumSeaGreen - CSS-color 0x3CB371. - - - MediumSpringGreen - CSS-color 0x00FA9A. - - - OliveDrab - CSS-color 0x6B8E23. - - - PaleGreen - CSS-color 0x98FB98. - - - SeaGreen - CSS-color 0x2E8B57. - - - SpringGreen - CSS-color 0x00FF7F. - - - Teal - CSS-color 0x008080. - - - YellowGreen - CSS-color 0x9ACD32. - - - - Orange-color - CSS color group. - - Coral - CSS-color 0xFF7F50. - - - DarkOrange - CSS-color 0xFF8C00. - - - Orange - CSS-color 0xFFA500. - - - OrangeRed - CSS-color 0xFF4500. - - - Tomato - CSS-color 0xFF6347. - - - - Pink-color - CSS color group. - - DeepPink - CSS-color 0xFF1493. - - - HotPink - CSS-color 0xFF69B4. - - - LightPink - CSS-color 0xFFB6C1. - - - MediumVioletRed - CSS-color 0xC71585. - - - PaleVioletRed - CSS-color 0xDB7093. - - - Pink - CSS-color 0xFFC0CB. - - - - Purple-color - CSS color group. - - BlueViolet - CSS-color 0x8A2BE2. - - - DarkMagenta - CSS-color 0x8B008B. - - - DarkOrchid - CSS-color 0x9932CC. - - - DarkSlateBlue - CSS-color 0x483D8B. - - - DarkViolet - CSS-color 0x9400D3. - - - Fuchsia - CSS-color 0xFF00FF. - - - Indigo - CSS-color 0x4B0082. - - - Lavender - CSS-color 0xE6E6FA. - - - Magenta - CSS-color 0xFF00FF. - - - MediumOrchid - CSS-color 0xBA55D3. - - - MediumPurple - CSS-color 0x9370DB. - - - MediumSlateBlue - CSS-color 0x7B68EE. - - - Orchid - CSS-color 0xDA70D6. - - - Plum - CSS-color 0xDDA0DD. - - - Purple - CSS-color 0x800080. - - - RebeccaPurple - CSS-color 0x663399. - - - SlateBlue - CSS-color 0x6A5ACD. - - - Thistle - CSS-color 0xD8BFD8. - - - Violet - CSS-color 0xEE82EE. - - - - Red-color - CSS color group. - - Crimson - CSS-color 0xDC143C. - - - DarkRed - CSS-color 0x8B0000. - - - DarkSalmon - CSS-color 0xE9967A. - - - FireBrick - CSS-color 0xB22222. - - - IndianRed - CSS-color 0xCD5C5C. - - - LightCoral - CSS-color 0xF08080. - - - LightSalmon - CSS-color 0xFFA07A. - - - Red - CSS-color 0xFF0000. - - - Salmon - CSS-color 0xFA8072. - - - - White-color - CSS color group. - - AliceBlue - CSS-color 0xF0F8FF. - - - AntiqueWhite - CSS-color 0xFAEBD7. - - - Azure - CSS-color 0xF0FFFF. - - - Beige - CSS-color 0xF5F5DC. - - - FloralWhite - CSS-color 0xFFFAF0. - - - GhostWhite - CSS-color 0xF8F8FF. - - - HoneyDew - CSS-color 0xF0FFF0. - - - Ivory - CSS-color 0xFFFFF0. - - - LavenderBlush - CSS-color 0xFFF0F5. - - - Linen - CSS-color 0xFAF0E6. - - - MintCream - CSS-color 0xF5FFFA. - - - MistyRose - CSS-color 0xFFE4E1. - - - OldLace - CSS-color 0xFDF5E6. - - - SeaShell - CSS-color 0xFFF5EE. - - - Snow - CSS-color 0xFFFAFA. - - - White - CSS-color 0xFFFFFF. - - - WhiteSmoke - CSS-color 0xF5F5F5. - - - - Yellow-color - CSS color group. - - DarkKhaki - CSS-color 0xBDB76B. - - - Gold - CSS-color 0xFFD700. - - - Khaki - CSS-color 0xF0E68C. - - - LemonChiffon - CSS-color 0xFFFACD. - - - LightGoldenRodYellow - CSS-color 0xFAFAD2. - - - LightYellow - CSS-color 0xFFFFE0. - - - Moccasin - CSS-color 0xFFE4B5. - - - PaleGoldenRod - CSS-color 0xEEE8AA. - - - PapayaWhip - CSS-color 0xFFEFD5. - - - PeachPuff - CSS-color 0xFFDAB9. - - - Yellow - CSS-color 0xFFFF00. - - - - - Color-shade - A slight degree of difference between colors, especially with regard to how light or dark it is or as distinguished from one nearly like it. - - Dark-shade - A color tone not reflecting much light. - - - Light-shade - A color tone reflecting more light. - - - - Grayscale - Using a color map composed of shades of gray, varying from black at the weakest intensity to white at the strongest. - - # - White intensity between 0 and 1. - - takesValue - - - valueClass - numericClass - - - - - HSV-color - A color representation that models how colors appear under light. - - HSV-value - An attribute of a visual sensation according to which an area appears to emit more or less light. - - # - - takesValue - - - valueClass - numericClass - - - - - Hue - Attribute of a visual sensation according to which an area appears to be similar to one of the perceived colors. - - # - Angular value between 0 and 360. - - takesValue - - - valueClass - numericClass - - - - - Saturation - Colorfulness of a stimulus relative to its own brightness. - - # - B value of RGB between 0 and 1. - - takesValue - - - valueClass - numericClass - - - - - - RGB-color - A color from the RGB schema. - - RGB-blue - The blue component. - - # - B value of RGB between 0 and 1. - - takesValue - - - valueClass - numericClass - - - - - RGB-green - The green component. - - # - G value of RGB between 0 and 1. - - takesValue - - - valueClass - numericClass - - - - - RGB-red - The red component. - - # - R value of RGB between 0 and 1. - - takesValue - - - valueClass - numericClass - - - - - - - Luminance - A quality that exists by virtue of the luminous intensity per unit area projected in a given direction. - - - Opacity - A measure of impenetrability to light. - - - - - Sensory-presentation - The entity has a sensory manifestation. - - Auditory-presentation - The sense of hearing is used in the presentation to the user. - - Loudspeaker-separation - The distance between two loudspeakers. Grouped with the Distance tag. - - suggestedTag - Distance - - - - Monophonic - Relating to sound transmission, recording, or reproduction involving a single transmission path. - - - Silent - The absence of ambient audible sound or the state of having ceased to produce sounds. - - - Stereophonic - Relating to, or constituting sound reproduction involving the use of separated microphones and two transmission channels to achieve the sound separation of a live hearing. - - - - Gustatory-presentation - The sense of taste used in the presentation to the user. - - - Olfactory-presentation - The sense of smell used in the presentation to the user. - - - Somatic-presentation - The nervous system is used in the presentation to the user. - - - Tactile-presentation - The sense of touch used in the presentation to the user. - - - Vestibular-presentation - The sense balance used in the presentation to the user. - - - Visual-presentation - The sense of sight used in the presentation to the user. - - 2D-view - A view showing only two dimensions. - - - 3D-view - A view showing three dimensions. - - - Background-view - Parts of the view that are farthest from the viewer and usually the not part of the visual focus. - - - Bistable-view - Something having two stable visual forms that have two distinguishable stable forms as in optical illusions. - - - Foreground-view - Parts of the view that are closest to the viewer and usually the most important part of the visual focus. - - - Foveal-view - Visual presentation directly on the fovea. A view projected on the small depression in the retina containing only cones and where vision is most acute. - - - Map-view - A diagrammatic representation of an area of land or sea showing physical features, cities, roads. - - Aerial-view - Elevated view of an object from above, with a perspective as though the observer were a bird. - - - Satellite-view - A representation as captured by technology such as a satellite. - - - Street-view - A 360-degrees panoramic view from a position on the ground. - - - - Peripheral-view - Indirect vision as it occurs outside the point of fixation. - - - - - - Task-property - Something that pertains to a task. - - extensionAllowed - - - Task-action-type - How an agent action should be interpreted in terms of the task specification. - - Appropriate-action - An action suitable or proper in the circumstances. - - relatedTag - Inappropriate-action - - - - Correct-action - An action that was a correct response in the context of the task. - - relatedTag - Incorrect-action - Indeterminate-action - - - - Correction - An action offering an improvement to replace a mistake or error. - - - Done-indication - An action that indicates that the participant has completed this step in the task. - - relatedTag - Ready-indication - - - - Imagined-action - Form a mental image or concept of something. This is used to identity something that only happened in the imagination of the participant as in imagined movements in motor imagery paradigms. - - - Inappropriate-action - An action not in keeping with what is correct or proper for the task. - - relatedTag - Appropriate-action - - - - Incorrect-action - An action considered wrong or incorrect in the context of the task. - - relatedTag - Correct-action - Indeterminate-action - - - - Indeterminate-action - An action that cannot be distinguished between two or more possibibities in the current context. This tag might be applied when an outside evaluator or a classification algorithm cannot determine a definitive result. - - relatedTag - Correct-action - Incorrect-action - Miss - Near-miss - - - - Miss - An action considered to be a failure in the context of the task. For example, if the agent is supposed to try to hit a target and misses. - - relatedTag - Near-miss - - - - Near-miss - An action barely satisfied the requirements of the task. In a driving experiment for example this could pertain to a narrowly avoided collision or other accident. - - relatedTag - Miss - - - - Omitted-action - An expected response was skipped. - - - Ready-indication - An action that indicates that the participant is ready to perform the next step in the task. - - relatedTag - Done-indication - - - - - Task-attentional-demand - Strategy for allocating attention toward goal-relevant information. - - Bottom-up-attention - Attentional guidance purely by externally driven factors to stimuli that are salient because of their inherent properties relative to the background. Sometimes this is referred to as stimulus driven. - - relatedTag - Top-down-attention - - - - Covert-attention - Paying attention without moving the eyes. - - relatedTag - Overt-attention - - - - Divided-attention - Integrating parallel multiple stimuli. Behavior involving responding simultaneously to multiple tasks or multiple task demands. - - relatedTag - Focused-attention - - - - Focused-attention - Responding discretely to specific visual, auditory, or tactile stimuli. - - relatedTag - Divided-attention - - - - Orienting-attention - Directing attention to a target stimulus. - - - Overt-attention - Selectively processing one location over others by moving the eyes to point at that location. - - relatedTag - Covert-attention - - - - Selective-attention - Maintaining a behavioral or cognitive set in the face of distracting or competing stimuli. Ability to pay attention to a limited array of all available sensory information. - - - Sustained-attention - Maintaining a consistent behavioral response during continuous and repetitive activity. - - - Switched-attention - Having to switch attention between two or more modalities of presentation. - - - Top-down-attention - Voluntary allocation of attention to certain features. Sometimes this is referred to goal-oriented attention. - - relatedTag - Bottom-up-attention - - - - - Task-effect-evidence - The evidence supporting the conclusion that the event had the specified effect. - - Behavioral-evidence - An indication or conclusion based on the behavior of an agent. - - - Computational-evidence - A type of evidence in which data are produced, and/or generated, and/or analyzed on a computer. - - - External-evidence - A phenomenon that follows and is caused by some previous phenomenon. - - - Intended-effect - A phenomenon that is intended to follow and be caused by some previous phenomenon. - - - - Task-event-role - The purpose of an event with respect to the task. - - Experimental-stimulus - Part of something designed to elicit a response in the experiment. - - - Incidental - A sensory or other type of event that is unrelated to the task or experiment. - - - Instructional - Usually associated with a sensory event intended to give instructions to the participant about the task or behavior. - - - Mishap - Unplanned disruption such as an equipment or experiment control abnormality or experimenter error. - - - Participant-response - Something related to a participant actions in performing the task. - - - Task-activity - Something that is part of the overall task or is necessary to the overall experiment but is not directly part of a stimulus-response cycle. Examples would be taking a survey or provided providing a silva sample. - - - Warning - Something that should warn the participant that the parameters of the task have been or are about to be exceeded such as a warning message about getting too close to the shoulder of the road in a driving task. - - - - Task-relationship - Specifying organizational importance of sub-tasks. - - Background-subtask - A part of the task which should be performed in the background as for example inhibiting blinks due to instruction while performing the primary task. - - - Primary-subtask - A part of the task which should be the primary focus of the participant. - - - - Task-stimulus-role - The role the stimulus plays in the task. - - Cue - A signal for an action, a pattern of stimuli indicating a particular response. - - - Distractor - A person or thing that distracts or a plausible but incorrect option in a multiple-choice question. In pyschological studies this is sometimes referred to as a foil. - - - Expected - Considered likely, probable or anticipated. Something of low information value as in frequent non-targets in an RSVP paradigm. - - relatedTag - Unexpected - - - suggestedTag - Target - - - - Extraneous - Irrelevant or unrelated to the subject being dealt with. - - - Feedback - An evaluative response to an inquiry, process, event, or activity. - - - Go-signal - An indicator to proceed with a planned action. - - relatedTag - Stop-signal - - - - Meaningful - Conveying significant or relevant information. - - - Newly-learned - Representing recently acquired information or understanding. - - - Non-informative - Something that is not useful in forming an opinion or judging an outcome. - - - Non-target - Something other than that done or looked for. Also tag Expected if the Non-target is frequent. - - relatedTag - Target - - - - Not-meaningful - Not having a serious, important, or useful quality or purpose. - - - Novel - Having no previous example or precedent or parallel. - - - Oddball - Something unusual, or infrequent. - - relatedTag - Unexpected - - - suggestedTag - Target - - - - Penalty - A disadvantage, loss, or hardship due to some action. - - - Planned - Something that was decided on or arranged in advance. - - relatedTag - Unplanned - - - - Priming - An implicit memory effect in which exposure to a stimulus influences response to a later stimulus. - - - Query - A sentence of inquiry that asks for a reply. - - - Reward - A positive reinforcement for a desired action, behavior or response. - - - Stop-signal - An indicator that the agent should stop the current activity. - - relatedTag - Go-signal - - - - Target - Something fixed as a goal, destination, or point of examination. - - - Threat - An indicator that signifies hostility and predicts an increased probability of attack. - - - Timed - Something planned or scheduled to be done at a particular time or lasting for a specified amount of time. - - - Unexpected - Something that is not anticipated. - - relatedTag - Expected - - - - Unplanned - Something that has not been planned as part of the task. - - relatedTag - Planned - - - - - - - Relation - Concerns the way in which two or more people or things are connected. - - extensionAllowed - - - Comparative-relation - Something considered in comparison to something else. The first entity is the focus. - - Approximately-equal-to - (A, (Approximately-equal-to, B)) indicates that A and B have almost the same value. Here A and B could refer to sizes, orders, positions or other quantities. - - - Equal-to - (A, (Equal-to, B)) indicates that the size or order of A is the same as that of B. - - - Greater-than - (A, (Greater-than, B)) indicates that the relative size or order of A is bigger than that of B. - - - Greater-than-or-equal-to - (A, (Greater-than-or-equal-to, B)) indicates that the relative size or order of A is bigger than or the same as that of B. - - - Less-than - (A, (Less-than, B)) indicates that A is smaller than B. Here A and B could refer to sizes, orders, positions or other quantities. - - - Less-than-or-equal-to - (A, (Less-than-or-equal-to, B)) indicates that the relative size or order of A is smaller than or equal to B. - - - Not-equal-to - (A, (Not-equal-to, B)) indicates that the size or order of A is not the same as that of B. - - - - Connective-relation - Indicates two entities are related in some way. The first entity is the focus. - - Belongs-to - (A, (Belongs-to, B)) indicates that A is a member of B. - - - Connected-to - (A, (Connected-to, B)) indicates that A is related to B in some respect, usually through a direct link. - - - Contained-in - (A, (Contained-in, B)) indicates that A is completely inside of B. - - - Described-by - (A, (Described-by, B)) indicates that B provides information about A. - - - From-to - (A, (From-to, B)) indicates a directional relation from A to B. A is considered the source. - - - Group-of - (A, (Group-of, B)) indicates A is a group of items of type B. - - - Implied-by - (A, (Implied-by, B)) indicates B is suggested by A. - - - Includes - (A, (Includes, B)) indicates that A has B as a member or part. - - - Interacts-with - (A, (Interacts-with, B)) indicates A and B interact, possibly reciprocally. - - - Member-of - (A, (Member-of, B)) indicates A is a member of group B. - - - Part-of - (A, (Part-of, B)) indicates A is a part of the whole B. - - - Performed-by - (A, (Performed-by, B)) indicates that the action or procedure A was carried out by agent B. - - - Performed-using - (A, (Performed-using, B)) indicates that the action or procedure A was accomplished using B. - - - Related-to - (A, (Related-to, B)) indicates A has some relationship to B. - - - Unrelated-to - (A, (Unrelated-to, B)) indicates that A is not related to B. For example, A is not related to Task. - - - - Directional-relation - A relationship indicating direction of change of one entity relative to another. The first entity is the focus. - - Away-from - (A, (Away-from, B)) indicates that A is going or has moved away from B. The meaning depends on A and B. - - - Towards - (A, (Towards, B)) indicates that A is going to or has moved to B. The meaning depends on A and B. - - - - Logical-relation - Indicating a logical relationship between entities. The first entity is usually the focus. - - And - (A, (And, B)) means A and B are both in effect. - - - Or - (A, (Or, B)) means at least one of A and B are in effect. - - - - Spatial-relation - Indicating a relationship about position between entities. - - Above - (A, (Above, B)) means A is in a place or position that is higher than B. - - - Across-from - (A, (Across-from, B)) means A is on the opposite side of something from B. - - - Adjacent-to - (A, (Adjacent-to, B)) indicates that A is next to B in time or space. - - - Ahead-of - (A, (Ahead-of, B)) indicates that A is further forward in time or space in B. - - - Around - (A, (Around, B)) means A is in or near the present place or situation of B. - - - Behind - (A, (Behind, B)) means A is at or to the far side of B, typically so as to be hidden by it. - - - Below - (A, (Below, B)) means A is in a place or position that is lower than the position of B. - - - Between - (A, (Between, (B, C))) means A is in the space or interval separating B and C. - - - Bilateral-to - (A, (Bilateral, B)) means A is on both sides of B or affects both sides of B. - - - Bottom-edge-of - (A, (Bottom-edge-of, B)) means A is on the bottom most part or or near the boundary of B. - - relatedTag - Left-edge-of - Right-edge-of - Top-edge-of - - - - Boundary-of - (A, (Boundary-of, B)) means A is on or part of the edge or boundary of B. - - - Center-of - (A, (Center-of, B)) means A is at a point or or in an area that is approximately central within B. - - - Close-to - (A, (Close-to, B)) means A is at a small distance from or is located near in space to B. - - - Far-from - (A, (Far-from, B)) means A is at a large distance from or is not located near in space to B. - - - In-front-of - (A, (In-front-of, B)) means A is in a position just ahead or at the front part of B, potentially partially blocking B from view. - - - Left-edge-of - (A, (Left-edge-of, B)) means A is located on the left side of B on or near the boundary of B. - - relatedTag - Bottom-edge-of - Right-edge-of - Top-edge-of - - - - Left-side-of - (A, (Left-side-of, B)) means A is located on the left side of B usually as part of B. - - relatedTag - Right-side-of - - - - Lower-center-of - (A, (Lower-center-of, B)) means A is situated on the lower center part of B (due south). This relation is often used to specify qualitative information about screen position. - - relatedTag - Center-of - Lower-left-of - Lower-right-of - Upper-center-of - Upper-right-of - - - - Lower-left-of - (A, (Lower-left-of, B)) means A is situated on the lower left part of B. This relation is often used to specify qualitative information about screen position. - - relatedTag - Center-of - Lower-center-of - Lower-right-of - Upper-center-of - Upper-left-of - Upper-right-of - - - - Lower-right-of - (A, (Lower-right-of, B)) means A is situated on the lower right part of B. This relation is often used to specify qualitative information about screen position. - - relatedTag - Center-of - Lower-center-of - Lower-left-of - Upper-left-of - Upper-center-of - Upper-left-of - Lower-right-of - - - - Outside-of - (A, (Outside-of, B)) means A is located in the space around but not including B. - - - Over - (A, (Over, B)) means A above is above B so as to cover or protect or A extends over the a general area as from a from a vantage point. - - - Right-edge-of - (A, (Right-edge-of, B)) means A is located on the right side of B on or near the boundary of B. - - relatedTag - Bottom-edge-of - Left-edge-of - Top-edge-of - - - - Right-side-of - (A, (Right-side-of, B)) means A is located on the right side of B usually as part of B. - - relatedTag - Left-side-of - - - - To-left-of - (A, (To-left-of, B)) means A is located on or directed toward the side to the west of B when B is facing north. This term is used when A is not part of B. - - - To-right-of - (A, (To-right-of, B)) means A is located on or directed toward the side to the east of B when B is facing north. This term is used when A is not part of B. - - - Top-edge-of - (A, (Top-edge-of, B)) means A is on the uppermost part or or near the boundary of B. - - relatedTag - Left-edge-of - Right-edge-of - Bottom-edge-of - - - - Top-of - (A, (Top-of, B)) means A is on the uppermost part, side, or surface of B. - - - Underneath - (A, (Underneath, B)) means A is situated directly below and may be concealed by B. - - - Upper-center-of - (A, (Upper-center-of, B)) means A is situated on the upper center part of B (due north). This relation is often used to specify qualitative information about screen position. - - relatedTag - Center-of - Lower-center-of - Lower-left-of - Lower-right-of - Upper-center-of - Upper-right-of - - - - Upper-left-of - (A, (Upper-left-of, B)) means A is situated on the upper left part of B. This relation is often used to specify qualitative information about screen position. - - relatedTag - Center-of - Lower-center-of - Lower-left-of - Lower-right-of - Upper-center-of - Upper-right-of - - - - Upper-right-of - (A, (Upper-right-of, B)) means A is situated on the upper right part of B. This relation is often used to specify qualitative information about screen position. - - relatedTag - Center-of - Lower-center-of - Lower-left-of - Upper-left-of - Upper-center-of - Lower-right-of - - - - Within - (A, (Within, B)) means A is on the inside of or contained in B. - - - - Temporal-relation - A relationship that includes a temporal or time-based component. - - After - (A, (After B)) means A happens at a time subsequent to a reference time related to B. - - - Asynchronous-with - (A, (Asynchronous-with, B)) means A happens at times not occurring at the same time or having the same period or phase as B. - - - Before - (A, (Before B)) means A happens at a time earlier in time or order than B. - - - During - (A, (During, B)) means A happens at some point in a given period of time in which B is ongoing. - - - Synchronous-with - (A, (Synchronous-with, B)) means A happens at occurs at the same time or rate as B. - - - Waiting-for - (A, (Waiting-for, B)) means A pauses for something to happen in B. - - - - - Sleep-and-drowsiness - The features of the ongoing activity during sleep are scored here. If abnormal graphoelements appear, disappear or change their morphology during sleep, that is not scored here but at the entry corresponding to that graphooelement (as a modulator). - - requireChild - - - inLibrary - score - - - Sleep-architecture - For longer recordings. Only to be scored if whole-night sleep is part of the recording. It is a global descriptor of the structure and pattern of sleep: estimation of the amount of time spent in REM and NREM sleep, sleep duration, NREM-REM cycle. - - suggestedTag - Property-not-possible-to-determine - - - inLibrary - score - - - Normal-sleep-architecture - - inLibrary - score - - - - Abnormal-sleep-architecture - - inLibrary - score - - - - - Sleep-stage-reached - For normal sleep patterns the sleep stages reached during the recording can be specified - - requireChild - - - suggestedTag - Property-not-possible-to-determine - Finding-significance-to-recording - - - inLibrary - score - - - Sleep-stage-N1 - Sleep stage 1. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Sleep-stage-N2 - Sleep stage 2. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Sleep-stage-N3 - Sleep stage 3. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - Sleep-stage-REM - Rapid eye movement. - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - Sleep-spindles - Burst at 11-15 Hz but mostly at 12-14 Hz generally diffuse but of higher voltage over the central regions of the head, occurring during sleep. Amplitude varies but is mostly below 50 microV in the adult. - - suggestedTag - Finding-significance-to-recording - Brain-laterality - Brain-region - Sensors - Finding-amplitude-asymmetry - - - inLibrary - score - - - - Arousal-pattern - Arousal pattern in children. Prolonged, marked high voltage 4-6/s activity in all leads with some intermixed slower frequencies, in children. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - Frontal-arousal-rhythm - Prolonged (up to 20s) rhythmical sharp or spiky activity over the frontal areas (maximum over the frontal midline) seen at arousal from sleep in children with minimal cerebral dysfunction. - - suggestedTag - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - Vertex-wave - Sharp potential, maximal at the vertex, negative relative to other areas, apparently occurring spontaneously during sleep or in response to a sensory stimulus during sleep or wakefulness. May be single or repetitive. Amplitude varies but rarely exceeds 250 microV. Abbreviation: V wave. Synonym: vertex sharp wave. - - suggestedTag - Finding-significance-to-recording - Brain-laterality - Brain-region - Sensors - Finding-amplitude-asymmetry - - - inLibrary - score - - - - K-complex - A burst of somewhat variable appearance, consisting most commonly of a high voltage negative slow wave followed by a smaller positive slow wave frequently associated with a sleep spindle. Duration greater than 0.5 s. Amplitude is generally maximal in the frontal vertex. K complexes occur during nonREM sleep, apparently spontaneously, or in response to sudden sensory / auditory stimuli, and are not specific for any individual sensory modality. - - suggestedTag - Finding-significance-to-recording - Brain-laterality - Brain-region - Sensors - Finding-amplitude-asymmetry - - - inLibrary - score - - - - Saw-tooth-waves - Vertex negative 2-5 Hz waves occuring in series during REM sleep - - suggestedTag - Finding-significance-to-recording - Brain-laterality - Brain-region - Sensors - Finding-amplitude-asymmetry - - - inLibrary - score - - - - POSTS - Positive occipital sharp transients of sleep. Sharp transient maximal over the occipital regions, positive relative to other areas, apparently occurring spontaneously during sleep. May be single or repetitive. Amplitude varies but is generally bellow 50 microV. - - suggestedTag - Finding-significance-to-recording - Brain-laterality - Brain-region - Sensors - Finding-amplitude-asymmetry - - - inLibrary - score - - - - Hypnagogic-hypersynchrony - Bursts of bilateral, synchronous delta or theta activity of large amplitude, occasionally with superimposed faster components, occurring during falling asleep or during awakening, in children. - - suggestedTag - Finding-significance-to-recording - Brain-laterality - Brain-region - Sensors - Finding-amplitude-asymmetry - - - inLibrary - score - - - - Non-reactive-sleep - EEG activity consisting of normal sleep graphoelements, but which cannot be interrupted by external stimuli/ the patient cannot be waken. - - inLibrary - score - - - - - Uncertain-significant-pattern - EEG graphoelements or rhythms that resemble abnormal patterns but that are not necessarily associated with a pathology, and the physician does not consider them abnormal in the context of the scored recording (like normal variants and patterns). - - requireChild - - - inLibrary - score - - - Sharp-transient-pattern - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - Wicket-spikes - Spike-like monophasic negative single waves or trains of waves occurring over the temporal regions during drowsiness that have an arcuate or mu-like appearance. These are mainly seen in older individuals and represent a benign variant that is of little clinical significance. - - inLibrary - score - - - - Small-sharp-spikes - Benign epileptiform Transients of Sleep (BETS). Small sharp spikes (SSS) of very short duration and low amplitude, often followed by a small theta wave, occurring in the temporal regions during drowsiness and light sleep. They occur on one or both sides (often asynchronously). The main negative and positive components are of about equally spiky character. Rarely seen in children, they are seen most often in adults and the elderly. Two thirds of the patients have a history of epileptic seizures. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - Fourteen-six-Hz-positive-burst - Burst of arch-shaped waves at 13-17 Hz and/or 5-7-Hz but most commonly at 14 and or 6 Hz seen generally over the posterior temporal and adjacent areas of one or both sides of the head during sleep. The sharp peaks of its component waves are positive with respect to other regions. Amplitude varies but is generally below 75 micro V. Comments: (1) best demonstrated by referential recording using contralateral earlobe or other remote, reference electrodes. (2) This pattern has no established clinical significance. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - Six-Hz-spike-slow-wave - Spike and slow wave complexes at 4-7Hz, but mostly at 6 Hz occurring generally in brief bursts bilaterally and synchronously, symmetrically or asymmetrically, and either confined to or of larger amplitude over the posterior or anterior regions of the head. The spike has a strong positive component. Amplitude varies but is generally smaller than that of spike-and slow-wave complexes repeating at slower rates. Comment: this pattern should be distinguished from epileptiform discharges. Synonym: wave and spike phantom. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - Rudimentary-spike-wave-complex - Synonym: Pseudo petit mal discharge. Paroxysmal discharge that consists of generalized or nearly generalized high voltage 3 to 4/sec waves with poorly developed spike in the positive trough between the slow waves, occurring in drowsiness only. It is found only in infancy and early childhood when marked hypnagogic rhythmical theta activity is paramount in the drowsy state. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - Slow-fused-transient - A posterior slow-wave preceded by a sharp-contoured potential that blends together with the ensuing slow wave, in children. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - Needle-like-occipital-spikes-blind - Spike discharges of a particularly fast and needle-like character develop over the occipital region in most congenitally blind children. Completely disappear during childhood or adolescence. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - Subclinical-rhythmic-EEG-discharge-adults - Subclinical rhythmic EEG discharge of adults (SERDA). A rhythmic pattern seen in the adult age group, mainly in the waking state or drowsiness. It consists of a mixture of frequencies, often predominant in the theta range. The onset may be fairly abrupt with widespread sharp rhythmical theta and occasionally with delta activity. As to the spatial distribution, a maximum of this discharge is usually found over the centroparietal region and especially over the vertex. It may resemble a seizure discharge but is not accompanied by any clinical signs or symptoms. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - Rhythmic-temporal-theta-burst-drowsiness - Rhythmic temporal theta burst of drowsiness (RTTD). Characteristic burst of 4-7 Hz waves frequently notched by faster waves, occurring over the temporal regions of the head during drowsiness. Synonym: psychomotor variant pattern. Comment: this is a pattern of drowsiness that is of no clinical significance. - - inLibrary - score - - - - Temporal-slowing-elderly - Focal theta and/or delta activity over the temporal regions, especially the left, in persons over the age of 60. Amplitudes are low/similar to the background activity. Comment: focal temporal theta was found in 20 percent of people between the ages of 40-59 years, and 40 percent of people between 60 and 79 years. One third of people older than 60 years had focal temporal delta activity. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - Breach-rhythm - Rhythmical activity recorded over cranial bone defects. Usually it is in the 6 to 11/sec range, does not respond to movements. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - inLibrary - score - - - - Other-uncertain-significant-pattern - - requireChild - - - inLibrary - score - - - # - Free text. - - takesValue - - - valueClass - textClass - - - inLibrary - score - - - - - - - - accelerationUnits - - defaultUnits - m-per-s^2 - - - m-per-s^2 - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - - angleUnits - - defaultUnits - radian - - - radian - - SIUnit - - - conversionFactor - 1.0 - - - - rad - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - degree - - conversionFactor - 0.0174533 - - - - - areaUnits - - defaultUnits - m^2 - - - m^2 - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - - currencyUnits - Units indicating the worth of something. - - defaultUnits - $ - - - dollar - - conversionFactor - 1.0 - - - - $ - - unitPrefix - - - unitSymbol - - - conversionFactor - 1.0 - - - - euro - - - point - - - - electricPotentialUnits - - defaultUnits - uv - - - v - - SIUnit - - - unitSymbol - - - conversionFactor - 0.000001 - - - - Volt - - SIUnit - - - conversionFactor - 0.000001 - - - - - frequencyUnits - - defaultUnits - Hz - - - hertz - - SIUnit - - - conversionFactor - 1.0 - - - - Hz - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - - intensityUnits - - defaultUnits - dB - - - dB - Intensity expressed as ratio to a threshold. May be used for sound intensity. - - unitSymbol - - - conversionFactor - 1.0 - - - - candela - Units used to express light intensity. - - SIUnit - - - - cd - Units used to express light intensity. - - SIUnit - - - unitSymbol - - - - - jerkUnits - - defaultUnits - m-per-s^3 - - - m-per-s^3 - - unitSymbol - - - conversionFactor - 1.0 - - - - - magneticFieldUnits - Units used to magnetic field intensity. - - defaultUnits - fT - - - tesla - - SIUnit - - - conversionFactor - 10^-15 - - - - T - - SIUnit - - - unitSymbol - - - conversionFactor - 10^-15 - - - - - memorySizeUnits - - defaultUnits - B - - - byte - - SIUnit - - - conversionFactor - 1.0 - - - - B - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - - physicalLengthUnits - - defaultUnits - m - - - foot - - conversionFactor - 0.3048 - - - - inch - - conversionFactor - 0.0254 - - - - meter - - SIUnit - - - conversionFactor - 1.0 - - - - metre - - SIUnit - - - conversionFactor - 1.0 - - - - m - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - mile - - conversionFactor - 1609.34 - - - - - speedUnits - - defaultUnits - m-per-s - - - m-per-s - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - mph - - unitSymbol - - - conversionFactor - 0.44704 - - - - kph - - unitSymbol - - - conversionFactor - 0.277778 - - - - - temperatureUnits - - degree Celsius - - SIUnit - - - conversionFactor - 1.0 - - - - oC - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - - timeUnits - - defaultUnits - s - - - second - - SIUnit - - - conversionFactor - 1.0 - - - - s - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - day - - conversionFactor - 86400 - - - - minute - - conversionFactor - 60 - - - - hour - Should be in 24-hour format. - - conversionFactor - 3600 - - - - - volumeUnits - - defaultUnits - m^3 - - - m^3 - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - - weightUnits - - defaultUnits - g - - - g - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - gram - - SIUnit - - - conversionFactor - 1.0 - - - - pound - - conversionFactor - 453.592 - - - - lb - - conversionFactor - 453.592 - - - - - - - deca - SI unit multiple representing 10^1. - - SIUnitModifier - - - conversionFactor - 10.0 - - - - da - SI unit multiple representing 10^1. - - SIUnitSymbolModifier - - - conversionFactor - 10.0 - - - - hecto - SI unit multiple representing 10^2. - - SIUnitModifier - - - conversionFactor - 100.0 - - - - h - SI unit multiple representing 10^2. - - SIUnitSymbolModifier - - - conversionFactor - 100.0 - - - - kilo - SI unit multiple representing 10^3. - - SIUnitModifier - - - conversionFactor - 1000.0 - - - - k - SI unit multiple representing 10^3. - - SIUnitSymbolModifier - - - conversionFactor - 1000.0 - - - - mega - SI unit multiple representing 10^6. - - SIUnitModifier - - - conversionFactor - 10^6 - - - - M - SI unit multiple representing 10^6. - - SIUnitSymbolModifier - - - conversionFactor - 10^6 - - - - giga - SI unit multiple representing 10^9. - - SIUnitModifier - - - conversionFactor - 10^9 - - - - G - SI unit multiple representing 10^9. - - SIUnitSymbolModifier - - - conversionFactor - 10^9 - - - - tera - SI unit multiple representing 10^12. - - SIUnitModifier - - - conversionFactor - 10^12 - - - - T - SI unit multiple representing 10^12. - - SIUnitSymbolModifier - - - conversionFactor - 10^12 - - - - peta - SI unit multiple representing 10^15. - - SIUnitModifier - - - conversionFactor - 10^15 - - - - P - SI unit multiple representing 10^15. - - SIUnitSymbolModifier - - - conversionFactor - 10^15 - - - - exa - SI unit multiple representing 10^18. - - SIUnitModifier - - - conversionFactor - 10^18 - - - - E - SI unit multiple representing 10^18. - - SIUnitSymbolModifier - - - conversionFactor - 10^18 - - - - zetta - SI unit multiple representing 10^21. - - SIUnitModifier - - - conversionFactor - 10^21 - - - - Z - SI unit multiple representing 10^21. - - SIUnitSymbolModifier - - - conversionFactor - 10^21 - - - - yotta - SI unit multiple representing 10^24. - - SIUnitModifier - - - conversionFactor - 10^24 - - - - Y - SI unit multiple representing 10^24. - - SIUnitSymbolModifier - - - conversionFactor - 10^24 - - - - deci - SI unit submultiple representing 10^-1. - - SIUnitModifier - - - conversionFactor - 0.1 - - - - d - SI unit submultiple representing 10^-1. - - SIUnitSymbolModifier - - - conversionFactor - 0.1 - - - - centi - SI unit submultiple representing 10^-2. - - SIUnitModifier - - - conversionFactor - 0.01 - - - - c - SI unit submultiple representing 10^-2. - - SIUnitSymbolModifier - - - conversionFactor - 0.01 - - - - milli - SI unit submultiple representing 10^-3. - - SIUnitModifier - - - conversionFactor - 0.001 - - - - m - SI unit submultiple representing 10^-3. - - SIUnitSymbolModifier - - - conversionFactor - 0.001 - - - - micro - SI unit submultiple representing 10^-6. - - SIUnitModifier - - - conversionFactor - 10^-6 - - - - u - SI unit submultiple representing 10^-6. - - SIUnitSymbolModifier - - - conversionFactor - 10^-6 - - - - nano - SI unit submultiple representing 10^-9. - - SIUnitModifier - - - conversionFactor - 10^-9 - - - - n - SI unit submultiple representing 10^-9. - - SIUnitSymbolModifier - - - conversionFactor - 10^-9 - - - - pico - SI unit submultiple representing 10^-12. - - SIUnitModifier - - - conversionFactor - 10^-12 - - - - p - SI unit submultiple representing 10^-12. - - SIUnitSymbolModifier - - - conversionFactor - 10^-12 - - - - femto - SI unit submultiple representing 10^-15. - - SIUnitModifier - - - conversionFactor - 10^-15 - - - - f - SI unit submultiple representing 10^-15. - - SIUnitSymbolModifier - - - conversionFactor - 10^-15 - - - - atto - SI unit submultiple representing 10^-18. - - SIUnitModifier - - - conversionFactor - 10^-18 - - - - a - SI unit submultiple representing 10^-18. - - SIUnitSymbolModifier - - - conversionFactor - 10^-18 - - - - zepto - SI unit submultiple representing 10^-21. - - SIUnitModifier - - - conversionFactor - 10^-21 - - - - z - SI unit submultiple representing 10^-21. - - SIUnitSymbolModifier - - - conversionFactor - 10^-21 - - - - yocto - SI unit submultiple representing 10^-24. - - SIUnitModifier - - - conversionFactor - 10^-24 - - - - y - SI unit submultiple representing 10^-24. - - SIUnitSymbolModifier - - - conversionFactor - 10^-24 - - - - - - dateTimeClass - Date-times should conform to ISO8601 date-time format YYYY-MM-DDThh:mm:ss. Any variation on the full form is allowed. - - allowedCharacter - digits - T - - - : - - - - nameClass - Value class designating values that have the characteristics of node names. The allowed characters are alphanumeric, hyphen, and underbar. - - allowedCharacter - letters - digits - _ - - - - - - numericClass - Value must be a valid numerical value. - - allowedCharacter - digits - E - e - + - - - . - - - - posixPath - Posix path specification. - - allowedCharacter - digits - letters - / - : - - - - textClass - Value class designating values that have the characteristics of text such as in descriptions. - - allowedCharacter - letters - digits - blank - + - - - : - ; - . - / - ( - ) - ? - * - % - $ - @ - - - - - - allowedCharacter - A schema attribute of value classes specifying a special character that is allowed in expressing the value of a placeholder. Normally the allowed characters are listed individually. However, the word letters designates the upper and lower case alphabetic characters and the word digits designates the digits 0-9. The word blank designates the blank character. - - valueClassProperty - - - - conversionFactor - The multiplicative factor to multiply these units to convert to default units. - - unitProperty - - - unitModifierProperty - - - - deprecatedFrom - Indicates that this element is deprecated. The value of the attribute is the latest schema version in which the element appeared in undeprecated form. - - elementProperty - - - - defaultUnits - A schema attribute of unit classes specifying the default units to use if the placeholder has a unit class but the substituted value has no units. - - unitClassProperty - - - - extensionAllowed - A schema attribute indicating that users can add unlimited levels of child nodes under this tag. This tag is propagated to child nodes with the exception of the hashtag placeholders. - - boolProperty - - - nodeProperty - - - isInheritedProperty - - - - inLibrary - Indicates this schema element came from the named library schema, not the standard schema. This attribute is added by tools when a library schema is merged into its partnered standard schema. - - elementProperty - - - - recommended - A schema attribute indicating that the event-level HED string should include this tag. - - boolProperty - - - nodeProperty - - - - relatedTag - A schema attribute suggesting HED tags that are closely related to this tag. This attribute is used by tagging tools. - - nodeProperty - - - isInheritedProperty - - - - requireChild - A schema attribute indicating that one of the node elements descendants must be included when using this tag. - - boolProperty - - - nodeProperty - - - - required - A schema attribute indicating that every event-level HED string should include this tag. - - boolProperty - - - nodeProperty - - - - reserved - A schema attribute indicating that this tag has special meaning and requires special handling by tools. - - boolProperty - - - nodeProperty - - - - rooted - Indicates a top-level library schema node is identical to a node of the same name in the partnered standard schema. This attribute can only appear in nodes that have the inLibrary schema attribute. - - nodeProperty - - - - SIUnit - A schema attribute indicating that this unit element is an SI unit and can be modified by multiple and submultiple names. Note that some units such as byte are designated as SI units although they are not part of the standard. - - boolProperty - - - unitProperty - - - - SIUnitModifier - A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a base unit rather than a unit symbol. - - boolProperty - - - unitModifierProperty - - - - SIUnitSymbolModifier - A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a unit symbol rather than a base symbol. - - boolProperty - - - unitModifierProperty - - - - suggestedTag - A schema attribute that indicates another tag that is often associated with this tag. This attribute is used by tagging tools to provide tagging suggestions. - - nodeProperty - - - isInheritedProperty - - - - tagGroup - A schema attribute indicating the tag can only appear inside a tag group. - - boolProperty - - - nodeProperty - - - - takesValue - A schema attribute indicating the tag is a hashtag placeholder that is expected to be replaced with a user-defined value. - - boolProperty - - - nodeProperty - - - - topLevelTagGroup - A schema attribute indicating that this tag (or its descendants) can only appear in a top-level tag group. A tag group can have at most one tag with this attribute. - - boolProperty - - - nodeProperty - - - - unique - A schema attribute indicating that only one of this tag or its descendants can be used in the event-level HED string. - - boolProperty - - - nodeProperty - - - - unitClass - A schema attribute specifying which unit class this value tag belongs to. - - nodeProperty - - - - unitPrefix - A schema attribute applied specifically to unit elements to designate that the unit indicator is a prefix (e.g., dollar sign in the currency units). - - boolProperty - - - unitProperty - - - - unitSymbol - A schema attribute indicating this tag is an abbreviation or symbol representing a type of unit. Unit symbols represent both the singular and the plural and thus cannot be pluralized. - - boolProperty - - - unitProperty - - - - valueClass - A schema attribute specifying which value class this value tag belongs to. - - nodeProperty - - - - - - boolProperty - Indicates that the schema attribute represents something that is either true or false and does not have a value. Attributes without this value are assumed to have string values. - - - elementProperty - Indicates this schema attribute can apply to any type of element(tag term, unit class, etc). - - - isInheritedProperty - Indicates that this attribute is inherited by child nodes. This property only applies to schema attributes for nodes. - - - nodeProperty - Indicates this schema attribute applies to node (tag-term) elements. This was added to allow for an attribute to apply to multiple elements. - - - unitClassProperty - Indicates that the schema attribute is meant to be applied to unit classes. - - - unitModifierProperty - Indicates that the schema attribute is meant to be applied to unit modifier classes. - - - unitProperty - Indicates that the schema attribute is meant to be applied to units within a unit class. - - - valueClassProperty - Indicates that the schema attribute is meant to be applied to value classes. - - - The Standardized Computer-based Organized Reporting of EEG (SCORE) is a standard terminology for scalp EEG data assessment designed for use in clinical practice that may also be used for research purposes. -The SCORE standard defines terms for describing phenomena observed in scalp EEG data. It is also potentially applicable (with some suitable extensions) to EEG recorded in critical care and neonatal settings. -The SCORE standard received European consensus and has been endorsed by the European Chapter of the International Federation of Clinical Neurophysiology (IFCN) and the International League Against Epilepsy (ILAE) Commission on European Affairs. -A second revised and extended version of SCORE achieved international consensus. - -[1] Beniczky, Sandor, et al. "Standardized computer based organized reporting of EEG: SCORE." Epilepsia 54.6 (2013). -[2] Beniczky, Sandor, et al. "Standardized computer based organized reporting of EEG: SCORE second version." Clinical Neurophysiology 128.11 (2017). - -TPA, March 2023 - + + + This schema is a Hierarchical Event Descriptors (HED) Library Schema implementation of Standardized Computer-based Organized Reporting of EEG (SCORE)[1,2] for describing events occurring during neuroimaging time series recordings. +The HED-SCORE library schema allows neurologists, neurophysiologists, and brain researchers to annotate electrophysiology recordings using terms from an internationally accepted set of defined terms (SCORE) compatible with the HED framework. +The resulting annotations are understandable to clinicians and directly usable in computer analysis. + +Future extensions may be implemented in the HED-SCORE library schema. +For more information see https://hed-schema-library.readthedocs.io/en/latest/index.html. + + + Modulator + External stimuli / interventions or changes in the alertness level (sleep) that modify: the background activity, or how often a graphoelement is occurring, or change other features of the graphoelement (like intra-burst frequency). For each observed finding, there is an option of specifying how they are influenced by the modulators and procedures that were done during the recording. + + requireChild + + + inLibrary + score + + + Sleep-modulator + + inLibrary + score + + + Sleep-deprivation + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Sleep-following-sleep-deprivation + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Natural-sleep + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Induced-sleep + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Drowsiness + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Awakening + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Medication-modulator + + inLibrary + score + + + Medication-administered-during-recording + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Medication-withdrawal-or-reduction-during-recording + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Eye-modulator + + inLibrary + score + + + Manual-eye-closure + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Manual-eye-opening + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Stimulation-modulator + + inLibrary + score + + + Intermittent-photic-stimulation + + requireChild + + + suggestedTag + Intermittent-photic-stimulation-effect + + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + inLibrary + score + + + + + Auditory-stimulation + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Nociceptive-stimulation + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Hyperventilation + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Physical-effort + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Cognitive-task + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Other-modulator-or-procedure + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Background-activity + An EEG activity representing the setting in which a given normal or abnormal pattern appears and from which such pattern is distinguished. + + requireChild + + + inLibrary + score + + + Posterior-dominant-rhythm + Rhythmic activity occurring during wakefulness over the posterior regions of the head, generally with maximum amplitudes over the occipital areas. Amplitude varies. Best seen with eyes closed and during physical relaxation and relative mental inactivity. Blocked or attenuated by attention, especially visual, and mental effort. In adults this is the alpha rhythm, and the frequency is 8 to 13 Hz. However the frequency can be higher or lower than this range (often a supra or sub harmonic of alpha frequency) and is called alpha variant rhythm (fast and slow alpha variant rhythm). In children, the normal range of the frequency of the posterior dominant rhythm is age-dependant. + + suggestedTag + Finding-significance-to-recording + Finding-frequency + Finding-amplitude-asymmetry + Posterior-dominant-rhythm-property + + + inLibrary + score + + + + Mu-rhythm + EEG rhythm at 7-11 Hz composed of arch-shaped waves occurring over the central or centro-parietal regions of the scalp during wakefulness. Amplitudes varies but is mostly below 50 microV. Blocked or attenuated most clearly by contralateral movement, thought of movement, readiness to move or tactile stimulation. + + suggestedTag + Finding-frequency + Finding-significance-to-recording + Brain-laterality + Brain-region + Sensors + + + inLibrary + score + + + + Other-organized-rhythm + EEG activity that consisting of waves of approximately constant period, which is considered as part of the background (ongoing) activity, but does not fulfill the criteria of the posterior dominant rhythm. + + requireChild + + + suggestedTag + Rhythmic-activity-morphology + Finding-significance-to-recording + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Background-activity-special-feature + Special Features. Special features contains scoring options for the background activity of critically ill patients. + + requireChild + + + inLibrary + score + + + Continuous-background-activity + + suggestedTag + Rhythmic-activity-morphology + Brain-laterality + Brain-region + Sensors + Finding-extent + + + inLibrary + score + + + + Nearly-continuous-background-activity + + suggestedTag + Rhythmic-activity-morphology + Brain-laterality + Brain-region + Sensors + Finding-extent + + + inLibrary + score + + + + Discontinuous-background-activity + + suggestedTag + Rhythmic-activity-morphology + Brain-laterality + Brain-region + Sensors + Finding-extent + + + inLibrary + score + + + + Background-burst-suppression + EEG pattern consisting of bursts (activity appearing and disappearing abruptly) interrupted by periods of low amplitude (below 20 microV) and which occurs simultaneously over all head regions. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Finding-extent + + + inLibrary + score + + + + Background-burst-attenuation + + suggestedTag + Brain-laterality + Brain-region + Sensors + Finding-extent + + + inLibrary + score + + + + Background-activity-suppression + Periods showing activity under 10 microV (referential montage) and interrupting the background (ongoing) activity. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Finding-extent + Appearance-mode + + + inLibrary + score + + + + Electrocerebral-inactivity + Absence of any ongoing cortical electric activities; in all leads EEG is isoelectric or only contains artifacts. Sensitivity has to be increased up to 2 microV/mm; recording time: at least 30 minutes. + + inLibrary + score + + + + + + Sleep-and-drowsiness + The features of the ongoing activity during sleep are scored here. If abnormal graphoelements appear, disappear or change their morphology during sleep, that is not scored here but at the entry corresponding to that graphooelement (as a modulator). + + requireChild + + + inLibrary + score + + + Sleep-architecture + For longer recordings. Only to be scored if whole-night sleep is part of the recording. It is a global descriptor of the structure and pattern of sleep: estimation of the amount of time spent in REM and NREM sleep, sleep duration, NREM-REM cycle. + + suggestedTag + Property-not-possible-to-determine + + + inLibrary + score + + + Normal-sleep-architecture + + inLibrary + score + + + + Abnormal-sleep-architecture + + inLibrary + score + + + + + Sleep-stage-reached + For normal sleep patterns the sleep stages reached during the recording can be specified + + requireChild + + + suggestedTag + Property-not-possible-to-determine + Finding-significance-to-recording + + + inLibrary + score + + + Sleep-stage-N1 + Sleep stage 1. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Sleep-stage-N2 + Sleep stage 2. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Sleep-stage-N3 + Sleep stage 3. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Sleep-stage-REM + Rapid eye movement. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Sleep-spindles + Burst at 11-15 Hz but mostly at 12-14 Hz generally diffuse but of higher voltage over the central regions of the head, occurring during sleep. Amplitude varies but is mostly below 50 microV in the adult. + + suggestedTag + Finding-significance-to-recording + Brain-laterality + Brain-region + Sensors + Finding-amplitude-asymmetry + + + inLibrary + score + + + + Arousal-pattern + Arousal pattern in children. Prolonged, marked high voltage 4-6/s activity in all leads with some intermixed slower frequencies, in children. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + Frontal-arousal-rhythm + Prolonged (up to 20s) rhythmical sharp or spiky activity over the frontal areas (maximum over the frontal midline) seen at arousal from sleep in children with minimal cerebral dysfunction. + + suggestedTag + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + Vertex-wave + Sharp potential, maximal at the vertex, negative relative to other areas, apparently occurring spontaneously during sleep or in response to a sensory stimulus during sleep or wakefulness. May be single or repetitive. Amplitude varies but rarely exceeds 250 microV. Abbreviation: V wave. Synonym: vertex sharp wave. + + suggestedTag + Finding-significance-to-recording + Brain-laterality + Brain-region + Sensors + Finding-amplitude-asymmetry + + + inLibrary + score + + + + K-complex + A burst of somewhat variable appearance, consisting most commonly of a high voltage negative slow wave followed by a smaller positive slow wave frequently associated with a sleep spindle. Duration greater than 0.5 s. Amplitude is generally maximal in the frontal vertex. K complexes occur during nonREM sleep, apparently spontaneously, or in response to sudden sensory / auditory stimuli, and are not specific for any individual sensory modality. + + suggestedTag + Finding-significance-to-recording + Brain-laterality + Brain-region + Sensors + Finding-amplitude-asymmetry + + + inLibrary + score + + + + Saw-tooth-waves + Vertex negative 2-5 Hz waves occuring in series during REM sleep + + suggestedTag + Finding-significance-to-recording + Brain-laterality + Brain-region + Sensors + Finding-amplitude-asymmetry + + + inLibrary + score + + + + POSTS + Positive occipital sharp transients of sleep. Sharp transient maximal over the occipital regions, positive relative to other areas, apparently occurring spontaneously during sleep. May be single or repetitive. Amplitude varies but is generally bellow 50 microV. + + suggestedTag + Finding-significance-to-recording + Brain-laterality + Brain-region + Sensors + Finding-amplitude-asymmetry + + + inLibrary + score + + + + Hypnagogic-hypersynchrony + Bursts of bilateral, synchronous delta or theta activity of large amplitude, occasionally with superimposed faster components, occurring during falling asleep or during awakening, in children. + + suggestedTag + Finding-significance-to-recording + Brain-laterality + Brain-region + Sensors + Finding-amplitude-asymmetry + + + inLibrary + score + + + + Non-reactive-sleep + EEG activity consisting of normal sleep graphoelements, but which cannot be interrupted by external stimuli/ the patient cannot be waken. + + inLibrary + score + + + + + Interictal-finding + EEG pattern / transient that is distinguished form the background activity, considered abnormal, but is not recorded during ictal period (seizure) or postictal period; the presence of an interictal finding does not necessarily imply that the patient has epilepsy. + + requireChild + + + inLibrary + score + + + Epileptiform-interictal-activity + + suggestedTag + Spike-morphology + Spike-and-slow-wave-morphology + Runs-of-rapid-spikes-morphology + Polyspikes-morphology + Polyspike-and-slow-wave-morphology + Sharp-wave-morphology + Sharp-and-slow-wave-morphology + Slow-sharp-wave-morphology + High-frequency-oscillation-morphology + Hypsarrhythmia-classic-morphology + Hypsarrhythmia-modified-morphology + Brain-laterality + Brain-region + Sensors + Finding-propagation + Multifocal-finding + Appearance-mode + Discharge-pattern + Finding-incidence + + + inLibrary + score + + + + Abnormal-interictal-rhythmic-activity + + suggestedTag + Rhythmic-activity-morphology + Polymorphic-delta-activity-morphology + Frontal-intermittent-rhythmic-delta-activity-morphology + Occipital-intermittent-rhythmic-delta-activity-morphology + Temporal-intermittent-rhythmic-delta-activity-morphology + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + Finding-incidence + + + inLibrary + score + + + + Interictal-special-patterns + + requireChild + + + inLibrary + score + + + Interictal-periodic-discharges + Periodic discharge not further specified (PDs). + + suggestedTag + Periodic-discharge-morphology + Brain-laterality + Brain-region + Sensors + Periodic-discharge-time-related-features + + + inLibrary + score + + + Generalized-periodic-discharges + GPDs. + + inLibrary + score + + + + Lateralized-periodic-discharges + LPDs. + + inLibrary + score + + + + Bilateral-independent-periodic-discharges + BIPDs. + + inLibrary + score + + + + Multifocal-periodic-discharges + MfPDs. + + inLibrary + score + + + + + Extreme-delta-brush + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + + + Critically-ill-patients-patterns + Rhythmic or periodic patterns in critically ill patients (RPPs) are scored according to the 2012 version of the American Clinical Neurophysiology Society Standardized Critical Care EEG Terminology (Hirsch et al., 2013). + + requireChild + + + inLibrary + score + + + Critically-ill-patients-periodic-discharges + Periodic discharges (PDs). + + suggestedTag + Periodic-discharge-morphology + Brain-laterality + Brain-region + Sensors + Finding-frequency + Periodic-discharge-time-related-features + + + inLibrary + score + + + + Rhythmic-delta-activity + RDA + + suggestedTag + Periodic-discharge-superimposed-activity + Periodic-discharge-absolute-amplitude + Brain-laterality + Brain-region + Sensors + Finding-frequency + Periodic-discharge-time-related-features + + + inLibrary + score + + + + Spike-or-sharp-and-wave + SW + + suggestedTag + Periodic-discharge-sharpness + Number-of-periodic-discharge-phases + Periodic-discharge-triphasic-morphology + Periodic-discharge-absolute-amplitude + Periodic-discharge-relative-amplitude + Periodic-discharge-polarity + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Finding-frequency + Periodic-discharge-time-related-features + + + inLibrary + score + + + + + Episode + Clinical episode or electrographic seizure. + + requireChild + + + inLibrary + score + + + Epileptic-seizure + The ILAE presented a revised seizure classification that divides seizures into focal, generalized onset, or unknown onset. + + requireChild + + + inLibrary + score + + + Focal-onset-epileptic-seizure + Focal seizures can be divided into focal aware and impaired awareness seizures, with additional motor and nonmotor classifications. + + suggestedTag + Episode-phase + Automatism-motor-seizure + Atonic-motor-seizure + Clonic-motor-seizure + Epileptic-spasm-episode + Hyperkinetic-motor-seizure + Myoclonic-motor-seizure + Tonic-motor-seizure + Autonomic-nonmotor-seizure + Behavior-arrest-nonmotor-seizure + Cognitive-nonmotor-seizure + Emotional-nonmotor-seizure + Sensory-nonmotor-seizure + Seizure-dynamics + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + Aware-focal-onset-epileptic-seizure + + suggestedTag + Episode-phase + Seizure-dynamics + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + Impaired-awareness-focal-onset-epileptic-seizure + + suggestedTag + Episode-phase + Seizure-dynamics + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + Awareness-unknown-focal-onset-epileptic-seizure + + suggestedTag + Episode-phase + Seizure-dynamics + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + Focal-to-bilateral-tonic-clonic-focal-onset-epileptic-seizure + A seizure type with focal onset, with awareness or impaired awareness, either motor or non-motor, progressing to bilateral tonic clonic activity. The prior term was seizure with partial onset with secondary generalization. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + suggestedTag + Episode-phase + Seizure-dynamics + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + + Generalized-onset-epileptic-seizure + Generalized-onset seizures are classified as motor or nonmotor (absence), without using awareness level as a classifier, as most but not all of these seizures are linked with impaired awareness. + + suggestedTag + Episode-phase + Tonic-clonic-motor-seizure + Clonic-motor-seizure + Tonic-motor-seizure + Myoclonic-motor-seizure + Myoclonic-tonic-clonic-motor-seizure + Myoclonic-atonic-motor-seizure + Atonic-motor-seizure + Epileptic-spasm-episode + Typical-absence-seizure + Atypical-absence-seizure + Myoclonic-absence-seizure + Eyelid-myoclonia-absence-seizure + Seizure-dynamics + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + Unknown-onset-epileptic-seizure + Even if the onset of seizures is unknown, they may exhibit characteristics that fall into categories such as motor, nonmotor, tonic-clonic, epileptic spasms, or behavior arrest. + + suggestedTag + Episode-phase + Tonic-clonic-motor-seizure + Epileptic-spasm-episode + Behavior-arrest-nonmotor-seizure + Seizure-dynamics + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + Unclassified-epileptic-seizure + Referring to a seizure type that cannot be described by the ILAE 2017 classification either because of inadequate information or unusual clinical features. + + suggestedTag + Episode-phase + Seizure-dynamics + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + + Subtle-seizure + Seizure type frequent in neonates, sometimes referred to as motor automatisms; they may include random and roving eye movements, sucking, chewing motions, tongue protrusion, rowing or swimming or boxing movements of the arms, pedaling and bicycling movements of the lower limbs; apneic seizures are relatively common. Although some subtle seizures are associated with rhythmic ictal EEG discharges, and are clearly epileptic, ictal EEG often does not show typical epileptic activity. + + suggestedTag + Episode-phase + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + Electrographic-seizure + Referred usually to non convulsive status. Ictal EEG: rhythmic discharge or spike and wave pattern with definite evolution in frequency, location, or morphology lasting at least 10 s; evolution in amplitude alone did not qualify. + + suggestedTag + Episode-phase + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + Seizure-PNES + Psychogenic non-epileptic seizure. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + Sleep-related-episode + + requireChild + + + inLibrary + score + + + Sleep-related-arousal + Normal. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + Benign-sleep-myoclonus + A distinctive disorder of sleep characterized by a) neonatal onset, b) rhythmic myoclonic jerks only during sleep and c) abrupt and consistent cessation with arousal, d) absence of concomitant electrographic changes suggestive of seizures, and e) good outcome. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + Confusional-awakening + Episode of non epileptic nature included in NREM parasomnias, characterized by sudden arousal and complex behavior but without full alertness, usually lasting a few minutes and occurring almost in all children at least occasionally. Amnesia of the episode is the rule. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + Sleep-periodic-limb-movement + PLMS. Periodic limb movement in sleep. Episodes are characterized by brief (0.5- to 5.0-second) lower-extremity movements during sleep, which typically occur at 20- to 40-second intervals, most commonly during the first 3 hours of sleep. The affected individual is usually not aware of the movements or of the transient partial arousals. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + REM-sleep-behavioral-disorder + REM sleep behavioral disorder. Episodes characterized by: a) presence of REM sleep without atonia (RSWA) on polysomnography (PSG); b) presence of at least 1 of the following conditions - (1) Sleep-related behaviors, by history, that have been injurious, potentially injurious, or disruptive (example: dream enactment behavior); (2) abnormal REM sleep behavior documented during PSG monitoring; (3) absence of epileptiform activity on electroencephalogram (EEG) during REM sleep (unless RBD can be clearly distinguished from any concurrent REM sleep-related seizure disorder); (4) sleep disorder not better explained by another sleep disorder, a medical or neurologic disorder, a mental disorder, medication use, or a substance use disorder. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + Sleep-walking + Episodes characterized by ambulation during sleep; the patient is difficult to arouse during an episode, and is usually amnesic following the episode. Episodes usually occur in the first third of the night during slow wave sleep. Polysomnographic recordings demonstrate 2 abnormalities during the first sleep cycle: frequent, brief, non-behavioral EEG-defined arousals prior to the somnambulistic episode and abnormally low gamma (0.75-2.0 Hz) EEG power on spectral analysis, correlating with high-voltage (hyper-synchronic gamma) waves lasting 10 to 15 s occurring just prior to the movement. This is followed by stage I NREM sleep, and there is no evidence of complete awakening. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + + Pediatric-episode + + requireChild + + + inLibrary + score + + + Hyperekplexia + Disorder characterized by exaggerated startle response and hypertonicity that may occur during the first year of life and in severe cases during the neonatal period. Children usually present with marked irritability and recurrent startles in response to handling and sounds. Severely affected infants can have severe jerks and stiffening, sometimes with breath-holding spells. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + Jactatio-capitis-nocturna + Relatively common in normal children at the time of going to bed, especially during the first year of life, the rhythmic head movements persist during sleep. Usually, these phenomena disappear before 3 years of age. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + Pavor-nocturnus + A nocturnal episode characterized by age of onset of less than five years (mean age 18 months, with peak prevalence at five to seven years), appearance of signs of panic two hours after falling asleep with crying, screams, a fearful expression, inability to recognize other people including parents (for a duration of 5-15 minutes), amnesia upon awakening. Pavor nocturnus occurs in patients almost every night for months or years (but the frequency is highly variable and may be as low as once a month) and is likely to disappear spontaneously at the age of six to eight years. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + Pediatric-stereotypical-behavior-episode + Repetitive motor behavior in children, typically rhythmic and persistent; usually not paroxysmal and rarely suggest epilepsy. They include headbanging, head-rolling, jactatio capitis nocturna, body rocking, buccal or lingual movements, hand flapping and related mannerisms, repetitive hand-waving (to self-induce photosensitive seizures). + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + + Paroxysmal-motor-event + Paroxysmal phenomena during neonatal or childhood periods characterized by recurrent motor or behavioral signs or symptoms that must be distinguishes from epileptic disorders. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + Syncope + Episode with loss of consciousness and muscle tone that is abrupt in onset, of short duration and followed by rapid recovery; it occurs in response to transient impairment of cerebral perfusion. Typical prodromal symptoms often herald onset of syncope and postictal symptoms are minimal. Syncopal convulsions resulting from cerebral anoxia are common but are not a form of epilepsy, nor are there any accompanying EEG ictal discharges. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + Cataplexy + A sudden decrement in muscle tone and loss of deep tendon reflexes, leading to muscle weakness, paralysis, or postural collapse. Cataplexy usually is precipitated by an outburst of emotional expression-notably laughter, anger, or startle. It is one of the tetrad of symptoms of narcolepsy. During cataplexy, respiration and voluntary eye movements are not compromised. Consciousness is preserved. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + inLibrary + score + + + + Other-episode + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Physiologic-pattern + EEG graphoelements or rhythms that are considered normal. They only should be scored if the physician considers that they have a specific clinical significance for the recording. + + requireChild + + + inLibrary + score + + + Rhythmic-activity-pattern + Not further specified. + + suggestedTag + Rhythmic-activity-morphology + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + Slow-alpha-variant-rhythm + Characteristic rhythms mostly at 4-5 Hz, recorded most prominently over the posterior regions of the head. Generally alternate, or are intermixed, with alpha rhythm to which they often are harmonically related. Amplitude varies but is frequently close to 50 micro V. Blocked or attenuated by attention, especially visual, and mental effort. Comment: slow alpha variant rhythms should be distinguished from posterior slow waves characteristic of children and adolescents and occasionally seen in young adults. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + Fast-alpha-variant-rhythm + Characteristic rhythm at 14-20 Hz, detected most prominently over the posterior regions of the head. May alternate or be intermixed with alpha rhythm. Blocked or attenuated by attention, especially visual, and mental effort. + + suggestedTag + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + Ciganek-rhythm + Midline theta rhythm (Ciganek rhythm) may be observed during wakefulness or drowsiness. The frequency is 4-7 Hz, and the location is midline (ie, vertex). The morphology is rhythmic, smooth, sinusoidal, arciform, spiky, or mu-like. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + Lambda-wave + Diphasic sharp transient occurring over occipital regions of the head of waking subjects during visual exploration. The main component is positive relative to other areas. Time-locked to saccadic eye movement. Amplitude varies but is generally below 50 micro V. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + Posterior-slow-waves-youth + Waves in the delta and theta range, of variable form, lasting 0.35 to 0.5 s or longer without any consistent periodicity, found in the range of 6-12 years (occasionally seen in young adults). Alpha waves are almost always intermingled or superimposed. Reactive similar to alpha activity. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + Diffuse-slowing-hyperventilation + Diffuse slowing induced by hyperventilation. Bilateral, diffuse slowing during hyperventilation. Recorded in 70 percent of normal children (3-5 years) and less then 10 percent of adults. Usually appear in the posterior regions and spread forward in younger age group, whereas they tend to appear in the frontal regions and spread backward in the older age group. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + Photic-driving + Physiologic response consisting of rhythmic activity elicited over the posterior regions of the head by repetitive photic stimulation at frequencies of about 5-30 Hz. Comments: term should be limited to activity time-locked to the stimulus and of frequency identical or harmonically related to the stimulus frequency. Photic driving should be distinguished from the visual evoked potentials elicited by isolated flashes of light or flashes repeated at very low frequency. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + Photomyogenic-response + A response to intermittent photic stimulation characterized by the appearance in the record of brief, repetitive muscular artifacts (spikes) over the anterior regions of the head. These often increase gradually in amplitude as stimuli are continued and cease promptly when the stimulus is withdrawn. Comment: this response is frequently associated with flutter of the eyelids and vertical oscillations of the eyeballs and sometimes with discrete jerking mostly involving the musculature of the face and head. (Preferred to synonym: photo-myoclonic response). + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + Other-physiologic-pattern + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Uncertain-significant-pattern + EEG graphoelements or rhythms that resemble abnormal patterns but that are not necessarily associated with a pathology, and the physician does not consider them abnormal in the context of the scored recording (like normal variants and patterns). + + requireChild + + + inLibrary + score + + + Sharp-transient-pattern + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + Wicket-spikes + Spike-like monophasic negative single waves or trains of waves occurring over the temporal regions during drowsiness that have an arcuate or mu-like appearance. These are mainly seen in older individuals and represent a benign variant that is of little clinical significance. + + inLibrary + score + + + + Small-sharp-spikes + Benign epileptiform Transients of Sleep (BETS). Small sharp spikes (SSS) of very short duration and low amplitude, often followed by a small theta wave, occurring in the temporal regions during drowsiness and light sleep. They occur on one or both sides (often asynchronously). The main negative and positive components are of about equally spiky character. Rarely seen in children, they are seen most often in adults and the elderly. Two thirds of the patients have a history of epileptic seizures. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + Fourteen-six-Hz-positive-burst + Burst of arch-shaped waves at 13-17 Hz and/or 5-7-Hz but most commonly at 14 and or 6 Hz seen generally over the posterior temporal and adjacent areas of one or both sides of the head during sleep. The sharp peaks of its component waves are positive with respect to other regions. Amplitude varies but is generally below 75 micro V. Comments: (1) best demonstrated by referential recording using contralateral earlobe or other remote, reference electrodes. (2) This pattern has no established clinical significance. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + Six-Hz-spike-slow-wave + Spike and slow wave complexes at 4-7Hz, but mostly at 6 Hz occurring generally in brief bursts bilaterally and synchronously, symmetrically or asymmetrically, and either confined to or of larger amplitude over the posterior or anterior regions of the head. The spike has a strong positive component. Amplitude varies but is generally smaller than that of spike-and slow-wave complexes repeating at slower rates. Comment: this pattern should be distinguished from epileptiform discharges. Synonym: wave and spike phantom. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + Rudimentary-spike-wave-complex + Synonym: Pseudo petit mal discharge. Paroxysmal discharge that consists of generalized or nearly generalized high voltage 3 to 4/sec waves with poorly developed spike in the positive trough between the slow waves, occurring in drowsiness only. It is found only in infancy and early childhood when marked hypnagogic rhythmical theta activity is paramount in the drowsy state. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + Slow-fused-transient + A posterior slow-wave preceded by a sharp-contoured potential that blends together with the ensuing slow wave, in children. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + Needle-like-occipital-spikes-blind + Spike discharges of a particularly fast and needle-like character develop over the occipital region in most congenitally blind children. Completely disappear during childhood or adolescence. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + Subclinical-rhythmic-EEG-discharge-adults + Subclinical rhythmic EEG discharge of adults (SERDA). A rhythmic pattern seen in the adult age group, mainly in the waking state or drowsiness. It consists of a mixture of frequencies, often predominant in the theta range. The onset may be fairly abrupt with widespread sharp rhythmical theta and occasionally with delta activity. As to the spatial distribution, a maximum of this discharge is usually found over the centroparietal region and especially over the vertex. It may resemble a seizure discharge but is not accompanied by any clinical signs or symptoms. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + Rhythmic-temporal-theta-burst-drowsiness + Rhythmic temporal theta burst of drowsiness (RTTD). Characteristic burst of 4-7 Hz waves frequently notched by faster waves, occurring over the temporal regions of the head during drowsiness. Synonym: psychomotor variant pattern. Comment: this is a pattern of drowsiness that is of no clinical significance. + + inLibrary + score + + + + Temporal-slowing-elderly + Focal theta and/or delta activity over the temporal regions, especially the left, in persons over the age of 60. Amplitudes are low/similar to the background activity. Comment: focal temporal theta was found in 20 percent of people between the ages of 40-59 years, and 40 percent of people between 60 and 79 years. One third of people older than 60 years had focal temporal delta activity. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + Breach-rhythm + Rhythmical activity recorded over cranial bone defects. Usually it is in the 6 to 11/sec range, does not respond to movements. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + inLibrary + score + + + + Other-uncertain-significant-pattern + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Artifact + When relevant for the clinical interpretation, artifacts can be scored by specifying the type and the location. + + requireChild + + + inLibrary + score + + + Biological-artifact + + requireChild + + + inLibrary + score + + + Eye-blink-artifact + Example for EEG: Fp1/Fp2 become electropositive with eye closure because the cornea is positively charged causing a negative deflection in Fp1/Fp2. If the eye blink is unilateral, consider prosthetic eye. If it is in F8 rather than Fp2 then the electrodes are plugged in wrong. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + inLibrary + score + + + + Eye-movement-horizontal-artifact + Example for EEG: There is an upward deflection in the Fp2-F8 derivation, when the eyes move to the right side. In this case F8 becomes more positive and therefore. When the eyes move to the left, F7 becomes more positive and there is an upward deflection in the Fp1-F7 derivation. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + inLibrary + score + + + + Eye-movement-vertical-artifact + Example for EEG: The EEG shows positive potentials (50-100 micro V) with bi-frontal distribution, maximum at Fp1 and Fp2, when the eyeball rotated upward. The downward rotation of the eyeball was associated with the negative deflection. The time course of the deflections was similar to the time course of the eyeball movement. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + inLibrary + score + + + + Slow-eye-movement-artifact + Slow, rolling eye-movements, seen during drowsiness. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + inLibrary + score + + + + Nystagmus-artifact + + suggestedTag + Artifact-significance-to-recording + + + inLibrary + score + + + + Chewing-artifact + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + inLibrary + score + + + + Sucking-artifact + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + inLibrary + score + + + + Glossokinetic-artifact + The tongue functions as a dipole, with the tip negative with respect to the base. The artifact produced by the tongue has a broad potential field that drops from frontal to occipital areas, although it is less steep than that produced by eye movement artifacts. The amplitude of the potentials is greater inferiorly than in parasagittal regions; the frequency is variable but usually in the delta range. Chewing and sucking can produce similar artifacts. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + inLibrary + score + + + + Rocking-patting-artifact + Quasi-rhythmical artifacts in recordings from infants caused by rocking/patting. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + inLibrary + score + + + + Movement-artifact + Example for EEG: Large amplitude artifact, with irregular morphology (usually resembling a slow-wave or a wave with complex morphology) seen in one or several channels, due to movement. If the causing movement is repetitive, the artifact might resemble a rhythmic EEG activity. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + inLibrary + score + + + + Respiration-artifact + Respiration can produce 2 kinds of artifacts. One type is in the form of slow and rhythmic activity, synchronous with the body movements of respiration and mechanically affecting the impedance of (usually) one electrode. The other type can be slow or sharp waves that occur synchronously with inhalation or exhalation and involve those electrodes on which the patient is lying. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + inLibrary + score + + + + Pulse-artifact + Example for EEG: Occurs when an EEG electrode is placed over a pulsating vessel. The pulsation can cause slow waves that may simulate EEG activity. A direct relationship exists between ECG and the pulse waves (200-300 millisecond delay after ECG equals QRS complex). + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + inLibrary + score + + + + ECG-artifact + Example for EEG: Far-field potential generated in the heart. The voltage and apparent surface of the artifact vary from derivation to derivation and, consequently, from montage to montage. The artifact is observed best in referential montages using earlobe electrodes A1 and A2. ECG artifact is recognized easily by its rhythmicity/regularity and coincidence with the ECG tracing. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + inLibrary + score + + + + Sweat-artifact + Is a low amplitude undulating waveform that is usually greater than 2 seconds and may appear to be an unstable baseline. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + inLibrary + score + + + + EMG-artifact + Myogenic potentials are the most common artifacts. Frontalis and temporalis muscles (ex..: clenching of jaw muscles) are common causes. Generally, the potentials generated in the muscles are of shorter duration than those generated in the brain. The frequency components are usually beyond 30-50 Hz, and the bursts are arrhythmic. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + inLibrary + score + + + + + Non-biological-artifact + + requireChild + + + inLibrary + score + + + Power-supply-artifact + 50-60 Hz artifact. Monomorphic waveform due to 50 or 60 Hz A/C power supply. + + suggestedTag + Artifact-significance-to-recording + + + inLibrary + score + + + + Induction-artifact + Artifacts (usually of high frequency) induced by nearby equipment (like in the intensive care unit). + + suggestedTag + Artifact-significance-to-recording + + + inLibrary + score + + + + Dialysis-artifact + + suggestedTag + Artifact-significance-to-recording + + + inLibrary + score + + + + Artificial-ventilation-artifact + + suggestedTag + Artifact-significance-to-recording + + + inLibrary + score + + + + Electrode-pops-artifact + Are brief discharges with a very steep upslope and shallow fall that occur in all leads which include that electrode. + + suggestedTag + Artifact-significance-to-recording + + + inLibrary + score + + + + Salt-bridge-artifact + Typically occurs in 1 channel which may appear isoelectric. Only seen in bipolar montage. + + suggestedTag + Artifact-significance-to-recording + + + inLibrary + score + + + + + Other-artifact + + requireChild + + + suggestedTag + Artifact-significance-to-recording + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Polygraphic-channel-finding + Changes observed in polygraphic channels can be scored: EOG, Respiration, ECG, EMG, other polygraphic channel (+ free text), and their significance logged (normal, abnormal, no definite abnormality). + + requireChild + + + inLibrary + score + + + EOG-channel-finding + ElectroOculoGraphy. + + suggestedTag + Finding-significance-to-recording + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Respiration-channel-finding + + suggestedTag + Finding-significance-to-recording + + + inLibrary + score + + + Respiration-oxygen-saturation + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + inLibrary + score + + + + + Respiration-feature + + inLibrary + score + + + Apnoe-respiration + Add duration (range in seconds) and comments in free text. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Hypopnea-respiration + Add duration (range in seconds) and comments in free text + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Apnea-hypopnea-index-respiration + Events/h. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Periodic-respiration + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Tachypnea-respiration + Cycles/min. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Other-respiration-feature + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + + ECG-channel-finding + Electrocardiography. + + suggestedTag + Finding-significance-to-recording + + + inLibrary + score + + + ECG-QT-period + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + ECG-feature + + inLibrary + score + + + ECG-sinus-rhythm + Normal rhythm. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + ECG-arrhythmia + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + ECG-asystolia + Add duration (range in seconds) and comments in free text. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + ECG-bradycardia + Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + ECG-extrasystole + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + ECG-ventricular-premature-depolarization + Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + ECG-tachycardia + Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Other-ECG-feature + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + + EMG-channel-finding + electromyography + + suggestedTag + Finding-significance-to-recording + + + inLibrary + score + + + EMG-muscle-side + + inLibrary + score + + + EMG-left-muscle + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + EMG-right-muscle + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + EMG-bilateral-muscle + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + EMG-muscle-name + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + EMG-feature + + inLibrary + score + + + EMG-myoclonus + + inLibrary + score + + + Negative-myoclonus + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + EMG-myoclonus-rhythmic + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + EMG-myoclonus-arrhythmic + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + EMG-myoclonus-synchronous + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + EMG-myoclonus-asynchronous + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + EMG-PLMS + Periodic limb movements in sleep. + + inLibrary + score + + + + EMG-spasm + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + EMG-tonic-contraction + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + EMG-asymmetric-activation + + requireChild + + + inLibrary + score + + + EMG-asymmetric-activation-left-first + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + EMG-asymmetric-activation-right-first + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Other-EMG-features + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + + Other-polygraphic-channel + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Finding-property + Descriptive element similar to main HED /Property. Something that pertains to a thing. A characteristic of some entity. A quality or feature regarded as a characteristic or inherent part of someone or something. HED attributes are adjectives or adverbs. + + requireChild + + + inLibrary + score + + + Signal-morphology-property + + requireChild + + + inLibrary + score + + + Rhythmic-activity-morphology + EEG activity consisting of a sequence of waves approximately constant period. + + inLibrary + score + + + Delta-activity-morphology + EEG rhythm in the delta (under 4 Hz) range that does not belong to the posterior dominant rhythm (scored under other organized rhythms). + + suggestedTag + Finding-frequency + Finding-amplitude + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Theta-activity-morphology + EEG rhythm in the theta (4-8 Hz) range that does not belong to the posterior dominant rhythm (scored under other organized rhythm). + + suggestedTag + Finding-frequency + Finding-amplitude + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Alpha-activity-morphology + EEG rhythm in the alpha range (8-13 Hz) which is considered part of the background (ongoing) activity but does not fulfill the criteria of the posterior dominant rhythm (alpha rhythm). + + suggestedTag + Finding-frequency + Finding-amplitude + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Beta-activity-morphology + EEG rhythm between 14 and 40 Hz, which is considered part of the background (ongoing) activity but does not fulfill the criteria of the posterior dominant rhythm. Most characteristically: a rhythm from 14 to 40 Hz recorded over the fronto-central regions of the head during wakefulness. Amplitude of the beta rhythm varies but is mostly below 30 microV. Other beta rhythms are most prominent in other locations or are diffuse. + + suggestedTag + Finding-frequency + Finding-amplitude + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Gamma-activity-morphology + + suggestedTag + Finding-frequency + Finding-amplitude + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Spike-morphology + A transient, clearly distinguished from background activity, with pointed peak at a conventional paper speed or time scale and duration from 20 to under 70 ms, i.e. 1/50-1/15 s approximately. Main component is generally negative relative to other areas. Amplitude varies. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Spike-and-slow-wave-morphology + A pattern consisting of a spike followed by a slow wave. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Runs-of-rapid-spikes-morphology + Bursts of spike discharges at a rate from 10 to 25/sec (in most cases somewhat irregular). The bursts last more than 2 seconds (usually 2 to 10 seconds) and it is typically seen in sleep. Synonyms: rhythmic spikes, generalized paroxysmal fast activity, fast paroxysmal rhythms, grand mal discharge, fast beta activity. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Polyspikes-morphology + Two or more consecutive spikes. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Polyspike-and-slow-wave-morphology + Two or more consecutive spikes associated with one or more slow waves. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Sharp-wave-morphology + A transient clearly distinguished from background activity, with pointed peak at a conventional paper speed or time scale, and duration of 70-200 ms, i.e. over 1/4-1/5 s approximately. Main component is generally negative relative to other areas. Amplitude varies. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Sharp-and-slow-wave-morphology + A sequence of a sharp wave and a slow wave. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Slow-sharp-wave-morphology + A transient that bears all the characteristics of a sharp-wave, but exceeds 200 ms. Synonym: blunted sharp wave. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + High-frequency-oscillation-morphology + HFO. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Hypsarrhythmia-classic-morphology + Abnormal interictal high amplitude waves and a background of irregular spikes. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Hypsarrhythmia-modified-morphology + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Fast-spike-activity-morphology + A burst consisting of a sequence of spikes. Duration greater than 1 s. Frequency at least in the alpha range. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Low-voltage-fast-activity-morphology + Refers to the fast, and often recruiting activity which can be recorded at the onset of an ictal discharge, particularly in invasive EEG recording of a seizure. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Polysharp-waves-morphology + A sequence of two or more sharp-waves. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Slow-wave-large-amplitude-morphology + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Irregular-delta-or-theta-activity-morphology + EEG activity consisting of repetitive waves of inconsistent wave-duration but in delta and/or theta rang (greater than 125 ms). + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Electrodecremental-change-morphology + Sudden desynchronization of electrical activity. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + DC-shift-morphology + Shift of negative polarity of the direct current recordings, during seizures. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Disappearance-of-ongoing-activity-morphology + Disappearance of the EEG activity that preceded the ictal event but still remnants of background activity (thus not enough to name it electrodecremental change). + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Polymorphic-delta-activity-morphology + EEG activity consisting of waves in the delta range (over 250 ms duration for each wave) but of different morphology. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Frontal-intermittent-rhythmic-delta-activity-morphology + Frontal intermittent rhythmic delta activity (FIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at 1.5-2.5 Hz over the frontal areas of one or both sides of the head. Comment: most commonly associated with unspecified encephalopathy, in adults. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Occipital-intermittent-rhythmic-delta-activity-morphology + Occipital intermittent rhythmic delta activity (OIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at 2-3 Hz over the occipital or posterior head regions of one or both sides of the head. Frequently blocked or attenuated by opening the eyes. Comment: most commonly associated with unspecified encephalopathy, in children. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Temporal-intermittent-rhythmic-delta-activity-morphology + Temporal intermittent rhythmic delta activity (TIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at over the temporal areas of one side of the head. Comment: most commonly associated with temporal lobe epilepsy. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Periodic-discharge-morphology + Periodic discharges not further specified (PDs). + + requireChild + + + inLibrary + score + + + Periodic-discharge-superimposed-activity + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + inLibrary + score + + + Periodic-discharge-fast-superimposed-activity + + suggestedTag + Finding-frequency + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Periodic-discharge-rhythmic-superimposed-activity + + suggestedTag + Finding-frequency + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Periodic-discharge-sharpness + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + inLibrary + score + + + Spiky-periodic-discharge-sharpness + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Sharp-periodic-discharge-sharpness + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Sharply-contoured-periodic-discharge-sharpness + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Blunt-periodic-discharge-sharpness + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Number-of-periodic-discharge-phases + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + inLibrary + score + + + 1-periodic-discharge-phase + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + 2-periodic-discharge-phases + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + 3-periodic-discharge-phases + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Greater-than-3-periodic-discharge-phases + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Periodic-discharge-triphasic-morphology + + suggestedTag + Property-not-possible-to-determine + Property-exists + Property-absence + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Periodic-discharge-absolute-amplitude + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + inLibrary + score + + + Periodic-discharge-absolute-amplitude-very-low + Lower than 20 microV. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Low-periodic-discharge-absolute-amplitude + 20 to 49 microV. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Medium-periodic-discharge-absolute-amplitude + 50 to 199 microV. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + High-periodic-discharge-absolute-amplitude + Greater than 200 microV. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Periodic-discharge-relative-amplitude + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + inLibrary + score + + + Periodic-discharge-relative-amplitude-less-than-equal-2 + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Periodic-discharge-relative-amplitude-greater-than-2 + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Periodic-discharge-polarity + + requireChild + + + inLibrary + score + + + Periodic-discharge-postitive-polarity + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Periodic-discharge-negative-polarity + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Periodic-discharge-unclear-polarity + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + + + Source-analysis-property + How the current in the brain reaches the electrode sensors. + + requireChild + + + inLibrary + score + + + Source-analysis-laterality + + requireChild + + + suggestedTag + Brain-laterality + + + inLibrary + score + + + + Source-analysis-brain-region + + requireChild + + + inLibrary + score + + + Source-analysis-frontal-perisylvian-superior-surface + + inLibrary + score + + + + Source-analysis-frontal-lateral + + inLibrary + score + + + + Source-analysis-frontal-mesial + + inLibrary + score + + + + Source-analysis-frontal-polar + + inLibrary + score + + + + Source-analysis-frontal-orbitofrontal + + inLibrary + score + + + + Source-analysis-temporal-polar + + inLibrary + score + + + + Source-analysis-temporal-basal + + inLibrary + score + + + + Source-analysis-temporal-lateral-anterior + + inLibrary + score + + + + Source-analysis-temporal-lateral-posterior + + inLibrary + score + + + + Source-analysis-temporal-perisylvian-inferior-surface + + inLibrary + score + + + + Source-analysis-central-lateral-convexity + + inLibrary + score + + + + Source-analysis-central-mesial + + inLibrary + score + + + + Source-analysis-central-sulcus-anterior-surface + + inLibrary + score + + + + Source-analysis-central-sulcus-posterior-surface + + inLibrary + score + + + + Source-analysis-central-opercular + + inLibrary + score + + + + Source-analysis-parietal-lateral-convexity + + inLibrary + score + + + + Source-analysis-parietal-mesial + + inLibrary + score + + + + Source-analysis-parietal-opercular + + inLibrary + score + + + + Source-analysis-occipital-lateral + + inLibrary + score + + + + Source-analysis-occipital-mesial + + inLibrary + score + + + + Source-analysis-occipital-basal + + inLibrary + score + + + + Source-analysis-insula + + inLibrary + score + + + + + + Location-property + Location can be scored for findings. Semiologic finding can also be characterized by the somatotopic modifier (i.e. the part of the body where it occurs). In this respect, laterality (left, right, symmetric, asymmetric, left greater than right, right greater than left), body part (eyelid, face, arm, leg, trunk, visceral, hemi-) and centricity (axial, proximal limb, distal limb) can be scored. + + requireChild + + + inLibrary + score + + + Brain-laterality + + requireChild + + + inLibrary + score + + + Brain-laterality-left + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Brain-laterality-left-greater-right + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Brain-laterality-right + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Brain-laterality-right-greater-left + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Brain-laterality-midline + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Brain-laterality-diffuse-asynchronous + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Brain-region + + requireChild + + + inLibrary + score + + + Brain-region-frontal + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Brain-region-temporal + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Brain-region-central + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Brain-region-parietal + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Brain-region-occipital + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Body-part-location + + requireChild + + + inLibrary + score + + + Eyelid-location + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Face-location + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Arm-location + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Leg-location + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Trunk-location + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Visceral-location + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Hemi-location + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Brain-centricity + + requireChild + + + inLibrary + score + + + Brain-centricity-axial + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Brain-centricity-proximal-limb + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Brain-centricity-distal-limb + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Sensors + Lists all corresponding sensors (electrodes/channels in montage). The sensor-group is selected from a list defined in the site-settings for each EEG-lab. + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Finding-propagation + When propagation within the graphoelement is observed, first the location of the onset region is scored. Then, the location of the propagation can be noted. + + suggestedTag + Property-exists + Property-absence + Brain-laterality + Brain-region + Sensors + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Multifocal-finding + When the same interictal graphoelement is observed bilaterally and at least in three independent locations, can score them using one entry, and choosing multifocal as a descriptor of the locations of the given interictal graphoelements, optionally emphasizing the involved, and the most active sites. + + suggestedTag + Property-not-possible-to-determine + Property-exists + Property-absence + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Modulators-property + For each described graphoelement, the influence of the modulators can be scored. Only modulators present in the recording are scored. + + requireChild + + + inLibrary + score + + + Modulators-reactivity + Susceptibility of individual rhythms or the EEG as a whole to change following sensory stimulation or other physiologic actions. + + requireChild + + + suggestedTag + Property-exists + Property-absence + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Eye-closure-sensitivity + Eye closure sensitivity. + + suggestedTag + Property-exists + Property-absence + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Eye-opening-passive + Passive eye opening. Used with base schema Increasing/Decreasing. + + suggestedTag + Property-not-possible-to-determine + Finding-stopped-by + Finding-unmodified + Finding-triggered-by + + + inLibrary + score + + + + Medication-effect-EEG + Medications effect on EEG. Used with base schema Increasing/Decreasing. + + suggestedTag + Property-not-possible-to-determine + Finding-stopped-by + Finding-unmodified + + + inLibrary + score + + + + Medication-reduction-effect-EEG + Medications reduction or withdrawal effect on EEG. Used with base schema Increasing/Decreasing. + + suggestedTag + Property-not-possible-to-determine + Finding-stopped-by + Finding-unmodified + + + inLibrary + score + + + + Auditive-stimuli-effect + Used with base schema Increasing/Decreasing. + + suggestedTag + Property-not-possible-to-determine + Finding-stopped-by + Finding-unmodified + + + inLibrary + score + + + + Nociceptive-stimuli-effect + Used with base schema Increasing/Decreasing. + + suggestedTag + Property-not-possible-to-determine + Finding-stopped-by + Finding-unmodified + Finding-triggered-by + + + inLibrary + score + + + + Physical-effort-effect + Used with base schema Increasing/Decreasing + + suggestedTag + Property-not-possible-to-determine + Finding-stopped-by + Finding-unmodified + Finding-triggered-by + + + inLibrary + score + + + + Cognitive-task-effect + Used with base schema Increasing/Decreasing. + + suggestedTag + Property-not-possible-to-determine + Finding-stopped-by + Finding-unmodified + Finding-triggered-by + + + inLibrary + score + + + + Other-modulators-effect-EEG + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Facilitating-factor + Facilitating factors are defined as transient and sporadic endogenous or exogenous elements capable of augmenting seizure incidence (increasing the likelihood of seizure occurrence). + + inLibrary + score + + + Facilitating-factor-alcohol + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Facilitating-factor-awake + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Facilitating-factor-catamenial + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Facilitating-factor-fever + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Facilitating-factor-sleep + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Facilitating-factor-sleep-deprived + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Facilitating-factor-other + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Provocative-factor + Provocative factors are defined as transient and sporadic endogenous or exogenous elements capable of evoking/triggering seizures immediately following the exposure to it. + + requireChild + + + inLibrary + score + + + Hyperventilation-provoked + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Reflex-provoked + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Medication-effect-clinical + Medications clinical effect. Used with base schema Increasing/Decreasing. + + suggestedTag + Finding-stopped-by + Finding-unmodified + + + inLibrary + score + + + + Medication-reduction-effect-clinical + Medications reduction or withdrawal clinical effect. Used with base schema Increasing/Decreasing. + + suggestedTag + Finding-stopped-by + Finding-unmodified + + + inLibrary + score + + + + Other-modulators-effect-clinical + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Intermittent-photic-stimulation-effect + + requireChild + + + inLibrary + score + + + Posterior-stimulus-dependent-intermittent-photic-stimulation-response + + suggestedTag + Finding-frequency + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Posterior-stimulus-independent-intermittent-photic-stimulation-response-limited + limited to the stimulus-train + + suggestedTag + Finding-frequency + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Posterior-stimulus-independent-intermittent-photic-stimulation-response-self-sustained + + suggestedTag + Finding-frequency + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Generalized-photoparoxysmal-intermittent-photic-stimulation-response-limited + Limited to the stimulus-train. + + suggestedTag + Finding-frequency + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Generalized-photoparoxysmal-intermittent-photic-stimulation-response-self-sustained + + suggestedTag + Finding-frequency + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Activation-of-pre-existing-epileptogenic-area-intermittent-photic-stimulation-effect + + suggestedTag + Finding-frequency + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Unmodified-intermittent-photic-stimulation-effect + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Quality-of-hyperventilation + + requireChild + + + inLibrary + score + + + Hyperventilation-refused-procedure + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Hyperventilation-poor-effort + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Hyperventilation-good-effort + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Hyperventilation-excellent-effort + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Modulators-effect + Tags for describing the influence of the modulators + + requireChild + + + inLibrary + score + + + Modulators-effect-continuous-during-NRS + Continuous during non-rapid-eye-movement-sleep (NRS) + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Modulators-effect-only-during + + inLibrary + score + + + # + Only during Sleep/Awakening/Hyperventilation/Physical effort/Cognitive task. Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Modulators-effect-change-of-patterns + Change of patterns during sleep/awakening. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + + Time-related-property + Important to estimate how often an interictal abnormality is seen in the recording. + + requireChild + + + inLibrary + score + + + Appearance-mode + Describes how the non-ictal EEG pattern/graphoelement is distributed through the recording. + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + inLibrary + score + + + Random-appearance-mode + Occurrence of the non-ictal EEG pattern / graphoelement without any rhythmicity / periodicity. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Periodic-appearance-mode + Non-ictal EEG pattern / graphoelement occurring at an approximately regular rate / interval (generally of 1 to several seconds). + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Variable-appearance-mode + Occurrence of non-ictal EEG pattern / graphoelements, that is sometimes rhythmic or periodic, other times random, throughout the recording. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Intermittent-appearance-mode + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Continuous-appearance-mode + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Discharge-pattern + Describes the organization of the EEG signal within the discharge (distinguish between single and repetitive discharges) + + requireChild + + + inLibrary + score + + + Single-discharge-pattern + Applies to the intra-burst pattern: a graphoelement that is not repetitive; before and after the graphoelement one can distinguish the background activity. + + suggestedTag + Finding-incidence + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Rhythmic-trains-or-bursts-discharge-pattern + Applies to the intra-burst pattern: a non-ictal graphoelement that repeats itself without returning to the background activity between them. The graphoelements within this repetition occur at approximately constant period. + + suggestedTag + Finding-prevalence + Finding-frequency + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Arrhythmic-trains-or-bursts-discharge-pattern + Applies to the intra-burst pattern: a non-ictal graphoelement that repeats itself without returning to the background activity between them. The graphoelements within this repetition occur at inconstant period. + + suggestedTag + Finding-prevalence + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Fragmented-discharge-pattern + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Periodic-discharge-time-related-features + Periodic discharges not further specified (PDs) time-relayed features tags. + + requireChild + + + inLibrary + score + + + Periodic-discharge-duration + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + inLibrary + score + + + Very-brief-periodic-discharge-duration + Less than 10 sec. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Brief-periodic-discharge-duration + 10 to 59 sec. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Intermediate-periodic-discharge-duration + 1 to 4.9 min. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Long-periodic-discharge-duration + 5 to 59 min. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Very-long-periodic-discharge-duration + Greater than 1 hour. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Periodic-discharge-onset + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + inLibrary + score + + + Sudden-periodic-discharge-onset + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Gradual-periodic-discharge-onset + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Periodic-discharge-dynamics + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + inLibrary + score + + + Evolving-periodic-discharge-dynamics + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Fluctuating-periodic-discharge-dynamics + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Static-periodic-discharge-dynamics + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + + Finding-extent + Percentage of occurrence during the recording (background activity and interictal finding). + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + inLibrary + score + + + + + Finding-incidence + How often it occurs/time-epoch. + + requireChild + + + inLibrary + score + + + Only-once-finding-incidence + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Rare-finding-incidence + less than 1/h + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Uncommon-finding-incidence + 1/5 min to 1/h. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Occasional-finding-incidence + 1/min to 1/5min. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Frequent-finding-incidence + 1/10 s to 1/min. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Abundant-finding-incidence + Greater than 1/10 s). + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Finding-prevalence + The percentage of the recording covered by the train/burst. + + requireChild + + + inLibrary + score + + + Rare-finding-prevalence + Less than 1 percent. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Occasional-finding-prevalence + 1 to 9 percent. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Frequent-finding-prevalence + 10 to 49 percent. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Abundant-finding-prevalence + 50 to 89 percent. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Continuous-finding-prevalence + Greater than 90 percent. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + + Posterior-dominant-rhythm-property + Posterior dominant rhythm is the most often scored EEG feature in clinical practice. Therefore, there are specific terms that can be chosen for characterizing the PDR. + + requireChild + + + inLibrary + score + + + Posterior-dominant-rhythm-amplitude-range + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + inLibrary + score + + + Low-posterior-dominant-rhythm-amplitude-range + Low (less than 20 microV). + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Medium-posterior-dominant-rhythm-amplitude-range + Medium (between 20 and 70 microV). + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + High-posterior-dominant-rhythm-amplitude-range + High (more than 70 microV). + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Posterior-dominant-rhythm-frequency-asymmetry + When symmetrical could be labeled with base schema Symmetrical tag. + + requireChild + + + inLibrary + score + + + Posterior-dominant-rhythm-frequency-asymmetry-lower-left + Hz lower on the left side. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Posterior-dominant-rhythm-frequency-asymmetry-lower-right + Hz lower on the right side. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Posterior-dominant-rhythm-eye-opening-reactivity + Change (disappearance or measurable decrease in amplitude) of a posterior dominant rhythm following eye-opening. Eye closure has the opposite effect. + + suggestedTag + Property-not-possible-to-determine + + + inLibrary + score + + + Posterior-dominant-rhythm-eye-opening-reactivity-reduced-left + Reduced left side reactivity. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Posterior-dominant-rhythm-eye-opening-reactivity-reduced-right + Reduced right side reactivity. + + inLibrary + score + + + # + free text + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Posterior-dominant-rhythm-eye-opening-reactivity-reduced-both + Reduced reactivity on both sides. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Posterior-dominant-rhythm-organization + When normal could be labeled with base schema Normal tag. + + requireChild + + + inLibrary + score + + + Posterior-dominant-rhythm-organization-poorly-organized + Poorly organized. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Posterior-dominant-rhythm-organization-disorganized + Disorganized. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Posterior-dominant-rhythm-organization-markedly-disorganized + Markedly disorganized. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Posterior-dominant-rhythm-caveat + Caveat to the annotation of PDR. + + requireChild + + + inLibrary + score + + + No-posterior-dominant-rhythm-caveat + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Posterior-dominant-rhythm-caveat-only-open-eyes-during-the-recording + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Posterior-dominant-rhythm-caveat-sleep-deprived-caveat + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Posterior-dominant-rhythm-caveat-drowsy + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Posterior-dominant-rhythm-caveat-only-following-hyperventilation + + inLibrary + score + + + + + Absence-of-posterior-dominant-rhythm + Reason for absence of PDR. + + requireChild + + + inLibrary + score + + + Absence-of-posterior-dominant-rhythm-artifacts + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Absence-of-posterior-dominant-rhythm-extreme-low-voltage + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Absence-of-posterior-dominant-rhythm-eye-closure-could-not-be-achieved + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Absence-of-posterior-dominant-rhythm-lack-of-awake-period + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Absence-of-posterior-dominant-rhythm-lack-of-compliance + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Absence-of-posterior-dominant-rhythm-other-causes + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + + Episode-property + + requireChild + + + inLibrary + score + + + Seizure-classification + Seizure classification refers to the grouping of seizures based on their clinical features, EEG patterns, and other characteristics. Epileptic seizures are named using the current ILAE seizure classification (Fisher et al., 2017, Beniczky et al., 2017). + + requireChild + + + inLibrary + score + + + Motor-seizure + Involves musculature in any form. The motor event could consist of an increase (positive) or decrease (negative) in muscle contraction to produce a movement. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + inLibrary + score + + + + Motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + inLibrary + score + + + Myoclonic-motor-seizure + Sudden, brief ( lower than 100 msec) involuntary single or multiple contraction(s) of muscles(s) or muscle groups of variable topography (axial, proximal limb, distal). Myoclonus is less regularly repetitive and less sustained than is clonus. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + inLibrary + score + + + + Myoclonic-motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + inLibrary + score + + + + Negative-myoclonic-motor-seizure + + inLibrary + score + + + + Negative-myoclonic-motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + inLibrary + score + + + + Clonic-motor-seizure + Jerking, either symmetric or asymmetric, that is regularly repetitive and involves the same muscle groups. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + inLibrary + score + + + + Clonic-motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + inLibrary + score + + + + Tonic-motor-seizure + A sustained increase in muscle contraction lasting a few seconds to minutes. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + inLibrary + score + + + + Tonic-motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + inLibrary + score + + + + Atonic-motor-seizure + Sudden loss or diminution of muscle tone without apparent preceding myoclonic or tonic event lasting about 1 to 2 s, involving head, trunk, jaw, or limb musculature. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + inLibrary + score + + + + Atonic-motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + inLibrary + score + + + + Myoclonic-atonic-motor-seizure + A generalized seizure type with a myoclonic jerk leading to an atonic motor component. This type was previously called myoclonic astatic. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + inLibrary + score + + + + Myoclonic-atonic-motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + inLibrary + score + + + + Myoclonic-tonic-clonic-motor-seizure + One or a few jerks of limbs bilaterally, followed by a tonic clonic seizure. The initial jerks can be considered to be either a brief period of clonus or myoclonus. Seizures with this characteristic are common in juvenile myoclonic epilepsy. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + inLibrary + score + + + + Myoclonic-tonic-clonic-motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + inLibrary + score + + + + Tonic-clonic-motor-seizure + A sequence consisting of a tonic followed by a clonic phase. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + inLibrary + score + + + + Tonic-clonic-motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + inLibrary + score + + + + Automatism-motor-seizure + A more or less coordinated motor activity usually occurring when cognition is impaired and for which the subject is usually (but not always) amnesic afterward. This often resembles a voluntary movement and may consist of an inappropriate continuation of preictal motor activity. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + inLibrary + score + + + + Automatism-motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + inLibrary + score + + + + Hyperkinetic-motor-seizure + + inLibrary + score + + + + Hyperkinetic-motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + inLibrary + score + + + + Epileptic-spasm-episode + A sudden flexion, extension, or mixed extension flexion of predominantly proximal and truncal muscles that is usually more sustained than a myoclonic movement but not as sustained as a tonic seizure. Limited forms may occur: Grimacing, head nodding, or subtle eye movements. Epileptic spasms frequently occur in clusters. Infantile spasms are the best known form, but spasms can occur at all ages. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + inLibrary + score + + + + + Nonmotor-seizure + Focal or generalized seizure types in which motor activity is not prominent. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + inLibrary + score + + + Behavior-arrest-nonmotor-seizure + Arrest (pause) of activities, freezing, immobilization, as in behavior arrest seizure. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + inLibrary + score + + + + Sensory-nonmotor-seizure + A perceptual experience not caused by appropriate stimuli in the external world. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + inLibrary + score + + + + Emotional-nonmotor-seizure + Seizures presenting with an emotion or the appearance of having an emotion as an early prominent feature, such as fear, spontaneous joy or euphoria, laughing (gelastic), or crying (dacrystic). Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + inLibrary + score + + + + Cognitive-nonmotor-seizure + Pertaining to thinking and higher cortical functions, such as language, spatial perception, memory, and praxis. The previous term for similar usage as a seizure type was psychic. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + inLibrary + score + + + + Autonomic-nonmotor-seizure + A distinct alteration of autonomic nervous system function involving cardiovascular, pupillary, gastrointestinal, sudomotor, vasomotor, and thermoregulatory functions. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + inLibrary + score + + + + + Absence-seizure + Absence seizures present with a sudden cessation of activity and awareness. Absence seizures tend to occur in younger age groups, have more sudden start and termination, and they usually display less complex automatisms than do focal seizures with impaired awareness, but the distinctions are not absolute. EEG information may be required for accurate classification. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + inLibrary + score + + + Typical-absence-seizure + A sudden onset, interruption of ongoing activities, a blank stare, possibly a brief upward deviation of the eyes. Usually the patient will be unresponsive when spoken to. Duration is a few seconds to half a minute with very rapid recovery. Although not always available, an EEG would show generalized epileptiform discharges during the event. An absence seizure is by definition a seizure of generalized onset. The word is not synonymous with a blank stare, which also can be encountered with focal onset seizures. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + inLibrary + score + + + + Atypical-absence-seizure + An absence seizure with changes in tone that are more pronounced than in typical absence or the onset and/or cessation is not abrupt, often associated with slow, irregular, generalized spike-wave activity. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + inLibrary + score + + + + Myoclonic-absence-seizure + A myoclonic absence seizure refers to an absence seizure with rhythmic three-per-second myoclonic movements, causing ratcheting abduction of the upper limbs leading to progressive arm elevation, and associated with three-per-second generalized spike-wave discharges. Duration is typically 10 to 60 s. Impairment of consciousness may not be obvious. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + inLibrary + score + + + + Eyelid-myoclonia-absence-seizure + Eyelid myoclonia are myoclonic jerks of the eyelids and upward deviation of the eyes, often precipitated by closing the eyes or by light. Eyelid myoclonia can be associated with absences, but also can be motor seizures without a corresponding absence, making them difficult to categorize. The 2017 classification groups them with nonmotor (absence) seizures, which may seem counterintuitive, but the myoclonia in this instance is meant to link with absence, rather than with nonmotor. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + inLibrary + score + + + + + + Episode-phase + The electroclinical findings (i.e., the seizure semiology and the ictal EEG) are divided in three phases: onset, propagation, and postictal. + + requireChild + + + suggestedTag + Seizure-semiology-manifestation + Postictal-semiology-manifestation + Ictal-EEG-patterns + + + inLibrary + score + + + Episode-phase-initial + + inLibrary + score + + + + Episode-phase-subsequent + + inLibrary + score + + + + Episode-phase-postictal + + inLibrary + score + + + + + Seizure-semiology-manifestation + Seizure semiology refers to the clinical features or signs that are observed during a seizure, such as the type of movements or behaviors exhibited by the person having the seizure, the duration of the seizure, the level of consciousness, and any associated symptoms such as aura or postictal confusion. In other words, seizure semiology describes the physical manifestations of a seizure. Semiology is described according to the ILAE Glossary of Descriptive Terminology for Ictal Semiology (Blume et al., 2001). Besides the name, the semiologic finding can also be characterized by the somatotopic modifier, laterality, body part and centricity. Uses Location-property tags. + + requireChild + + + inLibrary + score + + + Semiology-motor-manifestation + + inLibrary + score + + + Semiology-elementary-motor + + inLibrary + score + + + Semiology-motor-tonic + A sustained increase in muscle contraction lasting a few seconds to minutes. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-dystonic + Sustained contractions of both agonist and antagonist muscles producing athetoid or twisting movements, which, when prolonged, may produce abnormal postures. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-epileptic-spasm + A sudden flexion, extension, or mixed extension flexion of predominantly proximal and truncal muscles that is usually more sustained than a myoclonic movement but not so sustained as a tonic seizure (i.e., about 1 s). Limited forms may occur: grimacing, head nodding. Frequent occurrence in clusters. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-postural + Adoption of a posture that may be bilaterally symmetric or asymmetric (as in a fencing posture). + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-versive + A sustained, forced conjugate ocular, cephalic, and/or truncal rotation or lateral deviation from the midline. + + suggestedTag + Body-part-location + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-clonic + Myoclonus that is regularly repetitive, involves the same muscle groups, at a frequency of about 2 to 3 c/s, and is prolonged. Synonym: rhythmic myoclonus . + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-myoclonic + Characterized by myoclonus. MYOCLONUS : sudden, brief (lower than 100 ms) involuntary single or multiple contraction(s) of muscles(s) or muscle groups of variable topography (axial, proximal limb, distal). + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-jacksonian-march + Term indicating spread of clonic movements through contiguous body parts unilaterally. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-negative-myoclonus + Characterized by negative myoclonus. NEGATIVE MYOCLONUS: interruption of tonic muscular activity for lower than 500 ms without evidence of preceding myoclonia. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-tonic-clonic + A sequence consisting of a tonic followed by a clonic phase. Variants such as clonic-tonic-clonic may be seen. Asymmetry of limb posture during the tonic phase of a GTC: one arm is rigidly extended at the elbow (often with the fist clenched tightly and flexed at the wrist), whereas the opposite arm is flexed at the elbow. + + requireChild + + + inLibrary + score + + + Semiology-motor-tonic-clonic-without-figure-of-four + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-tonic-clonic-with-figure-of-four-extension-left-elbow + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-tonic-clonic-with-figure-of-four-extension-right-elbow + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + inLibrary + score + + + + + Semiology-motor-astatic + Loss of erect posture that results from an atonic, myoclonic, or tonic mechanism. Synonym: drop attack. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-atonic + Sudden loss or diminution of muscle tone without apparent preceding myoclonic or tonic event lasting greater or equal to 1 to 2 s, involving head, trunk, jaw, or limb musculature. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-eye-blinking + + suggestedTag + Brain-laterality + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-other-elementary-motor + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Semiology-motor-automatisms + + inLibrary + score + + + Semiology-motor-automatisms-mimetic + Facial expression suggesting an emotional state, often fear. + + suggestedTag + Episode-responsiveness + Episode-appearance + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-automatisms-oroalimentary + Lip smacking, lip pursing, chewing, licking, tooth grinding, or swallowing. + + suggestedTag + Episode-responsiveness + Episode-appearance + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-automatisms-dacrystic + Bursts of crying. + + suggestedTag + Episode-responsiveness + Episode-appearance + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-automatisms-dyspraxic + Inability to perform learned movements spontaneously or on command or imitation despite intact relevant motor and sensory systems and adequate comprehension and cooperation. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-responsiveness + Episode-appearance + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-automatisms-manual + 1. Indicates principally distal components, bilateral or unilateral. 2. Fumbling, tapping, manipulating movements. + + suggestedTag + Brain-laterality + Brain-centricity + Episode-responsiveness + Episode-appearance + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-automatisms-gestural + Semipurposive, asynchronous hand movements. Often unilateral. + + suggestedTag + Brain-laterality + Episode-responsiveness + Episode-appearance + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-automatisms-pedal + 1. Indicates principally distal components, bilateral or unilateral. 2. Fumbling, tapping, manipulating movements. + + suggestedTag + Brain-laterality + Brain-centricity + Episode-responsiveness + Episode-appearance + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-automatisms-hypermotor + 1. Involves predominantly proximal limb or axial muscles producing irregular sequential ballistic movements, such as pedaling, pelvic thrusting, thrashing, rocking movements. 2. Increase in rate of ongoing movements or inappropriately rapid performance of a movement. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-responsiveness + Episode-appearance + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-automatisms-hypokinetic + A decrease in amplitude and/or rate or arrest of ongoing motor activity. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-responsiveness + Episode-appearance + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-automatisms-gelastic + Bursts of laughter or giggling, usually without an appropriate affective tone. + + suggestedTag + Episode-responsiveness + Episode-appearance + Episode-event-count + + + inLibrary + score + + + + Semiology-motor-other-automatisms + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Semiology-motor-behavioral-arrest + Interruption of ongoing motor activity or of ongoing behaviors with fixed gaze, without movement of the head or trunk (oro-alimentary and hand automatisms may continue). + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + inLibrary + score + + + + + Semiology-non-motor-manifestation + + inLibrary + score + + + Semiology-sensory + + inLibrary + score + + + Semiology-sensory-headache + Headache occurring in close temporal proximity to the seizure or as the sole seizure manifestation. + + suggestedTag + Brain-laterality + Episode-event-count + + + inLibrary + score + + + + Semiology-sensory-visual + Flashing or flickering lights, spots, simple patterns, scotomata, or amaurosis. + + suggestedTag + Brain-laterality + Episode-event-count + + + inLibrary + score + + + + Semiology-sensory-auditory + Buzzing, drumming sounds or single tones. + + suggestedTag + Brain-laterality + Episode-event-count + + + inLibrary + score + + + + Semiology-sensory-olfactory + + suggestedTag + Body-part-location + Episode-event-count + + + inLibrary + score + + + + Semiology-sensory-gustatory + Taste sensations including acidic, bitter, salty, sweet, or metallic. + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Semiology-sensory-epigastric + Abdominal discomfort including nausea, emptiness, tightness, churning, butterflies, malaise, pain, and hunger; sensation may rise to chest or throat. Some phenomena may reflect ictal autonomic dysfunction. + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Semiology-sensory-somatosensory + Tingling, numbness, electric-shock sensation, sense of movement or desire to move. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + inLibrary + score + + + + Semiology-sensory-painful + Peripheral (lateralized/bilateral), cephalic, abdominal. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + inLibrary + score + + + + Semiology-sensory-autonomic-sensation + A sensation consistent with involvement of the autonomic nervous system, including cardiovascular, gastrointestinal, sudomotor, vasomotor, and thermoregulatory functions. (Thus autonomic aura; cf. autonomic events 3.0). + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Semiology-sensory-other + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Semiology-experiential + + inLibrary + score + + + Semiology-experiential-affective-emotional + Components include fear, depression, joy, and (rarely) anger. + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Semiology-experiential-hallucinatory + Composite perceptions without corresponding external stimuli involving visual, auditory, somatosensory, olfactory, and/or gustatory phenomena. Example: hearing and seeing people talking. + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Semiology-experiential-illusory + An alteration of actual percepts involving the visual, auditory, somatosensory, olfactory, or gustatory systems. + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Semiology-experiential-mnemonic + Components that reflect ictal dysmnesia such as feelings of familiarity (deja-vu) and unfamiliarity (jamais-vu). + + inLibrary + score + + + Semiology-experiential-mnemonic-Deja-vu + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Semiology-experiential-mnemonic-Jamais-vu + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + + Semiology-experiential-other + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Semiology-dyscognitive + The term describes events in which (1) disturbance of cognition is the predominant or most apparent feature, and (2a) two or more of the following components are involved, or (2b) involvement of such components remains undetermined. Otherwise, use the more specific term (e.g., mnemonic experiential seizure or hallucinatory experiential seizure). Components of cognition: ++ perception: symbolic conception of sensory information ++ attention: appropriate selection of a principal perception or task ++ emotion: appropriate affective significance of a perception ++ memory: ability to store and retrieve percepts or concepts ++ executive function: anticipation, selection, monitoring of consequences, and initiation of motor activity including praxis, speech. + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Semiology-language-related + + inLibrary + score + + + Semiology-language-related-vocalization + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Semiology-language-related-verbalization + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Semiology-language-related-dysphasia + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Semiology-language-related-aphasia + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Semiology-language-related-other + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Semiology-autonomic + + inLibrary + score + + + Semiology-autonomic-pupillary + Mydriasis, miosis (either bilateral or unilateral). + + suggestedTag + Brain-laterality + Episode-event-count + + + inLibrary + score + + + + Semiology-autonomic-hypersalivation + Increase in production of saliva leading to uncontrollable drooling + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Semiology-autonomic-respiratory-apnoeic + subjective shortness of breath, hyperventilation, stridor, coughing, choking, apnea, oxygen desaturation, neurogenic pulmonary edema. + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Semiology-autonomic-cardiovascular + Modifications of heart rate (tachycardia, bradycardia), cardiac arrhythmias (such as sinus arrhythmia, sinus arrest, supraventricular tachycardia, atrial premature depolarizations, ventricular premature depolarizations, atrio-ventricular block, bundle branch block, atrioventricular nodal escape rhythm, asystole). + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Semiology-autonomic-gastrointestinal + Nausea, eructation, vomiting, retching, abdominal sensations, abdominal pain, flatulence, spitting, diarrhea. + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Semiology-autonomic-urinary-incontinence + urinary urge (intense urinary urge at the beginning of seizures), urinary incontinence, ictal urination (rare symptom of partial seizures without loss of consciousness). + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Semiology-autonomic-genital + Sexual auras (erotic thoughts and feelings, sexual arousal and orgasm). Genital auras (unpleasant, sometimes painful, frightening or emotionally neutral somatosensory sensations in the genitals that can be accompanied by ictal orgasm). Sexual automatisms (hypermotor movements consisting of writhing, thrusting, rhythmic movements of the pelvis, arms and legs, sometimes associated with picking and rhythmic manipulation of the groin or genitalia, exhibitionism and masturbation). + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Semiology-autonomic-vasomotor + Flushing or pallor (may be accompanied by feelings of warmth, cold and pain). + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Semiology-autonomic-sudomotor + Sweating and piloerection (may be accompanied by feelings of warmth, cold and pain). + + suggestedTag + Brain-laterality + Episode-event-count + + + inLibrary + score + + + + Semiology-autonomic-thermoregulatory + Hyperthermia, fever. + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Semiology-autonomic-other + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + + Semiology-manifestation-other + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Postictal-semiology-manifestation + + requireChild + + + inLibrary + score + + + Postictal-semiology-unconscious + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Postictal-semiology-quick-recovery-of-consciousness + Quick recovery of awareness and responsiveness. + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Postictal-semiology-aphasia-or-dysphasia + Impaired communication involving language without dysfunction of relevant primary motor or sensory pathways, manifested as impaired comprehension, anomia, parahasic errors or a combination of these. + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Postictal-semiology-behavioral-change + Occurring immediately after a aseizure. Including psychosis, hypomanina, obsessive-compulsive behavior. + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Postictal-semiology-hemianopia + Postictal visual loss in a a hemi field. + + suggestedTag + Brain-laterality + Episode-event-count + + + inLibrary + score + + + + Postictal-semiology-impaired-cognition + Decreased Cognitive performance involving one or more of perception, attention, emotion, memory, execution, praxis, speech. + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Postictal-semiology-dysphoria + Depression, irritability, euphoric mood, fear, anxiety. + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Postictal-semiology-headache + Headache with features of tension-type or migraine headache that develops within 3 h following the seizure and resolves within 72 h after seizure. + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Postictal-semiology-nose-wiping + Noes-wiping usually within 60 sec of seizure offset, usually with the hand ipsilateral to the seizure onset. + + suggestedTag + Brain-laterality + Episode-event-count + + + inLibrary + score + + + + Postictal-semiology-anterograde-amnesia + Impaired ability to remember new material. + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Postictal-semiology-retrograde-amnesia + Impaired ability to recall previously remember material. + + suggestedTag + Episode-event-count + + + inLibrary + score + + + + Postictal-semiology-paresis + Todds palsy. Any unilateral postictal dysfunction relating to motor, language, sensory and/or integrative functions. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + inLibrary + score + + + + Postictal-semiology-sleep + Invincible need to sleep after a seizure. + + inLibrary + score + + + + Postictal-semiology-unilateral-myoclonic-jerks + unilateral motor phenomena, other then specified, occurring in postictal phase. + + inLibrary + score + + + + Postictal-semiology-other-unilateral-motor-phenomena + + requireChild + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Polygraphic-channel-relation-to-episode + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + inLibrary + score + + + Polygraphic-channel-cause-to-episode + + inLibrary + score + + + + Polygraphic-channel-consequence-of-episode + + inLibrary + score + + + + + Ictal-EEG-patterns + + inLibrary + score + + + Ictal-EEG-patterns-obscured-by-artifacts + The interpretation of the EEG is not possible due to artifacts. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Ictal-EEG-activity + + suggestedTag + Polyspikes-morphology + Fast-spike-activity-morphology + Low-voltage-fast-activity-morphology + Polysharp-waves-morphology + Spike-and-slow-wave-morphology + Polyspike-and-slow-wave-morphology + Sharp-and-slow-wave-morphology + Rhythmic-activity-morphology + Slow-wave-large-amplitude-morphology + Irregular-delta-or-theta-activity-morphology + Electrodecremental-change-morphology + DC-shift-morphology + Disappearance-of-ongoing-activity-morphology + Brain-laterality + Brain-region + Sensors + Source-analysis-laterality + Source-analysis-brain-region + Episode-event-count + + + inLibrary + score + + + + Postictal-EEG-activity + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + + + inLibrary + score + + + + + Episode-time-context-property + Additional clinically relevant features related to episodes can be scored under timing and context. If needed, episode duration can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Temporal-value/Duration. + + inLibrary + score + + + Episode-consciousness + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + inLibrary + score + + + Episode-consciousness-not-tested + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Episode-consciousness-affected + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Episode-consciousness-mildly-affected + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Episode-consciousness-not-affected + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Episode-awareness + + suggestedTag + Property-not-possible-to-determine + Property-exists + Property-absence + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Clinical-EEG-temporal-relationship + + suggestedTag + Property-not-possible-to-determine + + + inLibrary + score + + + Clinical-start-followed-EEG + Clinical start, followed by EEG start by X seconds. + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + inLibrary + score + + + + + EEG-start-followed-clinical + EEG start, followed by clinical start by X seconds. + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + inLibrary + score + + + + + Simultaneous-start-clinical-EEG + + inLibrary + score + + + + Clinical-EEG-temporal-relationship-notes + Clinical notes to annotate the clinical-EEG temporal relationship. + + inLibrary + score + + + # + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Episode-event-count + Number of stereotypical episodes during the recording. + + suggestedTag + Property-not-possible-to-determine + + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + inLibrary + score + + + + + State-episode-start + State at the start of the episode. + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + inLibrary + score + + + Episode-start-from-sleep + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Episode-start-from-awake + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Episode-postictal-phase + + suggestedTag + Property-not-possible-to-determine + + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + inLibrary + score + + + + + Episode-prodrome + Prodrome is a preictal phenomenon, and it is defined as a subjective or objective clinical alteration (e.g., ill-localized sensation or agitation) that heralds the onset of an epileptic seizure but does not form part of it (Blume et al., 2001). Therefore, prodrome should be distinguished from aura (which is an ictal phenomenon). + + suggestedTag + Property-exists + Property-absence + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Episode-tongue-biting + + suggestedTag + Property-exists + Property-absence + + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Episode-responsiveness + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + inLibrary + score + + + Episode-responsiveness-preserved + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Episode-responsiveness-affected + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Episode-appearance + + requireChild + + + inLibrary + score + + + Episode-appearance-interactive + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Episode-appearance-spontaneous + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Seizure-dynamics + Spatiotemporal dynamics can be scored (evolution in morphology; evolution in frequency; evolution in location). + + requireChild + + + inLibrary + score + + + Seizure-dynamics-evolution-morphology + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Seizure-dynamics-evolution-frequency + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Seizure-dynamics-evolution-location + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Seizure-dynamics-not-possible-to-determine + Not possible to determine. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + + + Other-finding-property + + requireChild + + + inLibrary + score + + + Artifact-significance-to-recording + It is important to score the significance of the described artifacts: recording is not interpretable, recording of reduced diagnostic value, does not interfere with the interpretation of the recording. + + requireChild + + + inLibrary + score + + + Recording-not-interpretable-due-to-artifact + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Recording-of-reduced-diagnostic-value-due-to-artifact + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Artifact-does-not-interfere-recording + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Finding-significance-to-recording + Significance of finding. When normal/abnormal could be labeled with base schema Normal/Abnormal tags. + + requireChild + + + inLibrary + score + + + Finding-no-definite-abnormality + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Finding-significance-not-possible-to-determine + Not possible to determine. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Finding-frequency + Value in Hz (number) typed in. + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + inLibrary + score + + + + + Finding-amplitude + Value in microvolts (number) typed in. + + inLibrary + score + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + electricPotentialUnits + + + inLibrary + score + + + + + Finding-amplitude-asymmetry + For posterior dominant rhythm: a difference in amplitude between the homologous area on opposite sides of the head that consistently exceeds 50 percent. When symmetrical could be labeled with base schema Symmetrical tag. For sleep: Absence or consistently marked amplitude asymmetry (greater than 50 percent) of a normal sleep graphoelement. + + requireChild + + + inLibrary + score + + + Finding-amplitude-asymmetry-lower-left + Amplitude lower on the left side. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Finding-amplitude-asymmetry-lower-right + Amplitude lower on the right side. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Finding-amplitude-asymmetry-not-possible-to-determine + Not possible to determine. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + Finding-stopped-by + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Finding-triggered-by + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Finding-unmodified + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Property-not-possible-to-determine + Not possible to determine. + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Property-exists + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + Property-absence + + inLibrary + score + + + # + Free text. + + takesValue + + + valueClass + textClass + + + inLibrary + score + + + + + + + Event + Something that happens at a given time and (typically) place. Elements of this tag subtree designate the general category in which an event falls. + + suggestedTag + Task-property + + + Sensory-event + Something perceivable by the participant. An event meant to be an experimental stimulus should include the tag Task-property/Task-event-role/Experimental-stimulus. + + suggestedTag + Task-event-role + Sensory-presentation + + + + Agent-action + Any action engaged in by an agent (see the Agent subtree for agent categories). A participant response to an experiment stimulus should include the tag Agent-property/Agent-task-role/Experiment-participant. + + suggestedTag + Task-event-role + Agent + + + + Data-feature + An event marking the occurrence of a data feature such as an interictal spike or alpha burst that is often added post hoc to the data record. + + suggestedTag + Data-property + + + + Experiment-control + An event pertaining to the physical control of the experiment during its operation. + + + Experiment-procedure + An event indicating an experimental procedure, as in performing a saliva swab during the experiment or administering a survey. + + + Experiment-structure + An event specifying a change-point of the structure of experiment. This event is typically used to indicate a change in experimental conditions or tasks. + + + Measurement-event + A discrete measure returned by an instrument. + + suggestedTag + Data-property + + + + + Agent + Someone or something that takes an active role or produces a specified effect.The role or effect may be implicit. Being alive or performing an activity such as a computation may qualify something to be an agent. An agent may also be something that simulates something else. + + suggestedTag + Agent-property + + + Animal-agent + An agent that is an animal. + + + Avatar-agent + An agent associated with an icon or avatar representing another agent. + + + Controller-agent + An agent experiment control software or hardware. + + + Human-agent + A person who takes an active role or produces a specified effect. + + + Robotic-agent + An agent mechanical device capable of performing a variety of often complex tasks on command or by being programmed in advance. + + + Software-agent + An agent computer program. + + + + Action + Do something. + + extensionAllowed + + + Communicate + Convey knowledge of or information about something. + + Communicate-gesturally + Communicate nonverbally using visible bodily actions, either in place of speech or together and in parallel with spoken words. Gestures include movement of the hands, face, or other parts of the body. + + relatedTag + Move-face + Move-upper-extremity + + + Clap-hands + Strike the palms of against one another resoundingly, and usually repeatedly, especially to express approval. + + + Clear-throat + Cough slightly so as to speak more clearly, attract attention, or to express hesitancy before saying something awkward. + + relatedTag + Move-face + Move-head + + + + Frown + Express disapproval, displeasure, or concentration, typically by turning down the corners of the mouth. + + relatedTag + Move-face + + + + Grimace + Make a twisted expression, typically expressing disgust, pain, or wry amusement. + + relatedTag + Move-face + + + + Nod-head + Tilt head in alternating up and down arcs along the sagittal plane. It is most commonly, but not universally, used to indicate agreement, acceptance, or acknowledgement. + + relatedTag + Move-head + + + + Pump-fist + Raise with fist clenched in triumph or affirmation. + + relatedTag + Move-upper-extremity + + + + Raise-eyebrows + Move eyebrows upward. + + relatedTag + Move-face + Move-eyes + + + + Shake-fist + Clench hand into a fist and shake to demonstrate anger. + + relatedTag + Move-upper-extremity + + + + Shake-head + Turn head from side to side as a way of showing disagreement or refusal. + + relatedTag + Move-head + + + + Shhh + Place finger over lips and possibly uttering the syllable shhh to indicate the need to be quiet. + + relatedTag + Move-upper-extremity + + + + Shrug + Lift shoulders up towards head to indicate a lack of knowledge about a particular topic. + + relatedTag + Move-upper-extremity + Move-torso + + + + Smile + Form facial features into a pleased, kind, or amused expression, typically with the corners of the mouth turned up and the front teeth exposed. + + relatedTag + Move-face + + + + Spread-hands + Spread hands apart to indicate ignorance. + + relatedTag + Move-upper-extremity + + + + Thumb-up + Extend the thumb upward to indicate approval. + + relatedTag + Move-upper-extremity + + + + Thumbs-down + Extend the thumb downward to indicate disapproval. + + relatedTag + Move-upper-extremity + + + + Wave + Raise hand and move left and right, as a greeting or sign of departure. + + relatedTag + Move-upper-extremity + + + + Widen-eyes + Open eyes and possibly with eyebrows lifted especially to express surprise or fear. + + relatedTag + Move-face + Move-eyes + + + + Wink + Close and open one eye quickly, typically to indicate that something is a joke or a secret or as a signal of affection or greeting. + + relatedTag + Move-face + Move-eyes + + + + + Communicate-musically + Communicate using music. + + Hum + Make a low, steady continuous sound like that of a bee. Sing with the lips closed and without uttering speech. + + + Play-instrument + Make musical sounds using an instrument. + + + Sing + Produce musical tones by means of the voice. + + + Vocalize + Utter vocal sounds. + + + Whistle + Produce a shrill clear sound by forcing breath out or air in through the puckered lips. + + + + Communicate-vocally + Communicate using mouth or vocal cords. + + Cry + Shed tears associated with emotions, usually sadness but also joy or frustration. + + + Groan + Make a deep inarticulate sound in response to pain or despair. + + + Laugh + Make the spontaneous sounds and movements of the face and body that are the instinctive expressions of lively amusement and sometimes also of contempt or derision. + + + Scream + Make loud, vociferous cries or yells to express pain, excitement, or fear. + + + Shout + Say something very loudly. + + + Sigh + Emit a long, deep, audible breath expressing sadness, relief, tiredness, or a similar feeling. + + + Speak + Communicate using spoken language. + + + Whisper + Speak very softly using breath without vocal cords. + + + + + Move + Move in a specified direction or manner. Change position or posture. + + Breathe + Inhale or exhale during respiration. + + Blow + Expel air through pursed lips. + + + Cough + Suddenly and audibly expel air from the lungs through a partially closed glottis, preceded by inhalation. + + + Exhale + Blow out or expel breath. + + + Hiccup + Involuntarily spasm the diaphragm and respiratory organs, with a sudden closure of the glottis and a characteristic sound like that of a cough. + + + Hold-breath + Interrupt normal breathing by ceasing to inhale or exhale. + + + Inhale + Draw in with the breath through the nose or mouth. + + + Sneeze + Suddenly and violently expel breath through the nose and mouth. + + + Sniff + Draw in air audibly through the nose to detect a smell, to stop it from running, or to express contempt. + + + + Move-body + Move entire body. + + Bend + Move body in a bowed or curved manner. + + + Dance + Perform a purposefully selected sequences of human movement often with aesthetic or symbolic value. Move rhythmically to music, typically following a set sequence of steps. + + + Fall-down + Lose balance and collapse. + + + Flex + Cause a muscle to stand out by contracting or tensing it. Bend a limb or joint. + + + Jerk + Make a quick, sharp, sudden movement. + + + Lie-down + Move to a horizontal or resting position. + + + Recover-balance + Return to a stable, upright body position. + + + Shudder + Tremble convulsively, sometimes as a result of fear or revulsion. + + + Sit-down + Move from a standing to a sitting position. + + + Sit-up + Move from lying down to a sitting position. + + + Stand-up + Move from a sitting to a standing position. + + + Stretch + Straighten or extend body or a part of body to its full length, typically so as to tighten muscles or in order to reach something. + + + Stumble + Trip or momentarily lose balance and almost fall. + + + Turn + Change or cause to change direction. + + + + Move-body-part + Move one part of a body. + + Move-eyes + Move eyes. + + Blink + Shut and open the eyes quickly. + + + Close-eyes + Lower and keep eyelids in a closed position. + + + Fixate + Direct eyes to a specific point or target. + + + Inhibit-blinks + Purposely prevent blinking. + + + Open-eyes + Raise eyelids to expose pupil. + + + Saccade + Move eyes rapidly between fixation points. + + + Squint + Squeeze one or both eyes partly closed in an attempt to see more clearly or as a reaction to strong light. + + + Stare + Look fixedly or vacantly at someone or something with eyes wide open. + + + + Move-face + Move the face or jaw. + + Bite + Seize with teeth or jaws an object or organism so as to grip or break the surface covering. + + + Burp + Noisily release air from the stomach through the mouth. Belch. + + + Chew + Repeatedly grinding, tearing, and or crushing with teeth or jaws. + + + Gurgle + Make a hollow bubbling sound like that made by water running out of a bottle. + + + Swallow + Cause or allow something, especially food or drink to pass down the throat. + + Gulp + Swallow quickly or in large mouthfuls, often audibly, sometimes to indicate apprehension. + + + + Yawn + Take a deep involuntary inhalation with the mouth open often as a sign of drowsiness or boredom. + + + + Move-head + Move head. + + Lift-head + Tilt head back lifting chin. + + + Lower-head + Move head downward so that eyes are in a lower position. + + + Turn-head + Rotate head horizontally to look in a different direction. + + + + Move-lower-extremity + Move leg and/or foot. + + Curl-toes + Bend toes sometimes to grip. + + + Hop + Jump on one foot. + + + Jog + Run at a trot to exercise. + + + Jump + Move off the ground or other surface through sudden muscular effort in the legs. + + + Kick + Strike out or flail with the foot or feet. Strike using the leg, in unison usually with an area of the knee or lower using the foot. + + + Pedal + Move by working the pedals of a bicycle or other machine. + + + Press-foot + Move by pressing foot. + + + Run + Travel on foot at a fast pace. + + + Step + Put one leg in front of the other and shift weight onto it. + + Heel-strike + Strike the ground with the heel during a step. + + + Toe-off + Push with toe as part of a stride. + + + + Trot + Run at a moderate pace, typically with short steps. + + + Walk + Move at a regular pace by lifting and setting down each foot in turn never having both feet off the ground at once. + + + + Move-torso + Move body trunk. + + + Move-upper-extremity + Move arm, shoulder, and/or hand. + + Drop + Let or cause to fall vertically. + + + Grab + Seize suddenly or quickly. Snatch or clutch. + + + Grasp + Seize and hold firmly. + + + Hold-down + Prevent someone or something from moving by holding them firmly. + + + Lift + Raising something to higher position. + + + Make-fist + Close hand tightly with the fingers bent against the palm. + + + Point + Draw attention to something by extending a finger or arm. + + + Press + Apply pressure to something to flatten, shape, smooth or depress it. This action tag should be used to indicate key presses and mouse clicks. + + relatedTag + Push + + + + Push + Apply force in order to move something away. Use Press to indicate a key press or mouse click. + + relatedTag + Press + + + + Reach + Stretch out your arm in order to get or touch something. + + + Release + Make available or set free. + + + Retract + Draw or pull back. + + + Scratch + Drag claws or nails over a surface or on skin. + + + Snap-fingers + Make a noise by pushing second finger hard against thumb and then releasing it suddenly so that it hits the base of the thumb. + + + Touch + Come into or be in contact with. + + + + + + Perceive + Produce an internal, conscious image through stimulating a sensory system. + + Hear + Give attention to a sound. + + + See + Direct gaze toward someone or something or in a specified direction. + + + Sense-by-touch + Sense something through receptors in the skin. + + + Smell + Inhale in order to ascertain an odor or scent. + + + Taste + Sense a flavor in the mouth and throat on contact with a substance. + + + + Perform + Carry out or accomplish an action, task, or function. + + Close + Act as to blocked against entry or passage. + + + Collide-with + Hit with force when moving. + + + Halt + Bring or come to an abrupt stop. + + + Modify + Change something. + + + Open + Widen an aperture, door, or gap, especially one allowing access to something. + + + Operate + Control the functioning of a machine, process, or system. + + + Play + Engage in activity for enjoyment and recreation rather than a serious or practical purpose. + + + Read + Interpret something that is written or printed. + + + Repeat + Make do or perform again. + + + Rest + Be inactive in order to regain strength, health, or energy. + + + Write + Communicate or express by means of letters or symbols written or imprinted on a surface. + + + + Think + Direct the mind toward someone or something or use the mind actively to form connected ideas. + + Allow + Allow access to something such as allowing a car to pass. + + + Attend-to + Focus mental experience on specific targets. + + + Count + Tally items either silently or aloud. + + + Deny + Refuse to give or grant something requested or desired by someone. + + + Detect + Discover or identify the presence or existence of something. + + + Discriminate + Recognize a distinction. + + + Encode + Convert information or an instruction into a particular form. + + + Evade + Escape or avoid, especially by cleverness or trickery. + + + Generate + Cause something, especially an emotion or situation to arise or come about. + + + Identify + Establish or indicate who or what someone or something is. + + + Imagine + Form a mental image or concept of something. + + + Judge + Evaluate evidence to make a decision or form a belief. + + + Learn + Adaptively change behavior as the result of experience. + + + Memorize + Adaptively change behavior as the result of experience. + + + Plan + Think about the activities required to achieve a desired goal. + + + Predict + Say or estimate that something will happen or will be a consequence of something without having exact informaton. + + + Recall + Remember information by mental effort. + + + Recognize + Identify someone or something from having encountered them before. + + + Respond + React to something such as a treatment or a stimulus. + + + Switch-attention + Transfer attention from one focus to another. + + + Track + Follow a person, animal, or object through space or time. + + + + + Item + An independently existing thing (living or nonliving). + + extensionAllowed + + + Biological-item + An entity that is biological, that is related to living organisms. + + Anatomical-item + A biological structure, system, fluid or other substance excluding single molecular entities. + + Body + The biological structure representing an organism. + + + Body-part + Any part of an organism. + + Head + The upper part of the human body, or the front or upper part of the body of an animal, typically separated from the rest of the body by a neck, and containing the brain, mouth, and sense organs. + + Ear + A sense organ needed for the detection of sound and for establishing balance. + + + Face + The anterior portion of the head extending from the forehead to the chin and ear to ear. The facial structures contain the eyes, nose and mouth, cheeks and jaws. + + Cheek + The fleshy part of the face bounded by the eyes, nose, ear, and jaw line. + + + Chin + The part of the face below the lower lip and including the protruding part of the lower jaw. + + + Eye + The organ of sight or vision. + + + Eyebrow + The arched strip of hair on the bony ridge above each eye socket. + + + Forehead + The part of the face between the eyebrows and the normal hairline. + + + Lip + Fleshy fold which surrounds the opening of the mouth. + + + Mouth + The proximal portion of the digestive tract, containing the oral cavity and bounded by the oral opening. + + + Nose + A structure of special sense serving as an organ of the sense of smell and as an entrance to the respiratory tract. + + + Teeth + The hard bonelike structures in the jaws. A collection of teeth arranged in some pattern in the mouth or other part of the body. + + + + Hair + The filamentous outgrowth of the epidermis. + + + + Lower-extremity + Refers to the whole inferior limb (leg and/or foot). + + Ankle + A gliding joint between the distal ends of the tibia and fibula and the proximal end of the talus. + + + Calf + The fleshy part at the back of the leg below the knee. + + + Foot + The structure found below the ankle joint required for locomotion. + + Big-toe + The largest toe on the inner side of the foot. + + + Heel + The back of the foot below the ankle. + + + Instep + The part of the foot between the ball and the heel on the inner side. + + + Little-toe + The smallest toe located on the outer side of the foot. + + + Toes + The terminal digits of the foot. + + + + Knee + A joint connecting the lower part of the femur with the upper part of the tibia. + + + Shin + Front part of the leg below the knee. + + + Thigh + Upper part of the leg between hip and knee. + + + + Torso + The body excluding the head and neck and limbs. + + Buttocks + The round fleshy parts that form the lower rear area of a human trunk. + + + Gentalia + The external organs of reproduction. + + deprecatedFrom + 8.1.0 + + + + Hip + The lateral prominence of the pelvis from the waist to the thigh. + + + Torso-back + The rear surface of the human body from the shoulders to the hips. + + + Torso-chest + The anterior side of the thorax from the neck to the abdomen. + + + Waist + The abdominal circumference at the navel. + + + + Upper-extremity + Refers to the whole superior limb (shoulder, arm, elbow, wrist, hand). + + Elbow + A type of hinge joint located between the forearm and upper arm. + + + Forearm + Lower part of the arm between the elbow and wrist. + + + Hand + The distal portion of the upper extremity. It consists of the carpus, metacarpus, and digits. + + Finger + Any of the digits of the hand. + + Index-finger + The second finger from the radial side of the hand, next to the thumb. + + + Little-finger + The fifth and smallest finger from the radial side of the hand. + + + Middle-finger + The middle or third finger from the radial side of the hand. + + + Ring-finger + The fourth finger from the radial side of the hand. + + + Thumb + The thick and short hand digit which is next to the index finger in humans. + + + + Knuckles + A part of a finger at a joint where the bone is near the surface, especially where the finger joins the hand. + + + Palm + The part of the inner surface of the hand that extends from the wrist to the bases of the fingers. + + + + Shoulder + Joint attaching upper arm to trunk. + + + Upper-arm + Portion of arm between shoulder and elbow. + + + Wrist + A joint between the distal end of the radius and the proximal row of carpal bones. + + + + + + Organism + A living entity, more specifically a biological entity that consists of one or more cells and is capable of genomic replication (independently or not). + + Animal + A living organism that has membranous cell walls, requires oxygen and organic foods, and is capable of voluntary movement. + + + Human + The bipedal primate mammal Homo sapiens. + + + Plant + Any living organism that typically synthesizes its food from inorganic substances and possesses cellulose cell walls. + + + + + Language-item + An entity related to a systematic means of communicating by the use of sounds, symbols, or gestures. + + suggestedTag + Sensory-presentation + + + Character + A mark or symbol used in writing. + + + Clause + A unit of grammatical organization next below the sentence in rank, usually consisting of a subject and predicate. + + + Glyph + A hieroglyphic character, symbol, or pictograph. + + + Nonword + A group of letters or speech sounds that looks or sounds like a word but that is not accepted as such by native speakers. + + + Paragraph + A distinct section of a piece of writing, usually dealing with a single theme. + + + Phoneme + A speech sound that is distinguished by the speakers of a particular language. + + + Phrase + A phrase is a group of words functioning as a single unit in the syntax of a sentence. + + + Sentence + A set of words that is complete in itself, conveying a statement, question, exclamation, or command and typically containing an explicit or implied subject and a predicate containing a finite verb. + + + Syllable + A unit of spoken language larger than a phoneme. + + + Textblock + A block of text. + + + Word + A word is the smallest free form (an item that may be expressed in isolation with semantic or pragmatic content) in a language. + + + + Object + Something perceptible by one or more of the senses, especially by vision or touch. A material thing. + + suggestedTag + Sensory-presentation + + + Geometric-object + An object or a representation that has structure and topology in space. + + 2D-shape + A planar, two-dimensional shape. + + Arrow + A shape with a pointed end indicating direction. + + + Clockface + The dial face of a clock. A location identifier based on clockface numbering or anatomic subregion. + + + Cross + A figure or mark formed by two intersecting lines crossing at their midpoints. + + + Dash + A horizontal stroke in writing or printing to mark a pause or break in sense or to represent omitted letters or words. + + + Ellipse + A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base. + + Circle + A ring-shaped structure with every point equidistant from the center. + + + + Rectangle + A parallelogram with four right angles. + + Square + A square is a special rectangle with four equal sides. + + + + Single-point + A point is a geometric entity that is located in a zero-dimensional spatial region and whose position is defined by its coordinates in some coordinate system. + + + Star + A conventional or stylized representation of a star, typically one having five or more points. + + + Triangle + A three-sided polygon. + + + + 3D-shape + A geometric three-dimensional shape. + + Box + A square or rectangular vessel, usually made of cardboard or plastic. + + Cube + A solid or semi-solid in the shape of a three dimensional square. + + + + Cone + A shape whose base is a circle and whose sides taper up to a point. + + + Cylinder + A surface formed by circles of a given radius that are contained in a plane perpendicular to a given axis, whose centers align on the axis. + + + Ellipsoid + A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base. + + Sphere + A solid or hollow three-dimensional object bounded by a closed surface such that every point on the surface is equidistant from the center. + + + + Pyramid + A polyhedron of which one face is a polygon of any number of sides, and the other faces are triangles with a common vertex. + + + + Pattern + An arrangement of objects, facts, behaviors, or other things which have scientific, mathematical, geometric, statistical, or other meaning. + + Dots + A small round mark or spot. + + + LED-pattern + A pattern created by lighting selected members of a fixed light emitting diode array. + + + + + Ingestible-object + Something that can be taken into the body by the mouth for digestion or absorption. + + + Man-made-object + Something constructed by human means. + + Building + A structure that has a roof and walls and stands more or less permanently in one place. + + Attic + A room or a space immediately below the roof of a building. + + + Basement + The part of a building that is wholly or partly below ground level. + + + Entrance + The means or place of entry. + + + Roof + A roof is the covering on the uppermost part of a building which provides protection from animals and weather, notably rain, but also heat, wind and sunlight. + + + Room + An area within a building enclosed by walls and floor and ceiling. + + + + Clothing + A covering designed to be worn on the body. + + + Device + An object contrived for a specific purpose. + + Assistive-device + A device that help an individual accomplish a task. + + Glasses + Frames with lenses worn in front of the eye for vision correction, eye protection, or protection from UV rays. + + + Writing-device + A device used for writing. + + Pen + A common writing instrument used to apply ink to a surface for writing or drawing. + + + Pencil + An implement for writing or drawing that is constructed of a narrow solid pigment core in a protective casing that prevents the core from being broken or marking the hand. + + + + + Computing-device + An electronic device which take inputs and processes results from the inputs. + + Cellphone + A telephone with access to a cellular radio system so it can be used over a wide area, without a physical connection to a network. + + + Desktop-computer + A computer suitable for use at an ordinary desk. + + + Laptop-computer + A computer that is portable and suitable for use while traveling. + + + Tablet-computer + A small portable computer that accepts input directly on to its screen rather than via a keyboard or mouse. + + + + Engine + A motor is a machine designed to convert one or more forms of energy into mechanical energy. + + + IO-device + Hardware used by a human (or other system) to communicate with a computer. + + Input-device + A piece of equipment used to provide data and control signals to an information processing system such as a computer or information appliance. + + Computer-mouse + A hand-held pointing device that detects two-dimensional motion relative to a surface. + + Mouse-button + An electric switch on a computer mouse which can be pressed or clicked to select or interact with an element of a graphical user interface. + + + Scroll-wheel + A scroll wheel or mouse wheel is a wheel used for scrolling made of hard plastic with a rubbery surface usually located between the left and right mouse buttons and is positioned perpendicular to the mouse surface. + + + + Joystick + A control device that uses a movable handle to create two-axis input for a computer device. + + + Keyboard + A device consisting of mechanical keys that are pressed to create input to a computer. + + Keyboard-key + A button on a keyboard usually representing letters, numbers, functions, or symbols. + + # + Value of a keyboard key. + + takesValue + + + + + + Keypad + A device consisting of keys, usually in a block arrangement, that provides limited input to a system. + + Keypad-key + A key on a separate section of a computer keyboard that groups together numeric keys and those for mathematical or other special functions in an arrangement like that of a calculator. + + # + Value of keypad key. + + takesValue + + + + + + Microphone + A device designed to convert sound to an electrical signal. + + + Push-button + A switch designed to be operated by pressing a button. + + + + Output-device + Any piece of computer hardware equipment which converts information into human understandable form. + + Auditory-device + A device designed to produce sound. + + Headphones + An instrument that consists of a pair of small loudspeakers, or less commonly a single speaker, held close to ears and connected to a signal source such as an audio amplifier, radio, CD player or portable media player. + + + Loudspeaker + A device designed to convert electrical signals to sounds that can be heard. + + + + Display-device + An output device for presentation of information in visual or tactile form the latter used for example in tactile electronic displays for blind people. + + Computer-screen + An electronic device designed as a display or a physical device designed to be a protective meshwork. + + Screen-window + A part of a computer screen that contains a display different from the rest of the screen. A window is a graphical control element consisting of a visual area containing some of the graphical user interface of the program it belongs to and is framed by a window decoration. + + + + Head-mounted-display + An instrument that functions as a display device, worn on the head or as part of a helmet, that has a small display optic in front of one (monocular HMD) or each eye (binocular HMD). + + + LED-display + A LED display is a flat panel display that uses an array of light-emitting diodes as pixels for a video display. + + + + + Recording-device + A device that copies information in a signal into a persistent information bearer. + + EEG-recorder + A device for recording electric currents in the brain using electrodes applied to the scalp, to the surface of the brain, or placed within the substance of the brain. + + + File-storage + A device for recording digital information to a permanent media. + + + MEG-recorder + A device for measuring the magnetic fields produced by electrical activity in the brain, usually conducted externally. + + + Motion-capture + A device for recording the movement of objects or people. + + + Tape-recorder + A device for recording and reproduction usually using magnetic tape for storage that can be saved and played back. + + + + Touchscreen + A control component that operates an electronic device by pressing the display on the screen. + + + + Machine + A human-made device that uses power to apply forces and control movement to perform an action. + + + Measurement-device + A device in which a measure function inheres. + + Clock + A device designed to indicate the time of day or to measure the time duration of an event or action. + + Clock-face + A location identifier based on clockface numbering or anatomic subregion. + + + + + Robot + A mechanical device that sometimes resembles a living animal and is capable of performing a variety of often complex human tasks on command or by being programmed in advance. + + + Tool + A component that is not part of a device but is designed to support its assemby or operation. + + + + Document + A physical object, or electronic counterpart, that is characterized by containing writing which is meant to be human-readable. + + Book + A volume made up of pages fastened along one edge and enclosed between protective covers. + + + Letter + A written message addressed to a person or organization. + + + Note + A brief written record. + + + Notebook + A book for notes or memoranda. + + + Questionnaire + A document consisting of questions and possibly responses, depending on whether it has been filled out. + + + + Furnishing + Furniture, fittings, and other decorative accessories, such as curtains and carpets, for a house or room. + + + Manufactured-material + Substances created or extracted from raw materials. + + Ceramic + A hard, brittle, heat-resistant and corrosion-resistant material made by shaping and then firing a nonmetallic mineral, such as clay, at a high temperature. + + + Glass + A brittle transparent solid with irregular atomic structure. + + + Paper + A thin sheet material produced by mechanically or chemically processing cellulose fibres derived from wood, rags, grasses or other vegetable sources in water. + + + Plastic + Various high-molecular-weight thermoplastic or thermosetting polymers that are capable of being molded, extruded, drawn, or otherwise shaped and then hardened into a form. + + + Steel + An alloy made up of iron with typically a few tenths of a percent of carbon to improve its strength and fracture resistance compared to iron. + + + + Media + Media are audo/visual/audiovisual modes of communicating information for mass consumption. + + Media-clip + A short segment of media. + + Audio-clip + A short segment of audio. + + + Audiovisual-clip + A short media segment containing both audio and video. + + + Video-clip + A short segment of video. + + + + Visualization + An planned process that creates images, diagrams or animations from the input data. + + Animation + A form of graphical illustration that changes with time to give a sense of motion or represent dynamic changes in the portrayal. + + + Art-installation + A large-scale, mixed-media constructions, often designed for a specific place or for a temporary period of time. + + + Braille + A display using a system of raised dots that can be read with the fingers by people who are blind. + + + Image + Any record of an imaging event whether physical or electronic. + + Cartoon + A type of illustration, sometimes animated, typically in a non-realistic or semi-realistic style. The specific meaning has evolved over time, but the modern usage usually refers to either an image or series of images intended for satire, caricature, or humor. A motion picture that relies on a sequence of illustrations for its animation. + + + Drawing + A representation of an object or outlining a figure, plan, or sketch by means of lines. + + + Icon + A sign (such as a word or graphic symbol) whose form suggests its meaning. + + + Painting + A work produced through the art of painting. + + + Photograph + An image recorded by a camera. + + + + Movie + A sequence of images displayed in succession giving the illusion of continuous movement. + + + Outline-visualization + A visualization consisting of a line or set of lines enclosing or indicating the shape of an object in a sketch or diagram. + + + Point-light-visualization + A display in which action is depicted using a few points of light, often generated from discrete sensors in motion capture. + + + Sculpture + A two- or three-dimensional representative or abstract forms, especially by carving stone or wood or by casting metal or plaster. + + + Stick-figure-visualization + A drawing showing the head of a human being or animal as a circle and all other parts as straight lines. + + + + + Navigational-object + An object whose purpose is to assist directed movement from one location to another. + + Path + A trodden way. A way or track laid down for walking or made by continual treading. + + + Road + An open way for the passage of vehicles, persons, or animals on land. + + Lane + A defined path with physical dimensions through which an object or substance may traverse. + + + + Runway + A paved strip of ground on a landing field for the landing and takeoff of aircraft. + + + + Vehicle + A mobile machine which transports people or cargo. + + Aircraft + A vehicle which is able to travel through air in an atmosphere. + + + Bicycle + A human-powered, pedal-driven, single-track vehicle, having two wheels attached to a frame, one behind the other. + + + Boat + A watercraft of any size which is able to float or plane on water. + + + Car + A wheeled motor vehicle used primarily for the transportation of human passengers. + + + Cart + A cart is a vehicle which has two wheels and is designed to transport human passengers or cargo. + + + Tractor + A mobile machine specifically designed to deliver a high tractive effort at slow speeds, and mainly used for the purposes of hauling a trailer or machinery used in agriculture or construction. + + + Train + A connected line of railroad cars with or without a locomotive. + + + Truck + A motor vehicle which, as its primary funcion, transports cargo rather than human passangers. + + + + + Natural-object + Something that exists in or is produced by nature, and is not artificial or man-made. + + Mineral + A solid, homogeneous, inorganic substance occurring in nature and having a definite chemical composition. + + + Natural-feature + A feature that occurs in nature. A prominent or identifiable aspect, region, or site of interest. + + Field + An unbroken expanse as of ice or grassland. + + + Hill + A rounded elevation of limited extent rising above the surrounding land with local relief of less than 300m. + + + Mountain + A landform that extends above the surrounding terrain in a limited area. + + + River + A natural freshwater surface stream of considerable volume and a permanent or seasonal flow, moving in a definite channel toward a sea, lake, or another river. + + + Waterfall + A sudden descent of water over a step or ledge in the bed of a river. + + + + + + Sound + Mechanical vibrations transmitted by an elastic medium. Something that can be heard. + + Environmental-sound + Sounds occuring in the environment. An accumulation of noise pollution that occurs outside. This noise can be caused by transport, industrial, and recreational activities. + + Crowd-sound + Noise produced by a mixture of sounds from a large group of people. + + + Signal-noise + Any part of a signal that is not the true or original signal but is introduced by the communication mechanism. + + + + Musical-sound + Sound produced by continuous and regular vibrations, as opposed to noise. + + Instrument-sound + Sound produced by a musical instrument. + + + Tone + A musical note, warble, or other sound used as a particular signal on a telephone or answering machine. + + + Vocalized-sound + Musical sound produced by vocal cords in a biological agent. + + + + Named-animal-sound + A sound recognizable as being associated with particular animals. + + Barking + Sharp explosive cries like sounds made by certain animals, especially a dog, fox, or seal. + + + Bleating + Wavering cries like sounds made by a sheep, goat, or calf. + + + Chirping + Short, sharp, high-pitched noises like sounds made by small birds or an insects. + + + Crowing + Loud shrill sounds characteristic of roosters. + + + Growling + Low guttural sounds like those that made in the throat by a hostile dog or other animal. + + + Meowing + Vocalizations like those made by as those cats. These sounds have diverse tones and are sometimes chattered, murmured or whispered. The purpose can be assertive. + + + Mooing + Deep vocal sounds like those made by a cow. + + + Purring + Low continuous vibratory sound such as those made by cats. The sound expresses contentment. + + + Roaring + Loud, deep, or harsh prolonged sounds such as those made by big cats and bears for long-distance communication and intimidation. + + + Squawking + Loud, harsh noises such as those made by geese. + + + + Named-object-sound + A sound identifiable as coming from a particular type of object. + + Alarm-sound + A loud signal often loud continuous ringing to alert people to a problem or condition that requires urgent attention. + + + Beep + A short, single tone, that is typically high-pitched and generally made by a computer or other machine. + + + Buzz + A persistent vibratory sound often made by a buzzer device and used to indicate something incorrect. + + + Click + The sound made by a mechanical cash register, often to designate a reward. + + + Ding + A short ringing sound such as that made by a bell, often to indicate a correct response or the expiration of time. + + + Horn-blow + A loud sound made by forcing air through a sound device that funnels air to create the sound, often used to sound an alert. + + + Ka-ching + The sound made by a mechanical cash register, often to designate a reward. + + + Siren + A loud, continuous sound often varying in frequency designed to indicate an emergency. + + + + + + Property + Something that pertains to a thing. A characteristic of some entity. A quality or feature regarded as a characteristic or inherent part of someone or something. HED attributes are adjectives or adverbs. + + extensionAllowed + + + Agent-property + Something that pertains to an agent. + + extensionAllowed + + + Agent-state + The state of the agent. + + Agent-cognitive-state + The state of the cognitive processes or state of mind of the agent. + + Alert + Condition of heightened watchfulness or preparation for action. + + + Anesthetized + Having lost sensation to pain or having senses dulled due to the effects of an anesthetic. + + + Asleep + Having entered a periodic, readily reversible state of reduced awareness and metabolic activity, usually accompanied by physical relaxation and brain activity. + + + Attentive + Concentrating and focusing mental energy on the task or surroundings. + + + Awake + In a non sleeping state. + + + Brain-dead + Characterized by the irreversible absence of cortical and brain stem functioning. + + + Comatose + In a state of profound unconsciousness associated with markedly depressed cerebral activity. + + + Distracted + Lacking in concentration because of being preoccupied. + + + Drowsy + In a state of near-sleep, a strong desire for sleep, or sleeping for unusually long periods. + + + Intoxicated + In a state with disturbed psychophysiological functions and responses as a result of administration or ingestion of a psychoactive substance. + + + Locked-in + In a state of complete paralysis of all voluntary muscles except for the ones that control the movements of the eyes. + + + Passive + Not responding or initiating an action in response to a stimulus. + + + Resting + A state in which the agent is not exhibiting any physical exertion. + + + Vegetative + A state of wakefulness and conscience, but (in contrast to coma) with involuntary opening of the eyes and movements (such as teeth grinding, yawning, or thrashing of the extremities). + + + + Agent-emotional-state + The status of the general temperament and outlook of an agent. + + Angry + Experiencing emotions characterized by marked annoyance or hostility. + + + Aroused + In a state reactive to stimuli leading to increased heart rate and blood pressure, sensory alertness, mobility and readiness to respond. + + + Awed + Filled with wonder. Feeling grand, sublime or powerful emotions characterized by a combination of joy, fear, admiration, reverence, and/or respect. + + + Compassionate + Feeling or showing sympathy and concern for others often evoked for a person who is in distress and associated with altruistic motivation. + + + Content + Feeling satisfaction with things as they are. + + + Disgusted + Feeling revulsion or profound disapproval aroused by something unpleasant or offensive. + + + Emotionally-neutral + Feeling neither satisfied nor dissatisfied. + + + Empathetic + Understanding and sharing the feelings of another. Being aware of, being sensitive to, and vicariously experiencing the feelings, thoughts, and experience of another. + + + Excited + Feeling great enthusiasm and eagerness. + + + Fearful + Feeling apprehension that one may be in danger. + + + Frustrated + Feeling annoyed as a result of being blocked, thwarted, disappointed or defeated. + + + Grieving + Feeling sorrow in response to loss, whether physical or abstract. + + + Happy + Feeling pleased and content. + + + Jealous + Feeling threatened by a rival in a relationship with another individual, in particular an intimate partner, usually involves feelings of threat, fear, suspicion, distrust, anxiety, anger, betrayal, and rejection. + + + Joyful + Feeling delight or intense happiness. + + + Loving + Feeling a strong positive emotion of affection and attraction. + + + Relieved + No longer feeling pain, distress, anxiety, or reassured. + + + Sad + Feeling grief or unhappiness. + + + Stressed + Experiencing mental or emotional strain or tension. + + + + Agent-physiological-state + Having to do with the mechanical, physical, or biochemical function of an agent. + + Healthy + Having no significant health-related issues. + + relatedTag + Sick + + + + Hungry + Being in a state of craving or desiring food. + + relatedTag + Sated + Thirsty + + + + Rested + Feeling refreshed and relaxed. + + relatedTag + Tired + + + + Sated + Feeling full. + + relatedTag + Hungry + + + + Sick + Being in a state of ill health, bodily malfunction, or discomfort. + + relatedTag + Healthy + + + + Thirsty + Feeling a need to drink. + + relatedTag + Hungry + + + + Tired + Feeling in need of sleep or rest. + + relatedTag + Rested + + + + + Agent-postural-state + Pertaining to the position in which agent holds their body. + + Crouching + Adopting a position where the knees are bent and the upper body is brought forward and down, sometimes to avoid detection or to defend oneself. + + + Eyes-closed + Keeping eyes closed with no blinking. + + + Eyes-open + Keeping eyes open with occasional blinking. + + + Kneeling + Positioned where one or both knees are on the ground. + + + On-treadmill + Ambulation on an exercise apparatus with an endless moving belt to support moving in place. + + + Prone + Positioned in a recumbent body position whereby the person lies on its stomach and faces downward. + + + Seated-with-chin-rest + Using a device that supports the chin and head. + + + Sitting + In a seated position. + + + Standing + Assuming or maintaining an erect upright position. + + + + + Agent-task-role + The function or part that is ascribed to an agent in performing the task. + + Experiment-actor + An agent who plays a predetermined role to create the experiment scenario. + + + Experiment-controller + An agent exerting control over some aspect of the experiment. + + + Experiment-participant + Someone who takes part in an activity related to an experiment. + + + Experimenter + Person who is the owner of the experiment and has its responsibility. + + + + Agent-trait + A genetically, environmentally, or socially determined characteristic of an agent. + + Age + Length of time elapsed time since birth of the agent. + + # + + takesValue + + + valueClass + numericClass + + + + + Agent-experience-level + Amount of skill or knowledge that the agent has as pertains to the task. + + Expert-level + Having comprehensive and authoritative knowledge of or skill in a particular area related to the task. + + relatedTag + Intermediate-experience-level + Novice-level + + + + Intermediate-experience-level + Having a moderate amount of knowledge or skill related to the task. + + relatedTag + Expert-level + Novice-level + + + + Novice-level + Being inexperienced in a field or situation related to the task. + + relatedTag + Expert-level + Intermediate-experience-level + + + + + Ethnicity + Belong to a social group that has a common national or cultural tradition. Use with Label to avoid extension. + + + Gender + Characteristics that are socially constructed, including norms, behaviors, and roles based on sex. + + + Handedness + Individual preference for use of a hand, known as the dominant hand. + + Ambidextrous + Having no overall dominance in the use of right or left hand or foot in the performance of tasks that require one hand or foot. + + + Left-handed + Preference for using the left hand or foot for tasks requiring the use of a single hand or foot. + + + Right-handed + Preference for using the right hand or foot for tasks requiring the use of a single hand or foot. + + + + Race + Belonging to a group sharing physical or social qualities as defined within a specified society. Use with Label to avoid extension. + + + Sex + Physical properties or qualities by which male is distinguished from female. + + Female + Biological sex of an individual with female sexual organs such ova. + + + Intersex + Having genitalia and/or secondary sexual characteristics of indeterminate sex. + + + Male + Biological sex of an individual with male sexual organs producing sperm. + + + + + + Data-property + Something that pertains to data or information. + + extensionAllowed + + + Data-marker + An indicator placed to mark something. + + Data-break-marker + An indicator place to indicate a gap in the data. + + + Temporal-marker + An indicator placed at a particular time in the data. + + Inset + Marks an intermediate point in an ongoing event of temporal extent. + + topLevelTagGroup + + + reserved + + + relatedTag + Onset + Offset + + + + Offset + Marks the end of an event of temporal extent. + + topLevelTagGroup + + + reserved + + + relatedTag + Onset + Inset + + + + Onset + Marks the start of an ongoing event of temporal extent. + + topLevelTagGroup + + + reserved + + + relatedTag + Inset + Offset + + + + Pause + Indicates the temporary interruption of the operation a process and subsequently wait for a signal to continue. + + + Time-out + A cancellation or cessation that automatically occurs when a predefined interval of time has passed without a certain event occurring. + + + Time-sync + A synchronization signal whose purpose to help synchronize different signals or processes. Often used to indicate a marker inserted into the recorded data to allow post hoc synchronization of concurrently recorded data streams. + + + + + Data-resolution + Smallest change in a quality being measured by an sensor that causes a perceptible change. + + Printer-resolution + Resolution of a printer, usually expressed as the number of dots-per-inch for a printer. + + # + + takesValue + + + valueClass + numericClass + + + + + Screen-resolution + Resolution of a screen, usually expressed as the of pixels in a dimension for a digital display device. + + # + + takesValue + + + valueClass + numericClass + + + + + Sensory-resolution + Resolution of measurements by a sensing device. + + # + + takesValue + + + valueClass + numericClass + + + + + Spatial-resolution + Linear spacing of a spatial measurement. + + # + + takesValue + + + valueClass + numericClass + + + + + Spectral-resolution + Measures the ability of a sensor to resolve features in the electromagnetic spectrum. + + # + + takesValue + + + valueClass + numericClass + + + + + Temporal-resolution + Measures the ability of a sensor to resolve features in time. + + # + + takesValue + + + valueClass + numericClass + + + + + + Data-source-type + The type of place, person, or thing from which the data comes or can be obtained. + + Computed-feature + A feature computed from the data by a tool. This tag should be grouped with a label of the form Toolname_propertyName. + + + Computed-prediction + A computed extrapolation of known data. + + + Expert-annotation + An explanatory or critical comment or other in-context information provided by an authority. + + + Instrument-measurement + Information obtained from a device that is used to measure material properties or make other observations. + + + Observation + Active acquisition of information from a primary source. Should be grouped with a label of the form AgentID_featureName. + + + + Data-value + Designation of the type of a data item. + + Categorical-value + Indicates that something can take on a limited and usually fixed number of possible values. + + Categorical-class-value + Categorical values that fall into discrete classes such as true or false. The grouping is absolute in the sense that it is the same for all participants. + + All + To a complete degree or to the full or entire extent. + + relatedTag + Some + None + + + + Correct + Free from error. Especially conforming to fact or truth. + + relatedTag + Wrong + + + + Explicit + Stated clearly and in detail, leaving no room for confusion or doubt. + + relatedTag + Implicit + + + + False + Not in accordance with facts, reality or definitive criteria. + + relatedTag + True + + + + Implicit + Implied though not plainly expressed. + + relatedTag + Explicit + + + + Invalid + Not allowed or not conforming to the correct format or specifications. + + relatedTag + Valid + + + + None + No person or thing, nobody, not any. + + relatedTag + All + Some + + + + Some + At least a small amount or number of, but not a large amount of, or often. + + relatedTag + All + None + + + + True + Conforming to facts, reality or definitive criteria. + + relatedTag + False + + + + Valid + Allowable, usable, or acceptable. + + relatedTag + Invalid + + + + Wrong + Inaccurate or not correct. + + relatedTag + Correct + + + + + Categorical-judgment-value + Categorical values that are based on the judgment or perception of the participant such familiar and famous. + + Abnormal + Deviating in any way from the state, position, structure, condition, behavior, or rule which is considered a norm. + + relatedTag + Normal + + + + Asymmetrical + Lacking symmetry or having parts that fail to correspond to one another in shape, size, or arrangement. + + relatedTag + Symmetrical + + + + Audible + A sound that can be perceived by the participant. + + relatedTag + Inaudible + + + + Complex + Hard, involved or complicated, elaborate, having many parts. + + relatedTag + Simple + + + + Congruent + Concordance of multiple evidence lines. In agreement or harmony. + + relatedTag + Incongruent + + + + Constrained + Keeping something within particular limits or bounds. + + relatedTag + Unconstrained + + + + Disordered + Not neatly arranged. Confused and untidy. A structural quality in which the parts of an object are non-rigid. + + relatedTag + Ordered + + + + Familiar + Recognized, familiar, or within the scope of knowledge. + + relatedTag + Unfamiliar + Famous + + + + Famous + A person who has a high degree of recognition by the general population for his or her success or accomplishments. A famous person. + + relatedTag + Familiar + Unfamiliar + + + + Inaudible + A sound below the threshold of perception of the participant. + + relatedTag + Audible + + + + Incongruent + Not in agreement or harmony. + + relatedTag + Congruent + + + + Involuntary + An action that is not made by choice. In the body, involuntary actions (such as blushing) occur automatically, and cannot be controlled by choice. + + relatedTag + Voluntary + + + + Masked + Information exists but is not provided or is partially obscured due to security, privacy, or other concerns. + + relatedTag + Unmasked + + + + Normal + Being approximately average or within certain limits. Conforming with or constituting a norm or standard or level or type or social norm. + + relatedTag + Abnormal + + + + Ordered + Conforming to a logical or comprehensible arrangement of separate elements. + + relatedTag + Disordered + + + + Simple + Easily understood or presenting no difficulties. + + relatedTag + Complex + + + + Symmetrical + Made up of exactly similar parts facing each other or around an axis. Showing aspects of symmetry. + + relatedTag + Asymmetrical + + + + Unconstrained + Moving without restriction. + + relatedTag + Constrained + + + + Unfamiliar + Not having knowledge or experience of. + + relatedTag + Familiar + Famous + + + + Unmasked + Information is revealed. + + relatedTag + Masked + + + + Voluntary + Using free will or design; not forced or compelled; controlled by individual volition. + + relatedTag + Involuntary + + + + + Categorical-level-value + Categorical values based on dividing a continuous variable into levels such as high and low. + + Cold + Having an absence of heat. + + relatedTag + Hot + + + + Deep + Extending relatively far inward or downward. + + relatedTag + Shallow + + + + High + Having a greater than normal degree, intensity, or amount. + + relatedTag + Low + Medium + + + + Hot + Having an excess of heat. + + relatedTag + Cold + + + + Large + Having a great extent such as in physical dimensions, period of time, amplitude or frequency. + + relatedTag + Small + + + + Liminal + Situated at a sensory threshold that is barely perceptible or capable of eliciting a response. + + relatedTag + Subliminal + Supraliminal + + + + Loud + Having a perceived high intensity of sound. + + relatedTag + Quiet + + + + Low + Less than normal in degree, intensity or amount. + + relatedTag + High + + + + Medium + Mid-way between small and large in number, quantity, magnitude or extent. + + relatedTag + Low + High + + + + Negative + Involving disadvantage or harm. + + relatedTag + Positive + + + + Positive + Involving advantage or good. + + relatedTag + Negative + + + + Quiet + Characterizing a perceived low intensity of sound. + + relatedTag + Loud + + + + Rough + Having a surface with perceptible bumps, ridges, or irregularities. + + relatedTag + Smooth + + + + Shallow + Having a depth which is relatively low. + + relatedTag + Deep + + + + Small + Having a small extent such as in physical dimensions, period of time, amplitude or frequency. + + relatedTag + Large + + + + Smooth + Having a surface free from bumps, ridges, or irregularities. + + relatedTag + Rough + + + + Subliminal + Situated below a sensory threshold that is imperceptible or not capable of eliciting a response. + + relatedTag + Liminal + Supraliminal + + + + Supraliminal + Situated above a sensory threshold that is perceptible or capable of eliciting a response. + + relatedTag + Liminal + Subliminal + + + + Thick + Wide in width, extent or cross-section. + + relatedTag + Thin + + + + Thin + Narrow in width, extent or cross-section. + + relatedTag + Thick + + + + + Categorical-orientation-value + Value indicating the orientation or direction of something. + + Backward + Directed behind or to the rear. + + relatedTag + Forward + + + + Downward + Moving or leading toward a lower place or level. + + relatedTag + Leftward + Rightward + Upward + + + + Forward + At or near or directed toward the front. + + relatedTag + Backward + + + + Horizontally-oriented + Oriented parallel to or in the plane of the horizon. + + relatedTag + Vertically-oriented + + + + Leftward + Going toward or facing the left. + + relatedTag + Downward + Rightward + Upward + + + + Oblique + Slanting or inclined in direction, course, or position that is neither parallel nor perpendicular nor right-angular. + + relatedTag + Rotated + + + + Rightward + Going toward or situated on the right. + + relatedTag + Downward + Leftward + Upward + + + + Rotated + Positioned offset around an axis or center. + + + Upward + Moving, pointing, or leading to a higher place, point, or level. + + relatedTag + Downward + Leftward + Rightward + + + + Vertically-oriented + Oriented perpendicular to the plane of the horizon. + + relatedTag + Horizontally-oriented + + + + + + Physical-value + The value of some physical property of something. + + Temperature + A measure of hot or cold based on the average kinetic energy of the atoms or molecules in the system. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + temperatureUnits + + + + + Weight + The relative mass or the quantity of matter contained by something. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + weightUnits + + + + + + Quantitative-value + Something capable of being estimated or expressed with numeric values. + + Fraction + A numerical value between 0 and 1. + + # + + takesValue + + + valueClass + numericClass + + + + + Item-count + The integer count of something which is usually grouped with the entity it is counting. (Item-count/3, A) indicates that 3 of A have occurred up to this point. + + # + + takesValue + + + valueClass + numericClass + + + + + Item-index + The index of an item in a collection, sequence or other structure. (A (Item-index/3, B)) means that A is item number 3 in B. + + # + + takesValue + + + valueClass + numericClass + + + + + Item-interval + An integer indicating how many items or entities have passed since the last one of these. An item interval of 0 indicates the current item. + + # + + takesValue + + + valueClass + numericClass + + + + + Percentage + A fraction or ratio with 100 understood as the denominator. + + # + + takesValue + + + valueClass + numericClass + + + + + Ratio + A quotient of quantities of the same kind for different components within the same system. + + # + + takesValue + + + valueClass + numericClass + + + + + + Spatiotemporal-value + A property relating to space and/or time. + + Rate-of-change + The amount of change accumulated per unit time. + + Acceleration + Magnitude of the rate of change in either speed or direction. The direction of change should be given separately. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + accelerationUnits + + + + + Frequency + Frequency is the number of occurrences of a repeating event per unit time. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + + + Jerk-rate + Magnitude of the rate at which the acceleration of an object changes with respect to time. The direction of change should be given separately. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + jerkUnits + + + + + Refresh-rate + The frequency with which the image on a computer monitor or similar electronic display screen is refreshed, usually expressed in hertz. + + # + + takesValue + + + valueClass + numericClass + + + + + Sampling-rate + The number of digital samples taken or recorded per unit of time. + + # + + takesValue + + + unitClass + frequencyUnits + + + + + Speed + A scalar measure of the rate of movement of the object expressed either as the distance travelled divided by the time taken (average speed) or the rate of change of position with respect to time at a particular point (instantaneous speed). The direction of change should be given separately. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + speedUnits + + + + + Temporal-rate + The number of items per unit of time. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + + + + Spatial-value + Value of an item involving space. + + Angle + The amount of inclination of one line to another or the plane of one object to another. + + # + + takesValue + + + unitClass + angleUnits + + + valueClass + numericClass + + + + + Distance + A measure of the space separating two objects or points. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Position + A reference to the alignment of an object, a particular situation or view of a situation, or the location of an object. Coordinates with respect a specified frame of reference or the default Screen-frame if no frame is given. + + X-position + The position along the x-axis of the frame of reference. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Y-position + The position along the y-axis of the frame of reference. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Z-position + The position along the z-axis of the frame of reference. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + + Size + The physical magnitude of something. + + Area + The extent of a 2-dimensional surface enclosed within a boundary. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + areaUnits + + + + + Depth + The distance from the surface of something especially from the perspective of looking from the front. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Height + The vertical measurement or distance from the base to the top of an object. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Length + The linear extent in space from one end of something to the other end, or the extent of something from beginning to end. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Volume + The amount of three dimensional space occupied by an object or the capacity of a space or container. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + volumeUnits + + + + + Width + The extent or measurement of something from side to side. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + + + Temporal-value + A characteristic of or relating to time or limited by time. + + Delay + The time at which an event start time is delayed from the current onset time. This tag defines the start time of an event of temporal extent and may be used with the Duration tag. + + topLevelTagGroup + + + reserved + + + relatedTag + Duration + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Duration + The period of time during which an event occurs. This tag defines the end time of an event of temporal extent and may be used with the Delay tag. + + topLevelTagGroup + + + reserved + + + relatedTag + Delay + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Time-interval + The period of time separating two instances, events, or occurrences. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Time-value + A value with units of time. Usually grouped with tags identifying what the value represents. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + + + Statistical-value + A value based on or employing the principles of statistics. + + extensionAllowed + + + Data-maximum + The largest possible quantity or degree. + + # + + takesValue + + + valueClass + numericClass + + + + + Data-mean + The sum of a set of values divided by the number of values in the set. + + # + + takesValue + + + valueClass + numericClass + + + + + Data-median + The value which has an equal number of values greater and less than it. + + # + + takesValue + + + valueClass + numericClass + + + + + Data-minimum + The smallest possible quantity. + + # + + takesValue + + + valueClass + numericClass + + + + + Probability + A measure of the expectation of the occurrence of a particular event. + + # + + takesValue + + + valueClass + numericClass + + + + + Standard-deviation + A measure of the range of values in a set of numbers. Standard deviation is a statistic used as a measure of the dispersion or variation in a distribution, equal to the square root of the arithmetic mean of the squares of the deviations from the arithmetic mean. + + # + + takesValue + + + valueClass + numericClass + + + + + Statistical-accuracy + A measure of closeness to true value expressed as a number between 0 and 1. + + # + + takesValue + + + valueClass + numericClass + + + + + Statistical-precision + A quantitative representation of the degree of accuracy necessary for or associated with a particular action. + + # + + takesValue + + + valueClass + numericClass + + + + + Statistical-recall + Sensitivity is a measurement datum qualifying a binary classification test and is computed by substracting the false negative rate to the integral numeral 1. + + # + + takesValue + + + valueClass + numericClass + + + + + Statistical-uncertainty + A measure of the inherent variability of repeated observation measurements of a quantity including quantities evaluated by statistical methods and by other means. + + # + + takesValue + + + valueClass + numericClass + + + + + + + Data-variability-attribute + An attribute describing how something changes or varies. + + Abrupt + Marked by sudden change. + + + Constant + Continually recurring or continuing without interruption. Not changing in time or space. + + + Continuous + Uninterrupted in time, sequence, substance, or extent. + + relatedTag + Discrete + Discontinuous + + + + Decreasing + Becoming smaller or fewer in size, amount, intensity, or degree. + + relatedTag + Increasing + + + + Deterministic + No randomness is involved in the development of the future states of the element. + + relatedTag + Random + Stochastic + + + + Discontinuous + Having a gap in time, sequence, substance, or extent. + + relatedTag + Continuous + + + + Discrete + Constituting a separate entities or parts. + + relatedTag + Continuous + Discontinuous + + + + Estimated-value + Something that has been calculated or measured approximately. + + + Exact-value + A value that is viewed to the true value according to some standard. + + + Flickering + Moving irregularly or unsteadily or burning or shining fitfully or with a fluctuating light. + + + Fractal + Having extremely irregular curves or shapes for which any suitably chosen part is similar in shape to a given larger or smaller part when magnified or reduced to the same size. + + + Increasing + Becoming greater in size, amount, or degree. + + relatedTag + Decreasing + + + + Random + Governed by or depending on chance. Lacking any definite plan or order or purpose. + + relatedTag + Deterministic + Stochastic + + + + Repetitive + A recurring action that is often non-purposeful. + + + Stochastic + Uses a random probability distribution or pattern that may be analysed statistically but may not be predicted precisely to determine future states. + + relatedTag + Deterministic + Random + + + + Varying + Differing in size, amount, degree, or nature. + + + + + Environmental-property + Relating to or arising from the surroundings of an agent. + + Augmented-reality + Using technology that enhances real-world experiences with computer-derived digital overlays to change some aspects of perception of the natural environment. The digital content is shown to the user through a smart device or glasses and responds to changes in the environment. + + + Indoors + Located inside a building or enclosure. + + + Motion-platform + A mechanism that creates the feelings of being in a real motion environment. + + + Outdoors + Any area outside a building or shelter. + + + Real-world + Located in a place that exists in real space and time under realistic conditions. + + + Rural + Of or pertaining to the country as opposed to the city. + + + Terrain + Characterization of the physical features of a tract of land. + + Composite-terrain + Tracts of land characterized by a mixure of physical features. + + + Dirt-terrain + Tracts of land characterized by a soil surface and lack of vegetation. + + + Grassy-terrain + Tracts of land covered by grass. + + + Gravel-terrain + Tracts of land covered by a surface consisting a loose aggregation of small water-worn or pounded stones. + + + Leaf-covered-terrain + Tracts of land covered by leaves and composited organic material. + + + Muddy-terrain + Tracts of land covered by a liquid or semi-liquid mixture of water and some combination of soil, silt, and clay. + + + Paved-terrain + Tracts of land covered with concrete, asphalt, stones, or bricks. + + + Rocky-terrain + Tracts of land consisting or full of rock or rocks. + + + Sloped-terrain + Tracts of land arranged in a sloping or inclined position. + + + Uneven-terrain + Tracts of land that are not level, smooth, or regular. + + + + Urban + Relating to, located in, or characteristic of a city or densely populated area. + + + Virtual-world + Using technology that creates immersive, computer-generated experiences that a person can interact with and navigate through. The digital content is generally delivered to the user through some type of headset and responds to changes in head position or through interaction with other types of sensors. Existing in a virtual setting such as a simulation or game environment. + + + + Informational-property + Something that pertains to a task. + + extensionAllowed + + + Description + An explanation of what the tag group it is in means. If the description is at the top-level of an event string, the description applies to the event. + + requireChild + + + # + + takesValue + + + valueClass + textClass + + + + + ID + An alphanumeric name that identifies either a unique object or a unique class of objects. Here the object or class may be an idea, physical countable object (or class), or physical uncountable substance (or class). + + requireChild + + + # + + takesValue + + + valueClass + textClass + + + + + Label + A string of 20 or fewer characters identifying something. Labels usually refer to general classes of things while IDs refer to specific instances. A term that is associated with some entity. A brief description given for purposes of identification. An identifying or descriptive marker that is attached to an object. + + requireChild + + + # + + takesValue + + + valueClass + nameClass + + + + + Metadata + Data about data. Information that describes another set of data. + + CogAtlas + The Cognitive Atlas ID number of something. + + # + + takesValue + + + + + CogPo + The CogPO ID number of something. + + # + + takesValue + + + + + Creation-date + The date on which data creation of this element began. + + requireChild + + + # + + takesValue + + + valueClass + dateTimeClass + + + + + Experimental-note + A brief written record about the experiment. + + # + + takesValue + + + valueClass + textClass + + + + + Library-name + Official name of a HED library. + + # + + takesValue + + + valueClass + nameClass + + + + + OBO-identifier + The identifier of a term in some Open Biology Ontology (OBO) ontology. + + # + + takesValue + + + valueClass + nameClass + + + + + Pathname + The specification of a node (file or directory) in a hierarchical file system, usually specified by listing the nodes top-down. + + # + + takesValue + + + + + Subject-identifier + A sequence of characters used to identify, name, or characterize a trial or study subject. + + # + + takesValue + + + + + Version-identifier + An alphanumeric character string that identifies a form or variant of a type or original. + + # + Usually is a semantic version. + + takesValue + + + + + + Parameter + Something user-defined for this experiment. + + Parameter-label + The name of the parameter. + + # + + takesValue + + + valueClass + nameClass + + + + + Parameter-value + The value of the parameter. + + # + + takesValue + + + valueClass + textClass + + + + + + + Organizational-property + Relating to an organization or the action of organizing something. + + Collection + A tag designating a grouping of items such as in a set or list. + + # + Name of the collection. + + takesValue + + + valueClass + nameClass + + + + + Condition-variable + An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent variables or contrasts. + + # + Name of the condition variable. + + takesValue + + + valueClass + nameClass + + + + + Control-variable + An aspect of the experiment that is fixed throughout the study and usually is explicitly controlled. + + # + Name of the control variable. + + takesValue + + + valueClass + nameClass + + + + + Def + A HED-specific utility tag used with a defined name to represent the tags associated with that definition. + + requireChild + + + reserved + + + # + Name of the definition. + + takesValue + + + valueClass + nameClass + + + + + Def-expand + A HED specific utility tag that is grouped with an expanded definition. The child value of the Def-expand is the name of the expanded definition. + + requireChild + + + reserved + + + tagGroup + + + # + + takesValue + + + valueClass + nameClass + + + + + Definition + A HED-specific utility tag whose child value is the name of the concept and the tag group associated with the tag is an English language explanation of a concept. + + requireChild + + + reserved + + + topLevelTagGroup + + + # + Name of the definition. + + takesValue + + + valueClass + nameClass + + + + + Event-context + A special HED tag inserted as part of a top-level tag group to contain information about the interrelated conditions under which the event occurs. The event context includes information about other events that are ongoing when this event happens. + + reserved + + + topLevelTagGroup + + + unique + + + + Event-stream + A special HED tag indicating that this event is a member of an ordered succession of events. + + # + Name of the event stream. + + takesValue + + + valueClass + nameClass + + + + + Experimental-intertrial + A tag used to indicate a part of the experiment between trials usually where nothing is happening. + + # + Optional label for the intertrial block. + + takesValue + + + valueClass + nameClass + + + + + Experimental-trial + Designates a run or execution of an activity, for example, one execution of a script. A tag used to indicate a particular organizational part in the experimental design often containing a stimulus-response pair or stimulus-response-feedback triad. + + # + Optional label for the trial (often a numerical string). + + takesValue + + + valueClass + nameClass + + + + + Indicator-variable + An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent variables. + + # + Name of the indicator variable. + + takesValue + + + valueClass + nameClass + + + + + Recording + A tag designating the data recording. Recording tags are usually have temporal scope which is the entire recording. + + # + Optional label for the recording. + + takesValue + + + valueClass + nameClass + + + + + Task + An assigned piece of work, usually with a time allotment. A tag used to indicate a linkage the structured activities performed as part of the experiment. + + # + Optional label for the task block. + + takesValue + + + valueClass + nameClass + + + + + Time-block + A tag used to indicate a contiguous time block in the experiment during which something is fixed or noted. + + # + Optional label for the task block. + + takesValue + + + valueClass + nameClass + + + + + + Sensory-property + Relating to sensation or the physical senses. + + Sensory-attribute + A sensory characteristic associated with another entity. + + Auditory-attribute + Pertaining to the sense of hearing. + + Loudness + Perceived intensity of a sound. + + # + + takesValue + + + valueClass + numericClass + nameClass + + + + + Pitch + A perceptual property that allows the user to order sounds on a frequency scale. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + + + Sound-envelope + Description of how a sound changes over time. + + Sound-envelope-attack + The time taken for initial run-up of level from nil to peak usually beginning when the key on a musical instrument is pressed. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Sound-envelope-decay + The time taken for the subsequent run down from the attack level to the designated sustain level. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Sound-envelope-release + The time taken for the level to decay from the sustain level to zero after the key is released. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Sound-envelope-sustain + The time taken for the main sequence of the sound duration, until the key is released. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + + Sound-volume + The sound pressure level (SPL) usually the ratio to a reference signal estimated as the lower bound of hearing. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + intensityUnits + + + + + Timbre + The perceived sound quality of a singing voice or musical instrument. + + # + + takesValue + + + valueClass + nameClass + + + + + + Gustatory-attribute + Pertaining to the sense of taste. + + Bitter + Having a sharp, pungent taste. + + + Salty + Tasting of or like salt. + + + Savory + Belonging to a taste that is salty or spicy rather than sweet. + + + Sour + Having a sharp, acidic taste. + + + Sweet + Having or resembling the taste of sugar. + + + + Olfactory-attribute + Having a smell. + + + Somatic-attribute + Pertaining to the feelings in the body or of the nervous system. + + Pain + The sensation of discomfort, distress, or agony, resulting from the stimulation of specialized nerve endings. + + + Stress + The negative mental, emotional, and physical reactions that occur when environmental stressors are perceived as exceeding the adaptive capacities of the individual. + + + + Tactile-attribute + Pertaining to the sense of touch. + + Tactile-pressure + Having a feeling of heaviness. + + + Tactile-temperature + Having a feeling of hotness or coldness. + + + Tactile-texture + Having a feeling of roughness. + + + Tactile-vibration + Having a feeling of mechanical oscillation. + + + + Vestibular-attribute + Pertaining to the sense of balance or body position. + + + Visual-attribute + Pertaining to the sense of sight. + + Color + The appearance of objects (or light sources) described in terms of perception of their hue and lightness (or brightness) and saturation. + + CSS-color + One of 140 colors supported by all browsers. For more details such as the color RGB or HEX values, check: https://www.w3schools.com/colors/colors_groups.asp. + + Blue-color + CSS color group. + + Blue + CSS-color 0x0000FF. + + + CadetBlue + CSS-color 0x5F9EA0. + + + CornflowerBlue + CSS-color 0x6495ED. + + + DarkBlue + CSS-color 0x00008B. + + + DeepSkyBlue + CSS-color 0x00BFFF. + + + DodgerBlue + CSS-color 0x1E90FF. + + + LightBlue + CSS-color 0xADD8E6. + + + LightSkyBlue + CSS-color 0x87CEFA. + + + LightSteelBlue + CSS-color 0xB0C4DE. + + + MediumBlue + CSS-color 0x0000CD. + + + MidnightBlue + CSS-color 0x191970. + + + Navy + CSS-color 0x000080. + + + PowderBlue + CSS-color 0xB0E0E6. + + + RoyalBlue + CSS-color 0x4169E1. + + + SkyBlue + CSS-color 0x87CEEB. + + + SteelBlue + CSS-color 0x4682B4. + + + + Brown-color + CSS color group. + + Bisque + CSS-color 0xFFE4C4. + + + BlanchedAlmond + CSS-color 0xFFEBCD. + + + Brown + CSS-color 0xA52A2A. + + + BurlyWood + CSS-color 0xDEB887. + + + Chocolate + CSS-color 0xD2691E. + + + Cornsilk + CSS-color 0xFFF8DC. + + + DarkGoldenRod + CSS-color 0xB8860B. + + + GoldenRod + CSS-color 0xDAA520. + + + Maroon + CSS-color 0x800000. + + + NavajoWhite + CSS-color 0xFFDEAD. + + + Olive + CSS-color 0x808000. + + + Peru + CSS-color 0xCD853F. + + + RosyBrown + CSS-color 0xBC8F8F. + + + SaddleBrown + CSS-color 0x8B4513. + + + SandyBrown + CSS-color 0xF4A460. + + + Sienna + CSS-color 0xA0522D. + + + Tan + CSS-color 0xD2B48C. + + + Wheat + CSS-color 0xF5DEB3. + + + + Cyan-color + CSS color group. + + Aqua + CSS-color 0x00FFFF. + + + Aquamarine + CSS-color 0x7FFFD4. + + + Cyan + CSS-color 0x00FFFF. + + + DarkTurquoise + CSS-color 0x00CED1. + + + LightCyan + CSS-color 0xE0FFFF. + + + MediumTurquoise + CSS-color 0x48D1CC. + + + PaleTurquoise + CSS-color 0xAFEEEE. + + + Turquoise + CSS-color 0x40E0D0. + + + + Gray-color + CSS color group. + + Black + CSS-color 0x000000. + + + DarkGray + CSS-color 0xA9A9A9. + + + DarkSlateGray + CSS-color 0x2F4F4F. + + + DimGray + CSS-color 0x696969. + + + Gainsboro + CSS-color 0xDCDCDC. + + + Gray + CSS-color 0x808080. + + + LightGray + CSS-color 0xD3D3D3. + + + LightSlateGray + CSS-color 0x778899. + + + Silver + CSS-color 0xC0C0C0. + + + SlateGray + CSS-color 0x708090. + + + + Green-color + CSS color group. + + Chartreuse + CSS-color 0x7FFF00. + + + DarkCyan + CSS-color 0x008B8B. + + + DarkGreen + CSS-color 0x006400. + + + DarkOliveGreen + CSS-color 0x556B2F. + + + DarkSeaGreen + CSS-color 0x8FBC8F. + + + ForestGreen + CSS-color 0x228B22. + + + Green + CSS-color 0x008000. + + + GreenYellow + CSS-color 0xADFF2F. + + + LawnGreen + CSS-color 0x7CFC00. + + + LightGreen + CSS-color 0x90EE90. + + + LightSeaGreen + CSS-color 0x20B2AA. + + + Lime + CSS-color 0x00FF00. + + + LimeGreen + CSS-color 0x32CD32. + + + MediumAquaMarine + CSS-color 0x66CDAA. + + + MediumSeaGreen + CSS-color 0x3CB371. + + + MediumSpringGreen + CSS-color 0x00FA9A. + + + OliveDrab + CSS-color 0x6B8E23. + + + PaleGreen + CSS-color 0x98FB98. + + + SeaGreen + CSS-color 0x2E8B57. + + + SpringGreen + CSS-color 0x00FF7F. + + + Teal + CSS-color 0x008080. + + + YellowGreen + CSS-color 0x9ACD32. + + + + Orange-color + CSS color group. + + Coral + CSS-color 0xFF7F50. + + + DarkOrange + CSS-color 0xFF8C00. + + + Orange + CSS-color 0xFFA500. + + + OrangeRed + CSS-color 0xFF4500. + + + Tomato + CSS-color 0xFF6347. + + + + Pink-color + CSS color group. + + DeepPink + CSS-color 0xFF1493. + + + HotPink + CSS-color 0xFF69B4. + + + LightPink + CSS-color 0xFFB6C1. + + + MediumVioletRed + CSS-color 0xC71585. + + + PaleVioletRed + CSS-color 0xDB7093. + + + Pink + CSS-color 0xFFC0CB. + + + + Purple-color + CSS color group. + + BlueViolet + CSS-color 0x8A2BE2. + + + DarkMagenta + CSS-color 0x8B008B. + + + DarkOrchid + CSS-color 0x9932CC. + + + DarkSlateBlue + CSS-color 0x483D8B. + + + DarkViolet + CSS-color 0x9400D3. + + + Fuchsia + CSS-color 0xFF00FF. + + + Indigo + CSS-color 0x4B0082. + + + Lavender + CSS-color 0xE6E6FA. + + + Magenta + CSS-color 0xFF00FF. + + + MediumOrchid + CSS-color 0xBA55D3. + + + MediumPurple + CSS-color 0x9370DB. + + + MediumSlateBlue + CSS-color 0x7B68EE. + + + Orchid + CSS-color 0xDA70D6. + + + Plum + CSS-color 0xDDA0DD. + + + Purple + CSS-color 0x800080. + + + RebeccaPurple + CSS-color 0x663399. + + + SlateBlue + CSS-color 0x6A5ACD. + + + Thistle + CSS-color 0xD8BFD8. + + + Violet + CSS-color 0xEE82EE. + + + + Red-color + CSS color group. + + Crimson + CSS-color 0xDC143C. + + + DarkRed + CSS-color 0x8B0000. + + + DarkSalmon + CSS-color 0xE9967A. + + + FireBrick + CSS-color 0xB22222. + + + IndianRed + CSS-color 0xCD5C5C. + + + LightCoral + CSS-color 0xF08080. + + + LightSalmon + CSS-color 0xFFA07A. + + + Red + CSS-color 0xFF0000. + + + Salmon + CSS-color 0xFA8072. + + + + White-color + CSS color group. + + AliceBlue + CSS-color 0xF0F8FF. + + + AntiqueWhite + CSS-color 0xFAEBD7. + + + Azure + CSS-color 0xF0FFFF. + + + Beige + CSS-color 0xF5F5DC. + + + FloralWhite + CSS-color 0xFFFAF0. + + + GhostWhite + CSS-color 0xF8F8FF. + + + HoneyDew + CSS-color 0xF0FFF0. + + + Ivory + CSS-color 0xFFFFF0. + + + LavenderBlush + CSS-color 0xFFF0F5. + + + Linen + CSS-color 0xFAF0E6. + + + MintCream + CSS-color 0xF5FFFA. + + + MistyRose + CSS-color 0xFFE4E1. + + + OldLace + CSS-color 0xFDF5E6. + + + SeaShell + CSS-color 0xFFF5EE. + + + Snow + CSS-color 0xFFFAFA. + + + White + CSS-color 0xFFFFFF. + + + WhiteSmoke + CSS-color 0xF5F5F5. + + + + Yellow-color + CSS color group. + + DarkKhaki + CSS-color 0xBDB76B. + + + Gold + CSS-color 0xFFD700. + + + Khaki + CSS-color 0xF0E68C. + + + LemonChiffon + CSS-color 0xFFFACD. + + + LightGoldenRodYellow + CSS-color 0xFAFAD2. + + + LightYellow + CSS-color 0xFFFFE0. + + + Moccasin + CSS-color 0xFFE4B5. + + + PaleGoldenRod + CSS-color 0xEEE8AA. + + + PapayaWhip + CSS-color 0xFFEFD5. + + + PeachPuff + CSS-color 0xFFDAB9. + + + Yellow + CSS-color 0xFFFF00. + + + + + Color-shade + A slight degree of difference between colors, especially with regard to how light or dark it is or as distinguished from one nearly like it. + + Dark-shade + A color tone not reflecting much light. + + + Light-shade + A color tone reflecting more light. + + + + Grayscale + Using a color map composed of shades of gray, varying from black at the weakest intensity to white at the strongest. + + # + White intensity between 0 and 1. + + takesValue + + + valueClass + numericClass + + + + + HSV-color + A color representation that models how colors appear under light. + + HSV-value + An attribute of a visual sensation according to which an area appears to emit more or less light. + + # + + takesValue + + + valueClass + numericClass + + + + + Hue + Attribute of a visual sensation according to which an area appears to be similar to one of the perceived colors. + + # + Angular value between 0 and 360. + + takesValue + + + valueClass + numericClass + + + + + Saturation + Colorfulness of a stimulus relative to its own brightness. + + # + B value of RGB between 0 and 1. + + takesValue + + + valueClass + numericClass + + + + + + RGB-color + A color from the RGB schema. + + RGB-blue + The blue component. + + # + B value of RGB between 0 and 1. + + takesValue + + + valueClass + numericClass + + + + + RGB-green + The green component. + + # + G value of RGB between 0 and 1. + + takesValue + + + valueClass + numericClass + + + + + RGB-red + The red component. + + # + R value of RGB between 0 and 1. + + takesValue + + + valueClass + numericClass + + + + + + + Luminance + A quality that exists by virtue of the luminous intensity per unit area projected in a given direction. + + + Opacity + A measure of impenetrability to light. + + + + + Sensory-presentation + The entity has a sensory manifestation. + + Auditory-presentation + The sense of hearing is used in the presentation to the user. + + Loudspeaker-separation + The distance between two loudspeakers. Grouped with the Distance tag. + + suggestedTag + Distance + + + + Monophonic + Relating to sound transmission, recording, or reproduction involving a single transmission path. + + + Silent + The absence of ambient audible sound or the state of having ceased to produce sounds. + + + Stereophonic + Relating to, or constituting sound reproduction involving the use of separated microphones and two transmission channels to achieve the sound separation of a live hearing. + + + + Gustatory-presentation + The sense of taste used in the presentation to the user. + + + Olfactory-presentation + The sense of smell used in the presentation to the user. + + + Somatic-presentation + The nervous system is used in the presentation to the user. + + + Tactile-presentation + The sense of touch used in the presentation to the user. + + + Vestibular-presentation + The sense balance used in the presentation to the user. + + + Visual-presentation + The sense of sight used in the presentation to the user. + + 2D-view + A view showing only two dimensions. + + + 3D-view + A view showing three dimensions. + + + Background-view + Parts of the view that are farthest from the viewer and usually the not part of the visual focus. + + + Bistable-view + Something having two stable visual forms that have two distinguishable stable forms as in optical illusions. + + + Foreground-view + Parts of the view that are closest to the viewer and usually the most important part of the visual focus. + + + Foveal-view + Visual presentation directly on the fovea. A view projected on the small depression in the retina containing only cones and where vision is most acute. + + + Map-view + A diagrammatic representation of an area of land or sea showing physical features, cities, roads. + + Aerial-view + Elevated view of an object from above, with a perspective as though the observer were a bird. + + + Satellite-view + A representation as captured by technology such as a satellite. + + + Street-view + A 360-degrees panoramic view from a position on the ground. + + + + Peripheral-view + Indirect vision as it occurs outside the point of fixation. + + + + + + Task-property + Something that pertains to a task. + + extensionAllowed + + + Task-action-type + How an agent action should be interpreted in terms of the task specification. + + Appropriate-action + An action suitable or proper in the circumstances. + + relatedTag + Inappropriate-action + + + + Correct-action + An action that was a correct response in the context of the task. + + relatedTag + Incorrect-action + Indeterminate-action + + + + Correction + An action offering an improvement to replace a mistake or error. + + + Done-indication + An action that indicates that the participant has completed this step in the task. + + relatedTag + Ready-indication + + + + Imagined-action + Form a mental image or concept of something. This is used to identity something that only happened in the imagination of the participant as in imagined movements in motor imagery paradigms. + + + Inappropriate-action + An action not in keeping with what is correct or proper for the task. + + relatedTag + Appropriate-action + + + + Incorrect-action + An action considered wrong or incorrect in the context of the task. + + relatedTag + Correct-action + Indeterminate-action + + + + Indeterminate-action + An action that cannot be distinguished between two or more possibibities in the current context. This tag might be applied when an outside evaluator or a classification algorithm cannot determine a definitive result. + + relatedTag + Correct-action + Incorrect-action + Miss + Near-miss + + + + Miss + An action considered to be a failure in the context of the task. For example, if the agent is supposed to try to hit a target and misses. + + relatedTag + Near-miss + + + + Near-miss + An action barely satisfied the requirements of the task. In a driving experiment for example this could pertain to a narrowly avoided collision or other accident. + + relatedTag + Miss + + + + Omitted-action + An expected response was skipped. + + + Ready-indication + An action that indicates that the participant is ready to perform the next step in the task. + + relatedTag + Done-indication + + + + + Task-attentional-demand + Strategy for allocating attention toward goal-relevant information. + + Bottom-up-attention + Attentional guidance purely by externally driven factors to stimuli that are salient because of their inherent properties relative to the background. Sometimes this is referred to as stimulus driven. + + relatedTag + Top-down-attention + + + + Covert-attention + Paying attention without moving the eyes. + + relatedTag + Overt-attention + + + + Divided-attention + Integrating parallel multiple stimuli. Behavior involving responding simultaneously to multiple tasks or multiple task demands. + + relatedTag + Focused-attention + + + + Focused-attention + Responding discretely to specific visual, auditory, or tactile stimuli. + + relatedTag + Divided-attention + + + + Orienting-attention + Directing attention to a target stimulus. + + + Overt-attention + Selectively processing one location over others by moving the eyes to point at that location. + + relatedTag + Covert-attention + + + + Selective-attention + Maintaining a behavioral or cognitive set in the face of distracting or competing stimuli. Ability to pay attention to a limited array of all available sensory information. + + + Sustained-attention + Maintaining a consistent behavioral response during continuous and repetitive activity. + + + Switched-attention + Having to switch attention between two or more modalities of presentation. + + + Top-down-attention + Voluntary allocation of attention to certain features. Sometimes this is referred to goal-oriented attention. + + relatedTag + Bottom-up-attention + + + + + Task-effect-evidence + The evidence supporting the conclusion that the event had the specified effect. + + Behavioral-evidence + An indication or conclusion based on the behavior of an agent. + + + Computational-evidence + A type of evidence in which data are produced, and/or generated, and/or analyzed on a computer. + + + External-evidence + A phenomenon that follows and is caused by some previous phenomenon. + + + Intended-effect + A phenomenon that is intended to follow and be caused by some previous phenomenon. + + + + Task-event-role + The purpose of an event with respect to the task. + + Experimental-stimulus + Part of something designed to elicit a response in the experiment. + + + Incidental + A sensory or other type of event that is unrelated to the task or experiment. + + + Instructional + Usually associated with a sensory event intended to give instructions to the participant about the task or behavior. + + + Mishap + Unplanned disruption such as an equipment or experiment control abnormality or experimenter error. + + + Participant-response + Something related to a participant actions in performing the task. + + + Task-activity + Something that is part of the overall task or is necessary to the overall experiment but is not directly part of a stimulus-response cycle. Examples would be taking a survey or provided providing a silva sample. + + + Warning + Something that should warn the participant that the parameters of the task have been or are about to be exceeded such as a warning message about getting too close to the shoulder of the road in a driving task. + + + + Task-relationship + Specifying organizational importance of sub-tasks. + + Background-subtask + A part of the task which should be performed in the background as for example inhibiting blinks due to instruction while performing the primary task. + + + Primary-subtask + A part of the task which should be the primary focus of the participant. + + + + Task-stimulus-role + The role the stimulus plays in the task. + + Cue + A signal for an action, a pattern of stimuli indicating a particular response. + + + Distractor + A person or thing that distracts or a plausible but incorrect option in a multiple-choice question. In pyschological studies this is sometimes referred to as a foil. + + + Expected + Considered likely, probable or anticipated. Something of low information value as in frequent non-targets in an RSVP paradigm. + + relatedTag + Unexpected + + + suggestedTag + Target + + + + Extraneous + Irrelevant or unrelated to the subject being dealt with. + + + Feedback + An evaluative response to an inquiry, process, event, or activity. + + + Go-signal + An indicator to proceed with a planned action. + + relatedTag + Stop-signal + + + + Meaningful + Conveying significant or relevant information. + + + Newly-learned + Representing recently acquired information or understanding. + + + Non-informative + Something that is not useful in forming an opinion or judging an outcome. + + + Non-target + Something other than that done or looked for. Also tag Expected if the Non-target is frequent. + + relatedTag + Target + + + + Not-meaningful + Not having a serious, important, or useful quality or purpose. + + + Novel + Having no previous example or precedent or parallel. + + + Oddball + Something unusual, or infrequent. + + relatedTag + Unexpected + + + suggestedTag + Target + + + + Penalty + A disadvantage, loss, or hardship due to some action. + + + Planned + Something that was decided on or arranged in advance. + + relatedTag + Unplanned + + + + Priming + An implicit memory effect in which exposure to a stimulus influences response to a later stimulus. + + + Query + A sentence of inquiry that asks for a reply. + + + Reward + A positive reinforcement for a desired action, behavior or response. + + + Stop-signal + An indicator that the agent should stop the current activity. + + relatedTag + Go-signal + + + + Target + Something fixed as a goal, destination, or point of examination. + + + Threat + An indicator that signifies hostility and predicts an increased probability of attack. + + + Timed + Something planned or scheduled to be done at a particular time or lasting for a specified amount of time. + + + Unexpected + Something that is not anticipated. + + relatedTag + Expected + + + + Unplanned + Something that has not been planned as part of the task. + + relatedTag + Planned + + + + + + + Relation + Concerns the way in which two or more people or things are connected. + + extensionAllowed + + + Comparative-relation + Something considered in comparison to something else. The first entity is the focus. + + Approximately-equal-to + (A, (Approximately-equal-to, B)) indicates that A and B have almost the same value. Here A and B could refer to sizes, orders, positions or other quantities. + + + Equal-to + (A, (Equal-to, B)) indicates that the size or order of A is the same as that of B. + + + Greater-than + (A, (Greater-than, B)) indicates that the relative size or order of A is bigger than that of B. + + + Greater-than-or-equal-to + (A, (Greater-than-or-equal-to, B)) indicates that the relative size or order of A is bigger than or the same as that of B. + + + Less-than + (A, (Less-than, B)) indicates that A is smaller than B. Here A and B could refer to sizes, orders, positions or other quantities. + + + Less-than-or-equal-to + (A, (Less-than-or-equal-to, B)) indicates that the relative size or order of A is smaller than or equal to B. + + + Not-equal-to + (A, (Not-equal-to, B)) indicates that the size or order of A is not the same as that of B. + + + + Connective-relation + Indicates two entities are related in some way. The first entity is the focus. + + Belongs-to + (A, (Belongs-to, B)) indicates that A is a member of B. + + + Connected-to + (A, (Connected-to, B)) indicates that A is related to B in some respect, usually through a direct link. + + + Contained-in + (A, (Contained-in, B)) indicates that A is completely inside of B. + + + Described-by + (A, (Described-by, B)) indicates that B provides information about A. + + + From-to + (A, (From-to, B)) indicates a directional relation from A to B. A is considered the source. + + + Group-of + (A, (Group-of, B)) indicates A is a group of items of type B. + + + Implied-by + (A, (Implied-by, B)) indicates B is suggested by A. + + + Includes + (A, (Includes, B)) indicates that A has B as a member or part. + + + Interacts-with + (A, (Interacts-with, B)) indicates A and B interact, possibly reciprocally. + + + Member-of + (A, (Member-of, B)) indicates A is a member of group B. + + + Part-of + (A, (Part-of, B)) indicates A is a part of the whole B. + + + Performed-by + (A, (Performed-by, B)) indicates that the action or procedure A was carried out by agent B. + + + Performed-using + (A, (Performed-using, B)) indicates that the action or procedure A was accomplished using B. + + + Related-to + (A, (Related-to, B)) indicates A has some relationship to B. + + + Unrelated-to + (A, (Unrelated-to, B)) indicates that A is not related to B. For example, A is not related to Task. + + + + Directional-relation + A relationship indicating direction of change of one entity relative to another. The first entity is the focus. + + Away-from + (A, (Away-from, B)) indicates that A is going or has moved away from B. The meaning depends on A and B. + + + Towards + (A, (Towards, B)) indicates that A is going to or has moved to B. The meaning depends on A and B. + + + + Logical-relation + Indicating a logical relationship between entities. The first entity is usually the focus. + + And + (A, (And, B)) means A and B are both in effect. + + + Or + (A, (Or, B)) means at least one of A and B are in effect. + + + + Spatial-relation + Indicating a relationship about position between entities. + + Above + (A, (Above, B)) means A is in a place or position that is higher than B. + + + Across-from + (A, (Across-from, B)) means A is on the opposite side of something from B. + + + Adjacent-to + (A, (Adjacent-to, B)) indicates that A is next to B in time or space. + + + Ahead-of + (A, (Ahead-of, B)) indicates that A is further forward in time or space in B. + + + Around + (A, (Around, B)) means A is in or near the present place or situation of B. + + + Behind + (A, (Behind, B)) means A is at or to the far side of B, typically so as to be hidden by it. + + + Below + (A, (Below, B)) means A is in a place or position that is lower than the position of B. + + + Between + (A, (Between, (B, C))) means A is in the space or interval separating B and C. + + + Bilateral-to + (A, (Bilateral, B)) means A is on both sides of B or affects both sides of B. + + + Bottom-edge-of + (A, (Bottom-edge-of, B)) means A is on the bottom most part or or near the boundary of B. + + relatedTag + Left-edge-of + Right-edge-of + Top-edge-of + + + + Boundary-of + (A, (Boundary-of, B)) means A is on or part of the edge or boundary of B. + + + Center-of + (A, (Center-of, B)) means A is at a point or or in an area that is approximately central within B. + + + Close-to + (A, (Close-to, B)) means A is at a small distance from or is located near in space to B. + + + Far-from + (A, (Far-from, B)) means A is at a large distance from or is not located near in space to B. + + + In-front-of + (A, (In-front-of, B)) means A is in a position just ahead or at the front part of B, potentially partially blocking B from view. + + + Left-edge-of + (A, (Left-edge-of, B)) means A is located on the left side of B on or near the boundary of B. + + relatedTag + Bottom-edge-of + Right-edge-of + Top-edge-of + + + + Left-side-of + (A, (Left-side-of, B)) means A is located on the left side of B usually as part of B. + + relatedTag + Right-side-of + + + + Lower-center-of + (A, (Lower-center-of, B)) means A is situated on the lower center part of B (due south). This relation is often used to specify qualitative information about screen position. + + relatedTag + Center-of + Lower-left-of + Lower-right-of + Upper-center-of + Upper-right-of + + + + Lower-left-of + (A, (Lower-left-of, B)) means A is situated on the lower left part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Center-of + Lower-center-of + Lower-right-of + Upper-center-of + Upper-left-of + Upper-right-of + + + + Lower-right-of + (A, (Lower-right-of, B)) means A is situated on the lower right part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Center-of + Lower-center-of + Lower-left-of + Upper-left-of + Upper-center-of + Upper-left-of + Lower-right-of + + + + Outside-of + (A, (Outside-of, B)) means A is located in the space around but not including B. + + + Over + (A, (Over, B)) means A above is above B so as to cover or protect or A extends over the a general area as from a from a vantage point. + + + Right-edge-of + (A, (Right-edge-of, B)) means A is located on the right side of B on or near the boundary of B. + + relatedTag + Bottom-edge-of + Left-edge-of + Top-edge-of + + + + Right-side-of + (A, (Right-side-of, B)) means A is located on the right side of B usually as part of B. + + relatedTag + Left-side-of + + + + To-left-of + (A, (To-left-of, B)) means A is located on or directed toward the side to the west of B when B is facing north. This term is used when A is not part of B. + + + To-right-of + (A, (To-right-of, B)) means A is located on or directed toward the side to the east of B when B is facing north. This term is used when A is not part of B. + + + Top-edge-of + (A, (Top-edge-of, B)) means A is on the uppermost part or or near the boundary of B. + + relatedTag + Left-edge-of + Right-edge-of + Bottom-edge-of + + + + Top-of + (A, (Top-of, B)) means A is on the uppermost part, side, or surface of B. + + + Underneath + (A, (Underneath, B)) means A is situated directly below and may be concealed by B. + + + Upper-center-of + (A, (Upper-center-of, B)) means A is situated on the upper center part of B (due north). This relation is often used to specify qualitative information about screen position. + + relatedTag + Center-of + Lower-center-of + Lower-left-of + Lower-right-of + Upper-center-of + Upper-right-of + + + + Upper-left-of + (A, (Upper-left-of, B)) means A is situated on the upper left part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Center-of + Lower-center-of + Lower-left-of + Lower-right-of + Upper-center-of + Upper-right-of + + + + Upper-right-of + (A, (Upper-right-of, B)) means A is situated on the upper right part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Center-of + Lower-center-of + Lower-left-of + Upper-left-of + Upper-center-of + Lower-right-of + + + + Within + (A, (Within, B)) means A is on the inside of or contained in B. + + + + Temporal-relation + A relationship that includes a temporal or time-based component. + + After + (A, (After B)) means A happens at a time subsequent to a reference time related to B. + + + Asynchronous-with + (A, (Asynchronous-with, B)) means A happens at times not occurring at the same time or having the same period or phase as B. + + + Before + (A, (Before B)) means A happens at a time earlier in time or order than B. + + + During + (A, (During, B)) means A happens at some point in a given period of time in which B is ongoing. + + + Synchronous-with + (A, (Synchronous-with, B)) means A happens at occurs at the same time or rate as B. + + + Waiting-for + (A, (Waiting-for, B)) means A pauses for something to happen in B. + + + + + + + accelerationUnits + + defaultUnits + m-per-s^2 + + + m-per-s^2 + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + + angleUnits + + defaultUnits + radian + + + radian + + SIUnit + + + conversionFactor + 1.0 + + + + rad + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + degree + + conversionFactor + 0.0174533 + + + + + areaUnits + + defaultUnits + m^2 + + + m^2 + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + + currencyUnits + Units indicating the worth of something. + + defaultUnits + $ + + + dollar + + conversionFactor + 1.0 + + + + $ + + unitPrefix + + + unitSymbol + + + conversionFactor + 1.0 + + + + euro + + + point + + + + electricPotentialUnits + + defaultUnits + uv + + + v + + SIUnit + + + unitSymbol + + + conversionFactor + 0.000001 + + + + Volt + + SIUnit + + + conversionFactor + 0.000001 + + + + + frequencyUnits + + defaultUnits + Hz + + + hertz + + SIUnit + + + conversionFactor + 1.0 + + + + Hz + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + + intensityUnits + + defaultUnits + dB + + + dB + Intensity expressed as ratio to a threshold. May be used for sound intensity. + + unitSymbol + + + conversionFactor + 1.0 + + + + candela + Units used to express light intensity. + + SIUnit + + + + cd + Units used to express light intensity. + + SIUnit + + + unitSymbol + + + + + jerkUnits + + defaultUnits + m-per-s^3 + + + m-per-s^3 + + unitSymbol + + + conversionFactor + 1.0 + + + + + magneticFieldUnits + Units used to magnetic field intensity. + + defaultUnits + fT + + + tesla + + SIUnit + + + conversionFactor + 10^-15 + + + + T + + SIUnit + + + unitSymbol + + + conversionFactor + 10^-15 + + + + + memorySizeUnits + + defaultUnits + B + + + byte + + SIUnit + + + conversionFactor + 1.0 + + + + B + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + + physicalLengthUnits + + defaultUnits + m + + + foot + + conversionFactor + 0.3048 + + + + inch + + conversionFactor + 0.0254 + + + + meter + + SIUnit + + + conversionFactor + 1.0 + + + + metre + + SIUnit + + + conversionFactor + 1.0 + + + + m + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + mile + + conversionFactor + 1609.34 + + + + + speedUnits + + defaultUnits + m-per-s + + + m-per-s + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + mph + + unitSymbol + + + conversionFactor + 0.44704 + + + + kph + + unitSymbol + + + conversionFactor + 0.277778 + + + + + temperatureUnits + + degree Celsius + + SIUnit + + + conversionFactor + 1.0 + + + + oC + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + + timeUnits + + defaultUnits + s + + + second + + SIUnit + + + conversionFactor + 1.0 + + + + s + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + day + + conversionFactor + 86400 + + + + minute + + conversionFactor + 60 + + + + hour + Should be in 24-hour format. + + conversionFactor + 3600 + + + + + volumeUnits + + defaultUnits + m^3 + + + m^3 + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + + weightUnits + + defaultUnits + g + + + g + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + gram + + SIUnit + + + conversionFactor + 1.0 + + + + pound + + conversionFactor + 453.592 + + + + lb + + conversionFactor + 453.592 + + + + + + + deca + SI unit multiple representing 10^1. + + SIUnitModifier + + + conversionFactor + 10.0 + + + + da + SI unit multiple representing 10^1. + + SIUnitSymbolModifier + + + conversionFactor + 10.0 + + + + hecto + SI unit multiple representing 10^2. + + SIUnitModifier + + + conversionFactor + 100.0 + + + + h + SI unit multiple representing 10^2. + + SIUnitSymbolModifier + + + conversionFactor + 100.0 + + + + kilo + SI unit multiple representing 10^3. + + SIUnitModifier + + + conversionFactor + 1000.0 + + + + k + SI unit multiple representing 10^3. + + SIUnitSymbolModifier + + + conversionFactor + 1000.0 + + + + mega + SI unit multiple representing 10^6. + + SIUnitModifier + + + conversionFactor + 10^6 + + + + M + SI unit multiple representing 10^6. + + SIUnitSymbolModifier + + + conversionFactor + 10^6 + + + + giga + SI unit multiple representing 10^9. + + SIUnitModifier + + + conversionFactor + 10^9 + + + + G + SI unit multiple representing 10^9. + + SIUnitSymbolModifier + + + conversionFactor + 10^9 + + + + tera + SI unit multiple representing 10^12. + + SIUnitModifier + + + conversionFactor + 10^12 + + + + T + SI unit multiple representing 10^12. + + SIUnitSymbolModifier + + + conversionFactor + 10^12 + + + + peta + SI unit multiple representing 10^15. + + SIUnitModifier + + + conversionFactor + 10^15 + + + + P + SI unit multiple representing 10^15. + + SIUnitSymbolModifier + + + conversionFactor + 10^15 + + + + exa + SI unit multiple representing 10^18. + + SIUnitModifier + + + conversionFactor + 10^18 + + + + E + SI unit multiple representing 10^18. + + SIUnitSymbolModifier + + + conversionFactor + 10^18 + + + + zetta + SI unit multiple representing 10^21. + + SIUnitModifier + + + conversionFactor + 10^21 + + + + Z + SI unit multiple representing 10^21. + + SIUnitSymbolModifier + + + conversionFactor + 10^21 + + + + yotta + SI unit multiple representing 10^24. + + SIUnitModifier + + + conversionFactor + 10^24 + + + + Y + SI unit multiple representing 10^24. + + SIUnitSymbolModifier + + + conversionFactor + 10^24 + + + + deci + SI unit submultiple representing 10^-1. + + SIUnitModifier + + + conversionFactor + 0.1 + + + + d + SI unit submultiple representing 10^-1. + + SIUnitSymbolModifier + + + conversionFactor + 0.1 + + + + centi + SI unit submultiple representing 10^-2. + + SIUnitModifier + + + conversionFactor + 0.01 + + + + c + SI unit submultiple representing 10^-2. + + SIUnitSymbolModifier + + + conversionFactor + 0.01 + + + + milli + SI unit submultiple representing 10^-3. + + SIUnitModifier + + + conversionFactor + 0.001 + + + + m + SI unit submultiple representing 10^-3. + + SIUnitSymbolModifier + + + conversionFactor + 0.001 + + + + micro + SI unit submultiple representing 10^-6. + + SIUnitModifier + + + conversionFactor + 10^-6 + + + + u + SI unit submultiple representing 10^-6. + + SIUnitSymbolModifier + + + conversionFactor + 10^-6 + + + + nano + SI unit submultiple representing 10^-9. + + SIUnitModifier + + + conversionFactor + 10^-9 + + + + n + SI unit submultiple representing 10^-9. + + SIUnitSymbolModifier + + + conversionFactor + 10^-9 + + + + pico + SI unit submultiple representing 10^-12. + + SIUnitModifier + + + conversionFactor + 10^-12 + + + + p + SI unit submultiple representing 10^-12. + + SIUnitSymbolModifier + + + conversionFactor + 10^-12 + + + + femto + SI unit submultiple representing 10^-15. + + SIUnitModifier + + + conversionFactor + 10^-15 + + + + f + SI unit submultiple representing 10^-15. + + SIUnitSymbolModifier + + + conversionFactor + 10^-15 + + + + atto + SI unit submultiple representing 10^-18. + + SIUnitModifier + + + conversionFactor + 10^-18 + + + + a + SI unit submultiple representing 10^-18. + + SIUnitSymbolModifier + + + conversionFactor + 10^-18 + + + + zepto + SI unit submultiple representing 10^-21. + + SIUnitModifier + + + conversionFactor + 10^-21 + + + + z + SI unit submultiple representing 10^-21. + + SIUnitSymbolModifier + + + conversionFactor + 10^-21 + + + + yocto + SI unit submultiple representing 10^-24. + + SIUnitModifier + + + conversionFactor + 10^-24 + + + + y + SI unit submultiple representing 10^-24. + + SIUnitSymbolModifier + + + conversionFactor + 10^-24 + + + + + + dateTimeClass + Date-times should conform to ISO8601 date-time format YYYY-MM-DDThh:mm:ss. Any variation on the full form is allowed. + + allowedCharacter + digits + T + - + : + + + + nameClass + Value class designating values that have the characteristics of node names. The allowed characters are alphanumeric, hyphen, and underbar. + + allowedCharacter + letters + digits + _ + - + + + + numericClass + Value must be a valid numerical value. + + allowedCharacter + digits + E + e + + + - + . + + + + posixPath + Posix path specification. + + allowedCharacter + digits + letters + / + : + + + + textClass + Value class designating values that have the characteristics of text such as in descriptions. + + allowedCharacter + letters + digits + blank + + + - + : + ; + . + / + ( + ) + ? + * + % + $ + @ + + + + + + allowedCharacter + A schema attribute of value classes specifying a special character that is allowed in expressing the value of a placeholder. Normally the allowed characters are listed individually. However, the word letters designates the upper and lower case alphabetic characters and the word digits designates the digits 0-9. The word blank designates the blank character. + + valueClassProperty + + + + conversionFactor + The multiplicative factor to multiply these units to convert to default units. + + unitProperty + + + unitModifierProperty + + + + deprecatedFrom + Indicates that this element is deprecated. The value of the attribute is the latest schema version in which the element appeared in undeprecated form. + + elementProperty + + + + defaultUnits + A schema attribute of unit classes specifying the default units to use if the placeholder has a unit class but the substituted value has no units. + + unitClassProperty + + + + extensionAllowed + A schema attribute indicating that users can add unlimited levels of child nodes under this tag. This tag is propagated to child nodes with the exception of the hashtag placeholders. + + boolProperty + + + nodeProperty + + + isInheritedProperty + + + + inLibrary + Indicates this schema element came from the named library schema, not the standard schema. This attribute is added by tools when a library schema is merged into its partnered standard schema. + + elementProperty + + + + recommended + A schema attribute indicating that the event-level HED string should include this tag. + + boolProperty + + + nodeProperty + + + + relatedTag + A schema attribute suggesting HED tags that are closely related to this tag. This attribute is used by tagging tools. + + nodeProperty + + + isInheritedProperty + + + + requireChild + A schema attribute indicating that one of the node elements descendants must be included when using this tag. + + boolProperty + + + nodeProperty + + + + required + A schema attribute indicating that every event-level HED string should include this tag. + + boolProperty + + + nodeProperty + + + + reserved + A schema attribute indicating that this tag has special meaning and requires special handling by tools. + + boolProperty + + + nodeProperty + + + + rooted + Indicates a top-level library schema node is identical to a node of the same name in the partnered standard schema. This attribute can only appear in nodes that have the inLibrary schema attribute. + + nodeProperty + + + + SIUnit + A schema attribute indicating that this unit element is an SI unit and can be modified by multiple and submultiple names. Note that some units such as byte are designated as SI units although they are not part of the standard. + + boolProperty + + + unitProperty + + + + SIUnitModifier + A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a base unit rather than a unit symbol. + + boolProperty + + + unitModifierProperty + + + + SIUnitSymbolModifier + A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a unit symbol rather than a base symbol. + + boolProperty + + + unitModifierProperty + + + + suggestedTag + A schema attribute that indicates another tag that is often associated with this tag. This attribute is used by tagging tools to provide tagging suggestions. + + nodeProperty + + + isInheritedProperty + + + + tagGroup + A schema attribute indicating the tag can only appear inside a tag group. + + boolProperty + + + nodeProperty + + + + takesValue + A schema attribute indicating the tag is a hashtag placeholder that is expected to be replaced with a user-defined value. + + boolProperty + + + nodeProperty + + + + topLevelTagGroup + A schema attribute indicating that this tag (or its descendants) can only appear in a top-level tag group. A tag group can have at most one tag with this attribute. + + boolProperty + + + nodeProperty + + + + unique + A schema attribute indicating that only one of this tag or its descendants can be used in the event-level HED string. + + boolProperty + + + nodeProperty + + + + unitClass + A schema attribute specifying which unit class this value tag belongs to. + + nodeProperty + + + + unitPrefix + A schema attribute applied specifically to unit elements to designate that the unit indicator is a prefix (e.g., dollar sign in the currency units). + + boolProperty + + + unitProperty + + + + unitSymbol + A schema attribute indicating this tag is an abbreviation or symbol representing a type of unit. Unit symbols represent both the singular and the plural and thus cannot be pluralized. + + boolProperty + + + unitProperty + + + + valueClass + A schema attribute specifying which value class this value tag belongs to. + + nodeProperty + + + + + + boolProperty + Indicates that the schema attribute represents something that is either true or false and does not have a value. Attributes without this value are assumed to have string values. + + + elementProperty + Indicates this schema attribute can apply to any type of element(tag term, unit class, etc). + + + isInheritedProperty + Indicates that this attribute is inherited by child nodes. This property only applies to schema attributes for nodes. + + + nodeProperty + Indicates this schema attribute applies to node (tag-term) elements. This was added to allow for an attribute to apply to multiple elements. + + + unitClassProperty + Indicates that the schema attribute is meant to be applied to unit classes. + + + unitModifierProperty + Indicates that the schema attribute is meant to be applied to unit modifier classes. + + + unitProperty + Indicates that the schema attribute is meant to be applied to units within a unit class. + + + valueClassProperty + Indicates that the schema attribute is meant to be applied to value classes. + + + The Standardized Computer-based Organized Reporting of EEG (SCORE) is a standard terminology for scalp EEG data assessment designed for use in clinical practice that may also be used for research purposes. +The SCORE standard defines terms for describing phenomena observed in scalp EEG data. It is also potentially applicable (with some suitable extensions) to EEG recorded in critical care and neonatal settings. +The SCORE standard received European consensus and has been endorsed by the European Chapter of the International Federation of Clinical Neurophysiology (IFCN) and the International League Against Epilepsy (ILAE) Commission on European Affairs. +A second revised and extended version of SCORE achieved international consensus. + +[1] Beniczky, Sandor, et al. "Standardized computer based organized reporting of EEG: SCORE." Epilepsia 54.6 (2013). +[2] Beniczky, Sandor, et al. "Standardized computer based organized reporting of EEG: SCORE second version." Clinical Neurophysiology 128.11 (2017). + +TPA, March 2023 + diff --git a/tests/data/schema_tests/merge_tests/HED_score_unmerged.mediawiki b/tests/data/schema_tests/merge_tests/HED_score_unmerged.mediawiki new file mode 100644 index 000000000..1936b4a31 --- /dev/null +++ b/tests/data/schema_tests/merge_tests/HED_score_unmerged.mediawiki @@ -0,0 +1,900 @@ +HED version="1.1.0" library="score" withStandard="8.2.0" unmerged="True" + +'''Prologue''' +This schema is a Hierarchical Event Descriptors (HED) Library Schema implementation of Standardized Computer-based Organized Reporting of EEG (SCORE)[1,2] for describing events occurring during neuroimaging time series recordings. +The HED-SCORE library schema allows neurologists, neurophysiologists, and brain researchers to annotate electrophysiology recordings using terms from an internationally accepted set of defined terms (SCORE) compatible with the HED framework. +The resulting annotations are understandable to clinicians and directly usable in computer analysis. + +Future extensions may be implemented in the HED-SCORE library schema. +For more information see https://hed-schema-library.readthedocs.io/en/latest/index.html. + +!# start schema + +'''Modulator''' {requireChild} [External stimuli / interventions or changes in the alertness level (sleep) that modify: the background activity, or how often a graphoelement is occurring, or change other features of the graphoelement (like intra-burst frequency). For each observed finding, there is an option of specifying how they are influenced by the modulators and procedures that were done during the recording.] +* Sleep-modulator +** Sleep-deprivation +*** # {takesValue, valueClass=textClass} [Free text.] +** Sleep-following-sleep-deprivation +*** # {takesValue, valueClass=textClass} [Free text.] +** Natural-sleep +*** # {takesValue, valueClass=textClass} [Free text.] +** Induced-sleep +*** # {takesValue, valueClass=textClass} [Free text.] +** Drowsiness +*** # {takesValue, valueClass=textClass} [Free text.] +** Awakening +*** # {takesValue, valueClass=textClass} [Free text.] +* Medication-modulator +** Medication-administered-during-recording +*** # {takesValue, valueClass=textClass} [Free text.] +** Medication-withdrawal-or-reduction-during-recording +*** # {takesValue, valueClass=textClass} [Free text.] +* Eye-modulator +** Manual-eye-closure +*** # {takesValue, valueClass=textClass} [Free text.] +** Manual-eye-opening +*** # {takesValue, valueClass=textClass} [Free text.] +* Stimulation-modulator +** Intermittent-photic-stimulation {requireChild, suggestedTag=Intermittent-photic-stimulation-effect} +*** # {takesValue, valueClass=numericClass, unitClass=frequencyUnits} +** Auditory-stimulation +*** # {takesValue, valueClass=textClass} [Free text.] +** Nociceptive-stimulation +*** # {takesValue, valueClass=textClass} [Free text.] +* Hyperventilation +** # {takesValue, valueClass=textClass} [Free text.] +* Physical-effort +** # {takesValue, valueClass=textClass} [Free text.] +* Cognitive-task +** # {takesValue, valueClass=textClass} [Free text.] +* Other-modulator-or-procedure {requireChild} +** # {takesValue, valueClass=textClass} [Free text.] + +'''Background-activity''' {requireChild} [An EEG activity representing the setting in which a given normal or abnormal pattern appears and from which such pattern is distinguished.] +* Posterior-dominant-rhythm {suggestedTag=Finding-significance-to-recording, suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude-asymmetry, suggestedTag=Posterior-dominant-rhythm-property} [Rhythmic activity occurring during wakefulness over the posterior regions of the head, generally with maximum amplitudes over the occipital areas. Amplitude varies. Best seen with eyes closed and during physical relaxation and relative mental inactivity. Blocked or attenuated by attention, especially visual, and mental effort. In adults this is the alpha rhythm, and the frequency is 8 to 13 Hz. However the frequency can be higher or lower than this range (often a supra or sub harmonic of alpha frequency) and is called alpha variant rhythm (fast and slow alpha variant rhythm). In children, the normal range of the frequency of the posterior dominant rhythm is age-dependant.] +* Mu-rhythm {suggestedTag=Finding-frequency, suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors} [EEG rhythm at 7-11 Hz composed of arch-shaped waves occurring over the central or centro-parietal regions of the scalp during wakefulness. Amplitudes varies but is mostly below 50 microV. Blocked or attenuated most clearly by contralateral movement, thought of movement, readiness to move or tactile stimulation.] +* Other-organized-rhythm {requireChild, suggestedTag=Rhythmic-activity-morphology, suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [EEG activity that consisting of waves of approximately constant period, which is considered as part of the background (ongoing) activity, but does not fulfill the criteria of the posterior dominant rhythm.] +** # {takesValue, valueClass=textClass} [Free text.] +* Background-activity-special-feature {requireChild} [Special Features. Special features contains scoring options for the background activity of critically ill patients.] +** Continuous-background-activity {suggestedTag=Rhythmic-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent} +** Nearly-continuous-background-activity {suggestedTag=Rhythmic-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent} +** Discontinuous-background-activity {suggestedTag=Rhythmic-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent} +** Background-burst-suppression {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent} [EEG pattern consisting of bursts (activity appearing and disappearing abruptly) interrupted by periods of low amplitude (below 20 microV) and which occurs simultaneously over all head regions.] +** Background-burst-attenuation {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent} +** Background-activity-suppression {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-extent, suggestedTag=Appearance-mode} [Periods showing activity under 10 microV (referential montage) and interrupting the background (ongoing) activity.] +** Electrocerebral-inactivity [Absence of any ongoing cortical electric activities; in all leads EEG is isoelectric or only contains artifacts. Sensitivity has to be increased up to 2 microV/mm; recording time: at least 30 minutes.] + +'''Sleep-and-drowsiness''' {requireChild} [The features of the ongoing activity during sleep are scored here. If abnormal graphoelements appear, disappear or change their morphology during sleep, that is not scored here but at the entry corresponding to that graphooelement (as a modulator).] +* Sleep-architecture {suggestedTag=Property-not-possible-to-determine} [For longer recordings. Only to be scored if whole-night sleep is part of the recording. It is a global descriptor of the structure and pattern of sleep: estimation of the amount of time spent in REM and NREM sleep, sleep duration, NREM-REM cycle.] +** Normal-sleep-architecture +** Abnormal-sleep-architecture +* Sleep-stage-reached {requireChild, suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-significance-to-recording} [For normal sleep patterns the sleep stages reached during the recording can be specified] +** Sleep-stage-N1 [Sleep stage 1.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Sleep-stage-N2 [Sleep stage 2.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Sleep-stage-N3 [Sleep stage 3.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Sleep-stage-REM [Rapid eye movement.] +*** # {takesValue, valueClass=textClass} [Free text.] +* Sleep-spindles {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry} [Burst at 11-15 Hz but mostly at 12-14 Hz generally diffuse but of higher voltage over the central regions of the head, occurring during sleep. Amplitude varies but is mostly below 50 microV in the adult.] +* Arousal-pattern {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Arousal pattern in children. Prolonged, marked high voltage 4-6/s activity in all leads with some intermixed slower frequencies, in children.] +* Frontal-arousal-rhythm {suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Prolonged (up to 20s) rhythmical sharp or spiky activity over the frontal areas (maximum over the frontal midline) seen at arousal from sleep in children with minimal cerebral dysfunction.] +* Vertex-wave {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry} [Sharp potential, maximal at the vertex, negative relative to other areas, apparently occurring spontaneously during sleep or in response to a sensory stimulus during sleep or wakefulness. May be single or repetitive. Amplitude varies but rarely exceeds 250 microV. Abbreviation: V wave. Synonym: vertex sharp wave.] +* K-complex {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry} [A burst of somewhat variable appearance, consisting most commonly of a high voltage negative slow wave followed by a smaller positive slow wave frequently associated with a sleep spindle. Duration greater than 0.5 s. Amplitude is generally maximal in the frontal vertex. K complexes occur during nonREM sleep, apparently spontaneously, or in response to sudden sensory / auditory stimuli, and are not specific for any individual sensory modality.] +* Saw-tooth-waves {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry} [Vertex negative 2-5 Hz waves occuring in series during REM sleep] +* POSTS {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry} [Positive occipital sharp transients of sleep. Sharp transient maximal over the occipital regions, positive relative to other areas, apparently occurring spontaneously during sleep. May be single or repetitive. Amplitude varies but is generally bellow 50 microV.] +* Hypnagogic-hypersynchrony {suggestedTag=Finding-significance-to-recording, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-amplitude-asymmetry} [Bursts of bilateral, synchronous delta or theta activity of large amplitude, occasionally with superimposed faster components, occurring during falling asleep or during awakening, in children.] +* Non-reactive-sleep [EEG activity consisting of normal sleep graphoelements, but which cannot be interrupted by external stimuli/ the patient cannot be waken.] + +'''Interictal-finding''' {requireChild} [EEG pattern / transient that is distinguished form the background activity, considered abnormal, but is not recorded during ictal period (seizure) or postictal period; the presence of an interictal finding does not necessarily imply that the patient has epilepsy.] +* Epileptiform-interictal-activity {suggestedTag=Spike-morphology, suggestedTag=Spike-and-slow-wave-morphology, suggestedTag=Runs-of-rapid-spikes-morphology, suggestedTag=Polyspikes-morphology, suggestedTag=Polyspike-and-slow-wave-morphology, suggestedTag=Sharp-wave-morphology, suggestedTag=Sharp-and-slow-wave-morphology, suggestedTag=Slow-sharp-wave-morphology, suggestedTag=High-frequency-oscillation-morphology, suggestedTag=Hypsarrhythmia-classic-morphology, suggestedTag=Hypsarrhythmia-modified-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-propagation, suggestedTag=Multifocal-finding, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, suggestedTag=Finding-incidence} +* Abnormal-interictal-rhythmic-activity {suggestedTag=Rhythmic-activity-morphology, suggestedTag=Polymorphic-delta-activity-morphology, suggestedTag=Frontal-intermittent-rhythmic-delta-activity-morphology, suggestedTag=Occipital-intermittent-rhythmic-delta-activity-morphology, suggestedTag=Temporal-intermittent-rhythmic-delta-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern, suggestedTag=Finding-incidence} +* Interictal-special-patterns {requireChild} +** Interictal-periodic-discharges {suggestedTag=Periodic-discharge-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Periodic-discharge-time-related-features} [Periodic discharge not further specified (PDs).] +*** Generalized-periodic-discharges [GPDs.] +*** Lateralized-periodic-discharges [LPDs.] +*** Bilateral-independent-periodic-discharges [BIPDs.] +*** Multifocal-periodic-discharges [MfPDs.] +** Extreme-delta-brush {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} + +'''Critically-ill-patients-patterns''' {requireChild} [Rhythmic or periodic patterns in critically ill patients (RPPs) are scored according to the 2012 version of the American Clinical Neurophysiology Society Standardized Critical Care EEG Terminology (Hirsch et al., 2013).] +* Critically-ill-patients-periodic-discharges {suggestedTag=Periodic-discharge-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-frequency, suggestedTag=Periodic-discharge-time-related-features} [Periodic discharges (PDs).] +* Rhythmic-delta-activity {suggestedTag=Periodic-discharge-superimposed-activity, suggestedTag=Periodic-discharge-absolute-amplitude, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Finding-frequency, suggestedTag=Periodic-discharge-time-related-features} [RDA] +* Spike-or-sharp-and-wave {suggestedTag=Periodic-discharge-sharpness, suggestedTag=Number-of-periodic-discharge-phases, suggestedTag=Periodic-discharge-triphasic-morphology, suggestedTag=Periodic-discharge-absolute-amplitude, suggestedTag=Periodic-discharge-relative-amplitude, suggestedTag=Periodic-discharge-polarity, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Finding-frequency, suggestedTag=Periodic-discharge-time-related-features} [SW] + +'''Episode''' {requireChild} [Clinical episode or electrographic seizure.] +* Epileptic-seizure {requireChild} [The ILAE presented a revised seizure classification that divides seizures into focal, generalized onset, or unknown onset.] +** Focal-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Automatism-motor-seizure, suggestedTag=Atonic-motor-seizure, suggestedTag=Clonic-motor-seizure, suggestedTag=Epileptic-spasm-episode, suggestedTag=Hyperkinetic-motor-seizure, suggestedTag=Myoclonic-motor-seizure, suggestedTag=Tonic-motor-seizure, suggestedTag=Autonomic-nonmotor-seizure, suggestedTag=Behavior-arrest-nonmotor-seizure, suggestedTag=Cognitive-nonmotor-seizure, suggestedTag=Emotional-nonmotor-seizure, suggestedTag=Sensory-nonmotor-seizure, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Focal seizures can be divided into focal aware and impaired awareness seizures, with additional motor and nonmotor classifications.] +*** Aware-focal-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} +*** Impaired-awareness-focal-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} +*** Awareness-unknown-focal-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} +*** Focal-to-bilateral-tonic-clonic-focal-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [A seizure type with focal onset, with awareness or impaired awareness, either motor or non-motor, progressing to bilateral tonic clonic activity. The prior term was seizure with partial onset with secondary generalization. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +** Generalized-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Tonic-clonic-motor-seizure, suggestedTag=Clonic-motor-seizure, suggestedTag=Tonic-motor-seizure, suggestedTag=Myoclonic-motor-seizure, suggestedTag=Myoclonic-tonic-clonic-motor-seizure, suggestedTag=Myoclonic-atonic-motor-seizure, suggestedTag=Atonic-motor-seizure, suggestedTag=Epileptic-spasm-episode, suggestedTag=Typical-absence-seizure, suggestedTag=Atypical-absence-seizure, suggestedTag=Myoclonic-absence-seizure, suggestedTag=Eyelid-myoclonia-absence-seizure, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Generalized-onset seizures are classified as motor or nonmotor (absence), without using awareness level as a classifier, as most but not all of these seizures are linked with impaired awareness.] +** Unknown-onset-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Tonic-clonic-motor-seizure, suggestedTag=Epileptic-spasm-episode, suggestedTag=Behavior-arrest-nonmotor-seizure, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Even if the onset of seizures is unknown, they may exhibit characteristics that fall into categories such as motor, nonmotor, tonic-clonic, epileptic spasms, or behavior arrest.] +** Unclassified-epileptic-seizure {suggestedTag=Episode-phase, suggestedTag=Seizure-dynamics, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Referring to a seizure type that cannot be described by the ILAE 2017 classification either because of inadequate information or unusual clinical features.] +* Subtle-seizure {suggestedTag=Episode-phase, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Seizure type frequent in neonates, sometimes referred to as motor automatisms; they may include random and roving eye movements, sucking, chewing motions, tongue protrusion, rowing or swimming or boxing movements of the arms, pedaling and bicycling movements of the lower limbs; apneic seizures are relatively common. Although some subtle seizures are associated with rhythmic ictal EEG discharges, and are clearly epileptic, ictal EEG often does not show typical epileptic activity.] +* Electrographic-seizure {suggestedTag=Episode-phase, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Referred usually to non convulsive status. Ictal EEG: rhythmic discharge or spike and wave pattern with definite evolution in frequency, location, or morphology lasting at least 10 s; evolution in amplitude alone did not qualify.] +* Seizure-PNES {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Psychogenic non-epileptic seizure.] +* Sleep-related-episode {requireChild} +** Sleep-related-arousal {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Normal.] +** Benign-sleep-myoclonus {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [A distinctive disorder of sleep characterized by a) neonatal onset, b) rhythmic myoclonic jerks only during sleep and c) abrupt and consistent cessation with arousal, d) absence of concomitant electrographic changes suggestive of seizures, and e) good outcome.] +** Confusional-awakening {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Episode of non epileptic nature included in NREM parasomnias, characterized by sudden arousal and complex behavior but without full alertness, usually lasting a few minutes and occurring almost in all children at least occasionally. Amnesia of the episode is the rule.] +** Sleep-periodic-limb-movement {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [PLMS. Periodic limb movement in sleep. Episodes are characterized by brief (0.5- to 5.0-second) lower-extremity movements during sleep, which typically occur at 20- to 40-second intervals, most commonly during the first 3 hours of sleep. The affected individual is usually not aware of the movements or of the transient partial arousals.] +** REM-sleep-behavioral-disorder {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [REM sleep behavioral disorder. Episodes characterized by: a) presence of REM sleep without atonia (RSWA) on polysomnography (PSG); b) presence of at least 1 of the following conditions - (1) Sleep-related behaviors, by history, that have been injurious, potentially injurious, or disruptive (example: dream enactment behavior); (2) abnormal REM sleep behavior documented during PSG monitoring; (3) absence of epileptiform activity on electroencephalogram (EEG) during REM sleep (unless RBD can be clearly distinguished from any concurrent REM sleep-related seizure disorder); (4) sleep disorder not better explained by another sleep disorder, a medical or neurologic disorder, a mental disorder, medication use, or a substance use disorder.] +** Sleep-walking {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Episodes characterized by ambulation during sleep; the patient is difficult to arouse during an episode, and is usually amnesic following the episode. Episodes usually occur in the first third of the night during slow wave sleep. Polysomnographic recordings demonstrate 2 abnormalities during the first sleep cycle: frequent, brief, non-behavioral EEG-defined arousals prior to the somnambulistic episode and abnormally low gamma (0.75-2.0 Hz) EEG power on spectral analysis, correlating with high-voltage (hyper-synchronic gamma) waves lasting 10 to 15 s occurring just prior to the movement. This is followed by stage I NREM sleep, and there is no evidence of complete awakening.] +* Pediatric-episode {requireChild} +** Hyperekplexia {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Disorder characterized by exaggerated startle response and hypertonicity that may occur during the first year of life and in severe cases during the neonatal period. Children usually present with marked irritability and recurrent startles in response to handling and sounds. Severely affected infants can have severe jerks and stiffening, sometimes with breath-holding spells.] +** Jactatio-capitis-nocturna {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Relatively common in normal children at the time of going to bed, especially during the first year of life, the rhythmic head movements persist during sleep. Usually, these phenomena disappear before 3 years of age.] +** Pavor-nocturnus {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [A nocturnal episode characterized by age of onset of less than five years (mean age 18 months, with peak prevalence at five to seven years), appearance of signs of panic two hours after falling asleep with crying, screams, a fearful expression, inability to recognize other people including parents (for a duration of 5-15 minutes), amnesia upon awakening. Pavor nocturnus occurs in patients almost every night for months or years (but the frequency is highly variable and may be as low as once a month) and is likely to disappear spontaneously at the age of six to eight years.] +** Pediatric-stereotypical-behavior-episode {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Repetitive motor behavior in children, typically rhythmic and persistent; usually not paroxysmal and rarely suggest epilepsy. They include headbanging, head-rolling, jactatio capitis nocturna, body rocking, buccal or lingual movements, hand flapping and related mannerisms, repetitive hand-waving (to self-induce photosensitive seizures).] +* Paroxysmal-motor-event {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Paroxysmal phenomena during neonatal or childhood periods characterized by recurrent motor or behavioral signs or symptoms that must be distinguishes from epileptic disorders.] +* Syncope {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [Episode with loss of consciousness and muscle tone that is abrupt in onset, of short duration and followed by rapid recovery; it occurs in response to transient impairment of cerebral perfusion. Typical prodromal symptoms often herald onset of syncope and postictal symptoms are minimal. Syncopal convulsions resulting from cerebral anoxia are common but are not a form of epilepsy, nor are there any accompanying EEG ictal discharges.] +* Cataplexy {suggestedTag=Episode-phase, suggestedTag=Finding-significance-to-recording, suggestedTag=Episode-consciousness, suggestedTag=Episode-awareness, suggestedTag=Clinical-EEG-temporal-relationship, suggestedTag=Episode-event-count, suggestedTag=State-episode-start, suggestedTag=Episode-postictal-phase, suggestedTag=Episode-prodrome, suggestedTag=Episode-tongue-biting} [A sudden decrement in muscle tone and loss of deep tendon reflexes, leading to muscle weakness, paralysis, or postural collapse. Cataplexy usually is precipitated by an outburst of emotional expression-notably laughter, anger, or startle. It is one of the tetrad of symptoms of narcolepsy. During cataplexy, respiration and voluntary eye movements are not compromised. Consciousness is preserved.] +* Other-episode {requireChild} +** # {takesValue, valueClass=textClass} [Free text.] + +'''Physiologic-pattern''' {requireChild} [EEG graphoelements or rhythms that are considered normal. They only should be scored if the physician considers that they have a specific clinical significance for the recording.] +* Rhythmic-activity-pattern {suggestedTag=Rhythmic-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Not further specified.] +* Slow-alpha-variant-rhythm {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Characteristic rhythms mostly at 4-5 Hz, recorded most prominently over the posterior regions of the head. Generally alternate, or are intermixed, with alpha rhythm to which they often are harmonically related. Amplitude varies but is frequently close to 50 micro V. Blocked or attenuated by attention, especially visual, and mental effort. Comment: slow alpha variant rhythms should be distinguished from posterior slow waves characteristic of children and adolescents and occasionally seen in young adults.] +* Fast-alpha-variant-rhythm {suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Characteristic rhythm at 14-20 Hz, detected most prominently over the posterior regions of the head. May alternate or be intermixed with alpha rhythm. Blocked or attenuated by attention, especially visual, and mental effort.] +* Ciganek-rhythm {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Midline theta rhythm (Ciganek rhythm) may be observed during wakefulness or drowsiness. The frequency is 4-7 Hz, and the location is midline (ie, vertex). The morphology is rhythmic, smooth, sinusoidal, arciform, spiky, or mu-like.] +* Lambda-wave {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Diphasic sharp transient occurring over occipital regions of the head of waking subjects during visual exploration. The main component is positive relative to other areas. Time-locked to saccadic eye movement. Amplitude varies but is generally below 50 micro V.] +* Posterior-slow-waves-youth {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Waves in the delta and theta range, of variable form, lasting 0.35 to 0.5 s or longer without any consistent periodicity, found in the range of 6-12 years (occasionally seen in young adults). Alpha waves are almost always intermingled or superimposed. Reactive similar to alpha activity.] +* Diffuse-slowing-hyperventilation {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Diffuse slowing induced by hyperventilation. Bilateral, diffuse slowing during hyperventilation. Recorded in 70 percent of normal children (3-5 years) and less then 10 percent of adults. Usually appear in the posterior regions and spread forward in younger age group, whereas they tend to appear in the frontal regions and spread backward in the older age group.] +* Photic-driving {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Physiologic response consisting of rhythmic activity elicited over the posterior regions of the head by repetitive photic stimulation at frequencies of about 5-30 Hz. Comments: term should be limited to activity time-locked to the stimulus and of frequency identical or harmonically related to the stimulus frequency. Photic driving should be distinguished from the visual evoked potentials elicited by isolated flashes of light or flashes repeated at very low frequency.] +* Photomyogenic-response {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [A response to intermittent photic stimulation characterized by the appearance in the record of brief, repetitive muscular artifacts (spikes) over the anterior regions of the head. These often increase gradually in amplitude as stimuli are continued and cease promptly when the stimulus is withdrawn. Comment: this response is frequently associated with flutter of the eyelids and vertical oscillations of the eyeballs and sometimes with discrete jerking mostly involving the musculature of the face and head. (Preferred to synonym: photo-myoclonic response).] +* Other-physiologic-pattern {requireChild} +** # {takesValue, valueClass=textClass} [Free text.] + +'''Uncertain-significant-pattern''' {requireChild} [EEG graphoelements or rhythms that resemble abnormal patterns but that are not necessarily associated with a pathology, and the physician does not consider them abnormal in the context of the scored recording (like normal variants and patterns).] +* Sharp-transient-pattern {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} +* Wicket-spikes [Spike-like monophasic negative single waves or trains of waves occurring over the temporal regions during drowsiness that have an arcuate or mu-like appearance. These are mainly seen in older individuals and represent a benign variant that is of little clinical significance.] +* Small-sharp-spikes {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Benign epileptiform Transients of Sleep (BETS). Small sharp spikes (SSS) of very short duration and low amplitude, often followed by a small theta wave, occurring in the temporal regions during drowsiness and light sleep. They occur on one or both sides (often asynchronously). The main negative and positive components are of about equally spiky character. Rarely seen in children, they are seen most often in adults and the elderly. Two thirds of the patients have a history of epileptic seizures.] +* Fourteen-six-Hz-positive-burst {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Burst of arch-shaped waves at 13-17 Hz and/or 5-7-Hz but most commonly at 14 and or 6 Hz seen generally over the posterior temporal and adjacent areas of one or both sides of the head during sleep. The sharp peaks of its component waves are positive with respect to other regions. Amplitude varies but is generally below 75 micro V. Comments: (1) best demonstrated by referential recording using contralateral earlobe or other remote, reference electrodes. (2) This pattern has no established clinical significance.] +* Six-Hz-spike-slow-wave {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Spike and slow wave complexes at 4-7Hz, but mostly at 6 Hz occurring generally in brief bursts bilaterally and synchronously, symmetrically or asymmetrically, and either confined to or of larger amplitude over the posterior or anterior regions of the head. The spike has a strong positive component. Amplitude varies but is generally smaller than that of spike-and slow-wave complexes repeating at slower rates. Comment: this pattern should be distinguished from epileptiform discharges. Synonym: wave and spike phantom.] +* Rudimentary-spike-wave-complex {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Synonym: Pseudo petit mal discharge. Paroxysmal discharge that consists of generalized or nearly generalized high voltage 3 to 4/sec waves with poorly developed spike in the positive trough between the slow waves, occurring in drowsiness only. It is found only in infancy and early childhood when marked hypnagogic rhythmical theta activity is paramount in the drowsy state.] +* Slow-fused-transient {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [A posterior slow-wave preceded by a sharp-contoured potential that blends together with the ensuing slow wave, in children.] +* Needle-like-occipital-spikes-blind {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Spike discharges of a particularly fast and needle-like character develop over the occipital region in most congenitally blind children. Completely disappear during childhood or adolescence.] +* Subclinical-rhythmic-EEG-discharge-adults {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Subclinical rhythmic EEG discharge of adults (SERDA). A rhythmic pattern seen in the adult age group, mainly in the waking state or drowsiness. It consists of a mixture of frequencies, often predominant in the theta range. The onset may be fairly abrupt with widespread sharp rhythmical theta and occasionally with delta activity. As to the spatial distribution, a maximum of this discharge is usually found over the centroparietal region and especially over the vertex. It may resemble a seizure discharge but is not accompanied by any clinical signs or symptoms.] +* Rhythmic-temporal-theta-burst-drowsiness [Rhythmic temporal theta burst of drowsiness (RTTD). Characteristic burst of 4-7 Hz waves frequently notched by faster waves, occurring over the temporal regions of the head during drowsiness. Synonym: psychomotor variant pattern. Comment: this is a pattern of drowsiness that is of no clinical significance.] +* Temporal-slowing-elderly {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Focal theta and/or delta activity over the temporal regions, especially the left, in persons over the age of 60. Amplitudes are low/similar to the background activity. Comment: focal temporal theta was found in 20 percent of people between the ages of 40-59 years, and 40 percent of people between 60 and 79 years. One third of people older than 60 years had focal temporal delta activity.] +* Breach-rhythm {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Appearance-mode, suggestedTag=Discharge-pattern} [Rhythmical activity recorded over cranial bone defects. Usually it is in the 6 to 11/sec range, does not respond to movements.] +* Other-uncertain-significant-pattern {requireChild} +** # {takesValue, valueClass=textClass} [Free text.] + +'''Artifact''' {requireChild} [When relevant for the clinical interpretation, artifacts can be scored by specifying the type and the location.] +* Biological-artifact {requireChild} +** Eye-blink-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Example for EEG: Fp1/Fp2 become electropositive with eye closure because the cornea is positively charged causing a negative deflection in Fp1/Fp2. If the eye blink is unilateral, consider prosthetic eye. If it is in F8 rather than Fp2 then the electrodes are plugged in wrong.] +** Eye-movement-horizontal-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Example for EEG: There is an upward deflection in the Fp2-F8 derivation, when the eyes move to the right side. In this case F8 becomes more positive and therefore. When the eyes move to the left, F7 becomes more positive and there is an upward deflection in the Fp1-F7 derivation.] +** Eye-movement-vertical-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Example for EEG: The EEG shows positive potentials (50-100 micro V) with bi-frontal distribution, maximum at Fp1 and Fp2, when the eyeball rotated upward. The downward rotation of the eyeball was associated with the negative deflection. The time course of the deflections was similar to the time course of the eyeball movement.] +** Slow-eye-movement-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Slow, rolling eye-movements, seen during drowsiness.] +** Nystagmus-artifact {suggestedTag=Artifact-significance-to-recording} +** Chewing-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} +** Sucking-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} +** Glossokinetic-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [The tongue functions as a dipole, with the tip negative with respect to the base. The artifact produced by the tongue has a broad potential field that drops from frontal to occipital areas, although it is less steep than that produced by eye movement artifacts. The amplitude of the potentials is greater inferiorly than in parasagittal regions; the frequency is variable but usually in the delta range. Chewing and sucking can produce similar artifacts.] +** Rocking-patting-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Quasi-rhythmical artifacts in recordings from infants caused by rocking/patting.] +** Movement-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Example for EEG: Large amplitude artifact, with irregular morphology (usually resembling a slow-wave or a wave with complex morphology) seen in one or several channels, due to movement. If the causing movement is repetitive, the artifact might resemble a rhythmic EEG activity.] +** Respiration-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Respiration can produce 2 kinds of artifacts. One type is in the form of slow and rhythmic activity, synchronous with the body movements of respiration and mechanically affecting the impedance of (usually) one electrode. The other type can be slow or sharp waves that occur synchronously with inhalation or exhalation and involve those electrodes on which the patient is lying.] +** Pulse-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Example for EEG: Occurs when an EEG electrode is placed over a pulsating vessel. The pulsation can cause slow waves that may simulate EEG activity. A direct relationship exists between ECG and the pulse waves (200-300 millisecond delay after ECG equals QRS complex).] +** ECG-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Example for EEG: Far-field potential generated in the heart. The voltage and apparent surface of the artifact vary from derivation to derivation and, consequently, from montage to montage. The artifact is observed best in referential montages using earlobe electrodes A1 and A2. ECG artifact is recognized easily by its rhythmicity/regularity and coincidence with the ECG tracing.] +** Sweat-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Is a low amplitude undulating waveform that is usually greater than 2 seconds and may appear to be an unstable baseline.] +** EMG-artifact {suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Multifocal-finding, suggestedTag=Artifact-significance-to-recording} [Myogenic potentials are the most common artifacts. Frontalis and temporalis muscles (ex..: clenching of jaw muscles) are common causes. Generally, the potentials generated in the muscles are of shorter duration than those generated in the brain. The frequency components are usually beyond 30-50 Hz, and the bursts are arrhythmic.] +* Non-biological-artifact {requireChild} +** Power-supply-artifact {suggestedTag=Artifact-significance-to-recording} [50-60 Hz artifact. Monomorphic waveform due to 50 or 60 Hz A/C power supply.] +** Induction-artifact {suggestedTag=Artifact-significance-to-recording} [Artifacts (usually of high frequency) induced by nearby equipment (like in the intensive care unit).] +** Dialysis-artifact {suggestedTag=Artifact-significance-to-recording} +** Artificial-ventilation-artifact {suggestedTag=Artifact-significance-to-recording} +** Electrode-pops-artifact {suggestedTag=Artifact-significance-to-recording} [Are brief discharges with a very steep upslope and shallow fall that occur in all leads which include that electrode.] +** Salt-bridge-artifact {suggestedTag=Artifact-significance-to-recording} [Typically occurs in 1 channel which may appear isoelectric. Only seen in bipolar montage.] +* Other-artifact {requireChild, suggestedTag=Artifact-significance-to-recording} +** # {takesValue, valueClass=textClass} [Free text.] + +'''Polygraphic-channel-finding''' {requireChild} [Changes observed in polygraphic channels can be scored: EOG, Respiration, ECG, EMG, other polygraphic channel (+ free text), and their significance logged (normal, abnormal, no definite abnormality).] +* EOG-channel-finding {suggestedTag=Finding-significance-to-recording} [ElectroOculoGraphy.] +** # {takesValue, valueClass=textClass} [Free text.] +* Respiration-channel-finding {suggestedTag=Finding-significance-to-recording} +** Respiration-oxygen-saturation +*** # {takesValue, valueClass=numericClass} +** Respiration-feature +*** Apnoe-respiration [Add duration (range in seconds) and comments in free text.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Hypopnea-respiration [Add duration (range in seconds) and comments in free text] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Apnea-hypopnea-index-respiration {requireChild} [Events/h. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Periodic-respiration +**** # {takesValue, valueClass=textClass} [Free text.] +*** Tachypnea-respiration {requireChild} [Cycles/min. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Other-respiration-feature {requireChild} +**** # {takesValue, valueClass=textClass} [Free text.] +* ECG-channel-finding {suggestedTag=Finding-significance-to-recording} [Electrocardiography.] +** ECG-QT-period +*** # {takesValue, valueClass=textClass} [Free text.] +** ECG-feature +*** ECG-sinus-rhythm [Normal rhythm. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] +**** # {takesValue, valueClass=textClass} [Free text.] +*** ECG-arrhythmia +**** # {takesValue, valueClass=textClass} [Free text.] +*** ECG-asystolia [Add duration (range in seconds) and comments in free text.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** ECG-bradycardia [Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] +**** # {takesValue, valueClass=textClass} [Free text.] +*** ECG-extrasystole +**** # {takesValue, valueClass=textClass} [Free text.] +*** ECG-ventricular-premature-depolarization [Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] +**** # {takesValue, valueClass=textClass} [Free text.] +*** ECG-tachycardia [Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Other-ECG-feature {requireChild} +**** # {takesValue, valueClass=textClass} [Free text.] +* EMG-channel-finding {suggestedTag=Finding-significance-to-recording} [electromyography] +** EMG-muscle-side +*** EMG-left-muscle +**** # {takesValue, valueClass=textClass} [Free text.] +*** EMG-right-muscle +**** # {takesValue, valueClass=textClass} [Free text.] +*** EMG-bilateral-muscle +**** # {takesValue, valueClass=textClass} [Free text.] +** EMG-muscle-name +*** # {takesValue, valueClass=textClass} [Free text.] +** EMG-feature +*** EMG-myoclonus +**** Negative-myoclonus +***** # {takesValue, valueClass=textClass} [Free text.] +**** EMG-myoclonus-rhythmic +***** # {takesValue, valueClass=textClass} [Free text.] +**** EMG-myoclonus-arrhythmic +***** # {takesValue, valueClass=textClass} [Free text.] +**** EMG-myoclonus-synchronous +***** # {takesValue, valueClass=textClass} [Free text.] +**** EMG-myoclonus-asynchronous +***** # {takesValue, valueClass=textClass} [Free text.] +*** EMG-PLMS [Periodic limb movements in sleep.] +*** EMG-spasm +**** # {takesValue, valueClass=textClass} [Free text.] +*** EMG-tonic-contraction +**** # {takesValue, valueClass=textClass} [Free text.] +*** EMG-asymmetric-activation {requireChild} +**** EMG-asymmetric-activation-left-first +***** # {takesValue, valueClass=textClass} [Free text.] +**** EMG-asymmetric-activation-right-first +***** # {takesValue, valueClass=textClass} [Free text.] +*** Other-EMG-features {requireChild} +**** # {takesValue, valueClass=textClass} [Free text.] +* Other-polygraphic-channel {requireChild} +** # {takesValue, valueClass=textClass} [Free text.] + +'''Finding-property''' {requireChild} [Descriptive element similar to main HED /Property. Something that pertains to a thing. A characteristic of some entity. A quality or feature regarded as a characteristic or inherent part of someone or something. HED attributes are adjectives or adverbs.] +* Signal-morphology-property {requireChild} +** Rhythmic-activity-morphology [EEG activity consisting of a sequence of waves approximately constant period.] +*** Delta-activity-morphology {suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude} [EEG rhythm in the delta (under 4 Hz) range that does not belong to the posterior dominant rhythm (scored under other organized rhythms).] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Theta-activity-morphology {suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude} [EEG rhythm in the theta (4-8 Hz) range that does not belong to the posterior dominant rhythm (scored under other organized rhythm).] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Alpha-activity-morphology {suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude} [EEG rhythm in the alpha range (8-13 Hz) which is considered part of the background (ongoing) activity but does not fulfill the criteria of the posterior dominant rhythm (alpha rhythm).] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Beta-activity-morphology {suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude} [EEG rhythm between 14 and 40 Hz, which is considered part of the background (ongoing) activity but does not fulfill the criteria of the posterior dominant rhythm. Most characteristically: a rhythm from 14 to 40 Hz recorded over the fronto-central regions of the head during wakefulness. Amplitude of the beta rhythm varies but is mostly below 30 microV. Other beta rhythms are most prominent in other locations or are diffuse.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Gamma-activity-morphology {suggestedTag=Finding-frequency, suggestedTag=Finding-amplitude} +**** # {takesValue, valueClass=textClass} [Free text.] +** Spike-morphology [A transient, clearly distinguished from background activity, with pointed peak at a conventional paper speed or time scale and duration from 20 to under 70 ms, i.e. 1/50-1/15 s approximately. Main component is generally negative relative to other areas. Amplitude varies.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Spike-and-slow-wave-morphology [A pattern consisting of a spike followed by a slow wave.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Runs-of-rapid-spikes-morphology [Bursts of spike discharges at a rate from 10 to 25/sec (in most cases somewhat irregular). The bursts last more than 2 seconds (usually 2 to 10 seconds) and it is typically seen in sleep. Synonyms: rhythmic spikes, generalized paroxysmal fast activity, fast paroxysmal rhythms, grand mal discharge, fast beta activity.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Polyspikes-morphology [Two or more consecutive spikes.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Polyspike-and-slow-wave-morphology [Two or more consecutive spikes associated with one or more slow waves.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Sharp-wave-morphology [A transient clearly distinguished from background activity, with pointed peak at a conventional paper speed or time scale, and duration of 70-200 ms, i.e. over 1/4-1/5 s approximately. Main component is generally negative relative to other areas. Amplitude varies.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Sharp-and-slow-wave-morphology [A sequence of a sharp wave and a slow wave.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Slow-sharp-wave-morphology [A transient that bears all the characteristics of a sharp-wave, but exceeds 200 ms. Synonym: blunted sharp wave.] +*** # {takesValue, valueClass=textClass} [Free text.] +** High-frequency-oscillation-morphology [HFO.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Hypsarrhythmia-classic-morphology [Abnormal interictal high amplitude waves and a background of irregular spikes.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Hypsarrhythmia-modified-morphology +*** # {takesValue, valueClass=textClass} [Free text.] +** Fast-spike-activity-morphology [A burst consisting of a sequence of spikes. Duration greater than 1 s. Frequency at least in the alpha range.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Low-voltage-fast-activity-morphology [Refers to the fast, and often recruiting activity which can be recorded at the onset of an ictal discharge, particularly in invasive EEG recording of a seizure.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Polysharp-waves-morphology [A sequence of two or more sharp-waves.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Slow-wave-large-amplitude-morphology +*** # {takesValue, valueClass=textClass} [Free text.] +** Irregular-delta-or-theta-activity-morphology [EEG activity consisting of repetitive waves of inconsistent wave-duration but in delta and/or theta rang (greater than 125 ms).] +*** # {takesValue, valueClass=textClass} [Free text.] +** Electrodecremental-change-morphology [Sudden desynchronization of electrical activity.] +*** # {takesValue, valueClass=textClass} [Free text.] +** DC-shift-morphology [Shift of negative polarity of the direct current recordings, during seizures.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Disappearance-of-ongoing-activity-morphology [Disappearance of the EEG activity that preceded the ictal event but still remnants of background activity (thus not enough to name it electrodecremental change).] +*** # {takesValue, valueClass=textClass} [Free text.] +** Polymorphic-delta-activity-morphology [EEG activity consisting of waves in the delta range (over 250 ms duration for each wave) but of different morphology.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Frontal-intermittent-rhythmic-delta-activity-morphology [Frontal intermittent rhythmic delta activity (FIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at 1.5-2.5 Hz over the frontal areas of one or both sides of the head. Comment: most commonly associated with unspecified encephalopathy, in adults.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Occipital-intermittent-rhythmic-delta-activity-morphology [Occipital intermittent rhythmic delta activity (OIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at 2-3 Hz over the occipital or posterior head regions of one or both sides of the head. Frequently blocked or attenuated by opening the eyes. Comment: most commonly associated with unspecified encephalopathy, in children.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Temporal-intermittent-rhythmic-delta-activity-morphology [Temporal intermittent rhythmic delta activity (TIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at over the temporal areas of one side of the head. Comment: most commonly associated with temporal lobe epilepsy.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Periodic-discharge-morphology {requireChild} [Periodic discharges not further specified (PDs).] +*** Periodic-discharge-superimposed-activity {requireChild, suggestedTag=Property-not-possible-to-determine} +**** Periodic-discharge-fast-superimposed-activity {suggestedTag=Finding-frequency} +***** # {takesValue, valueClass=textClass} [Free text.] +**** Periodic-discharge-rhythmic-superimposed-activity {suggestedTag=Finding-frequency} +***** # {takesValue, valueClass=textClass} [Free text.] +*** Periodic-discharge-sharpness {requireChild, suggestedTag=Property-not-possible-to-determine} +**** Spiky-periodic-discharge-sharpness +***** # {takesValue, valueClass=textClass} [Free text.] +**** Sharp-periodic-discharge-sharpness +***** # {takesValue, valueClass=textClass} [Free text.] +**** Sharply-contoured-periodic-discharge-sharpness +***** # {takesValue, valueClass=textClass} [Free text.] +**** Blunt-periodic-discharge-sharpness +***** # {takesValue, valueClass=textClass} [Free text.] +*** Number-of-periodic-discharge-phases {requireChild, suggestedTag=Property-not-possible-to-determine} +**** 1-periodic-discharge-phase +***** # {takesValue, valueClass=textClass} [Free text.] +**** 2-periodic-discharge-phases +***** # {takesValue, valueClass=textClass} [Free text.] +**** 3-periodic-discharge-phases +***** # {takesValue, valueClass=textClass} [Free text.] +**** Greater-than-3-periodic-discharge-phases +***** # {takesValue, valueClass=textClass} [Free text.] +*** Periodic-discharge-triphasic-morphology {suggestedTag=Property-not-possible-to-determine, suggestedTag=Property-exists, suggestedTag=Property-absence} +**** # {takesValue, valueClass=textClass} [Free text.] +*** Periodic-discharge-absolute-amplitude {requireChild, suggestedTag=Property-not-possible-to-determine} +**** Periodic-discharge-absolute-amplitude-very-low [Lower than 20 microV.] +***** # {takesValue, valueClass=textClass} [Free text.] +**** Low-periodic-discharge-absolute-amplitude [20 to 49 microV.] +***** # {takesValue, valueClass=textClass} [Free text.] +**** Medium-periodic-discharge-absolute-amplitude [50 to 199 microV.] +***** # {takesValue, valueClass=textClass} [Free text.] +**** High-periodic-discharge-absolute-amplitude [Greater than 200 microV.] +***** # {takesValue, valueClass=textClass} [Free text.] +*** Periodic-discharge-relative-amplitude {requireChild, suggestedTag=Property-not-possible-to-determine} +**** Periodic-discharge-relative-amplitude-less-than-equal-2 +***** # {takesValue, valueClass=textClass} [Free text.] +**** Periodic-discharge-relative-amplitude-greater-than-2 +***** # {takesValue, valueClass=textClass} [Free text.] +*** Periodic-discharge-polarity {requireChild} +**** Periodic-discharge-postitive-polarity +***** # {takesValue, valueClass=textClass} [Free text.] +**** Periodic-discharge-negative-polarity +***** # {takesValue, valueClass=textClass} [Free text.] +**** Periodic-discharge-unclear-polarity +***** # {takesValue, valueClass=textClass} [Free text.] +* Source-analysis-property {requireChild} [How the current in the brain reaches the electrode sensors.] +** Source-analysis-laterality {requireChild, suggestedTag=Brain-laterality} +** Source-analysis-brain-region {requireChild} +*** Source-analysis-frontal-perisylvian-superior-surface +*** Source-analysis-frontal-lateral +*** Source-analysis-frontal-mesial +*** Source-analysis-frontal-polar +*** Source-analysis-frontal-orbitofrontal +*** Source-analysis-temporal-polar +*** Source-analysis-temporal-basal +*** Source-analysis-temporal-lateral-anterior +*** Source-analysis-temporal-lateral-posterior +*** Source-analysis-temporal-perisylvian-inferior-surface +*** Source-analysis-central-lateral-convexity +*** Source-analysis-central-mesial +*** Source-analysis-central-sulcus-anterior-surface +*** Source-analysis-central-sulcus-posterior-surface +*** Source-analysis-central-opercular +*** Source-analysis-parietal-lateral-convexity +*** Source-analysis-parietal-mesial +*** Source-analysis-parietal-opercular +*** Source-analysis-occipital-lateral +*** Source-analysis-occipital-mesial +*** Source-analysis-occipital-basal +*** Source-analysis-insula +* Location-property {requireChild} [Location can be scored for findings. Semiologic finding can also be characterized by the somatotopic modifier (i.e. the part of the body where it occurs). In this respect, laterality (left, right, symmetric, asymmetric, left greater than right, right greater than left), body part (eyelid, face, arm, leg, trunk, visceral, hemi-) and centricity (axial, proximal limb, distal limb) can be scored.] +** Brain-laterality {requireChild} +*** Brain-laterality-left +**** # {takesValue, valueClass=textClass} [Free text.] +*** Brain-laterality-left-greater-right +**** # {takesValue, valueClass=textClass} [Free text.] +*** Brain-laterality-right +**** # {takesValue, valueClass=textClass} [Free text.] +*** Brain-laterality-right-greater-left +**** # {takesValue, valueClass=textClass} [Free text.] +*** Brain-laterality-midline +**** # {takesValue, valueClass=textClass} [Free text.] +*** Brain-laterality-diffuse-asynchronous +**** # {takesValue, valueClass=textClass} [Free text.] +** Brain-region {requireChild} +*** Brain-region-frontal +**** # {takesValue, valueClass=textClass} [Free text.] +*** Brain-region-temporal +**** # {takesValue, valueClass=textClass} [Free text.] +*** Brain-region-central +**** # {takesValue, valueClass=textClass} [Free text.] +*** Brain-region-parietal +**** # {takesValue, valueClass=textClass} [Free text.] +*** Brain-region-occipital +**** # {takesValue, valueClass=textClass} [Free text.] +** Body-part-location {requireChild} +*** Eyelid-location +**** # {takesValue, valueClass=textClass} [Free text.] +*** Face-location +**** # {takesValue, valueClass=textClass} [Free text.] +*** Arm-location +**** # {takesValue, valueClass=textClass} [Free text.] +*** Leg-location +**** # {takesValue, valueClass=textClass} [Free text.] +*** Trunk-location +**** # {takesValue, valueClass=textClass} [Free text.] +*** Visceral-location +**** # {takesValue, valueClass=textClass} [Free text.] +*** Hemi-location +**** # {takesValue, valueClass=textClass} [Free text.] +** Brain-centricity {requireChild} +*** Brain-centricity-axial +**** # {takesValue, valueClass=textClass} [Free text.] +*** Brain-centricity-proximal-limb +**** # {takesValue, valueClass=textClass} [Free text.] +*** Brain-centricity-distal-limb +**** # {takesValue, valueClass=textClass} [Free text.] +** Sensors {requireChild} [Lists all corresponding sensors (electrodes/channels in montage). The sensor-group is selected from a list defined in the site-settings for each EEG-lab.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Finding-propagation {suggestedTag=Property-exists, suggestedTag=Property-absence, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors} [When propagation within the graphoelement is observed, first the location of the onset region is scored. Then, the location of the propagation can be noted.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Multifocal-finding {suggestedTag=Property-not-possible-to-determine, suggestedTag=Property-exists, suggestedTag=Property-absence} [When the same interictal graphoelement is observed bilaterally and at least in three independent locations, can score them using one entry, and choosing multifocal as a descriptor of the locations of the given interictal graphoelements, optionally emphasizing the involved, and the most active sites.] +*** # {takesValue, valueClass=textClass} [Free text.] +* Modulators-property {requireChild} [For each described graphoelement, the influence of the modulators can be scored. Only modulators present in the recording are scored.] +** Modulators-reactivity {requireChild, suggestedTag=Property-exists, suggestedTag=Property-absence} [Susceptibility of individual rhythms or the EEG as a whole to change following sensory stimulation or other physiologic actions.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Eye-closure-sensitivity {suggestedTag=Property-exists, suggestedTag=Property-absence} [Eye closure sensitivity.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Eye-opening-passive {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, suggestedTag=Finding-triggered-by} [Passive eye opening. Used with base schema Increasing/Decreasing.] +** Medication-effect-EEG {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified} [Medications effect on EEG. Used with base schema Increasing/Decreasing.] +** Medication-reduction-effect-EEG {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified} [Medications reduction or withdrawal effect on EEG. Used with base schema Increasing/Decreasing.] +** Auditive-stimuli-effect {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified} [Used with base schema Increasing/Decreasing.] +** Nociceptive-stimuli-effect {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, suggestedTag=Finding-triggered-by} [Used with base schema Increasing/Decreasing.] +** Physical-effort-effect {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, suggestedTag=Finding-triggered-by} [Used with base schema Increasing/Decreasing] +** Cognitive-task-effect {suggestedTag=Property-not-possible-to-determine, suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified, suggestedTag=Finding-triggered-by} [Used with base schema Increasing/Decreasing.] +** Other-modulators-effect-EEG {requireChild} +*** # {takesValue, valueClass=textClass} [Free text.] +** Facilitating-factor [Facilitating factors are defined as transient and sporadic endogenous or exogenous elements capable of augmenting seizure incidence (increasing the likelihood of seizure occurrence).] +*** Facilitating-factor-alcohol +**** # {takesValue, valueClass=textClass} [Free text.] +*** Facilitating-factor-awake +**** # {takesValue, valueClass=textClass} [Free text.] +*** Facilitating-factor-catamenial +**** # {takesValue, valueClass=textClass} [Free text.] +*** Facilitating-factor-fever +**** # {takesValue, valueClass=textClass} [Free text.] +*** Facilitating-factor-sleep +**** # {takesValue, valueClass=textClass} [Free text.] +*** Facilitating-factor-sleep-deprived +**** # {takesValue, valueClass=textClass} [Free text.] +*** Facilitating-factor-other {requireChild} +**** # {takesValue, valueClass=textClass} [Free text.] +** Provocative-factor {requireChild} [Provocative factors are defined as transient and sporadic endogenous or exogenous elements capable of evoking/triggering seizures immediately following the exposure to it.] +*** Hyperventilation-provoked +**** # {takesValue, valueClass=textClass} [Free text.] +*** Reflex-provoked +**** # {takesValue, valueClass=textClass} [Free text.] +** Medication-effect-clinical {suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified} [Medications clinical effect. Used with base schema Increasing/Decreasing.] +** Medication-reduction-effect-clinical {suggestedTag=Finding-stopped-by, suggestedTag=Finding-unmodified} [Medications reduction or withdrawal clinical effect. Used with base schema Increasing/Decreasing.] +** Other-modulators-effect-clinical {requireChild} +*** # {takesValue, valueClass=textClass} [Free text.] +** Intermittent-photic-stimulation-effect {requireChild} +*** Posterior-stimulus-dependent-intermittent-photic-stimulation-response {suggestedTag=Finding-frequency} +**** # {takesValue, valueClass=textClass} [Free text.] +*** Posterior-stimulus-independent-intermittent-photic-stimulation-response-limited {suggestedTag=Finding-frequency} [limited to the stimulus-train] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Posterior-stimulus-independent-intermittent-photic-stimulation-response-self-sustained {suggestedTag=Finding-frequency} +**** # {takesValue, valueClass=textClass} [Free text.] +*** Generalized-photoparoxysmal-intermittent-photic-stimulation-response-limited {suggestedTag=Finding-frequency} [Limited to the stimulus-train.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Generalized-photoparoxysmal-intermittent-photic-stimulation-response-self-sustained {suggestedTag=Finding-frequency} +**** # {takesValue, valueClass=textClass} [Free text.] +*** Activation-of-pre-existing-epileptogenic-area-intermittent-photic-stimulation-effect {suggestedTag=Finding-frequency} +**** # {takesValue, valueClass=textClass} [Free text.] +*** Unmodified-intermittent-photic-stimulation-effect +**** # {takesValue, valueClass=textClass} [Free text.] +** Quality-of-hyperventilation {requireChild} +*** Hyperventilation-refused-procedure +**** # {takesValue, valueClass=textClass} [Free text.] +*** Hyperventilation-poor-effort +**** # {takesValue, valueClass=textClass} [Free text.] +*** Hyperventilation-good-effort +**** # {takesValue, valueClass=textClass} [Free text.] +*** Hyperventilation-excellent-effort +**** # {takesValue, valueClass=textClass} [Free text.] +** Modulators-effect {requireChild} [Tags for describing the influence of the modulators] +*** Modulators-effect-continuous-during-NRS [Continuous during non-rapid-eye-movement-sleep (NRS)] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Modulators-effect-only-during +**** # {takesValue, valueClass=textClass} [Only during Sleep/Awakening/Hyperventilation/Physical effort/Cognitive task. Free text.] +*** Modulators-effect-change-of-patterns [Change of patterns during sleep/awakening.] +**** # {takesValue, valueClass=textClass} [Free text.] +* Time-related-property {requireChild} [Important to estimate how often an interictal abnormality is seen in the recording.] +** Appearance-mode {requireChild, suggestedTag=Property-not-possible-to-determine} [Describes how the non-ictal EEG pattern/graphoelement is distributed through the recording.] +*** Random-appearance-mode [Occurrence of the non-ictal EEG pattern / graphoelement without any rhythmicity / periodicity.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Periodic-appearance-mode [Non-ictal EEG pattern / graphoelement occurring at an approximately regular rate / interval (generally of 1 to several seconds).] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Variable-appearance-mode [Occurrence of non-ictal EEG pattern / graphoelements, that is sometimes rhythmic or periodic, other times random, throughout the recording.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Intermittent-appearance-mode +**** # {takesValue, valueClass=textClass} [Free text.] +*** Continuous-appearance-mode +**** # {takesValue, valueClass=textClass} [Free text.] +** Discharge-pattern {requireChild} [Describes the organization of the EEG signal within the discharge (distinguish between single and repetitive discharges)] +*** Single-discharge-pattern {suggestedTag=Finding-incidence} [Applies to the intra-burst pattern: a graphoelement that is not repetitive; before and after the graphoelement one can distinguish the background activity.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Rhythmic-trains-or-bursts-discharge-pattern {suggestedTag=Finding-prevalence, suggestedTag=Finding-frequency} [Applies to the intra-burst pattern: a non-ictal graphoelement that repeats itself without returning to the background activity between them. The graphoelements within this repetition occur at approximately constant period.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Arrhythmic-trains-or-bursts-discharge-pattern {suggestedTag=Finding-prevalence} [Applies to the intra-burst pattern: a non-ictal graphoelement that repeats itself without returning to the background activity between them. The graphoelements within this repetition occur at inconstant period.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Fragmented-discharge-pattern +**** # {takesValue, valueClass=textClass} [Free text.] +** Periodic-discharge-time-related-features {requireChild} [Periodic discharges not further specified (PDs) time-relayed features tags.] +*** Periodic-discharge-duration {requireChild, suggestedTag=Property-not-possible-to-determine} +**** Very-brief-periodic-discharge-duration [Less than 10 sec.] +***** # {takesValue, valueClass=textClass} [Free text.] +**** Brief-periodic-discharge-duration [10 to 59 sec.] +***** # {takesValue, valueClass=textClass} [Free text.] +**** Intermediate-periodic-discharge-duration [1 to 4.9 min.] +***** # {takesValue, valueClass=textClass} [Free text.] +**** Long-periodic-discharge-duration [5 to 59 min.] +***** # {takesValue, valueClass=textClass} [Free text.] +**** Very-long-periodic-discharge-duration [Greater than 1 hour.] +***** # {takesValue, valueClass=textClass} [Free text.] +*** Periodic-discharge-onset {requireChild, suggestedTag=Property-not-possible-to-determine} +**** Sudden-periodic-discharge-onset +***** # {takesValue, valueClass=textClass} [Free text.] +**** Gradual-periodic-discharge-onset +***** # {takesValue, valueClass=textClass} [Free text.] +*** Periodic-discharge-dynamics {requireChild, suggestedTag=Property-not-possible-to-determine} +**** Evolving-periodic-discharge-dynamics +***** # {takesValue, valueClass=textClass} [Free text.] +**** Fluctuating-periodic-discharge-dynamics +***** # {takesValue, valueClass=textClass} [Free text.] +**** Static-periodic-discharge-dynamics +***** # {takesValue, valueClass=textClass} [Free text.] +** Finding-extent [Percentage of occurrence during the recording (background activity and interictal finding).] +*** # {takesValue, valueClass=numericClass} +** Finding-incidence {requireChild} [How often it occurs/time-epoch.] +*** Only-once-finding-incidence +**** # {takesValue, valueClass=textClass} [Free text.] +*** Rare-finding-incidence [less than 1/h] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Uncommon-finding-incidence [1/5 min to 1/h.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Occasional-finding-incidence [1/min to 1/5min.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Frequent-finding-incidence [1/10 s to 1/min.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Abundant-finding-incidence [Greater than 1/10 s).] +**** # {takesValue, valueClass=textClass} [Free text.] +** Finding-prevalence {requireChild} [The percentage of the recording covered by the train/burst.] +*** Rare-finding-prevalence [Less than 1 percent.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Occasional-finding-prevalence [1 to 9 percent.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Frequent-finding-prevalence [10 to 49 percent.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Abundant-finding-prevalence [50 to 89 percent.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Continuous-finding-prevalence [Greater than 90 percent.] +**** # {takesValue, valueClass=textClass} [Free text.] +* Posterior-dominant-rhythm-property {requireChild} [Posterior dominant rhythm is the most often scored EEG feature in clinical practice. Therefore, there are specific terms that can be chosen for characterizing the PDR.] +** Posterior-dominant-rhythm-amplitude-range {requireChild, suggestedTag=Property-not-possible-to-determine} +*** Low-posterior-dominant-rhythm-amplitude-range [Low (less than 20 microV).] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Medium-posterior-dominant-rhythm-amplitude-range [Medium (between 20 and 70 microV).] +**** # {takesValue, valueClass=textClass} [Free text.] +*** High-posterior-dominant-rhythm-amplitude-range [High (more than 70 microV).] +**** # {takesValue, valueClass=textClass} [Free text.] +** Posterior-dominant-rhythm-frequency-asymmetry {requireChild} [When symmetrical could be labeled with base schema Symmetrical tag.] +*** Posterior-dominant-rhythm-frequency-asymmetry-lower-left [Hz lower on the left side.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Posterior-dominant-rhythm-frequency-asymmetry-lower-right [Hz lower on the right side.] +**** # {takesValue, valueClass=textClass} [Free text.] +** Posterior-dominant-rhythm-eye-opening-reactivity {suggestedTag=Property-not-possible-to-determine} [Change (disappearance or measurable decrease in amplitude) of a posterior dominant rhythm following eye-opening. Eye closure has the opposite effect.] +*** Posterior-dominant-rhythm-eye-opening-reactivity-reduced-left [Reduced left side reactivity.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Posterior-dominant-rhythm-eye-opening-reactivity-reduced-right [Reduced right side reactivity.] +**** # {takesValue, valueClass=textClass} [free text] +*** Posterior-dominant-rhythm-eye-opening-reactivity-reduced-both [Reduced reactivity on both sides.] +**** # {takesValue, valueClass=textClass} [Free text.] +** Posterior-dominant-rhythm-organization {requireChild} [When normal could be labeled with base schema Normal tag.] +*** Posterior-dominant-rhythm-organization-poorly-organized [Poorly organized.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Posterior-dominant-rhythm-organization-disorganized [Disorganized.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Posterior-dominant-rhythm-organization-markedly-disorganized [Markedly disorganized.] +**** # {takesValue, valueClass=textClass} [Free text.] +** Posterior-dominant-rhythm-caveat {requireChild} [Caveat to the annotation of PDR.] +*** No-posterior-dominant-rhythm-caveat +**** # {takesValue, valueClass=textClass} [Free text.] +*** Posterior-dominant-rhythm-caveat-only-open-eyes-during-the-recording +**** # {takesValue, valueClass=textClass} [Free text.] +*** Posterior-dominant-rhythm-caveat-sleep-deprived-caveat +**** # {takesValue, valueClass=textClass} [Free text.] +*** Posterior-dominant-rhythm-caveat-drowsy +**** # {takesValue, valueClass=textClass} [Free text.] +*** Posterior-dominant-rhythm-caveat-only-following-hyperventilation +** Absence-of-posterior-dominant-rhythm {requireChild} [Reason for absence of PDR.] +*** Absence-of-posterior-dominant-rhythm-artifacts +**** # {takesValue, valueClass=textClass} [Free text.] +*** Absence-of-posterior-dominant-rhythm-extreme-low-voltage +**** # {takesValue, valueClass=textClass} [Free text.] +*** Absence-of-posterior-dominant-rhythm-eye-closure-could-not-be-achieved +**** # {takesValue, valueClass=textClass} [Free text.] +*** Absence-of-posterior-dominant-rhythm-lack-of-awake-period +**** # {takesValue, valueClass=textClass} [Free text.] +*** Absence-of-posterior-dominant-rhythm-lack-of-compliance +**** # {takesValue, valueClass=textClass} [Free text.] +*** Absence-of-posterior-dominant-rhythm-other-causes {requireChild} +**** # {takesValue, valueClass=textClass} [Free text.] +* Episode-property {requireChild} +** Seizure-classification {requireChild} [Seizure classification refers to the grouping of seizures based on their clinical features, EEG patterns, and other characteristics. Epileptic seizures are named using the current ILAE seizure classification (Fisher et al., 2017, Beniczky et al., 2017).] +*** Motor-seizure [Involves musculature in any form. The motor event could consist of an increase (positive) or decrease (negative) in muscle contraction to produce a movement. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +*** Motor-onset-seizure {deprecatedFrom=1.0.0} +**** Myoclonic-motor-seizure [Sudden, brief ( lower than 100 msec) involuntary single or multiple contraction(s) of muscles(s) or muscle groups of variable topography (axial, proximal limb, distal). Myoclonus is less regularly repetitive and less sustained than is clonus. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Myoclonic-motor-onset-seizure {deprecatedFrom=1.0.0} +**** Negative-myoclonic-motor-seizure +**** Negative-myoclonic-motor-onset-seizure {deprecatedFrom=1.0.0} +**** Clonic-motor-seizure [Jerking, either symmetric or asymmetric, that is regularly repetitive and involves the same muscle groups. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Clonic-motor-onset-seizure {deprecatedFrom=1.0.0} +**** Tonic-motor-seizure [A sustained increase in muscle contraction lasting a few seconds to minutes. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Tonic-motor-onset-seizure {deprecatedFrom=1.0.0} +**** Atonic-motor-seizure [Sudden loss or diminution of muscle tone without apparent preceding myoclonic or tonic event lasting about 1 to 2 s, involving head, trunk, jaw, or limb musculature. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Atonic-motor-onset-seizure {deprecatedFrom=1.0.0} +**** Myoclonic-atonic-motor-seizure [A generalized seizure type with a myoclonic jerk leading to an atonic motor component. This type was previously called myoclonic astatic. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Myoclonic-atonic-motor-onset-seizure {deprecatedFrom=1.0.0} +**** Myoclonic-tonic-clonic-motor-seizure [One or a few jerks of limbs bilaterally, followed by a tonic clonic seizure. The initial jerks can be considered to be either a brief period of clonus or myoclonus. Seizures with this characteristic are common in juvenile myoclonic epilepsy. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Myoclonic-tonic-clonic-motor-onset-seizure {deprecatedFrom=1.0.0} +**** Tonic-clonic-motor-seizure [A sequence consisting of a tonic followed by a clonic phase. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Tonic-clonic-motor-onset-seizure {deprecatedFrom=1.0.0} +**** Automatism-motor-seizure [A more or less coordinated motor activity usually occurring when cognition is impaired and for which the subject is usually (but not always) amnesic afterward. This often resembles a voluntary movement and may consist of an inappropriate continuation of preictal motor activity. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Automatism-motor-onset-seizure {deprecatedFrom=1.0.0} +**** Hyperkinetic-motor-seizure +**** Hyperkinetic-motor-onset-seizure {deprecatedFrom=1.0.0} +**** Epileptic-spasm-episode [A sudden flexion, extension, or mixed extension flexion of predominantly proximal and truncal muscles that is usually more sustained than a myoclonic movement but not as sustained as a tonic seizure. Limited forms may occur: Grimacing, head nodding, or subtle eye movements. Epileptic spasms frequently occur in clusters. Infantile spasms are the best known form, but spasms can occur at all ages. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +*** Nonmotor-seizure [Focal or generalized seizure types in which motor activity is not prominent. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Behavior-arrest-nonmotor-seizure [Arrest (pause) of activities, freezing, immobilization, as in behavior arrest seizure. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Sensory-nonmotor-seizure [A perceptual experience not caused by appropriate stimuli in the external world. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Emotional-nonmotor-seizure [Seizures presenting with an emotion or the appearance of having an emotion as an early prominent feature, such as fear, spontaneous joy or euphoria, laughing (gelastic), or crying (dacrystic). Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Cognitive-nonmotor-seizure [Pertaining to thinking and higher cortical functions, such as language, spatial perception, memory, and praxis. The previous term for similar usage as a seizure type was psychic. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Autonomic-nonmotor-seizure [A distinct alteration of autonomic nervous system function involving cardiovascular, pupillary, gastrointestinal, sudomotor, vasomotor, and thermoregulatory functions. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +*** Absence-seizure [Absence seizures present with a sudden cessation of activity and awareness. Absence seizures tend to occur in younger age groups, have more sudden start and termination, and they usually display less complex automatisms than do focal seizures with impaired awareness, but the distinctions are not absolute. EEG information may be required for accurate classification. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Typical-absence-seizure [A sudden onset, interruption of ongoing activities, a blank stare, possibly a brief upward deviation of the eyes. Usually the patient will be unresponsive when spoken to. Duration is a few seconds to half a minute with very rapid recovery. Although not always available, an EEG would show generalized epileptiform discharges during the event. An absence seizure is by definition a seizure of generalized onset. The word is not synonymous with a blank stare, which also can be encountered with focal onset seizures. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Atypical-absence-seizure [An absence seizure with changes in tone that are more pronounced than in typical absence or the onset and/or cessation is not abrupt, often associated with slow, irregular, generalized spike-wave activity. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Myoclonic-absence-seizure [A myoclonic absence seizure refers to an absence seizure with rhythmic three-per-second myoclonic movements, causing ratcheting abduction of the upper limbs leading to progressive arm elevation, and associated with three-per-second generalized spike-wave discharges. Duration is typically 10 to 60 s. Impairment of consciousness may not be obvious. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +**** Eyelid-myoclonia-absence-seizure [Eyelid myoclonia are myoclonic jerks of the eyelids and upward deviation of the eyes, often precipitated by closing the eyes or by light. Eyelid myoclonia can be associated with absences, but also can be motor seizures without a corresponding absence, making them difficult to categorize. The 2017 classification groups them with nonmotor (absence) seizures, which may seem counterintuitive, but the myoclonia in this instance is meant to link with absence, rather than with nonmotor. Definition from ILAE 2017 Classification of Seizure Types Expanded Version] +** Episode-phase {requireChild, suggestedTag=Seizure-semiology-manifestation, suggestedTag=Postictal-semiology-manifestation, suggestedTag=Ictal-EEG-patterns} [The electroclinical findings (i.e., the seizure semiology and the ictal EEG) are divided in three phases: onset, propagation, and postictal.] +*** Episode-phase-initial +*** Episode-phase-subsequent +*** Episode-phase-postictal +** Seizure-semiology-manifestation {requireChild} [Seizure semiology refers to the clinical features or signs that are observed during a seizure, such as the type of movements or behaviors exhibited by the person having the seizure, the duration of the seizure, the level of consciousness, and any associated symptoms such as aura or postictal confusion. In other words, seizure semiology describes the physical manifestations of a seizure. Semiology is described according to the ILAE Glossary of Descriptive Terminology for Ictal Semiology (Blume et al., 2001). Besides the name, the semiologic finding can also be characterized by the somatotopic modifier, laterality, body part and centricity. Uses Location-property tags.] +*** Semiology-motor-manifestation +**** Semiology-elementary-motor +***** Semiology-motor-tonic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [A sustained increase in muscle contraction lasting a few seconds to minutes.] +***** Semiology-motor-dystonic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Sustained contractions of both agonist and antagonist muscles producing athetoid or twisting movements, which, when prolonged, may produce abnormal postures.] +***** Semiology-motor-epileptic-spasm {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [A sudden flexion, extension, or mixed extension flexion of predominantly proximal and truncal muscles that is usually more sustained than a myoclonic movement but not so sustained as a tonic seizure (i.e., about 1 s). Limited forms may occur: grimacing, head nodding. Frequent occurrence in clusters.] +***** Semiology-motor-postural {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Adoption of a posture that may be bilaterally symmetric or asymmetric (as in a fencing posture).] +***** Semiology-motor-versive {suggestedTag=Body-part-location, suggestedTag=Episode-event-count} [A sustained, forced conjugate ocular, cephalic, and/or truncal rotation or lateral deviation from the midline.] +***** Semiology-motor-clonic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Myoclonus that is regularly repetitive, involves the same muscle groups, at a frequency of about 2 to 3 c/s, and is prolonged. Synonym: rhythmic myoclonus .] +***** Semiology-motor-myoclonic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Characterized by myoclonus. MYOCLONUS : sudden, brief (lower than 100 ms) involuntary single or multiple contraction(s) of muscles(s) or muscle groups of variable topography (axial, proximal limb, distal).] +***** Semiology-motor-jacksonian-march {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Term indicating spread of clonic movements through contiguous body parts unilaterally.] +***** Semiology-motor-negative-myoclonus {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Characterized by negative myoclonus. NEGATIVE MYOCLONUS: interruption of tonic muscular activity for lower than 500 ms without evidence of preceding myoclonia.] +***** Semiology-motor-tonic-clonic {requireChild} [A sequence consisting of a tonic followed by a clonic phase. Variants such as clonic-tonic-clonic may be seen. Asymmetry of limb posture during the tonic phase of a GTC: one arm is rigidly extended at the elbow (often with the fist clenched tightly and flexed at the wrist), whereas the opposite arm is flexed at the elbow.] +****** Semiology-motor-tonic-clonic-without-figure-of-four {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} +****** Semiology-motor-tonic-clonic-with-figure-of-four-extension-left-elbow {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} +****** Semiology-motor-tonic-clonic-with-figure-of-four-extension-right-elbow {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} +***** Semiology-motor-astatic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Loss of erect posture that results from an atonic, myoclonic, or tonic mechanism. Synonym: drop attack.] +***** Semiology-motor-atonic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Sudden loss or diminution of muscle tone without apparent preceding myoclonic or tonic event lasting greater or equal to 1 to 2 s, involving head, trunk, jaw, or limb musculature.] +***** Semiology-motor-eye-blinking {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count} +***** Semiology-motor-other-elementary-motor {requireChild} +****** # {takesValue, valueClass=textClass} [Free text.] +**** Semiology-motor-automatisms +***** Semiology-motor-automatisms-mimetic {suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count} [Facial expression suggesting an emotional state, often fear.] +***** Semiology-motor-automatisms-oroalimentary {suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count} [Lip smacking, lip pursing, chewing, licking, tooth grinding, or swallowing.] +***** Semiology-motor-automatisms-dacrystic {suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count} [Bursts of crying.] +***** Semiology-motor-automatisms-dyspraxic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count} [Inability to perform learned movements spontaneously or on command or imitation despite intact relevant motor and sensory systems and adequate comprehension and cooperation.] +***** Semiology-motor-automatisms-manual {suggestedTag=Brain-laterality, suggestedTag=Brain-centricity, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count} [1. Indicates principally distal components, bilateral or unilateral. 2. Fumbling, tapping, manipulating movements.] +***** Semiology-motor-automatisms-gestural {suggestedTag=Brain-laterality, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count} [Semipurposive, asynchronous hand movements. Often unilateral.] +***** Semiology-motor-automatisms-pedal {suggestedTag=Brain-laterality, suggestedTag=Brain-centricity, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count} [1. Indicates principally distal components, bilateral or unilateral. 2. Fumbling, tapping, manipulating movements.] +***** Semiology-motor-automatisms-hypermotor {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count} [1. Involves predominantly proximal limb or axial muscles producing irregular sequential ballistic movements, such as pedaling, pelvic thrusting, thrashing, rocking movements. 2. Increase in rate of ongoing movements or inappropriately rapid performance of a movement.] +***** Semiology-motor-automatisms-hypokinetic {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count} [A decrease in amplitude and/or rate or arrest of ongoing motor activity.] +***** Semiology-motor-automatisms-gelastic {suggestedTag=Episode-responsiveness, suggestedTag=Episode-appearance, suggestedTag=Episode-event-count} [Bursts of laughter or giggling, usually without an appropriate affective tone.] +***** Semiology-motor-other-automatisms {requireChild} +****** # {takesValue, valueClass=textClass} [Free text.] +**** Semiology-motor-behavioral-arrest {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Interruption of ongoing motor activity or of ongoing behaviors with fixed gaze, without movement of the head or trunk (oro-alimentary and hand automatisms may continue).] +*** Semiology-non-motor-manifestation +**** Semiology-sensory +***** Semiology-sensory-headache {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count} [Headache occurring in close temporal proximity to the seizure or as the sole seizure manifestation.] +***** Semiology-sensory-visual {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count} [Flashing or flickering lights, spots, simple patterns, scotomata, or amaurosis.] +***** Semiology-sensory-auditory {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count} [Buzzing, drumming sounds or single tones.] +***** Semiology-sensory-olfactory {suggestedTag=Body-part-location, suggestedTag=Episode-event-count} +***** Semiology-sensory-gustatory {suggestedTag=Episode-event-count} [Taste sensations including acidic, bitter, salty, sweet, or metallic.] +***** Semiology-sensory-epigastric {suggestedTag=Episode-event-count} [Abdominal discomfort including nausea, emptiness, tightness, churning, butterflies, malaise, pain, and hunger; sensation may rise to chest or throat. Some phenomena may reflect ictal autonomic dysfunction.] +***** Semiology-sensory-somatosensory {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Tingling, numbness, electric-shock sensation, sense of movement or desire to move.] +***** Semiology-sensory-painful {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Peripheral (lateralized/bilateral), cephalic, abdominal.] +***** Semiology-sensory-autonomic-sensation {suggestedTag=Episode-event-count} [A sensation consistent with involvement of the autonomic nervous system, including cardiovascular, gastrointestinal, sudomotor, vasomotor, and thermoregulatory functions. (Thus autonomic aura; cf. autonomic events 3.0).] +***** Semiology-sensory-other {requireChild} +****** # {takesValue, valueClass=textClass} [Free text.] +**** Semiology-experiential +***** Semiology-experiential-affective-emotional {suggestedTag=Episode-event-count} [Components include fear, depression, joy, and (rarely) anger.] +***** Semiology-experiential-hallucinatory {suggestedTag=Episode-event-count} [Composite perceptions without corresponding external stimuli involving visual, auditory, somatosensory, olfactory, and/or gustatory phenomena. Example: hearing and seeing people talking.] +***** Semiology-experiential-illusory {suggestedTag=Episode-event-count} [An alteration of actual percepts involving the visual, auditory, somatosensory, olfactory, or gustatory systems.] +***** Semiology-experiential-mnemonic [Components that reflect ictal dysmnesia such as feelings of familiarity (deja-vu) and unfamiliarity (jamais-vu).] +****** Semiology-experiential-mnemonic-Deja-vu {suggestedTag=Episode-event-count} +****** Semiology-experiential-mnemonic-Jamais-vu {suggestedTag=Episode-event-count} +***** Semiology-experiential-other {requireChild} +****** # {takesValue, valueClass=textClass} [Free text.] +**** Semiology-dyscognitive {suggestedTag=Episode-event-count} [The term describes events in which (1) disturbance of cognition is the predominant or most apparent feature, and (2a) two or more of the following components are involved, or (2b) involvement of such components remains undetermined. Otherwise, use the more specific term (e.g., mnemonic experiential seizure or hallucinatory experiential seizure). Components of cognition: ++ perception: symbolic conception of sensory information ++ attention: appropriate selection of a principal perception or task ++ emotion: appropriate affective significance of a perception ++ memory: ability to store and retrieve percepts or concepts ++ executive function: anticipation, selection, monitoring of consequences, and initiation of motor activity including praxis, speech.] +**** Semiology-language-related +***** Semiology-language-related-vocalization {suggestedTag=Episode-event-count} +***** Semiology-language-related-verbalization {suggestedTag=Episode-event-count} +***** Semiology-language-related-dysphasia {suggestedTag=Episode-event-count} +***** Semiology-language-related-aphasia {suggestedTag=Episode-event-count} +***** Semiology-language-related-other {requireChild} +****** # {takesValue, valueClass=textClass} [Free text.] +**** Semiology-autonomic +***** Semiology-autonomic-pupillary {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count} [Mydriasis, miosis (either bilateral or unilateral).] +***** Semiology-autonomic-hypersalivation {suggestedTag=Episode-event-count} [Increase in production of saliva leading to uncontrollable drooling] +***** Semiology-autonomic-respiratory-apnoeic {suggestedTag=Episode-event-count} [subjective shortness of breath, hyperventilation, stridor, coughing, choking, apnea, oxygen desaturation, neurogenic pulmonary edema.] +***** Semiology-autonomic-cardiovascular {suggestedTag=Episode-event-count} [Modifications of heart rate (tachycardia, bradycardia), cardiac arrhythmias (such as sinus arrhythmia, sinus arrest, supraventricular tachycardia, atrial premature depolarizations, ventricular premature depolarizations, atrio-ventricular block, bundle branch block, atrioventricular nodal escape rhythm, asystole).] +***** Semiology-autonomic-gastrointestinal {suggestedTag=Episode-event-count} [Nausea, eructation, vomiting, retching, abdominal sensations, abdominal pain, flatulence, spitting, diarrhea.] +***** Semiology-autonomic-urinary-incontinence {suggestedTag=Episode-event-count} [urinary urge (intense urinary urge at the beginning of seizures), urinary incontinence, ictal urination (rare symptom of partial seizures without loss of consciousness).] +***** Semiology-autonomic-genital {suggestedTag=Episode-event-count} [Sexual auras (erotic thoughts and feelings, sexual arousal and orgasm). Genital auras (unpleasant, sometimes painful, frightening or emotionally neutral somatosensory sensations in the genitals that can be accompanied by ictal orgasm). Sexual automatisms (hypermotor movements consisting of writhing, thrusting, rhythmic movements of the pelvis, arms and legs, sometimes associated with picking and rhythmic manipulation of the groin or genitalia, exhibitionism and masturbation).] +***** Semiology-autonomic-vasomotor {suggestedTag=Episode-event-count} [Flushing or pallor (may be accompanied by feelings of warmth, cold and pain).] +***** Semiology-autonomic-sudomotor {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count} [Sweating and piloerection (may be accompanied by feelings of warmth, cold and pain).] +***** Semiology-autonomic-thermoregulatory {suggestedTag=Episode-event-count} [Hyperthermia, fever.] +***** Semiology-autonomic-other {requireChild} +****** # {takesValue, valueClass=textClass} [Free text.] +*** Semiology-manifestation-other {requireChild} +**** # {takesValue, valueClass=textClass} [Free text.] +** Postictal-semiology-manifestation {requireChild} +*** Postictal-semiology-unconscious {suggestedTag=Episode-event-count} +*** Postictal-semiology-quick-recovery-of-consciousness {suggestedTag=Episode-event-count} [Quick recovery of awareness and responsiveness.] +*** Postictal-semiology-aphasia-or-dysphasia {suggestedTag=Episode-event-count} [Impaired communication involving language without dysfunction of relevant primary motor or sensory pathways, manifested as impaired comprehension, anomia, parahasic errors or a combination of these.] +*** Postictal-semiology-behavioral-change {suggestedTag=Episode-event-count} [Occurring immediately after a aseizure. Including psychosis, hypomanina, obsessive-compulsive behavior.] +*** Postictal-semiology-hemianopia {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count} [Postictal visual loss in a a hemi field.] +*** Postictal-semiology-impaired-cognition {suggestedTag=Episode-event-count} [Decreased Cognitive performance involving one or more of perception, attention, emotion, memory, execution, praxis, speech.] +*** Postictal-semiology-dysphoria {suggestedTag=Episode-event-count} [Depression, irritability, euphoric mood, fear, anxiety.] +*** Postictal-semiology-headache {suggestedTag=Episode-event-count} [Headache with features of tension-type or migraine headache that develops within 3 h following the seizure and resolves within 72 h after seizure.] +*** Postictal-semiology-nose-wiping {suggestedTag=Brain-laterality, suggestedTag=Episode-event-count} [Noes-wiping usually within 60 sec of seizure offset, usually with the hand ipsilateral to the seizure onset.] +*** Postictal-semiology-anterograde-amnesia {suggestedTag=Episode-event-count} [Impaired ability to remember new material.] +*** Postictal-semiology-retrograde-amnesia {suggestedTag=Episode-event-count} [Impaired ability to recall previously remember material.] +*** Postictal-semiology-paresis {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity, suggestedTag=Episode-event-count} [Todds palsy. Any unilateral postictal dysfunction relating to motor, language, sensory and/or integrative functions.] +*** Postictal-semiology-sleep [Invincible need to sleep after a seizure.] +*** Postictal-semiology-unilateral-myoclonic-jerks [unilateral motor phenomena, other then specified, occurring in postictal phase.] +*** Postictal-semiology-other-unilateral-motor-phenomena {requireChild} +**** # {takesValue, valueClass=textClass} [Free text.] +** Polygraphic-channel-relation-to-episode {requireChild, suggestedTag=Property-not-possible-to-determine} +*** Polygraphic-channel-cause-to-episode +*** Polygraphic-channel-consequence-of-episode +** Ictal-EEG-patterns +*** Ictal-EEG-patterns-obscured-by-artifacts [The interpretation of the EEG is not possible due to artifacts.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Ictal-EEG-activity {suggestedTag=Polyspikes-morphology, suggestedTag=Fast-spike-activity-morphology, suggestedTag=Low-voltage-fast-activity-morphology, suggestedTag=Polysharp-waves-morphology, suggestedTag=Spike-and-slow-wave-morphology, suggestedTag=Polyspike-and-slow-wave-morphology, suggestedTag=Sharp-and-slow-wave-morphology, suggestedTag=Rhythmic-activity-morphology, suggestedTag=Slow-wave-large-amplitude-morphology, suggestedTag=Irregular-delta-or-theta-activity-morphology, suggestedTag=Electrodecremental-change-morphology, suggestedTag=DC-shift-morphology, suggestedTag=Disappearance-of-ongoing-activity-morphology, suggestedTag=Brain-laterality, suggestedTag=Brain-region, suggestedTag=Sensors, suggestedTag=Source-analysis-laterality, suggestedTag=Source-analysis-brain-region, suggestedTag=Episode-event-count} +*** Postictal-EEG-activity {suggestedTag=Brain-laterality, suggestedTag=Body-part-location, suggestedTag=Brain-centricity} +** Episode-time-context-property [Additional clinically relevant features related to episodes can be scored under timing and context. If needed, episode duration can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Temporal-value/Duration.] +*** Episode-consciousness {requireChild, suggestedTag=Property-not-possible-to-determine} +**** Episode-consciousness-not-tested +***** # {takesValue, valueClass=textClass} [Free text.] +**** Episode-consciousness-affected +***** # {takesValue, valueClass=textClass} [Free text.] +**** Episode-consciousness-mildly-affected +***** # {takesValue, valueClass=textClass} [Free text.] +**** Episode-consciousness-not-affected +***** # {takesValue, valueClass=textClass} [Free text.] +*** Episode-awareness {suggestedTag=Property-not-possible-to-determine, suggestedTag=Property-exists, suggestedTag=Property-absence} +**** # {takesValue, valueClass=textClass} [Free text.] +*** Clinical-EEG-temporal-relationship {suggestedTag=Property-not-possible-to-determine} +**** Clinical-start-followed-EEG [Clinical start, followed by EEG start by X seconds.] +***** # {takesValue, valueClass=numericClass, unitClass=timeUnits} +**** EEG-start-followed-clinical [EEG start, followed by clinical start by X seconds.] +***** # {takesValue, valueClass=numericClass, unitClass=timeUnits} +**** Simultaneous-start-clinical-EEG +**** Clinical-EEG-temporal-relationship-notes [Clinical notes to annotate the clinical-EEG temporal relationship.] +***** # {takesValue, valueClass=textClass} +*** Episode-event-count {suggestedTag=Property-not-possible-to-determine} [Number of stereotypical episodes during the recording.] +**** # {takesValue, valueClass=numericClass} +*** State-episode-start {requireChild, suggestedTag=Property-not-possible-to-determine} [State at the start of the episode.] +**** Episode-start-from-sleep +***** # {takesValue, valueClass=textClass} [Free text.] +**** Episode-start-from-awake +***** # {takesValue, valueClass=textClass} [Free text.] +*** Episode-postictal-phase {suggestedTag=Property-not-possible-to-determine} +**** # {takesValue, valueClass=numericClass, unitClass=timeUnits} +*** Episode-prodrome {suggestedTag=Property-exists, suggestedTag=Property-absence} [Prodrome is a preictal phenomenon, and it is defined as a subjective or objective clinical alteration (e.g., ill-localized sensation or agitation) that heralds the onset of an epileptic seizure but does not form part of it (Blume et al., 2001). Therefore, prodrome should be distinguished from aura (which is an ictal phenomenon).] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Episode-tongue-biting {suggestedTag=Property-exists, suggestedTag=Property-absence} +**** # {takesValue, valueClass=textClass} [Free text.] +*** Episode-responsiveness {requireChild, suggestedTag=Property-not-possible-to-determine} +**** Episode-responsiveness-preserved +***** # {takesValue, valueClass=textClass} [Free text.] +**** Episode-responsiveness-affected +***** # {takesValue, valueClass=textClass} [Free text.] +*** Episode-appearance {requireChild} +**** Episode-appearance-interactive +***** # {takesValue, valueClass=textClass} [Free text.] +**** Episode-appearance-spontaneous +***** # {takesValue, valueClass=textClass} [Free text.] +*** Seizure-dynamics {requireChild} [Spatiotemporal dynamics can be scored (evolution in morphology; evolution in frequency; evolution in location).] +**** Seizure-dynamics-evolution-morphology +***** # {takesValue, valueClass=textClass} [Free text.] +**** Seizure-dynamics-evolution-frequency +***** # {takesValue, valueClass=textClass} [Free text.] +**** Seizure-dynamics-evolution-location +***** # {takesValue, valueClass=textClass} [Free text.] +**** Seizure-dynamics-not-possible-to-determine [Not possible to determine.] +***** # {takesValue, valueClass=textClass} [Free text.] +* Other-finding-property {requireChild} +** Artifact-significance-to-recording {requireChild} [It is important to score the significance of the described artifacts: recording is not interpretable, recording of reduced diagnostic value, does not interfere with the interpretation of the recording.] +*** Recording-not-interpretable-due-to-artifact +**** # {takesValue, valueClass=textClass} [Free text.] +*** Recording-of-reduced-diagnostic-value-due-to-artifact +**** # {takesValue, valueClass=textClass} [Free text.] +*** Artifact-does-not-interfere-recording +**** # {takesValue, valueClass=textClass} [Free text.] +** Finding-significance-to-recording {requireChild} [Significance of finding. When normal/abnormal could be labeled with base schema Normal/Abnormal tags.] +*** Finding-no-definite-abnormality +**** # {takesValue, valueClass=textClass} [Free text.] +*** Finding-significance-not-possible-to-determine [Not possible to determine.] +**** # {takesValue, valueClass=textClass} [Free text.] +** Finding-frequency [Value in Hz (number) typed in.] +*** # {takesValue, valueClass=numericClass, unitClass=frequencyUnits} +** Finding-amplitude [Value in microvolts (number) typed in.] +*** # {takesValue, valueClass=numericClass, unitClass=electricPotentialUnits} +** Finding-amplitude-asymmetry {requireChild} [For posterior dominant rhythm: a difference in amplitude between the homologous area on opposite sides of the head that consistently exceeds 50 percent. When symmetrical could be labeled with base schema Symmetrical tag. For sleep: Absence or consistently marked amplitude asymmetry (greater than 50 percent) of a normal sleep graphoelement.] +*** Finding-amplitude-asymmetry-lower-left [Amplitude lower on the left side.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Finding-amplitude-asymmetry-lower-right [Amplitude lower on the right side.] +**** # {takesValue, valueClass=textClass} [Free text.] +*** Finding-amplitude-asymmetry-not-possible-to-determine [Not possible to determine.] +**** # {takesValue, valueClass=textClass} [Free text.] +** Finding-stopped-by +*** # {takesValue, valueClass=textClass} [Free text.] +** Finding-triggered-by +*** # {takesValue, valueClass=textClass} [Free text.] +** Finding-unmodified +*** # {takesValue, valueClass=textClass} [Free text.] +** Property-not-possible-to-determine [Not possible to determine.] +*** # {takesValue, valueClass=textClass} [Free text.] +** Property-exists +*** # {takesValue, valueClass=textClass} [Free text.] +** Property-absence +*** # {takesValue, valueClass=textClass} [Free text.] + + +!# end schema + +'''Unit classes''' + +'''Unit modifiers''' + +'''Value classes''' + +'''Schema attributes''' + +'''Properties''' +'''Epilogue''' +The Standardized Computer-based Organized Reporting of EEG (SCORE) is a standard terminology for scalp EEG data assessment designed for use in clinical practice that may also be used for research purposes. +The SCORE standard defines terms for describing phenomena observed in scalp EEG data. It is also potentially applicable (with some suitable extensions) to EEG recorded in critical care and neonatal settings. +The SCORE standard received European consensus and has been endorsed by the European Chapter of the International Federation of Clinical Neurophysiology (IFCN) and the International League Against Epilepsy (ILAE) Commission on European Affairs. +A second revised and extended version of SCORE achieved international consensus. + +[1] Beniczky, Sandor, et al. "Standardized computer based organized reporting of EEG: SCORE." Epilepsia 54.6 (2013). +[2] Beniczky, Sandor, et al. "Standardized computer based organized reporting of EEG: SCORE second version." Clinical Neurophysiology 128.11 (2017). + +TPA, March 2023 + +!# end hed diff --git a/tests/data/schema_tests/merge_tests/HED_score_lib_tags.xml b/tests/data/schema_tests/merge_tests/HED_score_unmerged.xml similarity index 97% rename from tests/data/schema_tests/merge_tests/HED_score_lib_tags.xml rename to tests/data/schema_tests/merge_tests/HED_score_unmerged.xml index b758be14d..0ea60b981 100644 --- a/tests/data/schema_tests/merge_tests/HED_score_lib_tags.xml +++ b/tests/data/schema_tests/merge_tests/HED_score_unmerged.xml @@ -1,6825 +1,6825 @@ - - - This schema is a Hierarchical Event Descriptors (HED) Library Schema implementation of Standardized Computer-based Organized Reporting of EEG (SCORE)[1,2] for describing events occurring during neuroimaging time series recordings. -The HED-SCORE library schema allows neurologists, neurophysiologists, and brain researchers to annotate electrophysiology recordings using terms from an internationally accepted set of defined terms (SCORE) compatible with the HED framework. -The resulting annotations are understandable to clinicians and directly usable in computer analysis. - -Future extensions may be implemented in the HED-SCORE library schema. -For more information see https://hed-schema-library.readthedocs.io/en/latest/index.html. - - - Modulator - External stimuli / interventions or changes in the alertness level (sleep) that modify: the background activity, or how often a graphoelement is occurring, or change other features of the graphoelement (like intra-burst frequency). For each observed finding, there is an option of specifying how they are influenced by the modulators and procedures that were done during the recording. - - requireChild - - - Sleep-modulator - - Sleep-deprivation - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Sleep-following-sleep-deprivation - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Natural-sleep - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Induced-sleep - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Drowsiness - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Awakening - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Medication-modulator - - Medication-administered-during-recording - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Medication-withdrawal-or-reduction-during-recording - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Eye-modulator - - Manual-eye-closure - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Manual-eye-opening - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Stimulation-modulator - - Intermittent-photic-stimulation - - requireChild - - - suggestedTag - Intermittent-photic-stimulation-effect - - - # - - takesValue - - - valueClass - numericClass - - - unitClass - frequencyUnits - - - - - Auditory-stimulation - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Nociceptive-stimulation - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Hyperventilation - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Physical-effort - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Cognitive-task - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Other-modulator-or-procedure - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Background-activity - An EEG activity representing the setting in which a given normal or abnormal pattern appears and from which such pattern is distinguished. - - requireChild - - - Posterior-dominant-rhythm - Rhythmic activity occurring during wakefulness over the posterior regions of the head, generally with maximum amplitudes over the occipital areas. Amplitude varies. Best seen with eyes closed and during physical relaxation and relative mental inactivity. Blocked or attenuated by attention, especially visual, and mental effort. In adults this is the alpha rhythm, and the frequency is 8 to 13 Hz. However the frequency can be higher or lower than this range (often a supra or sub harmonic of alpha frequency) and is called alpha variant rhythm (fast and slow alpha variant rhythm). In children, the normal range of the frequency of the posterior dominant rhythm is age-dependant. - - suggestedTag - Finding-significance-to-recording - Finding-frequency - Finding-amplitude-asymmetry - Posterior-dominant-rhythm-property - - - - Mu-rhythm - EEG rhythm at 7-11 Hz composed of arch-shaped waves occurring over the central or centro-parietal regions of the scalp during wakefulness. Amplitudes varies but is mostly below 50 microV. Blocked or attenuated most clearly by contralateral movement, thought of movement, readiness to move or tactile stimulation. - - suggestedTag - Finding-frequency - Finding-significance-to-recording - Brain-laterality - Brain-region - Sensors - - - - Other-organized-rhythm - EEG activity that consisting of waves of approximately constant period, which is considered as part of the background (ongoing) activity, but does not fulfill the criteria of the posterior dominant rhythm. - - requireChild - - - suggestedTag - Rhythmic-activity-morphology - Finding-significance-to-recording - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Background-activity-special-feature - Special Features. Special features contains scoring options for the background activity of critically ill patients. - - requireChild - - - Continuous-background-activity - - suggestedTag - Rhythmic-activity-morphology - Brain-laterality - Brain-region - Sensors - Finding-extent - - - - Nearly-continuous-background-activity - - suggestedTag - Rhythmic-activity-morphology - Brain-laterality - Brain-region - Sensors - Finding-extent - - - - Discontinuous-background-activity - - suggestedTag - Rhythmic-activity-morphology - Brain-laterality - Brain-region - Sensors - Finding-extent - - - - Background-burst-suppression - EEG pattern consisting of bursts (activity appearing and disappearing abruptly) interrupted by periods of low amplitude (below 20 microV) and which occurs simultaneously over all head regions. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Finding-extent - - - - Background-burst-attenuation - - suggestedTag - Brain-laterality - Brain-region - Sensors - Finding-extent - - - - Background-activity-suppression - Periods showing activity under 10 microV (referential montage) and interrupting the background (ongoing) activity. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Finding-extent - Appearance-mode - - - - Electrocerebral-inactivity - Absence of any ongoing cortical electric activities; in all leads EEG is isoelectric or only contains artifacts. Sensitivity has to be increased up to 2 microV/mm; recording time: at least 30 minutes. - - - - - Artifact - When relevant for the clinical interpretation, artifacts can be scored by specifying the type and the location. - - requireChild - - - Biological-artifact - - requireChild - - - Eye-blink-artifact - Example for EEG: Fp1/Fp2 become electropositive with eye closure because the cornea is positively charged causing a negative deflection in Fp1/Fp2. If the eye blink is unilateral, consider prosthetic eye. If it is in F8 rather than Fp2 then the electrodes are plugged in wrong. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - - Eye-movement-horizontal-artifact - Example for EEG: There is an upward deflection in the Fp2-F8 derivation, when the eyes move to the right side. In this case F8 becomes more positive and therefore. When the eyes move to the left, F7 becomes more positive and there is an upward deflection in the Fp1-F7 derivation. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - - Eye-movement-vertical-artifact - Example for EEG: The EEG shows positive potentials (50-100 micro V) with bi-frontal distribution, maximum at Fp1 and Fp2, when the eyeball rotated upward. The downward rotation of the eyeball was associated with the negative deflection. The time course of the deflections was similar to the time course of the eyeball movement. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - - Slow-eye-movement-artifact - Slow, rolling eye-movements, seen during drowsiness. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - - Nystagmus-artifact - - suggestedTag - Artifact-significance-to-recording - - - - Chewing-artifact - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - - Sucking-artifact - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - - Glossokinetic-artifact - The tongue functions as a dipole, with the tip negative with respect to the base. The artifact produced by the tongue has a broad potential field that drops from frontal to occipital areas, although it is less steep than that produced by eye movement artifacts. The amplitude of the potentials is greater inferiorly than in parasagittal regions; the frequency is variable but usually in the delta range. Chewing and sucking can produce similar artifacts. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - - Rocking-patting-artifact - Quasi-rhythmical artifacts in recordings from infants caused by rocking/patting. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - - Movement-artifact - Example for EEG: Large amplitude artifact, with irregular morphology (usually resembling a slow-wave or a wave with complex morphology) seen in one or several channels, due to movement. If the causing movement is repetitive, the artifact might resemble a rhythmic EEG activity. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - - Respiration-artifact - Respiration can produce 2 kinds of artifacts. One type is in the form of slow and rhythmic activity, synchronous with the body movements of respiration and mechanically affecting the impedance of (usually) one electrode. The other type can be slow or sharp waves that occur synchronously with inhalation or exhalation and involve those electrodes on which the patient is lying. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - - Pulse-artifact - Example for EEG: Occurs when an EEG electrode is placed over a pulsating vessel. The pulsation can cause slow waves that may simulate EEG activity. A direct relationship exists between ECG and the pulse waves (200-300 millisecond delay after ECG equals QRS complex). - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - - ECG-artifact - Example for EEG: Far-field potential generated in the heart. The voltage and apparent surface of the artifact vary from derivation to derivation and, consequently, from montage to montage. The artifact is observed best in referential montages using earlobe electrodes A1 and A2. ECG artifact is recognized easily by its rhythmicity/regularity and coincidence with the ECG tracing. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - - Sweat-artifact - Is a low amplitude undulating waveform that is usually greater than 2 seconds and may appear to be an unstable baseline. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - - EMG-artifact - Myogenic potentials are the most common artifacts. Frontalis and temporalis muscles (ex..: clenching of jaw muscles) are common causes. Generally, the potentials generated in the muscles are of shorter duration than those generated in the brain. The frequency components are usually beyond 30-50 Hz, and the bursts are arrhythmic. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Artifact-significance-to-recording - - - - - Non-biological-artifact - - requireChild - - - Power-supply-artifact - 50-60 Hz artifact. Monomorphic waveform due to 50 or 60 Hz A/C power supply. - - suggestedTag - Artifact-significance-to-recording - - - - Induction-artifact - Artifacts (usually of high frequency) induced by nearby equipment (like in the intensive care unit). - - suggestedTag - Artifact-significance-to-recording - - - - Dialysis-artifact - - suggestedTag - Artifact-significance-to-recording - - - - Artificial-ventilation-artifact - - suggestedTag - Artifact-significance-to-recording - - - - Electrode-pops-artifact - Are brief discharges with a very steep upslope and shallow fall that occur in all leads which include that electrode. - - suggestedTag - Artifact-significance-to-recording - - - - Salt-bridge-artifact - Typically occurs in 1 channel which may appear isoelectric. Only seen in bipolar montage. - - suggestedTag - Artifact-significance-to-recording - - - - - Other-artifact - - requireChild - - - suggestedTag - Artifact-significance-to-recording - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Critically-ill-patients-patterns - Rhythmic or periodic patterns in critically ill patients (RPPs) are scored according to the 2012 version of the American Clinical Neurophysiology Society Standardized Critical Care EEG Terminology (Hirsch et al., 2013). - - requireChild - - - Critically-ill-patients-periodic-discharges - Periodic discharges (PDs). - - suggestedTag - Periodic-discharge-morphology - Brain-laterality - Brain-region - Sensors - Finding-frequency - Periodic-discharge-time-related-features - - - - Rhythmic-delta-activity - RDA - - suggestedTag - Periodic-discharge-superimposed-activity - Periodic-discharge-absolute-amplitude - Brain-laterality - Brain-region - Sensors - Finding-frequency - Periodic-discharge-time-related-features - - - - Spike-or-sharp-and-wave - SW - - suggestedTag - Periodic-discharge-sharpness - Number-of-periodic-discharge-phases - Periodic-discharge-triphasic-morphology - Periodic-discharge-absolute-amplitude - Periodic-discharge-relative-amplitude - Periodic-discharge-polarity - Brain-laterality - Brain-region - Sensors - Multifocal-finding - Finding-frequency - Periodic-discharge-time-related-features - - - - - Episode - Clinical episode or electrographic seizure. - - requireChild - - - Epileptic-seizure - The ILAE presented a revised seizure classification that divides seizures into focal, generalized onset, or unknown onset. - - requireChild - - - Focal-onset-epileptic-seizure - Focal seizures can be divided into focal aware and impaired awareness seizures, with additional motor and nonmotor classifications. - - suggestedTag - Episode-phase - Automatism-motor-seizure - Atonic-motor-seizure - Clonic-motor-seizure - Epileptic-spasm-episode - Hyperkinetic-motor-seizure - Myoclonic-motor-seizure - Tonic-motor-seizure - Autonomic-nonmotor-seizure - Behavior-arrest-nonmotor-seizure - Cognitive-nonmotor-seizure - Emotional-nonmotor-seizure - Sensory-nonmotor-seizure - Seizure-dynamics - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - Aware-focal-onset-epileptic-seizure - - suggestedTag - Episode-phase - Seizure-dynamics - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - Impaired-awareness-focal-onset-epileptic-seizure - - suggestedTag - Episode-phase - Seizure-dynamics - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - Awareness-unknown-focal-onset-epileptic-seizure - - suggestedTag - Episode-phase - Seizure-dynamics - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - Focal-to-bilateral-tonic-clonic-focal-onset-epileptic-seizure - A seizure type with focal onset, with awareness or impaired awareness, either motor or non-motor, progressing to bilateral tonic clonic activity. The prior term was seizure with partial onset with secondary generalization. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - suggestedTag - Episode-phase - Seizure-dynamics - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - - Generalized-onset-epileptic-seizure - Generalized-onset seizures are classified as motor or nonmotor (absence), without using awareness level as a classifier, as most but not all of these seizures are linked with impaired awareness. - - suggestedTag - Episode-phase - Tonic-clonic-motor-seizure - Clonic-motor-seizure - Tonic-motor-seizure - Myoclonic-motor-seizure - Myoclonic-tonic-clonic-motor-seizure - Myoclonic-atonic-motor-seizure - Atonic-motor-seizure - Epileptic-spasm-episode - Typical-absence-seizure - Atypical-absence-seizure - Myoclonic-absence-seizure - Eyelid-myoclonia-absence-seizure - Seizure-dynamics - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - Unknown-onset-epileptic-seizure - Even if the onset of seizures is unknown, they may exhibit characteristics that fall into categories such as motor, nonmotor, tonic-clonic, epileptic spasms, or behavior arrest. - - suggestedTag - Episode-phase - Tonic-clonic-motor-seizure - Epileptic-spasm-episode - Behavior-arrest-nonmotor-seizure - Seizure-dynamics - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - Unclassified-epileptic-seizure - Referring to a seizure type that cannot be described by the ILAE 2017 classification either because of inadequate information or unusual clinical features. - - suggestedTag - Episode-phase - Seizure-dynamics - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - - Subtle-seizure - Seizure type frequent in neonates, sometimes referred to as motor automatisms; they may include random and roving eye movements, sucking, chewing motions, tongue protrusion, rowing or swimming or boxing movements of the arms, pedaling and bicycling movements of the lower limbs; apneic seizures are relatively common. Although some subtle seizures are associated with rhythmic ictal EEG discharges, and are clearly epileptic, ictal EEG often does not show typical epileptic activity. - - suggestedTag - Episode-phase - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - Electrographic-seizure - Referred usually to non convulsive status. Ictal EEG: rhythmic discharge or spike and wave pattern with definite evolution in frequency, location, or morphology lasting at least 10 s; evolution in amplitude alone did not qualify. - - suggestedTag - Episode-phase - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - Seizure-PNES - Psychogenic non-epileptic seizure. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - Sleep-related-episode - - requireChild - - - Sleep-related-arousal - Normal. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - Benign-sleep-myoclonus - A distinctive disorder of sleep characterized by a) neonatal onset, b) rhythmic myoclonic jerks only during sleep and c) abrupt and consistent cessation with arousal, d) absence of concomitant electrographic changes suggestive of seizures, and e) good outcome. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - Confusional-awakening - Episode of non epileptic nature included in NREM parasomnias, characterized by sudden arousal and complex behavior but without full alertness, usually lasting a few minutes and occurring almost in all children at least occasionally. Amnesia of the episode is the rule. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - Sleep-periodic-limb-movement - PLMS. Periodic limb movement in sleep. Episodes are characterized by brief (0.5- to 5.0-second) lower-extremity movements during sleep, which typically occur at 20- to 40-second intervals, most commonly during the first 3 hours of sleep. The affected individual is usually not aware of the movements or of the transient partial arousals. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - REM-sleep-behavioral-disorder - REM sleep behavioral disorder. Episodes characterized by: a) presence of REM sleep without atonia (RSWA) on polysomnography (PSG); b) presence of at least 1 of the following conditions - (1) Sleep-related behaviors, by history, that have been injurious, potentially injurious, or disruptive (example: dream enactment behavior); (2) abnormal REM sleep behavior documented during PSG monitoring; (3) absence of epileptiform activity on electroencephalogram (EEG) during REM sleep (unless RBD can be clearly distinguished from any concurrent REM sleep-related seizure disorder); (4) sleep disorder not better explained by another sleep disorder, a medical or neurologic disorder, a mental disorder, medication use, or a substance use disorder. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - Sleep-walking - Episodes characterized by ambulation during sleep; the patient is difficult to arouse during an episode, and is usually amnesic following the episode. Episodes usually occur in the first third of the night during slow wave sleep. Polysomnographic recordings demonstrate 2 abnormalities during the first sleep cycle: frequent, brief, non-behavioral EEG-defined arousals prior to the somnambulistic episode and abnormally low gamma (0.75-2.0 Hz) EEG power on spectral analysis, correlating with high-voltage (hyper-synchronic gamma) waves lasting 10 to 15 s occurring just prior to the movement. This is followed by stage I NREM sleep, and there is no evidence of complete awakening. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - - Pediatric-episode - - requireChild - - - Hyperekplexia - Disorder characterized by exaggerated startle response and hypertonicity that may occur during the first year of life and in severe cases during the neonatal period. Children usually present with marked irritability and recurrent startles in response to handling and sounds. Severely affected infants can have severe jerks and stiffening, sometimes with breath-holding spells. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - Jactatio-capitis-nocturna - Relatively common in normal children at the time of going to bed, especially during the first year of life, the rhythmic head movements persist during sleep. Usually, these phenomena disappear before 3 years of age. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - Pavor-nocturnus - A nocturnal episode characterized by age of onset of less than five years (mean age 18 months, with peak prevalence at five to seven years), appearance of signs of panic two hours after falling asleep with crying, screams, a fearful expression, inability to recognize other people including parents (for a duration of 5-15 minutes), amnesia upon awakening. Pavor nocturnus occurs in patients almost every night for months or years (but the frequency is highly variable and may be as low as once a month) and is likely to disappear spontaneously at the age of six to eight years. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - Pediatric-stereotypical-behavior-episode - Repetitive motor behavior in children, typically rhythmic and persistent; usually not paroxysmal and rarely suggest epilepsy. They include headbanging, head-rolling, jactatio capitis nocturna, body rocking, buccal or lingual movements, hand flapping and related mannerisms, repetitive hand-waving (to self-induce photosensitive seizures). - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - - Paroxysmal-motor-event - Paroxysmal phenomena during neonatal or childhood periods characterized by recurrent motor or behavioral signs or symptoms that must be distinguishes from epileptic disorders. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - Syncope - Episode with loss of consciousness and muscle tone that is abrupt in onset, of short duration and followed by rapid recovery; it occurs in response to transient impairment of cerebral perfusion. Typical prodromal symptoms often herald onset of syncope and postictal symptoms are minimal. Syncopal convulsions resulting from cerebral anoxia are common but are not a form of epilepsy, nor are there any accompanying EEG ictal discharges. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - Cataplexy - A sudden decrement in muscle tone and loss of deep tendon reflexes, leading to muscle weakness, paralysis, or postural collapse. Cataplexy usually is precipitated by an outburst of emotional expression-notably laughter, anger, or startle. It is one of the tetrad of symptoms of narcolepsy. During cataplexy, respiration and voluntary eye movements are not compromised. Consciousness is preserved. - - suggestedTag - Episode-phase - Finding-significance-to-recording - Episode-consciousness - Episode-awareness - Clinical-EEG-temporal-relationship - Episode-event-count - State-episode-start - Episode-postictal-phase - Episode-prodrome - Episode-tongue-biting - - - - Other-episode - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Finding-property - Descriptive element similar to main HED /Property. Something that pertains to a thing. A characteristic of some entity. A quality or feature regarded as a characteristic or inherent part of someone or something. HED attributes are adjectives or adverbs. - - requireChild - - - Signal-morphology-property - - requireChild - - - Rhythmic-activity-morphology - EEG activity consisting of a sequence of waves approximately constant period. - - Delta-activity-morphology - EEG rhythm in the delta (under 4 Hz) range that does not belong to the posterior dominant rhythm (scored under other organized rhythms). - - suggestedTag - Finding-frequency - Finding-amplitude - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Theta-activity-morphology - EEG rhythm in the theta (4-8 Hz) range that does not belong to the posterior dominant rhythm (scored under other organized rhythm). - - suggestedTag - Finding-frequency - Finding-amplitude - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Alpha-activity-morphology - EEG rhythm in the alpha range (8-13 Hz) which is considered part of the background (ongoing) activity but does not fulfill the criteria of the posterior dominant rhythm (alpha rhythm). - - suggestedTag - Finding-frequency - Finding-amplitude - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Beta-activity-morphology - EEG rhythm between 14 and 40 Hz, which is considered part of the background (ongoing) activity but does not fulfill the criteria of the posterior dominant rhythm. Most characteristically: a rhythm from 14 to 40 Hz recorded over the fronto-central regions of the head during wakefulness. Amplitude of the beta rhythm varies but is mostly below 30 microV. Other beta rhythms are most prominent in other locations or are diffuse. - - suggestedTag - Finding-frequency - Finding-amplitude - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Gamma-activity-morphology - - suggestedTag - Finding-frequency - Finding-amplitude - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Spike-morphology - A transient, clearly distinguished from background activity, with pointed peak at a conventional paper speed or time scale and duration from 20 to under 70 ms, i.e. 1/50-1/15 s approximately. Main component is generally negative relative to other areas. Amplitude varies. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Spike-and-slow-wave-morphology - A pattern consisting of a spike followed by a slow wave. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Runs-of-rapid-spikes-morphology - Bursts of spike discharges at a rate from 10 to 25/sec (in most cases somewhat irregular). The bursts last more than 2 seconds (usually 2 to 10 seconds) and it is typically seen in sleep. Synonyms: rhythmic spikes, generalized paroxysmal fast activity, fast paroxysmal rhythms, grand mal discharge, fast beta activity. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Polyspikes-morphology - Two or more consecutive spikes. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Polyspike-and-slow-wave-morphology - Two or more consecutive spikes associated with one or more slow waves. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Sharp-wave-morphology - A transient clearly distinguished from background activity, with pointed peak at a conventional paper speed or time scale, and duration of 70-200 ms, i.e. over 1/4-1/5 s approximately. Main component is generally negative relative to other areas. Amplitude varies. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Sharp-and-slow-wave-morphology - A sequence of a sharp wave and a slow wave. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Slow-sharp-wave-morphology - A transient that bears all the characteristics of a sharp-wave, but exceeds 200 ms. Synonym: blunted sharp wave. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - High-frequency-oscillation-morphology - HFO. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Hypsarrhythmia-classic-morphology - Abnormal interictal high amplitude waves and a background of irregular spikes. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Hypsarrhythmia-modified-morphology - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Fast-spike-activity-morphology - A burst consisting of a sequence of spikes. Duration greater than 1 s. Frequency at least in the alpha range. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Low-voltage-fast-activity-morphology - Refers to the fast, and often recruiting activity which can be recorded at the onset of an ictal discharge, particularly in invasive EEG recording of a seizure. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Polysharp-waves-morphology - A sequence of two or more sharp-waves. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Slow-wave-large-amplitude-morphology - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Irregular-delta-or-theta-activity-morphology - EEG activity consisting of repetitive waves of inconsistent wave-duration but in delta and/or theta rang (greater than 125 ms). - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Electrodecremental-change-morphology - Sudden desynchronization of electrical activity. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - DC-shift-morphology - Shift of negative polarity of the direct current recordings, during seizures. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Disappearance-of-ongoing-activity-morphology - Disappearance of the EEG activity that preceded the ictal event but still remnants of background activity (thus not enough to name it electrodecremental change). - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Polymorphic-delta-activity-morphology - EEG activity consisting of waves in the delta range (over 250 ms duration for each wave) but of different morphology. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Frontal-intermittent-rhythmic-delta-activity-morphology - Frontal intermittent rhythmic delta activity (FIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at 1.5-2.5 Hz over the frontal areas of one or both sides of the head. Comment: most commonly associated with unspecified encephalopathy, in adults. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Occipital-intermittent-rhythmic-delta-activity-morphology - Occipital intermittent rhythmic delta activity (OIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at 2-3 Hz over the occipital or posterior head regions of one or both sides of the head. Frequently blocked or attenuated by opening the eyes. Comment: most commonly associated with unspecified encephalopathy, in children. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Temporal-intermittent-rhythmic-delta-activity-morphology - Temporal intermittent rhythmic delta activity (TIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at over the temporal areas of one side of the head. Comment: most commonly associated with temporal lobe epilepsy. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Periodic-discharge-morphology - Periodic discharges not further specified (PDs). - - requireChild - - - Periodic-discharge-superimposed-activity - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - Periodic-discharge-fast-superimposed-activity - - suggestedTag - Finding-frequency - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Periodic-discharge-rhythmic-superimposed-activity - - suggestedTag - Finding-frequency - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Periodic-discharge-sharpness - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - Spiky-periodic-discharge-sharpness - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Sharp-periodic-discharge-sharpness - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Sharply-contoured-periodic-discharge-sharpness - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Blunt-periodic-discharge-sharpness - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Number-of-periodic-discharge-phases - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - 1-periodic-discharge-phase - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - 2-periodic-discharge-phases - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - 3-periodic-discharge-phases - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Greater-than-3-periodic-discharge-phases - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Periodic-discharge-triphasic-morphology - - suggestedTag - Property-not-possible-to-determine - Property-exists - Property-absence - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Periodic-discharge-absolute-amplitude - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - Periodic-discharge-absolute-amplitude-very-low - Lower than 20 microV. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Low-periodic-discharge-absolute-amplitude - 20 to 49 microV. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Medium-periodic-discharge-absolute-amplitude - 50 to 199 microV. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - High-periodic-discharge-absolute-amplitude - Greater than 200 microV. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Periodic-discharge-relative-amplitude - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - Periodic-discharge-relative-amplitude-less-than-equal-2 - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Periodic-discharge-relative-amplitude-greater-than-2 - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Periodic-discharge-polarity - - requireChild - - - Periodic-discharge-postitive-polarity - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Periodic-discharge-negative-polarity - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Periodic-discharge-unclear-polarity - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - - - Source-analysis-property - How the current in the brain reaches the electrode sensors. - - requireChild - - - Source-analysis-laterality - - requireChild - - - suggestedTag - Brain-laterality - - - - Source-analysis-brain-region - - requireChild - - - Source-analysis-frontal-perisylvian-superior-surface - - - Source-analysis-frontal-lateral - - - Source-analysis-frontal-mesial - - - Source-analysis-frontal-polar - - - Source-analysis-frontal-orbitofrontal - - - Source-analysis-temporal-polar - - - Source-analysis-temporal-basal - - - Source-analysis-temporal-lateral-anterior - - - Source-analysis-temporal-lateral-posterior - - - Source-analysis-temporal-perisylvian-inferior-surface - - - Source-analysis-central-lateral-convexity - - - Source-analysis-central-mesial - - - Source-analysis-central-sulcus-anterior-surface - - - Source-analysis-central-sulcus-posterior-surface - - - Source-analysis-central-opercular - - - Source-analysis-parietal-lateral-convexity - - - Source-analysis-parietal-mesial - - - Source-analysis-parietal-opercular - - - Source-analysis-occipital-lateral - - - Source-analysis-occipital-mesial - - - Source-analysis-occipital-basal - - - Source-analysis-insula - - - - - Location-property - Location can be scored for findings. Semiologic finding can also be characterized by the somatotopic modifier (i.e. the part of the body where it occurs). In this respect, laterality (left, right, symmetric, asymmetric, left greater than right, right greater than left), body part (eyelid, face, arm, leg, trunk, visceral, hemi-) and centricity (axial, proximal limb, distal limb) can be scored. - - requireChild - - - Brain-laterality - - requireChild - - - Brain-laterality-left - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Brain-laterality-left-greater-right - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Brain-laterality-right - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Brain-laterality-right-greater-left - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Brain-laterality-midline - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Brain-laterality-diffuse-asynchronous - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Brain-region - - requireChild - - - Brain-region-frontal - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Brain-region-temporal - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Brain-region-central - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Brain-region-parietal - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Brain-region-occipital - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Body-part-location - - requireChild - - - Eyelid-location - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Face-location - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Arm-location - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Leg-location - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Trunk-location - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Visceral-location - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Hemi-location - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Brain-centricity - - requireChild - - - Brain-centricity-axial - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Brain-centricity-proximal-limb - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Brain-centricity-distal-limb - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Sensors - Lists all corresponding sensors (electrodes/channels in montage). The sensor-group is selected from a list defined in the site-settings for each EEG-lab. - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Finding-propagation - When propagation within the graphoelement is observed, first the location of the onset region is scored. Then, the location of the propagation can be noted. - - suggestedTag - Property-exists - Property-absence - Brain-laterality - Brain-region - Sensors - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Multifocal-finding - When the same interictal graphoelement is observed bilaterally and at least in three independent locations, can score them using one entry, and choosing multifocal as a descriptor of the locations of the given interictal graphoelements, optionally emphasizing the involved, and the most active sites. - - suggestedTag - Property-not-possible-to-determine - Property-exists - Property-absence - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Modulators-property - For each described graphoelement, the influence of the modulators can be scored. Only modulators present in the recording are scored. - - requireChild - - - Modulators-reactivity - Susceptibility of individual rhythms or the EEG as a whole to change following sensory stimulation or other physiologic actions. - - requireChild - - - suggestedTag - Property-exists - Property-absence - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Eye-closure-sensitivity - Eye closure sensitivity. - - suggestedTag - Property-exists - Property-absence - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Eye-opening-passive - Passive eye opening. Used with base schema Increasing/Decreasing. - - suggestedTag - Property-not-possible-to-determine - Finding-stopped-by - Finding-unmodified - Finding-triggered-by - - - - Medication-effect-EEG - Medications effect on EEG. Used with base schema Increasing/Decreasing. - - suggestedTag - Property-not-possible-to-determine - Finding-stopped-by - Finding-unmodified - - - - Medication-reduction-effect-EEG - Medications reduction or withdrawal effect on EEG. Used with base schema Increasing/Decreasing. - - suggestedTag - Property-not-possible-to-determine - Finding-stopped-by - Finding-unmodified - - - - Auditive-stimuli-effect - Used with base schema Increasing/Decreasing. - - suggestedTag - Property-not-possible-to-determine - Finding-stopped-by - Finding-unmodified - - - - Nociceptive-stimuli-effect - Used with base schema Increasing/Decreasing. - - suggestedTag - Property-not-possible-to-determine - Finding-stopped-by - Finding-unmodified - Finding-triggered-by - - - - Physical-effort-effect - Used with base schema Increasing/Decreasing - - suggestedTag - Property-not-possible-to-determine - Finding-stopped-by - Finding-unmodified - Finding-triggered-by - - - - Cognitive-task-effect - Used with base schema Increasing/Decreasing. - - suggestedTag - Property-not-possible-to-determine - Finding-stopped-by - Finding-unmodified - Finding-triggered-by - - - - Other-modulators-effect-EEG - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Facilitating-factor - Facilitating factors are defined as transient and sporadic endogenous or exogenous elements capable of augmenting seizure incidence (increasing the likelihood of seizure occurrence). - - Facilitating-factor-alcohol - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Facilitating-factor-awake - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Facilitating-factor-catamenial - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Facilitating-factor-fever - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Facilitating-factor-sleep - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Facilitating-factor-sleep-deprived - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Facilitating-factor-other - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Provocative-factor - Provocative factors are defined as transient and sporadic endogenous or exogenous elements capable of evoking/triggering seizures immediately following the exposure to it. - - requireChild - - - Hyperventilation-provoked - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Reflex-provoked - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Medication-effect-clinical - Medications clinical effect. Used with base schema Increasing/Decreasing. - - suggestedTag - Finding-stopped-by - Finding-unmodified - - - - Medication-reduction-effect-clinical - Medications reduction or withdrawal clinical effect. Used with base schema Increasing/Decreasing. - - suggestedTag - Finding-stopped-by - Finding-unmodified - - - - Other-modulators-effect-clinical - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Intermittent-photic-stimulation-effect - - requireChild - - - Posterior-stimulus-dependent-intermittent-photic-stimulation-response - - suggestedTag - Finding-frequency - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Posterior-stimulus-independent-intermittent-photic-stimulation-response-limited - limited to the stimulus-train - - suggestedTag - Finding-frequency - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Posterior-stimulus-independent-intermittent-photic-stimulation-response-self-sustained - - suggestedTag - Finding-frequency - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Generalized-photoparoxysmal-intermittent-photic-stimulation-response-limited - Limited to the stimulus-train. - - suggestedTag - Finding-frequency - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Generalized-photoparoxysmal-intermittent-photic-stimulation-response-self-sustained - - suggestedTag - Finding-frequency - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Activation-of-pre-existing-epileptogenic-area-intermittent-photic-stimulation-effect - - suggestedTag - Finding-frequency - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Unmodified-intermittent-photic-stimulation-effect - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Quality-of-hyperventilation - - requireChild - - - Hyperventilation-refused-procedure - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Hyperventilation-poor-effort - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Hyperventilation-good-effort - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Hyperventilation-excellent-effort - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Modulators-effect - Tags for describing the influence of the modulators - - requireChild - - - Modulators-effect-continuous-during-NRS - Continuous during non-rapid-eye-movement-sleep (NRS) - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Modulators-effect-only-during - - # - Only during Sleep/Awakening/Hyperventilation/Physical effort/Cognitive task. Free text. - - takesValue - - - valueClass - textClass - - - - - Modulators-effect-change-of-patterns - Change of patterns during sleep/awakening. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - - Time-related-property - Important to estimate how often an interictal abnormality is seen in the recording. - - requireChild - - - Appearance-mode - Describes how the non-ictal EEG pattern/graphoelement is distributed through the recording. - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - Random-appearance-mode - Occurrence of the non-ictal EEG pattern / graphoelement without any rhythmicity / periodicity. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Periodic-appearance-mode - Non-ictal EEG pattern / graphoelement occurring at an approximately regular rate / interval (generally of 1 to several seconds). - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Variable-appearance-mode - Occurrence of non-ictal EEG pattern / graphoelements, that is sometimes rhythmic or periodic, other times random, throughout the recording. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Intermittent-appearance-mode - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Continuous-appearance-mode - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Discharge-pattern - Describes the organization of the EEG signal within the discharge (distinguish between single and repetitive discharges) - - requireChild - - - Single-discharge-pattern - Applies to the intra-burst pattern: a graphoelement that is not repetitive; before and after the graphoelement one can distinguish the background activity. - - suggestedTag - Finding-incidence - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Rhythmic-trains-or-bursts-discharge-pattern - Applies to the intra-burst pattern: a non-ictal graphoelement that repeats itself without returning to the background activity between them. The graphoelements within this repetition occur at approximately constant period. - - suggestedTag - Finding-prevalence - Finding-frequency - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Arrhythmic-trains-or-bursts-discharge-pattern - Applies to the intra-burst pattern: a non-ictal graphoelement that repeats itself without returning to the background activity between them. The graphoelements within this repetition occur at inconstant period. - - suggestedTag - Finding-prevalence - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Fragmented-discharge-pattern - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Periodic-discharge-time-related-features - Periodic discharges not further specified (PDs) time-relayed features tags. - - requireChild - - - Periodic-discharge-duration - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - Very-brief-periodic-discharge-duration - Less than 10 sec. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Brief-periodic-discharge-duration - 10 to 59 sec. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Intermediate-periodic-discharge-duration - 1 to 4.9 min. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Long-periodic-discharge-duration - 5 to 59 min. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Very-long-periodic-discharge-duration - Greater than 1 hour. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Periodic-discharge-onset - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - Sudden-periodic-discharge-onset - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Gradual-periodic-discharge-onset - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Periodic-discharge-dynamics - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - Evolving-periodic-discharge-dynamics - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Fluctuating-periodic-discharge-dynamics - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Static-periodic-discharge-dynamics - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - - Finding-extent - Percentage of occurrence during the recording (background activity and interictal finding). - - # - - takesValue - - - valueClass - numericClass - - - - - Finding-incidence - How often it occurs/time-epoch. - - requireChild - - - Only-once-finding-incidence - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Rare-finding-incidence - less than 1/h - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Uncommon-finding-incidence - 1/5 min to 1/h. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Occasional-finding-incidence - 1/min to 1/5min. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Frequent-finding-incidence - 1/10 s to 1/min. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Abundant-finding-incidence - Greater than 1/10 s). - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Finding-prevalence - The percentage of the recording covered by the train/burst. - - requireChild - - - Rare-finding-prevalence - Less than 1 percent. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Occasional-finding-prevalence - 1 to 9 percent. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Frequent-finding-prevalence - 10 to 49 percent. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Abundant-finding-prevalence - 50 to 89 percent. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Continuous-finding-prevalence - Greater than 90 percent. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - - Posterior-dominant-rhythm-property - Posterior dominant rhythm is the most often scored EEG feature in clinical practice. Therefore, there are specific terms that can be chosen for characterizing the PDR. - - requireChild - - - Posterior-dominant-rhythm-amplitude-range - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - Low-posterior-dominant-rhythm-amplitude-range - Low (less than 20 microV). - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Medium-posterior-dominant-rhythm-amplitude-range - Medium (between 20 and 70 microV). - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - High-posterior-dominant-rhythm-amplitude-range - High (more than 70 microV). - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Posterior-dominant-rhythm-frequency-asymmetry - When symmetrical could be labeled with base schema Symmetrical tag. - - requireChild - - - Posterior-dominant-rhythm-frequency-asymmetry-lower-left - Hz lower on the left side. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Posterior-dominant-rhythm-frequency-asymmetry-lower-right - Hz lower on the right side. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Posterior-dominant-rhythm-eye-opening-reactivity - Change (disappearance or measurable decrease in amplitude) of a posterior dominant rhythm following eye-opening. Eye closure has the opposite effect. - - suggestedTag - Property-not-possible-to-determine - - - Posterior-dominant-rhythm-eye-opening-reactivity-reduced-left - Reduced left side reactivity. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Posterior-dominant-rhythm-eye-opening-reactivity-reduced-right - Reduced right side reactivity. - - # - free text - - takesValue - - - valueClass - textClass - - - - - Posterior-dominant-rhythm-eye-opening-reactivity-reduced-both - Reduced reactivity on both sides. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Posterior-dominant-rhythm-organization - When normal could be labeled with base schema Normal tag. - - requireChild - - - Posterior-dominant-rhythm-organization-poorly-organized - Poorly organized. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Posterior-dominant-rhythm-organization-disorganized - Disorganized. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Posterior-dominant-rhythm-organization-markedly-disorganized - Markedly disorganized. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Posterior-dominant-rhythm-caveat - Caveat to the annotation of PDR. - - requireChild - - - No-posterior-dominant-rhythm-caveat - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Posterior-dominant-rhythm-caveat-only-open-eyes-during-the-recording - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Posterior-dominant-rhythm-caveat-sleep-deprived-caveat - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Posterior-dominant-rhythm-caveat-drowsy - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Posterior-dominant-rhythm-caveat-only-following-hyperventilation - - - - Absence-of-posterior-dominant-rhythm - Reason for absence of PDR. - - requireChild - - - Absence-of-posterior-dominant-rhythm-artifacts - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Absence-of-posterior-dominant-rhythm-extreme-low-voltage - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Absence-of-posterior-dominant-rhythm-eye-closure-could-not-be-achieved - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Absence-of-posterior-dominant-rhythm-lack-of-awake-period - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Absence-of-posterior-dominant-rhythm-lack-of-compliance - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Absence-of-posterior-dominant-rhythm-other-causes - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - - Episode-property - - requireChild - - - Seizure-classification - Seizure classification refers to the grouping of seizures based on their clinical features, EEG patterns, and other characteristics. Epileptic seizures are named using the current ILAE seizure classification (Fisher et al., 2017, Beniczky et al., 2017). - - requireChild - - - Motor-seizure - Involves musculature in any form. The motor event could consist of an increase (positive) or decrease (negative) in muscle contraction to produce a movement. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - - Motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - Myoclonic-motor-seizure - Sudden, brief ( lower than 100 msec) involuntary single or multiple contraction(s) of muscles(s) or muscle groups of variable topography (axial, proximal limb, distal). Myoclonus is less regularly repetitive and less sustained than is clonus. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - - Myoclonic-motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - - Negative-myoclonic-motor-seizure - - - Negative-myoclonic-motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - - Clonic-motor-seizure - Jerking, either symmetric or asymmetric, that is regularly repetitive and involves the same muscle groups. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - - Clonic-motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - - Tonic-motor-seizure - A sustained increase in muscle contraction lasting a few seconds to minutes. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - - Tonic-motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - - Atonic-motor-seizure - Sudden loss or diminution of muscle tone without apparent preceding myoclonic or tonic event lasting about 1 to 2 s, involving head, trunk, jaw, or limb musculature. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - - Atonic-motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - - Myoclonic-atonic-motor-seizure - A generalized seizure type with a myoclonic jerk leading to an atonic motor component. This type was previously called myoclonic astatic. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - - Myoclonic-atonic-motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - - Myoclonic-tonic-clonic-motor-seizure - One or a few jerks of limbs bilaterally, followed by a tonic clonic seizure. The initial jerks can be considered to be either a brief period of clonus or myoclonus. Seizures with this characteristic are common in juvenile myoclonic epilepsy. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - - Myoclonic-tonic-clonic-motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - - Tonic-clonic-motor-seizure - A sequence consisting of a tonic followed by a clonic phase. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - - Tonic-clonic-motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - - Automatism-motor-seizure - A more or less coordinated motor activity usually occurring when cognition is impaired and for which the subject is usually (but not always) amnesic afterward. This often resembles a voluntary movement and may consist of an inappropriate continuation of preictal motor activity. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - - Automatism-motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - - Hyperkinetic-motor-seizure - - - Hyperkinetic-motor-onset-seizure - - deprecatedFrom - 1.0.0 - - - - Epileptic-spasm-episode - A sudden flexion, extension, or mixed extension flexion of predominantly proximal and truncal muscles that is usually more sustained than a myoclonic movement but not as sustained as a tonic seizure. Limited forms may occur: Grimacing, head nodding, or subtle eye movements. Epileptic spasms frequently occur in clusters. Infantile spasms are the best known form, but spasms can occur at all ages. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - - - Nonmotor-seizure - Focal or generalized seizure types in which motor activity is not prominent. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - Behavior-arrest-nonmotor-seizure - Arrest (pause) of activities, freezing, immobilization, as in behavior arrest seizure. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - - Sensory-nonmotor-seizure - A perceptual experience not caused by appropriate stimuli in the external world. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - - Emotional-nonmotor-seizure - Seizures presenting with an emotion or the appearance of having an emotion as an early prominent feature, such as fear, spontaneous joy or euphoria, laughing (gelastic), or crying (dacrystic). Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - - Cognitive-nonmotor-seizure - Pertaining to thinking and higher cortical functions, such as language, spatial perception, memory, and praxis. The previous term for similar usage as a seizure type was psychic. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - - Autonomic-nonmotor-seizure - A distinct alteration of autonomic nervous system function involving cardiovascular, pupillary, gastrointestinal, sudomotor, vasomotor, and thermoregulatory functions. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - - - Absence-seizure - Absence seizures present with a sudden cessation of activity and awareness. Absence seizures tend to occur in younger age groups, have more sudden start and termination, and they usually display less complex automatisms than do focal seizures with impaired awareness, but the distinctions are not absolute. EEG information may be required for accurate classification. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - Typical-absence-seizure - A sudden onset, interruption of ongoing activities, a blank stare, possibly a brief upward deviation of the eyes. Usually the patient will be unresponsive when spoken to. Duration is a few seconds to half a minute with very rapid recovery. Although not always available, an EEG would show generalized epileptiform discharges during the event. An absence seizure is by definition a seizure of generalized onset. The word is not synonymous with a blank stare, which also can be encountered with focal onset seizures. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - - Atypical-absence-seizure - An absence seizure with changes in tone that are more pronounced than in typical absence or the onset and/or cessation is not abrupt, often associated with slow, irregular, generalized spike-wave activity. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - - Myoclonic-absence-seizure - A myoclonic absence seizure refers to an absence seizure with rhythmic three-per-second myoclonic movements, causing ratcheting abduction of the upper limbs leading to progressive arm elevation, and associated with three-per-second generalized spike-wave discharges. Duration is typically 10 to 60 s. Impairment of consciousness may not be obvious. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - - Eyelid-myoclonia-absence-seizure - Eyelid myoclonia are myoclonic jerks of the eyelids and upward deviation of the eyes, often precipitated by closing the eyes or by light. Eyelid myoclonia can be associated with absences, but also can be motor seizures without a corresponding absence, making them difficult to categorize. The 2017 classification groups them with nonmotor (absence) seizures, which may seem counterintuitive, but the myoclonia in this instance is meant to link with absence, rather than with nonmotor. Definition from ILAE 2017 Classification of Seizure Types Expanded Version - - - - - Episode-phase - The electroclinical findings (i.e., the seizure semiology and the ictal EEG) are divided in three phases: onset, propagation, and postictal. - - requireChild - - - suggestedTag - Seizure-semiology-manifestation - Postictal-semiology-manifestation - Ictal-EEG-patterns - - - Episode-phase-initial - - - Episode-phase-subsequent - - - Episode-phase-postictal - - - - Seizure-semiology-manifestation - Seizure semiology refers to the clinical features or signs that are observed during a seizure, such as the type of movements or behaviors exhibited by the person having the seizure, the duration of the seizure, the level of consciousness, and any associated symptoms such as aura or postictal confusion. In other words, seizure semiology describes the physical manifestations of a seizure. Semiology is described according to the ILAE Glossary of Descriptive Terminology for Ictal Semiology (Blume et al., 2001). Besides the name, the semiologic finding can also be characterized by the somatotopic modifier, laterality, body part and centricity. Uses Location-property tags. - - requireChild - - - Semiology-motor-manifestation - - Semiology-elementary-motor - - Semiology-motor-tonic - A sustained increase in muscle contraction lasting a few seconds to minutes. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - - Semiology-motor-dystonic - Sustained contractions of both agonist and antagonist muscles producing athetoid or twisting movements, which, when prolonged, may produce abnormal postures. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - - Semiology-motor-epileptic-spasm - A sudden flexion, extension, or mixed extension flexion of predominantly proximal and truncal muscles that is usually more sustained than a myoclonic movement but not so sustained as a tonic seizure (i.e., about 1 s). Limited forms may occur: grimacing, head nodding. Frequent occurrence in clusters. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - - Semiology-motor-postural - Adoption of a posture that may be bilaterally symmetric or asymmetric (as in a fencing posture). - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - - Semiology-motor-versive - A sustained, forced conjugate ocular, cephalic, and/or truncal rotation or lateral deviation from the midline. - - suggestedTag - Body-part-location - Episode-event-count - - - - Semiology-motor-clonic - Myoclonus that is regularly repetitive, involves the same muscle groups, at a frequency of about 2 to 3 c/s, and is prolonged. Synonym: rhythmic myoclonus . - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - - Semiology-motor-myoclonic - Characterized by myoclonus. MYOCLONUS : sudden, brief (lower than 100 ms) involuntary single or multiple contraction(s) of muscles(s) or muscle groups of variable topography (axial, proximal limb, distal). - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - - Semiology-motor-jacksonian-march - Term indicating spread of clonic movements through contiguous body parts unilaterally. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - - Semiology-motor-negative-myoclonus - Characterized by negative myoclonus. NEGATIVE MYOCLONUS: interruption of tonic muscular activity for lower than 500 ms without evidence of preceding myoclonia. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - - Semiology-motor-tonic-clonic - A sequence consisting of a tonic followed by a clonic phase. Variants such as clonic-tonic-clonic may be seen. Asymmetry of limb posture during the tonic phase of a GTC: one arm is rigidly extended at the elbow (often with the fist clenched tightly and flexed at the wrist), whereas the opposite arm is flexed at the elbow. - - requireChild - - - Semiology-motor-tonic-clonic-without-figure-of-four - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - - Semiology-motor-tonic-clonic-with-figure-of-four-extension-left-elbow - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - - Semiology-motor-tonic-clonic-with-figure-of-four-extension-right-elbow - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - - - Semiology-motor-astatic - Loss of erect posture that results from an atonic, myoclonic, or tonic mechanism. Synonym: drop attack. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - - Semiology-motor-atonic - Sudden loss or diminution of muscle tone without apparent preceding myoclonic or tonic event lasting greater or equal to 1 to 2 s, involving head, trunk, jaw, or limb musculature. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - - Semiology-motor-eye-blinking - - suggestedTag - Brain-laterality - Episode-event-count - - - - Semiology-motor-other-elementary-motor - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Semiology-motor-automatisms - - Semiology-motor-automatisms-mimetic - Facial expression suggesting an emotional state, often fear. - - suggestedTag - Episode-responsiveness - Episode-appearance - Episode-event-count - - - - Semiology-motor-automatisms-oroalimentary - Lip smacking, lip pursing, chewing, licking, tooth grinding, or swallowing. - - suggestedTag - Episode-responsiveness - Episode-appearance - Episode-event-count - - - - Semiology-motor-automatisms-dacrystic - Bursts of crying. - - suggestedTag - Episode-responsiveness - Episode-appearance - Episode-event-count - - - - Semiology-motor-automatisms-dyspraxic - Inability to perform learned movements spontaneously or on command or imitation despite intact relevant motor and sensory systems and adequate comprehension and cooperation. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-responsiveness - Episode-appearance - Episode-event-count - - - - Semiology-motor-automatisms-manual - 1. Indicates principally distal components, bilateral or unilateral. 2. Fumbling, tapping, manipulating movements. - - suggestedTag - Brain-laterality - Brain-centricity - Episode-responsiveness - Episode-appearance - Episode-event-count - - - - Semiology-motor-automatisms-gestural - Semipurposive, asynchronous hand movements. Often unilateral. - - suggestedTag - Brain-laterality - Episode-responsiveness - Episode-appearance - Episode-event-count - - - - Semiology-motor-automatisms-pedal - 1. Indicates principally distal components, bilateral or unilateral. 2. Fumbling, tapping, manipulating movements. - - suggestedTag - Brain-laterality - Brain-centricity - Episode-responsiveness - Episode-appearance - Episode-event-count - - - - Semiology-motor-automatisms-hypermotor - 1. Involves predominantly proximal limb or axial muscles producing irregular sequential ballistic movements, such as pedaling, pelvic thrusting, thrashing, rocking movements. 2. Increase in rate of ongoing movements or inappropriately rapid performance of a movement. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-responsiveness - Episode-appearance - Episode-event-count - - - - Semiology-motor-automatisms-hypokinetic - A decrease in amplitude and/or rate or arrest of ongoing motor activity. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-responsiveness - Episode-appearance - Episode-event-count - - - - Semiology-motor-automatisms-gelastic - Bursts of laughter or giggling, usually without an appropriate affective tone. - - suggestedTag - Episode-responsiveness - Episode-appearance - Episode-event-count - - - - Semiology-motor-other-automatisms - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Semiology-motor-behavioral-arrest - Interruption of ongoing motor activity or of ongoing behaviors with fixed gaze, without movement of the head or trunk (oro-alimentary and hand automatisms may continue). - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - - - Semiology-non-motor-manifestation - - Semiology-sensory - - Semiology-sensory-headache - Headache occurring in close temporal proximity to the seizure or as the sole seizure manifestation. - - suggestedTag - Brain-laterality - Episode-event-count - - - - Semiology-sensory-visual - Flashing or flickering lights, spots, simple patterns, scotomata, or amaurosis. - - suggestedTag - Brain-laterality - Episode-event-count - - - - Semiology-sensory-auditory - Buzzing, drumming sounds or single tones. - - suggestedTag - Brain-laterality - Episode-event-count - - - - Semiology-sensory-olfactory - - suggestedTag - Body-part-location - Episode-event-count - - - - Semiology-sensory-gustatory - Taste sensations including acidic, bitter, salty, sweet, or metallic. - - suggestedTag - Episode-event-count - - - - Semiology-sensory-epigastric - Abdominal discomfort including nausea, emptiness, tightness, churning, butterflies, malaise, pain, and hunger; sensation may rise to chest or throat. Some phenomena may reflect ictal autonomic dysfunction. - - suggestedTag - Episode-event-count - - - - Semiology-sensory-somatosensory - Tingling, numbness, electric-shock sensation, sense of movement or desire to move. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - - Semiology-sensory-painful - Peripheral (lateralized/bilateral), cephalic, abdominal. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - - Semiology-sensory-autonomic-sensation - A sensation consistent with involvement of the autonomic nervous system, including cardiovascular, gastrointestinal, sudomotor, vasomotor, and thermoregulatory functions. (Thus autonomic aura; cf. autonomic events 3.0). - - suggestedTag - Episode-event-count - - - - Semiology-sensory-other - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Semiology-experiential - - Semiology-experiential-affective-emotional - Components include fear, depression, joy, and (rarely) anger. - - suggestedTag - Episode-event-count - - - - Semiology-experiential-hallucinatory - Composite perceptions without corresponding external stimuli involving visual, auditory, somatosensory, olfactory, and/or gustatory phenomena. Example: hearing and seeing people talking. - - suggestedTag - Episode-event-count - - - - Semiology-experiential-illusory - An alteration of actual percepts involving the visual, auditory, somatosensory, olfactory, or gustatory systems. - - suggestedTag - Episode-event-count - - - - Semiology-experiential-mnemonic - Components that reflect ictal dysmnesia such as feelings of familiarity (deja-vu) and unfamiliarity (jamais-vu). - - Semiology-experiential-mnemonic-Deja-vu - - suggestedTag - Episode-event-count - - - - Semiology-experiential-mnemonic-Jamais-vu - - suggestedTag - Episode-event-count - - - - - Semiology-experiential-other - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Semiology-dyscognitive - The term describes events in which (1) disturbance of cognition is the predominant or most apparent feature, and (2a) two or more of the following components are involved, or (2b) involvement of such components remains undetermined. Otherwise, use the more specific term (e.g., mnemonic experiential seizure or hallucinatory experiential seizure). Components of cognition: ++ perception: symbolic conception of sensory information ++ attention: appropriate selection of a principal perception or task ++ emotion: appropriate affective significance of a perception ++ memory: ability to store and retrieve percepts or concepts ++ executive function: anticipation, selection, monitoring of consequences, and initiation of motor activity including praxis, speech. - - suggestedTag - Episode-event-count - - - - Semiology-language-related - - Semiology-language-related-vocalization - - suggestedTag - Episode-event-count - - - - Semiology-language-related-verbalization - - suggestedTag - Episode-event-count - - - - Semiology-language-related-dysphasia - - suggestedTag - Episode-event-count - - - - Semiology-language-related-aphasia - - suggestedTag - Episode-event-count - - - - Semiology-language-related-other - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Semiology-autonomic - - Semiology-autonomic-pupillary - Mydriasis, miosis (either bilateral or unilateral). - - suggestedTag - Brain-laterality - Episode-event-count - - - - Semiology-autonomic-hypersalivation - Increase in production of saliva leading to uncontrollable drooling - - suggestedTag - Episode-event-count - - - - Semiology-autonomic-respiratory-apnoeic - subjective shortness of breath, hyperventilation, stridor, coughing, choking, apnea, oxygen desaturation, neurogenic pulmonary edema. - - suggestedTag - Episode-event-count - - - - Semiology-autonomic-cardiovascular - Modifications of heart rate (tachycardia, bradycardia), cardiac arrhythmias (such as sinus arrhythmia, sinus arrest, supraventricular tachycardia, atrial premature depolarizations, ventricular premature depolarizations, atrio-ventricular block, bundle branch block, atrioventricular nodal escape rhythm, asystole). - - suggestedTag - Episode-event-count - - - - Semiology-autonomic-gastrointestinal - Nausea, eructation, vomiting, retching, abdominal sensations, abdominal pain, flatulence, spitting, diarrhea. - - suggestedTag - Episode-event-count - - - - Semiology-autonomic-urinary-incontinence - urinary urge (intense urinary urge at the beginning of seizures), urinary incontinence, ictal urination (rare symptom of partial seizures without loss of consciousness). - - suggestedTag - Episode-event-count - - - - Semiology-autonomic-genital - Sexual auras (erotic thoughts and feelings, sexual arousal and orgasm). Genital auras (unpleasant, sometimes painful, frightening or emotionally neutral somatosensory sensations in the genitals that can be accompanied by ictal orgasm). Sexual automatisms (hypermotor movements consisting of writhing, thrusting, rhythmic movements of the pelvis, arms and legs, sometimes associated with picking and rhythmic manipulation of the groin or genitalia, exhibitionism and masturbation). - - suggestedTag - Episode-event-count - - - - Semiology-autonomic-vasomotor - Flushing or pallor (may be accompanied by feelings of warmth, cold and pain). - - suggestedTag - Episode-event-count - - - - Semiology-autonomic-sudomotor - Sweating and piloerection (may be accompanied by feelings of warmth, cold and pain). - - suggestedTag - Brain-laterality - Episode-event-count - - - - Semiology-autonomic-thermoregulatory - Hyperthermia, fever. - - suggestedTag - Episode-event-count - - - - Semiology-autonomic-other - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - - Semiology-manifestation-other - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Postictal-semiology-manifestation - - requireChild - - - Postictal-semiology-unconscious - - suggestedTag - Episode-event-count - - - - Postictal-semiology-quick-recovery-of-consciousness - Quick recovery of awareness and responsiveness. - - suggestedTag - Episode-event-count - - - - Postictal-semiology-aphasia-or-dysphasia - Impaired communication involving language without dysfunction of relevant primary motor or sensory pathways, manifested as impaired comprehension, anomia, parahasic errors or a combination of these. - - suggestedTag - Episode-event-count - - - - Postictal-semiology-behavioral-change - Occurring immediately after a aseizure. Including psychosis, hypomanina, obsessive-compulsive behavior. - - suggestedTag - Episode-event-count - - - - Postictal-semiology-hemianopia - Postictal visual loss in a a hemi field. - - suggestedTag - Brain-laterality - Episode-event-count - - - - Postictal-semiology-impaired-cognition - Decreased Cognitive performance involving one or more of perception, attention, emotion, memory, execution, praxis, speech. - - suggestedTag - Episode-event-count - - - - Postictal-semiology-dysphoria - Depression, irritability, euphoric mood, fear, anxiety. - - suggestedTag - Episode-event-count - - - - Postictal-semiology-headache - Headache with features of tension-type or migraine headache that develops within 3 h following the seizure and resolves within 72 h after seizure. - - suggestedTag - Episode-event-count - - - - Postictal-semiology-nose-wiping - Noes-wiping usually within 60 sec of seizure offset, usually with the hand ipsilateral to the seizure onset. - - suggestedTag - Brain-laterality - Episode-event-count - - - - Postictal-semiology-anterograde-amnesia - Impaired ability to remember new material. - - suggestedTag - Episode-event-count - - - - Postictal-semiology-retrograde-amnesia - Impaired ability to recall previously remember material. - - suggestedTag - Episode-event-count - - - - Postictal-semiology-paresis - Todds palsy. Any unilateral postictal dysfunction relating to motor, language, sensory and/or integrative functions. - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - Episode-event-count - - - - Postictal-semiology-sleep - Invincible need to sleep after a seizure. - - - Postictal-semiology-unilateral-myoclonic-jerks - unilateral motor phenomena, other then specified, occurring in postictal phase. - - - Postictal-semiology-other-unilateral-motor-phenomena - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Polygraphic-channel-relation-to-episode - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - Polygraphic-channel-cause-to-episode - - - Polygraphic-channel-consequence-of-episode - - - - Ictal-EEG-patterns - - Ictal-EEG-patterns-obscured-by-artifacts - The interpretation of the EEG is not possible due to artifacts. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Ictal-EEG-activity - - suggestedTag - Polyspikes-morphology - Fast-spike-activity-morphology - Low-voltage-fast-activity-morphology - Polysharp-waves-morphology - Spike-and-slow-wave-morphology - Polyspike-and-slow-wave-morphology - Sharp-and-slow-wave-morphology - Rhythmic-activity-morphology - Slow-wave-large-amplitude-morphology - Irregular-delta-or-theta-activity-morphology - Electrodecremental-change-morphology - DC-shift-morphology - Disappearance-of-ongoing-activity-morphology - Brain-laterality - Brain-region - Sensors - Source-analysis-laterality - Source-analysis-brain-region - Episode-event-count - - - - Postictal-EEG-activity - - suggestedTag - Brain-laterality - Body-part-location - Brain-centricity - - - - - Episode-time-context-property - Additional clinically relevant features related to episodes can be scored under timing and context. If needed, episode duration can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Temporal-value/Duration. - - Episode-consciousness - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - Episode-consciousness-not-tested - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Episode-consciousness-affected - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Episode-consciousness-mildly-affected - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Episode-consciousness-not-affected - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Episode-awareness - - suggestedTag - Property-not-possible-to-determine - Property-exists - Property-absence - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Clinical-EEG-temporal-relationship - - suggestedTag - Property-not-possible-to-determine - - - Clinical-start-followed-EEG - Clinical start, followed by EEG start by X seconds. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - - - EEG-start-followed-clinical - EEG start, followed by clinical start by X seconds. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - - - Simultaneous-start-clinical-EEG - - - Clinical-EEG-temporal-relationship-notes - Clinical notes to annotate the clinical-EEG temporal relationship. - - # - - takesValue - - - valueClass - textClass - - - - - - Episode-event-count - Number of stereotypical episodes during the recording. - - suggestedTag - Property-not-possible-to-determine - - - # - - takesValue - - - valueClass - numericClass - - - - - State-episode-start - State at the start of the episode. - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - Episode-start-from-sleep - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Episode-start-from-awake - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Episode-postictal-phase - - suggestedTag - Property-not-possible-to-determine - - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - - - Episode-prodrome - Prodrome is a preictal phenomenon, and it is defined as a subjective or objective clinical alteration (e.g., ill-localized sensation or agitation) that heralds the onset of an epileptic seizure but does not form part of it (Blume et al., 2001). Therefore, prodrome should be distinguished from aura (which is an ictal phenomenon). - - suggestedTag - Property-exists - Property-absence - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Episode-tongue-biting - - suggestedTag - Property-exists - Property-absence - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Episode-responsiveness - - requireChild - - - suggestedTag - Property-not-possible-to-determine - - - Episode-responsiveness-preserved - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Episode-responsiveness-affected - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Episode-appearance - - requireChild - - - Episode-appearance-interactive - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Episode-appearance-spontaneous - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Seizure-dynamics - Spatiotemporal dynamics can be scored (evolution in morphology; evolution in frequency; evolution in location). - - requireChild - - - Seizure-dynamics-evolution-morphology - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Seizure-dynamics-evolution-frequency - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Seizure-dynamics-evolution-location - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Seizure-dynamics-not-possible-to-determine - Not possible to determine. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - - - Other-finding-property - - requireChild - - - Artifact-significance-to-recording - It is important to score the significance of the described artifacts: recording is not interpretable, recording of reduced diagnostic value, does not interfere with the interpretation of the recording. - - requireChild - - - Recording-not-interpretable-due-to-artifact - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Recording-of-reduced-diagnostic-value-due-to-artifact - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Artifact-does-not-interfere-recording - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Finding-significance-to-recording - Significance of finding. When normal/abnormal could be labeled with base schema Normal/Abnormal tags. - - requireChild - - - Finding-no-definite-abnormality - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Finding-significance-not-possible-to-determine - Not possible to determine. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Finding-frequency - Value in Hz (number) typed in. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - frequencyUnits - - - - - Finding-amplitude - Value in microvolts (number) typed in. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - electricPotentialUnits - - - - - Finding-amplitude-asymmetry - For posterior dominant rhythm: a difference in amplitude between the homologous area on opposite sides of the head that consistently exceeds 50 percent. When symmetrical could be labeled with base schema Symmetrical tag. For sleep: Absence or consistently marked amplitude asymmetry (greater than 50 percent) of a normal sleep graphoelement. - - requireChild - - - Finding-amplitude-asymmetry-lower-left - Amplitude lower on the left side. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Finding-amplitude-asymmetry-lower-right - Amplitude lower on the right side. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Finding-amplitude-asymmetry-not-possible-to-determine - Not possible to determine. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Finding-stopped-by - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Finding-triggered-by - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Finding-unmodified - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Property-not-possible-to-determine - Not possible to determine. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Property-exists - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Property-absence - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - - Interictal-finding - EEG pattern / transient that is distinguished form the background activity, considered abnormal, but is not recorded during ictal period (seizure) or postictal period; the presence of an interictal finding does not necessarily imply that the patient has epilepsy. - - requireChild - - - Epileptiform-interictal-activity - - suggestedTag - Spike-morphology - Spike-and-slow-wave-morphology - Runs-of-rapid-spikes-morphology - Polyspikes-morphology - Polyspike-and-slow-wave-morphology - Sharp-wave-morphology - Sharp-and-slow-wave-morphology - Slow-sharp-wave-morphology - High-frequency-oscillation-morphology - Hypsarrhythmia-classic-morphology - Hypsarrhythmia-modified-morphology - Brain-laterality - Brain-region - Sensors - Finding-propagation - Multifocal-finding - Appearance-mode - Discharge-pattern - Finding-incidence - - - - Abnormal-interictal-rhythmic-activity - - suggestedTag - Rhythmic-activity-morphology - Polymorphic-delta-activity-morphology - Frontal-intermittent-rhythmic-delta-activity-morphology - Occipital-intermittent-rhythmic-delta-activity-morphology - Temporal-intermittent-rhythmic-delta-activity-morphology - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - Finding-incidence - - - - Interictal-special-patterns - - requireChild - - - Interictal-periodic-discharges - Periodic discharge not further specified (PDs). - - suggestedTag - Periodic-discharge-morphology - Brain-laterality - Brain-region - Sensors - Periodic-discharge-time-related-features - - - Generalized-periodic-discharges - GPDs. - - - Lateralized-periodic-discharges - LPDs. - - - Bilateral-independent-periodic-discharges - BIPDs. - - - Multifocal-periodic-discharges - MfPDs. - - - - Extreme-delta-brush - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - - - - Physiologic-pattern - EEG graphoelements or rhythms that are considered normal. They only should be scored if the physician considers that they have a specific clinical significance for the recording. - - requireChild - - - Rhythmic-activity-pattern - Not further specified. - - suggestedTag - Rhythmic-activity-morphology - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - - Slow-alpha-variant-rhythm - Characteristic rhythms mostly at 4-5 Hz, recorded most prominently over the posterior regions of the head. Generally alternate, or are intermixed, with alpha rhythm to which they often are harmonically related. Amplitude varies but is frequently close to 50 micro V. Blocked or attenuated by attention, especially visual, and mental effort. Comment: slow alpha variant rhythms should be distinguished from posterior slow waves characteristic of children and adolescents and occasionally seen in young adults. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - - Fast-alpha-variant-rhythm - Characteristic rhythm at 14-20 Hz, detected most prominently over the posterior regions of the head. May alternate or be intermixed with alpha rhythm. Blocked or attenuated by attention, especially visual, and mental effort. - - suggestedTag - Appearance-mode - Discharge-pattern - - - - Ciganek-rhythm - Midline theta rhythm (Ciganek rhythm) may be observed during wakefulness or drowsiness. The frequency is 4-7 Hz, and the location is midline (ie, vertex). The morphology is rhythmic, smooth, sinusoidal, arciform, spiky, or mu-like. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - - Lambda-wave - Diphasic sharp transient occurring over occipital regions of the head of waking subjects during visual exploration. The main component is positive relative to other areas. Time-locked to saccadic eye movement. Amplitude varies but is generally below 50 micro V. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - - Posterior-slow-waves-youth - Waves in the delta and theta range, of variable form, lasting 0.35 to 0.5 s or longer without any consistent periodicity, found in the range of 6-12 years (occasionally seen in young adults). Alpha waves are almost always intermingled or superimposed. Reactive similar to alpha activity. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - - Diffuse-slowing-hyperventilation - Diffuse slowing induced by hyperventilation. Bilateral, diffuse slowing during hyperventilation. Recorded in 70 percent of normal children (3-5 years) and less then 10 percent of adults. Usually appear in the posterior regions and spread forward in younger age group, whereas they tend to appear in the frontal regions and spread backward in the older age group. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - - Photic-driving - Physiologic response consisting of rhythmic activity elicited over the posterior regions of the head by repetitive photic stimulation at frequencies of about 5-30 Hz. Comments: term should be limited to activity time-locked to the stimulus and of frequency identical or harmonically related to the stimulus frequency. Photic driving should be distinguished from the visual evoked potentials elicited by isolated flashes of light or flashes repeated at very low frequency. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - - Photomyogenic-response - A response to intermittent photic stimulation characterized by the appearance in the record of brief, repetitive muscular artifacts (spikes) over the anterior regions of the head. These often increase gradually in amplitude as stimuli are continued and cease promptly when the stimulus is withdrawn. Comment: this response is frequently associated with flutter of the eyelids and vertical oscillations of the eyeballs and sometimes with discrete jerking mostly involving the musculature of the face and head. (Preferred to synonym: photo-myoclonic response). - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - - Other-physiologic-pattern - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Polygraphic-channel-finding - Changes observed in polygraphic channels can be scored: EOG, Respiration, ECG, EMG, other polygraphic channel (+ free text), and their significance logged (normal, abnormal, no definite abnormality). - - requireChild - - - EOG-channel-finding - ElectroOculoGraphy. - - suggestedTag - Finding-significance-to-recording - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Respiration-channel-finding - - suggestedTag - Finding-significance-to-recording - - - Respiration-oxygen-saturation - - # - - takesValue - - - valueClass - numericClass - - - - - Respiration-feature - - Apnoe-respiration - Add duration (range in seconds) and comments in free text. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Hypopnea-respiration - Add duration (range in seconds) and comments in free text - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Apnea-hypopnea-index-respiration - Events/h. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Periodic-respiration - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Tachypnea-respiration - Cycles/min. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Other-respiration-feature - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - - ECG-channel-finding - Electrocardiography. - - suggestedTag - Finding-significance-to-recording - - - ECG-QT-period - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - ECG-feature - - ECG-sinus-rhythm - Normal rhythm. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - ECG-arrhythmia - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - ECG-asystolia - Add duration (range in seconds) and comments in free text. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - ECG-bradycardia - Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - ECG-extrasystole - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - ECG-ventricular-premature-depolarization - Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - ECG-tachycardia - Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Other-ECG-feature - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - - EMG-channel-finding - electromyography - - suggestedTag - Finding-significance-to-recording - - - EMG-muscle-side - - EMG-left-muscle - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - EMG-right-muscle - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - EMG-bilateral-muscle - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - EMG-muscle-name - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - EMG-feature - - EMG-myoclonus - - Negative-myoclonus - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - EMG-myoclonus-rhythmic - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - EMG-myoclonus-arrhythmic - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - EMG-myoclonus-synchronous - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - EMG-myoclonus-asynchronous - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - EMG-PLMS - Periodic limb movements in sleep. - - - EMG-spasm - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - EMG-tonic-contraction - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - EMG-asymmetric-activation - - requireChild - - - EMG-asymmetric-activation-left-first - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - EMG-asymmetric-activation-right-first - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Other-EMG-features - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - - Other-polygraphic-channel - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Sleep-and-drowsiness - The features of the ongoing activity during sleep are scored here. If abnormal graphoelements appear, disappear or change their morphology during sleep, that is not scored here but at the entry corresponding to that graphooelement (as a modulator). - - requireChild - - - Sleep-architecture - For longer recordings. Only to be scored if whole-night sleep is part of the recording. It is a global descriptor of the structure and pattern of sleep: estimation of the amount of time spent in REM and NREM sleep, sleep duration, NREM-REM cycle. - - suggestedTag - Property-not-possible-to-determine - - - Normal-sleep-architecture - - - Abnormal-sleep-architecture - - - - Sleep-stage-reached - For normal sleep patterns the sleep stages reached during the recording can be specified - - requireChild - - - suggestedTag - Property-not-possible-to-determine - Finding-significance-to-recording - - - Sleep-stage-N1 - Sleep stage 1. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Sleep-stage-N2 - Sleep stage 2. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Sleep-stage-N3 - Sleep stage 3. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - Sleep-stage-REM - Rapid eye movement. - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - Sleep-spindles - Burst at 11-15 Hz but mostly at 12-14 Hz generally diffuse but of higher voltage over the central regions of the head, occurring during sleep. Amplitude varies but is mostly below 50 microV in the adult. - - suggestedTag - Finding-significance-to-recording - Brain-laterality - Brain-region - Sensors - Finding-amplitude-asymmetry - - - - Arousal-pattern - Arousal pattern in children. Prolonged, marked high voltage 4-6/s activity in all leads with some intermixed slower frequencies, in children. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - - Frontal-arousal-rhythm - Prolonged (up to 20s) rhythmical sharp or spiky activity over the frontal areas (maximum over the frontal midline) seen at arousal from sleep in children with minimal cerebral dysfunction. - - suggestedTag - Appearance-mode - Discharge-pattern - - - - Vertex-wave - Sharp potential, maximal at the vertex, negative relative to other areas, apparently occurring spontaneously during sleep or in response to a sensory stimulus during sleep or wakefulness. May be single or repetitive. Amplitude varies but rarely exceeds 250 microV. Abbreviation: V wave. Synonym: vertex sharp wave. - - suggestedTag - Finding-significance-to-recording - Brain-laterality - Brain-region - Sensors - Finding-amplitude-asymmetry - - - - K-complex - A burst of somewhat variable appearance, consisting most commonly of a high voltage negative slow wave followed by a smaller positive slow wave frequently associated with a sleep spindle. Duration greater than 0.5 s. Amplitude is generally maximal in the frontal vertex. K complexes occur during nonREM sleep, apparently spontaneously, or in response to sudden sensory / auditory stimuli, and are not specific for any individual sensory modality. - - suggestedTag - Finding-significance-to-recording - Brain-laterality - Brain-region - Sensors - Finding-amplitude-asymmetry - - - - Saw-tooth-waves - Vertex negative 2-5 Hz waves occuring in series during REM sleep - - suggestedTag - Finding-significance-to-recording - Brain-laterality - Brain-region - Sensors - Finding-amplitude-asymmetry - - - - POSTS - Positive occipital sharp transients of sleep. Sharp transient maximal over the occipital regions, positive relative to other areas, apparently occurring spontaneously during sleep. May be single or repetitive. Amplitude varies but is generally bellow 50 microV. - - suggestedTag - Finding-significance-to-recording - Brain-laterality - Brain-region - Sensors - Finding-amplitude-asymmetry - - - - Hypnagogic-hypersynchrony - Bursts of bilateral, synchronous delta or theta activity of large amplitude, occasionally with superimposed faster components, occurring during falling asleep or during awakening, in children. - - suggestedTag - Finding-significance-to-recording - Brain-laterality - Brain-region - Sensors - Finding-amplitude-asymmetry - - - - Non-reactive-sleep - EEG activity consisting of normal sleep graphoelements, but which cannot be interrupted by external stimuli/ the patient cannot be waken. - - - - Uncertain-significant-pattern - EEG graphoelements or rhythms that resemble abnormal patterns but that are not necessarily associated with a pathology, and the physician does not consider them abnormal in the context of the scored recording (like normal variants and patterns). - - requireChild - - - Sharp-transient-pattern - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - - Wicket-spikes - Spike-like monophasic negative single waves or trains of waves occurring over the temporal regions during drowsiness that have an arcuate or mu-like appearance. These are mainly seen in older individuals and represent a benign variant that is of little clinical significance. - - - Small-sharp-spikes - Benign epileptiform Transients of Sleep (BETS). Small sharp spikes (SSS) of very short duration and low amplitude, often followed by a small theta wave, occurring in the temporal regions during drowsiness and light sleep. They occur on one or both sides (often asynchronously). The main negative and positive components are of about equally spiky character. Rarely seen in children, they are seen most often in adults and the elderly. Two thirds of the patients have a history of epileptic seizures. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - - Fourteen-six-Hz-positive-burst - Burst of arch-shaped waves at 13-17 Hz and/or 5-7-Hz but most commonly at 14 and or 6 Hz seen generally over the posterior temporal and adjacent areas of one or both sides of the head during sleep. The sharp peaks of its component waves are positive with respect to other regions. Amplitude varies but is generally below 75 micro V. Comments: (1) best demonstrated by referential recording using contralateral earlobe or other remote, reference electrodes. (2) This pattern has no established clinical significance. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - - Six-Hz-spike-slow-wave - Spike and slow wave complexes at 4-7Hz, but mostly at 6 Hz occurring generally in brief bursts bilaterally and synchronously, symmetrically or asymmetrically, and either confined to or of larger amplitude over the posterior or anterior regions of the head. The spike has a strong positive component. Amplitude varies but is generally smaller than that of spike-and slow-wave complexes repeating at slower rates. Comment: this pattern should be distinguished from epileptiform discharges. Synonym: wave and spike phantom. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - - Rudimentary-spike-wave-complex - Synonym: Pseudo petit mal discharge. Paroxysmal discharge that consists of generalized or nearly generalized high voltage 3 to 4/sec waves with poorly developed spike in the positive trough between the slow waves, occurring in drowsiness only. It is found only in infancy and early childhood when marked hypnagogic rhythmical theta activity is paramount in the drowsy state. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - - Slow-fused-transient - A posterior slow-wave preceded by a sharp-contoured potential that blends together with the ensuing slow wave, in children. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - - Needle-like-occipital-spikes-blind - Spike discharges of a particularly fast and needle-like character develop over the occipital region in most congenitally blind children. Completely disappear during childhood or adolescence. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - - Subclinical-rhythmic-EEG-discharge-adults - Subclinical rhythmic EEG discharge of adults (SERDA). A rhythmic pattern seen in the adult age group, mainly in the waking state or drowsiness. It consists of a mixture of frequencies, often predominant in the theta range. The onset may be fairly abrupt with widespread sharp rhythmical theta and occasionally with delta activity. As to the spatial distribution, a maximum of this discharge is usually found over the centroparietal region and especially over the vertex. It may resemble a seizure discharge but is not accompanied by any clinical signs or symptoms. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - - Rhythmic-temporal-theta-burst-drowsiness - Rhythmic temporal theta burst of drowsiness (RTTD). Characteristic burst of 4-7 Hz waves frequently notched by faster waves, occurring over the temporal regions of the head during drowsiness. Synonym: psychomotor variant pattern. Comment: this is a pattern of drowsiness that is of no clinical significance. - - - Temporal-slowing-elderly - Focal theta and/or delta activity over the temporal regions, especially the left, in persons over the age of 60. Amplitudes are low/similar to the background activity. Comment: focal temporal theta was found in 20 percent of people between the ages of 40-59 years, and 40 percent of people between 60 and 79 years. One third of people older than 60 years had focal temporal delta activity. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - - Breach-rhythm - Rhythmical activity recorded over cranial bone defects. Usually it is in the 6 to 11/sec range, does not respond to movements. - - suggestedTag - Brain-laterality - Brain-region - Sensors - Appearance-mode - Discharge-pattern - - - - Other-uncertain-significant-pattern - - requireChild - - - # - Free text. - - takesValue - - - valueClass - textClass - - - - - - - - - - - The Standardized Computer-based Organized Reporting of EEG (SCORE) is a standard terminology for scalp EEG data assessment designed for use in clinical practice that may also be used for research purposes. -The SCORE standard defines terms for describing phenomena observed in scalp EEG data. It is also potentially applicable (with some suitable extensions) to EEG recorded in critical care and neonatal settings. -The SCORE standard received European consensus and has been endorsed by the European Chapter of the International Federation of Clinical Neurophysiology (IFCN) and the International League Against Epilepsy (ILAE) Commission on European Affairs. -A second revised and extended version of SCORE achieved international consensus. - -[1] Beniczky, Sandor, et al. "Standardized computer based organized reporting of EEG: SCORE." Epilepsia 54.6 (2013). -[2] Beniczky, Sandor, et al. "Standardized computer based organized reporting of EEG: SCORE second version." Clinical Neurophysiology 128.11 (2017). - -TPA, March 2023 - + + + This schema is a Hierarchical Event Descriptors (HED) Library Schema implementation of Standardized Computer-based Organized Reporting of EEG (SCORE)[1,2] for describing events occurring during neuroimaging time series recordings. +The HED-SCORE library schema allows neurologists, neurophysiologists, and brain researchers to annotate electrophysiology recordings using terms from an internationally accepted set of defined terms (SCORE) compatible with the HED framework. +The resulting annotations are understandable to clinicians and directly usable in computer analysis. + +Future extensions may be implemented in the HED-SCORE library schema. +For more information see https://hed-schema-library.readthedocs.io/en/latest/index.html. + + + Modulator + External stimuli / interventions or changes in the alertness level (sleep) that modify: the background activity, or how often a graphoelement is occurring, or change other features of the graphoelement (like intra-burst frequency). For each observed finding, there is an option of specifying how they are influenced by the modulators and procedures that were done during the recording. + + requireChild + + + Sleep-modulator + + Sleep-deprivation + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Sleep-following-sleep-deprivation + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Natural-sleep + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Induced-sleep + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Drowsiness + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Awakening + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Medication-modulator + + Medication-administered-during-recording + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Medication-withdrawal-or-reduction-during-recording + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Eye-modulator + + Manual-eye-closure + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Manual-eye-opening + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Stimulation-modulator + + Intermittent-photic-stimulation + + requireChild + + + suggestedTag + Intermittent-photic-stimulation-effect + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + + + Auditory-stimulation + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Nociceptive-stimulation + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Hyperventilation + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Physical-effort + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Cognitive-task + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Other-modulator-or-procedure + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Background-activity + An EEG activity representing the setting in which a given normal or abnormal pattern appears and from which such pattern is distinguished. + + requireChild + + + Posterior-dominant-rhythm + Rhythmic activity occurring during wakefulness over the posterior regions of the head, generally with maximum amplitudes over the occipital areas. Amplitude varies. Best seen with eyes closed and during physical relaxation and relative mental inactivity. Blocked or attenuated by attention, especially visual, and mental effort. In adults this is the alpha rhythm, and the frequency is 8 to 13 Hz. However the frequency can be higher or lower than this range (often a supra or sub harmonic of alpha frequency) and is called alpha variant rhythm (fast and slow alpha variant rhythm). In children, the normal range of the frequency of the posterior dominant rhythm is age-dependant. + + suggestedTag + Finding-significance-to-recording + Finding-frequency + Finding-amplitude-asymmetry + Posterior-dominant-rhythm-property + + + + Mu-rhythm + EEG rhythm at 7-11 Hz composed of arch-shaped waves occurring over the central or centro-parietal regions of the scalp during wakefulness. Amplitudes varies but is mostly below 50 microV. Blocked or attenuated most clearly by contralateral movement, thought of movement, readiness to move or tactile stimulation. + + suggestedTag + Finding-frequency + Finding-significance-to-recording + Brain-laterality + Brain-region + Sensors + + + + Other-organized-rhythm + EEG activity that consisting of waves of approximately constant period, which is considered as part of the background (ongoing) activity, but does not fulfill the criteria of the posterior dominant rhythm. + + requireChild + + + suggestedTag + Rhythmic-activity-morphology + Finding-significance-to-recording + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Background-activity-special-feature + Special Features. Special features contains scoring options for the background activity of critically ill patients. + + requireChild + + + Continuous-background-activity + + suggestedTag + Rhythmic-activity-morphology + Brain-laterality + Brain-region + Sensors + Finding-extent + + + + Nearly-continuous-background-activity + + suggestedTag + Rhythmic-activity-morphology + Brain-laterality + Brain-region + Sensors + Finding-extent + + + + Discontinuous-background-activity + + suggestedTag + Rhythmic-activity-morphology + Brain-laterality + Brain-region + Sensors + Finding-extent + + + + Background-burst-suppression + EEG pattern consisting of bursts (activity appearing and disappearing abruptly) interrupted by periods of low amplitude (below 20 microV) and which occurs simultaneously over all head regions. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Finding-extent + + + + Background-burst-attenuation + + suggestedTag + Brain-laterality + Brain-region + Sensors + Finding-extent + + + + Background-activity-suppression + Periods showing activity under 10 microV (referential montage) and interrupting the background (ongoing) activity. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Finding-extent + Appearance-mode + + + + Electrocerebral-inactivity + Absence of any ongoing cortical electric activities; in all leads EEG is isoelectric or only contains artifacts. Sensitivity has to be increased up to 2 microV/mm; recording time: at least 30 minutes. + + + + + Sleep-and-drowsiness + The features of the ongoing activity during sleep are scored here. If abnormal graphoelements appear, disappear or change their morphology during sleep, that is not scored here but at the entry corresponding to that graphooelement (as a modulator). + + requireChild + + + Sleep-architecture + For longer recordings. Only to be scored if whole-night sleep is part of the recording. It is a global descriptor of the structure and pattern of sleep: estimation of the amount of time spent in REM and NREM sleep, sleep duration, NREM-REM cycle. + + suggestedTag + Property-not-possible-to-determine + + + Normal-sleep-architecture + + + Abnormal-sleep-architecture + + + + Sleep-stage-reached + For normal sleep patterns the sleep stages reached during the recording can be specified + + requireChild + + + suggestedTag + Property-not-possible-to-determine + Finding-significance-to-recording + + + Sleep-stage-N1 + Sleep stage 1. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Sleep-stage-N2 + Sleep stage 2. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Sleep-stage-N3 + Sleep stage 3. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Sleep-stage-REM + Rapid eye movement. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Sleep-spindles + Burst at 11-15 Hz but mostly at 12-14 Hz generally diffuse but of higher voltage over the central regions of the head, occurring during sleep. Amplitude varies but is mostly below 50 microV in the adult. + + suggestedTag + Finding-significance-to-recording + Brain-laterality + Brain-region + Sensors + Finding-amplitude-asymmetry + + + + Arousal-pattern + Arousal pattern in children. Prolonged, marked high voltage 4-6/s activity in all leads with some intermixed slower frequencies, in children. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + + Frontal-arousal-rhythm + Prolonged (up to 20s) rhythmical sharp or spiky activity over the frontal areas (maximum over the frontal midline) seen at arousal from sleep in children with minimal cerebral dysfunction. + + suggestedTag + Appearance-mode + Discharge-pattern + + + + Vertex-wave + Sharp potential, maximal at the vertex, negative relative to other areas, apparently occurring spontaneously during sleep or in response to a sensory stimulus during sleep or wakefulness. May be single or repetitive. Amplitude varies but rarely exceeds 250 microV. Abbreviation: V wave. Synonym: vertex sharp wave. + + suggestedTag + Finding-significance-to-recording + Brain-laterality + Brain-region + Sensors + Finding-amplitude-asymmetry + + + + K-complex + A burst of somewhat variable appearance, consisting most commonly of a high voltage negative slow wave followed by a smaller positive slow wave frequently associated with a sleep spindle. Duration greater than 0.5 s. Amplitude is generally maximal in the frontal vertex. K complexes occur during nonREM sleep, apparently spontaneously, or in response to sudden sensory / auditory stimuli, and are not specific for any individual sensory modality. + + suggestedTag + Finding-significance-to-recording + Brain-laterality + Brain-region + Sensors + Finding-amplitude-asymmetry + + + + Saw-tooth-waves + Vertex negative 2-5 Hz waves occuring in series during REM sleep + + suggestedTag + Finding-significance-to-recording + Brain-laterality + Brain-region + Sensors + Finding-amplitude-asymmetry + + + + POSTS + Positive occipital sharp transients of sleep. Sharp transient maximal over the occipital regions, positive relative to other areas, apparently occurring spontaneously during sleep. May be single or repetitive. Amplitude varies but is generally bellow 50 microV. + + suggestedTag + Finding-significance-to-recording + Brain-laterality + Brain-region + Sensors + Finding-amplitude-asymmetry + + + + Hypnagogic-hypersynchrony + Bursts of bilateral, synchronous delta or theta activity of large amplitude, occasionally with superimposed faster components, occurring during falling asleep or during awakening, in children. + + suggestedTag + Finding-significance-to-recording + Brain-laterality + Brain-region + Sensors + Finding-amplitude-asymmetry + + + + Non-reactive-sleep + EEG activity consisting of normal sleep graphoelements, but which cannot be interrupted by external stimuli/ the patient cannot be waken. + + + + Interictal-finding + EEG pattern / transient that is distinguished form the background activity, considered abnormal, but is not recorded during ictal period (seizure) or postictal period; the presence of an interictal finding does not necessarily imply that the patient has epilepsy. + + requireChild + + + Epileptiform-interictal-activity + + suggestedTag + Spike-morphology + Spike-and-slow-wave-morphology + Runs-of-rapid-spikes-morphology + Polyspikes-morphology + Polyspike-and-slow-wave-morphology + Sharp-wave-morphology + Sharp-and-slow-wave-morphology + Slow-sharp-wave-morphology + High-frequency-oscillation-morphology + Hypsarrhythmia-classic-morphology + Hypsarrhythmia-modified-morphology + Brain-laterality + Brain-region + Sensors + Finding-propagation + Multifocal-finding + Appearance-mode + Discharge-pattern + Finding-incidence + + + + Abnormal-interictal-rhythmic-activity + + suggestedTag + Rhythmic-activity-morphology + Polymorphic-delta-activity-morphology + Frontal-intermittent-rhythmic-delta-activity-morphology + Occipital-intermittent-rhythmic-delta-activity-morphology + Temporal-intermittent-rhythmic-delta-activity-morphology + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + Finding-incidence + + + + Interictal-special-patterns + + requireChild + + + Interictal-periodic-discharges + Periodic discharge not further specified (PDs). + + suggestedTag + Periodic-discharge-morphology + Brain-laterality + Brain-region + Sensors + Periodic-discharge-time-related-features + + + Generalized-periodic-discharges + GPDs. + + + Lateralized-periodic-discharges + LPDs. + + + Bilateral-independent-periodic-discharges + BIPDs. + + + Multifocal-periodic-discharges + MfPDs. + + + + Extreme-delta-brush + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + + + + Critically-ill-patients-patterns + Rhythmic or periodic patterns in critically ill patients (RPPs) are scored according to the 2012 version of the American Clinical Neurophysiology Society Standardized Critical Care EEG Terminology (Hirsch et al., 2013). + + requireChild + + + Critically-ill-patients-periodic-discharges + Periodic discharges (PDs). + + suggestedTag + Periodic-discharge-morphology + Brain-laterality + Brain-region + Sensors + Finding-frequency + Periodic-discharge-time-related-features + + + + Rhythmic-delta-activity + RDA + + suggestedTag + Periodic-discharge-superimposed-activity + Periodic-discharge-absolute-amplitude + Brain-laterality + Brain-region + Sensors + Finding-frequency + Periodic-discharge-time-related-features + + + + Spike-or-sharp-and-wave + SW + + suggestedTag + Periodic-discharge-sharpness + Number-of-periodic-discharge-phases + Periodic-discharge-triphasic-morphology + Periodic-discharge-absolute-amplitude + Periodic-discharge-relative-amplitude + Periodic-discharge-polarity + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Finding-frequency + Periodic-discharge-time-related-features + + + + + Episode + Clinical episode or electrographic seizure. + + requireChild + + + Epileptic-seizure + The ILAE presented a revised seizure classification that divides seizures into focal, generalized onset, or unknown onset. + + requireChild + + + Focal-onset-epileptic-seizure + Focal seizures can be divided into focal aware and impaired awareness seizures, with additional motor and nonmotor classifications. + + suggestedTag + Episode-phase + Automatism-motor-seizure + Atonic-motor-seizure + Clonic-motor-seizure + Epileptic-spasm-episode + Hyperkinetic-motor-seizure + Myoclonic-motor-seizure + Tonic-motor-seizure + Autonomic-nonmotor-seizure + Behavior-arrest-nonmotor-seizure + Cognitive-nonmotor-seizure + Emotional-nonmotor-seizure + Sensory-nonmotor-seizure + Seizure-dynamics + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + Aware-focal-onset-epileptic-seizure + + suggestedTag + Episode-phase + Seizure-dynamics + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + Impaired-awareness-focal-onset-epileptic-seizure + + suggestedTag + Episode-phase + Seizure-dynamics + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + Awareness-unknown-focal-onset-epileptic-seizure + + suggestedTag + Episode-phase + Seizure-dynamics + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + Focal-to-bilateral-tonic-clonic-focal-onset-epileptic-seizure + A seizure type with focal onset, with awareness or impaired awareness, either motor or non-motor, progressing to bilateral tonic clonic activity. The prior term was seizure with partial onset with secondary generalization. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + suggestedTag + Episode-phase + Seizure-dynamics + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + + Generalized-onset-epileptic-seizure + Generalized-onset seizures are classified as motor or nonmotor (absence), without using awareness level as a classifier, as most but not all of these seizures are linked with impaired awareness. + + suggestedTag + Episode-phase + Tonic-clonic-motor-seizure + Clonic-motor-seizure + Tonic-motor-seizure + Myoclonic-motor-seizure + Myoclonic-tonic-clonic-motor-seizure + Myoclonic-atonic-motor-seizure + Atonic-motor-seizure + Epileptic-spasm-episode + Typical-absence-seizure + Atypical-absence-seizure + Myoclonic-absence-seizure + Eyelid-myoclonia-absence-seizure + Seizure-dynamics + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + Unknown-onset-epileptic-seizure + Even if the onset of seizures is unknown, they may exhibit characteristics that fall into categories such as motor, nonmotor, tonic-clonic, epileptic spasms, or behavior arrest. + + suggestedTag + Episode-phase + Tonic-clonic-motor-seizure + Epileptic-spasm-episode + Behavior-arrest-nonmotor-seizure + Seizure-dynamics + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + Unclassified-epileptic-seizure + Referring to a seizure type that cannot be described by the ILAE 2017 classification either because of inadequate information or unusual clinical features. + + suggestedTag + Episode-phase + Seizure-dynamics + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + + Subtle-seizure + Seizure type frequent in neonates, sometimes referred to as motor automatisms; they may include random and roving eye movements, sucking, chewing motions, tongue protrusion, rowing or swimming or boxing movements of the arms, pedaling and bicycling movements of the lower limbs; apneic seizures are relatively common. Although some subtle seizures are associated with rhythmic ictal EEG discharges, and are clearly epileptic, ictal EEG often does not show typical epileptic activity. + + suggestedTag + Episode-phase + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + Electrographic-seizure + Referred usually to non convulsive status. Ictal EEG: rhythmic discharge or spike and wave pattern with definite evolution in frequency, location, or morphology lasting at least 10 s; evolution in amplitude alone did not qualify. + + suggestedTag + Episode-phase + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + Seizure-PNES + Psychogenic non-epileptic seizure. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + Sleep-related-episode + + requireChild + + + Sleep-related-arousal + Normal. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + Benign-sleep-myoclonus + A distinctive disorder of sleep characterized by a) neonatal onset, b) rhythmic myoclonic jerks only during sleep and c) abrupt and consistent cessation with arousal, d) absence of concomitant electrographic changes suggestive of seizures, and e) good outcome. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + Confusional-awakening + Episode of non epileptic nature included in NREM parasomnias, characterized by sudden arousal and complex behavior but without full alertness, usually lasting a few minutes and occurring almost in all children at least occasionally. Amnesia of the episode is the rule. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + Sleep-periodic-limb-movement + PLMS. Periodic limb movement in sleep. Episodes are characterized by brief (0.5- to 5.0-second) lower-extremity movements during sleep, which typically occur at 20- to 40-second intervals, most commonly during the first 3 hours of sleep. The affected individual is usually not aware of the movements or of the transient partial arousals. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + REM-sleep-behavioral-disorder + REM sleep behavioral disorder. Episodes characterized by: a) presence of REM sleep without atonia (RSWA) on polysomnography (PSG); b) presence of at least 1 of the following conditions - (1) Sleep-related behaviors, by history, that have been injurious, potentially injurious, or disruptive (example: dream enactment behavior); (2) abnormal REM sleep behavior documented during PSG monitoring; (3) absence of epileptiform activity on electroencephalogram (EEG) during REM sleep (unless RBD can be clearly distinguished from any concurrent REM sleep-related seizure disorder); (4) sleep disorder not better explained by another sleep disorder, a medical or neurologic disorder, a mental disorder, medication use, or a substance use disorder. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + Sleep-walking + Episodes characterized by ambulation during sleep; the patient is difficult to arouse during an episode, and is usually amnesic following the episode. Episodes usually occur in the first third of the night during slow wave sleep. Polysomnographic recordings demonstrate 2 abnormalities during the first sleep cycle: frequent, brief, non-behavioral EEG-defined arousals prior to the somnambulistic episode and abnormally low gamma (0.75-2.0 Hz) EEG power on spectral analysis, correlating with high-voltage (hyper-synchronic gamma) waves lasting 10 to 15 s occurring just prior to the movement. This is followed by stage I NREM sleep, and there is no evidence of complete awakening. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + + Pediatric-episode + + requireChild + + + Hyperekplexia + Disorder characterized by exaggerated startle response and hypertonicity that may occur during the first year of life and in severe cases during the neonatal period. Children usually present with marked irritability and recurrent startles in response to handling and sounds. Severely affected infants can have severe jerks and stiffening, sometimes with breath-holding spells. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + Jactatio-capitis-nocturna + Relatively common in normal children at the time of going to bed, especially during the first year of life, the rhythmic head movements persist during sleep. Usually, these phenomena disappear before 3 years of age. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + Pavor-nocturnus + A nocturnal episode characterized by age of onset of less than five years (mean age 18 months, with peak prevalence at five to seven years), appearance of signs of panic two hours after falling asleep with crying, screams, a fearful expression, inability to recognize other people including parents (for a duration of 5-15 minutes), amnesia upon awakening. Pavor nocturnus occurs in patients almost every night for months or years (but the frequency is highly variable and may be as low as once a month) and is likely to disappear spontaneously at the age of six to eight years. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + Pediatric-stereotypical-behavior-episode + Repetitive motor behavior in children, typically rhythmic and persistent; usually not paroxysmal and rarely suggest epilepsy. They include headbanging, head-rolling, jactatio capitis nocturna, body rocking, buccal or lingual movements, hand flapping and related mannerisms, repetitive hand-waving (to self-induce photosensitive seizures). + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + + Paroxysmal-motor-event + Paroxysmal phenomena during neonatal or childhood periods characterized by recurrent motor or behavioral signs or symptoms that must be distinguishes from epileptic disorders. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + Syncope + Episode with loss of consciousness and muscle tone that is abrupt in onset, of short duration and followed by rapid recovery; it occurs in response to transient impairment of cerebral perfusion. Typical prodromal symptoms often herald onset of syncope and postictal symptoms are minimal. Syncopal convulsions resulting from cerebral anoxia are common but are not a form of epilepsy, nor are there any accompanying EEG ictal discharges. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + Cataplexy + A sudden decrement in muscle tone and loss of deep tendon reflexes, leading to muscle weakness, paralysis, or postural collapse. Cataplexy usually is precipitated by an outburst of emotional expression-notably laughter, anger, or startle. It is one of the tetrad of symptoms of narcolepsy. During cataplexy, respiration and voluntary eye movements are not compromised. Consciousness is preserved. + + suggestedTag + Episode-phase + Finding-significance-to-recording + Episode-consciousness + Episode-awareness + Clinical-EEG-temporal-relationship + Episode-event-count + State-episode-start + Episode-postictal-phase + Episode-prodrome + Episode-tongue-biting + + + + Other-episode + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Physiologic-pattern + EEG graphoelements or rhythms that are considered normal. They only should be scored if the physician considers that they have a specific clinical significance for the recording. + + requireChild + + + Rhythmic-activity-pattern + Not further specified. + + suggestedTag + Rhythmic-activity-morphology + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + + Slow-alpha-variant-rhythm + Characteristic rhythms mostly at 4-5 Hz, recorded most prominently over the posterior regions of the head. Generally alternate, or are intermixed, with alpha rhythm to which they often are harmonically related. Amplitude varies but is frequently close to 50 micro V. Blocked or attenuated by attention, especially visual, and mental effort. Comment: slow alpha variant rhythms should be distinguished from posterior slow waves characteristic of children and adolescents and occasionally seen in young adults. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + + Fast-alpha-variant-rhythm + Characteristic rhythm at 14-20 Hz, detected most prominently over the posterior regions of the head. May alternate or be intermixed with alpha rhythm. Blocked or attenuated by attention, especially visual, and mental effort. + + suggestedTag + Appearance-mode + Discharge-pattern + + + + Ciganek-rhythm + Midline theta rhythm (Ciganek rhythm) may be observed during wakefulness or drowsiness. The frequency is 4-7 Hz, and the location is midline (ie, vertex). The morphology is rhythmic, smooth, sinusoidal, arciform, spiky, or mu-like. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + + Lambda-wave + Diphasic sharp transient occurring over occipital regions of the head of waking subjects during visual exploration. The main component is positive relative to other areas. Time-locked to saccadic eye movement. Amplitude varies but is generally below 50 micro V. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + + Posterior-slow-waves-youth + Waves in the delta and theta range, of variable form, lasting 0.35 to 0.5 s or longer without any consistent periodicity, found in the range of 6-12 years (occasionally seen in young adults). Alpha waves are almost always intermingled or superimposed. Reactive similar to alpha activity. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + + Diffuse-slowing-hyperventilation + Diffuse slowing induced by hyperventilation. Bilateral, diffuse slowing during hyperventilation. Recorded in 70 percent of normal children (3-5 years) and less then 10 percent of adults. Usually appear in the posterior regions and spread forward in younger age group, whereas they tend to appear in the frontal regions and spread backward in the older age group. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + + Photic-driving + Physiologic response consisting of rhythmic activity elicited over the posterior regions of the head by repetitive photic stimulation at frequencies of about 5-30 Hz. Comments: term should be limited to activity time-locked to the stimulus and of frequency identical or harmonically related to the stimulus frequency. Photic driving should be distinguished from the visual evoked potentials elicited by isolated flashes of light or flashes repeated at very low frequency. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + + Photomyogenic-response + A response to intermittent photic stimulation characterized by the appearance in the record of brief, repetitive muscular artifacts (spikes) over the anterior regions of the head. These often increase gradually in amplitude as stimuli are continued and cease promptly when the stimulus is withdrawn. Comment: this response is frequently associated with flutter of the eyelids and vertical oscillations of the eyeballs and sometimes with discrete jerking mostly involving the musculature of the face and head. (Preferred to synonym: photo-myoclonic response). + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + + Other-physiologic-pattern + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Uncertain-significant-pattern + EEG graphoelements or rhythms that resemble abnormal patterns but that are not necessarily associated with a pathology, and the physician does not consider them abnormal in the context of the scored recording (like normal variants and patterns). + + requireChild + + + Sharp-transient-pattern + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + + Wicket-spikes + Spike-like monophasic negative single waves or trains of waves occurring over the temporal regions during drowsiness that have an arcuate or mu-like appearance. These are mainly seen in older individuals and represent a benign variant that is of little clinical significance. + + + Small-sharp-spikes + Benign epileptiform Transients of Sleep (BETS). Small sharp spikes (SSS) of very short duration and low amplitude, often followed by a small theta wave, occurring in the temporal regions during drowsiness and light sleep. They occur on one or both sides (often asynchronously). The main negative and positive components are of about equally spiky character. Rarely seen in children, they are seen most often in adults and the elderly. Two thirds of the patients have a history of epileptic seizures. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + + Fourteen-six-Hz-positive-burst + Burst of arch-shaped waves at 13-17 Hz and/or 5-7-Hz but most commonly at 14 and or 6 Hz seen generally over the posterior temporal and adjacent areas of one or both sides of the head during sleep. The sharp peaks of its component waves are positive with respect to other regions. Amplitude varies but is generally below 75 micro V. Comments: (1) best demonstrated by referential recording using contralateral earlobe or other remote, reference electrodes. (2) This pattern has no established clinical significance. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + + Six-Hz-spike-slow-wave + Spike and slow wave complexes at 4-7Hz, but mostly at 6 Hz occurring generally in brief bursts bilaterally and synchronously, symmetrically or asymmetrically, and either confined to or of larger amplitude over the posterior or anterior regions of the head. The spike has a strong positive component. Amplitude varies but is generally smaller than that of spike-and slow-wave complexes repeating at slower rates. Comment: this pattern should be distinguished from epileptiform discharges. Synonym: wave and spike phantom. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + + Rudimentary-spike-wave-complex + Synonym: Pseudo petit mal discharge. Paroxysmal discharge that consists of generalized or nearly generalized high voltage 3 to 4/sec waves with poorly developed spike in the positive trough between the slow waves, occurring in drowsiness only. It is found only in infancy and early childhood when marked hypnagogic rhythmical theta activity is paramount in the drowsy state. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + + Slow-fused-transient + A posterior slow-wave preceded by a sharp-contoured potential that blends together with the ensuing slow wave, in children. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + + Needle-like-occipital-spikes-blind + Spike discharges of a particularly fast and needle-like character develop over the occipital region in most congenitally blind children. Completely disappear during childhood or adolescence. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + + Subclinical-rhythmic-EEG-discharge-adults + Subclinical rhythmic EEG discharge of adults (SERDA). A rhythmic pattern seen in the adult age group, mainly in the waking state or drowsiness. It consists of a mixture of frequencies, often predominant in the theta range. The onset may be fairly abrupt with widespread sharp rhythmical theta and occasionally with delta activity. As to the spatial distribution, a maximum of this discharge is usually found over the centroparietal region and especially over the vertex. It may resemble a seizure discharge but is not accompanied by any clinical signs or symptoms. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + + Rhythmic-temporal-theta-burst-drowsiness + Rhythmic temporal theta burst of drowsiness (RTTD). Characteristic burst of 4-7 Hz waves frequently notched by faster waves, occurring over the temporal regions of the head during drowsiness. Synonym: psychomotor variant pattern. Comment: this is a pattern of drowsiness that is of no clinical significance. + + + Temporal-slowing-elderly + Focal theta and/or delta activity over the temporal regions, especially the left, in persons over the age of 60. Amplitudes are low/similar to the background activity. Comment: focal temporal theta was found in 20 percent of people between the ages of 40-59 years, and 40 percent of people between 60 and 79 years. One third of people older than 60 years had focal temporal delta activity. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + + Breach-rhythm + Rhythmical activity recorded over cranial bone defects. Usually it is in the 6 to 11/sec range, does not respond to movements. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Appearance-mode + Discharge-pattern + + + + Other-uncertain-significant-pattern + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Artifact + When relevant for the clinical interpretation, artifacts can be scored by specifying the type and the location. + + requireChild + + + Biological-artifact + + requireChild + + + Eye-blink-artifact + Example for EEG: Fp1/Fp2 become electropositive with eye closure because the cornea is positively charged causing a negative deflection in Fp1/Fp2. If the eye blink is unilateral, consider prosthetic eye. If it is in F8 rather than Fp2 then the electrodes are plugged in wrong. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + + Eye-movement-horizontal-artifact + Example for EEG: There is an upward deflection in the Fp2-F8 derivation, when the eyes move to the right side. In this case F8 becomes more positive and therefore. When the eyes move to the left, F7 becomes more positive and there is an upward deflection in the Fp1-F7 derivation. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + + Eye-movement-vertical-artifact + Example for EEG: The EEG shows positive potentials (50-100 micro V) with bi-frontal distribution, maximum at Fp1 and Fp2, when the eyeball rotated upward. The downward rotation of the eyeball was associated with the negative deflection. The time course of the deflections was similar to the time course of the eyeball movement. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + + Slow-eye-movement-artifact + Slow, rolling eye-movements, seen during drowsiness. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + + Nystagmus-artifact + + suggestedTag + Artifact-significance-to-recording + + + + Chewing-artifact + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + + Sucking-artifact + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + + Glossokinetic-artifact + The tongue functions as a dipole, with the tip negative with respect to the base. The artifact produced by the tongue has a broad potential field that drops from frontal to occipital areas, although it is less steep than that produced by eye movement artifacts. The amplitude of the potentials is greater inferiorly than in parasagittal regions; the frequency is variable but usually in the delta range. Chewing and sucking can produce similar artifacts. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + + Rocking-patting-artifact + Quasi-rhythmical artifacts in recordings from infants caused by rocking/patting. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + + Movement-artifact + Example for EEG: Large amplitude artifact, with irregular morphology (usually resembling a slow-wave or a wave with complex morphology) seen in one or several channels, due to movement. If the causing movement is repetitive, the artifact might resemble a rhythmic EEG activity. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + + Respiration-artifact + Respiration can produce 2 kinds of artifacts. One type is in the form of slow and rhythmic activity, synchronous with the body movements of respiration and mechanically affecting the impedance of (usually) one electrode. The other type can be slow or sharp waves that occur synchronously with inhalation or exhalation and involve those electrodes on which the patient is lying. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + + Pulse-artifact + Example for EEG: Occurs when an EEG electrode is placed over a pulsating vessel. The pulsation can cause slow waves that may simulate EEG activity. A direct relationship exists between ECG and the pulse waves (200-300 millisecond delay after ECG equals QRS complex). + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + + ECG-artifact + Example for EEG: Far-field potential generated in the heart. The voltage and apparent surface of the artifact vary from derivation to derivation and, consequently, from montage to montage. The artifact is observed best in referential montages using earlobe electrodes A1 and A2. ECG artifact is recognized easily by its rhythmicity/regularity and coincidence with the ECG tracing. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + + Sweat-artifact + Is a low amplitude undulating waveform that is usually greater than 2 seconds and may appear to be an unstable baseline. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + + EMG-artifact + Myogenic potentials are the most common artifacts. Frontalis and temporalis muscles (ex..: clenching of jaw muscles) are common causes. Generally, the potentials generated in the muscles are of shorter duration than those generated in the brain. The frequency components are usually beyond 30-50 Hz, and the bursts are arrhythmic. + + suggestedTag + Brain-laterality + Brain-region + Sensors + Multifocal-finding + Artifact-significance-to-recording + + + + + Non-biological-artifact + + requireChild + + + Power-supply-artifact + 50-60 Hz artifact. Monomorphic waveform due to 50 or 60 Hz A/C power supply. + + suggestedTag + Artifact-significance-to-recording + + + + Induction-artifact + Artifacts (usually of high frequency) induced by nearby equipment (like in the intensive care unit). + + suggestedTag + Artifact-significance-to-recording + + + + Dialysis-artifact + + suggestedTag + Artifact-significance-to-recording + + + + Artificial-ventilation-artifact + + suggestedTag + Artifact-significance-to-recording + + + + Electrode-pops-artifact + Are brief discharges with a very steep upslope and shallow fall that occur in all leads which include that electrode. + + suggestedTag + Artifact-significance-to-recording + + + + Salt-bridge-artifact + Typically occurs in 1 channel which may appear isoelectric. Only seen in bipolar montage. + + suggestedTag + Artifact-significance-to-recording + + + + + Other-artifact + + requireChild + + + suggestedTag + Artifact-significance-to-recording + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Polygraphic-channel-finding + Changes observed in polygraphic channels can be scored: EOG, Respiration, ECG, EMG, other polygraphic channel (+ free text), and their significance logged (normal, abnormal, no definite abnormality). + + requireChild + + + EOG-channel-finding + ElectroOculoGraphy. + + suggestedTag + Finding-significance-to-recording + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Respiration-channel-finding + + suggestedTag + Finding-significance-to-recording + + + Respiration-oxygen-saturation + + # + + takesValue + + + valueClass + numericClass + + + + + Respiration-feature + + Apnoe-respiration + Add duration (range in seconds) and comments in free text. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Hypopnea-respiration + Add duration (range in seconds) and comments in free text + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Apnea-hypopnea-index-respiration + Events/h. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Periodic-respiration + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Tachypnea-respiration + Cycles/min. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Other-respiration-feature + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + + ECG-channel-finding + Electrocardiography. + + suggestedTag + Finding-significance-to-recording + + + ECG-QT-period + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + ECG-feature + + ECG-sinus-rhythm + Normal rhythm. Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + ECG-arrhythmia + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + ECG-asystolia + Add duration (range in seconds) and comments in free text. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + ECG-bradycardia + Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + ECG-extrasystole + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + ECG-ventricular-premature-depolarization + Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + ECG-tachycardia + Frequency can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Frequency + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Other-ECG-feature + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + + EMG-channel-finding + electromyography + + suggestedTag + Finding-significance-to-recording + + + EMG-muscle-side + + EMG-left-muscle + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + EMG-right-muscle + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + EMG-bilateral-muscle + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + EMG-muscle-name + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + EMG-feature + + EMG-myoclonus + + Negative-myoclonus + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + EMG-myoclonus-rhythmic + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + EMG-myoclonus-arrhythmic + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + EMG-myoclonus-synchronous + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + EMG-myoclonus-asynchronous + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + EMG-PLMS + Periodic limb movements in sleep. + + + EMG-spasm + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + EMG-tonic-contraction + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + EMG-asymmetric-activation + + requireChild + + + EMG-asymmetric-activation-left-first + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + EMG-asymmetric-activation-right-first + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Other-EMG-features + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + + Other-polygraphic-channel + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Finding-property + Descriptive element similar to main HED /Property. Something that pertains to a thing. A characteristic of some entity. A quality or feature regarded as a characteristic or inherent part of someone or something. HED attributes are adjectives or adverbs. + + requireChild + + + Signal-morphology-property + + requireChild + + + Rhythmic-activity-morphology + EEG activity consisting of a sequence of waves approximately constant period. + + Delta-activity-morphology + EEG rhythm in the delta (under 4 Hz) range that does not belong to the posterior dominant rhythm (scored under other organized rhythms). + + suggestedTag + Finding-frequency + Finding-amplitude + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Theta-activity-morphology + EEG rhythm in the theta (4-8 Hz) range that does not belong to the posterior dominant rhythm (scored under other organized rhythm). + + suggestedTag + Finding-frequency + Finding-amplitude + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Alpha-activity-morphology + EEG rhythm in the alpha range (8-13 Hz) which is considered part of the background (ongoing) activity but does not fulfill the criteria of the posterior dominant rhythm (alpha rhythm). + + suggestedTag + Finding-frequency + Finding-amplitude + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Beta-activity-morphology + EEG rhythm between 14 and 40 Hz, which is considered part of the background (ongoing) activity but does not fulfill the criteria of the posterior dominant rhythm. Most characteristically: a rhythm from 14 to 40 Hz recorded over the fronto-central regions of the head during wakefulness. Amplitude of the beta rhythm varies but is mostly below 30 microV. Other beta rhythms are most prominent in other locations or are diffuse. + + suggestedTag + Finding-frequency + Finding-amplitude + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Gamma-activity-morphology + + suggestedTag + Finding-frequency + Finding-amplitude + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Spike-morphology + A transient, clearly distinguished from background activity, with pointed peak at a conventional paper speed or time scale and duration from 20 to under 70 ms, i.e. 1/50-1/15 s approximately. Main component is generally negative relative to other areas. Amplitude varies. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Spike-and-slow-wave-morphology + A pattern consisting of a spike followed by a slow wave. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Runs-of-rapid-spikes-morphology + Bursts of spike discharges at a rate from 10 to 25/sec (in most cases somewhat irregular). The bursts last more than 2 seconds (usually 2 to 10 seconds) and it is typically seen in sleep. Synonyms: rhythmic spikes, generalized paroxysmal fast activity, fast paroxysmal rhythms, grand mal discharge, fast beta activity. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Polyspikes-morphology + Two or more consecutive spikes. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Polyspike-and-slow-wave-morphology + Two or more consecutive spikes associated with one or more slow waves. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Sharp-wave-morphology + A transient clearly distinguished from background activity, with pointed peak at a conventional paper speed or time scale, and duration of 70-200 ms, i.e. over 1/4-1/5 s approximately. Main component is generally negative relative to other areas. Amplitude varies. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Sharp-and-slow-wave-morphology + A sequence of a sharp wave and a slow wave. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Slow-sharp-wave-morphology + A transient that bears all the characteristics of a sharp-wave, but exceeds 200 ms. Synonym: blunted sharp wave. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + High-frequency-oscillation-morphology + HFO. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Hypsarrhythmia-classic-morphology + Abnormal interictal high amplitude waves and a background of irregular spikes. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Hypsarrhythmia-modified-morphology + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Fast-spike-activity-morphology + A burst consisting of a sequence of spikes. Duration greater than 1 s. Frequency at least in the alpha range. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Low-voltage-fast-activity-morphology + Refers to the fast, and often recruiting activity which can be recorded at the onset of an ictal discharge, particularly in invasive EEG recording of a seizure. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Polysharp-waves-morphology + A sequence of two or more sharp-waves. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Slow-wave-large-amplitude-morphology + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Irregular-delta-or-theta-activity-morphology + EEG activity consisting of repetitive waves of inconsistent wave-duration but in delta and/or theta rang (greater than 125 ms). + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Electrodecremental-change-morphology + Sudden desynchronization of electrical activity. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + DC-shift-morphology + Shift of negative polarity of the direct current recordings, during seizures. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Disappearance-of-ongoing-activity-morphology + Disappearance of the EEG activity that preceded the ictal event but still remnants of background activity (thus not enough to name it electrodecremental change). + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Polymorphic-delta-activity-morphology + EEG activity consisting of waves in the delta range (over 250 ms duration for each wave) but of different morphology. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Frontal-intermittent-rhythmic-delta-activity-morphology + Frontal intermittent rhythmic delta activity (FIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at 1.5-2.5 Hz over the frontal areas of one or both sides of the head. Comment: most commonly associated with unspecified encephalopathy, in adults. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Occipital-intermittent-rhythmic-delta-activity-morphology + Occipital intermittent rhythmic delta activity (OIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at 2-3 Hz over the occipital or posterior head regions of one or both sides of the head. Frequently blocked or attenuated by opening the eyes. Comment: most commonly associated with unspecified encephalopathy, in children. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Temporal-intermittent-rhythmic-delta-activity-morphology + Temporal intermittent rhythmic delta activity (TIRDA). Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at over the temporal areas of one side of the head. Comment: most commonly associated with temporal lobe epilepsy. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Periodic-discharge-morphology + Periodic discharges not further specified (PDs). + + requireChild + + + Periodic-discharge-superimposed-activity + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + Periodic-discharge-fast-superimposed-activity + + suggestedTag + Finding-frequency + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Periodic-discharge-rhythmic-superimposed-activity + + suggestedTag + Finding-frequency + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Periodic-discharge-sharpness + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + Spiky-periodic-discharge-sharpness + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Sharp-periodic-discharge-sharpness + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Sharply-contoured-periodic-discharge-sharpness + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Blunt-periodic-discharge-sharpness + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Number-of-periodic-discharge-phases + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + 1-periodic-discharge-phase + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + 2-periodic-discharge-phases + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + 3-periodic-discharge-phases + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Greater-than-3-periodic-discharge-phases + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Periodic-discharge-triphasic-morphology + + suggestedTag + Property-not-possible-to-determine + Property-exists + Property-absence + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Periodic-discharge-absolute-amplitude + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + Periodic-discharge-absolute-amplitude-very-low + Lower than 20 microV. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Low-periodic-discharge-absolute-amplitude + 20 to 49 microV. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Medium-periodic-discharge-absolute-amplitude + 50 to 199 microV. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + High-periodic-discharge-absolute-amplitude + Greater than 200 microV. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Periodic-discharge-relative-amplitude + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + Periodic-discharge-relative-amplitude-less-than-equal-2 + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Periodic-discharge-relative-amplitude-greater-than-2 + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Periodic-discharge-polarity + + requireChild + + + Periodic-discharge-postitive-polarity + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Periodic-discharge-negative-polarity + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Periodic-discharge-unclear-polarity + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + + + Source-analysis-property + How the current in the brain reaches the electrode sensors. + + requireChild + + + Source-analysis-laterality + + requireChild + + + suggestedTag + Brain-laterality + + + + Source-analysis-brain-region + + requireChild + + + Source-analysis-frontal-perisylvian-superior-surface + + + Source-analysis-frontal-lateral + + + Source-analysis-frontal-mesial + + + Source-analysis-frontal-polar + + + Source-analysis-frontal-orbitofrontal + + + Source-analysis-temporal-polar + + + Source-analysis-temporal-basal + + + Source-analysis-temporal-lateral-anterior + + + Source-analysis-temporal-lateral-posterior + + + Source-analysis-temporal-perisylvian-inferior-surface + + + Source-analysis-central-lateral-convexity + + + Source-analysis-central-mesial + + + Source-analysis-central-sulcus-anterior-surface + + + Source-analysis-central-sulcus-posterior-surface + + + Source-analysis-central-opercular + + + Source-analysis-parietal-lateral-convexity + + + Source-analysis-parietal-mesial + + + Source-analysis-parietal-opercular + + + Source-analysis-occipital-lateral + + + Source-analysis-occipital-mesial + + + Source-analysis-occipital-basal + + + Source-analysis-insula + + + + + Location-property + Location can be scored for findings. Semiologic finding can also be characterized by the somatotopic modifier (i.e. the part of the body where it occurs). In this respect, laterality (left, right, symmetric, asymmetric, left greater than right, right greater than left), body part (eyelid, face, arm, leg, trunk, visceral, hemi-) and centricity (axial, proximal limb, distal limb) can be scored. + + requireChild + + + Brain-laterality + + requireChild + + + Brain-laterality-left + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Brain-laterality-left-greater-right + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Brain-laterality-right + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Brain-laterality-right-greater-left + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Brain-laterality-midline + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Brain-laterality-diffuse-asynchronous + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Brain-region + + requireChild + + + Brain-region-frontal + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Brain-region-temporal + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Brain-region-central + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Brain-region-parietal + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Brain-region-occipital + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Body-part-location + + requireChild + + + Eyelid-location + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Face-location + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Arm-location + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Leg-location + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Trunk-location + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Visceral-location + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Hemi-location + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Brain-centricity + + requireChild + + + Brain-centricity-axial + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Brain-centricity-proximal-limb + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Brain-centricity-distal-limb + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Sensors + Lists all corresponding sensors (electrodes/channels in montage). The sensor-group is selected from a list defined in the site-settings for each EEG-lab. + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Finding-propagation + When propagation within the graphoelement is observed, first the location of the onset region is scored. Then, the location of the propagation can be noted. + + suggestedTag + Property-exists + Property-absence + Brain-laterality + Brain-region + Sensors + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Multifocal-finding + When the same interictal graphoelement is observed bilaterally and at least in three independent locations, can score them using one entry, and choosing multifocal as a descriptor of the locations of the given interictal graphoelements, optionally emphasizing the involved, and the most active sites. + + suggestedTag + Property-not-possible-to-determine + Property-exists + Property-absence + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Modulators-property + For each described graphoelement, the influence of the modulators can be scored. Only modulators present in the recording are scored. + + requireChild + + + Modulators-reactivity + Susceptibility of individual rhythms or the EEG as a whole to change following sensory stimulation or other physiologic actions. + + requireChild + + + suggestedTag + Property-exists + Property-absence + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Eye-closure-sensitivity + Eye closure sensitivity. + + suggestedTag + Property-exists + Property-absence + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Eye-opening-passive + Passive eye opening. Used with base schema Increasing/Decreasing. + + suggestedTag + Property-not-possible-to-determine + Finding-stopped-by + Finding-unmodified + Finding-triggered-by + + + + Medication-effect-EEG + Medications effect on EEG. Used with base schema Increasing/Decreasing. + + suggestedTag + Property-not-possible-to-determine + Finding-stopped-by + Finding-unmodified + + + + Medication-reduction-effect-EEG + Medications reduction or withdrawal effect on EEG. Used with base schema Increasing/Decreasing. + + suggestedTag + Property-not-possible-to-determine + Finding-stopped-by + Finding-unmodified + + + + Auditive-stimuli-effect + Used with base schema Increasing/Decreasing. + + suggestedTag + Property-not-possible-to-determine + Finding-stopped-by + Finding-unmodified + + + + Nociceptive-stimuli-effect + Used with base schema Increasing/Decreasing. + + suggestedTag + Property-not-possible-to-determine + Finding-stopped-by + Finding-unmodified + Finding-triggered-by + + + + Physical-effort-effect + Used with base schema Increasing/Decreasing + + suggestedTag + Property-not-possible-to-determine + Finding-stopped-by + Finding-unmodified + Finding-triggered-by + + + + Cognitive-task-effect + Used with base schema Increasing/Decreasing. + + suggestedTag + Property-not-possible-to-determine + Finding-stopped-by + Finding-unmodified + Finding-triggered-by + + + + Other-modulators-effect-EEG + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Facilitating-factor + Facilitating factors are defined as transient and sporadic endogenous or exogenous elements capable of augmenting seizure incidence (increasing the likelihood of seizure occurrence). + + Facilitating-factor-alcohol + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Facilitating-factor-awake + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Facilitating-factor-catamenial + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Facilitating-factor-fever + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Facilitating-factor-sleep + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Facilitating-factor-sleep-deprived + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Facilitating-factor-other + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Provocative-factor + Provocative factors are defined as transient and sporadic endogenous or exogenous elements capable of evoking/triggering seizures immediately following the exposure to it. + + requireChild + + + Hyperventilation-provoked + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Reflex-provoked + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Medication-effect-clinical + Medications clinical effect. Used with base schema Increasing/Decreasing. + + suggestedTag + Finding-stopped-by + Finding-unmodified + + + + Medication-reduction-effect-clinical + Medications reduction or withdrawal clinical effect. Used with base schema Increasing/Decreasing. + + suggestedTag + Finding-stopped-by + Finding-unmodified + + + + Other-modulators-effect-clinical + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Intermittent-photic-stimulation-effect + + requireChild + + + Posterior-stimulus-dependent-intermittent-photic-stimulation-response + + suggestedTag + Finding-frequency + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Posterior-stimulus-independent-intermittent-photic-stimulation-response-limited + limited to the stimulus-train + + suggestedTag + Finding-frequency + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Posterior-stimulus-independent-intermittent-photic-stimulation-response-self-sustained + + suggestedTag + Finding-frequency + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Generalized-photoparoxysmal-intermittent-photic-stimulation-response-limited + Limited to the stimulus-train. + + suggestedTag + Finding-frequency + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Generalized-photoparoxysmal-intermittent-photic-stimulation-response-self-sustained + + suggestedTag + Finding-frequency + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Activation-of-pre-existing-epileptogenic-area-intermittent-photic-stimulation-effect + + suggestedTag + Finding-frequency + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Unmodified-intermittent-photic-stimulation-effect + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Quality-of-hyperventilation + + requireChild + + + Hyperventilation-refused-procedure + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Hyperventilation-poor-effort + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Hyperventilation-good-effort + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Hyperventilation-excellent-effort + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Modulators-effect + Tags for describing the influence of the modulators + + requireChild + + + Modulators-effect-continuous-during-NRS + Continuous during non-rapid-eye-movement-sleep (NRS) + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Modulators-effect-only-during + + # + Only during Sleep/Awakening/Hyperventilation/Physical effort/Cognitive task. Free text. + + takesValue + + + valueClass + textClass + + + + + Modulators-effect-change-of-patterns + Change of patterns during sleep/awakening. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + + Time-related-property + Important to estimate how often an interictal abnormality is seen in the recording. + + requireChild + + + Appearance-mode + Describes how the non-ictal EEG pattern/graphoelement is distributed through the recording. + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + Random-appearance-mode + Occurrence of the non-ictal EEG pattern / graphoelement without any rhythmicity / periodicity. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Periodic-appearance-mode + Non-ictal EEG pattern / graphoelement occurring at an approximately regular rate / interval (generally of 1 to several seconds). + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Variable-appearance-mode + Occurrence of non-ictal EEG pattern / graphoelements, that is sometimes rhythmic or periodic, other times random, throughout the recording. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Intermittent-appearance-mode + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Continuous-appearance-mode + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Discharge-pattern + Describes the organization of the EEG signal within the discharge (distinguish between single and repetitive discharges) + + requireChild + + + Single-discharge-pattern + Applies to the intra-burst pattern: a graphoelement that is not repetitive; before and after the graphoelement one can distinguish the background activity. + + suggestedTag + Finding-incidence + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Rhythmic-trains-or-bursts-discharge-pattern + Applies to the intra-burst pattern: a non-ictal graphoelement that repeats itself without returning to the background activity between them. The graphoelements within this repetition occur at approximately constant period. + + suggestedTag + Finding-prevalence + Finding-frequency + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Arrhythmic-trains-or-bursts-discharge-pattern + Applies to the intra-burst pattern: a non-ictal graphoelement that repeats itself without returning to the background activity between them. The graphoelements within this repetition occur at inconstant period. + + suggestedTag + Finding-prevalence + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Fragmented-discharge-pattern + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Periodic-discharge-time-related-features + Periodic discharges not further specified (PDs) time-relayed features tags. + + requireChild + + + Periodic-discharge-duration + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + Very-brief-periodic-discharge-duration + Less than 10 sec. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Brief-periodic-discharge-duration + 10 to 59 sec. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Intermediate-periodic-discharge-duration + 1 to 4.9 min. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Long-periodic-discharge-duration + 5 to 59 min. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Very-long-periodic-discharge-duration + Greater than 1 hour. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Periodic-discharge-onset + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + Sudden-periodic-discharge-onset + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Gradual-periodic-discharge-onset + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Periodic-discharge-dynamics + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + Evolving-periodic-discharge-dynamics + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Fluctuating-periodic-discharge-dynamics + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Static-periodic-discharge-dynamics + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + + Finding-extent + Percentage of occurrence during the recording (background activity and interictal finding). + + # + + takesValue + + + valueClass + numericClass + + + + + Finding-incidence + How often it occurs/time-epoch. + + requireChild + + + Only-once-finding-incidence + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Rare-finding-incidence + less than 1/h + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Uncommon-finding-incidence + 1/5 min to 1/h. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Occasional-finding-incidence + 1/min to 1/5min. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Frequent-finding-incidence + 1/10 s to 1/min. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Abundant-finding-incidence + Greater than 1/10 s). + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Finding-prevalence + The percentage of the recording covered by the train/burst. + + requireChild + + + Rare-finding-prevalence + Less than 1 percent. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Occasional-finding-prevalence + 1 to 9 percent. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Frequent-finding-prevalence + 10 to 49 percent. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Abundant-finding-prevalence + 50 to 89 percent. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Continuous-finding-prevalence + Greater than 90 percent. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + + Posterior-dominant-rhythm-property + Posterior dominant rhythm is the most often scored EEG feature in clinical practice. Therefore, there are specific terms that can be chosen for characterizing the PDR. + + requireChild + + + Posterior-dominant-rhythm-amplitude-range + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + Low-posterior-dominant-rhythm-amplitude-range + Low (less than 20 microV). + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Medium-posterior-dominant-rhythm-amplitude-range + Medium (between 20 and 70 microV). + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + High-posterior-dominant-rhythm-amplitude-range + High (more than 70 microV). + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Posterior-dominant-rhythm-frequency-asymmetry + When symmetrical could be labeled with base schema Symmetrical tag. + + requireChild + + + Posterior-dominant-rhythm-frequency-asymmetry-lower-left + Hz lower on the left side. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Posterior-dominant-rhythm-frequency-asymmetry-lower-right + Hz lower on the right side. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Posterior-dominant-rhythm-eye-opening-reactivity + Change (disappearance or measurable decrease in amplitude) of a posterior dominant rhythm following eye-opening. Eye closure has the opposite effect. + + suggestedTag + Property-not-possible-to-determine + + + Posterior-dominant-rhythm-eye-opening-reactivity-reduced-left + Reduced left side reactivity. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Posterior-dominant-rhythm-eye-opening-reactivity-reduced-right + Reduced right side reactivity. + + # + free text + + takesValue + + + valueClass + textClass + + + + + Posterior-dominant-rhythm-eye-opening-reactivity-reduced-both + Reduced reactivity on both sides. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Posterior-dominant-rhythm-organization + When normal could be labeled with base schema Normal tag. + + requireChild + + + Posterior-dominant-rhythm-organization-poorly-organized + Poorly organized. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Posterior-dominant-rhythm-organization-disorganized + Disorganized. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Posterior-dominant-rhythm-organization-markedly-disorganized + Markedly disorganized. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Posterior-dominant-rhythm-caveat + Caveat to the annotation of PDR. + + requireChild + + + No-posterior-dominant-rhythm-caveat + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Posterior-dominant-rhythm-caveat-only-open-eyes-during-the-recording + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Posterior-dominant-rhythm-caveat-sleep-deprived-caveat + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Posterior-dominant-rhythm-caveat-drowsy + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Posterior-dominant-rhythm-caveat-only-following-hyperventilation + + + + Absence-of-posterior-dominant-rhythm + Reason for absence of PDR. + + requireChild + + + Absence-of-posterior-dominant-rhythm-artifacts + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Absence-of-posterior-dominant-rhythm-extreme-low-voltage + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Absence-of-posterior-dominant-rhythm-eye-closure-could-not-be-achieved + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Absence-of-posterior-dominant-rhythm-lack-of-awake-period + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Absence-of-posterior-dominant-rhythm-lack-of-compliance + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Absence-of-posterior-dominant-rhythm-other-causes + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + + Episode-property + + requireChild + + + Seizure-classification + Seizure classification refers to the grouping of seizures based on their clinical features, EEG patterns, and other characteristics. Epileptic seizures are named using the current ILAE seizure classification (Fisher et al., 2017, Beniczky et al., 2017). + + requireChild + + + Motor-seizure + Involves musculature in any form. The motor event could consist of an increase (positive) or decrease (negative) in muscle contraction to produce a movement. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + + Motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + Myoclonic-motor-seizure + Sudden, brief ( lower than 100 msec) involuntary single or multiple contraction(s) of muscles(s) or muscle groups of variable topography (axial, proximal limb, distal). Myoclonus is less regularly repetitive and less sustained than is clonus. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + + Myoclonic-motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + + Negative-myoclonic-motor-seizure + + + Negative-myoclonic-motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + + Clonic-motor-seizure + Jerking, either symmetric or asymmetric, that is regularly repetitive and involves the same muscle groups. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + + Clonic-motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + + Tonic-motor-seizure + A sustained increase in muscle contraction lasting a few seconds to minutes. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + + Tonic-motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + + Atonic-motor-seizure + Sudden loss or diminution of muscle tone without apparent preceding myoclonic or tonic event lasting about 1 to 2 s, involving head, trunk, jaw, or limb musculature. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + + Atonic-motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + + Myoclonic-atonic-motor-seizure + A generalized seizure type with a myoclonic jerk leading to an atonic motor component. This type was previously called myoclonic astatic. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + + Myoclonic-atonic-motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + + Myoclonic-tonic-clonic-motor-seizure + One or a few jerks of limbs bilaterally, followed by a tonic clonic seizure. The initial jerks can be considered to be either a brief period of clonus or myoclonus. Seizures with this characteristic are common in juvenile myoclonic epilepsy. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + + Myoclonic-tonic-clonic-motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + + Tonic-clonic-motor-seizure + A sequence consisting of a tonic followed by a clonic phase. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + + Tonic-clonic-motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + + Automatism-motor-seizure + A more or less coordinated motor activity usually occurring when cognition is impaired and for which the subject is usually (but not always) amnesic afterward. This often resembles a voluntary movement and may consist of an inappropriate continuation of preictal motor activity. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + + Automatism-motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + + Hyperkinetic-motor-seizure + + + Hyperkinetic-motor-onset-seizure + + deprecatedFrom + 1.0.0 + + + + Epileptic-spasm-episode + A sudden flexion, extension, or mixed extension flexion of predominantly proximal and truncal muscles that is usually more sustained than a myoclonic movement but not as sustained as a tonic seizure. Limited forms may occur: Grimacing, head nodding, or subtle eye movements. Epileptic spasms frequently occur in clusters. Infantile spasms are the best known form, but spasms can occur at all ages. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + + + Nonmotor-seizure + Focal or generalized seizure types in which motor activity is not prominent. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + Behavior-arrest-nonmotor-seizure + Arrest (pause) of activities, freezing, immobilization, as in behavior arrest seizure. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + + Sensory-nonmotor-seizure + A perceptual experience not caused by appropriate stimuli in the external world. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + + Emotional-nonmotor-seizure + Seizures presenting with an emotion or the appearance of having an emotion as an early prominent feature, such as fear, spontaneous joy or euphoria, laughing (gelastic), or crying (dacrystic). Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + + Cognitive-nonmotor-seizure + Pertaining to thinking and higher cortical functions, such as language, spatial perception, memory, and praxis. The previous term for similar usage as a seizure type was psychic. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + + Autonomic-nonmotor-seizure + A distinct alteration of autonomic nervous system function involving cardiovascular, pupillary, gastrointestinal, sudomotor, vasomotor, and thermoregulatory functions. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + + + Absence-seizure + Absence seizures present with a sudden cessation of activity and awareness. Absence seizures tend to occur in younger age groups, have more sudden start and termination, and they usually display less complex automatisms than do focal seizures with impaired awareness, but the distinctions are not absolute. EEG information may be required for accurate classification. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + Typical-absence-seizure + A sudden onset, interruption of ongoing activities, a blank stare, possibly a brief upward deviation of the eyes. Usually the patient will be unresponsive when spoken to. Duration is a few seconds to half a minute with very rapid recovery. Although not always available, an EEG would show generalized epileptiform discharges during the event. An absence seizure is by definition a seizure of generalized onset. The word is not synonymous with a blank stare, which also can be encountered with focal onset seizures. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + + Atypical-absence-seizure + An absence seizure with changes in tone that are more pronounced than in typical absence or the onset and/or cessation is not abrupt, often associated with slow, irregular, generalized spike-wave activity. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + + Myoclonic-absence-seizure + A myoclonic absence seizure refers to an absence seizure with rhythmic three-per-second myoclonic movements, causing ratcheting abduction of the upper limbs leading to progressive arm elevation, and associated with three-per-second generalized spike-wave discharges. Duration is typically 10 to 60 s. Impairment of consciousness may not be obvious. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + + Eyelid-myoclonia-absence-seizure + Eyelid myoclonia are myoclonic jerks of the eyelids and upward deviation of the eyes, often precipitated by closing the eyes or by light. Eyelid myoclonia can be associated with absences, but also can be motor seizures without a corresponding absence, making them difficult to categorize. The 2017 classification groups them with nonmotor (absence) seizures, which may seem counterintuitive, but the myoclonia in this instance is meant to link with absence, rather than with nonmotor. Definition from ILAE 2017 Classification of Seizure Types Expanded Version + + + + + Episode-phase + The electroclinical findings (i.e., the seizure semiology and the ictal EEG) are divided in three phases: onset, propagation, and postictal. + + requireChild + + + suggestedTag + Seizure-semiology-manifestation + Postictal-semiology-manifestation + Ictal-EEG-patterns + + + Episode-phase-initial + + + Episode-phase-subsequent + + + Episode-phase-postictal + + + + Seizure-semiology-manifestation + Seizure semiology refers to the clinical features or signs that are observed during a seizure, such as the type of movements or behaviors exhibited by the person having the seizure, the duration of the seizure, the level of consciousness, and any associated symptoms such as aura or postictal confusion. In other words, seizure semiology describes the physical manifestations of a seizure. Semiology is described according to the ILAE Glossary of Descriptive Terminology for Ictal Semiology (Blume et al., 2001). Besides the name, the semiologic finding can also be characterized by the somatotopic modifier, laterality, body part and centricity. Uses Location-property tags. + + requireChild + + + Semiology-motor-manifestation + + Semiology-elementary-motor + + Semiology-motor-tonic + A sustained increase in muscle contraction lasting a few seconds to minutes. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + + Semiology-motor-dystonic + Sustained contractions of both agonist and antagonist muscles producing athetoid or twisting movements, which, when prolonged, may produce abnormal postures. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + + Semiology-motor-epileptic-spasm + A sudden flexion, extension, or mixed extension flexion of predominantly proximal and truncal muscles that is usually more sustained than a myoclonic movement but not so sustained as a tonic seizure (i.e., about 1 s). Limited forms may occur: grimacing, head nodding. Frequent occurrence in clusters. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + + Semiology-motor-postural + Adoption of a posture that may be bilaterally symmetric or asymmetric (as in a fencing posture). + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + + Semiology-motor-versive + A sustained, forced conjugate ocular, cephalic, and/or truncal rotation or lateral deviation from the midline. + + suggestedTag + Body-part-location + Episode-event-count + + + + Semiology-motor-clonic + Myoclonus that is regularly repetitive, involves the same muscle groups, at a frequency of about 2 to 3 c/s, and is prolonged. Synonym: rhythmic myoclonus . + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + + Semiology-motor-myoclonic + Characterized by myoclonus. MYOCLONUS : sudden, brief (lower than 100 ms) involuntary single or multiple contraction(s) of muscles(s) or muscle groups of variable topography (axial, proximal limb, distal). + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + + Semiology-motor-jacksonian-march + Term indicating spread of clonic movements through contiguous body parts unilaterally. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + + Semiology-motor-negative-myoclonus + Characterized by negative myoclonus. NEGATIVE MYOCLONUS: interruption of tonic muscular activity for lower than 500 ms without evidence of preceding myoclonia. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + + Semiology-motor-tonic-clonic + A sequence consisting of a tonic followed by a clonic phase. Variants such as clonic-tonic-clonic may be seen. Asymmetry of limb posture during the tonic phase of a GTC: one arm is rigidly extended at the elbow (often with the fist clenched tightly and flexed at the wrist), whereas the opposite arm is flexed at the elbow. + + requireChild + + + Semiology-motor-tonic-clonic-without-figure-of-four + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + + Semiology-motor-tonic-clonic-with-figure-of-four-extension-left-elbow + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + + Semiology-motor-tonic-clonic-with-figure-of-four-extension-right-elbow + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + + + Semiology-motor-astatic + Loss of erect posture that results from an atonic, myoclonic, or tonic mechanism. Synonym: drop attack. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + + Semiology-motor-atonic + Sudden loss or diminution of muscle tone without apparent preceding myoclonic or tonic event lasting greater or equal to 1 to 2 s, involving head, trunk, jaw, or limb musculature. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + + Semiology-motor-eye-blinking + + suggestedTag + Brain-laterality + Episode-event-count + + + + Semiology-motor-other-elementary-motor + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Semiology-motor-automatisms + + Semiology-motor-automatisms-mimetic + Facial expression suggesting an emotional state, often fear. + + suggestedTag + Episode-responsiveness + Episode-appearance + Episode-event-count + + + + Semiology-motor-automatisms-oroalimentary + Lip smacking, lip pursing, chewing, licking, tooth grinding, or swallowing. + + suggestedTag + Episode-responsiveness + Episode-appearance + Episode-event-count + + + + Semiology-motor-automatisms-dacrystic + Bursts of crying. + + suggestedTag + Episode-responsiveness + Episode-appearance + Episode-event-count + + + + Semiology-motor-automatisms-dyspraxic + Inability to perform learned movements spontaneously or on command or imitation despite intact relevant motor and sensory systems and adequate comprehension and cooperation. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-responsiveness + Episode-appearance + Episode-event-count + + + + Semiology-motor-automatisms-manual + 1. Indicates principally distal components, bilateral or unilateral. 2. Fumbling, tapping, manipulating movements. + + suggestedTag + Brain-laterality + Brain-centricity + Episode-responsiveness + Episode-appearance + Episode-event-count + + + + Semiology-motor-automatisms-gestural + Semipurposive, asynchronous hand movements. Often unilateral. + + suggestedTag + Brain-laterality + Episode-responsiveness + Episode-appearance + Episode-event-count + + + + Semiology-motor-automatisms-pedal + 1. Indicates principally distal components, bilateral or unilateral. 2. Fumbling, tapping, manipulating movements. + + suggestedTag + Brain-laterality + Brain-centricity + Episode-responsiveness + Episode-appearance + Episode-event-count + + + + Semiology-motor-automatisms-hypermotor + 1. Involves predominantly proximal limb or axial muscles producing irregular sequential ballistic movements, such as pedaling, pelvic thrusting, thrashing, rocking movements. 2. Increase in rate of ongoing movements or inappropriately rapid performance of a movement. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-responsiveness + Episode-appearance + Episode-event-count + + + + Semiology-motor-automatisms-hypokinetic + A decrease in amplitude and/or rate or arrest of ongoing motor activity. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-responsiveness + Episode-appearance + Episode-event-count + + + + Semiology-motor-automatisms-gelastic + Bursts of laughter or giggling, usually without an appropriate affective tone. + + suggestedTag + Episode-responsiveness + Episode-appearance + Episode-event-count + + + + Semiology-motor-other-automatisms + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Semiology-motor-behavioral-arrest + Interruption of ongoing motor activity or of ongoing behaviors with fixed gaze, without movement of the head or trunk (oro-alimentary and hand automatisms may continue). + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + + + Semiology-non-motor-manifestation + + Semiology-sensory + + Semiology-sensory-headache + Headache occurring in close temporal proximity to the seizure or as the sole seizure manifestation. + + suggestedTag + Brain-laterality + Episode-event-count + + + + Semiology-sensory-visual + Flashing or flickering lights, spots, simple patterns, scotomata, or amaurosis. + + suggestedTag + Brain-laterality + Episode-event-count + + + + Semiology-sensory-auditory + Buzzing, drumming sounds or single tones. + + suggestedTag + Brain-laterality + Episode-event-count + + + + Semiology-sensory-olfactory + + suggestedTag + Body-part-location + Episode-event-count + + + + Semiology-sensory-gustatory + Taste sensations including acidic, bitter, salty, sweet, or metallic. + + suggestedTag + Episode-event-count + + + + Semiology-sensory-epigastric + Abdominal discomfort including nausea, emptiness, tightness, churning, butterflies, malaise, pain, and hunger; sensation may rise to chest or throat. Some phenomena may reflect ictal autonomic dysfunction. + + suggestedTag + Episode-event-count + + + + Semiology-sensory-somatosensory + Tingling, numbness, electric-shock sensation, sense of movement or desire to move. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + + Semiology-sensory-painful + Peripheral (lateralized/bilateral), cephalic, abdominal. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + + Semiology-sensory-autonomic-sensation + A sensation consistent with involvement of the autonomic nervous system, including cardiovascular, gastrointestinal, sudomotor, vasomotor, and thermoregulatory functions. (Thus autonomic aura; cf. autonomic events 3.0). + + suggestedTag + Episode-event-count + + + + Semiology-sensory-other + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Semiology-experiential + + Semiology-experiential-affective-emotional + Components include fear, depression, joy, and (rarely) anger. + + suggestedTag + Episode-event-count + + + + Semiology-experiential-hallucinatory + Composite perceptions without corresponding external stimuli involving visual, auditory, somatosensory, olfactory, and/or gustatory phenomena. Example: hearing and seeing people talking. + + suggestedTag + Episode-event-count + + + + Semiology-experiential-illusory + An alteration of actual percepts involving the visual, auditory, somatosensory, olfactory, or gustatory systems. + + suggestedTag + Episode-event-count + + + + Semiology-experiential-mnemonic + Components that reflect ictal dysmnesia such as feelings of familiarity (deja-vu) and unfamiliarity (jamais-vu). + + Semiology-experiential-mnemonic-Deja-vu + + suggestedTag + Episode-event-count + + + + Semiology-experiential-mnemonic-Jamais-vu + + suggestedTag + Episode-event-count + + + + + Semiology-experiential-other + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Semiology-dyscognitive + The term describes events in which (1) disturbance of cognition is the predominant or most apparent feature, and (2a) two or more of the following components are involved, or (2b) involvement of such components remains undetermined. Otherwise, use the more specific term (e.g., mnemonic experiential seizure or hallucinatory experiential seizure). Components of cognition: ++ perception: symbolic conception of sensory information ++ attention: appropriate selection of a principal perception or task ++ emotion: appropriate affective significance of a perception ++ memory: ability to store and retrieve percepts or concepts ++ executive function: anticipation, selection, monitoring of consequences, and initiation of motor activity including praxis, speech. + + suggestedTag + Episode-event-count + + + + Semiology-language-related + + Semiology-language-related-vocalization + + suggestedTag + Episode-event-count + + + + Semiology-language-related-verbalization + + suggestedTag + Episode-event-count + + + + Semiology-language-related-dysphasia + + suggestedTag + Episode-event-count + + + + Semiology-language-related-aphasia + + suggestedTag + Episode-event-count + + + + Semiology-language-related-other + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Semiology-autonomic + + Semiology-autonomic-pupillary + Mydriasis, miosis (either bilateral or unilateral). + + suggestedTag + Brain-laterality + Episode-event-count + + + + Semiology-autonomic-hypersalivation + Increase in production of saliva leading to uncontrollable drooling + + suggestedTag + Episode-event-count + + + + Semiology-autonomic-respiratory-apnoeic + subjective shortness of breath, hyperventilation, stridor, coughing, choking, apnea, oxygen desaturation, neurogenic pulmonary edema. + + suggestedTag + Episode-event-count + + + + Semiology-autonomic-cardiovascular + Modifications of heart rate (tachycardia, bradycardia), cardiac arrhythmias (such as sinus arrhythmia, sinus arrest, supraventricular tachycardia, atrial premature depolarizations, ventricular premature depolarizations, atrio-ventricular block, bundle branch block, atrioventricular nodal escape rhythm, asystole). + + suggestedTag + Episode-event-count + + + + Semiology-autonomic-gastrointestinal + Nausea, eructation, vomiting, retching, abdominal sensations, abdominal pain, flatulence, spitting, diarrhea. + + suggestedTag + Episode-event-count + + + + Semiology-autonomic-urinary-incontinence + urinary urge (intense urinary urge at the beginning of seizures), urinary incontinence, ictal urination (rare symptom of partial seizures without loss of consciousness). + + suggestedTag + Episode-event-count + + + + Semiology-autonomic-genital + Sexual auras (erotic thoughts and feelings, sexual arousal and orgasm). Genital auras (unpleasant, sometimes painful, frightening or emotionally neutral somatosensory sensations in the genitals that can be accompanied by ictal orgasm). Sexual automatisms (hypermotor movements consisting of writhing, thrusting, rhythmic movements of the pelvis, arms and legs, sometimes associated with picking and rhythmic manipulation of the groin or genitalia, exhibitionism and masturbation). + + suggestedTag + Episode-event-count + + + + Semiology-autonomic-vasomotor + Flushing or pallor (may be accompanied by feelings of warmth, cold and pain). + + suggestedTag + Episode-event-count + + + + Semiology-autonomic-sudomotor + Sweating and piloerection (may be accompanied by feelings of warmth, cold and pain). + + suggestedTag + Brain-laterality + Episode-event-count + + + + Semiology-autonomic-thermoregulatory + Hyperthermia, fever. + + suggestedTag + Episode-event-count + + + + Semiology-autonomic-other + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + + Semiology-manifestation-other + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Postictal-semiology-manifestation + + requireChild + + + Postictal-semiology-unconscious + + suggestedTag + Episode-event-count + + + + Postictal-semiology-quick-recovery-of-consciousness + Quick recovery of awareness and responsiveness. + + suggestedTag + Episode-event-count + + + + Postictal-semiology-aphasia-or-dysphasia + Impaired communication involving language without dysfunction of relevant primary motor or sensory pathways, manifested as impaired comprehension, anomia, parahasic errors or a combination of these. + + suggestedTag + Episode-event-count + + + + Postictal-semiology-behavioral-change + Occurring immediately after a aseizure. Including psychosis, hypomanina, obsessive-compulsive behavior. + + suggestedTag + Episode-event-count + + + + Postictal-semiology-hemianopia + Postictal visual loss in a a hemi field. + + suggestedTag + Brain-laterality + Episode-event-count + + + + Postictal-semiology-impaired-cognition + Decreased Cognitive performance involving one or more of perception, attention, emotion, memory, execution, praxis, speech. + + suggestedTag + Episode-event-count + + + + Postictal-semiology-dysphoria + Depression, irritability, euphoric mood, fear, anxiety. + + suggestedTag + Episode-event-count + + + + Postictal-semiology-headache + Headache with features of tension-type or migraine headache that develops within 3 h following the seizure and resolves within 72 h after seizure. + + suggestedTag + Episode-event-count + + + + Postictal-semiology-nose-wiping + Noes-wiping usually within 60 sec of seizure offset, usually with the hand ipsilateral to the seizure onset. + + suggestedTag + Brain-laterality + Episode-event-count + + + + Postictal-semiology-anterograde-amnesia + Impaired ability to remember new material. + + suggestedTag + Episode-event-count + + + + Postictal-semiology-retrograde-amnesia + Impaired ability to recall previously remember material. + + suggestedTag + Episode-event-count + + + + Postictal-semiology-paresis + Todds palsy. Any unilateral postictal dysfunction relating to motor, language, sensory and/or integrative functions. + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + Episode-event-count + + + + Postictal-semiology-sleep + Invincible need to sleep after a seizure. + + + Postictal-semiology-unilateral-myoclonic-jerks + unilateral motor phenomena, other then specified, occurring in postictal phase. + + + Postictal-semiology-other-unilateral-motor-phenomena + + requireChild + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Polygraphic-channel-relation-to-episode + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + Polygraphic-channel-cause-to-episode + + + Polygraphic-channel-consequence-of-episode + + + + Ictal-EEG-patterns + + Ictal-EEG-patterns-obscured-by-artifacts + The interpretation of the EEG is not possible due to artifacts. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Ictal-EEG-activity + + suggestedTag + Polyspikes-morphology + Fast-spike-activity-morphology + Low-voltage-fast-activity-morphology + Polysharp-waves-morphology + Spike-and-slow-wave-morphology + Polyspike-and-slow-wave-morphology + Sharp-and-slow-wave-morphology + Rhythmic-activity-morphology + Slow-wave-large-amplitude-morphology + Irregular-delta-or-theta-activity-morphology + Electrodecremental-change-morphology + DC-shift-morphology + Disappearance-of-ongoing-activity-morphology + Brain-laterality + Brain-region + Sensors + Source-analysis-laterality + Source-analysis-brain-region + Episode-event-count + + + + Postictal-EEG-activity + + suggestedTag + Brain-laterality + Body-part-location + Brain-centricity + + + + + Episode-time-context-property + Additional clinically relevant features related to episodes can be scored under timing and context. If needed, episode duration can be tagged with base schema /Property/Data-property/Data-value/Spatiotemporal-value/Temporal-value/Duration. + + Episode-consciousness + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + Episode-consciousness-not-tested + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Episode-consciousness-affected + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Episode-consciousness-mildly-affected + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Episode-consciousness-not-affected + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Episode-awareness + + suggestedTag + Property-not-possible-to-determine + Property-exists + Property-absence + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Clinical-EEG-temporal-relationship + + suggestedTag + Property-not-possible-to-determine + + + Clinical-start-followed-EEG + Clinical start, followed by EEG start by X seconds. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + EEG-start-followed-clinical + EEG start, followed by clinical start by X seconds. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Simultaneous-start-clinical-EEG + + + Clinical-EEG-temporal-relationship-notes + Clinical notes to annotate the clinical-EEG temporal relationship. + + # + + takesValue + + + valueClass + textClass + + + + + + Episode-event-count + Number of stereotypical episodes during the recording. + + suggestedTag + Property-not-possible-to-determine + + + # + + takesValue + + + valueClass + numericClass + + + + + State-episode-start + State at the start of the episode. + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + Episode-start-from-sleep + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Episode-start-from-awake + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Episode-postictal-phase + + suggestedTag + Property-not-possible-to-determine + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Episode-prodrome + Prodrome is a preictal phenomenon, and it is defined as a subjective or objective clinical alteration (e.g., ill-localized sensation or agitation) that heralds the onset of an epileptic seizure but does not form part of it (Blume et al., 2001). Therefore, prodrome should be distinguished from aura (which is an ictal phenomenon). + + suggestedTag + Property-exists + Property-absence + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Episode-tongue-biting + + suggestedTag + Property-exists + Property-absence + + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Episode-responsiveness + + requireChild + + + suggestedTag + Property-not-possible-to-determine + + + Episode-responsiveness-preserved + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Episode-responsiveness-affected + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Episode-appearance + + requireChild + + + Episode-appearance-interactive + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Episode-appearance-spontaneous + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Seizure-dynamics + Spatiotemporal dynamics can be scored (evolution in morphology; evolution in frequency; evolution in location). + + requireChild + + + Seizure-dynamics-evolution-morphology + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Seizure-dynamics-evolution-frequency + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Seizure-dynamics-evolution-location + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Seizure-dynamics-not-possible-to-determine + Not possible to determine. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + + + Other-finding-property + + requireChild + + + Artifact-significance-to-recording + It is important to score the significance of the described artifacts: recording is not interpretable, recording of reduced diagnostic value, does not interfere with the interpretation of the recording. + + requireChild + + + Recording-not-interpretable-due-to-artifact + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Recording-of-reduced-diagnostic-value-due-to-artifact + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Artifact-does-not-interfere-recording + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Finding-significance-to-recording + Significance of finding. When normal/abnormal could be labeled with base schema Normal/Abnormal tags. + + requireChild + + + Finding-no-definite-abnormality + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Finding-significance-not-possible-to-determine + Not possible to determine. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Finding-frequency + Value in Hz (number) typed in. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + + + Finding-amplitude + Value in microvolts (number) typed in. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + electricPotentialUnits + + + + + Finding-amplitude-asymmetry + For posterior dominant rhythm: a difference in amplitude between the homologous area on opposite sides of the head that consistently exceeds 50 percent. When symmetrical could be labeled with base schema Symmetrical tag. For sleep: Absence or consistently marked amplitude asymmetry (greater than 50 percent) of a normal sleep graphoelement. + + requireChild + + + Finding-amplitude-asymmetry-lower-left + Amplitude lower on the left side. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Finding-amplitude-asymmetry-lower-right + Amplitude lower on the right side. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Finding-amplitude-asymmetry-not-possible-to-determine + Not possible to determine. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + Finding-stopped-by + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Finding-triggered-by + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Finding-unmodified + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Property-not-possible-to-determine + Not possible to determine. + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Property-exists + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + Property-absence + + # + Free text. + + takesValue + + + valueClass + textClass + + + + + + + + + + + + The Standardized Computer-based Organized Reporting of EEG (SCORE) is a standard terminology for scalp EEG data assessment designed for use in clinical practice that may also be used for research purposes. +The SCORE standard defines terms for describing phenomena observed in scalp EEG data. It is also potentially applicable (with some suitable extensions) to EEG recorded in critical care and neonatal settings. +The SCORE standard received European consensus and has been endorsed by the European Chapter of the International Federation of Clinical Neurophysiology (IFCN) and the International League Against Epilepsy (ILAE) Commission on European Affairs. +A second revised and extended version of SCORE achieved international consensus. + +[1] Beniczky, Sandor, et al. "Standardized computer based organized reporting of EEG: SCORE." Epilepsia 54.6 (2013). +[2] Beniczky, Sandor, et al. "Standardized computer based organized reporting of EEG: SCORE second version." Clinical Neurophysiology 128.11 (2017). + +TPA, March 2023 + diff --git a/tests/data/schema_tests/merge_tests/sorted_root_merged.xml b/tests/data/schema_tests/merge_tests/sorted_root_merged.xml index c3c855f40..1d4619755 100644 --- a/tests/data/schema_tests/merge_tests/sorted_root_merged.xml +++ b/tests/data/schema_tests/merge_tests/sorted_root_merged.xml @@ -1,7519 +1,7519 @@ - - - This schema is the first official release that includes an xsd and requires unit class, unit modifier, value class, schema attribute and property sections. - - - Event - Something that happens at a given time and (typically) place. Elements of this tag subtree designate the general category in which an event falls. - - suggestedTag - Task-property - - - Sensory-event - Something perceivable by the participant. An event meant to be an experimental stimulus should include the tag Task-property/Task-event-role/Experimental-stimulus. - - suggestedTag - Task-event-role - Sensory-presentation - - - - Agent-action - Any action engaged in by an agent (see the Agent subtree for agent categories). A participant response to an experiment stimulus should include the tag Agent-property/Agent-task-role/Experiment-participant. - - suggestedTag - Task-event-role - Agent - - - - Data-feature - An event marking the occurrence of a data feature such as an interictal spike or alpha burst that is often added post hoc to the data record. - - suggestedTag - Data-property - - - - Experiment-control - An event pertaining to the physical control of the experiment during its operation. - - - Experiment-procedure - An event indicating an experimental procedure, as in performing a saliva swab during the experiment or administering a survey. - - - Experiment-structure - An event specifying a change-point of the structure of experiment. This event is typically used to indicate a change in experimental conditions or tasks. - - - Measurement-event - A discrete measure returned by an instrument. - - suggestedTag - Data-property - - - - - Agent - Someone or something that takes an active role or produces a specified effect.The role or effect may be implicit. Being alive or performing an activity such as a computation may qualify something to be an agent. An agent may also be something that simulates something else. - - suggestedTag - Agent-property - - - Animal-agent - An agent that is an animal. - - - Avatar-agent - An agent associated with an icon or avatar representing another agent. - - - Controller-agent - An agent experiment control software or hardware. - - - Human-agent - A person who takes an active role or produces a specified effect. - - - Robotic-agent - An agent mechanical device capable of performing a variety of often complex tasks on command or by being programmed in advance. - - - Software-agent - An agent computer program. - - - - B-nonextension - These should not be sorted. B should be first - - inLibrary - testlib - - - SubnodeB1 - - inLibrary - testlib - - - - SubnodeB2 - - inLibrary - testlib - - - - - A-nonextension - These should not be sorted. A should be second - - inLibrary - testlib - - - SubnodeA3 - - inLibrary - testlib - - - - SubnodeA1 - - inLibrary - testlib - - - - SubnodeA2 - - inLibrary - testlib - - - - - C-nonextension - These should not be sorted. C should be last - - inLibrary - testlib - - - SubnodeC3 - - inLibrary - testlib - - - - SubnodeC1 - - inLibrary - testlib - - - - SubnodeC2 - - inLibrary - testlib - - - - - Action - Do something. - - extensionAllowed - - - Communicate - Convey knowledge of or information about something. - - Communicate-gesturally - Communicate nonverbally using visible bodily actions, either in place of speech or together and in parallel with spoken words. Gestures include movement of the hands, face, or other parts of the body. - - relatedTag - Move-face - Move-upper-extremity - - - Clap-hands - Strike the palms of against one another resoundingly, and usually repeatedly, especially to express approval. - - - Clear-throat - Cough slightly so as to speak more clearly, attract attention, or to express hesitancy before saying something awkward. - - relatedTag - Move-face - Move-head - - - - Frown - Express disapproval, displeasure, or concentration, typically by turning down the corners of the mouth. - - relatedTag - Move-face - - - - Grimace - Make a twisted expression, typically expressing disgust, pain, or wry amusement. - - relatedTag - Move-face - - - - Nod-head - Tilt head in alternating up and down arcs along the sagittal plane. It is most commonly, but not universally, used to indicate agreement, acceptance, or acknowledgement. - - relatedTag - Move-head - - - - Pump-fist - Raise with fist clenched in triumph or affirmation. - - relatedTag - Move-upper-extremity - - - - Raise-eyebrows - Move eyebrows upward. - - relatedTag - Move-face - Move-eyes - - - - Shake-fist - Clench hand into a fist and shake to demonstrate anger. - - relatedTag - Move-upper-extremity - - - - Shake-head - Turn head from side to side as a way of showing disagreement or refusal. - - relatedTag - Move-head - - - - Shhh - Place finger over lips and possibly uttering the syllable shhh to indicate the need to be quiet. - - relatedTag - Move-upper-extremity - - - - Shrug - Lift shoulders up towards head to indicate a lack of knowledge about a particular topic. - - relatedTag - Move-upper-extremity - Move-torso - - - - Smile - Form facial features into a pleased, kind, or amused expression, typically with the corners of the mouth turned up and the front teeth exposed. - - relatedTag - Move-face - - - - Spread-hands - Spread hands apart to indicate ignorance. - - relatedTag - Move-upper-extremity - - - - Thumb-up - Extend the thumb upward to indicate approval. - - relatedTag - Move-upper-extremity - - - - Thumbs-down - Extend the thumb downward to indicate disapproval. - - relatedTag - Move-upper-extremity - - - - Wave - Raise hand and move left and right, as a greeting or sign of departure. - - relatedTag - Move-upper-extremity - - - - Widen-eyes - Open eyes and possibly with eyebrows lifted especially to express surprise or fear. - - relatedTag - Move-face - Move-eyes - - - - Wink - Close and open one eye quickly, typically to indicate that something is a joke or a secret or as a signal of affection or greeting. - - relatedTag - Move-face - Move-eyes - - - - - Communicate-musically - Communicate using music. - - Hum - Make a low, steady continuous sound like that of a bee. Sing with the lips closed and without uttering speech. - - - Play-instrument - Make musical sounds using an instrument. - - - Sing - Produce musical tones by means of the voice. - - - Vocalize - Utter vocal sounds. - - - Whistle - Produce a shrill clear sound by forcing breath out or air in through the puckered lips. - - - - Communicate-vocally - Communicate using mouth or vocal cords. - - Cry - Shed tears associated with emotions, usually sadness but also joy or frustration. - - - Groan - Make a deep inarticulate sound in response to pain or despair. - - - Laugh - Make the spontaneous sounds and movements of the face and body that are the instinctive expressions of lively amusement and sometimes also of contempt or derision. - - - Scream - Make loud, vociferous cries or yells to express pain, excitement, or fear. - - - Shout - Say something very loudly. - - - Sigh - Emit a long, deep, audible breath expressing sadness, relief, tiredness, or a similar feeling. - - - Speak - Communicate using spoken language. - - - Whisper - Speak very softly using breath without vocal cords. - - - - - Move - Move in a specified direction or manner. Change position or posture. - - Breathe - Inhale or exhale during respiration. - - Blow - Expel air through pursed lips. - - - Cough - Suddenly and audibly expel air from the lungs through a partially closed glottis, preceded by inhalation. - - - Exhale - Blow out or expel breath. - - - Hiccup - Involuntarily spasm the diaphragm and respiratory organs, with a sudden closure of the glottis and a characteristic sound like that of a cough. - - - Hold-breath - Interrupt normal breathing by ceasing to inhale or exhale. - - - Inhale - Draw in with the breath through the nose or mouth. - - - Sneeze - Suddenly and violently expel breath through the nose and mouth. - - - Sniff - Draw in air audibly through the nose to detect a smell, to stop it from running, or to express contempt. - - - - Move-body - Move entire body. - - Bend - Move body in a bowed or curved manner. - - - Dance - Perform a purposefully selected sequences of human movement often with aesthetic or symbolic value. Move rhythmically to music, typically following a set sequence of steps. - - - Fall-down - Lose balance and collapse. - - - Flex - Cause a muscle to stand out by contracting or tensing it. Bend a limb or joint. - - - Jerk - Make a quick, sharp, sudden movement. - - - Lie-down - Move to a horizontal or resting position. - - - Recover-balance - Return to a stable, upright body position. - - - Shudder - Tremble convulsively, sometimes as a result of fear or revulsion. - - - Sit-down - Move from a standing to a sitting position. - - - Sit-up - Move from lying down to a sitting position. - - - Stand-up - Move from a sitting to a standing position. - - - Stretch - Straighten or extend body or a part of body to its full length, typically so as to tighten muscles or in order to reach something. - - - Stumble - Trip or momentarily lose balance and almost fall. - - - Turn - Change or cause to change direction. - - - - Move-body-part - Move one part of a body. - - Move-eyes - Move eyes. - - Blink - Shut and open the eyes quickly. - - - Close-eyes - Lower and keep eyelids in a closed position. - - - Fixate - Direct eyes to a specific point or target. - - - Inhibit-blinks - Purposely prevent blinking. - - - Open-eyes - Raise eyelids to expose pupil. - - - Saccade - Move eyes rapidly between fixation points. - - - Squint - Squeeze one or both eyes partly closed in an attempt to see more clearly or as a reaction to strong light. - - - Stare - Look fixedly or vacantly at someone or something with eyes wide open. - - - - Move-face - Move the face or jaw. - - Bite - Seize with teeth or jaws an object or organism so as to grip or break the surface covering. - - - Burp - Noisily release air from the stomach through the mouth. Belch. - - - Chew - Repeatedly grinding, tearing, and or crushing with teeth or jaws. - - - Gurgle - Make a hollow bubbling sound like that made by water running out of a bottle. - - - Swallow - Cause or allow something, especially food or drink to pass down the throat. - - Gulp - Swallow quickly or in large mouthfuls, often audibly, sometimes to indicate apprehension. - - - - Yawn - Take a deep involuntary inhalation with the mouth open often as a sign of drowsiness or boredom. - - - - Move-head - Move head. - - Lift-head - Tilt head back lifting chin. - - - Lower-head - Move head downward so that eyes are in a lower position. - - - Turn-head - Rotate head horizontally to look in a different direction. - - - - Move-lower-extremity - Move leg and/or foot. - - Curl-toes - Bend toes sometimes to grip. - - - Hop - Jump on one foot. - - - Jog - Run at a trot to exercise. - - - Jump - Move off the ground or other surface through sudden muscular effort in the legs. - - - Kick - Strike out or flail with the foot or feet. Strike using the leg, in unison usually with an area of the knee or lower using the foot. - - - Pedal - Move by working the pedals of a bicycle or other machine. - - - Press-foot - Move by pressing foot. - - - Run - Travel on foot at a fast pace. - - - Step - Put one leg in front of the other and shift weight onto it. - - Heel-strike - Strike the ground with the heel during a step. - - - Toe-off - Push with toe as part of a stride. - - - - Trot - Run at a moderate pace, typically with short steps. - - - Walk - Move at a regular pace by lifting and setting down each foot in turn never having both feet off the ground at once. - - - - Move-torso - Move body trunk. - - - Move-upper-extremity - Move arm, shoulder, and/or hand. - - Drop - Let or cause to fall vertically. - - - Grab - Seize suddenly or quickly. Snatch or clutch. - - - Grasp - Seize and hold firmly. - - - Hold-down - Prevent someone or something from moving by holding them firmly. - - - Lift - Raising something to higher position. - - - Make-fist - Close hand tightly with the fingers bent against the palm. - - - Point - Draw attention to something by extending a finger or arm. - - - Press - Apply pressure to something to flatten, shape, smooth or depress it. This action tag should be used to indicate key presses and mouse clicks. - - relatedTag - Push - - - - Push - Apply force in order to move something away. Use Press to indicate a key press or mouse click. - - relatedTag - Press - - - - Reach - Stretch out your arm in order to get or touch something. - - - Release - Make available or set free. - - - Retract - Draw or pull back. - - - Scratch - Drag claws or nails over a surface or on skin. - - - Snap-fingers - Make a noise by pushing second finger hard against thumb and then releasing it suddenly so that it hits the base of the thumb. - - - Touch - Come into or be in contact with. - - - - - - Perceive - Produce an internal, conscious image through stimulating a sensory system. - - Hear - Give attention to a sound. - - - See - Direct gaze toward someone or something or in a specified direction. - - - Sense-by-touch - Sense something through receptors in the skin. - - - Smell - Inhale in order to ascertain an odor or scent. - - - Taste - Sense a flavor in the mouth and throat on contact with a substance. - - - - Perform - Carry out or accomplish an action, task, or function. - - Close - Act as to blocked against entry or passage. - - - Collide-with - Hit with force when moving. - - - Halt - Bring or come to an abrupt stop. - - - Modify - Change something. - - - Open - Widen an aperture, door, or gap, especially one allowing access to something. - - - Operate - Control the functioning of a machine, process, or system. - - - Play - Engage in activity for enjoyment and recreation rather than a serious or practical purpose. - - - Read - Interpret something that is written or printed. - - - Repeat - Make do or perform again. - - - Rest - Be inactive in order to regain strength, health, or energy. - - - Write - Communicate or express by means of letters or symbols written or imprinted on a surface. - - - - Think - Direct the mind toward someone or something or use the mind actively to form connected ideas. - - Allow - Allow access to something such as allowing a car to pass. - - - Attend-to - Focus mental experience on specific targets. - - - Count - Tally items either silently or aloud. - - - Deny - Refuse to give or grant something requested or desired by someone. - - - Detect - Discover or identify the presence or existence of something. - - - Discriminate - Recognize a distinction. - - - Encode - Convert information or an instruction into a particular form. - - - Evade - Escape or avoid, especially by cleverness or trickery. - - - Generate - Cause something, especially an emotion or situation to arise or come about. - - - Identify - Establish or indicate who or what someone or something is. - - - Imagine - Form a mental image or concept of something. - - - Judge - Evaluate evidence to make a decision or form a belief. - - - Learn - Adaptively change behavior as the result of experience. - - - Memorize - Adaptively change behavior as the result of experience. - - - Plan - Think about the activities required to achieve a desired goal. - - - Predict - Say or estimate that something will happen or will be a consequence of something without having exact informaton. - - - Recall - Remember information by mental effort. - - - Recognize - Identify someone or something from having encountered them before. - - - Respond - React to something such as a treatment or a stimulus. - - - Switch-attention - Transfer attention from one focus to another. - - - Track - Follow a person, animal, or object through space or time. - - - - - A-extensionallowed - These should be sorted. This section should be first. - - extensionAllowed - - - inLibrary - testlib - - - SubnodeD1 - - inLibrary - testlib - - - - SubnodeD2 - - inLibrary - testlib - - - - SubnodeD3 - - inLibrary - testlib - - - - - B-extensionallowed - These should be sorted. This section should be second. - - extensionAllowed - - - inLibrary - testlib - - - SubnodeE1 - - inLibrary - testlib - - - - SubnodeE2 - - inLibrary - testlib - - - - SubnodeE3 - - inLibrary - testlib - - - - - Item - An independently existing thing (living or nonliving). - - extensionAllowed - - - Biological-item - An entity that is biological, that is related to living organisms. - - Anatomical-item - A biological structure, system, fluid or other substance excluding single molecular entities. - - Body - The biological structure representing an organism. - - - Body-part - Any part of an organism. - - Head - The upper part of the human body, or the front or upper part of the body of an animal, typically separated from the rest of the body by a neck, and containing the brain, mouth, and sense organs. - - Ear - A sense organ needed for the detection of sound and for establishing balance. - - - Face - The anterior portion of the head extending from the forehead to the chin and ear to ear. The facial structures contain the eyes, nose and mouth, cheeks and jaws. - - Cheek - The fleshy part of the face bounded by the eyes, nose, ear, and jaw line. - - - Chin - The part of the face below the lower lip and including the protruding part of the lower jaw. - - - Eye - The organ of sight or vision. - - - Eyebrow - The arched strip of hair on the bony ridge above each eye socket. - - - Forehead - The part of the face between the eyebrows and the normal hairline. - - - Lip - Fleshy fold which surrounds the opening of the mouth. - - - Mouth - The proximal portion of the digestive tract, containing the oral cavity and bounded by the oral opening. - - - Nose - A structure of special sense serving as an organ of the sense of smell and as an entrance to the respiratory tract. - - - Teeth - The hard bonelike structures in the jaws. A collection of teeth arranged in some pattern in the mouth or other part of the body. - - - - Hair - The filamentous outgrowth of the epidermis. - - - - Lower-extremity - Refers to the whole inferior limb (leg and/or foot). - - Ankle - A gliding joint between the distal ends of the tibia and fibula and the proximal end of the talus. - - - Calf - The fleshy part at the back of the leg below the knee. - - - Foot - The structure found below the ankle joint required for locomotion. - - Big-toe - The largest toe on the inner side of the foot. - - - Heel - The back of the foot below the ankle. - - - Instep - The part of the foot between the ball and the heel on the inner side. - - - Little-toe - The smallest toe located on the outer side of the foot. - - - Toes - The terminal digits of the foot. - - - - Knee - A joint connecting the lower part of the femur with the upper part of the tibia. - - - Shin - Front part of the leg below the knee. - - - Thigh - Upper part of the leg between hip and knee. - - - - Torso - The body excluding the head and neck and limbs. - - Buttocks - The round fleshy parts that form the lower rear area of a human trunk. - - - Gentalia - The external organs of reproduction. - - deprecatedFrom - 8.1.0 - - - - Hip - The lateral prominence of the pelvis from the waist to the thigh. - - - Torso-back - The rear surface of the human body from the shoulders to the hips. - - - Torso-chest - The anterior side of the thorax from the neck to the abdomen. - - - Waist - The abdominal circumference at the navel. - - - - Upper-extremity - Refers to the whole superior limb (shoulder, arm, elbow, wrist, hand). - - Elbow - A type of hinge joint located between the forearm and upper arm. - - - Forearm - Lower part of the arm between the elbow and wrist. - - - Hand - The distal portion of the upper extremity. It consists of the carpus, metacarpus, and digits. - - Finger - Any of the digits of the hand. - - Index-finger - The second finger from the radial side of the hand, next to the thumb. - - - Little-finger - The fifth and smallest finger from the radial side of the hand. - - - Middle-finger - The middle or third finger from the radial side of the hand. - - - Ring-finger - The fourth finger from the radial side of the hand. - - - Thumb - The thick and short hand digit which is next to the index finger in humans. - - - - Knuckles - A part of a finger at a joint where the bone is near the surface, especially where the finger joins the hand. - - - Palm - The part of the inner surface of the hand that extends from the wrist to the bases of the fingers. - - - - Shoulder - Joint attaching upper arm to trunk. - - - Upper-arm - Portion of arm between shoulder and elbow. - - - Wrist - A joint between the distal end of the radius and the proximal row of carpal bones. - - - - - - Organism - A living entity, more specifically a biological entity that consists of one or more cells and is capable of genomic replication (independently or not). - - Animal - A living organism that has membranous cell walls, requires oxygen and organic foods, and is capable of voluntary movement. - - - Human - The bipedal primate mammal Homo sapiens. - - - Plant - Any living organism that typically synthesizes its food from inorganic substances and possesses cellulose cell walls. - - - - - Language-item - An entity related to a systematic means of communicating by the use of sounds, symbols, or gestures. - - suggestedTag - Sensory-presentation - - - Character - A mark or symbol used in writing. - - - Clause - A unit of grammatical organization next below the sentence in rank, usually consisting of a subject and predicate. - - - Glyph - A hieroglyphic character, symbol, or pictograph. - - - Nonword - A group of letters or speech sounds that looks or sounds like a word but that is not accepted as such by native speakers. - - - Paragraph - A distinct section of a piece of writing, usually dealing with a single theme. - - - Phoneme - A speech sound that is distinguished by the speakers of a particular language. - - - Phrase - A phrase is a group of words functioning as a single unit in the syntax of a sentence. - - - Sentence - A set of words that is complete in itself, conveying a statement, question, exclamation, or command and typically containing an explicit or implied subject and a predicate containing a finite verb. - - - Syllable - A unit of spoken language larger than a phoneme. - - - Textblock - A block of text. - - - Word - A word is the smallest free form (an item that may be expressed in isolation with semantic or pragmatic content) in a language. - - - - Object - Something perceptible by one or more of the senses, especially by vision or touch. A material thing. - - suggestedTag - Sensory-presentation - - - Geometric-object - An object or a representation that has structure and topology in space. - - 2D-shape - A planar, two-dimensional shape. - - Arrow - A shape with a pointed end indicating direction. - - - Clockface - The dial face of a clock. A location identifier based on clockface numbering or anatomic subregion. - - - Cross - A figure or mark formed by two intersecting lines crossing at their midpoints. - - - Dash - A horizontal stroke in writing or printing to mark a pause or break in sense or to represent omitted letters or words. - - - Ellipse - A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base. - - Circle - A ring-shaped structure with every point equidistant from the center. - - - - Rectangle - A parallelogram with four right angles. - - Square - A square is a special rectangle with four equal sides. - - - - Single-point - A point is a geometric entity that is located in a zero-dimensional spatial region and whose position is defined by its coordinates in some coordinate system. - - - Star - A conventional or stylized representation of a star, typically one having five or more points. - - - Triangle - A three-sided polygon. - - - - 3D-shape - A geometric three-dimensional shape. - - Box - A square or rectangular vessel, usually made of cardboard or plastic. - - Cube - A solid or semi-solid in the shape of a three dimensional square. - - - - Cone - A shape whose base is a circle and whose sides taper up to a point. - - - Cylinder - A surface formed by circles of a given radius that are contained in a plane perpendicular to a given axis, whose centers align on the axis. - - - Ellipsoid - A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base. - - Sphere - A solid or hollow three-dimensional object bounded by a closed surface such that every point on the surface is equidistant from the center. - - - - Pyramid - A polyhedron of which one face is a polygon of any number of sides, and the other faces are triangles with a common vertex. - - - - Pattern - An arrangement of objects, facts, behaviors, or other things which have scientific, mathematical, geometric, statistical, or other meaning. - - Dots - A small round mark or spot. - - - LED-pattern - A pattern created by lighting selected members of a fixed light emitting diode array. - - - - - Ingestible-object - Something that can be taken into the body by the mouth for digestion or absorption. - - - Man-made-object - Something constructed by human means. - - Building - A structure that has a roof and walls and stands more or less permanently in one place. - - Attic - A room or a space immediately below the roof of a building. - - - Basement - The part of a building that is wholly or partly below ground level. - - - Entrance - The means or place of entry. - - - Roof - A roof is the covering on the uppermost part of a building which provides protection from animals and weather, notably rain, but also heat, wind and sunlight. - - - Room - An area within a building enclosed by walls and floor and ceiling. - - - - Clothing - A covering designed to be worn on the body. - - - Device - An object contrived for a specific purpose. - - Assistive-device - A device that help an individual accomplish a task. - - Glasses - Frames with lenses worn in front of the eye for vision correction, eye protection, or protection from UV rays. - - - Writing-device - A device used for writing. - - Pen - A common writing instrument used to apply ink to a surface for writing or drawing. - - - Pencil - An implement for writing or drawing that is constructed of a narrow solid pigment core in a protective casing that prevents the core from being broken or marking the hand. - - - - - Computing-device - An electronic device which take inputs and processes results from the inputs. - - Cellphone - A telephone with access to a cellular radio system so it can be used over a wide area, without a physical connection to a network. - - - Desktop-computer - A computer suitable for use at an ordinary desk. - - - Laptop-computer - A computer that is portable and suitable for use while traveling. - - - Tablet-computer - A small portable computer that accepts input directly on to its screen rather than via a keyboard or mouse. - - - - Engine - A motor is a machine designed to convert one or more forms of energy into mechanical energy. - - - IO-device - Hardware used by a human (or other system) to communicate with a computer. - - Input-device - A piece of equipment used to provide data and control signals to an information processing system such as a computer or information appliance. - - Computer-mouse - A hand-held pointing device that detects two-dimensional motion relative to a surface. - - Mouse-button - An electric switch on a computer mouse which can be pressed or clicked to select or interact with an element of a graphical user interface. - - - Scroll-wheel - A scroll wheel or mouse wheel is a wheel used for scrolling made of hard plastic with a rubbery surface usually located between the left and right mouse buttons and is positioned perpendicular to the mouse surface. - - - - Joystick - A control device that uses a movable handle to create two-axis input for a computer device. - - - Keyboard - A device consisting of mechanical keys that are pressed to create input to a computer. - - Keyboard-key - A button on a keyboard usually representing letters, numbers, functions, or symbols. - - # - Value of a keyboard key. - - takesValue - - - - - - Keypad - A device consisting of keys, usually in a block arrangement, that provides limited input to a system. - - Keypad-key - A key on a separate section of a computer keyboard that groups together numeric keys and those for mathematical or other special functions in an arrangement like that of a calculator. - - # - Value of keypad key. - - takesValue - - - - - - Microphone - A device designed to convert sound to an electrical signal. - - - Push-button - A switch designed to be operated by pressing a button. - - - - Output-device - Any piece of computer hardware equipment which converts information into human understandable form. - - Auditory-device - A device designed to produce sound. - - Headphones - An instrument that consists of a pair of small loudspeakers, or less commonly a single speaker, held close to ears and connected to a signal source such as an audio amplifier, radio, CD player or portable media player. - - - Loudspeaker - A device designed to convert electrical signals to sounds that can be heard. - - - - Display-device - An output device for presentation of information in visual or tactile form the latter used for example in tactile electronic displays for blind people. - - Computer-screen - An electronic device designed as a display or a physical device designed to be a protective meshwork. - - Screen-window - A part of a computer screen that contains a display different from the rest of the screen. A window is a graphical control element consisting of a visual area containing some of the graphical user interface of the program it belongs to and is framed by a window decoration. - - - - Head-mounted-display - An instrument that functions as a display device, worn on the head or as part of a helmet, that has a small display optic in front of one (monocular HMD) or each eye (binocular HMD). - - - LED-display - A LED display is a flat panel display that uses an array of light-emitting diodes as pixels for a video display. - - - - - Recording-device - A device that copies information in a signal into a persistent information bearer. - - EEG-recorder - A device for recording electric currents in the brain using electrodes applied to the scalp, to the surface of the brain, or placed within the substance of the brain. - - - File-storage - A device for recording digital information to a permanent media. - - - MEG-recorder - A device for measuring the magnetic fields produced by electrical activity in the brain, usually conducted externally. - - - Motion-capture - A device for recording the movement of objects or people. - - - Tape-recorder - A device for recording and reproduction usually using magnetic tape for storage that can be saved and played back. - - - - Touchscreen - A control component that operates an electronic device by pressing the display on the screen. - - - - Machine - A human-made device that uses power to apply forces and control movement to perform an action. - - - Measurement-device - A device in which a measure function inheres. - - Clock - A device designed to indicate the time of day or to measure the time duration of an event or action. - - Clock-face - A location identifier based on clockface numbering or anatomic subregion. - - - - - Robot - A mechanical device that sometimes resembles a living animal and is capable of performing a variety of often complex human tasks on command or by being programmed in advance. - - - Tool - A component that is not part of a device but is designed to support its assemby or operation. - - - - Document - A physical object, or electronic counterpart, that is characterized by containing writing which is meant to be human-readable. - - Book - A volume made up of pages fastened along one edge and enclosed between protective covers. - - - Letter - A written message addressed to a person or organization. - - - Note - A brief written record. - - - Notebook - A book for notes or memoranda. - - - Questionnaire - A document consisting of questions and possibly responses, depending on whether it has been filled out. - - - - Furnishing - Furniture, fittings, and other decorative accessories, such as curtains and carpets, for a house or room. - - - Manufactured-material - Substances created or extracted from raw materials. - - Ceramic - A hard, brittle, heat-resistant and corrosion-resistant material made by shaping and then firing a nonmetallic mineral, such as clay, at a high temperature. - - - Glass - A brittle transparent solid with irregular atomic structure. - - - Paper - A thin sheet material produced by mechanically or chemically processing cellulose fibres derived from wood, rags, grasses or other vegetable sources in water. - - - Plastic - Various high-molecular-weight thermoplastic or thermosetting polymers that are capable of being molded, extruded, drawn, or otherwise shaped and then hardened into a form. - - - Steel - An alloy made up of iron with typically a few tenths of a percent of carbon to improve its strength and fracture resistance compared to iron. - - - - Media - Media are audo/visual/audiovisual modes of communicating information for mass consumption. - - Media-clip - A short segment of media. - - Audio-clip - A short segment of audio. - - - Audiovisual-clip - A short media segment containing both audio and video. - - - Video-clip - A short segment of video. - - - - Visualization - An planned process that creates images, diagrams or animations from the input data. - - Animation - A form of graphical illustration that changes with time to give a sense of motion or represent dynamic changes in the portrayal. - - - Art-installation - A large-scale, mixed-media constructions, often designed for a specific place or for a temporary period of time. - - - Braille - A display using a system of raised dots that can be read with the fingers by people who are blind. - - - Image - Any record of an imaging event whether physical or electronic. - - Cartoon - A type of illustration, sometimes animated, typically in a non-realistic or semi-realistic style. The specific meaning has evolved over time, but the modern usage usually refers to either an image or series of images intended for satire, caricature, or humor. A motion picture that relies on a sequence of illustrations for its animation. - - - Drawing - A representation of an object or outlining a figure, plan, or sketch by means of lines. - - - Icon - A sign (such as a word or graphic symbol) whose form suggests its meaning. - - - Painting - A work produced through the art of painting. - - - Photograph - An image recorded by a camera. - - - - Movie - A sequence of images displayed in succession giving the illusion of continuous movement. - - - Outline-visualization - A visualization consisting of a line or set of lines enclosing or indicating the shape of an object in a sketch or diagram. - - - Point-light-visualization - A display in which action is depicted using a few points of light, often generated from discrete sensors in motion capture. - - - Sculpture - A two- or three-dimensional representative or abstract forms, especially by carving stone or wood or by casting metal or plaster. - - - Stick-figure-visualization - A drawing showing the head of a human being or animal as a circle and all other parts as straight lines. - - - - - Navigational-object - An object whose purpose is to assist directed movement from one location to another. - - Path - A trodden way. A way or track laid down for walking or made by continual treading. - - - Road - An open way for the passage of vehicles, persons, or animals on land. - - Lane - A defined path with physical dimensions through which an object or substance may traverse. - - - - Runway - A paved strip of ground on a landing field for the landing and takeoff of aircraft. - - - - Vehicle - A mobile machine which transports people or cargo. - - Aircraft - A vehicle which is able to travel through air in an atmosphere. - - - Bicycle - A human-powered, pedal-driven, single-track vehicle, having two wheels attached to a frame, one behind the other. - - - Boat - A watercraft of any size which is able to float or plane on water. - - - Car - A wheeled motor vehicle used primarily for the transportation of human passengers. - - - Cart - A cart is a vehicle which has two wheels and is designed to transport human passengers or cargo. - - - Tractor - A mobile machine specifically designed to deliver a high tractive effort at slow speeds, and mainly used for the purposes of hauling a trailer or machinery used in agriculture or construction. - - - Train - A connected line of railroad cars with or without a locomotive. - - - Truck - A motor vehicle which, as its primary funcion, transports cargo rather than human passangers. - - - - - Natural-object - Something that exists in or is produced by nature, and is not artificial or man-made. - - Mineral - A solid, homogeneous, inorganic substance occurring in nature and having a definite chemical composition. - - - Natural-feature - A feature that occurs in nature. A prominent or identifiable aspect, region, or site of interest. - - Field - An unbroken expanse as of ice or grassland. - - - Hill - A rounded elevation of limited extent rising above the surrounding land with local relief of less than 300m. - - - Mountain - A landform that extends above the surrounding terrain in a limited area. - - - River - A natural freshwater surface stream of considerable volume and a permanent or seasonal flow, moving in a definite channel toward a sea, lake, or another river. - - - Waterfall - A sudden descent of water over a step or ledge in the bed of a river. - - - - - - Sound - Mechanical vibrations transmitted by an elastic medium. Something that can be heard. - - Environmental-sound - Sounds occuring in the environment. An accumulation of noise pollution that occurs outside. This noise can be caused by transport, industrial, and recreational activities. - - Crowd-sound - Noise produced by a mixture of sounds from a large group of people. - - - Signal-noise - Any part of a signal that is not the true or original signal but is introduced by the communication mechanism. - - - - Musical-sound - Sound produced by continuous and regular vibrations, as opposed to noise. - - Instrument-sound - Sound produced by a musical instrument. - - Flute-sound - These should be sorted. Flute should be first - - rooted - Instrument-sound - - - inLibrary - testlib - - - Flute-subsound1 - - inLibrary - testlib - - - - Flute-subsound2 - - inLibrary - testlib - - - - - Oboe-sound - These should be sorted. Oboe should be second - - rooted - Instrument-sound - - - inLibrary - testlib - - - Oboe-subsound1 - - inLibrary - testlib - - - - Oboe-subsound2 - - inLibrary - testlib - - - - - Violin-sound - These should be sorted. Violin should be last - - rooted - Instrument-sound - - - inLibrary - testlib - - - Violin-subsound1 - - inLibrary - testlib - - - - Violin-subsound2 - - inLibrary - testlib - - - - Violin-subsound3 - - inLibrary - testlib - - - - - - Tone - A musical note, warble, or other sound used as a particular signal on a telephone or answering machine. - - - Vocalized-sound - Musical sound produced by vocal cords in a biological agent. - - - - Named-animal-sound - A sound recognizable as being associated with particular animals. - - Barking - Sharp explosive cries like sounds made by certain animals, especially a dog, fox, or seal. - - - Bleating - Wavering cries like sounds made by a sheep, goat, or calf. - - - Chirping - Short, sharp, high-pitched noises like sounds made by small birds or an insects. - - - Crowing - Loud shrill sounds characteristic of roosters. - - - Growling - Low guttural sounds like those that made in the throat by a hostile dog or other animal. - - - Meowing - Vocalizations like those made by as those cats. These sounds have diverse tones and are sometimes chattered, murmured or whispered. The purpose can be assertive. - - - Mooing - Deep vocal sounds like those made by a cow. - - - Purring - Low continuous vibratory sound such as those made by cats. The sound expresses contentment. - - - Roaring - Loud, deep, or harsh prolonged sounds such as those made by big cats and bears for long-distance communication and intimidation. - - - Squawking - Loud, harsh noises such as those made by geese. - - - - Named-object-sound - A sound identifiable as coming from a particular type of object. - - Alarm-sound - A loud signal often loud continuous ringing to alert people to a problem or condition that requires urgent attention. - - - Beep - A short, single tone, that is typically high-pitched and generally made by a computer or other machine. - - - Buzz - A persistent vibratory sound often made by a buzzer device and used to indicate something incorrect. - - - Click - The sound made by a mechanical cash register, often to designate a reward. - - - Ding - A short ringing sound such as that made by a bell, often to indicate a correct response or the expiration of time. - - - Horn-blow - A loud sound made by forcing air through a sound device that funnels air to create the sound, often used to sound an alert. - - - Ka-ching - The sound made by a mechanical cash register, often to designate a reward. - - - Siren - A loud, continuous sound often varying in frequency designed to indicate an emergency. - - - - - - Property - Something that pertains to a thing. A characteristic of some entity. A quality or feature regarded as a characteristic or inherent part of someone or something. HED attributes are adjectives or adverbs. - - extensionAllowed - - - Agent-property - Something that pertains to an agent. - - extensionAllowed - - - Agent-state - The state of the agent. - - Agent-cognitive-state - The state of the cognitive processes or state of mind of the agent. - - Alert - Condition of heightened watchfulness or preparation for action. - - - Anesthetized - Having lost sensation to pain or having senses dulled due to the effects of an anesthetic. - - - Asleep - Having entered a periodic, readily reversible state of reduced awareness and metabolic activity, usually accompanied by physical relaxation and brain activity. - - - Attentive - Concentrating and focusing mental energy on the task or surroundings. - - - Awake - In a non sleeping state. - - - Brain-dead - Characterized by the irreversible absence of cortical and brain stem functioning. - - - Comatose - In a state of profound unconsciousness associated with markedly depressed cerebral activity. - - - Distracted - Lacking in concentration because of being preoccupied. - - - Drowsy - In a state of near-sleep, a strong desire for sleep, or sleeping for unusually long periods. - - - Intoxicated - In a state with disturbed psychophysiological functions and responses as a result of administration or ingestion of a psychoactive substance. - - - Locked-in - In a state of complete paralysis of all voluntary muscles except for the ones that control the movements of the eyes. - - - Passive - Not responding or initiating an action in response to a stimulus. - - - Resting - A state in which the agent is not exhibiting any physical exertion. - - - Vegetative - A state of wakefulness and conscience, but (in contrast to coma) with involuntary opening of the eyes and movements (such as teeth grinding, yawning, or thrashing of the extremities). - - - - Agent-emotional-state - The status of the general temperament and outlook of an agent. - - Angry - Experiencing emotions characterized by marked annoyance or hostility. - - - Aroused - In a state reactive to stimuli leading to increased heart rate and blood pressure, sensory alertness, mobility and readiness to respond. - - - Awed - Filled with wonder. Feeling grand, sublime or powerful emotions characterized by a combination of joy, fear, admiration, reverence, and/or respect. - - - Compassionate - Feeling or showing sympathy and concern for others often evoked for a person who is in distress and associated with altruistic motivation. - - - Content - Feeling satisfaction with things as they are. - - - Disgusted - Feeling revulsion or profound disapproval aroused by something unpleasant or offensive. - - - Emotionally-neutral - Feeling neither satisfied nor dissatisfied. - - - Empathetic - Understanding and sharing the feelings of another. Being aware of, being sensitive to, and vicariously experiencing the feelings, thoughts, and experience of another. - - - Excited - Feeling great enthusiasm and eagerness. - - - Fearful - Feeling apprehension that one may be in danger. - - - Frustrated - Feeling annoyed as a result of being blocked, thwarted, disappointed or defeated. - - - Grieving - Feeling sorrow in response to loss, whether physical or abstract. - - - Happy - Feeling pleased and content. - - - Jealous - Feeling threatened by a rival in a relationship with another individual, in particular an intimate partner, usually involves feelings of threat, fear, suspicion, distrust, anxiety, anger, betrayal, and rejection. - - - Joyful - Feeling delight or intense happiness. - - - Loving - Feeling a strong positive emotion of affection and attraction. - - - Relieved - No longer feeling pain, distress, anxiety, or reassured. - - - Sad - Feeling grief or unhappiness. - - - Stressed - Experiencing mental or emotional strain or tension. - - - - Agent-physiological-state - Having to do with the mechanical, physical, or biochemical function of an agent. - - Healthy - Having no significant health-related issues. - - relatedTag - Sick - - - - Hungry - Being in a state of craving or desiring food. - - relatedTag - Sated - Thirsty - - - - Rested - Feeling refreshed and relaxed. - - relatedTag - Tired - - - - Sated - Feeling full. - - relatedTag - Hungry - - - - Sick - Being in a state of ill health, bodily malfunction, or discomfort. - - relatedTag - Healthy - - - - Thirsty - Feeling a need to drink. - - relatedTag - Hungry - - - - Tired - Feeling in need of sleep or rest. - - relatedTag - Rested - - - - - Agent-postural-state - Pertaining to the position in which agent holds their body. - - Crouching - Adopting a position where the knees are bent and the upper body is brought forward and down, sometimes to avoid detection or to defend oneself. - - - Eyes-closed - Keeping eyes closed with no blinking. - - - Eyes-open - Keeping eyes open with occasional blinking. - - - Kneeling - Positioned where one or both knees are on the ground. - - - On-treadmill - Ambulation on an exercise apparatus with an endless moving belt to support moving in place. - - - Prone - Positioned in a recumbent body position whereby the person lies on its stomach and faces downward. - - - Seated-with-chin-rest - Using a device that supports the chin and head. - - - Sitting - In a seated position. - - - Standing - Assuming or maintaining an erect upright position. - - - - - Agent-task-role - The function or part that is ascribed to an agent in performing the task. - - Experiment-actor - An agent who plays a predetermined role to create the experiment scenario. - - - Experiment-controller - An agent exerting control over some aspect of the experiment. - - - Experiment-participant - Someone who takes part in an activity related to an experiment. - - - Experimenter - Person who is the owner of the experiment and has its responsibility. - - - - Agent-trait - A genetically, environmentally, or socially determined characteristic of an agent. - - Age - Length of time elapsed time since birth of the agent. - - # - - takesValue - - - valueClass - numericClass - - - - - Agent-experience-level - Amount of skill or knowledge that the agent has as pertains to the task. - - Expert-level - Having comprehensive and authoritative knowledge of or skill in a particular area related to the task. - - relatedTag - Intermediate-experience-level - Novice-level - - - - Intermediate-experience-level - Having a moderate amount of knowledge or skill related to the task. - - relatedTag - Expert-level - Novice-level - - - - Novice-level - Being inexperienced in a field or situation related to the task. - - relatedTag - Expert-level - Intermediate-experience-level - - - - - Ethnicity - Belong to a social group that has a common national or cultural tradition. Use with Label to avoid extension. - - - Gender - Characteristics that are socially constructed, including norms, behaviors, and roles based on sex. - - - Handedness - Individual preference for use of a hand, known as the dominant hand. - - Ambidextrous - Having no overall dominance in the use of right or left hand or foot in the performance of tasks that require one hand or foot. - - - Left-handed - Preference for using the left hand or foot for tasks requiring the use of a single hand or foot. - - - Right-handed - Preference for using the right hand or foot for tasks requiring the use of a single hand or foot. - - - - Race - Belonging to a group sharing physical or social qualities as defined within a specified society. Use with Label to avoid extension. - - - Sex - Physical properties or qualities by which male is distinguished from female. - - Female - Biological sex of an individual with female sexual organs such ova. - - - Intersex - Having genitalia and/or secondary sexual characteristics of indeterminate sex. - - - Male - Biological sex of an individual with male sexual organs producing sperm. - - - - - - Data-property - Something that pertains to data or information. - - extensionAllowed - - - Data-marker - An indicator placed to mark something. - - Data-break-marker - An indicator place to indicate a gap in the data. - - - Temporal-marker - An indicator placed at a particular time in the data. - - Inset - Marks an intermediate point in an ongoing event of temporal extent. - - topLevelTagGroup - - - reserved - - - relatedTag - Onset - Offset - - - - Offset - Marks the end of an event of temporal extent. - - topLevelTagGroup - - - reserved - - - relatedTag - Onset - Inset - - - - Onset - Marks the start of an ongoing event of temporal extent. - - topLevelTagGroup - - - reserved - - - relatedTag - Inset - Offset - - - - Pause - Indicates the temporary interruption of the operation a process and subsequently wait for a signal to continue. - - - Time-out - A cancellation or cessation that automatically occurs when a predefined interval of time has passed without a certain event occurring. - - - Time-sync - A synchronization signal whose purpose to help synchronize different signals or processes. Often used to indicate a marker inserted into the recorded data to allow post hoc synchronization of concurrently recorded data streams. - - - - - Data-resolution - Smallest change in a quality being measured by an sensor that causes a perceptible change. - - Printer-resolution - Resolution of a printer, usually expressed as the number of dots-per-inch for a printer. - - # - - takesValue - - - valueClass - numericClass - - - - - Screen-resolution - Resolution of a screen, usually expressed as the of pixels in a dimension for a digital display device. - - # - - takesValue - - - valueClass - numericClass - - - - - Sensory-resolution - Resolution of measurements by a sensing device. - - # - - takesValue - - - valueClass - numericClass - - - - - Spatial-resolution - Linear spacing of a spatial measurement. - - # - - takesValue - - - valueClass - numericClass - - - - - Spectral-resolution - Measures the ability of a sensor to resolve features in the electromagnetic spectrum. - - # - - takesValue - - - valueClass - numericClass - - - - - Temporal-resolution - Measures the ability of a sensor to resolve features in time. - - # - - takesValue - - - valueClass - numericClass - - - - - - Data-source-type - The type of place, person, or thing from which the data comes or can be obtained. - - Computed-feature - A feature computed from the data by a tool. This tag should be grouped with a label of the form Toolname_propertyName. - - - Computed-prediction - A computed extrapolation of known data. - - - Expert-annotation - An explanatory or critical comment or other in-context information provided by an authority. - - - Instrument-measurement - Information obtained from a device that is used to measure material properties or make other observations. - - - Observation - Active acquisition of information from a primary source. Should be grouped with a label of the form AgentID_featureName. - - - - Data-value - Designation of the type of a data item. - - Categorical-value - Indicates that something can take on a limited and usually fixed number of possible values. - - Categorical-class-value - Categorical values that fall into discrete classes such as true or false. The grouping is absolute in the sense that it is the same for all participants. - - All - To a complete degree or to the full or entire extent. - - relatedTag - Some - None - - - - Correct - Free from error. Especially conforming to fact or truth. - - relatedTag - Wrong - - - - Explicit - Stated clearly and in detail, leaving no room for confusion or doubt. - - relatedTag - Implicit - - - - False - Not in accordance with facts, reality or definitive criteria. - - relatedTag - True - - - - Implicit - Implied though not plainly expressed. - - relatedTag - Explicit - - - - Invalid - Not allowed or not conforming to the correct format or specifications. - - relatedTag - Valid - - - - None - No person or thing, nobody, not any. - - relatedTag - All - Some - - - - Some - At least a small amount or number of, but not a large amount of, or often. - - relatedTag - All - None - - - - True - Conforming to facts, reality or definitive criteria. - - relatedTag - False - - - - Valid - Allowable, usable, or acceptable. - - relatedTag - Invalid - - - - Wrong - Inaccurate or not correct. - - relatedTag - Correct - - - - - Categorical-judgment-value - Categorical values that are based on the judgment or perception of the participant such familiar and famous. - - Abnormal - Deviating in any way from the state, position, structure, condition, behavior, or rule which is considered a norm. - - relatedTag - Normal - - - - Asymmetrical - Lacking symmetry or having parts that fail to correspond to one another in shape, size, or arrangement. - - relatedTag - Symmetrical - - - - Audible - A sound that can be perceived by the participant. - - relatedTag - Inaudible - - - - Complex - Hard, involved or complicated, elaborate, having many parts. - - relatedTag - Simple - - - - Congruent - Concordance of multiple evidence lines. In agreement or harmony. - - relatedTag - Incongruent - - - - Constrained - Keeping something within particular limits or bounds. - - relatedTag - Unconstrained - - - - Disordered - Not neatly arranged. Confused and untidy. A structural quality in which the parts of an object are non-rigid. - - relatedTag - Ordered - - - - Familiar - Recognized, familiar, or within the scope of knowledge. - - relatedTag - Unfamiliar - Famous - - - - Famous - A person who has a high degree of recognition by the general population for his or her success or accomplishments. A famous person. - - relatedTag - Familiar - Unfamiliar - - - - Inaudible - A sound below the threshold of perception of the participant. - - relatedTag - Audible - - - - Incongruent - Not in agreement or harmony. - - relatedTag - Congruent - - - - Involuntary - An action that is not made by choice. In the body, involuntary actions (such as blushing) occur automatically, and cannot be controlled by choice. - - relatedTag - Voluntary - - - - Masked - Information exists but is not provided or is partially obscured due to security, privacy, or other concerns. - - relatedTag - Unmasked - - - - Normal - Being approximately average or within certain limits. Conforming with or constituting a norm or standard or level or type or social norm. - - relatedTag - Abnormal - - - - Ordered - Conforming to a logical or comprehensible arrangement of separate elements. - - relatedTag - Disordered - - - - Simple - Easily understood or presenting no difficulties. - - relatedTag - Complex - - - - Symmetrical - Made up of exactly similar parts facing each other or around an axis. Showing aspects of symmetry. - - relatedTag - Asymmetrical - - - - Unconstrained - Moving without restriction. - - relatedTag - Constrained - - - - Unfamiliar - Not having knowledge or experience of. - - relatedTag - Familiar - Famous - - - - Unmasked - Information is revealed. - - relatedTag - Masked - - - - Voluntary - Using free will or design; not forced or compelled; controlled by individual volition. - - relatedTag - Involuntary - - - - - Categorical-level-value - Categorical values based on dividing a continuous variable into levels such as high and low. - - Cold - Having an absence of heat. - - relatedTag - Hot - - - - Deep - Extending relatively far inward or downward. - - relatedTag - Shallow - - - - High - Having a greater than normal degree, intensity, or amount. - - relatedTag - Low - Medium - - - - Hot - Having an excess of heat. - - relatedTag - Cold - - - - Large - Having a great extent such as in physical dimensions, period of time, amplitude or frequency. - - relatedTag - Small - - - - Liminal - Situated at a sensory threshold that is barely perceptible or capable of eliciting a response. - - relatedTag - Subliminal - Supraliminal - - - - Loud - Having a perceived high intensity of sound. - - relatedTag - Quiet - - - - Low - Less than normal in degree, intensity or amount. - - relatedTag - High - - - - Medium - Mid-way between small and large in number, quantity, magnitude or extent. - - relatedTag - Low - High - - - - Negative - Involving disadvantage or harm. - - relatedTag - Positive - - - - Positive - Involving advantage or good. - - relatedTag - Negative - - - - Quiet - Characterizing a perceived low intensity of sound. - - relatedTag - Loud - - - - Rough - Having a surface with perceptible bumps, ridges, or irregularities. - - relatedTag - Smooth - - - - Shallow - Having a depth which is relatively low. - - relatedTag - Deep - - - - Small - Having a small extent such as in physical dimensions, period of time, amplitude or frequency. - - relatedTag - Large - - - - Smooth - Having a surface free from bumps, ridges, or irregularities. - - relatedTag - Rough - - - - Subliminal - Situated below a sensory threshold that is imperceptible or not capable of eliciting a response. - - relatedTag - Liminal - Supraliminal - - - - Supraliminal - Situated above a sensory threshold that is perceptible or capable of eliciting a response. - - relatedTag - Liminal - Subliminal - - - - Thick - Wide in width, extent or cross-section. - - relatedTag - Thin - - - - Thin - Narrow in width, extent or cross-section. - - relatedTag - Thick - - - - - Categorical-orientation-value - Value indicating the orientation or direction of something. - - Backward - Directed behind or to the rear. - - relatedTag - Forward - - - - Downward - Moving or leading toward a lower place or level. - - relatedTag - Leftward - Rightward - Upward - - - - Forward - At or near or directed toward the front. - - relatedTag - Backward - - - - Horizontally-oriented - Oriented parallel to or in the plane of the horizon. - - relatedTag - Vertically-oriented - - - - Leftward - Going toward or facing the left. - - relatedTag - Downward - Rightward - Upward - - - - Oblique - Slanting or inclined in direction, course, or position that is neither parallel nor perpendicular nor right-angular. - - relatedTag - Rotated - - - - Rightward - Going toward or situated on the right. - - relatedTag - Downward - Leftward - Upward - - - - Rotated - Positioned offset around an axis or center. - - - Upward - Moving, pointing, or leading to a higher place, point, or level. - - relatedTag - Downward - Leftward - Rightward - - - - Vertically-oriented - Oriented perpendicular to the plane of the horizon. - - relatedTag - Horizontally-oriented - - - - - - Physical-value - The value of some physical property of something. - - Temperature - A measure of hot or cold based on the average kinetic energy of the atoms or molecules in the system. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - temperatureUnits - - - - - Weight - The relative mass or the quantity of matter contained by something. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - weightUnits - - - - - - Quantitative-value - Something capable of being estimated or expressed with numeric values. - - Fraction - A numerical value between 0 and 1. - - # - - takesValue - - - valueClass - numericClass - - - - - Item-count - The integer count of something which is usually grouped with the entity it is counting. (Item-count/3, A) indicates that 3 of A have occurred up to this point. - - # - - takesValue - - - valueClass - numericClass - - - - - Item-index - The index of an item in a collection, sequence or other structure. (A (Item-index/3, B)) means that A is item number 3 in B. - - # - - takesValue - - - valueClass - numericClass - - - - - Item-interval - An integer indicating how many items or entities have passed since the last one of these. An item interval of 0 indicates the current item. - - # - - takesValue - - - valueClass - numericClass - - - - - Percentage - A fraction or ratio with 100 understood as the denominator. - - # - - takesValue - - - valueClass - numericClass - - - - - Ratio - A quotient of quantities of the same kind for different components within the same system. - - # - - takesValue - - - valueClass - numericClass - - - - - - Spatiotemporal-value - A property relating to space and/or time. - - Rate-of-change - The amount of change accumulated per unit time. - - Acceleration - Magnitude of the rate of change in either speed or direction. The direction of change should be given separately. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - accelerationUnits - - - - - Frequency - Frequency is the number of occurrences of a repeating event per unit time. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - frequencyUnits - - - - - Jerk-rate - Magnitude of the rate at which the acceleration of an object changes with respect to time. The direction of change should be given separately. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - jerkUnits - - - - - Refresh-rate - The frequency with which the image on a computer monitor or similar electronic display screen is refreshed, usually expressed in hertz. - - # - - takesValue - - - valueClass - numericClass - - - - - Sampling-rate - The number of digital samples taken or recorded per unit of time. - - # - - takesValue - - - unitClass - frequencyUnits - - - - - Speed - A scalar measure of the rate of movement of the object expressed either as the distance travelled divided by the time taken (average speed) or the rate of change of position with respect to time at a particular point (instantaneous speed). The direction of change should be given separately. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - speedUnits - - - - - Temporal-rate - The number of items per unit of time. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - frequencyUnits - - - - - - Spatial-value - Value of an item involving space. - - Angle - The amount of inclination of one line to another or the plane of one object to another. - - # - - takesValue - - - unitClass - angleUnits - - - valueClass - numericClass - - - - - Distance - A measure of the space separating two objects or points. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - physicalLengthUnits - - - - - Position - A reference to the alignment of an object, a particular situation or view of a situation, or the location of an object. Coordinates with respect a specified frame of reference or the default Screen-frame if no frame is given. - - X-position - The position along the x-axis of the frame of reference. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - physicalLengthUnits - - - - - Y-position - The position along the y-axis of the frame of reference. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - physicalLengthUnits - - - - - Z-position - The position along the z-axis of the frame of reference. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - physicalLengthUnits - - - - - - Size - The physical magnitude of something. - - Area - The extent of a 2-dimensional surface enclosed within a boundary. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - areaUnits - - - - - Depth - The distance from the surface of something especially from the perspective of looking from the front. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - physicalLengthUnits - - - - - Height - The vertical measurement or distance from the base to the top of an object. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - physicalLengthUnits - - - - - Length - The linear extent in space from one end of something to the other end, or the extent of something from beginning to end. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - physicalLengthUnits - - - - - Volume - The amount of three dimensional space occupied by an object or the capacity of a space or container. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - volumeUnits - - - - - Width - The extent or measurement of something from side to side. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - physicalLengthUnits - - - - - - - Temporal-value - A characteristic of or relating to time or limited by time. - - Delay - The time at which an event start time is delayed from the current onset time. This tag defines the start time of an event of temporal extent and may be used with the Duration tag. - - topLevelTagGroup - - - reserved - - - relatedTag - Duration - - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - - - Duration - The period of time during which an event occurs. This tag defines the end time of an event of temporal extent and may be used with the Delay tag. - - topLevelTagGroup - - - reserved - - - relatedTag - Delay - - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - - - Time-interval - The period of time separating two instances, events, or occurrences. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - - - Time-value - A value with units of time. Usually grouped with tags identifying what the value represents. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - - - - - Statistical-value - A value based on or employing the principles of statistics. - - extensionAllowed - - - Data-maximum - The largest possible quantity or degree. - - # - - takesValue - - - valueClass - numericClass - - - - - Data-mean - The sum of a set of values divided by the number of values in the set. - - # - - takesValue - - - valueClass - numericClass - - - - - Data-median - The value which has an equal number of values greater and less than it. - - # - - takesValue - - - valueClass - numericClass - - - - - Data-minimum - The smallest possible quantity. - - # - - takesValue - - - valueClass - numericClass - - - - - Probability - A measure of the expectation of the occurrence of a particular event. - - # - - takesValue - - - valueClass - numericClass - - - - - Standard-deviation - A measure of the range of values in a set of numbers. Standard deviation is a statistic used as a measure of the dispersion or variation in a distribution, equal to the square root of the arithmetic mean of the squares of the deviations from the arithmetic mean. - - # - - takesValue - - - valueClass - numericClass - - - - - Statistical-accuracy - A measure of closeness to true value expressed as a number between 0 and 1. - - # - - takesValue - - - valueClass - numericClass - - - - - Statistical-precision - A quantitative representation of the degree of accuracy necessary for or associated with a particular action. - - # - - takesValue - - - valueClass - numericClass - - - - - Statistical-recall - Sensitivity is a measurement datum qualifying a binary classification test and is computed by substracting the false negative rate to the integral numeral 1. - - # - - takesValue - - - valueClass - numericClass - - - - - Statistical-uncertainty - A measure of the inherent variability of repeated observation measurements of a quantity including quantities evaluated by statistical methods and by other means. - - # - - takesValue - - - valueClass - numericClass - - - - - - - Data-variability-attribute - An attribute describing how something changes or varies. - - Abrupt - Marked by sudden change. - - - Constant - Continually recurring or continuing without interruption. Not changing in time or space. - - - Continuous - Uninterrupted in time, sequence, substance, or extent. - - relatedTag - Discrete - Discontinuous - - - - Decreasing - Becoming smaller or fewer in size, amount, intensity, or degree. - - relatedTag - Increasing - - - - Deterministic - No randomness is involved in the development of the future states of the element. - - relatedTag - Random - Stochastic - - - - Discontinuous - Having a gap in time, sequence, substance, or extent. - - relatedTag - Continuous - - - - Discrete - Constituting a separate entities or parts. - - relatedTag - Continuous - Discontinuous - - - - Estimated-value - Something that has been calculated or measured approximately. - - - Exact-value - A value that is viewed to the true value according to some standard. - - - Flickering - Moving irregularly or unsteadily or burning or shining fitfully or with a fluctuating light. - - - Fractal - Having extremely irregular curves or shapes for which any suitably chosen part is similar in shape to a given larger or smaller part when magnified or reduced to the same size. - - - Increasing - Becoming greater in size, amount, or degree. - - relatedTag - Decreasing - - - - Random - Governed by or depending on chance. Lacking any definite plan or order or purpose. - - relatedTag - Deterministic - Stochastic - - - - Repetitive - A recurring action that is often non-purposeful. - - - Stochastic - Uses a random probability distribution or pattern that may be analysed statistically but may not be predicted precisely to determine future states. - - relatedTag - Deterministic - Random - - - - Varying - Differing in size, amount, degree, or nature. - - - - - Environmental-property - Relating to or arising from the surroundings of an agent. - - Augmented-reality - Using technology that enhances real-world experiences with computer-derived digital overlays to change some aspects of perception of the natural environment. The digital content is shown to the user through a smart device or glasses and responds to changes in the environment. - - - Indoors - Located inside a building or enclosure. - - - Motion-platform - A mechanism that creates the feelings of being in a real motion environment. - - - Outdoors - Any area outside a building or shelter. - - - Real-world - Located in a place that exists in real space and time under realistic conditions. - - - Rural - Of or pertaining to the country as opposed to the city. - - - Terrain - Characterization of the physical features of a tract of land. - - Composite-terrain - Tracts of land characterized by a mixure of physical features. - - - Dirt-terrain - Tracts of land characterized by a soil surface and lack of vegetation. - - - Grassy-terrain - Tracts of land covered by grass. - - - Gravel-terrain - Tracts of land covered by a surface consisting a loose aggregation of small water-worn or pounded stones. - - - Leaf-covered-terrain - Tracts of land covered by leaves and composited organic material. - - - Muddy-terrain - Tracts of land covered by a liquid or semi-liquid mixture of water and some combination of soil, silt, and clay. - - - Paved-terrain - Tracts of land covered with concrete, asphalt, stones, or bricks. - - - Rocky-terrain - Tracts of land consisting or full of rock or rocks. - - - Sloped-terrain - Tracts of land arranged in a sloping or inclined position. - - - Uneven-terrain - Tracts of land that are not level, smooth, or regular. - - - - Urban - Relating to, located in, or characteristic of a city or densely populated area. - - - Virtual-world - Using technology that creates immersive, computer-generated experiences that a person can interact with and navigate through. The digital content is generally delivered to the user through some type of headset and responds to changes in head position or through interaction with other types of sensors. Existing in a virtual setting such as a simulation or game environment. - - - - Informational-property - Something that pertains to a task. - - extensionAllowed - - - Description - An explanation of what the tag group it is in means. If the description is at the top-level of an event string, the description applies to the event. - - requireChild - - - # - - takesValue - - - valueClass - textClass - - - - - ID - An alphanumeric name that identifies either a unique object or a unique class of objects. Here the object or class may be an idea, physical countable object (or class), or physical uncountable substance (or class). - - requireChild - - - # - - takesValue - - - valueClass - textClass - - - - - Label - A string of 20 or fewer characters identifying something. Labels usually refer to general classes of things while IDs refer to specific instances. A term that is associated with some entity. A brief description given for purposes of identification. An identifying or descriptive marker that is attached to an object. - - requireChild - - - # - - takesValue - - - valueClass - nameClass - - - - - Metadata - Data about data. Information that describes another set of data. - - CogAtlas - The Cognitive Atlas ID number of something. - - # - - takesValue - - - - - CogPo - The CogPO ID number of something. - - # - - takesValue - - - - - Creation-date - The date on which data creation of this element began. - - requireChild - - - # - - takesValue - - - valueClass - dateTimeClass - - - - - Experimental-note - A brief written record about the experiment. - - # - - takesValue - - - valueClass - textClass - - - - - Library-name - Official name of a HED library. - - # - - takesValue - - - valueClass - nameClass - - - - - OBO-identifier - The identifier of a term in some Open Biology Ontology (OBO) ontology. - - # - - takesValue - - - valueClass - nameClass - - - - - Pathname - The specification of a node (file or directory) in a hierarchical file system, usually specified by listing the nodes top-down. - - # - - takesValue - - - - - Subject-identifier - A sequence of characters used to identify, name, or characterize a trial or study subject. - - # - - takesValue - - - - - Version-identifier - An alphanumeric character string that identifies a form or variant of a type or original. - - # - Usually is a semantic version. - - takesValue - - - - - - Parameter - Something user-defined for this experiment. - - Parameter-label - The name of the parameter. - - # - - takesValue - - - valueClass - nameClass - - - - - Parameter-value - The value of the parameter. - - # - - takesValue - - - valueClass - textClass - - - - - - - Organizational-property - Relating to an organization or the action of organizing something. - - Collection - A tag designating a grouping of items such as in a set or list. - - # - Name of the collection. - - takesValue - - - valueClass - nameClass - - - - - Condition-variable - An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent variables or contrasts. - - # - Name of the condition variable. - - takesValue - - - valueClass - nameClass - - - - - Control-variable - An aspect of the experiment that is fixed throughout the study and usually is explicitly controlled. - - # - Name of the control variable. - - takesValue - - - valueClass - nameClass - - - - - Def - A HED-specific utility tag used with a defined name to represent the tags associated with that definition. - - requireChild - - - reserved - - - # - Name of the definition. - - takesValue - - - valueClass - nameClass - - - - - Def-expand - A HED specific utility tag that is grouped with an expanded definition. The child value of the Def-expand is the name of the expanded definition. - - requireChild - - - reserved - - - tagGroup - - - # - - takesValue - - - valueClass - nameClass - - - - - Definition - A HED-specific utility tag whose child value is the name of the concept and the tag group associated with the tag is an English language explanation of a concept. - - requireChild - - - reserved - - - topLevelTagGroup - - - # - Name of the definition. - - takesValue - - - valueClass - nameClass - - - - - Event-context - A special HED tag inserted as part of a top-level tag group to contain information about the interrelated conditions under which the event occurs. The event context includes information about other events that are ongoing when this event happens. - - reserved - - - topLevelTagGroup - - - unique - - - - Event-stream - A special HED tag indicating that this event is a member of an ordered succession of events. - - # - Name of the event stream. - - takesValue - - - valueClass - nameClass - - - - - Experimental-intertrial - A tag used to indicate a part of the experiment between trials usually where nothing is happening. - - # - Optional label for the intertrial block. - - takesValue - - - valueClass - nameClass - - - - - Experimental-trial - Designates a run or execution of an activity, for example, one execution of a script. A tag used to indicate a particular organizational part in the experimental design often containing a stimulus-response pair or stimulus-response-feedback triad. - - # - Optional label for the trial (often a numerical string). - - takesValue - - - valueClass - nameClass - - - - - Indicator-variable - An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent variables. - - # - Name of the indicator variable. - - takesValue - - - valueClass - nameClass - - - - - Recording - A tag designating the data recording. Recording tags are usually have temporal scope which is the entire recording. - - # - Optional label for the recording. - - takesValue - - - valueClass - nameClass - - - - - Task - An assigned piece of work, usually with a time allotment. A tag used to indicate a linkage the structured activities performed as part of the experiment. - - # - Optional label for the task block. - - takesValue - - - valueClass - nameClass - - - - - Time-block - A tag used to indicate a contiguous time block in the experiment during which something is fixed or noted. - - # - Optional label for the task block. - - takesValue - - - valueClass - nameClass - - - - - - Sensory-property - Relating to sensation or the physical senses. - - Sensory-attribute - A sensory characteristic associated with another entity. - - Auditory-attribute - Pertaining to the sense of hearing. - - Loudness - Perceived intensity of a sound. - - # - - takesValue - - - valueClass - numericClass - nameClass - - - - - Pitch - A perceptual property that allows the user to order sounds on a frequency scale. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - frequencyUnits - - - - - Sound-envelope - Description of how a sound changes over time. - - Sound-envelope-attack - The time taken for initial run-up of level from nil to peak usually beginning when the key on a musical instrument is pressed. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - - - Sound-envelope-decay - The time taken for the subsequent run down from the attack level to the designated sustain level. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - - - Sound-envelope-release - The time taken for the level to decay from the sustain level to zero after the key is released. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - - - Sound-envelope-sustain - The time taken for the main sequence of the sound duration, until the key is released. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - timeUnits - - - - - - Sound-volume - The sound pressure level (SPL) usually the ratio to a reference signal estimated as the lower bound of hearing. - - # - - takesValue - - - valueClass - numericClass - - - unitClass - intensityUnits - - - - - Timbre - The perceived sound quality of a singing voice or musical instrument. - - # - - takesValue - - - valueClass - nameClass - - - - - - Gustatory-attribute - Pertaining to the sense of taste. - - Bitter - Having a sharp, pungent taste. - - - Salty - Tasting of or like salt. - - - Savory - Belonging to a taste that is salty or spicy rather than sweet. - - - Sour - Having a sharp, acidic taste. - - - Sweet - Having or resembling the taste of sugar. - - - - Olfactory-attribute - Having a smell. - - - Somatic-attribute - Pertaining to the feelings in the body or of the nervous system. - - Pain - The sensation of discomfort, distress, or agony, resulting from the stimulation of specialized nerve endings. - - - Stress - The negative mental, emotional, and physical reactions that occur when environmental stressors are perceived as exceeding the adaptive capacities of the individual. - - - - Tactile-attribute - Pertaining to the sense of touch. - - Tactile-pressure - Having a feeling of heaviness. - - - Tactile-temperature - Having a feeling of hotness or coldness. - - - Tactile-texture - Having a feeling of roughness. - - - Tactile-vibration - Having a feeling of mechanical oscillation. - - - - Vestibular-attribute - Pertaining to the sense of balance or body position. - - - Visual-attribute - Pertaining to the sense of sight. - - Color - The appearance of objects (or light sources) described in terms of perception of their hue and lightness (or brightness) and saturation. - - CSS-color - One of 140 colors supported by all browsers. For more details such as the color RGB or HEX values, check: https://www.w3schools.com/colors/colors_groups.asp. - - Blue-color - CSS color group. - - Blue - CSS-color 0x0000FF. - - - CadetBlue - CSS-color 0x5F9EA0. - - - CornflowerBlue - CSS-color 0x6495ED. - - - DarkBlue - CSS-color 0x00008B. - - - DeepSkyBlue - CSS-color 0x00BFFF. - - - DodgerBlue - CSS-color 0x1E90FF. - - - LightBlue - CSS-color 0xADD8E6. - - - LightSkyBlue - CSS-color 0x87CEFA. - - - LightSteelBlue - CSS-color 0xB0C4DE. - - - MediumBlue - CSS-color 0x0000CD. - - - MidnightBlue - CSS-color 0x191970. - - - Navy - CSS-color 0x000080. - - - PowderBlue - CSS-color 0xB0E0E6. - - - RoyalBlue - CSS-color 0x4169E1. - - - SkyBlue - CSS-color 0x87CEEB. - - - SteelBlue - CSS-color 0x4682B4. - - - - Brown-color - CSS color group. - - Bisque - CSS-color 0xFFE4C4. - - - BlanchedAlmond - CSS-color 0xFFEBCD. - - - Brown - CSS-color 0xA52A2A. - - - BurlyWood - CSS-color 0xDEB887. - - - Chocolate - CSS-color 0xD2691E. - - - Cornsilk - CSS-color 0xFFF8DC. - - - DarkGoldenRod - CSS-color 0xB8860B. - - - GoldenRod - CSS-color 0xDAA520. - - - Maroon - CSS-color 0x800000. - - - NavajoWhite - CSS-color 0xFFDEAD. - - - Olive - CSS-color 0x808000. - - - Peru - CSS-color 0xCD853F. - - - RosyBrown - CSS-color 0xBC8F8F. - - - SaddleBrown - CSS-color 0x8B4513. - - - SandyBrown - CSS-color 0xF4A460. - - - Sienna - CSS-color 0xA0522D. - - - Tan - CSS-color 0xD2B48C. - - - Wheat - CSS-color 0xF5DEB3. - - - - Cyan-color - CSS color group. - - Aqua - CSS-color 0x00FFFF. - - - Aquamarine - CSS-color 0x7FFFD4. - - - Cyan - CSS-color 0x00FFFF. - - - DarkTurquoise - CSS-color 0x00CED1. - - - LightCyan - CSS-color 0xE0FFFF. - - - MediumTurquoise - CSS-color 0x48D1CC. - - - PaleTurquoise - CSS-color 0xAFEEEE. - - - Turquoise - CSS-color 0x40E0D0. - - - - Gray-color - CSS color group. - - Black - CSS-color 0x000000. - - - DarkGray - CSS-color 0xA9A9A9. - - - DarkSlateGray - CSS-color 0x2F4F4F. - - - DimGray - CSS-color 0x696969. - - - Gainsboro - CSS-color 0xDCDCDC. - - - Gray - CSS-color 0x808080. - - - LightGray - CSS-color 0xD3D3D3. - - - LightSlateGray - CSS-color 0x778899. - - - Silver - CSS-color 0xC0C0C0. - - - SlateGray - CSS-color 0x708090. - - - - Green-color - CSS color group. - - Chartreuse - CSS-color 0x7FFF00. - - - DarkCyan - CSS-color 0x008B8B. - - - DarkGreen - CSS-color 0x006400. - - - DarkOliveGreen - CSS-color 0x556B2F. - - - DarkSeaGreen - CSS-color 0x8FBC8F. - - - ForestGreen - CSS-color 0x228B22. - - - Green - CSS-color 0x008000. - - - GreenYellow - CSS-color 0xADFF2F. - - - LawnGreen - CSS-color 0x7CFC00. - - - LightGreen - CSS-color 0x90EE90. - - - LightSeaGreen - CSS-color 0x20B2AA. - - - Lime - CSS-color 0x00FF00. - - - LimeGreen - CSS-color 0x32CD32. - - - MediumAquaMarine - CSS-color 0x66CDAA. - - - MediumSeaGreen - CSS-color 0x3CB371. - - - MediumSpringGreen - CSS-color 0x00FA9A. - - - OliveDrab - CSS-color 0x6B8E23. - - - PaleGreen - CSS-color 0x98FB98. - - - SeaGreen - CSS-color 0x2E8B57. - - - SpringGreen - CSS-color 0x00FF7F. - - - Teal - CSS-color 0x008080. - - - YellowGreen - CSS-color 0x9ACD32. - - - - Orange-color - CSS color group. - - Coral - CSS-color 0xFF7F50. - - - DarkOrange - CSS-color 0xFF8C00. - - - Orange - CSS-color 0xFFA500. - - - OrangeRed - CSS-color 0xFF4500. - - - Tomato - CSS-color 0xFF6347. - - - - Pink-color - CSS color group. - - DeepPink - CSS-color 0xFF1493. - - - HotPink - CSS-color 0xFF69B4. - - - LightPink - CSS-color 0xFFB6C1. - - - MediumVioletRed - CSS-color 0xC71585. - - - PaleVioletRed - CSS-color 0xDB7093. - - - Pink - CSS-color 0xFFC0CB. - - - - Purple-color - CSS color group. - - BlueViolet - CSS-color 0x8A2BE2. - - - DarkMagenta - CSS-color 0x8B008B. - - - DarkOrchid - CSS-color 0x9932CC. - - - DarkSlateBlue - CSS-color 0x483D8B. - - - DarkViolet - CSS-color 0x9400D3. - - - Fuchsia - CSS-color 0xFF00FF. - - - Indigo - CSS-color 0x4B0082. - - - Lavender - CSS-color 0xE6E6FA. - - - Magenta - CSS-color 0xFF00FF. - - - MediumOrchid - CSS-color 0xBA55D3. - - - MediumPurple - CSS-color 0x9370DB. - - - MediumSlateBlue - CSS-color 0x7B68EE. - - - Orchid - CSS-color 0xDA70D6. - - - Plum - CSS-color 0xDDA0DD. - - - Purple - CSS-color 0x800080. - - - RebeccaPurple - CSS-color 0x663399. - - - SlateBlue - CSS-color 0x6A5ACD. - - - Thistle - CSS-color 0xD8BFD8. - - - Violet - CSS-color 0xEE82EE. - - - - Red-color - CSS color group. - - Crimson - CSS-color 0xDC143C. - - - DarkRed - CSS-color 0x8B0000. - - - DarkSalmon - CSS-color 0xE9967A. - - - FireBrick - CSS-color 0xB22222. - - - IndianRed - CSS-color 0xCD5C5C. - - - LightCoral - CSS-color 0xF08080. - - - LightSalmon - CSS-color 0xFFA07A. - - - Red - CSS-color 0xFF0000. - - - Salmon - CSS-color 0xFA8072. - - - - White-color - CSS color group. - - AliceBlue - CSS-color 0xF0F8FF. - - - AntiqueWhite - CSS-color 0xFAEBD7. - - - Azure - CSS-color 0xF0FFFF. - - - Beige - CSS-color 0xF5F5DC. - - - FloralWhite - CSS-color 0xFFFAF0. - - - GhostWhite - CSS-color 0xF8F8FF. - - - HoneyDew - CSS-color 0xF0FFF0. - - - Ivory - CSS-color 0xFFFFF0. - - - LavenderBlush - CSS-color 0xFFF0F5. - - - Linen - CSS-color 0xFAF0E6. - - - MintCream - CSS-color 0xF5FFFA. - - - MistyRose - CSS-color 0xFFE4E1. - - - OldLace - CSS-color 0xFDF5E6. - - - SeaShell - CSS-color 0xFFF5EE. - - - Snow - CSS-color 0xFFFAFA. - - - White - CSS-color 0xFFFFFF. - - - WhiteSmoke - CSS-color 0xF5F5F5. - - - - Yellow-color - CSS color group. - - DarkKhaki - CSS-color 0xBDB76B. - - - Gold - CSS-color 0xFFD700. - - - Khaki - CSS-color 0xF0E68C. - - - LemonChiffon - CSS-color 0xFFFACD. - - - LightGoldenRodYellow - CSS-color 0xFAFAD2. - - - LightYellow - CSS-color 0xFFFFE0. - - - Moccasin - CSS-color 0xFFE4B5. - - - PaleGoldenRod - CSS-color 0xEEE8AA. - - - PapayaWhip - CSS-color 0xFFEFD5. - - - PeachPuff - CSS-color 0xFFDAB9. - - - Yellow - CSS-color 0xFFFF00. - - - - - Color-shade - A slight degree of difference between colors, especially with regard to how light or dark it is or as distinguished from one nearly like it. - - Dark-shade - A color tone not reflecting much light. - - - Light-shade - A color tone reflecting more light. - - - - Grayscale - Using a color map composed of shades of gray, varying from black at the weakest intensity to white at the strongest. - - # - White intensity between 0 and 1. - - takesValue - - - valueClass - numericClass - - - - - HSV-color - A color representation that models how colors appear under light. - - HSV-value - An attribute of a visual sensation according to which an area appears to emit more or less light. - - # - - takesValue - - - valueClass - numericClass - - - - - Hue - Attribute of a visual sensation according to which an area appears to be similar to one of the perceived colors. - - # - Angular value between 0 and 360. - - takesValue - - - valueClass - numericClass - - - - - Saturation - Colorfulness of a stimulus relative to its own brightness. - - # - B value of RGB between 0 and 1. - - takesValue - - - valueClass - numericClass - - - - - - RGB-color - A color from the RGB schema. - - RGB-blue - The blue component. - - # - B value of RGB between 0 and 1. - - takesValue - - - valueClass - numericClass - - - - - RGB-green - The green component. - - # - G value of RGB between 0 and 1. - - takesValue - - - valueClass - numericClass - - - - - RGB-red - The red component. - - # - R value of RGB between 0 and 1. - - takesValue - - - valueClass - numericClass - - - - - - - Luminance - A quality that exists by virtue of the luminous intensity per unit area projected in a given direction. - - - Opacity - A measure of impenetrability to light. - - - - - Sensory-presentation - The entity has a sensory manifestation. - - Auditory-presentation - The sense of hearing is used in the presentation to the user. - - Loudspeaker-separation - The distance between two loudspeakers. Grouped with the Distance tag. - - suggestedTag - Distance - - - - Monophonic - Relating to sound transmission, recording, or reproduction involving a single transmission path. - - - Silent - The absence of ambient audible sound or the state of having ceased to produce sounds. - - - Stereophonic - Relating to, or constituting sound reproduction involving the use of separated microphones and two transmission channels to achieve the sound separation of a live hearing. - - - - Gustatory-presentation - The sense of taste used in the presentation to the user. - - - Olfactory-presentation - The sense of smell used in the presentation to the user. - - - Somatic-presentation - The nervous system is used in the presentation to the user. - - - Tactile-presentation - The sense of touch used in the presentation to the user. - - - Vestibular-presentation - The sense balance used in the presentation to the user. - - - Visual-presentation - The sense of sight used in the presentation to the user. - - 2D-view - A view showing only two dimensions. - - - 3D-view - A view showing three dimensions. - - - Background-view - Parts of the view that are farthest from the viewer and usually the not part of the visual focus. - - - Bistable-view - Something having two stable visual forms that have two distinguishable stable forms as in optical illusions. - - - Foreground-view - Parts of the view that are closest to the viewer and usually the most important part of the visual focus. - - - Foveal-view - Visual presentation directly on the fovea. A view projected on the small depression in the retina containing only cones and where vision is most acute. - - - Map-view - A diagrammatic representation of an area of land or sea showing physical features, cities, roads. - - Aerial-view - Elevated view of an object from above, with a perspective as though the observer were a bird. - - - Satellite-view - A representation as captured by technology such as a satellite. - - - Street-view - A 360-degrees panoramic view from a position on the ground. - - - - Peripheral-view - Indirect vision as it occurs outside the point of fixation. - - - - - - Task-property - Something that pertains to a task. - - extensionAllowed - - - Task-action-type - How an agent action should be interpreted in terms of the task specification. - - Appropriate-action - An action suitable or proper in the circumstances. - - relatedTag - Inappropriate-action - - - - Correct-action - An action that was a correct response in the context of the task. - - relatedTag - Incorrect-action - Indeterminate-action - - - - Correction - An action offering an improvement to replace a mistake or error. - - - Done-indication - An action that indicates that the participant has completed this step in the task. - - relatedTag - Ready-indication - - - - Imagined-action - Form a mental image or concept of something. This is used to identity something that only happened in the imagination of the participant as in imagined movements in motor imagery paradigms. - - - Inappropriate-action - An action not in keeping with what is correct or proper for the task. - - relatedTag - Appropriate-action - - - - Incorrect-action - An action considered wrong or incorrect in the context of the task. - - relatedTag - Correct-action - Indeterminate-action - - - - Indeterminate-action - An action that cannot be distinguished between two or more possibibities in the current context. This tag might be applied when an outside evaluator or a classification algorithm cannot determine a definitive result. - - relatedTag - Correct-action - Incorrect-action - Miss - Near-miss - - - - Miss - An action considered to be a failure in the context of the task. For example, if the agent is supposed to try to hit a target and misses. - - relatedTag - Near-miss - - - - Near-miss - An action barely satisfied the requirements of the task. In a driving experiment for example this could pertain to a narrowly avoided collision or other accident. - - relatedTag - Miss - - - - Omitted-action - An expected response was skipped. - - - Ready-indication - An action that indicates that the participant is ready to perform the next step in the task. - - relatedTag - Done-indication - - - - - Task-attentional-demand - Strategy for allocating attention toward goal-relevant information. - - Bottom-up-attention - Attentional guidance purely by externally driven factors to stimuli that are salient because of their inherent properties relative to the background. Sometimes this is referred to as stimulus driven. - - relatedTag - Top-down-attention - - - - Covert-attention - Paying attention without moving the eyes. - - relatedTag - Overt-attention - - - - Divided-attention - Integrating parallel multiple stimuli. Behavior involving responding simultaneously to multiple tasks or multiple task demands. - - relatedTag - Focused-attention - - - - Focused-attention - Responding discretely to specific visual, auditory, or tactile stimuli. - - relatedTag - Divided-attention - - - - Orienting-attention - Directing attention to a target stimulus. - - - Overt-attention - Selectively processing one location over others by moving the eyes to point at that location. - - relatedTag - Covert-attention - - - - Selective-attention - Maintaining a behavioral or cognitive set in the face of distracting or competing stimuli. Ability to pay attention to a limited array of all available sensory information. - - - Sustained-attention - Maintaining a consistent behavioral response during continuous and repetitive activity. - - - Switched-attention - Having to switch attention between two or more modalities of presentation. - - - Top-down-attention - Voluntary allocation of attention to certain features. Sometimes this is referred to goal-oriented attention. - - relatedTag - Bottom-up-attention - - - - - Task-effect-evidence - The evidence supporting the conclusion that the event had the specified effect. - - Behavioral-evidence - An indication or conclusion based on the behavior of an agent. - - - Computational-evidence - A type of evidence in which data are produced, and/or generated, and/or analyzed on a computer. - - - External-evidence - A phenomenon that follows and is caused by some previous phenomenon. - - - Intended-effect - A phenomenon that is intended to follow and be caused by some previous phenomenon. - - - - Task-event-role - The purpose of an event with respect to the task. - - Experimental-stimulus - Part of something designed to elicit a response in the experiment. - - - Incidental - A sensory or other type of event that is unrelated to the task or experiment. - - - Instructional - Usually associated with a sensory event intended to give instructions to the participant about the task or behavior. - - - Mishap - Unplanned disruption such as an equipment or experiment control abnormality or experimenter error. - - - Participant-response - Something related to a participant actions in performing the task. - - - Task-activity - Something that is part of the overall task or is necessary to the overall experiment but is not directly part of a stimulus-response cycle. Examples would be taking a survey or provided providing a silva sample. - - - Warning - Something that should warn the participant that the parameters of the task have been or are about to be exceeded such as a warning message about getting too close to the shoulder of the road in a driving task. - - - - Task-relationship - Specifying organizational importance of sub-tasks. - - Background-subtask - A part of the task which should be performed in the background as for example inhibiting blinks due to instruction while performing the primary task. - - - Primary-subtask - A part of the task which should be the primary focus of the participant. - - - - Task-stimulus-role - The role the stimulus plays in the task. - - Cue - A signal for an action, a pattern of stimuli indicating a particular response. - - - Distractor - A person or thing that distracts or a plausible but incorrect option in a multiple-choice question. In pyschological studies this is sometimes referred to as a foil. - - - Expected - Considered likely, probable or anticipated. Something of low information value as in frequent non-targets in an RSVP paradigm. - - relatedTag - Unexpected - - - suggestedTag - Target - - - - Extraneous - Irrelevant or unrelated to the subject being dealt with. - - - Feedback - An evaluative response to an inquiry, process, event, or activity. - - - Go-signal - An indicator to proceed with a planned action. - - relatedTag - Stop-signal - - - - Meaningful - Conveying significant or relevant information. - - - Newly-learned - Representing recently acquired information or understanding. - - - Non-informative - Something that is not useful in forming an opinion or judging an outcome. - - - Non-target - Something other than that done or looked for. Also tag Expected if the Non-target is frequent. - - relatedTag - Target - - - - Not-meaningful - Not having a serious, important, or useful quality or purpose. - - - Novel - Having no previous example or precedent or parallel. - - - Oddball - Something unusual, or infrequent. - - relatedTag - Unexpected - - - suggestedTag - Target - - - - Penalty - A disadvantage, loss, or hardship due to some action. - - - Planned - Something that was decided on or arranged in advance. - - relatedTag - Unplanned - - - - Priming - An implicit memory effect in which exposure to a stimulus influences response to a later stimulus. - - - Query - A sentence of inquiry that asks for a reply. - - - Reward - A positive reinforcement for a desired action, behavior or response. - - - Stop-signal - An indicator that the agent should stop the current activity. - - relatedTag - Go-signal - - - - Target - Something fixed as a goal, destination, or point of examination. - - - Threat - An indicator that signifies hostility and predicts an increased probability of attack. - - - Timed - Something planned or scheduled to be done at a particular time or lasting for a specified amount of time. - - - Unexpected - Something that is not anticipated. - - relatedTag - Expected - - - - Unplanned - Something that has not been planned as part of the task. - - relatedTag - Planned - - - - - - - Relation - Concerns the way in which two or more people or things are connected. - - extensionAllowed - - - Comparative-relation - Something considered in comparison to something else. The first entity is the focus. - - Approximately-equal-to - (A, (Approximately-equal-to, B)) indicates that A and B have almost the same value. Here A and B could refer to sizes, orders, positions or other quantities. - - - Equal-to - (A, (Equal-to, B)) indicates that the size or order of A is the same as that of B. - - - Greater-than - (A, (Greater-than, B)) indicates that the relative size or order of A is bigger than that of B. - - - Greater-than-or-equal-to - (A, (Greater-than-or-equal-to, B)) indicates that the relative size or order of A is bigger than or the same as that of B. - - - Less-than - (A, (Less-than, B)) indicates that A is smaller than B. Here A and B could refer to sizes, orders, positions or other quantities. - - - Less-than-or-equal-to - (A, (Less-than-or-equal-to, B)) indicates that the relative size or order of A is smaller than or equal to B. - - - Not-equal-to - (A, (Not-equal-to, B)) indicates that the size or order of A is not the same as that of B. - - - - Connective-relation - Indicates two entities are related in some way. The first entity is the focus. - - Belongs-to - (A, (Belongs-to, B)) indicates that A is a member of B. - - - Connected-to - (A, (Connected-to, B)) indicates that A is related to B in some respect, usually through a direct link. - - - Contained-in - (A, (Contained-in, B)) indicates that A is completely inside of B. - - - Described-by - (A, (Described-by, B)) indicates that B provides information about A. - - - From-to - (A, (From-to, B)) indicates a directional relation from A to B. A is considered the source. - - - Group-of - (A, (Group-of, B)) indicates A is a group of items of type B. - - - Implied-by - (A, (Implied-by, B)) indicates B is suggested by A. - - - Includes - (A, (Includes, B)) indicates that A has B as a member or part. - - - Interacts-with - (A, (Interacts-with, B)) indicates A and B interact, possibly reciprocally. - - - Member-of - (A, (Member-of, B)) indicates A is a member of group B. - - - Part-of - (A, (Part-of, B)) indicates A is a part of the whole B. - - - Performed-by - (A, (Performed-by, B)) indicates that the action or procedure A was carried out by agent B. - - - Performed-using - (A, (Performed-using, B)) indicates that the action or procedure A was accomplished using B. - - - Related-to - (A, (Related-to, B)) indicates A has some relationship to B. - - - Unrelated-to - (A, (Unrelated-to, B)) indicates that A is not related to B. For example, A is not related to Task. - - - - Directional-relation - A relationship indicating direction of change of one entity relative to another. The first entity is the focus. - - Away-from - (A, (Away-from, B)) indicates that A is going or has moved away from B. The meaning depends on A and B. - - - Towards - (A, (Towards, B)) indicates that A is going to or has moved to B. The meaning depends on A and B. - - - - Logical-relation - Indicating a logical relationship between entities. The first entity is usually the focus. - - And - (A, (And, B)) means A and B are both in effect. - - - Or - (A, (Or, B)) means at least one of A and B are in effect. - - - - Spatial-relation - Indicating a relationship about position between entities. - - Above - (A, (Above, B)) means A is in a place or position that is higher than B. - - - Across-from - (A, (Across-from, B)) means A is on the opposite side of something from B. - - - Adjacent-to - (A, (Adjacent-to, B)) indicates that A is next to B in time or space. - - - Ahead-of - (A, (Ahead-of, B)) indicates that A is further forward in time or space in B. - - - Around - (A, (Around, B)) means A is in or near the present place or situation of B. - - - Behind - (A, (Behind, B)) means A is at or to the far side of B, typically so as to be hidden by it. - - - Below - (A, (Below, B)) means A is in a place or position that is lower than the position of B. - - - Between - (A, (Between, (B, C))) means A is in the space or interval separating B and C. - - - Bilateral-to - (A, (Bilateral, B)) means A is on both sides of B or affects both sides of B. - - - Bottom-edge-of - (A, (Bottom-edge-of, B)) means A is on the bottom most part or or near the boundary of B. - - relatedTag - Left-edge-of - Right-edge-of - Top-edge-of - - - - Boundary-of - (A, (Boundary-of, B)) means A is on or part of the edge or boundary of B. - - - Center-of - (A, (Center-of, B)) means A is at a point or or in an area that is approximately central within B. - - - Close-to - (A, (Close-to, B)) means A is at a small distance from or is located near in space to B. - - - Far-from - (A, (Far-from, B)) means A is at a large distance from or is not located near in space to B. - - - In-front-of - (A, (In-front-of, B)) means A is in a position just ahead or at the front part of B, potentially partially blocking B from view. - - - Left-edge-of - (A, (Left-edge-of, B)) means A is located on the left side of B on or near the boundary of B. - - relatedTag - Bottom-edge-of - Right-edge-of - Top-edge-of - - - - Left-side-of - (A, (Left-side-of, B)) means A is located on the left side of B usually as part of B. - - relatedTag - Right-side-of - - - - Lower-center-of - (A, (Lower-center-of, B)) means A is situated on the lower center part of B (due south). This relation is often used to specify qualitative information about screen position. - - relatedTag - Center-of - Lower-left-of - Lower-right-of - Upper-center-of - Upper-right-of - - - - Lower-left-of - (A, (Lower-left-of, B)) means A is situated on the lower left part of B. This relation is often used to specify qualitative information about screen position. - - relatedTag - Center-of - Lower-center-of - Lower-right-of - Upper-center-of - Upper-left-of - Upper-right-of - - - - Lower-right-of - (A, (Lower-right-of, B)) means A is situated on the lower right part of B. This relation is often used to specify qualitative information about screen position. - - relatedTag - Center-of - Lower-center-of - Lower-left-of - Upper-left-of - Upper-center-of - Upper-left-of - Lower-right-of - - - - Outside-of - (A, (Outside-of, B)) means A is located in the space around but not including B. - - - Over - (A, (Over, B)) means A above is above B so as to cover or protect or A extends over the a general area as from a from a vantage point. - - - Right-edge-of - (A, (Right-edge-of, B)) means A is located on the right side of B on or near the boundary of B. - - relatedTag - Bottom-edge-of - Left-edge-of - Top-edge-of - - - - Right-side-of - (A, (Right-side-of, B)) means A is located on the right side of B usually as part of B. - - relatedTag - Left-side-of - - - - To-left-of - (A, (To-left-of, B)) means A is located on or directed toward the side to the west of B when B is facing north. This term is used when A is not part of B. - - - To-right-of - (A, (To-right-of, B)) means A is located on or directed toward the side to the east of B when B is facing north. This term is used when A is not part of B. - - - Top-edge-of - (A, (Top-edge-of, B)) means A is on the uppermost part or or near the boundary of B. - - relatedTag - Left-edge-of - Right-edge-of - Bottom-edge-of - - - - Top-of - (A, (Top-of, B)) means A is on the uppermost part, side, or surface of B. - - - Underneath - (A, (Underneath, B)) means A is situated directly below and may be concealed by B. - - - Upper-center-of - (A, (Upper-center-of, B)) means A is situated on the upper center part of B (due north). This relation is often used to specify qualitative information about screen position. - - relatedTag - Center-of - Lower-center-of - Lower-left-of - Lower-right-of - Upper-center-of - Upper-right-of - - - - Upper-left-of - (A, (Upper-left-of, B)) means A is situated on the upper left part of B. This relation is often used to specify qualitative information about screen position. - - relatedTag - Center-of - Lower-center-of - Lower-left-of - Lower-right-of - Upper-center-of - Upper-right-of - - - - Upper-right-of - (A, (Upper-right-of, B)) means A is situated on the upper right part of B. This relation is often used to specify qualitative information about screen position. - - relatedTag - Center-of - Lower-center-of - Lower-left-of - Upper-left-of - Upper-center-of - Lower-right-of - - - - Within - (A, (Within, B)) means A is on the inside of or contained in B. - - - - Temporal-relation - A relationship that includes a temporal or time-based component. - - After - (A, (After B)) means A happens at a time subsequent to a reference time related to B. - - - Asynchronous-with - (A, (Asynchronous-with, B)) means A happens at times not occurring at the same time or having the same period or phase as B. - - - Before - (A, (Before B)) means A happens at a time earlier in time or order than B. - - - During - (A, (During, B)) means A happens at some point in a given period of time in which B is ongoing. - - - Synchronous-with - (A, (Synchronous-with, B)) means A happens at occurs at the same time or rate as B. - - - Waiting-for - (A, (Waiting-for, B)) means A pauses for something to happen in B. - - - - - - - accelerationUnits - - defaultUnits - m-per-s^2 - - - m-per-s^2 - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - - angleUnits - - defaultUnits - radian - - - radian - - SIUnit - - - conversionFactor - 1.0 - - - - rad - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - degree - - conversionFactor - 0.0174533 - - - - - areaUnits - - defaultUnits - m^2 - - - m^2 - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - - currencyUnits - Units indicating the worth of something. - - defaultUnits - $ - - - dollar - - conversionFactor - 1.0 - - - - $ - - unitPrefix - - - unitSymbol - - - conversionFactor - 1.0 - - - - euro - - - point - - - - electricPotentialUnits - - defaultUnits - uv - - - v - - SIUnit - - - unitSymbol - - - conversionFactor - 0.000001 - - - - Volt - - SIUnit - - - conversionFactor - 0.000001 - - - - - frequencyUnits - - defaultUnits - Hz - - - hertz - - SIUnit - - - conversionFactor - 1.0 - - - - Hz - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - - intensityUnits - - defaultUnits - dB - - - dB - Intensity expressed as ratio to a threshold. May be used for sound intensity. - - unitSymbol - - - conversionFactor - 1.0 - - - - candela - Units used to express light intensity. - - SIUnit - - - - cd - Units used to express light intensity. - - SIUnit - - - unitSymbol - - - - - jerkUnits - - defaultUnits - m-per-s^3 - - - m-per-s^3 - - unitSymbol - - - conversionFactor - 1.0 - - - - - magneticFieldUnits - Units used to magnetic field intensity. - - defaultUnits - fT - - - tesla - - SIUnit - - - conversionFactor - 10^-15 - - - - T - - SIUnit - - - unitSymbol - - - conversionFactor - 10^-15 - - - - - memorySizeUnits - - defaultUnits - B - - - byte - - SIUnit - - - conversionFactor - 1.0 - - - - B - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - - physicalLengthUnits - - defaultUnits - m - - - foot - - conversionFactor - 0.3048 - - - - inch - - conversionFactor - 0.0254 - - - - meter - - SIUnit - - - conversionFactor - 1.0 - - - - metre - - SIUnit - - - conversionFactor - 1.0 - - - - m - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - mile - - conversionFactor - 1609.34 - - - - - speedUnits - - defaultUnits - m-per-s - - - m-per-s - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - mph - - unitSymbol - - - conversionFactor - 0.44704 - - - - kph - - unitSymbol - - - conversionFactor - 0.277778 - - - - - temperatureUnits - - degree Celsius - - SIUnit - - - conversionFactor - 1.0 - - - - oC - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - - timeUnits - - defaultUnits - s - - - second - - SIUnit - - - conversionFactor - 1.0 - - - - s - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - day - - conversionFactor - 86400 - - - - minute - - conversionFactor - 60 - - - - hour - Should be in 24-hour format. - - conversionFactor - 3600 - - - - - volumeUnits - - defaultUnits - m^3 - - - m^3 - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - - weightUnits - - defaultUnits - g - - - g - - SIUnit - - - unitSymbol - - - conversionFactor - 1.0 - - - - gram - - SIUnit - - - conversionFactor - 1.0 - - - - pound - - conversionFactor - 453.592 - - - - lb - - conversionFactor - 453.592 - - - - - - - deca - SI unit multiple representing 10^1. - - SIUnitModifier - - - conversionFactor - 10.0 - - - - da - SI unit multiple representing 10^1. - - SIUnitSymbolModifier - - - conversionFactor - 10.0 - - - - hecto - SI unit multiple representing 10^2. - - SIUnitModifier - - - conversionFactor - 100.0 - - - - h - SI unit multiple representing 10^2. - - SIUnitSymbolModifier - - - conversionFactor - 100.0 - - - - kilo - SI unit multiple representing 10^3. - - SIUnitModifier - - - conversionFactor - 1000.0 - - - - k - SI unit multiple representing 10^3. - - SIUnitSymbolModifier - - - conversionFactor - 1000.0 - - - - mega - SI unit multiple representing 10^6. - - SIUnitModifier - - - conversionFactor - 10^6 - - - - M - SI unit multiple representing 10^6. - - SIUnitSymbolModifier - - - conversionFactor - 10^6 - - - - giga - SI unit multiple representing 10^9. - - SIUnitModifier - - - conversionFactor - 10^9 - - - - G - SI unit multiple representing 10^9. - - SIUnitSymbolModifier - - - conversionFactor - 10^9 - - - - tera - SI unit multiple representing 10^12. - - SIUnitModifier - - - conversionFactor - 10^12 - - - - T - SI unit multiple representing 10^12. - - SIUnitSymbolModifier - - - conversionFactor - 10^12 - - - - peta - SI unit multiple representing 10^15. - - SIUnitModifier - - - conversionFactor - 10^15 - - - - P - SI unit multiple representing 10^15. - - SIUnitSymbolModifier - - - conversionFactor - 10^15 - - - - exa - SI unit multiple representing 10^18. - - SIUnitModifier - - - conversionFactor - 10^18 - - - - E - SI unit multiple representing 10^18. - - SIUnitSymbolModifier - - - conversionFactor - 10^18 - - - - zetta - SI unit multiple representing 10^21. - - SIUnitModifier - - - conversionFactor - 10^21 - - - - Z - SI unit multiple representing 10^21. - - SIUnitSymbolModifier - - - conversionFactor - 10^21 - - - - yotta - SI unit multiple representing 10^24. - - SIUnitModifier - - - conversionFactor - 10^24 - - - - Y - SI unit multiple representing 10^24. - - SIUnitSymbolModifier - - - conversionFactor - 10^24 - - - - deci - SI unit submultiple representing 10^-1. - - SIUnitModifier - - - conversionFactor - 0.1 - - - - d - SI unit submultiple representing 10^-1. - - SIUnitSymbolModifier - - - conversionFactor - 0.1 - - - - centi - SI unit submultiple representing 10^-2. - - SIUnitModifier - - - conversionFactor - 0.01 - - - - c - SI unit submultiple representing 10^-2. - - SIUnitSymbolModifier - - - conversionFactor - 0.01 - - - - milli - SI unit submultiple representing 10^-3. - - SIUnitModifier - - - conversionFactor - 0.001 - - - - m - SI unit submultiple representing 10^-3. - - SIUnitSymbolModifier - - - conversionFactor - 0.001 - - - - micro - SI unit submultiple representing 10^-6. - - SIUnitModifier - - - conversionFactor - 10^-6 - - - - u - SI unit submultiple representing 10^-6. - - SIUnitSymbolModifier - - - conversionFactor - 10^-6 - - - - nano - SI unit submultiple representing 10^-9. - - SIUnitModifier - - - conversionFactor - 10^-9 - - - - n - SI unit submultiple representing 10^-9. - - SIUnitSymbolModifier - - - conversionFactor - 10^-9 - - - - pico - SI unit submultiple representing 10^-12. - - SIUnitModifier - - - conversionFactor - 10^-12 - - - - p - SI unit submultiple representing 10^-12. - - SIUnitSymbolModifier - - - conversionFactor - 10^-12 - - - - femto - SI unit submultiple representing 10^-15. - - SIUnitModifier - - - conversionFactor - 10^-15 - - - - f - SI unit submultiple representing 10^-15. - - SIUnitSymbolModifier - - - conversionFactor - 10^-15 - - - - atto - SI unit submultiple representing 10^-18. - - SIUnitModifier - - - conversionFactor - 10^-18 - - - - a - SI unit submultiple representing 10^-18. - - SIUnitSymbolModifier - - - conversionFactor - 10^-18 - - - - zepto - SI unit submultiple representing 10^-21. - - SIUnitModifier - - - conversionFactor - 10^-21 - - - - z - SI unit submultiple representing 10^-21. - - SIUnitSymbolModifier - - - conversionFactor - 10^-21 - - - - yocto - SI unit submultiple representing 10^-24. - - SIUnitModifier - - - conversionFactor - 10^-24 - - - - y - SI unit submultiple representing 10^-24. - - SIUnitSymbolModifier - - - conversionFactor - 10^-24 - - - - - - dateTimeClass - Date-times should conform to ISO8601 date-time format YYYY-MM-DDThh:mm:ss. Any variation on the full form is allowed. - - allowedCharacter - digits - T - - - : - - - - nameClass - Value class designating values that have the characteristics of node names. The allowed characters are alphanumeric, hyphen, and underbar. - - allowedCharacter - letters - digits - _ - - - - - - numericClass - Value must be a valid numerical value. - - allowedCharacter - digits - E - e - + - - - . - - - - posixPath - Posix path specification. - - allowedCharacter - digits - letters - / - : - - - - textClass - Value class designating values that have the characteristics of text such as in descriptions. - - allowedCharacter - letters - digits - blank - + - - - : - ; - . - / - ( - ) - ? - * - % - $ - @ - - - - - - allowedCharacter - A schema attribute of value classes specifying a special character that is allowed in expressing the value of a placeholder. Normally the allowed characters are listed individually. However, the word letters designates the upper and lower case alphabetic characters and the word digits designates the digits 0-9. The word blank designates the blank character. - - valueClassProperty - - - - conversionFactor - The multiplicative factor to multiply these units to convert to default units. - - unitProperty - - - unitModifierProperty - - - - deprecatedFrom - Indicates that this element is deprecated. The value of the attribute is the latest schema version in which the element appeared in undeprecated form. - - elementProperty - - - - defaultUnits - A schema attribute of unit classes specifying the default units to use if the placeholder has a unit class but the substituted value has no units. - - unitClassProperty - - - - extensionAllowed - A schema attribute indicating that users can add unlimited levels of child nodes under this tag. This tag is propagated to child nodes with the exception of the hashtag placeholders. - - boolProperty - - - nodeProperty - - - isInheritedProperty - - - - inLibrary - Indicates this schema element came from the named library schema, not the standard schema. This attribute is added by tools when a library schema is merged into its partnered standard schema. - - elementProperty - - - - recommended - A schema attribute indicating that the event-level HED string should include this tag. - - boolProperty - - - nodeProperty - - - - relatedTag - A schema attribute suggesting HED tags that are closely related to this tag. This attribute is used by tagging tools. - - nodeProperty - - - isInheritedProperty - - - - requireChild - A schema attribute indicating that one of the node elements descendants must be included when using this tag. - - boolProperty - - - nodeProperty - - - - required - A schema attribute indicating that every event-level HED string should include this tag. - - boolProperty - - - nodeProperty - - - - reserved - A schema attribute indicating that this tag has special meaning and requires special handling by tools. - - boolProperty - - - nodeProperty - - - - rooted - Indicates a top-level library schema node is identical to a node of the same name in the partnered standard schema. This attribute can only appear in nodes that have the inLibrary schema attribute. - - nodeProperty - - - - SIUnit - A schema attribute indicating that this unit element is an SI unit and can be modified by multiple and submultiple names. Note that some units such as byte are designated as SI units although they are not part of the standard. - - boolProperty - - - unitProperty - - - - SIUnitModifier - A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a base unit rather than a unit symbol. - - boolProperty - - - unitModifierProperty - - - - SIUnitSymbolModifier - A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a unit symbol rather than a base symbol. - - boolProperty - - - unitModifierProperty - - - - suggestedTag - A schema attribute that indicates another tag that is often associated with this tag. This attribute is used by tagging tools to provide tagging suggestions. - - nodeProperty - - - isInheritedProperty - - - - tagGroup - A schema attribute indicating the tag can only appear inside a tag group. - - boolProperty - - - nodeProperty - - - - takesValue - A schema attribute indicating the tag is a hashtag placeholder that is expected to be replaced with a user-defined value. - - boolProperty - - - nodeProperty - - - - topLevelTagGroup - A schema attribute indicating that this tag (or its descendants) can only appear in a top-level tag group. A tag group can have at most one tag with this attribute. - - boolProperty - - - nodeProperty - - - - unique - A schema attribute indicating that only one of this tag or its descendants can be used in the event-level HED string. - - boolProperty - - - nodeProperty - - - - unitClass - A schema attribute specifying which unit class this value tag belongs to. - - nodeProperty - - - - unitPrefix - A schema attribute applied specifically to unit elements to designate that the unit indicator is a prefix (e.g., dollar sign in the currency units). - - boolProperty - - - unitProperty - - - - unitSymbol - A schema attribute indicating this tag is an abbreviation or symbol representing a type of unit. Unit symbols represent both the singular and the plural and thus cannot be pluralized. - - boolProperty - - - unitProperty - - - - valueClass - A schema attribute specifying which value class this value tag belongs to. - - nodeProperty - - - - - - boolProperty - Indicates that the schema attribute represents something that is either true or false and does not have a value. Attributes without this value are assumed to have string values. - - - elementProperty - Indicates this schema attribute can apply to any type of element(tag term, unit class, etc). - - - isInheritedProperty - Indicates that this attribute is inherited by child nodes. This property only applies to schema attributes for nodes. - - - nodeProperty - Indicates this schema attribute applies to node (tag-term) elements. This was added to allow for an attribute to apply to multiple elements. - - - unitClassProperty - Indicates that the schema attribute is meant to be applied to unit classes. - - - unitModifierProperty - Indicates that the schema attribute is meant to be applied to unit modifier classes. - - - unitProperty - Indicates that the schema attribute is meant to be applied to units within a unit class. - - - valueClassProperty - Indicates that the schema attribute is meant to be applied to value classes. - - - + + + This schema is the first official release that includes an xsd and requires unit class, unit modifier, value class, schema attribute and property sections. + + + B-nonextension + These should not be sorted. B should be first + + inLibrary + testlib + + + SubnodeB1 + + inLibrary + testlib + + + + SubnodeB2 + + inLibrary + testlib + + + + + A-nonextension + These should not be sorted. A should be second + + inLibrary + testlib + + + SubnodeA3 + + inLibrary + testlib + + + + SubnodeA1 + + inLibrary + testlib + + + + SubnodeA2 + + inLibrary + testlib + + + + + C-nonextension + These should not be sorted. C should be last + + inLibrary + testlib + + + SubnodeC3 + + inLibrary + testlib + + + + SubnodeC1 + + inLibrary + testlib + + + + SubnodeC2 + + inLibrary + testlib + + + + + B-extensionallowed + These should be sorted. This section should be second. + + extensionAllowed + + + inLibrary + testlib + + + SubnodeE1 + + inLibrary + testlib + + + + SubnodeE2 + + inLibrary + testlib + + + + SubnodeE3 + + inLibrary + testlib + + + + + A-extensionallowed + These should be sorted. This section should be first. + + extensionAllowed + + + inLibrary + testlib + + + SubnodeD1 + + inLibrary + testlib + + + + SubnodeD2 + + inLibrary + testlib + + + + SubnodeD3 + + inLibrary + testlib + + + + + Event + Something that happens at a given time and (typically) place. Elements of this tag subtree designate the general category in which an event falls. + + suggestedTag + Task-property + + + Sensory-event + Something perceivable by the participant. An event meant to be an experimental stimulus should include the tag Task-property/Task-event-role/Experimental-stimulus. + + suggestedTag + Task-event-role + Sensory-presentation + + + + Agent-action + Any action engaged in by an agent (see the Agent subtree for agent categories). A participant response to an experiment stimulus should include the tag Agent-property/Agent-task-role/Experiment-participant. + + suggestedTag + Task-event-role + Agent + + + + Data-feature + An event marking the occurrence of a data feature such as an interictal spike or alpha burst that is often added post hoc to the data record. + + suggestedTag + Data-property + + + + Experiment-control + An event pertaining to the physical control of the experiment during its operation. + + + Experiment-procedure + An event indicating an experimental procedure, as in performing a saliva swab during the experiment or administering a survey. + + + Experiment-structure + An event specifying a change-point of the structure of experiment. This event is typically used to indicate a change in experimental conditions or tasks. + + + Measurement-event + A discrete measure returned by an instrument. + + suggestedTag + Data-property + + + + + Agent + Someone or something that takes an active role or produces a specified effect.The role or effect may be implicit. Being alive or performing an activity such as a computation may qualify something to be an agent. An agent may also be something that simulates something else. + + suggestedTag + Agent-property + + + Animal-agent + An agent that is an animal. + + + Avatar-agent + An agent associated with an icon or avatar representing another agent. + + + Controller-agent + An agent experiment control software or hardware. + + + Human-agent + A person who takes an active role or produces a specified effect. + + + Robotic-agent + An agent mechanical device capable of performing a variety of often complex tasks on command or by being programmed in advance. + + + Software-agent + An agent computer program. + + + + Action + Do something. + + extensionAllowed + + + Communicate + Convey knowledge of or information about something. + + Communicate-gesturally + Communicate nonverbally using visible bodily actions, either in place of speech or together and in parallel with spoken words. Gestures include movement of the hands, face, or other parts of the body. + + relatedTag + Move-face + Move-upper-extremity + + + Clap-hands + Strike the palms of against one another resoundingly, and usually repeatedly, especially to express approval. + + + Clear-throat + Cough slightly so as to speak more clearly, attract attention, or to express hesitancy before saying something awkward. + + relatedTag + Move-face + Move-head + + + + Frown + Express disapproval, displeasure, or concentration, typically by turning down the corners of the mouth. + + relatedTag + Move-face + + + + Grimace + Make a twisted expression, typically expressing disgust, pain, or wry amusement. + + relatedTag + Move-face + + + + Nod-head + Tilt head in alternating up and down arcs along the sagittal plane. It is most commonly, but not universally, used to indicate agreement, acceptance, or acknowledgement. + + relatedTag + Move-head + + + + Pump-fist + Raise with fist clenched in triumph or affirmation. + + relatedTag + Move-upper-extremity + + + + Raise-eyebrows + Move eyebrows upward. + + relatedTag + Move-face + Move-eyes + + + + Shake-fist + Clench hand into a fist and shake to demonstrate anger. + + relatedTag + Move-upper-extremity + + + + Shake-head + Turn head from side to side as a way of showing disagreement or refusal. + + relatedTag + Move-head + + + + Shhh + Place finger over lips and possibly uttering the syllable shhh to indicate the need to be quiet. + + relatedTag + Move-upper-extremity + + + + Shrug + Lift shoulders up towards head to indicate a lack of knowledge about a particular topic. + + relatedTag + Move-upper-extremity + Move-torso + + + + Smile + Form facial features into a pleased, kind, or amused expression, typically with the corners of the mouth turned up and the front teeth exposed. + + relatedTag + Move-face + + + + Spread-hands + Spread hands apart to indicate ignorance. + + relatedTag + Move-upper-extremity + + + + Thumb-up + Extend the thumb upward to indicate approval. + + relatedTag + Move-upper-extremity + + + + Thumbs-down + Extend the thumb downward to indicate disapproval. + + relatedTag + Move-upper-extremity + + + + Wave + Raise hand and move left and right, as a greeting or sign of departure. + + relatedTag + Move-upper-extremity + + + + Widen-eyes + Open eyes and possibly with eyebrows lifted especially to express surprise or fear. + + relatedTag + Move-face + Move-eyes + + + + Wink + Close and open one eye quickly, typically to indicate that something is a joke or a secret or as a signal of affection or greeting. + + relatedTag + Move-face + Move-eyes + + + + + Communicate-musically + Communicate using music. + + Hum + Make a low, steady continuous sound like that of a bee. Sing with the lips closed and without uttering speech. + + + Play-instrument + Make musical sounds using an instrument. + + + Sing + Produce musical tones by means of the voice. + + + Vocalize + Utter vocal sounds. + + + Whistle + Produce a shrill clear sound by forcing breath out or air in through the puckered lips. + + + + Communicate-vocally + Communicate using mouth or vocal cords. + + Cry + Shed tears associated with emotions, usually sadness but also joy or frustration. + + + Groan + Make a deep inarticulate sound in response to pain or despair. + + + Laugh + Make the spontaneous sounds and movements of the face and body that are the instinctive expressions of lively amusement and sometimes also of contempt or derision. + + + Scream + Make loud, vociferous cries or yells to express pain, excitement, or fear. + + + Shout + Say something very loudly. + + + Sigh + Emit a long, deep, audible breath expressing sadness, relief, tiredness, or a similar feeling. + + + Speak + Communicate using spoken language. + + + Whisper + Speak very softly using breath without vocal cords. + + + + + Move + Move in a specified direction or manner. Change position or posture. + + Breathe + Inhale or exhale during respiration. + + Blow + Expel air through pursed lips. + + + Cough + Suddenly and audibly expel air from the lungs through a partially closed glottis, preceded by inhalation. + + + Exhale + Blow out or expel breath. + + + Hiccup + Involuntarily spasm the diaphragm and respiratory organs, with a sudden closure of the glottis and a characteristic sound like that of a cough. + + + Hold-breath + Interrupt normal breathing by ceasing to inhale or exhale. + + + Inhale + Draw in with the breath through the nose or mouth. + + + Sneeze + Suddenly and violently expel breath through the nose and mouth. + + + Sniff + Draw in air audibly through the nose to detect a smell, to stop it from running, or to express contempt. + + + + Move-body + Move entire body. + + Bend + Move body in a bowed or curved manner. + + + Dance + Perform a purposefully selected sequences of human movement often with aesthetic or symbolic value. Move rhythmically to music, typically following a set sequence of steps. + + + Fall-down + Lose balance and collapse. + + + Flex + Cause a muscle to stand out by contracting or tensing it. Bend a limb or joint. + + + Jerk + Make a quick, sharp, sudden movement. + + + Lie-down + Move to a horizontal or resting position. + + + Recover-balance + Return to a stable, upright body position. + + + Shudder + Tremble convulsively, sometimes as a result of fear or revulsion. + + + Sit-down + Move from a standing to a sitting position. + + + Sit-up + Move from lying down to a sitting position. + + + Stand-up + Move from a sitting to a standing position. + + + Stretch + Straighten or extend body or a part of body to its full length, typically so as to tighten muscles or in order to reach something. + + + Stumble + Trip or momentarily lose balance and almost fall. + + + Turn + Change or cause to change direction. + + + + Move-body-part + Move one part of a body. + + Move-eyes + Move eyes. + + Blink + Shut and open the eyes quickly. + + + Close-eyes + Lower and keep eyelids in a closed position. + + + Fixate + Direct eyes to a specific point or target. + + + Inhibit-blinks + Purposely prevent blinking. + + + Open-eyes + Raise eyelids to expose pupil. + + + Saccade + Move eyes rapidly between fixation points. + + + Squint + Squeeze one or both eyes partly closed in an attempt to see more clearly or as a reaction to strong light. + + + Stare + Look fixedly or vacantly at someone or something with eyes wide open. + + + + Move-face + Move the face or jaw. + + Bite + Seize with teeth or jaws an object or organism so as to grip or break the surface covering. + + + Burp + Noisily release air from the stomach through the mouth. Belch. + + + Chew + Repeatedly grinding, tearing, and or crushing with teeth or jaws. + + + Gurgle + Make a hollow bubbling sound like that made by water running out of a bottle. + + + Swallow + Cause or allow something, especially food or drink to pass down the throat. + + Gulp + Swallow quickly or in large mouthfuls, often audibly, sometimes to indicate apprehension. + + + + Yawn + Take a deep involuntary inhalation with the mouth open often as a sign of drowsiness or boredom. + + + + Move-head + Move head. + + Lift-head + Tilt head back lifting chin. + + + Lower-head + Move head downward so that eyes are in a lower position. + + + Turn-head + Rotate head horizontally to look in a different direction. + + + + Move-lower-extremity + Move leg and/or foot. + + Curl-toes + Bend toes sometimes to grip. + + + Hop + Jump on one foot. + + + Jog + Run at a trot to exercise. + + + Jump + Move off the ground or other surface through sudden muscular effort in the legs. + + + Kick + Strike out or flail with the foot or feet. Strike using the leg, in unison usually with an area of the knee or lower using the foot. + + + Pedal + Move by working the pedals of a bicycle or other machine. + + + Press-foot + Move by pressing foot. + + + Run + Travel on foot at a fast pace. + + + Step + Put one leg in front of the other and shift weight onto it. + + Heel-strike + Strike the ground with the heel during a step. + + + Toe-off + Push with toe as part of a stride. + + + + Trot + Run at a moderate pace, typically with short steps. + + + Walk + Move at a regular pace by lifting and setting down each foot in turn never having both feet off the ground at once. + + + + Move-torso + Move body trunk. + + + Move-upper-extremity + Move arm, shoulder, and/or hand. + + Drop + Let or cause to fall vertically. + + + Grab + Seize suddenly or quickly. Snatch or clutch. + + + Grasp + Seize and hold firmly. + + + Hold-down + Prevent someone or something from moving by holding them firmly. + + + Lift + Raising something to higher position. + + + Make-fist + Close hand tightly with the fingers bent against the palm. + + + Point + Draw attention to something by extending a finger or arm. + + + Press + Apply pressure to something to flatten, shape, smooth or depress it. This action tag should be used to indicate key presses and mouse clicks. + + relatedTag + Push + + + + Push + Apply force in order to move something away. Use Press to indicate a key press or mouse click. + + relatedTag + Press + + + + Reach + Stretch out your arm in order to get or touch something. + + + Release + Make available or set free. + + + Retract + Draw or pull back. + + + Scratch + Drag claws or nails over a surface or on skin. + + + Snap-fingers + Make a noise by pushing second finger hard against thumb and then releasing it suddenly so that it hits the base of the thumb. + + + Touch + Come into or be in contact with. + + + + + + Perceive + Produce an internal, conscious image through stimulating a sensory system. + + Hear + Give attention to a sound. + + + See + Direct gaze toward someone or something or in a specified direction. + + + Sense-by-touch + Sense something through receptors in the skin. + + + Smell + Inhale in order to ascertain an odor or scent. + + + Taste + Sense a flavor in the mouth and throat on contact with a substance. + + + + Perform + Carry out or accomplish an action, task, or function. + + Close + Act as to blocked against entry or passage. + + + Collide-with + Hit with force when moving. + + + Halt + Bring or come to an abrupt stop. + + + Modify + Change something. + + + Open + Widen an aperture, door, or gap, especially one allowing access to something. + + + Operate + Control the functioning of a machine, process, or system. + + + Play + Engage in activity for enjoyment and recreation rather than a serious or practical purpose. + + + Read + Interpret something that is written or printed. + + + Repeat + Make do or perform again. + + + Rest + Be inactive in order to regain strength, health, or energy. + + + Write + Communicate or express by means of letters or symbols written or imprinted on a surface. + + + + Think + Direct the mind toward someone or something or use the mind actively to form connected ideas. + + Allow + Allow access to something such as allowing a car to pass. + + + Attend-to + Focus mental experience on specific targets. + + + Count + Tally items either silently or aloud. + + + Deny + Refuse to give or grant something requested or desired by someone. + + + Detect + Discover or identify the presence or existence of something. + + + Discriminate + Recognize a distinction. + + + Encode + Convert information or an instruction into a particular form. + + + Evade + Escape or avoid, especially by cleverness or trickery. + + + Generate + Cause something, especially an emotion or situation to arise or come about. + + + Identify + Establish or indicate who or what someone or something is. + + + Imagine + Form a mental image or concept of something. + + + Judge + Evaluate evidence to make a decision or form a belief. + + + Learn + Adaptively change behavior as the result of experience. + + + Memorize + Adaptively change behavior as the result of experience. + + + Plan + Think about the activities required to achieve a desired goal. + + + Predict + Say or estimate that something will happen or will be a consequence of something without having exact informaton. + + + Recall + Remember information by mental effort. + + + Recognize + Identify someone or something from having encountered them before. + + + Respond + React to something such as a treatment or a stimulus. + + + Switch-attention + Transfer attention from one focus to another. + + + Track + Follow a person, animal, or object through space or time. + + + + + Item + An independently existing thing (living or nonliving). + + extensionAllowed + + + Biological-item + An entity that is biological, that is related to living organisms. + + Anatomical-item + A biological structure, system, fluid or other substance excluding single molecular entities. + + Body + The biological structure representing an organism. + + + Body-part + Any part of an organism. + + Head + The upper part of the human body, or the front or upper part of the body of an animal, typically separated from the rest of the body by a neck, and containing the brain, mouth, and sense organs. + + Ear + A sense organ needed for the detection of sound and for establishing balance. + + + Face + The anterior portion of the head extending from the forehead to the chin and ear to ear. The facial structures contain the eyes, nose and mouth, cheeks and jaws. + + Cheek + The fleshy part of the face bounded by the eyes, nose, ear, and jaw line. + + + Chin + The part of the face below the lower lip and including the protruding part of the lower jaw. + + + Eye + The organ of sight or vision. + + + Eyebrow + The arched strip of hair on the bony ridge above each eye socket. + + + Forehead + The part of the face between the eyebrows and the normal hairline. + + + Lip + Fleshy fold which surrounds the opening of the mouth. + + + Mouth + The proximal portion of the digestive tract, containing the oral cavity and bounded by the oral opening. + + + Nose + A structure of special sense serving as an organ of the sense of smell and as an entrance to the respiratory tract. + + + Teeth + The hard bonelike structures in the jaws. A collection of teeth arranged in some pattern in the mouth or other part of the body. + + + + Hair + The filamentous outgrowth of the epidermis. + + + + Lower-extremity + Refers to the whole inferior limb (leg and/or foot). + + Ankle + A gliding joint between the distal ends of the tibia and fibula and the proximal end of the talus. + + + Calf + The fleshy part at the back of the leg below the knee. + + + Foot + The structure found below the ankle joint required for locomotion. + + Big-toe + The largest toe on the inner side of the foot. + + + Heel + The back of the foot below the ankle. + + + Instep + The part of the foot between the ball and the heel on the inner side. + + + Little-toe + The smallest toe located on the outer side of the foot. + + + Toes + The terminal digits of the foot. + + + + Knee + A joint connecting the lower part of the femur with the upper part of the tibia. + + + Shin + Front part of the leg below the knee. + + + Thigh + Upper part of the leg between hip and knee. + + + + Torso + The body excluding the head and neck and limbs. + + Buttocks + The round fleshy parts that form the lower rear area of a human trunk. + + + Gentalia + The external organs of reproduction. + + deprecatedFrom + 8.1.0 + + + + Hip + The lateral prominence of the pelvis from the waist to the thigh. + + + Torso-back + The rear surface of the human body from the shoulders to the hips. + + + Torso-chest + The anterior side of the thorax from the neck to the abdomen. + + + Waist + The abdominal circumference at the navel. + + + + Upper-extremity + Refers to the whole superior limb (shoulder, arm, elbow, wrist, hand). + + Elbow + A type of hinge joint located between the forearm and upper arm. + + + Forearm + Lower part of the arm between the elbow and wrist. + + + Hand + The distal portion of the upper extremity. It consists of the carpus, metacarpus, and digits. + + Finger + Any of the digits of the hand. + + Index-finger + The second finger from the radial side of the hand, next to the thumb. + + + Little-finger + The fifth and smallest finger from the radial side of the hand. + + + Middle-finger + The middle or third finger from the radial side of the hand. + + + Ring-finger + The fourth finger from the radial side of the hand. + + + Thumb + The thick and short hand digit which is next to the index finger in humans. + + + + Knuckles + A part of a finger at a joint where the bone is near the surface, especially where the finger joins the hand. + + + Palm + The part of the inner surface of the hand that extends from the wrist to the bases of the fingers. + + + + Shoulder + Joint attaching upper arm to trunk. + + + Upper-arm + Portion of arm between shoulder and elbow. + + + Wrist + A joint between the distal end of the radius and the proximal row of carpal bones. + + + + + + Organism + A living entity, more specifically a biological entity that consists of one or more cells and is capable of genomic replication (independently or not). + + Animal + A living organism that has membranous cell walls, requires oxygen and organic foods, and is capable of voluntary movement. + + + Human + The bipedal primate mammal Homo sapiens. + + + Plant + Any living organism that typically synthesizes its food from inorganic substances and possesses cellulose cell walls. + + + + + Language-item + An entity related to a systematic means of communicating by the use of sounds, symbols, or gestures. + + suggestedTag + Sensory-presentation + + + Character + A mark or symbol used in writing. + + + Clause + A unit of grammatical organization next below the sentence in rank, usually consisting of a subject and predicate. + + + Glyph + A hieroglyphic character, symbol, or pictograph. + + + Nonword + A group of letters or speech sounds that looks or sounds like a word but that is not accepted as such by native speakers. + + + Paragraph + A distinct section of a piece of writing, usually dealing with a single theme. + + + Phoneme + A speech sound that is distinguished by the speakers of a particular language. + + + Phrase + A phrase is a group of words functioning as a single unit in the syntax of a sentence. + + + Sentence + A set of words that is complete in itself, conveying a statement, question, exclamation, or command and typically containing an explicit or implied subject and a predicate containing a finite verb. + + + Syllable + A unit of spoken language larger than a phoneme. + + + Textblock + A block of text. + + + Word + A word is the smallest free form (an item that may be expressed in isolation with semantic or pragmatic content) in a language. + + + + Object + Something perceptible by one or more of the senses, especially by vision or touch. A material thing. + + suggestedTag + Sensory-presentation + + + Geometric-object + An object or a representation that has structure and topology in space. + + 2D-shape + A planar, two-dimensional shape. + + Arrow + A shape with a pointed end indicating direction. + + + Clockface + The dial face of a clock. A location identifier based on clockface numbering or anatomic subregion. + + + Cross + A figure or mark formed by two intersecting lines crossing at their midpoints. + + + Dash + A horizontal stroke in writing or printing to mark a pause or break in sense or to represent omitted letters or words. + + + Ellipse + A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base. + + Circle + A ring-shaped structure with every point equidistant from the center. + + + + Rectangle + A parallelogram with four right angles. + + Square + A square is a special rectangle with four equal sides. + + + + Single-point + A point is a geometric entity that is located in a zero-dimensional spatial region and whose position is defined by its coordinates in some coordinate system. + + + Star + A conventional or stylized representation of a star, typically one having five or more points. + + + Triangle + A three-sided polygon. + + + + 3D-shape + A geometric three-dimensional shape. + + Box + A square or rectangular vessel, usually made of cardboard or plastic. + + Cube + A solid or semi-solid in the shape of a three dimensional square. + + + + Cone + A shape whose base is a circle and whose sides taper up to a point. + + + Cylinder + A surface formed by circles of a given radius that are contained in a plane perpendicular to a given axis, whose centers align on the axis. + + + Ellipsoid + A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base. + + Sphere + A solid or hollow three-dimensional object bounded by a closed surface such that every point on the surface is equidistant from the center. + + + + Pyramid + A polyhedron of which one face is a polygon of any number of sides, and the other faces are triangles with a common vertex. + + + + Pattern + An arrangement of objects, facts, behaviors, or other things which have scientific, mathematical, geometric, statistical, or other meaning. + + Dots + A small round mark or spot. + + + LED-pattern + A pattern created by lighting selected members of a fixed light emitting diode array. + + + + + Ingestible-object + Something that can be taken into the body by the mouth for digestion or absorption. + + + Man-made-object + Something constructed by human means. + + Building + A structure that has a roof and walls and stands more or less permanently in one place. + + Attic + A room or a space immediately below the roof of a building. + + + Basement + The part of a building that is wholly or partly below ground level. + + + Entrance + The means or place of entry. + + + Roof + A roof is the covering on the uppermost part of a building which provides protection from animals and weather, notably rain, but also heat, wind and sunlight. + + + Room + An area within a building enclosed by walls and floor and ceiling. + + + + Clothing + A covering designed to be worn on the body. + + + Device + An object contrived for a specific purpose. + + Assistive-device + A device that help an individual accomplish a task. + + Glasses + Frames with lenses worn in front of the eye for vision correction, eye protection, or protection from UV rays. + + + Writing-device + A device used for writing. + + Pen + A common writing instrument used to apply ink to a surface for writing or drawing. + + + Pencil + An implement for writing or drawing that is constructed of a narrow solid pigment core in a protective casing that prevents the core from being broken or marking the hand. + + + + + Computing-device + An electronic device which take inputs and processes results from the inputs. + + Cellphone + A telephone with access to a cellular radio system so it can be used over a wide area, without a physical connection to a network. + + + Desktop-computer + A computer suitable for use at an ordinary desk. + + + Laptop-computer + A computer that is portable and suitable for use while traveling. + + + Tablet-computer + A small portable computer that accepts input directly on to its screen rather than via a keyboard or mouse. + + + + Engine + A motor is a machine designed to convert one or more forms of energy into mechanical energy. + + + IO-device + Hardware used by a human (or other system) to communicate with a computer. + + Input-device + A piece of equipment used to provide data and control signals to an information processing system such as a computer or information appliance. + + Computer-mouse + A hand-held pointing device that detects two-dimensional motion relative to a surface. + + Mouse-button + An electric switch on a computer mouse which can be pressed or clicked to select or interact with an element of a graphical user interface. + + + Scroll-wheel + A scroll wheel or mouse wheel is a wheel used for scrolling made of hard plastic with a rubbery surface usually located between the left and right mouse buttons and is positioned perpendicular to the mouse surface. + + + + Joystick + A control device that uses a movable handle to create two-axis input for a computer device. + + + Keyboard + A device consisting of mechanical keys that are pressed to create input to a computer. + + Keyboard-key + A button on a keyboard usually representing letters, numbers, functions, or symbols. + + # + Value of a keyboard key. + + takesValue + + + + + + Keypad + A device consisting of keys, usually in a block arrangement, that provides limited input to a system. + + Keypad-key + A key on a separate section of a computer keyboard that groups together numeric keys and those for mathematical or other special functions in an arrangement like that of a calculator. + + # + Value of keypad key. + + takesValue + + + + + + Microphone + A device designed to convert sound to an electrical signal. + + + Push-button + A switch designed to be operated by pressing a button. + + + + Output-device + Any piece of computer hardware equipment which converts information into human understandable form. + + Auditory-device + A device designed to produce sound. + + Headphones + An instrument that consists of a pair of small loudspeakers, or less commonly a single speaker, held close to ears and connected to a signal source such as an audio amplifier, radio, CD player or portable media player. + + + Loudspeaker + A device designed to convert electrical signals to sounds that can be heard. + + + + Display-device + An output device for presentation of information in visual or tactile form the latter used for example in tactile electronic displays for blind people. + + Computer-screen + An electronic device designed as a display or a physical device designed to be a protective meshwork. + + Screen-window + A part of a computer screen that contains a display different from the rest of the screen. A window is a graphical control element consisting of a visual area containing some of the graphical user interface of the program it belongs to and is framed by a window decoration. + + + + Head-mounted-display + An instrument that functions as a display device, worn on the head or as part of a helmet, that has a small display optic in front of one (monocular HMD) or each eye (binocular HMD). + + + LED-display + A LED display is a flat panel display that uses an array of light-emitting diodes as pixels for a video display. + + + + + Recording-device + A device that copies information in a signal into a persistent information bearer. + + EEG-recorder + A device for recording electric currents in the brain using electrodes applied to the scalp, to the surface of the brain, or placed within the substance of the brain. + + + File-storage + A device for recording digital information to a permanent media. + + + MEG-recorder + A device for measuring the magnetic fields produced by electrical activity in the brain, usually conducted externally. + + + Motion-capture + A device for recording the movement of objects or people. + + + Tape-recorder + A device for recording and reproduction usually using magnetic tape for storage that can be saved and played back. + + + + Touchscreen + A control component that operates an electronic device by pressing the display on the screen. + + + + Machine + A human-made device that uses power to apply forces and control movement to perform an action. + + + Measurement-device + A device in which a measure function inheres. + + Clock + A device designed to indicate the time of day or to measure the time duration of an event or action. + + Clock-face + A location identifier based on clockface numbering or anatomic subregion. + + + + + Robot + A mechanical device that sometimes resembles a living animal and is capable of performing a variety of often complex human tasks on command or by being programmed in advance. + + + Tool + A component that is not part of a device but is designed to support its assemby or operation. + + + + Document + A physical object, or electronic counterpart, that is characterized by containing writing which is meant to be human-readable. + + Book + A volume made up of pages fastened along one edge and enclosed between protective covers. + + + Letter + A written message addressed to a person or organization. + + + Note + A brief written record. + + + Notebook + A book for notes or memoranda. + + + Questionnaire + A document consisting of questions and possibly responses, depending on whether it has been filled out. + + + + Furnishing + Furniture, fittings, and other decorative accessories, such as curtains and carpets, for a house or room. + + + Manufactured-material + Substances created or extracted from raw materials. + + Ceramic + A hard, brittle, heat-resistant and corrosion-resistant material made by shaping and then firing a nonmetallic mineral, such as clay, at a high temperature. + + + Glass + A brittle transparent solid with irregular atomic structure. + + + Paper + A thin sheet material produced by mechanically or chemically processing cellulose fibres derived from wood, rags, grasses or other vegetable sources in water. + + + Plastic + Various high-molecular-weight thermoplastic or thermosetting polymers that are capable of being molded, extruded, drawn, or otherwise shaped and then hardened into a form. + + + Steel + An alloy made up of iron with typically a few tenths of a percent of carbon to improve its strength and fracture resistance compared to iron. + + + + Media + Media are audo/visual/audiovisual modes of communicating information for mass consumption. + + Media-clip + A short segment of media. + + Audio-clip + A short segment of audio. + + + Audiovisual-clip + A short media segment containing both audio and video. + + + Video-clip + A short segment of video. + + + + Visualization + An planned process that creates images, diagrams or animations from the input data. + + Animation + A form of graphical illustration that changes with time to give a sense of motion or represent dynamic changes in the portrayal. + + + Art-installation + A large-scale, mixed-media constructions, often designed for a specific place or for a temporary period of time. + + + Braille + A display using a system of raised dots that can be read with the fingers by people who are blind. + + + Image + Any record of an imaging event whether physical or electronic. + + Cartoon + A type of illustration, sometimes animated, typically in a non-realistic or semi-realistic style. The specific meaning has evolved over time, but the modern usage usually refers to either an image or series of images intended for satire, caricature, or humor. A motion picture that relies on a sequence of illustrations for its animation. + + + Drawing + A representation of an object or outlining a figure, plan, or sketch by means of lines. + + + Icon + A sign (such as a word or graphic symbol) whose form suggests its meaning. + + + Painting + A work produced through the art of painting. + + + Photograph + An image recorded by a camera. + + + + Movie + A sequence of images displayed in succession giving the illusion of continuous movement. + + + Outline-visualization + A visualization consisting of a line or set of lines enclosing or indicating the shape of an object in a sketch or diagram. + + + Point-light-visualization + A display in which action is depicted using a few points of light, often generated from discrete sensors in motion capture. + + + Sculpture + A two- or three-dimensional representative or abstract forms, especially by carving stone or wood or by casting metal or plaster. + + + Stick-figure-visualization + A drawing showing the head of a human being or animal as a circle and all other parts as straight lines. + + + + + Navigational-object + An object whose purpose is to assist directed movement from one location to another. + + Path + A trodden way. A way or track laid down for walking or made by continual treading. + + + Road + An open way for the passage of vehicles, persons, or animals on land. + + Lane + A defined path with physical dimensions through which an object or substance may traverse. + + + + Runway + A paved strip of ground on a landing field for the landing and takeoff of aircraft. + + + + Vehicle + A mobile machine which transports people or cargo. + + Aircraft + A vehicle which is able to travel through air in an atmosphere. + + + Bicycle + A human-powered, pedal-driven, single-track vehicle, having two wheels attached to a frame, one behind the other. + + + Boat + A watercraft of any size which is able to float or plane on water. + + + Car + A wheeled motor vehicle used primarily for the transportation of human passengers. + + + Cart + A cart is a vehicle which has two wheels and is designed to transport human passengers or cargo. + + + Tractor + A mobile machine specifically designed to deliver a high tractive effort at slow speeds, and mainly used for the purposes of hauling a trailer or machinery used in agriculture or construction. + + + Train + A connected line of railroad cars with or without a locomotive. + + + Truck + A motor vehicle which, as its primary funcion, transports cargo rather than human passangers. + + + + + Natural-object + Something that exists in or is produced by nature, and is not artificial or man-made. + + Mineral + A solid, homogeneous, inorganic substance occurring in nature and having a definite chemical composition. + + + Natural-feature + A feature that occurs in nature. A prominent or identifiable aspect, region, or site of interest. + + Field + An unbroken expanse as of ice or grassland. + + + Hill + A rounded elevation of limited extent rising above the surrounding land with local relief of less than 300m. + + + Mountain + A landform that extends above the surrounding terrain in a limited area. + + + River + A natural freshwater surface stream of considerable volume and a permanent or seasonal flow, moving in a definite channel toward a sea, lake, or another river. + + + Waterfall + A sudden descent of water over a step or ledge in the bed of a river. + + + + + + Sound + Mechanical vibrations transmitted by an elastic medium. Something that can be heard. + + Environmental-sound + Sounds occuring in the environment. An accumulation of noise pollution that occurs outside. This noise can be caused by transport, industrial, and recreational activities. + + Crowd-sound + Noise produced by a mixture of sounds from a large group of people. + + + Signal-noise + Any part of a signal that is not the true or original signal but is introduced by the communication mechanism. + + + + Musical-sound + Sound produced by continuous and regular vibrations, as opposed to noise. + + Instrument-sound + Sound produced by a musical instrument. + + Flute-sound + These should be sorted. Flute should be first + + rooted + Instrument-sound + + + inLibrary + testlib + + + Flute-subsound1 + + inLibrary + testlib + + + + Flute-subsound2 + + inLibrary + testlib + + + + + Oboe-sound + These should be sorted. Oboe should be second + + rooted + Instrument-sound + + + inLibrary + testlib + + + Oboe-subsound1 + + inLibrary + testlib + + + + Oboe-subsound2 + + inLibrary + testlib + + + + + Violin-sound + These should be sorted. Violin should be last + + rooted + Instrument-sound + + + inLibrary + testlib + + + Violin-subsound1 + + inLibrary + testlib + + + + Violin-subsound2 + + inLibrary + testlib + + + + Violin-subsound3 + + inLibrary + testlib + + + + + + Tone + A musical note, warble, or other sound used as a particular signal on a telephone or answering machine. + + + Vocalized-sound + Musical sound produced by vocal cords in a biological agent. + + + + Named-animal-sound + A sound recognizable as being associated with particular animals. + + Barking + Sharp explosive cries like sounds made by certain animals, especially a dog, fox, or seal. + + + Bleating + Wavering cries like sounds made by a sheep, goat, or calf. + + + Chirping + Short, sharp, high-pitched noises like sounds made by small birds or an insects. + + + Crowing + Loud shrill sounds characteristic of roosters. + + + Growling + Low guttural sounds like those that made in the throat by a hostile dog or other animal. + + + Meowing + Vocalizations like those made by as those cats. These sounds have diverse tones and are sometimes chattered, murmured or whispered. The purpose can be assertive. + + + Mooing + Deep vocal sounds like those made by a cow. + + + Purring + Low continuous vibratory sound such as those made by cats. The sound expresses contentment. + + + Roaring + Loud, deep, or harsh prolonged sounds such as those made by big cats and bears for long-distance communication and intimidation. + + + Squawking + Loud, harsh noises such as those made by geese. + + + + Named-object-sound + A sound identifiable as coming from a particular type of object. + + Alarm-sound + A loud signal often loud continuous ringing to alert people to a problem or condition that requires urgent attention. + + + Beep + A short, single tone, that is typically high-pitched and generally made by a computer or other machine. + + + Buzz + A persistent vibratory sound often made by a buzzer device and used to indicate something incorrect. + + + Click + The sound made by a mechanical cash register, often to designate a reward. + + + Ding + A short ringing sound such as that made by a bell, often to indicate a correct response or the expiration of time. + + + Horn-blow + A loud sound made by forcing air through a sound device that funnels air to create the sound, often used to sound an alert. + + + Ka-ching + The sound made by a mechanical cash register, often to designate a reward. + + + Siren + A loud, continuous sound often varying in frequency designed to indicate an emergency. + + + + + + Property + Something that pertains to a thing. A characteristic of some entity. A quality or feature regarded as a characteristic or inherent part of someone or something. HED attributes are adjectives or adverbs. + + extensionAllowed + + + Agent-property + Something that pertains to an agent. + + extensionAllowed + + + Agent-state + The state of the agent. + + Agent-cognitive-state + The state of the cognitive processes or state of mind of the agent. + + Alert + Condition of heightened watchfulness or preparation for action. + + + Anesthetized + Having lost sensation to pain or having senses dulled due to the effects of an anesthetic. + + + Asleep + Having entered a periodic, readily reversible state of reduced awareness and metabolic activity, usually accompanied by physical relaxation and brain activity. + + + Attentive + Concentrating and focusing mental energy on the task or surroundings. + + + Awake + In a non sleeping state. + + + Brain-dead + Characterized by the irreversible absence of cortical and brain stem functioning. + + + Comatose + In a state of profound unconsciousness associated with markedly depressed cerebral activity. + + + Distracted + Lacking in concentration because of being preoccupied. + + + Drowsy + In a state of near-sleep, a strong desire for sleep, or sleeping for unusually long periods. + + + Intoxicated + In a state with disturbed psychophysiological functions and responses as a result of administration or ingestion of a psychoactive substance. + + + Locked-in + In a state of complete paralysis of all voluntary muscles except for the ones that control the movements of the eyes. + + + Passive + Not responding or initiating an action in response to a stimulus. + + + Resting + A state in which the agent is not exhibiting any physical exertion. + + + Vegetative + A state of wakefulness and conscience, but (in contrast to coma) with involuntary opening of the eyes and movements (such as teeth grinding, yawning, or thrashing of the extremities). + + + + Agent-emotional-state + The status of the general temperament and outlook of an agent. + + Angry + Experiencing emotions characterized by marked annoyance or hostility. + + + Aroused + In a state reactive to stimuli leading to increased heart rate and blood pressure, sensory alertness, mobility and readiness to respond. + + + Awed + Filled with wonder. Feeling grand, sublime or powerful emotions characterized by a combination of joy, fear, admiration, reverence, and/or respect. + + + Compassionate + Feeling or showing sympathy and concern for others often evoked for a person who is in distress and associated with altruistic motivation. + + + Content + Feeling satisfaction with things as they are. + + + Disgusted + Feeling revulsion or profound disapproval aroused by something unpleasant or offensive. + + + Emotionally-neutral + Feeling neither satisfied nor dissatisfied. + + + Empathetic + Understanding and sharing the feelings of another. Being aware of, being sensitive to, and vicariously experiencing the feelings, thoughts, and experience of another. + + + Excited + Feeling great enthusiasm and eagerness. + + + Fearful + Feeling apprehension that one may be in danger. + + + Frustrated + Feeling annoyed as a result of being blocked, thwarted, disappointed or defeated. + + + Grieving + Feeling sorrow in response to loss, whether physical or abstract. + + + Happy + Feeling pleased and content. + + + Jealous + Feeling threatened by a rival in a relationship with another individual, in particular an intimate partner, usually involves feelings of threat, fear, suspicion, distrust, anxiety, anger, betrayal, and rejection. + + + Joyful + Feeling delight or intense happiness. + + + Loving + Feeling a strong positive emotion of affection and attraction. + + + Relieved + No longer feeling pain, distress, anxiety, or reassured. + + + Sad + Feeling grief or unhappiness. + + + Stressed + Experiencing mental or emotional strain or tension. + + + + Agent-physiological-state + Having to do with the mechanical, physical, or biochemical function of an agent. + + Healthy + Having no significant health-related issues. + + relatedTag + Sick + + + + Hungry + Being in a state of craving or desiring food. + + relatedTag + Sated + Thirsty + + + + Rested + Feeling refreshed and relaxed. + + relatedTag + Tired + + + + Sated + Feeling full. + + relatedTag + Hungry + + + + Sick + Being in a state of ill health, bodily malfunction, or discomfort. + + relatedTag + Healthy + + + + Thirsty + Feeling a need to drink. + + relatedTag + Hungry + + + + Tired + Feeling in need of sleep or rest. + + relatedTag + Rested + + + + + Agent-postural-state + Pertaining to the position in which agent holds their body. + + Crouching + Adopting a position where the knees are bent and the upper body is brought forward and down, sometimes to avoid detection or to defend oneself. + + + Eyes-closed + Keeping eyes closed with no blinking. + + + Eyes-open + Keeping eyes open with occasional blinking. + + + Kneeling + Positioned where one or both knees are on the ground. + + + On-treadmill + Ambulation on an exercise apparatus with an endless moving belt to support moving in place. + + + Prone + Positioned in a recumbent body position whereby the person lies on its stomach and faces downward. + + + Seated-with-chin-rest + Using a device that supports the chin and head. + + + Sitting + In a seated position. + + + Standing + Assuming or maintaining an erect upright position. + + + + + Agent-task-role + The function or part that is ascribed to an agent in performing the task. + + Experiment-actor + An agent who plays a predetermined role to create the experiment scenario. + + + Experiment-controller + An agent exerting control over some aspect of the experiment. + + + Experiment-participant + Someone who takes part in an activity related to an experiment. + + + Experimenter + Person who is the owner of the experiment and has its responsibility. + + + + Agent-trait + A genetically, environmentally, or socially determined characteristic of an agent. + + Age + Length of time elapsed time since birth of the agent. + + # + + takesValue + + + valueClass + numericClass + + + + + Agent-experience-level + Amount of skill or knowledge that the agent has as pertains to the task. + + Expert-level + Having comprehensive and authoritative knowledge of or skill in a particular area related to the task. + + relatedTag + Intermediate-experience-level + Novice-level + + + + Intermediate-experience-level + Having a moderate amount of knowledge or skill related to the task. + + relatedTag + Expert-level + Novice-level + + + + Novice-level + Being inexperienced in a field or situation related to the task. + + relatedTag + Expert-level + Intermediate-experience-level + + + + + Ethnicity + Belong to a social group that has a common national or cultural tradition. Use with Label to avoid extension. + + + Gender + Characteristics that are socially constructed, including norms, behaviors, and roles based on sex. + + + Handedness + Individual preference for use of a hand, known as the dominant hand. + + Ambidextrous + Having no overall dominance in the use of right or left hand or foot in the performance of tasks that require one hand or foot. + + + Left-handed + Preference for using the left hand or foot for tasks requiring the use of a single hand or foot. + + + Right-handed + Preference for using the right hand or foot for tasks requiring the use of a single hand or foot. + + + + Race + Belonging to a group sharing physical or social qualities as defined within a specified society. Use with Label to avoid extension. + + + Sex + Physical properties or qualities by which male is distinguished from female. + + Female + Biological sex of an individual with female sexual organs such ova. + + + Intersex + Having genitalia and/or secondary sexual characteristics of indeterminate sex. + + + Male + Biological sex of an individual with male sexual organs producing sperm. + + + + + + Data-property + Something that pertains to data or information. + + extensionAllowed + + + Data-marker + An indicator placed to mark something. + + Data-break-marker + An indicator place to indicate a gap in the data. + + + Temporal-marker + An indicator placed at a particular time in the data. + + Inset + Marks an intermediate point in an ongoing event of temporal extent. + + topLevelTagGroup + + + reserved + + + relatedTag + Onset + Offset + + + + Offset + Marks the end of an event of temporal extent. + + topLevelTagGroup + + + reserved + + + relatedTag + Onset + Inset + + + + Onset + Marks the start of an ongoing event of temporal extent. + + topLevelTagGroup + + + reserved + + + relatedTag + Inset + Offset + + + + Pause + Indicates the temporary interruption of the operation a process and subsequently wait for a signal to continue. + + + Time-out + A cancellation or cessation that automatically occurs when a predefined interval of time has passed without a certain event occurring. + + + Time-sync + A synchronization signal whose purpose to help synchronize different signals or processes. Often used to indicate a marker inserted into the recorded data to allow post hoc synchronization of concurrently recorded data streams. + + + + + Data-resolution + Smallest change in a quality being measured by an sensor that causes a perceptible change. + + Printer-resolution + Resolution of a printer, usually expressed as the number of dots-per-inch for a printer. + + # + + takesValue + + + valueClass + numericClass + + + + + Screen-resolution + Resolution of a screen, usually expressed as the of pixels in a dimension for a digital display device. + + # + + takesValue + + + valueClass + numericClass + + + + + Sensory-resolution + Resolution of measurements by a sensing device. + + # + + takesValue + + + valueClass + numericClass + + + + + Spatial-resolution + Linear spacing of a spatial measurement. + + # + + takesValue + + + valueClass + numericClass + + + + + Spectral-resolution + Measures the ability of a sensor to resolve features in the electromagnetic spectrum. + + # + + takesValue + + + valueClass + numericClass + + + + + Temporal-resolution + Measures the ability of a sensor to resolve features in time. + + # + + takesValue + + + valueClass + numericClass + + + + + + Data-source-type + The type of place, person, or thing from which the data comes or can be obtained. + + Computed-feature + A feature computed from the data by a tool. This tag should be grouped with a label of the form Toolname_propertyName. + + + Computed-prediction + A computed extrapolation of known data. + + + Expert-annotation + An explanatory or critical comment or other in-context information provided by an authority. + + + Instrument-measurement + Information obtained from a device that is used to measure material properties or make other observations. + + + Observation + Active acquisition of information from a primary source. Should be grouped with a label of the form AgentID_featureName. + + + + Data-value + Designation of the type of a data item. + + Categorical-value + Indicates that something can take on a limited and usually fixed number of possible values. + + Categorical-class-value + Categorical values that fall into discrete classes such as true or false. The grouping is absolute in the sense that it is the same for all participants. + + All + To a complete degree or to the full or entire extent. + + relatedTag + Some + None + + + + Correct + Free from error. Especially conforming to fact or truth. + + relatedTag + Wrong + + + + Explicit + Stated clearly and in detail, leaving no room for confusion or doubt. + + relatedTag + Implicit + + + + False + Not in accordance with facts, reality or definitive criteria. + + relatedTag + True + + + + Implicit + Implied though not plainly expressed. + + relatedTag + Explicit + + + + Invalid + Not allowed or not conforming to the correct format or specifications. + + relatedTag + Valid + + + + None + No person or thing, nobody, not any. + + relatedTag + All + Some + + + + Some + At least a small amount or number of, but not a large amount of, or often. + + relatedTag + All + None + + + + True + Conforming to facts, reality or definitive criteria. + + relatedTag + False + + + + Valid + Allowable, usable, or acceptable. + + relatedTag + Invalid + + + + Wrong + Inaccurate or not correct. + + relatedTag + Correct + + + + + Categorical-judgment-value + Categorical values that are based on the judgment or perception of the participant such familiar and famous. + + Abnormal + Deviating in any way from the state, position, structure, condition, behavior, or rule which is considered a norm. + + relatedTag + Normal + + + + Asymmetrical + Lacking symmetry or having parts that fail to correspond to one another in shape, size, or arrangement. + + relatedTag + Symmetrical + + + + Audible + A sound that can be perceived by the participant. + + relatedTag + Inaudible + + + + Complex + Hard, involved or complicated, elaborate, having many parts. + + relatedTag + Simple + + + + Congruent + Concordance of multiple evidence lines. In agreement or harmony. + + relatedTag + Incongruent + + + + Constrained + Keeping something within particular limits or bounds. + + relatedTag + Unconstrained + + + + Disordered + Not neatly arranged. Confused and untidy. A structural quality in which the parts of an object are non-rigid. + + relatedTag + Ordered + + + + Familiar + Recognized, familiar, or within the scope of knowledge. + + relatedTag + Unfamiliar + Famous + + + + Famous + A person who has a high degree of recognition by the general population for his or her success or accomplishments. A famous person. + + relatedTag + Familiar + Unfamiliar + + + + Inaudible + A sound below the threshold of perception of the participant. + + relatedTag + Audible + + + + Incongruent + Not in agreement or harmony. + + relatedTag + Congruent + + + + Involuntary + An action that is not made by choice. In the body, involuntary actions (such as blushing) occur automatically, and cannot be controlled by choice. + + relatedTag + Voluntary + + + + Masked + Information exists but is not provided or is partially obscured due to security, privacy, or other concerns. + + relatedTag + Unmasked + + + + Normal + Being approximately average or within certain limits. Conforming with or constituting a norm or standard or level or type or social norm. + + relatedTag + Abnormal + + + + Ordered + Conforming to a logical or comprehensible arrangement of separate elements. + + relatedTag + Disordered + + + + Simple + Easily understood or presenting no difficulties. + + relatedTag + Complex + + + + Symmetrical + Made up of exactly similar parts facing each other or around an axis. Showing aspects of symmetry. + + relatedTag + Asymmetrical + + + + Unconstrained + Moving without restriction. + + relatedTag + Constrained + + + + Unfamiliar + Not having knowledge or experience of. + + relatedTag + Familiar + Famous + + + + Unmasked + Information is revealed. + + relatedTag + Masked + + + + Voluntary + Using free will or design; not forced or compelled; controlled by individual volition. + + relatedTag + Involuntary + + + + + Categorical-level-value + Categorical values based on dividing a continuous variable into levels such as high and low. + + Cold + Having an absence of heat. + + relatedTag + Hot + + + + Deep + Extending relatively far inward or downward. + + relatedTag + Shallow + + + + High + Having a greater than normal degree, intensity, or amount. + + relatedTag + Low + Medium + + + + Hot + Having an excess of heat. + + relatedTag + Cold + + + + Large + Having a great extent such as in physical dimensions, period of time, amplitude or frequency. + + relatedTag + Small + + + + Liminal + Situated at a sensory threshold that is barely perceptible or capable of eliciting a response. + + relatedTag + Subliminal + Supraliminal + + + + Loud + Having a perceived high intensity of sound. + + relatedTag + Quiet + + + + Low + Less than normal in degree, intensity or amount. + + relatedTag + High + + + + Medium + Mid-way between small and large in number, quantity, magnitude or extent. + + relatedTag + Low + High + + + + Negative + Involving disadvantage or harm. + + relatedTag + Positive + + + + Positive + Involving advantage or good. + + relatedTag + Negative + + + + Quiet + Characterizing a perceived low intensity of sound. + + relatedTag + Loud + + + + Rough + Having a surface with perceptible bumps, ridges, or irregularities. + + relatedTag + Smooth + + + + Shallow + Having a depth which is relatively low. + + relatedTag + Deep + + + + Small + Having a small extent such as in physical dimensions, period of time, amplitude or frequency. + + relatedTag + Large + + + + Smooth + Having a surface free from bumps, ridges, or irregularities. + + relatedTag + Rough + + + + Subliminal + Situated below a sensory threshold that is imperceptible or not capable of eliciting a response. + + relatedTag + Liminal + Supraliminal + + + + Supraliminal + Situated above a sensory threshold that is perceptible or capable of eliciting a response. + + relatedTag + Liminal + Subliminal + + + + Thick + Wide in width, extent or cross-section. + + relatedTag + Thin + + + + Thin + Narrow in width, extent or cross-section. + + relatedTag + Thick + + + + + Categorical-orientation-value + Value indicating the orientation or direction of something. + + Backward + Directed behind or to the rear. + + relatedTag + Forward + + + + Downward + Moving or leading toward a lower place or level. + + relatedTag + Leftward + Rightward + Upward + + + + Forward + At or near or directed toward the front. + + relatedTag + Backward + + + + Horizontally-oriented + Oriented parallel to or in the plane of the horizon. + + relatedTag + Vertically-oriented + + + + Leftward + Going toward or facing the left. + + relatedTag + Downward + Rightward + Upward + + + + Oblique + Slanting or inclined in direction, course, or position that is neither parallel nor perpendicular nor right-angular. + + relatedTag + Rotated + + + + Rightward + Going toward or situated on the right. + + relatedTag + Downward + Leftward + Upward + + + + Rotated + Positioned offset around an axis or center. + + + Upward + Moving, pointing, or leading to a higher place, point, or level. + + relatedTag + Downward + Leftward + Rightward + + + + Vertically-oriented + Oriented perpendicular to the plane of the horizon. + + relatedTag + Horizontally-oriented + + + + + + Physical-value + The value of some physical property of something. + + Temperature + A measure of hot or cold based on the average kinetic energy of the atoms or molecules in the system. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + temperatureUnits + + + + + Weight + The relative mass or the quantity of matter contained by something. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + weightUnits + + + + + + Quantitative-value + Something capable of being estimated or expressed with numeric values. + + Fraction + A numerical value between 0 and 1. + + # + + takesValue + + + valueClass + numericClass + + + + + Item-count + The integer count of something which is usually grouped with the entity it is counting. (Item-count/3, A) indicates that 3 of A have occurred up to this point. + + # + + takesValue + + + valueClass + numericClass + + + + + Item-index + The index of an item in a collection, sequence or other structure. (A (Item-index/3, B)) means that A is item number 3 in B. + + # + + takesValue + + + valueClass + numericClass + + + + + Item-interval + An integer indicating how many items or entities have passed since the last one of these. An item interval of 0 indicates the current item. + + # + + takesValue + + + valueClass + numericClass + + + + + Percentage + A fraction or ratio with 100 understood as the denominator. + + # + + takesValue + + + valueClass + numericClass + + + + + Ratio + A quotient of quantities of the same kind for different components within the same system. + + # + + takesValue + + + valueClass + numericClass + + + + + + Spatiotemporal-value + A property relating to space and/or time. + + Rate-of-change + The amount of change accumulated per unit time. + + Acceleration + Magnitude of the rate of change in either speed or direction. The direction of change should be given separately. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + accelerationUnits + + + + + Frequency + Frequency is the number of occurrences of a repeating event per unit time. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + + + Jerk-rate + Magnitude of the rate at which the acceleration of an object changes with respect to time. The direction of change should be given separately. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + jerkUnits + + + + + Refresh-rate + The frequency with which the image on a computer monitor or similar electronic display screen is refreshed, usually expressed in hertz. + + # + + takesValue + + + valueClass + numericClass + + + + + Sampling-rate + The number of digital samples taken or recorded per unit of time. + + # + + takesValue + + + unitClass + frequencyUnits + + + + + Speed + A scalar measure of the rate of movement of the object expressed either as the distance travelled divided by the time taken (average speed) or the rate of change of position with respect to time at a particular point (instantaneous speed). The direction of change should be given separately. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + speedUnits + + + + + Temporal-rate + The number of items per unit of time. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + + + + Spatial-value + Value of an item involving space. + + Angle + The amount of inclination of one line to another or the plane of one object to another. + + # + + takesValue + + + unitClass + angleUnits + + + valueClass + numericClass + + + + + Distance + A measure of the space separating two objects or points. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Position + A reference to the alignment of an object, a particular situation or view of a situation, or the location of an object. Coordinates with respect a specified frame of reference or the default Screen-frame if no frame is given. + + X-position + The position along the x-axis of the frame of reference. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Y-position + The position along the y-axis of the frame of reference. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Z-position + The position along the z-axis of the frame of reference. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + + Size + The physical magnitude of something. + + Area + The extent of a 2-dimensional surface enclosed within a boundary. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + areaUnits + + + + + Depth + The distance from the surface of something especially from the perspective of looking from the front. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Height + The vertical measurement or distance from the base to the top of an object. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Length + The linear extent in space from one end of something to the other end, or the extent of something from beginning to end. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Volume + The amount of three dimensional space occupied by an object or the capacity of a space or container. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + volumeUnits + + + + + Width + The extent or measurement of something from side to side. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + + + Temporal-value + A characteristic of or relating to time or limited by time. + + Delay + The time at which an event start time is delayed from the current onset time. This tag defines the start time of an event of temporal extent and may be used with the Duration tag. + + topLevelTagGroup + + + reserved + + + relatedTag + Duration + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Duration + The period of time during which an event occurs. This tag defines the end time of an event of temporal extent and may be used with the Delay tag. + + topLevelTagGroup + + + reserved + + + relatedTag + Delay + + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Time-interval + The period of time separating two instances, events, or occurrences. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Time-value + A value with units of time. Usually grouped with tags identifying what the value represents. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + + + Statistical-value + A value based on or employing the principles of statistics. + + extensionAllowed + + + Data-maximum + The largest possible quantity or degree. + + # + + takesValue + + + valueClass + numericClass + + + + + Data-mean + The sum of a set of values divided by the number of values in the set. + + # + + takesValue + + + valueClass + numericClass + + + + + Data-median + The value which has an equal number of values greater and less than it. + + # + + takesValue + + + valueClass + numericClass + + + + + Data-minimum + The smallest possible quantity. + + # + + takesValue + + + valueClass + numericClass + + + + + Probability + A measure of the expectation of the occurrence of a particular event. + + # + + takesValue + + + valueClass + numericClass + + + + + Standard-deviation + A measure of the range of values in a set of numbers. Standard deviation is a statistic used as a measure of the dispersion or variation in a distribution, equal to the square root of the arithmetic mean of the squares of the deviations from the arithmetic mean. + + # + + takesValue + + + valueClass + numericClass + + + + + Statistical-accuracy + A measure of closeness to true value expressed as a number between 0 and 1. + + # + + takesValue + + + valueClass + numericClass + + + + + Statistical-precision + A quantitative representation of the degree of accuracy necessary for or associated with a particular action. + + # + + takesValue + + + valueClass + numericClass + + + + + Statistical-recall + Sensitivity is a measurement datum qualifying a binary classification test and is computed by substracting the false negative rate to the integral numeral 1. + + # + + takesValue + + + valueClass + numericClass + + + + + Statistical-uncertainty + A measure of the inherent variability of repeated observation measurements of a quantity including quantities evaluated by statistical methods and by other means. + + # + + takesValue + + + valueClass + numericClass + + + + + + + Data-variability-attribute + An attribute describing how something changes or varies. + + Abrupt + Marked by sudden change. + + + Constant + Continually recurring or continuing without interruption. Not changing in time or space. + + + Continuous + Uninterrupted in time, sequence, substance, or extent. + + relatedTag + Discrete + Discontinuous + + + + Decreasing + Becoming smaller or fewer in size, amount, intensity, or degree. + + relatedTag + Increasing + + + + Deterministic + No randomness is involved in the development of the future states of the element. + + relatedTag + Random + Stochastic + + + + Discontinuous + Having a gap in time, sequence, substance, or extent. + + relatedTag + Continuous + + + + Discrete + Constituting a separate entities or parts. + + relatedTag + Continuous + Discontinuous + + + + Estimated-value + Something that has been calculated or measured approximately. + + + Exact-value + A value that is viewed to the true value according to some standard. + + + Flickering + Moving irregularly or unsteadily or burning or shining fitfully or with a fluctuating light. + + + Fractal + Having extremely irregular curves or shapes for which any suitably chosen part is similar in shape to a given larger or smaller part when magnified or reduced to the same size. + + + Increasing + Becoming greater in size, amount, or degree. + + relatedTag + Decreasing + + + + Random + Governed by or depending on chance. Lacking any definite plan or order or purpose. + + relatedTag + Deterministic + Stochastic + + + + Repetitive + A recurring action that is often non-purposeful. + + + Stochastic + Uses a random probability distribution or pattern that may be analysed statistically but may not be predicted precisely to determine future states. + + relatedTag + Deterministic + Random + + + + Varying + Differing in size, amount, degree, or nature. + + + + + Environmental-property + Relating to or arising from the surroundings of an agent. + + Augmented-reality + Using technology that enhances real-world experiences with computer-derived digital overlays to change some aspects of perception of the natural environment. The digital content is shown to the user through a smart device or glasses and responds to changes in the environment. + + + Indoors + Located inside a building or enclosure. + + + Motion-platform + A mechanism that creates the feelings of being in a real motion environment. + + + Outdoors + Any area outside a building or shelter. + + + Real-world + Located in a place that exists in real space and time under realistic conditions. + + + Rural + Of or pertaining to the country as opposed to the city. + + + Terrain + Characterization of the physical features of a tract of land. + + Composite-terrain + Tracts of land characterized by a mixure of physical features. + + + Dirt-terrain + Tracts of land characterized by a soil surface and lack of vegetation. + + + Grassy-terrain + Tracts of land covered by grass. + + + Gravel-terrain + Tracts of land covered by a surface consisting a loose aggregation of small water-worn or pounded stones. + + + Leaf-covered-terrain + Tracts of land covered by leaves and composited organic material. + + + Muddy-terrain + Tracts of land covered by a liquid or semi-liquid mixture of water and some combination of soil, silt, and clay. + + + Paved-terrain + Tracts of land covered with concrete, asphalt, stones, or bricks. + + + Rocky-terrain + Tracts of land consisting or full of rock or rocks. + + + Sloped-terrain + Tracts of land arranged in a sloping or inclined position. + + + Uneven-terrain + Tracts of land that are not level, smooth, or regular. + + + + Urban + Relating to, located in, or characteristic of a city or densely populated area. + + + Virtual-world + Using technology that creates immersive, computer-generated experiences that a person can interact with and navigate through. The digital content is generally delivered to the user through some type of headset and responds to changes in head position or through interaction with other types of sensors. Existing in a virtual setting such as a simulation or game environment. + + + + Informational-property + Something that pertains to a task. + + extensionAllowed + + + Description + An explanation of what the tag group it is in means. If the description is at the top-level of an event string, the description applies to the event. + + requireChild + + + # + + takesValue + + + valueClass + textClass + + + + + ID + An alphanumeric name that identifies either a unique object or a unique class of objects. Here the object or class may be an idea, physical countable object (or class), or physical uncountable substance (or class). + + requireChild + + + # + + takesValue + + + valueClass + textClass + + + + + Label + A string of 20 or fewer characters identifying something. Labels usually refer to general classes of things while IDs refer to specific instances. A term that is associated with some entity. A brief description given for purposes of identification. An identifying or descriptive marker that is attached to an object. + + requireChild + + + # + + takesValue + + + valueClass + nameClass + + + + + Metadata + Data about data. Information that describes another set of data. + + CogAtlas + The Cognitive Atlas ID number of something. + + # + + takesValue + + + + + CogPo + The CogPO ID number of something. + + # + + takesValue + + + + + Creation-date + The date on which data creation of this element began. + + requireChild + + + # + + takesValue + + + valueClass + dateTimeClass + + + + + Experimental-note + A brief written record about the experiment. + + # + + takesValue + + + valueClass + textClass + + + + + Library-name + Official name of a HED library. + + # + + takesValue + + + valueClass + nameClass + + + + + OBO-identifier + The identifier of a term in some Open Biology Ontology (OBO) ontology. + + # + + takesValue + + + valueClass + nameClass + + + + + Pathname + The specification of a node (file or directory) in a hierarchical file system, usually specified by listing the nodes top-down. + + # + + takesValue + + + + + Subject-identifier + A sequence of characters used to identify, name, or characterize a trial or study subject. + + # + + takesValue + + + + + Version-identifier + An alphanumeric character string that identifies a form or variant of a type or original. + + # + Usually is a semantic version. + + takesValue + + + + + + Parameter + Something user-defined for this experiment. + + Parameter-label + The name of the parameter. + + # + + takesValue + + + valueClass + nameClass + + + + + Parameter-value + The value of the parameter. + + # + + takesValue + + + valueClass + textClass + + + + + + + Organizational-property + Relating to an organization or the action of organizing something. + + Collection + A tag designating a grouping of items such as in a set or list. + + # + Name of the collection. + + takesValue + + + valueClass + nameClass + + + + + Condition-variable + An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent variables or contrasts. + + # + Name of the condition variable. + + takesValue + + + valueClass + nameClass + + + + + Control-variable + An aspect of the experiment that is fixed throughout the study and usually is explicitly controlled. + + # + Name of the control variable. + + takesValue + + + valueClass + nameClass + + + + + Def + A HED-specific utility tag used with a defined name to represent the tags associated with that definition. + + requireChild + + + reserved + + + # + Name of the definition. + + takesValue + + + valueClass + nameClass + + + + + Def-expand + A HED specific utility tag that is grouped with an expanded definition. The child value of the Def-expand is the name of the expanded definition. + + requireChild + + + reserved + + + tagGroup + + + # + + takesValue + + + valueClass + nameClass + + + + + Definition + A HED-specific utility tag whose child value is the name of the concept and the tag group associated with the tag is an English language explanation of a concept. + + requireChild + + + reserved + + + topLevelTagGroup + + + # + Name of the definition. + + takesValue + + + valueClass + nameClass + + + + + Event-context + A special HED tag inserted as part of a top-level tag group to contain information about the interrelated conditions under which the event occurs. The event context includes information about other events that are ongoing when this event happens. + + reserved + + + topLevelTagGroup + + + unique + + + + Event-stream + A special HED tag indicating that this event is a member of an ordered succession of events. + + # + Name of the event stream. + + takesValue + + + valueClass + nameClass + + + + + Experimental-intertrial + A tag used to indicate a part of the experiment between trials usually where nothing is happening. + + # + Optional label for the intertrial block. + + takesValue + + + valueClass + nameClass + + + + + Experimental-trial + Designates a run or execution of an activity, for example, one execution of a script. A tag used to indicate a particular organizational part in the experimental design often containing a stimulus-response pair or stimulus-response-feedback triad. + + # + Optional label for the trial (often a numerical string). + + takesValue + + + valueClass + nameClass + + + + + Indicator-variable + An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent variables. + + # + Name of the indicator variable. + + takesValue + + + valueClass + nameClass + + + + + Recording + A tag designating the data recording. Recording tags are usually have temporal scope which is the entire recording. + + # + Optional label for the recording. + + takesValue + + + valueClass + nameClass + + + + + Task + An assigned piece of work, usually with a time allotment. A tag used to indicate a linkage the structured activities performed as part of the experiment. + + # + Optional label for the task block. + + takesValue + + + valueClass + nameClass + + + + + Time-block + A tag used to indicate a contiguous time block in the experiment during which something is fixed or noted. + + # + Optional label for the task block. + + takesValue + + + valueClass + nameClass + + + + + + Sensory-property + Relating to sensation or the physical senses. + + Sensory-attribute + A sensory characteristic associated with another entity. + + Auditory-attribute + Pertaining to the sense of hearing. + + Loudness + Perceived intensity of a sound. + + # + + takesValue + + + valueClass + numericClass + nameClass + + + + + Pitch + A perceptual property that allows the user to order sounds on a frequency scale. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + + + Sound-envelope + Description of how a sound changes over time. + + Sound-envelope-attack + The time taken for initial run-up of level from nil to peak usually beginning when the key on a musical instrument is pressed. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Sound-envelope-decay + The time taken for the subsequent run down from the attack level to the designated sustain level. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Sound-envelope-release + The time taken for the level to decay from the sustain level to zero after the key is released. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Sound-envelope-sustain + The time taken for the main sequence of the sound duration, until the key is released. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + + Sound-volume + The sound pressure level (SPL) usually the ratio to a reference signal estimated as the lower bound of hearing. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + intensityUnits + + + + + Timbre + The perceived sound quality of a singing voice or musical instrument. + + # + + takesValue + + + valueClass + nameClass + + + + + + Gustatory-attribute + Pertaining to the sense of taste. + + Bitter + Having a sharp, pungent taste. + + + Salty + Tasting of or like salt. + + + Savory + Belonging to a taste that is salty or spicy rather than sweet. + + + Sour + Having a sharp, acidic taste. + + + Sweet + Having or resembling the taste of sugar. + + + + Olfactory-attribute + Having a smell. + + + Somatic-attribute + Pertaining to the feelings in the body or of the nervous system. + + Pain + The sensation of discomfort, distress, or agony, resulting from the stimulation of specialized nerve endings. + + + Stress + The negative mental, emotional, and physical reactions that occur when environmental stressors are perceived as exceeding the adaptive capacities of the individual. + + + + Tactile-attribute + Pertaining to the sense of touch. + + Tactile-pressure + Having a feeling of heaviness. + + + Tactile-temperature + Having a feeling of hotness or coldness. + + + Tactile-texture + Having a feeling of roughness. + + + Tactile-vibration + Having a feeling of mechanical oscillation. + + + + Vestibular-attribute + Pertaining to the sense of balance or body position. + + + Visual-attribute + Pertaining to the sense of sight. + + Color + The appearance of objects (or light sources) described in terms of perception of their hue and lightness (or brightness) and saturation. + + CSS-color + One of 140 colors supported by all browsers. For more details such as the color RGB or HEX values, check: https://www.w3schools.com/colors/colors_groups.asp. + + Blue-color + CSS color group. + + Blue + CSS-color 0x0000FF. + + + CadetBlue + CSS-color 0x5F9EA0. + + + CornflowerBlue + CSS-color 0x6495ED. + + + DarkBlue + CSS-color 0x00008B. + + + DeepSkyBlue + CSS-color 0x00BFFF. + + + DodgerBlue + CSS-color 0x1E90FF. + + + LightBlue + CSS-color 0xADD8E6. + + + LightSkyBlue + CSS-color 0x87CEFA. + + + LightSteelBlue + CSS-color 0xB0C4DE. + + + MediumBlue + CSS-color 0x0000CD. + + + MidnightBlue + CSS-color 0x191970. + + + Navy + CSS-color 0x000080. + + + PowderBlue + CSS-color 0xB0E0E6. + + + RoyalBlue + CSS-color 0x4169E1. + + + SkyBlue + CSS-color 0x87CEEB. + + + SteelBlue + CSS-color 0x4682B4. + + + + Brown-color + CSS color group. + + Bisque + CSS-color 0xFFE4C4. + + + BlanchedAlmond + CSS-color 0xFFEBCD. + + + Brown + CSS-color 0xA52A2A. + + + BurlyWood + CSS-color 0xDEB887. + + + Chocolate + CSS-color 0xD2691E. + + + Cornsilk + CSS-color 0xFFF8DC. + + + DarkGoldenRod + CSS-color 0xB8860B. + + + GoldenRod + CSS-color 0xDAA520. + + + Maroon + CSS-color 0x800000. + + + NavajoWhite + CSS-color 0xFFDEAD. + + + Olive + CSS-color 0x808000. + + + Peru + CSS-color 0xCD853F. + + + RosyBrown + CSS-color 0xBC8F8F. + + + SaddleBrown + CSS-color 0x8B4513. + + + SandyBrown + CSS-color 0xF4A460. + + + Sienna + CSS-color 0xA0522D. + + + Tan + CSS-color 0xD2B48C. + + + Wheat + CSS-color 0xF5DEB3. + + + + Cyan-color + CSS color group. + + Aqua + CSS-color 0x00FFFF. + + + Aquamarine + CSS-color 0x7FFFD4. + + + Cyan + CSS-color 0x00FFFF. + + + DarkTurquoise + CSS-color 0x00CED1. + + + LightCyan + CSS-color 0xE0FFFF. + + + MediumTurquoise + CSS-color 0x48D1CC. + + + PaleTurquoise + CSS-color 0xAFEEEE. + + + Turquoise + CSS-color 0x40E0D0. + + + + Gray-color + CSS color group. + + Black + CSS-color 0x000000. + + + DarkGray + CSS-color 0xA9A9A9. + + + DarkSlateGray + CSS-color 0x2F4F4F. + + + DimGray + CSS-color 0x696969. + + + Gainsboro + CSS-color 0xDCDCDC. + + + Gray + CSS-color 0x808080. + + + LightGray + CSS-color 0xD3D3D3. + + + LightSlateGray + CSS-color 0x778899. + + + Silver + CSS-color 0xC0C0C0. + + + SlateGray + CSS-color 0x708090. + + + + Green-color + CSS color group. + + Chartreuse + CSS-color 0x7FFF00. + + + DarkCyan + CSS-color 0x008B8B. + + + DarkGreen + CSS-color 0x006400. + + + DarkOliveGreen + CSS-color 0x556B2F. + + + DarkSeaGreen + CSS-color 0x8FBC8F. + + + ForestGreen + CSS-color 0x228B22. + + + Green + CSS-color 0x008000. + + + GreenYellow + CSS-color 0xADFF2F. + + + LawnGreen + CSS-color 0x7CFC00. + + + LightGreen + CSS-color 0x90EE90. + + + LightSeaGreen + CSS-color 0x20B2AA. + + + Lime + CSS-color 0x00FF00. + + + LimeGreen + CSS-color 0x32CD32. + + + MediumAquaMarine + CSS-color 0x66CDAA. + + + MediumSeaGreen + CSS-color 0x3CB371. + + + MediumSpringGreen + CSS-color 0x00FA9A. + + + OliveDrab + CSS-color 0x6B8E23. + + + PaleGreen + CSS-color 0x98FB98. + + + SeaGreen + CSS-color 0x2E8B57. + + + SpringGreen + CSS-color 0x00FF7F. + + + Teal + CSS-color 0x008080. + + + YellowGreen + CSS-color 0x9ACD32. + + + + Orange-color + CSS color group. + + Coral + CSS-color 0xFF7F50. + + + DarkOrange + CSS-color 0xFF8C00. + + + Orange + CSS-color 0xFFA500. + + + OrangeRed + CSS-color 0xFF4500. + + + Tomato + CSS-color 0xFF6347. + + + + Pink-color + CSS color group. + + DeepPink + CSS-color 0xFF1493. + + + HotPink + CSS-color 0xFF69B4. + + + LightPink + CSS-color 0xFFB6C1. + + + MediumVioletRed + CSS-color 0xC71585. + + + PaleVioletRed + CSS-color 0xDB7093. + + + Pink + CSS-color 0xFFC0CB. + + + + Purple-color + CSS color group. + + BlueViolet + CSS-color 0x8A2BE2. + + + DarkMagenta + CSS-color 0x8B008B. + + + DarkOrchid + CSS-color 0x9932CC. + + + DarkSlateBlue + CSS-color 0x483D8B. + + + DarkViolet + CSS-color 0x9400D3. + + + Fuchsia + CSS-color 0xFF00FF. + + + Indigo + CSS-color 0x4B0082. + + + Lavender + CSS-color 0xE6E6FA. + + + Magenta + CSS-color 0xFF00FF. + + + MediumOrchid + CSS-color 0xBA55D3. + + + MediumPurple + CSS-color 0x9370DB. + + + MediumSlateBlue + CSS-color 0x7B68EE. + + + Orchid + CSS-color 0xDA70D6. + + + Plum + CSS-color 0xDDA0DD. + + + Purple + CSS-color 0x800080. + + + RebeccaPurple + CSS-color 0x663399. + + + SlateBlue + CSS-color 0x6A5ACD. + + + Thistle + CSS-color 0xD8BFD8. + + + Violet + CSS-color 0xEE82EE. + + + + Red-color + CSS color group. + + Crimson + CSS-color 0xDC143C. + + + DarkRed + CSS-color 0x8B0000. + + + DarkSalmon + CSS-color 0xE9967A. + + + FireBrick + CSS-color 0xB22222. + + + IndianRed + CSS-color 0xCD5C5C. + + + LightCoral + CSS-color 0xF08080. + + + LightSalmon + CSS-color 0xFFA07A. + + + Red + CSS-color 0xFF0000. + + + Salmon + CSS-color 0xFA8072. + + + + White-color + CSS color group. + + AliceBlue + CSS-color 0xF0F8FF. + + + AntiqueWhite + CSS-color 0xFAEBD7. + + + Azure + CSS-color 0xF0FFFF. + + + Beige + CSS-color 0xF5F5DC. + + + FloralWhite + CSS-color 0xFFFAF0. + + + GhostWhite + CSS-color 0xF8F8FF. + + + HoneyDew + CSS-color 0xF0FFF0. + + + Ivory + CSS-color 0xFFFFF0. + + + LavenderBlush + CSS-color 0xFFF0F5. + + + Linen + CSS-color 0xFAF0E6. + + + MintCream + CSS-color 0xF5FFFA. + + + MistyRose + CSS-color 0xFFE4E1. + + + OldLace + CSS-color 0xFDF5E6. + + + SeaShell + CSS-color 0xFFF5EE. + + + Snow + CSS-color 0xFFFAFA. + + + White + CSS-color 0xFFFFFF. + + + WhiteSmoke + CSS-color 0xF5F5F5. + + + + Yellow-color + CSS color group. + + DarkKhaki + CSS-color 0xBDB76B. + + + Gold + CSS-color 0xFFD700. + + + Khaki + CSS-color 0xF0E68C. + + + LemonChiffon + CSS-color 0xFFFACD. + + + LightGoldenRodYellow + CSS-color 0xFAFAD2. + + + LightYellow + CSS-color 0xFFFFE0. + + + Moccasin + CSS-color 0xFFE4B5. + + + PaleGoldenRod + CSS-color 0xEEE8AA. + + + PapayaWhip + CSS-color 0xFFEFD5. + + + PeachPuff + CSS-color 0xFFDAB9. + + + Yellow + CSS-color 0xFFFF00. + + + + + Color-shade + A slight degree of difference between colors, especially with regard to how light or dark it is or as distinguished from one nearly like it. + + Dark-shade + A color tone not reflecting much light. + + + Light-shade + A color tone reflecting more light. + + + + Grayscale + Using a color map composed of shades of gray, varying from black at the weakest intensity to white at the strongest. + + # + White intensity between 0 and 1. + + takesValue + + + valueClass + numericClass + + + + + HSV-color + A color representation that models how colors appear under light. + + HSV-value + An attribute of a visual sensation according to which an area appears to emit more or less light. + + # + + takesValue + + + valueClass + numericClass + + + + + Hue + Attribute of a visual sensation according to which an area appears to be similar to one of the perceived colors. + + # + Angular value between 0 and 360. + + takesValue + + + valueClass + numericClass + + + + + Saturation + Colorfulness of a stimulus relative to its own brightness. + + # + B value of RGB between 0 and 1. + + takesValue + + + valueClass + numericClass + + + + + + RGB-color + A color from the RGB schema. + + RGB-blue + The blue component. + + # + B value of RGB between 0 and 1. + + takesValue + + + valueClass + numericClass + + + + + RGB-green + The green component. + + # + G value of RGB between 0 and 1. + + takesValue + + + valueClass + numericClass + + + + + RGB-red + The red component. + + # + R value of RGB between 0 and 1. + + takesValue + + + valueClass + numericClass + + + + + + + Luminance + A quality that exists by virtue of the luminous intensity per unit area projected in a given direction. + + + Opacity + A measure of impenetrability to light. + + + + + Sensory-presentation + The entity has a sensory manifestation. + + Auditory-presentation + The sense of hearing is used in the presentation to the user. + + Loudspeaker-separation + The distance between two loudspeakers. Grouped with the Distance tag. + + suggestedTag + Distance + + + + Monophonic + Relating to sound transmission, recording, or reproduction involving a single transmission path. + + + Silent + The absence of ambient audible sound or the state of having ceased to produce sounds. + + + Stereophonic + Relating to, or constituting sound reproduction involving the use of separated microphones and two transmission channels to achieve the sound separation of a live hearing. + + + + Gustatory-presentation + The sense of taste used in the presentation to the user. + + + Olfactory-presentation + The sense of smell used in the presentation to the user. + + + Somatic-presentation + The nervous system is used in the presentation to the user. + + + Tactile-presentation + The sense of touch used in the presentation to the user. + + + Vestibular-presentation + The sense balance used in the presentation to the user. + + + Visual-presentation + The sense of sight used in the presentation to the user. + + 2D-view + A view showing only two dimensions. + + + 3D-view + A view showing three dimensions. + + + Background-view + Parts of the view that are farthest from the viewer and usually the not part of the visual focus. + + + Bistable-view + Something having two stable visual forms that have two distinguishable stable forms as in optical illusions. + + + Foreground-view + Parts of the view that are closest to the viewer and usually the most important part of the visual focus. + + + Foveal-view + Visual presentation directly on the fovea. A view projected on the small depression in the retina containing only cones and where vision is most acute. + + + Map-view + A diagrammatic representation of an area of land or sea showing physical features, cities, roads. + + Aerial-view + Elevated view of an object from above, with a perspective as though the observer were a bird. + + + Satellite-view + A representation as captured by technology such as a satellite. + + + Street-view + A 360-degrees panoramic view from a position on the ground. + + + + Peripheral-view + Indirect vision as it occurs outside the point of fixation. + + + + + + Task-property + Something that pertains to a task. + + extensionAllowed + + + Task-action-type + How an agent action should be interpreted in terms of the task specification. + + Appropriate-action + An action suitable or proper in the circumstances. + + relatedTag + Inappropriate-action + + + + Correct-action + An action that was a correct response in the context of the task. + + relatedTag + Incorrect-action + Indeterminate-action + + + + Correction + An action offering an improvement to replace a mistake or error. + + + Done-indication + An action that indicates that the participant has completed this step in the task. + + relatedTag + Ready-indication + + + + Imagined-action + Form a mental image or concept of something. This is used to identity something that only happened in the imagination of the participant as in imagined movements in motor imagery paradigms. + + + Inappropriate-action + An action not in keeping with what is correct or proper for the task. + + relatedTag + Appropriate-action + + + + Incorrect-action + An action considered wrong or incorrect in the context of the task. + + relatedTag + Correct-action + Indeterminate-action + + + + Indeterminate-action + An action that cannot be distinguished between two or more possibibities in the current context. This tag might be applied when an outside evaluator or a classification algorithm cannot determine a definitive result. + + relatedTag + Correct-action + Incorrect-action + Miss + Near-miss + + + + Miss + An action considered to be a failure in the context of the task. For example, if the agent is supposed to try to hit a target and misses. + + relatedTag + Near-miss + + + + Near-miss + An action barely satisfied the requirements of the task. In a driving experiment for example this could pertain to a narrowly avoided collision or other accident. + + relatedTag + Miss + + + + Omitted-action + An expected response was skipped. + + + Ready-indication + An action that indicates that the participant is ready to perform the next step in the task. + + relatedTag + Done-indication + + + + + Task-attentional-demand + Strategy for allocating attention toward goal-relevant information. + + Bottom-up-attention + Attentional guidance purely by externally driven factors to stimuli that are salient because of their inherent properties relative to the background. Sometimes this is referred to as stimulus driven. + + relatedTag + Top-down-attention + + + + Covert-attention + Paying attention without moving the eyes. + + relatedTag + Overt-attention + + + + Divided-attention + Integrating parallel multiple stimuli. Behavior involving responding simultaneously to multiple tasks or multiple task demands. + + relatedTag + Focused-attention + + + + Focused-attention + Responding discretely to specific visual, auditory, or tactile stimuli. + + relatedTag + Divided-attention + + + + Orienting-attention + Directing attention to a target stimulus. + + + Overt-attention + Selectively processing one location over others by moving the eyes to point at that location. + + relatedTag + Covert-attention + + + + Selective-attention + Maintaining a behavioral or cognitive set in the face of distracting or competing stimuli. Ability to pay attention to a limited array of all available sensory information. + + + Sustained-attention + Maintaining a consistent behavioral response during continuous and repetitive activity. + + + Switched-attention + Having to switch attention between two or more modalities of presentation. + + + Top-down-attention + Voluntary allocation of attention to certain features. Sometimes this is referred to goal-oriented attention. + + relatedTag + Bottom-up-attention + + + + + Task-effect-evidence + The evidence supporting the conclusion that the event had the specified effect. + + Behavioral-evidence + An indication or conclusion based on the behavior of an agent. + + + Computational-evidence + A type of evidence in which data are produced, and/or generated, and/or analyzed on a computer. + + + External-evidence + A phenomenon that follows and is caused by some previous phenomenon. + + + Intended-effect + A phenomenon that is intended to follow and be caused by some previous phenomenon. + + + + Task-event-role + The purpose of an event with respect to the task. + + Experimental-stimulus + Part of something designed to elicit a response in the experiment. + + + Incidental + A sensory or other type of event that is unrelated to the task or experiment. + + + Instructional + Usually associated with a sensory event intended to give instructions to the participant about the task or behavior. + + + Mishap + Unplanned disruption such as an equipment or experiment control abnormality or experimenter error. + + + Participant-response + Something related to a participant actions in performing the task. + + + Task-activity + Something that is part of the overall task or is necessary to the overall experiment but is not directly part of a stimulus-response cycle. Examples would be taking a survey or provided providing a silva sample. + + + Warning + Something that should warn the participant that the parameters of the task have been or are about to be exceeded such as a warning message about getting too close to the shoulder of the road in a driving task. + + + + Task-relationship + Specifying organizational importance of sub-tasks. + + Background-subtask + A part of the task which should be performed in the background as for example inhibiting blinks due to instruction while performing the primary task. + + + Primary-subtask + A part of the task which should be the primary focus of the participant. + + + + Task-stimulus-role + The role the stimulus plays in the task. + + Cue + A signal for an action, a pattern of stimuli indicating a particular response. + + + Distractor + A person or thing that distracts or a plausible but incorrect option in a multiple-choice question. In pyschological studies this is sometimes referred to as a foil. + + + Expected + Considered likely, probable or anticipated. Something of low information value as in frequent non-targets in an RSVP paradigm. + + relatedTag + Unexpected + + + suggestedTag + Target + + + + Extraneous + Irrelevant or unrelated to the subject being dealt with. + + + Feedback + An evaluative response to an inquiry, process, event, or activity. + + + Go-signal + An indicator to proceed with a planned action. + + relatedTag + Stop-signal + + + + Meaningful + Conveying significant or relevant information. + + + Newly-learned + Representing recently acquired information or understanding. + + + Non-informative + Something that is not useful in forming an opinion or judging an outcome. + + + Non-target + Something other than that done or looked for. Also tag Expected if the Non-target is frequent. + + relatedTag + Target + + + + Not-meaningful + Not having a serious, important, or useful quality or purpose. + + + Novel + Having no previous example or precedent or parallel. + + + Oddball + Something unusual, or infrequent. + + relatedTag + Unexpected + + + suggestedTag + Target + + + + Penalty + A disadvantage, loss, or hardship due to some action. + + + Planned + Something that was decided on or arranged in advance. + + relatedTag + Unplanned + + + + Priming + An implicit memory effect in which exposure to a stimulus influences response to a later stimulus. + + + Query + A sentence of inquiry that asks for a reply. + + + Reward + A positive reinforcement for a desired action, behavior or response. + + + Stop-signal + An indicator that the agent should stop the current activity. + + relatedTag + Go-signal + + + + Target + Something fixed as a goal, destination, or point of examination. + + + Threat + An indicator that signifies hostility and predicts an increased probability of attack. + + + Timed + Something planned or scheduled to be done at a particular time or lasting for a specified amount of time. + + + Unexpected + Something that is not anticipated. + + relatedTag + Expected + + + + Unplanned + Something that has not been planned as part of the task. + + relatedTag + Planned + + + + + + + Relation + Concerns the way in which two or more people or things are connected. + + extensionAllowed + + + Comparative-relation + Something considered in comparison to something else. The first entity is the focus. + + Approximately-equal-to + (A, (Approximately-equal-to, B)) indicates that A and B have almost the same value. Here A and B could refer to sizes, orders, positions or other quantities. + + + Equal-to + (A, (Equal-to, B)) indicates that the size or order of A is the same as that of B. + + + Greater-than + (A, (Greater-than, B)) indicates that the relative size or order of A is bigger than that of B. + + + Greater-than-or-equal-to + (A, (Greater-than-or-equal-to, B)) indicates that the relative size or order of A is bigger than or the same as that of B. + + + Less-than + (A, (Less-than, B)) indicates that A is smaller than B. Here A and B could refer to sizes, orders, positions or other quantities. + + + Less-than-or-equal-to + (A, (Less-than-or-equal-to, B)) indicates that the relative size or order of A is smaller than or equal to B. + + + Not-equal-to + (A, (Not-equal-to, B)) indicates that the size or order of A is not the same as that of B. + + + + Connective-relation + Indicates two entities are related in some way. The first entity is the focus. + + Belongs-to + (A, (Belongs-to, B)) indicates that A is a member of B. + + + Connected-to + (A, (Connected-to, B)) indicates that A is related to B in some respect, usually through a direct link. + + + Contained-in + (A, (Contained-in, B)) indicates that A is completely inside of B. + + + Described-by + (A, (Described-by, B)) indicates that B provides information about A. + + + From-to + (A, (From-to, B)) indicates a directional relation from A to B. A is considered the source. + + + Group-of + (A, (Group-of, B)) indicates A is a group of items of type B. + + + Implied-by + (A, (Implied-by, B)) indicates B is suggested by A. + + + Includes + (A, (Includes, B)) indicates that A has B as a member or part. + + + Interacts-with + (A, (Interacts-with, B)) indicates A and B interact, possibly reciprocally. + + + Member-of + (A, (Member-of, B)) indicates A is a member of group B. + + + Part-of + (A, (Part-of, B)) indicates A is a part of the whole B. + + + Performed-by + (A, (Performed-by, B)) indicates that the action or procedure A was carried out by agent B. + + + Performed-using + (A, (Performed-using, B)) indicates that the action or procedure A was accomplished using B. + + + Related-to + (A, (Related-to, B)) indicates A has some relationship to B. + + + Unrelated-to + (A, (Unrelated-to, B)) indicates that A is not related to B. For example, A is not related to Task. + + + + Directional-relation + A relationship indicating direction of change of one entity relative to another. The first entity is the focus. + + Away-from + (A, (Away-from, B)) indicates that A is going or has moved away from B. The meaning depends on A and B. + + + Towards + (A, (Towards, B)) indicates that A is going to or has moved to B. The meaning depends on A and B. + + + + Logical-relation + Indicating a logical relationship between entities. The first entity is usually the focus. + + And + (A, (And, B)) means A and B are both in effect. + + + Or + (A, (Or, B)) means at least one of A and B are in effect. + + + + Spatial-relation + Indicating a relationship about position between entities. + + Above + (A, (Above, B)) means A is in a place or position that is higher than B. + + + Across-from + (A, (Across-from, B)) means A is on the opposite side of something from B. + + + Adjacent-to + (A, (Adjacent-to, B)) indicates that A is next to B in time or space. + + + Ahead-of + (A, (Ahead-of, B)) indicates that A is further forward in time or space in B. + + + Around + (A, (Around, B)) means A is in or near the present place or situation of B. + + + Behind + (A, (Behind, B)) means A is at or to the far side of B, typically so as to be hidden by it. + + + Below + (A, (Below, B)) means A is in a place or position that is lower than the position of B. + + + Between + (A, (Between, (B, C))) means A is in the space or interval separating B and C. + + + Bilateral-to + (A, (Bilateral, B)) means A is on both sides of B or affects both sides of B. + + + Bottom-edge-of + (A, (Bottom-edge-of, B)) means A is on the bottom most part or or near the boundary of B. + + relatedTag + Left-edge-of + Right-edge-of + Top-edge-of + + + + Boundary-of + (A, (Boundary-of, B)) means A is on or part of the edge or boundary of B. + + + Center-of + (A, (Center-of, B)) means A is at a point or or in an area that is approximately central within B. + + + Close-to + (A, (Close-to, B)) means A is at a small distance from or is located near in space to B. + + + Far-from + (A, (Far-from, B)) means A is at a large distance from or is not located near in space to B. + + + In-front-of + (A, (In-front-of, B)) means A is in a position just ahead or at the front part of B, potentially partially blocking B from view. + + + Left-edge-of + (A, (Left-edge-of, B)) means A is located on the left side of B on or near the boundary of B. + + relatedTag + Bottom-edge-of + Right-edge-of + Top-edge-of + + + + Left-side-of + (A, (Left-side-of, B)) means A is located on the left side of B usually as part of B. + + relatedTag + Right-side-of + + + + Lower-center-of + (A, (Lower-center-of, B)) means A is situated on the lower center part of B (due south). This relation is often used to specify qualitative information about screen position. + + relatedTag + Center-of + Lower-left-of + Lower-right-of + Upper-center-of + Upper-right-of + + + + Lower-left-of + (A, (Lower-left-of, B)) means A is situated on the lower left part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Center-of + Lower-center-of + Lower-right-of + Upper-center-of + Upper-left-of + Upper-right-of + + + + Lower-right-of + (A, (Lower-right-of, B)) means A is situated on the lower right part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Center-of + Lower-center-of + Lower-left-of + Upper-left-of + Upper-center-of + Upper-left-of + Lower-right-of + + + + Outside-of + (A, (Outside-of, B)) means A is located in the space around but not including B. + + + Over + (A, (Over, B)) means A above is above B so as to cover or protect or A extends over the a general area as from a from a vantage point. + + + Right-edge-of + (A, (Right-edge-of, B)) means A is located on the right side of B on or near the boundary of B. + + relatedTag + Bottom-edge-of + Left-edge-of + Top-edge-of + + + + Right-side-of + (A, (Right-side-of, B)) means A is located on the right side of B usually as part of B. + + relatedTag + Left-side-of + + + + To-left-of + (A, (To-left-of, B)) means A is located on or directed toward the side to the west of B when B is facing north. This term is used when A is not part of B. + + + To-right-of + (A, (To-right-of, B)) means A is located on or directed toward the side to the east of B when B is facing north. This term is used when A is not part of B. + + + Top-edge-of + (A, (Top-edge-of, B)) means A is on the uppermost part or or near the boundary of B. + + relatedTag + Left-edge-of + Right-edge-of + Bottom-edge-of + + + + Top-of + (A, (Top-of, B)) means A is on the uppermost part, side, or surface of B. + + + Underneath + (A, (Underneath, B)) means A is situated directly below and may be concealed by B. + + + Upper-center-of + (A, (Upper-center-of, B)) means A is situated on the upper center part of B (due north). This relation is often used to specify qualitative information about screen position. + + relatedTag + Center-of + Lower-center-of + Lower-left-of + Lower-right-of + Upper-center-of + Upper-right-of + + + + Upper-left-of + (A, (Upper-left-of, B)) means A is situated on the upper left part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Center-of + Lower-center-of + Lower-left-of + Lower-right-of + Upper-center-of + Upper-right-of + + + + Upper-right-of + (A, (Upper-right-of, B)) means A is situated on the upper right part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Center-of + Lower-center-of + Lower-left-of + Upper-left-of + Upper-center-of + Lower-right-of + + + + Within + (A, (Within, B)) means A is on the inside of or contained in B. + + + + Temporal-relation + A relationship that includes a temporal or time-based component. + + After + (A, (After B)) means A happens at a time subsequent to a reference time related to B. + + + Asynchronous-with + (A, (Asynchronous-with, B)) means A happens at times not occurring at the same time or having the same period or phase as B. + + + Before + (A, (Before B)) means A happens at a time earlier in time or order than B. + + + During + (A, (During, B)) means A happens at some point in a given period of time in which B is ongoing. + + + Synchronous-with + (A, (Synchronous-with, B)) means A happens at occurs at the same time or rate as B. + + + Waiting-for + (A, (Waiting-for, B)) means A pauses for something to happen in B. + + + + + + + accelerationUnits + + defaultUnits + m-per-s^2 + + + m-per-s^2 + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + + angleUnits + + defaultUnits + radian + + + radian + + SIUnit + + + conversionFactor + 1.0 + + + + rad + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + degree + + conversionFactor + 0.0174533 + + + + + areaUnits + + defaultUnits + m^2 + + + m^2 + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + + currencyUnits + Units indicating the worth of something. + + defaultUnits + $ + + + dollar + + conversionFactor + 1.0 + + + + $ + + unitPrefix + + + unitSymbol + + + conversionFactor + 1.0 + + + + euro + + + point + + + + electricPotentialUnits + + defaultUnits + uv + + + v + + SIUnit + + + unitSymbol + + + conversionFactor + 0.000001 + + + + Volt + + SIUnit + + + conversionFactor + 0.000001 + + + + + frequencyUnits + + defaultUnits + Hz + + + hertz + + SIUnit + + + conversionFactor + 1.0 + + + + Hz + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + + intensityUnits + + defaultUnits + dB + + + dB + Intensity expressed as ratio to a threshold. May be used for sound intensity. + + unitSymbol + + + conversionFactor + 1.0 + + + + candela + Units used to express light intensity. + + SIUnit + + + + cd + Units used to express light intensity. + + SIUnit + + + unitSymbol + + + + + jerkUnits + + defaultUnits + m-per-s^3 + + + m-per-s^3 + + unitSymbol + + + conversionFactor + 1.0 + + + + + magneticFieldUnits + Units used to magnetic field intensity. + + defaultUnits + fT + + + tesla + + SIUnit + + + conversionFactor + 10^-15 + + + + T + + SIUnit + + + unitSymbol + + + conversionFactor + 10^-15 + + + + + memorySizeUnits + + defaultUnits + B + + + byte + + SIUnit + + + conversionFactor + 1.0 + + + + B + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + + physicalLengthUnits + + defaultUnits + m + + + foot + + conversionFactor + 0.3048 + + + + inch + + conversionFactor + 0.0254 + + + + meter + + SIUnit + + + conversionFactor + 1.0 + + + + metre + + SIUnit + + + conversionFactor + 1.0 + + + + m + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + mile + + conversionFactor + 1609.34 + + + + + speedUnits + + defaultUnits + m-per-s + + + m-per-s + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + mph + + unitSymbol + + + conversionFactor + 0.44704 + + + + kph + + unitSymbol + + + conversionFactor + 0.277778 + + + + + temperatureUnits + + degree Celsius + + SIUnit + + + conversionFactor + 1.0 + + + + oC + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + + timeUnits + + defaultUnits + s + + + second + + SIUnit + + + conversionFactor + 1.0 + + + + s + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + day + + conversionFactor + 86400 + + + + minute + + conversionFactor + 60 + + + + hour + Should be in 24-hour format. + + conversionFactor + 3600 + + + + + volumeUnits + + defaultUnits + m^3 + + + m^3 + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + + weightUnits + + defaultUnits + g + + + g + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + gram + + SIUnit + + + conversionFactor + 1.0 + + + + pound + + conversionFactor + 453.592 + + + + lb + + conversionFactor + 453.592 + + + + + + + deca + SI unit multiple representing 10^1. + + SIUnitModifier + + + conversionFactor + 10.0 + + + + da + SI unit multiple representing 10^1. + + SIUnitSymbolModifier + + + conversionFactor + 10.0 + + + + hecto + SI unit multiple representing 10^2. + + SIUnitModifier + + + conversionFactor + 100.0 + + + + h + SI unit multiple representing 10^2. + + SIUnitSymbolModifier + + + conversionFactor + 100.0 + + + + kilo + SI unit multiple representing 10^3. + + SIUnitModifier + + + conversionFactor + 1000.0 + + + + k + SI unit multiple representing 10^3. + + SIUnitSymbolModifier + + + conversionFactor + 1000.0 + + + + mega + SI unit multiple representing 10^6. + + SIUnitModifier + + + conversionFactor + 10^6 + + + + M + SI unit multiple representing 10^6. + + SIUnitSymbolModifier + + + conversionFactor + 10^6 + + + + giga + SI unit multiple representing 10^9. + + SIUnitModifier + + + conversionFactor + 10^9 + + + + G + SI unit multiple representing 10^9. + + SIUnitSymbolModifier + + + conversionFactor + 10^9 + + + + tera + SI unit multiple representing 10^12. + + SIUnitModifier + + + conversionFactor + 10^12 + + + + T + SI unit multiple representing 10^12. + + SIUnitSymbolModifier + + + conversionFactor + 10^12 + + + + peta + SI unit multiple representing 10^15. + + SIUnitModifier + + + conversionFactor + 10^15 + + + + P + SI unit multiple representing 10^15. + + SIUnitSymbolModifier + + + conversionFactor + 10^15 + + + + exa + SI unit multiple representing 10^18. + + SIUnitModifier + + + conversionFactor + 10^18 + + + + E + SI unit multiple representing 10^18. + + SIUnitSymbolModifier + + + conversionFactor + 10^18 + + + + zetta + SI unit multiple representing 10^21. + + SIUnitModifier + + + conversionFactor + 10^21 + + + + Z + SI unit multiple representing 10^21. + + SIUnitSymbolModifier + + + conversionFactor + 10^21 + + + + yotta + SI unit multiple representing 10^24. + + SIUnitModifier + + + conversionFactor + 10^24 + + + + Y + SI unit multiple representing 10^24. + + SIUnitSymbolModifier + + + conversionFactor + 10^24 + + + + deci + SI unit submultiple representing 10^-1. + + SIUnitModifier + + + conversionFactor + 0.1 + + + + d + SI unit submultiple representing 10^-1. + + SIUnitSymbolModifier + + + conversionFactor + 0.1 + + + + centi + SI unit submultiple representing 10^-2. + + SIUnitModifier + + + conversionFactor + 0.01 + + + + c + SI unit submultiple representing 10^-2. + + SIUnitSymbolModifier + + + conversionFactor + 0.01 + + + + milli + SI unit submultiple representing 10^-3. + + SIUnitModifier + + + conversionFactor + 0.001 + + + + m + SI unit submultiple representing 10^-3. + + SIUnitSymbolModifier + + + conversionFactor + 0.001 + + + + micro + SI unit submultiple representing 10^-6. + + SIUnitModifier + + + conversionFactor + 10^-6 + + + + u + SI unit submultiple representing 10^-6. + + SIUnitSymbolModifier + + + conversionFactor + 10^-6 + + + + nano + SI unit submultiple representing 10^-9. + + SIUnitModifier + + + conversionFactor + 10^-9 + + + + n + SI unit submultiple representing 10^-9. + + SIUnitSymbolModifier + + + conversionFactor + 10^-9 + + + + pico + SI unit submultiple representing 10^-12. + + SIUnitModifier + + + conversionFactor + 10^-12 + + + + p + SI unit submultiple representing 10^-12. + + SIUnitSymbolModifier + + + conversionFactor + 10^-12 + + + + femto + SI unit submultiple representing 10^-15. + + SIUnitModifier + + + conversionFactor + 10^-15 + + + + f + SI unit submultiple representing 10^-15. + + SIUnitSymbolModifier + + + conversionFactor + 10^-15 + + + + atto + SI unit submultiple representing 10^-18. + + SIUnitModifier + + + conversionFactor + 10^-18 + + + + a + SI unit submultiple representing 10^-18. + + SIUnitSymbolModifier + + + conversionFactor + 10^-18 + + + + zepto + SI unit submultiple representing 10^-21. + + SIUnitModifier + + + conversionFactor + 10^-21 + + + + z + SI unit submultiple representing 10^-21. + + SIUnitSymbolModifier + + + conversionFactor + 10^-21 + + + + yocto + SI unit submultiple representing 10^-24. + + SIUnitModifier + + + conversionFactor + 10^-24 + + + + y + SI unit submultiple representing 10^-24. + + SIUnitSymbolModifier + + + conversionFactor + 10^-24 + + + + + + dateTimeClass + Date-times should conform to ISO8601 date-time format YYYY-MM-DDThh:mm:ss. Any variation on the full form is allowed. + + allowedCharacter + digits + T + - + : + + + + nameClass + Value class designating values that have the characteristics of node names. The allowed characters are alphanumeric, hyphen, and underbar. + + allowedCharacter + letters + digits + _ + - + + + + numericClass + Value must be a valid numerical value. + + allowedCharacter + digits + E + e + + + - + . + + + + posixPath + Posix path specification. + + allowedCharacter + digits + letters + / + : + + + + textClass + Value class designating values that have the characteristics of text such as in descriptions. + + allowedCharacter + letters + digits + blank + + + - + : + ; + . + / + ( + ) + ? + * + % + $ + @ + + + + + + allowedCharacter + A schema attribute of value classes specifying a special character that is allowed in expressing the value of a placeholder. Normally the allowed characters are listed individually. However, the word letters designates the upper and lower case alphabetic characters and the word digits designates the digits 0-9. The word blank designates the blank character. + + valueClassProperty + + + + conversionFactor + The multiplicative factor to multiply these units to convert to default units. + + unitProperty + + + unitModifierProperty + + + + deprecatedFrom + Indicates that this element is deprecated. The value of the attribute is the latest schema version in which the element appeared in undeprecated form. + + elementProperty + + + + defaultUnits + A schema attribute of unit classes specifying the default units to use if the placeholder has a unit class but the substituted value has no units. + + unitClassProperty + + + + extensionAllowed + A schema attribute indicating that users can add unlimited levels of child nodes under this tag. This tag is propagated to child nodes with the exception of the hashtag placeholders. + + boolProperty + + + nodeProperty + + + isInheritedProperty + + + + inLibrary + Indicates this schema element came from the named library schema, not the standard schema. This attribute is added by tools when a library schema is merged into its partnered standard schema. + + elementProperty + + + + recommended + A schema attribute indicating that the event-level HED string should include this tag. + + boolProperty + + + nodeProperty + + + + relatedTag + A schema attribute suggesting HED tags that are closely related to this tag. This attribute is used by tagging tools. + + nodeProperty + + + isInheritedProperty + + + + requireChild + A schema attribute indicating that one of the node elements descendants must be included when using this tag. + + boolProperty + + + nodeProperty + + + + required + A schema attribute indicating that every event-level HED string should include this tag. + + boolProperty + + + nodeProperty + + + + reserved + A schema attribute indicating that this tag has special meaning and requires special handling by tools. + + boolProperty + + + nodeProperty + + + + rooted + Indicates a top-level library schema node is identical to a node of the same name in the partnered standard schema. This attribute can only appear in nodes that have the inLibrary schema attribute. + + nodeProperty + + + + SIUnit + A schema attribute indicating that this unit element is an SI unit and can be modified by multiple and submultiple names. Note that some units such as byte are designated as SI units although they are not part of the standard. + + boolProperty + + + unitProperty + + + + SIUnitModifier + A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a base unit rather than a unit symbol. + + boolProperty + + + unitModifierProperty + + + + SIUnitSymbolModifier + A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a unit symbol rather than a base symbol. + + boolProperty + + + unitModifierProperty + + + + suggestedTag + A schema attribute that indicates another tag that is often associated with this tag. This attribute is used by tagging tools to provide tagging suggestions. + + nodeProperty + + + isInheritedProperty + + + + tagGroup + A schema attribute indicating the tag can only appear inside a tag group. + + boolProperty + + + nodeProperty + + + + takesValue + A schema attribute indicating the tag is a hashtag placeholder that is expected to be replaced with a user-defined value. + + boolProperty + + + nodeProperty + + + + topLevelTagGroup + A schema attribute indicating that this tag (or its descendants) can only appear in a top-level tag group. A tag group can have at most one tag with this attribute. + + boolProperty + + + nodeProperty + + + + unique + A schema attribute indicating that only one of this tag or its descendants can be used in the event-level HED string. + + boolProperty + + + nodeProperty + + + + unitClass + A schema attribute specifying which unit class this value tag belongs to. + + nodeProperty + + + + unitPrefix + A schema attribute applied specifically to unit elements to designate that the unit indicator is a prefix (e.g., dollar sign in the currency units). + + boolProperty + + + unitProperty + + + + unitSymbol + A schema attribute indicating this tag is an abbreviation or symbol representing a type of unit. Unit symbols represent both the singular and the plural and thus cannot be pluralized. + + boolProperty + + + unitProperty + + + + valueClass + A schema attribute specifying which value class this value tag belongs to. + + nodeProperty + + + + + + boolProperty + Indicates that the schema attribute represents something that is either true or false and does not have a value. Attributes without this value are assumed to have string values. + + + elementProperty + Indicates this schema attribute can apply to any type of element(tag term, unit class, etc). + + + isInheritedProperty + Indicates that this attribute is inherited by child nodes. This property only applies to schema attributes for nodes. + + + nodeProperty + Indicates this schema attribute applies to node (tag-term) elements. This was added to allow for an attribute to apply to multiple elements. + + + unitClassProperty + Indicates that the schema attribute is meant to be applied to unit classes. + + + unitModifierProperty + Indicates that the schema attribute is meant to be applied to unit modifier classes. + + + unitProperty + Indicates that the schema attribute is meant to be applied to units within a unit class. + + + valueClassProperty + Indicates that the schema attribute is meant to be applied to value classes. + + + diff --git a/tests/errors/test_error_reporter.py b/tests/errors/test_error_reporter.py index ba8de3fa5..28daa1213 100644 --- a/tests/errors/test_error_reporter.py +++ b/tests/errors/test_error_reporter.py @@ -1,200 +1,205 @@ -import unittest -from hed.errors import ErrorHandler, ErrorContext, ErrorSeverity, ValidationErrors, SchemaWarnings, \ - get_printable_issue_string, sort_issues, replace_tag_references -from hed.errors.error_reporter import hed_tag_error, get_printable_issue_string_html -from hed import HedString -from hed import load_schema_version - - -class Test(unittest.TestCase): - @classmethod - def setUpClass(cls): - cls.error_handler = ErrorHandler() - cls._schema = load_schema_version("8.3.0") - pass - - def test_push_error_context(self): - error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") - self.assertTrue(len(error_list) == 1) - name = "DummyFileName.txt" - self.error_handler.push_error_context(ErrorContext.FILE_NAME, name) - error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") - self.assertTrue(name in error_list[0][ErrorContext.FILE_NAME]) - column_name = "DummyColumnName" - self.error_handler.push_error_context(ErrorContext.SIDECAR_COLUMN_NAME, column_name) - error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") - self.assertTrue(column_name in error_list[0][ErrorContext.SIDECAR_COLUMN_NAME]) - self.error_handler.reset_error_context() - self.error_handler.push_error_context(ErrorContext.FILE_NAME, name) - self.error_handler.push_error_context(ErrorContext.SIDECAR_COLUMN_NAME, column_name) - self.error_handler.push_error_context(ErrorContext.COLUMN, column_name) - error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") - self.assertTrue(name in error_list[0][ErrorContext.FILE_NAME]) - self.assertTrue(column_name in error_list[0][ErrorContext.SIDECAR_COLUMN_NAME]) - self.assertTrue(column_name == error_list[0][ErrorContext.COLUMN]) - self.assertTrue(len(error_list) == 1) - self.error_handler.reset_error_context() - self.error_handler.push_error_context(ErrorContext.ROW, None) - self.assertTrue(self.error_handler.error_context[0][1] == 0) - self.error_handler.reset_error_context() - - def test_pop_error_context(self): - error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") - self.assertTrue(len(error_list) == 1) - name = "DummyFileName.txt" - self.error_handler.push_error_context(ErrorContext.FILE_NAME, name) - error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") - self.assertTrue(len(error_list) == 1) - self.assertTrue(name in error_list[0][ErrorContext.FILE_NAME]) - self.error_handler.pop_error_context() - error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") - self.assertTrue(len(error_list) == 1) - column_name = "DummyColumnName" - self.error_handler.push_error_context(ErrorContext.SIDECAR_COLUMN_NAME, column_name) - error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") - self.assertTrue(len(error_list) == 1) - self.error_handler.push_error_context(ErrorContext.FILE_NAME, name) - self.error_handler.push_error_context(ErrorContext.SIDECAR_COLUMN_NAME, column_name) - self.error_handler.push_error_context(ErrorContext.COLUMN, column_name) - error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") - self.assertTrue(len(error_list) == 1) - self.assertTrue(name in error_list[0][ErrorContext.FILE_NAME]) - self.assertTrue(column_name in error_list[0][ErrorContext.SIDECAR_COLUMN_NAME]) - self.assertTrue(column_name == error_list[0][ErrorContext.COLUMN]) - self.error_handler.pop_error_context() - self.error_handler.pop_error_context() - self.error_handler.pop_error_context() - error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") - self.assertTrue(len(error_list) == 1) - self.assertTrue(ErrorContext.COLUMN not in error_list[0]) - self.error_handler.pop_error_context() - error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") - self.assertTrue(len(error_list) == 1) - self.error_handler.reset_error_context() - - def test_filter_issues_by_severity(self): - error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") - error_list += self.error_handler.format_error_with_context(SchemaWarnings.SCHEMA_INVALID_CAPITALIZATION, - "dummy", problem_char="#", char_index=0) - self.assertTrue(len(error_list) == 2) - filtered_list = self.error_handler.filter_issues_by_severity(issues_list=error_list, - severity=ErrorSeverity.ERROR) - self.assertTrue(len(filtered_list) == 1) - - def test_printable_issue_string(self): - self.error_handler.push_error_context(ErrorContext.CUSTOM_TITLE, "Default Custom Title") - error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") - error_list += self.error_handler.format_error_with_context(SchemaWarnings.SCHEMA_INVALID_CAPITALIZATION, - "dummy", problem_char="#", char_index=0) - - printable_issues = get_printable_issue_string(error_list) - self.assertTrue(len(printable_issues) > 10) - - printable_issues2 = get_printable_issue_string(error_list, severity=ErrorSeverity.ERROR) - self.assertTrue(len(printable_issues) > len(printable_issues2)) - - printable_issues3 = get_printable_issue_string(error_list, severity=ErrorSeverity.ERROR, - title="Later added custom title that is longer") - self.assertTrue(len(printable_issues3) > len(printable_issues2)) - - self.error_handler.reset_error_context() - - def test_printable_issue_string_with_filenames(self): - myfile = 'my_file.txt' - self.error_handler.push_error_context(ErrorContext.CUSTOM_TITLE, "Default Custom Title") - self.error_handler.push_error_context(ErrorContext.FILE_NAME, myfile) - error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") - error_list += self.error_handler.format_error_with_context(SchemaWarnings.SCHEMA_INVALID_CAPITALIZATION, - "dummy", problem_char="#", char_index=0) - - printable_issues = get_printable_issue_string(error_list, skip_filename=False) - self.assertTrue(len(printable_issues) > 10) - self.assertEqual(printable_issues.count(myfile), 1) - - printable_issues2 = get_printable_issue_string(error_list, severity=ErrorSeverity.ERROR, skip_filename=False) - self.assertTrue(len(printable_issues) > len(printable_issues2)) - self.assertEqual(printable_issues2.count(myfile), 1) - printable_issues3 = get_printable_issue_string(error_list, severity=ErrorSeverity.ERROR, skip_filename=False, - title="Later added custom title that is longer") - self.assertTrue(len(printable_issues3) > len(printable_issues2)) - self.assertEqual(printable_issues3.count(myfile), 1) - - printable_issues = get_printable_issue_string_html(error_list, skip_filename=False) - self.assertTrue(len(printable_issues) > 10) - self.assertEqual(printable_issues.count(myfile), 1) - - printable_issues2 = get_printable_issue_string_html(error_list, severity=ErrorSeverity.ERROR, skip_filename=False) - self.assertTrue(len(printable_issues) > len(printable_issues2)) - self.assertEqual(printable_issues2.count(myfile), 1) - printable_issues3 = get_printable_issue_string_html(error_list, severity=ErrorSeverity.ERROR, skip_filename=False, - title="Later added custom title that is longer") - self.assertTrue(len(printable_issues3) > len(printable_issues2)) - self.assertEqual(printable_issues3.count(myfile), 1) - - self.error_handler.reset_error_context() - - def test_sort_issues(self): - schema = load_schema_version("8.1.0") - issues = [ - {ErrorContext.CUSTOM_TITLE: 'issue3', ErrorContext.FILE_NAME: 'File2', ErrorContext.ROW: 5, - ErrorContext.HED_STRING: HedString('Test C', schema)}, - {ErrorContext.CUSTOM_TITLE: 'issue1', ErrorContext.FILE_NAME: 'File1', ErrorContext.ROW: 10, - ErrorContext.HED_STRING: HedString('Test A', schema)}, - {ErrorContext.CUSTOM_TITLE: 'issue2', ErrorContext.FILE_NAME: 'File1', ErrorContext.ROW: 2}, - {ErrorContext.CUSTOM_TITLE: 'issue4', ErrorContext.FILE_NAME: 'File2', ErrorContext.ROW: 1, - ErrorContext.HED_STRING: HedString('Test D', schema)}, - {ErrorContext.CUSTOM_TITLE: 'issue5', ErrorContext.FILE_NAME: 'File3', ErrorContext.ROW: 15} - ] - - sorted_issues = sort_issues(issues) - self.assertEqual(sorted_issues[0][ErrorContext.CUSTOM_TITLE], 'issue1') - self.assertEqual(sorted_issues[1][ErrorContext.CUSTOM_TITLE], 'issue2') - self.assertEqual(sorted_issues[2][ErrorContext.CUSTOM_TITLE], 'issue3') - self.assertEqual(sorted_issues[3][ErrorContext.CUSTOM_TITLE], 'issue4') - self.assertEqual(sorted_issues[4][ErrorContext.CUSTOM_TITLE], 'issue5') - - reversed_issues = sort_issues(issues, reverse=True) - self.assertEqual(reversed_issues[0][ErrorContext.CUSTOM_TITLE], 'issue5') - self.assertEqual(reversed_issues[1][ErrorContext.CUSTOM_TITLE], 'issue4') - self.assertEqual(reversed_issues[2][ErrorContext.CUSTOM_TITLE], 'issue3') - self.assertEqual(reversed_issues[3][ErrorContext.CUSTOM_TITLE], 'issue2') - self.assertEqual(reversed_issues[4][ErrorContext.CUSTOM_TITLE], 'issue1') - - - def test_replace_tag_references(self): - # Test with mixed data types and HedString in a nested dict - nested_dict = {'a': HedString('Hed1', self._schema), 'b': {'c': 2, 'd': [3, {'e': HedString('Hed2', self._schema)}]}, 'f': [5, 6]} - replace_tag_references(nested_dict) - self.assertEqual(nested_dict, {'a': 'Hed1', 'b': {'c': 2, 'd': [3, {'e': 'Hed2'}]}, 'f': [5, 6]}) - - # Test with mixed data types and HedString in a nested list - nested_list = [HedString('Hed1', self._schema), {'a': 2, 'b': [3, {'c': HedString('Hed2', self._schema)}]}] - replace_tag_references(nested_list) - self.assertEqual(nested_list, ['Hed1', {'a': 2, 'b': [3, {'c': 'Hed2'}]}]) - - # Test with mixed data types and HedString in a list within a dict - mixed = {'a': HedString('Hed1', self._schema), 'b': [2, 3, {'c': HedString('Hed2', self._schema)}, 4]} - replace_tag_references(mixed) - self.assertEqual(mixed, {'a': 'Hed1', 'b': [2, 3, {'c': 'Hed2'}, 4]}) - - - def test_register_error_twice(self): - test_code = "test_error_code" - @hed_tag_error(test_code) - def test_error_code(tag): - pass - - with self.assertRaises(KeyError): - @hed_tag_error(test_code) - def test_error_code(tag): - pass - - def test_format_unknown_error(self): - error_code = "Unknown error type" - error_list = self.error_handler.format_error(error_code, "param1", param2=0) - self.assertEqual(error_list[0]['code'], error_code) - - actual_code = "Actual unknown error type" - error_list = self.error_handler.format_error_from_context(error_code, self.error_handler.error_context, "param1", param2=0, - actual_error=actual_code) - self.assertEqual(error_list[0]['code'], actual_code) +import unittest +from hed.errors import ErrorHandler, ErrorContext, ErrorSeverity, ValidationErrors, SchemaWarnings, \ + get_printable_issue_string, sort_issues, replace_tag_references +from hed.errors.error_reporter import hed_tag_error, get_printable_issue_string_html +from hed import HedString +from hed import load_schema_version + + +class Test(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.error_handler = ErrorHandler() + cls._schema = load_schema_version("8.3.0") + pass + + def test_push_error_context(self): + error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") + self.assertTrue(len(error_list) == 1) + name = "DummyFileName.txt" + self.error_handler.push_error_context(ErrorContext.FILE_NAME, name) + error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") + self.assertTrue(name in error_list[0][ErrorContext.FILE_NAME]) + column_name = "DummyColumnName" + self.error_handler.push_error_context(ErrorContext.SIDECAR_COLUMN_NAME, column_name) + error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") + self.assertTrue(column_name in error_list[0][ErrorContext.SIDECAR_COLUMN_NAME]) + self.error_handler.reset_error_context() + self.error_handler.push_error_context(ErrorContext.FILE_NAME, name) + self.error_handler.push_error_context(ErrorContext.SIDECAR_COLUMN_NAME, column_name) + self.error_handler.push_error_context(ErrorContext.COLUMN, column_name) + error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") + self.assertTrue(name in error_list[0][ErrorContext.FILE_NAME]) + self.assertTrue(column_name in error_list[0][ErrorContext.SIDECAR_COLUMN_NAME]) + self.assertTrue(column_name == error_list[0][ErrorContext.COLUMN]) + self.assertTrue(len(error_list) == 1) + self.error_handler.reset_error_context() + self.error_handler.push_error_context(ErrorContext.ROW, None) + self.assertTrue(self.error_handler.error_context[0][1] == 0) + self.error_handler.reset_error_context() + + def test_pop_error_context(self): + error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") + self.assertTrue(len(error_list) == 1) + name = "DummyFileName.txt" + self.error_handler.push_error_context(ErrorContext.FILE_NAME, name) + error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") + self.assertTrue(len(error_list) == 1) + self.assertTrue(name in error_list[0][ErrorContext.FILE_NAME]) + self.error_handler.pop_error_context() + error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") + self.assertTrue(len(error_list) == 1) + column_name = "DummyColumnName" + self.error_handler.push_error_context(ErrorContext.SIDECAR_COLUMN_NAME, column_name) + error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") + self.assertTrue(len(error_list) == 1) + self.error_handler.push_error_context(ErrorContext.FILE_NAME, name) + self.error_handler.push_error_context(ErrorContext.SIDECAR_COLUMN_NAME, column_name) + self.error_handler.push_error_context(ErrorContext.COLUMN, column_name) + error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") + self.assertTrue(len(error_list) == 1) + self.assertTrue(name in error_list[0][ErrorContext.FILE_NAME]) + self.assertTrue(column_name in error_list[0][ErrorContext.SIDECAR_COLUMN_NAME]) + self.assertTrue(column_name == error_list[0][ErrorContext.COLUMN]) + self.error_handler.pop_error_context() + self.error_handler.pop_error_context() + self.error_handler.pop_error_context() + error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") + self.assertTrue(len(error_list) == 1) + self.assertTrue(ErrorContext.COLUMN not in error_list[0]) + self.error_handler.pop_error_context() + error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") + self.assertTrue(len(error_list) == 1) + self.error_handler.reset_error_context() + + def test_filter_issues_by_severity(self): + error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") + error_list += self.error_handler.format_error_with_context(SchemaWarnings.SCHEMA_INVALID_CAPITALIZATION, + "dummy", problem_char="#", char_index=0) + self.assertTrue(len(error_list) == 2) + filtered_list = self.error_handler.filter_issues_by_severity(issues_list=error_list, + severity=ErrorSeverity.ERROR) + self.assertTrue(len(filtered_list) == 1) + + def test_printable_issue_string(self): + self.error_handler.push_error_context(ErrorContext.CUSTOM_TITLE, "Default Custom Title") + error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") + error_list += self.error_handler.format_error_with_context(SchemaWarnings.SCHEMA_INVALID_CAPITALIZATION, + "dummy", problem_char="#", char_index=0) + + printable_issues = get_printable_issue_string(error_list) + self.assertTrue(len(printable_issues) > 10) + + printable_issues2 = get_printable_issue_string(error_list, severity=ErrorSeverity.ERROR) + self.assertTrue(len(printable_issues) > len(printable_issues2)) + + printable_issues3 = get_printable_issue_string(error_list, severity=ErrorSeverity.ERROR, + title="Later added custom title that is longer") + self.assertTrue(len(printable_issues3) > len(printable_issues2)) + + self.error_handler.reset_error_context() + + def test_printable_issue_string_with_filenames(self): + my_file = 'my_file.txt' + self.error_handler.push_error_context(ErrorContext.CUSTOM_TITLE, "Default Custom Title") + self.error_handler.push_error_context(ErrorContext.FILE_NAME, my_file) + error_list = self.error_handler.format_error_with_context(ValidationErrors.TAG_NOT_UNIQUE, "") + error_list += self.error_handler.format_error_with_context(SchemaWarnings.SCHEMA_INVALID_CAPITALIZATION, + "dummy", problem_char="#", char_index=0) + + printable_issues = get_printable_issue_string(error_list, skip_filename=False) + self.assertTrue(len(printable_issues) > 10) + self.assertEqual(printable_issues.count(my_file), 1) + + printable_issues2 = get_printable_issue_string(error_list, severity=ErrorSeverity.ERROR, skip_filename=False) + self.assertTrue(len(printable_issues) > len(printable_issues2)) + self.assertEqual(printable_issues2.count(my_file), 1) + printable_issues3 = get_printable_issue_string(error_list, severity=ErrorSeverity.ERROR, skip_filename=False, + title="Later added custom title that is longer") + self.assertTrue(len(printable_issues3) > len(printable_issues2)) + self.assertEqual(printable_issues3.count(my_file), 1) + + printable_issues = get_printable_issue_string_html(error_list, skip_filename=False) + self.assertTrue(len(printable_issues) > 10) + self.assertEqual(printable_issues.count(my_file), 1) + + printable_issues2 = get_printable_issue_string_html(error_list, severity=ErrorSeverity.ERROR, + skip_filename=False) + self.assertTrue(len(printable_issues) > len(printable_issues2)) + self.assertEqual(printable_issues2.count(my_file), 1) + printable_issues3 = get_printable_issue_string_html(error_list, severity=ErrorSeverity.ERROR, + skip_filename=False, + title="Later added custom title that is longer") + self.assertTrue(len(printable_issues3) > len(printable_issues2)) + self.assertEqual(printable_issues3.count(my_file), 1) + + self.error_handler.reset_error_context() + + def test_sort_issues(self): + schema = load_schema_version("8.1.0") + issues = [ + {ErrorContext.CUSTOM_TITLE: 'issue3', ErrorContext.FILE_NAME: 'File2', ErrorContext.ROW: 5, + ErrorContext.HED_STRING: HedString('Test C', schema)}, + {ErrorContext.CUSTOM_TITLE: 'issue1', ErrorContext.FILE_NAME: 'File1', ErrorContext.ROW: 10, + ErrorContext.HED_STRING: HedString('Test A', schema)}, + {ErrorContext.CUSTOM_TITLE: 'issue2', ErrorContext.FILE_NAME: 'File1', ErrorContext.ROW: 2}, + {ErrorContext.CUSTOM_TITLE: 'issue4', ErrorContext.FILE_NAME: 'File2', ErrorContext.ROW: 1, + ErrorContext.HED_STRING: HedString('Test D', schema)}, + {ErrorContext.CUSTOM_TITLE: 'issue5', ErrorContext.FILE_NAME: 'File3', ErrorContext.ROW: 15} + ] + + sorted_issues = sort_issues(issues) + self.assertEqual(sorted_issues[0][ErrorContext.CUSTOM_TITLE], 'issue1') + self.assertEqual(sorted_issues[1][ErrorContext.CUSTOM_TITLE], 'issue2') + self.assertEqual(sorted_issues[2][ErrorContext.CUSTOM_TITLE], 'issue3') + self.assertEqual(sorted_issues[3][ErrorContext.CUSTOM_TITLE], 'issue4') + self.assertEqual(sorted_issues[4][ErrorContext.CUSTOM_TITLE], 'issue5') + + reversed_issues = sort_issues(issues, reverse=True) + self.assertEqual(reversed_issues[0][ErrorContext.CUSTOM_TITLE], 'issue5') + self.assertEqual(reversed_issues[1][ErrorContext.CUSTOM_TITLE], 'issue4') + self.assertEqual(reversed_issues[2][ErrorContext.CUSTOM_TITLE], 'issue3') + self.assertEqual(reversed_issues[3][ErrorContext.CUSTOM_TITLE], 'issue2') + self.assertEqual(reversed_issues[4][ErrorContext.CUSTOM_TITLE], 'issue1') + + def test_replace_tag_references(self): + # Test with mixed data types and HedString in a nested dict + nested_dict = {'a': HedString('Hed1', self._schema), + 'b': {'c': 2, 'd': [3, {'e': HedString('Hed2', self._schema)}]}, 'f': [5, 6]} + replace_tag_references(nested_dict) + self.assertEqual(nested_dict, {'a': 'Hed1', 'b': {'c': 2, 'd': [3, {'e': 'Hed2'}]}, 'f': [5, 6]}) + + # Test with mixed data types and HedString in a nested list + nested_list = [HedString('Hed1', self._schema), + {'a': 2, 'b': [3, {'c': HedString('Hed2', self._schema)}]}] + replace_tag_references(nested_list) + self.assertEqual(nested_list, ['Hed1', {'a': 2, 'b': [3, {'c': 'Hed2'}]}]) + + # Test with mixed data types and HedString in a list within a dict + mixed = {'a': HedString('Hed1', self._schema), + 'b': [2, 3, {'c': HedString('Hed2', self._schema)}, 4]} + replace_tag_references(mixed) + self.assertEqual(mixed, {'a': 'Hed1', 'b': [2, 3, {'c': 'Hed2'}, 4]}) + + def test_register_error_twice(self): + test_code = "test_error_code" + + @hed_tag_error(test_code) + def test_error_code(tag): + pass + + with self.assertRaises(KeyError): + @hed_tag_error(test_code) + def test_error_code(tag): + pass + + def test_format_unknown_error(self): + error_code = "Unknown error type" + error_list = self.error_handler.format_error(error_code, "param1", param2=0) + self.assertEqual(error_list[0]['code'], error_code) + + actual_code = "Actual unknown error type" + error_list = self.error_handler.format_error_from_context(error_code, self.error_handler.error_context, + "param1", param2=0, + actual_error=actual_code) + self.assertEqual(error_list[0]['code'], actual_code) diff --git a/tests/models/test_base_input.py b/tests/models/test_base_input.py index 755fc5548..dba97140f 100644 --- a/tests/models/test_base_input.py +++ b/tests/models/test_base_input.py @@ -1,190 +1,187 @@ -import io -import unittest -import os -import shutil -from hed.models.sidecar import Sidecar -from hed.schema.hed_schema_io import load_schema_version -from hed.models.base_input import BaseInput -from hed.models.tabular_input import TabularInput -from hed.models.column_mapper import ColumnMapper -from hed.models.definition_dict import DefinitionDict -from hed import schema -from hed.errors.exceptions import HedFileError -from hed.errors.error_types import ErrorContext, ValidationErrors - - -import pandas as pd -import numpy as np - - - -class Test(unittest.TestCase): - @classmethod - def setUpClass(cls): - # todo: clean up these unit tests/add more - base_data_dir = os.path.realpath(os.path.join(os.path.dirname(__file__), '../data/')) - cls.base_data_dir = base_data_dir - json_def_filename = os.path.join(base_data_dir, "sidecar_tests/both_types_events_with_defs.json") - # cls.json_def_filename = json_def_filename - json_def_sidecar = Sidecar(json_def_filename) - events_path = os.path.join(base_data_dir, '../data/validator_tests/bids_events_no_index.tsv') - cls.tabular_file = TabularInput(events_path, sidecar=json_def_sidecar) - - base_output = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../data/tests_output/") - cls.base_output_folder = base_output - os.makedirs(base_output, exist_ok=True) - - bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/bids_tests/eeg_ds003645s_hed')) - schema_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/schema_tests/HED8.2.0.xml')) - cls.bids_root_path = bids_root_path - json_path = os.path.realpath(os.path.join(bids_root_path, 'task-FacePerception_events.json')) - events_path = os.path.realpath(os.path.join(bids_root_path, - 'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv')) - - cls.hed_schema = schema.load_schema(schema_path) - sidecar1 = Sidecar(json_path, name='face_sub1_json') - mapper1 = ColumnMapper(sidecar=sidecar1, optional_tag_columns=['HED'], warn_on_missing_column=False) - cls.input_data1 = BaseInput(events_path, file_type='.tsv', has_column_names=True, - name="face_sub1_events", mapper=mapper1, allow_blank_names=False) - cls.input_data2 = BaseInput(events_path, file_type='.tsv', has_column_names=True, name="face_sub2_events") - - @classmethod - def tearDownClass(cls): - shutil.rmtree(cls.base_output_folder) - - def test_gathered_defs(self): - # todo: probably remove this test? - # todo: add unit tests for definitions in tsv file - defs = DefinitionDict.get_as_strings(self.tabular_file._sidecar.extract_definitions(hed_schema=self.hed_schema)) - expected_defs = { - 'jsonfiledef': '(Acceleration/#,Item/JsonDef1)', - 'jsonfiledef2': '(Age/#,Item/JsonDef2)', - 'jsonfiledef3': '(Age/#)', - 'takesvaluedef': '(Age/#)', - 'valueclassdef': '(Acceleration/#)' - } - self.assertEqual(defs, expected_defs) - - def test_file_not_found(self): - with self.assertRaises(HedFileError): - BaseInput('nonexistent_file.tsv') - - def test_invalid_input_type_int(self): - with self.assertRaises(HedFileError): - BaseInput(123) - - def test_invalid_input_type_dict(self): - with self.assertRaises(HedFileError): - BaseInput({'key': 'value'}) - -class TestSortingByOnset(unittest.TestCase): - @staticmethod - def generate_test_dataframe(): - data = { - 'onset': [0.5, 1.0, 1.5, 2.0, 2.5], - 'HED': [ - 'Age/1', - 'Age/2', - 'Age/3', - 'NotATag', - 'Age/5' - ] - } - - df = pd.DataFrame(data) - - return df - - def test_needs_sort(self): - df = self.generate_test_dataframe() - opened_file = TabularInput(df) - self.assertFalse(opened_file.needs_sorting) - - issues = opened_file.validate(load_schema_version("8.3.0")) - self.assertEqual(issues[1][ErrorContext.ROW], 5) - df.at[3, "onset"] = 1.5 - opened_file = TabularInput(df) - self.assertFalse(opened_file.needs_sorting) - - df.at[3, "onset"] = 1.0 - opened_file = TabularInput(df) - self.assertTrue(opened_file.needs_sorting) - issues = opened_file.validate(load_schema_version("8.3.0")) - # Should still report the same issue row despite needing sorting for validation - self.assertEqual(issues[1]['code'], ValidationErrors.ONSETS_OUT_OF_ORDER) - self.assertEqual(issues[2][ErrorContext.ROW], 5) - - def test_sort(self): - from hed.models.df_util import sort_dataframe_by_onsets - df = self.generate_test_dataframe() - df2 = sort_dataframe_by_onsets(df) - self.assertTrue(df.equals(df2)) - - df.at[3, "onset"] = 1.5 - df2 = sort_dataframe_by_onsets(df) - self.assertTrue(df.equals(df2)) - - df.at[3, "onset"] = 1.0 - df2 = sort_dataframe_by_onsets(df) - self.assertFalse(df.equals(df2)) - - -class TestCombineDataframe(unittest.TestCase): - def test_combine_dataframe_with_strings(self): - data = { - 'A': ['apple', 'banana', 'cherry'], - 'B': ['dog', 'elephant', 'fox'], - 'C': ['guitar', 'harmonica', 'piano'] - } - df = pd.DataFrame(data) - result = BaseInput.combine_dataframe(df) - expected = pd.Series(['apple, dog, guitar', 'banana, elephant, harmonica', 'cherry, fox, piano']) - self.assertTrue(result.equals(expected)) - - def test_combine_dataframe_with_nan_values(self): - data = { - 'A': ['apple', np.nan, 'cherry'], - 'B': [np.nan, 'elephant', 'fox'], - 'C': ['guitar', 'harmonica', np.nan] - } - df = pd.DataFrame(data) - # this is called on load normally - df = df.fillna("n/a") - result = BaseInput.combine_dataframe(df) - expected = pd.Series(['apple, guitar', 'elephant, harmonica', 'cherry, fox']) - self.assertTrue(result.equals(expected)) - - def test_combine_dataframe_with_empty_values(self): - data = { - 'A': ['apple', '', 'cherry'], - 'B': ['', 'elephant', 'fox'], - 'C': ['guitar', 'harmonica', ''] - } - df = pd.DataFrame(data) - - result = BaseInput.combine_dataframe(df) - expected = pd.Series(['apple, guitar', 'elephant, harmonica', 'cherry, fox']) - self.assertTrue(result.equals(expected)) - - def test_combine_dataframe_with_mixed_values(self): - data = { - 'A': ['apple', np.nan, 'cherry', 'n/a', ''], - 'B': [np.nan, 'elephant', 'fox', 'n/a', ''], - 'C': ['guitar', 'harmonica', np.nan, 'n/a', ''] - } - df = pd.DataFrame(data) - # this is called on load normally - df = df.fillna("n/a") - csv_buffer = io.StringIO() - df.to_csv(csv_buffer, header=False, index=False) - csv_buffer.seek(0) - - # Use the same loading function we normally use to verify n/a translates right. - loaded_df = pd.read_csv(csv_buffer, header=None) - loaded_df = loaded_df.fillna("n/a") - result = BaseInput.combine_dataframe(loaded_df) - expected = pd.Series(['apple, guitar', 'elephant, harmonica', 'cherry, fox', '', '']) - self.assertTrue(result.equals(expected)) - +import io +import unittest +import os +import shutil +from hed.models.sidecar import Sidecar +from hed.schema.hed_schema_io import load_schema_version +from hed.models.base_input import BaseInput +from hed.models.tabular_input import TabularInput +from hed.models.column_mapper import ColumnMapper +from hed.models.definition_dict import DefinitionDict +from hed import schema +from hed.errors.exceptions import HedFileError +from hed.errors.error_types import ErrorContext, ValidationErrors +import pandas as pd +import numpy as np + + +class Test(unittest.TestCase): + @classmethod + def setUpClass(cls): + # todo: clean up these unit tests/add more + base_data_dir = os.path.realpath(os.path.join(os.path.dirname(__file__), '../data/')) + cls.base_data_dir = base_data_dir + json_def_filename = os.path.join(base_data_dir, "sidecar_tests/both_types_events_with_defs.json") + # cls.json_def_filename = json_def_filename + json_def_sidecar = Sidecar(json_def_filename) + events_path = os.path.join(base_data_dir, '../data/validator_tests/bids_events_no_index.tsv') + cls.tabular_file = TabularInput(events_path, sidecar=json_def_sidecar) + + base_output = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../data/tests_output/") + cls.base_output_folder = base_output + os.makedirs(base_output, exist_ok=True) + + bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../data/bids_tests/eeg_ds003645s_hed')) + schema_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../data/schema_tests/HED8.2.0.xml')) + cls.bids_root_path = bids_root_path + json_path = os.path.realpath(os.path.join(bids_root_path, 'task-FacePerception_events.json')) + events_path = os.path.realpath(os.path.join(bids_root_path, + 'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv')) + + cls.hed_schema = schema.load_schema(schema_path) + sidecar1 = Sidecar(json_path, name='face_sub1_json') + mapper1 = ColumnMapper(sidecar=sidecar1, optional_tag_columns=['HED'], warn_on_missing_column=False) + cls.input_data1 = BaseInput(events_path, file_type='.tsv', has_column_names=True, + name="face_sub1_events", mapper=mapper1, allow_blank_names=False) + cls.input_data2 = BaseInput(events_path, file_type='.tsv', has_column_names=True, name="face_sub2_events") + + @classmethod + def tearDownClass(cls): + shutil.rmtree(cls.base_output_folder) + + def test_gathered_defs(self): + # todo: probably remove this test? + # todo: add unit tests for definitions in tsv file + defs = DefinitionDict.get_as_strings(self.tabular_file._sidecar.extract_definitions(hed_schema=self.hed_schema)) + expected_defs = { + 'jsonfiledef': '(Acceleration/#,Item/JsonDef1)', + 'jsonfiledef2': '(Age/#,Item/JsonDef2)', + 'jsonfiledef3': '(Age/#)', + 'takesvaluedef': '(Age/#)', + 'valueclassdef': '(Acceleration/#)' + } + self.assertEqual(defs, expected_defs) + + def test_file_not_found(self): + with self.assertRaises(HedFileError): + BaseInput('nonexistent_file.tsv') + + def test_invalid_input_type_int(self): + with self.assertRaises(HedFileError): + BaseInput(123) + + def test_invalid_input_type_dict(self): + with self.assertRaises(HedFileError): + BaseInput({'key': 'value'}) + + +class TestSortingByOnset(unittest.TestCase): + @staticmethod + def generate_test_dataframe(): + data = { + 'onset': [0.5, 1.0, 1.5, 2.0, 2.5], + 'HED': [ + 'Age/1', + 'Age/2', + 'Age/3', + 'NotATag', + 'Age/5' + ] + } + + df = pd.DataFrame(data) + + return df + + def test_needs_sort(self): + df = self.generate_test_dataframe() + opened_file = TabularInput(df) + self.assertFalse(opened_file.needs_sorting) + + issues = opened_file.validate(load_schema_version("8.3.0")) + self.assertEqual(issues[1][ErrorContext.ROW], 5) + df.at[3, "onset"] = 1.5 + opened_file = TabularInput(df) + self.assertFalse(opened_file.needs_sorting) + + df.at[3, "onset"] = 1.0 + opened_file = TabularInput(df) + self.assertTrue(opened_file.needs_sorting) + issues = opened_file.validate(load_schema_version("8.3.0")) + # Should still report the same issue row despite needing sorting for validation + self.assertEqual(issues[1]['code'], ValidationErrors.ONSETS_OUT_OF_ORDER) + self.assertEqual(issues[2][ErrorContext.ROW], 5) + + def test_sort(self): + from hed.models.df_util import sort_dataframe_by_onsets + df = self.generate_test_dataframe() + df2 = sort_dataframe_by_onsets(df) + self.assertTrue(df.equals(df2)) + + df.at[3, "onset"] = 1.5 + df2 = sort_dataframe_by_onsets(df) + self.assertTrue(df.equals(df2)) + + df.at[3, "onset"] = 1.0 + df2 = sort_dataframe_by_onsets(df) + self.assertFalse(df.equals(df2)) + + +class TestCombineDataframe(unittest.TestCase): + def test_combine_dataframe_with_strings(self): + data = { + 'A': ['apple', 'banana', 'cherry'], + 'B': ['dog', 'elephant', 'fox'], + 'C': ['guitar', 'harmonica', 'piano'] + } + df = pd.DataFrame(data) + result = BaseInput.combine_dataframe(df) + expected = pd.Series(['apple, dog, guitar', 'banana, elephant, harmonica', 'cherry, fox, piano']) + self.assertTrue(result.equals(expected)) + + def test_combine_dataframe_with_nan_values(self): + data = { + 'A': ['apple', np.nan, 'cherry'], + 'B': [np.nan, 'elephant', 'fox'], + 'C': ['guitar', 'harmonica', np.nan] + } + df = pd.DataFrame(data) + # this is called on load normally + df = df.fillna("n/a") + result = BaseInput.combine_dataframe(df) + expected = pd.Series(['apple, guitar', 'elephant, harmonica', 'cherry, fox']) + self.assertTrue(result.equals(expected)) + + def test_combine_dataframe_with_empty_values(self): + data = { + 'A': ['apple', '', 'cherry'], + 'B': ['', 'elephant', 'fox'], + 'C': ['guitar', 'harmonica', ''] + } + df = pd.DataFrame(data) + + result = BaseInput.combine_dataframe(df) + expected = pd.Series(['apple, guitar', 'elephant, harmonica', 'cherry, fox']) + self.assertTrue(result.equals(expected)) + + def test_combine_dataframe_with_mixed_values(self): + data = { + 'A': ['apple', np.nan, 'cherry', 'n/a', ''], + 'B': [np.nan, 'elephant', 'fox', 'n/a', ''], + 'C': ['guitar', 'harmonica', np.nan, 'n/a', ''] + } + df = pd.DataFrame(data) + # this is called on load normally + df = df.fillna("n/a") + csv_buffer = io.StringIO() + df.to_csv(csv_buffer, header=False, index=False) + csv_buffer.seek(0) + + # Use the same loading function we normally use to verify n/a translates right. + loaded_df = pd.read_csv(csv_buffer, header=None) + loaded_df = loaded_df.fillna("n/a") + result = BaseInput.combine_dataframe(loaded_df) + expected = pd.Series(['apple, guitar', 'elephant, harmonica', 'cherry, fox', '', '']) + self.assertTrue(result.equals(expected)) diff --git a/tests/models/test_basic_search.py b/tests/models/test_basic_search.py index 2268fa41a..3d4084cff 100644 --- a/tests/models/test_basic_search.py +++ b/tests/models/test_basic_search.py @@ -1,363 +1,364 @@ -import unittest -import pandas as pd -from hed import load_schema_version - -import os -from hed import TabularInput -from hed.models import df_util, basic_search -from hed.models.basic_search import find_words, check_parentheses, reverse_and_flip_parentheses, \ - construct_delimiter_map, verify_search_delimiters, find_matching -import numpy as np -from hed.models.df_util import convert_to_form - -class TestNewSearch(unittest.TestCase): - @classmethod - def setUpClass(cls): - bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/bids_tests/eeg_ds003645s_hed')) - sidecar1_path = os.path.realpath(os.path.join(bids_root_path, 'task-FacePerception_events.json')) - cls.events_path = os.path.realpath( - os.path.join(bids_root_path, 'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv')) - cls.base_input = TabularInput(cls.events_path, sidecar1_path) - cls.schema = load_schema_version("8.3.0") - cls.df = cls.base_input.series_filtered - - def test_find_matching_results(self): - result1 = basic_search.find_matching(self.df, "(Face, Item-interval/1)") - result2 = basic_search.find_matching(self.df, "(Face, Item-interval/1*)") - - self.assertTrue(np.sum(result1) > 0, "result1 should have some true values") - self.assertTrue(np.sum(result2) > 0, "result2 should have some true values") - self.assertTrue(np.sum(result1) < np.sum(result2), "result1 should have fewer true values than result2") - - # Verify we get the same results in both tag forms - df_copy = self.df.copy() - convert_to_form(df_copy, self.schema, "long_tag") - - result1b = basic_search.find_matching(self.df, "(Face, Item-interval/1)") - result2b = basic_search.find_matching(self.df, "(Face, Item-interval/1*)") - - self.assertTrue(np.sum(result1b) > 0, "result1 should have some true values") - self.assertTrue(np.sum(result2b) > 0, "result2 should have some true values") - self.assertTrue(np.sum(result1b) < np.sum(result2b), "result1 should have fewer true values than result2") - self.assertTrue(result1.equals(result1b)) - self.assertTrue(result2.equals(result2b)) - - convert_to_form(df_copy, self.schema, "short_tag") - - result1b = basic_search.find_matching(self.df, "(Face, Item-interval/1)") - result2b = basic_search.find_matching(self.df, "(Face, Item-interval/1*)") - - self.assertTrue(np.sum(result1b) > 0, "result1 should have some true values") - self.assertTrue(np.sum(result2b) > 0, "result2 should have some true values") - self.assertTrue(np.sum(result1b) < np.sum(result2b), "result1 should have fewer true values than result2") - self.assertTrue(result1.equals(result1b)) - self.assertTrue(result2.equals(result2b)) - - -class TestFindWords(unittest.TestCase): - def test_basic(self): - search_string = "@global (local1, local2)" - anywhere_words, _, specific_words = find_words(search_string) - self.assertEqual(anywhere_words, ['global']) - self.assertEqual(specific_words, ['local1', 'local2']) - - def test_no_anywhere_words(self): - search_string = "(local1, local2)" - anywhere_words, _, specific_words = find_words(search_string) - self.assertEqual(anywhere_words, []) - self.assertEqual(specific_words, ['local1', 'local2']) - - def test_no_specific_words(self): - search_string = "@global1, @global2" - anywhere_words, _, specific_words = find_words(search_string) - self.assertEqual(anywhere_words, ['global1', 'global2']) - self.assertEqual(specific_words, []) - - def test_empty_string(self): - search_string = "" - anywhere_words, _, specific_words = find_words(search_string) - self.assertEqual(anywhere_words, []) - self.assertEqual(specific_words, []) - - def test_mixed_words(self): - search_string = "@global (local1, local2), @another_global" - anywhere_words, _, specific_words = find_words(search_string) - self.assertEqual(anywhere_words, ['global', 'another_global']) - self.assertEqual(specific_words, ['local1', 'local2']) - - def test_whitespace(self): - search_string = " @Global , ( local1 , local2 ) " - anywhere_words, _, specific_words = find_words(search_string) - self.assertEqual(anywhere_words, ['Global']) - self.assertEqual(specific_words, ['local1', 'local2']) - - -class TestCheckParentheses(unittest.TestCase): - def test_balanced_parentheses(self): - self.assertEqual(check_parentheses("(())"), "") - self.assertEqual(check_parentheses("(someText())"), "") - self.assertEqual(check_parentheses("((some)text())"), "") - self.assertEqual(check_parentheses("()"), "") - - def test_unbalanced_parentheses(self): - self.assertEqual(check_parentheses("(()"), "(") - self.assertEqual(check_parentheses("()someText("), "(") - self.assertEqual(check_parentheses("(text)text)"), ")") - self.assertEqual(check_parentheses("text)"), ")") - - def test_mixed_parentheses(self): - self.assertEqual(check_parentheses("(()(())"), "(") - self.assertEqual(check_parentheses("(someText))((someText)"), ")(") - self.assertEqual(check_parentheses("((someText))someText"), "") - self.assertEqual(check_parentheses("(someText(someText))someText"), "") - - def test_special_cases(self): - self.assertEqual(check_parentheses(""), "") - self.assertEqual(check_parentheses("abc"), "") - self.assertEqual(check_parentheses("((()))("), "(") - self.assertEqual(check_parentheses("text"), "") - - def test_reverse_and_flip_parentheses(self): - self.assertEqual(reverse_and_flip_parentheses("(abc)"), "(cba)") - self.assertEqual(reverse_and_flip_parentheses("Hello()"), "()olleH") - self.assertEqual(reverse_and_flip_parentheses(")("), ")(") - self.assertEqual(reverse_and_flip_parentheses("((()))"), "((()))") - self.assertEqual(reverse_and_flip_parentheses("()()()"), "()()()") - self.assertEqual(reverse_and_flip_parentheses("abc"), "cba") - self.assertEqual(reverse_and_flip_parentheses("123(abc)321"), "123(cba)321") - self.assertEqual(reverse_and_flip_parentheses("a(bc)d"), "d(cb)a") - - -class TestConstructDelimiterMap(unittest.TestCase): - def test_empty_text(self): - self.assertEqual(construct_delimiter_map("", ["word1", "word2"]), {}) - - def test_empty_words(self): - self.assertEqual(construct_delimiter_map("word1,word2", []), {}) - - def test_single_occurrence(self): - text = "word1,word2" - expected_result = { - ("word1", "word2"): "", - ("word2", "word1"): "" - } - self.assertEqual(construct_delimiter_map(text, ["word1", "word2"]), expected_result) - - def test_multiple_words(self): - text = "word0,((word1),word2)" - expected_result = { - ("word0", "word1"): "((", - ("word0", "word2"): "(", - ("word1", "word0"): "))", - ("word1", "word2"): ")", - ("word2", "word1"): "(", - ("word2", "word0"): ")" - } - self.assertEqual(construct_delimiter_map(text, ["word0", "word1", "word2"]), expected_result) - - text = "word0 , ( (word1 ), word2)" - self.assertEqual(construct_delimiter_map(text, ["word0", "word1", "word2"]), expected_result) - - -class TestVerifyDelimiters(unittest.TestCase): - def base_verify_func(self, query_text, text, specific_words, expected_result): - delimiter_map = construct_delimiter_map(query_text, specific_words) - actual_result = verify_search_delimiters(text, specific_words, delimiter_map) - self.assertEqual(actual_result, expected_result) - - def test_all_conditions_met(self): - query_text = "word0,((word1),word2)" - specific_words = ["word0", "word1", "word2"] - text = "word0,((word1),word2)" - self.base_verify_func(query_text, text, specific_words, True) - text = "((word1),word2), word0" - self.base_verify_func(query_text, text, specific_words, True) - text = "word0,(word2, (word1))" - self.base_verify_func(query_text, text, specific_words, True) - text = "word0,((word1),(ExtraGroup),word2)" - self.base_verify_func(query_text, text, specific_words, True) - text = "word0,((word2),word1)" - self.base_verify_func(query_text, text, specific_words, False) - text = "((word1),word0), word2" - self.base_verify_func(query_text, text, specific_words, False) - text = "word0,((word1))" - self.base_verify_func(query_text, text, specific_words, False) - text = "(word1),(ExtraGroup),word2)" - self.base_verify_func(query_text, text, specific_words, False) - - def test_wildcard_matching_verify_delimiters(self): - query_text = "word0, ((word1.*?)), word2.*?" - delimiter_map = construct_delimiter_map(query_text, ["word0", "word1.*?", "word2.*?"]) - - # Positive test cases - text = "((word1)), word0, word2X" - self.assertTrue(verify_search_delimiters(text, ["word0", "word1.*?", "word2.*?"], delimiter_map)) - - text = "word0, ((word1Y)), word2Z" - self.assertTrue(verify_search_delimiters(text, ["word0", "word1.*?", "word2.*?"], delimiter_map)) - - # Negative test cases - text = "word0, (word1), word2" - self.assertFalse(verify_search_delimiters(text, ["word0", "word1.*?", "word2.*?"], delimiter_map)) - - -class TestFindMatching(unittest.TestCase): - def base_find_matching(self, series, search_string, expected): - mask = find_matching(series, search_string) - self.assertTrue(all(mask == expected), f"Expected {expected}, got {mask}") - - def test_basic_matching(self): - series = pd.Series([ - "word0, word1, word2", - "word0, (word1, word2)" - ]) - search_string = "word0, word1" - expected = pd.Series([True, True]) - self.base_find_matching(series, search_string, expected) - search_string = "(word0, word1)" - expected = pd.Series([True, False]) - self.base_find_matching(series, search_string, expected) - - def test_group_matching(self): - series = pd.Series([ - "(word1), word0, ((word2))", - "word0, ((word1)), word2", - "(word1), word0, (word2)" - ]) - search_string = "word0, ((word1)), word2" - expected = pd.Series([False, True, False]) - self.base_find_matching(series, search_string, expected) - - def test_anywhere_words(self): - series = pd.Series([ - "(word1), word0, ((word2))", - "word0, ((word1)), word2", - "word0, (word3), ((word1)), word2" - ]) - search_string = "@word3, word0, ((word1)), word2" - expected = pd.Series([False, False, True]) - self.base_find_matching(series, search_string, expected) - - def test_mismatched_parentheses(self): - series = pd.Series([ - "(word1), word0, ((word2))", - "word0, ((word1)), word2", - "word0, (word1)), word2", - "word0, ((word1), word2" - ]) - search_string = "word0, ((word1)), word2" - expected = pd.Series([False, True, False, False]) - self.base_find_matching(series, search_string, expected) - - def test_wildcard_matching(self): - series = pd.Series([ - "word2, word0, ((word1X))", - "word0, ((word1Y)), word2Z", - "word0, ((word1)), word2", - "word0, (word1), word2" - ]) - search_string = "word0, ((word1*)), word2*" - expected = pd.Series([True, True, True, False]) - self.base_find_matching(series, search_string, expected) - - def test_complex_case_with_word_identifiers(self): - query_text = "word0, ((word1), @word2, @word3, word4)" - series = pd.Series([ - "word0, ((word1), word2, word3, word4)", - "word2, word0, ((word1), word3, word4)", - "word3, ((word1), word2, word4), word0", - "word0, ((word1), word4), word2, word3", - "word0, word1, word4, word2", - "word2, word3" - ]) - expected = pd.Series([True, True, True, True, False, False]) - - self.base_find_matching(series, query_text, expected) - - def test_very_complex_case_with_word_identifiers(self): - query_text = "word0, (((word1, word2), @word3)), ((word4, word5)))" - series = pd.Series([ - "word0, (((word1, word2), word3)), ((word4, word5)))", - "word3, word0, (((word1, word2))), ((word4, word5)))", - "word0, ((word1, word2), word3), (word4, word5)", - "word0, (((word1, word2), word3)), (word4)", - "word0, (((word1, word2))), ((word4, word5)))" - ]) - expected = pd.Series([True, True, False, False, False]) - - self.base_find_matching(series, query_text, expected) - - def test_incorrect_single_delimiter(self): - query_text = "word0, ((word1)), word2" - series = pd.Series([ - "word0, ((word1)), word2", - "(word0, ((word1)), word2)", - "word0, ((word1), word2)", - "word0, (word1)), word2" - ]) - expected = pd.Series([True, True, False, False]) - self.base_find_matching(series, query_text, expected) - - def test_mismatched_parentheses2(self): - query_text = "word0, ((word1)), (word2, word3)" - series = pd.Series([ - "word0, ((word1)), (word2, word3)", - "(word2, word3), word0, ((word1))", - "word0, someExtraText, ((word1)), someMoreText, (word2, word3)", - "word0, ((word1), (word2, word3))", - "word0, ((word1), ((word2, word3)" - ]) - expected = pd.Series([True, True, True, False, False]) - self.base_find_matching(series, query_text, expected) - - def test_negative_words(self): - series = pd.Series([ - "word0, word1", - "word0, word2", - "word0, word2, word3", - "word0, (word1), word2", - "word0, (word2, word3), word1", - "word0, word1suffix", - ]) - - # 1. Basic Negative Test Case - search_string1 = "~word1, word0" - expected1 = pd.Series([False, True, True, False, False, True]) - - # 2. Two Negative Words - search_string2 = "~word1, ~word3, word0" - expected2 = pd.Series([False, True, False, False, False, True]) - - # 3. Combination of Negative and Mandatory Words - search_string3 = "@word2, ~word1, word0" - expected3 = pd.Series([False, True, True, False, False, False]) - - # 4. Negative Words with Wildcards - search_string4 = "word0, ~word1*" - expected4 = pd.Series([False, True, True, False, False, False]) - - # Running tests - self.base_find_matching(series, search_string1, expected1) - self.base_find_matching(series, search_string2, expected2) - self.base_find_matching(series, search_string3, expected3) - self.base_find_matching(series, search_string4, expected4) - - def test_negative_words_group(self): - series = pd.Series([ - "word0, (word1, (word2))", - "word0, (word1, (word2)), word3", - "word0, (word1, (word2), word3)", - "word0, (word1, (word2, word3))", - ]) - search_string = "word0, (word1, (word2))" - expected = pd.Series([True, True, True, True]) - self.base_find_matching(series, search_string, expected) - - search_string = "word0, (word1, (word2)), ~word3" - expected = pd.Series([True, False, False, False]) - self.base_find_matching(series, search_string, expected) - - search_string = "word0, (word1, (word2), ~word3)" - expected = pd.Series([True, False, False, False]) - self.base_find_matching(series, search_string, expected) +import unittest +import pandas as pd +from hed import load_schema_version + +import os +from hed import TabularInput +from hed.models import basic_search +from hed.models.basic_search import find_words, check_parentheses, reverse_and_flip_parentheses, \ + construct_delimiter_map, verify_search_delimiters, find_matching +import numpy as np +from hed.models.df_util import convert_to_form + + +class TestNewSearch(unittest.TestCase): + @classmethod + def setUpClass(cls): + bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../data/bids_tests/eeg_ds003645s_hed')) + sidecar1_path = os.path.realpath(os.path.join(bids_root_path, 'task-FacePerception_events.json')) + cls.events_path = os.path.realpath( + os.path.join(bids_root_path, 'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv')) + cls.base_input = TabularInput(cls.events_path, sidecar1_path) + cls.schema = load_schema_version("8.3.0") + cls.df = cls.base_input.series_filtered + + def test_find_matching_results(self): + result1 = basic_search.find_matching(self.df, "(Face, Item-interval/1)") + result2 = basic_search.find_matching(self.df, "(Face, Item-interval/1*)") + + self.assertTrue(np.sum(result1) > 0, "result1 should have some true values") + self.assertTrue(np.sum(result2) > 0, "result2 should have some true values") + self.assertTrue(np.sum(result1) < np.sum(result2), "result1 should have fewer true values than result2") + + # Verify we get the same results in both tag forms + df_copy = self.df.copy() + convert_to_form(df_copy, self.schema, "long_tag") + + result1b = basic_search.find_matching(self.df, "(Face, Item-interval/1)") + result2b = basic_search.find_matching(self.df, "(Face, Item-interval/1*)") + + self.assertTrue(np.sum(result1b) > 0, "result1 should have some true values") + self.assertTrue(np.sum(result2b) > 0, "result2 should have some true values") + self.assertTrue(np.sum(result1b) < np.sum(result2b), "result1 should have fewer true values than result2") + self.assertTrue(result1.equals(result1b)) + self.assertTrue(result2.equals(result2b)) + + convert_to_form(df_copy, self.schema, "short_tag") + + result1b = basic_search.find_matching(self.df, "(Face, Item-interval/1)") + result2b = basic_search.find_matching(self.df, "(Face, Item-interval/1*)") + + self.assertTrue(np.sum(result1b) > 0, "result1 should have some true values") + self.assertTrue(np.sum(result2b) > 0, "result2 should have some true values") + self.assertTrue(np.sum(result1b) < np.sum(result2b), "result1 should have fewer true values than result2") + self.assertTrue(result1.equals(result1b)) + self.assertTrue(result2.equals(result2b)) + + +class TestFindWords(unittest.TestCase): + def test_basic(self): + search_string = "@global (local1, local2)" + anywhere_words, _, specific_words = find_words(search_string) + self.assertEqual(anywhere_words, ['global']) + self.assertEqual(specific_words, ['local1', 'local2']) + + def test_no_anywhere_words(self): + search_string = "(local1, local2)" + anywhere_words, _, specific_words = find_words(search_string) + self.assertEqual(anywhere_words, []) + self.assertEqual(specific_words, ['local1', 'local2']) + + def test_no_specific_words(self): + search_string = "@global1, @global2" + anywhere_words, _, specific_words = find_words(search_string) + self.assertEqual(anywhere_words, ['global1', 'global2']) + self.assertEqual(specific_words, []) + + def test_empty_string(self): + search_string = "" + anywhere_words, _, specific_words = find_words(search_string) + self.assertEqual(anywhere_words, []) + self.assertEqual(specific_words, []) + + def test_mixed_words(self): + search_string = "@global (local1, local2), @another_global" + anywhere_words, _, specific_words = find_words(search_string) + self.assertEqual(anywhere_words, ['global', 'another_global']) + self.assertEqual(specific_words, ['local1', 'local2']) + + def test_whitespace(self): + search_string = " @Global , ( local1 , local2 ) " + anywhere_words, _, specific_words = find_words(search_string) + self.assertEqual(anywhere_words, ['Global']) + self.assertEqual(specific_words, ['local1', 'local2']) + + +class TestCheckParentheses(unittest.TestCase): + def test_balanced_parentheses(self): + self.assertEqual(check_parentheses("(())"), "") + self.assertEqual(check_parentheses("(someText())"), "") + self.assertEqual(check_parentheses("((some)text())"), "") + self.assertEqual(check_parentheses("()"), "") + + def test_unbalanced_parentheses(self): + self.assertEqual(check_parentheses("(()"), "(") + self.assertEqual(check_parentheses("()someText("), "(") + self.assertEqual(check_parentheses("(text)text)"), ")") + self.assertEqual(check_parentheses("text)"), ")") + + def test_mixed_parentheses(self): + self.assertEqual(check_parentheses("(()(())"), "(") + self.assertEqual(check_parentheses("(someText))((someText)"), ")(") + self.assertEqual(check_parentheses("((someText))someText"), "") + self.assertEqual(check_parentheses("(someText(someText))someText"), "") + + def test_special_cases(self): + self.assertEqual(check_parentheses(""), "") + self.assertEqual(check_parentheses("abc"), "") + self.assertEqual(check_parentheses("((()))("), "(") + self.assertEqual(check_parentheses("text"), "") + + def test_reverse_and_flip_parentheses(self): + self.assertEqual(reverse_and_flip_parentheses("(abc)"), "(cba)") + self.assertEqual(reverse_and_flip_parentheses("Hello()"), "()olleH") + self.assertEqual(reverse_and_flip_parentheses(")("), ")(") + self.assertEqual(reverse_and_flip_parentheses("((()))"), "((()))") + self.assertEqual(reverse_and_flip_parentheses("()()()"), "()()()") + self.assertEqual(reverse_and_flip_parentheses("abc"), "cba") + self.assertEqual(reverse_and_flip_parentheses("123(abc)321"), "123(cba)321") + self.assertEqual(reverse_and_flip_parentheses("a(bc)d"), "d(cb)a") + + +class TestConstructDelimiterMap(unittest.TestCase): + def test_empty_text(self): + self.assertEqual(construct_delimiter_map("", ["word1", "word2"]), {}) + + def test_empty_words(self): + self.assertEqual(construct_delimiter_map("word1,word2", []), {}) + + def test_single_occurrence(self): + text = "word1,word2" + expected_result = { + ("word1", "word2"): "", + ("word2", "word1"): "" + } + self.assertEqual(construct_delimiter_map(text, ["word1", "word2"]), expected_result) + + def test_multiple_words(self): + text = "word0,((word1),word2)" + expected_result = { + ("word0", "word1"): "((", + ("word0", "word2"): "(", + ("word1", "word0"): "))", + ("word1", "word2"): ")", + ("word2", "word1"): "(", + ("word2", "word0"): ")" + } + self.assertEqual(construct_delimiter_map(text, ["word0", "word1", "word2"]), expected_result) + + text = "word0 , ( (word1 ), word2)" + self.assertEqual(construct_delimiter_map(text, ["word0", "word1", "word2"]), expected_result) + + +class TestVerifyDelimiters(unittest.TestCase): + def base_verify_func(self, query_text, text, specific_words, expected_result): + delimiter_map = construct_delimiter_map(query_text, specific_words) + actual_result = verify_search_delimiters(text, specific_words, delimiter_map) + self.assertEqual(actual_result, expected_result) + + def test_all_conditions_met(self): + query_text = "word0,((word1),word2)" + specific_words = ["word0", "word1", "word2"] + text = "word0,((word1),word2)" + self.base_verify_func(query_text, text, specific_words, True) + text = "((word1),word2), word0" + self.base_verify_func(query_text, text, specific_words, True) + text = "word0,(word2, (word1))" + self.base_verify_func(query_text, text, specific_words, True) + text = "word0,((word1),(ExtraGroup),word2)" + self.base_verify_func(query_text, text, specific_words, True) + text = "word0,((word2),word1)" + self.base_verify_func(query_text, text, specific_words, False) + text = "((word1),word0), word2" + self.base_verify_func(query_text, text, specific_words, False) + text = "word0,((word1))" + self.base_verify_func(query_text, text, specific_words, False) + text = "(word1),(ExtraGroup),word2)" + self.base_verify_func(query_text, text, specific_words, False) + + def test_wildcard_matching_verify_delimiters(self): + query_text = "word0, ((word1.*?)), word2.*?" + delimiter_map = construct_delimiter_map(query_text, ["word0", "word1.*?", "word2.*?"]) + + # Positive test cases + text = "((word1)), word0, word2X" + self.assertTrue(verify_search_delimiters(text, ["word0", "word1.*?", "word2.*?"], delimiter_map)) + + text = "word0, ((word1Y)), word2Z" + self.assertTrue(verify_search_delimiters(text, ["word0", "word1.*?", "word2.*?"], delimiter_map)) + + # Negative test cases + text = "word0, (word1), word2" + self.assertFalse(verify_search_delimiters(text, ["word0", "word1.*?", "word2.*?"], delimiter_map)) + + +class TestFindMatching(unittest.TestCase): + def base_find_matching(self, series, search_string, expected): + mask = find_matching(series, search_string) + self.assertTrue(all(mask == expected), f"Expected {expected}, got {mask}") + + def test_basic_matching(self): + series = pd.Series([ + "word0, word1, word2", + "word0, (word1, word2)" + ]) + search_string = "word0, word1" + expected = pd.Series([True, True]) + self.base_find_matching(series, search_string, expected) + search_string = "(word0, word1)" + expected = pd.Series([True, False]) + self.base_find_matching(series, search_string, expected) + + def test_group_matching(self): + series = pd.Series([ + "(word1), word0, ((word2))", + "word0, ((word1)), word2", + "(word1), word0, (word2)" + ]) + search_string = "word0, ((word1)), word2" + expected = pd.Series([False, True, False]) + self.base_find_matching(series, search_string, expected) + + def test_anywhere_words(self): + series = pd.Series([ + "(word1), word0, ((word2))", + "word0, ((word1)), word2", + "word0, (word3), ((word1)), word2" + ]) + search_string = "@word3, word0, ((word1)), word2" + expected = pd.Series([False, False, True]) + self.base_find_matching(series, search_string, expected) + + def test_mismatched_parentheses(self): + series = pd.Series([ + "(word1), word0, ((word2))", + "word0, ((word1)), word2", + "word0, (word1)), word2", + "word0, ((word1), word2" + ]) + search_string = "word0, ((word1)), word2" + expected = pd.Series([False, True, False, False]) + self.base_find_matching(series, search_string, expected) + + def test_wildcard_matching(self): + series = pd.Series([ + "word2, word0, ((word1X))", + "word0, ((word1Y)), word2Z", + "word0, ((word1)), word2", + "word0, (word1), word2" + ]) + search_string = "word0, ((word1*)), word2*" + expected = pd.Series([True, True, True, False]) + self.base_find_matching(series, search_string, expected) + + def test_complex_case_with_word_identifiers(self): + query_text = "word0, ((word1), @word2, @word3, word4)" + series = pd.Series([ + "word0, ((word1), word2, word3, word4)", + "word2, word0, ((word1), word3, word4)", + "word3, ((word1), word2, word4), word0", + "word0, ((word1), word4), word2, word3", + "word0, word1, word4, word2", + "word2, word3" + ]) + expected = pd.Series([True, True, True, True, False, False]) + + self.base_find_matching(series, query_text, expected) + + def test_very_complex_case_with_word_identifiers(self): + query_text = "word0, (((word1, word2), @word3)), ((word4, word5)))" + series = pd.Series([ + "word0, (((word1, word2), word3)), ((word4, word5)))", + "word3, word0, (((word1, word2))), ((word4, word5)))", + "word0, ((word1, word2), word3), (word4, word5)", + "word0, (((word1, word2), word3)), (word4)", + "word0, (((word1, word2))), ((word4, word5)))" + ]) + expected = pd.Series([True, True, False, False, False]) + + self.base_find_matching(series, query_text, expected) + + def test_incorrect_single_delimiter(self): + query_text = "word0, ((word1)), word2" + series = pd.Series([ + "word0, ((word1)), word2", + "(word0, ((word1)), word2)", + "word0, ((word1), word2)", + "word0, (word1)), word2" + ]) + expected = pd.Series([True, True, False, False]) + self.base_find_matching(series, query_text, expected) + + def test_mismatched_parentheses2(self): + query_text = "word0, ((word1)), (word2, word3)" + series = pd.Series([ + "word0, ((word1)), (word2, word3)", + "(word2, word3), word0, ((word1))", + "word0, someExtraText, ((word1)), someMoreText, (word2, word3)", + "word0, ((word1), (word2, word3))", + "word0, ((word1), ((word2, word3)" + ]) + expected = pd.Series([True, True, True, False, False]) + self.base_find_matching(series, query_text, expected) + + def test_negative_words(self): + series = pd.Series([ + "word0, word1", + "word0, word2", + "word0, word2, word3", + "word0, (word1), word2", + "word0, (word2, word3), word1", + "word0, word1suffix", + ]) + + # 1. Basic Negative Test Case + search_string1 = "~word1, word0" + expected1 = pd.Series([False, True, True, False, False, True]) + + # 2. Two Negative Words + search_string2 = "~word1, ~word3, word0" + expected2 = pd.Series([False, True, False, False, False, True]) + + # 3. Combination of Negative and Mandatory Words + search_string3 = "@word2, ~word1, word0" + expected3 = pd.Series([False, True, True, False, False, False]) + + # 4. Negative Words with Wildcards + search_string4 = "word0, ~word1*" + expected4 = pd.Series([False, True, True, False, False, False]) + + # Running tests + self.base_find_matching(series, search_string1, expected1) + self.base_find_matching(series, search_string2, expected2) + self.base_find_matching(series, search_string3, expected3) + self.base_find_matching(series, search_string4, expected4) + + def test_negative_words_group(self): + series = pd.Series([ + "word0, (word1, (word2))", + "word0, (word1, (word2)), word3", + "word0, (word1, (word2), word3)", + "word0, (word1, (word2, word3))", + ]) + search_string = "word0, (word1, (word2))" + expected = pd.Series([True, True, True, True]) + self.base_find_matching(series, search_string, expected) + + search_string = "word0, (word1, (word2)), ~word3" + expected = pd.Series([True, False, False, False]) + self.base_find_matching(series, search_string, expected) + + search_string = "word0, (word1, (word2), ~word3)" + expected = pd.Series([True, False, False, False]) + self.base_find_matching(series, search_string, expected) diff --git a/tests/models/test_basic_search_util.py b/tests/models/test_basic_search_util.py index 9701ca653..3ccb01f77 100644 --- a/tests/models/test_basic_search_util.py +++ b/tests/models/test_basic_search_util.py @@ -7,14 +7,16 @@ class TestConvertQueryToForm(unittest.TestCase): schema = load_schema_version("8.3.0") def test_basic_convert(self): - input = "@Event, Head-part*, Time-interval/1" - expected_output = "@Event, Item/Biological-item/Anatomical-item/Body-part/Head-part*, Property/Data-property/Data-value/Spatiotemporal-value/Temporal-value/Time-interval/1" + this_input = "@Event, Head-part*, Time-interval/1" + expected_output = "@Event, Item/Biological-item/Anatomical-item/Body-part/Head-part*, " + \ + "Property/Data-property/Data-value/Spatiotemporal-value/Temporal-value/Time-interval/1" - actual_output = convert_query(input, self.schema) + actual_output = convert_query(this_input, self.schema) self.assertEqual(expected_output, actual_output) - input = "@Head-part*, Event, Time-interval/1" - expected_output = "@Item/Biological-item/Anatomical-item/Body-part/Head-part*, Event, Property/Data-property/Data-value/Spatiotemporal-value/Temporal-value/Time-interval/1" + this_input = "@Head-part*, Event, Time-interval/1" + expected_output = "@Item/Biological-item/Anatomical-item/Body-part/Head-part*, " + \ + "Event, Property/Data-property/Data-value/Spatiotemporal-value/Temporal-value/Time-interval/1" - actual_output = convert_query(input, self.schema) - self.assertEqual(expected_output, actual_output) \ No newline at end of file + actual_output = convert_query(this_input, self.schema) + self.assertEqual(expected_output, actual_output) diff --git a/tests/models/test_column_mapper.py b/tests/models/test_column_mapper.py index cf33315f3..760cf4b7e 100644 --- a/tests/models/test_column_mapper.py +++ b/tests/models/test_column_mapper.py @@ -1,220 +1,224 @@ -import unittest -import os - -from hed.models import ColumnMapper, ColumnType, HedString -from hed.models.sidecar import Sidecar, DefinitionDict -from hed.errors import ValidationErrors -from hed import load_schema - -class Test(unittest.TestCase): - @classmethod - def setUpClass(cls): - base_data_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../data/') - schema_file = 'schema_tests/HED8.0.0t.xml' - - cls.hed_schema = load_schema(os.path.join(base_data_dir, schema_file)) - cls.integer_key_dictionary = {0: 'one', 1: 'two', 2: 'three'} - cls.zero_based_row_column_count = 3 - cls.column_prefix_dictionary = {2: 'Event/Description/', 3: 'Event/Label/', 4: 'Event/Category/'} - cls.category_key = 'Event/Category/' - cls.category_participant_and_stimulus_tags = \ - HedString('Event/Category/Participant response, Event/Category/Stimulus', cls.hed_schema) - - cls.row_with_hed_tags = ['event1', 'tag1', 'tag2'] - - cls.base_data_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../data/') - cls.basic_events_json = os.path.join(cls.base_data_dir, "sidecar_tests/both_types_events.json") - cls.bids_events_defs = os.path.join(cls.base_data_dir, "validator_tests/bids_events.json") - cls.basic_event_name = "trial_type" - cls.basic_event_type = ColumnType.Categorical - cls.basic_hed_tags_column = "onset" - cls.basic_column_map = ["onset", "duration", "trial_type", "response_time", " stim_file"] - cls.basic_event_row = ["1.2", "0.6", "go", "1.435", "images/red_square.jpg"] - cls.basic_event_row_invalid = ["1.2", "0.6", "invalid_category_key", "1.435", "images/red_square.jpg"] - - - def test_set_tag_columns(self): - mapper = ColumnMapper() - zero_based_tag_columns = [0, 1, 2] - mapper.set_tag_columns(zero_based_tag_columns, finalize_mapping=True) - self.assertTrue(len(mapper._final_column_map) == 3) - self.assertTrue(len(mapper.check_for_mapping_issues()) == 0) - - def test_set_tag_columns_named(self): - mapper = ColumnMapper(warn_on_missing_column=True) - named_columns = ["Col1", "Col2", "Col3"] - mapper.set_tag_columns(named_columns) - mapper.set_column_map(named_columns) - self.assertTrue(len(mapper._final_column_map) == 3) - self.assertTrue(len(mapper.check_for_mapping_issues()) == 0) - - def test_set_tag_columns_named_unknown(self): - mapper = ColumnMapper(warn_on_missing_column=True) - two_columns = ["Col1", "Col2"] - named_columns = ["Col1", "Col2", "Col3"] - mapper.set_tag_columns(two_columns) - mapper.set_column_map(named_columns) - self.assertTrue(len(mapper._final_column_map) == 2) - self.assertTrue(len(mapper.check_for_mapping_issues()) == 1) - self.assertTrue(mapper.check_for_mapping_issues()[0]['code'] == ValidationErrors.HED_UNKNOWN_COLUMN) - - def test_set_tag_columns_mixed(self): - mapper = ColumnMapper() - mixed_columns = ["Col1", "Col2", 2] - column_map = ["Col1", "Col2", "Col3"] - mapper.set_tag_columns(mixed_columns) - mapper.set_column_map(column_map) - self.assertTrue(len(mapper._final_column_map) == 3) - self.assertTrue(len(mapper.check_for_mapping_issues()) == 0) - - def test_set_tag_column_missing(self): - mapper = ColumnMapper() - column_map = ["Col1", "Col2", "Col3"] - mapper.set_tag_columns(["Col1", "Col4"]) - mapper.set_column_map(column_map) - self.assertTrue(len(mapper._final_column_map) == 1) - self.assertTrue(len(mapper.check_for_mapping_issues()) == 1) - self.assertTrue(mapper.check_for_mapping_issues()[0]['code'] == ValidationErrors.HED_MISSING_REQUIRED_COLUMN) - - column_map = ["Col1", "Col2", "Col3"] - mapper.set_tag_columns(optional_tag_columns=["Col1", "Col4"]) - mapper.set_column_map(column_map) - self.assertTrue(len(mapper._final_column_map) == 1) - self.assertTrue(len(mapper.check_for_mapping_issues()) == 0) - - - def test_sidecar_and_columns(self): - mapper = ColumnMapper(Sidecar(self.basic_events_json)) - mapper.set_tag_columns(["Invalid", "Invalid2"]) - mapper.set_column_map(["Invalid", "Invalid2"]) - self.assertTrue(len(mapper._final_column_map) == 2) - self.assertTrue(len(mapper.check_for_mapping_issues()) == 1) - self.assertTrue(mapper.check_for_mapping_issues()[0]['code'] == ValidationErrors.SIDECAR_AND_OTHER_COLUMNS) - - def test_duplicate_list(self): - mapper = ColumnMapper() - mapper.set_tag_columns(["Invalid", "Invalid"]) - self.assertTrue(len(mapper._final_column_map) == 0) - self.assertTrue(len(mapper.check_for_mapping_issues()) == 3) - self.assertTrue(mapper.check_for_mapping_issues()[-1]['code'] == ValidationErrors.DUPLICATE_COLUMN_IN_LIST) - - mapper.set_tag_columns([0, 0]) - self.assertTrue(len(mapper._final_column_map) == 1) - self.assertTrue(len(mapper.check_for_mapping_issues()) == 1) - self.assertTrue(mapper.check_for_mapping_issues()[-1]['code'] == ValidationErrors.DUPLICATE_COLUMN_IN_LIST) - - mapper.set_tag_columns([0, "Column1"]) - mapper.set_column_map(["Column1"]) - self.assertTrue(len(mapper._final_column_map) == 1) - self.assertTrue(len(mapper.check_for_mapping_issues()) == 1) - self.assertTrue(mapper.check_for_mapping_issues()[-1]['code'] == ValidationErrors.DUPLICATE_COLUMN_IN_LIST) - - def test_duplicate_prefix(self): - mapper = ColumnMapper() - prefix_dict = { - 0: "Label/", - "Column1": "Description" - } - mapper.set_column_prefix_dictionary(prefix_dict) - mapper.set_column_map(["Column1"]) - self.assertTrue(len(mapper._final_column_map) == 1) - self.assertTrue(len(mapper.check_for_mapping_issues()) == 1) - self.assertTrue(mapper.check_for_mapping_issues()[-1]['code'] == ValidationErrors.DUPLICATE_COLUMN_IN_LIST) - - def test_duplicate_cross_lists(self): - mapper = ColumnMapper() - prefix_dict = { - 0: "Label/" - } - mapper.set_tag_columns([0]) - mapper.set_column_prefix_dictionary(prefix_dict) - mapper.set_column_map(["Column1"]) - self.assertTrue(len(mapper._final_column_map) == 1) - self.assertTrue(len(mapper.check_for_mapping_issues()) == 1) - self.assertTrue(mapper.check_for_mapping_issues()[-1]['code'] == ValidationErrors.DUPLICATE_COLUMN_BETWEEN_SOURCES) - - mapper = ColumnMapper() - prefix_dict = { - "Column1": "Label/" - } - mapper.set_tag_columns([0]) - mapper.set_column_prefix_dictionary(prefix_dict) - mapper.set_column_map(["Column1"]) - self.assertTrue(len(mapper._final_column_map) == 1) - self.assertTrue(len(mapper.check_for_mapping_issues()) == 1) - self.assertTrue(mapper.check_for_mapping_issues()[-1]['code'] == ValidationErrors.DUPLICATE_COLUMN_BETWEEN_SOURCES) - - - mapper.set_tag_columns(["Column1"]) - self.assertTrue(len(mapper._final_column_map) == 1) - self.assertTrue(len(mapper.check_for_mapping_issues()) == 1) - self.assertTrue(mapper.check_for_mapping_issues()[-1]['code'] == ValidationErrors.DUPLICATE_COLUMN_BETWEEN_SOURCES) - - def test_blank_column(self): - mapper = ColumnMapper() - mapper.set_column_map(["", None]) - self.assertTrue(len(mapper.check_for_mapping_issues()) == 2) - self.assertTrue(mapper.check_for_mapping_issues(allow_blank_names=False)[1]['code'] == ValidationErrors.HED_BLANK_COLUMN) - self.assertTrue(mapper.check_for_mapping_issues(allow_blank_names=False)[1]['code'] == ValidationErrors.HED_BLANK_COLUMN) - - def test_optional_column(self): - mapper = ColumnMapper() - mapper.set_tag_columns(tag_columns=["HED"]) - mapper.set_column_map({1: "HED"}) - self.assertTrue(len(mapper._final_column_map) == 1) - - mapper = ColumnMapper() - mapper.set_tag_columns(optional_tag_columns=["HED"]) - mapper.set_column_map({1: "HED"}) - self.assertTrue(len(mapper._final_column_map) == 1) - - mapper = ColumnMapper() - mapper.set_tag_columns(tag_columns=["HED"]) - self.assertTrue(len(mapper._final_column_map) == 0) - self.assertTrue(len(mapper.get_column_mapping_issues()) == 1) - - mapper = ColumnMapper() - mapper.set_tag_columns(optional_tag_columns=["HED"]) - self.assertTrue(len(mapper._final_column_map) == 0) - self.assertTrue(len(mapper.get_column_mapping_issues()) == 0) - - def test_add_json_file_events(self): - mapper = ColumnMapper() - mapper._set_sidecar(Sidecar(self.basic_events_json)) - self.assertTrue(len(mapper.sidecar_column_data) >= 2) - - def test__detect_event_type(self): - mapper = ColumnMapper() - mapper._set_sidecar(Sidecar(self.basic_events_json)) - self.assertTrue(mapper.sidecar_column_data[self.basic_event_name].column_type == self.basic_event_type) - - def test_tag_mapping_complex(self): - tag_columns = [0] - column_prefix_dictionary = {1: "Label/"} - optional_tag_columns = [2] - mapper = ColumnMapper(tag_columns=tag_columns, column_prefix_dictionary=column_prefix_dictionary, optional_tag_columns=optional_tag_columns) - self.assertEqual(list(mapper._final_column_map), [0, 1, 2]) - self.assertEqual(mapper._final_column_map[0].column_type, ColumnType.HEDTags) - self.assertEqual(mapper._final_column_map[1].column_type, ColumnType.Value) - self.assertEqual(mapper._final_column_map[1].hed_dict, "Label/#") - self.assertEqual(mapper._final_column_map[2].column_type, ColumnType.HEDTags) - - def test_get_def_dict(self): - mapper = ColumnMapper() - def_dict_empty = mapper.get_def_dict(self.hed_schema) - self.assertIsInstance(def_dict_empty, DefinitionDict) - def_dict_base = DefinitionDict("(Definition/TestDef, (Event))", self.hed_schema) - self.assertIsInstance(def_dict_base, DefinitionDict) - self.assertEqual(len(def_dict_base.defs), 1) - def_dict = mapper.get_def_dict(self.hed_schema, extra_def_dicts=def_dict_base) - self.assertIsInstance(def_dict, DefinitionDict) - self.assertEqual(len(def_dict.defs), 1) - - mapper._set_sidecar(Sidecar(self.bids_events_defs)) - def_dict_combined = mapper.get_def_dict(self.hed_schema, extra_def_dicts=def_dict_base) - self.assertIsInstance(def_dict_combined, DefinitionDict) - self.assertEqual(len(def_dict_combined.defs), 4) - - -if __name__ == '__main__': - unittest.main() +import unittest +import os + +from hed.models import ColumnMapper, ColumnType, HedString +from hed.models.sidecar import Sidecar, DefinitionDict +from hed.errors import ValidationErrors +from hed import load_schema + + +class Test(unittest.TestCase): + @classmethod + def setUpClass(cls): + base_data_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../data/') + schema_file = 'schema_tests/HED8.0.0t.xml' + + cls.hed_schema = load_schema(os.path.join(base_data_dir, schema_file)) + cls.integer_key_dictionary = {0: 'one', 1: 'two', 2: 'three'} + cls.zero_based_row_column_count = 3 + cls.column_prefix_dictionary = {2: 'Event/Description/', 3: 'Event/Label/', 4: 'Event/Category/'} + cls.category_key = 'Event/Category/' + cls.category_participant_and_stimulus_tags = \ + HedString('Event/Category/Participant response, Event/Category/Stimulus', cls.hed_schema) + + cls.row_with_hed_tags = ['event1', 'tag1', 'tag2'] + + cls.base_data_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../data/') + cls.basic_events_json = os.path.join(cls.base_data_dir, "sidecar_tests/both_types_events.json") + cls.bids_events_defs = os.path.join(cls.base_data_dir, "validator_tests/bids_events.json") + cls.basic_event_name = "trial_type" + cls.basic_event_type = ColumnType.Categorical + cls.basic_hed_tags_column = "onset" + cls.basic_column_map = ["onset", "duration", "trial_type", "response_time", " stim_file"] + cls.basic_event_row = ["1.2", "0.6", "go", "1.435", "images/red_square.jpg"] + cls.basic_event_row_invalid = ["1.2", "0.6", "invalid_category_key", "1.435", "images/red_square.jpg"] + + def test_set_tag_columns(self): + mapper = ColumnMapper() + zero_based_tag_columns = [0, 1, 2] + mapper.set_tag_columns(zero_based_tag_columns, finalize_mapping=True) + self.assertTrue(len(mapper._final_column_map) == 3) + self.assertTrue(len(mapper.check_for_mapping_issues()) == 0) + + def test_set_tag_columns_named(self): + mapper = ColumnMapper(warn_on_missing_column=True) + named_columns = ["Col1", "Col2", "Col3"] + mapper.set_tag_columns(named_columns) + mapper.set_column_map(named_columns) + self.assertTrue(len(mapper._final_column_map) == 3) + self.assertTrue(len(mapper.check_for_mapping_issues()) == 0) + + def test_set_tag_columns_named_unknown(self): + mapper = ColumnMapper(warn_on_missing_column=True) + two_columns = ["Col1", "Col2"] + named_columns = ["Col1", "Col2", "Col3"] + mapper.set_tag_columns(two_columns) + mapper.set_column_map(named_columns) + self.assertTrue(len(mapper._final_column_map) == 2) + self.assertTrue(len(mapper.check_for_mapping_issues()) == 1) + self.assertTrue(mapper.check_for_mapping_issues()[0]['code'] == ValidationErrors.HED_UNKNOWN_COLUMN) + + def test_set_tag_columns_mixed(self): + mapper = ColumnMapper() + mixed_columns = ["Col1", "Col2", 2] + column_map = ["Col1", "Col2", "Col3"] + mapper.set_tag_columns(mixed_columns) + mapper.set_column_map(column_map) + self.assertTrue(len(mapper._final_column_map) == 3) + self.assertTrue(len(mapper.check_for_mapping_issues()) == 0) + + def test_set_tag_column_missing(self): + mapper = ColumnMapper() + column_map = ["Col1", "Col2", "Col3"] + mapper.set_tag_columns(["Col1", "Col4"]) + mapper.set_column_map(column_map) + self.assertTrue(len(mapper._final_column_map) == 1) + self.assertTrue(len(mapper.check_for_mapping_issues()) == 1) + self.assertTrue(mapper.check_for_mapping_issues()[0]['code'] == ValidationErrors.HED_MISSING_REQUIRED_COLUMN) + + column_map = ["Col1", "Col2", "Col3"] + mapper.set_tag_columns(optional_tag_columns=["Col1", "Col4"]) + mapper.set_column_map(column_map) + self.assertTrue(len(mapper._final_column_map) == 1) + self.assertTrue(len(mapper.check_for_mapping_issues()) == 0) + + def test_sidecar_and_columns(self): + mapper = ColumnMapper(Sidecar(self.basic_events_json)) + mapper.set_tag_columns(["Invalid", "Invalid2"]) + mapper.set_column_map(["Invalid", "Invalid2"]) + self.assertTrue(len(mapper._final_column_map) == 2) + self.assertTrue(len(mapper.check_for_mapping_issues()) == 1) + self.assertTrue(mapper.check_for_mapping_issues()[0]['code'] == ValidationErrors.SIDECAR_AND_OTHER_COLUMNS) + + def test_duplicate_list(self): + mapper = ColumnMapper() + mapper.set_tag_columns(["Invalid", "Invalid"]) + self.assertTrue(len(mapper._final_column_map) == 0) + self.assertTrue(len(mapper.check_for_mapping_issues()) == 3) + self.assertTrue(mapper.check_for_mapping_issues()[-1]['code'] == ValidationErrors.DUPLICATE_COLUMN_IN_LIST) + + mapper.set_tag_columns([0, 0]) + self.assertTrue(len(mapper._final_column_map) == 1) + self.assertTrue(len(mapper.check_for_mapping_issues()) == 1) + self.assertTrue(mapper.check_for_mapping_issues()[-1]['code'] == ValidationErrors.DUPLICATE_COLUMN_IN_LIST) + + mapper.set_tag_columns([0, "Column1"]) + mapper.set_column_map(["Column1"]) + self.assertTrue(len(mapper._final_column_map) == 1) + self.assertTrue(len(mapper.check_for_mapping_issues()) == 1) + self.assertTrue(mapper.check_for_mapping_issues()[-1]['code'] == ValidationErrors.DUPLICATE_COLUMN_IN_LIST) + + def test_duplicate_prefix(self): + mapper = ColumnMapper() + prefix_dict = { + 0: "Label/", + "Column1": "Description" + } + mapper.set_column_prefix_dictionary(prefix_dict) + mapper.set_column_map(["Column1"]) + self.assertTrue(len(mapper._final_column_map) == 1) + self.assertTrue(len(mapper.check_for_mapping_issues()) == 1) + self.assertTrue(mapper.check_for_mapping_issues()[-1]['code'] == ValidationErrors.DUPLICATE_COLUMN_IN_LIST) + + def test_duplicate_cross_lists(self): + mapper = ColumnMapper() + prefix_dict = { + 0: "Label/" + } + mapper.set_tag_columns([0]) + mapper.set_column_prefix_dictionary(prefix_dict) + mapper.set_column_map(["Column1"]) + self.assertTrue(len(mapper._final_column_map) == 1) + self.assertTrue(len(mapper.check_for_mapping_issues()) == 1) + self.assertTrue(mapper.check_for_mapping_issues()[-1]['code'] == + ValidationErrors.DUPLICATE_COLUMN_BETWEEN_SOURCES) + + mapper = ColumnMapper() + prefix_dict = { + "Column1": "Label/" + } + mapper.set_tag_columns([0]) + mapper.set_column_prefix_dictionary(prefix_dict) + mapper.set_column_map(["Column1"]) + self.assertTrue(len(mapper._final_column_map) == 1) + self.assertTrue(len(mapper.check_for_mapping_issues()) == 1) + self.assertTrue(mapper.check_for_mapping_issues()[-1]['code'] == + ValidationErrors.DUPLICATE_COLUMN_BETWEEN_SOURCES) + + mapper.set_tag_columns(["Column1"]) + self.assertTrue(len(mapper._final_column_map) == 1) + self.assertTrue(len(mapper.check_for_mapping_issues()) == 1) + self.assertTrue(mapper.check_for_mapping_issues()[-1]['code'] == + ValidationErrors.DUPLICATE_COLUMN_BETWEEN_SOURCES) + + def test_blank_column(self): + mapper = ColumnMapper() + mapper.set_column_map(["", None]) + self.assertTrue(len(mapper.check_for_mapping_issues()) == 2) + self.assertTrue(mapper.check_for_mapping_issues(allow_blank_names=False)[1]['code'] == + ValidationErrors.HED_BLANK_COLUMN) + self.assertTrue(mapper.check_for_mapping_issues(allow_blank_names=False)[1]['code'] == + ValidationErrors.HED_BLANK_COLUMN) + + def test_optional_column(self): + mapper = ColumnMapper() + mapper.set_tag_columns(tag_columns=["HED"]) + mapper.set_column_map({1: "HED"}) + self.assertTrue(len(mapper._final_column_map) == 1) + + mapper = ColumnMapper() + mapper.set_tag_columns(optional_tag_columns=["HED"]) + mapper.set_column_map({1: "HED"}) + self.assertTrue(len(mapper._final_column_map) == 1) + + mapper = ColumnMapper() + mapper.set_tag_columns(tag_columns=["HED"]) + self.assertTrue(len(mapper._final_column_map) == 0) + self.assertTrue(len(mapper.get_column_mapping_issues()) == 1) + + mapper = ColumnMapper() + mapper.set_tag_columns(optional_tag_columns=["HED"]) + self.assertTrue(len(mapper._final_column_map) == 0) + self.assertTrue(len(mapper.get_column_mapping_issues()) == 0) + + def test_add_json_file_events(self): + mapper = ColumnMapper() + mapper._set_sidecar(Sidecar(self.basic_events_json)) + self.assertTrue(len(mapper.sidecar_column_data) >= 2) + + def test__detect_event_type(self): + mapper = ColumnMapper() + mapper._set_sidecar(Sidecar(self.basic_events_json)) + self.assertTrue(mapper.sidecar_column_data[self.basic_event_name].column_type == self.basic_event_type) + + def test_tag_mapping_complex(self): + tag_columns = [0] + column_prefix_dictionary = {1: "Label/"} + optional_tag_columns = [2] + mapper = ColumnMapper(tag_columns=tag_columns, column_prefix_dictionary=column_prefix_dictionary, + optional_tag_columns=optional_tag_columns) + self.assertEqual(list(mapper._final_column_map), [0, 1, 2]) + self.assertEqual(mapper._final_column_map[0].column_type, ColumnType.HEDTags) + self.assertEqual(mapper._final_column_map[1].column_type, ColumnType.Value) + self.assertEqual(mapper._final_column_map[1].hed_dict, "Label/#") + self.assertEqual(mapper._final_column_map[2].column_type, ColumnType.HEDTags) + + def test_get_def_dict(self): + mapper = ColumnMapper() + def_dict_empty = mapper.get_def_dict(self.hed_schema) + self.assertIsInstance(def_dict_empty, DefinitionDict) + def_dict_base = DefinitionDict("(Definition/TestDef, (Event))", self.hed_schema) + self.assertIsInstance(def_dict_base, DefinitionDict) + self.assertEqual(len(def_dict_base.defs), 1) + def_dict = mapper.get_def_dict(self.hed_schema, extra_def_dicts=def_dict_base) + self.assertIsInstance(def_dict, DefinitionDict) + self.assertEqual(len(def_dict.defs), 1) + + mapper._set_sidecar(Sidecar(self.bids_events_defs)) + def_dict_combined = mapper.get_def_dict(self.hed_schema, extra_def_dicts=def_dict_base) + self.assertIsInstance(def_dict_combined, DefinitionDict) + self.assertEqual(len(def_dict_combined.defs), 4) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/models/test_definition_dict.py b/tests/models/test_definition_dict.py index 9d582997a..10130594a 100644 --- a/tests/models/test_definition_dict.py +++ b/tests/models/test_definition_dict.py @@ -62,50 +62,56 @@ def test_definitions(self): 'noGroupTag': "(Definition/InvalidDef0)", 'placeholderNoGroupTag': "(Definition/InvalidDef1/#)", 'placeholderWrongSpot': "(Definition/InvalidDef1#)", - 'twoDefTags': f"(Definition/ValidDef1,Definition/InvalidDef2,{self.def_contents_string})", + 'twoDefTags': f"(Definition/InvalidDef1,Definition/InvalidDef2,{self.def_contents_string})", 'twoGroupTags': f"(Definition/InvalidDef1,{self.def_contents_string},{self.def_contents_string2})", + 'extraValidTags': "(Definition/InvalidDefA, Red, Blue)", 'extraOtherTags': "(Definition/InvalidDef1, InvalidContents)", - 'duplicateDef': f"(Definition/Def1, {self.def_contents_string}), (Definition/Def1, {self.def_contents_string})", - 'duplicateDef2': f"(Definition/Def1, {self.def_contents_string}), (Definition/Def1/#, {self.placeholder_def_contents})", + 'duplicateDef': (f"(Definition/Def1, {self.def_contents_string}), " + f"(Definition/Def1, {self.def_contents_string})"), + 'duplicateDef2': (f"(Definition/Def1, {self.def_contents_string}), " + f"(Definition/Def1/#, {self.placeholder_def_contents})"), 'defTooManyPlaceholders': self.placeholder_invalid_def_string, 'invalidPlaceholder': f"(Definition/InvalidDef1/InvalidPlaceholder, {self.def_contents_string})", - 'invalidPlaceholderExtension': f"(Definition/InvalidDef1/this-part-is-not-allowed/#, {self.def_contents_string})", + 'invalidPlaceholderExtension': + f"(Definition/InvalidDef1/this-part-is-not-allowed/#, {self.def_contents_string})", 'defInGroup': "(Definition/ValidDefName, (Def/ImproperlyPlacedDef))", 'defExpandInGroup': "(Definition/ValidDefName, (Def-expand/ImproperlyPlacedDef, (ImproperContents)))", 'doublePoundSignPlaceholder': f"(Definition/InvalidDef/##, {self.placeholder_def_contents})", - 'doublePoundSignDiffPlaceholder': f"(Definition/InvalidDef/#, (Age/##,Item/TestDef2))", - 'placeholdersWrongSpot': f"(Definition/InvalidDef/#, (Age/#,Item/TestDef2))", + 'doublePoundSignDiffPlaceholder': "(Definition/InvalidDef/#, (Age/##,Item/TestDef2))", + 'placeholdersWrongSpot': "(Definition/InvalidDef/#, (Age/#,Item/TestDef2))", } expected_results = { - 'noGroupTag': self.format_error(DefinitionErrors.NO_DEFINITION_CONTENTS, - "InvalidDef0"), - 'placeholderNoGroupTag': self.format_error(DefinitionErrors.NO_DEFINITION_CONTENTS,"InvalidDef1/#"), - 'placeholderWrongSpot': self.format_error(DefinitionErrors.NO_DEFINITION_CONTENTS,"InvalidDef1#") + self.format_error(DefinitionErrors.INVALID_DEFINITION_EXTENSION, - tag=0, def_name="InvalidDef1#"), - 'twoDefTags': self.format_error(DefinitionErrors.WRONG_NUMBER_TAGS, - "ValidDef1", ["Definition/InvalidDef2"]), - 'twoGroupTags': self.format_error(DefinitionErrors.WRONG_NUMBER_GROUPS, - "InvalidDef1", - [self.def_contents_string, self.def_contents_string2]), - 'extraOtherTags': self.format_error(DefinitionErrors.NO_DEFINITION_CONTENTS, "InvalidDef1") - + self.format_error(DefinitionErrors.WRONG_NUMBER_TAGS, "InvalidDef1", ['InvalidContents']), + 'noGroupTag': [], + 'placeholderNoGroupTag': self.format_error(DefinitionErrors.NO_DEFINITION_CONTENTS, "InvalidDef1/#"), + 'placeholderWrongSpot': self.format_error(DefinitionErrors.NO_DEFINITION_CONTENTS, "InvalidDef1#") + + self.format_error(DefinitionErrors.INVALID_DEFINITION_EXTENSION, + tag=0, def_name="InvalidDef1#"), + 'twoDefTags': self.format_error(DefinitionErrors.WRONG_NUMBER_TAGS, "InvalidDef1", + ["Definition/InvalidDef2"]), + 'twoGroupTags': self.format_error(DefinitionErrors.WRONG_NUMBER_GROUPS, "InvalidDef1", + [self.def_contents_string, self.def_contents_string2]), + 'extraValidTags': self.format_error(DefinitionErrors.WRONG_NUMBER_TAGS, "InvalidDefA", + ["Red", "Blue"]), + 'extraOtherTags': self.format_error(DefinitionErrors.WRONG_NUMBER_TAGS, "InvalidDef1", + ["InvalidContents"]), 'duplicateDef': self.format_error(DefinitionErrors.DUPLICATE_DEFINITION, "Def1"), 'duplicateDef2': self.format_error(DefinitionErrors.DUPLICATE_DEFINITION, "Def1"), 'defTooManyPlaceholders': self.format_error(DefinitionErrors.WRONG_NUMBER_PLACEHOLDER_TAGS, - "TestDefPlaceholder", expected_count=1, - tag_list=["Age/#", "Item/TestDef2/#"]), + "TestDefPlaceholder", expected_count=1, + tag_list=["Age/#", "Item/TestDef2/#"]), 'invalidPlaceholderExtension': self.format_error(DefinitionErrors.INVALID_DEFINITION_EXTENSION, - tag=0, def_name="InvalidDef1/this-part-is-not-allowed"), + tag=0, def_name="InvalidDef1/this-part-is-not-allowed"), 'invalidPlaceholder': self.format_error(DefinitionErrors.INVALID_DEFINITION_EXTENSION, - tag=0, def_name="InvalidDef1/InvalidPlaceholder"), + tag=0, def_name="InvalidDef1/InvalidPlaceholder"), 'defInGroup': self.format_error(DefinitionErrors.DEF_TAG_IN_DEFINITION, - tag=HedTag("Def/ImproperlyPlacedDef", self.hed_schema), def_name="ValidDefName"), + tag=HedTag("Def/ImproperlyPlacedDef", self.hed_schema), + def_name="ValidDefName"), 'defExpandInGroup': self.format_error(DefinitionErrors.DEF_TAG_IN_DEFINITION, tag=HedTag("Def-expand/ImproperlyPlacedDef", self.hed_schema), def_name="ValidDefName"), 'doublePoundSignPlaceholder': self.format_error(DefinitionErrors.INVALID_DEFINITION_EXTENSION, - tag=0, def_name="InvalidDef/##"), + tag=0, def_name="InvalidDef/##"), 'doublePoundSignDiffPlaceholder': self.format_error(DefinitionErrors.WRONG_NUMBER_PLACEHOLDER_TAGS, "InvalidDef", expected_count=1, tag_list=['Age/##']), 'placeholdersWrongSpot': [] @@ -144,5 +150,6 @@ def test_altering_definition_contents(self): self.assertNotEqual(hed_string1, hed_string2) + if __name__ == '__main__': unittest.main() diff --git a/tests/models/test_definition_entry.py b/tests/models/test_definition_entry.py index 07854ad8d..ead69c87b 100644 --- a/tests/models/test_definition_entry.py +++ b/tests/models/test_definition_entry.py @@ -1,16 +1,12 @@ -import unittest - -from hed.models.definition_entry import DefinitionEntry -from hed.models.hed_string import HedString -from hed.schema.hed_schema_io import load_schema_version - - -class Test(unittest.TestCase): - - @classmethod - def setUpClass(cls): - pass - - -if __name__ == '__main__': - unittest.main() +import unittest + + +class Test(unittest.TestCase): + + @classmethod + def setUpClass(cls): + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/models/test_df_util.py b/tests/models/test_df_util.py index 434f5d90d..247a073b4 100644 --- a/tests/models/test_df_util.py +++ b/tests/models/test_df_util.py @@ -1,584 +1,617 @@ -import unittest -import pandas as pd - - -from hed import load_schema_version -from hed.models.df_util import shrink_defs, expand_defs, convert_to_form, process_def_expands -from hed import DefinitionDict -from hed.models.df_util import _handle_curly_braces_refs, _indexed_dict_from_onsets, _filter_by_index_list, split_delay_tags - - -class TestShrinkDefs(unittest.TestCase): - def setUp(self): - self.schema = load_schema_version("8.3.0") - - def test_shrink_defs_normal(self): - df = pd.DataFrame({"column1": ["(Def-expand/TestDefNormal,(Acceleration/2471,Action/TestDef2)),Event/SomeEvent"]}) - expected_df = pd.DataFrame({"column1": ["Def/TestDefNormal,Event/SomeEvent"]}) - shrink_defs(df, self.schema, ['column1']) - pd.testing.assert_frame_equal(df, expected_df) - - def test_shrink_defs_placeholder(self): - df = pd.DataFrame({"column1": ["(Def-expand/TestDefPlaceholder/123,(Acceleration/123,Action/TestDef2)),Item/SomeItem"]}) - expected_df = pd.DataFrame({"column1": ["Def/TestDefPlaceholder/123,Item/SomeItem"]}) - shrink_defs(df, self.schema, ['column1']) - pd.testing.assert_frame_equal(df, expected_df) - - def test_shrink_defs_no_matching_tags(self): - df = pd.DataFrame({"column1": ["(Event/SomeEvent, Item/SomeItem,Acceleration/25)"]}) - expected_df = pd.DataFrame({"column1": ["(Event/SomeEvent, Item/SomeItem,Acceleration/25)"]}) - shrink_defs(df, self.schema, ['column1']) - pd.testing.assert_frame_equal(df, expected_df) - - def test_shrink_defs_multiple_columns(self): - df = pd.DataFrame({"column1": ["(Def-expand/TestDefNormal,(Acceleration/2471,Action/TestDef2)),Event/SomeEvent"], - "column2": ["(Def-expand/TestDefPlaceholder/123,(Acceleration/123,Action/TestDef2)),Item/SomeItem"]}) - expected_df = pd.DataFrame({"column1": ["Def/TestDefNormal,Event/SomeEvent"], - "column2": ["Def/TestDefPlaceholder/123,Item/SomeItem"]}) - shrink_defs(df, self.schema, ['column1', 'column2']) - pd.testing.assert_frame_equal(df, expected_df) - - def test_shrink_defs_multiple_defs_same_line(self): - df = pd.DataFrame({"column1": ["(Def-expand/TestDefNormal,(Acceleration/2471,Action/TestDef2)),(Def-expand/TestDefPlaceholder/123,(Acceleration/123,Action/TestDef2)),Acceleration/30"]}) - expected_df = pd.DataFrame({"column1": ["Def/TestDefNormal,Def/TestDefPlaceholder/123,Acceleration/30"]}) - shrink_defs(df, self.schema, ['column1']) - pd.testing.assert_frame_equal(df, expected_df) - - def test_shrink_defs_mixed_tags(self): - df = pd.DataFrame({"column1": [ - "(Def-expand/TestDefNormal,(Acceleration/2471,Action/TestDef2)),Event/SomeEvent,(Def-expand/TestDefPlaceholder/123,(Acceleration/123,Action/TestDef2)),Item/SomeItem,Acceleration/25"]}) - expected_df = pd.DataFrame( - {"column1": ["Def/TestDefNormal,Event/SomeEvent,Def/TestDefPlaceholder/123,Item/SomeItem,Acceleration/25"]}) - shrink_defs(df, self.schema, ['column1']) - pd.testing.assert_frame_equal(df, expected_df) - - def test_shrink_defs_series_normal(self): - series = pd.Series(["(Def-expand/TestDefNormal,(Acceleration/2471,Action/TestDef2)),Event/SomeEvent"]) - expected_series = pd.Series(["Def/TestDefNormal,Event/SomeEvent"]) - shrink_defs(series, self.schema, None) - pd.testing.assert_series_equal(series, expected_series) - - def test_shrink_defs_series_placeholder(self): - series = pd.Series(["(Def-expand/TestDefPlaceholder/123,(Acceleration/123,Action/TestDef2)),Item/SomeItem"]) - expected_series = pd.Series(["Def/TestDefPlaceholder/123,Item/SomeItem"]) - shrink_defs(series, self.schema, None) - pd.testing.assert_series_equal(series, expected_series) - - -class TestExpandDefs(unittest.TestCase): - def setUp(self): - self.schema = load_schema_version("8.3.0") - self.def_dict = DefinitionDict(["(Definition/TestDefNormal,(Acceleration/2471,Action/TestDef2))", - "(Definition/TestDefPlaceholder/#,(Acceleration/#,Action/TestDef2))"], - hed_schema=self.schema) - - def test_expand_defs_normal(self): - df = pd.DataFrame({"column1": ["Def/TestDefNormal,Event/SomeEvent"]}) - expected_df = pd.DataFrame( - {"column1": ["(Def-expand/TestDefNormal,(Acceleration/2471,Action/TestDef2)),Event/SomeEvent"]}) - expand_defs(df, self.schema, self.def_dict, ['column1']) - pd.testing.assert_frame_equal(df, expected_df) - - def test_expand_defs_placeholder(self): - df = pd.DataFrame({"column1": ["Def/TestDefPlaceholder/123,Item/SomeItem"]}) - expected_df = pd.DataFrame({"column1": [ - "(Def-expand/TestDefPlaceholder/123,(Acceleration/123,Action/TestDef2)),Item/SomeItem"]}) - expand_defs(df, self.schema, self.def_dict, ['column1']) - pd.testing.assert_frame_equal(df, expected_df) - - def test_expand_defs_no_matching_tags(self): - df = pd.DataFrame({"column1": ["(Event/SomeEvent,Item/SomeItem,Acceleration/25)"]}) - expected_df = pd.DataFrame({"column1": ["(Event/SomeEvent,Item/SomeItem,Acceleration/25)"]}) - expand_defs(df, self.schema, self.def_dict, ['column1']) - pd.testing.assert_frame_equal(df, expected_df) - - def test_expand_defs_multiple_columns(self): - df = pd.DataFrame({"column1": ["Def/TestDefNormal,Event/SomeEvent"], - "column2": ["Def/TestDefPlaceholder/123,Item/SomeItem"]}) - expected_df = pd.DataFrame( - {"column1": ["(Def-expand/TestDefNormal,(Acceleration/2471,Action/TestDef2)),Event/SomeEvent"], - "column2": [ - "(Def-expand/TestDefPlaceholder/123,(Acceleration/123,Action/TestDef2)),Item/SomeItem"]}) - expand_defs(df, self.schema, self.def_dict, ['column1', 'column2']) - pd.testing.assert_frame_equal(df, expected_df) - - def test_expand_defs_series_normal(self): - series = pd.Series(["Def/TestDefNormal,Event/SomeEvent"]) - expected_series = pd.Series(["(Def-expand/TestDefNormal,(Acceleration/2471,Action/TestDef2)),Event/SomeEvent"]) - expand_defs(series, self.schema, self.def_dict, None) - pd.testing.assert_series_equal(series, expected_series) - - def test_expand_defs_series_placeholder(self): - series = pd.Series(["Def/TestDefPlaceholder/123,Item/SomeItem"]) - expected_series = pd.Series(["(Def-expand/TestDefPlaceholder/123,(Acceleration/123,Action/TestDef2)),Item/SomeItem"]) - expand_defs(series, self.schema, self.def_dict, None) - pd.testing.assert_series_equal(series, expected_series) - - -class TestConvertToForm(unittest.TestCase): - def setUp(self): - self.schema = load_schema_version("8.2.0") - - def test_convert_to_form_short_tags(self): - df = pd.DataFrame({"column1": ["Property/Sensory-property/Sensory-attribute/Visual-attribute/Color/CSS-color/White-color/Azure,Action/Perceive/See"]}) - expected_df = pd.DataFrame({"column1": ["Azure,See"]}) - convert_to_form(df, self.schema, "short_tag", ['column1']) - pd.testing.assert_frame_equal(df, expected_df) - - def test_convert_to_form_long_tags(self): - df = pd.DataFrame({"column1": ["CSS-color/White-color/Azure,Action/Perceive/See"]}) - expected_df = pd.DataFrame({"column1": ["Property/Sensory-property/Sensory-attribute/Visual-attribute/Color/CSS-color/White-color/Azure,Action/Perceive/See"]}) - convert_to_form(df, self.schema, "long_tag", ['column1']) - pd.testing.assert_frame_equal(df, expected_df) - - def test_convert_to_form_series_short_tags(self): - series = pd.Series(["Property/Sensory-property/Sensory-attribute/Visual-attribute/Color/CSS-color/White-color/Azure,Action/Perceive/See"]) - expected_series = pd.Series(["Azure,See"]) - convert_to_form(series, self.schema, "short_tag") - pd.testing.assert_series_equal(series, expected_series) - - def test_convert_to_form_series_long_tags(self): - series = pd.Series(["CSS-color/White-color/Azure,Action/Perceive/See"]) - expected_series = pd.Series(["Property/Sensory-property/Sensory-attribute/Visual-attribute/Color/CSS-color/White-color/Azure,Action/Perceive/See"]) - convert_to_form(series, self.schema, "long_tag") - pd.testing.assert_series_equal(series, expected_series) - - def test_convert_to_form_multiple_tags_short(self): - df = pd.DataFrame({"column1": ["Visual-attribute/Color/CSS-color/White-color/Azure,Biological-item/Anatomical-item/Body-part/Head/Face/Nose,Spatiotemporal-value/Rate-of-change/Acceleration/4.5 m-per-s^2"]}) - expected_df = pd.DataFrame({"column1": ["Azure,Nose,Acceleration/4.5 m-per-s^2"]}) - convert_to_form(df, self.schema, "short_tag", ['column1']) - pd.testing.assert_frame_equal(df, expected_df) - - def test_convert_to_form_multiple_tags_long(self): - df = pd.DataFrame({"column1": ["CSS-color/White-color/Azure,Anatomical-item/Body-part/Head/Face/Nose,Rate-of-change/Acceleration/4.5 m-per-s^2"]}) - expected_df = pd.DataFrame({"column1": ["Property/Sensory-property/Sensory-attribute/Visual-attribute/Color/CSS-color/White-color/Azure,Item/Biological-item/Anatomical-item/Body-part/Head/Face/Nose,Property/Data-property/Data-value/Spatiotemporal-value/Rate-of-change/Acceleration/4.5 m-per-s^2"]}) - convert_to_form(df, self.schema, "long_tag", ['column1']) - pd.testing.assert_frame_equal(df, expected_df) - - def test_basic_expand_detection(self): - # all simple cases with no duplicates - test_strings = [ - "(Def-expand/A1/1, (Action/1, Acceleration/5, Item-count/3))", - "(Def-expand/A1/2, (Action/2, Acceleration/5, Item-count/3))", - "(Def-expand/B2/3, (Action/3, Collection/animals, Alert))", - "(Def-expand/B2/4, (Action/4, Collection/animals, Alert))", - "(Def-expand/C3/5, (Action/5, Joyful, Event))", - "(Def-expand/C3/6, (Action/6, Joyful, Event))" - ] - process_def_expands(test_strings, self.schema) - - def test_mixed_detection(self): - # Cases where you can only retroactively identify the first def-expand - test_strings = [ - # Basic example first just to verify - "(Def-expand/A1/1, (Action/1, Acceleration/5, Item-count/2))", - "(Def-expand/A1/2, (Action/2, Acceleration/5, Item-count/2))", - # Out of order ambiguous - "(Def-expand/B2/3, (Action/3, Collection/animals, Acceleration/3))", - "(Def-expand/B2/4, (Action/4, Collection/animals, Acceleration/3))", - # Multiple tags - "(Def-expand/C3/5, (Action/5, Acceleration/5, Item-count/5))", - "(Def-expand/C3/6, (Action/6, Acceleration/5, Item-count/5))", - # Multiple tags2 - "(Def-expand/D4/7, (Action/7, Acceleration/7, Item-count/8))", - "(Def-expand/D4/8, (Action/8, Acceleration/7, Item-count/8))" - # Multiple tags3 - "(Def-expand/D5/7, (Action/7, Acceleration/7, Item-count/8, Event))", - "(Def-expand/D5/8, (Action/8, Acceleration/7, Item-count/8, Event))" - ] - def_dict, ambiguous_defs, _ = process_def_expands(test_strings, self.schema) - self.assertEqual(len(def_dict), 5) - - def test_ambiguous_defs(self): - # Cases that can't be identified - test_strings = [ - "(Def-expand/A1/2, (Action/2, Acceleration/5, Item-count/2))", - "(Def-expand/B2/3, (Action/3, Collection/animals, Acceleration/3))", - "(Def-expand/C3/5, (Action/5, Acceleration/5, Item-count/5))", - "(Def-expand/D4/7, (Action/7, Acceleration/7, Item-count/8))", - "(Def-expand/D5/7, (Action/7, Acceleration/7, Item-count/8, Event))", - ] - _, ambiguous_defs, _ = process_def_expands(test_strings, self.schema) - self.assertEqual(len(ambiguous_defs), 5) - - def test_ambiguous_conflicting_defs(self): - # This is invalid due to conflicting defs - test_strings = [ - "(Def-expand/A1/2, (Action/2, Age/5, Item-count/2))", - "(Def-expand/A1/3, (Action/3, Age/4, Item-count/3))", - - # This could be identified, but fails due to the above raising errors - "(Def-expand/A1/4, (Action/4, Age/5, Item-count/2))", - ] - defs, ambiguous, errors = process_def_expands(test_strings, self.schema) - self.assertEqual(len(defs), 0) - self.assertEqual(len(ambiguous), 0) - self.assertEqual(len(errors["a1"]), 3) - - def test_errors(self): - # Basic recognition of conflicting errors - test_strings = [ - "(Def-expand/A1/1, (Action/1, Age/5, Item-count/2))", - "(Def-expand/A1/2, (Action/2, Age/5, Item-count/2))", - "(Def-expand/A1/3, (Action/3, Age/5, Item-count/3))", - ] - _, _, errors = process_def_expands(test_strings, self.schema) - self.assertEqual(len(errors), 1) - - def test_errors_ambiguous(self): - # Verify we recognize errors when we had a def that can't be resolved. - test_strings = [ - "(Def-expand/A1/1, (Action/1, Age/5, Item-count/1))", - "(Def-expand/A1/2, (Action/2, Age/5, Item-count/3))", - "(Def-expand/A1/3, (Action/3, Age/5, Item-count/3))", - ] - known, ambiguous, errors = process_def_expands(test_strings, self.schema) - self.assertEqual(len(errors), 1) - self.assertEqual(len(errors["a1"]), 3) - - def test_errors_unresolved(self): - # Verify we recognize errors when we had a def that can't be resolved. - test_strings = [ - "(Def-expand/A1/1, (Action/1, Age/5, Item-count/1))", - "(Def-expand/A1/2, (Action/2, Age/5, Item-count/3))", - ] - known, ambiguous, errors = process_def_expands(test_strings, self.schema) - self.assertEqual(len(errors), 1) - self.assertEqual(len(errors["a1"]), 2) - - def test_def_expand_detection(self): - test_strings = [ - "(Def-expand/A1/1, (Action/1, Acceleration/5, Item-Count/2))", - "(Def-expand/A1/2, (Action/2, Acceleration/5, Item-Count/2))", - "(Def-expand/B2/3, (Action/3, Collection/animals, Alert))", - "(Def-expand/B2/4, (Action/4, Collection/animals, Alert))", - "(Def-expand/C3/5, (Action/5, Joyful, Event))", - "(Def-expand/C3/6, (Action/6, Joyful, Event))", - "((Def-expand/A1/7, (Action/7, Acceleration/5, Item-Count/2)), Event, Acceleration/10)", - "((Def-expand/A1/8, (Action/8, Acceleration/5, Item-Count/2)), Collection/toys, Item-Count/5)", - "((Def-expand/B2/9, (Action/9, Collection/animals, Alert)), Event, Collection/plants)", - "((Def-expand/B2/10, (Action/10, Collection/animals, Alert)), Joyful, Item-Count/3)", - "((Def-expand/C3/11, (Action/11, Joyful, Event)), Collection/vehicles, Acceleration/20)", - "((Def-expand/C3/12, (Action/12, Joyful, Event)), Alert, Item-Count/8)", - "((Def-expand/A1/13, (Action/13, Acceleration/5, Item-Count/2)), (Def-expand/B2/13, (Action/13, Collection/animals, Alert)), Event)", - "((Def-expand/A1/14, (Action/14, Acceleration/5, Item-Count/2)), Joyful, (Def-expand/C3/14, (Action/14, Joyful, Event)))", - "(Def-expand/B2/15, (Action/15, Collection/animals, Alert)), (Def-expand/C3/15, (Action/15, Joyful, Event)), Acceleration/30", - "((Def-expand/A1/16, (Action/16, Acceleration/5, Item-Count/2)), (Def-expand/B2/16, (Action/16, Collection/animals, Alert)), Collection/food)", - "(Def-expand/C3/17, (Action/17, Joyful, Event)), (Def-expand/A1/17, (Action/17, Acceleration/5, Item-Count/2)), Item-Count/6", - "((Def-expand/B2/18, (Action/18, Collection/animals, Alert)), (Def-expand/C3/18, (Action/18, Joyful, Event)), Alert)", - "(Def-expand/D1/Apple, (Task/Apple, Collection/cars, Attribute/color))", - "(Def-expand/D1/Banana, (Task/Banana, Collection/cars, Attribute/color))", - "(Def-expand/E2/Carrot, (Collection/Carrot, Collection/plants, Attribute/type))", - "(Def-expand/E2/Dog, (Collection/Dog, Collection/plants, Attribute/type))", - "((Def-expand/D1/Elephant, (Task/Elephant, Collection/cars, Attribute/color)), (Def-expand/E2/Fox, (Collection/Fox, Collection/plants, Attribute/type)), Event)", - "((Def-expand/D1/Giraffe, (Task/Giraffe, Collection/cars, Attribute/color)), Joyful, (Def-expand/E2/Horse, (Collection/Horse, Collection/plants, Attribute/type)))", - "(Def-expand/D1/Iguana, (Task/Iguana, Collection/cars, Attribute/color)), (Def-expand/E2/Jaguar, (Collection/Jaguar, Collection/plants, Attribute/type)), Acceleration/30", - "(Def-expand/F1/Lion, (Task/Lion, Collection/boats, Attribute/length))", - "(Def-expand/F1/Monkey, (Task/Monkey, Collection/boats, Attribute/length))", - "(Def-expand/G2/Nest, (Collection/Nest, Collection/instruments, Attribute/material))", - "(Def-expand/G2/Octopus, (Collection/Octopus, Collection/instruments, Attribute/material))", - "((Def-expand/F1/Panda, (Task/Panda, Collection/boats, Attribute/length)), (Def-expand/G2/Quail, (Collection/Quail, Collection/instruments, Attribute/material)), Event)", - "((Def-expand/F1/Rabbit, (Task/Rabbit, Collection/boats, Attribute/length)), Joyful, (Def-expand/G2/Snake, (Collection/Snake, Collection/instruments, Attribute/material)))", - "(Def-expand/F1/Turtle, (Task/Turtle, Collection/boats, Attribute/length)), (Def-expand/G2/Umbrella, (Collection/Umbrella, Collection/instruments, Attribute/material))" - ] - - def_dict, ambiguous, errors = process_def_expands(test_strings, self.schema) - self.assertEqual(len(def_dict), 7) - self.assertEqual(len(ambiguous), 0) - self.assertEqual(len(errors), 0) - -class TestInsertColumns(unittest.TestCase): - - def test_insert_columns_simple(self): - df = pd.DataFrame({ - "column1": ["{column2}, Event, Action"], - "column2": ["Item"] - }) - expected_df = pd.DataFrame({ - "column1": ["Item, Event, Action"] - }) - result = _handle_curly_braces_refs(df, refs=["column2"], column_names=df.columns) - pd.testing.assert_frame_equal(result, expected_df) - - def test_insert_columns_multiple_rows(self): - df = pd.DataFrame({ - "column1": ["{column2}, Event, Action", "Event, Action"], - "column2": ["Item", "Subject"] - }) - expected_df = pd.DataFrame({ - "column1": ["Item, Event, Action", "Event, Action"] - }) - result = _handle_curly_braces_refs(df, refs=["column2"], column_names=df.columns) - pd.testing.assert_frame_equal(result, expected_df) - - def test_insert_columns_multiple_columns(self): - df = pd.DataFrame({ - "column1": ["{column2}, Event, {column3}, Action"], - "column2": ["Item"], - "column3": ["Subject"] - }) - expected_df = pd.DataFrame({ - "column1": ["Item, Event, Subject, Action"] - }) - result = _handle_curly_braces_refs(df, refs=["column2", "column3"], column_names=df.columns) - pd.testing.assert_frame_equal(result, expected_df) - - def test_insert_columns_four_columns(self): - df = pd.DataFrame({ - "column1": ["{column2}, Event, {column3}, Action"], - "column2": ["Item"], - "column3": ["Subject"], - "column4": ["Data"] - }) - expected_df = pd.DataFrame({ - "column1": ["Item, Event, Subject, Action"], - "column4": ["Data"] - }) - result = _handle_curly_braces_refs(df, refs=["column2", "column3"], column_names=df.columns) - pd.testing.assert_frame_equal(result, expected_df) - - def test_insert_columns_with_nested_parentheses(self): - df = pd.DataFrame({ - "column1": ["({column2}, ({column3}, {column4})), Event, Action"], - "column2": ["Item"], - "column3": ["Subject"], - "column4": ["Data"] - }) - expected_df = pd.DataFrame({ - "column1": ["(Item, (Subject, Data)), Event, Action"] - }) - result = _handle_curly_braces_refs(df, refs=["column2", "column3", "column4"], column_names=df.columns) - pd.testing.assert_frame_equal(result, expected_df) - - def test_insert_columns_with_nested_parentheses_na_values(self): - df = pd.DataFrame({ - "column1": ["({column2}, ({column3}, {column4})), Event, Action"], - "column2": ["Data"], - "column3": ["n/a"], - "column4": ["n/a"] - }) - expected_df = pd.DataFrame({ - "column1": ["(Data), Event, Action"] - }) - result = _handle_curly_braces_refs(df, refs=["column2", "column3", "column4"], column_names=df.columns) - pd.testing.assert_frame_equal(result, expected_df) - - def test_insert_columns_with_nested_parentheses_na_values2(self): - df = pd.DataFrame({ - "column1": ["({column2}, ({column3}, {column4})), Event, Action"], - "column2": ["n/a"], - "column3": ["n/a"], - "column4": ["Data"] - }) - expected_df = pd.DataFrame({ - "column1": ["((Data)), Event, Action"] - }) - result = _handle_curly_braces_refs(df, refs=["column2", "column3", "column4"], column_names=df.columns) - pd.testing.assert_frame_equal(result, expected_df) - - def test_insert_columns_with_nested_parentheses_mixed_na_values(self): - df = pd.DataFrame({ - "column1": ["({column2}, ({column3}, {column4})), Event, Action"], - "column2": ["n/a"], - "column3": ["Subject"], - "column4": ["n/a"] - }) - expected_df = pd.DataFrame({ - "column1": ["((Subject)), Event, Action"] - }) - result = _handle_curly_braces_refs(df, refs=["column2", "column3", "column4"], column_names=df.columns) - pd.testing.assert_frame_equal(result, expected_df) - - def test_insert_columns_with_nested_parentheses_all_na_values(self): - df = pd.DataFrame({ - "column1": ["({column2}, ({column3}, {column4})), Event, Action"], - "column2": ["n/a"], - "column3": ["n/a"], - "column4": ["n/a"] - }) - expected_df = pd.DataFrame({ - "column1": ["Event, Action"] - }) - result = _handle_curly_braces_refs(df, refs=["column2", "column3", "column4"], column_names=df.columns) - pd.testing.assert_frame_equal(result, expected_df) - - def test_insert_columns_with_parentheses(self): - df = pd.DataFrame({ - "column1": ["({column2}), Event, Action"], - "column2": ["Item"] - }) - expected_df = pd.DataFrame({ - "column1": ["(Item), Event, Action"] - }) - result = _handle_curly_braces_refs(df, refs=["column2"], column_names=df.columns) - pd.testing.assert_frame_equal(result, expected_df) - - def test_insert_columns_with_parentheses_na_values(self): - df = pd.DataFrame({ - "column1": ["({column2}), Event, Action"], - "column2": ["n/a"], - "column3": ["n/a"] - }) - expected_df = pd.DataFrame({ - "column1": ["Event, Action"], - "column3": ["n/a"] - }) - result = _handle_curly_braces_refs(df, refs=["column2"], column_names=df.columns) - pd.testing.assert_frame_equal(result, expected_df) - -class TestOnsetDict(unittest.TestCase): - def test_empty_and_single_onset(self): - self.assertEqual(_indexed_dict_from_onsets([]), {}) - self.assertEqual(_indexed_dict_from_onsets([3.5]), {3.5: [0]}) - - def test_identical_and_approx_equal_onsets(self): - self.assertEqual(_indexed_dict_from_onsets([3.5, 3.5]), {3.5: [0, 1]}) - self.assertEqual(_indexed_dict_from_onsets([3.5, 3.500000001]), {3.5: [0], 3.500000001: [1]}) - self.assertEqual(_indexed_dict_from_onsets([3.5, 3.5000000000001]), {3.5: [0, 1]}) - - def test_distinct_and_mixed_onsets(self): - self.assertEqual(_indexed_dict_from_onsets([3.5, 4.0, 4.4]), {3.5: [0], 4.0: [1], 4.4: [2]}) - self.assertEqual(_indexed_dict_from_onsets([3.5, 3.5, 4.0, 4.4]), {3.5: [0, 1], 4.0: [2], 4.4: [3]}) - self.assertEqual(_indexed_dict_from_onsets([4.0, 3.5, 4.4, 4.4]), {4.0: [0], 3.5: [1], 4.4: [2, 3]}) - - def test_complex_onsets(self): - # Negative, zero, and positive onsets - self.assertEqual(_indexed_dict_from_onsets([-1.0, 0.0, 1.0]), {-1.0: [0], 0.0: [1], 1.0: [2]}) - - # Very close but distinct onsets - self.assertEqual(_indexed_dict_from_onsets([1.0, 1.0 + 1e-8, 1.0 + 2e-8]), - {1.0: [0], 1.0 + 1e-8: [1], 1.0 + 2e-8: [2]}) - # Very close - self.assertEqual(_indexed_dict_from_onsets([1.0, 1.0 + 1e-10, 1.0 + 2e-10]), - {1.0: [0, 1, 2]}) - - # Mixed scenario - self.assertEqual(_indexed_dict_from_onsets([3.5, 3.5, 4.0, 4.4, 4.4, -1.0]), - {3.5: [0, 1], 4.0: [2], 4.4: [3, 4], -1.0: [5]}) - - def test_empty_and_single_item_series(self): - self.assertTrue(_filter_by_index_list(pd.Series([], dtype=str), {}).equals(pd.Series([], dtype=str))) - self.assertTrue(_filter_by_index_list(pd.Series(["apple"]), {0: [0]}).equals(pd.Series(["apple"]))) - - def test_two_item_series_with_same_onset(self): - input_series = pd.Series(["apple", "orange"]) - expected_series = pd.Series(["apple,orange", ""]) - self.assertTrue(_filter_by_index_list(input_series, {0: [0, 1]}).equals(expected_series)) - - def test_multiple_item_series(self): - input_series = pd.Series(["apple", "orange", "banana", "mango"]) - indexed_dict = {0: [0, 1], 1: [2], 2: [3]} - expected_series = pd.Series(["apple,orange", "", "banana", "mango"]) - self.assertTrue(_filter_by_index_list(input_series, indexed_dict).equals(expected_series)) - - def test_complex_scenarios(self): - # Test with negative, zero and positive onsets - original = pd.Series(["negative", "zero", "positive"]) - indexed_dict = {-1: [0], 0: [1], 1: [2]} - expected_series1 = pd.Series(["negative", "zero", "positive"]) - self.assertTrue(_filter_by_index_list(original, indexed_dict).equals(expected_series1)) - - # Test with more complex indexed_dict - original2 = pd.Series(["apple", "orange", "banana", "mango", "grape"]) - indexed_dict2= {0: [0, 1], 1: [2], 2: [3, 4]} - expected_series2 = pd.Series(["apple,orange", "", "banana", "mango,grape", ""]) - self.assertTrue(_filter_by_index_list(original2, indexed_dict2).equals(expected_series2)) - - def test_empty_and_single_item_series_df(self): - self.assertTrue(_filter_by_index_list(pd.DataFrame([], columns=["HED", "Extra"]), {}).equals( - pd.DataFrame([], columns=["HED", "Extra"]))) - self.assertTrue( - _filter_by_index_list(pd.DataFrame([["apple", "extra1"]], columns=["HED", "Extra"]), {0: [0]}).equals( - pd.DataFrame([["apple", "extra1"]], columns=["HED", "Extra"]))) - - def test_two_item_series_with_same_onset_df(self): - input_df = pd.DataFrame([["apple", "extra1"], ["orange", "extra2"]], columns=["HED", "Extra"]) - expected_df = pd.DataFrame([["apple,orange", "extra1"], ["", "extra2"]], columns=["HED", "Extra"]) - self.assertTrue(_filter_by_index_list(input_df, {0: [0, 1]}).equals(expected_df)) - - def test_multiple_item_series_df(self): - input_df = pd.DataFrame([["apple", "extra1"], ["orange", "extra2"], ["banana", "extra3"], ["mango", "extra4"]], - columns=["HED", "Extra"]) - indexed_dict = {0: [0, 1], 1: [2], 2: [3]} - expected_df = pd.DataFrame( - [["apple,orange", "extra1"], ["", "extra2"], ["banana", "extra3"], ["mango", "extra4"]], - columns=["HED", "Extra"]) - self.assertTrue(_filter_by_index_list(input_df, indexed_dict).equals(expected_df)) - - def test_complex_scenarios_df(self): - # Test with negative, zero, and positive onsets - original = pd.DataFrame([["negative", "extra1"], ["zero", "extra2"], ["positive", "extra3"]], - columns=["HED", "Extra"]) - indexed_dict = {-1: [0], 0: [1], 1: [2]} - expected_df = pd.DataFrame([["negative", "extra1"], ["zero", "extra2"], ["positive", "extra3"]], - columns=["HED", "Extra"]) - self.assertTrue(_filter_by_index_list(original, indexed_dict).equals(expected_df)) - - # Test with more complex indexed_dict - original2 = pd.DataFrame( - [["apple", "extra1"], ["orange", "extra2"], ["banana", "extra3"], ["mango", "extra4"], ["grape", "extra5"]], - columns=["HED", "Extra"]) - indexed_dict2 = {0: [0, 1], 1: [2], 2: [3, 4]} - expected_df2 = pd.DataFrame( - [["apple,orange", "extra1"], ["", "extra2"], ["banana", "extra3"], ["mango,grape", "extra4"], - ["", "extra5"]], columns=["HED", "Extra"]) - self.assertTrue(_filter_by_index_list(original2, indexed_dict2).equals(expected_df2)) - - - -class TestSplitDelayTags(unittest.TestCase): - schema = load_schema_version("8.3.0") - def test_empty_series_and_onsets(self): - empty_series = pd.Series([], dtype="object") - empty_onsets = pd.Series([], dtype="float") - result = split_delay_tags(empty_series, self.schema, empty_onsets) - self.assertIsInstance(result, pd.DataFrame) - - def test_None_series_and_onsets(self): - result = split_delay_tags(None, self.schema, None) - self.assertIsNone(result) - - def test_normal_ordered_series(self): - series = pd.Series([ - "Tag1,Tag2", - "Tag3,Tag4" - ]) - onsets = pd.Series([1.0, 2.0]) - result = split_delay_tags(series, self.schema, onsets) - self.assertTrue(result.onset.equals(pd.Series([1.0, 2.0]))) - self.assertTrue(result.HED.equals(pd.Series([ - "Tag1,Tag2", - "Tag3,Tag4" - ]))) - - def test_normal_ordered_series_with_delays(self): - series = pd.Series([ - "Tag1,Tag2,(Delay/3.0 s,(Tag5))", - "Tag3,Tag4" - ]) - onsets = pd.Series([1.0, 2.0]) - result = split_delay_tags(series, self.schema, onsets) - self.assertTrue(result.onset.equals(pd.Series([1.0, 2.0, 4.0]))) - self.assertTrue(result.HED.equals(pd.Series([ - "Tag1,Tag2", - "Tag3,Tag4", - "(Delay/3.0 s,(Tag5))" - ]))) - - def test_normal_ordered_series_with_double_delays(self): - series = pd.Series([ - "Tag1,Tag2,(Delay/3.0 s,(Tag5))", - "Tag6,(Delay/2.0 s,(Tag7))", - "Tag3,Tag4" - ]) - onsets = pd.Series([1.0, 2.0, 3.0]) - result = split_delay_tags(series, self.schema, onsets) - self.assertTrue(result.onset.equals(pd.Series([1.0, 2.0, 3.0, 4.0, 4.0]))) - self.assertTrue(result.HED.equals(pd.Series([ - "Tag1,Tag2", - "Tag6", - "Tag3,Tag4", - "(Delay/3.0 s,(Tag5)),(Delay/2.0 s,(Tag7))", - "" - ]))) - self.assertTrue(result.original_index.equals(pd.Series([0, 1, 2, 0, 1]))) \ No newline at end of file +import unittest +import pandas as pd + + +from hed import load_schema_version +from hed.models.df_util import shrink_defs, expand_defs, convert_to_form, process_def_expands +from hed import DefinitionDict +from hed.models.df_util import (_handle_curly_braces_refs, _indexed_dict_from_onsets, + _filter_by_index_list, split_delay_tags) + + +class TestShrinkDefs(unittest.TestCase): + def setUp(self): + self.schema = load_schema_version("8.3.0") + + def test_shrink_defs_normal(self): + df = pd.DataFrame( + {"column1": ["(Def-expand/TestDefNormal,(Acceleration/2471,Action/TestDef2)),Event/SomeEvent"]}) + expected_df = pd.DataFrame({"column1": ["Def/TestDefNormal,Event/SomeEvent"]}) + shrink_defs(df, self.schema, ['column1']) + pd.testing.assert_frame_equal(df, expected_df) + + def test_shrink_defs_placeholder(self): + df = pd.DataFrame( + {"column1": ["(Def-expand/TestDefPlaceholder/123,(Acceleration/123,Action/TestDef2)),Item/SomeItem"]}) + expected_df = pd.DataFrame({"column1": ["Def/TestDefPlaceholder/123,Item/SomeItem"]}) + shrink_defs(df, self.schema, ['column1']) + pd.testing.assert_frame_equal(df, expected_df) + + def test_shrink_defs_no_matching_tags(self): + df = pd.DataFrame({"column1": ["(Event/SomeEvent, Item/SomeItem,Acceleration/25)"]}) + expected_df = pd.DataFrame({"column1": ["(Event/SomeEvent, Item/SomeItem,Acceleration/25)"]}) + shrink_defs(df, self.schema, ['column1']) + pd.testing.assert_frame_equal(df, expected_df) + + def test_shrink_defs_multiple_columns(self): + df = pd.DataFrame( + {"column1": ["(Def-expand/TestDefNormal,(Acceleration/2471,Action/TestDef2)),Event/SomeEvent"], + "column2": ["(Def-expand/TestDefPlaceholder/123,(Acceleration/123,Action/TestDef2)),Item/SomeItem"]}) + expected_df = pd.DataFrame({"column1": ["Def/TestDefNormal,Event/SomeEvent"], + "column2": ["Def/TestDefPlaceholder/123,Item/SomeItem"]}) + shrink_defs(df, self.schema, ['column1', 'column2']) + pd.testing.assert_frame_equal(df, expected_df) + + def test_shrink_defs_multiple_defs_same_line(self): + df = pd.DataFrame( + {"column1": ["(Def-expand/TestDefNormal,(Acceleration/2471,Action/TestDef2))," + + "(Def-expand/TestDefPlaceholder/123,(Acceleration/123,Action/TestDef2)),Acceleration/30"]}) + expected_df = pd.DataFrame({"column1": ["Def/TestDefNormal,Def/TestDefPlaceholder/123,Acceleration/30"]}) + shrink_defs(df, self.schema, ['column1']) + pd.testing.assert_frame_equal(df, expected_df) + + def test_shrink_defs_mixed_tags(self): + df = pd.DataFrame({"column1": [ + "(Def-expand/TestDefNormal,(Acceleration/2471,Action/TestDef2)),Event/SomeEvent," + + "(Def-expand/TestDefPlaceholder/123,(Acceleration/123,Action/TestDef2)),Item/SomeItem,Acceleration/25"]}) + expected_df = pd.DataFrame( + {"column1": ["Def/TestDefNormal,Event/SomeEvent,Def/TestDefPlaceholder/123,Item/SomeItem,Acceleration/25"]}) + shrink_defs(df, self.schema, ['column1']) + pd.testing.assert_frame_equal(df, expected_df) + + def test_shrink_defs_series_normal(self): + series = pd.Series(["(Def-expand/TestDefNormal,(Acceleration/2471,Action/TestDef2)),Event/SomeEvent"]) + expected_series = pd.Series(["Def/TestDefNormal,Event/SomeEvent"]) + shrink_defs(series, self.schema, None) + pd.testing.assert_series_equal(series, expected_series) + + def test_shrink_defs_series_placeholder(self): + series = pd.Series(["(Def-expand/TestDefPlaceholder/123,(Acceleration/123,Action/TestDef2)),Item/SomeItem"]) + expected_series = pd.Series(["Def/TestDefPlaceholder/123,Item/SomeItem"]) + shrink_defs(series, self.schema, None) + pd.testing.assert_series_equal(series, expected_series) + + +class TestExpandDefs(unittest.TestCase): + def setUp(self): + self.schema = load_schema_version("8.3.0") + self.def_dict = DefinitionDict(["(Definition/TestDefNormal,(Acceleration/2471,Action/TestDef2))", + "(Definition/TestDefPlaceholder/#,(Acceleration/#,Action/TestDef2))"], + hed_schema=self.schema) + + def test_expand_defs_normal(self): + df = pd.DataFrame({"column1": ["Def/TestDefNormal,Event/SomeEvent"]}) + expected_df = pd.DataFrame( + {"column1": ["(Def-expand/TestDefNormal,(Acceleration/2471,Action/TestDef2)),Event/SomeEvent"]}) + expand_defs(df, self.schema, self.def_dict, ['column1']) + pd.testing.assert_frame_equal(df, expected_df) + + def test_expand_defs_placeholder(self): + df = pd.DataFrame({"column1": ["Def/TestDefPlaceholder/123,Item/SomeItem"]}) + expected_df = pd.DataFrame({"column1": [ + "(Def-expand/TestDefPlaceholder/123,(Acceleration/123,Action/TestDef2)),Item/SomeItem"]}) + expand_defs(df, self.schema, self.def_dict, ['column1']) + pd.testing.assert_frame_equal(df, expected_df) + + def test_expand_defs_no_matching_tags(self): + df = pd.DataFrame({"column1": ["(Event/SomeEvent,Item/SomeItem,Acceleration/25)"]}) + expected_df = pd.DataFrame({"column1": ["(Event/SomeEvent,Item/SomeItem,Acceleration/25)"]}) + expand_defs(df, self.schema, self.def_dict, ['column1']) + pd.testing.assert_frame_equal(df, expected_df) + + def test_expand_defs_multiple_columns(self): + df = pd.DataFrame({"column1": ["Def/TestDefNormal,Event/SomeEvent"], + "column2": ["Def/TestDefPlaceholder/123,Item/SomeItem"]}) + expected_df = pd.DataFrame( + {"column1": ["(Def-expand/TestDefNormal,(Acceleration/2471,Action/TestDef2)),Event/SomeEvent"], + "column2": [ + "(Def-expand/TestDefPlaceholder/123,(Acceleration/123,Action/TestDef2)),Item/SomeItem"]}) + expand_defs(df, self.schema, self.def_dict, ['column1', 'column2']) + pd.testing.assert_frame_equal(df, expected_df) + + def test_expand_defs_series_normal(self): + series = pd.Series(["Def/TestDefNormal,Event/SomeEvent"]) + expected_series = pd.Series(["(Def-expand/TestDefNormal,(Acceleration/2471,Action/TestDef2)),Event/SomeEvent"]) + expand_defs(series, self.schema, self.def_dict, None) + pd.testing.assert_series_equal(series, expected_series) + + def test_expand_defs_series_placeholder(self): + series = pd.Series(["Def/TestDefPlaceholder/123,Item/SomeItem"]) + expected_series = pd.Series( + ["(Def-expand/TestDefPlaceholder/123,(Acceleration/123,Action/TestDef2)),Item/SomeItem"]) + expand_defs(series, self.schema, self.def_dict, None) + pd.testing.assert_series_equal(series, expected_series) + + +class TestConvertToForm(unittest.TestCase): + def setUp(self): + self.schema = load_schema_version("8.2.0") + + def test_convert_to_form_short_tags(self): + df = pd.DataFrame({"column1": ["Property/Sensory-property/Sensory-attribute/" + + "Visual-attribute/Color/CSS-color/White-color/Azure,Action/Perceive/See"]}) + expected_df = pd.DataFrame({"column1": ["Azure,See"]}) + convert_to_form(df, self.schema, "short_tag", ['column1']) + pd.testing.assert_frame_equal(df, expected_df) + + def test_convert_to_form_long_tags(self): + df = pd.DataFrame({"column1": ["CSS-color/White-color/Azure,Action/Perceive/See"]}) + expected_df = pd.DataFrame({"column1": ["Property/Sensory-property/Sensory-attribute/Visual-attribute/" + + "Color/CSS-color/White-color/Azure,Action/Perceive/See"]}) + convert_to_form(df, self.schema, "long_tag", ['column1']) + pd.testing.assert_frame_equal(df, expected_df) + + def test_convert_to_form_series_short_tags(self): + series = pd.Series(["Property/Sensory-property/Sensory-attribute/Visual-attribute/" + + "Color/CSS-color/White-color/Azure,Action/Perceive/See"]) + expected_series = pd.Series(["Azure,See"]) + convert_to_form(series, self.schema, "short_tag") + pd.testing.assert_series_equal(series, expected_series) + + def test_convert_to_form_series_long_tags(self): + series = pd.Series(["CSS-color/White-color/Azure,Action/Perceive/See"]) + expected_series = pd.Series(["Property/Sensory-property/Sensory-attribute/Visual-attribute/" + + "Color/CSS-color/White-color/Azure,Action/Perceive/See"]) + convert_to_form(series, self.schema, "long_tag") + pd.testing.assert_series_equal(series, expected_series) + + def test_convert_to_form_multiple_tags_short(self): + df = pd.DataFrame({"column1": ["Visual-attribute/Color/CSS-color/White-color/Azure,Biological-item/" + + "Anatomical-item/Body-part/Head/Face/Nose,Spatiotemporal-value/" + + "Rate-of-change/Acceleration/4.5 m-per-s^2"]}) + expected_df = pd.DataFrame({"column1": ["Azure,Nose,Acceleration/4.5 m-per-s^2"]}) + convert_to_form(df, self.schema, "short_tag", ['column1']) + pd.testing.assert_frame_equal(df, expected_df) + + def test_convert_to_form_multiple_tags_long(self): + df = pd.DataFrame({"column1": ["CSS-color/White-color/Azure,Anatomical-item/Body-part/Head/" + + "Face/Nose,Rate-of-change/Acceleration/4.5 m-per-s^2"]}) + expected_df = pd.DataFrame({"column1": ["Property/Sensory-property/Sensory-attribute/Visual-attribute/" + + "Color/CSS-color/White-color/Azure,Item/Biological-item/" + + "Anatomical-item/Body-part/Head/Face/Nose,Property/Data-property/" + + "Data-value/Spatiotemporal-value/Rate-of-change/Acceleration/" + + "4.5 m-per-s^2"]}) + convert_to_form(df, self.schema, "long_tag", ['column1']) + pd.testing.assert_frame_equal(df, expected_df) + + def test_basic_expand_detection(self): + # all simple cases with no duplicates + test_strings = [ + "(Def-expand/A1/1, (Action/1, Acceleration/5, Item-count/3))", + "(Def-expand/A1/2, (Action/2, Acceleration/5, Item-count/3))", + "(Def-expand/B2/3, (Action/3, Collection/animals, Alert))", + "(Def-expand/B2/4, (Action/4, Collection/animals, Alert))", + "(Def-expand/C3/5, (Action/5, Joyful, Event))", + "(Def-expand/C3/6, (Action/6, Joyful, Event))" + ] + process_def_expands(test_strings, self.schema) + + def test_mixed_detection(self): + # Cases where you can only retroactively identify the first def-expand + test_strings = [ + # Basic example first just to verify + "(Def-expand/A1/1, (Action/1, Acceleration/5, Item-count/2))", + "(Def-expand/A1/2, (Action/2, Acceleration/5, Item-count/2))", + # Out of order ambiguous + "(Def-expand/B2/3, (Action/3, Collection/animals, Acceleration/3))", + "(Def-expand/B2/4, (Action/4, Collection/animals, Acceleration/3))", + # Multiple tags + "(Def-expand/C3/5, (Action/5, Acceleration/5, Item-count/5))", + "(Def-expand/C3/6, (Action/6, Acceleration/5, Item-count/5))", + # Multiple tags2 + "(Def-expand/D4/7, (Action/7, Acceleration/7, Item-count/8))", + "(Def-expand/D4/8, (Action/8, Acceleration/7, Item-count/8))" + # Multiple tags3 + "(Def-expand/D5/7, (Action/7, Acceleration/7, Item-count/8, Event))", + "(Def-expand/D5/8, (Action/8, Acceleration/7, Item-count/8, Event))" + ] + def_dict, ambiguous_defs, _ = process_def_expands(test_strings, self.schema) + self.assertEqual(len(def_dict), 5) + + def test_ambiguous_defs(self): + # Cases that can't be identified + test_strings = [ + "(Def-expand/A1/2, (Action/2, Acceleration/5, Item-count/2))", + "(Def-expand/B2/3, (Action/3, Collection/animals, Acceleration/3))", + "(Def-expand/C3/5, (Action/5, Acceleration/5, Item-count/5))", + "(Def-expand/D4/7, (Action/7, Acceleration/7, Item-count/8))", + "(Def-expand/D5/7, (Action/7, Acceleration/7, Item-count/8, Event))", + ] + _, ambiguous_defs, _ = process_def_expands(test_strings, self.schema) + self.assertEqual(len(ambiguous_defs), 5) + + def test_ambiguous_conflicting_defs(self): + # This is invalid due to conflicting defs + test_strings = [ + "(Def-expand/A1/2, (Action/2, Age/5, Item-count/2))", + "(Def-expand/A1/3, (Action/3, Age/4, Item-count/3))", + + # This could be identified, but fails due to the above raising errors + "(Def-expand/A1/4, (Action/4, Age/5, Item-count/2))", + ] + defs, ambiguous, errors = process_def_expands(test_strings, self.schema) + self.assertEqual(len(defs), 0) + self.assertEqual(len(ambiguous), 0) + self.assertEqual(len(errors["a1"]), 3) + + def test_errors(self): + # Basic recognition of conflicting errors + test_strings = [ + "(Def-expand/A1/1, (Action/1, Age/5, Item-count/2))", + "(Def-expand/A1/2, (Action/2, Age/5, Item-count/2))", + "(Def-expand/A1/3, (Action/3, Age/5, Item-count/3))", + ] + _, _, errors = process_def_expands(test_strings, self.schema) + self.assertEqual(len(errors), 1) + + def test_errors_ambiguous(self): + # Verify we recognize errors when we had a def that can't be resolved. + test_strings = [ + "(Def-expand/A1/1, (Action/1, Age/5, Item-count/1))", + "(Def-expand/A1/2, (Action/2, Age/5, Item-count/3))", + "(Def-expand/A1/3, (Action/3, Age/5, Item-count/3))", + ] + known, ambiguous, errors = process_def_expands(test_strings, self.schema) + self.assertEqual(len(errors), 1) + self.assertEqual(len(errors["a1"]), 3) + + def test_errors_unresolved(self): + # Verify we recognize errors when we had a def that can't be resolved. + test_strings = [ + "(Def-expand/A1/1, (Action/1, Age/5, Item-count/1))", + "(Def-expand/A1/2, (Action/2, Age/5, Item-count/3))", + ] + known, ambiguous, errors = process_def_expands(test_strings, self.schema) + self.assertEqual(len(errors), 1) + self.assertEqual(len(errors["a1"]), 2) + + def test_def_expand_detection(self): + test_strings = [ + "(Def-expand/A1/1, (Action/1, Acceleration/5, Item-Count/2))", + "(Def-expand/A1/2, (Action/2, Acceleration/5, Item-Count/2))", + "(Def-expand/B2/3, (Action/3, Collection/animals, Alert))", + "(Def-expand/B2/4, (Action/4, Collection/animals, Alert))", + "(Def-expand/C3/5, (Action/5, Joyful, Event))", + "(Def-expand/C3/6, (Action/6, Joyful, Event))", + "((Def-expand/A1/7, (Action/7, Acceleration/5, Item-Count/2)), Event, Acceleration/10)", + "((Def-expand/A1/8, (Action/8, Acceleration/5, Item-Count/2)), Collection/toys, Item-Count/5)", + "((Def-expand/B2/9, (Action/9, Collection/animals, Alert)), Event, Collection/plants)", + "((Def-expand/B2/10, (Action/10, Collection/animals, Alert)), Joyful, Item-Count/3)", + "((Def-expand/C3/11, (Action/11, Joyful, Event)), Collection/vehicles, Acceleration/20)", + "((Def-expand/C3/12, (Action/12, Joyful, Event)), Alert, Item-Count/8)", + "((Def-expand/A1/13, (Action/13, Acceleration/5, Item-Count/2)), " + + "(Def-expand/B2/13, (Action/13, Collection/animals, Alert)), Event)", + "((Def-expand/A1/14, (Action/14, Acceleration/5, Item-Count/2)), Joyful, " + + "(Def-expand/C3/14, (Action/14, Joyful, Event)))", + "(Def-expand/B2/15, (Action/15, Collection/animals, Alert)), (Def-expand/C3/15, " + + "(Action/15, Joyful, Event)), Acceleration/30", + "((Def-expand/A1/16, (Action/16, Acceleration/5, Item-Count/2)), " + + "(Def-expand/B2/16, (Action/16, Collection/animals, Alert)), Collection/food)", + "(Def-expand/C3/17, (Action/17, Joyful, Event)), (Def-expand/A1/17, " + + "(Action/17, Acceleration/5, Item-Count/2)), Item-Count/6", + "((Def-expand/B2/18, (Action/18, Collection/animals, Alert)), " + + "(Def-expand/C3/18, (Action/18, Joyful, Event)), Alert)", + "(Def-expand/D1/Apple, (Task/Apple, Collection/cars, Attribute/color))", + "(Def-expand/D1/Banana, (Task/Banana, Collection/cars, Attribute/color))", + "(Def-expand/E2/Carrot, (Collection/Carrot, Collection/plants, Attribute/type))", + "(Def-expand/E2/Dog, (Collection/Dog, Collection/plants, Attribute/type))", + "((Def-expand/D1/Elephant, (Task/Elephant, Collection/cars, Attribute/color)), " + + "(Def-expand/E2/Fox, (Collection/Fox, Collection/plants, Attribute/type)), Event)", + "((Def-expand/D1/Giraffe, (Task/Giraffe, Collection/cars, Attribute/color)), " + + "Joyful, (Def-expand/E2/Horse, (Collection/Horse, Collection/plants, Attribute/type)))", + "(Def-expand/D1/Iguana, (Task/Iguana, Collection/cars, Attribute/color)), " + + "(Def-expand/E2/Jaguar, (Collection/Jaguar, Collection/plants, Attribute/type)), Acceleration/30", + "(Def-expand/F1/Lion, (Task/Lion, Collection/boats, Attribute/length))", + "(Def-expand/F1/Monkey, (Task/Monkey, Collection/boats, Attribute/length))", + "(Def-expand/G2/Nest, (Collection/Nest, Collection/instruments, Attribute/material))", + "(Def-expand/G2/Octopus, (Collection/Octopus, Collection/instruments, Attribute/material))", + "((Def-expand/F1/Panda, (Task/Panda, Collection/boats, Attribute/length)), " + + "(Def-expand/G2/Quail, (Collection/Quail, Collection/instruments, Attribute/material)), Event)", + "((Def-expand/F1/Rabbit, (Task/Rabbit, Collection/boats, Attribute/length)), Joyful, " + + "(Def-expand/G2/Snake, (Collection/Snake, Collection/instruments, Attribute/material)))", + "(Def-expand/F1/Turtle, (Task/Turtle, Collection/boats, Attribute/length)), " + + "(Def-expand/G2/Umbrella, (Collection/Umbrella, Collection/instruments, Attribute/material))" + ] + + def_dict, ambiguous, errors = process_def_expands(test_strings, self.schema) + self.assertEqual(len(def_dict), 7) + self.assertEqual(len(ambiguous), 0) + self.assertEqual(len(errors), 0) + + +class TestInsertColumns(unittest.TestCase): + + def test_insert_columns_simple(self): + df = pd.DataFrame({ + "column1": ["{column2}, Event, Action"], + "column2": ["Item"] + }) + expected_df = pd.DataFrame({ + "column1": ["Item, Event, Action"] + }) + result = _handle_curly_braces_refs(df, refs=["column2"], column_names=df.columns) + pd.testing.assert_frame_equal(result, expected_df) + + def test_insert_columns_multiple_rows(self): + df = pd.DataFrame({ + "column1": ["{column2}, Event, Action", "Event, Action"], + "column2": ["Item", "Subject"] + }) + expected_df = pd.DataFrame({ + "column1": ["Item, Event, Action", "Event, Action"] + }) + result = _handle_curly_braces_refs(df, refs=["column2"], column_names=df.columns) + pd.testing.assert_frame_equal(result, expected_df) + + def test_insert_columns_multiple_columns(self): + df = pd.DataFrame({ + "column1": ["{column2}, Event, {column3}, Action"], + "column2": ["Item"], + "column3": ["Subject"] + }) + expected_df = pd.DataFrame({ + "column1": ["Item, Event, Subject, Action"] + }) + result = _handle_curly_braces_refs(df, refs=["column2", "column3"], column_names=df.columns) + pd.testing.assert_frame_equal(result, expected_df) + + def test_insert_columns_four_columns(self): + df = pd.DataFrame({ + "column1": ["{column2}, Event, {column3}, Action"], + "column2": ["Item"], + "column3": ["Subject"], + "column4": ["Data"] + }) + expected_df = pd.DataFrame({ + "column1": ["Item, Event, Subject, Action"], + "column4": ["Data"] + }) + result = _handle_curly_braces_refs(df, refs=["column2", "column3"], column_names=df.columns) + pd.testing.assert_frame_equal(result, expected_df) + + def test_insert_columns_with_nested_parentheses(self): + df = pd.DataFrame({ + "column1": ["({column2}, ({column3}, {column4})), Event, Action"], + "column2": ["Item"], + "column3": ["Subject"], + "column4": ["Data"] + }) + expected_df = pd.DataFrame({ + "column1": ["(Item, (Subject, Data)), Event, Action"] + }) + result = _handle_curly_braces_refs(df, refs=["column2", "column3", "column4"], column_names=df.columns) + pd.testing.assert_frame_equal(result, expected_df) + + def test_insert_columns_with_nested_parentheses_na_values(self): + df = pd.DataFrame({ + "column1": ["({column2}, ({column3}, {column4})), Event, Action"], + "column2": ["Data"], + "column3": ["n/a"], + "column4": ["n/a"] + }) + expected_df = pd.DataFrame({ + "column1": ["(Data), Event, Action"] + }) + result = _handle_curly_braces_refs(df, refs=["column2", "column3", "column4"], column_names=df.columns) + pd.testing.assert_frame_equal(result, expected_df) + + def test_insert_columns_with_nested_parentheses_na_values2(self): + df = pd.DataFrame({ + "column1": ["({column2}, ({column3}, {column4})), Event, Action"], + "column2": ["n/a"], + "column3": ["n/a"], + "column4": ["Data"] + }) + expected_df = pd.DataFrame({ + "column1": ["((Data)), Event, Action"] + }) + result = _handle_curly_braces_refs(df, refs=["column2", "column3", "column4"], column_names=df.columns) + pd.testing.assert_frame_equal(result, expected_df) + + def test_insert_columns_with_nested_parentheses_mixed_na_values(self): + df = pd.DataFrame({ + "column1": ["({column2}, ({column3}, {column4})), Event, Action"], + "column2": ["n/a"], + "column3": ["Subject"], + "column4": ["n/a"] + }) + expected_df = pd.DataFrame({ + "column1": ["((Subject)), Event, Action"] + }) + result = _handle_curly_braces_refs(df, refs=["column2", "column3", "column4"], column_names=df.columns) + pd.testing.assert_frame_equal(result, expected_df) + + def test_insert_columns_with_nested_parentheses_all_na_values(self): + df = pd.DataFrame({ + "column1": ["({column2}, ({column3}, {column4})), Event, Action"], + "column2": ["n/a"], + "column3": ["n/a"], + "column4": ["n/a"] + }) + expected_df = pd.DataFrame({ + "column1": ["Event, Action"] + }) + result = _handle_curly_braces_refs(df, refs=["column2", "column3", "column4"], column_names=df.columns) + pd.testing.assert_frame_equal(result, expected_df) + + def test_insert_columns_with_parentheses(self): + df = pd.DataFrame({ + "column1": ["({column2}), Event, Action"], + "column2": ["Item"] + }) + expected_df = pd.DataFrame({ + "column1": ["(Item), Event, Action"] + }) + result = _handle_curly_braces_refs(df, refs=["column2"], column_names=df.columns) + pd.testing.assert_frame_equal(result, expected_df) + + def test_insert_columns_with_parentheses_na_values(self): + df = pd.DataFrame({ + "column1": ["({column2}), Event, Action"], + "column2": ["n/a"], + "column3": ["n/a"] + }) + expected_df = pd.DataFrame({ + "column1": ["Event, Action"], + "column3": ["n/a"] + }) + result = _handle_curly_braces_refs(df, refs=["column2"], column_names=df.columns) + pd.testing.assert_frame_equal(result, expected_df) + + +class TestOnsetDict(unittest.TestCase): + def test_empty_and_single_onset(self): + self.assertEqual(_indexed_dict_from_onsets([]), {}) + self.assertEqual(_indexed_dict_from_onsets([3.5]), {3.5: [0]}) + + def test_identical_and_approx_equal_onsets(self): + self.assertEqual(_indexed_dict_from_onsets([3.5, 3.5]), {3.5: [0, 1]}) + self.assertEqual(_indexed_dict_from_onsets([3.5, 3.500000001]), {3.5: [0], 3.500000001: [1]}) + self.assertEqual(_indexed_dict_from_onsets([3.5, 3.5000000000001]), {3.5: [0, 1]}) + + def test_distinct_and_mixed_onsets(self): + self.assertEqual(_indexed_dict_from_onsets([3.5, 4.0, 4.4]), {3.5: [0], 4.0: [1], 4.4: [2]}) + self.assertEqual(_indexed_dict_from_onsets([3.5, 3.5, 4.0, 4.4]), {3.5: [0, 1], 4.0: [2], 4.4: [3]}) + self.assertEqual(_indexed_dict_from_onsets([4.0, 3.5, 4.4, 4.4]), {4.0: [0], 3.5: [1], 4.4: [2, 3]}) + + def test_complex_onsets(self): + # Negative, zero, and positive onsets + self.assertEqual(_indexed_dict_from_onsets([-1.0, 0.0, 1.0]), {-1.0: [0], 0.0: [1], 1.0: [2]}) + + # Very close but distinct onsets + self.assertEqual(_indexed_dict_from_onsets([1.0, 1.0 + 1e-8, 1.0 + 2e-8]), + {1.0: [0], 1.0 + 1e-8: [1], 1.0 + 2e-8: [2]}) + # Very close + self.assertEqual(_indexed_dict_from_onsets([1.0, 1.0 + 1e-10, 1.0 + 2e-10]), + {1.0: [0, 1, 2]}) + + # Mixed scenario + self.assertEqual(_indexed_dict_from_onsets([3.5, 3.5, 4.0, 4.4, 4.4, -1.0]), + {3.5: [0, 1], 4.0: [2], 4.4: [3, 4], -1.0: [5]}) + + def test_empty_and_single_item_series(self): + self.assertTrue(_filter_by_index_list(pd.Series([], dtype=str), {}).equals(pd.Series([], dtype=str))) + self.assertTrue(_filter_by_index_list(pd.Series(["apple"]), {0: [0]}).equals(pd.Series(["apple"]))) + + def test_two_item_series_with_same_onset(self): + input_series = pd.Series(["apple", "orange"]) + expected_series = pd.Series(["apple,orange", ""]) + self.assertTrue(_filter_by_index_list(input_series, {0: [0, 1]}).equals(expected_series)) + + def test_multiple_item_series(self): + input_series = pd.Series(["apple", "orange", "banana", "mango"]) + indexed_dict = {0: [0, 1], 1: [2], 2: [3]} + expected_series = pd.Series(["apple,orange", "", "banana", "mango"]) + self.assertTrue(_filter_by_index_list(input_series, indexed_dict).equals(expected_series)) + + def test_complex_scenarios(self): + # Test with negative, zero and positive onsets + original = pd.Series(["negative", "zero", "positive"]) + indexed_dict = {-1: [0], 0: [1], 1: [2]} + expected_series1 = pd.Series(["negative", "zero", "positive"]) + self.assertTrue(_filter_by_index_list(original, indexed_dict).equals(expected_series1)) + + # Test with more complex indexed_dict + original2 = pd.Series(["apple", "orange", "banana", "mango", "grape"]) + indexed_dict2 = {0: [0, 1], 1: [2], 2: [3, 4]} + expected_series2 = pd.Series(["apple,orange", "", "banana", "mango,grape", ""]) + self.assertTrue(_filter_by_index_list(original2, indexed_dict2).equals(expected_series2)) + + def test_empty_and_single_item_series_df(self): + self.assertTrue(_filter_by_index_list(pd.DataFrame([], columns=["HED", "Extra"]), {}).equals( + pd.DataFrame([], columns=["HED", "Extra"]))) + self.assertTrue( + _filter_by_index_list(pd.DataFrame([["apple", "extra1"]], columns=["HED", "Extra"]), {0: [0]}).equals( + pd.DataFrame([["apple", "extra1"]], columns=["HED", "Extra"]))) + + def test_two_item_series_with_same_onset_df(self): + input_df = pd.DataFrame([["apple", "extra1"], ["orange", "extra2"]], columns=["HED", "Extra"]) + expected_df = pd.DataFrame([["apple,orange", "extra1"], ["", "extra2"]], columns=["HED", "Extra"]) + self.assertTrue(_filter_by_index_list(input_df, {0: [0, 1]}).equals(expected_df)) + + def test_multiple_item_series_df(self): + input_df = pd.DataFrame([["apple", "extra1"], ["orange", "extra2"], ["banana", "extra3"], ["mango", "extra4"]], + columns=["HED", "Extra"]) + indexed_dict = {0: [0, 1], 1: [2], 2: [3]} + expected_df = pd.DataFrame( + [["apple,orange", "extra1"], ["", "extra2"], ["banana", "extra3"], ["mango", "extra4"]], + columns=["HED", "Extra"]) + self.assertTrue(_filter_by_index_list(input_df, indexed_dict).equals(expected_df)) + + def test_complex_scenarios_df(self): + # Test with negative, zero, and positive onsets + original = pd.DataFrame([["negative", "extra1"], ["zero", "extra2"], ["positive", "extra3"]], + columns=["HED", "Extra"]) + indexed_dict = {-1: [0], 0: [1], 1: [2]} + expected_df = pd.DataFrame([["negative", "extra1"], ["zero", "extra2"], ["positive", "extra3"]], + columns=["HED", "Extra"]) + self.assertTrue(_filter_by_index_list(original, indexed_dict).equals(expected_df)) + + # Test with more complex indexed_dict + original2 = pd.DataFrame( + [["apple", "extra1"], ["orange", "extra2"], ["banana", "extra3"], ["mango", "extra4"], ["grape", "extra5"]], + columns=["HED", "Extra"]) + indexed_dict2 = {0: [0, 1], 1: [2], 2: [3, 4]} + expected_df2 = pd.DataFrame( + [["apple,orange", "extra1"], ["", "extra2"], ["banana", "extra3"], ["mango,grape", "extra4"], + ["", "extra5"]], columns=["HED", "Extra"]) + self.assertTrue(_filter_by_index_list(original2, indexed_dict2).equals(expected_df2)) + + +class TestSplitDelayTags(unittest.TestCase): + schema = load_schema_version("8.3.0") + + def test_empty_series_and_onsets(self): + empty_series = pd.Series([], dtype="object") + empty_onsets = pd.Series([], dtype="float") + result = split_delay_tags(empty_series, self.schema, empty_onsets) + self.assertIsInstance(result, pd.DataFrame) + + def test_None_series_and_onsets(self): + result = split_delay_tags(None, self.schema, None) + self.assertIsNone(result) + + def test_normal_ordered_series(self): + series = pd.Series([ + "Tag1,Tag2", + "Tag3,Tag4" + ]) + onsets = pd.Series([1.0, 2.0]) + result = split_delay_tags(series, self.schema, onsets) + self.assertTrue(result.onset.equals(pd.Series([1.0, 2.0]))) + self.assertTrue(result.HED.equals(pd.Series([ + "Tag1,Tag2", + "Tag3,Tag4" + ]))) + + def test_normal_ordered_series_with_delays(self): + series = pd.Series([ + "Tag1,Tag2,(Delay/3.0 s,(Tag5))", + "Tag3,Tag4" + ]) + onsets = pd.Series([1.0, 2.0]) + result = split_delay_tags(series, self.schema, onsets) + self.assertTrue(result.onset.equals(pd.Series([1.0, 2.0, 4.0]))) + self.assertTrue(result.HED.equals(pd.Series([ + "Tag1,Tag2", + "Tag3,Tag4", + "(Delay/3.0 s,(Tag5))" + ]))) + + def test_normal_ordered_series_with_double_delays(self): + series = pd.Series([ + "Tag1,Tag2,(Delay/3.0 s,(Tag5))", + "Tag6,(Delay/2.0 s,(Tag7))", + "Tag3,Tag4" + ]) + onsets = pd.Series([1.0, 2.0, 3.0]) + result = split_delay_tags(series, self.schema, onsets) + self.assertTrue(result.onset.equals(pd.Series([1.0, 2.0, 3.0, 4.0, 4.0]))) + self.assertTrue(result.HED.equals(pd.Series([ + "Tag1,Tag2", + "Tag6", + "Tag3,Tag4", + "(Delay/3.0 s,(Tag5)),(Delay/2.0 s,(Tag7))", + "" + ]))) + self.assertTrue(result.original_index.equals(pd.Series([0, 1, 2, 0, 1]))) diff --git a/tests/models/test_hed_group.py b/tests/models/test_hed_group.py index 1a3632bf7..22d7939c2 100644 --- a/tests/models/test_hed_group.py +++ b/tests/models/test_hed_group.py @@ -1,136 +1,137 @@ -import unittest -import os - -from hed import schema -from hed.models import HedString -import copy - - -class Test(unittest.TestCase): - - @classmethod - def setUpClass(cls): - cls.base_data_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../data/') - hed_xml_file = os.path.join(cls.base_data_dir, "schema_tests/HED8.0.0t.xml") - cls.hed_schema = schema.load_schema(hed_xml_file) - - def test_remove_groups(self): - from hed.models.definition_dict import DefTagNames - basic_definition_string = "(Definition/TestDef, (Keypad-key/TestDef1,Keyboard-key/TestDef2))" - basic_definition_string_repeated = f"{basic_definition_string},{basic_definition_string}" - def_string_with_repeat = HedString(basic_definition_string_repeated, self.hed_schema) - definition_tags = def_string_with_repeat.find_tags({DefTagNames.DEFINITION_KEY}, - recursive=True, include_groups=1) - definition_tag2 = definition_tags[1] - def_string_with_repeat.remove([definition_tag2]) - remaining_children = def_string_with_repeat.get_all_groups() - for child in remaining_children: - if child is definition_tag2: - self.assertFalse(False, "Definition tag not removed successfully") - - basic_definition_string_repeated_subgroup = \ - f"{basic_definition_string},{basic_definition_string}, ({basic_definition_string})" - def_string_with_repeat = HedString(basic_definition_string_repeated_subgroup, self.hed_schema) - definition_tags = def_string_with_repeat.find_tags({DefTagNames.DEFINITION_KEY}, - recursive=True, include_groups=1) - definition_tag3 = definition_tags[2] - def_string_with_repeat.remove([definition_tag3]) - remaining_children = def_string_with_repeat.get_all_groups() - for child in remaining_children: - if child is definition_tag3: - self.assertFalse(False, "Nested definition tag not removed successfully") - - basic_definition_string_repeated_subgroup = \ - f"{basic_definition_string},{basic_definition_string}, ({basic_definition_string})" - def_string_with_repeat = HedString(basic_definition_string_repeated_subgroup, self.hed_schema) - definition_tags = def_string_with_repeat.find_tags({DefTagNames.DEFINITION_KEY}, - recursive=True, include_groups=1) - definition_tag2 = definition_tags[1] - def_string_with_repeat.remove([definition_tag2]) - remaining_children = def_string_with_repeat.get_all_groups() - for child in remaining_children: - if child is definition_tag2: - self.assertFalse(False, "Nested definition tag not removed successfully") - - def test_find_tags_with_term(self): - basic_hed_string = \ - "(Keypad-key/TestDef1,Keyboard-key/TestDef2, Item/Object, Event), Event, Object, Geometric-object" - basic_hed_string_obj = HedString(basic_hed_string, self.hed_schema) - # works - located_tags = basic_hed_string_obj.find_tags_with_term("Object", recursive=True, include_groups=0) - self.assertEqual(len(located_tags), 5) - # located tags now has found all 5 hed tags - - # This will find no tags - located_tags = basic_hed_string_obj.find_tags_with_term("reject", recursive=True, include_groups=0) - self.assertEqual(len(located_tags), 0) - - # this will also find no tags - located_tags = basic_hed_string_obj.find_tags_with_term("Item/Object", recursive=True, include_groups=0) - self.assertEqual(len(located_tags), 0) - - def _compare_strings(self, hed_strings): - str1 = HedString(hed_strings[0], self.hed_schema) - str1.sort() - for hed_string in hed_strings: - str2 = HedString(hed_string, self.hed_schema) - str2.sort() - self.assertEqual(str1, str2) - - def _compare_strings2(self, hed_strings): - str1 = HedString(hed_strings[0], self.hed_schema) - for hed_string in hed_strings: - str2 = HedString(hed_string, self.hed_schema) - self.assertEqual(str1.sorted(), str2.sorted()) - - def test_sort_and_sorted(self): - hed_strings = [ - "A, B, C", - "A, C, B", - "B, C, A", - "C, B, A" - ] - self._compare_strings(hed_strings) - self._compare_strings2(hed_strings) - hed_strings = [ - "A, (B, C)", - "(B, C), A" - ] - self._compare_strings(hed_strings) - self._compare_strings2(hed_strings) - hed_strings = [ - "A, (A, (B, C))", - "(A, (B, C)), A", - "((B, C), A), A", - "A, ((B, C), A)" - ] - self._compare_strings(hed_strings) - self._compare_strings2(hed_strings) - hed_strings = [ - "D, A, (A, (B, C))", - "(A, (B, C)), A, D", - "((B, C), A), A, D", - "A, D, ((B, C), A)" - ] - self._compare_strings(hed_strings) - self._compare_strings2(hed_strings) - hed_strings = [ - "D, (E, F), A, (A, (B, C))", - "(A, (B, C)), A, D, (F, E)", - "((B, C), A), (E, F), A, D", - "A, D, ((B, C), A), (F, E)" - ] - self._compare_strings(hed_strings) - - def test_sorted_structure(self): - hed_string = HedString("(Tag3, Tag1, Tag5, Tag2, Tag4)", self.hed_schema) - original_hed_string = copy.deepcopy(hed_string) - - sorted_hed_string = hed_string.sorted() - - self.assertIsInstance(sorted_hed_string, HedString) - self.assertEqual(str(original_hed_string), str(hed_string)) - self.assertIsNot(sorted_hed_string, hed_string) - -if __name__ == '__main__': - unittest.main() +import unittest +import os + +from hed import schema +from hed.models import HedString +import copy + + +class Test(unittest.TestCase): + + @classmethod + def setUpClass(cls): + cls.base_data_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../data/') + hed_xml_file = os.path.join(cls.base_data_dir, "schema_tests/HED8.0.0t.xml") + cls.hed_schema = schema.load_schema(hed_xml_file) + + def test_remove_groups(self): + from hed.models.definition_dict import DefTagNames + basic_definition_string = "(Definition/TestDef, (Keypad-key/TestDef1,Keyboard-key/TestDef2))" + basic_definition_string_repeated = f"{basic_definition_string},{basic_definition_string}" + def_string_with_repeat = HedString(basic_definition_string_repeated, self.hed_schema) + definition_tags = def_string_with_repeat.find_tags({DefTagNames.DEFINITION_KEY}, + recursive=True, include_groups=1) + definition_tag2 = definition_tags[1] + def_string_with_repeat.remove([definition_tag2]) + remaining_children = def_string_with_repeat.get_all_groups() + for child in remaining_children: + if child is definition_tag2: + self.assertFalse(False, "Definition tag not removed successfully") + + basic_definition_string_repeated_subgroup = \ + f"{basic_definition_string},{basic_definition_string}, ({basic_definition_string})" + def_string_with_repeat = HedString(basic_definition_string_repeated_subgroup, self.hed_schema) + definition_tags = def_string_with_repeat.find_tags({DefTagNames.DEFINITION_KEY}, + recursive=True, include_groups=1) + definition_tag3 = definition_tags[2] + def_string_with_repeat.remove([definition_tag3]) + remaining_children = def_string_with_repeat.get_all_groups() + for child in remaining_children: + if child is definition_tag3: + self.assertFalse(False, "Nested definition tag not removed successfully") + + basic_definition_string_repeated_subgroup = \ + f"{basic_definition_string},{basic_definition_string}, ({basic_definition_string})" + def_string_with_repeat = HedString(basic_definition_string_repeated_subgroup, self.hed_schema) + definition_tags = def_string_with_repeat.find_tags({DefTagNames.DEFINITION_KEY}, + recursive=True, include_groups=1) + definition_tag2 = definition_tags[1] + def_string_with_repeat.remove([definition_tag2]) + remaining_children = def_string_with_repeat.get_all_groups() + for child in remaining_children: + if child is definition_tag2: + self.assertFalse(False, "Nested definition tag not removed successfully") + + def test_find_tags_with_term(self): + basic_hed_string = \ + "(Keypad-key/TestDef1,Keyboard-key/TestDef2, Item/Object, Event), Event, Object, Geometric-object" + basic_hed_string_obj = HedString(basic_hed_string, self.hed_schema) + # works + located_tags = basic_hed_string_obj.find_tags_with_term("Object", recursive=True, include_groups=0) + self.assertEqual(len(located_tags), 5) + # located tags now has found all 5 hed tags + + # This will find no tags + located_tags = basic_hed_string_obj.find_tags_with_term("reject", recursive=True, include_groups=0) + self.assertEqual(len(located_tags), 0) + + # this will also find no tags + located_tags = basic_hed_string_obj.find_tags_with_term("Item/Object", recursive=True, include_groups=0) + self.assertEqual(len(located_tags), 0) + + def _compare_strings(self, hed_strings): + str1 = HedString(hed_strings[0], self.hed_schema) + str1.sort() + for hed_string in hed_strings: + str2 = HedString(hed_string, self.hed_schema) + str2.sort() + self.assertEqual(str1, str2) + + def _compare_strings2(self, hed_strings): + str1 = HedString(hed_strings[0], self.hed_schema) + for hed_string in hed_strings: + str2 = HedString(hed_string, self.hed_schema) + self.assertEqual(str1.sorted(), str2.sorted()) + + def test_sort_and_sorted(self): + hed_strings = [ + "A, B, C", + "A, C, B", + "B, C, A", + "C, B, A" + ] + self._compare_strings(hed_strings) + self._compare_strings2(hed_strings) + hed_strings = [ + "A, (B, C)", + "(B, C), A" + ] + self._compare_strings(hed_strings) + self._compare_strings2(hed_strings) + hed_strings = [ + "A, (A, (B, C))", + "(A, (B, C)), A", + "((B, C), A), A", + "A, ((B, C), A)" + ] + self._compare_strings(hed_strings) + self._compare_strings2(hed_strings) + hed_strings = [ + "D, A, (A, (B, C))", + "(A, (B, C)), A, D", + "((B, C), A), A, D", + "A, D, ((B, C), A)" + ] + self._compare_strings(hed_strings) + self._compare_strings2(hed_strings) + hed_strings = [ + "D, (E, F), A, (A, (B, C))", + "(A, (B, C)), A, D, (F, E)", + "((B, C), A), (E, F), A, D", + "A, D, ((B, C), A), (F, E)" + ] + self._compare_strings(hed_strings) + + def test_sorted_structure(self): + hed_string = HedString("(Tag3, Tag1, Tag5, Tag2, Tag4)", self.hed_schema) + original_hed_string = copy.deepcopy(hed_string) + + sorted_hed_string = hed_string.sorted() + + self.assertIsInstance(sorted_hed_string, HedString) + self.assertEqual(str(original_hed_string), str(hed_string)) + self.assertIsNot(sorted_hed_string, hed_string) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/models/test_hed_string.py b/tests/models/test_hed_string.py index aa3ec2ca5..f1ede36d0 100644 --- a/tests/models/test_hed_string.py +++ b/tests/models/test_hed_string.py @@ -1,309 +1,310 @@ -from hed.models import HedString -import unittest -from hed import load_schema_version -import copy - - -class TestHedStrings(unittest.TestCase): - @classmethod - def setUpClass(cls): - cls.schema = load_schema_version("8.3.0") - - def validator_scalar(self, test_strings, expected_results, test_function): - for test_key in test_strings: - test_result = test_function(test_strings[test_key]) - expected_result = expected_results[test_key] - self.assertEqual(test_result, expected_result, test_strings[test_key]) - - def validator_list(self, test_strings, expected_results, test_function): - for test_key in test_strings: - test_result = test_function(test_strings[test_key]) - expected_result = expected_results[test_key] - self.assertCountEqual(test_result, expected_result, test_strings[test_key]) - - -class TestHedString(unittest.TestCase): - @classmethod - def setUpClass(cls): - cls.schema = load_schema_version("8.0.0") - pass - - def test_constructor(self): - test_strings = { - 'normal': "Tag1,Tag2", - 'normalParen': "(Tag1,Tag2)", - 'normalDoubleParen': "(Tag1,Tag2,(Tag3,Tag4))", - 'extraOpeningParen': "((Tag1,Tag2,(Tag3,Tag4))", - 'extra2OpeningParen': "(((Tag1,Tag2,(Tag3,Tag4))", - 'extraClosingParen': "(Tag1,Tag2,(Tag3,Tag4)))", - 'extra2ClosingParen': "(Tag1,Tag2,(Tag3,Tag4))))" - } - expected_result = { - 'normal': True, - 'normalParen': True, - 'normalDoubleParen': True, - 'extraOpeningParen': False, - 'extra2OpeningParen': False, - 'extraClosingParen': False, - 'extra2ClosingParen': False - } - - # Just make sure it doesn't crash while parsing super invalid strings. - for name, string in test_strings.items(): - hed_string = HedString(string, self.schema) - - self.assertEqual(bool(hed_string), expected_result[name]) - if bool(hed_string): - _ = hed_string.get_all_groups() - _ = hed_string.get_all_tags() - - -class HedTagLists(TestHedStrings): - def test_type(self): - hed_string = 'Event/Category/Experimental stimulus,Item/Object/Vehicle/Train,Attribute/Visual/Color/Purple' - result = HedString.split_into_groups(hed_string, self.schema) - self.assertIsInstance(result, list) - - def test_top_level_tags(self): - hed_string = 'Event/Category/Experimental stimulus,Item/Object/Vehicle/Train,Attribute/Visual/Color/Purple' - result = HedString.split_into_groups(hed_string, self.schema) - tags_as_strings = [str(tag) for tag in result] - self.assertCountEqual(tags_as_strings, ['Event/Category/Experimental stimulus', 'Item/Object/Vehicle/Train', - 'Attribute/Visual/Color/Purple']) - - def test_group_tags(self): - hed_string = '/Action/Reach/To touch,(/Attribute/Object side/Left,/Participant/Effect/Body part/Arm),' \ - '/Attribute/Location/Screen/Top/70 px,/Attribute/Location/Screen/Left/23 px ' - string_obj = HedString(hed_string, self.schema) - tags_as_strings = [str(tag) for tag in string_obj.children] - self.assertCountEqual(tags_as_strings, - ['/Action/Reach/To touch', - '(/Attribute/Object side/Left,/Participant/Effect/Body part/Arm)', - '/Attribute/Location/Screen/Top/70 px', '/Attribute/Location/Screen/Left/23 px']) - - def test_square_brackets_in_string(self): - # just verifying this parses, square brackets do not validate - hed_string = '[test_ref], Event/Sensory-event, Participant, ([test_ref2], Event)' - string_obj = HedString(hed_string, self.schema) - tags_as_strings = [str(tag) for tag in string_obj.children] - self.assertCountEqual(tags_as_strings, - ['[test_ref]', 'Sensory-event', 'Participant', '([test_ref2],Event)']) - - # Potentially restore some similar behavior later if desired. - # We no longer automatically remove things like quotes. - # def test_double_quotes(self): - # double_quote_string = 'Event/Category/Experimental stimulus,"Item/Object/Vehicle/Train",' \ - # 'Attribute/Visual/Color/Purple ' - # normal_string = 'Event/Category/Experimental stimulus,Item/Object/Vehicle/Train,Attribute/Visual/Color/Purple' - # double_quote_result = HedString.split_into_groups(double_quote_string) - # normal_result = HedString.split_into_groups(normal_string) - # self.assertEqual(double_quote_result, normal_result) - - def test_blanks(self): - test_strings = { - 'doubleTilde': - '/Item/Object/Vehicle/Car~~/Attribute/Object control/Perturb', - 'doubleComma': - '/Item/Object/Vehicle/Car,,/Attribute/Object control/Perturb', - 'doubleInvalidCharacter': - '/Item/Object/Vehicle/Car[]/Attribute/Object control/Perturb', - 'trailingBlank': - '/Item/Object/Vehicle/Car,/Attribute/Object control/Perturb,', - } - expected_list = [ - '/Item/Object/Vehicle/Car', - '/Attribute/Object control/Perturb', - ] - expected_results = { - 'doubleTilde': [ - '/Item/Object/Vehicle/Car~~/Attribute/Object control/Perturb', - ], - 'doubleComma': expected_list, - 'doubleInvalidCharacter': ['/Item/Object/Vehicle/Car[]/Attribute/Object control/Perturb'], - 'trailingBlank': expected_list, - } - - def test_function(string): - return [str(child) for child in HedString.split_into_groups(string, self.schema)] - - self.validator_list(test_strings, expected_results, test_function) - - -class ProcessedHedTags(TestHedStrings): - def test_parsed_tags(self): - hed_string = '/Action/Reach/To touch,(/Attribute/Object side/Left,/Participant/Effect/Body part/Arm),' \ - '/Attribute/Location/Screen/Top/70 px,/Attribute/Location/Screen/Left/23 px ' - parsed_string = HedString(hed_string, self.schema) - self.assertCountEqual([str(tag) for tag in parsed_string.get_all_tags()], [ - '/Action/Reach/To touch', - '/Attribute/Object side/Left', - '/Participant/Effect/Body part/Arm', - '/Attribute/Location/Screen/Top/70 px', - '/Attribute/Location/Screen/Left/23 px', - ]) - self.assertCountEqual([str(group) for group in parsed_string.get_all_groups()], - ['/Action/Reach/To touch,(/Attribute/Object side/Left,/Participant/Effect/Body part/Arm),' - '/Attribute/Location/Screen/Top/70 px,/Attribute/Location/Screen/Left/23 px', - '(/Attribute/Object side/Left,/Participant/Effect/Body part/Arm)']) - - -class TestHedStringUtil(unittest.TestCase): - def compare_split_results(self, test_strings, expected_results): - for test_key in test_strings: - test_string = test_strings[test_key] - expected_result = expected_results[test_key] - actual_results = HedString.split_hed_string(test_string) - decoded_results = [test_string[start:end] for (is_tag, (start, end)) in actual_results] - self.assertEqual(decoded_results, expected_result) - - def test_split_hed_string(self): - test_strings = { - 'single': 'Event', - 'double': 'Event, Event/Extension', - 'singleAndGroup': 'Event/Extension, (Event/Extension2, Event/Extension3)', - 'singleAndGroupWithBlank': 'Event/Extension, (Event, ,Event/Extension3)', - 'manyParens': 'Event/Extension,(((Event/Extension2, )(Event)', - 'manyParensEndingSpace': 'Event/Extension,(((Event/Extension2, )(Event) ', - 'manyParensOpeningSpace': ' Event/Extension,(((Event/Extension2, )(Event)', - 'manyParensBothSpace': ' Event/Extension,(((Event/Extension2, )(Event ', - 'manyClosingParens': 'Event/Extension, (Event/Extension2, ))(Event)', - } - expected_results = { - 'single': ['Event'], - 'double': ['Event', ', ', 'Event/Extension'], - 'singleAndGroup': ['Event/Extension', ', ', '(', 'Event/Extension2', ', ', 'Event/Extension3', ')'], - 'singleAndGroupWithBlank': ['Event/Extension', ', ', '(', 'Event', ', ', ',', 'Event/Extension3', ')'], - 'manyParens': ['Event/Extension', ',', '(', '(', '(', 'Event/Extension2', ', ', ')', '(', 'Event', ')'], - 'manyParensEndingSpace': - ['Event/Extension', ',', '(', '(', '(', 'Event/Extension2', ', ', ')', '(', 'Event', ') '], - 'manyParensOpeningSpace': - [' ', 'Event/Extension', ',', '(', '(', '(', 'Event/Extension2', ', ', ')', '(', 'Event', ')'], - 'manyParensBothSpace': - [' ', 'Event/Extension', ',', '(', '(', '(', 'Event/Extension2', ', ', ')', '(', 'Event', ' '], - 'manyClosingParens': ['Event/Extension', ', ', '(', 'Event/Extension2', ', ', ')', ')', '(', 'Event', ')'] - } - - self.compare_split_results(test_strings, expected_results) - -class TestHedStringShrinkDefs(unittest.TestCase): - hed_schema = load_schema_version("8.0.0") - - def test_shrink_defs(self): - test_strings = { - 1: "(Def-expand/TestDefPlaceholder/2471,(Item/TestDef1/2471,Item/TestDef2)),Event", - 2: "Event, ((Def-expand/TestDefPlaceholder/2471,(Item/TestDef1/2471,Item/TestDef2)),Event)", - # this one shouldn't change as it doesn't have a parent - 3: "Def-expand/TestDefPlaceholder/2471,(Item/TestDef1/2471,Item/TestDef2),Event", - # This one is an obviously invalid def, but still shrinks - 4: "(Def-expand/TestDefPlaceholder/2471,(Item/TestDef1/2471,Item/TestDef2), ThisDefIsInvalid),Event", - } - - expected_results = { - 1: "Def/TestDefPlaceholder/2471,Event", - 2: "Event,(Def/TestDefPlaceholder/2471,Event)", - 3: "Def-expand/TestDefPlaceholder/2471,(Item/TestDef1/2471,Item/TestDef2),Event", - 4: "Def/TestDefPlaceholder/2471,Event", - } - - for key, test_string in test_strings.items(): - hed_string = HedString(test_string, hed_schema=self.hed_schema) - hed_string.shrink_defs() - self.assertEqual(str(hed_string), expected_results[key]) - - -class TestFromHedStrings(unittest.TestCase): - def setUp(self): - self.schema = load_schema_version("8.1.0") - self.hed_strings = [ - HedString('Event', self.schema), - HedString('Action', self.schema), - HedString('Age/20', self.schema), - HedString('Item', self.schema), - ] - - def test_from_hed_strings(self): - combined_hed_string = HedString.from_hed_strings(self.hed_strings) - - # Test that the combined hed string is as expected - self.assertEqual(combined_hed_string._hed_string, 'Event,Action,Age/20,Item') - - # Test that the schema of the combined hed string is the same as the first hed string - self.assertEqual(combined_hed_string._schema, self.schema) - - # Test that the contents of the combined hed string is the concatenation of the contents of all hed strings - expected_contents = [child for hed_string in self.hed_strings for child in hed_string.children] - self.assertEqual(combined_hed_string.children, expected_contents) - - # Test that the _from_strings attribute of the combined hed string is the list of original hed strings - self.assertEqual(combined_hed_string._from_strings, self.hed_strings) - - def test_empty_hed_strings_list(self): - with self.assertRaises(TypeError): - HedString.from_hed_strings([]) - - def test_none_hed_strings_list(self): - with self.assertRaises(TypeError): - HedString.from_hed_strings(None) - - def test_complex_hed_strings(self): - complex_hed_strings = [ - HedString('Event,Action', self.schema), - HedString('Age/20,Hand', self.schema), - HedString('Item,(Leg, Nose)', self.schema), - ] - - combined_hed_string = HedString.from_hed_strings(complex_hed_strings) - - # Test that the combined hed string is as expected - self.assertEqual(combined_hed_string._hed_string, 'Event,Action,Age/20,Hand,Item,(Leg, Nose)') - - # Test that the schema of the combined hed string is the same as the first hed string - self.assertEqual(combined_hed_string._schema, self.schema) - - # Test that the contents of the combined hed string is the concatenation of the contents of all hed strings - expected_contents = [child for hed_string in complex_hed_strings for child in hed_string.children] - self.assertEqual(combined_hed_string.children, expected_contents) - - # Test that the _from_strings attribute of the combined hed string is the list of original hed strings - self.assertEqual(combined_hed_string._from_strings, complex_hed_strings) - - def _verify_copied_string(self, original_hed_string): - # Make a deepcopy of the original HedString - copied_hed_string = copy.deepcopy(original_hed_string) - - # The copied HedString should not be the same object as the original - self.assertNotEqual(id(original_hed_string), id(copied_hed_string)) - - # The copied HedString should have the same _hed_string as the original - self.assertEqual(copied_hed_string._hed_string, original_hed_string._hed_string) - - # The _children attribute of copied HedString should not be the same object as the original - self.assertNotEqual(id(original_hed_string.children), id(copied_hed_string.children)) - - # The _children attribute of copied HedString should have the same contents as the original - self.assertEqual(copied_hed_string.children, original_hed_string.children) - - # The parent of each child in copied_hed_string._children should point to copied_hed_string - for child in copied_hed_string.children: - self.assertEqual(child._parent, copied_hed_string) - - # The _original_children and _from_strings attributes should also be deepcopied - self.assertNotEqual(id(original_hed_string._original_children), id(copied_hed_string._original_children)) - self.assertEqual(copied_hed_string._original_children, original_hed_string._original_children) - if original_hed_string._from_strings: - self.assertNotEqual(id(original_hed_string._from_strings), id(copied_hed_string._from_strings)) - self.assertEqual(copied_hed_string._from_strings, original_hed_string._from_strings) - - def test_deepcopy(self): - original_hed_string = HedString('Event,Action', self.schema) - - self._verify_copied_string(original_hed_string) - complex_hed_strings = [ - HedString('Event,Action', self.schema), - HedString('Age/20,Hand', self.schema), - HedString('Item,(Leg, Nose)', self.schema), - ] - - combined_hed_string = HedString.from_hed_strings(complex_hed_strings) - - self._verify_copied_string(combined_hed_string) \ No newline at end of file +from hed.models import HedString +import unittest +from hed import load_schema_version +import copy + + +class TestHedStrings(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.schema = load_schema_version("8.3.0") + + def validator_scalar(self, test_strings, expected_results, test_function): + for test_key in test_strings: + test_result = test_function(test_strings[test_key]) + expected_result = expected_results[test_key] + self.assertEqual(test_result, expected_result, test_strings[test_key]) + + def validator_list(self, test_strings, expected_results, test_function): + for test_key in test_strings: + test_result = test_function(test_strings[test_key]) + expected_result = expected_results[test_key] + self.assertCountEqual(test_result, expected_result, test_strings[test_key]) + + +class TestHedString(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.schema = load_schema_version("8.0.0") + pass + + def test_constructor(self): + test_strings = { + 'normal': "Tag1,Tag2", + 'normalParen': "(Tag1,Tag2)", + 'normalDoubleParen': "(Tag1,Tag2,(Tag3,Tag4))", + 'extraOpeningParen': "((Tag1,Tag2,(Tag3,Tag4))", + 'extra2OpeningParen': "(((Tag1,Tag2,(Tag3,Tag4))", + 'extraClosingParen': "(Tag1,Tag2,(Tag3,Tag4)))", + 'extra2ClosingParen': "(Tag1,Tag2,(Tag3,Tag4))))" + } + expected_result = { + 'normal': True, + 'normalParen': True, + 'normalDoubleParen': True, + 'extraOpeningParen': False, + 'extra2OpeningParen': False, + 'extraClosingParen': False, + 'extra2ClosingParen': False + } + + # Just make sure it doesn't crash while parsing super invalid strings. + for name, string in test_strings.items(): + hed_string = HedString(string, self.schema) + + self.assertEqual(bool(hed_string), expected_result[name]) + if bool(hed_string): + _ = hed_string.get_all_groups() + _ = hed_string.get_all_tags() + + +class HedTagLists(TestHedStrings): + def test_type(self): + hed_string = 'Event/Category/Experimental stimulus,Item/Object/Vehicle/Train,Attribute/Visual/Color/Purple' + result = HedString.split_into_groups(hed_string, self.schema) + self.assertIsInstance(result, list) + + def test_top_level_tags(self): + hed_string = 'Event/Category/Experimental stimulus,Item/Object/Vehicle/Train,Attribute/Visual/Color/Purple' + result = HedString.split_into_groups(hed_string, self.schema) + tags_as_strings = [str(tag) for tag in result] + self.assertCountEqual(tags_as_strings, ['Event/Category/Experimental stimulus', 'Item/Object/Vehicle/Train', + 'Attribute/Visual/Color/Purple']) + + def test_group_tags(self): + hed_string = '/Action/Reach/To touch,(/Attribute/Object side/Left,/Participant/Effect/Body part/Arm),' \ + '/Attribute/Location/Screen/Top/70 px,/Attribute/Location/Screen/Left/23 px ' + string_obj = HedString(hed_string, self.schema) + tags_as_strings = [str(tag) for tag in string_obj.children] + self.assertCountEqual(tags_as_strings, + ['/Action/Reach/To touch', + '(/Attribute/Object side/Left,/Participant/Effect/Body part/Arm)', + '/Attribute/Location/Screen/Top/70 px', '/Attribute/Location/Screen/Left/23 px']) + + def test_square_brackets_in_string(self): + # just verifying this parses, square brackets do not validate + hed_string = '[test_ref], Event/Sensory-event, Participant, ([test_ref2], Event)' + string_obj = HedString(hed_string, self.schema) + tags_as_strings = [str(tag) for tag in string_obj.children] + self.assertCountEqual(tags_as_strings, + ['[test_ref]', 'Sensory-event', 'Participant', '([test_ref2],Event)']) + + # Potentially restore some similar behavior later if desired. + # We no longer automatically remove things like quotes. + # def test_double_quotes(self): + # double_quote_string = 'Event/Category/Experimental stimulus,"Item/Object/Vehicle/Train",' \ + # 'Attribute/Visual/Color/Purple ' + # normal_string = 'Event/Category/Experimental stimulus,Item/Object/Vehicle/Train,Attribute/Visual/Color/Purple' + # double_quote_result = HedString.split_into_groups(double_quote_string) + # normal_result = HedString.split_into_groups(normal_string) + # self.assertEqual(double_quote_result, normal_result) + + def test_blanks(self): + test_strings = { + 'doubleTilde': + '/Item/Object/Vehicle/Car~~/Attribute/Object control/Perturb', + 'doubleComma': + '/Item/Object/Vehicle/Car,,/Attribute/Object control/Perturb', + 'doubleInvalidCharacter': + '/Item/Object/Vehicle/Car[]/Attribute/Object control/Perturb', + 'trailingBlank': + '/Item/Object/Vehicle/Car,/Attribute/Object control/Perturb,', + } + expected_list = [ + '/Item/Object/Vehicle/Car', + '/Attribute/Object control/Perturb', + ] + expected_results = { + 'doubleTilde': [ + '/Item/Object/Vehicle/Car~~/Attribute/Object control/Perturb', + ], + 'doubleComma': expected_list, + 'doubleInvalidCharacter': ['/Item/Object/Vehicle/Car[]/Attribute/Object control/Perturb'], + 'trailingBlank': expected_list, + } + + def test_function(string): + return [str(child) for child in HedString.split_into_groups(string, self.schema)] + + self.validator_list(test_strings, expected_results, test_function) + + +class ProcessedHedTags(TestHedStrings): + def test_parsed_tags(self): + hed_string = '/Action/Reach/To touch,(/Attribute/Object side/Left,/Participant/Effect/Body part/Arm),' \ + '/Attribute/Location/Screen/Top/70 px,/Attribute/Location/Screen/Left/23 px ' + parsed_string = HedString(hed_string, self.schema) + self.assertCountEqual([str(tag) for tag in parsed_string.get_all_tags()], [ + '/Action/Reach/To touch', + '/Attribute/Object side/Left', + '/Participant/Effect/Body part/Arm', + '/Attribute/Location/Screen/Top/70 px', + '/Attribute/Location/Screen/Left/23 px', + ]) + self.assertCountEqual([str(group) for group in parsed_string.get_all_groups()], + ['/Action/Reach/To touch,(/Attribute/Object side/Left,/Participant/Effect/Body part/Arm),' + '/Attribute/Location/Screen/Top/70 px,/Attribute/Location/Screen/Left/23 px', + '(/Attribute/Object side/Left,/Participant/Effect/Body part/Arm)']) + + +class TestHedStringUtil(unittest.TestCase): + def compare_split_results(self, test_strings, expected_results): + for test_key in test_strings: + test_string = test_strings[test_key] + expected_result = expected_results[test_key] + actual_results = HedString.split_hed_string(test_string) + decoded_results = [test_string[start:end] for (is_tag, (start, end)) in actual_results] + self.assertEqual(decoded_results, expected_result) + + def test_split_hed_string(self): + test_strings = { + 'single': 'Event', + 'double': 'Event, Event/Extension', + 'singleAndGroup': 'Event/Extension, (Event/Extension2, Event/Extension3)', + 'singleAndGroupWithBlank': 'Event/Extension, (Event, ,Event/Extension3)', + 'manyParens': 'Event/Extension,(((Event/Extension2, )(Event)', + 'manyParensEndingSpace': 'Event/Extension,(((Event/Extension2, )(Event) ', + 'manyParensOpeningSpace': ' Event/Extension,(((Event/Extension2, )(Event)', + 'manyParensBothSpace': ' Event/Extension,(((Event/Extension2, )(Event ', + 'manyClosingParens': 'Event/Extension, (Event/Extension2, ))(Event)', + } + expected_results = { + 'single': ['Event'], + 'double': ['Event', ', ', 'Event/Extension'], + 'singleAndGroup': ['Event/Extension', ', ', '(', 'Event/Extension2', ', ', 'Event/Extension3', ')'], + 'singleAndGroupWithBlank': ['Event/Extension', ', ', '(', 'Event', ', ', ',', 'Event/Extension3', ')'], + 'manyParens': ['Event/Extension', ',', '(', '(', '(', 'Event/Extension2', ', ', ')', '(', 'Event', ')'], + 'manyParensEndingSpace': + ['Event/Extension', ',', '(', '(', '(', 'Event/Extension2', ', ', ')', '(', 'Event', ') '], + 'manyParensOpeningSpace': + [' ', 'Event/Extension', ',', '(', '(', '(', 'Event/Extension2', ', ', ')', '(', 'Event', ')'], + 'manyParensBothSpace': + [' ', 'Event/Extension', ',', '(', '(', '(', 'Event/Extension2', ', ', ')', '(', 'Event', ' '], + 'manyClosingParens': ['Event/Extension', ', ', '(', 'Event/Extension2', ', ', ')', ')', '(', 'Event', ')'] + } + + self.compare_split_results(test_strings, expected_results) + + +class TestHedStringShrinkDefs(unittest.TestCase): + hed_schema = load_schema_version("8.0.0") + + def test_shrink_defs(self): + test_strings = { + 1: "(Def-expand/TestDefPlaceholder/2471,(Item/TestDef1/2471,Item/TestDef2)),Event", + 2: "Event, ((Def-expand/TestDefPlaceholder/2471,(Item/TestDef1/2471,Item/TestDef2)),Event)", + # this one shouldn't change as it doesn't have a parent + 3: "Def-expand/TestDefPlaceholder/2471,(Item/TestDef1/2471,Item/TestDef2),Event", + # This one is an obviously invalid def, but still shrinks + 4: "(Def-expand/TestDefPlaceholder/2471,(Item/TestDef1/2471,Item/TestDef2), ThisDefIsInvalid),Event", + } + + expected_results = { + 1: "Def/TestDefPlaceholder/2471,Event", + 2: "Event,(Def/TestDefPlaceholder/2471,Event)", + 3: "Def-expand/TestDefPlaceholder/2471,(Item/TestDef1/2471,Item/TestDef2),Event", + 4: "Def/TestDefPlaceholder/2471,Event", + } + + for key, test_string in test_strings.items(): + hed_string = HedString(test_string, hed_schema=self.hed_schema) + hed_string.shrink_defs() + self.assertEqual(str(hed_string), expected_results[key]) + + +class TestFromHedStrings(unittest.TestCase): + def setUp(self): + self.schema = load_schema_version("8.1.0") + self.hed_strings = [ + HedString('Event', self.schema), + HedString('Action', self.schema), + HedString('Age/20', self.schema), + HedString('Item', self.schema), + ] + + def test_from_hed_strings(self): + combined_hed_string = HedString.from_hed_strings(self.hed_strings) + + # Test that the combined HED string is as expected + self.assertEqual(combined_hed_string._hed_string, 'Event,Action,Age/20,Item') + + # Test that the schema of the combined HED string is the same as the first HED string + self.assertEqual(combined_hed_string._schema, self.schema) + + # Test that the contents of the combined HED string is the concatenation of the contents of all HED strings + expected_contents = [child for hed_string in self.hed_strings for child in hed_string.children] + self.assertEqual(combined_hed_string.children, expected_contents) + + # Test that the _from_strings attribute of the combined HED string is the list of original HED strings + self.assertEqual(combined_hed_string._from_strings, self.hed_strings) + + def test_empty_hed_strings_list(self): + with self.assertRaises(TypeError): + HedString.from_hed_strings([]) + + def test_none_hed_strings_list(self): + with self.assertRaises(TypeError): + HedString.from_hed_strings(None) + + def test_complex_hed_strings(self): + complex_hed_strings = [ + HedString('Event,Action', self.schema), + HedString('Age/20,Hand', self.schema), + HedString('Item,(Leg, Nose)', self.schema), + ] + + combined_hed_string = HedString.from_hed_strings(complex_hed_strings) + + # Test that the combined HED string is as expected + self.assertEqual(combined_hed_string._hed_string, 'Event,Action,Age/20,Hand,Item,(Leg, Nose)') + + # Test that the schema of the combined HED string is the same as the first HED string + self.assertEqual(combined_hed_string._schema, self.schema) + + # Test that the contents of the combined HED string is the concatenation of the contents of all HED strings + expected_contents = [child for hed_string in complex_hed_strings for child in hed_string.children] + self.assertEqual(combined_hed_string.children, expected_contents) + + # Test that the _from_strings attribute of the combined HED string is the list of original HED strings + self.assertEqual(combined_hed_string._from_strings, complex_hed_strings) + + def _verify_copied_string(self, original_hed_string): + # Make a deepcopy of the original HedString + copied_hed_string = copy.deepcopy(original_hed_string) + + # The copied HedString should not be the same object as the original + self.assertNotEqual(id(original_hed_string), id(copied_hed_string)) + + # The copied HedString should have the same _hed_string as the original + self.assertEqual(copied_hed_string._hed_string, original_hed_string._hed_string) + + # The _children attribute of copied HedString should not be the same object as the original + self.assertNotEqual(id(original_hed_string.children), id(copied_hed_string.children)) + + # The _children attribute of copied HedString should have the same contents as the original + self.assertEqual(copied_hed_string.children, original_hed_string.children) + + # The parent of each child in copied_hed_string._children should point to copied_hed_string + for child in copied_hed_string.children: + self.assertEqual(child._parent, copied_hed_string) + + # The _original_children and _from_strings attributes should also be deep copied + self.assertNotEqual(id(original_hed_string._original_children), id(copied_hed_string._original_children)) + self.assertEqual(copied_hed_string._original_children, original_hed_string._original_children) + if original_hed_string._from_strings: + self.assertNotEqual(id(original_hed_string._from_strings), id(copied_hed_string._from_strings)) + self.assertEqual(copied_hed_string._from_strings, original_hed_string._from_strings) + + def test_deepcopy(self): + original_hed_string = HedString('Event,Action', self.schema) + + self._verify_copied_string(original_hed_string) + complex_hed_strings = [ + HedString('Event,Action', self.schema), + HedString('Age/20,Hand', self.schema), + HedString('Item,(Leg, Nose)', self.schema), + ] + + combined_hed_string = HedString.from_hed_strings(complex_hed_strings) + + self._verify_copied_string(combined_hed_string) diff --git a/tests/models/test_hed_tag.py b/tests/models/test_hed_tag.py index a61380b90..e1b62ac58 100644 --- a/tests/models/test_hed_tag.py +++ b/tests/models/test_hed_tag.py @@ -1,188 +1,192 @@ -from hed.models.hed_tag import HedTag -from tests.validator.test_tag_validator_base import TestHedBase -from hed.schema import HedKey -from hed import load_schema_version - -from tests.schema import util_create_schemas - - -class TestValidatorUtilityFunctions(TestHedBase): - - @classmethod - def setUpClass(cls): - cls.hed_schema = load_schema_version("8.3.0") - - def test_if_tag_exists(self): - valid_tag1 = HedTag('Left-handed', hed_schema=self.hed_schema) - hash1 = hash(valid_tag1) - hash2 = hash(valid_tag1) - self.assertEqual(hash1, hash2) - valid_tag2 = HedTag('Geometric-object', hed_schema=self.hed_schema) - valid_tag3 = HedTag('duration/#', hed_schema=self.hed_schema) - invalid_tag1 = HedTag('something', hed_schema=self.hed_schema) - invalid_tag2 = HedTag('Participant/nothing', hed_schema=self.hed_schema) - invalid_tag3 = HedTag('participant/#', hed_schema=self.hed_schema) - valid_tag1_results = valid_tag1.tag_exists_in_schema() - valid_tag2_results = valid_tag2.tag_exists_in_schema() - valid_tag3_results = valid_tag3.tag_exists_in_schema() - invalid_tag1_results = invalid_tag1.tag_exists_in_schema() - invalid_tag2_results = invalid_tag2.tag_exists_in_schema() - invalid_tag3_results = invalid_tag3.tag_exists_in_schema() - # valid_tag1_results = self.semantic_tag_validator.check_tag_exists_in_schema(valid_tag1) - # valid_tag2_results = self.semantic_tag_validator.check_tag_exists_in_schema(valid_tag2) - # valid_tag3_results = self.semantic_tag_validator.check_tag_exists_in_schema(valid_tag3) - # invalid_tag1_results = self.semantic_tag_validator.check_tag_exists_in_schema(invalid_tag1) - # invalid_tag2_results = self.semantic_tag_validator.check_tag_exists_in_schema(invalid_tag2) - # invalid_tag3_results = self.semantic_tag_validator.check_tag_exists_in_schema(invalid_tag3) - self.assertEqual(valid_tag1_results, True) - self.assertEqual(valid_tag2_results, True) - self.assertEqual(valid_tag3_results, True) - self.assertEqual(invalid_tag1_results, False) - self.assertEqual(invalid_tag2_results, False) - self.assertEqual(invalid_tag3_results, False) - - -class TestSchemaUtilityFunctions(TestHedBase): - @classmethod - def setUpClass(cls): - cls.hed_schema = load_schema_version("8.3.0") - - def test_correctly_determine_tag_takes_value(self): - value_tag1 = HedTag('Distance/35 px', hed_schema=self.hed_schema) - value_tag2 = HedTag('id/35', hed_schema=self.hed_schema) - value_tag3 = HedTag('duration/#', hed_schema=self.hed_schema) - no_value_tag1 = HedTag('something', hed_schema=self.hed_schema) - no_value_tag2 = HedTag('attribute/color/black', hed_schema=self.hed_schema) - no_value_tag3 = HedTag('participant/#', hed_schema=self.hed_schema) - value_tag1_result = value_tag1.is_takes_value_tag() - value_tag2_result = value_tag2.is_takes_value_tag() - value_tag3_result = value_tag3.is_takes_value_tag() - no_value_tag1_result = no_value_tag1.is_takes_value_tag() - no_value_tag2_result = no_value_tag2.is_takes_value_tag() - no_value_tag3_result = no_value_tag3.is_takes_value_tag() - self.assertEqual(value_tag1_result, True) - self.assertEqual(value_tag2_result, True) - self.assertEqual(value_tag3_result, True) - self.assertEqual(no_value_tag1_result, False) - self.assertEqual(no_value_tag2_result, False) - self.assertEqual(no_value_tag3_result, False) - - def test_should_determine_default_unit(self): - unit_class_tag1 = HedTag('duration/35 ms', hed_schema=self.hed_schema) - # unit_class_tag2 = HedTag('participant/effect/cognitive/reward/11 dollars', - # schema=self.schema) - no_unit_class_tag = HedTag('RGB-red/0.5', hed_schema=self.hed_schema) - no_value_tag = HedTag('Black', hed_schema=self.hed_schema) - unit_class_tag1_result = unit_class_tag1.default_unit - # unit_class_tag2_result = unit_class_tag2.default_unit - no_unit_class_tag_result = no_unit_class_tag.default_unit - no_value_tag_result = no_value_tag.default_unit - self.assertEqual(unit_class_tag1_result.name, 's') - # self.assertEqual(unit_class_tag2_result, '$') - self.assertEqual(no_unit_class_tag_result, None) - self.assertEqual(no_value_tag_result, None) - - def test_correctly_determine_tag_unit_classes(self): - unit_class_tag1 = HedTag('distance/35 px', hed_schema=self.hed_schema) - # Todo: Make a schema with a currency unit to test this - # unit_class_tag2 = HedTag('reward/$10.55', schema=self.schema) - unit_class_tag3 = HedTag('duration/#', hed_schema=self.hed_schema) - no_unit_class_tag = HedTag('RGB-red/0.5', hed_schema=self.hed_schema) - unit_class_tag1_result = list(unit_class_tag1.unit_classes.keys()) - # unit_class_tag2_result = list(unit_class_tag2.get_tag_unit_class_units()) - unit_class_tag3_result = list(unit_class_tag3.unit_classes.keys()) - no_unit_class_tag_result = list(no_unit_class_tag.unit_classes.keys()) - self.assertCountEqual(unit_class_tag1_result, ['physicalLengthUnits']) - # self.assertCountEqual(unit_class_tag2_result, ['currency']) - self.assertCountEqual(unit_class_tag3_result, ['timeUnits']) - self.assertEqual(no_unit_class_tag_result, []) - - def test_determine_tags_legal_units(self): - unit_class_tag1 = HedTag('distance/35 px', hed_schema=self.hed_schema) - # todo: add this back in when we have a currency unit or make a test for one. - # unit_class_tag2 = HedTag('reward/$10.55', schema=self.schema) - no_unit_class_tag = HedTag('RGB-red/0.5', hed_schema=self.hed_schema) - unit_class_tag1_result = unit_class_tag1.get_tag_unit_class_units() - # unit_class_tag2_result = unit_class_tag2.get_tag_unit_class_units() - no_unit_class_tag_result = no_unit_class_tag.get_tag_unit_class_units() - self.assertCountEqual(sorted(unit_class_tag1_result), sorted([ - 'inch', - 'm', - 'foot', - 'metre', - 'meter', - 'mile', - ])) - # self.assertCountEqual(unit_class_tag2_result, [ - # 'dollar', - # '$', - # 'point', - # 'fraction', - # ]) - self.assertEqual(no_unit_class_tag_result, []) - - def test_strip_off_units_from_value(self): - # todo: add this back in when we have a currency unit or make a test for one. - # dollars_string_no_space = HedTag('Participant/Effect/Cognitive/Reward/$25.99', schema=self.schema) - # dollars_string = HedTag('Participant/Effect/Cognitive/Reward/$ 25.99', schema=self.schema) - # dollars_string_invalid = HedTag('Participant/Effect/Cognitive/Reward/25.99$', schema=self.schema) - volume_string_no_space = HedTag('Volume/100m^3', hed_schema=self.hed_schema) - volume_string = HedTag('Volume/100 m^3', hed_schema=self.hed_schema) - prefixed_volume_string = HedTag('Volume/100 cm^3', hed_schema=self.hed_schema) - invalid_volume_string = HedTag('Volume/200 cm', hed_schema=self.hed_schema) - invalid_distance_string = HedTag('Distance/200 M', hed_schema=self.hed_schema) - # currency_units = { - # 'currency':self.schema.unit_classes['currency'] - # } - volume_units = { - 'volume': self.hed_schema.unit_classes['volumeUnits'] - } - distance_units = { - 'distance': self.hed_schema.unit_classes['physicalLengthUnits'] - } - # stripped_dollars_string_no_space = dollars_string_no_space._get_tag_units_portion(currency_units) - # stripped_dollars_string = dollars_string._get_tag_units_portion(currency_units) - # stripped_dollars_string_invalid = dollars_string_invalid._get_tag_units_portion(currency_units) - stripped_volume_string, _, _ = HedTag._get_tag_units_portion(volume_string.extension, volume_units) - stripped_volume_string_no_space, _, _ = HedTag._get_tag_units_portion(volume_string_no_space.extension, volume_units) - stripped_prefixed_volume_string, _, _ = HedTag._get_tag_units_portion(prefixed_volume_string.extension, volume_units) - stripped_invalid_volume_string, _, _ = HedTag._get_tag_units_portion(invalid_volume_string.extension, volume_units) - stripped_invalid_distance_string, _, _ = HedTag._get_tag_units_portion(invalid_distance_string.extension, distance_units) - # self.assertEqual(stripped_dollars_string_no_space, None) - # self.assertEqual(stripped_dollars_string, '25.99') - # self.assertEqual(stripped_dollars_string_invalid, None) - self.assertEqual(stripped_volume_string, '100') - self.assertEqual(stripped_volume_string_no_space, None) - self.assertEqual(stripped_prefixed_volume_string, '100') - self.assertEqual(stripped_invalid_volume_string, None) - self.assertEqual(stripped_invalid_distance_string, None) - - def test_determine_allows_extensions(self): - extension_tag1 = HedTag('boat', hed_schema=self.hed_schema) - no_extension_tag1 = HedTag('duration/22 s', hed_schema=self.hed_schema) - no_extension_tag2 = HedTag('id/45', hed_schema=self.hed_schema) - no_extension_tag3 = HedTag('RGB-red/0.5', hed_schema=self.hed_schema) - extension_tag1_result = extension_tag1.has_attribute(HedKey.ExtensionAllowed) - no_extension_tag1_result = no_extension_tag1.has_attribute(HedKey.ExtensionAllowed) - no_extension_tag2_result = no_extension_tag2.has_attribute(HedKey.ExtensionAllowed) - no_extension_tag3_result = no_extension_tag3.has_attribute(HedKey.ExtensionAllowed) - self.assertEqual(extension_tag1_result, True) - self.assertEqual(no_extension_tag1_result, False) - self.assertEqual(no_extension_tag2_result, False) - self.assertEqual(no_extension_tag3_result, False) - - def test_get_as_default_units(self): - tag = HedTag("Duration/300 ms", hed_schema=self.hed_schema) - self.assertAlmostEqual(0.3, tag.value_as_default_unit()) - - tag2 = HedTag("Duration/300", hed_schema=self.hed_schema) - self.assertAlmostEqual(300, tag2.value_as_default_unit()) - - tag3 = HedTag("Duration/300 m", hed_schema=self.hed_schema) - self.assertEqual(None, tag3.value_as_default_unit()) - - tag4 = HedTag("IntensityTakesValue/300", hed_schema=util_create_schemas.load_schema_intensity()) - self.assertEqual(300, tag4.value_as_default_unit()) - - tag5 = HedTag("IntensityTakesValue/300 cd", hed_schema=util_create_schemas.load_schema_intensity()) - self.assertEqual(None, tag5.value_as_default_unit()) +from hed.models.hed_tag import HedTag +from tests.validator.test_tag_validator_base import TestHedBase +from hed.schema import HedKey +from hed import load_schema_version + +from tests.schema import util_create_schemas + + +class TestValidatorUtilityFunctions(TestHedBase): + + @classmethod + def setUpClass(cls): + cls.hed_schema = load_schema_version("8.3.0") + + def test_if_tag_exists(self): + valid_tag1 = HedTag('Left-handed', hed_schema=self.hed_schema) + hash1 = hash(valid_tag1) + hash2 = hash(valid_tag1) + self.assertEqual(hash1, hash2) + valid_tag2 = HedTag('Geometric-object', hed_schema=self.hed_schema) + valid_tag3 = HedTag('duration/#', hed_schema=self.hed_schema) + invalid_tag1 = HedTag('something', hed_schema=self.hed_schema) + invalid_tag2 = HedTag('Participant/nothing', hed_schema=self.hed_schema) + invalid_tag3 = HedTag('participant/#', hed_schema=self.hed_schema) + valid_tag1_results = valid_tag1.tag_exists_in_schema() + valid_tag2_results = valid_tag2.tag_exists_in_schema() + valid_tag3_results = valid_tag3.tag_exists_in_schema() + invalid_tag1_results = invalid_tag1.tag_exists_in_schema() + invalid_tag2_results = invalid_tag2.tag_exists_in_schema() + invalid_tag3_results = invalid_tag3.tag_exists_in_schema() + # valid_tag1_results = self.semantic_tag_validator.check_tag_exists_in_schema(valid_tag1) + # valid_tag2_results = self.semantic_tag_validator.check_tag_exists_in_schema(valid_tag2) + # valid_tag3_results = self.semantic_tag_validator.check_tag_exists_in_schema(valid_tag3) + # invalid_tag1_results = self.semantic_tag_validator.check_tag_exists_in_schema(invalid_tag1) + # invalid_tag2_results = self.semantic_tag_validator.check_tag_exists_in_schema(invalid_tag2) + # invalid_tag3_results = self.semantic_tag_validator.check_tag_exists_in_schema(invalid_tag3) + self.assertEqual(valid_tag1_results, True) + self.assertEqual(valid_tag2_results, True) + self.assertEqual(valid_tag3_results, True) + self.assertEqual(invalid_tag1_results, False) + self.assertEqual(invalid_tag2_results, False) + self.assertEqual(invalid_tag3_results, False) + + +class TestSchemaUtilityFunctions(TestHedBase): + @classmethod + def setUpClass(cls): + cls.hed_schema = load_schema_version("8.3.0") + + def test_correctly_determine_tag_takes_value(self): + value_tag1 = HedTag('Distance/35 px', hed_schema=self.hed_schema) + value_tag2 = HedTag('id/35', hed_schema=self.hed_schema) + value_tag3 = HedTag('duration/#', hed_schema=self.hed_schema) + no_value_tag1 = HedTag('something', hed_schema=self.hed_schema) + no_value_tag2 = HedTag('attribute/color/black', hed_schema=self.hed_schema) + no_value_tag3 = HedTag('participant/#', hed_schema=self.hed_schema) + value_tag1_result = value_tag1.is_takes_value_tag() + value_tag2_result = value_tag2.is_takes_value_tag() + value_tag3_result = value_tag3.is_takes_value_tag() + no_value_tag1_result = no_value_tag1.is_takes_value_tag() + no_value_tag2_result = no_value_tag2.is_takes_value_tag() + no_value_tag3_result = no_value_tag3.is_takes_value_tag() + self.assertEqual(value_tag1_result, True) + self.assertEqual(value_tag2_result, True) + self.assertEqual(value_tag3_result, True) + self.assertEqual(no_value_tag1_result, False) + self.assertEqual(no_value_tag2_result, False) + self.assertEqual(no_value_tag3_result, False) + + def test_should_determine_default_unit(self): + unit_class_tag1 = HedTag('duration/35 ms', hed_schema=self.hed_schema) + # unit_class_tag2 = HedTag('participant/effect/cognitive/reward/11 dollars', + # schema=self.schema) + no_unit_class_tag = HedTag('RGB-red/0.5', hed_schema=self.hed_schema) + no_value_tag = HedTag('Black', hed_schema=self.hed_schema) + unit_class_tag1_result = unit_class_tag1.default_unit + # unit_class_tag2_result = unit_class_tag2.default_unit + no_unit_class_tag_result = no_unit_class_tag.default_unit + no_value_tag_result = no_value_tag.default_unit + self.assertEqual(unit_class_tag1_result.name, 's') + # self.assertEqual(unit_class_tag2_result, '$') + self.assertEqual(no_unit_class_tag_result, None) + self.assertEqual(no_value_tag_result, None) + + def test_correctly_determine_tag_unit_classes(self): + unit_class_tag1 = HedTag('distance/35 px', hed_schema=self.hed_schema) + # Todo: Make a schema with a currency unit to test this + # unit_class_tag2 = HedTag('reward/$10.55', schema=self.schema) + unit_class_tag3 = HedTag('duration/#', hed_schema=self.hed_schema) + no_unit_class_tag = HedTag('RGB-red/0.5', hed_schema=self.hed_schema) + unit_class_tag1_result = list(unit_class_tag1.unit_classes.keys()) + # unit_class_tag2_result = list(unit_class_tag2.get_tag_unit_class_units()) + unit_class_tag3_result = list(unit_class_tag3.unit_classes.keys()) + no_unit_class_tag_result = list(no_unit_class_tag.unit_classes.keys()) + self.assertCountEqual(unit_class_tag1_result, ['physicalLengthUnits']) + # self.assertCountEqual(unit_class_tag2_result, ['currency']) + self.assertCountEqual(unit_class_tag3_result, ['timeUnits']) + self.assertEqual(no_unit_class_tag_result, []) + + def test_determine_tags_legal_units(self): + unit_class_tag1 = HedTag('distance/35 px', hed_schema=self.hed_schema) + # todo: add this back in when we have a currency unit or make a test for one. + # unit_class_tag2 = HedTag('reward/$10.55', schema=self.schema) + no_unit_class_tag = HedTag('RGB-red/0.5', hed_schema=self.hed_schema) + unit_class_tag1_result = unit_class_tag1.get_tag_unit_class_units() + # unit_class_tag2_result = unit_class_tag2.get_tag_unit_class_units() + no_unit_class_tag_result = no_unit_class_tag.get_tag_unit_class_units() + self.assertCountEqual(sorted(unit_class_tag1_result), sorted([ + 'inch', + 'm', + 'foot', + 'metre', + 'meter', + 'mile', + ])) + # self.assertCountEqual(unit_class_tag2_result, [ + # 'dollar', + # '$', + # 'point', + # 'fraction', + # ]) + self.assertEqual(no_unit_class_tag_result, []) + + def test_strip_off_units_from_value(self): + # todo: add this back in when we have a currency unit or make a test for one. + # dollars_string_no_space = HedTag('Participant/Effect/Cognitive/Reward/$25.99', schema=self.schema) + # dollars_string = HedTag('Participant/Effect/Cognitive/Reward/$ 25.99', schema=self.schema) + # dollars_string_invalid = HedTag('Participant/Effect/Cognitive/Reward/25.99$', schema=self.schema) + volume_string_no_space = HedTag('Volume/100m^3', hed_schema=self.hed_schema) + volume_string = HedTag('Volume/100 m^3', hed_schema=self.hed_schema) + prefixed_volume_string = HedTag('Volume/100 cm^3', hed_schema=self.hed_schema) + invalid_volume_string = HedTag('Volume/200 cm', hed_schema=self.hed_schema) + invalid_distance_string = HedTag('Distance/200 M', hed_schema=self.hed_schema) + # currency_units = { + # 'currency':self.schema.unit_classes['currency'] + # } + volume_units = { + 'volume': self.hed_schema.unit_classes['volumeUnits'] + } + distance_units = { + 'distance': self.hed_schema.unit_classes['physicalLengthUnits'] + } + # stripped_dollars_string_no_space = dollars_string_no_space._get_tag_units_portion(currency_units) + # stripped_dollars_string = dollars_string._get_tag_units_portion(currency_units) + # stripped_dollars_string_invalid = dollars_string_invalid._get_tag_units_portion(currency_units) + stripped_volume_string, _, _ = HedTag._get_tag_units_portion(volume_string.extension, volume_units) + stripped_volume_string_no_space, _, _ = HedTag._get_tag_units_portion(volume_string_no_space.extension, + volume_units) + stripped_prefixed_volume_string, _, _ = HedTag._get_tag_units_portion(prefixed_volume_string.extension, + volume_units) + stripped_invalid_volume_string, _, _ = HedTag._get_tag_units_portion(invalid_volume_string.extension, + volume_units) + stripped_invalid_distance_string, _, _ = HedTag._get_tag_units_portion(invalid_distance_string.extension, + distance_units) + # self.assertEqual(stripped_dollars_string_no_space, None) + # self.assertEqual(stripped_dollars_string, '25.99') + # self.assertEqual(stripped_dollars_string_invalid, None) + self.assertEqual(stripped_volume_string, '100') + self.assertEqual(stripped_volume_string_no_space, None) + self.assertEqual(stripped_prefixed_volume_string, '100') + self.assertEqual(stripped_invalid_volume_string, None) + self.assertEqual(stripped_invalid_distance_string, None) + + def test_determine_allows_extensions(self): + extension_tag1 = HedTag('boat', hed_schema=self.hed_schema) + no_extension_tag1 = HedTag('duration/22 s', hed_schema=self.hed_schema) + no_extension_tag2 = HedTag('id/45', hed_schema=self.hed_schema) + no_extension_tag3 = HedTag('RGB-red/0.5', hed_schema=self.hed_schema) + extension_tag1_result = extension_tag1.has_attribute(HedKey.ExtensionAllowed) + no_extension_tag1_result = no_extension_tag1.has_attribute(HedKey.ExtensionAllowed) + no_extension_tag2_result = no_extension_tag2.has_attribute(HedKey.ExtensionAllowed) + no_extension_tag3_result = no_extension_tag3.has_attribute(HedKey.ExtensionAllowed) + self.assertEqual(extension_tag1_result, True) + self.assertEqual(no_extension_tag1_result, False) + self.assertEqual(no_extension_tag2_result, False) + self.assertEqual(no_extension_tag3_result, False) + + def test_get_as_default_units(self): + tag = HedTag("Duration/300 ms", hed_schema=self.hed_schema) + self.assertAlmostEqual(0.3, tag.value_as_default_unit()) + + tag2 = HedTag("Duration/300", hed_schema=self.hed_schema) + self.assertAlmostEqual(300, tag2.value_as_default_unit()) + + tag3 = HedTag("Duration/300 m", hed_schema=self.hed_schema) + self.assertEqual(None, tag3.value_as_default_unit()) + + tag4 = HedTag("IntensityTakesValue/300", hed_schema=util_create_schemas.load_schema_intensity()) + self.assertEqual(300, tag4.value_as_default_unit()) + + tag5 = HedTag("IntensityTakesValue/300 cd", hed_schema=util_create_schemas.load_schema_intensity()) + self.assertEqual(None, tag5.value_as_default_unit()) diff --git a/tests/models/test_query_handler.py b/tests/models/test_query_handler.py index 7989b3014..707fd4fba 100644 --- a/tests/models/test_query_handler.py +++ b/tests/models/test_query_handler.py @@ -1,774 +1,775 @@ -import unittest -from hed.models.hed_string import HedString -from hed.models.query_handler import QueryHandler -import os -from hed import schema -from hed import HedTag - - -# Override the tag terms function for testing purposes when we don't have a schema -def new_init(self, *args, **kwargs): - old_tag_init(self, *args, **kwargs) - if not self.tag_terms: - self.tag_terms = (str(self).lower(),) - -old_tag_init = HedTag.__init__ -HedTag.__init__ = new_init - - -class TestParser(unittest.TestCase): - @classmethod - def setUpClass(cls): - base_data_dir = os.path.realpath(os.path.join(os.path.dirname(__file__), '../data/')) - cls.base_data_dir = base_data_dir - hed_xml_file = os.path.join(base_data_dir, "schema_tests/HED8.0.0t.xml") - cls.hed_schema = schema.load_schema(hed_xml_file) - - def base_test(self, parse_expr, search_strings): - expression = QueryHandler(parse_expr) - - # print(f"Search Pattern: {expression._org_string} - {str(expression.tree)}") - for string, expected_result in search_strings.items(): - hed_string = HedString(string, self.hed_schema) - result2 = expression.search(hed_string) - # print(f"\tSearching string '{str(hed_string)}'") - # if result2: - # print(f"\t\tFound as group(s) {str([str(r) for r in result2])}") - self.assertEqual(bool(result2), expected_result) - - def test_broken_search_strings(self): - test_search_strings = [ - "A &&", - "(A && B", - "&& B", - "A, ", - ", A", - "A)" - ] - for string in test_search_strings: - with self.assertRaises(ValueError) as context: - QueryHandler(string) - self.assertTrue(context.exception.args[0]) - - def test_finding_tags(self): - test_strings = { - "Item, (Clear-throat)": True, - "(Item, (Clear-throat))": True, - "Item, Clear-throat": True, - "Agent, Clear-throat": True, - "Agent, Event": False, - } - self.base_test("(Item || Agent) && Action", test_strings) - - def test_finding_tags_wildcards(self): - test_strings = { - "Def/Def1": True, - "Def/Def2": True, - "Def/Def1/Value": True, - } - self.base_test("Def", test_strings) - test_strings = { - "Def/Def1": True, - "Def/Def2": True, - "Def/Def1/Value": True, - } - self.base_test("Def/Def*", test_strings) - test_strings = { - "Def/Def1": True, - "Def/Def2": False, - "Def/Def1/Value": False, - } - self.base_test("Def/Def1", test_strings) - test_strings = { - "Def/Def1": True, - "Def/Def2": False, - "Def/Def1/Value": True, - } - self.base_test("Def/Def1*", test_strings) - test_strings = { - "Def/Def1": False, - "Def/Def2": False, - "Def/Def1/Value": True, - } - self.base_test("Def/Def1/*", test_strings) - - def test_exact_term(self): - test_strings = { - "Event": True, - "Sensory-event": False, - "Event/ext": False - } - self.base_test('"Event"', test_strings) - - def test_actual_wildcard(self): - test_strings = { - "A, B, C": True, - "A, B": True, - "A, B, (C)": True, - } - self.base_test("A, B", test_strings) - - def test_finding_tags2(self): - test_strings = { - "Item, (Clear-throat)": True, - "(Item, (Clear-throat))": True, - "Item, Clear-throat": False, - "Agent, Clear-throat": False, - "Agent, Event": False, - "Agent, (Event)": True, - "(Item), (Event)": True - } - self.base_test("(Item || Agent) && {Action || Event}", test_strings) - - def test_exact_group(self): - test_strings = { - "A, B": False, - "(A, B)": True, - "(A, (B))": False, - "(A, (B, C))": False, - "(A), (A, B)": True, - "(A, B), (A)": True, - "(A, B, (C, D))": True, - "(A, B, C)": True - } - self.base_test("{a, b}", test_strings) - - def test_exact_group_simple_complex(self): - test_strings = { - "(A, C)": False, - "(A, (C))": True, - "((A, C))": False, - "A, B, C, D": False, - "(A, B, C, D)": False, - "(A, B, (C, D))": True, - "(A, B, ((C, D)))": False, - "(E, F, (A, B, (C, D)))": True, - "(A, B, (E, F, (C, D)))": False, # TODO: Should this be True? [[c]] isn't directly inside an a group. - } - self.base_test("{a, {c} }", test_strings) - - def test_exact_group_complex(self): - test_strings = { - "A, B, C, D": False, - "(A, B, C, D)": False, - "(A, B, (C, D))": True, - "(A, B, ((C, D)))": False, - "(E, F, (A, B, (C, D)))": True, - } - self.base_test("{a, b, {c, d} }", test_strings) - - def test_duplicate_search(self): - test_strings = { - "(Event)": False, - "(Event, Agent-action)": True, - - } - self.base_test("Event && Event", test_strings) - - def test_duplicate_search_or(self): - test_strings = { - "(Event)": True, - "(Event, Agent-action)": True, - - } - self.base_test("Event || Event", test_strings) - - def test_exact_group_complex_split(self): - test_strings = { - "A, B, C, D": False, - "(A, B, C, D)": False, - "((A, B, C, D))": False, - "(A, B, (C, D))": False, - "(A, B, ((C, D)))": False, - "(E, F, (A, B, (C, D)))": False, - "((A, B), (C, D))": True, - } - self.base_test("{ {a, b}, {c, d} }", test_strings) - - def test_mixed_group_split(self): - test_strings = { - "(Event, Clear-throat)": False, - "((Event), (Clear-throat))": True, - "((Event), ((Clear-throat)))": True, - "((Event, Clear-throat))": False, - } - self.base_test("{ [Event], [Action] }", test_strings) - - def test_exact_group_split(self): - test_strings = { - "(Event, Clear-throat)": False, - "((Event), (Clear-throat))": True, - "((Event), ((Clear-throat)))": False, - "((Event, Clear-throat))": False, - } - self.base_test("{ {Event}, {Action} }", test_strings) - - def test_exact_group_split_or(self): - test_strings = { - "(A, D)": False, - "((A), (D))": True, - "((A), ((D)))": True, - "((A, D))": True, - } - self.base_test("{ {a} || {d} }", test_strings) - - def test_exact_group_split_or_negation(self): - test_strings = { - # "(Event, Clear-throat)": False, - "((Event), (Clear-throat))": True, - "((Event))": False, - "((Event), ((Clear-throat)))": True, - "((Event, Clear-throat))": False, - } - # Need to think this through more. How do you exact match a negative tag? - self.base_test("{ {~Event} }", test_strings) - - def test_exact_group_split_or_negation_dual(self): - test_strings = { - "(A, B)": False, - "((A), (B))": False, - "((A))": False, - "((A), ((B)))": True, # TODO: must all result groups have tags? True because of ((B)) group with no tags. - "((A, B))": False, - "((A), (C))": True, - "((A), (B, C))": False, - "((A), ((B), C))": True, - } - self.base_test("{ {~a && ~b} }", test_strings) - - def test_exact_group_split_or_negation_dual2(self): - test_strings = { - "(A, B)": False, - "((A), (B))": False, - "((A))": False, - "((A), ((B)))": True, # TODO: must all result groups have tags? True because of ((B)) group with no tags. - "((A, B))": False, - "((A), (C))": True, - "((A), (B, C))": False, - "((A), ((B), C))": True, - } - self.base_test("{ {~(a || b)} }", test_strings) - - def test_exact_group_split_or_negation_complex(self): - test_strings = { - "(A, B), (D)": False, - "((A), (B)), (D)": False, - "((A)), (D)": False, - "((A), ((B))), (D)": True, - "((A), ((B))), (H)": True, - "((A, B)), (D)": False, - "((A), (C)), (D)": True, - "((A), (B, C)), (D)": False, - "((A), (B, C)), (H)": False, - } - self.base_test("{ {~(a || b)} } && {D || ~F}", test_strings) - - # TODO: Should this work, and what should it mean? - # Right now this is always true, since there is at least one group without ", (a)" in every string. - def test_exact_group_negation(self): - test_strings = { - "(A, D)": True, - "((A), (D))": True, - "((A))": True, - "((A), ((D)))": True, - "((A, D))": True, - } - self.base_test("{ ~{a} }", test_strings) - - def test_exact_group_negation2(self): - test_strings = { - "(A, D, B)": True, - "((A), (D), B)": False, - "((A))": False, - "((A), ((D, B)))": True, - "((A, D))": False, - "(B, (D))": True, - "(B)": True, - "((A), B)": False - } - self.base_test("{ ~{a}, b}", test_strings) - - def test_exact_group_negation3(self): - test_strings = { - "(A, D, B)": False, - "((A), (D), B)": True, - "((A))": False, - "((A), ((D, B)))": True, - "((A, D))": False, - "(B, (D))": True, - "(B)": True, - "((A), B)": True - } - self.base_test("{ ~a && b}", test_strings) - - def test_exact_group_negation4(self): - test_strings = { - "(A, D, B)": False, - "((A), (D), B)": False, - "((A))": False, - "((A), ((D, B)))": False, - "((A, D))": False, - "(B)": True, - "(B, (D))": True, - "((A), B)": False - } - self.base_test("{ @c && @a && b: ???}", test_strings) - - def test_exact_group_negation5(self): - test_string = "{ ~a && b:}" - with self.assertRaises(ValueError) as context: - QueryHandler(test_string) - self.assertTrue(context.exception.args[0]) - - def test_mixed_group_complex_split(self): - test_strings = { - "A, B, C, D": False, - "(A, B), (C, D)": False, - "(A, B, C, D)": False, - "(A, B, (C, D))": False, - "(A, B, ((C, D)))": False, - "(E, F, (A, B, (C, D)))": False, - "((A, B), (C, D))": True, - "((A, B, C, D))": False, - } - self.base_test("{ [a, b], [c, d] }", test_strings) - - def test_exact_group_complex2(self): - test_strings = { - "A, B, C": False, - "(A, B, C)": False, - "(A, B, (C)), (A, B)": True, - "(A, B), (A, B, (C))": True, - "(A, B), (B, (C))": False, - "(B, (C)), (A, B, (C))": True, - "(A, B, (A, (C)))": False - } - self.base_test("{a, b, {c} }", test_strings) - - def test_containing_group_complex2(self): - test_strings = { - "A, B, C": False, - "(A, B, C)": False, - "(A, B, (C)), (A, B)": True, - "(A, B), (A, B, (C))": True, - "(A, B), (B, (C))": False, - "(B, (C)), (A, B, (C))": True - } - self.base_test("[a, b, [c] ]", test_strings) - - def test_containing_group(self): - test_strings = { - "A, B": False, - "(A, B)": True, - "(A, B), (A, B)": True, - "(A, (B))": True, - "(A, (B, C))": True, - "(A), (B)": False - } - self.base_test("[a, b]", test_strings) - - def test_containing_group_simple_complex(self): - test_strings = { - "A, B, C, D": False, - "(A, C)": False, - "(A, B, (C, D))": True, - "(A, (B))": False, - "(A, (C))": True, - "(A, (B, C))": True, - "(A), (B)": False, - "(C, (A))": False, - "(A, ((C)))": True - } - self.base_test("[a, [c] ]", test_strings) - - def test_containing_group_complex(self): - test_strings = { - "A, B, C, D": False, - "(A, B, C, D)": False, - "(A, B, (C, D))": True, - "(A, (B))": False, - "(A, (B, C))": False, - "(A), (B)": False - } - self.base_test("[a, b, [c, d] ]", test_strings) - - def test_mixed_groups(self): - test_strings = { - "(A, B), (C, D, (E, F))": True - } - self.base_test("{a}, { {e, f} }", test_strings) - - test_strings = { - "(A, B), (C, D, (E, F))": False - } - # This example works because it finds the group containing (c, d, (e, f)), rather than the ef group - self.base_test("{a}, [e, {f} ]", test_strings) - - def test_and(self): - test_strings = { - "A": False, - "B": False, - "C": False, - "A, B": True, - "A, C": False, - "B, C": False - } - self.base_test("a && b", test_strings) - - def test_or(self): - test_strings = { - "A": True, - "B": True, - "C": False, - "A, B": True, - "A, C": True, - "B, C": True - } - self.base_test("a || b", test_strings) - - def test_and_wildcard(self): - test_strings = { - "A": False, - "B": False, - "C": False, - "A, B": False, - "A, C": False, - "B, C": False, - "A, B, C": True, - "D, A, B": True, - "A, B, (C)": True - } - self.base_test("a && b && ?", test_strings) - - def test_and_wildcard_nothing_else(self): - test_strings = { - "A": False, - "B": False, - "C": False, - "A, B": False, - "A, C": False, - "B, C": False, - "A, B, C": False, - "D, A, B": False, - "A, B, (C)": False, - "(A, B), C": True, - "(A, B, C)": True, - } - self.base_test("{a && b}", test_strings) - - test_strings = { - "A": False, - "B": False, - "C": False, - "A, B": False, - "A, C": False, - "B, C": False, - "A, B, C": False, - "D, A, B": False, - "A, B, (C)": False, - "(A, B), C": True, - "(A, B, C)": False, - } - self.base_test("{a && b:}", test_strings) - - def test_and_logical_wildcard(self): - test_strings = { - "A": False, - "A, B": False, - "A, B, (C)": True, - "A, B, C": True, - } - self.base_test("(A, B) && ?", test_strings) - self.base_test("A, B && ?", test_strings) - - test_strings = { - "A": True, - "A, C": True, - "A, B, C": True, - "B, C": False, - "B, C, D, E": True - } - self.base_test("(a || (b && c) && ?)", test_strings) - - self.base_test("(a || (b && c && ?) && ?)", test_strings) - - def test_double_wildcard(self): - test_strings = { - "A": False, - "A, B, (C)": True, - "A, B, C": True, - "A, (B), (C)": False, - } - self.base_test("A && ? && ??", test_strings) - - def test_or_wildcard(self): - test_strings = { - "A": True, - "B": False, - "C": False, - "A, B": True, - "A, C": True, - "B, C": True, - "A, B, C": True, - "D, A, B": True, - "A, B, (C)": True - } - self.base_test("a || b, ?", test_strings) - - def test_and_wildcard_tags(self): - test_strings = { - "A": False, - "B": False, - "C": False, - "A, B": False, - "A, C": False, - "B, C": False, - "A, B, C": True, - "D, A, B": True, - "A, B, (C)": False - } - self.base_test("a && b, ??", test_strings) - - def test_and_wildcard_groups(self): - test_strings = { - "A": False, - "B": False, - "C": False, - "A, B": False, - "A, C": False, - "B, C": False, - "A, B, C": False, - "D, A, B": False, - "A, B, (C)": True - } - self.base_test("a && b, ???", test_strings) - - def test_complex_wildcard_groups(self): - test_strings = { - "A": False, - "B": False, - "C": False, - "A, B": False, - "A, C": False, - "B, C": False, - "A, B, C": False, - "D, A, B": False, - "A, B, (C)": False, - "(A, B, (C))": False, - "(A, B, (C)), D": True, - "(A, B, (C)), (D)": True, - "((A, B), (C)), E": False, # todo: should discuss this case. Is this correct to be False? - "((A, B), C), E": False, - } - self.base_test("[a && b, ???], ?", test_strings) - - def test_wildcard_new(self): - # todo: does it make sense this behavior varies? I think so - test_strings = { - "((A, B), C)": False, - } - self.base_test("[a && b, ???]", test_strings) - - test_strings = { - "((A, B), C)": False, - } - self.base_test("[a && b && c]", test_strings) - - def test_complex_wildcard_groups2(self): - test_strings = { - "A": False, - "B": False, - "C": False, - "A, B": False, - "A, C": False, - "B, C": False, - "A, B, C": False, - "D, A, B": False, - "A, B, (C)": False, - "(A, B, (C))": False, - "(A, B, (C)), D": False, - "(A, B, (C)), (D), E": True, - } - self.base_test("[a && b, ???], E, ?", test_strings) - - def test_and_or(self): - test_strings = { - "A": False, - "B": False, - "C": True, - "A, B": True, - "A, C": True, - "B, C": True - } - self.base_test("a && b || c", test_strings) - - test_strings = { - "A": False, - "B": False, - "C": True, - "A, B": True, - "A, C": True, - "B, C": True - } - self.base_test("(a && b) || c", test_strings) - - test_strings = { - "A": False, - "B": False, - "C": False, - "A, B": True, - "A, C": True, - "B, C": False - } - self.base_test("a && (b || c)", test_strings) - - test_strings = { - "A": True, - "B": False, - "C": False, - "A, B": True, - "A, C": True, - "B, C": True - } - self.base_test("a || b && c", test_strings) - - test_strings = { - "A": True, - "B": False, - "C": False, - "A, B": True, - "A, C": True, - "B, C": True - } - self.base_test("a || (b && c)", test_strings) - - test_strings = { - "A": False, - "B": False, - "C": False, - "A, B": False, - "A, C": True, - "B, C": True - } - self.base_test("(a || b) && c", test_strings) - - def test_logical_negation(self): - expression = QueryHandler("~a") - hed_string = HedString("A", self.hed_schema) - self.assertEqual(bool(expression.search(hed_string)), False) - hed_string = HedString("B", self.hed_schema) - self.assertEqual(bool(expression.search(hed_string)), True) - - expression = QueryHandler("~a && b") - hed_string = HedString("A", self.hed_schema) - self.assertEqual(bool(expression.search(hed_string)), False) - hed_string = HedString("B", self.hed_schema) - self.assertEqual(bool(expression.search(hed_string)), True) - hed_string = HedString("A, B", self.hed_schema) - self.assertEqual(bool(expression.search(hed_string)), False) - - expression = QueryHandler("~( (a || b) && c)") - hed_string = HedString("A", self.hed_schema) - self.assertEqual(bool(expression.search(hed_string)), True) - hed_string = HedString("B", self.hed_schema) - self.assertEqual(bool(expression.search(hed_string)), True) - hed_string = HedString("C", self.hed_schema) - self.assertEqual(bool(expression.search(hed_string)), True) - hed_string = HedString("A, B", self.hed_schema) - self.assertEqual(bool(expression.search(hed_string)), True) - hed_string = HedString("A, C", self.hed_schema) - self.assertEqual(bool(expression.search(hed_string)), False) - - def test_not_in_line(self): - test_strings = { - "A": True, - "B": False, - "C": True, - "A, B": False, - "A, C": True, - "B, C": False, - "A, B, C": False, - "D, A, B": False, - "A, B, (C)": False, - "(A, B, (C))": False, - "(A, B, (C)), D": False, - "(A, B, (C)), (D), E": False, - } - self.base_test("@B", test_strings) - - def test_not_in_line2(self): - test_strings = { - "A": False, - "B": False, - "C": True, - "A, B": False, - "A, C": True, - "B, C": False, - "A, B, C": False, - "D, A, B": False, - "A, B, (C)": False, - "(A, B, (C))": False, - "(A, B, (C)), D": False, - "(A, B, (C)), (D), E": False, - } - self.base_test("@B && C", test_strings) - - def test_not_in_line3(self): - test_strings = { - "A": True, - "B": True, - "C": False, - "A, B": True, - "A, C": False, - "B, C": True, - "A, B, C": True, - "D, A, B": True, - "A, B, (C)": True, - "(A, B, (C))": True, - "(A, B, (C)), D": True, - "(A, B, (C)), (D), E": True, - } - self.base_test("@C || B", test_strings) - - def test_optional_exact_group(self): - test_strings = { - "(A, C)": True, - } - self.base_test("{a && (b || c)}", test_strings) - - test_strings = { - "(A, B, C, D)": True, - } - self.base_test("{a && b: c && d}", test_strings) - - test_strings = { - "(A, B, C)": True, - "(A, B, C, D)": False, - } - self.base_test("{a && b: c || d}", test_strings) - - test_strings = { - "(A, C)": True, - "(A, D)": True, - "(A, B, C)": False, - "(A, B, C, D)": False, - } - self.base_test("{a || b: c || d}", test_strings) - - test_strings = { - "(Onset, (Def-expand/taco))": True, - "(Onset, Def-expand/taco)": False, - "(Onset, Def/taco, (Def-expand/taco))": True, # this one validates - "(Onset, (Def/taco))": False, - "(Onset, (Def-expand/taco, (Label/DefContents)))": True, - "(Onset, (Def-expand/taco), (Label/OnsetContents))": True, - "(Onset, (Def-expand/taco), (Label/OnsetContents, Description/MoreContents))": True, - "Onset, (Def-expand/taco), (Label/OnsetContents)": False, - "(Onset, (Def-expand/taco), Label/OnsetContents)": False, - } - self.base_test("{(Onset || Offset), (Def || {Def-expand}): ???}", test_strings) - test_strings = { - "(A, B)": True, - "(A, B, C)": True - } - self.base_test("{a || b}", test_strings) \ No newline at end of file +import unittest +from hed.models.hed_string import HedString +from hed.models.query_handler import QueryHandler +import os +from hed import schema +from hed import HedTag + + +# Override the tag terms function for testing purposes when we don't have a schema +def new_init(self, *args, **kwargs): + old_tag_init(self, *args, **kwargs) + if not self.tag_terms: + self.tag_terms = (str(self).lower(),) + + +old_tag_init = HedTag.__init__ +HedTag.__init__ = new_init + + +class TestParser(unittest.TestCase): + @classmethod + def setUpClass(cls): + base_data_dir = os.path.realpath(os.path.join(os.path.dirname(__file__), '../data/')) + cls.base_data_dir = base_data_dir + hed_xml_file = os.path.join(base_data_dir, "schema_tests/HED8.0.0t.xml") + cls.hed_schema = schema.load_schema(hed_xml_file) + + def base_test(self, parse_expr, search_strings): + expression = QueryHandler(parse_expr) + + # print(f"Search Pattern: {expression._org_string} - {str(expression.tree)}") + for string, expected_result in search_strings.items(): + hed_string = HedString(string, self.hed_schema) + result2 = expression.search(hed_string) + # print(f"\tSearching string '{str(hed_string)}'") + # if result2: + # print(f"\t\tFound as group(s) {str([str(r) for r in result2])}") + self.assertEqual(bool(result2), expected_result) + + def test_broken_search_strings(self): + test_search_strings = [ + "A &&", + "(A && B", + "&& B", + "A, ", + ", A", + "A)" + ] + for string in test_search_strings: + with self.assertRaises(ValueError) as context: + QueryHandler(string) + self.assertTrue(context.exception.args[0]) + + def test_finding_tags(self): + test_strings = { + "Item, (Clear-throat)": True, + "(Item, (Clear-throat))": True, + "Item, Clear-throat": True, + "Agent, Clear-throat": True, + "Agent, Event": False, + } + self.base_test("(Item || Agent) && Action", test_strings) + + def test_finding_tags_wildcards(self): + test_strings = { + "Def/Def1": True, + "Def/Def2": True, + "Def/Def1/Value": True, + } + self.base_test("Def", test_strings) + test_strings = { + "Def/Def1": True, + "Def/Def2": True, + "Def/Def1/Value": True, + } + self.base_test("Def/Def*", test_strings) + test_strings = { + "Def/Def1": True, + "Def/Def2": False, + "Def/Def1/Value": False, + } + self.base_test("Def/Def1", test_strings) + test_strings = { + "Def/Def1": True, + "Def/Def2": False, + "Def/Def1/Value": True, + } + self.base_test("Def/Def1*", test_strings) + test_strings = { + "Def/Def1": False, + "Def/Def2": False, + "Def/Def1/Value": True, + } + self.base_test("Def/Def1/*", test_strings) + + def test_exact_term(self): + test_strings = { + "Event": True, + "Sensory-event": False, + "Event/ext": False + } + self.base_test('"Event"', test_strings) + + def test_actual_wildcard(self): + test_strings = { + "A, B, C": True, + "A, B": True, + "A, B, (C)": True, + } + self.base_test("A, B", test_strings) + + def test_finding_tags2(self): + test_strings = { + "Item, (Clear-throat)": True, + "(Item, (Clear-throat))": True, + "Item, Clear-throat": False, + "Agent, Clear-throat": False, + "Agent, Event": False, + "Agent, (Event)": True, + "(Item), (Event)": True + } + self.base_test("(Item || Agent) && {Action || Event}", test_strings) + + def test_exact_group(self): + test_strings = { + "A, B": False, + "(A, B)": True, + "(A, (B))": False, + "(A, (B, C))": False, + "(A), (A, B)": True, + "(A, B), (A)": True, + "(A, B, (C, D))": True, + "(A, B, C)": True + } + self.base_test("{a, b}", test_strings) + + def test_exact_group_simple_complex(self): + test_strings = { + "(A, C)": False, + "(A, (C))": True, + "((A, C))": False, + "A, B, C, D": False, + "(A, B, C, D)": False, + "(A, B, (C, D))": True, + "(A, B, ((C, D)))": False, + "(E, F, (A, B, (C, D)))": True, + "(A, B, (E, F, (C, D)))": False, # TODO: Should this be True? [[c]] isn't directly inside an a group. + } + self.base_test("{a, {c} }", test_strings) + + def test_exact_group_complex(self): + test_strings = { + "A, B, C, D": False, + "(A, B, C, D)": False, + "(A, B, (C, D))": True, + "(A, B, ((C, D)))": False, + "(E, F, (A, B, (C, D)))": True, + } + self.base_test("{a, b, {c, d} }", test_strings) + + def test_duplicate_search(self): + test_strings = { + "(Event)": False, + "(Event, Agent-action)": True, + + } + self.base_test("Event && Event", test_strings) + + def test_duplicate_search_or(self): + test_strings = { + "(Event)": True, + "(Event, Agent-action)": True, + + } + self.base_test("Event || Event", test_strings) + + def test_exact_group_complex_split(self): + test_strings = { + "A, B, C, D": False, + "(A, B, C, D)": False, + "((A, B, C, D))": False, + "(A, B, (C, D))": False, + "(A, B, ((C, D)))": False, + "(E, F, (A, B, (C, D)))": False, + "((A, B), (C, D))": True, + } + self.base_test("{ {a, b}, {c, d} }", test_strings) + + def test_mixed_group_split(self): + test_strings = { + "(Event, Clear-throat)": False, + "((Event), (Clear-throat))": True, + "((Event), ((Clear-throat)))": True, + "((Event, Clear-throat))": False, + } + self.base_test("{ [Event], [Action] }", test_strings) + + def test_exact_group_split(self): + test_strings = { + "(Event, Clear-throat)": False, + "((Event), (Clear-throat))": True, + "((Event), ((Clear-throat)))": False, + "((Event, Clear-throat))": False, + } + self.base_test("{ {Event}, {Action} }", test_strings) + + def test_exact_group_split_or(self): + test_strings = { + "(A, D)": False, + "((A), (D))": True, + "((A), ((D)))": True, + "((A, D))": True, + } + self.base_test("{ {a} || {d} }", test_strings) + + def test_exact_group_split_or_negation(self): + test_strings = { + # "(Event, Clear-throat)": False, + "((Event), (Clear-throat))": True, + "((Event))": False, + "((Event), ((Clear-throat)))": True, + "((Event, Clear-throat))": False, + } + # Need to think this through more. How do you exact match a negative tag? + self.base_test("{ {~Event} }", test_strings) + + def test_exact_group_split_or_negation_dual(self): + test_strings = { + "(A, B)": False, + "((A), (B))": False, + "((A))": False, + "((A), ((B)))": True, # TODO: must all result groups have tags? True because of ((B)) group with no tags. + "((A, B))": False, + "((A), (C))": True, + "((A), (B, C))": False, + "((A), ((B), C))": True, + } + self.base_test("{ {~a && ~b} }", test_strings) + + def test_exact_group_split_or_negation_dual2(self): + test_strings = { + "(A, B)": False, + "((A), (B))": False, + "((A))": False, + "((A), ((B)))": True, # TODO: must all result groups have tags? True because of ((B)) group with no tags. + "((A, B))": False, + "((A), (C))": True, + "((A), (B, C))": False, + "((A), ((B), C))": True, + } + self.base_test("{ {~(a || b)} }", test_strings) + + def test_exact_group_split_or_negation_complex(self): + test_strings = { + "(A, B), (D)": False, + "((A), (B)), (D)": False, + "((A)), (D)": False, + "((A), ((B))), (D)": True, + "((A), ((B))), (H)": True, + "((A, B)), (D)": False, + "((A), (C)), (D)": True, + "((A), (B, C)), (D)": False, + "((A), (B, C)), (H)": False, + } + self.base_test("{ {~(a || b)} } && {D || ~F}", test_strings) + + # TODO: Should this work, and what should it mean? + # Right now this is always true, since there is at least one group without ", (a)" in every string. + def test_exact_group_negation(self): + test_strings = { + "(A, D)": True, + "((A), (D))": True, + "((A))": True, + "((A), ((D)))": True, + "((A, D))": True, + } + self.base_test("{ ~{a} }", test_strings) + + def test_exact_group_negation2(self): + test_strings = { + "(A, D, B)": True, + "((A), (D), B)": False, + "((A))": False, + "((A), ((D, B)))": True, + "((A, D))": False, + "(B, (D))": True, + "(B)": True, + "((A), B)": False + } + self.base_test("{ ~{a}, b}", test_strings) + + def test_exact_group_negation3(self): + test_strings = { + "(A, D, B)": False, + "((A), (D), B)": True, + "((A))": False, + "((A), ((D, B)))": True, + "((A, D))": False, + "(B, (D))": True, + "(B)": True, + "((A), B)": True + } + self.base_test("{ ~a && b}", test_strings) + + def test_exact_group_negation4(self): + test_strings = { + "(A, D, B)": False, + "((A), (D), B)": False, + "((A))": False, + "((A), ((D, B)))": False, + "((A, D))": False, + "(B)": True, + "(B, (D))": True, + "((A), B)": False + } + self.base_test("{ @c && @a && b: ???}", test_strings) + + def test_exact_group_negation5(self): + test_string = "{ ~a && b:}" + with self.assertRaises(ValueError) as context: + QueryHandler(test_string) + self.assertTrue(context.exception.args[0]) + + def test_mixed_group_complex_split(self): + test_strings = { + "A, B, C, D": False, + "(A, B), (C, D)": False, + "(A, B, C, D)": False, + "(A, B, (C, D))": False, + "(A, B, ((C, D)))": False, + "(E, F, (A, B, (C, D)))": False, + "((A, B), (C, D))": True, + "((A, B, C, D))": False, + } + self.base_test("{ [a, b], [c, d] }", test_strings) + + def test_exact_group_complex2(self): + test_strings = { + "A, B, C": False, + "(A, B, C)": False, + "(A, B, (C)), (A, B)": True, + "(A, B), (A, B, (C))": True, + "(A, B), (B, (C))": False, + "(B, (C)), (A, B, (C))": True, + "(A, B, (A, (C)))": False + } + self.base_test("{a, b, {c} }", test_strings) + + def test_containing_group_complex2(self): + test_strings = { + "A, B, C": False, + "(A, B, C)": False, + "(A, B, (C)), (A, B)": True, + "(A, B), (A, B, (C))": True, + "(A, B), (B, (C))": False, + "(B, (C)), (A, B, (C))": True + } + self.base_test("[a, b, [c] ]", test_strings) + + def test_containing_group(self): + test_strings = { + "A, B": False, + "(A, B)": True, + "(A, B), (A, B)": True, + "(A, (B))": True, + "(A, (B, C))": True, + "(A), (B)": False + } + self.base_test("[a, b]", test_strings) + + def test_containing_group_simple_complex(self): + test_strings = { + "A, B, C, D": False, + "(A, C)": False, + "(A, B, (C, D))": True, + "(A, (B))": False, + "(A, (C))": True, + "(A, (B, C))": True, + "(A), (B)": False, + "(C, (A))": False, + "(A, ((C)))": True + } + self.base_test("[a, [c] ]", test_strings) + + def test_containing_group_complex(self): + test_strings = { + "A, B, C, D": False, + "(A, B, C, D)": False, + "(A, B, (C, D))": True, + "(A, (B))": False, + "(A, (B, C))": False, + "(A), (B)": False + } + self.base_test("[a, b, [c, d] ]", test_strings) + + def test_mixed_groups(self): + test_strings = { + "(A, B), (C, D, (E, F))": True + } + self.base_test("{a}, { {e, f} }", test_strings) + + test_strings = { + "(A, B), (C, D, (E, F))": False + } + # This example works because it finds the group containing (c, d, (e, f)), rather than the ef group + self.base_test("{a}, [e, {f} ]", test_strings) + + def test_and(self): + test_strings = { + "A": False, + "B": False, + "C": False, + "A, B": True, + "A, C": False, + "B, C": False + } + self.base_test("a && b", test_strings) + + def test_or(self): + test_strings = { + "A": True, + "B": True, + "C": False, + "A, B": True, + "A, C": True, + "B, C": True + } + self.base_test("a || b", test_strings) + + def test_and_wildcard(self): + test_strings = { + "A": False, + "B": False, + "C": False, + "A, B": False, + "A, C": False, + "B, C": False, + "A, B, C": True, + "D, A, B": True, + "A, B, (C)": True + } + self.base_test("a && b && ?", test_strings) + + def test_and_wildcard_nothing_else(self): + test_strings = { + "A": False, + "B": False, + "C": False, + "A, B": False, + "A, C": False, + "B, C": False, + "A, B, C": False, + "D, A, B": False, + "A, B, (C)": False, + "(A, B), C": True, + "(A, B, C)": True, + } + self.base_test("{a && b}", test_strings) + + test_strings = { + "A": False, + "B": False, + "C": False, + "A, B": False, + "A, C": False, + "B, C": False, + "A, B, C": False, + "D, A, B": False, + "A, B, (C)": False, + "(A, B), C": True, + "(A, B, C)": False, + } + self.base_test("{a && b:}", test_strings) + + def test_and_logical_wildcard(self): + test_strings = { + "A": False, + "A, B": False, + "A, B, (C)": True, + "A, B, C": True, + } + self.base_test("(A, B) && ?", test_strings) + self.base_test("A, B && ?", test_strings) + + test_strings = { + "A": True, + "A, C": True, + "A, B, C": True, + "B, C": False, + "B, C, D, E": True + } + self.base_test("(a || (b && c) && ?)", test_strings) + + self.base_test("(a || (b && c && ?) && ?)", test_strings) + + def test_double_wildcard(self): + test_strings = { + "A": False, + "A, B, (C)": True, + "A, B, C": True, + "A, (B), (C)": False, + } + self.base_test("A && ? && ??", test_strings) + + def test_or_wildcard(self): + test_strings = { + "A": True, + "B": False, + "C": False, + "A, B": True, + "A, C": True, + "B, C": True, + "A, B, C": True, + "D, A, B": True, + "A, B, (C)": True + } + self.base_test("a || b, ?", test_strings) + + def test_and_wildcard_tags(self): + test_strings = { + "A": False, + "B": False, + "C": False, + "A, B": False, + "A, C": False, + "B, C": False, + "A, B, C": True, + "D, A, B": True, + "A, B, (C)": False + } + self.base_test("a && b, ??", test_strings) + + def test_and_wildcard_groups(self): + test_strings = { + "A": False, + "B": False, + "C": False, + "A, B": False, + "A, C": False, + "B, C": False, + "A, B, C": False, + "D, A, B": False, + "A, B, (C)": True + } + self.base_test("a && b, ???", test_strings) + + def test_complex_wildcard_groups(self): + test_strings = { + "A": False, + "B": False, + "C": False, + "A, B": False, + "A, C": False, + "B, C": False, + "A, B, C": False, + "D, A, B": False, + "A, B, (C)": False, + "(A, B, (C))": False, + "(A, B, (C)), D": True, + "(A, B, (C)), (D)": True, + "((A, B), (C)), E": False, # todo: should discuss this case. Is this correct to be False? + "((A, B), C), E": False, + } + self.base_test("[a && b, ???], ?", test_strings) + + def test_wildcard_new(self): + # todo: does it make sense this behavior varies? I think so + test_strings = { + "((A, B), C)": False, + } + self.base_test("[a && b, ???]", test_strings) + + test_strings = { + "((A, B), C)": False, + } + self.base_test("[a && b && c]", test_strings) + + def test_complex_wildcard_groups2(self): + test_strings = { + "A": False, + "B": False, + "C": False, + "A, B": False, + "A, C": False, + "B, C": False, + "A, B, C": False, + "D, A, B": False, + "A, B, (C)": False, + "(A, B, (C))": False, + "(A, B, (C)), D": False, + "(A, B, (C)), (D), E": True, + } + self.base_test("[a && b, ???], E, ?", test_strings) + + def test_and_or(self): + test_strings = { + "A": False, + "B": False, + "C": True, + "A, B": True, + "A, C": True, + "B, C": True + } + self.base_test("a && b || c", test_strings) + + test_strings = { + "A": False, + "B": False, + "C": True, + "A, B": True, + "A, C": True, + "B, C": True + } + self.base_test("(a && b) || c", test_strings) + + test_strings = { + "A": False, + "B": False, + "C": False, + "A, B": True, + "A, C": True, + "B, C": False + } + self.base_test("a && (b || c)", test_strings) + + test_strings = { + "A": True, + "B": False, + "C": False, + "A, B": True, + "A, C": True, + "B, C": True + } + self.base_test("a || b && c", test_strings) + + test_strings = { + "A": True, + "B": False, + "C": False, + "A, B": True, + "A, C": True, + "B, C": True + } + self.base_test("a || (b && c)", test_strings) + + test_strings = { + "A": False, + "B": False, + "C": False, + "A, B": False, + "A, C": True, + "B, C": True + } + self.base_test("(a || b) && c", test_strings) + + def test_logical_negation(self): + expression = QueryHandler("~a") + hed_string = HedString("A", self.hed_schema) + self.assertEqual(bool(expression.search(hed_string)), False) + hed_string = HedString("B", self.hed_schema) + self.assertEqual(bool(expression.search(hed_string)), True) + + expression = QueryHandler("~a && b") + hed_string = HedString("A", self.hed_schema) + self.assertEqual(bool(expression.search(hed_string)), False) + hed_string = HedString("B", self.hed_schema) + self.assertEqual(bool(expression.search(hed_string)), True) + hed_string = HedString("A, B", self.hed_schema) + self.assertEqual(bool(expression.search(hed_string)), False) + + expression = QueryHandler("~( (a || b) && c)") + hed_string = HedString("A", self.hed_schema) + self.assertEqual(bool(expression.search(hed_string)), True) + hed_string = HedString("B", self.hed_schema) + self.assertEqual(bool(expression.search(hed_string)), True) + hed_string = HedString("C", self.hed_schema) + self.assertEqual(bool(expression.search(hed_string)), True) + hed_string = HedString("A, B", self.hed_schema) + self.assertEqual(bool(expression.search(hed_string)), True) + hed_string = HedString("A, C", self.hed_schema) + self.assertEqual(bool(expression.search(hed_string)), False) + + def test_not_in_line(self): + test_strings = { + "A": True, + "B": False, + "C": True, + "A, B": False, + "A, C": True, + "B, C": False, + "A, B, C": False, + "D, A, B": False, + "A, B, (C)": False, + "(A, B, (C))": False, + "(A, B, (C)), D": False, + "(A, B, (C)), (D), E": False, + } + self.base_test("@B", test_strings) + + def test_not_in_line2(self): + test_strings = { + "A": False, + "B": False, + "C": True, + "A, B": False, + "A, C": True, + "B, C": False, + "A, B, C": False, + "D, A, B": False, + "A, B, (C)": False, + "(A, B, (C))": False, + "(A, B, (C)), D": False, + "(A, B, (C)), (D), E": False, + } + self.base_test("@B && C", test_strings) + + def test_not_in_line3(self): + test_strings = { + "A": True, + "B": True, + "C": False, + "A, B": True, + "A, C": False, + "B, C": True, + "A, B, C": True, + "D, A, B": True, + "A, B, (C)": True, + "(A, B, (C))": True, + "(A, B, (C)), D": True, + "(A, B, (C)), (D), E": True, + } + self.base_test("@C || B", test_strings) + + def test_optional_exact_group(self): + test_strings = { + "(A, C)": True, + } + self.base_test("{a && (b || c)}", test_strings) + + test_strings = { + "(A, B, C, D)": True, + } + self.base_test("{a && b: c && d}", test_strings) + + test_strings = { + "(A, B, C)": True, + "(A, B, C, D)": False, + } + self.base_test("{a && b: c || d}", test_strings) + + test_strings = { + "(A, C)": True, + "(A, D)": True, + "(A, B, C)": False, + "(A, B, C, D)": False, + } + self.base_test("{a || b: c || d}", test_strings) + + test_strings = { + "(Onset, (Def-expand/taco))": True, + "(Onset, Def-expand/taco)": False, + "(Onset, Def/taco, (Def-expand/taco))": True, # this one validates + "(Onset, (Def/taco))": False, + "(Onset, (Def-expand/taco, (Label/DefContents)))": True, + "(Onset, (Def-expand/taco), (Label/OnsetContents))": True, + "(Onset, (Def-expand/taco), (Label/OnsetContents, Description/MoreContents))": True, + "Onset, (Def-expand/taco), (Label/OnsetContents)": False, + "(Onset, (Def-expand/taco), Label/OnsetContents)": False, + } + self.base_test("{(Onset || Offset), (Def || {Def-expand}): ???}", test_strings) + test_strings = { + "(A, B)": True, + "(A, B, C)": True + } + self.base_test("{a || b}", test_strings) diff --git a/tests/models/test_sidecar.py b/tests/models/test_sidecar.py index c8e8e5da8..a2dc928ba 100644 --- a/tests/models/test_sidecar.py +++ b/tests/models/test_sidecar.py @@ -1,172 +1,173 @@ -import unittest -import os -import io -import shutil - -from hed.errors import HedFileError, ValidationErrors -from hed.models import ColumnMetadata, HedString, Sidecar -from hed import schema -from hed.models import DefinitionDict -from hed.errors import ErrorHandler - - -class Test(unittest.TestCase): - @classmethod - def setUpClass(cls): - base_data_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../data/') - cls.base_data_dir = base_data_dir - hed_xml_file = os.path.join(base_data_dir, "schema_tests/HED8.0.0t.xml") - cls.hed_schema = schema.load_schema(hed_xml_file) - json_filename = os.path.join(base_data_dir, "sidecar_tests/both_types_events.json") - cls.json_filename = json_filename - json_def_filename = os.path.join(base_data_dir, "sidecar_tests/both_types_events_with_defs.json") - cls.json_def_filename = json_def_filename - json_without_definitions_filename = \ - os.path.join(base_data_dir, "sidecar_tests/both_types_events_without_definitions.json") - json_errors_filename = os.path.join(base_data_dir, "sidecar_tests/json_errors.json") - json_errors_filename_minor = os.path.join(base_data_dir, "sidecar_tests/json_errors_minor.json") - cls.default_sidecar = Sidecar(json_filename) - cls.json_def_sidecar = Sidecar(json_def_filename) - cls.errors_sidecar = Sidecar(json_errors_filename) - cls.errors_sidecar_minor = Sidecar(json_errors_filename_minor) - cls.json_without_definitions_sidecar = Sidecar(json_without_definitions_filename) - - base_output_folder = os.path.realpath(os.path.join(os.path.dirname(__file__), "../data/tests_output/")) - cls.base_output_folder = base_output_folder - os.makedirs(base_output_folder, exist_ok=True) - - @classmethod - def tearDownClass(cls): - shutil.rmtree(cls.base_output_folder) - - def test_file_not_found(self): - with self.assertRaises(HedFileError): - Sidecar('nonexistent_file.json') - - def test_invalid_input_type_int(self): - with self.assertRaises(HedFileError): - Sidecar(123) - - def test_invalid_input_type_dict(self): - with self.assertRaises(HedFileError): - Sidecar({'key': 'value'}) - - def test_invalid_filenames(self): - # Handle missing or invalid files. - invalid_json = "invalidxmlfile.json" - self.assertRaises(HedFileError, Sidecar, invalid_json) - - json_dict = None - try: - json_dict = Sidecar(None) - except HedFileError: - pass - self.assertTrue(len(json_dict.loaded_dict) == 0) - - json_dict = None - try: - json_dict = Sidecar("") - except HedFileError: - pass - self.assertTrue(len(json_dict.loaded_dict) == 0) - - def test_name(self): - invalid_json = "invalidxmlfile.json" - with self.assertRaises(HedFileError) as context: - Sidecar(invalid_json) - self.assertEqual(context.exception.args[0], 'fileNotFound') - - def test_add_json_string(self): - with open(self.json_filename) as file: - file_as_string = io.StringIO(file.read()) - json_file = Sidecar(file_as_string) - self.assertTrue(json_file) - - def test__iter__(self): - columns_target = 3 - columns_count = 0 - for column_data in self.default_sidecar: - self.assertIsInstance(column_data, ColumnMetadata) - columns_count += 1 - - self.assertEqual(columns_target, columns_count) - - def test_validate_column_group(self): - validation_issues = self.errors_sidecar.validate(self.hed_schema) - self.assertEqual(len(validation_issues), 4) - - validation_issues2 = self.errors_sidecar_minor.validate(self.hed_schema) - self.assertEqual(len(validation_issues2), 1) - - validation_issues = self.json_without_definitions_sidecar.validate(self.hed_schema) - self.assertEqual(len(validation_issues), 7) - - hed_string = HedString("(Definition/JsonFileDef/#, (Item/JsonDef1/#,Item/JsonDef1))", self.hed_schema) - extra_def_dict = DefinitionDict() - extra_def_dict.check_for_definitions(hed_string) - - validation_issues2 = self.json_without_definitions_sidecar.validate(self.hed_schema, extra_def_dicts=extra_def_dict) - # this removes one undef matched error - self.assertEqual(len(validation_issues2), 7) - - def test_duplicate_def(self): - sidecar = self.json_def_sidecar - - duplicate_dict = sidecar.extract_definitions(hed_schema=self.hed_schema) - issues = sidecar.validate(self.hed_schema, extra_def_dicts=duplicate_dict, error_handler=ErrorHandler(False)) - self.assertEqual(len(issues), 5) - self.assertTrue(issues[0]['code'], ValidationErrors.DEFINITION_INVALID) - - def test_save_load(self): - sidecar = Sidecar(self.json_def_filename) - save_filename = os.path.join(self.base_output_folder, "test_sidecar_save.json") - sidecar.save_as_json(save_filename) - - reloaded_sidecar = Sidecar(save_filename) - - for data1, data2 in zip(sidecar, reloaded_sidecar): - self.assertEqual(data1.source_dict, data2.source_dict) - - def test_save_load2(self): - sidecar = Sidecar(self.json_def_filename) - json_string = sidecar.get_as_json_string() - - reloaded_sidecar = Sidecar(io.StringIO(json_string)) - - for data1, data2 in zip(sidecar, reloaded_sidecar): - self.assertEqual(data1.source_dict, data2.source_dict) - - def test_merged_sidecar(self): - base_folder = self.base_data_dir + "sidecar_tests/" - combined_sidecar_json = base_folder + "test_merged_merged.json" - sidecar_json1 = base_folder + "test_merged1.json" - sidecar_json2 = base_folder + "test_merged2.json" - - sidecar = Sidecar([sidecar_json1, sidecar_json2]) - sidecar2 = Sidecar(combined_sidecar_json) - - self.assertEqual(sidecar.loaded_dict, sidecar2.loaded_dict) - - def test_set_hed_strings(self): - from hed.models import df_util - sidecar = Sidecar(os.path.join(self.base_data_dir, "sidecar_tests/short_tag_test.json")) - - for column_data in sidecar: - hed_strings = column_data.get_hed_strings() - df_util.convert_to_form(hed_strings, self.hed_schema, "long_tag") - column_data.set_hed_strings(hed_strings) - sidecar_long = Sidecar(os.path.join(self.base_data_dir, "sidecar_tests/long_tag_test.json")) - self.assertEqual(sidecar.loaded_dict, sidecar_long.loaded_dict) - - sidecar = Sidecar(os.path.join(self.base_data_dir, "sidecar_tests/long_tag_test.json")) - - for column_data in sidecar: - hed_strings = column_data.get_hed_strings() - df_util.convert_to_form(hed_strings, self.hed_schema, "short_tag") - column_data.set_hed_strings(hed_strings) - sidecar_short = Sidecar(os.path.join(self.base_data_dir, "sidecar_tests/short_tag_test.json")) - self.assertEqual(sidecar.loaded_dict, sidecar_short.loaded_dict) - - -if __name__ == '__main__': - unittest.main() +import unittest +import os +import io +import shutil + +from hed.errors import HedFileError, ValidationErrors +from hed.models import ColumnMetadata, HedString, Sidecar +from hed import schema +from hed.models import DefinitionDict +from hed.errors import ErrorHandler + + +class Test(unittest.TestCase): + @classmethod + def setUpClass(cls): + base_data_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../data/') + cls.base_data_dir = base_data_dir + hed_xml_file = os.path.join(base_data_dir, "schema_tests/HED8.0.0t.xml") + cls.hed_schema = schema.load_schema(hed_xml_file) + json_filename = os.path.join(base_data_dir, "sidecar_tests/both_types_events.json") + cls.json_filename = json_filename + json_def_filename = os.path.join(base_data_dir, "sidecar_tests/both_types_events_with_defs.json") + cls.json_def_filename = json_def_filename + json_without_definitions_filename = \ + os.path.join(base_data_dir, "sidecar_tests/both_types_events_without_definitions.json") + json_errors_filename = os.path.join(base_data_dir, "sidecar_tests/json_errors.json") + json_errors_filename_minor = os.path.join(base_data_dir, "sidecar_tests/json_errors_minor.json") + cls.default_sidecar = Sidecar(json_filename) + cls.json_def_sidecar = Sidecar(json_def_filename) + cls.errors_sidecar = Sidecar(json_errors_filename) + cls.errors_sidecar_minor = Sidecar(json_errors_filename_minor) + cls.json_without_definitions_sidecar = Sidecar(json_without_definitions_filename) + + base_output_folder = os.path.realpath(os.path.join(os.path.dirname(__file__), "../data/tests_output/")) + cls.base_output_folder = base_output_folder + os.makedirs(base_output_folder, exist_ok=True) + + @classmethod + def tearDownClass(cls): + shutil.rmtree(cls.base_output_folder) + + def test_file_not_found(self): + with self.assertRaises(HedFileError): + Sidecar('nonexistent_file.json') + + def test_invalid_input_type_int(self): + with self.assertRaises(HedFileError): + Sidecar(123) + + def test_invalid_input_type_dict(self): + with self.assertRaises(HedFileError): + Sidecar({'key': 'value'}) + + def test_invalid_filenames(self): + # Handle missing or invalid files. + invalid_json = "invalidxmlfile.json" + self.assertRaises(HedFileError, Sidecar, invalid_json) + + json_dict = None + try: + json_dict = Sidecar(None) + except HedFileError: + pass + self.assertTrue(len(json_dict.loaded_dict) == 0) + + json_dict = None + try: + json_dict = Sidecar("") + except HedFileError: + pass + self.assertTrue(len(json_dict.loaded_dict) == 0) + + def test_name(self): + invalid_json = "invalidxmlfile.json" + with self.assertRaises(HedFileError) as context: + Sidecar(invalid_json) + self.assertEqual(context.exception.args[0], 'fileNotFound') + + def test_add_json_string(self): + with open(self.json_filename) as file: + file_as_string = io.StringIO(file.read()) + json_file = Sidecar(file_as_string) + self.assertTrue(json_file) + + def test__iter__(self): + columns_target = 3 + columns_count = 0 + for column_data in self.default_sidecar: + self.assertIsInstance(column_data, ColumnMetadata) + columns_count += 1 + + self.assertEqual(columns_target, columns_count) + + def test_validate_column_group(self): + validation_issues = self.errors_sidecar.validate(self.hed_schema) + self.assertEqual(len(validation_issues), 4) + + validation_issues2 = self.errors_sidecar_minor.validate(self.hed_schema) + self.assertEqual(len(validation_issues2), 1) + + validation_issues = self.json_without_definitions_sidecar.validate(self.hed_schema) + self.assertEqual(len(validation_issues), 7) + + hed_string = HedString("(Definition/JsonFileDef/#, (Item/JsonDef1/#,Item/JsonDef1))", self.hed_schema) + extra_def_dict = DefinitionDict() + extra_def_dict.check_for_definitions(hed_string) + + validation_issues2 = self.json_without_definitions_sidecar.validate(self.hed_schema, + extra_def_dicts=extra_def_dict) + # this removes one undef matched error + self.assertEqual(len(validation_issues2), 7) + + def test_duplicate_def(self): + sidecar = self.json_def_sidecar + + duplicate_dict = sidecar.extract_definitions(hed_schema=self.hed_schema) + issues = sidecar.validate(self.hed_schema, extra_def_dicts=duplicate_dict, error_handler=ErrorHandler(False)) + self.assertEqual(len(issues), 5) + self.assertTrue(issues[0]['code'], ValidationErrors.DEFINITION_INVALID) + + def test_save_load(self): + sidecar = Sidecar(self.json_def_filename) + save_filename = os.path.join(self.base_output_folder, "test_sidecar_save.json") + sidecar.save_as_json(save_filename) + + reloaded_sidecar = Sidecar(save_filename) + + for data1, data2 in zip(sidecar, reloaded_sidecar): + self.assertEqual(data1.source_dict, data2.source_dict) + + def test_save_load2(self): + sidecar = Sidecar(self.json_def_filename) + json_string = sidecar.get_as_json_string() + + reloaded_sidecar = Sidecar(io.StringIO(json_string)) + + for data1, data2 in zip(sidecar, reloaded_sidecar): + self.assertEqual(data1.source_dict, data2.source_dict) + + def test_merged_sidecar(self): + base_folder = self.base_data_dir + "sidecar_tests/" + combined_sidecar_json = base_folder + "test_merged_merged.json" + sidecar_json1 = base_folder + "test_merged1.json" + sidecar_json2 = base_folder + "test_merged2.json" + + sidecar = Sidecar([sidecar_json1, sidecar_json2]) + sidecar2 = Sidecar(combined_sidecar_json) + + self.assertEqual(sidecar.loaded_dict, sidecar2.loaded_dict) + + def test_set_hed_strings(self): + from hed.models import df_util + sidecar = Sidecar(os.path.join(self.base_data_dir, "sidecar_tests/short_tag_test.json")) + + for column_data in sidecar: + hed_strings = column_data.get_hed_strings() + df_util.convert_to_form(hed_strings, self.hed_schema, "long_tag") + column_data.set_hed_strings(hed_strings) + sidecar_long = Sidecar(os.path.join(self.base_data_dir, "sidecar_tests/long_tag_test.json")) + self.assertEqual(sidecar.loaded_dict, sidecar_long.loaded_dict) + + sidecar = Sidecar(os.path.join(self.base_data_dir, "sidecar_tests/long_tag_test.json")) + + for column_data in sidecar: + hed_strings = column_data.get_hed_strings() + df_util.convert_to_form(hed_strings, self.hed_schema, "short_tag") + column_data.set_hed_strings(hed_strings) + sidecar_short = Sidecar(os.path.join(self.base_data_dir, "sidecar_tests/short_tag_test.json")) + self.assertEqual(sidecar.loaded_dict, sidecar_short.loaded_dict) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/models/test_spreadsheet_input.py b/tests/models/test_spreadsheet_input.py index eeee6bc8d..620944a39 100644 --- a/tests/models/test_spreadsheet_input.py +++ b/tests/models/test_spreadsheet_input.py @@ -1,230 +1,220 @@ -import unittest -import os -import io - -from hed.errors import HedFileError -from hed.models import TabularInput, SpreadsheetInput, Sidecar -import shutil -from hed import schema -import pandas as pd - - -class Test(unittest.TestCase): - @classmethod - def setUpClass(cls): - base = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../data/') - cls.base_data_dir = base - hed_xml_file = os.path.join(base, "schema_tests/HED8.0.0t.xml") - cls.hed_schema = schema.load_schema(hed_xml_file) - default = os.path.join(os.path.dirname(os.path.realpath(__file__)), - "../data/spreadsheet_validator_tests/ExcelMultipleSheets.xlsx") - cls.default_test_file_name = default - cls.generic_file_input = SpreadsheetInput(default) - base_output = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../data/tests_output/") - cls.base_output_folder = base_output - os.makedirs(base_output, exist_ok=True) - - - @classmethod - def tearDownClass(cls): - shutil.rmtree(cls.base_output_folder) - - def test_all(self): - hed_input = self.default_test_file_name - has_column_names = True - column_prefix_dictionary = {1: 'Label/', 2: 'Description'} - tag_columns = [4] - worksheet_name = 'LKT Events' - - file_input = SpreadsheetInput(hed_input, has_column_names=has_column_names, worksheet_name=worksheet_name, - tag_columns=tag_columns, column_prefix_dictionary=column_prefix_dictionary) - - self.assertTrue(isinstance(file_input.dataframe_a, pd.DataFrame)) - self.assertTrue(isinstance(file_input.series_a, pd.Series)) - self.assertTrue(file_input.dataframe_a.size) - self.assertEqual(len(file_input._mapper.get_column_mapping_issues()), 0) - - def test_all2(self): - # This should work, but raise an issue as Short label and column 1 overlap. - hed_input = self.default_test_file_name - has_column_names = True - column_prefix_dictionary = {1: 'Label/', "Short label": 'Description'} - tag_columns = [4] - worksheet_name = 'LKT Events' - - file_input = SpreadsheetInput(hed_input, has_column_names=has_column_names, worksheet_name=worksheet_name, - tag_columns=tag_columns, column_prefix_dictionary=column_prefix_dictionary) - - self.assertTrue(isinstance(file_input.dataframe_a, pd.DataFrame)) - self.assertTrue(isinstance(file_input.series_a, pd.Series)) - self.assertTrue(file_input.dataframe_a.size) - self.assertEqual(len(file_input._mapper.get_column_mapping_issues()), 1) - - def test_file_as_string(self): - events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/validator_tests/bids_events_no_index.tsv') - - json_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), - "../data/validator_tests/bids_events.json") - sidecar = Sidecar(json_path) - self.assertEqual(len(sidecar.validate(self.hed_schema)), 0) - input_file = TabularInput(events_path, sidecar=sidecar) - - with open(events_path) as file: - events_file_as_string = io.StringIO(file.read()) - input_file_from_string = TabularInput(file=events_file_as_string, sidecar=sidecar) - - self.assertTrue(input_file._dataframe.equals(input_file_from_string._dataframe)) - - def test_bad_file_inputs(self): - self.assertRaises(HedFileError, TabularInput, None) - - def test_loading_binary(self): - with open(self.default_test_file_name, "rb") as f: - self.assertRaises(HedFileError, SpreadsheetInput, f) - - with open(self.default_test_file_name, "rb") as f: - opened_binary_file = SpreadsheetInput(f, file_type=".xlsx") - self.assertIsInstance(opened_binary_file, SpreadsheetInput, "SpreadsheetInput creates a correct object.") - self.assertTrue(True) - - def test_to_excel(self): - test_input_file = self.generic_file_input - test_output_name = self.base_output_folder + "ExcelMultipleSheets_resave.xlsx" - test_input_file.to_excel(test_output_name) - - test_input_file = self.generic_file_input - test_output_name = self.base_output_folder + "ExcelMultipleSheets_resave_formatting.xlsx" - test_input_file.to_excel(test_output_name) - - # Test to a file stream - test_input_file = self.generic_file_input - test_output_name = self.base_output_folder + "ExcelMultipleSheets_fileio.xlsx" - with open(test_output_name, "wb") as f: - test_input_file.to_excel(f) - - def test_to_excel_should_work(self): - spreadsheet = SpreadsheetInput(file=self.default_test_file_name, file_type='.xlsx', - tag_columns=[3], has_column_names=True, - column_prefix_dictionary={1: 'Label/', 2: 'Description/'}, - name='ExcelOneSheet.xlsx') - buffer = io.BytesIO() - spreadsheet.to_excel(buffer) - buffer.seek(0) - v = buffer.getvalue() - self.assertGreater(len(v), 0, "It should have a length greater than 0") - - def test_to_csv(self): - test_input_file = self.generic_file_input - test_output_name = self.base_output_folder + "ExcelMultipleSheets_resave.csv" - test_input_file.to_csv(test_output_name) - - test_input_file = self.generic_file_input - file_as_csv = test_input_file.to_csv(None) - self.assertIsInstance(file_as_csv, str) - - def test_loading_and_reloading(self): - test_input_file = self.generic_file_input - test_output_name = self.base_output_folder + "ExcelMultipleSheets_test_save.xlsx" - - test_input_file.to_excel(test_output_name) - - reloaded_input = SpreadsheetInput(test_output_name) - - self.assertTrue(test_input_file._dataframe.equals(reloaded_input._dataframe)) - - def test_loading_and_reset_mapper(self): - events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/validator_tests/bids_events_no_index.tsv') - json_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), - "../data/validator_tests/bids_events.json") - sidecar = Sidecar(json_path) - self.assertEqual(len(sidecar.validate(self.hed_schema)), 0) - input_file_1 = TabularInput(events_path, sidecar=sidecar) - input_file_2 = TabularInput(events_path, sidecar=sidecar) - - input_file_2.reset_column_mapper() - - self.assertTrue(input_file_1.dataframe.equals(input_file_2.dataframe)) - - def test_no_column_header_and_convert(self): - events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/model_tests/no_column_header.tsv') - hed_input = SpreadsheetInput(events_path, has_column_names=False, tag_columns=[0, 1]) - hed_input.convert_to_long(self.hed_schema) - - events_path_long = os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/model_tests/no_column_header_long.tsv') - hed_input_long = SpreadsheetInput(events_path_long, has_column_names=False, tag_columns=[0, 1]) - self.assertTrue(hed_input._dataframe.equals(hed_input_long._dataframe)) - - def test_convert_short_long_with_definitions(self): - # Verify behavior works as expected even if definitions are present - events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/model_tests/no_column_header_definition.tsv') - hed_input = SpreadsheetInput(events_path, has_column_names=False, tag_columns=[0, 1]) - hed_input.convert_to_long(self.hed_schema) - - events_path_long = os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/model_tests/no_column_header_definition_long.tsv') - hed_input_long = SpreadsheetInput(events_path_long, has_column_names=False, tag_columns=[0, 1]) - self.assertTrue(hed_input._dataframe.equals(hed_input_long._dataframe)) - - def test_definitions_identified(self): - # Todo: this test is no longer relevant - events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/model_tests/no_column_header_definition.tsv') - hed_input = SpreadsheetInput(events_path, has_column_names=False, tag_columns=[0, 1]) - events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/model_tests/no_column_header_definition.tsv') - hed_input = SpreadsheetInput(events_path, has_column_names=False, tag_columns=[0, 1]) - - def test_loading_dataframe_directly(self): - ds_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/model_tests/no_column_header_definition.tsv') - ds = pd.read_csv(ds_path, delimiter="\t", header=None) - hed_input = SpreadsheetInput(ds, has_column_names=False, tag_columns=[0, 1]) - - events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/model_tests/no_column_header_definition.tsv') - hed_input2 = SpreadsheetInput(events_path, has_column_names=False, tag_columns=[0, 1]) - self.assertTrue(hed_input._dataframe.equals(hed_input2._dataframe)) - - def test_ignoring_na_column(self): - events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/model_tests/na_tag_column.tsv') - hed_input = SpreadsheetInput(events_path, has_column_names=False, tag_columns=[0, 1]) - self.assertTrue(hed_input.dataframe_a.loc[1, 1] == 'n/a') - - def test_ignoring_na_value_column(self): - from hed import TabularInput - events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/model_tests/na_value_column.tsv') - sidecar_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/model_tests/na_value_column.json') - hed_input = TabularInput(events_path, sidecar=sidecar_path) - self.assertTrue(hed_input.dataframe_a.loc[1, 'Value'] == 'n/a') - - def test_to_excel_workbook(self): - excel_book = SpreadsheetInput(self.default_test_file_name, worksheet_name="LKT 8HED3", - tag_columns=["HED tags"]) - test_output_name = self.base_output_folder + "ExcelMultipleSheets_resave_assembled.xlsx" - excel_book.convert_to_long(self.hed_schema) - excel_book.to_excel(test_output_name) - reloaded_df = SpreadsheetInput(test_output_name, worksheet_name="LKT 8HED3") - - self.assertTrue(excel_book.dataframe.equals(reloaded_df.dataframe)) - - def test_to_excel_workbook_no_col_names(self): - excel_book = SpreadsheetInput(self.default_test_file_name, worksheet_name="LKT 8HED3", - tag_columns=[4], has_column_names=False) - test_output_name = self.base_output_folder + "ExcelMultipleSheets_resave_assembled_no_col_names.xlsx" - excel_book.convert_to_long(self.hed_schema) - excel_book.to_excel(test_output_name) - reloaded_df = SpreadsheetInput(test_output_name, worksheet_name="LKT 8HED3", tag_columns=[4], - has_column_names=False) - self.assertTrue(excel_book.dataframe.equals(reloaded_df.dataframe)) - - -if __name__ == '__main__': - unittest.main() +import unittest +import os +import io + +from hed.errors import HedFileError +from hed.models import TabularInput, SpreadsheetInput, Sidecar +import shutil +from hed import schema +import pandas as pd + + +class Test(unittest.TestCase): + @classmethod + def setUpClass(cls): + base = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../data/') + cls.base_data_dir = base + hed_xml_file = os.path.join(base, "schema_tests/HED8.0.0t.xml") + cls.hed_schema = schema.load_schema(hed_xml_file) + default = os.path.join(os.path.dirname(os.path.realpath(__file__)), + "../data/spreadsheet_validator_tests/ExcelMultipleSheets.xlsx") + cls.default_test_file_name = default + cls.generic_file_input = SpreadsheetInput(default) + base_output = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../data/tests_output/") + cls.base_output_folder = base_output + os.makedirs(base_output, exist_ok=True) + + @classmethod + def tearDownClass(cls): + shutil.rmtree(cls.base_output_folder) + + def test_all(self): + hed_input = self.default_test_file_name + has_column_names = True + column_prefix_dictionary = {1: 'Label/', 2: 'Description'} + tag_columns = [4] + worksheet_name = 'LKT Events' + + file_input = SpreadsheetInput(hed_input, has_column_names=has_column_names, worksheet_name=worksheet_name, + tag_columns=tag_columns, column_prefix_dictionary=column_prefix_dictionary) + + self.assertTrue(isinstance(file_input.dataframe_a, pd.DataFrame)) + self.assertTrue(isinstance(file_input.series_a, pd.Series)) + self.assertTrue(file_input.dataframe_a.size) + self.assertEqual(len(file_input._mapper.get_column_mapping_issues()), 0) + + def test_all2(self): + # This should work, but raise an issue as Short label and column 1 overlap. + hed_input = self.default_test_file_name + has_column_names = True + column_prefix_dictionary = {1: 'Label/', "Short label": 'Description'} + tag_columns = [4] + worksheet_name = 'LKT Events' + + file_input = SpreadsheetInput(hed_input, has_column_names=has_column_names, worksheet_name=worksheet_name, + tag_columns=tag_columns, column_prefix_dictionary=column_prefix_dictionary) + + self.assertTrue(isinstance(file_input.dataframe_a, pd.DataFrame)) + self.assertTrue(isinstance(file_input.series_a, pd.Series)) + self.assertTrue(file_input.dataframe_a.size) + self.assertEqual(len(file_input._mapper.get_column_mapping_issues()), 1) + + def test_file_as_string(self): + events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../data/validator_tests/bids_events_no_index.tsv') + + json_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), + "../data/validator_tests/bids_events.json") + sidecar = Sidecar(json_path) + self.assertEqual(len(sidecar.validate(self.hed_schema)), 0) + input_file = TabularInput(events_path, sidecar=sidecar) + + with open(events_path) as file: + events_file_as_string = io.StringIO(file.read()) + input_file_from_string = TabularInput(file=events_file_as_string, sidecar=sidecar) + + self.assertTrue(input_file._dataframe.equals(input_file_from_string._dataframe)) + + def test_bad_file_inputs(self): + self.assertRaises(HedFileError, TabularInput, None) + + def test_loading_binary(self): + with open(self.default_test_file_name, "rb") as f: + self.assertRaises(HedFileError, SpreadsheetInput, f) + + with open(self.default_test_file_name, "rb") as f: + opened_binary_file = SpreadsheetInput(f, file_type=".xlsx") + self.assertIsInstance(opened_binary_file, SpreadsheetInput, "SpreadsheetInput creates a correct object.") + self.assertTrue(True) + + def test_to_excel(self): + test_input_file = self.generic_file_input + test_output_name = self.base_output_folder + "ExcelMultipleSheets_resave.xlsx" + test_input_file.to_excel(test_output_name) + + test_input_file = self.generic_file_input + test_output_name = self.base_output_folder + "ExcelMultipleSheets_resave_formatting.xlsx" + test_input_file.to_excel(test_output_name) + + # Test to a file stream + test_input_file = self.generic_file_input + test_output_name = self.base_output_folder + "ExcelMultipleSheets_fileio.xlsx" + with open(test_output_name, "wb") as f: + test_input_file.to_excel(f) + + def test_to_excel_should_work(self): + spreadsheet = SpreadsheetInput(file=self.default_test_file_name, file_type='.xlsx', + tag_columns=[3], has_column_names=True, + column_prefix_dictionary={1: 'Label/', 2: 'Description/'}, + name='ExcelOneSheet.xlsx') + buffer = io.BytesIO() + spreadsheet.to_excel(buffer) + buffer.seek(0) + v = buffer.getvalue() + self.assertGreater(len(v), 0, "It should have a length greater than 0") + + def test_to_csv(self): + test_input_file = self.generic_file_input + test_output_name = self.base_output_folder + "ExcelMultipleSheets_resave.csv" + test_input_file.to_csv(test_output_name) + + test_input_file = self.generic_file_input + file_as_csv = test_input_file.to_csv(None) + self.assertIsInstance(file_as_csv, str) + + def test_loading_and_reloading(self): + test_input_file = self.generic_file_input + test_output_name = self.base_output_folder + "ExcelMultipleSheets_test_save.xlsx" + + test_input_file.to_excel(test_output_name) + + reloaded_input = SpreadsheetInput(test_output_name) + + self.assertTrue(test_input_file._dataframe.equals(reloaded_input._dataframe)) + + def test_loading_and_reset_mapper(self): + events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../data/validator_tests/bids_events_no_index.tsv') + json_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), + "../data/validator_tests/bids_events.json") + sidecar = Sidecar(json_path) + self.assertEqual(len(sidecar.validate(self.hed_schema)), 0) + input_file_1 = TabularInput(events_path, sidecar=sidecar) + input_file_2 = TabularInput(events_path, sidecar=sidecar) + + input_file_2.reset_column_mapper() + + self.assertTrue(input_file_1.dataframe.equals(input_file_2.dataframe)) + + def test_no_column_header_and_convert(self): + events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../data/model_tests/no_column_header.tsv') + hed_input = SpreadsheetInput(events_path, has_column_names=False, tag_columns=[0, 1]) + hed_input.convert_to_long(self.hed_schema) + + events_path_long = os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../data/model_tests/no_column_header_long.tsv') + hed_input_long = SpreadsheetInput(events_path_long, has_column_names=False, tag_columns=[0, 1]) + self.assertTrue(hed_input._dataframe.equals(hed_input_long._dataframe)) + + def test_convert_short_long_with_definitions(self): + # Verify behavior works as expected even if definitions are present + events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../data/model_tests/no_column_header_definition.tsv') + hed_input = SpreadsheetInput(events_path, has_column_names=False, tag_columns=[0, 1]) + hed_input.convert_to_long(self.hed_schema) + + events_path_long = os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../data/model_tests/no_column_header_definition_long.tsv') + hed_input_long = SpreadsheetInput(events_path_long, has_column_names=False, tag_columns=[0, 1]) + self.assertTrue(hed_input._dataframe.equals(hed_input_long._dataframe)) + + def test_loading_dataframe_directly(self): + ds_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../data/model_tests/no_column_header_definition.tsv') + ds = pd.read_csv(ds_path, delimiter="\t", header=None) + hed_input = SpreadsheetInput(ds, has_column_names=False, tag_columns=[0, 1]) + + events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../data/model_tests/no_column_header_definition.tsv') + hed_input2 = SpreadsheetInput(events_path, has_column_names=False, tag_columns=[0, 1]) + self.assertTrue(hed_input._dataframe.equals(hed_input2._dataframe)) + + def test_ignoring_na_column(self): + events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../data/model_tests/na_tag_column.tsv') + hed_input = SpreadsheetInput(events_path, has_column_names=False, tag_columns=[0, 1]) + self.assertTrue(hed_input.dataframe_a.loc[1, 1] == 'n/a') + + def test_ignoring_na_value_column(self): + from hed import TabularInput + events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../data/model_tests/na_value_column.tsv') + sidecar_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../data/model_tests/na_value_column.json') + hed_input = TabularInput(events_path, sidecar=sidecar_path) + self.assertTrue(hed_input.dataframe_a.loc[1, 'Value'] == 'n/a') + + def test_to_excel_workbook(self): + excel_book = SpreadsheetInput(self.default_test_file_name, worksheet_name="LKT 8HED3", + tag_columns=["HED tags"]) + test_output_name = self.base_output_folder + "ExcelMultipleSheets_resave_assembled.xlsx" + excel_book.convert_to_long(self.hed_schema) + excel_book.to_excel(test_output_name) + reloaded_df = SpreadsheetInput(test_output_name, worksheet_name="LKT 8HED3") + + self.assertTrue(excel_book.dataframe.equals(reloaded_df.dataframe)) + + def test_to_excel_workbook_no_col_names(self): + excel_book = SpreadsheetInput(self.default_test_file_name, worksheet_name="LKT 8HED3", + tag_columns=[4], has_column_names=False) + test_output_name = self.base_output_folder + "ExcelMultipleSheets_resave_assembled_no_col_names.xlsx" + excel_book.convert_to_long(self.hed_schema) + excel_book.to_excel(test_output_name) + reloaded_df = SpreadsheetInput(test_output_name, worksheet_name="LKT 8HED3", tag_columns=[4], + has_column_names=False) + self.assertTrue(excel_book.dataframe.equals(reloaded_df.dataframe)) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/models/test_string_util.py b/tests/models/test_string_util.py index 5ccce6619..5df651374 100644 --- a/tests/models/test_string_util.py +++ b/tests/models/test_string_util.py @@ -1,190 +1,192 @@ -import unittest -from hed import HedString, load_schema_version -from hed.models.string_util import split_base_tags, split_def_tags, gather_descriptions -import copy - - -class TestHedStringSplit(unittest.TestCase): - @classmethod - def setUpClass(cls): - cls.schema = load_schema_version("8.3.0") - - def check_split_base_tags(self, hed_string, base_tags, expected_string, expected_string2): - # Test case 1: remove_group=False - hed_string_copy = copy.deepcopy(hed_string) - remaining_hed, found_hed = split_base_tags(hed_string_copy, base_tags, remove_group=False) - - self.assertIsInstance(remaining_hed, HedString) - self.assertIsInstance(found_hed, HedString) - self.assertEqual(str(remaining_hed), expected_string) - - self.assertTrue(all(tag in [str(t) for t in found_hed.get_all_tags()] for tag in base_tags)) - self.assertTrue(all(tag not in [str(t) for t in remaining_hed.get_all_tags()] for tag in base_tags)) - - # Test case 2: remove_group=True - hed_string_copy = copy.deepcopy(hed_string) - remaining_hed, found_hed = split_base_tags(hed_string_copy, base_tags, remove_group=True) - - self.assertIsInstance(remaining_hed, HedString) - self.assertIsInstance(found_hed, HedString) - self.assertEqual(str(remaining_hed), expected_string2) - - self.assertTrue(all(tag in [str(t) for t in found_hed.get_all_tags()] for tag in base_tags)) - self.assertTrue(all(tag not in [str(t) for t in remaining_hed.get_all_tags()] for tag in base_tags)) - - def test_case_1(self): - hed_string = HedString('Memorize,Action,Area', self.schema) - base_tags = ['Area', 'Action'] - expected_string = 'Memorize' - expected_string2 = 'Memorize' - self.check_split_base_tags(hed_string, base_tags, expected_string, expected_string2) - - def test_case_2(self): - hed_string = HedString('Area,LightBlue,Handedness', self.schema) - base_tags = ['Area', 'LightBlue'] - expected_string = 'Handedness' - expected_string2 = 'Handedness' - self.check_split_base_tags(hed_string, base_tags, expected_string, expected_string2) - - def test_case_3(self): - hed_string = HedString('(Wink,Communicate),Face,HotPink', self.schema) - base_tags = ['Wink', 'Face'] - expected_string = '(Communicate),HotPink' - expected_string2 = "HotPink" - self.check_split_base_tags(hed_string, base_tags, expected_string, expected_string2) - - def test_case_4(self): - hed_string = HedString('(Area,(LightBlue,Handedness,(Wink,Communicate))),Face,HotPink', self.schema) - base_tags = ['Area', 'LightBlue'] - expected_string = '((Handedness,(Wink,Communicate))),Face,HotPink' - expected_string2 = 'Face,HotPink' - self.check_split_base_tags(hed_string, base_tags, expected_string, expected_string2) - - def test_case_5(self): - hed_string = HedString('(Memorize,(Action,(Area,LightBlue),Handedness),Wink)', self.schema) - base_tags = ['Area', 'LightBlue'] - expected_string = '(Memorize,(Action,Handedness),Wink)' - expected_string2 = '(Memorize,(Action,Handedness),Wink)' - self.check_split_base_tags(hed_string, base_tags, expected_string, expected_string2) - -class TestHedStringSplitDef(unittest.TestCase): - @classmethod - def setUpClass(cls): - cls.schema = load_schema_version("8.3.0") - - def check_split_def_tags(self, hed_string, def_names, expected_string, expected_string2): - # Test case 1: remove_group=False - hed_string_copy1 = copy.deepcopy(hed_string) - remaining_hed1, found_hed1 = split_def_tags(hed_string_copy1, def_names, remove_group=False) - - self.assertIsInstance(remaining_hed1, HedString) - self.assertIsInstance(found_hed1, HedString) - self.assertEqual(str(remaining_hed1), expected_string) - - self.assertTrue(all(tag.short_base_tag == "Def" for tag in found_hed1.get_all_tags())) - self.assertTrue(all(tag.short_base_tag != "Def" for tag in remaining_hed1.get_all_tags())) - - # Test case 2: remove_group=True - hed_string_copy2 = copy.deepcopy(hed_string) - remaining_hed2, found_hed2 = split_def_tags(hed_string_copy2, def_names, remove_group=True) - - self.assertIsInstance(remaining_hed2, HedString) - self.assertIsInstance(found_hed2, HedString) - self.assertEqual(str(remaining_hed2), expected_string2) - - #self.assertTrue(all(tag.short_base_tag == "Def" for tag in found_hed.get_all_tags())) - self.assertTrue(all(tag.short_base_tag != "Def" for tag in remaining_hed2.get_all_tags())) - - def test_case_1(self): - hed_string = HedString('Memorize,Action,def/CustomTag1', self.schema) - def_names = ['CustomTag1'] - expected_string = 'Memorize,Action' - expected_string2 = 'Memorize,Action' - self.check_split_def_tags(hed_string, def_names, expected_string, expected_string2) - - def test_case_2(self): - hed_string = HedString('def/CustomTag1,LightBlue,def/CustomTag2/123', self.schema) - def_names = ['CustomTag1', 'CustomTag2'] - expected_string = 'LightBlue' - expected_string2 = 'LightBlue' - self.check_split_def_tags(hed_string, def_names, expected_string, expected_string2) - - def test_case_3(self): - hed_string = HedString('(def/CustomTag1,Communicate),Face,def/CustomTag3/abc', self.schema) - def_names = ['CustomTag1', 'CustomTag3'] - expected_string = '(Communicate),Face' - expected_string2 = 'Face' - self.check_split_def_tags(hed_string, def_names, expected_string, expected_string2) - - def test_case_4(self): - hed_string = HedString('(def/CustomTag1,(LightBlue,def/CustomTag2/123,(Wink,Communicate))),Face,def/CustomTag3/abc', self.schema) - def_names = ['CustomTag1', 'CustomTag2', 'CustomTag3'] - expected_string = '((LightBlue,(Wink,Communicate))),Face' - expected_string2 = 'Face' - self.check_split_def_tags(hed_string, def_names, expected_string, expected_string2) - - def test_case_5(self): - hed_string = HedString('(Memorize,(Action,(def/CustomTag1,LightBlue),def/CustomTag2/123),Wink)', self.schema) - def_names = ['CustomTag1', 'CustomTag2'] - expected_string = '(Memorize,(Action,(LightBlue)),Wink)' - expected_string2 = '(Memorize,Wink)' - self.check_split_def_tags(hed_string, def_names, expected_string, expected_string2) - - -class TestGatherDescriptions(unittest.TestCase): - def setUp(self): - self.schema = load_schema_version("8.3.0") - - def test_gather_single_description(self): - input_str = "Sensory-event, Description/This is a test." - hed_string = HedString(input_str, hed_schema=self.schema) - - result = gather_descriptions(hed_string) - expected_result = "This is a test." - - self.assertEqual(result, expected_result) - self.assertNotIn("Description", str(result)) - - def test_gather_multiple_descriptions(self): - input_str = "Sensory-event, Description/First description, Second-tag, Description/Second description." - hed_string = HedString(input_str, hed_schema=self.schema) - - result = gather_descriptions(hed_string) - expected_result = "First description. Second description." - - self.assertEqual(result, expected_result) - self.assertNotIn("Description", str(result)) - - def test_gather_no_descriptions(self): - input_str = "Sensory-event, No-description-here, Another-tag" - hed_string = HedString(input_str, hed_schema=self.schema) - - result = gather_descriptions(hed_string) - expected_result = "" - - self.assertEqual(result, expected_result) - self.assertNotIn("Description", str(result)) - - def test_gather_descriptions_mixed_order(self): - input_str = "Sensory-event, Description/First., Another-tag, Description/Second, Third-tag, Description/Third." - hed_string = HedString(input_str, hed_schema=self.schema) - - result = gather_descriptions(hed_string) - expected_result = "First. Second. Third." - - self.assertEqual(result, expected_result) - self.assertNotIn("Description", str(result)) - - def test_gather_descriptions_missing_period(self): - input_str = "Sensory-event, Description/First, Description/Second" - hed_string = HedString(input_str, hed_schema=self.schema) - - result = gather_descriptions(hed_string) - expected_result = "First. Second." - - self.assertEqual(result, expected_result) - self.assertNotIn("Description", str(result)) - - -if __name__ == '__main__': - unittest.main() \ No newline at end of file +import unittest +from hed import HedString, load_schema_version +from hed.models.string_util import split_base_tags, split_def_tags, gather_descriptions +import copy + + +class TestHedStringSplit(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.schema = load_schema_version("8.3.0") + + def check_split_base_tags(self, hed_string, base_tags, expected_string, expected_string2): + # Test case 1: remove_group=False + hed_string_copy = copy.deepcopy(hed_string) + remaining_hed, found_hed = split_base_tags(hed_string_copy, base_tags, remove_group=False) + + self.assertIsInstance(remaining_hed, HedString) + self.assertIsInstance(found_hed, HedString) + self.assertEqual(str(remaining_hed), expected_string) + + self.assertTrue(all(tag in [str(t) for t in found_hed.get_all_tags()] for tag in base_tags)) + self.assertTrue(all(tag not in [str(t) for t in remaining_hed.get_all_tags()] for tag in base_tags)) + + # Test case 2: remove_group=True + hed_string_copy = copy.deepcopy(hed_string) + remaining_hed, found_hed = split_base_tags(hed_string_copy, base_tags, remove_group=True) + + self.assertIsInstance(remaining_hed, HedString) + self.assertIsInstance(found_hed, HedString) + self.assertEqual(str(remaining_hed), expected_string2) + + self.assertTrue(all(tag in [str(t) for t in found_hed.get_all_tags()] for tag in base_tags)) + self.assertTrue(all(tag not in [str(t) for t in remaining_hed.get_all_tags()] for tag in base_tags)) + + def test_case_1(self): + hed_string = HedString('Memorize,Action,Area', self.schema) + base_tags = ['Area', 'Action'] + expected_string = 'Memorize' + expected_string2 = 'Memorize' + self.check_split_base_tags(hed_string, base_tags, expected_string, expected_string2) + + def test_case_2(self): + hed_string = HedString('Area,LightBlue,Handedness', self.schema) + base_tags = ['Area', 'LightBlue'] + expected_string = 'Handedness' + expected_string2 = 'Handedness' + self.check_split_base_tags(hed_string, base_tags, expected_string, expected_string2) + + def test_case_3(self): + hed_string = HedString('(Wink,Communicate),Face,HotPink', self.schema) + base_tags = ['Wink', 'Face'] + expected_string = '(Communicate),HotPink' + expected_string2 = "HotPink" + self.check_split_base_tags(hed_string, base_tags, expected_string, expected_string2) + + def test_case_4(self): + hed_string = HedString('(Area,(LightBlue,Handedness,(Wink,Communicate))),Face,HotPink', self.schema) + base_tags = ['Area', 'LightBlue'] + expected_string = '((Handedness,(Wink,Communicate))),Face,HotPink' + expected_string2 = 'Face,HotPink' + self.check_split_base_tags(hed_string, base_tags, expected_string, expected_string2) + + def test_case_5(self): + hed_string = HedString('(Memorize,(Action,(Area,LightBlue),Handedness),Wink)', self.schema) + base_tags = ['Area', 'LightBlue'] + expected_string = '(Memorize,(Action,Handedness),Wink)' + expected_string2 = '(Memorize,(Action,Handedness),Wink)' + self.check_split_base_tags(hed_string, base_tags, expected_string, expected_string2) + + +class TestHedStringSplitDef(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.schema = load_schema_version("8.3.0") + + def check_split_def_tags(self, hed_string, def_names, expected_string, expected_string2): + # Test case 1: remove_group=False + hed_string_copy1 = copy.deepcopy(hed_string) + remaining_hed1, found_hed1 = split_def_tags(hed_string_copy1, def_names, remove_group=False) + + self.assertIsInstance(remaining_hed1, HedString) + self.assertIsInstance(found_hed1, HedString) + self.assertEqual(str(remaining_hed1), expected_string) + + self.assertTrue(all(tag.short_base_tag == "Def" for tag in found_hed1.get_all_tags())) + self.assertTrue(all(tag.short_base_tag != "Def" for tag in remaining_hed1.get_all_tags())) + + # Test case 2: remove_group=True + hed_string_copy2 = copy.deepcopy(hed_string) + remaining_hed2, found_hed2 = split_def_tags(hed_string_copy2, def_names, remove_group=True) + + self.assertIsInstance(remaining_hed2, HedString) + self.assertIsInstance(found_hed2, HedString) + self.assertEqual(str(remaining_hed2), expected_string2) + + # self.assertTrue(all(tag.short_base_tag == "Def" for tag in found_hed.get_all_tags())) + self.assertTrue(all(tag.short_base_tag != "Def" for tag in remaining_hed2.get_all_tags())) + + def test_case_1(self): + hed_string = HedString('Memorize,Action,def/CustomTag1', self.schema) + def_names = ['CustomTag1'] + expected_string = 'Memorize,Action' + expected_string2 = 'Memorize,Action' + self.check_split_def_tags(hed_string, def_names, expected_string, expected_string2) + + def test_case_2(self): + hed_string = HedString('def/CustomTag1,LightBlue,def/CustomTag2/123', self.schema) + def_names = ['CustomTag1', 'CustomTag2'] + expected_string = 'LightBlue' + expected_string2 = 'LightBlue' + self.check_split_def_tags(hed_string, def_names, expected_string, expected_string2) + + def test_case_3(self): + hed_string = HedString('(def/CustomTag1,Communicate),Face,def/CustomTag3/abc', self.schema) + def_names = ['CustomTag1', 'CustomTag3'] + expected_string = '(Communicate),Face' + expected_string2 = 'Face' + self.check_split_def_tags(hed_string, def_names, expected_string, expected_string2) + + def test_case_4(self): + hed_string = HedString('(def/CustomTag1,(LightBlue,def/CustomTag2/123,(Wink,Communicate))),' + + 'Face,def/CustomTag3/abc', self.schema) + def_names = ['CustomTag1', 'CustomTag2', 'CustomTag3'] + expected_string = '((LightBlue,(Wink,Communicate))),Face' + expected_string2 = 'Face' + self.check_split_def_tags(hed_string, def_names, expected_string, expected_string2) + + def test_case_5(self): + hed_string = HedString('(Memorize,(Action,(def/CustomTag1,LightBlue),def/CustomTag2/123),Wink)', self.schema) + def_names = ['CustomTag1', 'CustomTag2'] + expected_string = '(Memorize,(Action,(LightBlue)),Wink)' + expected_string2 = '(Memorize,Wink)' + self.check_split_def_tags(hed_string, def_names, expected_string, expected_string2) + + +class TestGatherDescriptions(unittest.TestCase): + def setUp(self): + self.schema = load_schema_version("8.3.0") + + def test_gather_single_description(self): + input_str = "Sensory-event, Description/This is a test." + hed_string = HedString(input_str, hed_schema=self.schema) + + result = gather_descriptions(hed_string) + expected_result = "This is a test." + + self.assertEqual(result, expected_result) + self.assertNotIn("Description", str(result)) + + def test_gather_multiple_descriptions(self): + input_str = "Sensory-event, Description/First description, Second-tag, Description/Second description." + hed_string = HedString(input_str, hed_schema=self.schema) + + result = gather_descriptions(hed_string) + expected_result = "First description. Second description." + + self.assertEqual(result, expected_result) + self.assertNotIn("Description", str(result)) + + def test_gather_no_descriptions(self): + input_str = "Sensory-event, No-description-here, Another-tag" + hed_string = HedString(input_str, hed_schema=self.schema) + + result = gather_descriptions(hed_string) + expected_result = "" + + self.assertEqual(result, expected_result) + self.assertNotIn("Description", str(result)) + + def test_gather_descriptions_mixed_order(self): + input_str = "Sensory-event, Description/First., Another-tag, Description/Second, Third-tag, Description/Third." + hed_string = HedString(input_str, hed_schema=self.schema) + + result = gather_descriptions(hed_string) + expected_result = "First. Second. Third." + + self.assertEqual(result, expected_result) + self.assertNotIn("Description", str(result)) + + def test_gather_descriptions_missing_period(self): + input_str = "Sensory-event, Description/First, Description/Second" + hed_string = HedString(input_str, hed_schema=self.schema) + + result = gather_descriptions(hed_string) + expected_result = "First. Second." + + self.assertEqual(result, expected_result) + self.assertNotIn("Description", str(result)) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/models/test_tabular_input.py b/tests/models/test_tabular_input.py index e1c3bc7fb..0d95935b7 100644 --- a/tests/models/test_tabular_input.py +++ b/tests/models/test_tabular_input.py @@ -1,102 +1,106 @@ -import unittest -import os -import shutil - -from hed.models import DefinitionEntry, Sidecar, TabularInput -from hed import schema -from hed.errors import HedFileError -from hed.errors import ErrorHandler, ErrorContext - - -class Test(unittest.TestCase): - @classmethod - def setUpClass(cls): - base_output_folder = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../data/tests_output/") - os.makedirs(base_output_folder, exist_ok=True) - - bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/bids_tests/eeg_ds003645s_hed')) - schema_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/schema_tests/HED8.2.0.xml')) - sidecar1_path = os.path.realpath(os.path.join(bids_root_path, 'task-FacePerception_events.json')) - cls.events_path = os.path.realpath( - os.path.join(bids_root_path, 'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv')) - sidecar2_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/remodel_tests/task-FacePerceptionSmall_events.json')) - cls.hed_schema = schema.load_schema(schema_path) - cls.sidecar1 = Sidecar(sidecar1_path, name='face_sub1_json') - cls.sidecar2 = Sidecar(sidecar2_path, name='face_small_json') - cls.base_output_folder = base_output_folder - - cls.invalid_inputs = [123, {'key': 'value'}, 'nonexistent_file.tsv'] - - @classmethod - def tearDownClass(cls): - shutil.rmtree(cls.base_output_folder) - - def test_missing_column_name_issue(self): - events_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/validator_tests/bids_events_bad_column_name.tsv')) - json_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), - "../data/validator_tests/bids_events.json")) - sidecar = Sidecar(json_path) - issues = sidecar.validate(self.hed_schema) - self.assertEqual(len(issues), 0) - input_file = TabularInput(events_path, sidecar=sidecar) - - validation_issues = input_file.validate(hed_schema=self.hed_schema) - self.assertEqual(len(validation_issues), 1) - - def test_expand_column_issues(self): - events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/validator_tests/bids_events_bad_category_key.tsv') - json_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), - "../data/validator_tests/bids_events.json") - sidecar = Sidecar(json_path) - issues = sidecar.validate(hed_schema=self.hed_schema) - self.assertEqual(len(issues), 0) - input_file = TabularInput(events_path, sidecar=sidecar) - - validation_issues = input_file.validate(hed_schema=self.hed_schema) - self.assertEqual(validation_issues[0][ErrorContext.ROW], 2) - self.assertEqual(len(validation_issues), 1) - - def test_blank_and_duplicate_columns(self): - filepath = os.path.join(os.path.dirname(os.path.realpath(__file__)), - "../data/model_tests/blank_column_name.tsv") - - with self.assertRaises(HedFileError): - _ = TabularInput(filepath) - - # todo: add back in when we do this check - # filepath = os.path.join(os.path.dirname(os.path.realpath(__file__)), - # "../data/model_tests/duplicate_column_name.tsv") - # - # with self.assertRaises(HedFileError): - # _ = TabularInput(filepath) - - def test_validate_file_warnings(self): - issues1 = self.sidecar1.validate(hed_schema=self.hed_schema) - input_file1 = TabularInput(self.events_path, sidecar=self.sidecar1) - issues1a = input_file1.validate(hed_schema=self.hed_schema) - - issues2 = self.sidecar1.validate(hed_schema=self.hed_schema, error_handler=ErrorHandler(False)) - input_file2 = TabularInput(self.events_path, sidecar=self.sidecar2) - issues2a = input_file2.validate(hed_schema=self.hed_schema, error_handler=ErrorHandler(False)) - - def test_invalid_file(self): - for invalid_input in self.invalid_inputs: - with self.subTest(input=invalid_input): - with self.assertRaises(HedFileError): - TabularInput(file=invalid_input) - - def test_invalid_sidecar(self): - for invalid_input in self.invalid_inputs: - with self.subTest(input=invalid_input): - with self.assertRaises(HedFileError): - # Replace 'valid_path.tsv' with a path to an existing .tsv file - TabularInput(file=self.events_path, sidecar=invalid_input) - - -if __name__ == '__main__': - unittest.main() +import unittest +import os +import shutil + +from hed.models import Sidecar, TabularInput +from hed import schema +from hed.errors import HedFileError +from hed.errors import ErrorHandler, ErrorContext + + +class Test(unittest.TestCase): + @classmethod + def setUpClass(cls): + base_output_folder = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../data/tests_output/") + os.makedirs(base_output_folder, exist_ok=True) + + bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../data/bids_tests/eeg_ds003645s_hed')) + schema_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../data/schema_tests/HED8.2.0.xml')) + sidecar1_path = os.path.realpath(os.path.join(bids_root_path, 'task-FacePerception_events.json')) + cls.events_path = os.path.realpath( + os.path.join(bids_root_path, 'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv')) + sidecar2_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../data/remodel_tests/task-FacePerceptionSmall_events.json')) + cls.hed_schema = schema.load_schema(schema_path) + cls.sidecar1 = Sidecar(sidecar1_path, name='face_sub1_json') + cls.sidecar2 = Sidecar(sidecar2_path, name='face_small_json') + cls.base_output_folder = base_output_folder + + cls.invalid_inputs = [123, {'key': 'value'}, 'nonexistent_file.tsv'] + + @classmethod + def tearDownClass(cls): + shutil.rmtree(cls.base_output_folder) + + def test_missing_column_name_issue(self): + events_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../data/validator_tests/bids_events_bad_column_name.tsv')) + json_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), + "../data/validator_tests/bids_events.json")) + sidecar = Sidecar(json_path) + issues = sidecar.validate(self.hed_schema) + self.assertEqual(len(issues), 0) + input_file = TabularInput(events_path, sidecar=sidecar) + + validation_issues = input_file.validate(hed_schema=self.hed_schema) + self.assertEqual(len(validation_issues), 1) + + def test_expand_column_issues(self): + events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../data/validator_tests/bids_events_bad_category_key.tsv') + json_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), + "../data/validator_tests/bids_events.json") + sidecar = Sidecar(json_path) + issues = sidecar.validate(hed_schema=self.hed_schema) + self.assertEqual(len(issues), 0) + input_file = TabularInput(events_path, sidecar=sidecar) + + validation_issues = input_file.validate(hed_schema=self.hed_schema) + self.assertEqual(validation_issues[0][ErrorContext.ROW], 2) + self.assertEqual(len(validation_issues), 1) + + def test_blank_and_duplicate_columns(self): + filepath = os.path.join(os.path.dirname(os.path.realpath(__file__)), + "../data/model_tests/blank_column_name.tsv") + + with self.assertRaises(HedFileError): + _ = TabularInput(filepath) + + # todo: add back in when we do this check + # filepath = os.path.join(os.path.dirname(os.path.realpath(__file__)), + # "../data/model_tests/duplicate_column_name.tsv") + # + # with self.assertRaises(HedFileError): + # _ = TabularInput(filepath) + + def test_validate_file_warnings(self): + issues1 = self.sidecar1.validate(hed_schema=self.hed_schema) + self.assertFalse(issues1) + input_file1 = TabularInput(self.events_path, sidecar=self.sidecar1) + issues1a = input_file1.validate(hed_schema=self.hed_schema) + self.assertEqual(len(issues1a), 1) + self.assertEqual(issues1a[0]['code'], "HED_UNKNOWN_COLUMN") + issues2 = self.sidecar1.validate(hed_schema=self.hed_schema, error_handler=ErrorHandler(False)) + self.assertFalse(issues2) + input_file2 = TabularInput(self.events_path, sidecar=self.sidecar2) + issues2a = input_file2.validate(hed_schema=self.hed_schema, error_handler=ErrorHandler(False)) + self.assertEqual(issues2a[0]['code'], "TAG_EXPRESSION_REPEATED") + + def test_invalid_file(self): + for invalid_input in self.invalid_inputs: + with self.subTest(input=invalid_input): + with self.assertRaises(HedFileError): + TabularInput(file=invalid_input) + + def test_invalid_sidecar(self): + for invalid_input in self.invalid_inputs: + with self.subTest(input=invalid_input): + with self.assertRaises(HedFileError): + # Replace 'valid_path.tsv' with a path to an existing .tsv file + TabularInput(file=self.events_path, sidecar=invalid_input) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/schema/test_hed_schema.py b/tests/schema/test_hed_schema.py index 6b429e039..5f87476e8 100644 --- a/tests/schema/test_hed_schema.py +++ b/tests/schema/test_hed_schema.py @@ -1,139 +1,138 @@ -import unittest -import os - -from hed.errors import HedFileError, get_printable_issue_string -from hed.models import HedString, HedTag -from hed.schema import HedKey, HedSectionKey, get_hed_xml_version, load_schema, HedSchemaGroup, load_schema_version, HedSchema - - -class TestHedSchema(unittest.TestCase): - schema_file_3g_xml = '../data/schema_tests/HED8.0.0t.xml' - schema_file_3g = '../data/schema_tests/HED8.2.0.mediawiki' - - @classmethod - def setUpClass(cls): - cls.hed_xml_3g = os.path.join(os.path.dirname(os.path.realpath(__file__)), cls.schema_file_3g_xml) - cls.hed_wiki_3g = os.path.join(os.path.dirname(os.path.realpath(__file__)), cls.schema_file_3g) - cls.hed_schema_3g_wiki = load_schema(cls.hed_wiki_3g) - cls.hed_schema_3g = load_schema(cls.hed_xml_3g) - - schema_file = '../data/validator_tests/HED8.0.0_added_tests.mediawiki' - hed_xml = os.path.join(os.path.dirname(os.path.realpath(__file__)), schema_file) - hed_schema1 = load_schema(hed_xml) - hed_schema2 = load_schema(hed_xml, schema_namespace="tl:") - cls.hed_schema_group = HedSchemaGroup([hed_schema1, hed_schema2]) - - def test_name(self): - invalid_xml_file = "invalidxmlfile.xml" - try: - load_schema(invalid_xml_file) - # We should have an error before we reach here. - self.assertTrue(False) - except HedFileError as e: - self.assertTrue(invalid_xml_file in e.filename) - - def test_tag_attribute(self): - test_strings = { - 'value': 'Weight/#', - 'valueParent': 'Label', - 'allowedExtension': 'Experiment-structure', - } - expected_results = { - 'value': { - 'defaultUnits': False, - 'extensionAllowed': False, - 'position': False, - 'predicateType': False, - 'recommended': False, - 'required': False, - 'requireChild': False, - 'takesValue': True, - 'unique': False, - 'unitClass': True, - }, - 'valueParent': { - 'defaultUnits': False, - 'extensionAllowed': False, - 'position': False, - 'predicateType': False, - 'recommended': False, - 'required': False, - 'requireChild': True, - 'takesValue': False, - 'unique': False, - 'unitClass': False, - }, - 'allowedExtension': { - 'defaultUnits': False, - 'extensionAllowed': False, - 'position': False, - 'predicateType': False, - 'recommended': False, - 'required': False, - 'requireChild': False, - 'takesValue': False, - 'unique': False, - 'unitClass': False, - }, - } - for key, test_string in test_strings.items(): - expected_dict = expected_results[key] - tag = HedTag(test_string, hed_schema=self.hed_schema_3g) - for attribute, expected_value in expected_dict.items(): - self.assertEqual(tag.has_attribute(attribute), expected_value, - 'Test string: %s. Attribute: %s.' % (test_string, attribute)) - - def test_get_all_tag_attributes(self): - tag_props = self.hed_schema_3g._get_tag_entry("Jerk-rate/#").attributes - expected_props = { - "takesValue": "true", - "valueClass": "numericClass", - "unitClass": 'jerkUnits' - } - self.assertCountEqual(tag_props, expected_props) - - tag_props = self.hed_schema_3g._get_tag_entry("Statistical-value").attributes - expected_props = { - HedKey.ExtensionAllowed: "true", - } - self.assertCountEqual(tag_props, expected_props) - # also test long form. - tag_props = self.hed_schema_3g._get_tag_entry("Property/Data-property/Data-value/Statistical-value").attributes - self.assertCountEqual(tag_props, expected_props) - - def test_get_hed_xml_version(self): - self.assertEqual(get_hed_xml_version(self.hed_xml_3g), "8.0.0") - - def test_has_duplicate_tags(self): - self.assertFalse(self.hed_schema_3g.has_duplicates()) - - def test_short_tag_mapping(self): - self.assertEqual(len(self.hed_schema_3g.tags.keys()), 1110) - - def test_schema_compliance(self): - warnings = self.hed_schema_group.check_compliance(True) - self.assertEqual(len(warnings), 18) - - def test_bad_prefixes(self): - schema = load_schema_version(xml_version="8.3.0") - - self.assertTrue(schema.get_tag_entry("Event")) - self.assertFalse(schema.get_tag_entry("sc:Event")) - self.assertFalse(schema.get_tag_entry("unknown:Event")) - self.assertFalse(schema.get_tag_entry(":Event")) - self.assertFalse(schema.get_tag_entry("Event", schema_namespace=None)) - self.assertTrue(schema.get_tag_entry("Event", schema_namespace='')) - self.assertFalse(schema.get_tag_entry("Event", schema_namespace='unknown')) - - def test_bad_prefixes_library(self): - schema = load_schema_version(xml_version="tl:8.3.0") - - self.assertTrue(schema.get_tag_entry("tl:Event", schema_namespace="tl:")) - self.assertFalse(schema.get_tag_entry("sc:Event", schema_namespace="tl:")) - self.assertTrue(schema.get_tag_entry("Event", schema_namespace="tl:")) - self.assertFalse(schema.get_tag_entry("unknown:Event", schema_namespace="tl:")) - self.assertFalse(schema.get_tag_entry(":Event", schema_namespace="tl:")) - self.assertFalse(schema.get_tag_entry("Event", schema_namespace=None)) - self.assertFalse(schema.get_tag_entry("Event", schema_namespace='')) - self.assertFalse(schema.get_tag_entry("Event", schema_namespace='unknown')) - +import unittest +import os + +from hed.errors import HedFileError +from hed.models import HedTag +from hed.schema import HedKey, get_hed_xml_version, load_schema, HedSchemaGroup, load_schema_version + + +class TestHedSchema(unittest.TestCase): + schema_file_3g_xml = '../data/schema_tests/HED8.0.0t.xml' + schema_file_3g = '../data/schema_tests/HED8.2.0.mediawiki' + + @classmethod + def setUpClass(cls): + cls.hed_xml_3g = os.path.join(os.path.dirname(os.path.realpath(__file__)), cls.schema_file_3g_xml) + cls.hed_wiki_3g = os.path.join(os.path.dirname(os.path.realpath(__file__)), cls.schema_file_3g) + cls.hed_schema_3g_wiki = load_schema(cls.hed_wiki_3g) + cls.hed_schema_3g = load_schema(cls.hed_xml_3g) + + schema_file = '../data/validator_tests/HED8.0.0_added_tests.mediawiki' + hed_xml = os.path.join(os.path.dirname(os.path.realpath(__file__)), schema_file) + hed_schema1 = load_schema(hed_xml) + hed_schema2 = load_schema(hed_xml, schema_namespace="tl:") + cls.hed_schema_group = HedSchemaGroup([hed_schema1, hed_schema2]) + + def test_name(self): + invalid_xml_file = "invalidxmlfile.xml" + try: + load_schema(invalid_xml_file) + # We should have an error before we reach here. + self.assertTrue(False) + except HedFileError as e: + self.assertTrue(invalid_xml_file in e.filename) + + def test_tag_attribute(self): + test_strings = { + 'value': 'Weight/#', + 'valueParent': 'Label', + 'allowedExtension': 'Experiment-structure', + } + expected_results = { + 'value': { + 'defaultUnits': False, + 'extensionAllowed': False, + 'position': False, + 'predicateType': False, + 'recommended': False, + 'required': False, + 'requireChild': False, + 'takesValue': True, + 'unique': False, + 'unitClass': True, + }, + 'valueParent': { + 'defaultUnits': False, + 'extensionAllowed': False, + 'position': False, + 'predicateType': False, + 'recommended': False, + 'required': False, + 'requireChild': True, + 'takesValue': False, + 'unique': False, + 'unitClass': False, + }, + 'allowedExtension': { + 'defaultUnits': False, + 'extensionAllowed': False, + 'position': False, + 'predicateType': False, + 'recommended': False, + 'required': False, + 'requireChild': False, + 'takesValue': False, + 'unique': False, + 'unitClass': False, + }, + } + for key, test_string in test_strings.items(): + expected_dict = expected_results[key] + tag = HedTag(test_string, hed_schema=self.hed_schema_3g) + for attribute, expected_value in expected_dict.items(): + self.assertEqual(tag.has_attribute(attribute), expected_value, + 'Test string: %s. Attribute: %s.' % (test_string, attribute)) + + def test_get_all_tag_attributes(self): + tag_props = self.hed_schema_3g._get_tag_entry("Jerk-rate/#").attributes + expected_props = { + "takesValue": "true", + "valueClass": "numericClass", + "unitClass": 'jerkUnits' + } + self.assertCountEqual(tag_props, expected_props) + + tag_props = self.hed_schema_3g._get_tag_entry("Statistical-value").attributes + expected_props = { + HedKey.ExtensionAllowed: "true", + } + self.assertCountEqual(tag_props, expected_props) + # also test long form. + tag_props = self.hed_schema_3g._get_tag_entry("Property/Data-property/Data-value/Statistical-value").attributes + self.assertCountEqual(tag_props, expected_props) + + def test_get_hed_xml_version(self): + self.assertEqual(get_hed_xml_version(self.hed_xml_3g), "8.0.0") + + def test_has_duplicate_tags(self): + self.assertFalse(self.hed_schema_3g.has_duplicates()) + + def test_short_tag_mapping(self): + self.assertEqual(len(self.hed_schema_3g.tags.keys()), 1110) + + def test_schema_compliance(self): + warnings = self.hed_schema_group.check_compliance(True) + self.assertEqual(len(warnings), 18) + + def test_bad_prefixes(self): + schema = load_schema_version(xml_version="8.3.0") + + self.assertTrue(schema.get_tag_entry("Event")) + self.assertFalse(schema.get_tag_entry("sc:Event")) + self.assertFalse(schema.get_tag_entry("unknown:Event")) + self.assertFalse(schema.get_tag_entry(":Event")) + self.assertFalse(schema.get_tag_entry("Event", schema_namespace=None)) + self.assertTrue(schema.get_tag_entry("Event", schema_namespace='')) + self.assertFalse(schema.get_tag_entry("Event", schema_namespace='unknown')) + + def test_bad_prefixes_library(self): + schema = load_schema_version(xml_version="tl:8.3.0") + + self.assertTrue(schema.get_tag_entry("tl:Event", schema_namespace="tl:")) + self.assertFalse(schema.get_tag_entry("sc:Event", schema_namespace="tl:")) + self.assertTrue(schema.get_tag_entry("Event", schema_namespace="tl:")) + self.assertFalse(schema.get_tag_entry("unknown:Event", schema_namespace="tl:")) + self.assertFalse(schema.get_tag_entry(":Event", schema_namespace="tl:")) + self.assertFalse(schema.get_tag_entry("Event", schema_namespace=None)) + self.assertFalse(schema.get_tag_entry("Event", schema_namespace='')) + self.assertFalse(schema.get_tag_entry("Event", schema_namespace='unknown')) diff --git a/tests/schema/test_hed_schema_io.py b/tests/schema/test_hed_schema_io.py index b2d330861..5e05a8a94 100644 --- a/tests/schema/test_hed_schema_io.py +++ b/tests/schema/test_hed_schema_io.py @@ -1,667 +1,682 @@ -import unittest - -from hed.errors import HedFileError -from hed.errors.error_types import SchemaErrors -from hed.schema import load_schema, HedSchemaGroup, load_schema_version, HedSchema -from hed.schema.hed_schema_io import parse_version_list, _load_schema_version -from tests.schema.test_schema_converters import with_temp_file, get_temp_filename - -import os -from hed.errors import HedExceptions -from hed.schema import HedKey -from hed.schema import hed_cache -from hed import schema -import shutil - - -# todo: speed up these tests -class TestHedSchema(unittest.TestCase): - - # def test_load_invalid_schema(self): - # # Handle missing or invalid files. - # invalid_xml_file = "invalidxmlfile.xml" - # hed_schema = None - # try: - # hed_schema = load_schema(invalid_xml_file) - # except HedFileError: - # pass - # - # self.assertFalse(hed_schema) - # - # hed_schema = None - # try: - # hed_schema = load_schema(None) - # except HedFileError: - # pass - # self.assertFalse(hed_schema) - # - # hed_schema = None - # try: - # hed_schema = load_schema("") - # except HedFileError: - # pass - # self.assertFalse(hed_schema) - # - # def test_load_schema_version_tags(self): - # schema = load_schema_version(xml_version="st:8.0.0") - # schema2 = load_schema_version(xml_version="8.0.0") - # self.assertNotEqual(schema, schema2) - # schema2.set_schema_prefix("st") - # self.assertEqual(schema, schema2) - # - # score_lib = load_schema_version(xml_version="score_1.0.0") - # self.assertEqual(score_lib._namespace, "") - # self.assertTrue(score_lib.get_tag_entry("Modulator")) - # - # score_lib = load_schema_version(xml_version="sc:score_1.0.0") - # self.assertEqual(score_lib._namespace, "sc:") - # self.assertTrue(score_lib.get_tag_entry("Modulator", schema_namespace="sc:")) - - def test_load_schema_invalid_parameters(self): - bad_filename = "this_is_not_a_real_file.xml" - with self.assertRaises(HedFileError): - load_schema(bad_filename) - - bad_filename = "https://github.com/hed-standard/hed-python/bad_url.xml" - with self.assertRaises(HedFileError): - load_schema(bad_filename) - - def test_load_schema_name(self): - schema_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/schema_tests/HED8.2.0.mediawiki') - - schema = load_schema(schema_path, schema_namespace="testspace", name="Test Name") - self.assertEqual(schema.schema_namespace, "testspace:") - self.assertEqual(schema.name, "Test Name") - - schema = load_schema(schema_path, schema_namespace="testspace") - self.assertEqual(schema.schema_namespace, "testspace:") - self.assertEqual(schema.name, schema_path) - - def test_load_schema_version(self): - ver1 = "8.0.0" - schemas1 = load_schema_version(ver1) - self.assertIsInstance(schemas1, HedSchema, "load_schema_version returns a HedSchema if a string version") - self.assertEqual(schemas1.version_number, "8.0.0", "load_schema_version has the right version") - self.assertEqual(schemas1.library, "", "load_schema_version standard schema has no library") - self.assertEqual(schemas1.name, "8.0.0") - ver2 = "base:8.0.0" - schemas2 = load_schema_version(ver2) - self.assertIsInstance(schemas2, HedSchema, "load_schema_version returns HedSchema version+namespace") - self.assertEqual(schemas2.version_number, "8.0.0", "load_schema_version has the right version with namespace") - self.assertEqual(schemas2._namespace, "base:", "load_schema_version has the right version with namespace") - self.assertEqual(schemas2.name, "base:8.0.0") - ver3 = ["base:8.0.0"] - schemas3 = load_schema_version(ver3) - self.assertIsInstance(schemas3, HedSchema, "load_schema_version returns HedSchema version+namespace") - self.assertEqual(schemas3.version_number, "8.0.0", "load_schema_version has the right version with namespace") - self.assertEqual(schemas3._namespace, "base:", "load_schema_version has the right version with namespace") - self.assertEqual(schemas3.name, "base:8.0.0") - - def test_load_schema_version_merged(self): - ver4 = ["testlib_2.0.0", "score_1.1.0"] - schemas3 = load_schema_version(ver4) - issues = schemas3.check_compliance() - self.assertIsInstance(schemas3, HedSchema, "load_schema_version returns HedSchema version+namespace") - self.assertTrue(schemas3.version_number, "load_schema_version has the right version with namespace") - self.assertEqual(schemas3.schema_namespace, "", "load_schema_version has the right version with namespace") - self.assertEqual(schemas3.name, "testlib_2.0.0,score_1.1.0") - # Deprecated tag warnings - self.assertEqual(len(issues), 11) - - # Verify this cannot be saved - with self.assertRaises(HedFileError): - schemas3.save_as_mediawiki("filename") - - def test_verify_utf8_dupe(self): - base_dir = os.path.join(os.path.dirname(__file__), "../data/schema_tests") - schema_path = os.path.join(base_dir, "schema_utf8_dupe.mediawiki") - schema = load_schema(schema_path) - issues = schema.check_compliance() - # This can be 1 or 2, depending on if the "pre-release" warning shows up. - self.assertTrue(1 <= len(issues) <= 2) - - # Note it finds both of these as a duplicate - self.assertTrue(schema.get_tag_entry("Wßord")) - self.assertTrue(schema.get_tag_entry("Wssord")) - - def test_load_and_verify_tags(self): - # Load 'testlib' by itself - testlib = load_schema_version('testlib_2.0.0') - - # Load 'score' by itself - score = load_schema_version('score_1.1.0') - - # Load both 'testlib' and 'score' together - schemas3 = load_schema_version(["testlib_2.0.0", "score_1.1.0"]) - - # Extract the tag names from each library - testlib_tags = set(testlib.tags.all_names.keys()) - score_tags = set(score.tags.all_names.keys()) - merged_tags = set(schemas3.tags.all_names.keys()) - - # Verify that all tags in 'testlib' and 'score' are in the merged library - for tag in testlib_tags: - self.assertIn(tag, merged_tags, f"Tag {tag} from testlib is missing in the merged schema.") - - for tag in score_tags: - self.assertIn(tag, merged_tags, f"Tag {tag} from score is missing in the merged schema.") - - # Negative test cases - # Ensure merged_tags is not a subset of testlib_tags or score_tags - self.assertFalse(merged_tags.issubset(testlib_tags), "The merged tags should not be a subset of testlib tags.") - self.assertFalse(merged_tags.issubset(score_tags), "The merged tags should not be a subset of score tags.") - - # Ensure there are tags that came uniquely from each library - unique_testlib_tags = testlib_tags - score_tags - unique_score_tags = score_tags - testlib_tags - - self.assertTrue(any(tag in merged_tags for tag in unique_testlib_tags), - "There should be unique tags from testlib in the merged schema.") - self.assertTrue(any(tag in merged_tags for tag in unique_score_tags), - "There should be unique tags from score in the merged schema.") - - def test_load_schema_version_libraries(self): - ver1 = "score_1.0.0" - schemas1 = load_schema_version(ver1) - self.assertIsInstance(schemas1, HedSchema, "load_schema_version returns a HedSchema if a string version") - self.assertEqual(schemas1.version_number, "1.0.0", "load_schema_version has the right version") - self.assertEqual(schemas1.library, "score", "load_schema_version works with single library no namespace") - self.assertEqual(schemas1.get_formatted_version(), '"score_1.0.0"', - "load_schema_version gives correct version_string with single library no namespace") - - ver2 = "base:score_1.0.0" - schemas2 = load_schema_version(ver2) - self.assertIsInstance(schemas2, HedSchema, "load_schema_version returns HedSchema version+namespace") - self.assertEqual(schemas2.version_number, "1.0.0", "load_schema_version has the right version with namespace") - self.assertEqual(schemas2._namespace, "base:", "load_schema_version has the right version with namespace") - self.assertEqual(schemas2.get_formatted_version(), '"base:score_1.0.0"', - "load_schema_version gives correct version_string with single library with namespace") - self.assertEqual(schemas2.name, "base:score_1.0.0") - ver3 = ["8.0.0", "sc:score_1.0.0"] - schemas3 = load_schema_version(ver3) - self.assertIsInstance(schemas3, HedSchemaGroup, "load_schema_version returns HedSchema version+namespace") - self.assertIsInstance(schemas3._schemas, dict, "load_schema_version group keeps dictionary of hed versions") - self.assertEqual(len(schemas3._schemas), 2, "load_schema_version group dictionary is right length") - self.assertEqual(schemas3.name, "8.0.0,sc:score_1.0.0") - s = schemas3._schemas[""] - self.assertEqual(s.version_number, "8.0.0", "load_schema_version has the right version with namespace") - self.assertEqual(schemas3.get_formatted_version(), '["8.0.0", "sc:score_1.0.0"]', - "load_schema_version gives correct version_string with single library with namespace") - formatted_list = schemas3.get_formatted_version() - schemas4 = load_schema_version(formatted_list) - self.assertIsInstance(schemas4, HedSchemaGroup, "load_schema_version returns HedSchema version+namespace") - self.assertIsInstance(schemas4._schemas, dict, "load_schema_version group keeps dictionary of hed versions") - self.assertEqual(len(schemas4._schemas), 2, "load_schema_version group dictionary is right length") - self.assertEqual(schemas4.get_formatted_version(), '["8.0.0", "sc:score_1.0.0"]', - "load_schema_version gives correct version_string with multiple prefixes") - self.assertEqual(schemas4.name, "8.0.0,sc:score_1.0.0") - s = schemas4._schemas["sc:"] - self.assertEqual(s.version_number, "1.0.0", "load_schema_version has the right version with namespace") - with self.assertRaises(KeyError) as context: - schemas4._schemas["ts:"] - self.assertEqual(context.exception.args[0], 'ts:') - - with self.assertRaises(HedFileError) as context: - load_schema_version("[Malformed,,json]") - - # Invalid prefix - with self.assertRaises(HedFileError) as context: - load_schema_version("sc1:score_1.0.0") - - with self.assertRaises(HedFileError) as context: - load_schema_version("sc1:") - - -class TestHedSchemaUnmerged(unittest.TestCase): - # Verify the hed cache can handle loading unmerged with_standard schemas in case they are ever used - @classmethod - def setUpClass(cls): - hed_cache_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../schema_cache_test_local_unmerged/') - if os.path.exists(hed_cache_dir) and os.path.isdir(hed_cache_dir): - shutil.rmtree(hed_cache_dir) - _load_schema_version.cache_clear() - cls.hed_cache_dir = hed_cache_dir - cls.saved_cache_folder = hed_cache.HED_CACHE_DIRECTORY - schema.set_cache_directory(cls.hed_cache_dir) - - # Copy source as dupe into cache for easily testing dupe detection - cls.dupe_library_name = "testscoredupe_1.1.0" - cls.source_library_name = "score_1.1.0" - - for filename in os.listdir(hed_cache.INSTALLED_CACHE_LOCATION): - loaded_schema = schema.load_schema(os.path.join(hed_cache.INSTALLED_CACHE_LOCATION, filename)) - loaded_schema.save_as_xml(os.path.join(cls.hed_cache_dir, filename), save_merged=False) - if filename == f"HED_{cls.source_library_name}.xml": - new_filename = f"HED_{cls.dupe_library_name}.xml" - loaded_schema.save_as_xml(os.path.join(cls.hed_cache_dir, new_filename), save_merged=False) - - - @classmethod - def tearDownClass(cls): - shutil.rmtree(cls.hed_cache_dir) - schema.set_cache_directory(cls.saved_cache_folder) - _load_schema_version.cache_clear() - - def test_load_schema_version(self): - ver1 = "8.0.0" - schemas1 = load_schema_version(ver1) - self.assertIsInstance(schemas1, HedSchema, "load_schema_version returns a HedSchema if a string version") - self.assertEqual(schemas1.version_number, "8.0.0", "load_schema_version has the right version") - self.assertEqual(schemas1.library, "", "load_schema_version standard schema has no library") - ver2 = "base:8.0.0" - schemas2 = load_schema_version(ver2) - self.assertIsInstance(schemas2, HedSchema, "load_schema_version returns HedSchema version+namespace") - self.assertEqual(schemas2.version_number, "8.0.0", "load_schema_version has the right version with namespace") - self.assertEqual(schemas2._namespace, "base:", "load_schema_version has the right version with namespace") - ver3 = ["base:8.0.0"] - schemas3 = load_schema_version(ver3) - self.assertIsInstance(schemas3, HedSchema, "load_schema_version returns HedSchema version+namespace") - self.assertEqual(schemas3.version_number, "8.0.0", "load_schema_version has the right version with namespace") - self.assertEqual(schemas3._namespace, "base:", "load_schema_version has the right version with namespace") - - def test_load_schema_version_merged(self): - ver4 = ["testlib_2.0.0", "score_1.1.0"] - schemas3 = load_schema_version(ver4) - issues = schemas3.check_compliance() - self.assertIsInstance(schemas3, HedSchema, "load_schema_version returns HedSchema version+namespace") - self.assertTrue(schemas3.version_number, "load_schema_version has the right version with namespace") - self.assertEqual(schemas3._namespace, "", "load_schema_version has the right version with namespace") - self.assertEqual(len(issues), 11) - - def test_load_schema_version_merged_duplicates(self): - ver4 = ["score_1.1.0", "testscoredupe_1.1.0"] - with self.assertRaises(HedFileError) as context: - load_schema_version(ver4) - self.assertEqual(len(context.exception.issues), 597) - - def test_load_and_verify_tags(self): - # Load 'testlib' by itself - testlib = load_schema_version('testlib_2.0.0') - - # Load 'score' by itself - score = load_schema_version('score_1.1.0') - - # Load both 'testlib' and 'score' together - schemas3 = load_schema_version(["testlib_2.0.0", "score_1.1.0"]) - - # Extract the tag names from each library - testlib_tags = set(testlib.tags.all_names.keys()) - score_tags = set(score.tags.all_names.keys()) - merged_tags = set(schemas3.tags.all_names.keys()) - - # Verify that all tags in 'testlib' and 'score' are in the merged library - for tag in testlib_tags: - self.assertIn(tag, merged_tags, f"Tag {tag} from testlib is missing in the merged schema.") - - for tag in score_tags: - self.assertIn(tag, merged_tags, f"Tag {tag} from score is missing in the merged schema.") - - # Negative test cases - # Ensure merged_tags is not a subset of testlib_tags or score_tags - self.assertFalse(merged_tags.issubset(testlib_tags), "The merged tags should not be a subset of testlib tags.") - self.assertFalse(merged_tags.issubset(score_tags), "The merged tags should not be a subset of score tags.") - - # Ensure there are tags that came uniquely from each library - unique_testlib_tags = testlib_tags - score_tags - unique_score_tags = score_tags - testlib_tags - - self.assertTrue(any(tag in merged_tags for tag in unique_testlib_tags), - "There should be unique tags from testlib in the merged schema.") - self.assertTrue(any(tag in merged_tags for tag in unique_score_tags), - "There should be unique tags from score in the merged schema.") - - -class TestHedSchemaMerging(unittest.TestCase): - # Verify all 5 schemas produce the same results - base_schema_dir = '../data/schema_tests/merge_tests/' - - @classmethod - def setUpClass(cls): - cls.full_base_folder = os.path.join(os.path.dirname(os.path.realpath(__file__)), cls.base_schema_dir) - - def _base_merging_test(self, files): - import filecmp - path1 = "" - path2 = "" - for save_merged in [True, False]: - for i in range(len(files) - 1): - s1 = files[i] - s2 = files[i + 1] - self.assertEqual(s1, s2) - filename1 = get_temp_filename(".xml") - filename2 = get_temp_filename(".xml") - try: - s1.save_as_xml(filename1, save_merged=save_merged) - s2.save_as_xml(filename2, save_merged=save_merged) - result = filecmp.cmp(filename1, filename2) - # print(s1.filename) - # print(s2.filename) - self.assertTrue(result) - reload1 = load_schema(filename1) - reload2 = load_schema(filename2) - self.assertEqual(reload1, reload2) - except Exception: - self.assertTrue(False) - finally: - os.remove(filename1) - os.remove(filename2) - - try: - filename1 = get_temp_filename(".mediawiki") - filename2 = get_temp_filename(".mediawiki") - s1.save_as_mediawiki(filename1, save_merged=save_merged) - s2.save_as_mediawiki(filename2, save_merged=save_merged) - result = filecmp.cmp(filename1, filename2) - self.assertTrue(result) - - reload1 = load_schema(filename1) - reload2 = load_schema(filename2) - self.assertEqual(reload1, reload2) - except Exception: - self.assertTrue(False) - finally: - os.remove(filename1) - os.remove(filename2) - - lines1 = s1.get_as_mediawiki_string(save_merged=save_merged) - lines2 = s2.get_as_mediawiki_string(save_merged=save_merged) - self.assertEqual(lines1, lines2) - - lines1 = s1.get_as_xml_string(save_merged=save_merged) - lines2 = s2.get_as_xml_string(save_merged=save_merged) - self.assertEqual(lines1, lines2) - - def test_saving_merged(self): - files = [ - load_schema(os.path.join(self.full_base_folder, "HED_score_1.1.0.mediawiki")), - load_schema(os.path.join(self.full_base_folder, "HED_score_lib_tags.mediawiki")), - load_schema(os.path.join(self.full_base_folder, "HED_score_merged.mediawiki")), - load_schema(os.path.join(self.full_base_folder, "HED_score_merged.xml")), - load_schema(os.path.join(self.full_base_folder, "HED_score_lib_tags.xml")) - ] - - self._base_merging_test(files) - - def test_saving_merged_rooted(self): - files = [ - load_schema(os.path.join(self.full_base_folder, "basic_root.mediawiki")), - load_schema(os.path.join(self.full_base_folder, "basic_root.xml")), - ] - - self._base_merging_test(files) - - def test_saving_merged_rooted_sorting(self): - files = [ - load_schema(os.path.join(self.full_base_folder, "sorted_root.mediawiki")), - load_schema(os.path.join(self.full_base_folder, "sorted_root_merged.xml")), - ] - - self._base_merging_test(files) - - @with_temp_file(".mediawiki") - def test_saving_bad_sort(self, filename): - loaded_schema = load_schema(os.path.join(self.full_base_folder, "bad_sort_test.mediawiki")) - loaded_schema.save_as_mediawiki(filename) - reloaded_schema = load_schema(filename) - - self.assertEqual(loaded_schema, reloaded_schema) - - def _base_added_class_tests(self, schema): - tag_entry = schema.tags["Modulator"] - self.assertEqual(tag_entry.attributes["suggestedTag"], "Event") - - tag_entry = schema.tags["Sleep-modulator"] - self.assertEqual(tag_entry.attributes["relatedTag"], "Sensory-event") - - unit_class_entry = schema.unit_classes["weightUnits"] - unit_entry = unit_class_entry.units["testUnit"] - self.assertEqual(unit_entry.attributes[HedKey.ConversionFactor], str(100)) - - unit_modifier_entry = schema.unit_modifiers["huge"] - self.assertEqual(unit_modifier_entry.attributes[HedKey.ConversionFactor], "10^100") - self.assertTrue(unit_modifier_entry.attributes["customElementAttribute"]) - - value_class_entry = schema.value_classes["customValueClass"] - self.assertEqual(value_class_entry.attributes["customAttribute"], "test_attribute_value") - - attribute_entry = schema.attributes["customAttribute"] - self.assertTrue(attribute_entry.attributes["valueClassProperty"]) - - attribute_entry = schema.attributes["customElementAttribute"] - self.assertTrue(attribute_entry.attributes["elementProperty"]) - self.assertTrue(attribute_entry.attributes["boolProperty"]) - - prop_entry = schema.properties["customProperty"] - self.assertEqual(prop_entry.attributes["inLibrary"], "score") - self.assertTrue(prop_entry.attributes["customElementAttribute"]) - - for section in schema._sections.values(): - self.assertTrue("customElementAttribute" in section.valid_attributes) - - self.assertFalse(schema.check_compliance()) - - def test_saving_merged2(self): - s1 = load_schema(os.path.join(self.full_base_folder, "add_all_types.mediawiki")) - self._base_added_class_tests(s1) - for save_merged in [True, False]: - path1 = get_temp_filename(".xml") - path2 = get_temp_filename(".mediawiki") - try: - s1.save_as_xml(path1, save_merged=save_merged) - s2 = load_schema(path1) - self.assertEqual(s1, s2) - self._base_added_class_tests(s2) - - s1.save_as_mediawiki(path2, save_merged=save_merged) - s2 = load_schema(path2) - self.assertEqual(s1, s2) - self._base_added_class_tests(s2) - finally: - os.remove(path1) - os.remove(path2) - - def test_bad_schemas(self): - """These should all have one SCHEMA_DUPLICATE_NODE issue""" - files = [ - load_schema(os.path.join(self.full_base_folder, "issues_tests/overlapping_tags1.mediawiki")), - load_schema(os.path.join(self.full_base_folder, "issues_tests/overlapping_tags2.mediawiki")), - load_schema(os.path.join(self.full_base_folder, "issues_tests/overlapping_tags3.mediawiki")), - load_schema(os.path.join(self.full_base_folder, "issues_tests/overlapping_tags4.mediawiki")), - load_schema(os.path.join(self.full_base_folder, "issues_tests/overlapping_unit_classes.mediawiki")), - load_schema(os.path.join(self.full_base_folder, "issues_tests/overlapping_units.mediawiki")), - load_schema(os.path.join(self.full_base_folder, "issues_tests/HED_dupesubroot_0.0.1.mediawiki")) - ] - expected_code = [ - HedExceptions.SCHEMA_LIBRARY_INVALID, - HedExceptions.SCHEMA_LIBRARY_INVALID, - HedExceptions.SCHEMA_LIBRARY_INVALID, - HedExceptions.SCHEMA_LIBRARY_INVALID, - HedExceptions.SCHEMA_LIBRARY_INVALID, - HedExceptions.SCHEMA_LIBRARY_INVALID, - SchemaErrors.SCHEMA_DUPLICATE_NODE, - ] - for schema, expected_code in zip(files, expected_code): - # print(schema.filename) - issues = schema.check_compliance() - # for issue in issues: - # print(str(issue)) - self.assertEqual(len(issues), 1) - self.assertEqual(issues[0]["code"], expected_code) - - def test_cannot_load_schemas(self): - files = [ - os.path.join(self.full_base_folder, "issues_tests/HED_badroot_0.0.1.mediawiki"), - os.path.join(self.full_base_folder, "issues_tests/HED_root_wrong_place_0.0.1.mediawiki"), - os.path.join(self.full_base_folder, "issues_tests/HED_root_invalid1.mediawiki"), - os.path.join(self.full_base_folder, "issues_tests/HED_root_invalid2.mediawiki"), - os.path.join(self.full_base_folder, "issues_tests/HED_root_invalid3.mediawiki"), - - ] - for file in files: - with self.assertRaises(HedFileError) as context: - load_schema(file) - self.assertEqual(context.exception.code, HedExceptions.SCHEMA_LIBRARY_INVALID) - - def test_saving_in_library_wiki(self): - old_score_schema = load_schema_version("score_1.0.0") - - tag_entry = old_score_schema.get_tag_entry("Modulator") - self.assertTrue(tag_entry.has_attribute(HedKey.InLibrary)) - - schema_string = old_score_schema.get_as_mediawiki_string() - score_count = schema_string.count("inLibrary=score") - self.assertEqual(score_count, 0, "InLibrary should not be saved to the file") - - # This should make no difference - schema_string = old_score_schema.get_as_mediawiki_string(save_merged=True) - score_count = schema_string.count("inLibrary=score") - self.assertEqual(score_count, 0, "InLibrary should not be saved to the file") - - score_schema = load_schema_version("score_1.1.0") - - tag_entry = score_schema.get_tag_entry("Modulator") - self.assertTrue(tag_entry.has_attribute(HedKey.InLibrary)) - schema_string = score_schema.get_as_mediawiki_string(save_merged=False) - score_count = schema_string.count("inLibrary=score") - self.assertEqual(score_count, 0, "InLibrary should not be saved to the file") - - schema_string = score_schema.get_as_mediawiki_string(save_merged=True) - score_count = schema_string.count("inLibrary=score") - self.assertEqual(score_count, 853, "There should be 853 in library entries in the saved score schema") - - def test_saving_in_library_xml(self): - old_score_schema = load_schema_version("score_1.0.0") - - tag_entry = old_score_schema.get_tag_entry("Modulator") - self.assertTrue(tag_entry.has_attribute(HedKey.InLibrary)) - - schema_string = old_score_schema.get_as_xml_string() - score_count = schema_string.count("inLibrary") - self.assertEqual(score_count, 0, "InLibrary should not be saved to the file") - - # This should make no difference - schema_string = old_score_schema.get_as_xml_string(save_merged=True) - score_count = schema_string.count("inLibrary") - self.assertEqual(score_count, 0, "InLibrary should not be saved to the file") - - score_schema = load_schema_version("score_1.1.0") - - tag_entry = score_schema.get_tag_entry("Modulator") - self.assertTrue(tag_entry.has_attribute(HedKey.InLibrary)) - schema_string = score_schema.get_as_xml_string(save_merged=False) - score_count = schema_string.count("inLibrary") - self.assertEqual(score_count, 0, "InLibrary should not be saved to the file") - - schema_string = score_schema.get_as_xml_string(save_merged=True) - score_count = schema_string.count("inLibrary") - # One extra because this also finds the attribute definition, whereas in wiki it's a different format. - self.assertEqual(score_count, 854, "There should be 854 in library entries in the saved score schema") - - -class TestParseVersionList(unittest.TestCase): - def test_empty_and_single_library(self): - """Test that an empty list returns an empty dictionary and a single library is handled correctly.""" - self.assertEqual(parse_version_list([]), {}) - self.assertEqual(parse_version_list(["score"]), {"": "score"}) - - def test_multiple_libraries_without_and_with_prefix(self): - """Test that multiple libraries without a prefix and with the same prefix are handled correctly.""" - self.assertEqual(parse_version_list(["score", "testlib"]), {"": "score,testlib"}) - self.assertEqual(parse_version_list(["test:score", "test:testlib"]), {"test": "test:score,testlib"}) - - def test_single_and_multiple_libraries_with_different_prefixes(self): - """Test that a single library with a prefix and multiple libraries with different prefixes are handled correctly.""" - self.assertEqual(parse_version_list(["ol:otherlib"]), {"ol": "ol:otherlib"}) - self.assertEqual(parse_version_list(["score", "ol:otherlib", "ul:anotherlib"]), {"": "score", "ol": "ol:otherlib", "ul": "ul:anotherlib"}) - - def test_duplicate_library_raises_error(self): - """Test that duplicate libraries raise the correct error.""" - with self.assertRaises(HedFileError): - parse_version_list(["score", "score"]) - with self.assertRaises(HedFileError): - parse_version_list(["ol:otherlib", "ol:otherlib"]) - - def test_triple_prefixes(self): - """Test that libraries with triple prefixes are handled correctly.""" - self.assertEqual(parse_version_list(["test:score", "ol:otherlib", "test:testlib", "abc:anotherlib"]), - {"test": "test:score,testlib", "ol": "ol:otherlib", "abc": "abc:anotherlib"}) - - -# class TestOwlBase(unittest.TestCase): -# @classmethod -# def setUpClass(cls): -# cls.base_schema = schema.load_schema_version("8.3.0") -# -# @with_temp_file(".owl") -# def test_schema2xml(self, filename): -# self.base_schema.save_as_owl(filename) -# loaded_schema = schema.load_schema(filename) -# -# self.assertEqual(loaded_schema, self.base_schema) -# -# self.base_schema.save_as_owl(filename, save_merged=True) -# loaded_schema = schema.load_schema(filename) -# -# self.assertEqual(loaded_schema, self.base_schema) -# -# @with_temp_file(".ttl") -# def test_schema2turtle(self, filename): -# self.base_schema.save_as_owl(filename) -# loaded_schema = schema.load_schema(filename) -# -# self.assertEqual(loaded_schema, self.base_schema) -# -# self.base_schema.save_as_owl(filename, save_merged=True) -# loaded_schema = schema.load_schema(filename) -# -# self.assertEqual(loaded_schema, self.base_schema) -# -# @with_temp_file(".json-ld") -# def test_schema2jsonld(self, filename): -# self.base_schema.save_as_owl(filename) -# loaded_schema = schema.load_schema(filename) -# -# self.assertEqual(loaded_schema, self.base_schema) -# -# self.base_schema.save_as_owl(filename, save_merged=True) -# loaded_schema = schema.load_schema(filename) -# -# self.assertEqual(loaded_schema, self.base_schema) -# -# def test_schema2owlstring(self): -# owl_string = self.base_schema.get_as_owl_string(file_format="turtle") -# loaded_schema = schema.from_string(owl_string, schema_format="turtle") -# -# self.assertEqual(loaded_schema, self.base_schema) -# -# owl_string = self.base_schema.get_as_owl_string(save_merged=True, file_format="turtle") -# loaded_schema = schema.from_string(owl_string, schema_format="turtle") -# -# self.assertEqual(loaded_schema, self.base_schema) -# -# def test_schema2bad_filename(self): -# with self.assertRaises(OSError): -# self.base_schema.save_as_owl("", file_format="xml") -# with self.assertRaises(OSError): -# self.base_schema.save_as_owl("/////////", file_format="xml") -# -# def test_schema2bad_filename_rdf_format(self): -# with self.assertRaises(rdflib.plugin.PluginException): -# self.base_schema.save_as_owl("valid_filename.invalid_extension") -# with self.assertRaises(rdflib.plugin.PluginException): -# self.base_schema.save_as_owl("") -# with self.assertRaises(rdflib.plugin.PluginException): -# self.base_schema.save_as_owl("", file_format="unknown") -# -# -# class TestOwlLibRooted(TestOwlBase): -# @classmethod -# def setUpClass(cls): -# cls.base_schema = schema.load_schema_version("testlib_2.0.0") -# -# -# class TestOwlLib(TestOwlBase): -# @classmethod -# def setUpClass(cls): -# cls.base_schema = schema.load_schema_version("score_1.1.0") +import unittest + +from hed.errors import HedFileError +from hed.errors.error_types import SchemaErrors +from hed.schema import load_schema, HedSchemaGroup, load_schema_version, HedSchema +from hed.schema.hed_schema_io import parse_version_list, _load_schema_version +from tests.schema.test_schema_converters import with_temp_file, get_temp_filename + +import os +from hed.errors import HedExceptions +from hed.schema import HedKey +from hed.schema import hed_cache +from hed import schema +import shutil + + +# todo: speed up these tests +class TestHedSchema(unittest.TestCase): + + # def test_load_invalid_schema(self): + # # Handle missing or invalid files. + # invalid_xml_file = "invalidxmlfile.xml" + # hed_schema = None + # try: + # hed_schema = load_schema(invalid_xml_file) + # except HedFileError: + # pass + # + # self.assertFalse(hed_schema) + # + # hed_schema = None + # try: + # hed_schema = load_schema(None) + # except HedFileError: + # pass + # self.assertFalse(hed_schema) + # + # hed_schema = None + # try: + # hed_schema = load_schema("") + # except HedFileError: + # pass + # self.assertFalse(hed_schema) + # + # def test_load_schema_version_tags(self): + # schema = load_schema_version(xml_version="st:8.0.0") + # schema2 = load_schema_version(xml_version="8.0.0") + # self.assertNotEqual(schema, schema2) + # schema2.set_schema_prefix("st") + # self.assertEqual(schema, schema2) + # + # score_lib = load_schema_version(xml_version="score_1.0.0") + # self.assertEqual(score_lib._namespace, "") + # self.assertTrue(score_lib.get_tag_entry("Modulator")) + # + # score_lib = load_schema_version(xml_version="sc:score_1.0.0") + # self.assertEqual(score_lib._namespace, "sc:") + # self.assertTrue(score_lib.get_tag_entry("Modulator", schema_namespace="sc:")) + + def test_load_schema_invalid_parameters(self): + bad_filename = "this_is_not_a_real_file.xml" + with self.assertRaises(HedFileError): + load_schema(bad_filename) + + bad_filename = "https://github.com/hed-standard/hed-python/bad_url.xml" + with self.assertRaises(HedFileError): + load_schema(bad_filename) + + def test_load_schema_name(self): + schema_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../data/schema_tests/HED8.2.0.mediawiki') + + hed_schema = load_schema(schema_path, schema_namespace="testspace", name="Test Name") + self.assertEqual(hed_schema.schema_namespace, "testspace:") + self.assertEqual(hed_schema.name, "Test Name") + + hed_schema = load_schema(schema_path, schema_namespace="testspace") + self.assertEqual(hed_schema.schema_namespace, "testspace:") + self.assertEqual(hed_schema.name, schema_path) + + def test_load_schema_version(self): + ver1 = "8.0.0" + schemas1 = load_schema_version(ver1) + self.assertIsInstance(schemas1, HedSchema, "load_schema_version returns a HedSchema if a string version") + self.assertEqual(schemas1.version_number, "8.0.0", "load_schema_version has the right version") + self.assertEqual(schemas1.library, "", "load_schema_version standard schema has no library") + self.assertEqual(schemas1.name, "8.0.0") + ver2 = "base:8.0.0" + schemas2 = load_schema_version(ver2) + self.assertIsInstance(schemas2, HedSchema, "load_schema_version returns HedSchema version+namespace") + self.assertEqual(schemas2.version_number, "8.0.0", "load_schema_version has the right version with namespace") + self.assertEqual(schemas2._namespace, "base:", "load_schema_version has the right version with namespace") + self.assertEqual(schemas2.name, "base:8.0.0") + ver3 = ["base:8.0.0"] + schemas3 = load_schema_version(ver3) + self.assertIsInstance(schemas3, HedSchema, "load_schema_version returns HedSchema version+namespace") + self.assertEqual(schemas3.version_number, "8.0.0", "load_schema_version has the right version with namespace") + self.assertEqual(schemas3._namespace, "base:", "load_schema_version has the right version with namespace") + self.assertEqual(schemas3.name, "base:8.0.0") + + def test_load_schema_version_merged(self): + ver4 = ["testlib_2.0.0", "score_1.1.0"] + schemas3 = load_schema_version(ver4) + issues = schemas3.check_compliance() + self.assertIsInstance(schemas3, HedSchema, "load_schema_version returns HedSchema version+namespace") + self.assertTrue(schemas3.version_number, "load_schema_version has the right version with namespace") + self.assertEqual(schemas3.schema_namespace, "", "load_schema_version has the right version with namespace") + self.assertEqual(schemas3.name, "testlib_2.0.0,score_1.1.0") + self.assertEqual(schemas3.version, "testlib_2.0.0,score_1.1.0") + # Deprecated tag warnings + self.assertEqual(len(issues), 11) + + # Verify this cannot be saved + with self.assertRaises(HedFileError): + schemas3.save_as_mediawiki("filename") + + def test_verify_utf8_dupe(self): + base_dir = os.path.join(os.path.dirname(__file__), "../data/schema_tests") + schema_path = os.path.join(base_dir, "schema_utf8_dupe.mediawiki") + schema = load_schema(schema_path) + issues = schema.check_compliance() + # This can be 1 or 2, depending on if the "pre-release" warning shows up. + self.assertTrue(1 <= len(issues) <= 2) + + # Note it finds both of these as a duplicate + self.assertTrue(schema.get_tag_entry("Wßord")) + self.assertTrue(schema.get_tag_entry("Wssord")) + + def test_load_and_verify_tags(self): + # Load 'testlib' by itself + testlib = load_schema_version('testlib_2.0.0') + + # Load 'score' by itself + score = load_schema_version('score_1.1.0') + + # Load both 'testlib' and 'score' together + schemas3 = load_schema_version(["testlib_2.0.0", "score_1.1.0"]) + + # Extract the tag names from each library + testlib_tags = set(testlib.tags.all_names.keys()) + score_tags = set(score.tags.all_names.keys()) + merged_tags = set(schemas3.tags.all_names.keys()) + + # Verify that all tags in 'testlib' and 'score' are in the merged library + for tag in testlib_tags: + self.assertIn(tag, merged_tags, f"Tag {tag} from testlib is missing in the merged schema.") + + for tag in score_tags: + self.assertIn(tag, merged_tags, f"Tag {tag} from score is missing in the merged schema.") + + # Negative test cases + # Ensure merged_tags is not a subset of testlib_tags or score_tags + self.assertFalse(merged_tags.issubset(testlib_tags), "The merged tags should not be a subset of testlib tags.") + self.assertFalse(merged_tags.issubset(score_tags), "The merged tags should not be a subset of score tags.") + + # Ensure there are tags that came uniquely from each library + unique_testlib_tags = testlib_tags - score_tags + unique_score_tags = score_tags - testlib_tags + + self.assertTrue(any(tag in merged_tags for tag in unique_testlib_tags), + "There should be unique tags from testlib in the merged schema.") + self.assertTrue(any(tag in merged_tags for tag in unique_score_tags), + "There should be unique tags from score in the merged schema.") + + def test_load_schema_version_libraries(self): + ver1 = "score_1.0.0" + schemas1 = load_schema_version(ver1) + self.assertIsInstance(schemas1, HedSchema, "load_schema_version returns a HedSchema if a string version") + self.assertEqual(schemas1.version_number, "1.0.0", "load_schema_version has the right version") + self.assertEqual(schemas1.library, "score", "load_schema_version works with single library no namespace") + self.assertEqual(schemas1.get_formatted_version(), '"score_1.0.0"', + "load_schema_version gives correct version_string with single library no namespace") + + ver2 = "base:score_1.0.0" + schemas2 = load_schema_version(ver2) + self.assertIsInstance(schemas2, HedSchema, "load_schema_version returns HedSchema version+namespace") + self.assertEqual(schemas2.version_number, "1.0.0", "load_schema_version has the right version with namespace") + self.assertEqual(schemas2._namespace, "base:", "load_schema_version has the right version with namespace") + self.assertEqual(schemas2.get_formatted_version(), '"base:score_1.0.0"', + "load_schema_version gives correct version_string with single library with namespace") + self.assertEqual(schemas2.name, "base:score_1.0.0") + ver3 = ["8.0.0", "sc:score_1.0.0"] + schemas3 = load_schema_version(ver3) + self.assertIsInstance(schemas3, HedSchemaGroup, "load_schema_version returns HedSchema version+namespace") + self.assertIsInstance(schemas3._schemas, dict, "load_schema_version group keeps dictionary of hed versions") + self.assertEqual(len(schemas3._schemas), 2, "load_schema_version group dictionary is right length") + self.assertEqual(schemas3.name, "8.0.0,sc:score_1.0.0") + s = schemas3._schemas[""] + self.assertEqual(s.version_number, "8.0.0", "load_schema_version has the right version with namespace") + self.assertEqual(schemas3.get_formatted_version(), '["8.0.0", "sc:score_1.0.0"]', + "load_schema_version gives correct version_string with single library with namespace") + formatted_list = schemas3.get_formatted_version() + schemas4 = load_schema_version(formatted_list) + self.assertIsInstance(schemas4, HedSchemaGroup, "load_schema_version returns HedSchema version+namespace") + self.assertIsInstance(schemas4._schemas, dict, "load_schema_version group keeps dictionary of hed versions") + self.assertEqual(len(schemas4._schemas), 2, "load_schema_version group dictionary is right length") + self.assertEqual(schemas4.get_formatted_version(), '["8.0.0", "sc:score_1.0.0"]', + "load_schema_version gives correct version_string with multiple prefixes") + self.assertEqual(schemas4.name, "8.0.0,sc:score_1.0.0") + s = schemas4._schemas["sc:"] + self.assertEqual(s.version_number, "1.0.0", "load_schema_version has the right version with namespace") + with self.assertRaises(KeyError) as context: + schemas4._schemas["ts:"] + self.assertEqual(context.exception.args[0], 'ts:') + + with self.assertRaises(HedFileError) as context: + load_schema_version("[Malformed,,json]") + + # Invalid prefix + with self.assertRaises(HedFileError) as context: + load_schema_version("sc1:score_1.0.0") + + with self.assertRaises(HedFileError) as context: + load_schema_version("sc1:") + + +class TestHedSchemaUnmerged(unittest.TestCase): + # Verify the hed cache can handle loading unmerged with_standard schemas in case they are ever used + @classmethod + def setUpClass(cls): + hed_cache_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../schema_cache_test_local_unmerged/') + if os.path.exists(hed_cache_dir) and os.path.isdir(hed_cache_dir): + shutil.rmtree(hed_cache_dir) + _load_schema_version.cache_clear() + cls.hed_cache_dir = hed_cache_dir + cls.saved_cache_folder = hed_cache.HED_CACHE_DIRECTORY + schema.set_cache_directory(cls.hed_cache_dir) + + # Copy source as dupe into cache for easily testing dupe detection + cls.dupe_library_name = "testscoredupe_1.1.0" + cls.source_library_name = "score_1.1.0" + + for filename in os.listdir(hed_cache.INSTALLED_CACHE_LOCATION): + final_filename = os.path.join(hed_cache.INSTALLED_CACHE_LOCATION, filename) + if os.path.isdir(final_filename): + continue + loaded_schema = schema.load_schema(final_filename) + loaded_schema.save_as_xml(os.path.join(cls.hed_cache_dir, filename), save_merged=False) + if filename == f"HED_{cls.source_library_name}.xml": + new_filename = f"HED_{cls.dupe_library_name}.xml" + loaded_schema.save_as_xml(os.path.join(cls.hed_cache_dir, new_filename), save_merged=False) + + @classmethod + def tearDownClass(cls): + shutil.rmtree(cls.hed_cache_dir) + schema.set_cache_directory(cls.saved_cache_folder) + _load_schema_version.cache_clear() + + def test_load_schema_version(self): + ver1 = "8.0.0" + schemas1 = load_schema_version(ver1) + self.assertIsInstance(schemas1, HedSchema, "load_schema_version returns a HedSchema if a string version") + self.assertEqual(schemas1.version_number, "8.0.0", "load_schema_version has the right version") + self.assertEqual(schemas1.library, "", "load_schema_version standard schema has no library") + ver2 = "base:8.0.0" + schemas2 = load_schema_version(ver2) + self.assertIsInstance(schemas2, HedSchema, "load_schema_version returns HedSchema version+namespace") + self.assertEqual(schemas2.version_number, "8.0.0", "load_schema_version has the right version with namespace") + self.assertEqual(schemas2._namespace, "base:", "load_schema_version has the right version with namespace") + ver3 = ["base:8.0.0"] + schemas3 = load_schema_version(ver3) + self.assertIsInstance(schemas3, HedSchema, "load_schema_version returns HedSchema version+namespace") + self.assertEqual(schemas3.version_number, "8.0.0", "load_schema_version has the right version with namespace") + self.assertEqual(schemas3._namespace, "base:", "load_schema_version has the right version with namespace") + + def test_load_schema_version_merged(self): + ver4 = ["testlib_2.0.0", "score_1.1.0"] + schemas3 = load_schema_version(ver4) + issues = schemas3.check_compliance() + self.assertIsInstance(schemas3, HedSchema, "load_schema_version returns HedSchema version+namespace") + self.assertTrue(schemas3.version_number, "load_schema_version has the right version with namespace") + self.assertEqual(schemas3._namespace, "", "load_schema_version has the right version with namespace") + self.assertEqual(len(issues), 11) + + # This could be turned on after 2.0.0 and 1.0.0 added to local schema_data(this version will hit the internet) + # Also change the 2 below to a 0 + # def test_load_schema_version_merged2(self): + # ver4 = ["lang_1.0.0", "score_2.0.0"] + # schemas3 = load_schema_version(ver4) + # issues = schemas3.check_compliance() + # self.assertIsInstance(schemas3, HedSchema, "load_schema_version returns HedSchema version+namespace") + # self.assertTrue(schemas3.version_number, "load_schema_version has the right version with namespace") + # self.assertEqual(schemas3._namespace, "", "load_schema_version has the right version with namespace") + # self.assertEqual(len(issues), 2) + + def test_load_schema_version_merged_duplicates(self): + ver4 = ["score_1.1.0", "testscoredupe_1.1.0"] + with self.assertRaises(HedFileError) as context: + load_schema_version(ver4) + self.assertEqual(len(context.exception.issues), 597) + + def test_load_and_verify_tags(self): + # Load 'testlib' by itself + testlib = load_schema_version('testlib_2.0.0') + + # Load 'score' by itself + score = load_schema_version('score_1.1.0') + + # Load both 'testlib' and 'score' together + schemas3 = load_schema_version(["testlib_2.0.0", "score_1.1.0"]) + + # Extract the tag names from each library + testlib_tags = set(testlib.tags.all_names.keys()) + score_tags = set(score.tags.all_names.keys()) + merged_tags = set(schemas3.tags.all_names.keys()) + + # Verify that all tags in 'testlib' and 'score' are in the merged library + for tag in testlib_tags: + self.assertIn(tag, merged_tags, f"Tag {tag} from testlib is missing in the merged schema.") + + for tag in score_tags: + self.assertIn(tag, merged_tags, f"Tag {tag} from score is missing in the merged schema.") + + # Negative test cases + # Ensure merged_tags is not a subset of testlib_tags or score_tags + self.assertFalse(merged_tags.issubset(testlib_tags), "The merged tags should not be a subset of testlib tags.") + self.assertFalse(merged_tags.issubset(score_tags), "The merged tags should not be a subset of score tags.") + + # Ensure there are tags that came uniquely from each library + unique_testlib_tags = testlib_tags - score_tags + unique_score_tags = score_tags - testlib_tags + + self.assertTrue(any(tag in merged_tags for tag in unique_testlib_tags), + "There should be unique tags from testlib in the merged schema.") + self.assertTrue(any(tag in merged_tags for tag in unique_score_tags), + "There should be unique tags from score in the merged schema.") + + +class TestHedSchemaMerging(unittest.TestCase): + # Verify all 5 schemas produce the same results + base_schema_dir = '../data/schema_tests/merge_tests/' + + @classmethod + def setUpClass(cls): + cls.full_base_folder = os.path.join(os.path.dirname(os.path.realpath(__file__)), cls.base_schema_dir) + + def _base_merging_test(self, files): + import filecmp + + for save_merged in [True, False]: + for i in range(len(files) - 1): + s1 = files[i] + s2 = files[i + 1] + self.assertEqual(s1, s2) + filename1 = get_temp_filename(".xml") + filename2 = get_temp_filename(".xml") + try: + s1.save_as_xml(filename1, save_merged=save_merged) + s2.save_as_xml(filename2, save_merged=save_merged) + result = filecmp.cmp(filename1, filename2) + # print(s1.filename) + # print(s2.filename) + self.assertTrue(result) + reload1 = load_schema(filename1) + reload2 = load_schema(filename2) + self.assertEqual(reload1, reload2) + except Exception: + self.assertTrue(False) + finally: + os.remove(filename1) + os.remove(filename2) + + try: + filename1 = get_temp_filename(".mediawiki") + filename2 = get_temp_filename(".mediawiki") + s1.save_as_mediawiki(filename1, save_merged=save_merged) + s2.save_as_mediawiki(filename2, save_merged=save_merged) + result = filecmp.cmp(filename1, filename2) + self.assertTrue(result) + + reload1 = load_schema(filename1) + reload2 = load_schema(filename2) + self.assertEqual(reload1, reload2) + except Exception: + self.assertTrue(False) + finally: + os.remove(filename1) + os.remove(filename2) + + lines1 = s1.get_as_mediawiki_string(save_merged=save_merged) + lines2 = s2.get_as_mediawiki_string(save_merged=save_merged) + self.assertEqual(lines1, lines2) + + lines1 = s1.get_as_xml_string(save_merged=save_merged) + lines2 = s2.get_as_xml_string(save_merged=save_merged) + self.assertEqual(lines1, lines2) + + def test_saving_merged(self): + files = [ + load_schema(os.path.join(self.full_base_folder, "HED_score_1.1.0.mediawiki")), + load_schema(os.path.join(self.full_base_folder, "HED_score_unmerged.mediawiki")), + load_schema(os.path.join(self.full_base_folder, "HED_score_merged.mediawiki")), + load_schema(os.path.join(self.full_base_folder, "HED_score_merged.xml")), + load_schema(os.path.join(self.full_base_folder, "HED_score_unmerged.xml")) + ] + + self._base_merging_test(files) + + def test_saving_merged_rooted(self): + files = [ + load_schema(os.path.join(self.full_base_folder, "basic_root.mediawiki")), + load_schema(os.path.join(self.full_base_folder, "basic_root.xml")), + ] + + self._base_merging_test(files) + + def test_saving_merged_rooted_sorting(self): + files = [ + load_schema(os.path.join(self.full_base_folder, "sorted_root.mediawiki")), + load_schema(os.path.join(self.full_base_folder, "sorted_root_merged.xml")), + ] + + self._base_merging_test(files) + + @with_temp_file(".mediawiki") + def test_saving_bad_sort(self, filename): + loaded_schema = load_schema(os.path.join(self.full_base_folder, "bad_sort_test.mediawiki")) + loaded_schema.save_as_mediawiki(filename) + reloaded_schema = load_schema(filename) + + self.assertEqual(loaded_schema, reloaded_schema) + + def _base_added_class_tests(self, schema): + tag_entry = schema.tags["Modulator"] + self.assertEqual(tag_entry.attributes["suggestedTag"], "Event") + + tag_entry = schema.tags["Sleep-modulator"] + self.assertEqual(tag_entry.attributes["relatedTag"], "Sensory-event") + + unit_class_entry = schema.unit_classes["weightUnits"] + unit_entry = unit_class_entry.units["testUnit"] + self.assertEqual(unit_entry.attributes[HedKey.ConversionFactor], str(100)) + + unit_modifier_entry = schema.unit_modifiers["huge"] + self.assertEqual(unit_modifier_entry.attributes[HedKey.ConversionFactor], "10^100") + self.assertTrue(unit_modifier_entry.attributes["customElementAttribute"]) + + value_class_entry = schema.value_classes["customValueClass"] + self.assertEqual(value_class_entry.attributes["customAttribute"], "test_attribute_value") + + attribute_entry = schema.attributes["customAttribute"] + self.assertTrue(attribute_entry.attributes["valueClassProperty"]) + + attribute_entry = schema.attributes["customElementAttribute"] + self.assertTrue(attribute_entry.attributes["elementProperty"]) + self.assertTrue(attribute_entry.attributes["boolProperty"]) + + prop_entry = schema.properties["customProperty"] + self.assertEqual(prop_entry.attributes["inLibrary"], "score") + self.assertTrue(prop_entry.attributes["customElementAttribute"]) + + for section in schema._sections.values(): + self.assertTrue("customElementAttribute" in section.valid_attributes) + + self.assertFalse(schema.check_compliance()) + + def test_saving_merged2(self): + s1 = load_schema(os.path.join(self.full_base_folder, "add_all_types.mediawiki")) + self._base_added_class_tests(s1) + for save_merged in [True, False]: + path1 = get_temp_filename(".xml") + path2 = get_temp_filename(".mediawiki") + try: + s1.save_as_xml(path1, save_merged=save_merged) + s2 = load_schema(path1) + self.assertEqual(s1, s2) + self._base_added_class_tests(s2) + + s1.save_as_mediawiki(path2, save_merged=save_merged) + s2 = load_schema(path2) + self.assertEqual(s1, s2) + self._base_added_class_tests(s2) + finally: + os.remove(path1) + os.remove(path2) + + def test_bad_schemas(self): + """These should all have one SCHEMA_DUPLICATE_NODE issue""" + files = [ + load_schema(os.path.join(self.full_base_folder, "issues_tests/overlapping_tags1.mediawiki")), + load_schema(os.path.join(self.full_base_folder, "issues_tests/overlapping_tags2.mediawiki")), + load_schema(os.path.join(self.full_base_folder, "issues_tests/overlapping_tags3.mediawiki")), + load_schema(os.path.join(self.full_base_folder, "issues_tests/overlapping_tags4.mediawiki")), + load_schema(os.path.join(self.full_base_folder, "issues_tests/overlapping_unit_classes.mediawiki")), + load_schema(os.path.join(self.full_base_folder, "issues_tests/overlapping_units.mediawiki")), + load_schema(os.path.join(self.full_base_folder, "issues_tests/HED_dupesubroot_0.0.1.mediawiki")) + ] + expected_code = [ + HedExceptions.SCHEMA_LIBRARY_INVALID, + HedExceptions.SCHEMA_LIBRARY_INVALID, + HedExceptions.SCHEMA_LIBRARY_INVALID, + HedExceptions.SCHEMA_LIBRARY_INVALID, + HedExceptions.SCHEMA_LIBRARY_INVALID, + HedExceptions.SCHEMA_LIBRARY_INVALID, + SchemaErrors.SCHEMA_DUPLICATE_NODE, + ] + for schema1, expected_code in zip(files, expected_code): + # print(schema.filename) + issues = schema1.check_compliance() + # for issue in issues: + # print(str(issue)) + self.assertEqual(len(issues), 1) + self.assertEqual(issues[0]["code"], expected_code) + + def test_cannot_load_schemas(self): + files = [ + os.path.join(self.full_base_folder, "issues_tests/HED_badroot_0.0.1.mediawiki"), + os.path.join(self.full_base_folder, "issues_tests/HED_root_wrong_place_0.0.1.mediawiki"), + os.path.join(self.full_base_folder, "issues_tests/HED_root_invalid1.mediawiki"), + os.path.join(self.full_base_folder, "issues_tests/HED_root_invalid2.mediawiki"), + os.path.join(self.full_base_folder, "issues_tests/HED_root_invalid3.mediawiki"), + + ] + for file in files: + with self.assertRaises(HedFileError) as context: + load_schema(file) + self.assertEqual(context.exception.code, HedExceptions.SCHEMA_LIBRARY_INVALID) + + def test_saving_in_library_wiki(self): + old_score_schema = load_schema_version("score_1.0.0") + + tag_entry = old_score_schema.get_tag_entry("Modulator") + self.assertTrue(tag_entry.has_attribute(HedKey.InLibrary)) + + schema_string = old_score_schema.get_as_mediawiki_string() + score_count = schema_string.count("inLibrary=score") + self.assertEqual(score_count, 0, "InLibrary should not be saved to the file") + + # This should make no difference + schema_string = old_score_schema.get_as_mediawiki_string(save_merged=True) + score_count = schema_string.count("inLibrary=score") + self.assertEqual(score_count, 0, "InLibrary should not be saved to the file") + + score_schema = load_schema_version("score_1.1.0") + + tag_entry = score_schema.get_tag_entry("Modulator") + self.assertTrue(tag_entry.has_attribute(HedKey.InLibrary)) + schema_string = score_schema.get_as_mediawiki_string(save_merged=False) + score_count = schema_string.count("inLibrary=score") + self.assertEqual(score_count, 0, "InLibrary should not be saved to the file") + + schema_string = score_schema.get_as_mediawiki_string(save_merged=True) + score_count = schema_string.count("inLibrary=score") + self.assertEqual(score_count, 853, "There should be 853 in library entries in the saved score schema") + + def test_saving_in_library_xml(self): + old_score_schema = load_schema_version("score_1.0.0") + + tag_entry = old_score_schema.get_tag_entry("Modulator") + self.assertTrue(tag_entry.has_attribute(HedKey.InLibrary)) + + schema_string = old_score_schema.get_as_xml_string() + score_count = schema_string.count("inLibrary") + self.assertEqual(score_count, 0, "InLibrary should not be saved to the file") + + # This should make no difference + schema_string = old_score_schema.get_as_xml_string(save_merged=True) + score_count = schema_string.count("inLibrary") + self.assertEqual(score_count, 0, "InLibrary should not be saved to the file") + + score_schema = load_schema_version("score_1.1.0") + + tag_entry = score_schema.get_tag_entry("Modulator") + self.assertTrue(tag_entry.has_attribute(HedKey.InLibrary)) + schema_string = score_schema.get_as_xml_string(save_merged=False) + score_count = schema_string.count("inLibrary") + self.assertEqual(score_count, 0, "InLibrary should not be saved to the file") + + schema_string = score_schema.get_as_xml_string(save_merged=True) + score_count = schema_string.count("inLibrary") + # One extra because this also finds the attribute definition, whereas in wiki it's a different format. + self.assertEqual(score_count, 854, "There should be 854 in library entries in the saved score schema") + + +class TestParseVersionList(unittest.TestCase): + def test_empty_and_single_library(self): + """Test that an empty list returns an empty dictionary and a single library is handled correctly.""" + self.assertEqual(parse_version_list([]), {}) + self.assertEqual(parse_version_list(["score"]), {"": "score"}) + + def test_multiple_libraries_without_and_with_prefix(self): + """Test that multiple libraries without a prefix and with the same prefix are handled correctly.""" + self.assertEqual(parse_version_list(["score", "testlib"]), {"": "score,testlib"}) + self.assertEqual(parse_version_list(["test:score", "test:testlib"]), {"test": "test:score,testlib"}) + + def test_single_and_multiple_libraries_with_different_prefixes(self): + """Test a single library with a prefix and multiple libraries with different prefixes are handled correctly.""" + self.assertEqual(parse_version_list(["ol:otherlib"]), {"ol": "ol:otherlib"}) + self.assertEqual(parse_version_list(["score", "ol:otherlib", "ul:anotherlib"]), + {"": "score", "ol": "ol:otherlib", "ul": "ul:anotherlib"}) + + def test_duplicate_library_raises_error(self): + """Test that duplicate libraries raise the correct error.""" + with self.assertRaises(HedFileError): + parse_version_list(["score", "score"]) + with self.assertRaises(HedFileError): + parse_version_list(["ol:otherlib", "ol:otherlib"]) + + def test_triple_prefixes(self): + """Test that libraries with triple prefixes are handled correctly.""" + self.assertEqual(parse_version_list(["test:score", "ol:otherlib", "test:testlib", "abc:anotherlib"]), + {"test": "test:score,testlib", "ol": "ol:otherlib", "abc": "abc:anotherlib"}) + + +# class TestOwlBase(unittest.TestCase): +# @classmethod +# def setUpClass(cls): +# cls.base_schema = schema.load_schema_version("8.3.0") +# +# @with_temp_file(".owl") +# def test_schema2xml(self, filename): +# self.base_schema.save_as_owl(filename) +# loaded_schema = schema.load_schema(filename) +# +# self.assertEqual(loaded_schema, self.base_schema) +# +# self.base_schema.save_as_owl(filename, save_merged=True) +# loaded_schema = schema.load_schema(filename) +# +# self.assertEqual(loaded_schema, self.base_schema) +# +# @with_temp_file(".ttl") +# def test_schema2turtle(self, filename): +# self.base_schema.save_as_owl(filename) +# loaded_schema = schema.load_schema(filename) +# +# self.assertEqual(loaded_schema, self.base_schema) +# +# self.base_schema.save_as_owl(filename, save_merged=True) +# loaded_schema = schema.load_schema(filename) +# +# self.assertEqual(loaded_schema, self.base_schema) +# +# @with_temp_file(".json-ld") +# def test_schema2jsonld(self, filename): +# self.base_schema.save_as_owl(filename) +# loaded_schema = schema.load_schema(filename) +# +# self.assertEqual(loaded_schema, self.base_schema) +# +# self.base_schema.save_as_owl(filename, save_merged=True) +# loaded_schema = schema.load_schema(filename) +# +# self.assertEqual(loaded_schema, self.base_schema) +# +# def test_schema2owlstring(self): +# owl_string = self.base_schema.get_as_owl_string(file_format="turtle") +# loaded_schema = schema.from_string(owl_string, schema_format="turtle") +# +# self.assertEqual(loaded_schema, self.base_schema) +# +# owl_string = self.base_schema.get_as_owl_string(save_merged=True, file_format="turtle") +# loaded_schema = schema.from_string(owl_string, schema_format="turtle") +# +# self.assertEqual(loaded_schema, self.base_schema) +# +# def test_schema2bad_filename(self): +# with self.assertRaises(OSError): +# self.base_schema.save_as_owl("", file_format="xml") +# with self.assertRaises(OSError): +# self.base_schema.save_as_owl("/////////", file_format="xml") +# +# def test_schema2bad_filename_rdf_format(self): +# with self.assertRaises(rdflib.plugin.PluginException): +# self.base_schema.save_as_owl("valid_filename.invalid_extension") +# with self.assertRaises(rdflib.plugin.PluginException): +# self.base_schema.save_as_owl("") +# with self.assertRaises(rdflib.plugin.PluginException): +# self.base_schema.save_as_owl("", file_format="unknown") +# +# +# class TestOwlLibRooted(TestOwlBase): +# @classmethod +# def setUpClass(cls): +# cls.base_schema = schema.load_schema_version("testlib_2.0.0") +# +# +# class TestOwlLib(TestOwlBase): +# @classmethod +# def setUpClass(cls): +# cls.base_schema = schema.load_schema_version("score_1.1.0") diff --git a/tests/schema/test_hed_schema_io_df.py b/tests/schema/test_hed_schema_io_df.py index d8d37059b..a0bdd96ee 100644 --- a/tests/schema/test_hed_schema_io_df.py +++ b/tests/schema/test_hed_schema_io_df.py @@ -1,87 +1,175 @@ -import unittest -import shutil - -from hed.schema.hed_schema_io import load_schema, load_schema_version, from_dataframes - -import os -from hed.schema.schema_io.df2schema import SchemaLoaderDF - - -class TestHedSchemaDF(unittest.TestCase): - @classmethod - def setUpClass(cls): - cls.output_folder = "test_output/" - os.makedirs(cls.output_folder, exist_ok=True) - - @classmethod - def tearDownClass(cls): - shutil.rmtree(cls.output_folder) - - def test_saving_default_schemas(self): - schema = load_schema_version("8.3.0") - schema.save_as_dataframes(self.output_folder + "test_8.tsv") - - reloaded_schema = load_schema(self.output_folder + "test_8.tsv") - self.assertEqual(schema, reloaded_schema) - - schema = load_schema_version("score_1.1.0") - schema.save_as_dataframes(self.output_folder + "test_score.tsv", save_merged=True) - - reloaded_schema = load_schema(self.output_folder + "test_score.tsv") - self.assertEqual(schema, reloaded_schema) - - schema = load_schema_version("testlib_3.0.0") - schema.save_as_dataframes(self.output_folder + "test_testlib.tsv", save_merged=True) - - reloaded_schema = load_schema(self.output_folder + "test_testlib.tsv") - self.assertEqual(schema, reloaded_schema) - - schema = load_schema_version("testlib_3.0.0") - schema.save_as_dataframes(self.output_folder + "test_testlib2.tsv", save_merged=False) - - reloaded_schema = load_schema(self.output_folder + "test_testlib2.tsv") - self.assertEqual(schema, reloaded_schema) - - def test_from_dataframes(self): - schema = load_schema_version("8.3.0") - filename = self.output_folder + "test_8_string.tsv" - schema.save_as_dataframes(self.output_folder + "test_8_string.tsv") - - filenames = SchemaLoaderDF.convert_filenames_to_dict(filename) - new_file_strings = {} - for key, value in filenames.items(): - with open(value, "r") as f: - all_lines = f.readlines() - new_file_strings[key] = "".join(all_lines) - - reloaded_schema = from_dataframes(new_file_strings) - self.assertEqual(schema, reloaded_schema) - - schema = load_schema_version("8.3.0") - dfs = schema.get_as_dataframes() - reloaded_schema = from_dataframes(dfs) - self.assertEqual(schema, reloaded_schema) - - def test_save_load_location(self): - schema = load_schema_version("8.3.0") - schema_name = "test_output" - output_location = self.output_folder + schema_name - schema.save_as_dataframes(output_location) - expected_location = os.path.join(output_location, f"{schema_name}_Tag.tsv") - self.assertTrue(os.path.exists(expected_location)) - - reloaded_schema = load_schema(output_location) - - self.assertEqual(schema, reloaded_schema) - - def test_save_load_location2(self): - schema = load_schema_version("8.3.0") - schema_name = "test_output" - output_location = self.output_folder + schema_name + ".tsv" - schema.save_as_dataframes(output_location) - expected_location = self.output_folder + schema_name + "_Tag.tsv" - self.assertTrue(os.path.exists(expected_location)) - - reloaded_schema = load_schema(output_location) - - self.assertEqual(schema, reloaded_schema) +import unittest +import shutil +import os +import pandas as pd +from hed.errors import HedExceptions, HedFileError +from hed.schema.hed_schema_io import load_schema, load_schema_version, from_dataframes +from hed.schema import hed_schema_df_constants as df_constants +from hed.schema.schema_io.df_util import convert_filenames_to_dict, create_empty_dataframes + + +class TestHedSchemaDF(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.output_folder = "test_output/" + os.makedirs(cls.output_folder, exist_ok=True) + + @classmethod + def tearDownClass(cls): + shutil.rmtree(cls.output_folder) + + def test_saving_default_schemas(self): + schema = load_schema_version("8.3.0") + schema.save_as_dataframes(self.output_folder + "test_8.tsv") + + reloaded_schema = load_schema(self.output_folder + "test_8.tsv") + self.assertEqual(schema, reloaded_schema) + + schema = load_schema_version("score_1.1.0") + schema.save_as_dataframes(self.output_folder + "test_score.tsv", save_merged=True) + + reloaded_schema = load_schema(self.output_folder + "test_score.tsv") + self.assertEqual(schema, reloaded_schema) + + schema = load_schema_version("testlib_3.0.0") + schema.save_as_dataframes(self.output_folder + "test_testlib.tsv", save_merged=True) + + reloaded_schema = load_schema(self.output_folder + "test_testlib.tsv") + self.assertEqual(schema, reloaded_schema) + + schema = load_schema_version("testlib_3.0.0") + schema.save_as_dataframes(self.output_folder + "test_testlib2.tsv", save_merged=False) + + reloaded_schema = load_schema(self.output_folder + "test_testlib2.tsv") + self.assertEqual(schema, reloaded_schema) + + def test_from_dataframes(self): + schema = load_schema_version("8.3.0") + filename = self.output_folder + "test_8_string.tsv" + schema.save_as_dataframes(self.output_folder + "test_8_string.tsv") + + filenames = convert_filenames_to_dict(filename) + new_file_strings = {} + for key, value in filenames.items(): + with open(value, "r") as f: + all_lines = f.readlines() + new_file_strings[key] = "".join(all_lines) + + reloaded_schema = from_dataframes(new_file_strings) + self.assertEqual(schema, reloaded_schema) + + schema = load_schema_version("8.3.0") + dfs = schema.get_as_dataframes() + reloaded_schema = from_dataframes(dfs) + self.assertEqual(schema, reloaded_schema) + + def test_save_load_location(self): + schema = load_schema_version("8.3.0") + schema_name = "test_output" + output_location = self.output_folder + schema_name + schema.save_as_dataframes(output_location) + expected_location = os.path.join(output_location, f"{schema_name}_Tag.tsv") + self.assertTrue(os.path.exists(expected_location)) + + reloaded_schema = load_schema(output_location) + + self.assertEqual(schema, reloaded_schema) + + def test_save_load_location2(self): + schema = load_schema_version("8.3.0") + schema_name = "test_output" + output_location = self.output_folder + schema_name + ".tsv" + schema.save_as_dataframes(output_location) + expected_location = self.output_folder + schema_name + "_Tag.tsv" + self.assertTrue(os.path.exists(expected_location)) + + reloaded_schema = load_schema(output_location) + + self.assertEqual(schema, reloaded_schema) + + def _create_structure_df(self): + data = {"hedId": ["HED_0060010"], + "rdfs:label": ["LangHeader"], + "Attributes": ['version="1.0.0", library="lang", withStandard="8.3.0", unmerged="True"'], + "omn:SubClassOf": ["HedHeader"], + "dc:description": [""], + "omn:EquivalentTo": ['HedHeader and (inHedSchema some LangSchema) and (version value "1.0.0")' + + 'and (library value "lang") and (withStandard value "8.3.0")' + + 'and (unmerged value "True")']} + + df = pd.DataFrame(data) + return df + + def _add_tag_row(self, tag_df, name, parent): + new_row = {col_name: "" for col_name in tag_df.columns} + new_row[df_constants.name] = name + new_row[df_constants.subclass_of] = parent + return pd.concat([tag_df, pd.DataFrame([new_row])], ignore_index=True) + + def test_loading_out_of_order(self): + # Verify loading a .tsv file that defines a child before it's parent works + dataframes = create_empty_dataframes() + struct_df = self._create_structure_df() + tag_df = pd.DataFrame([], columns=df_constants.tag_columns, dtype=str) + + tag_df = self._add_tag_row(tag_df, "MadeUpLongTagNameParent", "HedTag") + tag_df = self._add_tag_row(tag_df, "MadeUpLongTagNameChild", "MadeUpLongTagNameParent") + + dataframes[df_constants.STRUCT_KEY] = struct_df + dataframes[df_constants.TAG_KEY] = tag_df + + loaded_schema = from_dataframes(dataframes) + issues = loaded_schema.check_compliance(check_for_warnings=False) + self.assertEqual(len(issues), 0) + + self.assertEqual(loaded_schema.tags['MadeUpLongTagNameChild'].name, + "MadeUpLongTagNameParent/MadeUpLongTagNameChild") + self.assertEqual(loaded_schema.tags['MadeUpLongTagNameParent'].name, + "MadeUpLongTagNameParent") + + tag_df = pd.DataFrame([], columns=df_constants.tag_columns, dtype=str) + + tag_df = self._add_tag_row(tag_df, "MadeUpLongTagNameChild", "MadeUpLongTagNameParent") + tag_df = self._add_tag_row(tag_df, "MadeUpLongTagNameParent", "HedTag") + + dataframes[df_constants.TAG_KEY] = tag_df + + loaded_out_of_order = from_dataframes(dataframes) + issues = loaded_schema.check_compliance(check_for_warnings=False) + self.assertEqual(len(issues), 0) + self.assertEqual(loaded_schema.tags['MadeUpLongTagNameChild'].name, + "MadeUpLongTagNameParent/MadeUpLongTagNameChild") + self.assertEqual(loaded_schema.tags['MadeUpLongTagNameParent'].name, + "MadeUpLongTagNameParent") + self.assertEqual(loaded_schema, loaded_out_of_order) + + def test_loading_circular(self): + # Verify a circular reference properly reports an error + dataframes = create_empty_dataframes() + struct_df = self._create_structure_df() + tag_df = pd.DataFrame([], columns=df_constants.tag_columns, dtype=str) + + tag_df = self._add_tag_row(tag_df, "MadeUpLongTagNameParent", "MadeUpLongTagNameChild") + tag_df = self._add_tag_row(tag_df, "MadeUpLongTagNameChild", "MadeUpLongTagNameParent") + + dataframes[df_constants.STRUCT_KEY] = struct_df + dataframes[df_constants.TAG_KEY] = tag_df + + with self.assertRaises(HedFileError) as error: + _ = from_dataframes(dataframes) + self.assertEqual(error.exception.args[0], HedExceptions.SCHEMA_TAG_TSV_BAD_PARENT) + + dataframes = create_empty_dataframes() + struct_df = self._create_structure_df() + tag_df = pd.DataFrame([], columns=df_constants.tag_columns, dtype=str) + + tag_df = self._add_tag_row(tag_df, "MadeUpLongTagName1", "MadeUpLongTagName2") + tag_df = self._add_tag_row(tag_df, "MadeUpLongTagName2", "MadeUpLongTagName3") + tag_df = self._add_tag_row(tag_df, "MadeUpLongTagName3", "MadeUpLongTagName1") + + dataframes[df_constants.STRUCT_KEY] = struct_df + dataframes[df_constants.TAG_KEY] = tag_df + + with self.assertRaises(HedFileError) as error: + _ = from_dataframes(dataframes) + self.assertEqual(error.exception.args[0], HedExceptions.SCHEMA_TAG_TSV_BAD_PARENT) diff --git a/tests/schema/test_ontology_util.py b/tests/schema/test_ontology_util.py index 606a2c77a..d51b6bc0f 100644 --- a/tests/schema/test_ontology_util.py +++ b/tests/schema/test_ontology_util.py @@ -1,177 +1,178 @@ -import unittest -import pandas as pd -from hed import HedFileError -from hed.schema import hed_schema_df_constants as constants -from hed.schema.schema_io import ontology_util -from hed.schema.schema_io.ontology_util import get_library_name_and_id, _verify_hedid_matches, assign_hed_ids_section, \ - get_all_ids, convert_df_to_omn, update_dataframes_from_schema -from hed import load_schema_version - - -class TestLibraryFunctions(unittest.TestCase): - def setUp(self): - pass - - def test_get_library_name_and_id_default(self): - # Test default case where no library name is provided - schema = load_schema_version("8.3.0") - name, first_id = get_library_name_and_id(schema) - self.assertEqual(name, "Standard") - self.assertEqual(first_id, 10000) - - def test_get_library_name_and_id_non_default(self): - # Test non-default case - schema = load_schema_version("score_1.1.0") - name, first_id = get_library_name_and_id(schema) - self.assertEqual(name, "Score") - self.assertEqual(first_id, 40000) - - def test_get_library_name_and_id_unknown(self): - # Test for an unknown library - schema = load_schema_version("testlib_2.0.0") - name, first_id = get_library_name_and_id(schema) - self.assertEqual(name, "Testlib") - self.assertEqual(first_id, ontology_util.UNKNOWN_LIBRARY_VALUE) - - def test_get_hedid_range_normal_case(self): - id_set = ontology_util._get_hedid_range("score", constants.DATA_KEY) - self.assertTrue(40401 in id_set) - self.assertEqual(len(id_set), 200) # Check the range size - - def test_get_hedid_range_boundary(self): - # Test boundary condition where end range is -1 - id_set = ontology_util._get_hedid_range("score", constants.TAG_KEY) - self.assertTrue(42001 in id_set) - self.assertEqual(len(id_set), 18000 - 1) # From 42001 to 60000 - - def test_get_hedid_range_error(self): - with self.assertRaises(NotImplementedError): - ontology_util._get_hedid_range("lang", constants.STRUCT_KEY) - - -class TestVerifyHedIdMatches(unittest.TestCase): - def setUp(self): - self.schema_82 = load_schema_version("8.2.0") - self.schema_id = load_schema_version("8.3.0") - - def test_no_hedid(self): - df = pd.DataFrame([{'rdfs:label': 'Event', 'hedId': ''}, {'rdfs:label': 'Age-#', 'hedId': ''}]) - errors = _verify_hedid_matches(self.schema_82.tags, df, ontology_util._get_hedid_range("", constants.TAG_KEY)) - self.assertEqual(len(errors), 0) - - def test_id_matches(self): - df = pd.DataFrame( - [{'rdfs:label': 'Event', 'hedId': 'HED_0012001'}, {'rdfs:label': 'Age-#', 'hedId': 'HED_0012475'}]) - errors = _verify_hedid_matches(self.schema_id.tags, df, ontology_util._get_hedid_range("", constants.TAG_KEY)) - self.assertEqual(len(errors), 0) - - def test_label_mismatch_id(self): - df = pd.DataFrame( - [{'rdfs:label': 'Event', 'hedId': 'HED_0012005'}, {'rdfs:label': 'Age-#', 'hedId': 'HED_0012007'}]) - - errors = _verify_hedid_matches(self.schema_id.tags, df, ontology_util._get_hedid_range("", constants.TAG_KEY)) - self.assertEqual(len(errors), 2) - - def test_label_no_entry(self): - df = pd.DataFrame([{'rdfs:label': 'NotARealEvent', 'hedId': 'does_not_matter'}]) - - errors = _verify_hedid_matches(self.schema_id.tags, df, ontology_util._get_hedid_range("", constants.TAG_KEY)) - self.assertEqual(len(errors), 1) - - def test_out_of_range(self): - df = pd.DataFrame([{'rdfs:label': 'Event', 'hedId': 'HED_0000000'}]) - - errors = _verify_hedid_matches(self.schema_82.tags, df, - ontology_util._get_hedid_range("", constants.TAG_KEY)) - self.assertEqual(len(errors), 1) - - def test_not_int(self): - df = pd.DataFrame([{'rdfs:label': 'Event', 'hedId': 'HED_AAAAAAA'}]) - - errors = _verify_hedid_matches(self.schema_82.tags, df, - ontology_util._get_hedid_range("", constants.TAG_KEY)) - self.assertEqual(len(errors), 1) - - def test_get_all_ids_exists(self): - # Test when hedId column exists and has proper prefixed IDs - df = pd.DataFrame({ - 'hedId': ['HED_0000001', 'HED_0000002', 'HED_0000003'] - }) - result = get_all_ids(df) - self.assertEqual(result, {1, 2, 3}) - - def test_get_all_ids_not_exists(self): - # Test when hedId column does not exist - df = pd.DataFrame({ - 'otherId': [1, 2, 3] - }) - result = get_all_ids(df) - self.assertIsNone(result) - - def test_get_all_ids_mixed_invalid(self): - # Test when hedId column exists but contains invalid and non-numeric entries - df = pd.DataFrame({ - 'hedId': ['HED_0000001', 'HED_ABC', 'HED_0000003', 'HED_'] - }) - result = get_all_ids(df) - self.assertEqual(result, {1, 3}) # Should ignore non-numeric and malformed IDs - - def test_assign_hed_ids_section(self): - df = pd.DataFrame({ - 'hedId': ['HED_0000001', 'HED_0000003', None, None], - 'label': ['Label1', 'Label2', 'Label3', 'Label4'] # Adding arbitrary labels - }) - expected_result = df.copy() - expected_result.loc[2, 'hedId'] = "HED_0000002" - expected_result.loc[3, 'hedId'] = "HED_0000004" - unused_tag_ids = {2, 4, 5} # Simulate unused hedIds - assign_hed_ids_section(df, unused_tag_ids) - - self.assertTrue(df.equals(expected_result)) - - -class TestUpdateDataframes(unittest.TestCase): - def test_update_dataframes_from_schema(self): - # valid direction first - schema_dataframes = load_schema_version("8.3.0").get_as_dataframes() - schema_83 = load_schema_version("8.3.0") - # Add a test column and ensure it stays around - fixed_value = "test_column_value" - for key, df in schema_dataframes.items(): - df['test_column'] = fixed_value - - updated_dataframes = update_dataframes_from_schema(schema_dataframes, schema_83) - - for key, df in updated_dataframes.items(): - self.assertTrue((df['test_column'] == fixed_value).all()) - # this is expected to bomb horribly, since schema lacks many of the spreadsheet entries. - schema = load_schema_version("8.3.0") - schema_dataframes_new = load_schema_version("8.3.0").get_as_dataframes() - try: - updated_dataframes = update_dataframes_from_schema(schema_dataframes_new, schema) - except HedFileError as e: - self.assertEqual(len(e.issues), 115) - breakHere = 3 - - -class TestConvertOmn(unittest.TestCase): - def test_convert_df_to_omn(self): - dataframes = load_schema_version("8.3.0").get_as_dataframes() - omn_version, _ = convert_df_to_omn(dataframes) - - # make these more robust, for now just verify it's somewhere in the result - for df_name, df in dataframes.items(): - if df_name == constants.STRUCT_KEY: - continue # Not implemented yet - for label in df['rdfs:label']: - # Verify that the label is somewhere in the OMN text - error = f"Label '{label}' from dataframe '{df_name}' was not found in the OMN output." - label_key = f'rdfs:label "{label}"' - self.assertIn(label_key, omn_version, error) - - for hed_id in df[constants.hed_id]: - if df_name == constants.STRUCT_KEY: - continue # Not implemented yet - base_id = f": hed:{hed_id}" - error = f"HedId '{base_id}' from dataframe '{df_name}' was not found in the OMN output." - self.assertIn(base_id, omn_version, error) +import unittest +import pandas as pd + +from hed import HedFileError +from hed.schema import hed_schema_df_constants as constants +from hed.schema.schema_io import ontology_util, df_util +from hed.schema.schema_io.ontology_util import _verify_hedid_matches, assign_hed_ids_section, \ + get_all_ids, convert_df_to_omn, update_dataframes_from_schema +from hed.schema.schema_io.df_util import get_library_name_and_id +from hed import load_schema_version + + +class TestLibraryFunctions(unittest.TestCase): + def setUp(self): + pass + + def test_get_library_name_and_id_default(self): + # Test default case where no library name is provided + schema = load_schema_version("8.3.0") + name, first_id = get_library_name_and_id(schema) + self.assertEqual(name, "Standard") + self.assertEqual(first_id, 10000) + + def test_get_library_name_and_id_non_default(self): + # Test non-default case + schema = load_schema_version("score_1.1.0") + name, first_id = get_library_name_and_id(schema) + self.assertEqual(name, "Score") + self.assertEqual(first_id, 40000) + + def test_get_library_name_and_id_unknown(self): + # Test for an unknown library + schema = load_schema_version("testlib_2.0.0") + name, first_id = get_library_name_and_id(schema) + self.assertEqual(name, "Testlib") + self.assertEqual(first_id, df_util.UNKNOWN_LIBRARY_VALUE) + + def test_get_hedid_range_normal_case(self): + id_set = ontology_util._get_hedid_range("score", constants.DATA_KEY) + self.assertTrue(40401 in id_set) + self.assertEqual(len(id_set), 200) # Check the range size + + def test_get_hedid_range_boundary(self): + # Test boundary condition where end range is -1 + id_set = ontology_util._get_hedid_range("score", constants.TAG_KEY) + self.assertTrue(42001 in id_set) + self.assertEqual(len(id_set), 18000 - 1) # From 42001 to 60000 + + def test_get_hedid_range_error(self): + with self.assertRaises(NotImplementedError): + ontology_util._get_hedid_range("lang", constants.STRUCT_KEY) + + +class TestVerifyHedIdMatches(unittest.TestCase): + def setUp(self): + self.schema_82 = load_schema_version("8.2.0") + self.schema_id = load_schema_version("8.3.0") + + def test_no_hedid(self): + df = pd.DataFrame([{'rdfs:label': 'Event', 'hedId': ''}, {'rdfs:label': 'Age-#', 'hedId': ''}]) + errors = _verify_hedid_matches(self.schema_82.tags, df, ontology_util._get_hedid_range("", constants.TAG_KEY)) + self.assertEqual(len(errors), 0) + + def test_id_matches(self): + df = pd.DataFrame( + [{'rdfs:label': 'Event', 'hedId': 'HED_0012001'}, {'rdfs:label': 'Age-#', 'hedId': 'HED_0012475'}]) + errors = _verify_hedid_matches(self.schema_id.tags, df, ontology_util._get_hedid_range("", constants.TAG_KEY)) + self.assertEqual(len(errors), 0) + + def test_label_mismatch_id(self): + df = pd.DataFrame( + [{'rdfs:label': 'Event', 'hedId': 'HED_0012005'}, {'rdfs:label': 'Age-#', 'hedId': 'HED_0012007'}]) + + errors = _verify_hedid_matches(self.schema_id.tags, df, ontology_util._get_hedid_range("", constants.TAG_KEY)) + self.assertEqual(len(errors), 2) + + def test_label_no_entry(self): + df = pd.DataFrame([{'rdfs:label': 'NotARealEvent', 'hedId': 'does_not_matter'}]) + + errors = _verify_hedid_matches(self.schema_id.tags, df, ontology_util._get_hedid_range("", constants.TAG_KEY)) + self.assertEqual(len(errors), 1) + + def test_out_of_range(self): + df = pd.DataFrame([{'rdfs:label': 'Event', 'hedId': 'HED_0000000'}]) + + errors = _verify_hedid_matches(self.schema_82.tags, df, + ontology_util._get_hedid_range("", constants.TAG_KEY)) + self.assertEqual(len(errors), 1) + + def test_not_int(self): + df = pd.DataFrame([{'rdfs:label': 'Event', 'hedId': 'HED_AAAAAAA'}]) + + errors = _verify_hedid_matches(self.schema_82.tags, df, + ontology_util._get_hedid_range("", constants.TAG_KEY)) + self.assertEqual(len(errors), 1) + + def test_get_all_ids_exists(self): + # Test when hedId column exists and has proper prefixed IDs + df = pd.DataFrame({ + 'hedId': ['HED_0000001', 'HED_0000002', 'HED_0000003'] + }) + result = get_all_ids(df) + self.assertEqual(result, {1, 2, 3}) + + def test_get_all_ids_not_exists(self): + # Test when hedId column does not exist + df = pd.DataFrame({ + 'otherId': [1, 2, 3] + }) + result = get_all_ids(df) + self.assertIsNone(result) + + def test_get_all_ids_mixed_invalid(self): + # Test when hedId column exists but contains invalid and non-numeric entries + df = pd.DataFrame({ + 'hedId': ['HED_0000001', 'HED_ABC', 'HED_0000003', 'HED_'] + }) + result = get_all_ids(df) + self.assertEqual(result, {1, 3}) # Should ignore non-numeric and malformed IDs + + def test_assign_hed_ids_section(self): + df = pd.DataFrame({ + 'hedId': ['HED_0000001', 'HED_0000003', None, None], + 'label': ['Label1', 'Label2', 'Label3', 'Label4'] # Adding arbitrary labels + }) + expected_result = df.copy() + expected_result.loc[2, 'hedId'] = "HED_0000002" + expected_result.loc[3, 'hedId'] = "HED_0000004" + unused_tag_ids = {2, 4, 5} # Simulate unused hedIds + assign_hed_ids_section(df, unused_tag_ids) + + self.assertTrue(df.equals(expected_result)) + + +class TestUpdateDataframes(unittest.TestCase): + def test_update_dataframes_from_schema(self): + # valid direction first + schema_dataframes = load_schema_version("8.3.0").get_as_dataframes() + schema_83 = load_schema_version("8.3.0") + # Add a test column and ensure it stays around + fixed_value = "test_column_value" + for key, df in schema_dataframes.items(): + df['test_column'] = fixed_value + + updated_dataframes = update_dataframes_from_schema(schema_dataframes, schema_83) + + for key, df in updated_dataframes.items(): + self.assertTrue((df['test_column'] == fixed_value).all()) + # this is expected to bomb horribly, since schema lacks many of the spreadsheet entries. + schema = load_schema_version("8.3.0") + schema_dataframes_new = load_schema_version("8.3.0").get_as_dataframes() + try: + updated_dataframes = update_dataframes_from_schema(schema_dataframes_new, schema) + except HedFileError as e: + self.assertEqual(len(e.issues), 115) + + +class TestConvertOmn(unittest.TestCase): + def test_convert_df_to_omn(self): + dataframes = load_schema_version("8.3.0").get_as_dataframes() + omn_version, _ = convert_df_to_omn(dataframes) + + # make these more robust, for now just verify it's somewhere in the result + for df_name, df in dataframes.items(): + if df_name == constants.STRUCT_KEY: + continue # Not implemented yet + for label in df['rdfs:label']: + # Verify that the label is somewhere in the OMN text + error = f"Label '{label}' from dataframe '{df_name}' was not found in the OMN output." + label_key = f'rdfs:label "{label}"' + self.assertIn(label_key, omn_version, error) + + for hed_id in df[constants.hed_id]: + if df_name == constants.STRUCT_KEY: + continue # Not implemented yet + base_id = f": hed:{hed_id}" + error = f"HedId '{base_id}' from dataframe '{df_name}' was not found in the OMN output." + self.assertIn(base_id, omn_version, error) diff --git a/tests/schema/test_schema_attribute_validators.py b/tests/schema/test_schema_attribute_validators.py index 95bdd5507..8a04732a0 100644 --- a/tests/schema/test_schema_attribute_validators.py +++ b/tests/schema/test_schema_attribute_validators.py @@ -1,165 +1,193 @@ -import unittest -import copy - -from hed.schema import schema_attribute_validators, HedSectionKey -from hed import load_schema_version - - -class Test(unittest.TestCase): - @classmethod - def setUpClass(cls): - cls.hed_schema = load_schema_version("8.2.0") - - def test_util_placeholder(self): - tag_entry = self.hed_schema.tags["Event"] - attribute_name = "unitClass" - self.assertTrue(schema_attribute_validators.tag_is_placeholder_check(self.hed_schema, tag_entry, attribute_name)) - attribute_name = "unitClass" - tag_entry = self.hed_schema.tags["Age/#"] - self.assertFalse(schema_attribute_validators.tag_is_placeholder_check(self.hed_schema, tag_entry, attribute_name)) - - def test_util_suggested(self): - tag_entry = self.hed_schema.tags["Event/Sensory-event"] - attribute_name = "suggestedTag" - self.assertFalse(schema_attribute_validators.item_exists_check(self.hed_schema, tag_entry, attribute_name, HedSectionKey.Tags)) - tag_entry = self.hed_schema.tags["Property"] - self.assertFalse(schema_attribute_validators.item_exists_check(self.hed_schema, tag_entry, attribute_name, HedSectionKey.Tags)) - tag_entry = copy.deepcopy(tag_entry) - tag_entry.attributes["suggestedTag"] = "InvalidSuggestedTag" - self.assertTrue(schema_attribute_validators.item_exists_check(self.hed_schema, tag_entry, attribute_name, HedSectionKey.Tags)) - - def test_util_rooted(self): - tag_entry = self.hed_schema.tags["Event"] - attribute_name = "rooted" - self.assertFalse(schema_attribute_validators.tag_exists_base_schema_check(self.hed_schema, tag_entry, attribute_name)) - tag_entry = self.hed_schema.tags["Property"] - self.assertFalse(schema_attribute_validators.tag_exists_base_schema_check(self.hed_schema, tag_entry, attribute_name)) - tag_entry = copy.deepcopy(tag_entry) - tag_entry.attributes["rooted"] = "Event" - self.assertFalse(schema_attribute_validators.tag_exists_base_schema_check(self.hed_schema, tag_entry, attribute_name)) - tag_entry = copy.deepcopy(tag_entry) - tag_entry.attributes["rooted"] = "NotRealTag" - self.assertTrue(schema_attribute_validators.tag_exists_base_schema_check(self.hed_schema, tag_entry, attribute_name)) - - def test_unit_class_exists(self): - tag_entry = self.hed_schema.tags["Weight/#"] - attribute_name = "unitClass" - self.assertFalse(schema_attribute_validators.item_exists_check(self.hed_schema, tag_entry, attribute_name, HedSectionKey.UnitClasses)) - - tag_entry = copy.deepcopy(tag_entry) - tag_entry.attributes["unitClass"] = "fakeClass" - self.assertTrue(schema_attribute_validators.item_exists_check(self.hed_schema, tag_entry, attribute_name, HedSectionKey.UnitClasses)) - - def test_value_class_exists(self): - tag_entry = self.hed_schema.tags["Weight/#"] - attribute_name = "valueClass" - self.assertFalse(schema_attribute_validators.item_exists_check(self.hed_schema, tag_entry, attribute_name, HedSectionKey.ValueClasses)) - - tag_entry = copy.deepcopy(tag_entry) - tag_entry.attributes["valueClass"] = "fakeClass" - self.assertTrue(schema_attribute_validators.item_exists_check(self.hed_schema, tag_entry, attribute_name, HedSectionKey.ValueClasses)) - - def test_unit_exists(self): - tag_entry = self.hed_schema.unit_classes["accelerationUnits"] - attribute_name = "defaultUnits" - self.assertFalse(schema_attribute_validators.unit_exists(self.hed_schema, tag_entry, attribute_name)) - - tag_entry = copy.deepcopy(tag_entry) - tag_entry.attributes["defaultUnits"] = "bad_unit" - self.assertTrue(schema_attribute_validators.unit_exists(self.hed_schema, tag_entry, attribute_name)) - - def test_deprecatedFrom(self): - tag_entry = self.hed_schema.tags["Event/Measurement-event"] - attribute_name = "deprecatedFrom" - self.assertFalse(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, tag_entry, attribute_name)) - - tag_entry = copy.deepcopy(tag_entry) - tag_entry.attributes["deprecatedFrom"] = "200.3.0" - self.assertTrue(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, tag_entry, attribute_name)) - - tag_entry.attributes["deprecatedFrom"] = "invalid" - self.assertTrue(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, tag_entry, attribute_name)) - - tag_entry.attributes["deprecatedFrom"] = "1" - self.assertTrue(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, tag_entry, attribute_name)) - - tag_entry.attributes["deprecatedFrom"] = "8.0.0" - self.assertFalse(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, tag_entry, attribute_name)) - - tag_entry.attributes["deprecatedFrom"] = "8.2.0" - self.assertTrue(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, tag_entry, attribute_name)) - del tag_entry.attributes["deprecatedFrom"] - - unit_class_entry = copy.deepcopy(self.hed_schema.unit_classes["temperatureUnits"]) - # This should raise an issue because it assumes the attribute is set - self.assertTrue(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, unit_class_entry, attribute_name)) - unit_class_entry.attributes["deprecatedFrom"] = "8.1.0" - unit_class_entry.units['degree Celsius'].attributes["deprecatedFrom"] = "8.1.0" - # Still a warning for oC - self.assertTrue(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, unit_class_entry, attribute_name)) - unit_class_entry.units['oC'].attributes["deprecatedFrom"] = "8.1.0" - self.assertFalse(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, unit_class_entry, attribute_name)) - # this is still fine, as we are validating the child has deprecated from, not it's value - unit_class_entry.units['oC'].attributes["deprecatedFrom"] = "8.2.0" - self.assertFalse(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, unit_class_entry, attribute_name)) - - self.assertTrue(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, unit_class_entry.units['oC'], attribute_name)) - - def test_conversionFactor(self): - tag_entry = self.hed_schema.unit_classes["accelerationUnits"].units["m-per-s^2"] - attribute_name = "conversionFactor" - self.assertFalse(schema_attribute_validators.conversion_factor(self.hed_schema, tag_entry, attribute_name)) - - tag_entry = copy.deepcopy(tag_entry) - tag_entry.attributes[attribute_name] = "-1.0" - self.assertTrue(schema_attribute_validators.conversion_factor(self.hed_schema, tag_entry, attribute_name)) - - tag_entry.attributes[attribute_name] = "10^3" - self.assertFalse(schema_attribute_validators.conversion_factor(self.hed_schema, tag_entry, attribute_name)) - - tag_entry.attributes[attribute_name] = None - self.assertTrue(schema_attribute_validators.conversion_factor(self.hed_schema, tag_entry, attribute_name)) - - def test_conversionFactor_modifier(self): - tag_entry = self.hed_schema.unit_classes["magneticFieldUnits"].units["tesla"] - attribute_name = "conversionFactor" - self.assertFalse(schema_attribute_validators.conversion_factor(self.hed_schema, tag_entry, attribute_name)) - - tag_entry = copy.deepcopy(tag_entry) - tag_entry.attributes[attribute_name] = "-1.0" - self.assertTrue(schema_attribute_validators.conversion_factor(self.hed_schema, tag_entry, attribute_name)) - - tag_entry.attributes[attribute_name] = "10^3" - self.assertFalse(schema_attribute_validators.conversion_factor(self.hed_schema, tag_entry, attribute_name)) - - tag_entry.attributes[attribute_name] = None - self.assertTrue(schema_attribute_validators.conversion_factor(self.hed_schema, tag_entry, attribute_name)) - - def test_allowed_characters_check(self): - tag_entry = self.hed_schema.value_classes["dateTimeClass"] - attribute_name = "allowedCharacter" - valid_attributes = {"letters", "blank", "digits", "alphanumeric", ":", "$", "a"} - self.assertFalse(schema_attribute_validators.allowed_characters_check(self.hed_schema, tag_entry, attribute_name)) - - tag_entry = copy.deepcopy(tag_entry) - for attribute in valid_attributes: - tag_entry.attributes[attribute_name] = attribute - self.assertFalse(schema_attribute_validators.allowed_characters_check(self.hed_schema, tag_entry, attribute_name)) - - invalid_attributes = {"lettersdd", "notaword", ":a"} - for attribute in invalid_attributes: - tag_entry.attributes[attribute_name] = attribute - self.assertTrue(schema_attribute_validators.allowed_characters_check(self.hed_schema, tag_entry, attribute_name)) - - def test_in_library_check(self): - score = load_schema_version("score_1.1.0") - tag_entry = score.tags["Modulator"] - attribute_name = "inLibrary" - self.assertFalse(schema_attribute_validators.in_library_check(score, tag_entry, attribute_name)) - - tag_entry = copy.deepcopy(tag_entry) - tag_entry.attributes[attribute_name] = "invalid" - self.assertTrue(schema_attribute_validators.in_library_check(score, tag_entry, attribute_name)) - - tag_entry.attributes[attribute_name] = "" - self.assertTrue(schema_attribute_validators.in_library_check(score, tag_entry, attribute_name)) \ No newline at end of file +import unittest +import copy + +from hed.schema import schema_attribute_validators, HedSectionKey +from hed import load_schema_version + + +class Test(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.hed_schema = load_schema_version("8.2.0") + + def test_util_placeholder(self): + tag_entry = self.hed_schema.tags["Event"] + attribute_name = "unitClass" + self.assertTrue(schema_attribute_validators.tag_is_placeholder_check(self.hed_schema, + tag_entry, attribute_name)) + attribute_name = "unitClass" + tag_entry = self.hed_schema.tags["Age/#"] + self.assertFalse(schema_attribute_validators.tag_is_placeholder_check(self.hed_schema, + tag_entry, attribute_name)) + + def test_util_suggested(self): + tag_entry = self.hed_schema.tags["Event/Sensory-event"] + attribute_name = "suggestedTag" + self.assertFalse(schema_attribute_validators.item_exists_check(self.hed_schema, tag_entry, + attribute_name, HedSectionKey.Tags)) + tag_entry = self.hed_schema.tags["Property"] + self.assertFalse(schema_attribute_validators.item_exists_check(self.hed_schema, tag_entry, + attribute_name, HedSectionKey.Tags)) + tag_entry = copy.deepcopy(tag_entry) + tag_entry.attributes["suggestedTag"] = "InvalidSuggestedTag" + self.assertTrue(schema_attribute_validators.item_exists_check(self.hed_schema, tag_entry, + attribute_name, HedSectionKey.Tags)) + + def test_util_rooted(self): + tag_entry = self.hed_schema.tags["Event"] + attribute_name = "rooted" + self.assertFalse(schema_attribute_validators.tag_exists_base_schema_check(self.hed_schema, + tag_entry, attribute_name)) + tag_entry = self.hed_schema.tags["Property"] + self.assertFalse(schema_attribute_validators.tag_exists_base_schema_check(self.hed_schema, + tag_entry, attribute_name)) + tag_entry = copy.deepcopy(tag_entry) + tag_entry.attributes["rooted"] = "Event" + self.assertFalse(schema_attribute_validators.tag_exists_base_schema_check(self.hed_schema, + tag_entry, attribute_name)) + tag_entry = copy.deepcopy(tag_entry) + tag_entry.attributes["rooted"] = "NotRealTag" + self.assertTrue(schema_attribute_validators.tag_exists_base_schema_check(self.hed_schema, + tag_entry, attribute_name)) + + def test_unit_class_exists(self): + tag_entry = self.hed_schema.tags["Weight/#"] + attribute_name = "unitClass" + self.assertFalse(schema_attribute_validators.item_exists_check(self.hed_schema, tag_entry, attribute_name, + HedSectionKey.UnitClasses)) + + tag_entry = copy.deepcopy(tag_entry) + tag_entry.attributes["unitClass"] = "fakeClass" + self.assertTrue(schema_attribute_validators.item_exists_check(self.hed_schema, tag_entry, attribute_name, + HedSectionKey.UnitClasses)) + + def test_value_class_exists(self): + tag_entry = self.hed_schema.tags["Weight/#"] + attribute_name = "valueClass" + self.assertFalse(schema_attribute_validators.item_exists_check(self.hed_schema, tag_entry, attribute_name, + HedSectionKey.ValueClasses)) + + tag_entry = copy.deepcopy(tag_entry) + tag_entry.attributes["valueClass"] = "fakeClass" + self.assertTrue(schema_attribute_validators.item_exists_check(self.hed_schema, tag_entry, attribute_name, + HedSectionKey.ValueClasses)) + + def test_unit_exists(self): + tag_entry = self.hed_schema.unit_classes["accelerationUnits"] + attribute_name = "defaultUnits" + self.assertFalse(schema_attribute_validators.unit_exists(self.hed_schema, tag_entry, attribute_name)) + + tag_entry = copy.deepcopy(tag_entry) + tag_entry.attributes["defaultUnits"] = "bad_unit" + self.assertTrue(schema_attribute_validators.unit_exists(self.hed_schema, tag_entry, attribute_name)) + + def test_deprecatedFrom(self): + tag_entry = self.hed_schema.tags["Event/Measurement-event"] + attribute_name = "deprecatedFrom" + self.assertFalse(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, tag_entry, + attribute_name)) + + tag_entry = copy.deepcopy(tag_entry) + tag_entry.attributes["deprecatedFrom"] = "200.3.0" + self.assertTrue(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, tag_entry, + attribute_name)) + + tag_entry.attributes["deprecatedFrom"] = "invalid" + self.assertTrue(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, tag_entry, + attribute_name)) + + tag_entry.attributes["deprecatedFrom"] = "1" + self.assertTrue(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, tag_entry, + attribute_name)) + + tag_entry.attributes["deprecatedFrom"] = "8.0.0" + self.assertFalse(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, tag_entry, + attribute_name)) + + tag_entry.attributes["deprecatedFrom"] = "8.2.0" + self.assertTrue(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, tag_entry, + attribute_name)) + del tag_entry.attributes["deprecatedFrom"] + + unit_class_entry = copy.deepcopy(self.hed_schema.unit_classes["temperatureUnits"]) + # This should raise an issue because it assumes the attribute is set + self.assertTrue(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, unit_class_entry, + attribute_name)) + unit_class_entry.attributes["deprecatedFrom"] = "8.1.0" + unit_class_entry.units['degree Celsius'].attributes["deprecatedFrom"] = "8.1.0" + # Still a warning for oC + self.assertTrue(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, unit_class_entry, + attribute_name)) + unit_class_entry.units['oC'].attributes["deprecatedFrom"] = "8.1.0" + self.assertFalse(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, unit_class_entry, + attribute_name)) + # this is still fine, as we are validating the child has deprecated from, not it's value + unit_class_entry.units['oC'].attributes["deprecatedFrom"] = "8.2.0" + self.assertFalse(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, unit_class_entry, + attribute_name)) + + self.assertTrue(schema_attribute_validators.tag_is_deprecated_check(self.hed_schema, + unit_class_entry.units['oC'], + attribute_name)) + + def test_conversionFactor(self): + tag_entry = self.hed_schema.unit_classes["accelerationUnits"].units["m-per-s^2"] + attribute_name = "conversionFactor" + self.assertFalse(schema_attribute_validators.conversion_factor(self.hed_schema, tag_entry, attribute_name)) + + tag_entry = copy.deepcopy(tag_entry) + tag_entry.attributes[attribute_name] = "-1.0" + self.assertTrue(schema_attribute_validators.conversion_factor(self.hed_schema, tag_entry, attribute_name)) + + tag_entry.attributes[attribute_name] = "10^3" + self.assertFalse(schema_attribute_validators.conversion_factor(self.hed_schema, tag_entry, attribute_name)) + + tag_entry.attributes[attribute_name] = None + self.assertTrue(schema_attribute_validators.conversion_factor(self.hed_schema, tag_entry, attribute_name)) + + def test_conversionFactor_modifier(self): + tag_entry = self.hed_schema.unit_classes["magneticFieldUnits"].units["tesla"] + attribute_name = "conversionFactor" + self.assertFalse(schema_attribute_validators.conversion_factor(self.hed_schema, tag_entry, attribute_name)) + + tag_entry = copy.deepcopy(tag_entry) + tag_entry.attributes[attribute_name] = "-1.0" + self.assertTrue(schema_attribute_validators.conversion_factor(self.hed_schema, tag_entry, attribute_name)) + + tag_entry.attributes[attribute_name] = "10^3" + self.assertFalse(schema_attribute_validators.conversion_factor(self.hed_schema, tag_entry, attribute_name)) + + tag_entry.attributes[attribute_name] = None + self.assertTrue(schema_attribute_validators.conversion_factor(self.hed_schema, tag_entry, attribute_name)) + + def test_allowed_characters_check(self): + tag_entry = self.hed_schema.value_classes["dateTimeClass"] + attribute_name = "allowedCharacter" + valid_attributes = {"letters", "blank", "digits", "alphanumeric", ":", "$", "a"} + self.assertFalse(schema_attribute_validators.allowed_characters_check(self.hed_schema, tag_entry, + attribute_name)) + + tag_entry = copy.deepcopy(tag_entry) + for attribute in valid_attributes: + tag_entry.attributes[attribute_name] = attribute + self.assertFalse(schema_attribute_validators.allowed_characters_check(self.hed_schema, tag_entry, + attribute_name)) + + invalid_attributes = {"lettersdd", "notaword", ":a"} + for attribute in invalid_attributes: + tag_entry.attributes[attribute_name] = attribute + self.assertTrue(schema_attribute_validators.allowed_characters_check(self.hed_schema, tag_entry, + attribute_name)) + + def test_in_library_check(self): + score = load_schema_version("score_1.1.0") + tag_entry = score.tags["Modulator"] + attribute_name = "inLibrary" + self.assertFalse(schema_attribute_validators.in_library_check(score, tag_entry, attribute_name)) + + tag_entry = copy.deepcopy(tag_entry) + tag_entry.attributes[attribute_name] = "invalid" + self.assertTrue(schema_attribute_validators.in_library_check(score, tag_entry, attribute_name)) + + tag_entry.attributes[attribute_name] = "" + self.assertTrue(schema_attribute_validators.in_library_check(score, tag_entry, attribute_name)) diff --git a/tests/schema/test_schema_converters.py b/tests/schema/test_schema_converters.py index 9073e50e2..8d69dd5e7 100644 --- a/tests/schema/test_schema_converters.py +++ b/tests/schema/test_schema_converters.py @@ -1,209 +1,209 @@ -import copy -import unittest -import os - -from hed import schema -import tempfile -import functools - - -def get_temp_filename(extension): - with tempfile.NamedTemporaryFile(delete=False, suffix=extension) as temp_file: - filename = temp_file.name - return filename - -# Function wrapper to create and clean up a single schema for testing -def with_temp_file(extension): - def decorator(test_func): - @functools.wraps(test_func) - def wrapper(*args, **kwargs): - # Create a temporary file with the given extension - filename = get_temp_filename(extension) - try: - # Call the test function with the filename - return test_func(*args, filename=filename, **kwargs) - finally: - # Clean up: Remove the temporary file - os.remove(filename) - return wrapper - return decorator - - -class TestConverterBase(unittest.TestCase): - xml_file = '../data/schema_tests/HED8.2.0.xml' - wiki_file = '../data/schema_tests/HED8.2.0.mediawiki' - can_compare = True - - @classmethod - def setUpClass(cls): - cls.xml_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), cls.xml_file) - cls.hed_schema_xml = schema.load_schema(cls.xml_file) - cls.wiki_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), cls.wiki_file) - cls.hed_schema_wiki = schema.load_schema(cls.wiki_file) - - # !BFK! - Delete default units as they aren't in the XML file. - if "HED8.2.0" in cls.wiki_file: - del cls.hed_schema_wiki.unit_classes["temperatureUnits"].attributes["defaultUnits"] - - @with_temp_file(".xml") - def test_schema2xml(self, filename): - self.hed_schema_xml.save_as_xml(filename) - loaded_schema = schema.load_schema(filename) - - self.assertEqual(loaded_schema, self.hed_schema_xml) - - @with_temp_file(".mediawiki") - def test_schema2wiki(self, filename): - self.hed_schema_xml.save_as_mediawiki(filename) - loaded_schema = schema.load_schema(filename) - - self.assertEqual(loaded_schema, self.hed_schema_xml) - - def test_schema_as_string_xml(self): - with open(self.xml_file) as file: - hed_schema_as_string = "".join([line for line in file]) - - string_schema = schema.from_string(hed_schema_as_string) - - self.assertEqual(string_schema, self.hed_schema_xml) - - def test_schema_as_string_wiki(self): - with open(self.wiki_file) as file: - hed_schema_as_string = "".join([line for line in file]) - - string_schema = schema.from_string(hed_schema_as_string, schema_format=".mediawiki") - #!BFK! - Same as before, 8.2.0 has a difference - if "HED8.2.0" in self.wiki_file: - del string_schema.unit_classes["temperatureUnits"].attributes["defaultUnits"] - - self.assertEqual(string_schema, self.hed_schema_wiki) - - @with_temp_file(".xml") - def test_wikischema2xml(self, filename): - self.hed_schema_wiki.save_as_xml(filename) - loaded_schema = schema.load_schema(filename) - - wiki_schema_copy = copy.deepcopy(self.hed_schema_wiki) - - self.assertEqual(loaded_schema, wiki_schema_copy) - - @with_temp_file(".mediawiki") - def test_wikischema2wiki(self, filename): - self.hed_schema_wiki.save_as_mediawiki(filename) - loaded_schema = schema.load_schema(filename) - - self.assertEqual(loaded_schema, self.hed_schema_wiki) - - def test_compare_readers(self): - if self.can_compare: - self.assertEqual(self.hed_schema_wiki, self.hed_schema_xml) - - -class TestComplianceBase(unittest.TestCase): - xml_file_old = '../data/schema_tests/HED8.0.0t.xml' - xml_file = '../data/schema_tests/HED8.2.0.xml' - wiki_file = '../data/schema_tests/HED8.2.0.mediawiki' - can_compare = True - expected_issues = 0 - - @classmethod - def setUpClass(cls): - cls.xml_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), cls.xml_file) - cls.hed_schema_xml = schema.load_schema(cls.xml_file) - cls.wiki_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), cls.wiki_file) - cls.hed_schema_wiki = schema.load_schema(cls.wiki_file) - if "HED8.2.0" in cls.wiki_file: - del cls.hed_schema_wiki.unit_classes["temperatureUnits"].attributes["defaultUnits"] - cls.xml_file_old = os.path.join(os.path.dirname(os.path.realpath(__file__)), cls.xml_file_old) - cls.hed_schema_xml_old = schema.load_schema(cls.xml_file_old) - - def test_compliance(self): - issues = self.hed_schema_wiki.check_compliance() - self.assertEqual(len(issues), self.expected_issues) - issues_old = self.hed_schema_xml_old.check_compliance() - self.assertGreater(len(issues_old), 0) - - def test_compare_readers(self): - self.assertNotEqual(self.hed_schema_xml, self.hed_schema_xml_old) - if self.can_compare: - self.assertEqual(self.hed_schema_wiki, self.hed_schema_xml) - - -class TestPropertyAdded(TestConverterBase): - xml_file = '../data/schema_tests/added_prop.xml' - wiki_file = '../data/schema_tests/added_prop.mediawiki' - can_compare = True - - -class TestPropertyAddedUsage(TestConverterBase): - xml_file = '../data/schema_tests/added_prop_with_usage.xml' - wiki_file = '../data/schema_tests/added_prop_with_usage.mediawiki' - can_compare = True - - -class TestHedUnknownAttr(TestConverterBase): - xml_file = '../data/schema_tests/unknown_attribute.xml' - wiki_file = '../data/schema_tests/unknown_attribute.mediawiki' - can_compare = True - - -class TestHedMultiValueClass(TestConverterBase): - xml_file = '../data/schema_tests/HED8.0.0_2_value_classes.xml' - wiki_file = '../data/schema_tests/HED8.0.0_2_value_classes.mediawiki' - can_compare = True - - -class TestPrologueIssues1(TestConverterBase): - xml_file = '../data/schema_tests/prologue_tests/test_extra_blank_line_end.xml' - wiki_file = '../data/schema_tests/prologue_tests/test_extra_blank_line_end.mediawiki' - can_compare = True - - -class TestPrologueIssues2(TestConverterBase): - xml_file = '../data/schema_tests/prologue_tests/test_extra_blank_line_middle.xml' - wiki_file = '../data/schema_tests/prologue_tests/test_extra_blank_line_middle.mediawiki' - can_compare = True - - -class TestPrologueIssues3(TestConverterBase): - xml_file = '../data/schema_tests/prologue_tests/test_extra_blank_line_start.xml' - wiki_file = '../data/schema_tests/prologue_tests/test_extra_blank_line_start.mediawiki' - can_compare = True - - -class TestPrologueIssues4(TestConverterBase): - xml_file = '../data/schema_tests/prologue_tests/test_no_blank_line.xml' - wiki_file = '../data/schema_tests/prologue_tests/test_no_blank_line.mediawiki' - can_compare = True - - -class TestDuplicateUnitCompliance(TestComplianceBase): - xml_file = '../data/schema_tests/duplicate_unit.xml' - wiki_file = '../data/schema_tests/duplicate_unit.mediawiki' - can_compare = True - expected_issues = 1 - - -class TestDuplicateUnitClass(TestComplianceBase): - xml_file = '../data/schema_tests/duplicate_unit_class.xml' - wiki_file = '../data/schema_tests/duplicate_unit_class.mediawiki' - can_compare = True - expected_issues = 1 - - - -class TestConverterSavingPrefix(unittest.TestCase): - xml_file = '../data/schema_tests/HED8.0.0t.xml' - - @classmethod - def setUpClass(cls): - cls.xml_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), cls.xml_file) - cls.hed_schema_xml = schema.load_schema(cls.xml_file) - cls.hed_schema_xml_prefix = schema.load_schema(cls.xml_file, schema_namespace="tl:") - - @with_temp_file(".xml") - def test_saving_prefix(self, filename): - self.hed_schema_xml_prefix.save_as_xml(filename) - loaded_schema = schema.load_schema(filename) - - self.assertEqual(loaded_schema, self.hed_schema_xml) +import copy +import unittest +import os + +from hed import schema +import tempfile +import functools + + +def get_temp_filename(extension): + with tempfile.NamedTemporaryFile(delete=False, suffix=extension) as temp_file: + filename = temp_file.name + return filename + + +# Function wrapper to create and clean up a single schema for testing +def with_temp_file(extension): + def decorator(test_func): + @functools.wraps(test_func) + def wrapper(*args, **kwargs): + # Create a temporary file with the given extension + filename = get_temp_filename(extension) + try: + # Call the test function with the filename + return test_func(*args, filename=filename, **kwargs) + finally: + # Clean up: Remove the temporary file + os.remove(filename) + return wrapper + return decorator + + +class TestConverterBase(unittest.TestCase): + xml_file = '../data/schema_tests/HED8.2.0.xml' + wiki_file = '../data/schema_tests/HED8.2.0.mediawiki' + can_compare = True + + @classmethod + def setUpClass(cls): + cls.xml_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), cls.xml_file) + cls.hed_schema_xml = schema.load_schema(cls.xml_file) + cls.wiki_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), cls.wiki_file) + cls.hed_schema_wiki = schema.load_schema(cls.wiki_file) + + # !BFK! - Delete default units as they aren't in the XML file. + if "HED8.2.0" in cls.wiki_file: + del cls.hed_schema_wiki.unit_classes["temperatureUnits"].attributes["defaultUnits"] + + @with_temp_file(".xml") + def test_schema2xml(self, filename): + self.hed_schema_xml.save_as_xml(filename) + loaded_schema = schema.load_schema(filename) + + self.assertEqual(loaded_schema, self.hed_schema_xml) + + @with_temp_file(".mediawiki") + def test_schema2wiki(self, filename): + self.hed_schema_xml.save_as_mediawiki(filename) + loaded_schema = schema.load_schema(filename) + + self.assertEqual(loaded_schema, self.hed_schema_xml) + + def test_schema_as_string_xml(self): + with open(self.xml_file) as file: + hed_schema_as_string = "".join([line for line in file]) + + string_schema = schema.from_string(hed_schema_as_string) + + self.assertEqual(string_schema, self.hed_schema_xml) + + def test_schema_as_string_wiki(self): + with open(self.wiki_file) as file: + hed_schema_as_string = "".join([line for line in file]) + + string_schema = schema.from_string(hed_schema_as_string, schema_format=".mediawiki") + # !BFK! - Same as before, 8.2.0 has a difference + if "HED8.2.0" in self.wiki_file: + del string_schema.unit_classes["temperatureUnits"].attributes["defaultUnits"] + + self.assertEqual(string_schema, self.hed_schema_wiki) + + @with_temp_file(".xml") + def test_wikischema2xml(self, filename): + self.hed_schema_wiki.save_as_xml(filename) + loaded_schema = schema.load_schema(filename) + + wiki_schema_copy = copy.deepcopy(self.hed_schema_wiki) + + self.assertEqual(loaded_schema, wiki_schema_copy) + + @with_temp_file(".mediawiki") + def test_wikischema2wiki(self, filename): + self.hed_schema_wiki.save_as_mediawiki(filename) + loaded_schema = schema.load_schema(filename) + + self.assertEqual(loaded_schema, self.hed_schema_wiki) + + def test_compare_readers(self): + if self.can_compare: + self.assertEqual(self.hed_schema_wiki, self.hed_schema_xml) + + +class TestComplianceBase(unittest.TestCase): + xml_file_old = '../data/schema_tests/HED8.0.0t.xml' + xml_file = '../data/schema_tests/HED8.2.0.xml' + wiki_file = '../data/schema_tests/HED8.2.0.mediawiki' + can_compare = True + expected_issues = 0 + + @classmethod + def setUpClass(cls): + cls.xml_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), cls.xml_file) + cls.hed_schema_xml = schema.load_schema(cls.xml_file) + cls.wiki_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), cls.wiki_file) + cls.hed_schema_wiki = schema.load_schema(cls.wiki_file) + if "HED8.2.0" in cls.wiki_file: + del cls.hed_schema_wiki.unit_classes["temperatureUnits"].attributes["defaultUnits"] + cls.xml_file_old = os.path.join(os.path.dirname(os.path.realpath(__file__)), cls.xml_file_old) + cls.hed_schema_xml_old = schema.load_schema(cls.xml_file_old) + + def test_compliance(self): + issues = self.hed_schema_wiki.check_compliance() + self.assertEqual(len(issues), self.expected_issues) + issues_old = self.hed_schema_xml_old.check_compliance() + self.assertGreater(len(issues_old), 0) + + def test_compare_readers(self): + self.assertNotEqual(self.hed_schema_xml, self.hed_schema_xml_old) + if self.can_compare: + self.assertEqual(self.hed_schema_wiki, self.hed_schema_xml) + + +class TestPropertyAdded(TestConverterBase): + xml_file = '../data/schema_tests/added_prop.xml' + wiki_file = '../data/schema_tests/added_prop.mediawiki' + can_compare = True + + +class TestPropertyAddedUsage(TestConverterBase): + xml_file = '../data/schema_tests/added_prop_with_usage.xml' + wiki_file = '../data/schema_tests/added_prop_with_usage.mediawiki' + can_compare = True + + +class TestHedUnknownAttr(TestConverterBase): + xml_file = '../data/schema_tests/unknown_attribute.xml' + wiki_file = '../data/schema_tests/unknown_attribute.mediawiki' + can_compare = True + + +class TestHedMultiValueClass(TestConverterBase): + xml_file = '../data/schema_tests/HED8.0.0_2_value_classes.xml' + wiki_file = '../data/schema_tests/HED8.0.0_2_value_classes.mediawiki' + can_compare = True + + +class TestPrologueIssues1(TestConverterBase): + xml_file = '../data/schema_tests/prologue_tests/test_extra_blank_line_end.xml' + wiki_file = '../data/schema_tests/prologue_tests/test_extra_blank_line_end.mediawiki' + can_compare = True + + +class TestPrologueIssues2(TestConverterBase): + xml_file = '../data/schema_tests/prologue_tests/test_extra_blank_line_middle.xml' + wiki_file = '../data/schema_tests/prologue_tests/test_extra_blank_line_middle.mediawiki' + can_compare = True + + +class TestPrologueIssues3(TestConverterBase): + xml_file = '../data/schema_tests/prologue_tests/test_extra_blank_line_start.xml' + wiki_file = '../data/schema_tests/prologue_tests/test_extra_blank_line_start.mediawiki' + can_compare = True + + +class TestPrologueIssues4(TestConverterBase): + xml_file = '../data/schema_tests/prologue_tests/test_no_blank_line.xml' + wiki_file = '../data/schema_tests/prologue_tests/test_no_blank_line.mediawiki' + can_compare = True + + +class TestDuplicateUnitCompliance(TestComplianceBase): + xml_file = '../data/schema_tests/duplicate_unit.xml' + wiki_file = '../data/schema_tests/duplicate_unit.mediawiki' + can_compare = True + expected_issues = 1 + + +class TestDuplicateUnitClass(TestComplianceBase): + xml_file = '../data/schema_tests/duplicate_unit_class.xml' + wiki_file = '../data/schema_tests/duplicate_unit_class.mediawiki' + can_compare = True + expected_issues = 1 + + +class TestConverterSavingPrefix(unittest.TestCase): + xml_file = '../data/schema_tests/HED8.0.0t.xml' + + @classmethod + def setUpClass(cls): + cls.xml_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), cls.xml_file) + cls.hed_schema_xml = schema.load_schema(cls.xml_file) + cls.hed_schema_xml_prefix = schema.load_schema(cls.xml_file, schema_namespace="tl:") + + @with_temp_file(".xml") + def test_saving_prefix(self, filename): + self.hed_schema_xml_prefix.save_as_xml(filename) + loaded_schema = schema.load_schema(filename) + + self.assertEqual(loaded_schema, self.hed_schema_xml) diff --git a/tests/schema/test_schema_entry.py b/tests/schema/test_schema_entry.py index 4cc23c10e..7d8e58c35 100644 --- a/tests/schema/test_schema_entry.py +++ b/tests/schema/test_schema_entry.py @@ -1,45 +1,47 @@ -import unittest -from hed.schema.hed_schema_entry import HedTagEntry -class MockEntry: - def __init__(self, attributes, parent=None): - self.attributes = attributes - self.takes_value_child_entry = False - self._parent_tag = parent - - _check_inherited_attribute = HedTagEntry._check_inherited_attribute - _check_inherited_attribute_internal = HedTagEntry._check_inherited_attribute_internal - - -class TestMockEntry(unittest.TestCase): - - def setUp(self): - # Test setup - self.root_entry = MockEntry({'color': 'blue', 'size': 'large', 'is_round': False}) - self.child_entry1 = MockEntry({'color': 'green', 'shape': 'circle', 'is_round': True}, parent=self.root_entry) - self.child_entry2 = MockEntry({'size': 'medium', 'material': 'wood', 'number': 5}, parent=self.child_entry1) - - def test_check_inherited_attribute(self): - self.assertEqual(self.child_entry2._check_inherited_attribute('material', return_value=True), 'wood') - - # Test attribute present in the parent but not in the current entry, treat_as_string=True - self.assertEqual(self.child_entry2._check_inherited_attribute('color', return_value=True), 'green,blue') - - # Test attribute present in the current entry and in parents, treat_as_string=True - self.assertEqual(self.child_entry2._check_inherited_attribute('size', return_value=True), 'medium,large') - - # Test attribute not present anywhere - self.assertIsNone(self.child_entry2._check_inherited_attribute('weight', return_value=True)) - - # Test attribute present in the current entry but not in parents, no return value - self.assertTrue(self.child_entry2._check_inherited_attribute('material', return_value=False)) - - # Test attribute not present anywhere, no return value - self.assertFalse(self.child_entry2._check_inherited_attribute('weight', return_value=False)) - - def test_check_inherited_attribute_bool(self): - # Test boolean attribute present in the current entry but not in parents - self.assertTrue(self.child_entry2._check_inherited_attribute('is_round', return_value=True)) - - def test_check_inherited_attribute_numeric(self): - # Test numeric attribute present only in the current entry - self.assertEqual(self.child_entry2._check_inherited_attribute('number', return_value=True), 5) +import unittest +from hed.schema.hed_schema_entry import HedTagEntry + + +class MockEntry: + def __init__(self, attributes, parent=None): + self.attributes = attributes + self.takes_value_child_entry = False + self._parent_tag = parent + + _check_inherited_attribute = HedTagEntry._check_inherited_attribute + _check_inherited_attribute_internal = HedTagEntry._check_inherited_attribute_internal + + +class TestMockEntry(unittest.TestCase): + + def setUp(self): + # Test setup + self.root_entry = MockEntry({'color': 'blue', 'size': 'large', 'is_round': False}) + self.child_entry1 = MockEntry({'color': 'green', 'shape': 'circle', 'is_round': True}, parent=self.root_entry) + self.child_entry2 = MockEntry({'size': 'medium', 'material': 'wood', 'number': 5}, parent=self.child_entry1) + + def test_check_inherited_attribute(self): + self.assertEqual(self.child_entry2._check_inherited_attribute('material', return_value=True), 'wood') + + # Test attribute present in the parent but not in the current entry, treat_as_string=True + self.assertEqual(self.child_entry2._check_inherited_attribute('color', return_value=True), 'green,blue') + + # Test attribute present in the current entry and in parents, treat_as_string=True + self.assertEqual(self.child_entry2._check_inherited_attribute('size', return_value=True), 'medium,large') + + # Test attribute not present anywhere + self.assertIsNone(self.child_entry2._check_inherited_attribute('weight', return_value=True)) + + # Test attribute present in the current entry but not in parents, no return value + self.assertTrue(self.child_entry2._check_inherited_attribute('material', return_value=False)) + + # Test attribute not present anywhere, no return value + self.assertFalse(self.child_entry2._check_inherited_attribute('weight', return_value=False)) + + def test_check_inherited_attribute_bool(self): + # Test boolean attribute present in the current entry but not in parents + self.assertTrue(self.child_entry2._check_inherited_attribute('is_round', return_value=True)) + + def test_check_inherited_attribute_numeric(self): + # Test numeric attribute present only in the current entry + self.assertEqual(self.child_entry2._check_inherited_attribute('number', return_value=True), 5) diff --git a/tests/schema/test_schema_util.py b/tests/schema/test_schema_util.py index 0d3498468..3ac4866da 100644 --- a/tests/schema/test_schema_util.py +++ b/tests/schema/test_schema_util.py @@ -1,42 +1,43 @@ -import unittest -import os - -from hed.schema.schema_io import schema_util -from hed.schema import HedSchemaGroup -from hed import load_schema_version -from hed import load_schema - - -class Test(unittest.TestCase): - @classmethod - def setUpClass(cls): - cls.default_test_url = \ - """https://raw.githubusercontent.com/hed-standard/hed-schemas/master/standard_schema/hedxml/HED8.0.0.xml""" - cls.hed_xml_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../schema_tests/HED8.0.0t.xml') - - def test_url_to_file(self): - downloaded_file = schema_util.url_to_file(self.default_test_url) - self.assertTrue(downloaded_file) - os.remove(downloaded_file) - - def test_schema_version_greater_equal(self): - schema1 = load_schema_version("8.0.0") - self.assertFalse(schema_util.schema_version_greater_equal(schema1, "8.3.0")) - - schema2 = load_schema_version("v:8.2.0") - self.assertFalse(schema_util.schema_version_greater_equal(schema2, "8.3.0")) - - schema_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), - '../data/schema_tests/schema_utf8.mediawiki') - schema3 = load_schema(schema_path, schema_namespace="tl:") - self.assertTrue(schema_util.schema_version_greater_equal(schema3, "8.3.0")) - - schema_group = HedSchemaGroup([schema1, schema2]) - self.assertFalse(schema_util.schema_version_greater_equal(schema_group, "8.3.0")) - - schema_group = HedSchemaGroup([schema2, schema3]) - self.assertTrue(schema_util.schema_version_greater_equal(schema_group, "8.3.0")) - -if __name__ == '__main__': - unittest.main() +import unittest +import os + +from hed.schema.schema_io import schema_util +from hed.schema import HedSchemaGroup +from hed import load_schema_version +from hed import load_schema + + +class Test(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.default_test_url = \ + """https://raw.githubusercontent.com/hed-standard/hed-schemas/master/standard_schema/hedxml/HED8.0.0.xml""" + cls.hed_xml_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../schema_tests/HED8.0.0t.xml') + + def test_url_to_file(self): + downloaded_file = schema_util.url_to_file(self.default_test_url) + self.assertTrue(downloaded_file) + os.remove(downloaded_file) + + def test_schema_version_greater_equal(self): + schema1 = load_schema_version("8.0.0") + self.assertFalse(schema_util.schema_version_greater_equal(schema1, "8.3.0")) + + schema2 = load_schema_version("v:8.2.0") + self.assertFalse(schema_util.schema_version_greater_equal(schema2, "8.3.0")) + + schema_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../data/schema_tests/schema_utf8.mediawiki') + schema3 = load_schema(schema_path, schema_namespace="tl:") + self.assertTrue(schema_util.schema_version_greater_equal(schema3, "8.3.0")) + + schema_group = HedSchemaGroup([schema1, schema2]) + self.assertFalse(schema_util.schema_version_greater_equal(schema_group, "8.3.0")) + + schema_group = HedSchemaGroup([schema2, schema3]) + self.assertTrue(schema_util.schema_version_greater_equal(schema_group, "8.3.0")) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/schema/test_schema_validation_util.py b/tests/schema/test_schema_validation_util.py index b8fd9e997..5cecc1b09 100644 --- a/tests/schema/test_schema_validation_util.py +++ b/tests/schema/test_schema_validation_util.py @@ -1,88 +1,87 @@ -import os -import unittest -import hed.schema.schema_validation_util as util -from hed.errors import ErrorHandler, SchemaWarnings -from hed import load_schema_version, load_schema, HedSchemaGroup -from hed.schema.hed_schema_entry import HedSchemaEntry, HedTagEntry - - -class Test(unittest.TestCase): - @classmethod - def setUpClass(cls): - cls.hed_schema = load_schema_version("8.1.0") - - def validate_term_base(self, input_text, expected_issues): - for text, issues in zip(input_text, expected_issues): - entry = HedTagEntry(name=text, section=None) - entry.short_tag_name = text - test_issues = util.validate_schema_tag_new(entry) - self.assertCountEqual(issues, test_issues) - - def validate_desc_base(self, input_descriptions, expected_issues): - for description, issues in zip(input_descriptions, expected_issues): - entry = HedSchemaEntry(name="dummy", section=None) - entry.description = description - test_issues = util.validate_schema_description_new(entry) - self.assertCountEqual(issues, test_issues) - - def test_validate_schema_term(self): - test_terms = [ - "invalidcaps", - "Validcaps", - "3numberisvalid", - "Invalidchar#", - "@invalidcharatstart", - ] - expected_issues = [ - ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CAPITALIZATION, test_terms[0], char_index=0, - problem_char="i"), - [], - [], - ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_TAG, test_terms[3], char_index=11, - problem_char="#"), - ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CAPITALIZATION, test_terms[4], char_index=0, - problem_char="@") - + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_TAG, test_terms[4], char_index=0, - problem_char="@"), - ] - self.validate_term_base(test_terms, expected_issues) - - def test_validate_schema_description(self): - test_descs = [ - "This is a tag description with no invalid characters.", - "This is (also) a tag description with no invalid characters. -_:;./()+ ^", - "This description has no invalid characters, as commas are allowed", - "This description has multiple invalid characters at the end {}[]" - ] - expected_issues = [ - [], - [], - [], - ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_DESC, test_descs[3], "dummy", - char_index=60, problem_char="{") - + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_DESC, test_descs[3], "dummy", - char_index=61, problem_char="}") - + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_DESC, test_descs[3], "dummy", - char_index=62, problem_char="[") - + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_DESC, test_descs[3], "dummy", - char_index=63, problem_char="]") - - ] - self.validate_desc_base(test_descs, expected_issues) - - def test_schema_version_for_library(self): - schema1 = load_schema_version("8.0.0") - self.assertEqual(util.schema_version_for_library(schema1, ""), "8.0.0") - self.assertEqual(util.schema_version_for_library(schema1, None), "8.0.0") - - schema2 = load_schema_version("8.3.0") - self.assertEqual(util.schema_version_for_library(schema2, ""), "8.3.0") - self.assertEqual(util.schema_version_for_library(schema2, None), "8.3.0") - - schema3 = load_schema_version(["testlib_2.0.0", "score_1.1.0"]) - self.assertEqual(util.schema_version_for_library(schema3, ""), "8.2.0") - self.assertEqual(util.schema_version_for_library(schema3, None), "8.2.0") - self.assertEqual(util.schema_version_for_library(schema3, "score"), "1.1.0") - self.assertEqual(util.schema_version_for_library(schema3, "testlib"), "2.0.0") - - self.assertEqual(util.schema_version_for_library(schema3, "badlib"), None) +import unittest +import hed.schema.schema_validation_util as util +from hed.errors import ErrorHandler, SchemaWarnings +from hed import load_schema_version +from hed.schema.hed_schema_entry import HedSchemaEntry, HedTagEntry + + +class Test(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.hed_schema = load_schema_version("8.1.0") + + def validate_term_base(self, input_text, expected_issues): + for text, issues in zip(input_text, expected_issues): + entry = HedTagEntry(name=text, section=None) + entry.short_tag_name = text + test_issues = util.validate_schema_tag_new(entry) + self.assertCountEqual(issues, test_issues) + + def validate_desc_base(self, input_descriptions, expected_issues): + for description, issues in zip(input_descriptions, expected_issues): + entry = HedSchemaEntry(name="dummy", section=None) + entry.description = description + test_issues = util.validate_schema_description_new(entry) + self.assertCountEqual(issues, test_issues) + + def test_validate_schema_term(self): + test_terms = [ + "invalidcaps", + "Validcaps", + "3numberisvalid", + "Invalidchar#", + "@invalidcharatstart", + ] + expected_issues = [ + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CAPITALIZATION, test_terms[0], char_index=0, + problem_char="i"), + [], + [], + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_TAG, test_terms[3], char_index=11, + problem_char="#"), + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CAPITALIZATION, test_terms[4], char_index=0, + problem_char="@") + + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_TAG, test_terms[4], char_index=0, + problem_char="@"), + ] + self.validate_term_base(test_terms, expected_issues) + + def test_validate_schema_description(self): + test_descs = [ + "This is a tag description with no invalid characters.", + "This is (also) a tag description with no invalid characters. -_:;./()+ ^", + "This description has no invalid characters, as commas are allowed", + "This description has multiple invalid characters at the end {}[]" + ] + expected_issues = [ + [], + [], + [], + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_DESC, test_descs[3], "dummy", + char_index=60, problem_char="{") + + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_DESC, test_descs[3], "dummy", + char_index=61, problem_char="}") + + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_DESC, test_descs[3], "dummy", + char_index=62, problem_char="[") + + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_DESC, test_descs[3], "dummy", + char_index=63, problem_char="]") + + ] + self.validate_desc_base(test_descs, expected_issues) + + def test_schema_version_for_library(self): + schema1 = load_schema_version("8.0.0") + self.assertEqual(util.schema_version_for_library(schema1, ""), "8.0.0") + self.assertEqual(util.schema_version_for_library(schema1, None), "8.0.0") + + schema2 = load_schema_version("8.3.0") + self.assertEqual(util.schema_version_for_library(schema2, ""), "8.3.0") + self.assertEqual(util.schema_version_for_library(schema2, None), "8.3.0") + + schema3 = load_schema_version(["testlib_2.0.0", "score_1.1.0"]) + self.assertEqual(util.schema_version_for_library(schema3, ""), "8.2.0") + self.assertEqual(util.schema_version_for_library(schema3, None), "8.2.0") + self.assertEqual(util.schema_version_for_library(schema3, "score"), "1.1.0") + self.assertEqual(util.schema_version_for_library(schema3, "testlib"), "2.0.0") + + self.assertEqual(util.schema_version_for_library(schema3, "badlib"), None) diff --git a/tests/schema/test_schema_validation_util_deprecated.py b/tests/schema/test_schema_validation_util_deprecated.py index 5da596b39..441687d82 100644 --- a/tests/schema/test_schema_validation_util_deprecated.py +++ b/tests/schema/test_schema_validation_util_deprecated.py @@ -1,69 +1,68 @@ -import os -import unittest -import hed.schema.schema_validation_util_deprecated as util -from hed.schema.hed_schema_entry import HedSchemaEntry, HedTagEntry -from hed.errors import ErrorHandler, SchemaWarnings -from hed import load_schema_version - - -class Test(unittest.TestCase): - @classmethod - def setUpClass(cls): - cls.hed_schema = load_schema_version("8.1.0") - - def validate_term_base(self, input_text, expected_issues): - for text, issues in zip(input_text, expected_issues): - entry = HedTagEntry(name=text, section=None) - entry.short_tag_name = text - test_issues = util.validate_schema_tag(entry) - self.assertCountEqual(issues, test_issues) - - def validate_desc_base(self, input_descriptions, expected_issues): - for description, issues in zip(input_descriptions, expected_issues): - entry = HedSchemaEntry(name="dummy", section=None) - entry.description = description - test_issues = util.validate_schema_description(entry) - self.assertCountEqual(issues, test_issues) - - def test_validate_schema_term(self): - test_terms = [ - "invalidcaps", - "Validcaps", - "3numberisvalid", - "Invalidchar#", - "@invalidcharatstart", - ] - expected_issues = [ - ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CAPITALIZATION, test_terms[0], char_index=0, - problem_char="i"), - [], - [], - ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_TAG, test_terms[3], char_index=11, - problem_char="#"), - ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CAPITALIZATION, test_terms[4], char_index=0, - problem_char="@"), - ] - self.validate_term_base(test_terms, expected_issues) - - def test_validate_schema_description(self): - test_descs = [ - "This is a tag description with no invalid characters.", - "This is (also) a tag description with no invalid characters. -_:;./()+ ^", - "This description has no invalid characters, as commas are allowed", - "This description has multiple invalid characters at the end @$%*" - ] - expected_issues = [ - [], - [], - [], - ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_DESC, test_descs[3], "dummy", - char_index=60, problem_char="@") - + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_DESC, test_descs[3], "dummy", - char_index=61, problem_char="$") - + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_DESC, test_descs[3], "dummy", - char_index=62, problem_char="%") - + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_DESC, test_descs[3], "dummy", - char_index=63, problem_char="*") - - ] - self.validate_desc_base(test_descs, expected_issues) \ No newline at end of file +import unittest +import hed.schema.schema_validation_util_deprecated as util +from hed.schema.hed_schema_entry import HedSchemaEntry, HedTagEntry +from hed.errors import ErrorHandler, SchemaWarnings +from hed import load_schema_version + + +class Test(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.hed_schema = load_schema_version("8.1.0") + + def validate_term_base(self, input_text, expected_issues): + for text, issues in zip(input_text, expected_issues): + entry = HedTagEntry(name=text, section=None) + entry.short_tag_name = text + test_issues = util.validate_schema_tag(entry) + self.assertCountEqual(issues, test_issues) + + def validate_desc_base(self, input_descriptions, expected_issues): + for description, issues in zip(input_descriptions, expected_issues): + entry = HedSchemaEntry(name="dummy", section=None) + entry.description = description + test_issues = util.validate_schema_description(entry) + self.assertCountEqual(issues, test_issues) + + def test_validate_schema_term(self): + test_terms = [ + "invalidcaps", + "Validcaps", + "3numberisvalid", + "Invalidchar#", + "@invalidcharatstart", + ] + expected_issues = [ + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CAPITALIZATION, test_terms[0], char_index=0, + problem_char="i"), + [], + [], + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_TAG, test_terms[3], char_index=11, + problem_char="#"), + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CAPITALIZATION, test_terms[4], char_index=0, + problem_char="@"), + ] + self.validate_term_base(test_terms, expected_issues) + + def test_validate_schema_description(self): + test_descs = [ + "This is a tag description with no invalid characters.", + "This is (also) a tag description with no invalid characters. -_:;./()+ ^", + "This description has no invalid characters, as commas are allowed", + "This description has multiple invalid characters at the end @$%*" + ] + expected_issues = [ + [], + [], + [], + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_DESC, test_descs[3], "dummy", + char_index=60, problem_char="@") + + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_DESC, test_descs[3], "dummy", + char_index=61, problem_char="$") + + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_DESC, test_descs[3], "dummy", + char_index=62, problem_char="%") + + ErrorHandler.format_error(SchemaWarnings.SCHEMA_INVALID_CHARACTERS_IN_DESC, test_descs[3], "dummy", + char_index=63, problem_char="*") + + ] + self.validate_desc_base(test_descs, expected_issues) diff --git a/tests/schema/test_schema_validator_hed_id.py b/tests/schema/test_schema_validator_hed_id.py new file mode 100644 index 000000000..fd01bc5d7 --- /dev/null +++ b/tests/schema/test_schema_validator_hed_id.py @@ -0,0 +1,56 @@ +import unittest +import copy + +from hed.schema.schema_attribute_validator_hed_id import HedIDValidator +from hed.schema import hed_schema_constants +from hed import load_schema_version +from hed.schema import HedKey + + +# tests needed: +# 1. Verify HED id(HARDEST, MAY SKIP) +# 4. Json tests + +class Test(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.hed_schema = load_schema_version("8.3.0") + cls.test_schema = load_schema_version("testlib_3.0.0") + cls.hed_schema84 = copy.deepcopy(cls.hed_schema) + cls.hed_schema84.header_attributes[hed_schema_constants.VERSION_ATTRIBUTE] = "8.4.0" + + def test_constructor(self): + id_validator = HedIDValidator(self.hed_schema) + + self.assertTrue(id_validator._previous_schemas[""]) + self.assertTrue(id_validator.library_data[""]) + self.assertEqual(id_validator._previous_schemas[""].version_number, "8.2.0") + + id_validator = HedIDValidator(self.test_schema) + + self.assertTrue(id_validator._previous_schemas[""]) + self.assertTrue(id_validator.library_data[""]) + self.assertTrue(id_validator._previous_schemas["testlib"]) + self.assertEqual(id_validator.library_data.get("testlib"), None) + self.assertEqual(id_validator._previous_schemas["testlib"].version_number, "2.1.0") + self.assertEqual(id_validator._previous_schemas[""].version_number, "8.1.0") + + def test_get_previous_version(self): + self.assertEqual(HedIDValidator._get_previous_version("8.3.0", ""), "8.2.0") + self.assertEqual(HedIDValidator._get_previous_version("8.2.0", ""), "8.1.0") + self.assertEqual(HedIDValidator._get_previous_version("8.0.0", ""), None) + self.assertEqual(HedIDValidator._get_previous_version("3.0.0", "testlib"), "testlib_2.1.0") + + def test_verify_tag_id(self): + event_entry = self.hed_schema84.tags["Event"] + event_entry.attributes[HedKey.HedID] = "HED_0000000" + + id_validator = HedIDValidator(self.hed_schema84) + + issues = id_validator.verify_tag_id(self.hed_schema84, event_entry, HedKey.HedID) + self.assertTrue("It has changed", issues[0]["message"]) + self.assertTrue("between 10000", issues[0]["message"]) + + event_entry = self.hed_schema84.tags["Event"] + event_entry.attributes[HedKey.HedID] = "HED_XXXXXXX" + self.assertTrue("It must be an integer in the format", issues[0]["message"]) diff --git a/tests/schema/test_schema_wiki_fatal_errors.py b/tests/schema/test_schema_wiki_fatal_errors.py index 43348432e..835b47d0f 100644 --- a/tests/schema/test_schema_wiki_fatal_errors.py +++ b/tests/schema/test_schema_wiki_fatal_errors.py @@ -1,117 +1,114 @@ -import unittest -import os - -from hed import load_schema -from hed.errors import HedFileError, HedExceptions - - -class TestHedSchema(unittest.TestCase): - base_schema_dir = '../data/schema_tests/wiki_tests/' - - @classmethod - def setUpClass(cls): - cls.full_base_folder = os.path.join(os.path.dirname(os.path.realpath(__file__)), cls.base_schema_dir) - cls.files_and_errors = { - "HED_schema_no_start.mediawiki": HedExceptions.SCHEMA_SECTION_MISSING, - "HED_schema_no_end.mediawiki": HedExceptions.SCHEMA_SECTION_MISSING, - "HED_hed_no_end.mediawiki": HedExceptions.SCHEMA_SECTION_MISSING, - "HED_separator_invalid.mediawiki": HedExceptions.WIKI_SEPARATOR_INVALID, - "HED_header_missing.mediawiki": HedExceptions.SCHEMA_HEADER_MISSING, - "HED_header_invalid.mediawiki": HedExceptions.SCHEMA_HEADER_INVALID, - "empty_file.mediawiki": HedExceptions.SCHEMA_HEADER_INVALID, - "HED_header_invalid_version.mediawiki": HedExceptions.SCHEMA_VERSION_INVALID, - "HED_header_missing_version.mediawiki": HedExceptions.SCHEMA_VERSION_INVALID, - "HED_header_unknown_attribute.mediawiki": HedExceptions.SCHEMA_UNKNOWN_HEADER_ATTRIBUTE, - "HED_header_bad_library.mediawiki": HedExceptions.BAD_HED_LIBRARY_NAME, - "HED_schema_out_of_order.mediawiki": HedExceptions.SCHEMA_SECTION_MISSING, - "empty_node.mediawiki": HedExceptions.WIKI_DELIMITERS_INVALID, - "malformed_line.mediawiki": HedExceptions.WIKI_DELIMITERS_INVALID, - "malformed_line2.mediawiki": HedExceptions.WIKI_DELIMITERS_INVALID, - "malformed_line3.mediawiki": HedExceptions.WIKI_DELIMITERS_INVALID, - "malformed_line4.mediawiki": HedExceptions.WIKI_DELIMITERS_INVALID, - "malformed_line5.mediawiki": HedExceptions.WIKI_DELIMITERS_INVALID, - "malformed_line6.mediawiki": HedExceptions.WIKI_DELIMITERS_INVALID, - "malformed_line7.mediawiki": HedExceptions.WIKI_DELIMITERS_INVALID, - "empty_node.xml": HedExceptions.HED_SCHEMA_NODE_NAME_INVALID - } - - cls.expected_count = { - "empty_node.mediawiki": 1, - "malformed_line.mediawiki": 1, - "malformed_line2.mediawiki": 2, - "malformed_line3.mediawiki": 2, - "malformed_line4.mediawiki": 1, - "malformed_line5.mediawiki": 1, - "malformed_line6.mediawiki": 2, - "malformed_line7.mediawiki": 2, - 'HED_schema_no_start.mediawiki': 1 - } - cls.expected_line_numbers = { - "empty_node.mediawiki": [9], - "malformed_line.mediawiki": [9], - "malformed_line2.mediawiki": [9, 9], - "malformed_line3.mediawiki": [9, 9], - "malformed_line4.mediawiki": [9], - "malformed_line5.mediawiki": [9], - "malformed_line6.mediawiki": [9, 10], - "malformed_line7.mediawiki": [9, 10], - } - - def test_invalid_schema(self): - for filename, error in self.files_and_errors.items(): - full_filename = self.full_base_folder + filename - with self.assertRaises(HedFileError) as context: - load_schema(full_filename) - # all of these should produce exceptions. - from hed.errors import ErrorHandler, ErrorContext, get_printable_issue_string - - # Verify basic properties of exception - expected_line_numbers = self.expected_line_numbers.get(filename, []) - if expected_line_numbers: - for issue, expected in zip(context.exception.issues, expected_line_numbers): - self.assertEqual(issue[ErrorContext.ROW], expected) - - - issues = context.exception.issues - - self.assertIsInstance(get_printable_issue_string(issues), str) - - self.assertTrue(context.exception.args[0] == error) - self.assertTrue(context.exception.filename == full_filename) - - - def test_merging_errors_schema(self): - for filename, error in self.files_and_errors.items(): - full_filename = self.full_base_folder + filename - with self.assertRaises(HedFileError) as context: - load_schema(full_filename) - # all of these should produce exceptions. - from hed.errors import ErrorHandler, ErrorContext, get_printable_issue_string - from hed.errors.error_types import SchemaAttributeErrors - # Verify basic properties of exception - expected_line_numbers = self.expected_line_numbers.get(filename, []) - if expected_line_numbers: - for issue, expected in zip(context.exception.issues, expected_line_numbers): - self.assertEqual(issue[ErrorContext.ROW], expected) - - error_handler = ErrorHandler() - - error_handler.push_error_context(ErrorContext.ROW, 1) - error_handler.push_error_context(ErrorContext.COLUMN, 2) - - issues = error_handler.format_error_with_context(SchemaAttributeErrors.SCHEMA_ATTRIBUTE_INVALID, - "error_attribute", source_tag="error_tag") - error_handler.pop_error_context() - error_handler.pop_error_context() - - issues += context.exception.issues - self.assertIsInstance(get_printable_issue_string(issues), str) - - self.assertTrue(context.exception.args[0] == error) - self.assertTrue(context.exception.filename == full_filename) - - def test_attribute_invalid(self): - path = os.path.join(self.full_base_folder, "attribute_unknown1.mediawiki") - schema = load_schema(path) - issues = schema.check_compliance() - self.assertEqual(len(issues), 7) \ No newline at end of file +import unittest +import os + +from hed import load_schema +from hed.errors import HedFileError, HedExceptions + + +class TestHedSchema(unittest.TestCase): + base_schema_dir = '../data/schema_tests/wiki_tests/' + + @classmethod + def setUpClass(cls): + cls.full_base_folder = os.path.join(os.path.dirname(os.path.realpath(__file__)), cls.base_schema_dir) + cls.files_and_errors = { + "HED_schema_no_start.mediawiki": HedExceptions.SCHEMA_SECTION_MISSING, + "HED_schema_no_end.mediawiki": HedExceptions.SCHEMA_SECTION_MISSING, + "HED_hed_no_end.mediawiki": HedExceptions.SCHEMA_SECTION_MISSING, + "HED_separator_invalid.mediawiki": HedExceptions.WIKI_SEPARATOR_INVALID, + "HED_header_missing.mediawiki": HedExceptions.SCHEMA_HEADER_MISSING, + "HED_header_invalid.mediawiki": HedExceptions.SCHEMA_HEADER_INVALID, + "empty_file.mediawiki": HedExceptions.SCHEMA_HEADER_INVALID, + "HED_header_invalid_version.mediawiki": HedExceptions.SCHEMA_VERSION_INVALID, + "HED_header_missing_version.mediawiki": HedExceptions.SCHEMA_VERSION_INVALID, + "HED_header_unknown_attribute.mediawiki": HedExceptions.SCHEMA_UNKNOWN_HEADER_ATTRIBUTE, + "HED_header_bad_library.mediawiki": HedExceptions.BAD_HED_LIBRARY_NAME, + "HED_schema_out_of_order.mediawiki": HedExceptions.SCHEMA_SECTION_MISSING, + "empty_node.mediawiki": HedExceptions.WIKI_DELIMITERS_INVALID, + "malformed_line.mediawiki": HedExceptions.WIKI_DELIMITERS_INVALID, + "malformed_line2.mediawiki": HedExceptions.WIKI_DELIMITERS_INVALID, + "malformed_line3.mediawiki": HedExceptions.WIKI_DELIMITERS_INVALID, + "malformed_line4.mediawiki": HedExceptions.WIKI_DELIMITERS_INVALID, + "malformed_line5.mediawiki": HedExceptions.WIKI_DELIMITERS_INVALID, + "malformed_line6.mediawiki": HedExceptions.WIKI_DELIMITERS_INVALID, + "malformed_line7.mediawiki": HedExceptions.WIKI_DELIMITERS_INVALID, + "empty_node.xml": HedExceptions.HED_SCHEMA_NODE_NAME_INVALID + } + + cls.expected_count = { + "empty_node.mediawiki": 1, + "malformed_line.mediawiki": 1, + "malformed_line2.mediawiki": 2, + "malformed_line3.mediawiki": 2, + "malformed_line4.mediawiki": 1, + "malformed_line5.mediawiki": 1, + "malformed_line6.mediawiki": 2, + "malformed_line7.mediawiki": 2, + 'HED_schema_no_start.mediawiki': 1 + } + cls.expected_line_numbers = { + "empty_node.mediawiki": [9], + "malformed_line.mediawiki": [9], + "malformed_line2.mediawiki": [9, 9], + "malformed_line3.mediawiki": [9, 9], + "malformed_line4.mediawiki": [9], + "malformed_line5.mediawiki": [9], + "malformed_line6.mediawiki": [9, 10], + "malformed_line7.mediawiki": [9, 10], + } + + def test_invalid_schema(self): + for filename, error in self.files_and_errors.items(): + full_filename = self.full_base_folder + filename + with self.assertRaises(HedFileError) as context: + load_schema(full_filename) + # all of these should produce exceptions. + from hed.errors import ErrorContext, get_printable_issue_string + + # Verify basic properties of exception + expected_line_numbers = self.expected_line_numbers.get(filename, []) + if expected_line_numbers: + for issue, expected in zip(context.exception.issues, expected_line_numbers): + self.assertEqual(issue[ErrorContext.ROW], expected) + issues = context.exception.issues + + self.assertIsInstance(get_printable_issue_string(issues), str) + + self.assertTrue(context.exception.args[0] == error) + self.assertTrue(context.exception.filename == full_filename) + + def test_merging_errors_schema(self): + for filename, error in self.files_and_errors.items(): + full_filename = self.full_base_folder + filename + with self.assertRaises(HedFileError) as context: + load_schema(full_filename) + # all of these should produce exceptions. + from hed.errors import ErrorHandler, ErrorContext, get_printable_issue_string + from hed.errors.error_types import SchemaAttributeErrors + # Verify basic properties of exception + expected_line_numbers = self.expected_line_numbers.get(filename, []) + if expected_line_numbers: + for issue, expected in zip(context.exception.issues, expected_line_numbers): + self.assertEqual(issue[ErrorContext.ROW], expected) + + error_handler = ErrorHandler() + + error_handler.push_error_context(ErrorContext.ROW, 1) + error_handler.push_error_context(ErrorContext.COLUMN, 2) + + issues = error_handler.format_error_with_context(SchemaAttributeErrors.SCHEMA_ATTRIBUTE_INVALID, + "error_attribute", source_tag="error_tag") + error_handler.pop_error_context() + error_handler.pop_error_context() + + issues += context.exception.issues + self.assertIsInstance(get_printable_issue_string(issues), str) + + self.assertTrue(context.exception.args[0] == error) + self.assertTrue(context.exception.filename == full_filename) + + def test_attribute_invalid(self): + path = os.path.join(self.full_base_folder, "attribute_unknown1.mediawiki") + schema = load_schema(path) + issues = schema.check_compliance() + self.assertEqual(len(issues), 7) diff --git a/tests/schema/util_create_schemas.py b/tests/schema/util_create_schemas.py index 4add2b072..d6f13c76d 100644 --- a/tests/schema/util_create_schemas.py +++ b/tests/schema/util_create_schemas.py @@ -1,64 +1,66 @@ -from hed.schema import HedKey, HedSectionKey, from_string - - -library_schema_start = """HED library="testcomparison" version="1.1.0" withStandard="8.3.0" unmerged="true" - -'''Prologue''' - -!# start schema - -""" - -library_schema_end = """ - - -!# end hed - """ - -default_end_lines = """ -!# end schema -""" - -required_non_tag = [ -"'''Unit classes'''", -"'''Unit modifiers'''", -"'''Value classes'''", -"'''Schema attributes'''", -"'''Properties'''", -"'''Epilogue'''" -] -def _get_test_schema(node_lines, other_lines=(default_end_lines,)): - node_section = "\n".join(node_lines) - non_tag_section = "\n".join(other_lines) - for name in required_non_tag: - if name not in other_lines: - non_tag_section += f"\n{name}\n" - library_schema_string = library_schema_start + node_section + non_tag_section + library_schema_end - test_schema = from_string(library_schema_string, ".mediawiki") - - return test_schema - - -def load_schema1(): - test_nodes = ["'''TestNode''' [This is a simple test node]\n", - " *TestNode2", - " *TestNode3", - " *TestNode4" - ] - return _get_test_schema(test_nodes) - - -def load_schema2(): - test_nodes = ["'''TestNode''' [This is a simple test node]\n", - " *TestNode2", - " **TestNode3", - " *TestNode5" - ] - - return _get_test_schema(test_nodes) - - -def load_schema_intensity(): - test_nodes = ["'''IntensityTakesValue'''", - " * # {unitClass=intensityUnits}"] - return _get_test_schema(test_nodes) \ No newline at end of file +from hed.schema import from_string + + +library_schema_start = """HED library="testcomparison" version="1.1.0" withStandard="8.3.0" unmerged="true" + +'''Prologue''' + +!# start schema + +""" + +library_schema_end = """ + + +!# end hed + """ + +default_end_lines = """ +!# end schema +""" + +required_non_tag = [ + "'''Unit classes'''", + "'''Unit modifiers'''", + "'''Value classes'''", + "'''Schema attributes'''", + "'''Properties'''", + "'''Epilogue'''" +] + + +def _get_test_schema(node_lines, other_lines=(default_end_lines,)): + node_section = "\n".join(node_lines) + non_tag_section = "\n".join(other_lines) + for name in required_non_tag: + if name not in other_lines: + non_tag_section += f"\n{name}\n" + library_schema_string = library_schema_start + node_section + non_tag_section + library_schema_end + test_schema = from_string(library_schema_string, ".mediawiki") + + return test_schema + + +def load_schema1(): + test_nodes = ["'''TestNode''' [This is a simple test node]\n", + " *TestNode2", + " *TestNode3", + " *TestNode4" + ] + return _get_test_schema(test_nodes) + + +def load_schema2(): + test_nodes = ["'''TestNode''' [This is a simple test node]\n", + " *TestNode2", + " **TestNode3", + " *TestNode5" + ] + + return _get_test_schema(test_nodes) + + +def load_schema_intensity(): + test_nodes = ["'''IntensityTakesValue'''", + " * # {unitClass=intensityUnits}"] + return _get_test_schema(test_nodes) diff --git a/tests/scripts/test_convert_and_update_schema.py b/tests/scripts/test_convert_and_update_schema.py index 370d997a9..39597f76b 100644 --- a/tests/scripts/test_convert_and_update_schema.py +++ b/tests/scripts/test_convert_and_update_schema.py @@ -1,95 +1,94 @@ -import unittest -import shutil -import copy -import os -from hed import load_schema, load_schema_version -from hed.schema import HedSectionKey, HedKey -from hed.scripts.script_util import add_extension -from hed.scripts.convert_and_update_schema import convert_and_update -import contextlib - - -class TestConvertAndUpdate(unittest.TestCase): - @classmethod - def setUpClass(cls): - # Create a temporary directory for schema files - cls.base_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'schemas_update', 'prerelease') - if not os.path.exists(cls.base_path): - os.makedirs(cls.base_path) - - def test_schema_conversion_and_update(self): - # Load a known schema, modify it if necessary, and save it - schema = load_schema_version("8.3.0") - original_name = os.path.join(self.base_path, "test_schema.mediawiki") - schema.save_as_mediawiki(original_name) - - # Assume filenames updated includes just the original schema file for simplicity - filenames = [original_name] - with contextlib.redirect_stdout(None): - result = convert_and_update(filenames, set_ids=False) - - # Verify no error from convert_and_update and the correct schema version was saved - self.assertEqual(result, 0) - - tsv_filename = add_extension(os.path.join(self.base_path, "test_schema"), ".tsv") - schema_reload1 = load_schema(tsv_filename) - schema_reload2 = load_schema(os.path.join(self.base_path, "test_schema.xml")) - - self.assertEqual(schema, schema_reload1) - self.assertEqual(schema, schema_reload2) - - # Now verify after doing this again with a new schema, they're still the same. - schema = load_schema_version("8.3.0") - schema.save_as_dataframes(tsv_filename) - - filenames = [os.path.join(tsv_filename, "test_schema_Tag.tsv")] - with contextlib.redirect_stdout(None): - result = convert_and_update(filenames, set_ids=False) - - # Verify no error from convert_and_update and the correct schema version was saved - self.assertEqual(result, 0) - - schema_reload1 = load_schema(os.path.join(self.base_path, "test_schema.mediawiki")) - schema_reload2 = load_schema(os.path.join(self.base_path, "test_schema.xml")) - - self.assertEqual(schema, schema_reload1) - self.assertEqual(schema, schema_reload2) - - def test_schema_adding_tag(self): - schema = load_schema_version("8.3.0") - basename = os.path.join(self.base_path, "test_schema_edited") - schema.save_as_mediawiki(add_extension(basename, ".mediawiki")) - schema.save_as_xml(add_extension(basename, ".xml")) - schema.save_as_dataframes(add_extension(basename, ".tsv")) - - schema_edited = copy.deepcopy(schema) - test_tag_name = "NewTagWithoutID" - new_entry = schema_edited._create_tag_entry(test_tag_name, HedSectionKey.Tags) - schema_edited._add_tag_to_dict(test_tag_name, new_entry, HedSectionKey.Tags) - - schema_edited.save_as_mediawiki(add_extension(basename, ".mediawiki")) - - # Assume filenames updated includes just the original schema file for simplicity - filenames = [add_extension(basename, ".mediawiki")] - with contextlib.redirect_stdout(None): - result = convert_and_update(filenames, set_ids=False) - self.assertEqual(result, 0) - - schema_reloaded = load_schema(add_extension(basename, ".xml")) - - self.assertEqual(schema_reloaded, schema_edited) - - with contextlib.redirect_stdout(None): - result = convert_and_update(filenames, set_ids=True) - self.assertEqual(result, 0) - - schema_reloaded = load_schema(add_extension(basename, ".xml")) - - reloaded_entry = schema_reloaded.tags[test_tag_name] - self.assertTrue(reloaded_entry.has_attribute(HedKey.HedID)) - - - @classmethod - def tearDownClass(cls): - # Clean up the directory created for testing - shutil.rmtree(cls.base_path) +import unittest +import shutil +import copy +import os +from hed import load_schema, load_schema_version +from hed.schema import HedSectionKey, HedKey +from hed.scripts.script_util import add_extension +from hed.scripts.convert_and_update_schema import convert_and_update +import contextlib + + +class TestConvertAndUpdate(unittest.TestCase): + @classmethod + def setUpClass(cls): + # Create a temporary directory for schema files + cls.base_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'schemas_update', 'prerelease') + if not os.path.exists(cls.base_path): + os.makedirs(cls.base_path) + + def test_schema_conversion_and_update(self): + # Load a known schema, modify it if necessary, and save it + schema = load_schema_version("8.3.0") + original_name = os.path.join(self.base_path, "test_schema.mediawiki") + schema.save_as_mediawiki(original_name) + + # Assume filenames updated includes just the original schema file for simplicity + filenames = [original_name] + with contextlib.redirect_stdout(None): + result = convert_and_update(filenames, set_ids=False) + + # Verify no error from convert_and_update and the correct schema version was saved + self.assertEqual(result, 0) + + tsv_filename = add_extension(os.path.join(self.base_path, "test_schema"), ".tsv") + schema_reload1 = load_schema(tsv_filename) + schema_reload2 = load_schema(os.path.join(self.base_path, "test_schema.xml")) + + self.assertEqual(schema, schema_reload1) + self.assertEqual(schema, schema_reload2) + + # Now verify after doing this again with a new schema, they're still the same. + schema = load_schema_version("8.3.0") + schema.save_as_dataframes(tsv_filename) + + filenames = [os.path.join(tsv_filename, "test_schema_Tag.tsv")] + with contextlib.redirect_stdout(None): + result = convert_and_update(filenames, set_ids=False) + + # Verify no error from convert_and_update and the correct schema version was saved + self.assertEqual(result, 0) + + schema_reload1 = load_schema(os.path.join(self.base_path, "test_schema.mediawiki")) + schema_reload2 = load_schema(os.path.join(self.base_path, "test_schema.xml")) + + self.assertEqual(schema, schema_reload1) + self.assertEqual(schema, schema_reload2) + + def test_schema_adding_tag(self): + schema = load_schema_version("8.3.0") + basename = os.path.join(self.base_path, "test_schema_edited") + schema.save_as_mediawiki(add_extension(basename, ".mediawiki")) + schema.save_as_xml(add_extension(basename, ".xml")) + schema.save_as_dataframes(add_extension(basename, ".tsv")) + + schema_edited = copy.deepcopy(schema) + test_tag_name = "NewTagWithoutID" + new_entry = schema_edited._create_tag_entry(test_tag_name, HedSectionKey.Tags) + schema_edited._add_tag_to_dict(test_tag_name, new_entry, HedSectionKey.Tags) + + schema_edited.save_as_mediawiki(add_extension(basename, ".mediawiki")) + + # Assume filenames updated includes just the original schema file for simplicity + filenames = [add_extension(basename, ".mediawiki")] + with contextlib.redirect_stdout(None): + result = convert_and_update(filenames, set_ids=False) + self.assertEqual(result, 0) + + schema_reloaded = load_schema(add_extension(basename, ".xml")) + + self.assertEqual(schema_reloaded, schema_edited) + + with contextlib.redirect_stdout(None): + result = convert_and_update(filenames, set_ids=True) + self.assertEqual(result, 0) + + schema_reloaded = load_schema(add_extension(basename, ".xml")) + + reloaded_entry = schema_reloaded.tags[test_tag_name] + self.assertTrue(reloaded_entry.has_attribute(HedKey.HedID)) + + @classmethod + def tearDownClass(cls): + # Clean up the directory created for testing + shutil.rmtree(cls.base_path) diff --git a/tests/scripts/test_script_util.py b/tests/scripts/test_script_util.py index 55989be16..bd7da7e8d 100644 --- a/tests/scripts/test_script_util.py +++ b/tests/scripts/test_script_util.py @@ -1,177 +1,178 @@ -import unittest -import os -import shutil -from hed import load_schema_version -from hed.scripts.script_util import add_extension, sort_base_schemas, validate_all_schema_formats, validate_schema -import contextlib - - -class TestAddExtension(unittest.TestCase): - - def test_regular_extension(self): - """Test that regular extensions are added correctly.""" - self.assertEqual(add_extension("filename", ".txt"), "filename.txt") - self.assertEqual(add_extension("document", ".pdf"), "document.pdf") - - def test_tsv_extension(self): - """Test that .tsv extensions are handled differently.""" - # Assuming the function correctly handles paths with directories - self.assertEqual(add_extension(os.path.normpath("path/to/filename"), ".tsv"), os.path.normpath("path/to/hedtsv/filename")) - # Testing with a basename only - self.assertEqual(add_extension("filename", ".tsv"), os.path.normpath("hedtsv/filename")) - - def test_empty_extension(self): - """Test adding an empty extension.""" - self.assertEqual(add_extension("filename", ""), "filename") - - def test_none_extension(self): - """Test behavior with None as extension.""" - with self.assertRaises(TypeError): - add_extension("filename", None) - - -class TestSortBaseSchemas(unittest.TestCase): - TEST_DIR = 'test_directory' - - @classmethod - def setUpClass(cls): - if not os.path.exists(cls.TEST_DIR): - os.makedirs(cls.TEST_DIR) - os.chdir(cls.TEST_DIR) - cls.create_stub_files() - - @classmethod - def tearDownClass(cls): - os.chdir('..') - shutil.rmtree(cls.TEST_DIR) - - @classmethod - def create_stub_files(cls): - filenames = [ - "test_schema.mediawiki", - os.path.normpath("hedtsv/test_schema/test_schema_Tag.tsv"), - "other_schema.xml", - os.path.normpath("hedtsv/wrong_folder/wrong_name_Tag.tsv"), - os.path.normpath("prerelease/hedtsv/test_schema/test_schema_Tag.tsv"), - os.path.normpath("not_hedtsv/test_schema/test_schema_Tag.tsv") - ] - for filename in filenames: - filepath = os.path.normpath(filename) - directory = os.path.dirname(filepath) - if directory: - os.makedirs(directory, exist_ok=True) - with open(filepath, 'w') as f: - f.write('') # Create an empty file - - def test_mixed_file_types(self): - filenames = [ - "test_schema.mediawiki", - os.path.normpath("hedtsv/test_schema/test_schema_Tag.tsv"), - "other_schema.xml" - ] - expected = { - "test_schema": {".mediawiki", ".tsv"}, - "other_schema": {".xml"} - } - with contextlib.redirect_stdout(None): - result = sort_base_schemas(filenames) - self.assertEqual(dict(result), expected) - - def test_tsv_in_correct_subfolder(self): - filenames = [ - os.path.normpath("hedtsv/test_schema/test_schema_Tag.tsv"), - os.path.normpath("hedtsv/test_schema/test_schema_Tag.tsv"), - os.path.normpath("hedtsv/wrong_folder/wrong_name_Tag.tsv") # Should be ignored - ] - expected = { - "test_schema": {".tsv"} - } - with contextlib.redirect_stdout(None): - result = sort_base_schemas(filenames) - self.assertEqual(dict(result), expected) - - def test_tsv_in_correct_subfolder2(self): - filenames = [ - os.path.normpath("prerelease/hedtsv/test_schema/test_schema_Tag.tsv"), - os.path.normpath("prerelease/hedtsv/test_schema/test_schema_Tag.tsv"), - os.path.normpath("prerelease/hedtsv/wrong_folder/wrong_name_Tag.tsv") # Should be ignored - ] - expected = { - os.path.normpath("prerelease/test_schema"): {".tsv"} - } - with contextlib.redirect_stdout(None): - result = sort_base_schemas(filenames) - self.assertEqual(dict(result), expected) - - def test_ignored_files(self): - filenames = [ - "test_schema.mediawiki", - os.path.normpath("not_hedtsv/test_schema/test_schema_Tag.tsv") # Should be ignored - ] - expected = { - "test_schema": {".mediawiki"} - } - with contextlib.redirect_stdout(None): - result = sort_base_schemas(filenames) - self.assertEqual(dict(result), expected) - - def test_empty_input(self): - filenames = [] - expected = {} - with contextlib.redirect_stdout(None): - result = sort_base_schemas(filenames) - self.assertEqual(dict(result), expected) - - -class TestValidateAllSchemaFormats(unittest.TestCase): - @classmethod - def setUpClass(cls): - # Determine the path to save schemas based on the location of this test file - cls.base_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'schemas') - if not os.path.exists(cls.base_path): - os.makedirs(cls.base_path) - cls.basename = "test_schema" - - def test_error_no_error(self): - """Test the function with correctly saved schemas in all three formats.""" - # Load specific schema versions and save them correctly - schema = load_schema_version("8.3.0") - schema.save_as_xml(os.path.join(self.base_path, self.basename + ".xml")) - schema.save_as_dataframes(os.path.join(self.base_path, "hedtsv", self.basename)) - with contextlib.redirect_stdout(None): - issues = validate_all_schema_formats(os.path.join(self.base_path, self.basename)) - self.assertTrue(issues) - self.assertIn("Error loading schema", issues[0]) - - schema.save_as_mediawiki(os.path.join(self.base_path, self.basename + ".mediawiki")) - - with contextlib.redirect_stdout(None): - self.assertEqual(validate_all_schema_formats(os.path.join(self.base_path, self.basename)), []) - - schema_incorrect = load_schema_version("8.2.0") - schema_incorrect.save_as_dataframes(os.path.join(self.base_path, "hedtsv", self.basename)) - - # Validate and expect errors - with contextlib.redirect_stdout(None): - issues = validate_all_schema_formats(os.path.join(self.base_path, self.basename)) - self.assertTrue(issues) - self.assertIn("Multiple schemas of type", issues[0]) - - @classmethod - def tearDownClass(cls): - """Remove the entire directory created for testing to ensure a clean state.""" - shutil.rmtree(cls.base_path) # This will delete the directory and all its contents - - -class TestValidateSchema(unittest.TestCase): - def test_load_invalid_extension(self): - # Verify capital letters fail validation - with contextlib.redirect_stdout(None): - self.assertIn("Only fully lowercase extensions ", validate_schema("does_not_matter.MEDIAWIKI")[0]) - self.assertIn("Only fully lowercase extensions ", validate_schema("does_not_matter.Mediawiki")[0]) - self.assertIn("Only fully lowercase extensions ", validate_schema("does_not_matter.XML")[0]) - self.assertIn("Only fully lowercase extensions ", validate_schema("does_not_matter.Xml")[0]) - self.assertIn("Only fully lowercase extensions ", validate_schema("does_not_matter.TSV")[0]) - self.assertNotIn("Only fully lowercase extensions ", validate_schema("does_not_matter.tsv")[0]) - self.assertNotIn("Only fully lowercase extensions ", validate_schema("does_not_matter.xml")[0]) - self.assertNotIn("Only fully lowercase extensions ", validate_schema("does_not_matter.mediawiki")[0]) \ No newline at end of file +import unittest +import os +import shutil +from hed import load_schema_version +from hed.scripts.script_util import add_extension, sort_base_schemas, validate_all_schema_formats, validate_schema +import contextlib + + +class TestAddExtension(unittest.TestCase): + + def test_regular_extension(self): + """Test that regular extensions are added correctly.""" + self.assertEqual(add_extension("filename", ".txt"), "filename.txt") + self.assertEqual(add_extension("document", ".pdf"), "document.pdf") + + def test_tsv_extension(self): + """Test that .tsv extensions are handled differently.""" + # Assuming the function correctly handles paths with directories + self.assertEqual(add_extension(os.path.normpath("path/to/filename"), ".tsv"), + os.path.normpath("path/to/hedtsv/filename")) + # Testing with a basename only + self.assertEqual(add_extension("filename", ".tsv"), os.path.normpath("hedtsv/filename")) + + def test_empty_extension(self): + """Test adding an empty extension.""" + self.assertEqual(add_extension("filename", ""), "filename") + + def test_none_extension(self): + """Test behavior with None as extension.""" + with self.assertRaises(TypeError): + add_extension("filename", None) + + +class TestSortBaseSchemas(unittest.TestCase): + TEST_DIR = 'test_directory' + + @classmethod + def setUpClass(cls): + if not os.path.exists(cls.TEST_DIR): + os.makedirs(cls.TEST_DIR) + os.chdir(cls.TEST_DIR) + cls.create_stub_files() + + @classmethod + def tearDownClass(cls): + os.chdir('..') + shutil.rmtree(cls.TEST_DIR) + + @classmethod + def create_stub_files(cls): + filenames = [ + "test_schema.mediawiki", + os.path.normpath("hedtsv/test_schema/test_schema_Tag.tsv"), + "other_schema.xml", + os.path.normpath("hedtsv/wrong_folder/wrong_name_Tag.tsv"), + os.path.normpath("prerelease/hedtsv/test_schema/test_schema_Tag.tsv"), + os.path.normpath("not_hedtsv/test_schema/test_schema_Tag.tsv") + ] + for filename in filenames: + filepath = os.path.normpath(filename) + directory = os.path.dirname(filepath) + if directory: + os.makedirs(directory, exist_ok=True) + with open(filepath, 'w') as f: + f.write('') # Create an empty file + + def test_mixed_file_types(self): + filenames = [ + "test_schema.mediawiki", + os.path.normpath("hedtsv/test_schema/test_schema_Tag.tsv"), + "other_schema.xml" + ] + expected = { + "test_schema": {".mediawiki", ".tsv"}, + "other_schema": {".xml"} + } + with contextlib.redirect_stdout(None): + result = sort_base_schemas(filenames) + self.assertEqual(dict(result), expected) + + def test_tsv_in_correct_subfolder(self): + filenames = [ + os.path.normpath("hedtsv/test_schema/test_schema_Tag.tsv"), + os.path.normpath("hedtsv/test_schema/test_schema_Tag.tsv"), + os.path.normpath("hedtsv/wrong_folder/wrong_name_Tag.tsv") # Should be ignored + ] + expected = { + "test_schema": {".tsv"} + } + with contextlib.redirect_stdout(None): + result = sort_base_schemas(filenames) + self.assertEqual(dict(result), expected) + + def test_tsv_in_correct_subfolder2(self): + filenames = [ + os.path.normpath("prerelease/hedtsv/test_schema/test_schema_Tag.tsv"), + os.path.normpath("prerelease/hedtsv/test_schema/test_schema_Tag.tsv"), + os.path.normpath("prerelease/hedtsv/wrong_folder/wrong_name_Tag.tsv") # Should be ignored + ] + expected = { + os.path.normpath("prerelease/test_schema"): {".tsv"} + } + with contextlib.redirect_stdout(None): + result = sort_base_schemas(filenames) + self.assertEqual(dict(result), expected) + + def test_ignored_files(self): + filenames = [ + "test_schema.mediawiki", + os.path.normpath("not_hedtsv/test_schema/test_schema_Tag.tsv") # Should be ignored + ] + expected = { + "test_schema": {".mediawiki"} + } + with contextlib.redirect_stdout(None): + result = sort_base_schemas(filenames) + self.assertEqual(dict(result), expected) + + def test_empty_input(self): + filenames = [] + expected = {} + with contextlib.redirect_stdout(None): + result = sort_base_schemas(filenames) + self.assertEqual(dict(result), expected) + + +class TestValidateAllSchemaFormats(unittest.TestCase): + @classmethod + def setUpClass(cls): + # Determine the path to save schemas based on the location of this test file + cls.base_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'schemas') + if not os.path.exists(cls.base_path): + os.makedirs(cls.base_path) + cls.basename = "test_schema" + + def test_error_no_error(self): + """Test the function with correctly saved schemas in all three formats.""" + # Load specific schema versions and save them correctly + schema = load_schema_version("8.3.0") + schema.save_as_xml(os.path.join(self.base_path, self.basename + ".xml")) + schema.save_as_dataframes(os.path.join(self.base_path, "hedtsv", self.basename)) + with contextlib.redirect_stdout(None): + issues = validate_all_schema_formats(os.path.join(self.base_path, self.basename)) + self.assertTrue(issues) + self.assertIn("Error loading schema", issues[0]) + + schema.save_as_mediawiki(os.path.join(self.base_path, self.basename + ".mediawiki")) + + with contextlib.redirect_stdout(None): + self.assertEqual(validate_all_schema_formats(os.path.join(self.base_path, self.basename)), []) + + schema_incorrect = load_schema_version("8.2.0") + schema_incorrect.save_as_dataframes(os.path.join(self.base_path, "hedtsv", self.basename)) + + # Validate and expect errors + with contextlib.redirect_stdout(None): + issues = validate_all_schema_formats(os.path.join(self.base_path, self.basename)) + self.assertTrue(issues) + self.assertIn("Multiple schemas of type", issues[0]) + + @classmethod + def tearDownClass(cls): + """Remove the entire directory created for testing to ensure a clean state.""" + shutil.rmtree(cls.base_path) # This will delete the directory and all its contents + + +class TestValidateSchema(unittest.TestCase): + def test_load_invalid_extension(self): + # Verify capital letters fail validation + with contextlib.redirect_stdout(None): + self.assertIn("Only fully lowercase extensions ", validate_schema("does_not_matter.MEDIAWIKI")[0]) + self.assertIn("Only fully lowercase extensions ", validate_schema("does_not_matter.Mediawiki")[0]) + self.assertIn("Only fully lowercase extensions ", validate_schema("does_not_matter.XML")[0]) + self.assertIn("Only fully lowercase extensions ", validate_schema("does_not_matter.Xml")[0]) + self.assertIn("Only fully lowercase extensions ", validate_schema("does_not_matter.TSV")[0]) + self.assertNotIn("Only fully lowercase extensions ", validate_schema("does_not_matter.tsv")[0]) + self.assertNotIn("Only fully lowercase extensions ", validate_schema("does_not_matter.xml")[0]) + self.assertNotIn("Only fully lowercase extensions ", validate_schema("does_not_matter.mediawiki")[0]) diff --git a/tests/tools/analysis/test_annotation_util.py b/tests/tools/analysis/test_annotation_util.py index dfbea0f8b..c4570a566 100644 --- a/tests/tools/analysis/test_annotation_util.py +++ b/tests/tools/analysis/test_annotation_util.py @@ -198,7 +198,7 @@ def test_generate_sidecar_entry(self): "generate_sidecar_entry HED entry should be str when no column values") def test_generate_sidecar_entry_non_letters(self): - entry1 = annotation_util.generate_sidecar_entry('my !#$-123_10', + entry1 = annotation_util.generate_sidecar_entry('my !#$-123_10', column_values=['apple 1', '@banana', 'grape%cherry&']) self.assertIsInstance(entry1, dict, "generate_sidecar_entry is a dictionary when column values and special chars.") @@ -313,7 +313,7 @@ def test_to_factor(self): self.assertEqual(sum(factor3), 2) factor4 = annotation_util.to_factor(df) self.assertEqual(sum(factor4), 2) - with self.assertRaises(HedFileError) as context5: + with self.assertRaises(HedFileError): annotation_util.to_factor(data) def test_series_to_factor(self): @@ -335,7 +335,8 @@ def test_strs_to_hed_objs(self): self.assertEqual(len(hed_objs1), 2) self.assertEqual('Red', str(hed_objs1[1])) hed_objs2 = annotation_util.strs_to_hed_objs(['Sensory-event', 'Blech'], self.hed_schema) - + self.assertEqual(len(hed_objs2), 2) + def test_strs_to_sidecar(self): with open(self.json_path, 'r') as fp: sidecar_dict = json.load(fp) @@ -478,9 +479,9 @@ def test_to_factor(self): self.assertEqual(sum(factor3), 2) factor4 = annotation_util.to_factor(df) self.assertEqual(sum(factor4), 2) - with self.assertRaises(HedFileError) as context5: + with self.assertRaises(HedFileError): annotation_util.to_factor(data) - + def test_update_cat_dict(self): # TODO: Improve tests cat_dict = self.sidecar_face['event_type'] diff --git a/tests/tools/analysis/test_hed_tag_manager.py b/tests/tools/analysis/test_hed_tag_manager.py index cca0b551b..c7cb40eaf 100644 --- a/tests/tools/analysis/test_hed_tag_manager.py +++ b/tests/tools/analysis/test_hed_tag_manager.py @@ -76,24 +76,40 @@ def test_constructor_from_tabular_input(self): tag_man1 = HedTagManager(EventManager(self.input_data, self.schema)) self.assertIsInstance(tag_man1, HedTagManager) hed_objs1a = tag_man1.get_hed_objs(include_context=False, replace_defs=False) + self.assertNotIn('Event-context', str(hed_objs1a[1])) + self.assertIn('Def', str(hed_objs1a[1])) + self.assertNotIn('Condition-variable', str(hed_objs1a[1])) hed_objs1b = tag_man1.get_hed_objs(include_context=True, replace_defs=False) + self.assertIn('Event-context', str(hed_objs1b[1])) + self.assertIn('Def', str(hed_objs1b[1])) + self.assertNotIn('Condition-variable', str(hed_objs1b[1])) hed_objs1c = tag_man1.get_hed_objs(include_context=False, replace_defs=True) + self.assertNotIn('Event-context', str(hed_objs1c[1])) + self.assertNotIn('Def', str(hed_objs1c[1])) + self.assertIn('Condition-variable', str(hed_objs1c[1])) hed_objs1d = tag_man1.get_hed_objs(include_context=True, replace_defs=True) + self.assertIn('Event-context', str(hed_objs1d[1])) + self.assertNotIn('Def', str(hed_objs1d[1])) + self.assertIn('Condition-variable', str(hed_objs1d[1])) tag_man2 = HedTagManager(event_man, remove_types=['Condition-variable', 'Task']) hed_objs2a = tag_man2.get_hed_objs(include_context=False, replace_defs=False) + self.assertNotIn('Condition-variable', str(hed_objs2a[1])) hed_objs2b = tag_man2.get_hed_objs(include_context=True, replace_defs=False) - hed_objs1c = tag_man2.get_hed_objs(include_context=False, replace_defs=True) - hed_objs1d = tag_man2.get_hed_objs(include_context=True, replace_defs=True) + self.assertNotIn('Condition-variable', str(hed_objs2b[1])) + hed_objs2c = tag_man2.get_hed_objs(include_context=False, replace_defs=True) + self.assertNotIn('Condition-variable', str(hed_objs2c[1])) + hed_objs2d = tag_man2.get_hed_objs(include_context=True, replace_defs=True) + self.assertNotIn('Condition-variable', str(hed_objs2d[1])) self.assertIsInstance(tag_man2, HedTagManager) self.assertIsInstance(tag_man2, HedTagManager) def test_get_hed_objs(self): event_man = EventManager(self.input_data, self.schema) - tag_man1 = HedTagManager(EventManager(self.input_data, self.schema)) - # tag_man = HedTagManager(event_man, remove_types=['Condition-variable', 'Task']) - # hed_objs = tag_man.get_hed_objs() - # self.assertIsInstance(hed_objs, list) - # self.assertEqual(len(hed_objs), len(event_man.onsets)) + tag_man = HedTagManager(EventManager(self.input_data, self.schema)) + self.assertIsInstance(tag_man, HedTagManager) + hed_objs = tag_man.get_hed_objs() + self.assertIsInstance(hed_objs, list) + self.assertEqual(len(hed_objs), len(event_man.onsets)) # def test_constructor_variable_caps(self): # sidecar1 = Sidecar(self.sidecar_path, name='face_sub1_json') diff --git a/tests/tools/analysis/test_hed_type_defs.py b/tests/tools/analysis/test_hed_type_defs.py index 9e64c3298..49e9ba215 100644 --- a/tests/tools/analysis/test_hed_type_defs.py +++ b/tests/tools/analysis/test_hed_type_defs.py @@ -87,11 +87,11 @@ def test_get_type_values(self): item1 = HedString("Sensory-event,((Red,Blue)),", self.schema) vars1 = def_man.get_type_values(item1) self.assertFalse(vars1, "get_type_values should return None if no condition type_variables") - item2 = HedString(f"Sensory-event,(Def/Cond1,(Red,Blue,Condition-variable/Trouble))", self.schema) + item2 = HedString("Sensory-event,(Def/Cond1,(Red,Blue,Condition-variable/Trouble))", self.schema) vars2 = def_man.get_type_values(item2) self.assertEqual(1, len(vars2), "get_type_values should return correct number of condition type_variables") - item3 = HedString(f"Sensory-event,(Def/Cond1,(Red,Blue,Condition-variable/Trouble))," - f"(Def/Cond2),Green,Yellow,Def/Cond5, Def/Cond6/4, Description/Tell me", self.schema) + item3 = HedString("Sensory-event,(Def/Cond1,(Red,Blue,Condition-variable/Trouble))," + + "(Def/Cond2),Green,Yellow,Def/Cond5, Def/Cond6/4, Description/Tell me", self.schema) vars3 = def_man.get_type_values(item3) self.assertEqual(len(vars3), 5, "get_type_values should return multiple condition type_variables") diff --git a/tests/tools/analysis/test_key_map.py b/tests/tools/analysis/test_key_map.py index 4ae2860d6..30021b2bb 100644 --- a/tests/tools/analysis/test_key_map.py +++ b/tests/tools/analysis/test_key_map.py @@ -61,7 +61,7 @@ def test_make_template(self): self.assertEqual(len(df1.columns), 1, "make_template should return 1 column single key, no additional columns") df2 = t_map.make_template(show_counts=True) self.assertEqual(len(df2.columns), 2, "make_template returns an extra column for counts") - + t_map2 = KeyMap(['event_type', 'type']) t_map2.update(self.stern_test1_path) df3 = t_map2.make_template() diff --git a/tests/tools/analysis/test_sequence_map.py b/tests/tools/analysis/test_sequence_map.py index f11334186..4c0ae08e0 100644 --- a/tests/tools/analysis/test_sequence_map.py +++ b/tests/tools/analysis/test_sequence_map.py @@ -12,10 +12,10 @@ def setUpClass(cls): '/sub-01/ses-01/eeg/sub-01_ses-01_task-DriveRandomSound_run-1_events.tsv') def test_constructor(self): - codes1 = ['1111', '1112', '1121', '1122', '1131', '1132', '1141', + codes1 = ['1111', '1112', '1121', '1122', '1131', '1132', '1141', '1142', '1311', '1312', '1321', '1322', '4210', '4220', '4230', '4311', '4312'] - + smap1 = SequenceMap(codes=codes1) self.assertIsInstance(smap1, SequenceMap) # df = get_new_dataframe(self.events_path) diff --git a/tests/tools/bids/test_bids_dataset.py b/tests/tools/bids/test_bids_dataset.py index 62537349f..ac1696080 100644 --- a/tests/tools/bids/test_bids_dataset.py +++ b/tests/tools/bids/test_bids_dataset.py @@ -87,9 +87,9 @@ def test_validator_types(self): self.assertFalse(issues, "BidsDataset with participants and events validates") def test_with_schema_group(self): - x = load_schema_version(["8.2.0", "sc:score_1.0.0", "test:testlib_1.0.2"]) + x = load_schema_version(["score_2.0.0", "test:testlib_1.0.2"]) bids = BidsDataset(self.library_path, schema=x, tabular_types=["participants"]) - self.assertIsInstance(bids, BidsDataset, + self.assertIsInstance(bids, BidsDataset, "BidsDataset with libraries should create a valid object from valid dataset") parts = bids.get_tabular_group("participants") self.assertIsInstance(parts, BidsFileGroup, "BidsDataset participants should be a BidsFileGroup") @@ -121,7 +121,7 @@ def test_get_summary(self): "BidsDataset with libraries has a summary with a hed_schema_versions key") self.assertIsInstance(summary2["hed_schema_versions"], list, "BidsDataset with libraries hed_schema_versions in summary is a list") - self.assertEqual(len(summary2["hed_schema_versions"]), 3, + self.assertEqual(len(summary2["hed_schema_versions"]), 2, "BidsDataset with libraries summary hed_schema_versions list has 3 schema") self.assertTrue("dataset" in summary2) diff --git a/tests/tools/remodeling/cli/test_run_remodel.py b/tests/tools/remodeling/cli/test_run_remodel.py index eb256383b..4a87dd394 100644 --- a/tests/tools/remodeling/cli/test_run_remodel.py +++ b/tests/tools/remodeling/cli/test_run_remodel.py @@ -74,7 +74,7 @@ def test_parse_arguments(self): with self.assertRaises(ValueError) as context3: parse_arguments(arg_list3) self.assertEqual(context3.exception.args[0], "UnableToFullyParseOperations") - + def test_parse_tasks(self): tasks1 = parse_tasks(self.files, "*") self.assertIn('stopsignal', tasks1) @@ -84,6 +84,7 @@ def test_parse_tasks(self): self.assertEqual(1, len(tasks2)) files2 = ['task-.tsv', '/base/'] tasks3 = parse_tasks(files2, "*") + self.assertFalse(tasks3) def test_main_bids(self): arg_list = [self.data_root, self.model_path, '-x', 'derivatives', 'stimuli', '-b'] @@ -176,10 +177,10 @@ def test_main_errors(self): self.assertEqual(context.exception.args[0], "BackupDoesNotExist") # Test no arg_list - with patch('sys.stderr', new=io.StringIO()): - with self.assertRaises(SystemExit) as context: - main() - self.assertEqual(context.exception.code, 2) + # with patch('sys.stderr', new=io.StringIO()): + # with self.assertRaises(SystemExit) as context: + # main() + # self.assertEqual(context.exception.code, 2) def test_main_verbose(self): arg_list = [self.data_root, self.model_path, '-x', 'derivatives', '-v'] diff --git a/tests/tools/remodeling/cli/test_run_remodel_backup.py b/tests/tools/remodeling/cli/test_run_remodel_backup.py index 552ddfb34..d0174ea04 100644 --- a/tests/tools/remodeling/cli/test_run_remodel_backup.py +++ b/tests/tools/remodeling/cli/test_run_remodel_backup.py @@ -102,7 +102,7 @@ def test_main_bad_task(self): '-f', 'events', '-e', '.tsv', '-t', 'Baloney'] main(arg_list) self.assertTrue(os.path.exists(der_path)) - back_path = os.path.realpath(os.path.join(self.data_root, BackupManager.RELATIVE_BACKUP_LOCATION, + back_path = os.path.realpath(os.path.join(self.data_root, BackupManager.RELATIVE_BACKUP_LOCATION, BackupManager.DEFAULT_BACKUP_NAME, 'backup_root')) self.assertTrue(os.path.exists(back_path)) backed_files = get_file_list(back_path) diff --git a/tests/tools/remodeling/operations/test_base_op.py b/tests/tools/remodeling/operations/test_base_op.py index d79a70739..1162405b3 100644 --- a/tests/tools/remodeling/operations/test_base_op.py +++ b/tests/tools/remodeling/operations/test_base_op.py @@ -20,7 +20,7 @@ class TestOp(BaseOp): def do_op(self, dispatcher, df, name, sidecar=None): return df - + @staticmethod def validate_input_data(parameters): return [] @@ -61,7 +61,7 @@ class TestOpNoName(BaseOp): def do_op(self, dispatcher, df, name, sidecar=None): return df - + with self.assertRaises(TypeError): TestOpNoName({}) diff --git a/tests/tools/remodeling/operations/test_factor_hed_tags_op.py b/tests/tools/remodeling/operations/test_factor_hed_tags_op.py index 90380f773..9ade528e5 100644 --- a/tests/tools/remodeling/operations/test_factor_hed_tags_op.py +++ b/tests/tools/remodeling/operations/test_factor_hed_tags_op.py @@ -96,7 +96,7 @@ def test_no_expand_context(self): params["replace_defs"] = True params["remove_types"] = [] op = FactorHedTagsOp(params) - df_new = op.do_op(dispatch, df,'run-01', sidecar=self.json_path) + df_new = op.do_op(dispatch, df, 'run-01', sidecar=self.json_path) df_new = dispatch.post_proc_data(df_new) self.assertEqual(len(df_new), len(df)) self.assertEqual(len(df_new.columns), df_columns + 3) @@ -144,7 +144,7 @@ def test_expand_context(self): # Setup for testing remove types dispatch = Dispatcher([], data_root=None, backup_name=None, hed_versions='8.1.0') params = json.loads(self.json_params) - params["expand_context"] =True + params["expand_context"] = True params["queries"] = ["Def/Famous-face-cond", "Def/Right-sym-cond", "Def/Initialize-recording"] df = dispatch.get_data_file(self.data_path) df = dispatch.prep_data(df) diff --git a/tests/tools/remodeling/operations/test_number_groups.py b/tests/tools/remodeling/operations/test_number_groups.py index ac82cdbaf..2dcfc8be3 100644 --- a/tests/tools/remodeling/operations/test_number_groups.py +++ b/tests/tools/remodeling/operations/test_number_groups.py @@ -158,25 +158,25 @@ def test_number_groups_new_column(self): # df_check = pd.DataFrame(self.numbered_data, columns=self.numbered_columns) # df_test = pd.DataFrame(self.sample_data, columns=self.sample_columns) # df_new = op.do_op(self.dispatcher, df_test, self.file_name) - # + # # self.assertTrue(list(df_new.columns) == list(self.numbered_columns), # "numbered_events should have the expected columns") # self.assertTrue(len(df_new) == len(df_test), # "numbered_events should have same length as original dataframe") # self.assertTrue(np.nanmax(df_new["number"]) == 5.0, # "max value in numbered_events should match the number of groups") - # + # # # fill na to match postprocessing dispatcher # df_new = df_new.fillna('n/a') # self.assertTrue(np.array_equal(df_new.to_numpy(), df_check.to_numpy()), # "numbered_events should not differ from check") - # + # # # Test that df has not been changed by the op # self.assertTrue(list(df.columns) == list(df_test.columns), # "number_rows should not change the input df columns") # self.assertTrue(np.array_equal(df.to_numpy(), df_test.to_numpy()), # "number_rows should not change the input df values") - # + # # def test_existing_column_overwrite_true(self): # # Test when existing column name is given with overwrite True # parms = json.loads(self.json_overwrite_true_parms) @@ -185,7 +185,7 @@ def test_number_groups_new_column(self): # df_test = pd.DataFrame(self.sample_data, columns=self.existing_sample_columns) # df_check = pd.DataFrame(self.overwritten_data, columns=self.existing_sample_columns) # df_new = op.do_op(self.dispatcher, df_test, self.file_name) - # + # # self.assertTrue(list(df_new.columns) == list(self.existing_sample_columns), # "numbered_events should have the same columns as original dataframe in case of overwrite") # self.assertTrue(len(df_new) == len(df_test), @@ -195,7 +195,7 @@ def test_number_groups_new_column(self): # df_new = df_new.fillna('n/a') # self.assertTrue(np.array_equal(df_new.to_numpy(), df_check.to_numpy()), # "numbered_events should not differ from check") - # + # # # Test that df has not been changed by the op # self.assertTrue(list(df.columns) == list(df_test.columns), # "split_rows should not change the input df columns") diff --git a/tests/tools/remodeling/operations/test_number_rows_op.py b/tests/tools/remodeling/operations/test_number_rows_op.py index ff1b71c0e..26cf50acc 100644 --- a/tests/tools/remodeling/operations/test_number_rows_op.py +++ b/tests/tools/remodeling/operations/test_number_rows_op.py @@ -177,6 +177,7 @@ def test_number_rows_new_column(self): # Test when new column name is given with overwrite unspecified (=False) parms = json.loads(self.json_parms) op = NumberRowsOp(parms) + self.assertIsInstance(op, NumberRowsOp) # df = pd.DataFrame(self.sample_data, columns=self.sample_columns) # df_check = pd.DataFrame(self.numbered_data, columns=self.numbered_columns) # df_test = pd.DataFrame(self.sample_data, columns=self.sample_columns) diff --git a/tests/tools/remodeling/operations/test_split_rows_op.py b/tests/tools/remodeling/operations/test_split_rows_op.py index 60714954a..3d3ae35d6 100644 --- a/tests/tools/remodeling/operations/test_split_rows_op.py +++ b/tests/tools/remodeling/operations/test_split_rows_op.py @@ -111,7 +111,6 @@ def test_invalid_onset_duration(self): op.do_op(self.dispatch, self.dispatch.prep_data(df2), 'run-01') self.assertEqual('MissingDurationColumn', ex.exception.args[0]) - def test_valid_new_anchor_column(self): # Test when new column is used as anchor event parms = json.loads(self.json_parms) diff --git a/tests/tools/remodeling/operations/test_summarize_column_values_op.py b/tests/tools/remodeling/operations/test_summarize_column_values_op.py index 9e838d5d5..9cd6c376c 100644 --- a/tests/tools/remodeling/operations/test_summarize_column_values_op.py +++ b/tests/tools/remodeling/operations/test_summarize_column_values_op.py @@ -59,6 +59,7 @@ def test_do_ops(self): "do_ops updating does not change number of categorical columns.") context = dispatch.summary_dicts['test summary'] text_sum = context.get_text_summary() + self.assertIsInstance(text_sum, dict) self.assertEqual(len(context.summary_dict), 2) def test_get_summary(self): diff --git a/tests/tools/remodeling/operations/test_summarize_definitions_op.py b/tests/tools/remodeling/operations/test_summarize_definitions_op.py index 38e65daa3..c3ecc2a18 100644 --- a/tests/tools/remodeling/operations/test_summarize_definitions_op.py +++ b/tests/tools/remodeling/operations/test_summarize_definitions_op.py @@ -94,6 +94,7 @@ def test_ambiguous_def_errors(self): context = cont.get("get_definition_summary", None) self.assertIsInstance(context, DefinitionSummary, "get_summary testing DefinitionSummary") summary1a = context.get_summary() + self.assertIsInstance(summary1a, dict) if __name__ == '__main__': diff --git a/tests/tools/remodeling/operations/test_summarize_hed_tags_op.py b/tests/tools/remodeling/operations/test_summarize_hed_tags_op.py index 8a80563fe..5303b576d 100644 --- a/tests/tools/remodeling/operations/test_summarize_hed_tags_op.py +++ b/tests/tools/remodeling/operations/test_summarize_hed_tags_op.py @@ -149,7 +149,8 @@ def test_quick3(self): input_data = TabularInput(df, sidecar=my_sidecar, name="myName") tag_man = HedTagManager(EventManager(input_data, my_schema), remove_types=remove_types) counts = HedTagCounts('myName', 2) - summary_dict = {} + self.assertIsInstance(counts, HedTagCounts) + self.assertIsInstance(tag_man, HedTagManager) # hed_objs = tag_man.get_hed_objs(include_context=include_context, replace_defs=replace_defs) # for hed in hed_objs: # counts.update_event_counts(hed, 'myName') @@ -211,13 +212,13 @@ def test_get_summary_text_summary(self): self.assertIn('Dataset', text_sum_none) self.assertIsInstance(text_sum_none['Dataset'], str) self.assertFalse(text_sum_none.get("Individual files", {})) - + text_sum_consolidated = sum_context1.get_text_summary(individual_summaries="consolidated") self.assertIn('Dataset', text_sum_consolidated) self.assertIsInstance(text_sum_consolidated['Dataset'], str) self.assertFalse(text_sum_consolidated.get("Individual files", {})) self.assertGreater(len(text_sum_consolidated['Dataset']), len(text_sum_none['Dataset'])) - + text_sum_separate = sum_context1.get_text_summary(individual_summaries="separate") self.assertIn('Dataset', text_sum_separate) self.assertIsInstance(text_sum_separate['Dataset'], str) diff --git a/tests/tools/remodeling/operations/test_summarize_hed_type_op.py b/tests/tools/remodeling/operations/test_summarize_hed_type_op.py index c30b10ce3..696ab2270 100644 --- a/tests/tools/remodeling/operations/test_summarize_hed_type_op.py +++ b/tests/tools/remodeling/operations/test_summarize_hed_type_op.py @@ -79,7 +79,7 @@ def test_summary(self): self.assertEqual(len(summary2['Dataset']['Overall summary']['Files']), 2) summary2a = context2.get_summary(individual_summaries="separate") self.assertIsInstance(summary2a["Individual files"]["run-02"], dict) - + def test_text_summary_with_levels(self): with open(self.summary_path, 'r') as fp: parms = json.load(fp) diff --git a/tests/tools/remodeling/test_validator.py b/tests/tools/remodeling/test_validator.py index c465ab3cd..14854a1bb 100644 --- a/tests/tools/remodeling/test_validator.py +++ b/tests/tools/remodeling/test_validator.py @@ -1,177 +1,177 @@ -import os -import json -import unittest -from copy import deepcopy -from hed.tools.remodeling.remodeler_validator import RemodelerValidator - - -class Test(unittest.TestCase): - - @classmethod - def setUpClass(cls): - with open(os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', - '../data/remodel_tests/all_remodel_operations.json'))) as f: - cls.remodel_file = json.load(f) - cls.validator = RemodelerValidator() - - @classmethod - def tearDownClass(cls): - pass - - def test_validator_build(self): - pass - - def test_validate_valid(self): - error_strings = self.validator.validate(self.remodel_file) - self.assertFalse(error_strings) - - def test_validate_array(self): - wrong_input_type = {"operation": "remove_columns"} - error_strings = self.validator.validate(wrong_input_type) - self.assertEqual(error_strings[0], - "Operations must be contained in a list or array. " + - "This is also true for a single operation.") - - no_operations = [] - error_strings = self.validator.validate(no_operations) - self.assertEqual(error_strings[0], - "There are no operations defined. Specify at least 1 operation for the remodeler to execute.") - - def test_validate_operations(self): - invalid_operation_type = ["string"] - error_strings = self.validator.validate(invalid_operation_type) - self.assertEqual(error_strings[0], "Each operation must be defined in a dictionary: " + - "string is not a dictionary object.") - - invalid_operation_missing = [self.remodel_file[0].copy()] - del invalid_operation_missing[0]["description"] - error_strings = self.validator.validate(invalid_operation_missing) - self.assertEqual(error_strings[0], "Operation dictionary 1 is missing 'description'. " + - "Every operation dictionary must specify the type of operation, a description, " + - "and the operation parameters.") - - invalid_operation_name = [self.remodel_file[0].copy()] - invalid_operation_name[0]["operation"] = "unlisted_operation" - error_strings = self.validator.validate(invalid_operation_name) - self.assertEqual(error_strings[0], "unlisted_operation is not a known remodeler operation. " + - "See the documentation for valid operations.") - - def test_validate_parameters(self): - missing_parameter = [deepcopy(self.remodel_file[0])] - del missing_parameter[0]["parameters"]["column_names"] - error_strings = self.validator.validate(missing_parameter) - self.assertEqual(error_strings[0], - "Operation 1: The parameter column_names is missing. " + - "column_names is a required parameter of remove_columns.") - - missing_parameter_nested = [deepcopy(self.remodel_file[10])] - del missing_parameter_nested[0]["parameters"]["new_events"]["response"]["onset_source"] - error_strings = self.validator.validate(missing_parameter_nested) - self.assertEqual(error_strings[0], - "Operation 1: The field onset_source is missing in response new_events. " + - "onset_source is a required parameter of response new_events.") - - invalid_parameter = [deepcopy(self.remodel_file[0])] - invalid_parameter[0]["parameters"]["invalid"] = "invalid_value" - error_strings = self.validator.validate(invalid_parameter) - self.assertEqual(error_strings[0], "Operation 1: Operation parameters for remove_columns " + - "contain an unexpected field 'invalid'.") - - invalid_parameter_nested = [deepcopy(self.remodel_file[10])] - invalid_parameter_nested[0]["parameters"]["new_events"]["response"]["invalid"] = "invalid_value" - error_strings = self.validator.validate(invalid_parameter_nested) - self.assertEqual(error_strings[0], "Operation 1: Operation parameters for response " + - "new_events contain an unexpected field 'invalid'.") - - invalid_type = [deepcopy(self.remodel_file[0])] - invalid_type[0]["parameters"]["column_names"] = 0 - error_strings = self.validator.validate(invalid_type) - self.assertEqual(error_strings[0], "Operation 1: The value of column_names in the remove_columns operation " + - "should be array. 0 is not a array.") - - invalid_type_nested = [deepcopy(self.remodel_file[10])] - invalid_type_nested[0]["parameters"]["new_events"]["response"]["onset_source"] = {"key": "value"} - error_strings = self.validator.validate(invalid_type_nested) - self.assertEqual(error_strings[0], "Operation 1: The value of onset_source response new_events " + - "in the split_rows operation should be array. {'key': 'value'} is not a array.") - - empty_array = [deepcopy(self.remodel_file[0])] - empty_array[0]["parameters"]["column_names"] = [] - error_strings = self.validator.validate(empty_array) - self.assertEqual(error_strings[0], "Operation 1: The list in column_names in the remove_columns " + - "operation should have at least 1 item(s).") - - empty_array_nested = [deepcopy(self.remodel_file[5])] - empty_array_nested[0]["parameters"]["map_list"][0] = [] - error_strings = self.validator.validate(empty_array_nested) - self.assertEqual(error_strings[0], "Operation 1: The list in item 1 map_list in the remap_columns " + - "operation should have at least 1 item(s).") - - # invalid_value = [deepcopy(self.remodel_file[18])] - # invalid_value[0]["parameters"]["convert_to"] = "invalid_value" - # error_strings = validator.validate(invalid_value) - # self.assertEqual(error_strings[0], "Operation 1: Operation parameter convert_to, in the " + - # "convert_columns operation, contains and unexpected value. " + - # "Value should be one of ['str', 'int', 'float', 'fixed'].") - - # value_dependency = [deepcopy(self.remodel_file[18])] - # value_dependency[0]["parameters"]["convert_to"] = "fixed" - # error_strings = validator.validate(value_dependency) - # self.assertEqual(error_strings[0], "Operation 1: The parameter decimal_places is missing. " + - # " The decimal_places is a required parameter of convert_columns.") - - property_dependency = [deepcopy(self.remodel_file[1])] - del property_dependency[0]["parameters"]["factor_values"] - error_strings = self.validator.validate(property_dependency) - self.assertEqual(error_strings[0], "Operation 1: The parameter factor_names is missing: " + - "factor_names is a required parameter of factor_column when ['factor_values'] is specified.") - - double_item_in_array = [deepcopy(self.remodel_file[0])] - double_item_in_array[0]["parameters"]["column_names"] = ['response', 'response'] - error_strings = self.validator.validate(double_item_in_array) - self.assertEqual(error_strings[0], "Operation 1: The list in column_names in the remove_columns " + - "operation should only contain unique items.") - - double_item_in_array_nested = [deepcopy(self.remodel_file[10])] - double_item_in_array_nested[0]["parameters"]["new_events"]["response"]["copy_columns"] = \ - ['response', 'response'] - error_strings = self.validator.validate(double_item_in_array_nested) - self.assertEqual(error_strings[0], - "Operation 1: The list in copy_columns response new_events in the split_rows " + - "operation should only contain unique items.") - - def test_validate_parameter_data(self): - factor_column_validate = [deepcopy(self.remodel_file)[1]] - factor_column_validate[0]["parameters"]["factor_names"] = ["stopped"] - error_strings = self.validator.validate(factor_column_validate) - self.assertEqual(error_strings[0], "Operation 1 (factor_column): factor_names must be " + - "same length as factor_values") - - factor_hed_tags_validate = [deepcopy(self.remodel_file)[2]] - factor_hed_tags_validate[0]["parameters"]["query_names"] = ["correct"] - error_strings = self.validator.validate(factor_hed_tags_validate) - self.assertEqual(error_strings[0], "Operation 1 (factor_hed_tags): QueryNamesLengthBad: " + - "The query_names length 1 must be empty or equal to the queries length 2.") - - merge_consecutive_validate = [deepcopy(self.remodel_file)[4]] - merge_consecutive_validate[0]["parameters"]["match_columns"].append("trial_type") - error_strings = self.validator.validate(merge_consecutive_validate) - self.assertEqual(error_strings[0], "Operation 1 (merge_consecutive): column_name `trial_type` " + - "cannot not be a match_column.") - - remap_columns_validate_same_length = [deepcopy(self.remodel_file)[5]] - remap_columns_validate_same_length[0]["parameters"]["map_list"][0] = [""] - error_strings = self.validator.validate(remap_columns_validate_same_length) - self.assertEqual(error_strings[0], "Operation 1 (remap_columns): all map_list arrays must be of length 3.") - - remap_columns_validate_right_length = [deepcopy(self.remodel_file[5])] - remap_columns_validate_right_length[0]["parameters"]["map_list"] = \ - [["string1", "string2"], ["string3", "string4"]] - error_strings = self.validator.validate(remap_columns_validate_right_length) - self.assertEqual(error_strings[0], "Operation 1 (remap_columns): all map_list arrays must be of length 3.") - - remap_columns_integer_sources = [deepcopy(self.remodel_file[5])] - remap_columns_integer_sources[0]["parameters"]["integer_sources"] = ["unknown_column"] - error_strings = self.validator.validate(remap_columns_integer_sources) - self.assertEqual(error_strings[0], "Operation 1 (remap_columns): the integer_sources {'unknown_column'} " + - "are missing from source_columns.") +import os +import json +import unittest +from copy import deepcopy +from hed.tools.remodeling.remodeler_validator import RemodelerValidator + + +class Test(unittest.TestCase): + + @classmethod + def setUpClass(cls): + with open(os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', + '../data/remodel_tests/all_remodel_operations.json'))) as f: + cls.remodel_file = json.load(f) + cls.validator = RemodelerValidator() + + @classmethod + def tearDownClass(cls): + pass + + def test_validator_build(self): + pass + + def test_validate_valid(self): + error_strings = self.validator.validate(self.remodel_file) + self.assertFalse(error_strings) + + def test_validate_array(self): + wrong_input_type = {"operation": "remove_columns"} + error_strings = self.validator.validate(wrong_input_type) + self.assertEqual(error_strings[0], + "Operations must be contained in a list or array. " + + "This is also true for a single operation.") + + no_operations = [] + error_strings = self.validator.validate(no_operations) + self.assertEqual(error_strings[0], + "There are no operations defined. Specify at least 1 operation for the remodeler to execute.") + + def test_validate_operations(self): + invalid_operation_type = ["string"] + error_strings = self.validator.validate(invalid_operation_type) + self.assertEqual(error_strings[0], "Each operation must be defined in a dictionary: " + + "string is not a dictionary object.") + + invalid_operation_missing = [self.remodel_file[0].copy()] + del invalid_operation_missing[0]["description"] + error_strings = self.validator.validate(invalid_operation_missing) + self.assertEqual(error_strings[0], "Operation dictionary 1 is missing 'description'. " + + "Every operation dictionary must specify the type of operation, a description, " + + "and the operation parameters.") + + invalid_operation_name = [self.remodel_file[0].copy()] + invalid_operation_name[0]["operation"] = "unlisted_operation" + error_strings = self.validator.validate(invalid_operation_name) + self.assertEqual(error_strings[0], "unlisted_operation is not a known remodeler operation. " + + "See the documentation for valid operations.") + + def test_validate_parameters(self): + missing_parameter = [deepcopy(self.remodel_file[0])] + del missing_parameter[0]["parameters"]["column_names"] + error_strings = self.validator.validate(missing_parameter) + self.assertEqual(error_strings[0], + "Operation 1: The parameter column_names is missing. " + + "column_names is a required parameter of remove_columns.") + + missing_parameter_nested = [deepcopy(self.remodel_file[10])] + del missing_parameter_nested[0]["parameters"]["new_events"]["response"]["onset_source"] + error_strings = self.validator.validate(missing_parameter_nested) + self.assertEqual(error_strings[0], + "Operation 1: The field onset_source is missing in response new_events. " + + "onset_source is a required parameter of response new_events.") + + invalid_parameter = [deepcopy(self.remodel_file[0])] + invalid_parameter[0]["parameters"]["invalid"] = "invalid_value" + error_strings = self.validator.validate(invalid_parameter) + self.assertEqual(error_strings[0], "Operation 1: Operation parameters for remove_columns " + + "contain an unexpected field 'invalid'.") + + invalid_parameter_nested = [deepcopy(self.remodel_file[10])] + invalid_parameter_nested[0]["parameters"]["new_events"]["response"]["invalid"] = "invalid_value" + error_strings = self.validator.validate(invalid_parameter_nested) + self.assertEqual(error_strings[0], "Operation 1: Operation parameters for response " + + "new_events contain an unexpected field 'invalid'.") + + invalid_type = [deepcopy(self.remodel_file[0])] + invalid_type[0]["parameters"]["column_names"] = 0 + error_strings = self.validator.validate(invalid_type) + self.assertEqual(error_strings[0], "Operation 1: The value of column_names in the remove_columns operation " + + "should be array. 0 is not a array.") + + invalid_type_nested = [deepcopy(self.remodel_file[10])] + invalid_type_nested[0]["parameters"]["new_events"]["response"]["onset_source"] = {"key": "value"} + error_strings = self.validator.validate(invalid_type_nested) + self.assertEqual(error_strings[0], "Operation 1: The value of onset_source response new_events " + + "in the split_rows operation should be array. {'key': 'value'} is not a array.") + + empty_array = [deepcopy(self.remodel_file[0])] + empty_array[0]["parameters"]["column_names"] = [] + error_strings = self.validator.validate(empty_array) + self.assertEqual(error_strings[0], "Operation 1: The list in column_names in the remove_columns " + + "operation should have at least 1 item(s).") + + empty_array_nested = [deepcopy(self.remodel_file[5])] + empty_array_nested[0]["parameters"]["map_list"][0] = [] + error_strings = self.validator.validate(empty_array_nested) + self.assertEqual(error_strings[0], "Operation 1: The list in item 1 map_list in the remap_columns " + + "operation should have at least 1 item(s).") + + # invalid_value = [deepcopy(self.remodel_file[18])] + # invalid_value[0]["parameters"]["convert_to"] = "invalid_value" + # error_strings = validator.validate(invalid_value) + # self.assertEqual(error_strings[0], "Operation 1: Operation parameter convert_to, in the " + + # "convert_columns operation, contains and unexpected value. " + + # "Value should be one of ['str', 'int', 'float', 'fixed'].") + + # value_dependency = [deepcopy(self.remodel_file[18])] + # value_dependency[0]["parameters"]["convert_to"] = "fixed" + # error_strings = validator.validate(value_dependency) + # self.assertEqual(error_strings[0], "Operation 1: The parameter decimal_places is missing. " + + # " The decimal_places is a required parameter of convert_columns.") + + property_dependency = [deepcopy(self.remodel_file[1])] + del property_dependency[0]["parameters"]["factor_values"] + error_strings = self.validator.validate(property_dependency) + self.assertEqual(error_strings[0], "Operation 1: The parameter factor_names is missing: " + + "factor_names is a required parameter of factor_column when ['factor_values'] is specified.") + + double_item_in_array = [deepcopy(self.remodel_file[0])] + double_item_in_array[0]["parameters"]["column_names"] = ['response', 'response'] + error_strings = self.validator.validate(double_item_in_array) + self.assertEqual(error_strings[0], "Operation 1: The list in column_names in the remove_columns " + + "operation should only contain unique items.") + + double_item_in_array_nested = [deepcopy(self.remodel_file[10])] + double_item_in_array_nested[0]["parameters"]["new_events"]["response"]["copy_columns"] = \ + ['response', 'response'] + error_strings = self.validator.validate(double_item_in_array_nested) + self.assertEqual(error_strings[0], + "Operation 1: The list in copy_columns response new_events in the split_rows " + + "operation should only contain unique items.") + + def test_validate_parameter_data(self): + factor_column_validate = [deepcopy(self.remodel_file)[1]] + factor_column_validate[0]["parameters"]["factor_names"] = ["stopped"] + error_strings = self.validator.validate(factor_column_validate) + self.assertEqual(error_strings[0], "Operation 1 (factor_column): factor_names must be " + + "same length as factor_values") + + factor_hed_tags_validate = [deepcopy(self.remodel_file)[2]] + factor_hed_tags_validate[0]["parameters"]["query_names"] = ["correct"] + error_strings = self.validator.validate(factor_hed_tags_validate) + self.assertEqual(error_strings[0], "Operation 1 (factor_hed_tags): QueryNamesLengthBad: " + + "The query_names length 1 must be empty or equal to the queries length 2.") + + merge_consecutive_validate = [deepcopy(self.remodel_file)[4]] + merge_consecutive_validate[0]["parameters"]["match_columns"].append("trial_type") + error_strings = self.validator.validate(merge_consecutive_validate) + self.assertEqual(error_strings[0], "Operation 1 (merge_consecutive): column_name `trial_type` " + + "cannot not be a match_column.") + + remap_columns_validate_same_length = [deepcopy(self.remodel_file)[5]] + remap_columns_validate_same_length[0]["parameters"]["map_list"][0] = [""] + error_strings = self.validator.validate(remap_columns_validate_same_length) + self.assertEqual(error_strings[0], "Operation 1 (remap_columns): all map_list arrays must be of length 3.") + + remap_columns_validate_right_length = [deepcopy(self.remodel_file[5])] + remap_columns_validate_right_length[0]["parameters"]["map_list"] = \ + [["string1", "string2"], ["string3", "string4"]] + error_strings = self.validator.validate(remap_columns_validate_right_length) + self.assertEqual(error_strings[0], "Operation 1 (remap_columns): all map_list arrays must be of length 3.") + + remap_columns_integer_sources = [deepcopy(self.remodel_file[5])] + remap_columns_integer_sources[0]["parameters"]["integer_sources"] = ["unknown_column"] + error_strings = self.validator.validate(remap_columns_integer_sources) + self.assertEqual(error_strings[0], "Operation 1 (remap_columns): the integer_sources {'unknown_column'} " + + "are missing from source_columns.") diff --git a/tests/tools/util/test_io_util.py b/tests/tools/util/test_io_util.py index c0add9db7..5ac649b37 100644 --- a/tests/tools/util/test_io_util.py +++ b/tests/tools/util/test_io_util.py @@ -6,7 +6,6 @@ parse_bids_filename, _split_entity, get_allowed, get_filtered_by_element - class Test(unittest.TestCase): @classmethod @@ -95,7 +94,7 @@ def test_get_allowed(self): self.assertEqual(value2, test_value1) def test_get_alphanumeric_path(self): - mypath1 = 'g:\\String1%_-sTring2\n//string3\\\\\string4.pnG' + mypath1 = 'g:\\String1%_-sTring2\n//string3\\\\string4.pnG' repath1 = get_alphanumeric_path(mypath1) self.assertEqual('g_String1_sTring2_string3_string4_pnG', repath1) repath2 = get_alphanumeric_path(mypath1, '$') diff --git a/tests/tools/visualization/test_tag_word_cloud.py b/tests/tools/visualization/test_tag_word_cloud.py index a148baf4e..2e9dd7808 100644 --- a/tests/tools/visualization/test_tag_word_cloud.py +++ b/tests/tools/visualization/test_tag_word_cloud.py @@ -1,178 +1,177 @@ -import unittest -import wordcloud -from hed.tools.visualization import tag_word_cloud -from hed.tools.visualization.tag_word_cloud import load_and_resize_mask -import matplotlib.font_manager as fm - -import numpy as np -from PIL import Image, ImageDraw -import os - - -class TestWordCloudFunctions(unittest.TestCase): - @classmethod - def setUpClass(cls): - cls.mask_path = os.path.realpath(os.path.join(os.path.dirname(__file__), - '../../data/visualization/word_mask.png')) - - def test_create_wordcloud(self): - word_dict = {'tag1': 5, 'tag2': 3, 'tag3': 7} - width = 400 - height = 200 - wc = tag_word_cloud.create_wordcloud(word_dict, width=width, height=height) - - self.assertIsInstance(wc, wordcloud.WordCloud) - self.assertEqual(wc.width, width) - self.assertEqual(wc.height, height) - - def test_create_wordcloud_font_direct(self): - word_dict = {'tag1': 5, 'tag2': 3, 'tag3': 7} - width = 400 - height = 200 - - fonts = fm.findSystemFonts() - if not fonts: - return - font_path = os.path.realpath(fonts[0]) - wc = tag_word_cloud.create_wordcloud(word_dict, width=width, height=height, font_path=font_path) - - self.assertIsInstance(wc, wordcloud.WordCloud) - self.assertEqual(wc.width, width) - self.assertEqual(wc.height, height) - self.assertIn(font_path, wc.font_path) - - def test_create_wordcloud_default_params(self): - word_dict = {'tag1': 5, 'tag2': 3, 'tag3': 7} - wc = tag_word_cloud.create_wordcloud(word_dict) - - self.assertIsInstance(wc, wordcloud.WordCloud) - self.assertEqual(wc.width, 400) - self.assertEqual(wc.height, 300) - - def test_mask_scaling(self): - word_dict = {'tag1': 5, 'tag2': 3, 'tag3': 7} - wc = tag_word_cloud.create_wordcloud(word_dict, self.mask_path, width=300, height=300) - - self.assertIsInstance(wc, wordcloud.WordCloud) - self.assertEqual(wc.width, 300) - self.assertEqual(wc.height, 300) - - def test_mask_scaling2(self): - word_dict = {'tag1': 5, 'tag2': 3, 'tag3': 7} - wc = tag_word_cloud.create_wordcloud(word_dict, self.mask_path, width=300, height=None) - - self.assertIsInstance(wc, wordcloud.WordCloud) - self.assertEqual(wc.width, 300) - self.assertLess(wc.height, 300) - - def test_create_wordcloud_with_empty_dict(self): - # Test creation of word cloud with an empty dictionary - word_dict = {} - with self.assertRaises(ValueError): - tag_word_cloud.create_wordcloud(word_dict) - - def test_create_wordcloud_with_single_word(self): - # Test creation of word cloud with a single word - word_dict = {'single_word': 1} - wc = tag_word_cloud.create_wordcloud(word_dict) - self.assertIsInstance(wc, wordcloud.WordCloud) - # Check that the single word is in the word cloud - self.assertIn('single_word', wc.words_) - - def test_valid_word_cloud(self): - word_dict = {'tag1': 5, 'tag2': 3, 'tag3': 7} - wc = tag_word_cloud.create_wordcloud(word_dict, mask_path=self.mask_path, width=400, height=None) - svg_output = tag_word_cloud.word_cloud_to_svg(wc) - self.assertTrue(svg_output.startswith('= 1000: - tag_index = tag_index - 1000 - source_list = hed_string.get_all_groups() - else: - source_list = hed_string.get_all_tags() - if tag_index >= len(source_list): - raise ValueError("Bad group or tax index in expected errors for unit tests") - kwargs['tag'] = source_list[tag_index] - formatted_errors += error_handler.format_error_with_context(code, *args, **kwargs) - - return formatted_errors - - -class TestValidatorBase(TestHedBase): - compute_forms = True - hed_schema = None - - @classmethod - def setUpClass(cls): - super().setUpClass() - cls.error_handler = error_reporter.ErrorHandler() - cls.semantic_hed_input_reader = HedValidator(hed_schema=cls.hed_schema) - - def validator_base(self, test_strings, expected_results, expected_issues, test_function, - hed_schema, check_for_warnings=False): - for test_key in test_strings: - hed_string_obj = HedString(test_strings[test_key], self.hed_schema) - error_handler = ErrorHandler(check_for_warnings=check_for_warnings) - error_handler.push_error_context(ErrorContext.HED_STRING, hed_string_obj) - test_issues = [] - if self.compute_forms: - test_issues += hed_string_obj._calculate_to_canonical_forms(hed_schema) - if not test_issues: - test_issues += test_function(hed_string_obj) - expected_params = expected_issues[test_key] - expected_result = expected_results[test_key] - expected_issue = self.format_errors_fully(error_handler, hed_string=hed_string_obj, - params=expected_params) - error_handler.add_context_and_filter(test_issues) - test_result = not test_issues - - # print(test_key) - # print(str(expected_issue)) - # print(str(test_issues)) - error_handler.pop_error_context() - self.assertEqual(test_result, expected_result, test_strings[test_key]) - self.assertCountEqual(test_issues, expected_issue, test_strings[test_key]) - - def validator_semantic(self, test_strings, expected_results, expected_issues, check_for_warnings): - validator = self.semantic_hed_input_reader - self.validator_base(test_strings, expected_results, expected_issues, - self.string_obj_func(validator), check_for_warnings=check_for_warnings, - hed_schema=validator._hed_schema) +import unittest +import os +from hed.models.hed_string import HedString +from hed.validator.hed_validator import HedValidator +from hed.errors import error_reporter +from hed.errors import ErrorHandler, ErrorContext +from hed import schema + + +# todo: update these tests(TagValidator no longer exists) +class TestHedBase(unittest.TestCase): + schema_file = None + hed_schema = None + + @classmethod + def setUpClass(cls): + if cls.schema_file and not cls.hed_schema: + hed_xml = os.path.join(os.path.dirname(os.path.realpath(__file__)), cls.schema_file) + cls.hed_schema = schema.load_schema(hed_xml) + elif not cls.hed_schema: + raise ValueError("No schema set for test case") + cls.error_handler = error_reporter.ErrorHandler() + + def format_error(self, error_type, *args, **kwargs): + """ + The parameters vary based on what type of error this is. + + Note: If you want to pass a tag as a number to this function, you will need to pass tag as a keyword. + + Parameters: + error_type (str): The type of error for this. Registered with @hed_error or @hed_tag_error. + args (args): The rest of the unnamed args. + kwargs: The other parameters to pass down to the error handling func. + + Returns: + list: A list consisting of a single dictionary representing an error. + + """ + _ = ErrorHandler.format_error(error_type, *args, **kwargs) + # Save off params + params = [error_type, args, kwargs] + # return params + return [params] + + def format_errors_fully(self, error_handler, hed_string, params): + formatted_errors = [] + for code, args, kwargs in params: + if 'tag' in kwargs and isinstance(kwargs['tag'], int): + tag_index = kwargs['tag'] + if tag_index >= 1000: + tag_index = tag_index - 1000 + source_list = hed_string.get_all_groups() + else: + source_list = hed_string.get_all_tags() + if tag_index >= len(source_list): + raise ValueError("Bad group or tax index in expected errors for unit tests") + kwargs['tag'] = source_list[tag_index] + formatted_errors += error_handler.format_error_with_context(code, *args, **kwargs) + + return formatted_errors + + +class TestValidatorBase(TestHedBase): + compute_forms = True + hed_schema = None + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.error_handler = error_reporter.ErrorHandler() + cls.semantic_hed_input_reader = HedValidator(hed_schema=cls.hed_schema) + + def validator_base(self, test_strings, expected_results, expected_issues, test_function, + hed_schema, check_for_warnings=False): + for test_key in test_strings: + hed_string_obj = HedString(test_strings[test_key], self.hed_schema) + error_handler = ErrorHandler(check_for_warnings=check_for_warnings) + error_handler.push_error_context(ErrorContext.HED_STRING, hed_string_obj) + test_issues = [] + if self.compute_forms: + test_issues += hed_string_obj._calculate_to_canonical_forms(hed_schema) + if not test_issues: + test_issues += test_function(hed_string_obj) + expected_params = expected_issues[test_key] + expected_result = expected_results[test_key] + expected_issue = self.format_errors_fully(error_handler, hed_string=hed_string_obj, + params=expected_params) + error_handler.add_context_and_filter(test_issues) + test_result = not test_issues + + # print(str(expected_issue)) + # print(str(test_issues)) + # error_handler.pop_error_context() + self.assertEqual(test_result, expected_result, test_strings[test_key]) + self.assertCountEqual(test_issues, expected_issue, test_strings[test_key]) + + def validator_semantic(self, test_strings, expected_results, expected_issues, check_for_warnings): + validator = self.semantic_hed_input_reader + self.validator_base(test_strings, expected_results, expected_issues, + self.string_obj_func(validator), check_for_warnings=check_for_warnings, + hed_schema=validator._hed_schema) diff --git a/tests/validator/test_tag_validator_library.py b/tests/validator/test_tag_validator_library.py index d942c8ae3..3db111130 100644 --- a/tests/validator/test_tag_validator_library.py +++ b/tests/validator/test_tag_validator_library.py @@ -1,481 +1,487 @@ -import unittest -import os - -from hed.errors import error_reporter -from hed import schema -from hed.errors.error_types import ValidationErrors, DefinitionErrors -from hed.schema.hed_schema_group import HedSchemaGroup -from hed.errors.exceptions import HedFileError -from tests.validator.test_tag_validator_base import TestValidatorBase -from functools import partial - - -class TestHed3(TestValidatorBase): - schema_file = None - - @classmethod - def setUpClass(cls): - schema_file = '../data/validator_tests/HED8.0.0_added_tests.mediawiki' - hed_xml = os.path.join(os.path.dirname(os.path.realpath(__file__)), schema_file) - hed_schema1 = schema.load_schema(hed_xml) - hed_schema2 = schema.load_schema(hed_xml, schema_namespace="tl:") - cls.hed_schema = HedSchemaGroup([hed_schema1, hed_schema2]) - - cls.error_handler = error_reporter.ErrorHandler() - super().setUpClass() - - def test_invalid_load(self): - schema_file = '../data/schema_tests/HED8.0.0t.xml' - hed_xml = os.path.join(os.path.dirname(os.path.realpath(__file__)), schema_file) - hed_schema1 = schema.load_schema(hed_xml, schema_namespace="tl:") - hed_schema2 = schema.load_schema(hed_xml, schema_namespace="tl:") - - self.assertRaises(HedFileError, HedSchemaGroup, [hed_schema1, hed_schema2]) - - def test_invalid_load_prefix(self): - schema_file = '../data/schema_tests/HED8.0.0t.xml' - hed_xml = os.path.join(os.path.dirname(os.path.realpath(__file__)), schema_file) - hed_schema1 = schema.load_schema(hed_xml) - hed_schema2 = schema.load_schema(hed_xml) - - self.assertRaises(HedFileError, HedSchemaGroup, [hed_schema1, hed_schema2]) - - -class IndividualHedTagsShort(TestHed3): - @staticmethod - def string_obj_func(validator): - return partial(validator._validate_individual_tags_in_hed_string) - - def test_exist_in_schema(self): - test_strings = { - 'takesValue': 'tl:Duration/3 ms', - 'full': 'tl:Animal-agent', - 'extensionsAllowed': 'tl:Item/Beaver', - 'leafExtension': 'tl:Experiment-procedure/Something', - 'nonExtensionsAllowed': 'tl:Event/Nonsense', - 'invalidExtension': 'tl:Agent/Red', - 'invalidExtension2': 'tl:Agent/Red/Extension2', - 'usedToBeIllegalComma': 'tl:Label/This is a label,tl:This/Is/A/Tag', - 'legalDef': 'tl:Def/Item', - 'legalDefExpand': 'tl:Def-expand/Item', - 'illegalDefinition': 'tl:Definition/Item', - 'unknownPrefix': 'ul:Definition/Item' - } - expected_results = { - 'takesValue': True, - 'full': True, - 'extensionsAllowed': True, - 'leafExtension': False, - 'nonExtensionsAllowed': False, - 'invalidExtension': False, - 'invalidExtension2': False, - 'usedToBeIllegalComma': False, - 'legalDef': True, - 'legalDefExpand': True, - 'illegalDefinition': False, - 'unknownPrefix': False - } - expected_issues = { - 'takesValue': [], - 'full': [], - 'extensionsAllowed': [], - 'leafExtension': self.format_error(ValidationErrors.TAG_EXTENSION_INVALID, tag=0), - 'nonExtensionsAllowed': self.format_error(ValidationErrors.TAG_EXTENSION_INVALID, tag=0), - 'invalidExtension': self.format_error( - ValidationErrors.INVALID_PARENT_NODE, tag=0, index_in_tag=9, index_in_tag_end=12, - expected_parent_tag="Property/Sensory-property/Sensory-attribute/Visual-attribute" + - "/Color/CSS-color/Red-color/Red"), - 'invalidExtension2': self.format_error( - ValidationErrors.INVALID_PARENT_NODE, tag=0, index_in_tag=9, index_in_tag_end=12, - expected_parent_tag="Property/Sensory-property/Sensory-attribute/Visual-attribute" + - "/Color/CSS-color/Red-color/Red"), - 'usedToBeIllegalComma': self.format_error(ValidationErrors.NO_VALID_TAG_FOUND, tag=1, - index_in_tag=3, index_in_tag_end=7), - 'legalDef': [], - 'legalDefExpand': [], - 'illegalDefinition': self.format_error(DefinitionErrors.BAD_DEFINITION_LOCATION, tag=0), - 'unknownPrefix': self.format_error( - ValidationErrors.HED_LIBRARY_UNMATCHED, tag=0, unknown_prefix="ul:", known_prefixes=["", "tl:"]), - } - self.validator_semantic(test_strings, expected_results, expected_issues, False) - - def test_proper_capitalization(self): - test_strings = { - 'proper': 'tl:Event/Sensory-event', - 'camelCase': 'tl:EvEnt/Sensory-event', - 'takesValue': 'tl:Sampling-rate/20 Hz', - 'numeric': 'tl:Statistical-uncertainty/20', - 'lowercase': 'tl:Event/sensory-event' - } - expected_results = { - 'proper': True, - 'camelCase': True, - 'takesValue': True, - 'numeric': True, - 'lowercase': False - } - expected_issues = { - 'proper': [], - 'camelCase': [], - 'takesValue': [], - 'numeric': [], - 'lowercase': self.format_error(ValidationErrors.STYLE_WARNING, tag=0) - } - self.validator_semantic(test_strings, expected_results, expected_issues, True) - - def test_child_required(self): - test_strings = { - 'hasChild': 'tl:Experimental-stimulus', - 'missingChild': 'tl:Label' - } - expected_results = { - 'hasChild': True, - 'missingChild': False - } - expected_issues = { - 'hasChild': [], - 'missingChild': self.format_error(ValidationErrors.TAG_REQUIRES_CHILD, tag=0) - } - self.validator_semantic(test_strings, expected_results, expected_issues, True) - - def test_required_units(self): - test_strings = { - 'hasRequiredUnit': 'Duration/3 ms', - 'missingRequiredUnit': 'Duration/3', - 'notRequiredNoNumber': 'Age', - 'notRequiredNumber': 'Age/0.5', - 'notRequiredScientific': 'Age/5.2e-1', - 'timeValue': 'Clock-face/08:30', - # Update test - This one is currently marked as valid because clock face isn't in hed3 - 'invalidTimeValue': 'Clock-face/8:30', - } - expected_results = { - 'hasRequiredUnit': True, - 'missingRequiredUnit': False, - 'notRequiredNoNumber': True, - 'notRequiredNumber': True, - 'notRequiredScientific': True, - 'timeValue': False, - 'invalidTimeValue': False, - } - # legal_clock_time_units = ['hour:min', 'hour:min:sec'] - expected_issues = { - 'hasRequiredUnit': [], - 'missingRequiredUnit': self.format_error( - ValidationErrors.UNITS_MISSING, tag=0, default_unit='s'), - 'notRequiredNoNumber': [], - 'notRequiredNumber': [], - 'notRequiredScientific': [], - 'timeValue': self.format_error( - ValidationErrors.TAG_EXTENDED, tag=0, index_in_tag=10, index_in_tag_end=None), - 'invalidTimeValue': self.format_error( - ValidationErrors.TAG_EXTENDED, tag=0, index_in_tag=10, index_in_tag_end=None), - } - self.validator_semantic(test_strings, expected_results, expected_issues, True) - - def test_correct_units(self): - test_strings = { - 'correctUnit': 'tl:Duration/3 ms', - 'correctUnitScientific': 'tl:Duration/3.5e1 ms', - 'correctPluralUnit': 'tl:Duration/3 milliseconds', - 'correctNoPluralUnit': 'tl:Frequency/3 hertz', - 'correctNonSymbolCapitalizedUnit': 'tl:Duration/3 MilliSeconds', - 'correctSymbolCapitalizedUnit': 'tl:Frequency/3 kHz', - 'incorrectUnit': 'tl:Duration/3 cm', - 'incorrectPluralUnit': 'tl:Frequency/3 hertzs', - 'incorrectSymbolCapitalizedUnit': 'tl:Frequency/3 hz', - 'incorrectSymbolCapitalizedUnitModifier': 'tl:Frequency/3 KHz', - 'notRequiredNumber': 'tl:Statistical-accuracy/0.5', - 'notRequiredScientific': 'tl:Statistical-accuracy/5e-1', - 'specialAllowedCharBadUnit': 'tl:Creation-date/bad_date', - 'specialAllowedCharUnit': 'tl:Creation-date/1900-01-01T01:01:01', - # todo: restore these when we have a currency node in the valid beta schema. - # 'specialAllowedCharCurrency': 'Event/Currency-Test/$100', - # 'specialNotAllowedCharCurrency': 'Event/Currency-Test/@100' - # Update tests - 8.0 currently has no clockTime nodes. - # 'properTime': 'Item/2D shape/Clock face/08:30', - # 'invalidTime': 'Item/2D shape/Clock face/54:54' - } - expected_results = { - 'correctUnit': True, - 'correctUnitScientific': True, - 'correctPluralUnit': True, - 'correctNoPluralUnit': True, - 'correctNonSymbolCapitalizedUnit': True, - 'correctSymbolCapitalizedUnit': True, - 'incorrectUnit': False, - 'incorrectPluralUnit': False, - 'incorrectSymbolCapitalizedUnit': False, - 'incorrectSymbolCapitalizedUnitModifier': False, - 'notRequiredNumber': True, - 'notRequiredScientific': True, - 'specialAllowedCharBadUnit': False, - 'specialAllowedCharUnit': True, - 'properTime': True, - 'invalidTime': True, - # 'specialAllowedCharCurrency': True, - # 'specialNotAllowedCharCurrency': False, - } - legal_time_units = ['s', 'second', 'day', 'minute', 'hour'] - # legal_clock_time_units = ['hour:min', 'hour:min:sec'] - # legal_datetime_units = ['YYYY-MM-DDThh:mm:ss'] - legal_freq_units = ['Hz', 'hertz'] - # legal_currency_units = ['dollar', "$", "point"] - - expected_issues = { - 'correctUnit': [], - 'correctUnitScientific': [], - 'correctPluralUnit': [], - 'correctNoPluralUnit': [], - 'correctNonSymbolCapitalizedUnit': [], - 'correctSymbolCapitalizedUnit': [], - 'incorrectUnit': self.format_error( - ValidationErrors.UNITS_INVALID, tag=0, units=legal_time_units), - 'incorrectPluralUnit': self.format_error( - ValidationErrors.UNITS_INVALID, tag=0, units=legal_freq_units), - 'incorrectSymbolCapitalizedUnit': self.format_error( - ValidationErrors.UNITS_INVALID, tag=0, units=legal_freq_units), - 'incorrectSymbolCapitalizedUnitModifier': self.format_error( - ValidationErrors.UNITS_INVALID, tag=0, units=legal_freq_units), - 'notRequiredNumber': [], - 'notRequiredScientific': [], - 'specialAllowedCharBadUnit': self.format_error(ValidationErrors.VALUE_INVALID, tag=0), - 'specialAllowedCharUnit': [], - # 'properTime': [], - # 'invalidTime': self.format_error(ValidationErrors.UNITS_INVALID, tag=0, - # units=legal_clock_time_units) - # 'specialAllowedCharCurrency': [], - # 'specialNotAllowedCharCurrency': self.format_error(ValidationErrors.UNITS_INVALID, - # tag=0, - # units=legal_currency_units), - } - self.validator_semantic(test_strings, expected_results, expected_issues, True) - - def test_extensions(self): - test_strings = { - 'invalidExtension': 'tl:Experiment-control/Animal-agent', - } - expected_results = { - 'invalidExtension': False, - } - expected_issues = { - 'invalidExtension': self.format_error(ValidationErrors.INVALID_PARENT_NODE, tag=0, - index_in_tag=19 + 3, index_in_tag_end=31 + 3, - expected_parent_tag="Agent/Animal-agent"), - } - self.validator_semantic(test_strings, expected_results, expected_issues, False) - - def test_invalid_placeholder_in_normal_string(self): - test_strings = { - 'invalidPlaceholder': 'tl:Duration/# ms', - } - expected_results = { - 'invalidPlaceholder': False, - } - expected_issues = { - 'invalidPlaceholder': self.format_error(ValidationErrors.INVALID_TAG_CHARACTER, - tag=0, index_in_tag=12, index_in_tag_end=13, - actual_error=ValidationErrors.PLACEHOLDER_INVALID), - } - self.validator_semantic(test_strings, expected_results, expected_issues, False) - - def test_span_reporting(self): - test_strings = { - 'orgTagDifferent': 'tl:Duration/23 hz', - 'orgTagDifferent2': 'tl:Duration/23 hz, Duration/23 hz', - } - expected_results = { - 'orgTagDifferent': False, - 'orgTagDifferent2': False, - } - tag_unit_class_units = ['day', 'hour', 'minute', 's', 'second'] - expected_issues = { - 'orgTagDifferent': self.format_error(ValidationErrors.UNITS_INVALID, tag=0, - units=tag_unit_class_units), - 'orgTagDifferent2': self.format_error(ValidationErrors.UNITS_INVALID, tag=0, - units=tag_unit_class_units) - + self.format_error(ValidationErrors.UNITS_INVALID, tag=1, - units=tag_unit_class_units), - } - self.validator_semantic(test_strings, expected_results, expected_issues, False) - - -class TestTagLevels3(TestHed3): - @staticmethod - def string_obj_func(validator): - return validator._group_validator.run_tag_level_validators - - def test_no_duplicates(self): - test_strings = { - 'topLevelDuplicate': 'tl:Event/Sensory-event,tl:Event/Sensory-event', - 'groupDuplicate': 'tl:Item/Object/Man-made-object/VehicleTrain,(tl:Event/Sensory-event,' - 'tl:Purple-color/Purple,tl:Event/Sensory-event)', - 'noDuplicate': 'tl:Event/Sensory-event,' - 'tl:Item/Object/Man-made-object/VehicleTrain,' - 'tl:Purple-color/Purple', - 'legalDuplicate': 'tl:Item/Object/Man-made-object/VehicleTrain,\ - (tl:Item/Object/Man-made-object/VehicleTrain,' - 'tl:Event/Sensory-event)', - } - expected_results = { - 'topLevelDuplicate': False, - 'groupDuplicate': False, - 'legalDuplicate': True, - 'noDuplicate': True - } - expected_issues = { - 'topLevelDuplicate': self.format_error(ValidationErrors.HED_TAG_REPEATED, tag=1), - 'groupDuplicate': self.format_error(ValidationErrors.HED_TAG_REPEATED, tag=3), - 'legalDuplicate': [], - 'noDuplicate': [] - } - self.validator_semantic(test_strings, expected_results, expected_issues, False) - - def test_no_duplicates_semantic(self): - test_strings = { - 'mixedLevelDuplicates': 'tl:Man-made-object/Vehicle/Boat, tl:Vehicle/Boat', - 'mixedLevelDuplicates2': 'tl:Man-made-object/Vehicle/Boat, tl:Boat' - } - expected_results = { - 'mixedLevelDuplicates': False, - 'mixedLevelDuplicates2': False, - } - expected_issues = { - 'mixedLevelDuplicates': self.format_error(ValidationErrors.HED_TAG_REPEATED, - tag=1), - 'mixedLevelDuplicates2': self.format_error(ValidationErrors.HED_TAG_REPEATED, - tag=1), - } - self.validator_semantic(test_strings, expected_results, expected_issues, False) - - def test_topLevelTagGroup_validation(self): - test_strings = { - 'invalid1': 'tl:Definition/InvalidDef', - 'valid1': '(tl:Definition/ValidDef)', - 'valid2': '(tl:Definition/ValidDef), (tl:Definition/ValidDef2)', - 'invalid2': '(tl:Event, (tl:Definition/InvalidDef2))', - 'invalidTwoInOne': '(tl:Definition/InvalidDef2, tl:Definition/InvalidDef3)', - 'invalid2TwoInOne': '(tl:Definition/InvalidDef2, tl:Onset)', - } - expected_results = { - 'invalid1': False, - 'valid1': True, - 'valid2': True, - 'invalid2': False, - 'invalidTwoInOne': False, - 'invalid2TwoInOne': False, - } - expected_issues = { - 'invalid1': self.format_error(ValidationErrors.HED_TOP_LEVEL_TAG, - tag=0, actual_error=ValidationErrors.DEFINITION_INVALID) - + self.format_error(ValidationErrors.HED_TOP_LEVEL_TAG, tag=0), - 'valid1': [], - 'valid2': [], - 'invalid2': self.format_error(ValidationErrors.HED_TOP_LEVEL_TAG, tag=1, actual_error=ValidationErrors.DEFINITION_INVALID) - + self.format_error(ValidationErrors.HED_TOP_LEVEL_TAG, tag=1), - 'invalidTwoInOne': self.format_error( - ValidationErrors.HED_MULTIPLE_TOP_TAGS, tag=0, - multiple_tags="tl:Definition/InvalidDef3".split(", ")), - 'invalid2TwoInOne': self.format_error( - ValidationErrors.HED_MULTIPLE_TOP_TAGS, tag=0, - multiple_tags="tl:Onset".split(", ")), - } - self.validator_semantic(test_strings, expected_results, expected_issues, False) - - def test_taggroup_validation(self): - test_strings = { - 'invalid1': 'tl:Def-Expand/InvalidDef', - 'invalid2': 'tl:Def-Expand/InvalidDef, tl:Event, (tl:Event)', - 'invalid3': 'tl:Event, (tl:Event), tl:Def-Expand/InvalidDef', - 'valid1': '(tl:Def-Expand/ValidDef)', - 'valid2': '(tl:Def-Expand/ValidDef), (tl:Def-Expand/ValidDef2)', - 'valid3': '(tl:Event, (tl:Def-Expand/InvalidDef2))', - # This case should possibly be flagged as invalid - 'semivalid1': '(tl:Def-Expand/InvalidDef2, tl:Def-Expand/InvalidDef3)', - 'semivalid2': '(tl:Def-Expand/InvalidDef2, tl:Onset)', - } - expected_results = { - 'invalid1': False, - 'invalid2': False, - 'invalid3': False, - 'valid1': True, - 'valid2': True, - 'valid3': True, - 'semivalid1': True, - 'semivalid2': True, - } - expected_issues = { - 'invalid1': self.format_error(ValidationErrors.HED_TAG_GROUP_TAG, tag=0), - 'invalid2': self.format_error(ValidationErrors.HED_TAG_GROUP_TAG, tag=0), - 'invalid3': self.format_error(ValidationErrors.HED_TAG_GROUP_TAG, tag=2), - 'valid1': [], - 'valid2': [], - 'valid3': [], - 'semivalid1': [], - 'semivalid2': [] - } - self.validator_semantic(test_strings, expected_results, expected_issues, False) - - -class RequiredTags(TestHed3): - @staticmethod - def string_obj_func(validator): - return partial(validator._group_validator.run_all_tags_validators) - - def test_includes_all_required_tags(self): - test_strings = { - 'complete': 'Animal-agent, Action, tl:Animal-agent, tl:Action', - 'missingAgent': 'Action, tl:Animal-agent, tl:Action', - 'missingAction': 'Animal-agent, tl:Animal-agent, tl:Action', - 'inSubGroup': 'Animal-agent, (Action, tl:Animal-agent, tl:Action)', - 'missingAll': 'Event' - } - expected_results = { - 'complete': True, - 'missingAgent': False, - 'missingAction': False, - 'inSubGroup': True, - 'missingAll': False, - } - expected_issues = { - 'complete': [], - 'missingAgent': self.format_error(ValidationErrors.REQUIRED_TAG_MISSING, - tag_namespace='Agent/Animal-agent'), - 'missingAction': self.format_error(ValidationErrors.REQUIRED_TAG_MISSING, tag_namespace='Action'), - 'inSubGroup': [], - 'missingAll': - self.format_error(ValidationErrors.REQUIRED_TAG_MISSING, tag_namespace='Action') - + self.format_error(ValidationErrors.REQUIRED_TAG_MISSING, tag_namespace='Agent/Animal-agent') - + self.format_error(ValidationErrors.REQUIRED_TAG_MISSING, tag_namespace='tl:Action') - + self.format_error(ValidationErrors.REQUIRED_TAG_MISSING, tag_namespace='tl:Agent/Animal-agent'), - } - self.validator_semantic(test_strings, expected_results, expected_issues, True) - - def test_multiple_copies_unique_tags(self): - test_strings = { - 'legal': 'tl:Event-context,' - '(Vehicle,Event), Animal-agent, Action, tl:Animal-agent, tl:Action', - 'multipleDesc': 'tl:Event-context,' - 'tl:Event-context,' - 'Vehicle,(Vehicle,tl:Event-context), Animal-agent, Action, tl:Animal-agent, tl:Action', - 'multipleDescIncShort': 'tl:Event-context,' - 'tl:Organizational-property/Event-context,' - ' Animal-agent, Action, tl:Animal-agent, tl:Action' - } - expected_results = { - 'legal': True, - 'multipleDesc': False, - 'multipleDescIncShort': False - } - expected_issues = { - 'legal': [], - 'multipleDesc': self.format_error(ValidationErrors.TAG_NOT_UNIQUE, - tag_namespace='tl:Property/Organizational-property/Event-context'), - 'multipleDescIncShort': self.format_error(ValidationErrors.TAG_NOT_UNIQUE, - tag_namespace='tl:Property/Organizational-property/Event-context'), - } - self.validator_semantic(test_strings, expected_results, expected_issues, False) - - -if __name__ == '__main__': - unittest.main() +import unittest +import os + +from hed.errors import error_reporter +from hed import schema +from hed.errors.error_types import ValidationErrors, DefinitionErrors +from hed.schema.hed_schema_group import HedSchemaGroup +from hed.errors.exceptions import HedFileError +from tests.validator.test_tag_validator_base import TestValidatorBase +from functools import partial + + +class TestHed3(TestValidatorBase): + schema_file = None + + @classmethod + def setUpClass(cls): + schema_file = '../data/validator_tests/HED8.0.0_added_tests.mediawiki' + hed_xml = os.path.join(os.path.dirname(os.path.realpath(__file__)), schema_file) + hed_schema1 = schema.load_schema(hed_xml) + hed_schema2 = schema.load_schema(hed_xml, schema_namespace="tl:") + cls.hed_schema = HedSchemaGroup([hed_schema1, hed_schema2]) + + cls.error_handler = error_reporter.ErrorHandler() + super().setUpClass() + + def test_invalid_load(self): + schema_file = '../data/schema_tests/HED8.0.0t.xml' + hed_xml = os.path.join(os.path.dirname(os.path.realpath(__file__)), schema_file) + hed_schema1 = schema.load_schema(hed_xml, schema_namespace="tl:") + hed_schema2 = schema.load_schema(hed_xml, schema_namespace="tl:") + + self.assertRaises(HedFileError, HedSchemaGroup, [hed_schema1, hed_schema2]) + + def test_invalid_load_prefix(self): + schema_file = '../data/schema_tests/HED8.0.0t.xml' + hed_xml = os.path.join(os.path.dirname(os.path.realpath(__file__)), schema_file) + hed_schema1 = schema.load_schema(hed_xml) + hed_schema2 = schema.load_schema(hed_xml) + + self.assertRaises(HedFileError, HedSchemaGroup, [hed_schema1, hed_schema2]) + + +class IndividualHedTagsShort(TestHed3): + @staticmethod + def string_obj_func(validator): + return partial(validator._validate_individual_tags_in_hed_string) + + def test_exist_in_schema(self): + test_strings = { + 'takesValue': 'tl:Duration/3 ms', + 'full': 'tl:Animal-agent', + 'extensionsAllowed': 'tl:Item/Beaver', + 'leafExtension': 'tl:Experiment-procedure/Something', + 'nonExtensionsAllowed': 'tl:Event/Nonsense', + 'invalidExtension': 'tl:Agent/Red', + 'invalidExtension2': 'tl:Agent/Red/Extension2', + 'usedToBeIllegalComma': 'tl:Label/This is a label,tl:This/Is/A/Tag', + 'legalDef': 'tl:Def/Item', + 'legalDefExpand': 'tl:Def-expand/Item', + 'illegalDefinition': 'tl:Definition/Item', + 'unknownPrefix': 'ul:Definition/Item' + } + expected_results = { + 'takesValue': True, + 'full': True, + 'extensionsAllowed': True, + 'leafExtension': False, + 'nonExtensionsAllowed': False, + 'invalidExtension': False, + 'invalidExtension2': False, + 'usedToBeIllegalComma': False, + 'legalDef': True, + 'legalDefExpand': True, + 'illegalDefinition': False, + 'unknownPrefix': False + } + expected_issues = { + 'takesValue': [], + 'full': [], + 'extensionsAllowed': [], + 'leafExtension': self.format_error(ValidationErrors.TAG_EXTENSION_INVALID, tag=0), + 'nonExtensionsAllowed': self.format_error(ValidationErrors.TAG_EXTENSION_INVALID, tag=0), + 'invalidExtension': self.format_error( + ValidationErrors.INVALID_PARENT_NODE, tag=0, index_in_tag=9, index_in_tag_end=12, + expected_parent_tag="Property/Sensory-property/Sensory-attribute/Visual-attribute" + + "/Color/CSS-color/Red-color/Red"), + 'invalidExtension2': self.format_error( + ValidationErrors.INVALID_PARENT_NODE, tag=0, index_in_tag=9, index_in_tag_end=12, + expected_parent_tag="Property/Sensory-property/Sensory-attribute/Visual-attribute" + + "/Color/CSS-color/Red-color/Red"), + 'usedToBeIllegalComma': self.format_error(ValidationErrors.NO_VALID_TAG_FOUND, tag=1, + index_in_tag=3, index_in_tag_end=7), + 'legalDef': [], + 'legalDefExpand': [], + 'illegalDefinition': self.format_error(DefinitionErrors.BAD_DEFINITION_LOCATION, tag=0), + 'unknownPrefix': self.format_error( + ValidationErrors.HED_LIBRARY_UNMATCHED, tag=0, unknown_prefix="ul:", known_prefixes=["", "tl:"]), + } + self.validator_semantic(test_strings, expected_results, expected_issues, False) + + def test_proper_capitalization(self): + test_strings = { + 'proper': 'tl:Event/Sensory-event', + 'camelCase': 'tl:EvEnt/Sensory-event', + 'takesValue': 'tl:Sampling-rate/20 Hz', + 'numeric': 'tl:Statistical-uncertainty/20', + 'lowercase': 'tl:Event/sensory-event' + } + expected_results = { + 'proper': True, + 'camelCase': True, + 'takesValue': True, + 'numeric': True, + 'lowercase': False + } + expected_issues = { + 'proper': [], + 'camelCase': [], + 'takesValue': [], + 'numeric': [], + 'lowercase': self.format_error(ValidationErrors.STYLE_WARNING, tag=0) + } + self.validator_semantic(test_strings, expected_results, expected_issues, True) + + def test_child_required(self): + test_strings = { + 'hasChild': 'tl:Experimental-stimulus', + 'missingChild': 'tl:Label' + } + expected_results = { + 'hasChild': True, + 'missingChild': False + } + expected_issues = { + 'hasChild': [], + 'missingChild': self.format_error(ValidationErrors.TAG_REQUIRES_CHILD, tag=0) + } + self.validator_semantic(test_strings, expected_results, expected_issues, True) + + def test_required_units(self): + test_strings = { + 'hasRequiredUnit': 'Duration/3 ms', + 'missingRequiredUnit': 'Duration/3', + 'notRequiredNoNumber': 'Age', + 'notRequiredNumber': 'Age/0.5', + 'notRequiredScientific': 'Age/5.2e-1', + 'timeValue': 'Clock-face/08:30', + # Update test - This one is currently marked as valid because clock face isn't in hed3 + 'invalidTimeValue': 'Clock-face/8:30', + } + expected_results = { + 'hasRequiredUnit': True, + 'missingRequiredUnit': False, + 'notRequiredNoNumber': True, + 'notRequiredNumber': True, + 'notRequiredScientific': True, + 'timeValue': False, + 'invalidTimeValue': False, + } + # legal_clock_time_units = ['hour:min', 'hour:min:sec'] + expected_issues = { + 'hasRequiredUnit': [], + 'missingRequiredUnit': self.format_error( + ValidationErrors.UNITS_MISSING, tag=0, default_unit='s'), + 'notRequiredNoNumber': [], + 'notRequiredNumber': [], + 'notRequiredScientific': [], + 'timeValue': self.format_error( + ValidationErrors.TAG_EXTENDED, tag=0, index_in_tag=10, index_in_tag_end=None), + 'invalidTimeValue': self.format_error( + ValidationErrors.TAG_EXTENDED, tag=0, index_in_tag=10, index_in_tag_end=None), + } + self.validator_semantic(test_strings, expected_results, expected_issues, True) + + def test_correct_units(self): + test_strings = { + 'correctUnit': 'tl:Duration/3 ms', + 'correctUnitScientific': 'tl:Duration/3.5e1 ms', + 'correctPluralUnit': 'tl:Duration/3 milliseconds', + 'correctNoPluralUnit': 'tl:Frequency/3 hertz', + 'correctNonSymbolCapitalizedUnit': 'tl:Duration/3 MilliSeconds', + 'correctSymbolCapitalizedUnit': 'tl:Frequency/3 kHz', + 'incorrectUnit': 'tl:Duration/3 cm', + 'incorrectPluralUnit': 'tl:Frequency/3 hertzs', + 'incorrectSymbolCapitalizedUnit': 'tl:Frequency/3 hz', + 'incorrectSymbolCapitalizedUnitModifier': 'tl:Frequency/3 KHz', + 'notRequiredNumber': 'tl:Statistical-accuracy/0.5', + 'notRequiredScientific': 'tl:Statistical-accuracy/5e-1', + 'specialAllowedCharBadUnit': 'tl:Creation-date/bad_date', + 'specialAllowedCharUnit': 'tl:Creation-date/1900-01-01T01:01:01', + # todo: restore these when we have a currency node in the valid beta schema. + # 'specialAllowedCharCurrency': 'Event/Currency-Test/$100', + # 'specialNotAllowedCharCurrency': 'Event/Currency-Test/@100' + # Update tests - 8.0 currently has no clockTime nodes. + # 'properTime': 'Item/2D shape/Clock face/08:30', + # 'invalidTime': 'Item/2D shape/Clock face/54:54' + } + expected_results = { + 'correctUnit': True, + 'correctUnitScientific': True, + 'correctPluralUnit': True, + 'correctNoPluralUnit': True, + 'correctNonSymbolCapitalizedUnit': True, + 'correctSymbolCapitalizedUnit': True, + 'incorrectUnit': False, + 'incorrectPluralUnit': False, + 'incorrectSymbolCapitalizedUnit': False, + 'incorrectSymbolCapitalizedUnitModifier': False, + 'notRequiredNumber': True, + 'notRequiredScientific': True, + 'specialAllowedCharBadUnit': False, + 'specialAllowedCharUnit': True, + 'properTime': True, + 'invalidTime': True, + # 'specialAllowedCharCurrency': True, + # 'specialNotAllowedCharCurrency': False, + } + legal_time_units = ['s', 'second', 'day', 'minute', 'hour'] + # legal_clock_time_units = ['hour:min', 'hour:min:sec'] + # legal_datetime_units = ['YYYY-MM-DDThh:mm:ss'] + legal_freq_units = ['Hz', 'hertz'] + # legal_currency_units = ['dollar', "$", "point"] + + expected_issues = { + 'correctUnit': [], + 'correctUnitScientific': [], + 'correctPluralUnit': [], + 'correctNoPluralUnit': [], + 'correctNonSymbolCapitalizedUnit': [], + 'correctSymbolCapitalizedUnit': [], + 'incorrectUnit': self.format_error( + ValidationErrors.UNITS_INVALID, tag=0, units=legal_time_units), + 'incorrectPluralUnit': self.format_error( + ValidationErrors.UNITS_INVALID, tag=0, units=legal_freq_units), + 'incorrectSymbolCapitalizedUnit': self.format_error( + ValidationErrors.UNITS_INVALID, tag=0, units=legal_freq_units), + 'incorrectSymbolCapitalizedUnitModifier': self.format_error( + ValidationErrors.UNITS_INVALID, tag=0, units=legal_freq_units), + 'notRequiredNumber': [], + 'notRequiredScientific': [], + 'specialAllowedCharBadUnit': self.format_error(ValidationErrors.INVALID_VALUE_CLASS_VALUE, tag=0, + value_class="dateTimeClass", + index_in_tag=0, index_in_tag_end=25), + 'specialAllowedCharUnit': [], + # 'properTime': [], + # 'invalidTime': self.format_error(ValidationErrors.UNITS_INVALID, tag=0, + # units=legal_clock_time_units) + # 'specialAllowedCharCurrency': [], + # 'specialNotAllowedCharCurrency': self.format_error(ValidationErrors.UNITS_INVALID, + # tag=0, + # units=legal_currency_units), + } + self.validator_semantic(test_strings, expected_results, expected_issues, True) + + def test_extensions(self): + test_strings = { + 'invalidExtension': 'tl:Experiment-control/Animal-agent', + } + expected_results = { + 'invalidExtension': False, + } + expected_issues = { + 'invalidExtension': self.format_error(ValidationErrors.INVALID_PARENT_NODE, tag=0, + index_in_tag=19 + 3, index_in_tag_end=31 + 3, + expected_parent_tag="Agent/Animal-agent"), + } + self.validator_semantic(test_strings, expected_results, expected_issues, False) + + def test_invalid_placeholder_in_normal_string(self): + test_strings = { + 'invalidPlaceholder': 'tl:Duration/# ms', + } + expected_results = { + 'invalidPlaceholder': False, + } + expected_issues = { + 'invalidPlaceholder': self.format_error(ValidationErrors.INVALID_TAG_CHARACTER, + tag=0, index_in_tag=12, index_in_tag_end=13, + actual_error=ValidationErrors.PLACEHOLDER_INVALID) + + self.format_error(ValidationErrors.INVALID_VALUE_CLASS_VALUE, tag=0, + index_in_tag=0, index_in_tag_end=16, value_class="numericClass") + } + self.validator_semantic(test_strings, expected_results, expected_issues, False) + + def test_span_reporting(self): + test_strings = { + 'orgTagDifferent': 'tl:Duration/23 hz', + 'orgTagDifferent2': 'tl:Duration/23 hz, Duration/23 hz', + } + expected_results = { + 'orgTagDifferent': False, + 'orgTagDifferent2': False, + } + tag_unit_class_units = ['day', 'hour', 'minute', 's', 'second'] + expected_issues = { + 'orgTagDifferent': self.format_error(ValidationErrors.UNITS_INVALID, tag=0, + units=tag_unit_class_units), + 'orgTagDifferent2': self.format_error(ValidationErrors.UNITS_INVALID, tag=0, + units=tag_unit_class_units) + + self.format_error(ValidationErrors.UNITS_INVALID, tag=1, + units=tag_unit_class_units), + } + self.validator_semantic(test_strings, expected_results, expected_issues, False) + + +class TestTagLevels3(TestHed3): + @staticmethod + def string_obj_func(validator): + return validator._group_validator.run_tag_level_validators + + def test_no_duplicates(self): + test_strings = { + 'topLevelDuplicate': 'tl:Event/Sensory-event,tl:Event/Sensory-event', + 'groupDuplicate': 'tl:Item/Object/Man-made-object/VehicleTrain,(tl:Event/Sensory-event,' + 'tl:Purple-color/Purple,tl:Event/Sensory-event)', + 'noDuplicate': 'tl:Event/Sensory-event,' + 'tl:Item/Object/Man-made-object/VehicleTrain,' + 'tl:Purple-color/Purple', + 'legalDuplicate': 'tl:Item/Object/Man-made-object/VehicleTrain,\ + (tl:Item/Object/Man-made-object/VehicleTrain,' + 'tl:Event/Sensory-event)', + } + expected_results = { + 'topLevelDuplicate': False, + 'groupDuplicate': False, + 'legalDuplicate': True, + 'noDuplicate': True + } + expected_issues = { + 'topLevelDuplicate': self.format_error(ValidationErrors.HED_TAG_REPEATED, tag=1), + 'groupDuplicate': self.format_error(ValidationErrors.HED_TAG_REPEATED, tag=3), + 'legalDuplicate': [], + 'noDuplicate': [] + } + self.validator_semantic(test_strings, expected_results, expected_issues, False) + + def test_no_duplicates_semantic(self): + test_strings = { + 'mixedLevelDuplicates': 'tl:Man-made-object/Vehicle/Boat, tl:Vehicle/Boat', + 'mixedLevelDuplicates2': 'tl:Man-made-object/Vehicle/Boat, tl:Boat' + } + expected_results = { + 'mixedLevelDuplicates': False, + 'mixedLevelDuplicates2': False, + } + expected_issues = { + 'mixedLevelDuplicates': self.format_error(ValidationErrors.HED_TAG_REPEATED, + tag=1), + 'mixedLevelDuplicates2': self.format_error(ValidationErrors.HED_TAG_REPEATED, + tag=1), + } + self.validator_semantic(test_strings, expected_results, expected_issues, False) + + def test_topLevelTagGroup_validation(self): + test_strings = { + 'invalid1': 'tl:Definition/InvalidDef', + 'valid1': '(tl:Definition/ValidDef)', + 'valid2': '(tl:Definition/ValidDef), (tl:Definition/ValidDef2)', + 'invalid2': '(tl:Event, (tl:Definition/InvalidDef2))', + 'invalidTwoInOne': '(tl:Definition/InvalidDef2, tl:Definition/InvalidDef3)', + 'invalid2TwoInOne': '(tl:Definition/InvalidDef2, tl:Onset)', + } + expected_results = { + 'invalid1': False, + 'valid1': True, + 'valid2': True, + 'invalid2': False, + 'invalidTwoInOne': False, + 'invalid2TwoInOne': False, + } + expected_issues = { + 'invalid1': self.format_error(ValidationErrors.HED_TOP_LEVEL_TAG, + tag=0, actual_error=ValidationErrors.DEFINITION_INVALID) + + self.format_error(ValidationErrors.HED_TOP_LEVEL_TAG, tag=0), + 'valid1': [], + 'valid2': [], + 'invalid2': self.format_error(ValidationErrors.HED_TOP_LEVEL_TAG, tag=1, + actual_error=ValidationErrors.DEFINITION_INVALID) + + self.format_error(ValidationErrors.HED_TOP_LEVEL_TAG, tag=1), + 'invalidTwoInOne': self.format_error( + ValidationErrors.HED_MULTIPLE_TOP_TAGS, tag=0, + multiple_tags="tl:Definition/InvalidDef3".split(", ")), + 'invalid2TwoInOne': self.format_error( + ValidationErrors.HED_MULTIPLE_TOP_TAGS, tag=0, + multiple_tags="tl:Onset".split(", ")), + } + self.validator_semantic(test_strings, expected_results, expected_issues, False) + + def test_taggroup_validation(self): + test_strings = { + 'invalid1': 'tl:Def-Expand/InvalidDef', + 'invalid2': 'tl:Def-Expand/InvalidDef, tl:Event, (tl:Event)', + 'invalid3': 'tl:Event, (tl:Event), tl:Def-Expand/InvalidDef', + 'valid1': '(tl:Def-Expand/ValidDef)', + 'valid2': '(tl:Def-Expand/ValidDef), (tl:Def-Expand/ValidDef2)', + 'valid3': '(tl:Event, (tl:Def-Expand/InvalidDef2))', + # This case should possibly be flagged as invalid + 'semivalid1': '(tl:Def-Expand/InvalidDef2, tl:Def-Expand/InvalidDef3)', + 'semivalid2': '(tl:Def-Expand/InvalidDef2, tl:Onset)', + } + expected_results = { + 'invalid1': False, + 'invalid2': False, + 'invalid3': False, + 'valid1': True, + 'valid2': True, + 'valid3': True, + 'semivalid1': True, + 'semivalid2': True, + } + expected_issues = { + 'invalid1': self.format_error(ValidationErrors.HED_TAG_GROUP_TAG, tag=0), + 'invalid2': self.format_error(ValidationErrors.HED_TAG_GROUP_TAG, tag=0), + 'invalid3': self.format_error(ValidationErrors.HED_TAG_GROUP_TAG, tag=2), + 'valid1': [], + 'valid2': [], + 'valid3': [], + 'semivalid1': [], + 'semivalid2': [] + } + self.validator_semantic(test_strings, expected_results, expected_issues, False) + + +class RequiredTags(TestHed3): + @staticmethod + def string_obj_func(validator): + return partial(validator._group_validator.run_all_tags_validators) + + def test_includes_all_required_tags(self): + test_strings = { + 'complete': 'Animal-agent, Action, tl:Animal-agent, tl:Action', + 'missingAgent': 'Action, tl:Animal-agent, tl:Action', + 'missingAction': 'Animal-agent, tl:Animal-agent, tl:Action', + 'inSubGroup': 'Animal-agent, (Action, tl:Animal-agent, tl:Action)', + 'missingAll': 'Event' + } + expected_results = { + 'complete': True, + 'missingAgent': False, + 'missingAction': False, + 'inSubGroup': True, + 'missingAll': False, + } + expected_issues = { + 'complete': [], + 'missingAgent': self.format_error(ValidationErrors.REQUIRED_TAG_MISSING, + tag_namespace='Agent/Animal-agent'), + 'missingAction': self.format_error(ValidationErrors.REQUIRED_TAG_MISSING, tag_namespace='Action'), + 'inSubGroup': [], + 'missingAll': + self.format_error(ValidationErrors.REQUIRED_TAG_MISSING, tag_namespace='Action') + + self.format_error(ValidationErrors.REQUIRED_TAG_MISSING, tag_namespace='Agent/Animal-agent') + + self.format_error(ValidationErrors.REQUIRED_TAG_MISSING, tag_namespace='tl:Action') + + self.format_error(ValidationErrors.REQUIRED_TAG_MISSING, tag_namespace='tl:Agent/Animal-agent'), + } + self.validator_semantic(test_strings, expected_results, expected_issues, True) + + def test_multiple_copies_unique_tags(self): + test_strings = { + 'legal': 'tl:Event-context,' + '(Vehicle,Event), Animal-agent, Action, tl:Animal-agent, tl:Action', + 'multipleDesc': 'tl:Event-context,' + 'tl:Event-context,' + 'Vehicle,(Vehicle,tl:Event-context), Animal-agent, Action, tl:Animal-agent, tl:Action', + 'multipleDescIncShort': 'tl:Event-context,' + 'tl:Organizational-property/Event-context,' + ' Animal-agent, Action, tl:Animal-agent, tl:Action' + } + expected_results = { + 'legal': True, + 'multipleDesc': False, + 'multipleDescIncShort': False + } + expected_issues = { + 'legal': [], + 'multipleDesc': self.format_error(ValidationErrors.TAG_NOT_UNIQUE, + tag_namespace='tl:Property/Organizational-property/Event-context'), + 'multipleDescIncShort': + self.format_error(ValidationErrors.TAG_NOT_UNIQUE, + tag_namespace='tl:Property/Organizational-property/Event-context'), + } + self.validator_semantic(test_strings, expected_results, expected_issues, False) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/validator/test_tag_validator_util.py b/tests/validator/test_tag_validator_util.py index bf8d2a27e..81bb3bfb1 100644 --- a/tests/validator/test_tag_validator_util.py +++ b/tests/validator/test_tag_validator_util.py @@ -1,7 +1,7 @@ import unittest -from hed.validator.tag_util import class_util +from hed.validator.util import class_util from tests.validator.test_tag_validator import TestHed @@ -54,10 +54,10 @@ def test_date_times(self): 'invalidString': 'not a time', } for string in valid_test_strings.values(): - result = class_util.is_date_time(string) + result = class_util.is_date_time_value_class(string) self.assertEqual(result, True, string) for string in invalid_test_strings.values(): - result = class_util.is_date_time(string) + result = class_util.is_date_time_value_class(string) self.assertEqual(result, False, string)