Ejemplo n.º 1
0
 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")
Ejemplo n.º 2
0
 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")
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
    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))
Ejemplo n.º 5
0
 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')
Ejemplo n.º 6
0
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}