WaitForND2

Bases: KPFTranslatorFunction

Description

Set the filter in the ND2 filter wheel (the one at the output of the octagon) via the kpfcal.ND2POS keyword.

Parameters:
  • CalND2 (str) –

    The neutral density filter to put in the first filter wheel. This affects only the light injected in to the simultaneous calibration fiber. Allowed Values: OD 0.1, OD 0.3, OD 0.5, OD 0.8, OD 1.0, OD 4.0

KTL Keywords Used:

  • kpfcal.ND2POS
Source code in kpf/calbench/WaitForND2.py
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class WaitForND2(KPFTranslatorFunction):
    '''# Description
    Set the filter in the ND2 filter wheel (the one at the output of the 
    octagon) via the `kpfcal.ND2POS` keyword.

    Args:
        CalND2 (str): The neutral density filter to put in the first filter
            wheel. This affects only the light injected in to the simultaneous
            calibration fiber. Allowed Values: `OD 0.1`, `OD 0.3`, `OD 0.5`,
            `OD 0.8`, `OD 1.0`, `OD 4.0`

    KTL Keywords Used:

    - `kpfcal.ND2POS`
    '''
    @classmethod
    def pre_condition(cls, args, logger, cfg):
        keyword = ktl.cache('kpfcal', 'ND2POS')
        allowed_values = list(keyword._getEnumerators())
        if 'Unknown' in allowed_values:
            allowed_values.pop(allowed_values.index('Unknown'))
        check_input(args, 'CalND2', allowed_values=allowed_values)
        return True

    @classmethod
    def perform(cls, args, logger, cfg):
        target = args.get('CalND2')
        timeout = cfg.getfloat('times', 'nd_move_time', fallback=20)
        expr = f"($kpfcal.ND2POS == '{target}')"
        success = ktl.waitFor(expr, timeout=timeout)
        if success is False:
            log.error(f"Timed out waiting for ND2 filter wheel")

    @classmethod
    def post_condition(cls, args, logger, cfg):
        timeout = cfg.getfloat('times', 'nd_move_time', fallback=20)
        ND2target = args.get('CalND2')
        ND2POS = ktl.cache('kpfcal', 'ND2POS')
        if ND2POS.waitFor(f"== '{ND2target}'", timeout=timeout) == False:
            raise FailedToReachDestination(ND2POS.read(), ND2target)

    @classmethod
    def add_cmdline_args(cls, parser, cfg=None):
        parser.add_argument('CalND2', type=str,
                            choices=["OD 0.1", "OD 0.3", "OD 0.5", "OD 0.8",
                                     "OD 1.0", "OD 4.0"],
                            help='ND2 Filter to use.')
        return super().add_cmdline_args(parser, cfg)