def INITIALISE(msg): ''' Reinitialise (reinstantiate) the cartridge. ''' global cart, inifile, band log.debug('INITIALISE(%s)', msg.arg) args, kwargs = drama.parse_argument(msg.arg) if 'INITIALISE' in kwargs: inifile = kwargs['INITIALISE'] if not inifile: raise drama.BadStatus(drama.INVARG, 'missing argument INITIALISE, .ini file path') simulate = None if 'SIMULATE' in kwargs: simulate = int(kwargs['SIMULATE']) # bitmask if 'BAND' in kwargs: band = int(kwargs['BAND']) if not band: raise drama.BadStatus(drama.INVARG, 'missing argument BAND, receiver band number') # kick the update loop, if running, just to make sure it can't interfere # with cart's initialise(). try: drama.kick(taskname, "UPDATE").wait() except drama.DramaException: pass # we recreate the cart instance to force it to reread its ini file. # note that Cart.__init__() calls Cart.initialise(). log.info('initialising band %d...', band) del cart cart = None gc.collect() cart = namakanui.cart.Cart(band, inifile, drama.wait, drama.set_param, simulate) # set the SIMULATE bitmask used by the cart drama.set_param('SIMULATE', cart.simulate) # restart the update loop drama.blind_obey(taskname, "UPDATE") log.info('initialised.')
return dbm_sweep() finally: # final timestamp sys.stdout.write(time.strftime('# %Y%m%d %H:%M:%S HST\n', time.localtime())) sys.stdout.flush() agilent.set_dbm(agilent.safe_dbm) photonics.set_attenuation(photonics.max_att) if photonics else None drama.Exit('MAIN done') # MAIN try: logging.info('drama.init...') drama.init(taskname, actions=[MAIN]) drama.blind_obey(taskname, "MAIN") logging.info('drama.run...') drama.run() finally: logging.info('drama.stop...') drama.stop() logging.info('done.')
#my_y2 = 10**(0.1*(yfactor['HIGH_PWR']-yfactor['LOW_PWR'])) #log.info('MY_Y2:\n%s', my_y2) y = yfactor['Y_FAC'] trx = (jamb - y * jcold) / (y - 1) # zero out any spots with no samples trx *= yfactor['AVG_SIZE'].astype(bool).astype(float) log.info('trx:\n%s', trx) # print out stats/summary in blocks of 4 i = 0 n = 4 while i < len(trx): b = trx[i:i + n] log.info('dcm %2d-%2d: %s avg: %.2f +- %.2f', i, i + n - 1, b.round(2), b.mean(), b.std()) i += n # reschedule to wait for new update drama.reschedule() try: drama.init(taskname, actions=[MAIN]) drama.blind_obey(taskname, 'MAIN') log.info('run') drama.run() finally: log.info('stop') drama.stop()
def INITIALISE(msg): ''' Start the cartridge tasks and initialise them, then initialise the local control classes. Arguments: INITIALISE: The ini file path SIMULATE: Bitmask. If given, overrides config file settings. ''' global initialised, inifile, agilent, cryo, load, ifswitch, photonics global cartridge_tasknames, cold_mult, warm_mult log.debug('INITIALISE(%s)', msg.arg) args, kwargs = drama.parse_argument(msg.arg) initialised = False if 'INITIALISE' in kwargs: inifile = kwargs['INITIALISE'] if not inifile: raise drama.BadStatus(drama.INVARG, 'missing argument INITIALISE, .ini file path') simulate = None if 'SIMULATE' in kwargs: simulate = int(kwargs['SIMULATE']) config = IncludeParser(inifile) nconfig = config['namakanui'] cartridge_tasknames[3] = nconfig['b3_taskname'] cartridge_tasknames[6] = nconfig['b6_taskname'] cartridge_tasknames[7] = nconfig['b7_taskname'] # export these so the frontend task doesn't have to guess drama.set_param('TASKNAMES', {'B%d' % (k): v for k, v in cartridge_tasknames.items()}) # start the cartridge tasks in the background. # will exit immediately if already running, which is fine. log.info('starting cartridge tasks') subprocess.Popen([binpath + 'cartridge_task.py', cartridge_tasknames[3]]) subprocess.Popen([binpath + 'cartridge_task.py', cartridge_tasknames[6]]) subprocess.Popen([binpath + 'cartridge_task.py', cartridge_tasknames[7]]) # kill the UPDATE action while we fire things up try: drama.kick(taskname, "UPDATE").wait() except drama.DramaException: pass # kludge: sleep a short time to let cartridge tasks run up log.info('sleeping 3s for cartridge task startup') drama.wait(3) # TODO: do the ini file names really need to be configurable? # probably a bit overkill. cart_kwargs = {} if simulate is not None: cart_kwargs["SIMULATE"] = simulate for band in [3, 6, 7]: task = cartridge_tasknames[band] ini = datapath + nconfig['b%d_ini' % (band)] log.info('initialising %s', task) msg = drama.obey(task, "INITIALISE", BAND=band, INITIALISE=ini, **cart_kwargs).wait() if msg.status != 0: raise drama.BadStatus(msg.status, task + ' INITIALISE failed') # setting agilent frequency requires warm/cold multipliers for each band. # TODO: this assumes pubname=DYN_STATE -- could instead [include] config. # also this is rather a large get() for just a couple values. for band in [3, 6, 7]: dyn_state = drama.get(cartridge_tasknames[band], "DYN_STATE").wait().arg["DYN_STATE"] cold_mult[band] = dyn_state['cold_mult'] warm_mult[band] = dyn_state['warm_mult'] # now reinstantiate the local stuff if load is not None: load.close() del agilent del cryo del load del ifswitch del photonics agilent = None cryo = None load = None ifswitch = None photonics = None gc.collect() agilent = namakanui.agilent.Agilent(datapath + nconfig['agilent_ini'], drama.wait, drama.set_param, simulate) cryo = namakanui.cryo.Cryo(datapath + nconfig['cryo_ini'], drama.wait, drama.set_param, simulate) # wait a moment for load, jcms4 is fussy about reconnects drama.wait(1) load = namakanui.load.Load(datapath + nconfig['load_ini'], drama.wait, drama.set_param, simulate) ifswitch = namakanui.ifswitch.IFSwitch(datapath + nconfig['ifswitch_ini'], drama.wait, drama.set_param, simulate) if 'photonics_ini' in nconfig: photonics = namakanui.photonics.Photonics( datapath + nconfig['photonics_ini'], drama.wait, drama.set_param, simulate) # publish the load.positions table for the GUI drama.set_param('LOAD_TABLE', load.positions) # rebuild the simulate bitmask from what was actually set simulate = agilent.simulate | cryo.simulate | load.simulate | ifswitch.simulate | ( photonics.simulate if photonics else 0) for band in [3, 6, 7]: task = cartridge_tasknames[band] simulate |= drama.get(task, 'SIMULATE').wait(5).arg['SIMULATE'] drama.set_param('SIMULATE', simulate) # restart the update loop drama.blind_obey(taskname, "UPDATE") # TODO: power up the cartridges? tune? leave it for the FE wrapper? initialised = True log.info('initialised.')