@startuml
skinparam class {
    BackgroundColor<<master-data>> LightSalmon
    BackgroundColor<<work-product-component>> Gold
    BackgroundColor<<abstract>> LightSteelBlue
    BackgroundColor<<reference-data>> Turquoise
    BackgroundColor<<Abstraction>> LightSkyBlue
    BackgroundColor<<error>> Red
    BackgroundColor<<ReferenceType>> LightSkyBlue
    BackgroundColor<<WorkProductComponent>> LightSkyBlue
    BackgroundColor<<Project>> LightSkyBlue
    BackgroundColor<<Survey>> LightSkyBlue
    BackgroundColor<<Dataset>> LightSkyBlue
    BackgroundColor<<File>> LightSkyBlue
    BackgroundColor<<FileCollection>> LightSkyBlue
    packageStyle rectangle
}
package "AbstractFacilityVerticalMeasurement.1.0.0 Entity" <<rectangle>>
{
abstract class "AbstractFacilityVerticalMeasurement" <<abstract>>
   note top of "AbstractFacilityVerticalMeasurement" : Class evaluated\nin this E-R diagram
   class "VerticalMeasurementPath" <<reference-data>>
   "AbstractFacilityVerticalMeasurement" --> "1" "VerticalMeasurementPath" : "VerticalMeasurementPathID"
   class "VerticalMeasurementSource" <<reference-data>>
   "AbstractFacilityVerticalMeasurement" --> "1" "VerticalMeasurementSource" : "VerticalMeasurementSourceID"
   class "WellboreTrajectory" <<work-product-component>>
   "AbstractFacilityVerticalMeasurement" --> "1" "WellboreTrajectory" : "WellboreTVDTrajectoryID"
   abstract class "AbstractWPCGroupType" <<abstract>>
   "WellboreTrajectory" *-- "1" "AbstractWPCGroupType" : "allOf"
   class "dataset/AnyObject" <<dataset>>
   "AbstractWPCGroupType" --> "*" "dataset/AnyObject" : "Datasets"
   class "ArtefactRole" <<reference-data>>
   "AbstractWPCGroupType" --> "*" "ArtefactRole" : "Artefacts.RoleID"
   "AbstractWPCGroupType" --> "*" "dataset/AnyObject" : "Artefacts.ResourceID"
   abstract class "AbstractWorkProductComponent" <<abstract>>
   "WellboreTrajectory" *-- "1" "AbstractWorkProductComponent" : "allOf"
   abstract class "AbstractSpatialLocation" <<abstract>>
   "AbstractWorkProductComponent" *-- "1" "AbstractSpatialLocation" : "SpatialPoint"
   class "QuantitativeAccuracyBand" <<reference-data>>
   "AbstractSpatialLocation" --> "1" "QuantitativeAccuracyBand" : "QuantitativeAccuracyBandID"
   abstract class "AbstractAnyCrsFeatureCollection" <<abstract>>
   "AbstractSpatialLocation" *-- "1" "AbstractAnyCrsFeatureCollection" : "AsIngestedCoordinates"
   class "CoordinateReferenceSystem" <<reference-data>>
   "AbstractAnyCrsFeatureCollection" --> "1" "CoordinateReferenceSystem" : "CoordinateReferenceSystemID"
   "CoordinateReferenceSystem" --> "1" "CoordinateReferenceSystem" : "HorizontalCRSID"
   "CoordinateReferenceSystem" --> "1" "CoordinateReferenceSystem" : "VerticalCRSID"
   class "CoordinateTransformation" <<reference-data>>
   "CoordinateReferenceSystem" --> "1" "CoordinateTransformation" : "TransformationID"
   "CoordinateTransformation" --> "*" "CoordinateTransformation" : "ConcatenatedTransformations.TransformationID"
   "CoordinateTransformation" --> "1" "CoordinateReferenceSystem" : "SourceCRSID"
   "CoordinateReferenceSystem" --> "1" "CoordinateReferenceSystem" : "BaseCRSID"
   "CoordinateReferenceSystem" --> "1" "CoordinateReferenceSystem" : "SourceCRSID"
   "CoordinateReferenceSystem" --> "1" "CoordinateReferenceSystem" : "TargetCRSID"
   class "UnitOfMeasure" <<reference-data>>
   "CoordinateReferenceSystem" --> "1" "UnitOfMeasure" : "HorizontalAxisUnitID"
   class "UnitQuantity" <<reference-data>>
   "UnitOfMeasure" --> "1" "UnitQuantity" : "UnitQuantityID"
   "CoordinateReferenceSystem" --> "1" "UnitOfMeasure" : "VerticalAxisUnitID"
   "CoordinateTransformation" --> "1" "CoordinateReferenceSystem" : "TargetCRSID"
   "AbstractAnyCrsFeatureCollection" --> "1" "CoordinateReferenceSystem" : "VerticalCoordinateReferenceSystemID"
   abstract class "AbstractFeatureCollection" <<abstract>>
   "AbstractSpatialLocation" *-- "1" "AbstractFeatureCollection" : "Wgs84Coordinates"
   "AbstractWorkProductComponent" *-- "1" "AbstractSpatialLocation" : "SpatialArea"
   abstract class "AbstractGeoContext" <<abstract>>
   "AbstractWorkProductComponent" *-- "*" "AbstractGeoContext" : "GeoContexts"
   abstract class "AbstractGeoPoliticalContext" <<abstract>>
   "AbstractGeoContext" *-- "1" "AbstractGeoPoliticalContext" : "oneOf"
   class "GeoPoliticalEntity" <<master-data>>
   "AbstractGeoPoliticalContext" --> "1" "GeoPoliticalEntity" : "GeoPoliticalEntityID"
   abstract class "AbstractMaster" <<abstract>>
   "GeoPoliticalEntity" *-- "1" "AbstractMaster" : "allOf"
   abstract class "AbstractAliasNames" <<abstract>>
   "AbstractMaster" *-- "*" "AbstractAliasNames" : "NameAliases"
   class "StandardsOrganisation" <<reference-data>>
   "AbstractAliasNames" --> "1" "StandardsOrganisation" : "DefinitionOrganisationID"
   class "Organisation" <<master-data>>
   "AbstractAliasNames" --> "1" "Organisation" : "DefinitionOrganisationID"
   "Organisation" *-- "1" "AbstractMaster" : "allOf"
   "AbstractMaster" *-- "*" "AbstractGeoContext" : "GeoContexts"
   abstract class "AbstractGeoBasinContext" <<abstract>>
   "AbstractGeoContext" *-- "1" "AbstractGeoBasinContext" : "oneOf"
   class "Basin" <<master-data>>
   "AbstractGeoBasinContext" --> "1" "Basin" : "BasinID"
   "Basin" *-- "1" "AbstractMaster" : "allOf"
   "AbstractMaster" *-- "1" "AbstractSpatialLocation" : "SpatialLocation"
   "Basin" *-- "*" "AbstractAliasNames" : "BasinNameAliases"
   "Basin" --> "1" "Basin" : "ParentBasinID"
   abstract class "AbstractGeoFieldContext" <<abstract>>
   "AbstractGeoContext" *-- "1" "AbstractGeoFieldContext" : "oneOf"
   class "Field" <<master-data>>
   "AbstractGeoFieldContext" --> "1" "Field" : "FieldID"
   "Field" *-- "1" "AbstractMaster" : "allOf"
   "Field" *-- "*" "AbstractAliasNames" : "FieldNameAliases"
   abstract class "AbstractGeoPlayContext" <<abstract>>
   "AbstractGeoContext" *-- "1" "AbstractGeoPlayContext" : "oneOf"
   class "Play" <<master-data>>
   "AbstractGeoPlayContext" --> "1" "Play" : "PlayID"
   "Play" *-- "1" "AbstractMaster" : "allOf"
   "Play" *-- "*" "AbstractAliasNames" : "PlayNameAliases"
   abstract class "AbstractGeoProspectContext" <<abstract>>
   "AbstractGeoContext" *-- "1" "AbstractGeoProspectContext" : "oneOf"
   class "Prospect" <<master-data>>
   "AbstractGeoProspectContext" --> "1" "Prospect" : "ProspectID"
   "Prospect" *-- "1" "AbstractMaster" : "allOf"
   "Prospect" *-- "*" "AbstractAliasNames" : "ProspectNameAliases"
   "Organisation" *-- "*" "AbstractAliasNames" : "OrganisationNameAliases"
   "GeoPoliticalEntity" *-- "*" "AbstractAliasNames" : "GeoPoliticalEntityNameAliases"
   "GeoPoliticalEntity" --> "1" "GeoPoliticalEntity" : "ParentGeoPoliticalEntityID"
   class "any-group-type/AnyObject" <<any-group-type>>
   "AbstractWorkProductComponent" --> "*" "any-group-type/AnyObject" : "LineageAssertions.ID"
   "WellboreTrajectory" --> "1" "Organisation" : "ServiceCompanyID"
   class "Wellbore" <<master-data>>
   "WellboreTrajectory" --> "1" "Wellbore" : "WellboreID"
   "Wellbore" *-- "1" "AbstractMaster" : "allOf"
   abstract class "AbstractFacility" <<abstract>>
   "Wellbore" *-- "1" "AbstractFacility" : "allOf"
   abstract class "AbstractFacilityOperator" <<abstract>>
   "AbstractFacility" *-- "*" "AbstractFacilityOperator" : "FacilityOperators"
   "AbstractFacilityOperator" --> "1" "Organisation" : "FacilityOperatorOrganisationID"
   "AbstractFacility" --> "1" "Organisation" : "InitialOperatorID"
   "AbstractFacility" --> "1" "Organisation" : "CurrentOperatorID"
   "AbstractFacility" --> "1" "Organisation" : "DataSourceOrganisationID"
   class "OperatingEnvironment" <<reference-data>>
   "AbstractFacility" --> "1" "OperatingEnvironment" : "OperatingEnvironmentID"
   "AbstractFacility" *-- "*" "AbstractAliasNames" : "FacilityNameAliases"
   abstract class "AbstractFacilityState" <<abstract>>
   "AbstractFacility" *-- "*" "AbstractFacilityState" : "FacilityStates"
   abstract class "AbstractFacilityEvent" <<abstract>>
   "AbstractFacility" *-- "*" "AbstractFacilityEvent" : "FacilityEvents"
   abstract class "AbstractFacilitySpecification" <<abstract>>
   "AbstractFacility" *-- "*" "AbstractFacilitySpecification" : "FacilitySpecifications"
   "AbstractFacilitySpecification" --> "1" "UnitOfMeasure" : "UnitOfMeasureID"
   class "Well" <<master-data>>
   "Wellbore" --> "1" "Well" : "WellID"
   "Well" *-- "1" "AbstractMaster" : "allOf"
   "Well" *-- "1" "AbstractFacility" : "allOf"
   "Well" --> "1" "CoordinateReferenceSystem" : "DefaultVerticalCRSID"
   abstract class "AbstractFacilityVerticalMeasurement" <<abstract>>
   "Well" *-- "1" "AbstractFacilityVerticalMeasurement" : "VerticalMeasurements.allOf"
   "AbstractFacilityVerticalMeasurement" --> "1" "UnitOfMeasure" : "VerticalMeasurementUnitOfMeasureID"
   "AbstractFacilityVerticalMeasurement" --> "1" "CoordinateReferenceSystem" : "VerticalCRSID"
   "Wellbore" *-- "1" "AbstractFacilityVerticalMeasurement" : "VerticalMeasurements.allOf"
   abstract class "AbstractWellboreDrillingReason" <<abstract>>
   "Wellbore" *-- "*" "AbstractWellboreDrillingReason" : "DrillingReasons"
   "Wellbore" --> "1" "Wellbore" : "KickOffWellbore"
   "Wellbore" --> "1" "WellboreTrajectory" : "DefinitiveTrajectoryID"
   "WellboreTrajectory" --> "1" "CoordinateReferenceSystem" : "ProjectedCRSID"
   "WellboreTrajectory" --> "1" "CoordinateReferenceSystem" : "GeographicCRSID"
   "WellboreTrajectory" *-- "1" "AbstractFacilityVerticalMeasurement" : "VerticalMeasurement"
   class "GeologicalFormation" <<reference-data>>
   "Wellbore" --> "1" "GeologicalFormation" : "TargetFormation"
   "Wellbore" *-- "1" "AbstractSpatialLocation" : "ProjectedBottomHoleLocation"
   "Wellbore" *-- "1" "AbstractSpatialLocation" : "GeographicBottomHoleLocation"
}
package "Legend"  <<rectangle>> #EEEEEE {
   abstract class "Super Type" <<Abstraction>>
   class MasterDataEntity <<master-data>>
   class WorkProductComponent <<work-product-component>>
   abstract class AbstractEntity <<abstract>>
   "Super Type" <|-- MasterDataEntity
   MasterDataEntity *- "1" AbstractEntity : MasterDataEntity\nis composed of one\nAbstractEntity
   WorkProductComponent *- "*" AbstractEntity : WorkProductComponent\nis composed of many\nAbstractEntities
   MasterDataEntity "1" <-- WorkProductComponent : Relationship\nto one
   class UnspecifiedEntity <<any-group-type>>
   WorkProductComponent --> "*" UnspecifiedEntity: Named relationship\nto many
   class ReferenceEntity << reference-data >>
   WorkProductComponent --> "1" ReferenceEntity: Named relationship\nto one
}
@enduml