WaitForLampWarm

Bases: KPFFunction

Wait for the specified lamp to be warm.

Parameters:
  • CalSource (str) –

    Which lamp to wait for. Allowed Values: BrdbandFiber, U_gold, U_daily, Th_daily, Th_gold, WideFlat

KTL Keywords Used:

  • kpflamps.FF_FIBER_STATUS
  • kpflamps.FF_FIBER_TIMEON
  • kpflamps.FF_FIBER_THRESHOLD
  • kpflamps.BRDBANDFIBER_STATUS
  • kpflamps.BRDBANDFIBER_TIMEON
  • kpflamps.BRDBANDFIBER_THRESHOLD
  • kpflamps.TH_DAILY_STATUS
  • kpflamps.TH_DAILY_TIMEON
  • kpflamps.TH_DAILY_THRESHOLD
  • kpflamps.TH_GOLD_STATUS
  • kpflamps.TH_GOLD_TIMEON
  • kpflamps.TH_GOLD_THRESHOLD
  • kpflamps.U_DAILY_STATUS
  • kpflamps.U_DAILY_TIMEON
  • kpflamps.U_DAILY_THRESHOLD
  • kpflamps.U_GOLD_STATUS
  • kpflamps.U_GOLD_TIMEON
  • kpflamps.U_GOLD_THRESHOLD

Scripts Called:

  • kpf.calbench.CalLampPower
Source code in kpf/calbench/WaitForLampWarm.py
 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
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
class WaitForLampWarm(KPFFunction):
    '''Wait for the specified lamp to be warm.

    Args:
        CalSource (str): Which lamp to wait for. Allowed Values: BrdbandFiber,
            U_gold, U_daily, Th_daily, Th_gold, WideFlat

    KTL Keywords Used:

    - `kpflamps.FF_FIBER_STATUS`
    - `kpflamps.FF_FIBER_TIMEON`
    - `kpflamps.FF_FIBER_THRESHOLD`
    - `kpflamps.BRDBANDFIBER_STATUS`
    - `kpflamps.BRDBANDFIBER_TIMEON`
    - `kpflamps.BRDBANDFIBER_THRESHOLD`
    - `kpflamps.TH_DAILY_STATUS`
    - `kpflamps.TH_DAILY_TIMEON`
    - `kpflamps.TH_DAILY_THRESHOLD`
    - `kpflamps.TH_GOLD_STATUS`
    - `kpflamps.TH_GOLD_TIMEON`
    - `kpflamps.TH_GOLD_THRESHOLD`
    - `kpflamps.U_DAILY_STATUS`
    - `kpflamps.U_DAILY_TIMEON`
    - `kpflamps.U_DAILY_THRESHOLD`
    - `kpflamps.U_GOLD_STATUS`
    - `kpflamps.U_GOLD_TIMEON`
    - `kpflamps.U_GOLD_THRESHOLD`

    Scripts Called:

    - `kpf.calbench.CalLampPower`
    '''
    @classmethod
    def pre_condition(cls, args):
        check_input(args, 'CalSource')

    @classmethod
    def perform(cls, args):
        lamp = standardize_lamp_name(args.get('CalSource'))
        lamps_that_need_warmup = ['FF_FIBER', 'BRDBANDFIBER', 'TH_DAILY',
                                  'TH_GOLD', 'U_DAILY', 'U_GOLD']
        if lamp in lamps_that_need_warmup:
            kpflamps = ktl.cache('kpflamps')
            log.debug(f'Lamp {lamp} does need to be warmed up before use')
            # Check that lamp is actually on
            lamp = standardize_lamp_name(args.get('CalSource'))
            lamp_statuskw = ktl.cache('kpflamps', f'{lamp}_STATUS')
            lamp_status = lamp_statuskw.read()
            if lamp_status == 'Off':
                log.warning(f"Lamp {lamp} is not on: {lamp_status}")
                CalLampPower.execute({'lamp': args.get('CalSource'), 'power': 'on'})
                lamp_status = lamp_statuskw.read()

            if lamp_status == 'Off':
                raise KPFException(f"Lamp {lamp} should be on: {lamp_status}")
            elif lamp_status == 'Warm':
                log.debug(f"Lamp {lamp} is warm")
            elif lamp_status == 'Warming':
                lamp_timeon = kpflamps[f'{lamp}_TIMEON'].read(binary=True)
                lamp_threshold = kpflamps[f'{lamp}_THRESHOLD'].read(binary=True)
                time_to_wait = lamp_threshold - lamp_timeon
                log.info(f"Lamp {lamp} is warming")
                log.info(f"Estimated time remaining = {time_to_wait:.0f} s")
                while lamp_statuskw.read() != 'Warm':
                    # Check if scriptstop has been activated
                    check_scriptstop()
                    log.debug(f'Waiting for {lamp}_STATUS == Warm')
                    expr = f"($kpflamps.{lamp}_STATUS == 'Warm')"
                    warm = ktl.waitFor(expr, timeout=30)
                    if warm is False:
                        new_lamp_timeton = kpflamps[f'{lamp}_TIMEON'].read(binary=True)
                        if new_lamp_timeton <= lamp_timeon:
                            break
                        lamp_timeon = new_lamp_timeton

    @classmethod
    def post_condition(cls, args):
        lamp = standardize_lamp_name(args.get('CalSource'))
        lamps_that_need_warmup = ['FF_FIBER', 'BRDBANDFIBER', 'TH_DAILY',
                                  'TH_GOLD', 'U_DAILY', 'U_GOLD']
        if lamp in lamps_that_need_warmup:
            lamp_statuskw = ktl.cache('kpflamps', f'{lamp}_STATUS')
            lamp_status = lamp_statuskw.read()
            if lamp_status != 'Warm':
                raise FailedPostCondition(f"Lamp {lamp} should be warm: {lamp_status}")

    @classmethod
    def add_cmdline_args(cls, parser):
        parser.add_argument('lamp', type=str,
                            choices=['BrdbandFiber', 'U_gold', 'U_daily',
                                     'Th_daily', 'Th_gold', 'WideFlat'],
                            help='Which lamp are we waiting on?')
        return super().add_cmdline_args(parser)