@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<<Activity>> LightSkyBlue
    BackgroundColor<<ReferenceType>> LightSkyBlue
    BackgroundColor<<WorkProductComponent>> LightSkyBlue
    BackgroundColor<<Project>> LightSkyBlue
    BackgroundColor<<Survey>> LightSkyBlue
    BackgroundColor<<Dataset>> LightSkyBlue
    BackgroundColor<<File>> LightSkyBlue
    BackgroundColor<<FileCollection>> LightSkyBlue
    packageStyle rectangle
}
package "FaultSystem.1.0.0 Entity" <<rectangle>>
{
abstract class "Abstraction of WorkProductComponent" <<WorkProductComponent>>
"Abstraction of WorkProductComponent" <|-- "FaultSystem"
class "FaultSystem" <<work-product-component>>
   note top of "FaultSystem" : Class evaluated\nin this E-R diagram
   abstract class "AbstractWPCGroupType" <<abstract>>
   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>>
   abstract class "AbstractSpatialLocation" <<abstract>>
   abstract class "AbstractAnyCrsFeatureCollection" <<abstract>>
   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>>
   class "QuantitativeAccuracyBand" <<reference-data>>
   "AbstractSpatialLocation" --> "1" "QuantitativeAccuracyBand" : "QuantitativeAccuracyBandID"
   "AbstractSpatialLocation" *-- "1" "AbstractAnyCrsFeatureCollection" : "AsIngestedCoordinates"
   "AbstractSpatialLocation" *-- "1" "AbstractFeatureCollection" : "Wgs84Coordinates"
   abstract class "AbstractGeoContext" <<abstract>>
   abstract class "AbstractGeoPoliticalContext" <<abstract>>
   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[]"
   "AbstractGeoContext" *-- "1" "AbstractGeoPoliticalContext" : "oneOf"
   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"
   abstract class "AbstractGeoBasinContext" <<abstract>>
   abstract class "AbstractGeoFieldContext" <<abstract>>
   abstract class "AbstractGeoPlayContext" <<abstract>>
   abstract class "AbstractGeoProspectContext" <<abstract>>
   "AbstractWorkProductComponent" *-- "1" "AbstractSpatialLocation" : "SpatialPoint"
   "AbstractWorkProductComponent" *-- "1" "AbstractSpatialLocation" : "SpatialArea"
   "AbstractWorkProductComponent" *-- "*" "AbstractGeoContext" : "GeoContexts[]"
   class "any-group-type/AnyObject" <<any-group-type>>
   "AbstractWorkProductComponent" --> "*" "any-group-type/AnyObject" : "LineageAssertions[].ID"
   "FaultSystem" *-- "1" "AbstractWPCGroupType" : "allOf"
   "FaultSystem" *-- "1" "AbstractWorkProductComponent" : "allOf"
   class "SeismicTraceData" <<work-product-component>>
   "FaultSystem" --> "*" "SeismicTraceData" : "SeismicTraceDataIDs[]"
   "SeismicTraceData" *-- "1" "AbstractWPCGroupType" : "allOf"
   "SeismicTraceData" *-- "1" "AbstractWorkProductComponent" : "allOf"
   "SeismicTraceData" *-- "1" "AbstractSpatialLocation" : "LiveTraceOutline"
   class "SeismicBinGrid" <<work-product-component>>
   "SeismicTraceData" --> "1" "SeismicBinGrid" : "BinGridID"
   "SeismicBinGrid" *-- "1" "AbstractWPCGroupType" : "allOf"
   "SeismicBinGrid" *-- "1" "AbstractWorkProductComponent" : "allOf"
   abstract class "AbstractBinGrid" <<abstract>>
   "SeismicBinGrid" *-- "1" "AbstractBinGrid" : "allOf"
   abstract class "AbstractCoordinates" <<abstract>>
   "AbstractBinGrid" *-- "*" "AbstractCoordinates" : "ABCDBinGridLocalCoordinates[]"
   "AbstractBinGrid" *-- "1" "AbstractSpatialLocation" : "ABCDBinGridSpatialLocation"
   "SeismicTraceData" --> "1" "CoordinateReferenceSystem" : "HorizontalCRSID"
   class "SeismicLineGeometry" <<work-product-component>>
   "SeismicTraceData" --> "1" "SeismicLineGeometry" : "SeismicLineGeometryID"
   "SeismicLineGeometry" *-- "1" "AbstractWPCGroupType" : "allOf"
   "SeismicLineGeometry" *-- "1" "AbstractWorkProductComponent" : "allOf"
   class "NotionalSeismicLine" <<work-product-component>>
   "SeismicLineGeometry" --> "1" "NotionalSeismicLine" : "NotionalSeismicLineID"
   "NotionalSeismicLine" *-- "1" "AbstractWPCGroupType" : "allOf"
   "NotionalSeismicLine" *-- "1" "AbstractWorkProductComponent" : "allOf"
   class "Seismic2DInterpretationSet" <<master-data>>
   "SeismicLineGeometry" --> "1" "Seismic2DInterpretationSet" : "Preferred2DInterpretationSetID"
   "Seismic2DInterpretationSet" *-- "1" "AbstractMaster" : "allOf"
   abstract class "AbstractProject" <<abstract>>
   "Seismic2DInterpretationSet" *-- "1" "AbstractProject" : "allOf"
   "AbstractProject" *-- "*" "AbstractAliasNames" : "ProjectNames[]"
   class "Currency" <<reference-data>>
   "AbstractProject" --> "*" "Currency" : "FundsAuthorizations[].CurrencyID"
   class "Agreement" <<master-data>>
   "AbstractProject" --> "*" "Agreement" : "ContractIDs[]"
   "Agreement" *-- "1" "AbstractMaster" : "allOf"
   "Agreement" --> "1" "Agreement" : "AgreementParentID"
   "Agreement" --> "*" "Organisation" : "Counterparties[]"
   "Agreement" --> "*" "any-group-type/AnyObject" : "RestrictedResources[].ResourceID"
   "AbstractProject" --> "1" "Organisation" : "Operator"
   "AbstractProject" --> "*" "Organisation" : "Contractors[].ContractorOrganisationID"
   "AbstractProject" --> "*" "Organisation" : "Personnel[].CompanyOrganisationID"
   class "ProjectRole" <<reference-data>>
   "AbstractProject" --> "*" "ProjectRole" : "Personnel[].ProjectRoleID"
   "AbstractProject" --> "*" "UnitOfMeasure" : "ProjectSpecifications[].UnitOfMeasureID"
   "Seismic2DInterpretationSet" --> "*" "SeismicLineGeometry" : "SeismicLineGeometries[].SeismicLineGeometryID"
   "SeismicLineGeometry" --> "1" "CoordinateReferenceSystem" : "HorizontalCRSID"
   "SeismicLineGeometry" *-- "1" "AbstractSpatialLocation" : "FirstLocation"
   "SeismicLineGeometry" *-- "1" "AbstractSpatialLocation" : "LastLocation"
   "SeismicTraceData" --> "1" "dataset/AnyObject" : "TraceRelationFileID"
   class "SeismicAcquisitionSurvey" <<master-data>>
   "SeismicTraceData" --> "1" "SeismicAcquisitionSurvey" : "PrincipalAcquisitionProjectID"
   "SeismicAcquisitionSurvey" *-- "1" "AbstractMaster" : "allOf"
   "SeismicAcquisitionSurvey" *-- "1" "AbstractProject" : "allOf"
   class "OperatingEnvironment" <<reference-data>>
   "SeismicAcquisitionSurvey" --> "1" "OperatingEnvironment" : "OperatingEnvironmentID"
   class "SeismicProcessingProject" <<master-data>>
   "SeismicTraceData" --> "1" "SeismicProcessingProject" : "ProcessingProjectID"
   "SeismicProcessingProject" *-- "1" "AbstractMaster" : "allOf"
   "SeismicProcessingProject" *-- "1" "AbstractProject" : "allOf"
   "SeismicProcessingProject" --> "*" "SeismicAcquisitionSurvey" : "SeismicAcquisitionSurveys[]"
   class "Seismic3DInterpretationSet" <<master-data>>
   "SeismicTraceData" --> "1" "Seismic3DInterpretationSet" : "Preferred3DInterpretationSetID"
   "Seismic3DInterpretationSet" *-- "1" "AbstractMaster" : "allOf"
   "Seismic3DInterpretationSet" *-- "1" "AbstractProject" : "allOf"
   "Seismic3DInterpretationSet" --> "1" "SeismicBinGrid" : "SeismicBinGridID"
   "SeismicTraceData" --> "1" "Seismic2DInterpretationSet" : "Preferred2DInterpretationSetID"
   "SeismicTraceData" --> "1" "UnitOfMeasure" : "TraceDomainUOM"
   "FaultSystem" --> "1" "UnitOfMeasure" : "SeismicDomainUOM"
   "FaultSystem" --> "1" "CoordinateReferenceSystem" : "HorizontalCRSID"
   "FaultSystem" --> "1" "SeismicBinGrid" : "BinGridID"
   "FaultSystem" --> "*" "UnitOfMeasure" : "Faults[].SeismicFaultLengthUOM"
   "FaultSystem" --> "*" "UnitOfMeasure" : "Faults[].SeismicFaultSurfaceAreaUOM"
   "FaultSystem" --> "*" "UnitOfMeasure" : "Faults[].VerticalFaultDipAngleUOM"
   "FaultSystem" --> "*" "UnitOfMeasure" : "Faults[].FaultHeaveNumberUOM"
   "FaultSystem" --> "*" "UnitOfMeasure" : "Faults[].FaultNetSlipNumberUOM"
   "FaultSystem" --> "*" "UnitOfMeasure" : "Faults[].StratigraphicFaultOffsetUOM"
}
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