예제 #1
0
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)
예제 #2
0
 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))
예제 #3
0
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)
예제 #4
0
        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
예제 #5
0
#!/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)))
예제 #6
0
        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)
예제 #7
0
        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")
예제 #9
0
    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())