diff --git a/LCU/checkhardware/lib/general_lib.py b/LCU/checkhardware/lib/general_lib.py index 3901371b930b1a0dd81c7c7c35f0044542c0cf76..c1de15811aed6a79218666d9ba6676913fc9555e 100644 --- a/LCU/checkhardware/lib/general_lib.py +++ b/LCU/checkhardware/lib/general_lib.py @@ -6,6 +6,8 @@ from subprocess import (Popen, PIPE) import time import os +general_version = '0913' + def writeMessage(msg): res = sendCmd('wall', msg) return diff --git a/LCU/checkhardware/lib/lofar_lib.py b/LCU/checkhardware/lib/lofar_lib.py index ebb97538c4b2a9be9c1395ff40aa0f11ec63a6c2..b017e813a042bbd409ff9c6ed841d7be7a2fb1aa 100644 --- a/LCU/checkhardware/lib/lofar_lib.py +++ b/LCU/checkhardware/lib/lofar_lib.py @@ -6,6 +6,8 @@ import time from general_lib import sendCmd import logging +lofar_version = '0913' + CoreStations = ('CS001C','CS002C','CS003C','CS004C','CS005C','CS006C','CS007C','CS011C',\ 'CS013C','CS017C','CS021C','CS024C','CS026C','CS028C','CS030C','CS031',\ 'CS032C','CS101C','CS103C','CS201C','CS301C','CS302C','CS401C','CS501C') @@ -19,6 +21,8 @@ InternationalStations = ('DE601C','DE602C','DE603C','DE604C','DE605C','FR606C',' StationType = dict( CS=1, RS=2, IS=3 ) logger = None +rcumode = -1 + def init_lofar_lib(): global logger logger = logging.getLogger() @@ -214,6 +218,8 @@ def resetRSPsettings(): def turnonRCUs(mode, rcus): global logger + global rcumode + start_mode = rcumode logger.info("turn RCU's on, mode %d" %(mode)) logger.info("enable rcus") rspctl('--rcuenable=1', wait=0.0) @@ -225,19 +231,25 @@ def turnonRCUs(mode, rcus): rspctl('--specinv=0', wait=0.0) logger.info("set rcu mode") rsp_rcu_mode(mode, rcus) - if mode >= 5: + if mode >= 5 and mode != start_mode: logger.info("set hbadelays to 0 for 1 second") rspctl('--hbadelay=%s' %(('0,'* 16)[:-1]), wait=8.0) + rsp_hba_delay(('128,'*16)[:-1], rcus) + rcumode = mode def turnoffRCUs(): global logger + global rcumode logger.info("RCU's off, mode 0") rspctl('--rcumode=0', wait=0.0) rspctl('--rcuenable=0', wait=0.0) rspctl('--aweights=0,0', wait=1.0) + rcumode = 0 # set rcu mode, if mode > 4(hba) turn on hba's in steps to avoid power dips def rsp_rcu_mode(mode, n_rcus=96): + global rcumode + rcumode = mode if mode > 0 and mode < 5: # lba modes rspctl('--rcumode=%d' %(mode), wait=3.0) return (0) @@ -252,14 +264,36 @@ def rsp_rcu_mode(mode, n_rcus=96): if jump < 2: jump = 2 for step in range(steps): - selection = '--select=' + selection = '' for rcu in range(step*2, n_rcus, jump): selection += '%d,%d,' %(rcu,rcu+1) - rspctl('--rcumode=%d %s' %(mode, selection[:-1]), wait=0.5) + rspctl('--rcumode=%d --select=%s' %(mode, selection[:-1]), wait=0.5) time.sleep(2.5) return (0) else: return (-1) +# set hba_delays in steps to avoid power dips +def rsp_hba_delay(delay, n_rcus=96): + if delay == 0: + rspctl('--hbadelay=%s' %(delay), wait=4.0) + return (0) + else: + #n_rcus = n_boards * 8 + n_pwr_rcus = n_rcus / 2 + # maximum 24 power RCUs each step + steps = n_pwr_rcus / 24 # 4 steps for NL stations, 8 steps for IS stations + jump = n_rcus / 24 # jump = 8 for NL stations and 16 for IS stations + + if steps == 0: steps = 1 + if jump < 2: jump = 2 + + for step in range(steps): + selection = '' + for rcu in range(step*2, n_rcus, jump): + selection += '%d,%d,' %(rcu,rcu+1) + rspctl('--hbadelay=%s --select=%s' %(delay, selection[:-1]), wait=2.0) + time.sleep(2.0) + return (0) diff --git a/LCU/checkhardware/lib/search_lib.py b/LCU/checkhardware/lib/search_lib.py index 7120d1899c4c6634691f37bed836bb29a36bd3b4..a9cb50984e8a6fad465144be4027c61265305de2 100644 --- a/LCU/checkhardware/lib/search_lib.py +++ b/LCU/checkhardware/lib/search_lib.py @@ -9,8 +9,9 @@ from numpy import ma, fft, power, arange, asarray, isscalar, NaN, Inf, zeros from sys import exit import logging -logger = logging.getLogger() +search_version = '0913' +logger = logging.getLogger() """ search for all peaks (min & max) in spectra diff --git a/LCU/checkhardware/lib/test_db.py b/LCU/checkhardware/lib/test_db.py index 1dbc20667863c73d0363df645816628579eb1232..767169d4205ad668acdfd16e232cef5385b89a73 100644 --- a/LCU/checkhardware/lib/test_db.py +++ b/LCU/checkhardware/lib/test_db.py @@ -4,6 +4,8 @@ from general_lib import * from lofar_lib import * import logging +db_version = '0913' + logger = None def init_test_db(): global logger @@ -21,6 +23,8 @@ class cDB: self.nr_hba = nHBA self.nr_tbb = nTBB + self.script_versions = '' + self.rcumode = -1 self.tests = '' self.check_start_time = 0 @@ -109,7 +113,8 @@ class cDB: print logdir date = getShortDateStr(self.check_start_time) log = cTestLogger(logdir) - + log.addLine("%s,NFO,---,VERSIONS,%s" %(date, self.script_versions)) + log.addLine("%s,NFO,---,STATION,NAME=%s" %(date, getHostName())) log.addLine("%s,NFO,---,RUNTIME,START=%s,STOP=%s" %(date, getDateTimeStr(self.check_start_time), getDateTimeStr(self.check_stop_time))) log.addLine("%s,NFO,---,CHECKS%s" %(date, self.tests)) @@ -160,28 +165,28 @@ class cDB: for ant in lba.ant: if ant.down: log.addLine("%s,%s,%03d,DOWN ,X=%3.1f,Y=%3.1f,Xoff=%d,Yoff=%d" %\ - (date, lba.label, ant.nr, ant.x.test_signal, ant.y.test_signal, ant.x.offset, ant.y.offset)) + (date, lba.label, ant.nr_pvss, ant.x.test_signal, ant.y.test_signal, ant.x.offset, ant.y.offset)) else: if lba.signal_check_done: valstr = '' if ant.x.too_low or ant.x.too_high: valstr += ",X=%3.1f" %(ant.x.test_signal) if ant.y.too_low or ant.y.too_high: valstr += ",Y=%3.1f" %(ant.y.test_signal) if len(valstr): - log.addLine("%s,%s,%03d,RF_FAIL%s" %(date, lba.label, ant.nr, valstr)) + log.addLine("%s,%s,%03d,RF_FAIL%s" %(date, lba.label, ant.nr_pvss, valstr)) if lba.oscillation_check_done: valstr = '' if ant.x.osc: valstr += ',X=1' if ant.y.osc: valstr += ',Y=1' if len(valstr): - log.addLine("%s,%s,%03d,OSCILLATION%s" %(date, lba.label, ant.nr, valstr)) + log.addLine("%s,%s,%03d,OSCILLATION%s" %(date, lba.label, ant.nr_pvss, valstr)) if lba.spurious_check_done: valstr = '' if ant.x.spurious: valstr += ',X=1' if ant.y.spurious: valstr += ',Y=1' if len(valstr): - log.addLine("%s,%s,%03d,SPURIOUS%s" %(date, lba.label, ant.nr, valstr)) + log.addLine("%s,%s,%03d,SPURIOUS%s" %(date, lba.label, ant.nr_pvss, valstr)) if lba.noise_check_done: noise = False @@ -193,7 +198,7 @@ class cDB: proc = (100.0 / ant.y.low_seconds) * ant.y.low_bad_seconds valstr += ',Yproc=%5.3f,Yval=%3.1f,Ydiff=%5.3f,Yref=%3.1f' %(proc, ant.y.low_val, ant.y.low_diff, ant.y.low_ref) if len(valstr): - log.addLine("%s,%s,%03d,LOW_NOISE%s" %(date, lba.label, ant.nr, valstr)) + log.addLine("%s,%s,%03d,LOW_NOISE%s" %(date, lba.label, ant.nr_pvss, valstr)) noise = True valstr = '' @@ -204,7 +209,7 @@ class cDB: proc = (100.0 / ant.y.high_seconds) * ant.y.high_bad_seconds valstr += ',Yproc=%5.3f,Yval=%3.1f,Ydiff=%5.3f,Yref=%3.1f' %(proc, ant.y.high_val, ant.y.high_diff, ant.y.high_ref) if len(valstr): - log.addLine("%s,%s,%03d,HIGH_NOISE%s" %(date, lba.label, ant.nr, valstr)) + log.addLine("%s,%s,%03d,HIGH_NOISE%s" %(date, lba.label, ant.nr_pvss, valstr)) noise = True valstr = '' @@ -215,7 +220,7 @@ class cDB: proc = (100.0 / ant.y.jitter_seconds) * ant.y.jitter_bad_seconds valstr += ',Xproc=%5.3f,Ydiff=%5.3f,Yref=%3.1f' %(proc, ant.y.jitter_val, ant.y.jitter_ref) if len(valstr): - log.addLine("%s,%s,%03d,JITTER%s" %(date, lba.label, ant.nr, valstr)) + log.addLine("%s,%s,%03d,JITTER%s" %(date, lba.label, ant.nr_pvss, valstr)) # end lbl/lbh @@ -475,7 +480,8 @@ class cDB: class cAntenna: def __init__(self, nr, nr_offset): self.nr = nr - self.nr_total = nr + nr_offset + self.nr_pvss = nr + nr_offset + #self.nr_pvss = nr self.x = cDB.cPolarity(rcu=(nr*2)) self.y = cDB.cPolarity(rcu=(nr*2+1)) diff --git a/LCU/checkhardware/lib/test_lib.py b/LCU/checkhardware/lib/test_lib.py index f86d5b4faddb99f2da169a6ed1b4c88164aa65b7..d0de7742e1fa00077f352b07c0966a2b904d2f1d 100644 --- a/LCU/checkhardware/lib/test_lib.py +++ b/LCU/checkhardware/lib/test_lib.py @@ -8,6 +8,8 @@ import os import numpy as np import logging +test_version = '0913' + logger = None def init_test_lib(): global logger @@ -90,9 +92,11 @@ class cRCUdata: self.testSignal_Y = ssY[subband] self.testSubband_Y = subband return + else: + logger.debug("Test signal on subband %d not strong enough X=%3.1fdB Y=%3.1fdB" %(subband, ssX[subband], ssY[subband])) # no subband given or not in requested range, look for better - for i in range(ssX.shape[0]): + for i in range(1,ssX.shape[0],1): if ssX[i] > minsignal and ssX[i] < maxsignal and ssX[i] > self.testSignal_X: self.testSignal_X = ssX[i] self.testSubband_X = i @@ -541,10 +545,13 @@ class cHBA: time.sleep(2.0) ctrlstr1 = ('128,'* 16)[:-1] - ctrlstr2 = ('253,'* 16)[:-1] + #ctrlstr2 = ('252,'* 16)[:-1] + ctrlstr2 = ('252,'* 16)[:-1] for ctrl in (ctrlstr1, ctrlstr2): - rspctl('--hbadelay=%s' %(ctrl), wait=10.0) + #rsp_hba_delay(delay=ctrl, n_rcus=self.db.nr_rcu) + rspctl('--hbadelay=%s' %(ctrl), wait=12.0) data = rspctl('--realdelays', wait=0.0).splitlines() + ctrllist = ctrl.split(',') for line in data: if line[:3] == 'HBA': @@ -577,7 +584,7 @@ class cHBA: turnonRCUs(mode=mode, rcus=self.db.nr_rcu) self.hba.resetRcuState() - rspctl('--hbadelay=%s' %(('253,'* 16)[:-1]), wait=10.0) + rspctl('--hbadelay=%s' %(('252,'* 16)[:-1]), wait=10.0) self.rcudata.record(rec_time=1) logger.debug("- test X -") @@ -611,7 +618,7 @@ class cHBA: turnonRCUs(mode=mode, rcus=self.db.nr_rcu) self.hba.resetRcuState() - rspctl('--hbadelay=%s' %(('253,'* 16)[:-1]), wait=10.0) + rspctl('--hbadelay=%s' %(('252,'* 16)[:-1]), wait=10.0) clean = False while not clean: clean = True @@ -647,7 +654,7 @@ class cHBA: if tile.x.rcu_off or tile.y.rcu_off: logger.info("skip low-noise test for tile %d, RCUs turned off" %(tile.nr)) - rspctl('--hbadelay=%s' %(('253,'* 16)[:-1]), wait=10.0) + rspctl('--hbadelay=%s' %(('252,'* 16)[:-1]), wait=10.0) self.rcudata.record(rec_time=record_time) @@ -724,7 +731,7 @@ class cHBA: turnonRCUs(mode=mode, rcus=self.db.nr_rcu) self.hba.resetRcuState() - rspctl('--hbadelay=%s' %(('253,'* 16)[:-1]), wait=10.0) + rspctl('--hbadelay=%s' %(('252,'* 16)[:-1]), wait=10.0) self.rcudata.record(rec_time=1) # result is a sorted list on maxvalue @@ -754,15 +761,15 @@ class cHBA: # check twice # 128 ... - # 253 ... + # 248 ... for tile in self.hba.tile: if tile.x.rcu_off or tile.y.rcu_off: logger.info("skip signal test for tile %d, RCUs turned off" %(tile.nr)) - for ctrl in ('128,', '253,'): + for ctrl in ('128,', '252,'): if ctrl == '128,': ctrl_nr = 0 - elif ctrl == '253,': ctrl_nr = 1 + elif ctrl == '252,': ctrl_nr = 1 logger.info("HBA signal test, ctrl word %s" %(ctrl[:-1])) @@ -841,7 +848,7 @@ class cHBA: logger.info("HBA Tile=%d Error: X=%3.1fdB Y=%3.1fdB" %\ (tile.nr, ssdataX[tile.nr], ssdataY[tile.nr])) - rspctl('--hbadelay=%s' %(('253,'* 16)[:-1]), wait=8.0) + rspctl('--hbadelay=%s' %(('252,'* 16)[:-1]), wait=8.0) logger.info("Done HBA signal test") self.hba.signal_check_done = 1 @@ -875,15 +882,18 @@ class cHBA: turnoffRCUs() turnonRCUs(mode=mode, rcus=self.db.nr_rcu) self.hba.resetRcuState() - - n_rcus_off = 0 - delay_start = 0 - for ctrl in ('128', '253'): + + n_rcus_off = 0 + delay_start = 0 + for ctrl in ('128', '248'): if ctrl == '128': ctrl_nr = 0 - elif ctrl == '253': ctrl_nr = 1 + elif ctrl == '248': ctrl_nr = 1 + + # delay command for first element + ctrlstring = (ctrl+',' + '2,'*15)[:33] + rspctl('--hbadelay=%s' %(ctrlstring), wait=0.0) + delay_start = time.time() - #ctrlstring = (ctrl+',' + '2,'*15)[:33] - #rspctl('--hbadelay=%s' %(ctrlstring), wait=10.0) for elem in range(self.hba.tile[0].nr_elements): logger.info("check elements %d, ctrlword=%s" %(elem+1, ctrl)) if n_rcus_off > 0: @@ -897,10 +907,18 @@ class cHBA: clean = False while not clean: clean = True - ctrlstring = ('2,'*elem + ctrl + ',' + '2,'*15)[:33] - rspctl('--hbadelay=%s' %(ctrlstring), wait=10.0) + # wait if delay command ot ready + if (time.time() - delay_start) < 10.0: + time.sleep(10.0 - (time.time() - delay_start)) self.rcudata.record(rec_time=record_time) + # Record done. While analysing set delay for next run + next_elem = elem + 1 + if next_elem < self.hba.tile[0].nr_elements: + ctrlstring = ('2,'*next_elem + ctrl + ',' + '2,'*15)[:33] + rspctl('--hbadelay=%s' %(ctrlstring), wait=0.0) + delay_start = time.time() + clean, n_off = self.checkOscillationElements(elem) n_rcus_off += n_off if n_off > 0: continue @@ -919,6 +937,7 @@ class cHBA: rspctl('--hbadelay=%s' %(('128,'* 16)[:-1]), wait=8.0) return + # Do a complete element test testing only the signal def checkElementsSignal(self, mode, subband, rf_min_signal, rf_low_deviation, rf_high_deviation): logger.info("=== Start HBA element based signal test in mode %d ===" %(mode)) @@ -928,14 +947,17 @@ class cHBA: turnonRCUs(mode=mode, rcus=self.db.nr_rcu) self.hba.resetRcuState() - n_rcus_off = 0 - delay_start = 0 - for ctrl in ('128', '253'): + n_rcus_off = 0 + delay_start = 0 + for ctrl in ('128', '248'): if ctrl == '128': ctrl_nr = 0 - elif ctrl == '253': ctrl_nr = 1 + elif ctrl == '248': ctrl_nr = 1 + # delay command for first element ctrlstring = (ctrl+',' + '2,'*15)[:33] - rspctl('--hbadelay=%s' %(ctrlstring), wait=10.0) + rspctl('--hbadelay=%s' %(ctrlstring), wait=0.0) + delay_start = time.time() + for elem in range(self.hba.tile[0].nr_elements): logger.info("check elements %d, ctrlword=%s" %(elem+1, ctrl)) if n_rcus_off > 0: @@ -946,18 +968,20 @@ class cHBA: self.turnOffTile(tile.nr) n_rcus_off += 1 logger.info("skip tile %d, modem error" %(tile.nr)) - clean = False - while not clean: - clean = True - if (time.time() - delay_start) < 10.0: - time.sleep(10.0 - (time.time() - delay_start)) - - self.rcudata.record(rec_time=2) - - ctrlstring = ('2,'*elem + ctrl + ',' + '2,'*15)[:33] + + # wait if delay command ot ready + if (time.time() - delay_start) < 10.0: + time.sleep(10.0 - (time.time() - delay_start)) + self.rcudata.record(rec_time=2) + + # Record done. While analysing set delay for next run + next_elem = elem + 1 + if next_elem < self.hba.tile[0].nr_elements: + ctrlstring = ('2,'*next_elem + ctrl + ',' + '2,'*15)[:33] rspctl('--hbadelay=%s' %(ctrlstring), wait=0.0) delay_start = time.time() - self.checkSignalElements(elem, ctrl_nr, subband, rf_min_signal, rf_low_deviation, rf_high_deviation) + + self.checkSignalElements(elem, ctrl_nr, subband, rf_min_signal, rf_low_deviation, rf_high_deviation) self.hba.element_check_done = 1 self.db.addTestDone('ES%d' %(mode))