diff --git a/src/include_access_model/datamodel/include_access_model.py b/src/include_access_model/datamodel/include_access_model.py index bd68580..df53e92 100644 --- a/src/include_access_model/datamodel/include_access_model.py +++ b/src/include_access_model/datamodel/include_access_model.py @@ -1,5 +1,5 @@ # Auto generated from include_access_model.yaml by pythongen.py version: 0.0.1 -# Generation date: 2026-03-09T10:45:00 +# Generation date: 2026-03-09T12:08:53 # Schema: include-access-model # # id: https://includedcc.org/include-access-model @@ -125,6 +125,18 @@ class AliquotAliquotId(extended_str): pass +class EncounterEncounterId(extended_str): + pass + + +class EncounterDefinitionEncounterDefinitionId(extended_str): + pass + + +class ActivityDefinitionActivityDefinitionId(extended_str): + pass + + @dataclass(repr=False) class Record(YAMLRoot): """ @@ -554,6 +566,7 @@ class SubjectAssertion(Record): 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 @@ -575,6 +588,9 @@ def __post_init__(self, *_: str, **kwargs: Any): 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) @@ -717,6 +733,7 @@ class BiospecimenCollection(Record): 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): @@ -727,6 +744,9 @@ def __post_init__(self, *_: str, **kwargs: Any): 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) @@ -777,6 +797,111 @@ def __post_init__(self, *_: str, **kwargs: Any): 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] = INCLUDEDCC["Encounter"] + class_class_curie: ClassVar[str] = "includedcc:Encounter" + class_name: ClassVar[str] = "Encounter" + class_model_uri: ClassVar[URIRef] = INCLUDEDCC.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] = INCLUDEDCC["EncounterDefinition"] + class_class_curie: ClassVar[str] = "includedcc:EncounterDefinition" + class_name: ClassVar[str] = "EncounterDefinition" + class_model_uri: ClassVar[URIRef] = INCLUDEDCC.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] = INCLUDEDCC["ActivityDefinition"] + class_class_curie: ClassVar[str] = "includedcc:ActivityDefinition" + class_name: ClassVar[str] = "ActivityDefinition" + class_model_uri: ClassVar[URIRef] = INCLUDEDCC.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) + + # Enumerations class EnumProgram(EnumDefinitionImpl): """ @@ -1493,6 +1618,18 @@ class slots: slots.laterality = Slot(uri=INCLUDEDCC.laterality, name="laterality", curie=INCLUDEDCC.curie('laterality'), model_uri=INCLUDEDCC.laterality, domain=None, range=Optional[Union[str, "EnumLaterality"]]) +slots.encounter_id = Slot(uri=INCLUDEDCC.encounter_id, name="encounter_id", curie=INCLUDEDCC.curie('encounter_id'), + model_uri=INCLUDEDCC.encounter_id, domain=None, range=Optional[Union[str, EncounterEncounterId]]) + +slots.description = Slot(uri=INCLUDEDCC.description, name="description", curie=INCLUDEDCC.curie('description'), + model_uri=INCLUDEDCC.description, domain=None, range=Optional[str]) + +slots.encounter_definition_id = Slot(uri=INCLUDEDCC.encounter_definition_id, name="encounter_definition_id", curie=INCLUDEDCC.curie('encounter_definition_id'), + model_uri=INCLUDEDCC.encounter_definition_id, domain=None, range=Optional[Union[str, EncounterDefinitionEncounterDefinitionId]]) + +slots.activity_definition_id = Slot(uri=INCLUDEDCC.activity_definition_id, name="activity_definition_id", curie=INCLUDEDCC.curie('activity_definition_id'), + model_uri=INCLUDEDCC.activity_definition_id, domain=None, range=Optional[Union[str, ActivityDefinitionActivityDefinitionId]]) + slots.Study_study_id = Slot(uri=INCLUDEDCC.study_id, name="Study_study_id", curie=INCLUDEDCC.curie('study_id'), model_uri=INCLUDEDCC.Study_study_id, domain=Study, range=Union[str, StudyStudyId]) @@ -1525,3 +1662,15 @@ class slots: slots.Aliquot_aliquot_id = Slot(uri=INCLUDEDCC.aliquot_id, name="Aliquot_aliquot_id", curie=INCLUDEDCC.curie('aliquot_id'), model_uri=INCLUDEDCC.Aliquot_aliquot_id, domain=Aliquot, range=Union[str, AliquotAliquotId]) + +slots.Encounter_encounter_id = Slot(uri=INCLUDEDCC.encounter_id, name="Encounter_encounter_id", curie=INCLUDEDCC.curie('encounter_id'), + model_uri=INCLUDEDCC.Encounter_encounter_id, domain=Encounter, range=Union[str, EncounterEncounterId]) + +slots.EncounterDefinition_encounter_definition_id = Slot(uri=INCLUDEDCC.encounter_definition_id, name="EncounterDefinition_encounter_definition_id", curie=INCLUDEDCC.curie('encounter_definition_id'), + model_uri=INCLUDEDCC.EncounterDefinition_encounter_definition_id, domain=EncounterDefinition, range=Union[str, EncounterDefinitionEncounterDefinitionId]) + +slots.EncounterDefinition_activity_definition_id = Slot(uri=INCLUDEDCC.activity_definition_id, name="EncounterDefinition_activity_definition_id", curie=INCLUDEDCC.curie('activity_definition_id'), + model_uri=INCLUDEDCC.EncounterDefinition_activity_definition_id, domain=EncounterDefinition, range=Optional[Union[Union[str, ActivityDefinitionActivityDefinitionId], list[Union[str, ActivityDefinitionActivityDefinitionId]]]]) + +slots.ActivityDefinition_activity_definition_id = Slot(uri=INCLUDEDCC.activity_definition_id, name="ActivityDefinition_activity_definition_id", curie=INCLUDEDCC.curie('activity_definition_id'), + model_uri=INCLUDEDCC.ActivityDefinition_activity_definition_id, domain=ActivityDefinition, range=Union[str, ActivityDefinitionActivityDefinitionId]) diff --git a/src/include_access_model/datamodel/include_access_model_pydantic.py b/src/include_access_model/datamodel/include_access_model_pydantic.py index 52180da..c0f494d 100644 --- a/src/include_access_model/datamodel/include_access_model_pydantic.py +++ b/src/include_access_model/datamodel/include_access_model_pydantic.py @@ -472,7 +472,10 @@ class VirtualBiorepository(Record): linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/include-access-model', 'title': 'Virtual BioRepository (VBR)'}) - name: Optional[str] = Field(default=None, title="Name", description="""Name of the entity.""", json_schema_extra = { "linkml_meta": {'domain_of': ['VirtualBiorepository', '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']} }) 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 for the Record.""", json_schema_extra = { "linkml_meta": {'domain_of': ['Study', 'VirtualBiorepository', 'Publication']} }) @@ -503,7 +506,10 @@ class Investigator(Record): linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({'from_schema': 'https://includedcc.org/include-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']} }) + name: Optional[str] = Field(default=None, title="Name", description="""Name of the entity.""", json_schema_extra = { "linkml_meta": {'domain_of': ['VirtualBiorepository', + 'Investigator', + 'EncounterDefinition', + 'ActivityDefinition']} }) 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']} }) @@ -533,7 +539,7 @@ class Subject(Record): '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', 'SubjectAssertion']} }) + subject_id: str = Field(default=..., title="Study ID", description="""INCLUDE Global ID for the Subject""", json_schema_extra = { "linkml_meta": {'domain_of': ['Subject', 'Demographics', 'SubjectAssertion', 'Encounter']} }) 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""", 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']} }) @@ -549,7 +555,7 @@ class Demographics(Record): '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', 'SubjectAssertion']} }) + subject_id: str = Field(default=..., title="Study ID", description="""INCLUDE Global ID for the Subject""", json_schema_extra = { "linkml_meta": {'domain_of': ['Subject', 'Demographics', 'SubjectAssertion', 'Encounter']} }) 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']} }) @@ -572,10 +578,11 @@ class SubjectAssertion(Record): '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', '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', 'SubjectAssertion', 'Encounter']} }) + 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'], '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="Assertion 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']} }) @@ -647,6 +654,7 @@ class BiospecimenCollection(Record): 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']} }) @@ -671,6 +679,67 @@ class Aliquot(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']} }) +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/include-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', 'SubjectAssertion', 'Encounter']} }) + 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']} }) + + +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/include-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']} }) + description: Optional[str] = Field(default=None, title="Description", description="""Description for this entity.""", json_schema_extra = { "linkml_meta": {'domain_of': ['EncounterDefinition', 'ActivityDefinition']} }) + 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']} }) + + +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/include-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']} }) + description: Optional[str] = Field(default=None, title="Description", description="""Description for this entity.""", 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']} }) + + # Model rebuild # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model Record.model_rebuild() @@ -687,3 +756,6 @@ class Aliquot(Record): Sample.model_rebuild() BiospecimenCollection.model_rebuild() Aliquot.model_rebuild() +Encounter.model_rebuild() +EncounterDefinition.model_rebuild() +ActivityDefinition.model_rebuild() diff --git a/src/include_access_model/schema/include_access_model.yaml b/src/include_access_model/schema/include_access_model.yaml index 5e43679..cdcb9d9 100644 --- a/src/include_access_model/schema/include_access_model.yaml +++ b/src/include_access_model/schema/include_access_model.yaml @@ -169,7 +169,7 @@ classes: slots: - assertion_id - subject_id - #- encounter_id + - encounter_id - assertion_provenance - age_at_assertion - age_at_event @@ -228,6 +228,7 @@ classes: - site - spatial_qualifier - laterality + - encounter_id slot_usage: biospecimen_collection_id: range: string @@ -250,6 +251,61 @@ classes: 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 + + slots: study_id: @@ -612,6 +668,22 @@ slots: 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 enums: EnumProgram: