예제 #1
0
        def test():
            from MDSplus import Tree, Int64, Int64Array, Int32Array, tdi, tcl
            #Tree.setTimeContext() # test initPinoDb
            #self.assertEquals(Tree.getTimeContext(),(None,None,None))
            with Tree(self.tree, self.shot, 'NEW') as ptree:
                node = ptree.addNode('S')
                ptree.write()
            node.tree = Tree(self.tree, self.shot)
            for i in range(-9, 9, 3):
                d = Int64Array(range(3)) * 10 + i * 10
                v = Int32Array(range(3)) + i
                node.beginSegment(d[0], d[2], d, v)
            self.assertEqual(
                node.getSegmentList(20, 59).dim_of(0).tolist(), [0, 30])
            self.assertEqual(
                node.getSegmentList(20, 60).dim_of(0).tolist(), [0, 30, 60])
            self.assertEqual(
                node.getSegmentList(21, 60).dim_of(0).tolist(), [30, 60])
            self.assertEqual(node.record.data().tolist(), list(range(-9, 9)))
            node.tree.setTimeContext(Int64(30), Int64(70), Int64(20))
            #        Tree.setTimeContext(1,2,3) # test privacy to Tree
            self.assertEquals(node.tree.getTimeContext(), (30, 70, 20))
            #       self.assertEquals(Tree.getTimeContext(),(1,2,3))
            self.assertEqual(node.record.data().tolist(),
                             [3, 5] + [6])  # delta is applied per segment
            node.tree.setTimeContext()

            self.assertEquals(node.tree.getTimeContext(), (None, None, None))
            self.assertEqual(node.record.data().tolist(), list(range(-9, 9)))

            #self.assertEquals(Tree.getTimeContext(),(1,2,3))
            tdi('treeopen($,$)', self.tree, self.shot)
            Tree.setTimeContext(1, 2, 3)  # test privacy to Tree
            self.assertEquals(Tree.getTimeContext(), (1, 2, 3))
            tdi('treeopennew($,$)', self.tree, self.shot + 1)
            self.assertEquals(Tree.getTimeContext(), (None, None, None))
            Tree.setTimeContext(2, 3, 4)  # test privacy to Tree
            self.assertEquals(Tree.getTimeContext(), (2, 3, 4))
            tdi('treeopen($,$)', self.tree, self.shot)
            self.assertEquals(Tree.getTimeContext(), (1, 2, 3))
            tdi('treeclose()')
            self.assertEquals(Tree.getTimeContext(), (2, 3, 4))
            tdi('treeclose()', self.tree, self.shot)
            self.assertEquals(Tree.getTimeContext(), (1, 2, 3))
예제 #2
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}
예제 #3
0
    def time_context(self):
        Tree.setTimeContext()  # test initPinoDb
        self.assertEqual(Tree.getTimeContext(), (None, None, None))
        with Tree(self.tree, self.shot + 5, 'NEW') as ptree:
            node = ptree.addNode('S')
            ptree.write()
        ptree.normal()
        for i in range(-90, 90, 30):
            d = Int64Array(range(30)) * 10 + i * 10
            v = Float32Array(range(30)) + i
            node.makeSegment(d[0], d[29], d, v)
        self.assertEqual(
            node.getSegmentList(200, 599).dim_of(0).tolist(), [0, 300])
        self.assertEqual(
            node.getSegmentList(200, 600).dim_of(0).tolist(), [0, 300, 600])
        self.assertEqual(
            node.getSegmentList(291, 600).dim_of(0).tolist(), [300, 600])
        self.assertEqual(node.record.data().tolist(), list(range(-90, 90)))

        sig = node.getXYSignal(xmin=0., xmax=3e-8, num=5)
        self.assertEqual(sig.data().tolist(), [0, 1, 2, 3])
        self.assertEqual(sig.dim_of().data().tolist(), [0, 10, 20, 30])

        node.tree.setTimeContext(Int64(300), Int64(700), Int64(150))
        Tree.setTimeContext(1, 2, 3)
        self.assertEqual(Tree.getTimeContext(), (1, 2, 3))
        self.assertEqual(node.tree.getTimeContext(), (300, 700, 150))

        set_default_resample_mode("m")  # minmax
        sig = node.record
        self.assertEqual(sig.data().tolist(), [30, 44, 45, 59, 60, 74])
        self.assertEqual(sig.dim_of().data().tolist(),
                         [375, 375, 525, 525, 675, 675])

        set_default_resample_mode("i")  # interpolation
        sig = node.record
        self.assertEqual(sig.data().tolist(), [30, 45, 60])
        self.assertEqual(sig.dim_of().data().tolist(), [300, 450, 600])

        node.setExtendedAttribute("ResampleMode", "Average")
        sig = node.record
        self.assertEqual(sig.data().tolist(), [37, 52, 67])
        self.assertEqual(sig.dim_of().data().tolist(), [375, 525, 675])

        node.setExtendedAttribute("ResampleMode", "MinMax")
        sig = node.record
        self.assertEqual(sig.data().tolist(), [30, 44, 45, 59, 60, 74])
        self.assertEqual(sig.dim_of().data().tolist(),
                         [375, 375, 525, 525, 675, 675])

        node.setExtendedAttribute("ResampleMode", "INTERP")
        sig = node.record
        self.assertEqual(sig.data().tolist(), [30, 45, 60])
        self.assertEqual(sig.dim_of().data().tolist(), [300, 450, 600])

        node.setExtendedAttribute("ResampleMode", "Previous")
        sig = node.record
        self.assertEqual(sig.data().tolist(), [30, 44, 60])
        self.assertEqual(sig.dim_of().data().tolist(), [300, 450, 600])

        node.setExtendedAttribute("ResampleMode", "Closest")
        sig = node.record
        self.assertEqual(sig.data().tolist(), [30, 45, 60])
        self.assertEqual(sig.dim_of().data().tolist(), [300, 450, 600])

        node.tree.setTimeContext()
        self.assertEqual(node.tree.getTimeContext(), (None, None, None))
        self.assertEqual(node.record.data().tolist(), list(range(-90, 90)))
        self.assertEqual(Tree.getTimeContext(), (1, 2, 3))
        tdi('treeopen($,$)', self.tree, self.shot + 5)
        Tree.setTimeContext(1, 2, 3)  # test privacy to Tree
        self.assertEqual(Tree.getTimeContext(), (1, 2, 3))
        tdi('treeopennew($,$)', self.tree, self.shot + 6)
        self.assertEqual(Tree.getTimeContext(), (None, None, None))
        Tree.setTimeContext(2, 3, 4)  # test privacy to Tree
        self.assertEqual(Tree.getTimeContext(), (2, 3, 4))
        tdi('treeopen($,$)', self.tree, self.shot + 5)
        self.assertEqual(Tree.getTimeContext(), (1, 2, 3))
        tdi('treeclose()')
        self.assertEqual(Tree.getTimeContext(), (2, 3, 4))
        tdi('treeclose()')
        self.assertEqual(Tree.getTimeContext(), (2, 3, 4))