@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 WithOptionalEnergyChange
    class WithSnapshot
    class WithVisit
    class OptionalXyzStarts
    class XyzStarts
    class OptionalGonioAngleStarts
    class SplitScan
    class RotationScanPerSweep
    class RotationExperiment
}

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

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

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

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