@startuml
'https://plantuml.com/class-diagram

class ConfigurableObject

class Scan {
        filename: str
        raw_data: numpy.ndarray
        dtype: numpy.dtype
        modulation: numpy.ndarray
        modulation_func: Callable
        modulation_args: Dict
        rfactor_func: Callable
        rfactor_args: Dict
        mode: List
        emitter: str
        initial_state: str
        positions: Dict

        __init__()
        copy()
        load()
        define_scan()
        import_scan_file()
        analyse_raw_data()
        generate_holo_scan()
}

class ScanSpec {
        filename: str
        emitter: str
        initial_state: str
        modulation_func: Callable
        modulation_args: Dict
        rfactor_func: Callable
        rfactor_args: Dict

        __init__()
        load()
}

class ScanKey {
        project: pmsco.project.Project
        key: str

        __init__()
        load()
}

class ScanLoader {
        is_modf: bool
        patch: Dict

        __init__()
        load()
}

class ScanCreator {
        positions: Dict

        __init__()
        load()
}

class HoloScanCreator {
        generator: Callable
        generator_args: Dict

        __init__()
        load()
        set_property()
}

ConfigurableObject <|-- ScanSpec
ConfigurableObject <|-- ScanKey
ScanSpec <|-- ScanCreator
ScanSpec <|-- ScanLoader
ScanSpec <|-- HoloScanCreator
ScanKey --> ScanCreator: creates
ScanKey --> HoloScanCreator: creates
ScanKey --> ScanLoader: creates
ScanLoader --> Scan: creates
ScanCreator --> Scan: creates
HoloScanCreator --> Scan: creates

@enduml