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