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)
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
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}
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())