Exemplo n.º 1
0
def setTransitionTimes(treeName, nchan, delta, stlpath):
    #This function is kind of a Unit Test.

    tree = Tree(treeName, -1, 'EDIT')
    print('Tree Name: ', treeName)

    nchan = int(nchan)
    current = 0.0
    delta = float(delta)  # sec
    end = 40.0  # sec

    times = np.arange(current, end, delta)

    transitions1 = np.array([[times[1], int(0)], [times[2], int(1)],
                             [times[3], int(0)], [times[4], int(1)],
                             [times[5], int(0)], [times[6], int(1)],
                             [times[8], int(1)], [times[9], int(1)],
                             [times[10],
                              int(0)], [times[11],
                                        int(1)], [times[12], int(0)],
                             [times[13],
                              int(1)], [times[14],
                                        int(0)], [times[15],
                                                  int(1)], [times[16],
                                                            int(0)],
                             [times[17], int(1)], [times[18],
                                                   int(0)],
                             [times[19], int(1)], [times[30],
                                                   int(0)]])

    transitions2 = np.array([[times[0], int(0)], [times[3], int(1)],
                             [times[7], int(0)]])

    for i in range(nchan):
        t_times = tree.getNode('ACQ2106_WRPG:OUTPUT_%3.3d' % (i + 1))

        if (i % 2) == 0:  #Even Channels
            t_times.record = transitions1
        else:
            t_times.record = transitions2

    tree.write()
    tree.close()

    set_stl(treeName, times, nchan, stlpath)
Exemplo n.º 2
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
Exemplo n.º 3
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}
Exemplo n.º 4
0
 def test():
     from MDSplus import Tree, Int32, Int64, Dimension, Range, Window, DIVIDE, ADD, MULTIPLY
     from numpy import arange, ones, int16, int64
     slp = 3.3
     off = 1.1
     trg = -1000000
     clk = 1000000
     with Tree(self.tree, self.shot, 'NEW') as ptree:
         sig = ptree.addNode('SIG').record = ADD(
             MULTIPLY(ptree.addNode('RAW'), ptree.addNode('SLP')),
             ptree.addNode('OFF'))
         ptree.addNode('TRG').record = Int64(trg)
         ptree.addNode('CLK').record = Int32(clk)
         ptree.write()
     ptree = Tree(self.tree, self.shot)
     trig = ptree.TRG
     raw = ptree.RAW
     sig = ptree.SIG
     dt = DIVIDE(Int64(1e9), ptree.CLK)
     rng = Range(None, None, dt)
     wnd = Window(None, None, trig)
     ptree.SLP.record = slp
     ptree.OFF.record = off
     length, seglen = 100, 10
     dat = ones(seglen, dtype=int16)
     for i0 in range(0, length, seglen):
         i1 = i0 + seglen - 1
         wnd[0], wnd[1] = Int64(i0), Int64(i1)
         dim = Dimension(wnd, rng)
         d0 = Int64(i0 * dt + trig)
         d1 = Int64(i1 * dt + trig)
         self.assertEqual(dim.data()[0], d0.data())
         self.assertEqual(dim.data()[-1], d1.data())
         raw.makeSegment(d0, d1, dim, dat)
     self.assertEqual(
         str(raw.getSegment(0)),
         "Build_Signal(Word([1,1,1,1,1,1,1,1,1,1]), *, Build_Dim(Build_Window(0Q, 9Q, TRG), * : * : 1000000000Q / CLK))"
     )
     self.assertEqual(str(sig.record), "RAW * SLP + OFF")
     self.assertTrue(sig.dim_of().tolist(),
                     (arange(0, length, dtype=int64) * int(1e9 / clk) +
                      trg).tolist())
     self.assertTrue(
         (abs(sig.data() -
              (ones(length, dtype=int16) * slp + off)) < 1e-5).all(),
         "Stored data does not match expected array")
     trig.record = 0
     for i in range(int(length / seglen)):
         dim = raw.getSegmentDim(i)
         raw.updateSegment(dim.data()[0], dim.data()[-1], dim, i)
     self.assertEqual(
         str(raw.getSegment(0)),
         "Build_Signal(Word([1,1,1,1,1,1,1,1,1,1]), *, Build_Dim(Build_Window(0Q, 9Q, TRG), * : * : 1000000000Q / CLK))"
     )
     self.assertTrue(sig.dim_of().tolist(),
                     (arange(0, length, dtype=int64) *
                      int(1e9 / clk)).tolist())
     ptree.close()
     ptree.compressDatafile(
     )  # this will break the functionality of updateSegment
     ptree.open()
     trig.record = 0
     for i in range(int(length / seglen)):
         raw.updateSegment(i * seglen, i * seglen - 1, None, i)
     self.assertEqual(
         str(raw.getSegment(0)),
         "Build_Signal(Word([1,1,1,1,1,1,1,1,1,1]), *, Build_Dim(Build_Window(0Q, 9Q, TRG), * : * : 1000000000Q / CLK))"
     )
     self.assertTrue(sig.dim_of().tolist(),
                     (arange(0, length, dtype=int64) *
                      int(1e9 / clk)).tolist())