class TestFilterWheel(object): def setup(self): self.manager = Manager(port=8000) self.manager.addClass(FakeFilterWheel, "fake", {"device": "/dev/ttyS0"}) self.manager.addClass(FilterWheel, "filter", { "driver": "/FakeFilterWheel/0", "filters": "U B V R I" }) #self.manager.addClass(SBIG, "sbig", {"device": Device.USB}) #self.manager.addClass(FilterWheel, "filter", {"driver": "/SBIG/0", # "filters": "R G B LUNAR CLEAR"}) def teardown(self): self.manager.shutdown() def test_filters(self): f = self.manager.getProxy(FilterWheel) filters = f.getFilters() for filter in filters: f.setFilter(filter) assert f.getFilter() == filter def test_get_filters(self): f = self.manager.getProxy(FilterWheel) filters = f.getFilters() assert isinstance(filters, tuple) or isinstance(filters, list)
class TestFocuser(object): def setup(self): self.manager = Manager(port=8000) self.manager.addClass( Site, "lna", { "name": "LNA", "latitude": "-22 32 03", "longitude": "-45 34 57", "altitude": "1896", "utc_offset": "-3" }) self.manager.addClass(FakeFocuser, "fake", {"device": "/dev/ttyS0"}) self.manager.addClass(Focuser, "focus", {"driver": "/FakeFocuser/0"}) #self.manager.addClass(OptecTCFS, "optec", {"device": "/dev/ttyS0"}) #self.manager.addClass(Focuser, "focus", {"driver": "/OptecTCFS/0"}) def teardown(self): self.manager.shutdown() def test_get_position(self): focus = self.manager.getProxy(Focuser) assert focus.getPosition() >= 0 def test_move(self): focus = self.manager.getProxy(Focuser) start = focus.getPosition() delta = int(random.Random().random() * 1000) # assumes IN moving to lower values focus.moveIn(delta) assert focus.getPosition() == start - delta # assumes OUT moving to larger values start = focus.getPosition() focus.moveOut(delta) assert focus.getPosition() == start + delta # TO focus.moveTo(1000) assert focus.getPosition() == 1000 # TO where? assert_raises(InvalidFocusPositionException, focus.moveTo, 1e9)
class TestPointVerify (object): def setup (self): self.manager = Manager(port=8000) # real self.manager.addClass(SBIG, "sbig", {"device": "USB"}) self.manager.addClass(Camera, "cam", {"driver": "/SBIG/0"}) self.manager.addClass(Site, "lna", {"name": "UFSC", "latitude": "-27 36 13 ", "longitude": "-48 31 20", "altitude": "20"}) self.manager.addClass(Meade, "meade", {"device": "/dev/ttyS6"}) self.manager.addClass(Telescope, "meade", {"driver": "/Meade/meade"}) self.manager.addClass(PointVerify, "Point") def teardown (self): self.manager.shutdown() del self.manager def test_point (self): point = self.manager.getProxy(PointVerify)
class TestSite (object): def setup (self): self.manager = Manager(port=8000) #self.manager.addClass(Site, "lna", {"name": "LNA", # "latitude": "-22 32 03", # "longitude": "-45 34 57", # "altitude": "1896"} self.manager.addClass(Site, "lna", {"name": "UFSC", "latitude": "-27 36 13 ", "longitude": "-48 31 20", "altitude": "20"}) def teardown (self): self.manager.shutdown() def test_times (self): site = self.manager.getProxy(Site) try: print print "local:", site.localtime() print "UT :", site.ut() print "JD :", site.JD() print "MJD :", site.MJD() print "LST :", site.LST() print "GST :", site.GST() except Exception, e: printException(e)
class TestSite(object): def setup(self): self.manager = Manager(port=8000) #self.manager.addClass(Site, "lna", {"name": "LNA", # "latitude": "-22 32 03", # "longitude": "-45 34 57", # "altitude": "1896"} self.manager.addClass( Site, "lna", { "name": "UFSC", "latitude": "-27 36 13 ", "longitude": "-48 31 20", "altitude": "20" }) def teardown(self): self.manager.shutdown() def test_times(self): site = self.manager.getProxy(Site) try: print print "local:", site.localtime() print "UT :", site.ut() print "JD :", site.JD() print "MJD :", site.MJD() print "LST :", site.LST() print "GST :", site.GST() except Exception, e: printException(e)
class TestAutofocus(object): def setup(self): self.manager = Manager(port=8000) # real self.manager.addClass(SBIG, "sbig", {"device": "USB"}) self.manager.addClass(Camera, "cam", {"driver": "/SBIG/0"}) self.manager.addClass( Site, "lna", { "name": "UFSC", "latitude": "-27 36 13 ", "longitude": "-48 31 20", "altitude": "20", "utc_offset": "-3" }) self.manager.addClass(Meade, "meade", {"device": "/dev/ttyS6"}) self.manager.addClass(Telescope, "meade", {"driver": "/Meade/meade"}) self.manager.addClass(PointVerify, "Point") def teardown(self): self.manager.shutdown() del self.manager def test_point(self): point = self.manager.getProxy(PointVerify)
def setJD(self,options): ''' Configure time domain by specifing a julian day. It will use information on exposure time to build time bins that will be filled when selecting targets. ''' sysconfig = SystemConfig.fromFile(options.config) manager = Manager() site = manager.getProxy(sysconfig.sites[0]) jd = options.JD if not jd: jd = np.floor(site.JD())+0.5 lat = np.array([float(tt) / 60.**i for i,tt in enumerate(str(site['latitude']).split(':'))]) lat[1:] *= lat[0]/np.abs(lat[0]) sitelat = np.sum(lat) long = np.array([float(tt) / 60.**i for i,tt in enumerate(str(site['longitude']).split(':'))]) long[1:] *= long[0]/np.abs(long[0]) sitelong = abs(np.sum(long)/360*24.) print site['latitude'],'->',sitelat print site['longitude'],'->',sitelong nightstart = _skysub.jd_sun_alt(self.sunMaxAlt, jd, sitelat, sitelong) nightend = _skysub.jd_sun_alt(self.sunMaxAlt, jd+0.5, sitelat, sitelong) print('Nigh Start @JD= %.3f # Night End @JD = %.3f'%(nightstart,nightend)) # Creating a 1 minute time bin tbin = self.tbin self.obsTimeBins = np.arange(nightstart,nightend+tbin,tbin) self.obsTimeMask = np.zeros(len(self.obsTimeBins)) self.obsTimeMask[-1] = 1.0 # Marking filled bins session = Session() scheduled = session.query(Program) for target in scheduled: tindex = np.abs(self.obsTimeBins - 2400000.5 - target.slewAt).argmin() self.obsTimeMask[tindex] = 1.0 self.isJD = True
class TestRealTelescope(RealHardwareTest, TelescopeTest): def setup (self): self.manager = Manager(port=8000) self.manager.addClass(Site, "lna", {"name": "UFSC", "latitude": "-27 36 13 ", "longitude": "-48 31 20", "altitude": "20"}) from chimera.instruments.meade import Meade self.manager.addClass(Meade, "meade", {"device": "/dev/ttyS6"}) self.TELESCOPE = "/Meade/0" #self.TELESCOPE = "150.162.110.3:7666/TheSkyTelescope/0" self.tel = self.manager.getProxy(self.TELESCOPE) FiredEvents = {} self.setupEvents() def teardown (self): self.manager.shutdown()
class TestFakeTelescope(FakeHardwareTest, TelescopeTest): def setup(self): self.manager = Manager(port=8000) self.manager.addClass(Site, "lna", {"name": "UFSC", "latitude": "-27 36 13 ", "longitude": "-48 31 20", "altitude": "20"}) from chimera.instruments.faketelescope import FakeTelescope self.manager.addClass(FakeTelescope, "fake") self.TELESCOPE = "/FakeTelescope/0" self.tel = self.manager.getProxy(self.TELESCOPE) FiredEvents = {} self.setupEvents() def teardown (self): self.manager.shutdown()
def test_log(self): class Simple(ChimeraObject): def __init__(self): ChimeraObject.__init__(self) def answer(self): try: raise ChimeraException("I'm an Exception, sorry.") except ChimeraException: self.log.exception("from except: wow, exception caught.") raise ChimeraException("I'm a new Exception, sorry again") manager = Manager() manager.addClass(Simple, "simple") simple = manager.getProxy(Simple) try: simple.answer() except ChimeraException, e: assert e.cause != None log.exception("wow, something wrong")
def test_log (self): class Simple (ChimeraObject): def __init__ (self): ChimeraObject.__init__(self) def answer (self): try: raise ChimeraException("I'm an Exception, sorry.") except ChimeraException: self.log.exception("from except: wow, exception caught.") raise ChimeraException("I'm a new Exception, sorry again") manager = Manager() manager.addClass(Simple, "simple") simple = manager.getProxy(Simple) try: simple.answer() except ChimeraException, e: assert e.cause != None log.exception("wow, something wrong")
class TestEvents (object): def setup (self): self.manager = Manager() def teardown (self): self.manager.shutdown() del self.manager def test_publish (self): assert self.manager.addClass (Publisher, "p") != False assert self.manager.addClass (Subscriber, "s") != False p = self.manager.getProxy("/Publisher/p") assert isinstance(p, Proxy) s = self.manager.getProxy("/Subscriber/s") assert isinstance(s, Proxy) p.fooDone += s.fooDoneClbk assert p.foo() == 42 time.sleep (0.5) # delay to get messages delivered assert s.getCounter() == 1 assert p.getCounter() == 1 assert p.foo() == 42 time.sleep (0.5) # delay to get messages delivered assert s.getCounter() == 2 assert p.getCounter() == 2 # unsubscribe p.fooDone -= s.fooDoneClbk p.fooDone -= p.fooDoneClbk assert p.foo() == 42 time.sleep (0.5) # delay to get messages delivered assert s.getCounter() == 2 assert p.getCounter() == 2 def test_performance (self): assert self.manager.addClass (Publisher, "p") != False assert self.manager.addClass (Subscriber, "s") != False p = self.manager.getProxy("/Publisher/p") assert isinstance(p, Proxy) s = self.manager.getProxy("/Subscriber/s") assert isinstance(s, Proxy) p.fooDone += s.fooDoneClbk for check in range (1): start = time.time() for i in range (100): p.foo() end = time.time() time.sleep (5) results = s.getResults() dt = [ (t - t0)*1000 for t0, t in results] mean = sum (dt) / len(dt) sigma = math.sqrt(sum([ (t - mean)**2 for t in dt]) / len(dt)) print "#"*25 print "# %d events (%.3f s)" % (len(dt), (end-start)) print "# %.2f events/s" % (len(dt)/(end-start)) print "# min : %-6.3f ms" % min(dt) print "# max : %-6.3f ms" % max(dt) print "# mean : %-6.3f ms" % mean print "# sigma : %-6.3f ms" % sigma print "#"*25
import logging logging.getLogger("chimera").setLevel(logging.WARNING) from chimera.core.manager import Manager from chimera.core.callback import callback from chimera.core.exceptions import printException from minimo import Minimo, MinimoException manager = Manager() m = manager.getProxy(Minimo, "m", host='localhost', port=8000) # method print m.doMethod("bar") # event @callback(manager) def doEventClbk(result): print result m.eventDone += doEventClbk m.doEvent() # exception try: m.doRaise() except MinimoException, e:
# # 1. Adding objects and getting a proxy # # just add a min Minimoescope class (returns a valid proxy) minimo = manager.addClass(Minimo, "min", start=True) # synchronous "doFoo" minimo.doFoo("ra dec") # # 2. There are other ways to get proxy # # from manager (this ensure that the object exists on the manager, see ChimeraProxy below) minimo = manager.getProxy("/Minimo/min") minimo.doFoo("ra dec") # if you don't know the name of the instance no problem, pass an index starting with 0 minimo = manager.getProxy("/Minimo/0") minimo.doFoo("ra dec") minimo = manager.getProxy(Minimo, "min") minimo.doFoo("ra dec") # if you don't know the name of the instance no problem, pass an index starting with 0 minimo = manager.getProxy(Minimo) minimo.doFoo("ra dec") minimo = manager.getProxy(Minimo, host="localhost", port=9090) minimo.doFoo("ra dec")
class TestCamera(object): def setup(self): self.manager = Manager(port=8000) #self.manager.addClass(SBIG, "sbig", {"device": Device.USB}) #self.manager.addClass(Camera, "cam", {"driver": "/SBIG/sbig"}) self.manager.addClass(FakeCamera, "fake", {"device": Device.USB}) self.manager.addClass(Camera, "cam", {"driver": "/FakeCamera/fake"}) @callback(self.manager) def exposeBeginClbk(request): print print time.time(), "Expose begin for request %s." % request @callback(self.manager) def exposeCompleteClbk(request): print time.time(), "Expose complete for request %s." % request @callback(self.manager) def readoutBeginClbk(request): print time.time( ), "Readout begin for request %s." % request["filename"] @callback(self.manager) def readoutCompleteClbk(request): print time.time( ), "Readout complete for request %s." % request["filename"] @callback(self.manager) def abortCompleteClbk(): print time.time(), "Abort complete." cam = self.manager.getProxy(Camera) cam.exposeBegin += exposeBeginClbk cam.exposeComplete += exposeCompleteClbk cam.readoutBegin += readoutBeginClbk cam.readoutComplete += readoutCompleteClbk cam.abortComplete += abortCompleteClbk def teardown(self): self.manager.shutdown() def test_simple(self): cam = self.manager.getProxy(Camera) assert cam.isExposing() == False def test_expose(self): cam = self.manager.getProxy(Camera) frames = 0 try: frames = cam.expose(exptime=2, frames=2, interval=0.5, filename="autogen-expose.fits") except Exception, e: log.exception("problems") assert len(frames) == 2 assert isinstance(frames[0], Proxy) assert isinstance(frames[1], Proxy)
credentials = ServiceAccountCredentials.from_json_keyfile_name('LNA40-acf26ff37a3d.json', scope) gc = gspread.authorize(credentials) wks = gc.open_by_key('') sheet = wks.get_worksheet(0) if len(sys.argv) < 2: print 'Usage: %s ip_chimera' % sys.argv[0] sys.exit() manager = Manager() site = manager.getProxy("%s:7666/Site/0" % sys.argv[1]) telescope = manager.getProxy("%s:7666/Telescope/0" % sys.argv[1]) dome = manager.getProxy("%s:7666/Dome/0" % sys.argv[1]) make_alt_list = False if make_alt_list: i = 1 while sheet.cell(i, 1).value != '': i += 1 for az, alt in [(ii, jj) for ii in np.arange(15, 360, 10) for jj in np.arange(25, 90, 20)]: sheet.update_cell(i, 1, az) sheet.update_cell(i, 2, alt) i += 1
class TestAutoMap(object): def setup(self): self.manager = Manager(port=8000) self.manager.addClass( Site, "lna", { "name": "LNA", "latitude": "-22 32 03", "longitude": "-45 34 57", "altitude": "1896", "utc_offset": "-3" }) # fake self.manager.addClass(FakeTelescope, "fake", {"skip_init": False}) self.manager.addClass(Telescope, "fake", {"driver": "/FakeTelescope/0"}) self.manager.addClass(FakeCamera, "fake") self.manager.addClass(Camera, "cam", {"driver": "/FakeCamera/0"}) self.manager.addClass(FakeDome, "fake") self.manager.addClass(Dome, "dome", { "driver": "/FakeDome/0", "mode": "Track", "telescope": "/Telescope/0" }) # real #self.manager.addClass(Meade, "meade", {"device": "/dev/ttyS6", "skip_init": False}) #self.manager.addClass(Telescope, "meade", {"driver": "/Meade/meade"}) #self.manager.addClass(SBIG, "sbig", {"device": "USB"}) #self.manager.addClass(Camera, "cam", {"driver": "/SBIG/0"}) #self.manager.addClass(DomeLNA40cm, "lna40", {"device": "/dev/ttyS0"}) #self.manager.addClass(Dome, "dome", {"driver": "/DomeLNA40cm/0", # "mode": "Track", # "telescope": "/Telescope/0"}) @callback(self.manager) def exposeBeginClbk(exp_time): print time.time(), "[cam] Expose begin for %.3f s." % exp_time @callback(self.manager) def exposeCompleteClbk(): print time.time(), "[cam] Expose complete." @callback(self.manager) def readoutBeginClbk(frame): print time.time(), "[cam] Readout begin for %s." % frame @callback(self.manager) def readoutCompleteClbk(frame): print time.time(), "[cam] Readout complete for %s." % frame @callback(self.manager) def camAbortCompleteClbk(): print time.time(), "[cam] Abort complete." cam = self.manager.getProxy(Camera) cam.exposeBegin += exposeBeginClbk cam.exposeComplete += exposeCompleteClbk cam.readoutBegin += readoutBeginClbk cam.readoutComplete += readoutCompleteClbk cam.abortComplete += camAbortCompleteClbk @callback(self.manager) def slewBeginClbk(target): print time.time(), "[tel] Slew begin. target=%s" % str(target) @callback(self.manager) def slewCompleteClbk(position): print time.time( ), "[tel] Slew complete. position=%s" % str(position) @callback(self.manager) def telAbortCompleteClbk(position): print time.time( ), "[tel] Abort complete. position=%s" % str(position) self.tel = self.manager.getProxy(Telescope) self.tel.slewBegin += slewBeginClbk self.tel.slewComplete += slewCompleteClbk self.tel.abortComplete += telAbortCompleteClbk @callback(self.manager) def domeSlewBeginClbk(target): print print time.time(), "[dome] Slew begin. target=%s" % str(target) @callback(self.manager) def domeSlewCompleteClbk(position): print time.time( ), "[dome] Slew complete. position=%s" % str(position) @callback(self.manager) def domeAbortCompleteClbk(position): print time.time( ), "[dome] Abort slew at position=%s" % str(position) dome = self.manager.getProxy(Dome) dome.slewBegin += domeSlewBeginClbk dome.slewComplete += domeSlewCompleteClbk dome.abortComplete += domeAbortCompleteClbk def teardown(self): self.manager.shutdown() del self.manager def test_map(self): tel = self.manager.getProxy(Telescope) cam = self.manager.getProxy(Camera) dome = self.manager.getProxy(Dome) site = self.manager.getProxy(Site)
class TestManager (object): def setup (self): self.manager = Manager() def teardown (self): self.manager.shutdown() del self.manager def test_add_start (self): # add by class assert self.manager.addClass(Simple, "simple", start=True) # already started assert_raises(InvalidLocationException, self.manager.addClass, Simple, "simple") assert_raises(NotValidChimeraObjectException, self.manager.addClass, NotValid, "nonono") assert_raises(InvalidLocationException, self.manager.addClass, Simple, "") # by location assert self.manager.addLocation('/ManagerHelper/h', path=[os.path.dirname(__file__)]) assert_raises(ClassLoaderException, self.manager.addLocation, '/What/h') assert_raises(InvalidLocationException, self.manager.addLocation, 'foo') # start with error #assert self.manager.addLocation('/ManagerHelperWithError/h', start=False) #assert_raises(ChimeraObjectException, self.manager.start, '/ManagerHelperWithError/h') # start who? assert_raises(InvalidLocationException, self.manager.start, "/Who/am/I") # exceptional cases # __init__ assert_raises(ChimeraObjectException, self.manager.addLocation, "/ManagerHelperWithInitException/h", [os.path.dirname(__file__)]) # __start__ assert_raises(ChimeraObjectException, self.manager.addLocation, "/ManagerHelperWithStartException/h", [os.path.dirname(__file__)]) # __main__ #assert_raises(ChimeraObjectException, self.manager.addLocation, "/ManagerHelperWithMainException/h") def test_remove_stop (self): assert self.manager.addClass(Simple, "simple") # who? assert_raises(InvalidLocationException, self.manager.remove, 'Simple/what') assert_raises(InvalidLocationException, self.manager.remove, 'foo') # stop who? assert_raises(InvalidLocationException, self.manager.stop, 'foo') # ok assert self.manager.remove('/Simple/simple') == True # __stop__ error assert self.manager.addLocation("/ManagerHelperWithStopException/h", path=[os.path.dirname(__file__)]) assert_raises(ChimeraObjectException, self.manager.stop, '/ManagerHelperWithStopException/h') # another path to stop assert_raises(ChimeraObjectException, self.manager.remove, '/ManagerHelperWithStopException/h') # by index assert self.manager.addClass(Simple, "simple") assert self.manager.remove('/Simple/0') == True def test_proxy (self): assert self.manager.addClass(Simple, "simple") # who? assert_raises(InvalidLocationException, self.manager.getProxy, 'wrong') assert_raises(InvalidLocationException, self.manager.getProxy, 'Simple/simple') # ok assert self.manager.getProxy ('/Simple/simple') assert self.manager.getProxy ('/Simple/0') # calling p = self.manager.getProxy ('/Simple/0') assert isinstance(p, Proxy) assert p.answer() == 42 # oops assert_raises (AttributeError, p.wrong) def test_manager (self): assert self.manager.addClass(Simple, "simple") p = self.manager.getProxy(Simple) assert p m = p.getManager() assert m.GUID() == self.manager.GUID()
def test_autolock(self): class Minimo(ChimeraObject): def __init__(self): ChimeraObject.__init__(self) self.t0 = time.time() def doUnlocked(self): time.sleep(1) t = time.time() - self.t0 print "[unlocked] - %s - %.3f" % (threading.currentThread().getName(), t) return t @lock def doLocked(self): time.sleep(1) t = time.time() - self.t0 print "[ locked ] - %s - %.3f" % (threading.currentThread().getName(), t) return t # def doLockedWith (self): # with self: # time.sleep(1) # t = time.time()-self.t0 # print "[ locked ] - %s - %.3f" % (threading.currentThread().getName(), t) # return t def doTest(obj): """Rationale: We use 5 threads for each method (locked and unlocked). As unlocked methods isn't serialized, they runs 'at the same instant', while locked methods will be serialized and will run only when the previous one finishes. Each method simulate a load (sleep of 1s) and then returns the time of completion (with an arbitrary zero point to give small numbers). The deviation from the mean of unlocked methods termination times should be nearly zero, as every methods runs at the same time. For locked ones, the termination time will be a linear function with the slope equals to the load (sleep in this case), and as we use 10 threads for the locked case, the deviation will be ~ 2.872. We use a simple equals_eps to handle load factors that may influence scheduler performance and timmings. """ unlocked = [] locked = [] def getObj(o): """ Copy Proxy to share between threads. """ if isinstance(o, Proxy): return copy.copy(o) return o def runUnlocked(): unlocked.append(getObj(obj).doUnlocked()) def runLocked(): locked.append(getObj(obj).doLocked()) # def runLockedWith(): # locked.append(getObj(obj).doLockedWith()) threads = [] print for i in range(10): t1 = threading.Thread(target=runUnlocked, name="unlocked-%d" % i) t2 = threading.Thread(target=runLocked, name=" lock-%d" % i) # t3 = threading.Thread(target=runLockedWith, name=" with-%d" % i) t1.start() t2.start() # t3.start() threads += [t1, t2] for t in threads: t.join() unlocked_mean = sum(unlocked) / len(unlocked) locked_mean = sum(locked) / len(locked) unlocked_sigma = sqrt(sum([(unlocked_mean - u) ** 2 for u in unlocked]) / len(unlocked)) locked_sigma = sqrt(sum([(locked_mean - l) ** 2 for l in locked]) / len(locked)) def equals_eps(a, b, eps=1e-3): return abs(a - b) <= eps print "unlocked: mean: %.6f sigma: %.6f" % (unlocked_mean, unlocked_sigma) print "locked : mean: %.6f sigma: %.6f" % (locked_mean, locked_sigma) assert equals_eps(unlocked_sigma, 0.0, 0.5) assert equals_eps(locked_sigma, 2.875, 1.0) # direct metaobject m = Minimo() doTest(m) # proxy manager = Manager() manager.addClass(Minimo, "m", start=True) p = manager.getProxy(Minimo) doTest(p) manager.shutdown()
class TestTelescope (object): def setup (self): self.manager = Manager(port=8000) #self.manager.addClass(Site, "lna", {"name": "LNA", # "latitude": "-22 32 03", # "longitude": "-45 34 57", # "altitude": "1896", # "utc_offset": "-3"}) self.manager.addClass(Site, "lna", {"name": "UFSC", "latitude": "-27 36 13 ", "longitude": "-48 31 20", "altitude": "20", "utc_offset": "-3"}) #self.manager.addClass(Meade, "meade", {"device": "/dev/ttyS6"}) #self.manager.addClass(Telescope, "meade", {"driver": "/Meade/meade"}) self.manager.addClass(FakeTelescope, "fake") self.manager.addClass(Telescope, "fake", {"driver": "/FakeTelescope/fake"}) #self.manager.addClass(Telescope, "meade", # {"driver": "200.131.64.134:7666/TheSkyTelescope/0"}) self.tel = self.manager.getProxy(Telescope) def teardown (self): self.manager.shutdown() def test_slew (self): ra = self.tel.getRa() dec = self.tel.getDec() dest_ra = (ra+"1 00 00") dest_dec = (dec+"15 00 00") @callback(self.manager) def slewBeginClbk(target): assert target.ra == dest_ra assert target.dec == dest_dec @callback(self.manager) def slewCompleteClbk(position): assertEpsEqual(position.ra, dest_ra, 60) assertEpsEqual(position.dec, dest_dec, 60) self.tel.slewBegin += slewBeginClbk self.tel.slewComplete += slewCompleteClbk self.tel.slewToRaDec((dest_ra, dest_dec)) def test_slew_abort (self): last_ra = self.tel.getRa() last_dec = self.tel.getDec() dest_ra = last_ra + "01 00 00" dest_dec = last_dec + "10 00 00" @callback(self.manager) def abortCompleteClbk(position): assert last_ra < position.ra < dest_ra assert last_dec < position.dec < dest_dec self.tel.abortComplete += abortCompleteClbk # async slew def slew(): self.tel = self.manager.getProxy(Telescope) self.tel.slewToRaDec((dest_ra, dest_dec)) pool = ThreadPool() pool.queueTask(slew) # wait thread to be scheduled time.sleep(2) # abort and test (on abortCompleteClbk). self.tel.abortSlew() pool.joinAll() def test_sync (self): # get current position, drift the scope, and sync on the first # position (like done when aligning the telescope). real_ra = self.tel.getRa() real_dec = self.tel.getDec() @callback(self.manager) def syncCompleteClbk(position): assert position.ra == real_ra assert position.dec == real_dec self.tel.syncComplete += syncCompleteClbk # drift to "real" object coordinate self.tel.slewToRaDec((real_ra+"01 00 00", real_dec+"01 00 00")) self.tel.syncRaDec((real_ra, real_dec)) def test_park (self): # FIXME: make a real test. return def printPosition(): print self.tel.getPositionRaDec(), self.tel.getPositionAltAz() sys.stdout.flush() print ra = self.tel.getRa() dec = self.tel.getDec() print "current position:", self.tel.getPositionRaDec() print "moving to:", (ra-"01 00 00"), (dec-"01 00 00") self.tel.slewToRaDec((ra-"01 00 00", dec-"01 00 00")) for i in range(10): printPosition() time.sleep(0.5) print "parking..." sys.stdout.flush() self.tel.park() t0 = time.time() wait = 30 for i in range(10): printPosition() time.sleep(0.5) while time.time() < t0+wait: print "\rwaiting ... ", sys.stdout.flush() time.sleep(1) print "unparking..." sys.stdout.flush() self.tel.unpark() for i in range(10): printPosition() time.sleep(0.5)
class TestAutofocus(object): def setup(self): self.manager = Manager(port=8000) # fake self.manager.addClass(FakeCamera, "fake") self.manager.addClass(Camera, "cam", {"driver": "/FakeCamera/fake"}) self.manager.addClass(FakeFocuser, "fake") self.manager.addClass(Focuser, "focus", {"driver": "/FakeFocuser/0"}) # real #self.manager.addClass(SBIG, "sbig", {"device": "USB"}) #self.manager.addClass(Camera, "cam", {"driver": "/SBIG/0"}) #self.manager.addClass(OptecTCFS, "optec", {"device": "/dev/ttyS0"}) #self.manager.addClass(Focuser, "focus", {"driver": "/OptecTCFS/0"}) #self.manager.addClass(Autofocus, "autofocus", {"camera" : "200.131.64.203:7666/Camera/0", # "focuser": "******"}) self.manager.addClass(Autofocus, "autofocus", { "camera": "/Camera/0", "focuser": "******" }) @callback(self.manager) def exposeBeginClbk(exp_time): print time.time(), "Expose begin for %.3f s." % exp_time @callback(self.manager) def exposeCompleteClbk(): print time.time(), "Expose complete." @callback(self.manager) def readoutBeginClbk(frame): print time.time(), "Readout begin for %s." % frame @callback(self.manager) def readoutCompleteClbk(frame): print time.time(), "Readout complete for %s." % frame @callback(self.manager) def abortCompleteClbk(): print time.time(), "Abort complete." cam = self.manager.getProxy(Camera) cam.exposeBegin += exposeBeginClbk cam.exposeComplete += exposeCompleteClbk cam.readoutBegin += readoutBeginClbk cam.readoutComplete += readoutCompleteClbk cam.abortComplete += abortCompleteClbk def teardown(self): self.manager.shutdown() del self.manager def test_focus(self): autofocus = self.manager.getProxy(Autofocus) best_focus = autofocus.focus(debug="/home/henrique/ph/basic-run")
class TestMeade (object): def setup (self): self.manager = Manager(port=8000) self.manager.addClass(Site, "lna", {"name": "LNA", "latitude": "-22 32 03", "longitude": "-45 34 57", "altitude": "1896", "utc_offset": "-3"}) self.manager.addClass(Meade, "meade", {"device": "/dev/ttyS0"}) @callback(self.manager) def slewBeginClbk(target): print time.time(), "Slew begin. target=%s" % str(target) @callback(self.manager) def slewCompleteClbk(position): print time.time(), "Slew complete. position=%s" % str(position) @callback(self.manager) def parkCompleteClbk(position): print time.time(), "Park complete. position=%s" % str(position) @callback(self.manager) def unparkCompleteClbk(position): print time.time(), "Unpark complete. position=%s" % str(position) self.m = self.manager.getProxy(Meade) self.m.slewBegin += slewBeginClbk self.m.slewComplete += slewCompleteClbk self.m.parkComplete += parkCompleteClbk self.m.unparkComplete += unparkCompleteClbk def test_print_info (self): m = self.m print "align mode:", m.getAlignMode() print "ra :", m.getRa() print "dec:", m.getDec() print "az :", m.getAz() print "alt:", m.getAlt() print "lat :", m.getLat() print "long:", m.getLong() print "date:" , m.getDate() print "time:" , m.getLocalTime() print "to utc:", m.getUTCOffset() print "lst:", m.getLocalSiderealTime() print "tracking rate:", m.getCurrentTrackingRate () def test_set_info (self): m = self.m try: m.setLat("-22 32 03") m.setLong("-45 34 57") m.setDate(time.time()) m.setLocalTime(time.time()) m.setUTCOffset(3) m.setLat(Coord.fromDMS("-22 32 03")) m.setLong(Coord.fromDMS("-45 34 57")) m.setDate(dt.date.today()) m.setLocalTime(dt.datetime.now().time()) m.setUTCOffset(3) except Exception: log.exception("error") def printCoord (self, header=False): m = self.m if header: print "%20s %20s %20s %20s %20s" % ("LST", "RA", "DEC", "AZ", "ALT") print "%20s %20s %20s %20s %20s" % (m.getLocalSiderealTime(), m.getRa(), m.getDec(), m.getAz(), m.getAlt()) def test_sync (self): # FIXME m = self.m print "syncing..." m.sync ("10 00 00", "00 00 00") def test_slew_rate (self): m = self.m print print "current slew rate:", m.getSlewRate() for rate in SlewRate: m.setSlewRate(rate) print "current slew rate:", m.getSlewRate() def test_movement (self): m = self.m print for rate in SlewRate: print "moving to East at %s rate:" % rate, t = time.time () m.moveEast (5, rate) print time.time () - t print "moving to West at %s rate:" % rate, t = time.time () m.moveWest (5, rate) print time.time () - t print "moving to North at %s rate:" % rate, t = time.time () m.moveNorth (5, rate) print time.time () - t print "moving to South at %s rate:" % rate, t = time.time () m.moveSouth (5, rate) print time.time () - t print print def test_align_mode (self): m = self.m for mode in AlignMode: print "current align mode:", m.getAlignMode() print "switching to:", mode m.setAlignMode (mode) print "current align mode:", m.getAlignMode() print def test_tracking (self): m = self.m print m.setAlignMode (AlignMode.POLAR) print "current align mode:", m.getAlignMode() print "setting new date and time..." self.test_set_info() print self.printCoord(header=True) for i in range(10): self.printCoord () time.sleep (1) print "stopping tracking..." sys.stdout.flush() m.stopTracking() start = time.time () finish = start + 30 print "waiting", sys.stdout.flush () while time.time() < finish: time.sleep (1) print "re-starting tracking..." sys.stdout.flush() m.startTracking() print "using old date and time..." print self.printCoord(header=True) for i in range(10): self.printCoord () time.sleep (1) print print "setting new date and time..." self.test_set_info() print for i in range(10): self.printCoord () time.sleep (1) def test_park (self): m = self.m print print "="*50 print "Park and unpark test" print "="*50 print "Initial conditions (post power-on):" self.test_print_info() print print "Starting the scope..." self.test_set_info() print print "Scope location, date, time updated, new conditions:" self.test_print_info() print print "Pooling telescope position:" ra = m.getRa() self.printCoord(header=True) for i in range(10): self.printCoord () time.sleep (1) print print "Slewing... to %s -70:00:00" % ra m.slewToRaDec (Position.fromRaDec(ra, "-70:00:00")) print print "Parking the scope at %s (lst: %s)" % (time.strftime("%c"), m.getLocalSiderealTime()) m.park () print print "Pooling telescope position:" self.printCoord(header=True) for i in range(10): self.printCoord () time.sleep (1) print start = time.time () finish = start + (2*60) # wait 30 minutes print "Waiting ", while time.time() < finish: update_scroll_spinner() time.sleep (0.2) print print "Unparking the scope at %s (lst: %s)" % (time.strftime("%c"), m.getLocalSiderealTime()) m.unpark () print print "Pooling telescope position:" for i in range(10): self.printCoord () time.sleep (1) print "="*50 def test_slew_to_az_alt (self): # FIXME m = self.m self.printCoord() m.slewToAltAz(("40:00:00", "180:00:00")) self.printCoord() def test_slew_to_ra_dec (self): m = self.m print self.printCoord (header=True) ra = m.getRa() m.slewToRaDec (Position.fromRaDec(ra, "-70:00:00")) #m.slewToRaDec (Position.fromRaDec("13h25m38.903s", "-11:12:24.928")) self.printCoord() def test_move_calibration (self): print "Calibrating movement..." self.m.calibrateMove() for rate in SlewRate: start = self.m.getPositionRaDec() print rate, start, "moving 30\" E..." self.m.moveEast(30, rate) end = self.m.getPositionRaDec() print rate, end, "real =", end.angsep(start).arcsec() start = self.m.getPositionRaDec() print rate, start, "moving 30\" W..." self.m.moveWest(30, rate) end = self.m.getPositionRaDec() print rate, end, "real =", end.angsep(start).arcsec() start = self.m.getPositionRaDec() print rate, start, "moving 30\" N..." self.m.moveNorth(30, rate) end = self.m.getPositionRaDec() print rate, end, "real =", end.angsep(start).arcsec() start = self.m.getPositionRaDec() print rate, start, "moving 30\" S..." self.m.moveSouth(30, rate) end = self.m.getPositionRaDec() print rate, end, "real =", end.angsep(start).arcsec() print
class TestSite(object): def setup(self): self.manager = Manager(port=8000) #self.manager.addClass(Site, "lna", {"name": "LNA", # "latitude": "-22 32 03", # "longitude": "-45 34 57", # "altitude": "1896"} self.manager.addClass( Site, "lna", { "name": "UFSC", "latitude": "-27 36 13 ", "longitude": "-48 31 20", "altitude": "20" }) def teardown(self): self.manager.shutdown() def test_times(self): site = self.manager.getProxy(Site) try: print() print("local:", site.localtime()) print("UT :", site.ut()) print("JD :", site.JD()) print("MJD :", site.MJD()) print("LST :", site.LST()) print("GST :", site.GST()) except Exception as e: printException(e) def test_sidereal_clock(self): return True site = self.manager.getProxy(Site) times = [] real_times = [] for i in range(100): t0 = time.clock() t0_r = time.time() print("\r%s" % site.LST(), end=' ') times.append(time.clock() - t0) real_times.append(time.time() - t0_r) print() print(sum(times) / len(times)) print(sum(real_times) / len(real_times)) def test_astros(self): site = self.manager.getProxy(Site) try: print() print("local :", site.localtime()) print() print("moonrise :", site.moonrise()) print("moonset :", site.moonset()) print("moon pos :", site.moonpos()) print("moon phase:", site.moonphase()) print() print("sunrise:", site.sunrise()) print("sunset :", site.sunset()) print("sun pos:", site.sunpos()) print() sunset_twilight_begin = site.sunset_twilight_begin() sunset_twilight_end = site.sunset_twilight_end() sunset_twilight_duration = relativedelta(sunset_twilight_end, sunset_twilight_begin) sunrise_twilight_begin = site.sunrise_twilight_begin() sunrise_twilight_end = site.sunrise_twilight_end() sunrise_twilight_duration = relativedelta(sunrise_twilight_end, sunrise_twilight_begin) print("next sunset twilight begins at:", sunset_twilight_begin) print("next sunset twilight ends at:", sunset_twilight_end) print("sunset twilight duration :", sunset_twilight_duration) print() print("next sunrise twilight begins at:", sunrise_twilight_begin) print("next sunrise twilight ends at:", sunrise_twilight_end) print("sunrise twilight duration :", sunrise_twilight_duration) except Exception as e: printException(e)
from chimera.core.manager import Manager manager = Manager() example = manager.getProxy("localhost:8000/Example1/example") example.doSomething("client argument")
class TestDome(object): def setup(self): self.manager = Manager() self.manager.addClass( Site, "lna", { "name": "LNA", "latitude": "-22 32 03", "longitude": "-45 34 57", "altitude": "1896", "utc_offset": "-3" }) #self.manager.addClass(Meade, "meade", {"device": "/dev/ttyUSB0"}) #self.manager.addClass(Telescope, "tel", {"driver": "/Meade/meade"}) #self.manager.addClass(DomeLNA40cm, "lna40", {"device": "/dev/ttyS0"}) #self.manager.addClass(Dome, "dome", {"driver": "/DomeLNA40cm/0", # "telescope": "/Telescope/0"}) self.manager.addClass(FakeTelescope, "fake") self.manager.addClass(Telescope, "tel", {"driver": "/FakeTelescope/0"}) self.manager.addClass(FakeDome, "fake") self.manager.addClass(Dome, "dome", { "driver": "/FakeDome/0", "telescope": "/Telescope/0" }) @callback(self.manager) def slewBeginClbk(target): print print time.time(), "[dome] Slew begin. target=%s" % str(target) print @callback(self.manager) def slewCompleteClbk(position): print print time.time( ), "[dome] Slew complete. position=%s" % str(position) print @callback(self.manager) def abortCompleteClbk(position): print print time.time( ), "[dome] Abort slew at position=%s" % str(position) print @callback(self.manager) def slitOpenedClbk(position): print print time.time( ), "[dome] Slit opened with dome at at position=%s" % str(position) print @callback(self.manager) def slitClosedClbk(position): print print time.time( ), "[dome] Slit closed with dome at at position=%s" % str(position) print dome = self.manager.getProxy(Dome) dome.slewBegin += slewBeginClbk dome.slewComplete += slewCompleteClbk dome.abortComplete += abortCompleteClbk dome.slitOpened += slitOpenedClbk dome.slitClosed += slitClosedClbk def test_stress_dome_track(self): dome = self.manager.getProxy(Dome) tel = self.manager.getProxy(Telescope) dome.track() for i in range(25): ra = "%d %d 00" % (random.randint(0, 23), random.randint(0, 59)) dec = "%d %d 00" % (random.randint(-90, 0), random.randint(0, 59)) tel.slewToRaDec((ra, dec)) time.sleep(random.randint(0, 10)) dome.sync() def test_stress_dome_slew(self): dome = self.manager.getProxy(Dome) for i in range(25): az = random.randint(0, 359) dome.slewToAz(az) assert dome.getAz() == az def test_get_az(self): dome = self.manager.getProxy(Dome) assert dome.getAz() >= 0 def test_slew_to_az(self): dome = self.manager.getProxy(Dome) start = dome.getAz() delta = 20 dome.slewToAz(start + delta) assert dome.getAz() == (start + delta) def test_slit(self): dome = self.manager.getProxy(Dome) dome.openSlit() assert dome.isSlitOpen() == True dome.closeSlit() assert dome.isSlitOpen() == False
def test_autolock(self): class Minimo(ChimeraObject): def __init__(self): ChimeraObject.__init__(self) self.t0 = time.time() def doUnlocked(self): time.sleep(1) t = time.time() - self.t0 print("[unlocked] - %s - %.3f" % (threading.currentThread().getName(), t)) return t @lock def doLocked(self): time.sleep(1) t = time.time() - self.t0 print("[ locked ] - %s - %.3f" % (threading.currentThread().getName(), t)) return t # def doLockedWith (self): # with self: # time.sleep(1) # t = time.time()-self.t0 # print "[ locked ] - %s - %.3f" % (threading.currentThread().getName(), t) # return t def doTest(obj): """Rationale: We use 5 threads for each method (locked and unlocked). As unlocked methods isn't serialized, they runs 'at the same instant', while locked methods will be serialized and will run only when the previous one finishes. Each method simulate a load (sleep of 1s) and then returns the time of completion (with an arbitrary zero point to give small numbers). The deviation from the mean of unlocked methods termination times should be nearly zero, as every methods runs at the same time. For locked ones, the termination time will be a linear function with the slope equals to the load (sleep in this case), and as we use 10 threads for the locked case, the deviation will be ~ 2.872. We use a simple equals_eps to handle load factors that may influence scheduler performance and timmings. """ unlocked = [] locked = [] def getObj(o): """ Copy Proxy to share between threads. """ if isinstance(o, Proxy): return copy.copy(o) return o def runUnlocked(): unlocked.append(getObj(obj).doUnlocked()) def runLocked(): locked.append(getObj(obj).doLocked()) # def runLockedWith(): # locked.append(getObj(obj).doLockedWith()) threads = [] print() for i in range(10): t1 = threading.Thread(target=runUnlocked, name="unlocked-%d" % i) t2 = threading.Thread(target=runLocked, name=" lock-%d" % i) #t3 = threading.Thread(target=runLockedWith, name=" with-%d" % i) t1.start() t2.start() #t3.start() threads += [t1, t2] for t in threads: t.join() unlocked_mean = sum(unlocked) / len(unlocked) locked_mean = sum(locked) / len(locked) unlocked_sigma = sqrt( sum([(unlocked_mean - u)**2 for u in unlocked]) / len(unlocked)) locked_sigma = sqrt( sum([(locked_mean - l)**2 for l in locked]) / len(locked)) def equals_eps(a, b, eps=1e-3): return abs(a - b) <= eps print("unlocked: mean: %.6f sigma: %.6f" % (unlocked_mean, unlocked_sigma)) print("locked : mean: %.6f sigma: %.6f" % (locked_mean, locked_sigma)) assert equals_eps(unlocked_sigma, 0.0, 0.5) assert equals_eps(locked_sigma, 2.875, 1.0) # direct metaobject m = Minimo() doTest(m) # proxy manager = Manager() manager.addClass(Minimo, "m", start=True) p = manager.getProxy(Minimo) doTest(p) manager.shutdown()
class TestManager(object): def setup(self): self.manager = Manager() def teardown(self): self.manager.shutdown() del self.manager def test_add_start(self): # add by class assert self.manager.addClass(Simple, "simple", start=True) # already started assert_raises(InvalidLocationException, self.manager.addClass, Simple, "simple") assert_raises(NotValidChimeraObjectException, self.manager.addClass, NotValid, "nonono") assert_raises(InvalidLocationException, self.manager.addClass, Simple, "") # by location assert self.manager.addLocation('/ManagerHelper/h', path=[os.path.dirname(__file__)]) assert_raises(ClassLoaderException, self.manager.addLocation, '/What/h') assert_raises(InvalidLocationException, self.manager.addLocation, 'foo') # start with error #assert self.manager.addLocation('/ManagerHelperWithError/h', start=False) #assert_raises(ChimeraObjectException, self.manager.start, '/ManagerHelperWithError/h') # start who? assert_raises(InvalidLocationException, self.manager.start, "/Who/am/I") # exceptional cases # __init__ assert_raises(ChimeraObjectException, self.manager.addLocation, "/ManagerHelperWithInitException/h", [os.path.dirname(__file__)]) # __start__ assert_raises(ChimeraObjectException, self.manager.addLocation, "/ManagerHelperWithStartException/h", [os.path.dirname(__file__)]) # __main__ #assert_raises(ChimeraObjectException, self.manager.addLocation, "/ManagerHelperWithMainException/h") def test_remove_stop(self): assert self.manager.addClass(Simple, "simple") # who? assert_raises(InvalidLocationException, self.manager.remove, 'Simple/what') assert_raises(InvalidLocationException, self.manager.remove, 'foo') # stop who? assert_raises(InvalidLocationException, self.manager.stop, 'foo') # ok assert self.manager.remove('/Simple/simple') == True # __stop__ error assert self.manager.addLocation("/ManagerHelperWithStopException/h", path=[os.path.dirname(__file__)]) assert_raises(ChimeraObjectException, self.manager.stop, '/ManagerHelperWithStopException/h') # another path to stop assert_raises(ChimeraObjectException, self.manager.remove, '/ManagerHelperWithStopException/h') # by index assert self.manager.addClass(Simple, "simple") assert self.manager.remove('/Simple/0') == True def test_proxy(self): assert self.manager.addClass(Simple, "simple") # who? assert_raises(InvalidLocationException, self.manager.getProxy, 'wrong') assert_raises(InvalidLocationException, self.manager.getProxy, 'Simple/simple') # ok assert self.manager.getProxy('/Simple/simple') assert self.manager.getProxy('/Simple/0') # calling p = self.manager.getProxy('/Simple/0') assert isinstance(p, Proxy) assert p.answer() == 42 # oops assert_raises(AttributeError, p.wrong) def test_manager(self): assert self.manager.addClass(Simple, "simple") p = self.manager.getProxy(Simple) assert p m = p.getManager() assert m.GUID() == self.manager.GUID()
class TestEvents(object): def setup(self): self.manager = Manager() def teardown(self): self.manager.shutdown() del self.manager def test_publish(self): assert self.manager.addClass(Publisher, "p") != False assert self.manager.addClass(Subscriber, "s") != False p = self.manager.getProxy("/Publisher/p") assert isinstance(p, Proxy) s = self.manager.getProxy("/Subscriber/s") assert isinstance(s, Proxy) p.fooDone += s.fooDoneClbk assert p.foo() == 42 time.sleep(0.5) # delay to get messages delivered assert s.getCounter() == 1 assert p.getCounter() == 1 assert p.foo() == 42 time.sleep(0.5) # delay to get messages delivered assert s.getCounter() == 2 assert p.getCounter() == 2 # unsubscribe p.fooDone -= s.fooDoneClbk p.fooDone -= p.fooDoneClbk assert p.foo() == 42 time.sleep(0.5) # delay to get messages delivered assert s.getCounter() == 2 assert p.getCounter() == 2 def test_performance(self): assert self.manager.addClass(Publisher, "p") != False assert self.manager.addClass(Subscriber, "s") != False p = self.manager.getProxy("/Publisher/p") assert isinstance(p, Proxy) s = self.manager.getProxy("/Subscriber/s") assert isinstance(s, Proxy) p.fooDone += s.fooDoneClbk for check in range(1): start = time.time() for i in range(100): p.foo() end = time.time() time.sleep(5) results = s.getResults() dt = [(t - t0) * 1000 for t0, t in results] mean = sum(dt) / len(dt) sigma = math.sqrt(sum([(t - mean)**2 for t in dt]) / len(dt)) print("#" * 25) print("# %d events (%.3f s)" % (len(dt), (end - start))) print("# %.2f events/s" % (len(dt) / (end - start))) print("# min : %-6.3f ms" % min(dt)) print("# max : %-6.3f ms" % max(dt)) print("# mean : %-6.3f ms" % mean) print("# sigma : %-6.3f ms" % sigma) print("#" * 25)
import logging logging.getLogger("chimera").setLevel(logging.WARNING) from chimera.core.manager import Manager from chimera.core.callback import callback from chimera.core.exceptions import printException from minimo import Minimo, MinimoException manager = Manager() m = manager.getProxy(Minimo, "m", host='localhost', port=8000) # method print m.doMethod("bar") # event @callback(manager) def doEventClbk (result): print result m.eventDone += doEventClbk m.doEvent() # exception try: m.doRaise() except MinimoException, e: printException(e)
# # 1. Adding objects and getting a proxy # # just add a min Minimoescope class (returns a valid proxy) minimo = manager.addClass(Minimo, "min", start=True) # synchronous "doFoo" minimo.doFoo ("ra dec") # # 2. There are other ways to get proxy # # from manager (this ensure that the object exists on the manager, see ChimeraProxy below) minimo = manager.getProxy ("/Minimo/min") minimo.doFoo ("ra dec") # if you don't know the name of the instance no problem, pass an index starting with 0 minimo = manager.getProxy ("/Minimo/0") minimo.doFoo ("ra dec") minimo = manager.getProxy (Minimo, "min") minimo.doFoo ("ra dec") # if you don't know the name of the instance no problem, pass an index starting with 0 minimo = manager.getProxy (Minimo) minimo.doFoo ("ra dec") minimo = manager.getProxy (Minimo, host="localhost", port=9090) minimo.doFoo ("ra dec")