diff --git a/gstlal-ugly/bin/gstlal_ifo_stat b/gstlal-ugly/bin/gstlal_ifo_stat index 540c2decc0ccfee3f0822bfd517a70627ab43d36..438cba9867761b6afa02cca70b36b28b108ac241 100755 --- a/gstlal-ugly/bin/gstlal_ifo_stat +++ b/gstlal-ugly/bin/gstlal_ifo_stat @@ -66,12 +66,40 @@ class IFOStatusTracker(object): # set up deques for storing data self.timedeq = defaultdict(lambda: deque(maxlen=10000)) - routes = ['hoft_ok', 'duration'] + routes = ['state', 'hoft_ok', 'duration'] self.datadeq = {route: defaultdict(lambda: deque(maxlen=10000)) for route in routes} self.previous = defaultdict(lambda: (None, None)) self.duration = defaultdict(lambda: 0) + @staticmethod + def LIGO_parse_state(bitmask): + hoftbit = int(bitmask[31]) + intentbit = int(bitmask[30]) + injbits = int(bitmask[23:26]) + + logging.debug(f'hoftbit: {hoftbit} | intentbit: {intentbit} | injbits: {injbits}') + + if hoftbit: + if intentbit: + if injbits == 111: + state = "Observing" + else: + state = "Injection" + elif injbits == 111: + state = "Ready" + else: + state = "Injection study" + elif injbits == 111: + if intentbit: + state = "Calib not ready" + else: + state = "Down" + else: + state = "Injection study" + + return state + def bufhandler(self, elem, ifo): buf = elem.emit("pull-sample").get_buffer() (result, mapinfo) = buf.map(Gst.MapFlags.READ) @@ -82,13 +110,24 @@ class IFOStatusTracker(object): bit = int(bit) time = float(time) - ## FIXME hacky - if ifo == "K1": + if ifo == "H1" or ifo == "L1": + bitmask = bin(bit) + npad = 32 - len(bitmask) + bitmask = "0" * npad + bitmask + state = self.LIGO_parse_state(bitmask) + + elif ifo == "K1": # only check 0th bit - state = 1 if (bit & 0b1 == 0b1) else 0 + state = "Observing" if (bit & 0b1 == 0b1) else "Down" + else: + # for Virgo check 0th and 1st bit + state = "Observing" if (bit & 0b11 == 0b11) else "Down" + + # keep this metric for backwards compatibility + if state == "Observing": + hoft_ok = 1 else: - # for HLV check 0th and 1st bit - state = 1 if (bit & 0b11 == 0b11) else 0 + hoft_ok = 0 statechange = False @@ -103,7 +142,8 @@ class IFOStatusTracker(object): ## store data self.timedeq[ifo].append(int(time)) - self.datadeq['hoft_ok'][ifo].append(state) + self.datadeq['state'][ifo].append(state) + self.datadeq['hoft_ok'][ifo].append(hoft_ok) self.datadeq['duration'][ifo].append(self.duration[ifo]) if self.last_reduce is None: