From cbac49a9bde239d3ca252279009489fc13d1097c Mon Sep 17 00:00:00 2001 From: Robert Carroll Date: Fri, 8 May 2026 16:01:02 -0500 Subject: [PATCH 1/2] =?UTF-8?q?=E2=9A=A0=EF=B8=8F=20Migrate=20to=20Common?= =?UTF-8?q?=20Access=20Model?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sets this repo up as the Common Access Model, which programs can then specialize as needed. --- .copier-answers.yml | 5 +- .gitignore | 4 +- CONTRIBUTING.md | 12 +- README.md | 12 +- config.public.mk | 4 +- docs/about.md | 2 +- docs/index.md | 2 +- examples/README.md | 2 +- mkdocs.yml | 8 +- pyproject.toml | 10 +- .../__init__.py | 2 +- .../_version.py | 0 .../datamodel/__init__.py | 4 +- .../datamodel/include_access_model.py | 2282 +++++++++++++++++ .../include_access_model_pydantic.py | 1120 ++++++++ .../schema/README.md | 0 .../schema/common_access_model.yaml | 1349 ++++++++++ tests/__init__.py | 2 +- tests/data/README.md | 2 +- tests/test_data.py | 6 +- uv.lock | 70 +- 21 files changed, 4827 insertions(+), 71 deletions(-) rename src/{include_access_model => common_access_model}/__init__.py (57%) rename src/{include_access_model => common_access_model}/_version.py (100%) rename src/{include_access_model => common_access_model}/datamodel/__init__.py (51%) create mode 100644 src/common_access_model/datamodel/include_access_model.py create mode 100644 src/common_access_model/datamodel/include_access_model_pydantic.py rename src/{include_access_model => common_access_model}/schema/README.md (100%) create mode 100644 src/common_access_model/schema/common_access_model.yaml diff --git a/.copier-answers.yml b/.copier-answers.yml index f29660c..4067991 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -10,6 +10,5 @@ gh_action_pypi: false github_org: include-dcc license: MIT project_description: Internal Access model for the INCLUDE DCC. -project_name: include-access-model -project_slug: include_access_model - +project_name: common-access-model +project_slug: common_access_model diff --git a/.gitignore b/.gitignore index 16efa4d..e67997c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,8 +3,8 @@ /docs/schema/*.yaml # generated pydantic model -/src/include_access_model/datamodel/include_access_model_pydantic.py -/src/include_access_model/datamodel/include_access_model.py +/src/common_access_model/datamodel/common_access_model_pydantic.py +/src/common_access_model/datamodel/common_access_model.py # linkml-run-examples output (not useful to have in git in its current form) /examples/output/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fd33a22..d368e60 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,9 +1,9 @@ -# Contributing to include-access-model +# Contributing to common-access-model :+1: First of all: Thank you for taking the time to contribute! The following is a set of guidelines for contributing to -include-access-model. These guidelines are not strict rules. +common-access-model. These guidelines are not strict rules. Use your best judgment, and feel free to propose changes to this document in a pull request. @@ -22,7 +22,7 @@ in a pull request. ## Code of Conduct -The include-access-model team strives to create a +The common-access-model team strives to create a welcoming environment for editors, users and other contributors. Please carefully read our [Code of Conduct](CODE_OF_CONDUCT.md). @@ -73,7 +73,7 @@ Please submit a [Pull Request][pulls] to submit a new term for consideration. - Never work on the main branch, always work on an issue/feature branch - Core developers can work on branches off origin rather than forks - Always create a PR on a branch to maximize transparency of what you are doing - - PRs should be reviewed and merged in a timely fashion by the include-access-model technical leads + - PRs should be reviewed and merged in a timely fashion by the common-access-model technical leads - PRs that do not pass GitHub actions should never be merged - In the case of git conflicts, the contributor should try and resolve the conflict - If a PR fails a GitHub action check, the contributor should try and resolve the issue in a timely fashion @@ -115,7 +115,7 @@ Core developers should read the material on the [LinkML site](https://linkml.io/ [about-branches]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-branches [about-issues]: https://docs.github.com/en/issues/tracking-your-work-with-issues/about-issues [about-pulls]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests -[issues]: https://github.com/include-dcc/include-access-model/issues/ -[pulls]: https://github.com/include-dcc/include-access-model/pulls/ +[issues]: https://github.com/include-dcc/common-access-model/issues/ +[pulls]: https://github.com/include-dcc/common-access-model/pulls/ We recommend also reading [GitHub Pull Requests: 10 Tips to Know](https://blog.mergify.com/github-pull-requests-10-tips-to-know/) diff --git a/README.md b/README.md index fe6d193..a44fedb 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ Copier Badge -# include-access-model +# common-access-model -Internal Access model for the INCLUDE DCC. +Common Access Model designed to support core data operations for cloud repositories. ## Documentation Website -[https://include-dcc.github.io/include-access-model](https://include-dcc.github.io/include-access-model) +[https://include-dcc.github.io/common-access-model](https://include-dcc.github.io/common-access-model) ## Repository Structure @@ -15,10 +15,10 @@ Internal Access model for the INCLUDE DCC. * [examples/](examples/) - Examples of using the schema * [project/](project/) - project files (these files are auto-generated, do not edit) * [src/](src/) - source files (edit these) - * [include_access_model](src/include_access_model) - * [schema/](src/include_access_model/schema) -- LinkML schema + * [common_access_model](src/common_access_model) + * [schema/](src/common_access_model/schema) -- LinkML schema (edit this) - * [datamodel/](src/include_access_model/datamodel) -- generated + * [datamodel/](src/common_access_model/datamodel) -- generated Python datamodel * [tests/](tests/) - Python tests * [data/](tests/data) - Example data diff --git a/config.public.mk b/config.public.mk index 42dd248..ff16ec8 100644 --- a/config.public.mk +++ b/config.public.mk @@ -6,10 +6,10 @@ # Note: # - just works fine with quoted variables of dot-env files like this one -LINKML_SCHEMA_NAME="include_access_model" +LINKML_SCHEMA_NAME="common_access_model" LINKML_SCHEMA_AUTHOR="Robert Carroll " LINKML_SCHEMA_DESCRIPTION="Internal Access model for the INCLUDE DCC." -LINKML_SCHEMA_SOURCE_DIR="src/include_access_model/schema" +LINKML_SCHEMA_SOURCE_DIR="src/common_access_model/schema" ###### linkml generator variables, used by justfile diff --git a/docs/about.md b/docs/about.md index 81fabfc..6a754f8 100644 --- a/docs/about.md +++ b/docs/about.md @@ -1,3 +1,3 @@ -# About include-access-model +# About common-access-model Internal Access model for the INCLUDE DCC. diff --git a/docs/index.md b/docs/index.md index bae946c..c74a6e7 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -# include-access-model +# common-access-model Internal Access model for the INCLUDE DCC. diff --git a/examples/README.md b/examples/README.md index 6f41d50..e1db349 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,4 +1,4 @@ -# Examples of using include-access-model +# Examples of using common-access-model This folder contains examples using the datamodel. diff --git a/mkdocs.yml b/mkdocs.yml index 28d4a18..79be33a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,5 +1,5 @@ --- -site_name: "include-access-model" +site_name: "common-access-model" theme: name: material # palette: @@ -22,7 +22,7 @@ plugins: # - gen_pages.py # or any other name or path watch: - - src/include_access_model/schema + - src/common_access_model/schema nav: # - Home: index.md @@ -33,8 +33,8 @@ nav: exclude_docs: | /templates-linkml/ -site_url: https://include-dcc.github.io/include-access-model -repo_url: https://github.com/include-dcc/include-access-model +site_url: https://include-dcc.github.io/common-access-model +repo_url: https://github.com/include-dcc/common-access-model # Uncomment this block to enable use of Google Analytics. # Replace the property value with your own ID. diff --git a/pyproject.toml b/pyproject.toml index 854837f..418756c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["hatchling", "uv-dynamic-versioning"] build-backend = "hatchling.build" [project] -name = "include_access_model" +name = "common_access_model" description = "Internal Access model for the INCLUDE DCC." authors = [ {name = "Robert Carroll", email = "robert.carroll@vumc.org"}, @@ -51,8 +51,8 @@ skip = [ "pyproject.toml", "uv.lock", "project/*", - "src/include_access_model/datamodel/include_access_model_pydantic.py", - "src/include_access_model/datamodel/include_access_model.py", + "src/common_access_model/datamodel/common_access_model_pydantic.py", + "src/common_access_model/datamodel/common_access_model.py", ] # Reminder: words have to be lowercased for the ignore-words-list @@ -68,6 +68,6 @@ extend-exclude = [ "uv.lock", "pyproject.toml", "project/*", - "src/include_access_model/datamodel/include_access_model_pydantic.py", - "src/include_access_model/datamodel/include_access_model.py", + "src/common_access_model/datamodel/common_access_model_pydantic.py", + "src/common_access_model/datamodel/common_access_model.py", ] diff --git a/src/include_access_model/__init__.py b/src/common_access_model/__init__.py similarity index 57% rename from src/include_access_model/__init__.py rename to src/common_access_model/__init__.py index 9bfff06..bd0144b 100644 --- a/src/include_access_model/__init__.py +++ b/src/common_access_model/__init__.py @@ -1,5 +1,5 @@ try: - from include_access_model._version import __version__, __version_tuple__ + from common_access_model._version import __version__, __version_tuple__ except ImportError: # pragma: no cover __version__ = "0.0.0" __version_tuple__ = (0, 0, 0) diff --git a/src/include_access_model/_version.py b/src/common_access_model/_version.py similarity index 100% rename from src/include_access_model/_version.py rename to src/common_access_model/_version.py diff --git a/src/include_access_model/datamodel/__init__.py b/src/common_access_model/datamodel/__init__.py similarity index 51% rename from src/include_access_model/datamodel/__init__.py rename to src/common_access_model/datamodel/__init__.py index 2ba7f15..7a6f89f 100644 --- a/src/include_access_model/datamodel/__init__.py +++ b/src/common_access_model/datamodel/__init__.py @@ -1,7 +1,7 @@ from pathlib import Path -from .include_access_model import * +from .common_access_model import * THIS_PATH = Path(__file__).parent SCHEMA_DIRECTORY = THIS_PATH.parent / "schema" -MAIN_SCHEMA_PATH = SCHEMA_DIRECTORY / "include_access_model.yaml" +MAIN_SCHEMA_PATH = SCHEMA_DIRECTORY / "common_access_model.yaml" diff --git a/src/common_access_model/datamodel/include_access_model.py b/src/common_access_model/datamodel/include_access_model.py new file mode 100644 index 0000000..418af81 --- /dev/null +++ b/src/common_access_model/datamodel/include_access_model.py @@ -0,0 +1,2282 @@ +# Auto generated from common_access_model.yaml by pythongen.py version: 0.0.1 +# Generation date: 2026-05-08T15:56:12 +# Schema: common-access-model +# +# id: https://includedcc.org/common-access-model +# description: LinkML Schema for the Common Access Model +# license: MIT + +import dataclasses +import re +from dataclasses import dataclass +from datetime import ( + date, + datetime, + time +) +from typing import ( + Any, + ClassVar, + Dict, + List, + Optional, + Union +) + +from jsonasobj2 import ( + JsonObj, + as_dict +) +from linkml_runtime.linkml_model.meta import ( + EnumDefinition, + PermissibleValue, + PvFormulaOptions +) +from linkml_runtime.utils.curienamespace import CurieNamespace +from linkml_runtime.utils.enumerations import EnumDefinitionImpl +from linkml_runtime.utils.formatutils import ( + camelcase, + sfx, + underscore +) +from linkml_runtime.utils.metamodelcore import ( + bnode, + empty_dict, + empty_list +) +from linkml_runtime.utils.slot import Slot +from linkml_runtime.utils.yamlutils import ( + YAMLRoot, + extended_float, + extended_int, + extended_str +) +from rdflib import ( + Namespace, + URIRef +) + +from linkml_runtime.linkml_model.types import Float, Integer, String, Uri, Uriorcurie +from linkml_runtime.utils.metamodelcore import URI, URIorCURIE + +metamodel_version = "1.7.0" +version = None + +# Namespaces +DUO = CurieNamespace('DUO', 'http://purl.obolibrary.org/obo/DUO_') +HP = CurieNamespace('HP', 'http://purl.obolibrary.org/obo/HP_') +MONDO = CurieNamespace('MONDO', 'http://purl.obolibrary.org/obo/MONDO_') +NCIT = CurieNamespace('NCIT', 'http://purl.obolibrary.org/obo/NCIT_') +PATO = CurieNamespace('PATO', 'http://purl.obolibrary.org/obo/PATO_') +CAM = CurieNamespace('cam', 'https://includedcc.org/common-access-model/') +CDC_RACE_ETH = CurieNamespace('cdc_race_eth', 'urn:oid:2.16.840.1.113883.6.238/') +HL7_NULL = CurieNamespace('hl7_null', 'http://terminology.hl7.org/CodeSystem/v3-NullFlavor/') +IG2_BIOSPECIMEN_AVAILABILITY = CurieNamespace('ig2_biospecimen_availability', 'https://nih-ncpi.github.io/ncpi-fhir-ig-2/CodeSystem/biospecimen-availability/') +IG2DAC = CurieNamespace('ig2dac', 'https://nih-ncpi.github.io/ncpi-fhir-ig-2/CodeSystem/research-data-access-code/') +IG2DAT = CurieNamespace('ig2dat', 'https://nih-ncpi.github.io/ncpi-fhir-ig-2/CodeSystem/research-data-access-type/') +IG_DOB_METHOD = CurieNamespace('ig_dob_method', 'https://nih-ncpi.github.io/ncpi-fhir-ig-2/CodeSystem/research-data-date-of-birth-method/') +IGCONDTYPE = CurieNamespace('igcondtype', 'https://nih-ncpi.github.io/ncpi-fhir-ig-2/CodeSystem/condition-type/') +LINKML = CurieNamespace('linkml', 'https://w3id.org/linkml/') +MESH = CurieNamespace('mesh', 'http://id.nlm.nih.gov/mesh/') +SCHEMA = CurieNamespace('schema', 'http://schema.org/') +SNOMED_CT = CurieNamespace('snomed_ct', 'http://snomed.info/id/') +DEFAULT_ = CAM + + +# Types + +# Class references +class AccessPolicyAccessPolicyId(extended_str): + pass + + +class StudyStudyId(extended_str): + pass + + +class StudyMetadataStudyId(StudyStudyId): + pass + + +class VirtualBiorepositoryVbrId(extended_str): + pass + + +class DOIDoId(extended_str): + pass + + +class SubjectSubjectId(extended_str): + pass + + +class DemographicsSubjectId(SubjectSubjectId): + pass + + +class IncludeParticipantSubjectId(DemographicsSubjectId): + pass + + +class FamilyFamilyId(extended_str): + pass + + +class FamilyRelationshipFamilyRelationshipId(extended_str): + pass + + +class SubjectAssertionAssertionId(extended_str): + pass + + +class ConceptConceptCurie(URIorCURIE): + pass + + +class SampleSampleId(extended_str): + pass + + +class BiospecimenCollectionBiospecimenCollectionId(extended_str): + pass + + +class AliquotAliquotId(extended_str): + pass + + +class EncounterEncounterId(extended_str): + pass + + +class EncounterDefinitionEncounterDefinitionId(extended_str): + pass + + +class ActivityDefinitionActivityDefinitionId(extended_str): + pass + + +class FileFileId(extended_str): + pass + + +class DatasetDatasetId(extended_str): + pass + + +@dataclass(repr=False) +class Record(YAMLRoot): + """ + One row / entity within the database + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["Record"] + class_class_curie: ClassVar[str] = "cam:Record" + class_name: ClassVar[str] = "Record" + class_model_uri: ClassVar[URIRef] = CAM.Record + + external_id: Optional[Union[Union[str, URIorCURIE], list[Union[str, URIorCURIE]]]] = empty_list() + access_policy_id: Optional[Union[str, AccessPolicyAccessPolicyId]] = None + study_id: Optional[Union[str, StudyStudyId]] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if not isinstance(self.external_id, list): + self.external_id = [self.external_id] if self.external_id is not None else [] + self.external_id = [v if isinstance(v, URIorCURIE) else URIorCURIE(v) for v in self.external_id] + + if self.access_policy_id is not None and not isinstance(self.access_policy_id, AccessPolicyAccessPolicyId): + self.access_policy_id = AccessPolicyAccessPolicyId(self.access_policy_id) + + if self.study_id is not None and not isinstance(self.study_id, StudyStudyId): + self.study_id = StudyStudyId(self.study_id) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class AccessPolicy(YAMLRoot): + """ + The access policy that describes the controls around use of data + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["AccessPolicy"] + class_class_curie: ClassVar[str] = "cam:AccessPolicy" + class_name: ClassVar[str] = "AccessPolicy" + class_model_uri: ClassVar[URIRef] = CAM.AccessPolicy + + access_policy_id: Union[str, AccessPolicyAccessPolicyId] = None + data_use_permission: Union[str, "EnumDataUsePermission"] = None + data_use_accession: Optional[Union[str, URIorCURIE]] = None + data_use_modifier: Optional[Union[str, "EnumDataUseModifier"]] = None + disease_limitation: Optional[str] = None + access_description: Optional[str] = None + website: Optional[Union[str, URI]] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self._is_empty(self.access_policy_id): + self.MissingRequiredField("access_policy_id") + if not isinstance(self.access_policy_id, AccessPolicyAccessPolicyId): + self.access_policy_id = AccessPolicyAccessPolicyId(self.access_policy_id) + + if self.data_use_accession is not None and not isinstance(self.data_use_accession, URIorCURIE): + self.data_use_accession = URIorCURIE(self.data_use_accession) + + if self.disease_limitation is not None and not isinstance(self.disease_limitation, str): + self.disease_limitation = str(self.disease_limitation) + + if self.access_description is not None and not isinstance(self.access_description, str): + self.access_description = str(self.access_description) + + if self.website is not None and not isinstance(self.website, URI): + self.website = URI(self.website) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class Study(Record): + """ + Study Metadata + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["Study"] + class_class_curie: ClassVar[str] = "cam:Study" + class_name: ClassVar[str] = "Study" + class_model_uri: ClassVar[URIRef] = CAM.Study + + study_id: Union[str, StudyStudyId] = None + study_title: str = None + study_code: str = None + program: Union[Union[str, "EnumProgram"], list[Union[str, "EnumProgram"]]] = None + principal_investigator: Union[Union[dict, "Investigator"], list[Union[dict, "Investigator"]]] = None + contact: Union[Union[dict, "Investigator"], list[Union[dict, "Investigator"]]] = None + study_description: str = None + parent_study: Optional[Union[str, StudyStudyId]] = None + study_short_name: Optional[str] = None + funding_source: Optional[Union[str, list[str]]] = empty_list() + website: Optional[Union[str, URI]] = None + publication: Optional[Union[Union[dict, "Publication"], list[Union[dict, "Publication"]]]] = empty_list() + acknowledgments: Optional[str] = None + citation_statement: Optional[str] = None + do_id: Optional[Union[str, DOIDoId]] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self._is_empty(self.study_id): + self.MissingRequiredField("study_id") + if not isinstance(self.study_id, StudyStudyId): + self.study_id = StudyStudyId(self.study_id) + + if self._is_empty(self.study_title): + self.MissingRequiredField("study_title") + if not isinstance(self.study_title, str): + self.study_title = str(self.study_title) + + if self._is_empty(self.study_code): + self.MissingRequiredField("study_code") + if not isinstance(self.study_code, str): + self.study_code = str(self.study_code) + + if self._is_empty(self.program): + self.MissingRequiredField("program") + if not isinstance(self.program, list): + self.program = [self.program] if self.program is not None else [] + self.program = [v if isinstance(v, EnumProgram) else EnumProgram(v) for v in self.program] + + if self._is_empty(self.principal_investigator): + self.MissingRequiredField("principal_investigator") + if not isinstance(self.principal_investigator, list): + self.principal_investigator = [self.principal_investigator] if self.principal_investigator is not None else [] + self.principal_investigator = [v if isinstance(v, Investigator) else Investigator(**as_dict(v)) for v in self.principal_investigator] + + if self._is_empty(self.contact): + self.MissingRequiredField("contact") + if not isinstance(self.contact, list): + self.contact = [self.contact] if self.contact is not None else [] + self.contact = [v if isinstance(v, Investigator) else Investigator(**as_dict(v)) for v in self.contact] + + if self._is_empty(self.study_description): + self.MissingRequiredField("study_description") + if not isinstance(self.study_description, str): + self.study_description = str(self.study_description) + + if self.parent_study is not None and not isinstance(self.parent_study, StudyStudyId): + self.parent_study = StudyStudyId(self.parent_study) + + if self.study_short_name is not None and not isinstance(self.study_short_name, str): + self.study_short_name = str(self.study_short_name) + + if not isinstance(self.funding_source, list): + self.funding_source = [self.funding_source] if self.funding_source is not None else [] + self.funding_source = [v if isinstance(v, str) else str(v) for v in self.funding_source] + + if self.website is not None and not isinstance(self.website, URI): + self.website = URI(self.website) + + if not isinstance(self.publication, list): + self.publication = [self.publication] if self.publication is not None else [] + self.publication = [v if isinstance(v, Publication) else Publication(**as_dict(v)) for v in self.publication] + + if self.acknowledgments is not None and not isinstance(self.acknowledgments, str): + self.acknowledgments = str(self.acknowledgments) + + if self.citation_statement is not None and not isinstance(self.citation_statement, str): + self.citation_statement = str(self.citation_statement) + + if self.do_id is not None and not isinstance(self.do_id, DOIDoId): + self.do_id = DOIDoId(self.do_id) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class StudyMetadata(Record): + """ + Additional features about studies that may not apply to all studies + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["StudyMetadata"] + class_class_curie: ClassVar[str] = "cam:StudyMetadata" + class_name: ClassVar[str] = "StudyMetadata" + class_model_uri: ClassVar[URIRef] = CAM.StudyMetadata + + study_id: Union[str, StudyMetadataStudyId] = None + participant_lifespan_stage: Union[Union[str, "EnumParticipantLifespanStage"], list[Union[str, "EnumParticipantLifespanStage"]]] = None + study_design: Union[Union[str, "EnumStudyDesign"], list[Union[str, "EnumStudyDesign"]]] = None + clinical_data_source_type: Union[Union[str, "EnumClinicalDataSourceType"], list[Union[str, "EnumClinicalDataSourceType"]]] = None + data_category: Union[Union[str, "EnumDataCategory"], list[Union[str, "EnumDataCategory"]]] = None + research_domain: Union[Union[str, "EnumResearchDomain"], list[Union[str, "EnumResearchDomain"]]] = None + expected_number_of_participants: int = None + actual_number_of_participants: int = None + selection_criteria: Optional[str] = None + vbr_id: Optional[Union[str, VirtualBiorepositoryVbrId]] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self._is_empty(self.study_id): + self.MissingRequiredField("study_id") + if not isinstance(self.study_id, StudyMetadataStudyId): + self.study_id = StudyMetadataStudyId(self.study_id) + + if self._is_empty(self.participant_lifespan_stage): + self.MissingRequiredField("participant_lifespan_stage") + if not isinstance(self.participant_lifespan_stage, list): + self.participant_lifespan_stage = [self.participant_lifespan_stage] if self.participant_lifespan_stage is not None else [] + self.participant_lifespan_stage = [v if isinstance(v, EnumParticipantLifespanStage) else EnumParticipantLifespanStage(v) for v in self.participant_lifespan_stage] + + if self._is_empty(self.study_design): + self.MissingRequiredField("study_design") + if not isinstance(self.study_design, list): + self.study_design = [self.study_design] if self.study_design is not None else [] + self.study_design = [v if isinstance(v, EnumStudyDesign) else EnumStudyDesign(v) for v in self.study_design] + + if self._is_empty(self.clinical_data_source_type): + self.MissingRequiredField("clinical_data_source_type") + if not isinstance(self.clinical_data_source_type, list): + self.clinical_data_source_type = [self.clinical_data_source_type] if self.clinical_data_source_type is not None else [] + self.clinical_data_source_type = [v if isinstance(v, EnumClinicalDataSourceType) else EnumClinicalDataSourceType(v) for v in self.clinical_data_source_type] + + if self._is_empty(self.data_category): + self.MissingRequiredField("data_category") + if not isinstance(self.data_category, list): + self.data_category = [self.data_category] if self.data_category is not None else [] + self.data_category = [v if isinstance(v, EnumDataCategory) else EnumDataCategory(v) for v in self.data_category] + + if self._is_empty(self.research_domain): + self.MissingRequiredField("research_domain") + if not isinstance(self.research_domain, list): + self.research_domain = [self.research_domain] if self.research_domain is not None else [] + self.research_domain = [v if isinstance(v, EnumResearchDomain) else EnumResearchDomain(v) for v in self.research_domain] + + if self._is_empty(self.expected_number_of_participants): + self.MissingRequiredField("expected_number_of_participants") + if not isinstance(self.expected_number_of_participants, int): + self.expected_number_of_participants = int(self.expected_number_of_participants) + + if self._is_empty(self.actual_number_of_participants): + self.MissingRequiredField("actual_number_of_participants") + if not isinstance(self.actual_number_of_participants, int): + self.actual_number_of_participants = int(self.actual_number_of_participants) + + if self.selection_criteria is not None and not isinstance(self.selection_criteria, str): + self.selection_criteria = str(self.selection_criteria) + + if self.vbr_id is not None and not isinstance(self.vbr_id, VirtualBiorepositoryVbrId): + self.vbr_id = VirtualBiorepositoryVbrId(self.vbr_id) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class VirtualBiorepository(Record): + """ + An organization that can provide access to specimen for further analysis. + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["VirtualBiorepository"] + class_class_curie: ClassVar[str] = "cam:VirtualBiorepository" + class_name: ClassVar[str] = "VirtualBiorepository" + class_model_uri: ClassVar[URIRef] = CAM.VirtualBiorepository + + vbr_id: Union[str, VirtualBiorepositoryVbrId] = None + contact: Union[Union[dict, "Investigator"], list[Union[dict, "Investigator"]]] = None + name: Optional[str] = None + institution: Optional[str] = None + website: Optional[Union[str, URI]] = None + vbr_readme: Optional[str] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self._is_empty(self.vbr_id): + self.MissingRequiredField("vbr_id") + if not isinstance(self.vbr_id, VirtualBiorepositoryVbrId): + self.vbr_id = VirtualBiorepositoryVbrId(self.vbr_id) + + if self._is_empty(self.contact): + self.MissingRequiredField("contact") + if not isinstance(self.contact, list): + self.contact = [self.contact] if self.contact is not None else [] + self.contact = [v if isinstance(v, Investigator) else Investigator(**as_dict(v)) for v in self.contact] + + if self.name is not None and not isinstance(self.name, str): + self.name = str(self.name) + + if self.institution is not None and not isinstance(self.institution, str): + self.institution = str(self.institution) + + if self.website is not None and not isinstance(self.website, URI): + self.website = URI(self.website) + + if self.vbr_readme is not None and not isinstance(self.vbr_readme, str): + self.vbr_readme = str(self.vbr_readme) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class DOI(Record): + """ + A DOI is a permanent reference with metadata about a digital object. + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["DOI"] + class_class_curie: ClassVar[str] = "cam:DOI" + class_name: ClassVar[str] = "DOI" + class_model_uri: ClassVar[URIRef] = CAM.DOI + + do_id: Union[str, DOIDoId] = None + bibliographic_reference: Optional[str] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self._is_empty(self.do_id): + self.MissingRequiredField("do_id") + if not isinstance(self.do_id, DOIDoId): + self.do_id = DOIDoId(self.do_id) + + if self.bibliographic_reference is not None and not isinstance(self.bibliographic_reference, str): + self.bibliographic_reference = str(self.bibliographic_reference) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class Investigator(Record): + """ + An individual who made contributions to the collection, analysis, or sharing of data. + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["Investigator"] + class_class_curie: ClassVar[str] = "cam:Investigator" + class_name: ClassVar[str] = "Investigator" + class_model_uri: ClassVar[URIRef] = CAM.Investigator + + name: Optional[str] = None + institution: Optional[str] = None + investigator_title: Optional[str] = None + email: Optional[str] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self.name is not None and not isinstance(self.name, str): + self.name = str(self.name) + + if self.institution is not None and not isinstance(self.institution, str): + self.institution = str(self.institution) + + if self.investigator_title is not None and not isinstance(self.investigator_title, str): + self.investigator_title = str(self.investigator_title) + + if self.email is not None and not isinstance(self.email, str): + self.email = str(self.email) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class Publication(Record): + """ + Information about a specific publication. + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["Publication"] + class_class_curie: ClassVar[str] = "cam:Publication" + class_name: ClassVar[str] = "Publication" + class_model_uri: ClassVar[URIRef] = CAM.Publication + + bibliographic_reference: Optional[str] = None + website: Optional[Union[str, URI]] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self.bibliographic_reference is not None and not isinstance(self.bibliographic_reference, str): + self.bibliographic_reference = str(self.bibliographic_reference) + + if self.website is not None and not isinstance(self.website, URI): + self.website = URI(self.website) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class Subject(Record): + """ + This entity is the subject about which data or references are recorded. This includes the idea of a human + participant in a study, a cell line, an animal model, or any other similar entity. + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["Subject"] + class_class_curie: ClassVar[str] = "cam:Subject" + class_name: ClassVar[str] = "Subject" + class_model_uri: ClassVar[URIRef] = CAM.Subject + + subject_id: Union[str, SubjectSubjectId] = None + subject_type: Union[str, "EnumSubjectType"] = None + organism_type: Optional[Union[str, URIorCURIE]] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self._is_empty(self.subject_id): + self.MissingRequiredField("subject_id") + if not isinstance(self.subject_id, SubjectSubjectId): + self.subject_id = SubjectSubjectId(self.subject_id) + + if self._is_empty(self.subject_type): + self.MissingRequiredField("subject_type") + if not isinstance(self.subject_type, EnumSubjectType): + self.subject_type = EnumSubjectType(self.subject_type) + + if self.organism_type is not None and not isinstance(self.organism_type, URIorCURIE): + self.organism_type = URIorCURIE(self.organism_type) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class Demographics(Record): + """ + Basic participant demographics summary + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["Demographics"] + class_class_curie: ClassVar[str] = "cam:Demographics" + class_name: ClassVar[str] = "Demographics" + class_model_uri: ClassVar[URIRef] = CAM.Demographics + + subject_id: Union[str, DemographicsSubjectId] = None + sex: Union[str, "EnumSex"] = None + race: Union[Union[str, "EnumRace"], list[Union[str, "EnumRace"]]] = None + ethnicity: Union[str, "EnumEthnicity"] = None + age_at_last_vital_status: Optional[int] = None + vital_status: Optional[Union[str, "EnumVitalStatus"]] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self._is_empty(self.subject_id): + self.MissingRequiredField("subject_id") + if not isinstance(self.subject_id, DemographicsSubjectId): + self.subject_id = DemographicsSubjectId(self.subject_id) + + if self._is_empty(self.sex): + self.MissingRequiredField("sex") + if not isinstance(self.sex, EnumSex): + self.sex = EnumSex(self.sex) + + if self._is_empty(self.race): + self.MissingRequiredField("race") + if not isinstance(self.race, list): + self.race = [self.race] if self.race is not None else [] + self.race = [v if isinstance(v, EnumRace) else EnumRace(v) for v in self.race] + + if self._is_empty(self.ethnicity): + self.MissingRequiredField("ethnicity") + if not isinstance(self.ethnicity, EnumEthnicity): + self.ethnicity = EnumEthnicity(self.ethnicity) + + if self.age_at_last_vital_status is not None and not isinstance(self.age_at_last_vital_status, int): + self.age_at_last_vital_status = int(self.age_at_last_vital_status) + + if self.vital_status is not None and not isinstance(self.vital_status, EnumVitalStatus): + self.vital_status = EnumVitalStatus(self.vital_status) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class IncludeParticipant(Demographics): + """ + Information specific to INCLUDE participants + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["IncludeParticipant"] + class_class_curie: ClassVar[str] = "cam:IncludeParticipant" + class_name: ClassVar[str] = "IncludeParticipant" + class_model_uri: ClassVar[URIRef] = CAM.IncludeParticipant + + subject_id: Union[str, IncludeParticipantSubjectId] = None + sex: Union[str, "EnumSex"] = None + race: Union[Union[str, "EnumRace"], list[Union[str, "EnumRace"]]] = None + ethnicity: Union[str, "EnumEthnicity"] = None + down_syndrome_status: Union[str, "EnumDownSyndromeStatus"] = None + age_at_first_engagement: Optional[int] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self._is_empty(self.subject_id): + self.MissingRequiredField("subject_id") + if not isinstance(self.subject_id, IncludeParticipantSubjectId): + self.subject_id = IncludeParticipantSubjectId(self.subject_id) + + if self._is_empty(self.down_syndrome_status): + self.MissingRequiredField("down_syndrome_status") + if not isinstance(self.down_syndrome_status, EnumDownSyndromeStatus): + self.down_syndrome_status = EnumDownSyndromeStatus(self.down_syndrome_status) + + if self.age_at_first_engagement is not None and not isinstance(self.age_at_first_engagement, int): + self.age_at_first_engagement = int(self.age_at_first_engagement) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class Family(Record): + """ + A group of individuals of some relation who are grouped together in a study. + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["Family"] + class_class_curie: ClassVar[str] = "cam:Family" + class_name: ClassVar[str] = "Family" + class_model_uri: ClassVar[URIRef] = CAM.Family + + family_id: Union[str, FamilyFamilyId] = None + family_type: Optional[Union[str, "EnumFamilyType"]] = None + family_description: Optional[str] = None + consanguinity: Optional[Union[str, "EnumConsanguinityAssertion"]] = None + family_study_focus: Optional[Union[str, URIorCURIE]] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self._is_empty(self.family_id): + self.MissingRequiredField("family_id") + if not isinstance(self.family_id, FamilyFamilyId): + self.family_id = FamilyFamilyId(self.family_id) + + if self.family_type is not None and not isinstance(self.family_type, EnumFamilyType): + self.family_type = EnumFamilyType(self.family_type) + + if self.family_description is not None and not isinstance(self.family_description, str): + self.family_description = str(self.family_description) + + if self.consanguinity is not None and not isinstance(self.consanguinity, EnumConsanguinityAssertion): + self.consanguinity = EnumConsanguinityAssertion(self.consanguinity) + + if self.family_study_focus is not None and not isinstance(self.family_study_focus, URIorCURIE): + self.family_study_focus = URIorCURIE(self.family_study_focus) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class FamilyRelationship(Record): + """ + A relationship between two Subjects. Directed as follows + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["FamilyRelationship"] + class_class_curie: ClassVar[str] = "cam:FamilyRelationship" + class_name: ClassVar[str] = "FamilyRelationship" + class_model_uri: ClassVar[URIRef] = CAM.FamilyRelationship + + family_relationship_id: Union[str, FamilyRelationshipFamilyRelationshipId] = None + family_member_id: Union[str, SubjectSubjectId] = None + relationship: Union[str, URIorCURIE] = None + subject_id: Union[str, SubjectSubjectId] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self._is_empty(self.family_relationship_id): + self.MissingRequiredField("family_relationship_id") + if not isinstance(self.family_relationship_id, FamilyRelationshipFamilyRelationshipId): + self.family_relationship_id = FamilyRelationshipFamilyRelationshipId(self.family_relationship_id) + + if self._is_empty(self.family_member_id): + self.MissingRequiredField("family_member_id") + if not isinstance(self.family_member_id, SubjectSubjectId): + self.family_member_id = SubjectSubjectId(self.family_member_id) + + if self._is_empty(self.relationship): + self.MissingRequiredField("relationship") + if not isinstance(self.relationship, URIorCURIE): + self.relationship = URIorCURIE(self.relationship) + + if self._is_empty(self.subject_id): + self.MissingRequiredField("subject_id") + if not isinstance(self.subject_id, SubjectSubjectId): + self.subject_id = SubjectSubjectId(self.subject_id) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class FamilyMember(Record): + """ + Designates a Subject as a member of a family with a specified role. + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["FamilyMember"] + class_class_curie: ClassVar[str] = "cam:FamilyMember" + class_name: ClassVar[str] = "FamilyMember" + class_model_uri: ClassVar[URIRef] = CAM.FamilyMember + + family_id: Union[str, FamilyFamilyId] = None + subject_id: Union[str, SubjectSubjectId] = None + family_role: Optional[Union[str, URIorCURIE]] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self._is_empty(self.family_id): + self.MissingRequiredField("family_id") + if not isinstance(self.family_id, FamilyFamilyId): + self.family_id = FamilyFamilyId(self.family_id) + + if self._is_empty(self.subject_id): + self.MissingRequiredField("subject_id") + if not isinstance(self.subject_id, SubjectSubjectId): + self.subject_id = SubjectSubjectId(self.subject_id) + + if self.family_role is not None and not isinstance(self.family_role, URIorCURIE): + self.family_role = URIorCURIE(self.family_role) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class SubjectAssertion(Record): + """ + Assertion about a particular Subject. May include Conditions, Measurements, etc. + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["SubjectAssertion"] + class_class_curie: ClassVar[str] = "cam:SubjectAssertion" + class_name: ClassVar[str] = "SubjectAssertion" + class_model_uri: ClassVar[URIRef] = CAM.SubjectAssertion + + assertion_id: Union[str, SubjectAssertionAssertionId] = None + subject_id: Optional[Union[str, SubjectSubjectId]] = None + encounter_id: Optional[Union[str, EncounterEncounterId]] = None + assertion_provenance: Optional[Union[str, "EnumAssertionProvenance"]] = None + age_at_assertion: Optional[int] = None + age_at_event: Optional[int] = None + age_at_resolution: Optional[int] = None + concept: Optional[Union[Union[str, ConceptConceptCurie], list[Union[str, ConceptConceptCurie]]]] = empty_list() + concept_source: Optional[str] = None + value_concept: Optional[Union[Union[str, ConceptConceptCurie], list[Union[str, ConceptConceptCurie]]]] = empty_list() + value_number: Optional[float] = None + value_source: Optional[str] = None + value_unit: Optional[Union[str, ConceptConceptCurie]] = None + value_unit_source: Optional[str] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self._is_empty(self.assertion_id): + self.MissingRequiredField("assertion_id") + if not isinstance(self.assertion_id, SubjectAssertionAssertionId): + self.assertion_id = SubjectAssertionAssertionId(self.assertion_id) + + if self.subject_id is not None and not isinstance(self.subject_id, SubjectSubjectId): + self.subject_id = SubjectSubjectId(self.subject_id) + + if self.encounter_id is not None and not isinstance(self.encounter_id, EncounterEncounterId): + self.encounter_id = EncounterEncounterId(self.encounter_id) + + if self.assertion_provenance is not None and not isinstance(self.assertion_provenance, EnumAssertionProvenance): + self.assertion_provenance = EnumAssertionProvenance(self.assertion_provenance) + + if self.age_at_assertion is not None and not isinstance(self.age_at_assertion, int): + self.age_at_assertion = int(self.age_at_assertion) + + if self.age_at_event is not None and not isinstance(self.age_at_event, int): + self.age_at_event = int(self.age_at_event) + + if self.age_at_resolution is not None and not isinstance(self.age_at_resolution, int): + self.age_at_resolution = int(self.age_at_resolution) + + if not isinstance(self.concept, list): + self.concept = [self.concept] if self.concept is not None else [] + self.concept = [v if isinstance(v, ConceptConceptCurie) else ConceptConceptCurie(v) for v in self.concept] + + if self.concept_source is not None and not isinstance(self.concept_source, str): + self.concept_source = str(self.concept_source) + + if not isinstance(self.value_concept, list): + self.value_concept = [self.value_concept] if self.value_concept is not None else [] + self.value_concept = [v if isinstance(v, ConceptConceptCurie) else ConceptConceptCurie(v) for v in self.value_concept] + + if self.value_number is not None and not isinstance(self.value_number, float): + self.value_number = float(self.value_number) + + if self.value_source is not None and not isinstance(self.value_source, str): + self.value_source = str(self.value_source) + + if self.value_unit is not None and not isinstance(self.value_unit, ConceptConceptCurie): + self.value_unit = ConceptConceptCurie(self.value_unit) + + if self.value_unit_source is not None and not isinstance(self.value_unit_source, str): + self.value_unit_source = str(self.value_unit_source) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class Concept(YAMLRoot): + """ + A standardized concept with display information. + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["Concept"] + class_class_curie: ClassVar[str] = "cam:Concept" + class_name: ClassVar[str] = "Concept" + class_model_uri: ClassVar[URIRef] = CAM.Concept + + concept_curie: Union[str, ConceptConceptCurie] = None + display: Optional[str] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self._is_empty(self.concept_curie): + self.MissingRequiredField("concept_curie") + if not isinstance(self.concept_curie, ConceptConceptCurie): + self.concept_curie = ConceptConceptCurie(self.concept_curie) + + if self.display is not None and not isinstance(self.display, str): + self.display = str(self.display) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class Sample(Record): + """ + A functionally equivalent specimen taken from a participant or processed from such a sample. + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["Sample"] + class_class_curie: ClassVar[str] = "cam:Sample" + class_name: ClassVar[str] = "Sample" + class_model_uri: ClassVar[URIRef] = CAM.Sample + + sample_id: Union[str, SampleSampleId] = None + sample_type: Union[str, URIorCURIE] = None + biospecimen_collection_id: Optional[Union[str, BiospecimenCollectionBiospecimenCollectionId]] = None + parent_sample_id: Optional[Union[str, SampleSampleId]] = None + processing: Optional[Union[Union[str, URIorCURIE], list[Union[str, URIorCURIE]]]] = empty_list() + availablity_status: Optional[Union[str, "EnumAvailabilityStatus"]] = None + storage_method: Optional[Union[Union[str, URIorCURIE], list[Union[str, URIorCURIE]]]] = empty_list() + quantity_number: Optional[float] = None + quantity_unit: Optional[Union[str, ConceptConceptCurie]] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self._is_empty(self.sample_id): + self.MissingRequiredField("sample_id") + if not isinstance(self.sample_id, SampleSampleId): + self.sample_id = SampleSampleId(self.sample_id) + + if self._is_empty(self.sample_type): + self.MissingRequiredField("sample_type") + if not isinstance(self.sample_type, URIorCURIE): + self.sample_type = URIorCURIE(self.sample_type) + + if self.biospecimen_collection_id is not None and not isinstance(self.biospecimen_collection_id, BiospecimenCollectionBiospecimenCollectionId): + self.biospecimen_collection_id = BiospecimenCollectionBiospecimenCollectionId(self.biospecimen_collection_id) + + if self.parent_sample_id is not None and not isinstance(self.parent_sample_id, SampleSampleId): + self.parent_sample_id = SampleSampleId(self.parent_sample_id) + + if not isinstance(self.processing, list): + self.processing = [self.processing] if self.processing is not None else [] + self.processing = [v if isinstance(v, URIorCURIE) else URIorCURIE(v) for v in self.processing] + + if self.availablity_status is not None and not isinstance(self.availablity_status, EnumAvailabilityStatus): + self.availablity_status = EnumAvailabilityStatus(self.availablity_status) + + if not isinstance(self.storage_method, list): + self.storage_method = [self.storage_method] if self.storage_method is not None else [] + self.storage_method = [v if isinstance(v, URIorCURIE) else URIorCURIE(v) for v in self.storage_method] + + if self.quantity_number is not None and not isinstance(self.quantity_number, float): + self.quantity_number = float(self.quantity_number) + + if self.quantity_unit is not None and not isinstance(self.quantity_unit, ConceptConceptCurie): + self.quantity_unit = ConceptConceptCurie(self.quantity_unit) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class BiospecimenCollection(Record): + """ + A biospecimen collection event which yields one or more Samples. + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["BiospecimenCollection"] + class_class_curie: ClassVar[str] = "cam:BiospecimenCollection" + class_name: ClassVar[str] = "BiospecimenCollection" + class_model_uri: ClassVar[URIRef] = CAM.BiospecimenCollection + + biospecimen_collection_id: Union[str, BiospecimenCollectionBiospecimenCollectionId] = None + age_at_collection: Optional[float] = None + method: Optional[Union[str, "EnumSampleCollectionMethod"]] = None + site: Optional[Union[str, "EnumSite"]] = None + spatial_qualifier: Optional[Union[str, "EnumSpatialQualifiers"]] = None + laterality: Optional[Union[str, "EnumLaterality"]] = None + encounter_id: Optional[Union[str, EncounterEncounterId]] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self._is_empty(self.biospecimen_collection_id): + self.MissingRequiredField("biospecimen_collection_id") + if not isinstance(self.biospecimen_collection_id, BiospecimenCollectionBiospecimenCollectionId): + self.biospecimen_collection_id = BiospecimenCollectionBiospecimenCollectionId(self.biospecimen_collection_id) + + if self.age_at_collection is not None and not isinstance(self.age_at_collection, float): + self.age_at_collection = float(self.age_at_collection) + + if self.encounter_id is not None and not isinstance(self.encounter_id, EncounterEncounterId): + self.encounter_id = EncounterEncounterId(self.encounter_id) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class Aliquot(Record): + """ + A specific tube or amount of a biospecimen associated with a Sample. + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["Aliquot"] + class_class_curie: ClassVar[str] = "cam:Aliquot" + class_name: ClassVar[str] = "Aliquot" + class_model_uri: ClassVar[URIRef] = CAM.Aliquot + + aliquot_id: Union[str, AliquotAliquotId] = None + sample_id: Optional[Union[str, SampleSampleId]] = None + availablity_status: Optional[Union[str, "EnumAvailabilityStatus"]] = None + quantity_number: Optional[float] = None + quantity_unit: Optional[Union[str, ConceptConceptCurie]] = None + concentration_number: Optional[float] = None + concentration_unit: Optional[Union[str, ConceptConceptCurie]] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self._is_empty(self.aliquot_id): + self.MissingRequiredField("aliquot_id") + if not isinstance(self.aliquot_id, AliquotAliquotId): + self.aliquot_id = AliquotAliquotId(self.aliquot_id) + + if self.sample_id is not None and not isinstance(self.sample_id, SampleSampleId): + self.sample_id = SampleSampleId(self.sample_id) + + if self.availablity_status is not None and not isinstance(self.availablity_status, EnumAvailabilityStatus): + self.availablity_status = EnumAvailabilityStatus(self.availablity_status) + + if self.quantity_number is not None and not isinstance(self.quantity_number, float): + self.quantity_number = float(self.quantity_number) + + if self.quantity_unit is not None and not isinstance(self.quantity_unit, ConceptConceptCurie): + self.quantity_unit = ConceptConceptCurie(self.quantity_unit) + + if self.concentration_number is not None and not isinstance(self.concentration_number, float): + self.concentration_number = float(self.concentration_number) + + if self.concentration_unit is not None and not isinstance(self.concentration_unit, ConceptConceptCurie): + self.concentration_unit = ConceptConceptCurie(self.concentration_unit) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class Encounter(Record): + """ + An event at which data was collected about a participant, an intervention was made, or information about a + participant was recorded. + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["Encounter"] + class_class_curie: ClassVar[str] = "cam:Encounter" + class_name: ClassVar[str] = "Encounter" + class_model_uri: ClassVar[URIRef] = CAM.Encounter + + encounter_id: Union[str, EncounterEncounterId] = None + subject_id: Optional[Union[str, SubjectSubjectId]] = None + encounter_definition_id: Optional[Union[str, EncounterDefinitionEncounterDefinitionId]] = None + age_at_event: Optional[int] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self._is_empty(self.encounter_id): + self.MissingRequiredField("encounter_id") + if not isinstance(self.encounter_id, EncounterEncounterId): + self.encounter_id = EncounterEncounterId(self.encounter_id) + + if self.subject_id is not None and not isinstance(self.subject_id, SubjectSubjectId): + self.subject_id = SubjectSubjectId(self.subject_id) + + if self.encounter_definition_id is not None and not isinstance(self.encounter_definition_id, EncounterDefinitionEncounterDefinitionId): + self.encounter_definition_id = EncounterDefinitionEncounterDefinitionId(self.encounter_definition_id) + + if self.age_at_event is not None and not isinstance(self.age_at_event, int): + self.age_at_event = int(self.age_at_event) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class EncounterDefinition(Record): + """ + A definition of an encounter type in this study, ie, an event at which data was collected about a participant, an + intervention was made, or information about a participant was recorded. This may be something planned by a study + or a type of data collection. + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["EncounterDefinition"] + class_class_curie: ClassVar[str] = "cam:EncounterDefinition" + class_name: ClassVar[str] = "EncounterDefinition" + class_model_uri: ClassVar[URIRef] = CAM.EncounterDefinition + + encounter_definition_id: Union[str, EncounterDefinitionEncounterDefinitionId] = None + name: Optional[str] = None + description: Optional[str] = None + activity_definition_id: Optional[Union[Union[str, ActivityDefinitionActivityDefinitionId], list[Union[str, ActivityDefinitionActivityDefinitionId]]]] = empty_list() + + def __post_init__(self, *_: str, **kwargs: Any): + if self._is_empty(self.encounter_definition_id): + self.MissingRequiredField("encounter_definition_id") + if not isinstance(self.encounter_definition_id, EncounterDefinitionEncounterDefinitionId): + self.encounter_definition_id = EncounterDefinitionEncounterDefinitionId(self.encounter_definition_id) + + if self.name is not None and not isinstance(self.name, str): + self.name = str(self.name) + + if self.description is not None and not isinstance(self.description, str): + self.description = str(self.description) + + if not isinstance(self.activity_definition_id, list): + self.activity_definition_id = [self.activity_definition_id] if self.activity_definition_id is not None else [] + self.activity_definition_id = [v if isinstance(v, ActivityDefinitionActivityDefinitionId) else ActivityDefinitionActivityDefinitionId(v) for v in self.activity_definition_id] + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class ActivityDefinition(Record): + """ + A definition of an activity in this study, eg, a biospecimen collection, intervention, survey, or assessment. + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["ActivityDefinition"] + class_class_curie: ClassVar[str] = "cam:ActivityDefinition" + class_name: ClassVar[str] = "ActivityDefinition" + class_model_uri: ClassVar[URIRef] = CAM.ActivityDefinition + + activity_definition_id: Union[str, ActivityDefinitionActivityDefinitionId] = None + name: Optional[str] = None + description: Optional[str] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self._is_empty(self.activity_definition_id): + self.MissingRequiredField("activity_definition_id") + if not isinstance(self.activity_definition_id, ActivityDefinitionActivityDefinitionId): + self.activity_definition_id = ActivityDefinitionActivityDefinitionId(self.activity_definition_id) + + if self.name is not None and not isinstance(self.name, str): + self.name = str(self.name) + + if self.description is not None and not isinstance(self.description, str): + self.description = str(self.description) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class File(Record): + """ + File + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["File"] + class_class_curie: ClassVar[str] = "cam:File" + class_name: ClassVar[str] = "File" + class_model_uri: ClassVar[URIRef] = CAM.File + + file_id: Union[str, FileFileId] = None + subject_id: Optional[Union[Union[str, SubjectSubjectId], list[Union[str, SubjectSubjectId]]]] = empty_list() + sample_id: Optional[Union[Union[str, SampleSampleId], list[Union[str, SampleSampleId]]]] = empty_list() + filename: Optional[str] = None + format: Optional[Union[str, "EnumEDAMFormats"]] = None + data_category: Optional[Union[str, "EnumDataCategory"]] = None + data_type: Optional[Union[str, "EnumEDAMDataTypes"]] = None + size: Optional[int] = None + staging_url: Optional[Union[str, URIorCURIE]] = None + release_url: Optional[Union[str, URIorCURIE]] = None + drs_uri: Optional[Union[str, URIorCURIE]] = None + hash: Optional[Union[dict, "FileHash"]] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self._is_empty(self.file_id): + self.MissingRequiredField("file_id") + if not isinstance(self.file_id, FileFileId): + self.file_id = FileFileId(self.file_id) + + if not isinstance(self.subject_id, list): + self.subject_id = [self.subject_id] if self.subject_id is not None else [] + self.subject_id = [v if isinstance(v, SubjectSubjectId) else SubjectSubjectId(v) for v in self.subject_id] + + if not isinstance(self.sample_id, list): + self.sample_id = [self.sample_id] if self.sample_id is not None else [] + self.sample_id = [v if isinstance(v, SampleSampleId) else SampleSampleId(v) for v in self.sample_id] + + if self.filename is not None and not isinstance(self.filename, str): + self.filename = str(self.filename) + + if self.data_category is not None and not isinstance(self.data_category, EnumDataCategory): + self.data_category = EnumDataCategory(self.data_category) + + if self.size is not None and not isinstance(self.size, int): + self.size = int(self.size) + + if self.staging_url is not None and not isinstance(self.staging_url, URIorCURIE): + self.staging_url = URIorCURIE(self.staging_url) + + if self.release_url is not None and not isinstance(self.release_url, URIorCURIE): + self.release_url = URIorCURIE(self.release_url) + + if self.drs_uri is not None and not isinstance(self.drs_uri, URIorCURIE): + self.drs_uri = URIorCURIE(self.drs_uri) + + if self.hash is not None and not isinstance(self.hash, FileHash): + self.hash = FileHash(**as_dict(self.hash)) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class FileHash(YAMLRoot): + """ + Type and value of a file content hash. + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["FileHash"] + class_class_curie: ClassVar[str] = "cam:FileHash" + class_name: ClassVar[str] = "FileHash" + class_model_uri: ClassVar[URIRef] = CAM.FileHash + + hash_type: Optional[Union[str, "EnumFileHashType"]] = None + hash_value: Optional[str] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self.hash_type is not None and not isinstance(self.hash_type, EnumFileHashType): + self.hash_type = EnumFileHashType(self.hash_type) + + if self.hash_value is not None and not isinstance(self.hash_value, str): + self.hash_value = str(self.hash_value) + + super().__post_init__(**kwargs) + + +@dataclass(repr=False) +class Dataset(YAMLRoot): + """ + Set of files grouped together for release. + """ + _inherited_slots: ClassVar[list[str]] = [] + + class_class_uri: ClassVar[URIRef] = CAM["Dataset"] + class_class_curie: ClassVar[str] = "cam:Dataset" + class_name: ClassVar[str] = "Dataset" + class_model_uri: ClassVar[URIRef] = CAM.Dataset + + dataset_id: Union[str, DatasetDatasetId] = None + name: Optional[str] = None + description: Optional[str] = None + do_id: Optional[Union[str, DOIDoId]] = None + file_id: Optional[Union[Union[str, FileFileId], list[Union[str, FileFileId]]]] = empty_list() + publication: Optional[Union[Union[dict, Publication], list[Union[dict, Publication]]]] = empty_list() + data_collection_start: Optional[str] = None + data_collection_end: Optional[str] = None + + def __post_init__(self, *_: str, **kwargs: Any): + if self._is_empty(self.dataset_id): + self.MissingRequiredField("dataset_id") + if not isinstance(self.dataset_id, DatasetDatasetId): + self.dataset_id = DatasetDatasetId(self.dataset_id) + + if self.name is not None and not isinstance(self.name, str): + self.name = str(self.name) + + if self.description is not None and not isinstance(self.description, str): + self.description = str(self.description) + + if self.do_id is not None and not isinstance(self.do_id, DOIDoId): + self.do_id = DOIDoId(self.do_id) + + if not isinstance(self.file_id, list): + self.file_id = [self.file_id] if self.file_id is not None else [] + self.file_id = [v if isinstance(v, FileFileId) else FileFileId(v) for v in self.file_id] + + if not isinstance(self.publication, list): + self.publication = [self.publication] if self.publication is not None else [] + self.publication = [v if isinstance(v, Publication) else Publication(**as_dict(v)) for v in self.publication] + + if self.data_collection_start is not None and not isinstance(self.data_collection_start, str): + self.data_collection_start = str(self.data_collection_start) + + if self.data_collection_end is not None and not isinstance(self.data_collection_end, str): + self.data_collection_end = str(self.data_collection_end) + + super().__post_init__(**kwargs) + + +# Enumerations +class EnumDataUsePermission(EnumDefinitionImpl): + """ + Data Use Ontology (DUO) terms for data use permissions. + """ + _defn = EnumDefinition( + name="EnumDataUsePermission", + description="Data Use Ontology (DUO) terms for data use permissions.", + ) + +class EnumDataUseModifier(EnumDefinitionImpl): + """ + Data Use Ontology (DUO) terms for data use modifiers. + """ + _defn = EnumDefinition( + name="EnumDataUseModifier", + description="Data Use Ontology (DUO) terms for data use modifiers.", + ) + +class EnumProgram(EnumDefinitionImpl): + """ + Funding programs relevant to inform operations. + """ + include = PermissibleValue( + text="include", + title="INCLUDE") + kf = PermissibleValue( + text="kf", + title="KF") + other = PermissibleValue( + text="other", + title="Other") + + _defn = EnumDefinition( + name="EnumProgram", + description="Funding programs relevant to inform operations.", + ) + +class EnumResearchDomain(EnumDefinitionImpl): + """ + Domains of Research used to find studies. + """ + behavior_and_behavior_mechanisms = PermissibleValue( + text="behavior_and_behavior_mechanisms", + title="Behavior and Behavior Mechanisms", + meaning=MESH["D001520"]) + congenital_heart_defects = PermissibleValue( + text="congenital_heart_defects", + title="Congenital Heart Defects", + meaning=MESH["D006330"]) + immune_system_diseases = PermissibleValue( + text="immune_system_diseases", + title="Immune System Diseases", + meaning=MESH["D007154"]) + hematologic_diseases = PermissibleValue( + text="hematologic_diseases", + title="Hematologic Diseases", + meaning=MESH["D006402"]) + neurodevelopment = PermissibleValue( + text="neurodevelopment", + title="Neurodevelopment", + meaning=MESH["D065886"]) + sleep_wake_disorders = PermissibleValue( + text="sleep_wake_disorders", + title="Sleep Wake Disorders", + meaning=MESH["D012893"]) + all_co_occurring_conditions = PermissibleValue( + text="all_co_occurring_conditions", + title="All Co-occurring Conditions", + meaning=MESH["D013568"]) + physical_fitness = PermissibleValue( + text="physical_fitness", + title="Physical Fitness", + meaning=MESH["D010809"]) + other = PermissibleValue( + text="other", + title="Other") + + _defn = EnumDefinition( + name="EnumResearchDomain", + description="Domains of Research used to find studies.", + ) + +class EnumParticipantLifespanStage(EnumDefinitionImpl): + """ + Stages of life during which participants may be recruited. + """ + fetal = PermissibleValue( + text="fetal", + title="Fetal", + description="Before birth") + neonatal = PermissibleValue( + text="neonatal", + title="Neonatal", + description="0-28 days old") + pediatric = PermissibleValue( + text="pediatric", + title="Pediatric", + description="Birth-17 years old") + adult = PermissibleValue( + text="adult", + title="Adult", + description="18+ years old") + + _defn = EnumDefinition( + name="EnumParticipantLifespanStage", + description="Stages of life during which participants may be recruited.", + ) + +class EnumStudyDesign(EnumDefinitionImpl): + """ + Approaches for collecting data, investigating interventions, and/or analyzing data. + """ + case_control = PermissibleValue( + text="case_control", + title="Case-Control") + case_set = PermissibleValue( + text="case_set", + title="Case Set") + control_set = PermissibleValue( + text="control_set", + title="Control Set") + clinical_trial = PermissibleValue( + text="clinical_trial", + title="Clinical Trial") + cross_sectional = PermissibleValue( + text="cross_sectional", + title="Cross-Sectional") + family_twins_trios = PermissibleValue( + text="family_twins_trios", + title="Family/Twins/Trios") + interventional = PermissibleValue( + text="interventional", + title="Interventional") + longitudinal = PermissibleValue( + text="longitudinal", + title="Longitudinal") + trial_readiness_study = PermissibleValue( + text="trial_readiness_study", + title="Trial Readiness Study") + tumor_vs_matched_normal = PermissibleValue( + text="tumor_vs_matched_normal", + title="Tumor vs Matched Normal") + + _defn = EnumDefinition( + name="EnumStudyDesign", + description="Approaches for collecting data, investigating interventions, and/or analyzing data.", + ) + +class EnumClinicalDataSourceType(EnumDefinitionImpl): + """ + Approaches to ascertain clinical information about a participant. + """ + medical_record = PermissibleValue( + text="medical_record", + title="Medical Record", + description="Data obtained directly from medical record") + investigator_assessment = PermissibleValue( + text="investigator_assessment", + title="Investigator Assessment", + description="Data obtained by examination, interview, etc. with investigator") + participant_or_caregiver_report = PermissibleValue( + text="participant_or_caregiver_report", + title="Participant or Caregiver Report", + description="Data obtained from survey, questionnaire, etc. filled out by participant or caregiver") + other = PermissibleValue( + text="other", + title="Other", + description="Data obtained from other source, such as tissue bank") + unknown = PermissibleValue( + text="unknown", + title="Unknown") + + _defn = EnumDefinition( + name="EnumClinicalDataSourceType", + description="Approaches to ascertain clinical information about a participant.", + ) + +class EnumDataCategory(EnumDefinitionImpl): + """ + Categories of data which may be collected about participants. + """ + unharmonized_demographic_clinical_data = PermissibleValue( + text="unharmonized_demographic_clinical_data", + title="Unharmonized Demographic/Clinical Data") + harmonized_demographic_clinical_data = PermissibleValue( + text="harmonized_demographic_clinical_data", + title="Harmonized Demographic/Clinical Data") + genomics = PermissibleValue( + text="genomics", + title="Genomics") + transcriptomics = PermissibleValue( + text="transcriptomics", + title="Transcriptomics") + epigenomics = PermissibleValue( + text="epigenomics", + title="Epigenomics") + proteomics = PermissibleValue( + text="proteomics", + title="Proteomics") + metabolomics = PermissibleValue( + text="metabolomics", + title="Metabolomics") + cognitive_behavioral = PermissibleValue( + text="cognitive_behavioral", + title="Cognitive/Behavioral") + immune_profiling = PermissibleValue( + text="immune_profiling", + title="Immune Profiling") + imaging = PermissibleValue( + text="imaging", + title="Imaging") + microbiome = PermissibleValue( + text="microbiome", + title="Microbiome") + fitness = PermissibleValue( + text="fitness", + title="Fitness") + physical_activity = PermissibleValue( + text="physical_activity", + title="Physical Activity") + other = PermissibleValue( + text="other", + title="Other") + sleep_study = PermissibleValue( + text="sleep_study", + title="Sleep Study") + + _defn = EnumDefinition( + name="EnumDataCategory", + description="Categories of data which may be collected about participants.", + ) + +class EnumSubjectType(EnumDefinitionImpl): + """ + Types of Subject entities + """ + participant = PermissibleValue( + text="participant", + description="Study participant with consent, assent, or waiver of consent.") + non_participant = PermissibleValue( + text="non_participant", + description="""An individual associated with a study who was not explictly consented, eg, the subject of a reported family history.""") + cell_line = PermissibleValue( + text="cell_line", + description="Cell Line") + animal_model = PermissibleValue( + text="animal_model", + description="Animal model") + group = PermissibleValue( + text="group", + description="A group of individuals or entities.") + other = PermissibleValue( + text="other", + description="A different entity type- ideally this will be resolved!") + + _defn = EnumDefinition( + name="EnumSubjectType", + description="Types of Subject entities", + ) + +class EnumDownSyndromeStatus(EnumDefinitionImpl): + """ + Down syndrome / chromosome 21 status + """ + d21 = PermissibleValue( + text="d21", + title="D21", + description="Disomy 21 (euploid)", + meaning=PATO["0001393"]) + t21 = PermissibleValue( + text="t21", + title="T21", + description="Trisomy 21 (Down syndrome)", + meaning=MONDO["0008608"]) + + _defn = EnumDefinition( + name="EnumDownSyndromeStatus", + description="Down syndrome / chromosome 21 status", + ) + +class EnumSex(EnumDefinitionImpl): + """ + Subject Sex + """ + female = PermissibleValue( + text="female", + title="Female", + meaning=NCIT["C16576"]) + male = PermissibleValue( + text="male", + title="Male", + meaning=NCIT["C20197"]) + other = PermissibleValue( + text="other", + title="Other", + meaning=NCIT["C17649"]) + unknown = PermissibleValue( + text="unknown", + title="Unknown", + meaning=NCIT["C17998"]) + + _defn = EnumDefinition( + name="EnumSex", + description="Subject Sex", + ) + +class EnumRace(EnumDefinitionImpl): + """ + Participant Race + """ + american_indian_or_alaska_native = PermissibleValue( + text="american_indian_or_alaska_native", + title="American Indian or Alaska Native", + meaning=NCIT["C41259"]) + asian = PermissibleValue( + text="asian", + title="Asian", + meaning=NCIT["C41260"]) + black_or_african_american = PermissibleValue( + text="black_or_african_american", + title="Black or African American", + meaning=NCIT["C16352"]) + more_than_one_race = PermissibleValue( + text="more_than_one_race", + title="More than one race", + meaning=NCIT["C67109"]) + native_hawaiian_or_other_pacific_islander = PermissibleValue( + text="native_hawaiian_or_other_pacific_islander", + title="Native Hawaiian or Other Pacific Islander", + meaning=NCIT["C41219"]) + other = PermissibleValue( + text="other", + title="Other", + meaning=NCIT["C17649"]) + white = PermissibleValue( + text="white", + title="White", + meaning=NCIT["C41261"]) + prefer_not_to_answer = PermissibleValue( + text="prefer_not_to_answer", + title="Prefer not to answer", + meaning=NCIT["C132222"]) + unknown = PermissibleValue( + text="unknown", + title="Unknown", + meaning=NCIT["C17998"]) + east_asian = PermissibleValue( + text="east_asian", + title="East Asian", + description="UK only; do not use for US data", + meaning=NCIT["C161419"]) + latin_american = PermissibleValue( + text="latin_american", + title="Latin American", + description="UK only; do not use for US data", + meaning=NCIT["C126531"]) + middle_eastern_or_north_african = PermissibleValue( + text="middle_eastern_or_north_african", + title="Middle Eastern or North African", + description="UK only; do not use for US data", + meaning=NCIT["C43866"]) + south_asian = PermissibleValue( + text="south_asian", + title="South Asian", + description="UK only; do not use for US data", + meaning=NCIT["C41263"]) + + _defn = EnumDefinition( + name="EnumRace", + description="Participant Race", + ) + +class EnumEthnicity(EnumDefinitionImpl): + """ + Participant ethnicity, specific to Hispanic or Latino. + """ + hispanic_or_latino = PermissibleValue( + text="hispanic_or_latino", + title="Hispanic or Latino", + meaning=NCIT["C17459"]) + not_hispanic_or_latino = PermissibleValue( + text="not_hispanic_or_latino", + title="Not Hispanic or Latino", + meaning=NCIT["C41222"]) + prefer_not_to_answer = PermissibleValue( + text="prefer_not_to_answer", + title="Prefer not to answer", + meaning=NCIT["C132222"]) + unknown = PermissibleValue( + text="unknown", + title="Unknown", + meaning=NCIT["C17998"]) + + _defn = EnumDefinition( + name="EnumEthnicity", + description="Participant ethnicity, specific to Hispanic or Latino.", + ) + +class EnumVitalStatus(EnumDefinitionImpl): + """ + Descriptions of a Subject's vital status + """ + dead = PermissibleValue( + text="dead", + title="Dead", + meaning=NCIT["C28554"]) + alive = PermissibleValue( + text="alive", + title="Alive", + meaning=NCIT["C37987"]) + + _defn = EnumDefinition( + name="EnumVitalStatus", + description="Descriptions of a Subject's vital status", + ) + +class EnumNull(EnumDefinitionImpl): + """ + Base enumeration providing null options. + """ + unknown = PermissibleValue( + text="unknown", + title="Unknown", + meaning=NCIT["C17998"]) + + _defn = EnumDefinition( + name="EnumNull", + description="Base enumeration providing null options.", + ) + +class EnumFamilyType(EnumDefinitionImpl): + """ + Enumerations describing research family type + """ + control_only = PermissibleValue( + text="control_only", + title="Control-only", + description="Control Only") + duo = PermissibleValue( + text="duo", + title="Duo", + description="Duo") + proband_only = PermissibleValue( + text="proband_only", + title="Proband-only", + description="Proband Only") + trio = PermissibleValue( + text="trio", + title="Trio", + description="Trio (2 parents and affected child)") + trio_plus = PermissibleValue( + text="trio_plus", + title="Trio+", + description="2 Parents and 2 or more children") + + _defn = EnumDefinition( + name="EnumFamilyType", + description="Enumerations describing research family type", + ) + +class EnumConsanguinityAssertion(EnumDefinitionImpl): + """ + Asserts known or suspected consanguinity in this study family + """ + not_suspected = PermissibleValue( + text="not_suspected", + title="not-suspected", + description="Not suspected", + meaning=SNOMED_CT["428263003"]) + suspected = PermissibleValue( + text="suspected", + title="suspected", + description="Suspected", + meaning=SNOMED_CT["415684004"]) + known_present = PermissibleValue( + text="known_present", + title="known-present", + description="Known Present", + meaning=SNOMED_CT["410515003"]) + unknown = PermissibleValue( + text="unknown", + title="unknown", + description="Unknown", + meaning=SNOMED_CT["261665006"]) + + _defn = EnumDefinition( + name="EnumConsanguinityAssertion", + description="Asserts known or suspected consanguinity in this study family", + ) + +class EnumAssertionProvenance(EnumDefinitionImpl): + """ + Possible data sources for assertions. + """ + medical_record = PermissibleValue( + text="medical_record", + title="Medical Record", + description="Data obtained from a medical record") + investigator_assessment = PermissibleValue( + text="investigator_assessment", + title="Investigator Assessment", + description="Data obtained by examination, interview, etc. with investigator") + participant_or_caregiver_report = PermissibleValue( + text="participant_or_caregiver_report", + title="Participant or Caregiver Report", + description="Data obtained from survey, questionnaire, etc. filled out by participant or caregiver") + other = PermissibleValue( + text="other", + title="Other", + description="Data obtained from other source, such as tissue bank") + + _defn = EnumDefinition( + name="EnumAssertionProvenance", + description="Possible data sources for assertions.", + ) + +class EnumAvailabilityStatus(EnumDefinitionImpl): + """ + Is the biospecimen available for use? + """ + available = PermissibleValue( + text="available", + title="Available", + description="Biospecimen is Available", + meaning=IG2_BIOSPECIMEN_AVAILABILITY["available"]) + unavailable = PermissibleValue( + text="unavailable", + title="Unavailable", + description="Biospecimen is Unavailable", + meaning=IG2_BIOSPECIMEN_AVAILABILITY["unavailable"]) + + _defn = EnumDefinition( + name="EnumAvailabilityStatus", + description="Is the biospecimen available for use?", + ) + +class EnumSampleCollectionMethod(EnumDefinitionImpl): + """ + The approach used to collect the biospecimen. [LOINC](https://loinc.org) is recommended. + """ + _defn = EnumDefinition( + name="EnumSampleCollectionMethod", + description="The approach used to collect the biospecimen. [LOINC](https://loinc.org) is recommended.", + ) + +class EnumSite(EnumDefinitionImpl): + """ + The location of the specimen collection. [SNOMED Body Site](https://hl7.org/fhir/R4B/valueset-body-site.html) is + recommended. + """ + _defn = EnumDefinition( + name="EnumSite", + description="""The location of the specimen collection. [SNOMED Body Site](https://hl7.org/fhir/R4B/valueset-body-site.html) is recommended.""", + ) + +class EnumSpatialQualifiers(EnumDefinitionImpl): + """ + Any spatial/location qualifiers. + """ + _defn = EnumDefinition( + name="EnumSpatialQualifiers", + description="Any spatial/location qualifiers.", + ) + +class EnumLaterality(EnumDefinitionImpl): + """ + Laterality information for the site + """ + _defn = EnumDefinition( + name="EnumLaterality", + description="Laterality information for the site", + ) + +class EnumEDAMFormats(EnumDefinitionImpl): + """ + Data formats from the EDAM ontology. + """ + _defn = EnumDefinition( + name="EnumEDAMFormats", + description="Data formats from the EDAM ontology.", + ) + +class EnumEDAMDataTypes(EnumDefinitionImpl): + """ + Data types from the EDAM ontology. + """ + _defn = EnumDefinition( + name="EnumEDAMDataTypes", + description="Data types from the EDAM ontology.", + ) + +class EnumFileHashType(EnumDefinitionImpl): + """ + Types of file hashes supported. + """ + md5 = PermissibleValue( + text="md5", + title="MD5") + etag = PermissibleValue( + text="etag", + title="ETag") + sha1 = PermissibleValue( + text="sha1", + title="SHA-1") + + _defn = EnumDefinition( + name="EnumFileHashType", + description="Types of file hashes supported.", + ) + +# Slots +class slots: + pass + +slots.study_id = Slot(uri=CAM.study_id, name="study_id", curie=CAM.curie('study_id'), + model_uri=CAM.study_id, domain=None, range=Optional[Union[str, StudyStudyId]]) + +slots.access_policy_id = Slot(uri=CAM.access_policy_id, name="access_policy_id", curie=CAM.curie('access_policy_id'), + model_uri=CAM.access_policy_id, domain=None, range=Optional[Union[str, AccessPolicyAccessPolicyId]]) + +slots.data_use_accession = Slot(uri=CAM.data_use_accession, name="data_use_accession", curie=CAM.curie('data_use_accession'), + model_uri=CAM.data_use_accession, domain=None, range=Optional[Union[str, URIorCURIE]]) + +slots.data_use_permission = Slot(uri=CAM.data_use_permission, name="data_use_permission", curie=CAM.curie('data_use_permission'), + model_uri=CAM.data_use_permission, domain=None, range=Union[str, "EnumDataUsePermission"]) + +slots.data_use_modifier = Slot(uri=CAM.data_use_modifier, name="data_use_modifier", curie=CAM.curie('data_use_modifier'), + model_uri=CAM.data_use_modifier, domain=None, range=Optional[Union[str, "EnumDataUseModifier"]]) + +slots.disease_limitation = Slot(uri=CAM.disease_limitation, name="disease_limitation", curie=CAM.curie('disease_limitation'), + model_uri=CAM.disease_limitation, domain=None, range=Optional[str]) + +slots.access_description = Slot(uri=CAM.access_description, name="access_description", curie=CAM.curie('access_description'), + model_uri=CAM.access_description, domain=None, range=Optional[str]) + +slots.do_id = Slot(uri=CAM.do_id, name="do_id", curie=CAM.curie('do_id'), + model_uri=CAM.do_id, domain=None, range=Optional[Union[str, DOIDoId]]) + +slots.subject_id = Slot(uri=CAM.subject_id, name="subject_id", curie=CAM.curie('subject_id'), + model_uri=CAM.subject_id, domain=None, range=Optional[Union[str, SubjectSubjectId]]) + +slots.assertion_id = Slot(uri=CAM.assertion_id, name="assertion_id", curie=CAM.curie('assertion_id'), + model_uri=CAM.assertion_id, domain=None, range=Optional[Union[str, SubjectAssertionAssertionId]]) + +slots.external_id = Slot(uri=CAM.external_id, name="external_id", curie=CAM.curie('external_id'), + model_uri=CAM.external_id, domain=None, range=Optional[Union[Union[str, URIorCURIE], list[Union[str, URIorCURIE]]]]) + +slots.parent_study = Slot(uri=CAM.parent_study, name="parent_study", curie=CAM.curie('parent_study'), + model_uri=CAM.parent_study, domain=None, range=Optional[Union[str, StudyStudyId]]) + +slots.funding_source = Slot(uri=CAM.funding_source, name="funding_source", curie=CAM.curie('funding_source'), + model_uri=CAM.funding_source, domain=None, range=Optional[Union[str, list[str]]]) + +slots.principal_investigator = Slot(uri=CAM.principal_investigator, name="principal_investigator", curie=CAM.curie('principal_investigator'), + model_uri=CAM.principal_investigator, domain=None, range=Union[Union[dict, Investigator], list[Union[dict, Investigator]]]) + +slots.study_title = Slot(uri=CAM.study_title, name="study_title", curie=CAM.curie('study_title'), + model_uri=CAM.study_title, domain=None, range=str) + +slots.study_code = Slot(uri=CAM.study_code, name="study_code", curie=CAM.curie('study_code'), + model_uri=CAM.study_code, domain=None, range=str) + +slots.study_short_name = Slot(uri=CAM.study_short_name, name="study_short_name", curie=CAM.curie('study_short_name'), + model_uri=CAM.study_short_name, domain=None, range=Optional[str]) + +slots.investigator_title = Slot(uri=CAM.investigator_title, name="investigator_title", curie=CAM.curie('investigator_title'), + model_uri=CAM.investigator_title, domain=None, range=Optional[str]) + +slots.name = Slot(uri=CAM.name, name="name", curie=CAM.curie('name'), + model_uri=CAM.name, domain=None, range=Optional[str]) + +slots.email = Slot(uri=CAM.email, name="email", curie=CAM.curie('email'), + model_uri=CAM.email, domain=None, range=Optional[str]) + +slots.institution = Slot(uri=CAM.institution, name="institution", curie=CAM.curie('institution'), + model_uri=CAM.institution, domain=None, range=Optional[str]) + +slots.program = Slot(uri=CAM.program, name="program", curie=CAM.curie('program'), + model_uri=CAM.program, domain=None, range=Union[Union[str, "EnumProgram"], list[Union[str, "EnumProgram"]]]) + +slots.study_description = Slot(uri=CAM.study_description, name="study_description", curie=CAM.curie('study_description'), + model_uri=CAM.study_description, domain=None, range=str) + +slots.website = Slot(uri=CAM.website, name="website", curie=CAM.curie('website'), + model_uri=CAM.website, domain=None, range=Optional[Union[str, URI]]) + +slots.contact = Slot(uri=CAM.contact, name="contact", curie=CAM.curie('contact'), + model_uri=CAM.contact, domain=None, range=Union[Union[dict, Investigator], list[Union[dict, Investigator]]]) + +slots.vbr_id = Slot(uri=CAM.vbr_id, name="vbr_id", curie=CAM.curie('vbr_id'), + model_uri=CAM.vbr_id, domain=None, range=Optional[Union[str, VirtualBiorepositoryVbrId]]) + +slots.vbr_readme = Slot(uri=CAM.vbr_readme, name="vbr_readme", curie=CAM.curie('vbr_readme'), + model_uri=CAM.vbr_readme, domain=None, range=Optional[str]) + +slots.research_domain = Slot(uri=CAM.research_domain, name="research_domain", curie=CAM.curie('research_domain'), + model_uri=CAM.research_domain, domain=None, range=Union[Union[str, "EnumResearchDomain"], list[Union[str, "EnumResearchDomain"]]]) + +slots.participant_lifespan_stage = Slot(uri=CAM.participant_lifespan_stage, name="participant_lifespan_stage", curie=CAM.curie('participant_lifespan_stage'), + model_uri=CAM.participant_lifespan_stage, domain=None, range=Union[Union[str, "EnumParticipantLifespanStage"], list[Union[str, "EnumParticipantLifespanStage"]]]) + +slots.selection_criteria = Slot(uri=CAM.selection_criteria, name="selection_criteria", curie=CAM.curie('selection_criteria'), + model_uri=CAM.selection_criteria, domain=None, range=Optional[str]) + +slots.study_design = Slot(uri=CAM.study_design, name="study_design", curie=CAM.curie('study_design'), + model_uri=CAM.study_design, domain=None, range=Union[Union[str, "EnumStudyDesign"], list[Union[str, "EnumStudyDesign"]]]) + +slots.data_category = Slot(uri=CAM.data_category, name="data_category", curie=CAM.curie('data_category'), + model_uri=CAM.data_category, domain=None, range=Optional[Union[str, "EnumDataCategory"]]) + +slots.clinical_data_source_type = Slot(uri=CAM.clinical_data_source_type, name="clinical_data_source_type", curie=CAM.curie('clinical_data_source_type'), + model_uri=CAM.clinical_data_source_type, domain=None, range=Union[Union[str, "EnumClinicalDataSourceType"], list[Union[str, "EnumClinicalDataSourceType"]]]) + +slots.publication = Slot(uri=CAM.publication, name="publication", curie=CAM.curie('publication'), + model_uri=CAM.publication, domain=None, range=Optional[Union[Union[dict, Publication], list[Union[dict, Publication]]]]) + +slots.expected_number_of_participants = Slot(uri=CAM.expected_number_of_participants, name="expected_number_of_participants", curie=CAM.curie('expected_number_of_participants'), + model_uri=CAM.expected_number_of_participants, domain=None, range=int) + +slots.actual_number_of_participants = Slot(uri=CAM.actual_number_of_participants, name="actual_number_of_participants", curie=CAM.curie('actual_number_of_participants'), + model_uri=CAM.actual_number_of_participants, domain=None, range=int) + +slots.acknowledgments = Slot(uri=CAM.acknowledgments, name="acknowledgments", curie=CAM.curie('acknowledgments'), + model_uri=CAM.acknowledgments, domain=None, range=Optional[str]) + +slots.citation_statement = Slot(uri=CAM.citation_statement, name="citation_statement", curie=CAM.curie('citation_statement'), + model_uri=CAM.citation_statement, domain=None, range=Optional[str]) + +slots.bibliographic_reference = Slot(uri=CAM.bibliographic_reference, name="bibliographic_reference", curie=CAM.curie('bibliographic_reference'), + model_uri=CAM.bibliographic_reference, domain=None, range=Optional[str]) + +slots.organism_type = Slot(uri=CAM.organism_type, name="organism_type", curie=CAM.curie('organism_type'), + model_uri=CAM.organism_type, domain=None, range=Optional[Union[str, URIorCURIE]]) + +slots.subject_type = Slot(uri=CAM.subject_type, name="subject_type", curie=CAM.curie('subject_type'), + model_uri=CAM.subject_type, domain=None, range=Union[str, "EnumSubjectType"]) + +slots.sex = Slot(uri=CAM.sex, name="sex", curie=CAM.curie('sex'), + model_uri=CAM.sex, domain=None, range=Union[str, "EnumSex"]) + +slots.race = Slot(uri=CAM.race, name="race", curie=CAM.curie('race'), + model_uri=CAM.race, domain=None, range=Union[Union[str, "EnumRace"], list[Union[str, "EnumRace"]]]) + +slots.ethnicity = Slot(uri=CAM.ethnicity, name="ethnicity", curie=CAM.curie('ethnicity'), + model_uri=CAM.ethnicity, domain=None, range=Union[str, "EnumEthnicity"]) + +slots.down_syndrome_status = Slot(uri=CAM.down_syndrome_status, name="down_syndrome_status", curie=CAM.curie('down_syndrome_status'), + model_uri=CAM.down_syndrome_status, domain=None, range=Union[str, "EnumDownSyndromeStatus"]) + +slots.age_at_first_engagement = Slot(uri=CAM.age_at_first_engagement, name="age_at_first_engagement", curie=CAM.curie('age_at_first_engagement'), + model_uri=CAM.age_at_first_engagement, domain=None, range=Optional[int]) + +slots.vital_status = Slot(uri=CAM.vital_status, name="vital_status", curie=CAM.curie('vital_status'), + model_uri=CAM.vital_status, domain=None, range=Optional[Union[str, "EnumVitalStatus"]]) + +slots.age_at_last_vital_status = Slot(uri=CAM.age_at_last_vital_status, name="age_at_last_vital_status", curie=CAM.curie('age_at_last_vital_status'), + model_uri=CAM.age_at_last_vital_status, domain=None, range=Optional[int]) + +slots.family_id = Slot(uri=CAM.family_id, name="family_id", curie=CAM.curie('family_id'), + model_uri=CAM.family_id, domain=None, range=Optional[Union[str, FamilyFamilyId]]) + +slots.family_type = Slot(uri=CAM.family_type, name="family_type", curie=CAM.curie('family_type'), + model_uri=CAM.family_type, domain=None, range=Optional[Union[str, "EnumFamilyType"]]) + +slots.family_description = Slot(uri=CAM.family_description, name="family_description", curie=CAM.curie('family_description'), + model_uri=CAM.family_description, domain=None, range=Optional[str]) + +slots.consanguinity = Slot(uri=CAM.consanguinity, name="consanguinity", curie=CAM.curie('consanguinity'), + model_uri=CAM.consanguinity, domain=None, range=Optional[Union[str, "EnumConsanguinityAssertion"]]) + +slots.family_study_focus = Slot(uri=CAM.family_study_focus, name="family_study_focus", curie=CAM.curie('family_study_focus'), + model_uri=CAM.family_study_focus, domain=None, range=Optional[Union[str, URIorCURIE]]) + +slots.family_relationship_id = Slot(uri=CAM.family_relationship_id, name="family_relationship_id", curie=CAM.curie('family_relationship_id'), + model_uri=CAM.family_relationship_id, domain=None, range=Optional[Union[str, FamilyRelationshipFamilyRelationshipId]]) + +slots.family_member_id = Slot(uri=CAM.family_member_id, name="family_member_id", curie=CAM.curie('family_member_id'), + model_uri=CAM.family_member_id, domain=None, range=Union[str, SubjectSubjectId]) + +slots.relationship = Slot(uri=CAM.relationship, name="relationship", curie=CAM.curie('relationship'), + model_uri=CAM.relationship, domain=None, range=Union[str, URIorCURIE]) + +slots.family_role = Slot(uri=CAM.family_role, name="family_role", curie=CAM.curie('family_role'), + model_uri=CAM.family_role, domain=None, range=Optional[Union[str, URIorCURIE]]) + +slots.assertion_provenance = Slot(uri=CAM.assertion_provenance, name="assertion_provenance", curie=CAM.curie('assertion_provenance'), + model_uri=CAM.assertion_provenance, domain=None, range=Optional[Union[str, "EnumAssertionProvenance"]]) + +slots.age_at_assertion = Slot(uri=CAM.age_at_assertion, name="age_at_assertion", curie=CAM.curie('age_at_assertion'), + model_uri=CAM.age_at_assertion, domain=None, range=Optional[int]) + +slots.age_at_event = Slot(uri=CAM.age_at_event, name="age_at_event", curie=CAM.curie('age_at_event'), + model_uri=CAM.age_at_event, domain=None, range=Optional[int]) + +slots.age_at_resolution = Slot(uri=CAM.age_at_resolution, name="age_at_resolution", curie=CAM.curie('age_at_resolution'), + model_uri=CAM.age_at_resolution, domain=None, range=Optional[int]) + +slots.concept = Slot(uri=CAM.concept, name="concept", curie=CAM.curie('concept'), + model_uri=CAM.concept, domain=None, range=Optional[Union[Union[str, ConceptConceptCurie], list[Union[str, ConceptConceptCurie]]]]) + +slots.concept_curie = Slot(uri=CAM.concept_curie, name="concept_curie", curie=CAM.curie('concept_curie'), + model_uri=CAM.concept_curie, domain=None, range=Optional[Union[str, URIorCURIE]]) + +slots.display = Slot(uri=CAM.display, name="display", curie=CAM.curie('display'), + model_uri=CAM.display, domain=None, range=Optional[str]) + +slots.concept_source = Slot(uri=CAM.concept_source, name="concept_source", curie=CAM.curie('concept_source'), + model_uri=CAM.concept_source, domain=None, range=Optional[str]) + +slots.value_concept = Slot(uri=CAM.value_concept, name="value_concept", curie=CAM.curie('value_concept'), + model_uri=CAM.value_concept, domain=None, range=Optional[Union[Union[str, ConceptConceptCurie], list[Union[str, ConceptConceptCurie]]]]) + +slots.value_number = Slot(uri=CAM.value_number, name="value_number", curie=CAM.curie('value_number'), + model_uri=CAM.value_number, domain=None, range=Optional[float]) + +slots.value_source = Slot(uri=CAM.value_source, name="value_source", curie=CAM.curie('value_source'), + model_uri=CAM.value_source, domain=None, range=Optional[str]) + +slots.value_unit = Slot(uri=CAM.value_unit, name="value_unit", curie=CAM.curie('value_unit'), + model_uri=CAM.value_unit, domain=None, range=Optional[Union[str, ConceptConceptCurie]]) + +slots.value_unit_source = Slot(uri=CAM.value_unit_source, name="value_unit_source", curie=CAM.curie('value_unit_source'), + model_uri=CAM.value_unit_source, domain=None, range=Optional[str]) + +slots.sample_id = Slot(uri=CAM.sample_id, name="sample_id", curie=CAM.curie('sample_id'), + model_uri=CAM.sample_id, domain=None, range=Optional[Union[str, SampleSampleId]]) + +slots.parent_sample_id = Slot(uri=CAM.parent_sample_id, name="parent_sample_id", curie=CAM.curie('parent_sample_id'), + model_uri=CAM.parent_sample_id, domain=None, range=Optional[Union[str, SampleSampleId]]) + +slots.biospecimen_collection_id = Slot(uri=CAM.biospecimen_collection_id, name="biospecimen_collection_id", curie=CAM.curie('biospecimen_collection_id'), + model_uri=CAM.biospecimen_collection_id, domain=None, range=Optional[Union[str, BiospecimenCollectionBiospecimenCollectionId]]) + +slots.aliquot_id = Slot(uri=CAM.aliquot_id, name="aliquot_id", curie=CAM.curie('aliquot_id'), + model_uri=CAM.aliquot_id, domain=None, range=Optional[Union[str, AliquotAliquotId]]) + +slots.sample_type = Slot(uri=CAM.sample_type, name="sample_type", curie=CAM.curie('sample_type'), + model_uri=CAM.sample_type, domain=None, range=Union[str, URIorCURIE]) + +slots.processing = Slot(uri=CAM.processing, name="processing", curie=CAM.curie('processing'), + model_uri=CAM.processing, domain=None, range=Optional[Union[Union[str, URIorCURIE], list[Union[str, URIorCURIE]]]]) + +slots.availablity_status = Slot(uri=CAM.availablity_status, name="availablity_status", curie=CAM.curie('availablity_status'), + model_uri=CAM.availablity_status, domain=None, range=Optional[Union[str, "EnumAvailabilityStatus"]]) + +slots.storage_method = Slot(uri=CAM.storage_method, name="storage_method", curie=CAM.curie('storage_method'), + model_uri=CAM.storage_method, domain=None, range=Optional[Union[Union[str, URIorCURIE], list[Union[str, URIorCURIE]]]]) + +slots.quantity_number = Slot(uri=CAM.quantity_number, name="quantity_number", curie=CAM.curie('quantity_number'), + model_uri=CAM.quantity_number, domain=None, range=Optional[float]) + +slots.quantity_unit = Slot(uri=CAM.quantity_unit, name="quantity_unit", curie=CAM.curie('quantity_unit'), + model_uri=CAM.quantity_unit, domain=None, range=Optional[Union[str, ConceptConceptCurie]]) + +slots.concentration_number = Slot(uri=CAM.concentration_number, name="concentration_number", curie=CAM.curie('concentration_number'), + model_uri=CAM.concentration_number, domain=None, range=Optional[float]) + +slots.concentration_unit = Slot(uri=CAM.concentration_unit, name="concentration_unit", curie=CAM.curie('concentration_unit'), + model_uri=CAM.concentration_unit, domain=None, range=Optional[Union[str, ConceptConceptCurie]]) + +slots.age_at_collection = Slot(uri=CAM.age_at_collection, name="age_at_collection", curie=CAM.curie('age_at_collection'), + model_uri=CAM.age_at_collection, domain=None, range=Optional[float]) + +slots.method = Slot(uri=CAM.method, name="method", curie=CAM.curie('method'), + model_uri=CAM.method, domain=None, range=Optional[Union[str, "EnumSampleCollectionMethod"]]) + +slots.site = Slot(uri=CAM.site, name="site", curie=CAM.curie('site'), + model_uri=CAM.site, domain=None, range=Optional[Union[str, "EnumSite"]]) + +slots.spatial_qualifier = Slot(uri=CAM.spatial_qualifier, name="spatial_qualifier", curie=CAM.curie('spatial_qualifier'), + model_uri=CAM.spatial_qualifier, domain=None, range=Optional[Union[str, "EnumSpatialQualifiers"]]) + +slots.laterality = Slot(uri=CAM.laterality, name="laterality", curie=CAM.curie('laterality'), + model_uri=CAM.laterality, domain=None, range=Optional[Union[str, "EnumLaterality"]]) + +slots.encounter_id = Slot(uri=CAM.encounter_id, name="encounter_id", curie=CAM.curie('encounter_id'), + model_uri=CAM.encounter_id, domain=None, range=Optional[Union[str, EncounterEncounterId]]) + +slots.description = Slot(uri=CAM.description, name="description", curie=CAM.curie('description'), + model_uri=CAM.description, domain=None, range=Optional[str]) + +slots.encounter_definition_id = Slot(uri=CAM.encounter_definition_id, name="encounter_definition_id", curie=CAM.curie('encounter_definition_id'), + model_uri=CAM.encounter_definition_id, domain=None, range=Optional[Union[str, EncounterDefinitionEncounterDefinitionId]]) + +slots.activity_definition_id = Slot(uri=CAM.activity_definition_id, name="activity_definition_id", curie=CAM.curie('activity_definition_id'), + model_uri=CAM.activity_definition_id, domain=None, range=Optional[Union[str, ActivityDefinitionActivityDefinitionId]]) + +slots.file_id = Slot(uri=CAM.file_id, name="file_id", curie=CAM.curie('file_id'), + model_uri=CAM.file_id, domain=None, range=Optional[Union[str, FileFileId]]) + +slots.filename = Slot(uri=CAM.filename, name="filename", curie=CAM.curie('filename'), + model_uri=CAM.filename, domain=None, range=Optional[str]) + +slots.format = Slot(uri=CAM.format, name="format", curie=CAM.curie('format'), + model_uri=CAM.format, domain=None, range=Optional[Union[str, "EnumEDAMFormats"]]) + +slots.data_type = Slot(uri=CAM.data_type, name="data_type", curie=CAM.curie('data_type'), + model_uri=CAM.data_type, domain=None, range=Optional[Union[str, "EnumEDAMDataTypes"]]) + +slots.size = Slot(uri=CAM.size, name="size", curie=CAM.curie('size'), + model_uri=CAM.size, domain=None, range=Optional[int]) + +slots.staging_url = Slot(uri=CAM.staging_url, name="staging_url", curie=CAM.curie('staging_url'), + model_uri=CAM.staging_url, domain=None, range=Optional[Union[str, URIorCURIE]]) + +slots.release_url = Slot(uri=CAM.release_url, name="release_url", curie=CAM.curie('release_url'), + model_uri=CAM.release_url, domain=None, range=Optional[Union[str, URIorCURIE]]) + +slots.drs_uri = Slot(uri=CAM.drs_uri, name="drs_uri", curie=CAM.curie('drs_uri'), + model_uri=CAM.drs_uri, domain=None, range=Optional[Union[str, URIorCURIE]]) + +slots.hash = Slot(uri=CAM.hash, name="hash", curie=CAM.curie('hash'), + model_uri=CAM.hash, domain=None, range=Optional[Union[dict, FileHash]]) + +slots.hash_type = Slot(uri=CAM.hash_type, name="hash_type", curie=CAM.curie('hash_type'), + model_uri=CAM.hash_type, domain=None, range=Optional[Union[str, "EnumFileHashType"]]) + +slots.hash_value = Slot(uri=CAM.hash_value, name="hash_value", curie=CAM.curie('hash_value'), + model_uri=CAM.hash_value, domain=None, range=Optional[str]) + +slots.dataset_id = Slot(uri=CAM.dataset_id, name="dataset_id", curie=CAM.curie('dataset_id'), + model_uri=CAM.dataset_id, domain=None, range=Optional[Union[str, DatasetDatasetId]]) + +slots.data_collection_start = Slot(uri=CAM.data_collection_start, name="data_collection_start", curie=CAM.curie('data_collection_start'), + model_uri=CAM.data_collection_start, domain=None, range=Optional[str]) + +slots.data_collection_end = Slot(uri=CAM.data_collection_end, name="data_collection_end", curie=CAM.curie('data_collection_end'), + model_uri=CAM.data_collection_end, domain=None, range=Optional[str]) + +slots.AccessPolicy_access_policy_id = Slot(uri=CAM.access_policy_id, name="AccessPolicy_access_policy_id", curie=CAM.curie('access_policy_id'), + model_uri=CAM.AccessPolicy_access_policy_id, domain=AccessPolicy, range=Union[str, AccessPolicyAccessPolicyId]) + +slots.Study_study_id = Slot(uri=CAM.study_id, name="Study_study_id", curie=CAM.curie('study_id'), + model_uri=CAM.Study_study_id, domain=Study, range=Union[str, StudyStudyId]) + +slots.StudyMetadata_study_id = Slot(uri=CAM.study_id, name="StudyMetadata_study_id", curie=CAM.curie('study_id'), + model_uri=CAM.StudyMetadata_study_id, domain=StudyMetadata, range=Union[str, StudyMetadataStudyId]) + +slots.StudyMetadata_data_category = Slot(uri=CAM.data_category, name="StudyMetadata_data_category", curie=CAM.curie('data_category'), + model_uri=CAM.StudyMetadata_data_category, domain=StudyMetadata, range=Union[Union[str, "EnumDataCategory"], list[Union[str, "EnumDataCategory"]]]) + +slots.VirtualBiorepository_vbr_id = Slot(uri=CAM.vbr_id, name="VirtualBiorepository_vbr_id", curie=CAM.curie('vbr_id'), + model_uri=CAM.VirtualBiorepository_vbr_id, domain=VirtualBiorepository, range=Union[str, VirtualBiorepositoryVbrId]) + +slots.DOI_do_id = Slot(uri=CAM.do_id, name="DOI_do_id", curie=CAM.curie('do_id'), + model_uri=CAM.DOI_do_id, domain=DOI, range=Union[str, DOIDoId]) + +slots.Subject_subject_id = Slot(uri=CAM.subject_id, name="Subject_subject_id", curie=CAM.curie('subject_id'), + model_uri=CAM.Subject_subject_id, domain=Subject, range=Union[str, SubjectSubjectId]) + +slots.Demographics_subject_id = Slot(uri=CAM.subject_id, name="Demographics_subject_id", curie=CAM.curie('subject_id'), + model_uri=CAM.Demographics_subject_id, domain=Demographics, range=Union[str, DemographicsSubjectId]) + +slots.Family_family_id = Slot(uri=CAM.family_id, name="Family_family_id", curie=CAM.curie('family_id'), + model_uri=CAM.Family_family_id, domain=Family, range=Union[str, FamilyFamilyId]) + +slots.FamilyRelationship_family_relationship_id = Slot(uri=CAM.family_relationship_id, name="FamilyRelationship_family_relationship_id", curie=CAM.curie('family_relationship_id'), + model_uri=CAM.FamilyRelationship_family_relationship_id, domain=FamilyRelationship, range=Union[str, FamilyRelationshipFamilyRelationshipId]) + +slots.FamilyRelationship_subject_id = Slot(uri=CAM.subject_id, name="FamilyRelationship_subject_id", curie=CAM.curie('subject_id'), + model_uri=CAM.FamilyRelationship_subject_id, domain=FamilyRelationship, range=Union[str, SubjectSubjectId]) + +slots.FamilyMember_family_id = Slot(uri=CAM.family_id, name="FamilyMember_family_id", curie=CAM.curie('family_id'), + model_uri=CAM.FamilyMember_family_id, domain=FamilyMember, range=Union[str, FamilyFamilyId]) + +slots.FamilyMember_subject_id = Slot(uri=CAM.subject_id, name="FamilyMember_subject_id", curie=CAM.curie('subject_id'), + model_uri=CAM.FamilyMember_subject_id, domain=FamilyMember, range=Union[str, SubjectSubjectId]) + +slots.SubjectAssertion_assertion_id = Slot(uri=CAM.assertion_id, name="SubjectAssertion_assertion_id", curie=CAM.curie('assertion_id'), + model_uri=CAM.SubjectAssertion_assertion_id, domain=SubjectAssertion, range=Union[str, SubjectAssertionAssertionId]) + +slots.Concept_concept_curie = Slot(uri=CAM.concept_curie, name="Concept_concept_curie", curie=CAM.curie('concept_curie'), + model_uri=CAM.Concept_concept_curie, domain=Concept, range=Union[str, ConceptConceptCurie]) + +slots.Sample_sample_id = Slot(uri=CAM.sample_id, name="Sample_sample_id", curie=CAM.curie('sample_id'), + model_uri=CAM.Sample_sample_id, domain=Sample, range=Union[str, SampleSampleId]) + +slots.Sample_biospecimen_collection_id = Slot(uri=CAM.biospecimen_collection_id, name="Sample_biospecimen_collection_id", curie=CAM.curie('biospecimen_collection_id'), + model_uri=CAM.Sample_biospecimen_collection_id, domain=Sample, range=Optional[Union[str, BiospecimenCollectionBiospecimenCollectionId]]) + +slots.BiospecimenCollection_biospecimen_collection_id = Slot(uri=CAM.biospecimen_collection_id, name="BiospecimenCollection_biospecimen_collection_id", curie=CAM.curie('biospecimen_collection_id'), + model_uri=CAM.BiospecimenCollection_biospecimen_collection_id, domain=BiospecimenCollection, range=Union[str, BiospecimenCollectionBiospecimenCollectionId]) + +slots.Aliquot_aliquot_id = Slot(uri=CAM.aliquot_id, name="Aliquot_aliquot_id", curie=CAM.curie('aliquot_id'), + model_uri=CAM.Aliquot_aliquot_id, domain=Aliquot, range=Union[str, AliquotAliquotId]) + +slots.Encounter_encounter_id = Slot(uri=CAM.encounter_id, name="Encounter_encounter_id", curie=CAM.curie('encounter_id'), + model_uri=CAM.Encounter_encounter_id, domain=Encounter, range=Union[str, EncounterEncounterId]) + +slots.EncounterDefinition_encounter_definition_id = Slot(uri=CAM.encounter_definition_id, name="EncounterDefinition_encounter_definition_id", curie=CAM.curie('encounter_definition_id'), + model_uri=CAM.EncounterDefinition_encounter_definition_id, domain=EncounterDefinition, range=Union[str, EncounterDefinitionEncounterDefinitionId]) + +slots.EncounterDefinition_activity_definition_id = Slot(uri=CAM.activity_definition_id, name="EncounterDefinition_activity_definition_id", curie=CAM.curie('activity_definition_id'), + model_uri=CAM.EncounterDefinition_activity_definition_id, domain=EncounterDefinition, range=Optional[Union[Union[str, ActivityDefinitionActivityDefinitionId], list[Union[str, ActivityDefinitionActivityDefinitionId]]]]) + +slots.ActivityDefinition_activity_definition_id = Slot(uri=CAM.activity_definition_id, name="ActivityDefinition_activity_definition_id", curie=CAM.curie('activity_definition_id'), + model_uri=CAM.ActivityDefinition_activity_definition_id, domain=ActivityDefinition, range=Union[str, ActivityDefinitionActivityDefinitionId]) + +slots.File_file_id = Slot(uri=CAM.file_id, name="File_file_id", curie=CAM.curie('file_id'), + model_uri=CAM.File_file_id, domain=File, range=Union[str, FileFileId]) + +slots.File_subject_id = Slot(uri=CAM.subject_id, name="File_subject_id", curie=CAM.curie('subject_id'), + model_uri=CAM.File_subject_id, domain=File, range=Optional[Union[Union[str, SubjectSubjectId], list[Union[str, SubjectSubjectId]]]]) + +slots.File_sample_id = Slot(uri=CAM.sample_id, name="File_sample_id", curie=CAM.curie('sample_id'), + model_uri=CAM.File_sample_id, domain=File, range=Optional[Union[Union[str, SampleSampleId], list[Union[str, SampleSampleId]]]]) + +slots.Dataset_dataset_id = Slot(uri=CAM.dataset_id, name="Dataset_dataset_id", curie=CAM.curie('dataset_id'), + model_uri=CAM.Dataset_dataset_id, domain=Dataset, range=Union[str, DatasetDatasetId]) + +slots.Dataset_file_id = Slot(uri=CAM.file_id, name="Dataset_file_id", curie=CAM.curie('file_id'), + model_uri=CAM.Dataset_file_id, domain=Dataset, range=Optional[Union[Union[str, FileFileId], list[Union[str, FileFileId]]]]) diff --git a/src/common_access_model/datamodel/include_access_model_pydantic.py b/src/common_access_model/datamodel/include_access_model_pydantic.py new file mode 100644 index 0000000..442d5a0 --- /dev/null +++ b/src/common_access_model/datamodel/include_access_model_pydantic.py @@ -0,0 +1,1120 @@ +from __future__ import annotations + +import re +import sys +from datetime import ( + date, + datetime, + time +) +from decimal import Decimal +from enum import Enum +from typing import ( + Any, + ClassVar, + Literal, + Optional, + Union +) + +from pydantic import ( + BaseModel, + ConfigDict, + Field, + RootModel, + SerializationInfo, + SerializerFunctionWrapHandler, + field_validator, + model_serializer +) + + +metamodel_version = "None" +version = "None" + + +class ConfiguredBaseModel(BaseModel): + model_config = ConfigDict( + serialize_by_alias = True, + validate_by_name = True, + validate_assignment = True, + validate_default = True, + extra = "forbid", + arbitrary_types_allowed = True, + use_enum_values = True, + strict = False, + ) + + @model_serializer(mode='wrap', when_used='unless-none') + def treat_empty_lists_as_none( + self, handler: SerializerFunctionWrapHandler, + info: SerializationInfo) -> dict[str, Any]: + if info.exclude_none: + _instance = self.model_copy() + for field, field_info in type(_instance).model_fields.items(): + if getattr(_instance, field) == [] and not( + field_info.is_required()): + setattr(_instance, field, None) + else: + _instance = self + return handler(_instance, info) + + + +class LinkMLMeta(RootModel): + root: dict[str, Any] = {} + model_config = ConfigDict(frozen=True) + + def __getattr__(self, key:str): + return getattr(self.root, key) + + def __getitem__(self, key:str): + return self.root[key] + + def __setitem__(self, key:str, value): + self.root[key] = value + + def __contains__(self, key:str) -> bool: + return key in self.root + + +linkml_meta = LinkMLMeta({'default_prefix': 'cam', + 'default_range': 'string', + 'description': 'LinkML Schema for the Common Access Model', + 'id': 'https://includedcc.org/common-access-model', + 'imports': ['linkml:types'], + 'license': 'MIT', + 'name': 'common-access-model', + 'prefixes': {'DUO': {'prefix_prefix': 'DUO', + 'prefix_reference': 'http://purl.obolibrary.org/obo/DUO_'}, + 'HP': {'prefix_prefix': 'HP', + 'prefix_reference': 'http://purl.obolibrary.org/obo/HP_'}, + 'MONDO': {'prefix_prefix': 'MONDO', + 'prefix_reference': 'http://purl.obolibrary.org/obo/MONDO_'}, + 'NCIT': {'prefix_prefix': 'NCIT', + 'prefix_reference': 'http://purl.obolibrary.org/obo/NCIT_'}, + 'PATO': {'prefix_prefix': 'PATO', + 'prefix_reference': 'http://purl.obolibrary.org/obo/PATO_'}, + 'cam': {'prefix_prefix': 'cam', + 'prefix_reference': 'https://includedcc.org/common-access-model/'}, + 'cdc_race_eth': {'prefix_prefix': 'cdc_race_eth', + 'prefix_reference': 'urn:oid:2.16.840.1.113883.6.238/'}, + 'hl7_null': {'prefix_prefix': 'hl7_null', + 'prefix_reference': 'http://terminology.hl7.org/CodeSystem/v3-NullFlavor/'}, + 'ig2_biospecimen_availability': {'prefix_prefix': 'ig2_biospecimen_availability', + 'prefix_reference': 'https://nih-ncpi.github.io/ncpi-fhir-ig-2/CodeSystem/biospecimen-availability/'}, + 'ig2dac': {'prefix_prefix': 'ig2dac', + 'prefix_reference': 'https://nih-ncpi.github.io/ncpi-fhir-ig-2/CodeSystem/research-data-access-code/'}, + 'ig2dat': {'prefix_prefix': 'ig2dat', + 'prefix_reference': 'https://nih-ncpi.github.io/ncpi-fhir-ig-2/CodeSystem/research-data-access-type/'}, + 'ig_dob_method': {'prefix_prefix': 'ig_dob_method', + 'prefix_reference': 'https://nih-ncpi.github.io/ncpi-fhir-ig-2/CodeSystem/research-data-date-of-birth-method/'}, + 'igcondtype': {'prefix_prefix': 'igcondtype', + 'prefix_reference': 'https://nih-ncpi.github.io/ncpi-fhir-ig-2/CodeSystem/condition-type/'}, + 'linkml': {'prefix_prefix': 'linkml', + 'prefix_reference': 'https://w3id.org/linkml/'}, + 'mesh': {'prefix_prefix': 'mesh', + 'prefix_reference': 'http://id.nlm.nih.gov/mesh/'}, + 'schema': {'prefix_prefix': 'schema', + 'prefix_reference': 'http://schema.org/'}, + 'snomed_ct': {'prefix_prefix': 'snomed_ct', + 'prefix_reference': 'http://snomed.info/id/'}}, + 'see_also': ['https://includedcc.github.io/common-access-model'], + 'source_file': 'src/common_access_model/schema/common_access_model.yaml', + 'title': 'Common Access Model'} ) + +class EnumDataUsePermission(str): + """ + Data Use Ontology (DUO) terms for data use permissions. + """ + pass + + +class EnumDataUseModifier(str): + """ + Data Use Ontology (DUO) terms for data use modifiers. + """ + pass + + +class EnumProgram(str, Enum): + """ + Funding programs relevant to inform operations. + """ + INCLUDE = "include" + KF = "kf" + Other = "other" + + +class EnumResearchDomain(str, Enum): + """ + Domains of Research used to find studies. + """ + Behavior_and_Behavior_Mechanisms = "behavior_and_behavior_mechanisms" + Congenital_Heart_Defects = "congenital_heart_defects" + Immune_System_Diseases = "immune_system_diseases" + Hematologic_Diseases = "hematologic_diseases" + Neurodevelopment = "neurodevelopment" + Sleep_Wake_Disorders = "sleep_wake_disorders" + All_Co_occurring_Conditions = "all_co_occurring_conditions" + Physical_Fitness = "physical_fitness" + Other = "other" + + +class EnumParticipantLifespanStage(str, Enum): + """ + Stages of life during which participants may be recruited. + """ + Fetal = "fetal" + """ + Before birth + """ + Neonatal = "neonatal" + """ + 0-28 days old + """ + Pediatric = "pediatric" + """ + Birth-17 years old + """ + Adult = "adult" + """ + 18+ years old + """ + + +class EnumStudyDesign(str, Enum): + """ + Approaches for collecting data, investigating interventions, and/or analyzing data. + """ + Case_Control = "case_control" + Case_Set = "case_set" + Control_Set = "control_set" + Clinical_Trial = "clinical_trial" + Cross_Sectional = "cross_sectional" + FamilySOLIDUSTwinsSOLIDUSTrios = "family_twins_trios" + Interventional = "interventional" + Longitudinal = "longitudinal" + Trial_Readiness_Study = "trial_readiness_study" + Tumor_vs_Matched_Normal = "tumor_vs_matched_normal" + + +class EnumClinicalDataSourceType(str, Enum): + """ + Approaches to ascertain clinical information about a participant. + """ + Medical_Record = "medical_record" + """ + Data obtained directly from medical record + """ + Investigator_Assessment = "investigator_assessment" + """ + Data obtained by examination, interview, etc. with investigator + """ + Participant_or_Caregiver_Report = "participant_or_caregiver_report" + """ + Data obtained from survey, questionnaire, etc. filled out by participant or caregiver + """ + Other = "other" + """ + Data obtained from other source, such as tissue bank + """ + Unknown = "unknown" + + +class EnumDataCategory(str, Enum): + """ + Categories of data which may be collected about participants. + """ + Unharmonized_DemographicSOLIDUSClinical_Data = "unharmonized_demographic_clinical_data" + Harmonized_DemographicSOLIDUSClinical_Data = "harmonized_demographic_clinical_data" + Genomics = "genomics" + Transcriptomics = "transcriptomics" + Epigenomics = "epigenomics" + Proteomics = "proteomics" + Metabolomics = "metabolomics" + CognitiveSOLIDUSBehavioral = "cognitive_behavioral" + Immune_Profiling = "immune_profiling" + Imaging = "imaging" + Microbiome = "microbiome" + Fitness = "fitness" + Physical_Activity = "physical_activity" + Other = "other" + Sleep_Study = "sleep_study" + + +class EnumSubjectType(str, Enum): + """ + Types of Subject entities + """ + participant = "participant" + """ + Study participant with consent, assent, or waiver of consent. + """ + non_participant = "non_participant" + """ + An individual associated with a study who was not explictly consented, eg, the subject of a reported family history. + """ + cell_line = "cell_line" + """ + Cell Line + """ + animal_model = "animal_model" + """ + Animal model + """ + group = "group" + """ + A group of individuals or entities. + """ + other = "other" + """ + A different entity type- ideally this will be resolved! + """ + + +class EnumDownSyndromeStatus(str, Enum): + """ + Down syndrome / chromosome 21 status + """ + D21 = "d21" + """ + Disomy 21 (euploid) + """ + T21 = "t21" + """ + Trisomy 21 (Down syndrome) + """ + + +class EnumSex(str, Enum): + """ + Subject Sex + """ + Female = "female" + Male = "male" + Other = "other" + Unknown = "unknown" + + +class EnumRace(str, Enum): + """ + Participant Race + """ + American_Indian_or_Alaska_Native = "american_indian_or_alaska_native" + Asian = "asian" + Black_or_African_American = "black_or_african_american" + More_than_one_race = "more_than_one_race" + Native_Hawaiian_or_Other_Pacific_Islander = "native_hawaiian_or_other_pacific_islander" + Other = "other" + White = "white" + Prefer_not_to_answer = "prefer_not_to_answer" + Unknown = "unknown" + East_Asian = "east_asian" + """ + UK only; do not use for US data + """ + Latin_American = "latin_american" + """ + UK only; do not use for US data + """ + Middle_Eastern_or_North_African = "middle_eastern_or_north_african" + """ + UK only; do not use for US data + """ + South_Asian = "south_asian" + """ + UK only; do not use for US data + """ + + +class EnumEthnicity(str, Enum): + """ + Participant ethnicity, specific to Hispanic or Latino. + """ + Hispanic_or_Latino = "hispanic_or_latino" + Not_Hispanic_or_Latino = "not_hispanic_or_latino" + Prefer_not_to_answer = "prefer_not_to_answer" + Unknown = "unknown" + + +class EnumVitalStatus(str, Enum): + """ + Descriptions of a Subject's vital status + """ + Dead = "dead" + Alive = "alive" + + +class EnumNull(str, Enum): + """ + Base enumeration providing null options. + """ + Unknown = "unknown" + + +class EnumFamilyType(str, Enum): + """ + Enumerations describing research family type + """ + Control_only = "control_only" + """ + Control Only + """ + Duo = "duo" + """ + Duo + """ + Proband_only = "proband_only" + """ + Proband Only + """ + Trio = "trio" + """ + Trio (2 parents and affected child) + """ + TrioPLUS_SIGN = "trio_plus" + """ + 2 Parents and 2 or more children + """ + + +class EnumConsanguinityAssertion(str, Enum): + """ + Asserts known or suspected consanguinity in this study family + """ + not_suspected = "not_suspected" + """ + Not suspected + """ + suspected = "suspected" + """ + Suspected + """ + known_present = "known_present" + """ + Known Present + """ + unknown = "unknown" + """ + Unknown + """ + + +class EnumAssertionProvenance(str, Enum): + """ + Possible data sources for assertions. + """ + Medical_Record = "medical_record" + """ + Data obtained from a medical record + """ + Investigator_Assessment = "investigator_assessment" + """ + Data obtained by examination, interview, etc. with investigator + """ + Participant_or_Caregiver_Report = "participant_or_caregiver_report" + """ + Data obtained from survey, questionnaire, etc. filled out by participant or caregiver + """ + Other = "other" + """ + Data obtained from other source, such as tissue bank + """ + + +class EnumAvailabilityStatus(str, Enum): + """ + Is the biospecimen available for use? + """ + Available = "available" + """ + Biospecimen is Available + """ + Unavailable = "unavailable" + """ + Biospecimen is Unavailable + """ + + +class EnumSampleCollectionMethod(str): + """ + The approach used to collect the biospecimen. [LOINC](https://loinc.org) is recommended. + """ + pass + + +class EnumSite(str): + """ + The location of the specimen collection. [SNOMED Body Site](https://hl7.org/fhir/R4B/valueset-body-site.html) is recommended. + """ + pass + + +class EnumSpatialQualifiers(str): + """ + Any spatial/location qualifiers. + """ + pass + + +class EnumLaterality(str): + """ + Laterality information for the site + """ + pass + + +class EnumEDAMFormats(str): + """ + Data formats from the EDAM ontology. + """ + pass + + +class EnumEDAMDataTypes(str): + """ + Data types from the EDAM ontology. + """ + pass + + +class EnumFileHashType(str, Enum): + """ + Types of file hashes supported. + """ + MD5 = "md5" + ETag = "etag" + SHA_1 = "sha1" + + + +class Record(ConfiguredBaseModel): + """ + One row / entity within the database + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'abstract': True, + 'from_schema': 'https://includedcc.org/common-access-model', + 'title': 'Record'}) + + external_id: Optional[list[str]] = Field(default=[], title="External Identifiers", description="""Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record']} }) + access_policy_id: Optional[str] = Field(default=None, title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + study_id: Optional[str] = Field(default=None, title="Study ID", description="""INCLUDE Global ID for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'StudyMetadata']} }) + + +class AccessPolicy(ConfiguredBaseModel): + """ + The access policy that describes the controls around use of data + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'slot_usage': {'access_policy_id': {'identifier': True, + 'name': 'access_policy_id', + 'range': 'string', + 'required': True}}, + 'title': 'Access Policy'}) + + access_policy_id: str = Field(default=..., title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + data_use_accession: Optional[str] = Field(default=None, title="Data Use Accession", description="""Accession used to provision access to the record, eg, a dbGaP phsID.""", json_schema_extra = { "linkml_meta": {'domain_of': ['AccessPolicy']} }) + data_use_permission: EnumDataUsePermission = Field(default=..., title="Data Use Permission", description="""Broad category of restrictions on data use.""", json_schema_extra = { "linkml_meta": {'domain_of': ['AccessPolicy']} }) + data_use_modifier: Optional[EnumDataUseModifier] = Field(default=None, title="Data Use Modifier", description="""Additional modifiers that limit data use.""", json_schema_extra = { "linkml_meta": {'domain_of': ['AccessPolicy']} }) + disease_limitation: Optional[str] = Field(default=None, title="Data Use Disease Limitation", description="""If the access is limited to a specific disease purpose, it is specified here.""", json_schema_extra = { "linkml_meta": {'domain_of': ['AccessPolicy']} }) + access_description: Optional[str] = Field(default=None, title="Access Description", description="""Any additional information to support access requests.""", json_schema_extra = { "linkml_meta": {'domain_of': ['AccessPolicy']} }) + website: Optional[str] = Field(default=None, title="Website", description="""Website with more information about this entity.""", json_schema_extra = { "linkml_meta": {'domain_of': ['AccessPolicy', 'Study', 'VirtualBiorepository', 'Publication']} }) + + +class Study(Record): + """ + Study Metadata + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'slot_usage': {'study_id': {'identifier': True, + 'name': 'study_id', + 'range': 'string', + 'required': True}}, + 'title': 'Research Study'}) + + parent_study: Optional[str] = Field(default=None, title="Parent Study", description="""The parent study for this study, if it is a nested study.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Study']} }) + study_title: str = Field(default=..., description="""Full Study Title""", json_schema_extra = { "linkml_meta": {'domain_of': ['Study']} }) + study_code: str = Field(default=..., title="Study Code", description="""Unique identifier for the study (generally a short acronym)""", json_schema_extra = { "linkml_meta": {'domain_of': ['Study']} }) + study_short_name: Optional[str] = Field(default=None, title="Study Code", description="""Short name for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Study']} }) + program: list[EnumProgram] = Field(default=..., title="Program", description="""Funding source(s) for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Study']} }) + funding_source: Optional[list[str]] = Field(default=[], title="Funding Source", description="""The funding source(s) of the study.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Study']} }) + principal_investigator: list[Investigator] = Field(default=..., title="Principal Investigator", description="""The Principal Investigator(s) responsible for the study.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Study']} }) + contact: list[Investigator] = Field(default=..., title="Contact Person", description="""The individual to contact with questions about this record.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Study', 'VirtualBiorepository']} }) + study_description: str = Field(default=..., title="Study Description", description="""Brief description of the study (2-4 sentences)""", json_schema_extra = { "linkml_meta": {'domain_of': ['Study']} }) + website: Optional[str] = Field(default=None, title="Website", description="""Website with more information about this entity.""", json_schema_extra = { "linkml_meta": {'domain_of': ['AccessPolicy', 'Study', 'VirtualBiorepository', 'Publication']} }) + publication: Optional[list[Publication]] = Field(default=[], title="Publication", description="""Publications associated with this Record.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Study', 'Dataset']} }) + acknowledgments: Optional[str] = Field(default=None, title="Acknowledgments", description="""Funding statement and acknowledgments for this study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Study']} }) + citation_statement: Optional[str] = Field(default=None, title="Citation Statement", description="""Statement that secondary data users should use to acknowledge use of this study or dataset. E.g., \"The results analyzed and here are based in whole or in part upon data generated by the INCLUDE (INvestigation of Co-occurring conditions across the Lifespan to Understand Down syndromE) Project , and were accessed from the INCLUDE Data Hub and .\"""", json_schema_extra = { "linkml_meta": {'domain_of': ['Study']} }) + do_id: Optional[str] = Field(default=None, title="DOI", description="""Digital Object Identifier (DOI) for this Record.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Study', 'DOI', 'Dataset']} }) + external_id: Optional[list[str]] = Field(default=[], title="External Identifiers", description="""Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record']} }) + access_policy_id: Optional[str] = Field(default=None, title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + study_id: str = Field(default=..., title="Study ID", description="""INCLUDE Global ID for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'StudyMetadata']} }) + + +class StudyMetadata(Record): + """ + Additional features about studies that may not apply to all studies + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'slot_usage': {'data_category': {'multivalued': True, + 'name': 'data_category', + 'required': True}, + 'study_id': {'identifier': True, + 'name': 'study_id', + 'required': True}}, + 'title': 'Study Metadata'}) + + study_id: str = Field(default=..., title="Study ID", description="""INCLUDE Global ID for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'StudyMetadata']} }) + participant_lifespan_stage: list[EnumParticipantLifespanStage] = Field(default=..., title="Participant Lifespan Stage", description="""Focus age group(s) of the study population""", json_schema_extra = { "linkml_meta": {'domain_of': ['StudyMetadata']} }) + selection_criteria: Optional[str] = Field(default=None, title="Selection Criteria", description="""Brief description of inclusion and/or exclusion criteria for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['StudyMetadata']} }) + study_design: list[EnumStudyDesign] = Field(default=..., title="Study Design", description="""Overall design of study, including whether it is longitudinal and whether family members/unrelated controls are also enrolled""", json_schema_extra = { "linkml_meta": {'domain_of': ['StudyMetadata']} }) + clinical_data_source_type: list[EnumClinicalDataSourceType] = Field(default=..., title="Clinical Data Source Type", description="""Source(s) of data collected from study participants""", json_schema_extra = { "linkml_meta": {'domain_of': ['StudyMetadata']} }) + data_category: list[EnumDataCategory] = Field(default=..., title="Data Category", description="""General category of data in this Record (e.g. Clinical, Genomics, etc)""", json_schema_extra = { "linkml_meta": {'domain_of': ['StudyMetadata', 'File']} }) + vbr_id: Optional[str] = Field(default=None, title="Virtual Biorepository", description="""Information about the study's Virtual Biorepository, if participating""", json_schema_extra = { "linkml_meta": {'domain_of': ['StudyMetadata', 'VirtualBiorepository']} }) + research_domain: list[EnumResearchDomain] = Field(default=..., description="""Main research domain(s) of the study, other than Down syndrome""", json_schema_extra = { "linkml_meta": {'domain_of': ['StudyMetadata']} }) + expected_number_of_participants: int = Field(default=..., title="Expected Number of Participants", description="""Total expected number of participants to be recruited.""", json_schema_extra = { "linkml_meta": {'domain_of': ['StudyMetadata']} }) + actual_number_of_participants: int = Field(default=..., title="Actual Number of Participants", description="""Total participants included at this time.""", json_schema_extra = { "linkml_meta": {'domain_of': ['StudyMetadata']} }) + external_id: Optional[list[str]] = Field(default=[], title="External Identifiers", description="""Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record']} }) + access_policy_id: Optional[str] = Field(default=None, title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + + +class VirtualBiorepository(Record): + """ + An organization that can provide access to specimen for further analysis. + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'slot_usage': {'vbr_id': {'identifier': True, + 'name': 'vbr_id', + 'range': 'string', + 'required': True}}, + 'title': 'Virtual BioRepository (VBR)'}) + + vbr_id: str = Field(default=..., title="Virtual Biorepository", description="""Information about the study's Virtual Biorepository, if participating""", json_schema_extra = { "linkml_meta": {'domain_of': ['StudyMetadata', 'VirtualBiorepository']} }) + name: Optional[str] = Field(default=None, title="Name", description="""Name of the entity.""", json_schema_extra = { "linkml_meta": {'domain_of': ['VirtualBiorepository', + 'Investigator', + 'EncounterDefinition', + 'ActivityDefinition', + 'Dataset']} }) + institution: Optional[str] = Field(default=None, title="Institution", description="""Name of the institution this record is associated with.""", json_schema_extra = { "linkml_meta": {'domain_of': ['VirtualBiorepository', 'Investigator']} }) + contact: list[Investigator] = Field(default=..., title="Contact Person", description="""The individual to contact with questions about this record.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Study', 'VirtualBiorepository']} }) + website: Optional[str] = Field(default=None, title="Website", description="""Website with more information about this entity.""", json_schema_extra = { "linkml_meta": {'domain_of': ['AccessPolicy', 'Study', 'VirtualBiorepository', 'Publication']} }) + vbr_readme: Optional[str] = Field(default=None, title="VBR Readme", description="""Instructions for contacting or requesting samples from Virtual Biorepository, if participating""", json_schema_extra = { "linkml_meta": {'domain_of': ['VirtualBiorepository']} }) + external_id: Optional[list[str]] = Field(default=[], title="External Identifiers", description="""Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record']} }) + access_policy_id: Optional[str] = Field(default=None, title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + study_id: Optional[str] = Field(default=None, title="Study ID", description="""INCLUDE Global ID for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'StudyMetadata']} }) + + +class DOI(Record): + """ + A DOI is a permanent reference with metadata about a digital object. + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'slot_usage': {'do_id': {'identifier': True, + 'name': 'do_id', + 'range': 'string', + 'required': True}}, + 'title': 'Digital Object Identifier (DOI)'}) + + do_id: str = Field(default=..., title="DOI", description="""Digital Object Identifier (DOI) for this Record.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Study', 'DOI', 'Dataset']} }) + bibliographic_reference: Optional[str] = Field(default=None, title="Bibiliographic Reference", description="""Text use to reference this Record.""", json_schema_extra = { "linkml_meta": {'domain_of': ['DOI', 'Publication']} }) + external_id: Optional[list[str]] = Field(default=[], title="External Identifiers", description="""Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record']} }) + access_policy_id: Optional[str] = Field(default=None, title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + study_id: Optional[str] = Field(default=None, title="Study ID", description="""INCLUDE Global ID for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'StudyMetadata']} }) + + +class Investigator(Record): + """ + An individual who made contributions to the collection, analysis, or sharing of data. + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'title': 'Investigator'}) + + name: Optional[str] = Field(default=None, title="Name", description="""Name of the entity.""", json_schema_extra = { "linkml_meta": {'domain_of': ['VirtualBiorepository', + 'Investigator', + 'EncounterDefinition', + 'ActivityDefinition', + 'Dataset']} }) + institution: Optional[str] = Field(default=None, title="Institution", description="""Name of the institution this record is associated with.""", json_schema_extra = { "linkml_meta": {'domain_of': ['VirtualBiorepository', 'Investigator']} }) + investigator_title: Optional[str] = Field(default=None, title="Investigator Title", description="""The title of the Investigator, eg, \"Assistant Professor\"""", json_schema_extra = { "linkml_meta": {'domain_of': ['Investigator']} }) + email: Optional[str] = Field(default=None, title="Email Address", description="""An email address to reach the entity.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Investigator']} }) + external_id: Optional[list[str]] = Field(default=[], title="External Identifiers", description="""Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record']} }) + access_policy_id: Optional[str] = Field(default=None, title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + study_id: Optional[str] = Field(default=None, title="Study ID", description="""INCLUDE Global ID for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'StudyMetadata']} }) + + +class Publication(Record): + """ + Information about a specific publication. + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'title': 'Publication'}) + + bibliographic_reference: Optional[str] = Field(default=None, title="Bibiliographic Reference", description="""Text use to reference this Record.""", json_schema_extra = { "linkml_meta": {'domain_of': ['DOI', 'Publication']} }) + website: Optional[str] = Field(default=None, title="Website", description="""Website with more information about this entity.""", json_schema_extra = { "linkml_meta": {'domain_of': ['AccessPolicy', 'Study', 'VirtualBiorepository', 'Publication']} }) + external_id: Optional[list[str]] = Field(default=[], title="External Identifiers", description="""Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record']} }) + access_policy_id: Optional[str] = Field(default=None, title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + study_id: Optional[str] = Field(default=None, title="Study ID", description="""INCLUDE Global ID for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'StudyMetadata']} }) + + +class Subject(Record): + """ + This entity is the subject about which data or references are recorded. This includes the idea of a human participant in a study, a cell line, an animal model, or any other similar entity. + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'slot_usage': {'subject_id': {'identifier': True, + 'name': 'subject_id', + 'range': 'string', + 'required': True}}, + 'title': 'Subject'}) + + subject_id: str = Field(default=..., title="Study ID", description="""INCLUDE Global ID for the Subject""", json_schema_extra = { "linkml_meta": {'domain_of': ['Subject', + 'Demographics', + 'FamilyRelationship', + 'FamilyMember', + 'SubjectAssertion', + 'Encounter', + 'File']} }) + subject_type: EnumSubjectType = Field(default=..., title="Subject Type", description="""Type of entity this record represents""", json_schema_extra = { "linkml_meta": {'domain_of': ['Subject']} }) + organism_type: Optional[str] = Field(default=None, title="Organism Type", description="""Organism Type, typically from NCBITaxon. For reference, Human is NCBITaxon:9606.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Subject']} }) + external_id: Optional[list[str]] = Field(default=[], title="External Identifiers", description="""Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record']} }) + access_policy_id: Optional[str] = Field(default=None, title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + study_id: Optional[str] = Field(default=None, title="Study ID", description="""INCLUDE Global ID for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'StudyMetadata']} }) + + +class Demographics(Record): + """ + Basic participant demographics summary + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'slot_usage': {'subject_id': {'identifier': True, + 'name': 'subject_id', + 'required': True}}, + 'title': 'Demographics'}) + + subject_id: str = Field(default=..., title="Study ID", description="""INCLUDE Global ID for the Subject""", json_schema_extra = { "linkml_meta": {'domain_of': ['Subject', + 'Demographics', + 'FamilyRelationship', + 'FamilyMember', + 'SubjectAssertion', + 'Encounter', + 'File']} }) + sex: EnumSex = Field(default=..., title="Sex", description="""Sex of Participant""", json_schema_extra = { "linkml_meta": {'domain_of': ['Demographics']} }) + race: list[EnumRace] = Field(default=..., title="Race", description="""Race of Participant""", json_schema_extra = { "linkml_meta": {'domain_of': ['Demographics']} }) + ethnicity: EnumEthnicity = Field(default=..., title="Ethnicity", description="""Ethnicity of Participant""", json_schema_extra = { "linkml_meta": {'domain_of': ['Demographics']} }) + age_at_last_vital_status: Optional[int] = Field(default=None, title="Age at Last Vital Status", description="""Age in days when participant's vital status was last recorded""", ge=-365, le=32507, json_schema_extra = { "linkml_meta": {'domain_of': ['Demographics'], 'unit': {'ucum_code': 'd'}} }) + vital_status: Optional[EnumVitalStatus] = Field(default=None, title="Vital Status", description="""Whether participant is alive or dead""", json_schema_extra = { "linkml_meta": {'domain_of': ['Demographics']} }) + external_id: Optional[list[str]] = Field(default=[], title="External Identifiers", description="""Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record']} }) + access_policy_id: Optional[str] = Field(default=None, title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + study_id: Optional[str] = Field(default=None, title="Study ID", description="""INCLUDE Global ID for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'StudyMetadata']} }) + + +class IncludeParticipant(Demographics): + """ + Information specific to INCLUDE participants + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'title': 'INCLUDE Participant'}) + + down_syndrome_status: EnumDownSyndromeStatus = Field(default=..., title="Down Syndrome Status", description="""Down Syndrome status of participant""", json_schema_extra = { "linkml_meta": {'domain_of': ['IncludeParticipant']} }) + age_at_first_engagement: Optional[int] = Field(default=None, title="Age at First Participant Engagement", description="""Age in days of Participant at first recorded study event (enrollment, visit, observation, sample collection, survey completion, etc.). Age at enrollment is preferred, if available.""", ge=-365, le=32507, json_schema_extra = { "linkml_meta": {'domain_of': ['IncludeParticipant'], 'unit': {'ucum_code': 'd'}} }) + subject_id: str = Field(default=..., title="Study ID", description="""INCLUDE Global ID for the Subject""", json_schema_extra = { "linkml_meta": {'domain_of': ['Subject', + 'Demographics', + 'FamilyRelationship', + 'FamilyMember', + 'SubjectAssertion', + 'Encounter', + 'File']} }) + sex: EnumSex = Field(default=..., title="Sex", description="""Sex of Participant""", json_schema_extra = { "linkml_meta": {'domain_of': ['Demographics']} }) + race: list[EnumRace] = Field(default=..., title="Race", description="""Race of Participant""", json_schema_extra = { "linkml_meta": {'domain_of': ['Demographics']} }) + ethnicity: EnumEthnicity = Field(default=..., title="Ethnicity", description="""Ethnicity of Participant""", json_schema_extra = { "linkml_meta": {'domain_of': ['Demographics']} }) + age_at_last_vital_status: Optional[int] = Field(default=None, title="Age at Last Vital Status", description="""Age in days when participant's vital status was last recorded""", ge=-365, le=32507, json_schema_extra = { "linkml_meta": {'domain_of': ['Demographics'], 'unit': {'ucum_code': 'd'}} }) + vital_status: Optional[EnumVitalStatus] = Field(default=None, title="Vital Status", description="""Whether participant is alive or dead""", json_schema_extra = { "linkml_meta": {'domain_of': ['Demographics']} }) + external_id: Optional[list[str]] = Field(default=[], title="External Identifiers", description="""Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record']} }) + access_policy_id: Optional[str] = Field(default=None, title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + study_id: Optional[str] = Field(default=None, title="Study ID", description="""INCLUDE Global ID for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'StudyMetadata']} }) + + +class Family(Record): + """ + A group of individuals of some relation who are grouped together in a study. + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'slot_usage': {'family_id': {'identifier': True, + 'name': 'family_id', + 'range': 'string', + 'required': True}}, + 'title': 'Family'}) + + family_id: str = Field(default=..., title="Family ID", description="""Global ID for the Family""", json_schema_extra = { "linkml_meta": {'domain_of': ['Family', 'FamilyMember']} }) + family_type: Optional[EnumFamilyType] = Field(default=None, description="""Describes the 'type' of study family, eg, trio.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Family']} }) + family_description: Optional[str] = Field(default=None, description="""Free text describing the study family, such as potential inheritance or details about consanguinity""", json_schema_extra = { "linkml_meta": {'domain_of': ['Family']} }) + consanguinity: Optional[EnumConsanguinityAssertion] = Field(default=None, description="""Is there known or suspected consanguinity in this study family?""", json_schema_extra = { "linkml_meta": {'domain_of': ['Family']} }) + family_study_focus: Optional[str] = Field(default=None, description="""The specific focus of the investigation, eg, a condition.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Family']} }) + external_id: Optional[list[str]] = Field(default=[], title="External Identifiers", description="""Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record']} }) + access_policy_id: Optional[str] = Field(default=None, title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + study_id: Optional[str] = Field(default=None, title="Study ID", description="""INCLUDE Global ID for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'StudyMetadata']} }) + + +class FamilyRelationship(Record): + """ + A relationship between two Subjects. Directed as follows + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'slot_usage': {'family_relationship_id': {'identifier': True, + 'name': 'family_relationship_id', + 'range': 'string', + 'required': True}, + 'subject_id': {'description': 'The family member Subject who ' + 'is the relationship "object".', + 'name': 'subject_id', + 'required': True}}, + 'title': 'Family Member Relationship'}) + + family_relationship_id: str = Field(default=..., title="Family Relationship ID", description="""Global ID for the Family Relationship""", json_schema_extra = { "linkml_meta": {'domain_of': ['FamilyRelationship']} }) + family_member_id: str = Field(default=..., description="""The family member Subject who is the relationship \"subject\".""", json_schema_extra = { "linkml_meta": {'domain_of': ['FamilyRelationship']} }) + relationship: str = Field(default=..., description="""Code definting the relationship predicate. Relationship of the \"Family Member\" to the \"Subject\", eg, mother of.""", json_schema_extra = { "linkml_meta": {'domain_of': ['FamilyRelationship']} }) + subject_id: str = Field(default=..., title="Study ID", description="""The family member Subject who is the relationship \"object\".""", json_schema_extra = { "linkml_meta": {'domain_of': ['Subject', + 'Demographics', + 'FamilyRelationship', + 'FamilyMember', + 'SubjectAssertion', + 'Encounter', + 'File']} }) + external_id: Optional[list[str]] = Field(default=[], title="External Identifiers", description="""Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record']} }) + access_policy_id: Optional[str] = Field(default=None, title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + study_id: Optional[str] = Field(default=None, title="Study ID", description="""INCLUDE Global ID for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'StudyMetadata']} }) + + +class FamilyMember(Record): + """ + Designates a Subject as a member of a family with a specified role. + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'slot_usage': {'family_id': {'name': 'family_id', 'required': True}, + 'subject_id': {'name': 'subject_id', 'required': True}}, + 'title': 'Family Member', + 'unique_keys': {'main': {'description': 'Family membership is defined by ' + 'family and subject ids.', + 'unique_key_name': 'main', + 'unique_key_slots': ['family_id', 'subject_id']}}}) + + family_id: str = Field(default=..., title="Family ID", description="""Global ID for the Family""", json_schema_extra = { "linkml_meta": {'domain_of': ['Family', 'FamilyMember']} }) + subject_id: str = Field(default=..., title="Study ID", description="""INCLUDE Global ID for the Subject""", json_schema_extra = { "linkml_meta": {'domain_of': ['Subject', + 'Demographics', + 'FamilyRelationship', + 'FamilyMember', + 'SubjectAssertion', + 'Encounter', + 'File']} }) + family_role: Optional[str] = Field(default=None, description="""The \"role\" of this individual in this family. Could include terms like \"proband\", \"mother\", etc.""", json_schema_extra = { "linkml_meta": {'domain_of': ['FamilyMember']} }) + external_id: Optional[list[str]] = Field(default=[], title="External Identifiers", description="""Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record']} }) + access_policy_id: Optional[str] = Field(default=None, title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + study_id: Optional[str] = Field(default=None, title="Study ID", description="""INCLUDE Global ID for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'StudyMetadata']} }) + + +class SubjectAssertion(Record): + """ + Assertion about a particular Subject. May include Conditions, Measurements, etc. + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'slot_usage': {'assertion_id': {'identifier': True, + 'name': 'assertion_id', + 'range': 'string', + 'required': True}}, + 'title': 'Subject Assertion'}) + + assertion_id: str = Field(default=..., title="Assertion ID", description="""INCLUDE Global ID for the Assertion""", json_schema_extra = { "linkml_meta": {'domain_of': ['SubjectAssertion']} }) + subject_id: Optional[str] = Field(default=None, title="Study ID", description="""INCLUDE Global ID for the Subject""", json_schema_extra = { "linkml_meta": {'domain_of': ['Subject', + 'Demographics', + 'FamilyRelationship', + 'FamilyMember', + 'SubjectAssertion', + 'Encounter', + 'File']} }) + encounter_id: Optional[str] = Field(default=None, title="Encounter ID", description="""Unique identifier for this Encounter.""", json_schema_extra = { "linkml_meta": {'domain_of': ['SubjectAssertion', 'BiospecimenCollection', 'Encounter']} }) + assertion_provenance: Optional[EnumAssertionProvenance] = Field(default=None, title="Assertion Provenance", description="""The original source of this assertion""", json_schema_extra = { "linkml_meta": {'domain_of': ['SubjectAssertion']} }) + age_at_assertion: Optional[int] = Field(default=None, title="Age at assertion", description="""The age in days of the Subject when the assertion was made.""", json_schema_extra = { "linkml_meta": {'domain_of': ['SubjectAssertion'], 'unit': {'ucum_code': 'd'}} }) + age_at_event: Optional[int] = Field(default=None, title="Age at event", description="""The age in days of the Subject at the time point which the assertion describes, eg, age of onset or when a measurement was performed.""", json_schema_extra = { "linkml_meta": {'domain_of': ['SubjectAssertion', 'Encounter'], 'unit': {'ucum_code': 'd'}} }) + age_at_resolution: Optional[int] = Field(default=None, title="Age at resolution", description="""The age in days of the Subject when the asserted state was resolved.""", json_schema_extra = { "linkml_meta": {'domain_of': ['SubjectAssertion'], 'unit': {'ucum_code': 'd'}} }) + concept: Optional[list[str]] = Field(default=[], title="Concept", description="""The structured term defining the meaning of the assertion.""", json_schema_extra = { "linkml_meta": {'domain_of': ['SubjectAssertion']} }) + concept_source: Optional[str] = Field(default=None, title="Concept Source Text", description="""The source text yielding the standardized concept.""", json_schema_extra = { "linkml_meta": {'domain_of': ['SubjectAssertion']} }) + value_concept: Optional[list[str]] = Field(default=[], title="Value concept", description="""The structured term defining the value of the assertion.""", json_schema_extra = { "linkml_meta": {'domain_of': ['SubjectAssertion']} }) + value_number: Optional[float] = Field(default=None, title="Value Number", description="""The numeric value of the assertion.""", json_schema_extra = { "linkml_meta": {'domain_of': ['SubjectAssertion']} }) + value_source: Optional[str] = Field(default=None, title="Value Source Text", description="""The source text yielding the value.""", json_schema_extra = { "linkml_meta": {'domain_of': ['SubjectAssertion']} }) + value_unit: Optional[str] = Field(default=None, title="Value Units", description="""The structured term defining the units of the value.""", json_schema_extra = { "linkml_meta": {'domain_of': ['SubjectAssertion']} }) + value_unit_source: Optional[str] = Field(default=None, title="Value Units Source Text", description="""The source text yielding the value's units.""", json_schema_extra = { "linkml_meta": {'domain_of': ['SubjectAssertion']} }) + external_id: Optional[list[str]] = Field(default=[], title="External Identifiers", description="""Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record']} }) + access_policy_id: Optional[str] = Field(default=None, title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + study_id: Optional[str] = Field(default=None, title="Study ID", description="""INCLUDE Global ID for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'StudyMetadata']} }) + + +class Concept(ConfiguredBaseModel): + """ + A standardized concept with display information. + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'slot_usage': {'concept_curie': {'identifier': True, + 'name': 'concept_curie', + 'required': True}}, + 'title': 'Concept'}) + + concept_curie: str = Field(default=..., title="Concept Curie", description="""The standardized curie for the term.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Concept']} }) + display: Optional[str] = Field(default=None, title="Display String", description="""The friendly display string of the coded term.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Concept']} }) + + +class Sample(Record): + """ + A functionally equivalent specimen taken from a participant or processed from such a sample. + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'slot_usage': {'biospecimen_collection_id': {'description': 'Biospecimen ' + 'Collection ' + 'during which ' + 'this sample was ' + 'generated.', + 'name': 'biospecimen_collection_id'}, + 'sample_id': {'identifier': True, + 'name': 'sample_id', + 'range': 'string', + 'required': True}}, + 'title': 'Sample'}) + + sample_id: str = Field(default=..., title="Sample ID", description="""The unique identifier for this Sample.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Sample', 'Aliquot', 'File']} }) + biospecimen_collection_id: Optional[str] = Field(default=None, title="Biospecimen Collection ID", description="""Biospecimen Collection during which this sample was generated.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Sample', 'BiospecimenCollection']} }) + parent_sample_id: Optional[str] = Field(default=None, title="Parent Sample ID", description="""Sample from which this sample is derived""", json_schema_extra = { "linkml_meta": {'domain_of': ['Sample']} }) + sample_type: str = Field(default=..., title="Sample Type", description="""Type of material of which this Sample is comprised. UBERON is recommended.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Sample']} }) + processing: Optional[list[str]] = Field(default=[], title="Sample Processing", description="""Processing that was applied to the Parent Sample or from the Biospecimen Collection that yielded this distinct sample. OBI is recommended.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Sample']} }) + availablity_status: Optional[EnumAvailabilityStatus] = Field(default=None, title="Sample Availability", description="""Can this Sample be requested for further analysis?""", json_schema_extra = { "linkml_meta": {'domain_of': ['Sample', 'Aliquot']} }) + storage_method: Optional[list[str]] = Field(default=[], title="Sample Storage Method", description="""Sample storage method, eg, Frozen or with additives. OBI may be suitable, or ChEBI for additives.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Sample']} }) + quantity_number: Optional[float] = Field(default=None, title="Quantity", description="""The total quantity of the specimen""", json_schema_extra = { "linkml_meta": {'domain_of': ['Sample', 'Aliquot']} }) + quantity_unit: Optional[str] = Field(default=None, title="Quantity Units", description="""The structured term defining the units of the quantity.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Sample', 'Aliquot']} }) + external_id: Optional[list[str]] = Field(default=[], title="External Identifiers", description="""Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record']} }) + access_policy_id: Optional[str] = Field(default=None, title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + study_id: Optional[str] = Field(default=None, title="Study ID", description="""INCLUDE Global ID for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'StudyMetadata']} }) + + +class BiospecimenCollection(Record): + """ + A biospecimen collection event which yields one or more Samples. + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'slot_usage': {'biospecimen_collection_id': {'identifier': True, + 'name': 'biospecimen_collection_id', + 'range': 'string', + 'required': True}}, + 'title': 'BiospecimenCollection'}) + + biospecimen_collection_id: str = Field(default=..., title="Biospecimen Collection ID", description="""Unique identifier for this Biospecimen Collection.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Sample', 'BiospecimenCollection']} }) + age_at_collection: Optional[float] = Field(default=None, title="Age at Biospecimen Collection", description="""The age at which this biospecimen was collected in decimal years.""", json_schema_extra = { "linkml_meta": {'domain_of': ['BiospecimenCollection'], 'unit': {'ucum_code': 'a'}} }) + method: Optional[EnumSampleCollectionMethod] = Field(default=None, title="Biospecimen Collection Method", description="""The approach used to collect the biospecimen.""", json_schema_extra = { "linkml_meta": {'domain_of': ['BiospecimenCollection']} }) + site: Optional[EnumSite] = Field(default=None, title="Biospecimen Collection Site", description="""The location of the specimen collection.""", json_schema_extra = { "linkml_meta": {'domain_of': ['BiospecimenCollection']} }) + spatial_qualifier: Optional[EnumSpatialQualifiers] = Field(default=None, title="Spatial Qualifier", description="""Qualifier that further refine the specific location of biospecimen collection""", json_schema_extra = { "linkml_meta": {'domain_of': ['BiospecimenCollection']} }) + laterality: Optional[EnumLaterality] = Field(default=None, title="Location Laterality", description="""Laterality that further refine the specific location of biospecimen collection""", json_schema_extra = { "linkml_meta": {'domain_of': ['BiospecimenCollection']} }) + encounter_id: Optional[str] = Field(default=None, title="Encounter ID", description="""Unique identifier for this Encounter.""", json_schema_extra = { "linkml_meta": {'domain_of': ['SubjectAssertion', 'BiospecimenCollection', 'Encounter']} }) + external_id: Optional[list[str]] = Field(default=[], title="External Identifiers", description="""Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record']} }) + access_policy_id: Optional[str] = Field(default=None, title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + study_id: Optional[str] = Field(default=None, title="Study ID", description="""INCLUDE Global ID for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'StudyMetadata']} }) + + +class Aliquot(Record): + """ + A specific tube or amount of a biospecimen associated with a Sample. + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'slot_usage': {'aliquot_id': {'identifier': True, + 'name': 'aliquot_id', + 'range': 'string', + 'required': True}}, + 'title': 'Aliquot'}) + + aliquot_id: str = Field(default=..., title="Aliquot ID", description="""Unique identifier for an Aliquot.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Aliquot']} }) + sample_id: Optional[str] = Field(default=None, title="Sample ID", description="""The unique identifier for this Sample.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Sample', 'Aliquot', 'File']} }) + availablity_status: Optional[EnumAvailabilityStatus] = Field(default=None, title="Sample Availability", description="""Can this Sample be requested for further analysis?""", json_schema_extra = { "linkml_meta": {'domain_of': ['Sample', 'Aliquot']} }) + quantity_number: Optional[float] = Field(default=None, title="Quantity", description="""The total quantity of the specimen""", json_schema_extra = { "linkml_meta": {'domain_of': ['Sample', 'Aliquot']} }) + quantity_unit: Optional[str] = Field(default=None, title="Quantity Units", description="""The structured term defining the units of the quantity.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Sample', 'Aliquot']} }) + concentration_number: Optional[float] = Field(default=None, title="Concentration", description="""What is the concentration of the analyte in the Aliquot?""", json_schema_extra = { "linkml_meta": {'domain_of': ['Aliquot']} }) + concentration_unit: Optional[str] = Field(default=None, title="Concentration Units", description="""Units associated with the concentration of the analyte in the Aliquot.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Aliquot']} }) + external_id: Optional[list[str]] = Field(default=[], title="External Identifiers", description="""Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record']} }) + access_policy_id: Optional[str] = Field(default=None, title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + study_id: Optional[str] = Field(default=None, title="Study ID", description="""INCLUDE Global ID for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'StudyMetadata']} }) + + +class Encounter(Record): + """ + An event at which data was collected about a participant, an intervention was made, or information about a participant was recorded. + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'slot_usage': {'encounter_id': {'identifier': True, + 'name': 'encounter_id', + 'range': 'string', + 'required': True}}, + 'title': 'Participant Encounter'}) + + encounter_id: str = Field(default=..., title="Encounter ID", description="""Unique identifier for this Encounter.""", json_schema_extra = { "linkml_meta": {'domain_of': ['SubjectAssertion', 'BiospecimenCollection', 'Encounter']} }) + subject_id: Optional[str] = Field(default=None, title="Study ID", description="""INCLUDE Global ID for the Subject""", json_schema_extra = { "linkml_meta": {'domain_of': ['Subject', + 'Demographics', + 'FamilyRelationship', + 'FamilyMember', + 'SubjectAssertion', + 'Encounter', + 'File']} }) + encounter_definition_id: Optional[str] = Field(default=None, title="Encounter Definition ID", description="""Unique identifier for this Encounter Definition.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Encounter', 'EncounterDefinition']} }) + age_at_event: Optional[int] = Field(default=None, title="Age at event", description="""The age in days of the Subject at the time point which the assertion describes, eg, age of onset or when a measurement was performed.""", json_schema_extra = { "linkml_meta": {'domain_of': ['SubjectAssertion', 'Encounter'], 'unit': {'ucum_code': 'd'}} }) + external_id: Optional[list[str]] = Field(default=[], title="External Identifiers", description="""Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record']} }) + access_policy_id: Optional[str] = Field(default=None, title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + study_id: Optional[str] = Field(default=None, title="Study ID", description="""INCLUDE Global ID for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'StudyMetadata']} }) + + +class EncounterDefinition(Record): + """ + A definition of an encounter type in this study, ie, an event at which data was collected about a participant, an intervention was made, or information about a participant was recorded. This may be something planned by a study or a type of data collection. + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'slot_usage': {'activity_definition_id': {'multivalued': True, + 'name': 'activity_definition_id'}, + 'encounter_definition_id': {'identifier': True, + 'name': 'encounter_definition_id', + 'range': 'string', + 'required': True}}, + 'title': 'Encounter Definition'}) + + encounter_definition_id: str = Field(default=..., title="Encounter Definition ID", description="""Unique identifier for this Encounter Definition.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Encounter', 'EncounterDefinition']} }) + name: Optional[str] = Field(default=None, title="Name", description="""Name of the entity.""", json_schema_extra = { "linkml_meta": {'domain_of': ['VirtualBiorepository', + 'Investigator', + 'EncounterDefinition', + 'ActivityDefinition', + 'Dataset']} }) + description: Optional[str] = Field(default=None, title="Description", description="""Description for this entity.""", json_schema_extra = { "linkml_meta": {'domain_of': ['EncounterDefinition', 'ActivityDefinition', 'Dataset']} }) + activity_definition_id: Optional[list[str]] = Field(default=[], title="Activity Definition ID", description="""Unique identifier for this Activity Definition.""", json_schema_extra = { "linkml_meta": {'domain_of': ['EncounterDefinition', 'ActivityDefinition']} }) + external_id: Optional[list[str]] = Field(default=[], title="External Identifiers", description="""Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record']} }) + access_policy_id: Optional[str] = Field(default=None, title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + study_id: Optional[str] = Field(default=None, title="Study ID", description="""INCLUDE Global ID for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'StudyMetadata']} }) + + +class ActivityDefinition(Record): + """ + A definition of an activity in this study, eg, a biospecimen collection, intervention, survey, or assessment. + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'slot_usage': {'activity_definition_id': {'identifier': True, + 'name': 'activity_definition_id', + 'range': 'string', + 'required': True}}, + 'title': 'Activity Definition'}) + + activity_definition_id: str = Field(default=..., title="Activity Definition ID", description="""Unique identifier for this Activity Definition.""", json_schema_extra = { "linkml_meta": {'domain_of': ['EncounterDefinition', 'ActivityDefinition']} }) + name: Optional[str] = Field(default=None, title="Name", description="""Name of the entity.""", json_schema_extra = { "linkml_meta": {'domain_of': ['VirtualBiorepository', + 'Investigator', + 'EncounterDefinition', + 'ActivityDefinition', + 'Dataset']} }) + description: Optional[str] = Field(default=None, title="Description", description="""Description for this entity.""", json_schema_extra = { "linkml_meta": {'domain_of': ['EncounterDefinition', 'ActivityDefinition', 'Dataset']} }) + external_id: Optional[list[str]] = Field(default=[], title="External Identifiers", description="""Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record']} }) + access_policy_id: Optional[str] = Field(default=None, title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + study_id: Optional[str] = Field(default=None, title="Study ID", description="""INCLUDE Global ID for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'StudyMetadata']} }) + + +class File(Record): + """ + File + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'slot_usage': {'file_id': {'identifier': True, + 'name': 'file_id', + 'range': 'string', + 'required': True}, + 'sample_id': {'multivalued': True, 'name': 'sample_id'}, + 'subject_id': {'multivalued': True, 'name': 'subject_id'}}, + 'title': 'File'}) + + file_id: str = Field(default=..., title="File ID", description="""Unique identifier for this File.""", json_schema_extra = { "linkml_meta": {'domain_of': ['File', 'Dataset']} }) + subject_id: Optional[list[str]] = Field(default=[], title="Study ID", description="""INCLUDE Global ID for the Subject""", json_schema_extra = { "linkml_meta": {'domain_of': ['Subject', + 'Demographics', + 'FamilyRelationship', + 'FamilyMember', + 'SubjectAssertion', + 'Encounter', + 'File']} }) + sample_id: Optional[list[str]] = Field(default=[], title="Sample ID", description="""The unique identifier for this Sample.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Sample', 'Aliquot', 'File']} }) + filename: Optional[str] = Field(default=None, title="Filename", description="""The name of the file.""", json_schema_extra = { "linkml_meta": {'domain_of': ['File']} }) + format: Optional[EnumEDAMFormats] = Field(default=None, title="File Format", description="""The format of the file.""", json_schema_extra = { "linkml_meta": {'domain_of': ['File']} }) + data_category: Optional[EnumDataCategory] = Field(default=None, title="Data Category", description="""General category of data in this Record (e.g. Clinical, Genomics, etc)""", json_schema_extra = { "linkml_meta": {'domain_of': ['StudyMetadata', 'File']} }) + data_type: Optional[EnumEDAMDataTypes] = Field(default=None, title="Data Type", description="""The type of data within this file.""", json_schema_extra = { "linkml_meta": {'domain_of': ['File']} }) + size: Optional[int] = Field(default=None, title="File Size", description="""Size of the file, in Bytes.""", json_schema_extra = { "linkml_meta": {'domain_of': ['File'], 'unit': {'ucum_code': 'By'}} }) + staging_url: Optional[str] = Field(default=None, title="Staging Location", description="""URL for internal access to the data. May be temporary.""", json_schema_extra = { "linkml_meta": {'domain_of': ['File']} }) + release_url: Optional[str] = Field(default=None, title="Release Location", description="""URL for controlled or open access to the data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['File']} }) + drs_uri: Optional[str] = Field(default=None, title="DRS URI", description="""DRS location to access the data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['File']} }) + hash: Optional[FileHash] = Field(default=None, title="File Hash", description="""File hash information""", json_schema_extra = { "linkml_meta": {'domain_of': ['File']} }) + external_id: Optional[list[str]] = Field(default=[], title="External Identifiers", description="""Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record']} }) + access_policy_id: Optional[str] = Field(default=None, title="Access Policy ID", description="""Global identifier for the access policy that applies to this row of data.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'AccessPolicy']} }) + study_id: Optional[str] = Field(default=None, title="Study ID", description="""INCLUDE Global ID for the study""", json_schema_extra = { "linkml_meta": {'domain_of': ['Record', 'StudyMetadata']} }) + + +class FileHash(ConfiguredBaseModel): + """ + Type and value of a file content hash. + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'title': 'File Hash'}) + + hash_type: Optional[EnumFileHashType] = Field(default=None, title="File Hash Type", description="""The type of file hash, eg, md5""", json_schema_extra = { "linkml_meta": {'domain_of': ['FileHash']} }) + hash_value: Optional[str] = Field(default=None, title="File Hash Value", description="""The value of the file hash""", json_schema_extra = { "linkml_meta": {'domain_of': ['FileHash']} }) + + +class Dataset(ConfiguredBaseModel): + """ + Set of files grouped together for release. + """ + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/common-access-model', + 'slot_usage': {'dataset_id': {'identifier': True, + 'name': 'dataset_id', + 'range': 'string', + 'required': True}, + 'file_id': {'description': 'The list of files comprising this ' + 'dataset.', + 'multivalued': True, + 'name': 'file_id'}}, + 'title': 'Dataset'}) + + dataset_id: str = Field(default=..., title="Dataset ID", description="""Unique identifier for a Dataset.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Dataset']} }) + name: Optional[str] = Field(default=None, title="Name", description="""Name of the entity.""", json_schema_extra = { "linkml_meta": {'domain_of': ['VirtualBiorepository', + 'Investigator', + 'EncounterDefinition', + 'ActivityDefinition', + 'Dataset']} }) + description: Optional[str] = Field(default=None, title="Description", description="""Description for this entity.""", json_schema_extra = { "linkml_meta": {'domain_of': ['EncounterDefinition', 'ActivityDefinition', 'Dataset']} }) + do_id: Optional[str] = Field(default=None, title="DOI", description="""Digital Object Identifier (DOI) for this Record.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Study', 'DOI', 'Dataset']} }) + file_id: Optional[list[str]] = Field(default=[], title="File ID", description="""The list of files comprising this dataset.""", json_schema_extra = { "linkml_meta": {'domain_of': ['File', 'Dataset']} }) + publication: Optional[list[Publication]] = Field(default=[], title="Publication", description="""Publications associated with this Record.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Study', 'Dataset']} }) + data_collection_start: Optional[str] = Field(default=None, title="Data Collection Start", description="""The date that data collection started. May include only a year.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Dataset']} }) + data_collection_end: Optional[str] = Field(default=None, title="Data Collection End", description="""The date that data collection started. May include only a year.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Dataset']} }) + + +# Model rebuild +# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model +Record.model_rebuild() +AccessPolicy.model_rebuild() +Study.model_rebuild() +StudyMetadata.model_rebuild() +VirtualBiorepository.model_rebuild() +DOI.model_rebuild() +Investigator.model_rebuild() +Publication.model_rebuild() +Subject.model_rebuild() +Demographics.model_rebuild() +IncludeParticipant.model_rebuild() +Family.model_rebuild() +FamilyRelationship.model_rebuild() +FamilyMember.model_rebuild() +SubjectAssertion.model_rebuild() +Concept.model_rebuild() +Sample.model_rebuild() +BiospecimenCollection.model_rebuild() +Aliquot.model_rebuild() +Encounter.model_rebuild() +EncounterDefinition.model_rebuild() +ActivityDefinition.model_rebuild() +File.model_rebuild() +FileHash.model_rebuild() +Dataset.model_rebuild() diff --git a/src/include_access_model/schema/README.md b/src/common_access_model/schema/README.md similarity index 100% rename from src/include_access_model/schema/README.md rename to src/common_access_model/schema/README.md diff --git a/src/common_access_model/schema/common_access_model.yaml b/src/common_access_model/schema/common_access_model.yaml new file mode 100644 index 0000000..6023268 --- /dev/null +++ b/src/common_access_model/schema/common_access_model.yaml @@ -0,0 +1,1349 @@ +--- +id: https://includedcc.org/common-access-model +name: common-access-model +title: Common Access Model +description: LinkML Schema for the Common Access Model +license: MIT +see_also: + - https://includedcc.github.io/common-access-model + +prefixes: + cam: https://includedcc.org/common-access-model/ + linkml: https://w3id.org/linkml/ + schema: http://schema.org/ + # subset of CDC Race and Ethnicity Code Set Version 1.0 + cdc_race_eth: urn:oid:2.16.840.1.113883.6.238/ + hl7_null: http://terminology.hl7.org/CodeSystem/v3-NullFlavor/ + ig_dob_method: https://nih-ncpi.github.io/ncpi-fhir-ig-2/CodeSystem/research-data-date-of-birth-method/ + igcondtype: https://nih-ncpi.github.io/ncpi-fhir-ig-2/CodeSystem/condition-type/ + ig2dac: https://nih-ncpi.github.io/ncpi-fhir-ig-2/CodeSystem/research-data-access-code/ + ig2dat: https://nih-ncpi.github.io/ncpi-fhir-ig-2/CodeSystem/research-data-access-type/ + ig2_biospecimen_availability: https://nih-ncpi.github.io/ncpi-fhir-ig-2/CodeSystem/biospecimen-availability/ + snomed_ct: http://snomed.info/id/ + MONDO: http://purl.obolibrary.org/obo/MONDO_ + HP: http://purl.obolibrary.org/obo/HP_ + mesh: http://id.nlm.nih.gov/mesh/ + NCIT: http://purl.obolibrary.org/obo/NCIT_ + PATO: http://purl.obolibrary.org/obo/PATO_ + DUO: http://purl.obolibrary.org/obo/DUO_ + +default_prefix: cam +default_range: string + +imports: + - linkml:types + +classes: + Record: + description: One row / entity within the database + title: Record + abstract: true + slots: + - external_id + - access_policy_id + - study_id + AccessPolicy: + title: Access Policy + description: The access policy that describes the controls around use of data + slots: + - access_policy_id + - data_use_accession + - data_use_permission + - data_use_modifier + - disease_limitation + - access_description + - website + slot_usage: + access_policy_id: + range: string + required: true + identifier: true + Study: + title: Research Study + description: Study Metadata + is_a: Record + slots: + #TODO: Split out core Study items and additional study metadata? + #- study_id Inherits study_id from Record now. + - parent_study + - study_title + - study_code + - study_short_name + - program + - funding_source + - principal_investigator + - contact + - study_description + - website + # - dbgap : Should we call this out specifically or just use an external id? + - publication + - acknowledgments + - citation_statement + - do_id + slot_usage: + study_id: + range: string + required: true + identifier: true + StudyMetadata: + title: Study Metadata + description: Additional features about studies that may not apply to all studies + is_a: Record + slots: + - study_id + - participant_lifespan_stage + - selection_criteria + - study_design + - clinical_data_source_type + - data_category + - vbr_id + - research_domain + - expected_number_of_participants + - actual_number_of_participants + # Do we need this info, or should it be documented elsewhere? + #- guidType + #- guidMapped + slot_usage: + study_id: + required: true + identifier: true + data_category: + required: true + multivalued: true + + VirtualBiorepository: + title: Virtual BioRepository (VBR) + description: An organization that can provide access to specimen for further analysis. + is_a: Record + slots: + - vbr_id + - name + - institution + - contact + - website + - vbr_readme + slot_usage: + vbr_id: + range: string + required: true + identifier: true + + DOI: + title: Digital Object Identifier (DOI) + description: A DOI is a permanent reference with metadata about a digital object. + is_a: Record + slots: + - do_id + - bibliographic_reference + slot_usage: + do_id: + range: string + required: true + identifier: true + Investigator: + title: Investigator + description: An individual who made contributions to the collection, analysis, or sharing of data. + is_a: Record + slots: + - name + - institution + # - orcid : Should we call this out specifically or just use an external id? + - investigator_title + - email + Publication: + title: Publication + description: Information about a specific publication. + is_a: Record + #Could add more here + slots: + - bibliographic_reference + - website + Subject: + title: Subject + description: This entity is the subject about which data or references are recorded. + This includes the idea of a human participant in a study, a cell line, an animal model, + or any other similar entity. + is_a: Record + slots: + - subject_id + - subject_type + - organism_type + slot_usage: + subject_id: + range: string + required: true + identifier: true + Demographics: + title: Demographics + description: Basic participant demographics summary + is_a: Record + slots: + - subject_id + - sex + - race + - ethnicity + - age_at_last_vital_status + - vital_status + slot_usage: + subject_id: + required: true + identifier: true + IncludeParticipant: + title: INCLUDE Participant + description: Information specific to INCLUDE participants + is_a: Demographics + slots: + - down_syndrome_status + - age_at_first_engagement + Family: + title: Family + description: A group of individuals of some relation who are grouped together in a study. + is_a: Record + slots: + - family_id + - family_type + - family_description + - consanguinity + - family_study_focus + slot_usage: + family_id: + range: string + required: true + identifier: true + FamilyRelationship: + title: Family Member Relationship + description: A relationship between two Subjects. Directed as follows + + + is_a: Record + slots: + - family_relationship_id + - family_member_id + - relationship + - subject_id + slot_usage: + family_relationship_id: + range: string + required: true + identifier: true + subject_id: + required: true + description: The family member Subject who is the relationship "object". + FamilyMember: + title: Family Member + description: Designates a Subject as a member of a family with a specified role. + is_a: Record + slots: + - family_id + - subject_id + - family_role + unique_keys: + main: + description: Family membership is defined by family and subject ids. + unique_key_slots: + - family_id + - subject_id + slot_usage: + family_id: + required: true + subject_id: + required: true + SubjectAssertion: + title: Subject Assertion + description: Assertion about a particular Subject. May include Conditions, Measurements, etc. + is_a: Record + slots: + - assertion_id + - subject_id + - encounter_id + - assertion_provenance + - age_at_assertion + - age_at_event + - age_at_resolution + - concept + - concept_source + - value_concept + - value_number + - value_source + - value_unit + - value_unit_source + slot_usage: + assertion_id: + range: string + required: true + identifier: true + Concept: + title: Concept + description: A standardized concept with display information. + slots: + - concept_curie + - display + slot_usage: + concept_curie: + required: true + identifier: true + Sample: + title: Sample + description: A functionally equivalent specimen taken from a participant or processed from such a sample. + is_a: Record + slots: + - sample_id + - biospecimen_collection_id + - parent_sample_id + - sample_type + - processing + - availablity_status + - storage_method + - quantity_number + - quantity_unit + slot_usage: + sample_id: + range: string + required: true + identifier: true + biospecimen_collection_id: + description: Biospecimen Collection during which this sample was generated. + BiospecimenCollection: + title: BiospecimenCollection + description: A biospecimen collection event which yields one or more Samples. + is_a: Record + slots: + - biospecimen_collection_id + - age_at_collection + - method + - site + - spatial_qualifier + - laterality + - encounter_id + slot_usage: + biospecimen_collection_id: + range: string + required: true + identifier: true + Aliquot: + title: Aliquot + description: A specific tube or amount of a biospecimen associated with a Sample. + is_a: Record + slots: + - aliquot_id + - sample_id + - availablity_status + - quantity_number + - quantity_unit + - concentration_number + - concentration_unit + slot_usage: + aliquot_id: + range: string + required: true + identifier: true + Encounter: + title: Participant Encounter + description: An event at which data was collected about a participant, + an intervention was made, or information about a participant was recorded. + is_a: Record + slots: + - encounter_id + - subject_id + #TODO: Should this alternatively be an "encounter type", ie, to not require a full definition? + - encounter_definition_id + - age_at_event + slot_usage: + encounter_id: + range: string + required: true + identifier: true + EncounterDefinition: + title: Encounter Definition + description: A definition of an encounter type in this study, ie, + an event at which data was collected about a participant, + an intervention was made, or information about a participant was recorded. + This may be something planned by a study or a type of data collection. + #TODO: These are metadata and may not need the same Record basis. + is_a: Record + slots: + - encounter_definition_id + - name + - description + - activity_definition_id + slot_usage: + encounter_definition_id: + range: string + required: true + identifier: true + activity_definition_id: + multivalued: true + ActivityDefinition: + title: Activity Definition + description: A definition of an activity in this study, eg, + a biospecimen collection, intervention, survey, or assessment. + #TODO: These are metadata and may not need the same Record basis. + is_a: Record + slots: + - activity_definition_id + - name + - description + #TODO: Probably want an "expected data generated" slot, eg, + #observation definitions or dd refs + slot_usage: + activity_definition_id: + range: string + required: true + identifier: true + File: + title: File + description: File + is_a: Record + slots: + - file_id + - subject_id + - sample_id + - filename + - format + - data_category + - data_type + - format + - size + #TODO: I'm not convinced this is the right strategy- access model vs operations + - staging_url + - release_url + - drs_uri + - hash + slot_usage: + file_id: + range: string + required: true + identifier: true + subject_id: + multivalued: true + sample_id: + multivalued: true + FileHash: + title: File Hash + description: Type and value of a file content hash. + slots: + - hash_type + - hash_value + Dataset: + title: Dataset + description: Set of files grouped together for release. + slots: + - dataset_id + - name + - description + - do_id + - file_id + - publication + #TODO: Are these good elements for the core entity? + - data_collection_start + - data_collection_end + + slot_usage: + dataset_id: + range: string + required: true + identifier: true + file_id: + multivalued: true + description: The list of files comprising this dataset. + + +slots: + study_id: + title: Study ID + description: INCLUDE Global ID for the study + range: Study + multivalued: false + access_policy_id: + title: Access Policy ID + description: Global identifier for the access policy that applies to + this row of data. + range: AccessPolicy + data_use_accession: + title: Data Use Accession + description: Accession used to provision access to the record, eg, + a dbGaP phsID. + range: uriorcurie + data_use_permission: + title: Data Use Permission + description: Broad category of restrictions on data use. + range: EnumDataUsePermission + required: true + data_use_modifier: + title: Data Use Modifier + description: Additional modifiers that limit data use. + range: EnumDataUseModifier + disease_limitation: + title: Data Use Disease Limitation + description: If the access is limited to a specific disease purpose, + it is specified here. + range: string + access_description: + title: Access Description + description: Any additional information to support access requests. + range: string + do_id: + title: DOI + description: Digital Object Identifier (DOI) for this Record. + range: DOI + multivalued: false + subject_id: + title: Study ID + description: INCLUDE Global ID for the Subject + range: Subject + multivalued: false + assertion_id: + title: Assertion ID + description: INCLUDE Global ID for the Assertion + range: SubjectAssertion + multivalued: false + external_id: + title: External Identifiers + description: Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP + required: false + range: uriorcurie + multivalued: true + parent_study: + title: Parent Study + description: The parent study for this study, if it is a nested study. + required: false + range: Study + multivalued: false + funding_source: + title: Funding Source + description: The funding source(s) of the study. + required: false + range: string + multivalued: true + principal_investigator: + title: Principal Investigator + description: The Principal Investigator(s) responsible for the study. + required: true + range: Investigator + multivalued: true + study_title: + description: Full Study Title + required: true + range: string + multivalued: false + study_code: + description: Unique identifier for the study (generally a short acronym) + title: Study Code + range: string + required: true + study_short_name: + title: Study Code + description: Short name for the study + range: string + required: false + investigator_title: + title: Investigator Title + description: The title of the Investigator, eg, "Assistant Professor" + range: string + required: false + name: + title: Name + description: Name of the entity. + range: string + required: false + email: + title: Email Address + description: An email address to reach the entity. + range: string + required: false + institution: + title: Institution + description: Name of the institution this record is associated with. + range: string + required: false + program: + title: Program + description: Funding source(s) for the study + range: EnumProgram + required: true + multivalued: true + study_description: + title: Study Description + description: Brief description of the study (2-4 sentences) + range: string + required: true + website: + title: Website + description: Website with more information about this entity. + range: uri + contact: + title: Contact Person + description: The individual to contact with questions about this record. + required: true + range: Investigator + multivalued: true + vbr_id: + title: Virtual Biorepository + description: Information about the study's Virtual Biorepository, if participating + range: VirtualBiorepository + vbr_readme: + title: VBR Readme + description: Instructions for contacting or requesting samples from Virtual Biorepository, if participating + range: string + research_domain: + description: Main research domain(s) of the study, other than Down syndrome + range: EnumResearchDomain + required: true + multivalued: true + participant_lifespan_stage: + title: Participant Lifespan Stage + description: Focus age group(s) of the study population + range: EnumParticipantLifespanStage + required: true + multivalued: true + selection_criteria: + title: Selection Criteria + description: Brief description of inclusion and/or exclusion criteria for the study + range: string + study_design: + title: Study Design + description: Overall design of study, including whether it is longitudinal and whether family members/unrelated controls are also enrolled + range: EnumStudyDesign + required: true + multivalued: true + data_category: + title: Data Category + description: General category of data in this Record (e.g. Clinical, Genomics, etc) + range: EnumDataCategory + clinical_data_source_type: + title: Clinical Data Source Type + description: Source(s) of data collected from study participants + range: EnumClinicalDataSourceType + required: true + multivalued: true + publication: + title: Publication + description: Publications associated with this Record. + range: Publication + multivalued: true + expected_number_of_participants: + title: Expected Number of Participants + description: Total expected number of participants to be recruited. + range: integer + required: true + actual_number_of_participants: + title: Actual Number of Participants + description: Total participants included at this time. + range: integer + required: true + acknowledgments: + title: Acknowledgments + description: Funding statement and acknowledgments for this study + range: string + citation_statement: + title: Citation Statement + description: Statement that secondary data users should use to acknowledge use of this study or dataset. E.g., + "The results analyzed and here are based in whole or in part upon data generated by the INCLUDE + (INvestigation of Co-occurring conditions across the Lifespan to Understand Down syndromE) Project , and were accessed from the INCLUDE Data Hub and ." + range: string + bibliographic_reference: + title: Bibiliographic Reference + description: Text use to reference this Record. + range: string + organism_type: + title: Organism Type + description: Organism Type, typically from NCBITaxon. For reference, Human is NCBITaxon:9606. + range: uriorcurie + subject_type: + title: Subject Type + description: Type of entity this record represents + required: true + range: EnumSubjectType + sex: + title: Sex + description: Sex of Participant + range: EnumSex + required: true + race: + title: Race + description: Race of Participant + range: EnumRace + required: true + multivalued: true + ethnicity: + title: Ethnicity + description: Ethnicity of Participant + range: EnumEthnicity + required: true + down_syndrome_status: + title: Down Syndrome Status + description: Down Syndrome status of participant + range: EnumDownSyndromeStatus + required: true + age_at_first_engagement: + #Should this just be a reference out to an encounter? + title: Age at First Participant Engagement + description: Age in days of Participant at first recorded study event (enrollment, visit, observation, + sample collection, survey completion, etc.). Age at enrollment is preferred, if available. + range: integer + unit: + ucum_code: d + #Range -1 year to 89*365.25 (Privacy upper bound for ages over 89 years) + minimum_value: -365 + maximum_value: 32507 + vital_status: + title: Vital Status + description: Whether participant is alive or dead + range: EnumVitalStatus + age_at_last_vital_status: + title: Age at Last Vital Status + description: Age in days when participant's vital status was last recorded + range: integer + unit: + ucum_code: d + minimum_value: -365 + maximum_value: 32507 + family_id: + title: Family ID + description: Global ID for the Family + range: Family + family_type: + description: Describes the 'type' of study family, eg, trio. + range: EnumFamilyType + family_description: + description: Free text describing the study family, such as potential + inheritance or details about consanguinity + range: string + consanguinity: + description: Is there known or suspected consanguinity in this study family? + range: EnumConsanguinityAssertion + family_study_focus: + description: The specific focus of the investigation, eg, a condition. + range: uriorcurie + family_relationship_id: + title: Family Relationship ID + description: Global ID for the Family Relationship + range: FamilyRelationship + family_member_id: + description: The family member Subject who is the relationship "subject". + required: true + range: Subject + inlined: false + relationship: + description: Code definting the relationship predicate. Relationship of the "Family Member" + to the "Subject", eg, mother of. + required: true + range: uriorcurie + family_role: + description: The "role" of this individual in this family. Could include terms like "proband", "mother", etc. + range: uriorcurie + assertion_provenance: + title: Assertion Provenance + description: The original source of this assertion + range: EnumAssertionProvenance + age_at_assertion: + title: Age at assertion + description: The age in days of the Subject when the assertion was made. + range: integer + unit: + ucum_code: d + age_at_event: + title: Age at event + description: The age in days of the Subject at the time point which the assertion describes, + eg, age of onset or when a measurement was performed. + range: integer + unit: + ucum_code: d + age_at_resolution: + title: Age at resolution + description: The age in days of the Subject when the asserted state was resolved. + range: integer + unit: + ucum_code: d + concept: + title: Concept + description: The structured term defining the meaning of the assertion. + range: Concept + multivalued: true + concept_curie: + title: Concept Curie + description: The standardized curie for the term. + range: uriorcurie + display: + title: Display String + description: The friendly display string of the coded term. + range: string + concept_source: + title: Concept Source Text + description: The source text yielding the standardized concept. + range: string + value_concept: + title: Value concept + description: The structured term defining the value of the assertion. + range: Concept + multivalued: true + value_number: + title: Value Number + description: The numeric value of the assertion. + range: float + value_source: + title: Value Source Text + description: The source text yielding the value. + range: string + value_unit: + title: Value Units + description: The structured term defining the units of the value. + range: Concept + value_unit_source: + title: Value Units Source Text + description: The source text yielding the value's units. + range: string + sample_id: + title: Sample ID + description: The unique identifier for this Sample. + range: Sample + parent_sample_id: + title: Parent Sample ID + description: Sample from which this sample is derived + range: Sample + inlined: false + biospecimen_collection_id: + title: Biospecimen Collection ID + description: Unique identifier for this Biospecimen Collection. + range: BiospecimenCollection + aliquot_id: + title: Aliquot ID + description: Unique identifier for an Aliquot. + range: Aliquot + sample_type: + title: Sample Type + description: Type of material of which this Sample is comprised. UBERON is recommended. + required: true + range: uriorcurie + processing: + title: Sample Processing + description: Processing that was applied to the Parent Sample or from the Biospecimen Collection that yielded + this distinct sample. OBI is recommended. + range: uriorcurie + multivalued: true + availablity_status: + title: Sample Availability + description: Can this Sample be requested for further analysis? + range: EnumAvailabilityStatus + storage_method: + title: Sample Storage Method + description: Sample storage method, eg, Frozen or with additives. OBI may be suitable, or ChEBI for additives. + range: uriorcurie + multivalued: true + quantity_number: + title: Quantity + description: The total quantity of the specimen + range: float + quantity_unit: + title: Quantity Units + description: The structured term defining the units of the quantity. + range: Concept + concentration_number: + title: Concentration + description: What is the concentration of the analyte in the Aliquot? + range: float + concentration_unit: + title: Concentration Units + description: Units associated with the concentration of the analyte in the Aliquot. + range: Concept + age_at_collection: + title: Age at Biospecimen Collection + description: The age at which this biospecimen was collected in decimal years. + range: float + unit: + ucum_code: a + method: + title: Biospecimen Collection Method + description: The approach used to collect the biospecimen. + range: EnumSampleCollectionMethod + site: + title: Biospecimen Collection Site + description: The location of the specimen collection. + range: EnumSite + spatial_qualifier: + title: Spatial Qualifier + description: Qualifier that further refine the specific location of biospecimen collection + range: EnumSpatialQualifiers + laterality: + title: Location Laterality + description: Laterality that further refine the specific location of biospecimen collection + range: EnumLaterality + encounter_id: + title: Encounter ID + description: Unique identifier for this Encounter. + range: Encounter + description: + title: Description + description: Description for this entity. + range: string + encounter_definition_id: + title: Encounter Definition ID + description: Unique identifier for this Encounter Definition. + range: EncounterDefinition + activity_definition_id: + title: Activity Definition ID + description: Unique identifier for this Activity Definition. + range: ActivityDefinition + file_id: + title: File ID + description: Unique identifier for this File. + range: File + filename: + title: Filename + description: The name of the file. + range: string + format: + title: File Format + description: The format of the file. + range: EnumEDAMFormats + data_type: + title: Data Type + description: The type of data within this file. + range: EnumEDAMDataTypes + size: + title: File Size + description: Size of the file, in Bytes. + range: integer + unit: + ucum_code: By + staging_url: + title: Staging Location + description: URL for internal access to the data. May be temporary. + range: uriorcurie + release_url: + title: Release Location + description: URL for controlled or open access to the data. + range: uriorcurie + drs_uri: + title: DRS URI + description: DRS location to access the data. + range: uriorcurie + hash: + title: File Hash + description: File hash information + range: FileHash + hash_type: + title: File Hash Type + description: The type of file hash, eg, md5 + range: EnumFileHashType + hash_value: + title: File Hash Value + description: The value of the file hash + range: string + dataset_id: + title: Dataset ID + description: Unique identifier for a Dataset. + range: Dataset + data_collection_start: + title: Data Collection Start + description: The date that data collection started. May include only a year. + #TODO: We could re-evaluate these as dates, but that may be too implementation specific + range: string + data_collection_end: + title: Data Collection End + description: The date that data collection started. May include only a year. + #TODO: We could re-evaluate these as dates, but that may be too implementation specific + range: string + +enums: + EnumDataUsePermission: + title: Data Use Permission + description: Data Use Ontology (DUO) terms for data use permissions. + #Do we need a "registered tier" item? + reachable_from: + source_ontology: bioregistry:duo + source_nodes: + - DUO:0000001 + is_direct: false + relationship_types: + - rdfs:subClassOf + EnumDataUseModifier: + title: Data Use Modifier + description: Data Use Ontology (DUO) terms for data use modifiers. + reachable_from: + source_ontology: bioregistry:duo + source_nodes: + - DUO:0000017 + is_direct: false + relationship_types: + - rdfs:subClassOf + EnumProgram: + title: Funding Programs + description: Funding programs relevant to inform operations. + permissible_values: + include: + title: INCLUDE + kf: + title: KF + other: + title: Other + EnumResearchDomain: + title: Research Domain + description: Domains of Research used to find studies. + #TODO: replace/add NIH internal categories from Huiqing + permissible_values: + behavior_and_behavior_mechanisms: + title: Behavior and Behavior Mechanisms + meaning: mesh:D001520 + congenital_heart_defects: + title: Congenital Heart Defects + meaning: mesh:D006330 + immune_system_diseases: + title: Immune System Diseases + meaning: mesh:D007154 + hematologic_diseases: + title: Hematologic Diseases + meaning: mesh:D006402 + neurodevelopment: + title: Neurodevelopment + meaning: mesh:D065886 + sleep_wake_disorders: + title: Sleep Wake Disorders + meaning: mesh:D012893 + all_co_occurring_conditions: + title: All Co-occurring Conditions + meaning: mesh:D013568 + physical_fitness: + title: Physical Fitness + meaning: mesh:D010809 + other: + title: Other + EnumParticipantLifespanStage: + title: Participant Lifespan Stage + description: Stages of life during which participants may be recruited. + permissible_values: + fetal: + title: Fetal + description: Before birth + neonatal: + title: Neonatal + description: 0-28 days old + pediatric: + title: Pediatric + description: Birth-17 years old + adult: + title: Adult + description: 18+ years old + EnumStudyDesign: + title: Study Design + description: Approaches for collecting data, investigating interventions, and/or analyzing data. + #TODO: Add meanings + permissible_values: + case_control: + title: Case-Control + case_set: + title: Case Set + control_set: + title: Control Set + clinical_trial: + title: Clinical Trial + cross_sectional: + title: Cross-Sectional + family_twins_trios: + title: Family/Twins/Trios + interventional: + title: Interventional + longitudinal: + title: Longitudinal + trial_readiness_study: + title: Trial Readiness Study + tumor_vs_matched_normal: + title: Tumor vs Matched Normal + EnumClinicalDataSourceType: + title: Clinical Data Source Type + description: Approaches to ascertain clinical information about a participant. + #TODO: Add meanings + permissible_values: + medical_record: + title: Medical Record + description: Data obtained directly from medical record + investigator_assessment: + title: Investigator Assessment + description: Data obtained by examination, interview, etc. with investigator + participant_or_caregiver_report: + title: Participant or Caregiver Report + description: Data obtained from survey, questionnaire, etc. filled out by participant or caregiver + other: + title: Other + description: Data obtained from other source, such as tissue bank + unknown: + title: Unknown + EnumDataCategory: + title: Data Category + description: Categories of data which may be collected about participants. + #TODO: Add meanings + permissible_values: + #Should we have these two demo/clinical data categories? + unharmonized_demographic_clinical_data: + title: Unharmonized Demographic/Clinical Data + harmonized_demographic_clinical_data: + title: Harmonized Demographic/Clinical Data + genomics: + title: Genomics + transcriptomics: + title: Transcriptomics + epigenomics: + title: Epigenomics + proteomics: + title: Proteomics + metabolomics: + title: Metabolomics + cognitive_behavioral: + title: Cognitive/Behavioral + immune_profiling: + title: Immune Profiling + imaging: + title: Imaging + microbiome: + title: Microbiome + #What is the difference between these two? + fitness: + title: Fitness + physical_activity: + title: Physical Activity + other: + title: Other + sleep_study: + title: Sleep Study + EnumSubjectType: + description: Types of Subject entities + permissible_values: + participant: + description: Study participant with consent, assent, or waiver of consent. + non_participant: + description: An individual associated with a study who was not explictly consented, eg, the subject + of a reported family history. + cell_line: + description: Cell Line + animal_model: + description: Animal model + group: + description: A group of individuals or entities. + other: + description: A different entity type- ideally this will be resolved! + EnumDownSyndromeStatus: + description: Down syndrome / chromosome 21 status + permissible_values: + d21: + title: D21 + description: Disomy 21 (euploid) + meaning: PATO:0001393 + t21: + title: T21 + description: Trisomy 21 (Down syndrome) + meaning: MONDO:0008608 + EnumSex: + description: Subject Sex + permissible_values: + female: + title: Female + meaning: NCIT:C16576 + male: + title: Male + meaning: NCIT:C20197 + other: + title: Other + meaning: NCIT:C17649 + unknown: + title: Unknown + meaning: NCIT:C17998 + EnumRace: + description: Participant Race + permissible_values: + american_indian_or_alaska_native: + title: American Indian or Alaska Native + meaning: NCIT:C41259 + asian: + title: Asian + meaning: NCIT:C41260 + black_or_african_american: + title: Black or African American + meaning: NCIT:C16352 + more_than_one_race: + title: More than one race + meaning: NCIT:C67109 + native_hawaiian_or_other_pacific_islander: + title: Native Hawaiian or Other Pacific Islander + meaning: NCIT:C41219 + other: + title: Other + meaning: NCIT:C17649 + white: + title: White + meaning: NCIT:C41261 + prefer_not_to_answer: + title: Prefer not to answer + meaning: NCIT:C132222 + unknown: + title: Unknown + meaning: NCIT:C17998 + east_asian: + title: East Asian + description: UK only; do not use for US data + meaning: NCIT:C161419 + latin_american: + title: Latin American + description: UK only; do not use for US data + meaning: NCIT:C126531 + middle_eastern_or_north_african: + title: Middle Eastern or North African + description: UK only; do not use for US data + meaning: NCIT:C43866 + south_asian: + title: South Asian + description: UK only; do not use for US data + meaning: NCIT:C41263 + EnumEthnicity: + description: Participant ethnicity, specific to Hispanic or Latino. + permissible_values: + # asked_but_unknown: + # text: asked_but_unknown + # title: Asked but unknown + hispanic_or_latino: + title: Hispanic or Latino + meaning: NCIT:C17459 + not_hispanic_or_latino: + title: Not Hispanic or Latino + meaning: NCIT:C41222 + #This should likely be rolled into a null flavor + prefer_not_to_answer: + title: Prefer not to answer + meaning: NCIT:C132222 + unknown: + title: Unknown + meaning: NCIT:C17998 + EnumVitalStatus: + description: Descriptions of a Subject's vital status + is_a: EnumNull + permissible_values: + dead: + title: Dead + meaning: NCIT:C28554 + alive: + title: Alive + meaning: NCIT:C37987 + EnumNull: + description: Base enumeration providing null options. + permissible_values: + unknown: + title: Unknown + meaning: NCIT:C17998 + EnumFamilyType: + description: Enumerations describing research family type + is_a: EnumNull + permissible_values: + control_only: + title: Control-only + description: Control Only + duo: + title: Duo + description: Duo + proband_only: + title: Proband-only + description: Proband Only + trio: + title: Trio + description: Trio (2 parents and affected child) + trio_plus: + title: Trio+ + description: 2 Parents and 2 or more children + EnumConsanguinityAssertion: + description: Asserts known or suspected consanguinity in this study family + permissible_values: + not_suspected: + title: not-suspected + description: Not suspected + meaning: snomed_ct:428263003 + suspected: + title: suspected + description: Suspected + meaning: snomed_ct:415684004 + known_present: + title: known-present + description: Known Present + meaning: snomed_ct:410515003 + unknown: + title: unknown + description: Unknown + meaning: snomed_ct:261665006 + EnumAssertionProvenance: + description: Possible data sources for assertions. + is_a: EnumNull + permissible_values: + medical_record: + title: Medical Record + description: Data obtained from a medical record + investigator_assessment: + title: Investigator Assessment + description: Data obtained by examination, interview, etc. with investigator + participant_or_caregiver_report: + title: Participant or Caregiver Report + description: Data obtained from survey, questionnaire, etc. filled out by participant or caregiver + other: + title: Other + description: Data obtained from other source, such as tissue bank + #TODO: Revisit these bindings / enumerations + EnumAvailabilityStatus: + description: Is the biospecimen available for use? + permissible_values: + available: + title: Available + meaning: ig2_biospecimen_availability:available + description: Biospecimen is Available + unavailable: + title: Unavailable + meaning: ig2_biospecimen_availability:unavailable + description: Biospecimen is Unavailable + EnumSampleCollectionMethod: + description: The approach used to collect the biospecimen. [LOINC](https://loinc.org) is recommended. + EnumSite: + description: The location of the specimen collection. [SNOMED Body Site](https://hl7.org/fhir/R4B/valueset-body-site.html) is recommended. + EnumSpatialQualifiers: + description: Any spatial/location qualifiers. + enum_uri: http://hl7.org/fhir/us/mcode/ValueSet/mcode-body-location-qualifier-vs + reachable_from: + source_ontology: bioregistry:snomedct + source_nodes: + - snomedct:106233006 + - snomedct:272424004 + - snomedct:51440002 + - snomedct:399488007 + - snomedct:24028007 + - snomedct:7771000 + is_direct: false + relationship_types: + - rdfs:subClassOf + EnumLaterality: + description: Laterality information for the site + EnumEDAMFormats: + description: Data formats from the EDAM ontology. + reachable_from: + source_ontology: bioregistry:edam + source_nodes: + - edam:format_1915 #Format + include_self: false + is_direct: false + relationship_types: + - rdfs:subClassOf + EnumEDAMDataTypes: + description: Data types from the EDAM ontology. + reachable_from: + source_ontology: bioregistry:edam + source_nodes: + - edam:data_0006 #Data + include_self: false + is_direct: false + relationship_types: + - rdfs:subClassOf + EnumFileHashType: + description: Types of file hashes supported. + permissible_values: + md5: + title: MD5 + etag: + title: ETag + sha1: + title: SHA-1 + + diff --git a/tests/__init__.py b/tests/__init__.py index f75eff4..49fb6f3 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1 +1 @@ -"""Tests for include-access-model.""" +"""Tests for common-access-model.""" diff --git a/tests/data/README.md b/tests/data/README.md index 5bea7f4..e2dc221 100644 --- a/tests/data/README.md +++ b/tests/data/README.md @@ -1,4 +1,4 @@ -# Example data for include_access_model +# Example data for common_access_model This folder contains example data for testing and demonstrating the datamodel` sorted in subfolders: diff --git a/tests/test_data.py b/tests/test_data.py index e5cf15b..cd0e48a 100644 --- a/tests/test_data.py +++ b/tests/test_data.py @@ -4,7 +4,7 @@ import pytest from pathlib import Path -import include_access_model.datamodel.include_access_model +import common_access_model.datamodel.common_access_model from linkml_runtime.loaders import yaml_loader DATA_DIR_VALID = Path(__file__).parent / "data" / "valid" @@ -19,7 +19,7 @@ def test_valid_data_files(filepath): """Test loading of all valid data files.""" target_class_name = Path(filepath).stem.split("-")[0] tgt_class = getattr( - include_access_model.datamodel.include_access_model, + common_access_model.datamodel.common_access_model, target_class_name, ) obj = yaml_loader.load(filepath, target_class=tgt_class) @@ -31,7 +31,7 @@ def test_valid_data_files(filepath): """Test loading of all valid data files.""" target_class_name = Path(filepath).stem.split("-")[0] tgt_class = getattr( - include_access_model.datamodel.include_access_model, + common_access_model.datamodel.common_access_model, target_class_name, ) with pytest.raises(ValueError): diff --git a/uv.lock b/uv.lock index 5f10737..c0533d6 100644 --- a/uv.lock +++ b/uv.lock @@ -498,6 +498,38 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, ] +[[package]] +name = "common-access-model" +source = { editable = "." } +dependencies = [ + { name = "linkml" }, + { name = "linkml-runtime" }, +] + +[package.dev-dependencies] +dev = [ + { name = "jupyter" }, + { name = "linkml" }, + { name = "mkdocs-material" }, + { name = "mkdocs-mermaid2-plugin" }, + { name = "mknotebooks" }, +] + +[package.metadata] +requires-dist = [ + { name = "linkml", specifier = ">=1.9.6" }, + { name = "linkml-runtime", specifier = ">=1.9.4" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "jupyter", specifier = ">=1.0.0" }, + { name = "linkml", specifier = ">=1.9.3" }, + { name = "mkdocs-material", specifier = ">=8.2.8" }, + { name = "mkdocs-mermaid2-plugin", specifier = ">=1.1.1" }, + { name = "mknotebooks", specifier = ">=0.8.0" }, +] + [[package]] name = "curies" version = "0.10.23" @@ -727,6 +759,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7d/ed/6bfa4109fcb23a58819600392564fea69cdc6551ffd5e69ccf1d52a40cbc/greenlet-3.2.4-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8c68325b0d0acf8d91dde4e6f930967dd52a5302cd4062932a6b2e7c2969f47c", size = 271061, upload-time = "2025-08-07T13:17:15.373Z" }, { url = "https://files.pythonhosted.org/packages/2a/fc/102ec1a2fc015b3a7652abab7acf3541d58c04d3d17a8d3d6a44adae1eb1/greenlet-3.2.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:94385f101946790ae13da500603491f04a76b6e4c059dab271b3ce2e283b2590", size = 629475, upload-time = "2025-08-07T13:42:54.009Z" }, { url = "https://files.pythonhosted.org/packages/c5/26/80383131d55a4ac0fb08d71660fd77e7660b9db6bdb4e8884f46d9f2cc04/greenlet-3.2.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f10fd42b5ee276335863712fa3da6608e93f70629c631bf77145021600abc23c", size = 640802, upload-time = "2025-08-07T13:45:25.52Z" }, + { url = "https://files.pythonhosted.org/packages/9f/7c/e7833dbcd8f376f3326bd728c845d31dcde4c84268d3921afcae77d90d08/greenlet-3.2.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c8c9e331e58180d0d83c5b7999255721b725913ff6bc6cf39fa2a45841a4fd4b", size = 636703, upload-time = "2025-08-07T13:53:12.622Z" }, { url = "https://files.pythonhosted.org/packages/e9/49/547b93b7c0428ede7b3f309bc965986874759f7d89e4e04aeddbc9699acb/greenlet-3.2.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58b97143c9cc7b86fc458f215bd0932f1757ce649e05b640fea2e79b54cedb31", size = 635417, upload-time = "2025-08-07T13:18:25.189Z" }, { url = "https://files.pythonhosted.org/packages/7f/91/ae2eb6b7979e2f9b035a9f612cf70f1bf54aad4e1d125129bef1eae96f19/greenlet-3.2.4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c2ca18a03a8cfb5b25bc1cbe20f3d9a4c80d8c3b13ba3df49ac3961af0b1018d", size = 584358, upload-time = "2025-08-07T13:18:23.708Z" }, { url = "https://files.pythonhosted.org/packages/f7/85/433de0c9c0252b22b16d413c9407e6cb3b41df7389afc366ca204dbc1393/greenlet-3.2.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fe0a28a7b952a21e2c062cd5756d34354117796c6d9215a87f55e38d15402c5", size = 1113550, upload-time = "2025-08-07T13:42:37.467Z" }, @@ -737,6 +770,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a4/de/f28ced0a67749cac23fecb02b694f6473f47686dff6afaa211d186e2ef9c/greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2", size = 272305, upload-time = "2025-08-07T13:15:41.288Z" }, { url = "https://files.pythonhosted.org/packages/09/16/2c3792cba130000bf2a31c5272999113f4764fd9d874fb257ff588ac779a/greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246", size = 632472, upload-time = "2025-08-07T13:42:55.044Z" }, { url = "https://files.pythonhosted.org/packages/ae/8f/95d48d7e3d433e6dae5b1682e4292242a53f22df82e6d3dda81b1701a960/greenlet-3.2.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94abf90142c2a18151632371140b3dba4dee031633fe614cb592dbb6c9e17bc3", size = 644646, upload-time = "2025-08-07T13:45:26.523Z" }, + { url = "https://files.pythonhosted.org/packages/d5/5e/405965351aef8c76b8ef7ad370e5da58d57ef6068df197548b015464001a/greenlet-3.2.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:4d1378601b85e2e5171b99be8d2dc85f594c79967599328f95c1dc1a40f1c633", size = 640519, upload-time = "2025-08-07T13:53:13.928Z" }, { url = "https://files.pythonhosted.org/packages/25/5d/382753b52006ce0218297ec1b628e048c4e64b155379331f25a7316eb749/greenlet-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0db5594dce18db94f7d1650d7489909b57afde4c580806b8d9203b6e79cdc079", size = 639707, upload-time = "2025-08-07T13:18:27.146Z" }, { url = "https://files.pythonhosted.org/packages/1f/8e/abdd3f14d735b2929290a018ecf133c901be4874b858dd1c604b9319f064/greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8", size = 587684, upload-time = "2025-08-07T13:18:25.164Z" }, { url = "https://files.pythonhosted.org/packages/5d/65/deb2a69c3e5996439b0176f6651e0052542bb6c8f8ec2e3fba97c9768805/greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52", size = 1116647, upload-time = "2025-08-07T13:42:38.655Z" }, @@ -747,6 +781,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/44/69/9b804adb5fd0671f367781560eb5eb586c4d495277c93bde4307b9e28068/greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd", size = 274079, upload-time = "2025-08-07T13:15:45.033Z" }, { url = "https://files.pythonhosted.org/packages/46/e9/d2a80c99f19a153eff70bc451ab78615583b8dac0754cfb942223d2c1a0d/greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb", size = 640997, upload-time = "2025-08-07T13:42:56.234Z" }, { url = "https://files.pythonhosted.org/packages/3b/16/035dcfcc48715ccd345f3a93183267167cdd162ad123cd93067d86f27ce4/greenlet-3.2.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968", size = 655185, upload-time = "2025-08-07T13:45:27.624Z" }, + { url = "https://files.pythonhosted.org/packages/31/da/0386695eef69ffae1ad726881571dfe28b41970173947e7c558d9998de0f/greenlet-3.2.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5c9320971821a7cb77cfab8d956fa8e39cd07ca44b6070db358ceb7f8797c8c9", size = 649926, upload-time = "2025-08-07T13:53:15.251Z" }, { url = "https://files.pythonhosted.org/packages/68/88/69bf19fd4dc19981928ceacbc5fd4bb6bc2215d53199e367832e98d1d8fe/greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6", size = 651839, upload-time = "2025-08-07T13:18:30.281Z" }, { url = "https://files.pythonhosted.org/packages/19/0d/6660d55f7373b2ff8152401a83e02084956da23ae58cddbfb0b330978fe9/greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0", size = 607586, upload-time = "2025-08-07T13:18:28.544Z" }, { url = "https://files.pythonhosted.org/packages/8e/1a/c953fdedd22d81ee4629afbb38d2f9d71e37d23caace44775a3a969147d4/greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0", size = 1123281, upload-time = "2025-08-07T13:42:39.858Z" }, @@ -757,6 +792,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/49/e8/58c7f85958bda41dafea50497cbd59738c5c43dbbea5ee83d651234398f4/greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31", size = 272814, upload-time = "2025-08-07T13:15:50.011Z" }, { url = "https://files.pythonhosted.org/packages/62/dd/b9f59862e9e257a16e4e610480cfffd29e3fae018a68c2332090b53aac3d/greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945", size = 641073, upload-time = "2025-08-07T13:42:57.23Z" }, { url = "https://files.pythonhosted.org/packages/f7/0b/bc13f787394920b23073ca3b6c4a7a21396301ed75a655bcb47196b50e6e/greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc", size = 655191, upload-time = "2025-08-07T13:45:29.752Z" }, + { url = "https://files.pythonhosted.org/packages/f2/d6/6adde57d1345a8d0f14d31e4ab9c23cfe8e2cd39c3baf7674b4b0338d266/greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a", size = 649516, upload-time = "2025-08-07T13:53:16.314Z" }, { url = "https://files.pythonhosted.org/packages/7f/3b/3a3328a788d4a473889a2d403199932be55b1b0060f4ddd96ee7cdfcad10/greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504", size = 652169, upload-time = "2025-08-07T13:18:32.861Z" }, { url = "https://files.pythonhosted.org/packages/ee/43/3cecdc0349359e1a527cbf2e3e28e5f8f06d3343aaf82ca13437a9aa290f/greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671", size = 610497, upload-time = "2025-08-07T13:18:31.636Z" }, { url = "https://files.pythonhosted.org/packages/b8/19/06b6cf5d604e2c382a6f31cafafd6f33d5dea706f4db7bdab184bad2b21d/greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b", size = 1121662, upload-time = "2025-08-07T13:42:41.117Z" }, @@ -767,6 +803,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/22/5c/85273fd7cc388285632b0498dbbab97596e04b154933dfe0f3e68156c68c/greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0", size = 273586, upload-time = "2025-08-07T13:16:08.004Z" }, { url = "https://files.pythonhosted.org/packages/d1/75/10aeeaa3da9332c2e761e4c50d4c3556c21113ee3f0afa2cf5769946f7a3/greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f", size = 686346, upload-time = "2025-08-07T13:42:59.944Z" }, { url = "https://files.pythonhosted.org/packages/c0/aa/687d6b12ffb505a4447567d1f3abea23bd20e73a5bed63871178e0831b7a/greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5", size = 699218, upload-time = "2025-08-07T13:45:30.969Z" }, + { url = "https://files.pythonhosted.org/packages/dc/8b/29aae55436521f1d6f8ff4e12fb676f3400de7fcf27fccd1d4d17fd8fecd/greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1", size = 694659, upload-time = "2025-08-07T13:53:17.759Z" }, { url = "https://files.pythonhosted.org/packages/92/2e/ea25914b1ebfde93b6fc4ff46d6864564fba59024e928bdc7de475affc25/greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735", size = 695355, upload-time = "2025-08-07T13:18:34.517Z" }, { url = "https://files.pythonhosted.org/packages/72/60/fc56c62046ec17f6b0d3060564562c64c862948c9d4bc8aa807cf5bd74f4/greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337", size = 657512, upload-time = "2025-08-07T13:18:33.969Z" }, { url = "https://files.pythonhosted.org/packages/23/6e/74407aed965a4ab6ddd93a7ded3180b730d281c77b765788419484cdfeef/greenlet-3.2.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2917bdf657f5859fbf3386b12d68ede4cf1f04c90c3a6bc1f013dd68a22e2269", size = 1612508, upload-time = "2025-11-04T12:42:23.427Z" }, @@ -775,6 +812,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f7/c0/93885c4106d2626bf51fdec377d6aef740dfa5c4877461889a7cf8e565cc/greenlet-3.2.4-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:b6a7c19cf0d2742d0809a4c05975db036fdff50cd294a93632d6a310bf9ac02c", size = 269859, upload-time = "2025-08-07T13:16:16.003Z" }, { url = "https://files.pythonhosted.org/packages/4d/f5/33f05dc3ba10a02dedb1485870cf81c109227d3d3aa280f0e48486cac248/greenlet-3.2.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:27890167f55d2387576d1f41d9487ef171849ea0359ce1510ca6e06c8bece11d", size = 627610, upload-time = "2025-08-07T13:43:01.345Z" }, { url = "https://files.pythonhosted.org/packages/b2/a7/9476decef51a0844195f99ed5dc611d212e9b3515512ecdf7321543a7225/greenlet-3.2.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:18d9260df2b5fbf41ae5139e1be4e796d99655f023a636cd0e11e6406cca7d58", size = 639417, upload-time = "2025-08-07T13:45:32.094Z" }, + { url = "https://files.pythonhosted.org/packages/bd/e0/849b9159cbb176f8c0af5caaff1faffdece7a8417fcc6fe1869770e33e21/greenlet-3.2.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:671df96c1f23c4a0d4077a325483c1503c96a1b7d9db26592ae770daa41233d4", size = 634751, upload-time = "2025-08-07T13:53:18.848Z" }, { url = "https://files.pythonhosted.org/packages/5f/d3/844e714a9bbd39034144dca8b658dcd01839b72bb0ec7d8014e33e3705f0/greenlet-3.2.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:16458c245a38991aa19676900d48bd1a6f2ce3e16595051a4db9d012154e8433", size = 634020, upload-time = "2025-08-07T13:18:36.841Z" }, { url = "https://files.pythonhosted.org/packages/6b/4c/f3de2a8de0e840ecb0253ad0dc7e2bb3747348e798ec7e397d783a3cb380/greenlet-3.2.4-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9913f1a30e4526f432991f89ae263459b1c64d1608c0d22a5c79c287b3c70df", size = 582817, upload-time = "2025-08-07T13:18:35.48Z" }, { url = "https://files.pythonhosted.org/packages/89/80/7332915adc766035c8980b161c2e5d50b2f941f453af232c164cff5e0aeb/greenlet-3.2.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b90654e092f928f110e0007f572007c9727b5265f7632c2fa7415b4689351594", size = 1111985, upload-time = "2025-08-07T13:42:42.425Z" }, @@ -861,38 +899,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" }, ] -[[package]] -name = "include-access-model" -source = { editable = "." } -dependencies = [ - { name = "linkml" }, - { name = "linkml-runtime" }, -] - -[package.dev-dependencies] -dev = [ - { name = "jupyter" }, - { name = "linkml" }, - { name = "mkdocs-material" }, - { name = "mkdocs-mermaid2-plugin" }, - { name = "mknotebooks" }, -] - -[package.metadata] -requires-dist = [ - { name = "linkml", specifier = ">=1.9.6" }, - { name = "linkml-runtime", specifier = ">=1.9.4" }, -] - -[package.metadata.requires-dev] -dev = [ - { name = "jupyter", specifier = ">=1.0.0" }, - { name = "linkml", specifier = ">=1.9.3" }, - { name = "mkdocs-material", specifier = ">=8.2.8" }, - { name = "mkdocs-mermaid2-plugin", specifier = ">=1.1.1" }, - { name = "mknotebooks", specifier = ">=0.8.0" }, -] - [[package]] name = "iniconfig" version = "2.1.0" From 2146dcde558eec752c7f812226956d2b022e7207 Mon Sep 17 00:00:00 2001 From: Robert Carroll Date: Fri, 8 May 2026 16:06:24 -0500 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=90=9B=20Remove=20some=20INLCUDE=20sp?= =?UTF-8?q?ecific=20terms?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../schema/common_access_model.yaml | 24 +- .../schema/include_access_model.yaml | 1344 ----------------- tests/data/valid/Demographics-000.yaml | 3 +- 3 files changed, 2 insertions(+), 1369 deletions(-) delete mode 100644 src/include_access_model/schema/include_access_model.yaml diff --git a/src/common_access_model/schema/common_access_model.yaml b/src/common_access_model/schema/common_access_model.yaml index 6023268..c00ca5b 100644 --- a/src/common_access_model/schema/common_access_model.yaml +++ b/src/common_access_model/schema/common_access_model.yaml @@ -184,17 +184,11 @@ classes: - ethnicity - age_at_last_vital_status - vital_status + - age_at_first_engagement slot_usage: subject_id: required: true identifier: true - IncludeParticipant: - title: INCLUDE Participant - description: Information specific to INCLUDE participants - is_a: Demographics - slots: - - down_syndrome_status - - age_at_first_engagement Family: title: Family description: A group of individuals of some relation who are grouped together in a study. @@ -671,11 +665,6 @@ slots: description: Ethnicity of Participant range: EnumEthnicity required: true - down_syndrome_status: - title: Down Syndrome Status - description: Down Syndrome status of participant - range: EnumDownSyndromeStatus - required: true age_at_first_engagement: #Should this just be a reference out to an encounter? title: Age at First Participant Engagement @@ -1122,17 +1111,6 @@ enums: description: A group of individuals or entities. other: description: A different entity type- ideally this will be resolved! - EnumDownSyndromeStatus: - description: Down syndrome / chromosome 21 status - permissible_values: - d21: - title: D21 - description: Disomy 21 (euploid) - meaning: PATO:0001393 - t21: - title: T21 - description: Trisomy 21 (Down syndrome) - meaning: MONDO:0008608 EnumSex: description: Subject Sex permissible_values: diff --git a/src/include_access_model/schema/include_access_model.yaml b/src/include_access_model/schema/include_access_model.yaml deleted file mode 100644 index f2e8d33..0000000 --- a/src/include_access_model/schema/include_access_model.yaml +++ /dev/null @@ -1,1344 +0,0 @@ ---- -id: https://includedcc.org/include-access-model -name: include-access-model -title: INCLUDE DCC Access Model -description: LinkML Schema for the internal INCLUDE DCC Access Model -license: MIT -see_also: - - https://includedcc.github.io/include-access-model - -prefixes: - includedcc: https://includedcc.org/include-access-model/ - linkml: https://w3id.org/linkml/ - schema: http://schema.org/ - # subset of CDC Race and Ethnicity Code Set Version 1.0 - cdc_race_eth: urn:oid:2.16.840.1.113883.6.238/ - hl7_null: http://terminology.hl7.org/CodeSystem/v3-NullFlavor/ - ig_dob_method: https://nih-ncpi.github.io/ncpi-fhir-ig-2/CodeSystem/research-data-date-of-birth-method/ - igcondtype: https://nih-ncpi.github.io/ncpi-fhir-ig-2/CodeSystem/condition-type/ - ig2dac: https://nih-ncpi.github.io/ncpi-fhir-ig-2/CodeSystem/research-data-access-code/ - ig2dat: https://nih-ncpi.github.io/ncpi-fhir-ig-2/CodeSystem/research-data-access-type/ - ig2_biospecimen_availability: https://nih-ncpi.github.io/ncpi-fhir-ig-2/CodeSystem/biospecimen-availability/ - snomed_ct: http://snomed.info/id/ - MONDO: http://purl.obolibrary.org/obo/MONDO_ - HP: http://purl.obolibrary.org/obo/HP_ - mesh: http://id.nlm.nih.gov/mesh/ - NCIT: http://purl.obolibrary.org/obo/NCIT_ - PATO: http://purl.obolibrary.org/obo/PATO_ - DUO: http://purl.obolibrary.org/obo/DUO_ - -default_prefix: includedcc -default_range: string - -imports: - - linkml:types - -classes: - Record: - description: One row / entity within the database - title: Record - abstract: true - slots: - - external_id - - access_policy_id - - study_id - AccessPolicy: - title: Access Policy - description: The access policy that describes the controls around use of data - slots: - - access_policy_id - - data_use_accession - - data_use_permission - - data_use_modifier - - disease_limitation - - access_description - - website - slot_usage: - access_policy_id: - range: string - required: true - identifier: true - Study: - title: Research Study - description: Study Metadata - is_a: Record - slots: - #TODO: Split out core Study items and additional study metadata? - #- study_id Inherits study_id from Record now. - - parent_study - - study_title - - study_code - - study_short_name - - program - - funding_source - - principal_investigator - - contact - - study_description - - website - # - dbgap : Should we call this out specifically or just use an external id? - - publication - - acknowledgments - - citation_statement - - do_id - slot_usage: - study_id: - range: string - required: true - identifier: true - StudyMetadata: - title: Study Metadata - description: Additional features about studies that may not apply to all studies - is_a: Record - slots: - - study_id - - participant_lifespan_stage - - selection_criteria - - study_design - - clinical_data_source_type - - data_category - - vbr_id - - research_domain - - expected_number_of_participants - - actual_number_of_participants - # Do we need this info, or should it be documented elsewhere? - #- guidType - #- guidMapped - slot_usage: - study_id: - required: true - identifier: true - data_category: - required: true - multivalued: true - - VirtualBiorepository: - title: Virtual BioRepository (VBR) - description: An organization that can provide access to specimen for further analysis. - is_a: Record - slots: - - vbr_id - - name - - institution - - contact - - website - - vbr_readme - slot_usage: - vbr_id: - range: string - required: true - identifier: true - - DOI: - title: Digital Object Identifier (DOI) - description: A DOI is a permanent reference with metadata about a digital object. - is_a: Record - slots: - - do_id - - bibliographic_reference - slot_usage: - do_id: - range: string - required: true - identifier: true - Investigator: - title: Investigator - description: An individual who made contributions to the collection, analysis, or sharing of data. - is_a: Record - slots: - - name - - institution - # - orcid : Should we call this out specifically or just use an external id? - - investigator_title - - email - Publication: - title: Publication - description: Information about a specific publication. - is_a: Record - #Could add more here - slots: - - bibliographic_reference - - website - Subject: - title: Subject - description: This entity is the subject about which data or references are recorded. - This includes the idea of a human participant in a study, a cell line, an animal model, - or any other similar entity. - is_a: Record - slots: - - subject_id - - subject_type - - organism_type - slot_usage: - subject_id: - range: string - required: true - identifier: true - Demographics: - title: Demographics - description: Basic participant demographics summary - is_a: Record - slots: - - subject_id - - sex - - race - - ethnicity - - down_syndrome_status - - age_at_last_vital_status - - vital_status - - age_at_first_engagement - slot_usage: - subject_id: - required: true - identifier: true - Family: - title: Family - description: A group of individuals of some relation who are grouped together in a study. - is_a: Record - slots: - - family_id - - family_type - - family_description - - consanguinity - - family_study_focus - slot_usage: - family_id: - range: string - required: true - identifier: true - FamilyRelationship: - title: Family Member Relationship - description: A relationship between two Subjects. Directed as follows - - - is_a: Record - slots: - - family_relationship_id - - family_member_id - - relationship - - subject_id - slot_usage: - family_relationship_id: - range: string - required: true - identifier: true - subject_id: - required: true - description: The family member Subject who is the relationship "object". - FamilyMember: - title: Family Member - description: Designates a Subject as a member of a family with a specified role. - is_a: Record - slots: - - family_id - - subject_id - - family_role - unique_keys: - main: - description: Family membership is defined by family and subject ids. - unique_key_slots: - - family_id - - subject_id - slot_usage: - family_id: - required: true - subject_id: - required: true - SubjectAssertion: - title: Subject Assertion - description: Assertion about a particular Subject. May include Conditions, Measurements, etc. - is_a: Record - slots: - - assertion_id - - subject_id - - encounter_id - - assertion_provenance - - age_at_assertion - - age_at_event - - age_at_resolution - - concept - - concept_source - - value_concept - - value_number - - value_source - - value_unit - - value_unit_source - slot_usage: - assertion_id: - range: string - required: true - identifier: true - Concept: - title: Concept - description: A standardized concept with display information. - slots: - - concept_curie - - display - slot_usage: - concept_curie: - required: true - identifier: true - Sample: - title: Sample - description: A functionally equivalent specimen taken from a participant or processed from such a sample. - is_a: Record - slots: - - sample_id - - biospecimen_collection_id - - parent_sample_id - - sample_type - - processing - - availablity_status - - storage_method - - quantity_number - - quantity_unit - slot_usage: - sample_id: - range: string - required: true - identifier: true - biospecimen_collection_id: - description: Biospecimen Collection during which this sample was generated. - BiospecimenCollection: - title: BiospecimenCollection - description: A biospecimen collection event which yields one or more Samples. - is_a: Record - slots: - - biospecimen_collection_id - - age_at_collection - - method - - site - - spatial_qualifier - - laterality - - encounter_id - slot_usage: - biospecimen_collection_id: - range: string - required: true - identifier: true - Aliquot: - title: Aliquot - description: A specific tube or amount of a biospecimen associated with a Sample. - is_a: Record - slots: - - aliquot_id - - sample_id - - availablity_status - - quantity_number - - quantity_unit - - concentration_number - - concentration_unit - slot_usage: - aliquot_id: - range: string - required: true - identifier: true - Encounter: - title: Participant Encounter - description: An event at which data was collected about a participant, - an intervention was made, or information about a participant was recorded. - is_a: Record - slots: - - encounter_id - - subject_id - #TODO: Should this alternatively be an "encounter type", ie, to not require a full definition? - - encounter_definition_id - - age_at_event - slot_usage: - encounter_id: - range: string - required: true - identifier: true - EncounterDefinition: - title: Encounter Definition - description: A definition of an encounter type in this study, ie, - an event at which data was collected about a participant, - an intervention was made, or information about a participant was recorded. - This may be something planned by a study or a type of data collection. - #TODO: These are metadata and may not need the same Record basis. - is_a: Record - slots: - - encounter_definition_id - - name - - description - - activity_definition_id - slot_usage: - encounter_definition_id: - range: string - required: true - identifier: true - activity_definition_id: - multivalued: true - ActivityDefinition: - title: Activity Definition - description: A definition of an activity in this study, eg, - a biospecimen collection, intervention, survey, or assessment. - #TODO: These are metadata and may not need the same Record basis. - is_a: Record - slots: - - activity_definition_id - - name - - description - #TODO: Probably want an "expected data generated" slot, eg, - #observation definitions or dd refs - slot_usage: - activity_definition_id: - range: string - required: true - identifier: true - File: - title: File - description: File - is_a: Record - slots: - - file_id - - subject_id - - sample_id - - filename - - format - - data_category - - data_type - - format - - size - #TODO: I'm not convinced this is the right strategy- access model vs operations - - staging_url - - release_url - - drs_uri - - hash - slot_usage: - file_id: - range: string - required: true - identifier: true - subject_id: - multivalued: true - sample_id: - multivalued: true - FileHash: - title: File Hash - description: Type and value of a file content hash. - slots: - - hash_type - - hash_value - Dataset: - title: Dataset - description: Set of files grouped together for release. - slots: - - dataset_id - - name - - description - - do_id - - file_id - - publication - #TODO: Are these good elements for the core entity? - - data_collection_start - - data_collection_end - - slot_usage: - dataset_id: - range: string - required: true - identifier: true - file_id: - multivalued: true - description: The list of files comprising this dataset. - - -slots: - study_id: - title: Study ID - description: INCLUDE Global ID for the study - range: Study - multivalued: false - access_policy_id: - title: Access Policy ID - description: Global identifier for the access policy that applies to - this row of data. - range: AccessPolicy - data_use_accession: - title: Data Use Accession - description: Accession used to provision access to the record, eg, - a dbGaP phsID. - range: uriorcurie - data_use_permission: - title: Data Use Permission - description: Broad category of restrictions on data use. - range: EnumDataUsePermission - required: true - data_use_modifier: - title: Data Use Modifier - description: Additional modifiers that limit data use. - range: EnumDataUseModifier - disease_limitation: - title: Data Use Disease Limitation - description: If the access is limited to a specific disease purpose, - it is specified here. - range: string - access_description: - title: Access Description - description: Any additional information to support access requests. - range: string - do_id: - title: DOI - description: Digital Object Identifier (DOI) for this Record. - range: DOI - multivalued: false - subject_id: - title: Study ID - description: INCLUDE Global ID for the Subject - range: Subject - multivalued: false - assertion_id: - title: Assertion ID - description: INCLUDE Global ID for the Assertion - range: SubjectAssertion - multivalued: false - external_id: - title: External Identifiers - description: Other identifiers for this entity, eg, from the submitting study or in systems like dbGaP - required: false - range: uriorcurie - multivalued: true - parent_study: - title: Parent Study - description: The parent study for this study, if it is a nested study. - required: false - range: Study - multivalued: false - funding_source: - title: Funding Source - description: The funding source(s) of the study. - required: false - range: string - multivalued: true - principal_investigator: - title: Principal Investigator - description: The Principal Investigator(s) responsible for the study. - required: true - range: Investigator - multivalued: true - study_title: - description: Full Study Title - required: true - range: string - multivalued: false - study_code: - description: Unique identifier for the study (generally a short acronym) - title: Study Code - range: string - required: true - study_short_name: - title: Study Code - description: Short name for the study - range: string - required: false - investigator_title: - title: Investigator Title - description: The title of the Investigator, eg, "Assistant Professor" - range: string - required: false - name: - title: Name - description: Name of the entity. - range: string - required: false - email: - title: Email Address - description: An email address to reach the entity. - range: string - required: false - institution: - title: Institution - description: Name of the institution this record is associated with. - range: string - required: false - program: - title: Program - description: Funding source(s) for the study - range: EnumProgram - required: true - multivalued: true - study_description: - title: Study Description - description: Brief description of the study (2-4 sentences) - range: string - required: true - website: - title: Website - description: Website with more information about this entity. - range: uri - contact: - title: Contact Person - description: The individual to contact with questions about this record. - required: true - range: Investigator - multivalued: true - vbr_id: - title: Virtual Biorepository - description: Information about the study's Virtual Biorepository, if participating - range: VirtualBiorepository - vbr_readme: - title: VBR Readme - description: Instructions for contacting or requesting samples from Virtual Biorepository, if participating - range: string - research_domain: - description: Main research domain(s) of the study, other than Down syndrome - range: EnumResearchDomain - required: true - multivalued: true - participant_lifespan_stage: - title: Participant Lifespan Stage - description: Focus age group(s) of the study population - range: EnumParticipantLifespanStage - required: true - multivalued: true - selection_criteria: - title: Selection Criteria - description: Brief description of inclusion and/or exclusion criteria for the study - range: string - study_design: - title: Study Design - description: Overall design of study, including whether it is longitudinal and whether family members/unrelated controls are also enrolled - range: EnumStudyDesign - required: true - multivalued: true - data_category: - title: Data Category - description: General category of data in this Record (e.g. Clinical, Genomics, etc) - range: EnumDataCategory - clinical_data_source_type: - title: Clinical Data Source Type - description: Source(s) of data collected from study participants - range: EnumClinicalDataSourceType - required: true - multivalued: true - publication: - title: Publication - description: Publications associated with this Record. - range: Publication - multivalued: true - expected_number_of_participants: - title: Expected Number of Participants - description: Total expected number of participants to be recruited. - range: integer - required: true - actual_number_of_participants: - title: Actual Number of Participants - description: Total participants included at this time. - range: integer - required: true - acknowledgments: - title: Acknowledgments - description: Funding statement and acknowledgments for this study - range: string - citation_statement: - title: Citation Statement - description: Statement that secondary data users should use to acknowledge use of this study or dataset. E.g., - "The results analyzed and here are based in whole or in part upon data generated by the INCLUDE - (INvestigation of Co-occurring conditions across the Lifespan to Understand Down syndromE) Project , and were accessed from the INCLUDE Data Hub and ." - range: string - bibliographic_reference: - title: Bibiliographic Reference - description: Text use to reference this Record. - range: string - organism_type: - title: Organism Type - description: Organism Type, typically from NCBITaxon. For reference, Human is NCBITaxon:9606. - range: uriorcurie - subject_type: - title: Subject Type - description: Type of entity this record represents - required: true - range: EnumSubjectType - sex: - title: Sex - description: Sex of Participant - range: EnumSex - required: true - race: - title: Race - description: Race of Participant - range: EnumRace - required: true - multivalued: true - ethnicity: - title: Ethnicity - description: Ethnicity of Participant - range: EnumEthnicity - required: true - down_syndrome_status: - title: Down Syndrome Status - description: Down Syndrome status of participant - range: EnumDownSyndromeStatus - required: true - age_at_first_engagement: - #Should this just be a reference out to an encounter? - title: Age at First Participant Engagement - description: Age in days of Participant at first recorded study event (enrollment, visit, observation, - sample collection, survey completion, etc.). Age at enrollment is preferred, if available. - range: integer - unit: - ucum_code: d - #Range -1 year to 89*365.25 (Privacy upper bound for ages over 89 years) - minimum_value: -365 - maximum_value: 32507 - vital_status: - title: Vital Status - description: Whether participant is alive or dead - range: EnumVitalStatus - age_at_last_vital_status: - title: Age at Last Vital Status - description: Age in days when participant's vital status was last recorded - range: integer - unit: - ucum_code: d - minimum_value: -365 - maximum_value: 32507 - family_id: - title: Family ID - description: Global ID for the Family - range: Family - family_type: - description: Describes the 'type' of study family, eg, trio. - range: EnumFamilyType - family_description: - description: Free text describing the study family, such as potential - inheritance or details about consanguinity - range: string - consanguinity: - description: Is there known or suspected consanguinity in this study family? - range: EnumConsanguinityAssertion - family_study_focus: - description: The specific focus of the investigation, eg, a condition. - range: uriorcurie - family_relationship_id: - title: Family Relationship ID - description: Global ID for the Family Relationship - range: FamilyRelationship - family_member_id: - description: The family member Subject who is the relationship "subject". - required: true - range: Subject - inlined: false - relationship: - description: Code definting the relationship predicate. Relationship of the "Family Member" - to the "Subject", eg, mother of. - required: true - range: uriorcurie - family_role: - description: The "role" of this individual in this family. Could include terms like "proband", "mother", etc. - range: uriorcurie - assertion_provenance: - title: Assertion Provenance - description: The original source of this assertion - range: EnumAssertionProvenance - age_at_assertion: - title: Age at assertion - description: The age in days of the Subject when the assertion was made. - range: integer - unit: - ucum_code: d - age_at_event: - title: Age at event - description: The age in days of the Subject at the time point which the assertion describes, - eg, age of onset or when a measurement was performed. - range: integer - unit: - ucum_code: d - age_at_resolution: - title: Age at resolution - description: The age in days of the Subject when the asserted state was resolved. - range: integer - unit: - ucum_code: d - concept: - title: Concept - description: The structured term defining the meaning of the assertion. - range: Concept - multivalued: true - concept_curie: - title: Concept Curie - description: The standardized curie for the term. - range: uriorcurie - display: - title: Display String - description: The friendly display string of the coded term. - range: string - concept_source: - title: Concept Source Text - description: The source text yielding the standardized concept. - range: string - value_concept: - title: Value concept - description: The structured term defining the value of the assertion. - range: Concept - multivalued: true - value_number: - title: Value Number - description: The numeric value of the assertion. - range: float - value_source: - title: Value Source Text - description: The source text yielding the value. - range: string - value_unit: - title: Value Units - description: The structured term defining the units of the value. - range: Concept - value_unit_source: - title: Value Units Source Text - description: The source text yielding the value's units. - range: string - sample_id: - title: Sample ID - description: The unique identifier for this Sample. - range: Sample - parent_sample_id: - title: Parent Sample ID - description: Sample from which this sample is derived - range: Sample - inlined: false - biospecimen_collection_id: - title: Biospecimen Collection ID - description: Unique identifier for this Biospecimen Collection. - range: BiospecimenCollection - aliquot_id: - title: Aliquot ID - description: Unique identifier for an Aliquot. - range: Aliquot - sample_type: - title: Sample Type - description: Type of material of which this Sample is comprised. UBERON is recommended. - required: true - range: uriorcurie - processing: - title: Sample Processing - description: Processing that was applied to the Parent Sample or from the Biospecimen Collection that yielded - this distinct sample. OBI is recommended. - range: uriorcurie - multivalued: true - availablity_status: - title: Sample Availability - description: Can this Sample be requested for further analysis? - range: EnumAvailabilityStatus - storage_method: - title: Sample Storage Method - description: Sample storage method, eg, Frozen or with additives. OBI may be suitable, or ChEBI for additives. - range: uriorcurie - multivalued: true - quantity_number: - title: Quantity - description: The total quantity of the specimen - range: float - quantity_unit: - title: Quantity Units - description: The structured term defining the units of the quantity. - range: Concept - concentration_number: - title: Concentration - description: What is the concentration of the analyte in the Aliquot? - range: float - concentration_unit: - title: Concentration Units - description: Units associated with the concentration of the analyte in the Aliquot. - range: Concept - age_at_collection: - title: Age at Biospecimen Collection - description: The age at which this biospecimen was collected in decimal years. - range: float - unit: - ucum_code: a - method: - title: Biospecimen Collection Method - description: The approach used to collect the biospecimen. - range: EnumSampleCollectionMethod - site: - title: Biospecimen Collection Site - description: The location of the specimen collection. - range: EnumSite - spatial_qualifier: - title: Spatial Qualifier - description: Qualifier that further refine the specific location of biospecimen collection - range: EnumSpatialQualifiers - laterality: - title: Location Laterality - description: Laterality that further refine the specific location of biospecimen collection - range: EnumLaterality - encounter_id: - title: Encounter ID - description: Unique identifier for this Encounter. - range: Encounter - description: - title: Description - description: Description for this entity. - range: string - encounter_definition_id: - title: Encounter Definition ID - description: Unique identifier for this Encounter Definition. - range: EncounterDefinition - activity_definition_id: - title: Activity Definition ID - description: Unique identifier for this Activity Definition. - range: ActivityDefinition - file_id: - title: File ID - description: Unique identifier for this File. - range: File - filename: - title: Filename - description: The name of the file. - range: string - format: - title: File Format - description: The format of the file. - range: EnumEDAMFormats - data_type: - title: Data Type - description: The type of data within this file. - range: EnumEDAMDataTypes - size: - title: File Size - description: Size of the file, in Bytes. - range: integer - unit: - ucum_code: By - staging_url: - title: Staging Location - description: URL for internal access to the data. May be temporary. - range: uriorcurie - release_url: - title: Release Location - description: URL for controlled or open access to the data. - range: uriorcurie - drs_uri: - title: DRS URI - description: DRS location to access the data. - range: uriorcurie - hash: - title: File Hash - description: File hash information - range: FileHash - hash_type: - title: File Hash Type - description: The type of file hash, eg, md5 - range: EnumFileHashType - hash_value: - title: File Hash Value - description: The value of the file hash - range: string - dataset_id: - title: Dataset ID - description: Unique identifier for a Dataset. - range: Dataset - data_collection_start: - title: Data Collection Start - description: The date that data collection started. May include only a year. - #TODO: We could re-evaluate these as dates, but that may be too implementation specific - range: string - data_collection_end: - title: Data Collection End - description: The date that data collection started. May include only a year. - #TODO: We could re-evaluate these as dates, but that may be too implementation specific - range: string - -enums: - EnumDataUsePermission: - title: Data Use Permission - description: Data Use Ontology (DUO) terms for data use permissions. - #Do we need a "registered tier" item? - reachable_from: - source_ontology: bioregistry:duo - source_nodes: - - DUO:0000001 - is_direct: false - relationship_types: - - rdfs:subClassOf - EnumDataUseModifier: - title: Data Use Modifier - description: Data Use Ontology (DUO) terms for data use modifiers. - reachable_from: - source_ontology: bioregistry:duo - source_nodes: - - DUO:0000017 - is_direct: false - relationship_types: - - rdfs:subClassOf - EnumProgram: - title: Funding Programs - description: Funding programs relevant to inform operations. - permissible_values: - include: - title: INCLUDE - kf: - title: KF - other: - title: Other - EnumResearchDomain: - title: Research Domain - description: Domains of Research used to find studies. - #TODO: replace/add NIH internal categories from Huiqing - permissible_values: - behavior_and_behavior_mechanisms: - title: Behavior and Behavior Mechanisms - meaning: mesh:D001520 - congenital_heart_defects: - title: Congenital Heart Defects - meaning: mesh:D006330 - immune_system_diseases: - title: Immune System Diseases - meaning: mesh:D007154 - hematologic_diseases: - title: Hematologic Diseases - meaning: mesh:D006402 - neurodevelopment: - title: Neurodevelopment - meaning: mesh:D065886 - sleep_wake_disorders: - title: Sleep Wake Disorders - meaning: mesh:D012893 - all_co_occurring_conditions: - title: All Co-occurring Conditions - meaning: mesh:D013568 - physical_fitness: - title: Physical Fitness - meaning: mesh:D010809 - other: - title: Other - EnumParticipantLifespanStage: - title: Participant Lifespan Stage - description: Stages of life during which participants may be recruited. - permissible_values: - fetal: - title: Fetal - description: Before birth - neonatal: - title: Neonatal - description: 0-28 days old - pediatric: - title: Pediatric - description: Birth-17 years old - adult: - title: Adult - description: 18+ years old - EnumStudyDesign: - title: Study Design - description: Approaches for collecting data, investigating interventions, and/or analyzing data. - #TODO: Add meanings - permissible_values: - case_control: - title: Case-Control - case_set: - title: Case Set - control_set: - title: Control Set - clinical_trial: - title: Clinical Trial - cross_sectional: - title: Cross-Sectional - family_twins_trios: - title: Family/Twins/Trios - interventional: - title: Interventional - longitudinal: - title: Longitudinal - trial_readiness_study: - title: Trial Readiness Study - tumor_vs_matched_normal: - title: Tumor vs Matched Normal - EnumClinicalDataSourceType: - title: Clinical Data Source Type - description: Approaches to ascertain clinical information about a participant. - #TODO: Add meanings - permissible_values: - medical_record: - title: Medical Record - description: Data obtained directly from medical record - investigator_assessment: - title: Investigator Assessment - description: Data obtained by examination, interview, etc. with investigator - participant_or_caregiver_report: - title: Participant or Caregiver Report - description: Data obtained from survey, questionnaire, etc. filled out by participant or caregiver - other: - title: Other - description: Data obtained from other source, such as tissue bank - unknown: - title: Unknown - EnumDataCategory: - title: Data Category - description: Categories of data which may be collected about participants. - #TODO: Add meanings - permissible_values: - #Should we have these two demo/clinical data categories? - unharmonized_demographic_clinical_data: - title: Unharmonized Demographic/Clinical Data - harmonized_demographic_clinical_data: - title: Harmonized Demographic/Clinical Data - genomics: - title: Genomics - transcriptomics: - title: Transcriptomics - epigenomics: - title: Epigenomics - proteomics: - title: Proteomics - metabolomics: - title: Metabolomics - cognitive_behavioral: - title: Cognitive/Behavioral - immune_profiling: - title: Immune Profiling - imaging: - title: Imaging - microbiome: - title: Microbiome - #What is the difference between these two? - fitness: - title: Fitness - physical_activity: - title: Physical Activity - other: - title: Other - sleep_study: - title: Sleep Study - EnumSubjectType: - description: Types of Subject entities - permissible_values: - participant: - description: Study participant with consent, assent, or waiver of consent. - non_participant: - description: An individual associated with a study who was not explictly consented, eg, the subject - of a reported family history. - cell_line: - description: Cell Line - animal_model: - description: Animal model - group: - description: A group of individuals or entities. - other: - description: A different entity type- ideally this will be resolved! - EnumDownSyndromeStatus: - description: Down syndrome / chromosome 21 status - permissible_values: - d21: - title: D21 - description: Disomy 21 (euploid) - meaning: PATO:0001393 - t21: - title: T21 - description: Trisomy 21 (Down syndrome) - meaning: MONDO:0008608 - EnumSex: - description: Subject Sex - permissible_values: - female: - title: Female - meaning: NCIT:C16576 - male: - title: Male - meaning: NCIT:C20197 - other: - title: Other - meaning: NCIT:C17649 - unknown: - title: Unknown - meaning: NCIT:C17998 - EnumRace: - description: Participant Race - permissible_values: - american_indian_or_alaska_native: - title: American Indian or Alaska Native - meaning: NCIT:C41259 - asian: - title: Asian - meaning: NCIT:C41260 - black_or_african_american: - title: Black or African American - meaning: NCIT:C16352 - more_than_one_race: - title: More than one race - meaning: NCIT:C67109 - native_hawaiian_or_other_pacific_islander: - title: Native Hawaiian or Other Pacific Islander - meaning: NCIT:C41219 - other: - title: Other - meaning: NCIT:C17649 - white: - title: White - meaning: NCIT:C41261 - prefer_not_to_answer: - title: Prefer not to answer - meaning: NCIT:C132222 - unknown: - title: Unknown - meaning: NCIT:C17998 - east_asian: - title: East Asian - description: UK only; do not use for US data - meaning: NCIT:C161419 - latin_american: - title: Latin American - description: UK only; do not use for US data - meaning: NCIT:C126531 - middle_eastern_or_north_african: - title: Middle Eastern or North African - description: UK only; do not use for US data - meaning: NCIT:C43866 - south_asian: - title: South Asian - description: UK only; do not use for US data - meaning: NCIT:C41263 - EnumEthnicity: - description: Participant ethnicity, specific to Hispanic or Latino. - permissible_values: - # asked_but_unknown: - # text: asked_but_unknown - # title: Asked but unknown - hispanic_or_latino: - title: Hispanic or Latino - meaning: NCIT:C17459 - not_hispanic_or_latino: - title: Not Hispanic or Latino - meaning: NCIT:C41222 - #This should likely be rolled into a null flavor - prefer_not_to_answer: - title: Prefer not to answer - meaning: NCIT:C132222 - unknown: - title: Unknown - meaning: NCIT:C17998 - EnumVitalStatus: - description: Descriptions of a Subject's vital status - is_a: EnumNull - permissible_values: - dead: - title: Dead - meaning: NCIT:C28554 - alive: - title: Alive - meaning: NCIT:C37987 - EnumNull: - description: Base enumeration providing null options. - permissible_values: - unknown: - title: Unknown - meaning: NCIT:C17998 - EnumFamilyType: - description: Enumerations describing research family type - is_a: EnumNull - permissible_values: - control_only: - title: Control-only - description: Control Only - duo: - title: Duo - description: Duo - proband_only: - title: Proband-only - description: Proband Only - trio: - title: Trio - description: Trio (2 parents and affected child) - trio_plus: - title: Trio+ - description: 2 Parents and 2 or more children - EnumConsanguinityAssertion: - description: Asserts known or suspected consanguinity in this study family - permissible_values: - not_suspected: - title: not-suspected - description: Not suspected - meaning: snomed_ct:428263003 - suspected: - title: suspected - description: Suspected - meaning: snomed_ct:415684004 - known_present: - title: known-present - description: Known Present - meaning: snomed_ct:410515003 - unknown: - title: unknown - description: Unknown - meaning: snomed_ct:261665006 - EnumAssertionProvenance: - description: Possible data sources for assertions. - is_a: EnumNull - permissible_values: - medical_record: - title: Medical Record - description: Data obtained from a medical record - investigator_assessment: - title: Investigator Assessment - description: Data obtained by examination, interview, etc. with investigator - participant_or_caregiver_report: - title: Participant or Caregiver Report - description: Data obtained from survey, questionnaire, etc. filled out by participant or caregiver - other: - title: Other - description: Data obtained from other source, such as tissue bank - #TODO: Revisit these bindings / enumerations - EnumAvailabilityStatus: - description: Is the biospecimen available for use? - permissible_values: - available: - title: Available - meaning: ig2_biospecimen_availability:available - description: Biospecimen is Available - unavailable: - title: Unavailable - meaning: ig2_biospecimen_availability:unavailable - description: Biospecimen is Unavailable - EnumSampleCollectionMethod: - description: The approach used to collect the biospecimen. [LOINC](https://loinc.org) is recommended. - EnumSite: - description: The location of the specimen collection. [SNOMED Body Site](https://hl7.org/fhir/R4B/valueset-body-site.html) is recommended. - EnumSpatialQualifiers: - description: Any spatial/location qualifiers. - enum_uri: http://hl7.org/fhir/us/mcode/ValueSet/mcode-body-location-qualifier-vs - reachable_from: - source_ontology: bioregistry:snomedct - source_nodes: - - snomedct:106233006 - - snomedct:272424004 - - snomedct:51440002 - - snomedct:399488007 - - snomedct:24028007 - - snomedct:7771000 - is_direct: false - relationship_types: - - rdfs:subClassOf - EnumLaterality: - description: Laterality information for the site - EnumEDAMFormats: - description: Data formats from the EDAM ontology. - reachable_from: - source_ontology: bioregistry:edam - source_nodes: - - edam:format_1915 #Format - include_self: false - is_direct: false - relationship_types: - - rdfs:subClassOf - EnumEDAMDataTypes: - description: Data types from the EDAM ontology. - reachable_from: - source_ontology: bioregistry:edam - source_nodes: - - edam:data_0006 #Data - include_self: false - is_direct: false - relationship_types: - - rdfs:subClassOf - EnumFileHashType: - description: Types of file hashes supported. - permissible_values: - md5: - title: MD5 - etag: - title: ETag - sha1: - title: SHA-1 - - diff --git a/tests/data/valid/Demographics-000.yaml b/tests/data/valid/Demographics-000.yaml index 6e03199..9123c2e 100644 --- a/tests/data/valid/Demographics-000.yaml +++ b/tests/data/valid/Demographics-000.yaml @@ -2,5 +2,4 @@ subject_id: subject000 sex: male race: - american_indian_or_alaska_native -ethnicity: hispanic_or_latino -down_syndrome_status: d21 \ No newline at end of file +ethnicity: hispanic_or_latino \ No newline at end of file