Added MDS Import files
Signed-off-by: Bernardo Carvalho <bernardo.carvalho@tecnico.ulisboa.pt>
This commit is contained in:
144
Analysis/MdsImportSdas.py
Normal file
144
Analysis/MdsImportSdas.py
Normal file
@@ -0,0 +1,144 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Python3 App to Import data from ISTTOK SDAS to MDSPlus
|
||||
author: B. Carvalho / IPFN-IST
|
||||
email: bernardo.carvalho@tecnico.ulisboa.pt
|
||||
|
||||
Install sdas:
|
||||
http://metis.ipfn.tecnico.ulisboa.pt/CODAC/IPFN_Software/SDAS/Access/Python
|
||||
"""
|
||||
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
from sdas.core.client.SDASClient import SDASClient
|
||||
from sdas.core.SDAStime import Date, Time, TimeStamp
|
||||
from MDSplus import (Tree,
|
||||
Signal,
|
||||
makeArray,
|
||||
Float64,
|
||||
Float32Array,
|
||||
Range)
|
||||
from MDSplus import mdsExceptions
|
||||
|
||||
MDSTREENAME = 'isttoksdas'
|
||||
|
||||
SEGMENT_SIZE = 100
|
||||
ISTTOK_RT_PERIOD = 0.0001
|
||||
|
||||
|
||||
def StartSdas():
|
||||
host = 'baco.ipfn.ist.utl.pt'
|
||||
port = 8888
|
||||
client = SDASClient(host, port)
|
||||
return client
|
||||
|
||||
|
||||
def LoadSdasData(client, channelID, shotnr):
|
||||
dataStruct = client.getData(channelID, '0x0000',
|
||||
shotnr)
|
||||
dataArray = dataStruct[0].getData()
|
||||
len_d = len(dataArray)
|
||||
tstart = dataStruct[0].getTStart()
|
||||
tend = dataStruct[0].getTEnd()
|
||||
period = (tend.getTimeInMicros() - tstart.getTimeInMicros())*1.0/len_d
|
||||
# print(f'Period: {period}')
|
||||
events = dataStruct[0].get('events')[0]
|
||||
tevent = TimeStamp(tstamp=events.get('tstamp'))
|
||||
# tstart_us = tstart.getTimeInMicros()
|
||||
tzero_us = tstart.getTimeInMicros() - tevent.getTimeInMicros()
|
||||
return dataArray, tzero_us, period
|
||||
# timeVector = np.linspace(delay, delay+period*(len_d-1), len_d)
|
||||
# return [dataArray, timeVector]
|
||||
|
||||
|
||||
def ForceSegment(nd, start, period, data):
|
||||
end = start + (SEGMENT_SIZE - 1) * period
|
||||
dimension = Range(Float64(start), Float64(end),
|
||||
Float64(period))
|
||||
nd.beginSegment(Float64(start), Float64(end),
|
||||
dimension, Float32Array(data))
|
||||
|
||||
|
||||
def plot_signals(pulse, nodeTable):
|
||||
try:
|
||||
tree = Tree(MDSTREENAME, pulse)
|
||||
except mdsExceptions.TreeNOPATH:
|
||||
print(f'Failed opening {MDSTREENAME}')
|
||||
except mdsExceptions.TreeFOPENR:
|
||||
print(f'Failed opening {MDSTREENAME} for pulse number {pulse:d}')
|
||||
exit()
|
||||
NoOfColors = len(nodeTable)
|
||||
cm = plt.get_cmap('jet')
|
||||
fig = plt.figure(figsize=(5, 7), tight_layout=True)
|
||||
ax = fig.add_subplot(111)
|
||||
ax.set_prop_cycle(color=[cm(1.*i/NoOfColors) for i in range(NoOfColors)])
|
||||
plt.title(f'#{pulse}: Mirnov coil signals')
|
||||
|
||||
for nd in nodeTable:
|
||||
nd_mds = tree.getNode(nd['mds'])
|
||||
mdsData = nd_mds.getData()
|
||||
signal = mdsData.data()
|
||||
if len(signal) > 0:
|
||||
times = mdsData.dims[0]
|
||||
plt.plot(times, signal, label=nd['name'])
|
||||
|
||||
plt.xlabel('Time / s ')
|
||||
plt.legend()
|
||||
plt.grid(True)
|
||||
plt.show()
|
||||
|
||||
|
||||
def mds_writer(pulse, import_table):
|
||||
try:
|
||||
tree = Tree(MDSTREENAME, pulse)
|
||||
except mdsExceptions.TreeNOPATH:
|
||||
print(f'Failed opening {MDSTREENAME}')
|
||||
except mdsExceptions.TreeFOPENR:
|
||||
print(f'Failed opening {MDSTREENAME} for pulse number {pulse:d}.'
|
||||
' Trying to create')
|
||||
# print(f'Failed opening {MDSTREENAME}')
|
||||
# exit()
|
||||
try:
|
||||
# tree.open(shot=pulse)
|
||||
tree = Tree(MDSTREENAME, -1)
|
||||
# Tree.setCurrent(MDSTREENAME, pulse)
|
||||
tree.createPulse(pulse)
|
||||
tree.close()
|
||||
tree = Tree(MDSTREENAME, pulse)
|
||||
except mdsExceptions.TreeFOPENR:
|
||||
print(f'Failed create pulse {MDSTREENAME}')
|
||||
exit()
|
||||
|
||||
client = StartSdas()
|
||||
for nd in import_table:
|
||||
print(nd['sdas'])
|
||||
print(nd['mds'])
|
||||
nd_mds = tree.getNode(nd['mds'])
|
||||
data, tzero_us, period = LoadSdasData(client,
|
||||
nd['sdas'], pulse)
|
||||
# print(tzero_us)
|
||||
# Period = period * 1e-6
|
||||
Period = ISTTOK_RT_PERIOD
|
||||
print(f"period: {Period}")
|
||||
Start = tzero_us * 1e-6 # in us
|
||||
count = 0
|
||||
segData = np.zeros(SEGMENT_SIZE, dtype=np.float32)
|
||||
for dt in data:
|
||||
segData[count] = dt
|
||||
count += 1
|
||||
if (count >= SEGMENT_SIZE):
|
||||
ForceSegment(nd_mds, Start, Period, segData)
|
||||
Start += SEGMENT_SIZE * Period
|
||||
count = 0
|
||||
|
||||
|
||||
if (__name__ == "__main__"):
|
||||
table = [{'sdas': 'MARTE_NODE_IVO3.DataCollection.Channel_166', 'mds': '\\TOP.HARDWARE.ATCA1.IOC1.CHANNELS.INPUT_00.RAW', 'name': 'Mirnov coil no. 1'},
|
||||
{'sdas': 'MARTE_NODE_IVO3.DataCollection.Channel_167', 'mds': '\\TOP.HARDWARE.ATCA1.IOC1.CHANNELS.INPUT_01.RAW', 'name': 'Mirnov coil no. 2'},
|
||||
{'sdas': 'MARTE_NODE_IVO3.DataCollection.Channel_168', 'mds': '\\TOP.HARDWARE.ATCA1.IOC1.CHANNELS.INPUT_02.RAW', 'name': 'Mirnov coil no. 3'},
|
||||
{'sdas': 'MARTE_NODE_IVO3.DataCollection.Channel_169', 'mds': '\\TOP.HARDWARE.ATCA1.IOC1.CHANNELS.INPUT_03.RAW', 'name': 'Mirnov coil no. 4'},
|
||||
{'sdas': 'MARTE_NODE_IVO3.DataCollection.Channel_170', 'mds': '\\TOP.HARDWARE.ATCA1.IOC1.CHANNELS.INPUT_04.RAW', 'name': 'Mirnov coil no. 5'},
|
||||
{'sdas': 'MARTE_NODE_IVO3.DataCollection.Channel_171', 'mds': '\\TOP.HARDWARE.ATCA1.IOC1.CHANNELS.INPUT_05.RAW', 'name': 'Mirnov coil no. 6'}]
|
||||
# mds_writer(100, table)
|
||||
plot_signals(46241, table)
|
||||
67
Analysis/MdsImportSdas_Mag.py
Normal file
67
Analysis/MdsImportSdas_Mag.py
Normal file
@@ -0,0 +1,67 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Python3 App to Import Magnetic data from ISTTOK SDAS to MDSPlus
|
||||
author: B. Carvalho / IPFN-IST
|
||||
email: bernardo.carvalho@tecnico.ulisboa.pt
|
||||
|
||||
Install sdas:
|
||||
http://metis.ipfn.tecnico.ulisboa.pt/CODAC/IPFN_Software/SDAS/Access/Python
|
||||
"""
|
||||
|
||||
import argparse
|
||||
# import numpy as np
|
||||
|
||||
from MdsImportSdas import mds_writer, plot_signals
|
||||
|
||||
mdsTreeName = 'isttoksdas'
|
||||
|
||||
|
||||
MDS_NODEFMT = "\\TOP.HARDWARE.ATCA1.IOC1.CHANNELS.INPUT_{}.RAW"
|
||||
SDAS_NODEFMT = 'MARTE_NODE_IVO3.DataCollection.Channel_{}'
|
||||
|
||||
NUM_PROBES = 12
|
||||
|
||||
|
||||
def build_import_table():
|
||||
table = []
|
||||
for n in range(NUM_PROBES):
|
||||
sdas_str = SDAS_NODEFMT.format(str(166 + n).zfill(3))
|
||||
mds_str = MDS_NODEFMT.format(str(n).zfill(2))
|
||||
# print(sdas_str)
|
||||
nd = {'sdas': sdas_str, 'mds': mds_str,
|
||||
'name': f'Mirnov coil no. {n+1}'}
|
||||
table.append(nd)
|
||||
return table
|
||||
|
||||
|
||||
def get_arguments():
|
||||
parser = argparse.ArgumentParser(description='Mirnov coils')
|
||||
parser.add_argument('-p', '--pulse',
|
||||
help='pulse (shot) number', default='46241', type=int)
|
||||
#parser.add_argument('-s', '--shot',
|
||||
# type=int, help='Mds+ pulse Number ([1, ...])',
|
||||
# default=100)
|
||||
parser.add_argument('-t', '--ploT',
|
||||
action='store_true', help='Plot Signals')
|
||||
parser.add_argument('-n', '--names',
|
||||
action='store_true', help='Print Node Table')
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
if (__name__ == "__main__"):
|
||||
args = get_arguments()
|
||||
pulseNo = args.pulse
|
||||
# mdsPulseNumber = args.shotpulseNo
|
||||
nodeTable = build_import_table()
|
||||
if args.names:
|
||||
print('Probe \t SDAS \t MDS+')
|
||||
for nd in nodeTable:
|
||||
print(nd['name'])
|
||||
print(f"\t {nd['sdas']}")
|
||||
print(f"\t {nd['mds']}")
|
||||
|
||||
if args.ploT:
|
||||
plot_signals(pulseNo, nodeTable)
|
||||
else:
|
||||
mds_writer(pulseNo, nodeTable)
|
||||
Reference in New Issue
Block a user