def influxSignal(dbname, measurement, field_value): """Instantiate a connection to the InfluxDB.""" host = 'localhost' port = 8086 user = '******' password = '******' dbname = dbname.data() measurement = measurement.data() field_value = field_value.data() MDSplus.Data.execute('TreeOpen("influx", 0)') start_end_times = MDSplus.Tree.getTimeContext() print('Getting time context from the tree: {} '.format(start_end_times)) start_time = str(int(start_end_times[0])) end_time = str(int(start_end_times[1])) client = InfluxDBClient(host, port, user, password, dbname) # example influxDB query: # dbname = 'NOAA_water_database' # measurement = h2o_feet # field_value = water_level # 'SELECT "water_level" FROM "h2o_feet" WHERE time >= 1568745000000000000 AND time <= 1568750760000000000;' query = 'SELECT "%s" FROM "%s" WHERE time >= %s AND time <= %s;' % (field_value, measurement, start_time, end_time) print('Query: %s' % query) result = client.query(query, params={'epoch': 'ms'}) data = list(result.get_points()) valueData = [None] * len(data) timeData = [None] * len(data) i = 0 for row in data: valueData[i] = float(row['water_level']) timeData[i] = row['time'] i += 1 values = MDSplus.Float32Array(valueData) times = MDSplus.Uint64Array(timeData) return MDSplus.Signal(values, None, times)
def tdiFunctions(self): m.dTRUE = m.__dict__['$TRUE'] m.dFALSE = m.__dict__['$FALSE'] from MDSplus import mdsExceptions as Exc """Test Exceptions""" self._doExceptionTest('abort()', Exc.TdiABORT) self._doExceptionTest('{,}', Exc.TdiSYNTAX) self._doExceptionTest('\033[[A', Exc.TdiBOMB) self._doExceptionTest('abs()', Exc.TdiMISS_ARG) self._doExceptionTest('abs("")', Exc.TdiINVDTYDSC) self._doExceptionTest('abs(1,2)', Exc.TdiEXTRA_ARG) self._doExceptionTest('"', Exc.TdiUNBALANCE) """Test $Missing/NoData/None""" self._doTdiTest('', None) """Test abs""" self._doThreeTest('abs(cmplx(3.0,4.0))', m.ABS(m.Complex64(3. + 4.j)), m.Float32(5.)) """Test abs1""" self._doThreeTest('abs1(cmplx(3.0,4.0))', m.ABS1(m.Complex64(3. + 4.j)), m.Float32(7.)) """Test abssq""" self._doThreeTest('abssq(cmplx(3.0,4.0))', m.ABSSQ(m.Complex64(3. + 4.j)), m.Float32(25.)) """Test accumulate""" self._doThreeTestArray('accumulate([1,2,3])', m.ACCUMULATE(m.makeArray([1, 2, 3])), m.Int32Array([1, 3, 6])) self._doThreeTestArray( 'accumulate([[1,3,5],[2,4,6]])', m.ACCUMULATE(m.makeArray([[1, 3, 5], [2, 4, 6]])), m.Int32Array([[1, 4, 9], [11, 15, 21]])) self._doThreeTestArray( 'accumulate([[1,3,5],[2,4,6]],0)', m.ACCUMULATE(m.makeArray([[1, 3, 5], [2, 4, 6]]), 0), m.Int32Array([[1, 4, 9], [2, 6, 12]])) #self._doThreeTestArray('accumulate([[1,3,5],[2,4,6]],1)',m.ACCUMULATE([[1,3,5],[2,4,6]],1),m.Int32Array([[1,3,5],[3,7,11]])) # tdi issue self._doUnaryArray( m.Data.execute('accumulate([[1,3,5],[2,4,6]],1)'), m.ACCUMULATE(m.makeArray([[1, 3, 5], [2, 4, 6]]), 1).getData()) """Test achar""" self._doThreeTest('achar(88)', m.ACHAR(88), m.String('X')) """Test ADJUSTL""" self._doThreeTest('adjustl(" WORD")', m.ADJUSTL(" WORD"), m.String("WORD ")) """Test ADJUSTR""" self._doThreeTest('adjustr("WORD ")', m.ADJUSTR("WORD "), m.String(" WORD")) """Test AIMAG""" self._doThreeTest('AIMAG(CMPLX(2.0,3.0))', m.AIMAG(m.CMPLX(2., 3.)), m.Float32(3.0)) """Test AINT""" self._doThreeTest('aint(2.783)', m.AINT(2.783), m.Float32(2.0)) self._doThreeTest('aint(-2.783)', m.AINT(-2.783), m.Float32(-2.0)) """Test NE (operates on flattened array, i.e. first 3 values are compared)""" A, B = m.makeArray([1, 3, 5]), m.makeArray([[0, 3, 5], [0, 0, 0], [0, 4, 8]]) self._doThreeTestArray( '_A=[1,3,5],_B=[[0,3,5],[0,0,0],[0,4,8]],_A ne _B', m.NE(A, B), m.Uint8Array([1, 0, 0])) """Test NE (operates on flattened array, i.e. first 3 values are compared)""" self._doThreeTestArray('_A eq _B', m.EQ(A, B), m.Uint8Array([0, 1, 1])) """Test ALL and ANY""" self._doThreeTest('all([$TRUE,$FALSE,$TRUE])', m.ALL(m.makeArray([1, 0, 1])), m.Uint8(0)) self._doThreeTest('any([$TRUE,$FALSE,$TRUE])', m.ANY(m.makeArray([1, 0, 1])), m.Uint8(1)) A = 0 self._doThreeTest('_A=0,all(_A eq _B)', m.ALL(m.EQ(A, B)), False) self._doThreeTest('any(_A ne _B)', m.ANY(m.NE(A, B)), True) self._doThreeTestArray('all(_A ne _B,0)', m.ALL(m.NE(A, B), 0), m.Uint8Array([0, 0, 0])) self._doThreeTestArray('any(_A ne _B,0)', m.ANY(m.NE(A, B), 0), m.Uint8Array([1, 0, 1])) self._doThreeTestArray('all(_A eq _B,1)', m.ALL(m.EQ(A, B), 1), m.Uint8Array([1, 0, 0])) self._doThreeTestArray('any(_A ne _B,1)', m.ANY(m.NE(A, B), 1), m.Uint8Array([0, 1, 1])) """Test allocated""" self.assertEqual(m.DEALLOCATE('*') >= 2, True) # deallocates _A and _B and more? self.assertEqual(m.ALLOCATED('_xyz'), m.Uint8(0)) self._doTdiTest('_xyz=0,allocated("_xyz")', m.Uint8(1)) self.assertEqual(m.ALLOCATED('_xyz'), m.Uint8(1)) self.assertEqual(m.DEALLOCATE('*'), m.Uint8(1)) self.assertEqual(m.ALLOCATED('_xyz'), m.Uint8(0)) """Test AND""" A, B = m.makeArray([0, 0, 1, 1]), m.makeArray([0, 1, 0, 1]) self._doThreeTestArray('_A=[0,0,1,1],_B=[0,1,0,1],_A && _B', m.AND(A, B), m.Uint8Array([0, 0, 0, 1])) """Test AND_NOT""" self._doThreeTestArray('_A AND_NOT _B', m.AND_NOT(A, B), m.Uint8Array([0, 0, 1, 0])) """Test ANINT""" self._doThreeTest('ANINT(2.783)', m.ANINT(2.783), m.Float32(3.0)) """Test ARG""" self._doTdiTest( 'execute("abs(arg(cmplx(3.0,4.0)) - .9272952) < .000001")', m.Uint8(1)) """Test ARGD""" self._doTdiTest( 'execute("abs(argd(cmplx(3.0,4.0)) - 53.1301) < .000001")', m.Uint8(1)) """Test arg_of""" self._doThreeTest('arg_of(pub->foo(42,43))', m.ARG_OF(m.Call('pub', 'foo', 42, 43)), m.Int32(42)) self._doThreeTest('arg_of(pub->foo(42,43),1)', m.ARG_OF(m.Call('pub', 'foo', 42, 43), 1), m.Int32(43)) self._doThreeTest('arg_of(1+3,1)', m.ARG_OF(m.ADD(1, 3), 1), m.Int32(3)) """Test Array""" self._doThreeTestArray('array(10)', m.ARRAY(10), m.Float32Array([0] * 10)) self._doThreeTestArray('array(10,0)', m.ARRAY(10, 0), m.Int32Array([0] * 10)) self._doThreeTestArray('array(10,0BU)', m.ARRAY(10, m.Uint8(0)), m.Uint8Array([0] * 10)) self._doThreeTestArray('zero(100)', m.ZERO(100), m.Float32Array([0] * 100))
def influxSignal(fieldKey, aggregation, where, series=None, database=None, config=None, shotStartTime=None, shotEndTime=None): tree = MDSplus.Tree() debug = False if "DEBUG_DEVICES" in environ: debug = True if series is None: series = tree.getNode('\INFLUX_SERIES') if database is None: database = tree.getNode('\INFLUX_DATABASE') if config is None: config = tree.getNode('\INFLUX_CONFIG') if shotStartTime is None: shotStartTime = tree.getNode('\INFLUX_START_TIME') if shotEndTime is None: shotEndTime = tree.getNode('\INFLUX_END_TIME') if not isinstance(config, str): config = config.data() """Instantiate a connection to the InfluxDB.""" username = '' password = '' try: with open(config) as file: lines = file.readlines() if len(lines) < 2: print("Failed to read influx config from file %s" % (config, )) host = lines[0].strip('\n') username = lines[1].strip('\n') password = lines[2].strip('\n') except IOError as e: print("Failed to open credentials file %s" % (config, )) port = 8086 if ':' in host: parts = host.split(':') host = parts[0] port = int(parts[1]) if not isinstance(database, str): database = database.data() if not isinstance(series, str): series = series.data() if not isinstance(fieldKey, str): fieldKey = fieldKey.data() if not isinstance(aggregation, str): aggregation = aggregation.data() if isinstance(shotStartTime, str): shotStartTime = int(shotStartTime) elif not isinstance(shotStartTime, int): shotStartTime = shotStartTime.data() if isinstance(shotEndTime, str): shotEndTime = int(shotEndTime) elif not isinstance(shotEndTime, int): shotEndTime = shotEndTime.getDataNoRaise() if not isinstance(where, str): where = where.data() if where == '': return whereList = [where] timeContext = MDSplus.Tree.getTimeContext() startTime = shotStartTime endTime = shotEndTime deltaTime = None #print('Getting time context from the tree: %s '%(timeContext,)) # The time context is in seconds relative to the start of the shot. if timeContext[0] is not None: startTime = shotStartTime + (float(timeContext[0]) * 1000) if timeContext[1] is not None: endTime = shotStartTime + (float(timeContext[1]) * 1000) if timeContext[2] is not None: deltaTime = float(timeContext[2]) # Clamp the computed start/end time within the time bounds of the shot if startTime < shotStartTime: startTime = shotStartTime if endTime is not None and shotEndTime is not None and endTime > shotEndTime: endTime = shotEndTime startTimeQuery = '' endTimeQuery = '' # Convert to nanosecond UNIX timestamp startTimeQuery = 'time > %d' % (startTime * 1000000, ) # Convert to nanosecond UNIX timestamp if endTime is not None: endTimeQuery = 'time < %d' % (endTime * 1000000, ) if startTimeQuery != '': whereList.append(startTimeQuery) if endTimeQuery != '': whereList.append(endTimeQuery) where = '' if len(whereList) > 0: where = 'WHERE %s' % (' AND '.join(whereList), ) groupBy = '' if deltaTime is not None: # Convert deltaTime from seconds to milliseconds, if deltaTime is less than 1ms this will break deltaTimeMS = int(deltaTime * 1000) groupBy = 'GROUP BY time(%sms)' % ( deltaTimeMS, ) # The trailing 'ms' is for milliseconds # If the fieldKey does not have an aggregation function, Influx will error out # Attempt to wrap the field key with an aggregation function, but don't affect # any equations stored in it # For example: # 10*fVal will become 10*MEAN(fVal) fieldKey = re.sub(r'([a-zA-Z]*)', '%s(\\1)' % (aggregation, ), fieldKey) if debug: print(aggregation, fieldKey) """Instantiate a connection to the InfluxDB.""" client = InfluxDBClient(host, port, username, password, database) query = 'SELECT %s AS value FROM "%s" %s %s;' % (fieldKey, series, where, groupBy) if debug: print(query) result = client.query(query, params={'epoch': 'ms'}) data = list(result.get_points()) valueData = [None] * len(data) timeData = [None] * len(data) count = 0 for row in data: if debug: print(row) # If there are no data points within the time specified by deltaTime, influx # returns a None for the value if row['value'] is None: continue valueData[count] = float(row['value']) timeData[count] = (row['time'] - shotStartTime) / 1000 count += 1 # If any data points were skipped, shrink the arrays to the actual number of points values = MDSplus.Float32Array(valueData[:count]) times = MDSplus.Float32Array(timeData[:count]) return MDSplus.Signal(values, None, times)
def GetModelParameterData(ParameterStruct, numOfParameters): paramList = [] for paramIdx in range(numOfParameters): # name is retrieved retrievedName = WrapperLib.WCAPI_GetModelParameterName( ParameterStruct, paramIdx) retrievedName = retrievedName.decode("utf-8") # type is retrieved retrievedTypeIdx = WrapperLib.WCAPI_GetModelParameterDataTypeIdx( ParameterStruct, paramIdx) retrievedSLIdType = WrapperLib.WCAPI_GetDataTypeSLId( DataTypeMap, retrievedTypeIdx) retrievedCTypename = WrapperLib.WCAPI_GetDataTypeCName( DataTypeMap, retrievedTypeIdx) retrievedCTypename = retrievedCTypename.decode("utf-8") if retrievedSLIdType == 0: MARTe2Typename = 'float64' pythonTypename = ctypes.c_double elif retrievedSLIdType == 1: MARTe2Typename = 'float32' pythonTypename = ctypes.c_float elif retrievedSLIdType == 2: MARTe2Typename = 'int8' pythonTypename = ctypes.c_int8 elif retrievedSLIdType == 3: MARTe2Typename = 'uint8' pythonTypename = ctypes.c_uint8 elif retrievedSLIdType == 4: MARTe2Typename = 'int16' pythonTypename = ctypes.c_int16 elif retrievedSLIdType == 5: MARTe2Typename = 'uint16' pythonTypename = ctypes.c_uint16 elif retrievedSLIdType == 6: MARTe2Typename = 'int32' pythonTypename = ctypes.c_int32 elif retrievedSLIdType == 7: MARTe2Typename = 'uint32' pythonTypename = ctypes.c_uint32 elif retrievedSLIdType == 8: MARTe2Typename = 'bool' pythonTypename = ctypes.c_bool else: raise Exception('Unsupported parameter datatype.') # actual parameter value is retrieved paramAddrIdx = WrapperLib.WCAPI_GetModelParameterAddrIdx( ParameterStruct, paramIdx) paramDataAddr = WrapperLib.WCAPI_GetDataAddress( DataAddrMap, paramAddrIdx) paramPointer = ctypes.cast(paramDataAddr, ctypes.POINTER(pythonTypename)) # dimensions are retrieved dimIdx = WrapperLib.WCAPI_GetModelParameterDimensionIdx( ParameterStruct, paramIdx) dimArrayIdx = WrapperLib.WCAPI_GetDimArrayIndex( DimensionMap, dimIdx) # Starting position in the dimensionArray dimNum = WrapperLib.WCAPI_GetNumDims( DimensionMap, dimIdx ) # Number of elements in the dimensionArray referring to this signal currDimension = [] for currIdx in range(dimNum): currDimension.append(DimensionArray[dimArrayIdx + currIdx]) if currDimension[0] == 1 and currDimension[1] == 1: # scalar dimension = 0 mdsplusValue = paramPointer[0] elif currDimension[0] == 1: # vector dimension = currDimension[0] * currDimension[1] valueList = [] for idx in range(dimension): valueList.append(paramPointer[idx]) else: # matrix or column vector (MARTe2 sees column vectors as matrices) dimension = currDimension idx = 0 valueList = [] valueRow = [] for nRow in range(currDimension[0]): for nCol in range(currDimension[1]): valueRow.append(paramPointer[idx]) idx = idx + 1 valueList.append(valueRow) valueRow = [] if currDimension[0] != 1 or currDimension[1] != 1: if retrievedSLIdType == 0: mdsplusValue = MDSplus.Float32Array(valueList) elif retrievedSLIdType == 1: mdsplusValue = MDSplus.Float64Array(valueList) elif retrievedSLIdType == 2: mdsplusValue = MDSplus.Int8Array(valueList) elif retrievedSLIdType == 3: mdsplusValue = MDSplus.Uint8Array(valueList) elif retrievedSLIdType == 4: mdsplusValue = MDSplus.Int16Array(valueList) elif retrievedSLIdType == 5: mdsplusValue = MDSplus.Uint16Array(valueList) elif retrievedSLIdType == 6: mdsplusValue = MDSplus.Int32Array(valueList) elif retrievedSLIdType == 7: mdsplusValue = MDSplus.Uint32Array(valueList) else: raise Exception('Unsupported parameter datatype.') # retrieved data is saved to a dictionary paramDict = dict(name='Parameters.' + retrievedName, type=MARTe2Typename, dimensions=dimension, value=mdsplusValue) # dictionary is appended to the MDSplus-style list paramList.append(paramDict) return paramList
#!/usr/bin/python3 import MDSplus import time import math import numpy as np currTime = 0. shot = 1 idx = 0 while (True): time.sleep(0.1) currTime = idx * 0.1 idx = idx + 1 currVal1 = math.sin(currTime * 0.1) print(currTime) MDSplus.Event.stream( shot, 'MEASURE', MDSplus.Int64Array(np.repeat(int(time.time() * 1000), 5)), MDSplus.Float32Array(np.repeat(currVal1, 5)))
def GetModelParameterFields(structTypeIdx, ParameterStruct, paramIdx, baseParName, paramList, recLev ): if recLev == 10: raise Exception numFields = WrapperLib.WCAPI_GetDataTypeNumElements( DataTypeMap, structTypeIdx) elementMapIndex = WrapperLib.WCAPI_GetDataTypeElemMapIndex( DataTypeMap, structTypeIdx) # actual parameter value is retrieved paramAddrIdx = WrapperLib.WCAPI_GetModelParameterAddrIdx( ParameterStruct, paramIdx) paramDataAddr = WrapperLib.WCAPI_GetDataAddress( DataAddrMap, paramAddrIdx) #print('NUM FIELDS: '+str(numFields)) for fieldIdx in range(numFields): fieldName = WrapperLib.WCAPI_GetElementName( ElementMap, elementMapIndex + fieldIdx) fieldName = fieldName.decode("utf-8") #print('FIELD: '+baseParName+'-'+fieldName) fieldOffset = WrapperLib.WCAPI_GetElementOffset( ElementMap, elementMapIndex + fieldIdx) fieldTypeIdx = WrapperLib.WCAPI_GetElementDataTypeIdx( ElementMap, elementMapIndex + fieldIdx) #print('fieldTypeIdx: '+str(fieldTypeIdx)) fieldSLIdType = WrapperLib.WCAPI_GetDataTypeSLId( DataTypeMap, fieldTypeIdx) #print('fieldSLIdType: '+str(fieldSLIdType)) if fieldSLIdType == 0: fieldMARTe2Typename = 'float64' fieldPythonTypename = ctypes.c_double elif fieldSLIdType == 1: fieldMARTe2Typename = 'float32' fieldPythonTypename = ctypes.c_float elif fieldSLIdType == 2: fieldMARTe2Typename = 'int8' fieldPythonTypename = ctypes.c_int8 elif fieldSLIdType == 3: fieldMARTe2Typename = 'uint8' fieldPythonTypename = ctypes.c_uint8 elif fieldSLIdType == 4: fieldMARTe2Typename = 'int16' fieldPythonTypename = ctypes.c_int16 elif fieldSLIdType == 5: fieldMARTe2Typename = 'uint16' fieldPythonTypename = ctypes.c_uint16 elif fieldSLIdType == 6: fieldMARTe2Typename = 'int32' fieldPythonTypename = ctypes.c_int32 elif fieldSLIdType == 7: fieldMARTe2Typename = 'uint32' fieldPythonTypename = ctypes.c_uint32 elif fieldSLIdType == 8: fieldMARTe2Typename = 'uint8' fieldPythonTypename = ctypes.c_int8 elif fieldSLIdType == 254: fieldEnumType = WrapperLib.WCAPI_GetDataEnumStorageType(DataTypeMap, fieldTypeIdx) if fieldEnumType == 0: fieldMARTe2Typename = 'float64' fieldPythonTypename = ctypes.c_double elif fieldEnumType == 1: fieldMARTe2Typename = 'float32' fieldPythonTypename = ctypes.c_float elif fieldEnumType == 2: fieldMARTe2Typename = 'int8' fieldPythonTypename = ctypes.c_int8 elif fieldEnumType == 3: fieldMARTe2Typename = 'uint8' fieldPythonTypename = ctypes.c_uint8 elif fieldEnumType == 4: fieldMARTe2Typename = 'int16' fieldPythonTypename = ctypes.c_int16 elif fieldEnumType == 5: fieldMARTe2Typename = 'uint16' fieldPythonTypename = ctypes.c_uint16 elif fieldEnumType == 6: fieldMARTe2Typename = 'int32' fieldPythonTypename = ctypes.c_int32 elif fieldEnumType == 7: fieldMARTe2Typename = 'uint32' fieldPythonTypename = ctypes.c_uint32 else: print('type '+str(fieldEnumType)) raise Exception('Unsupported Enum datatype.') else: #NESTED STRUCTURES!!!!!!!!!!!!!!!! #print('TYPE '+str(fieldSLIdType) + ' '+str(fieldTypeIdx)) GetModelParameterFields(fieldTypeIdx, ParameterStruct, paramIdx, baseParName + '-'+fieldName, paramList, recLev+1) continue #no direct data associated # field dimensions # dimensions are retrieved fieldDimIdx = WrapperLib.WCAPI_GetElementDimensionIdx( ElementMap, elementMapIndex + fieldIdx) fieldDimArrayIdx = WrapperLib.WCAPI_GetDimArrayIndex( DimensionMap, fieldDimIdx) # Starting position in the dimensionArray # Number of elements in the dimensionArray referring to this signal fieldDimNum = WrapperLib.WCAPI_GetNumDims( DimensionMap, fieldDimIdx) #print('fieldDimNum: '+ str(fieldDimNum)) currDimension = [] for currIdx in range(fieldDimNum): currDimension.append( DimensionArray[fieldDimArrayIdx + currIdx]) if currDimension[0] == 1 and currDimension[1] == 1: fieldDimension = 0 elif currDimension[0] == 1 or currDimension[1] == 1: fieldDimension = [ currDimension[0]*currDimension[1]] else: fieldDimension = currDimension currParAddress = paramDataAddr + fieldOffset paramPointer = ctypes.cast( currParAddress, ctypes.POINTER(fieldPythonTypename)) if currDimension[0] == 1 and currDimension[1] == 1: # scalar dimension = 0 mdsplusValue = paramPointer[0] elif currDimension[0] == 1: # vector dimension = currDimension[0]*currDimension[1] valueList = [] for idx in range(dimension): valueList.append(paramPointer[idx]) else: # matrix or column vector (MARTe2 sees column vectors as matrices) dimension = currDimension idx = 0 valueList = [] valueRow = [] for nRow in range(currDimension[0]): for nCol in range(currDimension[1]): valueRow.append(paramPointer[idx]) idx = idx + 1 valueList.append(valueRow) valueRow = [] if currDimension[0] != 1 or currDimension[1] != 1: if fieldSLIdType == 0: mdsplusValue = MDSplus.Float32Array(valueList) elif fieldSLIdType == 1: mdsplusValue = MDSplus.Float64Array(valueList) elif fieldSLIdType == 2: mdsplusValue = MDSplus.Int8Array(valueList) elif fieldSLIdType == 3: mdsplusValue = MDSplus.Uint8Array(valueList) elif fieldSLIdType == 4: mdsplusValue = MDSplus.Int16Array(valueList) elif fieldSLIdType == 5: mdsplusValue = MDSplus.Uint16Array(valueList) elif fieldSLIdType == 6: mdsplusValue = MDSplus.Int32Array(valueList) elif fieldSLIdType == 7: mdsplusValue = MDSplus.Uint32Array(valueList) elif fieldSLIdType == 8: mdsplusValue = MDSplus.Uint8Array(valueList) else: raise Exception('Unsupported parameter datatype.') paramDict = dict(name=baseParName+'-'+fieldName, type=fieldMARTe2Typename, dimensions=fieldDimension, value=mdsplusValue) # dictionary is appended to the MDSplus-style list paramList.append(paramDict)
def GetModelParameterData(ParameterStruct, numOfParameters): paramList = [] for paramIdx in range(numOfParameters): # name is retrieved retrievedName = WrapperLib.WCAPI_GetModelParameterName( ParameterStruct, paramIdx) retrievedName = retrievedName.decode("utf-8") #print('retrievedname: ', retrievedName) # type is retrieved retrievedTypeIdx = WrapperLib.WCAPI_GetModelParameterDataTypeIdx( ParameterStruct, paramIdx) #print('retrievedTypeIdx: ', str(retrievedTypeIdx)) retrievedSLIdType = WrapperLib.WCAPI_GetDataTypeSLId( DataTypeMap, retrievedTypeIdx) #print('retrievedSLIdType: ', str(retrievedSLIdType)) #retrievedCTypename = WrapperLib.WCAPI_GetDataTypeCName( # DataTypeMap, retrievedTypeIdx) #retrievedCTypename = retrievedCTypename.decode("utf-8") #print('retrievedCTypename: '+retrievedCTypename) if retrievedSLIdType == 0: MARTe2Typename = 'float64' pythonTypename = ctypes.c_double elif retrievedSLIdType == 1: MARTe2Typename = 'float32' pythonTypename = ctypes.c_float elif retrievedSLIdType == 2: MARTe2Typename = 'int8' pythonTypename = ctypes.c_int8 elif retrievedSLIdType == 3: MARTe2Typename = 'uint8' pythonTypename = ctypes.c_uint8 elif retrievedSLIdType == 4: MARTe2Typename = 'int16' pythonTypename = ctypes.c_int16 elif retrievedSLIdType == 5: MARTe2Typename = 'uint16' pythonTypename = ctypes.c_uint16 elif retrievedSLIdType == 6: MARTe2Typename = 'int32' pythonTypename = ctypes.c_int32 elif retrievedSLIdType == 7: MARTe2Typename = 'uint32' pythonTypename = ctypes.c_uint32 elif retrievedSLIdType == 8: MARTe2Typename = 'uint8' pythonTypename = ctypes.c_bool elif retrievedSLIdType == 254: fieldEnumType = WrapperLib.WCAPI_GetDataEnumStorageType(DataTypeMap, retrievedTypeIdx) if fieldEnumType == 0: MARTe2Typename = 'float64' pythonTypename = ctypes.c_double elif fieldEnumType == 1: MARTe2Typename = 'float32' pythonTypename = ctypes.c_float elif fieldEnumType == 2: MARTe2Typename = 'int8' pythonTypename = ctypes.c_int8 elif fieldEnumType == 3: pythonTypename = ctypes.c_uint8 MARTe2Typename = 'uint8' elif fieldEnumType == 4: MARTe2Typename = 'int16' pythonTypename = ctypes.c_int16 elif fieldEnumType == 5: pythonTypename = ctypes.c_uint16 MARTe2Typename = 'uint16' elif fieldEnumType == 6: pythonTypename = ctypes.c_int32 MARTe2Typename = 'int32' elif fieldEnumType == 7: pythonTypename = ctypes.c_uint32 MARTe2Typename = 'uint32' else: print('type '+str(fieldEnumType)) raise Exception('Unsupported Enum datatype.') elif retrievedSLIdType == 255: pass else: raise Exception('Unsupported parameter datatype.') if retrievedSLIdType != 255: # actual parameter value is retrieved paramAddrIdx = WrapperLib.WCAPI_GetModelParameterAddrIdx( ParameterStruct, paramIdx) paramDataAddr = WrapperLib.WCAPI_GetDataAddress( DataAddrMap, paramAddrIdx) paramPointer = ctypes.cast( paramDataAddr, ctypes.POINTER(pythonTypename)) # dimensions are retrieved dimIdx = WrapperLib.WCAPI_GetModelParameterDimensionIdx( ParameterStruct, paramIdx) dimArrayIdx = WrapperLib.WCAPI_GetDimArrayIndex( DimensionMap, dimIdx) # Starting position in the dimensionArray # Number of elements in the dimensionArray referring to this signal dimNum = WrapperLib.WCAPI_GetNumDims( DimensionMap, dimIdx) currDimension = [] for currIdx in range(dimNum): currDimension.append(DimensionArray[dimArrayIdx + currIdx]) if currDimension[0] == 1 and currDimension[1] == 1: # scalar dimension = 0 mdsplusValue = paramPointer[0] elif currDimension[0] == 1: # vector dimension = currDimension[0]*currDimension[1] valueList = [] for idx in range(dimension): valueList.append(paramPointer[idx]) else: # matrix or column vector (MARTe2 sees column vectors as matrices) dimension = currDimension idx = 0 valueList = [] valueRow = [] for nRow in range(currDimension[0]): for nCol in range(currDimension[1]): valueRow.append(paramPointer[idx]) idx = idx + 1 valueList.append(valueRow) valueRow = [] if currDimension[0] != 1 or currDimension[1] != 1: if retrievedSLIdType == 0: mdsplusValue = MDSplus.Float32Array(valueList) elif retrievedSLIdType == 1: mdsplusValue = MDSplus.Float64Array(valueList) elif retrievedSLIdType == 2: mdsplusValue = MDSplus.Int8Array(valueList) elif retrievedSLIdType == 3: mdsplusValue = MDSplus.Uint8Array(valueList) elif retrievedSLIdType == 4: mdsplusValue = MDSplus.Int16Array(valueList) elif retrievedSLIdType == 5: mdsplusValue = MDSplus.Uint16Array(valueList) elif retrievedSLIdType == 6: mdsplusValue = MDSplus.Int32Array(valueList) elif retrievedSLIdType == 7: mdsplusValue = MDSplus.Uint32Array(valueList) else: raise Exception('Unsupported parameter datatype.') # retrieved data is saved to a dictionary paramDict = dict(name='Parameters.'+retrievedName, type=MARTe2Typename, dimensions=dimension, value=mdsplusValue) # dictionary is appended to the MDSplus-style list paramList.append(paramDict) else: #retrievedSLIdType == 255 SRUCTURED PARAMETERS GetModelParameterFields(retrievedTypeIdx, ParameterStruct, paramIdx, 'Parameters.'+retrievedName, paramList, 1) #numFields = WrapperLib.WCAPI_GetDataTypeNumElements( #DataTypeMap, retrievedTypeIdx) #elementMapIndex = WrapperLib.WCAPI_GetDataTypeElemMapIndex( #DataTypeMap, retrievedTypeIdx) ## actual parameter value is retrieved #paramAddrIdx = WrapperLib.WCAPI_GetModelParameterAddrIdx( #ParameterStruct, paramIdx) #paramDataAddr = WrapperLib.WCAPI_GetDataAddress( #DataAddrMap, paramAddrIdx) #print('NUM FIELDS: '+str(numFields)) #for fieldIdx in range(numFields): #fieldName = WrapperLib.WCAPI_GetElementName( #ElementMap, elementMapIndex + fieldIdx) #fieldName = fieldName.decode("utf-8") #print('FIELD: '+fieldName) #fieldOffset = WrapperLib.WCAPI_GetElementOffset( #ElementMap, elementMapIndex + fieldIdx) #fieldTypeIdx = WrapperLib.WCAPI_GetElementDataTypeIdx( #ElementMap, elementMapIndex + fieldIdx) #fieldSLIdType = WrapperLib.WCAPI_GetDataTypeSLId( #DataTypeMap, fieldTypeIdx) #if fieldSLIdType == 0: #fieldMARTe2Typename = 'float64' #fieldPythonTypename = ctypes.c_double #elif fieldSLIdType == 1: #fieldMARTe2Typename = 'float32' #fieldPythonTypename = ctypes.c_float #elif fieldSLIdType == 2: #fieldMARTe2Typename = 'int8' #fieldPythonTypename = ctypes.c_int8 #elif fieldSLIdType == 3: #fieldMARTe2Typename = 'uint8' #fieldPythonTypename = ctypes.c_uint8 #elif fieldSLIdType == 4: #fieldMARTe2Typename = 'int16' #fieldPythonTypename = ctypes.c_int16 #elif fieldSLIdType == 5: #fieldMARTe2Typename = 'uint16' #fieldPythonTypename = ctypes.c_uint16 #elif fieldSLIdType == 6: #fieldMARTe2Typename = 'int32' #fieldPythonTypename = ctypes.c_int32 #elif fieldSLIdType == 7: #fieldMARTe2Typename = 'uint32' #fieldPythonTypename = ctypes.c_uint32 #elif fieldSLIdType == 8: #fieldMARTe2Typename = 'bool' #fieldPythonTypename = ctypes.c_int8 #elif fieldSLIdType == 254: #fieldEnumType = WrapperLib.WCAPI_GetDataEnumStorageType(DataTypeMap, fieldTypeIdx) #if fieldEnumType == 0: #fieldMARTe2Typename = 'float64' #fieldPythonTypename = ctypes.c_double #elif fieldEnumType == 1: #fieldMARTe2Typename = 'float32' #fieldPythonTypename = ctypes.c_float #elif fieldEnumType == 2: #fieldMARTe2Typename = 'int8' #fieldPythonTypename = ctypes.c_int8 #elif fieldEnumType == 3: #fieldMARTe2Typename = 'uint8' #fieldPythonTypename = ctypes.c_uint8 #elif fieldEnumType == 4: #fieldMARTe2Typename = 'int16' #fieldPythonTypename = ctypes.c_int16 #elif fieldEnumType == 5: #fieldMARTe2Typename = 'uint16' #fieldPythonTypename = ctypes.c_uint16 #elif fieldEnumType == 6: #fieldMARTe2Typename = 'int32' #fieldPythonTypename = ctypes.c_int32 #elif fieldEnumType == 7: #fieldMARTe2Typename = 'uint32' #fieldPythonTypename = ctypes.c_uint32 #else: #print('type '+str(fieldEnumType)) #raise Exception('Unsupported Enum datatype.') #else: #print('type '+str(fieldSLIdType)) #raise Exception('Unsupported nested structures.') ## field dimensions ## dimensions are retrieved #fieldDimIdx = WrapperLib.WCAPI_GetElementDimensionIdx( #ElementMap, elementMapIndex + fieldIdx) #fieldDimArrayIdx = WrapperLib.WCAPI_GetDimArrayIndex( #DimensionMap, fieldDimIdx) # Starting position in the dimensionArray ## Number of elements in the dimensionArray referring to this signal #fieldDimNum = WrapperLib.WCAPI_GetNumDims( #DimensionMap, fieldDimIdx) #currDimension = [] #for currIdx in range(fieldDimNum): #currDimension.append( #DimensionArray[fieldDimArrayIdx + currIdx]) #if currDimension[0] == 1 and currDimension[1] == 1: #fieldDimension = 0 #elif currDimension[0] == 1 or currDimension[1] == 1: #fieldDimension = [ #currDimension[0]*currDimension[1]] #else: #fieldDimension = currDimension #currParAddress = paramDataAddr + fieldOffset #paramPointer = ctypes.cast( #currParAddress, ctypes.POINTER(fieldPythonTypename)) #if currDimension[0] == 1 and currDimension[1] == 1: # scalar #dimension = 0 #mdsplusValue = paramPointer[0] #elif currDimension[0] == 1: # vector #dimension = currDimension[0]*currDimension[1] #valueList = [] #for idx in range(dimension): #valueList.append(paramPointer[idx]) #else: ## matrix or column vector (MARTe2 sees column vectors as matrices) #dimension = currDimension #idx = 0 #valueList = [] #valueRow = [] #for nRow in range(currDimension[0]): #for nCol in range(currDimension[1]): #valueRow.append(paramPointer[idx]) #idx = idx + 1 #valueList.append(valueRow) #valueRow = [] #if currDimension[0] != 1 or currDimension[1] != 1: #if fieldSLIdType == 0: #mdsplusValue = MDSplus.Float32Array(valueList) #elif fieldSLIdType == 1: #mdsplusValue = MDSplus.Float64Array(valueList) #elif fieldSLIdType == 2: #mdsplusValue = MDSplus.Int8Array(valueList) #elif fieldSLIdType == 3: #mdsplusValue = MDSplus.Uint8Array(valueList) #elif fieldSLIdType == 4: #mdsplusValue = MDSplus.Int16Array(valueList) #elif fieldSLIdType == 5: #mdsplusValue = MDSplus.Uint16Array(valueList) #elif fieldSLIdType == 6: #mdsplusValue = MDSplus.Int32Array(valueList) #elif fieldSLIdType == 7: #mdsplusValue = MDSplus.Uint32Array(valueList) #else: #raise Exception('Unsupported parameter datatype.') #paramDict = dict(name='Parameters.'+retrievedName+'-'+fieldName, #type=fieldMARTe2Typename, dimensions=fieldDimension, value=mdsplusValue) ## dictionary is appended to the MDSplus-style list #paramList.append(paramDict) #endif STRUCTURED PARAMETER #endfor parameters #print('PARAMETRI FATTI') return paramList
sweeps_average = int(1 * 1e3 / (shot.sweep_dur + shot.interv_sweep)) # take out last sweep just to be sure. sweeps_array = np.arange(initial_sweep, last_sweep, sweeps_average)[:-1] # Evaluates profile once to check number of points per profile. shot.profile(1, 1, all_shot=1) # matrix of position by time and density. shot.matrix = np.empty((len(sweeps_array), len(shot.pos))) i = 0 for sweep in sweeps_array: print(sweep) shot.profile(sweep, sweeps_average, all_shot=1) shot.matrix[i] = shot.pos i += 1 # Save to tree tree_name = "tcabr_ref" tree = mds.Tree(tree_name, shot_number) # time array. node = tree.getNode("\\prof_time.signal") data = mds.Float32Array(np.arange(initial_time, last_time, interval_time), dtype=np.float32) data.setUnits("ms") # density array. It will be the same for all shot. node = tree.getNode("\\prof_density.signal") data = mds.Float32Array(shot.ne_poly, dtype=np.float32) # position matrix node = tree.getNode("\\prof_position.signal") data = mds.Float32Array(shot.matrix, dtype=np.float32) data.setUnits("m")
def store(self, start=0, end=0): if not self.on: return try: from influxdb import InfluxDBClient except: print( "You must install the `influxdb` python package to use the `influxhistorian` device class" ) exit(1) address = self.address.data() parts = address.split(":", 2) address = parts[0] port = 8086 if len(parts) > 1: port = int(parts[1]) username = '' password = '' try: with open(self.credentials.data()) as cred_file: lines = cred_file.readlines() if len(lines) < 2: print("Failed to read credentials from file %s" % (self.credentials.data(), )) username = lines[0].strip('\n') password = lines[1].strip('\n') except IOError as e: print("Failed to open credentials file %s" % (self.credentials.data(), )) client = InfluxDBClient(address, port, username, password, self.database.data()) startTimeQuery = '' endTimeQuery = '' if start > 0: # Convert to nanosecond UNIX timestamp startTimeQuery = 'time >= %d' % (start * 1000000, ) if end > 0: # Convert to nanosecond UNIX timestamp endTimeQuery = 'time < %d' % (end * 1000000, ) for i in range(self.DATA_COUNT): try: node = self.__getattr__("data_d%03d" % (i + 1, )) where = self.__getattr__("data_d%03d_where" % (i + 1, )).data() if not node.on: continue if where == '': continue whereList = [where] if startTimeQuery != '': whereList.append(startTimeQuery) if endTimeQuery != '': whereList.append(endTimeQuery) where = '' if len(whereList) > 0: where = 'WHERE %s' % (' AND '.join(whereList), ) query = 'SELECT fVal,iVal,bVal FROM "%s" %s' % ( self.series.data(), where) self.dprint(query, 1) result = client.query(query, params={'epoch': 'ms'}) self.dprint("Query returned", 1) data = list(result.get_points()) valueData = [None] * len(data) timeData = [None] * len(data) i = 0 for row in data: if row['fVal'] != None: valueData[i] = float(row['fVal']) elif row['iVal'] != None: valueData[i] = float(row['iVal']) elif row['bVal'] != None: valueData[i] = float(row['bVal']) timeData[i] = row['time'] i += 1 values = MDSplus.Float32Array(valueData) times = MDSplus.Uint64Array(timeData) node.makeTimestampedSegment(times, values) self.dprint("MDSplus I/O complete", 1) except MDSplus.TreeNODATA: pass except Exception as e: print(e) MDSplus.Event.setevent(self.data_event.data())