def openTrees(self): with Tree('pytree',self.shot+1,'new'): pass filepath = ('%s/pytree_%03d.tree'%(self.tmpdir,self.shot+1)).replace(os.sep,'/') self.assertEqual(Tree.getFileName('pytree',self.shot+1), filepath) pytree = Tree('pytree',self.shot+1) self.assertEqual(pytree.getFileName(), filepath) self.assertEqual(str(pytree),'Tree("PYTREE",%d,"Normal")'%(self.shot+1,)) pytree.createPulse(self.shot+2) self.assertEqual(pytree.number_opened,1) if not Tests.inThread: Tree.setCurrent('pytree',self.shot+2) pytree2=Tree('pytree',0) self.assertEqual(str(pytree2),'Tree("PYTREE",%d,"Normal")'%(self.shot+2,)) self.assertEqual(pytree2.incrementCurrent(1000),self.shot+1002) self.assertEqual(pytree2.getCurrent(),self.shot+1002) pytree2.setCurrent() self.assertEqual(Tree.getCurrent('pytree'),self.shot+2) else: pytree2=Tree('pytree',self.shot+2) self.assertEqual(pytree2.number_opened,1) self.assertEqual(pytree.shotid,pytree.shot) self.assertEqual(pytree.tree,pytree.expt) self.assertEqual(pytree.max_open,8) try: pytree.versions_in_model = True except TreeNOEDIT: pass else: self.assertEqual("TreeSUCCESS","TreeNOEDIT") try: pytree.versions_in_pulse = True except TreeNOEDIT: pass else: self.assertEqual("TreeSUCCESS","TreeNOEDIT")
def open(self): shot1 = self.shot + 1 shot2 = shot1 + 1 with Tree('pytree', shot1, 'new') as pytree: a = pytree.addNode('A', 'TEXT') pytree.write() pytree.open() a.record = 'a' * 64 self.assertEqual(pytree.getDatafileSize(), 84) pytree.close() with Tree('pytree', shot1, 'new') as pytree: # new should clear datafile (O_TRUNC) self.assertEqual(pytree.getDatafileSize(), 0) filepath = ('%s/pytree_%03d.tree' % (self.tmpdir, shot1)).replace( os.sep, '/') self.assertEqual(Tree.getFileName('pytree', shot1), filepath) pytree = Tree('pytree', shot1) self.assertEqual(pytree.getFileName(), filepath) self.assertEqual(str(pytree), 'Tree("PYTREE",%d,"Normal")' % (shot1, )) pytree.createPulse(shot2) self.assertEqual(pytree.number_opened, 1) if not Tests.inThread: Tree.setCurrent('pytree', shot2) pytree2 = Tree('pytree', 0) self.assertEqual(str(pytree2), 'Tree("PYTREE",%d,"Normal")' % (shot2, )) self.assertEqual(pytree2.incrementCurrent(1000), shot2 + 1000) self.assertEqual(pytree2.getCurrent(), shot2 + 1000) pytree2.setCurrent() self.assertEqual(Tree.getCurrent('pytree'), shot2) else: pytree2 = Tree('pytree', shot2) self.assertEqual(pytree2.number_opened, 1) self.assertEqual(pytree.shotid, pytree.shot) self.assertEqual(pytree.tree, pytree.expt) self.assertEqual(pytree.max_open, 8) try: pytree.versions_in_model = True except TreeNOEDIT: pass else: self.assertEqual("TreeSUCCESS", "TreeNOEDIT") try: pytree.versions_in_pulse = True except TreeNOEDIT: pass else: self.assertEqual("TreeSUCCESS", "TreeNOEDIT")
def currentShot(dbname): """ 获取当前炮,与mdsTree类分开原因:调用的时候不用先实例化一个tree了 """ try: shot_num = Tree.getCurrent(dbname) new_tree = Tree(dbname, shot_num) shot_num = shot_num if new_tree.getNode( 'FBC:DUPS1').getLength() else shot_num - 1 new_tree.close() except mdsExceptions.TreeNNF: # MDSplus.mdsExceptions.TreeNNF: %TREE-W-NNF, Node Not Found shot_num = shot_num if new_tree.getNode( 'FBC:IP').getLength() else shot_num - 1 new_tree.close() except mdsExceptions.TreeNOCURRENT: # MDSplus.mdsExceptions.TreeNOCURRENT: %TREE-E-NOCURRENT, No current shot number set for this tree. # 本地测试的时候用的exl50_copy数据库获取不到当前炮,里面只有4983炮数据 shot_num = 4983 return shot_num
def thick(self): def testnci(thick, local, con, nci): l = local.S.__getattribute__(nci) t = thick.S.__getattribute__(nci) if nci.endswith("_nids"): l, t = str(l), str(t) try: c = str(con.get("getnci(getnci(S,$),'nid_number')", nci)) except TreeNNF: c = '[]' else: c = con.get("getnci(S,$)", nci) try: self.assertEqual(t, c) self.assertEqual(t, l) except: print(nci, t, l, c) raise server, server_port = self._setup_mdsip('ACTION_SERVER', 'ACTION_PORT', 7000 + self.index, True) svr, svr_log = self._start_mdsip(server, server_port, 'thick') try: con = Connection(server) self.assertEqual( con.get("zero([1,1,1,1,1,1,1,1],1)").tolist(), [[[[[[[[0]]]]]]]]) with Tree(self.tree, -1, "new") as local: local.addNode(self.treesub, "SUBTREE") s = local.addNode("S", "SIGNAL") s.addTag("tagS") s.record = ADD(Float32(1), Float32(2)) t = local.addNode("T", "TEXT") t.addNode("TT", "TEXT").addTag("tagTT") t.record = t.TT t.TT = "recTT" local.write() with Tree(self.treesub, -1, "new") as sub: sub.addNode("OK") sub.write() local.normal() Tree.setCurrent(self.tree, 7) setenv("%s_path" % self.tree, "%s::" % server) print(con.get("getenv($//'_path')", self.tree)) con.get("TreeShr->TreeOpen(ref($),val($),val(1))", self.tree, -1) thick = Tree(self.tree, -1) thick.createPulse(1) thick1 = Tree(self.tree, 1) self.assertEqual( getattr(local, self.treesub.upper()).OK.nid, getattr(thick1, self.treesub.upper()).OK.nid) local_filename = local.getFileName() thick_filename = thick.getFileName() self.assertTrue("::" in thick_filename, thick_filename) self.assertTrue(local_filename, thick_filename.split("::", 1)[1]) """ TreeTurnOff / TreeTurnOn """ thick.S.on = False self.assertEqual(local.S.on, False) thick.S.on = True self.assertEqual(local.S.on, True) """ TreeSetCurrentShotId / TreeGetCurrentShotId """ Tree.setCurrent(self.tree, 1) self.assertEqual(Tree.getCurrent(self.tree), 1) """ TreeGetRecord / TreeSetRecord """ self.assertEqual(str(local.S.record), "1. + 2.") self.assertEqual(str(thick.S.record), "1. + 2.") thick.S.record = ADD(Float32(2), Float32(4)) self.assertEqual(str(local.S.record), "2. + 4.") self.assertEqual(str(thick.S.record), "2. + 4.") self.assertEqual(str(local.T.record), str(thick.T.record)) """ GetDefaultNid / SetDefaultNid """ self.assertEqual(thick.getDefault(), thick.top) thick.setDefault(thick.S) self.assertEqual(thick.getDefault(), thick.top.S) thick.setDefault(thick.top) """ FindNodeWildRemote """ self.assertEqual(str(thick.getNodeWild("T*")), str(local.getNodeWild("T*"))) """ FindTagWildRemote """ self.assertEqual(thick.findTags("*"), local.findTags("*")) """ nci """ thick.S.write_once = True self.assertEqual(thick.S.write_once, True) for nci in ( 'on', 'depth', 'usage_str', 'dtype', 'length', 'rlength', 'fullpath', 'minpath', 'member_nids', 'children_nids', 'rfa', 'write_once', ): testnci(thick, local, con, nci) """ new stuff """ self.assertEqual(local.getFileName(), con.get("treefilename($,-1)", self.tree)) finally: if svr_log: svr_log.close() self._stop_mdsip((svr, server))
def run(self): Tree.usePrivateCtx(True) try: # test open Nodes tree = Tree(self.tree, self.shot) try: tree.getNode(self.pcb) except Exception as exc: error(exc) self.pcb = None try: tree.getNode(self.cmos) except Exception as exc: error(exc) self.cmos = None except Exception as exc: error(exc) error( 'Cannot access trend tree. Check TREND:TREE and TREND_SHOT.' ) raise mdsExceptions.TreeTNF if self.pcb is None and self.cmos is None: error( 'Cannot access any node for trend. Check TREND:PCB, TREND:CMOS on. Nodes must exist on %s.' % repr(tree)) raise mdsExceptions.TreeNNF if self.pcb is None: error( 'Cannot access node for pcb trend. Check TREND:PCB. Continue with cmos trend.' ) elif self.cmos is None: error( 'Cannot access node for cmos trend. Check TREND:CMOS. Continue with pcb trend.' ) print('started trend writing to %s - %s and %s every %fs' % (self.tree, self.pcb, self.cmos, self.period)) self.running = True while (not self.stopReq): timeTillNextMeasurement = self.period - (time() % self.period) if timeTillNextMeasurement > 0.6: sleep(.5) # listen to stopReq else: sleep(timeTillNextMeasurement) # wait remaining period unit self.period currTime = int( int(time() / self.period + .1) * self.period * 1000) # currTime in steps of self.period if self.ns: currTime *= 1000000 # time in nano seconds try: if self.shot == 0: if Tree.getCurrent(self.tree) != tree.shot: tree = Tree(self.tree, self.shot) if self.pcb is not None: pcbTemp = CYGNET4K.xclib.getPcbTemp() tree.getNode(self.pcb).makeSegment( currTime, currTime, Dimension(None, Uint64Array(currTime)), Float32Array(pcbTemp).setUnits('oC'), -1) if self.cmos is not None: cmosTemp = CYGNET4K.xclib.getCmosTemp() tree.getNode(self.cmos).makeSegment( currTime, currTime, Dimension(None, Uint64Array(currTime)), Uint16Array(cmosTemp), -1) if Device.debug: print(tree.tree, tree.shot, currTime, pcbTemp, cmosTemp) except Exception: error(exc_info()[1]) error('failure during temperature readout') sleep(0.01) self.running = False print('done')
class mdsTree: """ 构建MDSplus.Tree的一些常用方法 """ def __init__(self, dbname, shot): self.shot = shot self.dbname = dbname self.tree = Tree(self.dbname, self.shot) def formChannelPool(self): """ 构建一个通道池, 对外显示的通道均有与通道名称相同的tags """ node_list = self.tree.getNodeWild("***") channels = [] for node in node_list: if node.usage == 'SIGNAL' and len(node.tags) == 1 and str( node.tags[0]) == node.name: channels.append(node.name.strip()) return channels def close(self): self.tree.close() def getCurrentShot(self): """ 获取当前炮号 """ try: shot_num = self.tree.getCurrent() new_tree = Tree(self.dbname, shot_num) shot_num = shot_num if new_tree.getNode( 'FBC:DUPS1').getLength() else shot_num - 1 except mdsExceptions.TreeNNF: # MDSplus.mdsExceptions.TreeNNF: %TREE-W-NNF, Node Not Found shot_num = shot_num if new_tree.getNode( 'FBC:IP').getLength() else shot_num - 1 except mdsExceptions.TreeNOCURRENT: # MDSplus.mdsExceptions.TreeNOCURRENT: %TREE-E-NOCURRENT, No current shot number set for this tree. shot_num = None return shot_num def renameChaName(self, channel_name): """ 通道名加r'\'是通道的tags, 不在使用'子树:通道名'方式进行索引""" return '\\' + channel_name.upper() def isHaveData(self, channel_name): """ 返回储存内容长度, 当里面不是数据是公式的时候也有长度(此时如果公式索引的通道没数据同样没有数据) """ # length = self.tree.getNode(self.renameChaName(channel_name)).getCompressedLength() length = self.tree.getNode( self.renameChaName(channel_name)).getLength() return length def getWrittenTime(self, channel_name): """ 获得数据写入时间 """ return self.tree.getNode( self.renameChaName(channel_name)).getTimeInserted().date def setTimeContext(self, begin, end, delta): """ 设置起止时间及采样率,参数单位s """ self.tree.setTimeContext(begin, end, delta) def getData(self, channel_name, begin=None, end=None, delta=None): """ 返回x,y数据,如果没有数据,或出错,返回两个空列表 """ self.setTimeContext(begin, end, delta) channel_name = self.renameChaName(channel_name) try: data_x = self.tree.getNode(channel_name).dim_of().data() data_y = self.tree.getNode(channel_name).data() except mdsExceptions.TreeNODATA: # MDSplus.mdsExceptions.TreeNODATA: %TREE-E-NODATA, No data available for this node data_x = [] data_y = [] except mdsExceptions.TreeNNF: # MDSplus.mdsExceptions.TreeNNF: %TREE-W-NNF, Node Not Found data_x = [] data_y = [] except Exception as e: print('Check {} find that {}'.format(channel_name, str(e))) data_x = [] data_y = [] return data_x, data_y def getYInfo(self, channel_name): """ 获得通道数据Y轴单位 """ try: unit = self.tree.getNode( self.renameChaName(channel_name)).units_of() unit = '-' if unit == ' ' else unit except Exception as e: print('get {} unit find that {}'.format(channel_name, str(e))) unit = '-' return {"unit": unit}