@startuml hyperion_parameter_model
'https://plantuml.com/class-diagram
title Hyperion Parameter Model

abstract class BaseModel

package Mixins {
    class WithSample
    class WithScan
    class WithOavCentring
    class WithSnapshot
    class OptionalXyzStarts
    class XyzStarts
    class OptionalGonioAngleStarts
    class SplitScan
    class RotationScanPerSweep
    class RotationExperiment
}

package Experiments {
    class DiffractionExperiment
    class DiffractionExperimentWithSample
    class GridCommon
    class GridScanWithEdgeDetect
    class PinTipCentreThenXrayCentre
    class RotationScan
    class MultiRotationScan
    class RobotLoadThenCentre
    class SpecifiedGridScan
    class ThreeDGridScan
}

class HyperionParameters
note bottom: Base class for all experiment parameter models

class TemporaryIspybExtras
note bottom: To be removed


BaseModel <|-- HyperionParameters
BaseModel <|-- SplitScan
BaseModel <|-- OptionalGonioAngleStarts
BaseModel <|-- OptionalXyzStarts
BaseModel <|-- TemporaryIspybExtras
BaseModel <|-- WithOavCentring
BaseModel <|-- WithSnapshot
BaseModel <|-- WithSample
BaseModel <|-- WithScan
BaseModel <|-- XyzStarts

RotationScan *-- TemporaryIspybExtras
MultiRotationScan *-- TemporaryIspybExtras
OptionalGonioAngleStarts <|-- RotationScanPerSweep
OptionalXyzStarts  <|-- RotationScanPerSweep
DiffractionExperimentWithSample <|-- RotationExperiment
HyperionParameters <|-- DiffractionExperiment
WithSnapshot <|-- DiffractionExperiment
DiffractionExperiment <|-- DiffractionExperimentWithSample
WithSample <|-- DiffractionExperimentWithSample
DiffractionExperimentWithSample <|-- GridCommon
GridCommon <|-- GridScanWithEdgeDetect
GridCommon <|-- PinTipCentreThenXrayCentre
GridCommon <|-- RobotLoadThenCentre
GridCommon <|-- SpecifiedGridScan
WithScan <|-- SpecifiedGridScan
SpecifiedGridScan <|-- ThreeDGridScan
SplitScan <|-- ThreeDGridScan
WithOavCentring <|-- GridCommon
WithScan <|-- RotationScan
RotationScanPerSweep <|-- RotationScan
MultiRotationScan *-- RotationScanPerSweep
RotationExperiment <|-- RotationScan
RotationExperiment <|-- MultiRotationScan
SplitScan <|-- MultiRotationScan
XyzStarts <|-- SpecifiedGridScan
OptionalGonioAngleStarts <|-- GridCommon
OptionalGonioAngleStarts <|-- RotationScan
@enduml
