From 0b467822165fc914ed668a2394be8be56092f89f Mon Sep 17 00:00:00 2001 From: Bernardo Carvalho Date: Tue, 20 May 2025 17:35:15 +0100 Subject: [PATCH] Added MDS class Signed-off-by: Bernardo Carvalho --- Analysis/ClientMdsThin.py | 139 ++++++++++++++++++++++++++++++++++ Analysis/pyqtPlotMdsClient.py | 31 +++++--- Trees/CreateIsttokMARTe.tcl | 56 +++++++------- 3 files changed, 186 insertions(+), 40 deletions(-) create mode 100644 Analysis/ClientMdsThin.py diff --git a/Analysis/ClientMdsThin.py b/Analysis/ClientMdsThin.py new file mode 100644 index 0000000..a2c9cc0 --- /dev/null +++ b/Analysis/ClientMdsThin.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python3 +""" +This script get data from the MARTe2 ATCAIop stored in MDSplus +""" +import numpy as np +from mdsClient import mdsClient +from mdsthin.exceptions import TreeNNF, TreeFOPENR +import argparse + +ADC_CHANNELS = 14 # channels stored in ISTTOK MDSplus trees +ADC_DECIM_RATE = 200 # FPGA decimation + +MDSTREENAME = 'isttokmarte' + +MDSPLUS_HOST = "192.168.1.173" +# ADC_CHANNELS = 12 # channels stored in ISTTOK MDS +ADC_RAW = '\\TOP.HARDWARE.ATCA_2.IOP_9.CHANNEL_{}.ADC_DECIM' +ADC_RAW_D = '\\TOP.HARDWARE.ATCA_2.IOP_9.CHANNEL_{}.ADC_DECIM_D' + +ADC_INTEG = '\\TOP.HARDWARE.ATCA_2.IOP_9.CHANNEL_{}.ADC_INTEG' +SIG_INTEG = "\\TOP.DIAGNOSTICS.MAGNETICS.MIRNOV:PROBE{}.SIG" +ADC_INTEG_D = "\\TOP.HARDWARE.ATCA_2.IOP_9.CHANNEL_{}.ADC_INTEG_D" + + +class ClientMdsThin(): + + """ + Models an MDS Thin Client connection to ISTTOK ATCA2 server + """ + + def __init__(self, shot=52737, num_channels=12): + """ + Initializes the connection to the High-Precision-AD-HAT + """ + try: + self.client = mdsClient(MDSPLUS_HOST, user='oper') + self.client.openTree(MDSTREENAME, shot) + except TreeFOPENR: + print(f"Tree {MDSTREENAME} / Shot {shot} Not found") + raise ValueError + + self.adcRawData = [] + self.adcIntegData = [] + + def getData(self): + self.adcRawData = [] + self.adcIntegData = [] + for i in range(ADC_CHANNELS): + data = self.client.getData(ADC_RAW.format(i)) + self.adcRawData.append(data[:, 0]) + data = self.client.getData(ADC_INTEG.format(i)) + self.adcIntegData.append(data[:, 0]) + + def calcEoWo(self): + if not self.adcRawData: + raise ValueError + totalSamples = ADC_DECIM_RATE * len(self.adcRawData[0]) + print(f"Samples {totalSamples:d}, time {totalSamples/2e3:.3f} ms") + Eoffset = np.zeros(ADC_CHANNELS, dtype=int) + Woffset = np.zeros(ADC_CHANNELS) + for i in range(ADC_CHANNELS): + Eoffset[i] = np.mean(self.adcRawData[i]).astype(int) + intData = self.adcIntegData[i] + Woffset[i] = (intData[-1] - intData[0]) / totalSamples + return Eoffset, Woffset + + + +if __name__ == '__main__': + parser = argparse.ArgumentParser( + description='Script to get data from remote MDS server') + + # parser.add_argument('-l','--list', nargs='+', help=' Set flag', required=True) + # parser.add_argument('-l','--list', nargs='+') + parser.add_argument('-c', '--crange', nargs='+', + type=int, help='Channel plots (1 12)', default=[1, 12]) + parser.add_argument('-i', '--irange', nargs='+', + type=int, default=[1, 12]) + parser.add_argument('-s', '--shot', + type=int, help='Mds+ pulse Number ([1, ...])', + default=52737) + # parser.add_argument('-e', '--averages', action='store_true', help='Calc averages') +# parser.add_argument('-w', '--drift', action='store_true', help='Calc drifts') + + args = parser.parse_args() + clt = ClientMdsThin(shot=args.shot, num_channels=12) + #clt.getData() + # main(args) + + +# vim: set syntax=python ts=4 sw=4 sts=4 sr et +""" +def main(args): + mdsPulseNumber = args.shot + + try: + if (mdsPulseNumber > 0): + tree = Tree(MDSTREENAME, mdsPulseNumber) + else: + tree = Tree(MDSTREENAME) + mdsPulseNumber = tree.getCurrent() + tree.close() + tree = Tree(MDSTREENAME, mdsPulseNumber) + except Exception: + print(f'Failed opening {MDSTREENAME} for pulse number ' + + f'{mdsPulseNumber:d}') + exit() + + print(f'Opening {MDSTREENAME} for pulse number {mdsPulseNumber:d}') +# add plt.addLegend() BEFORE you create the curves. +# mdsNode = tree.getNode("ATCAIOP1.ADC0RAW") +# dataAdc = mdsNode.getData().data() +# timeData = mdsNode.getDimensionAt(0).data() + # start = args.crange[0] - 1 + # top = args.crange[1] +# for i in range(args.crange[0], args.crange[1]): + meanD = np.zeros(ADC_CHANNELS, dtype=int) + driftW = np.zeros(ADC_CHANNELS) + total_samples = 0 + for i in range(ADC_CHANNELS): + mdsNode = tree.getNode(f"ATCAIOP1.ADC{i}RAW") + dataAdc = mdsNode.getData().data() + meanD[i] = np.mean(dataAdc[:, 0]).astype(int) + mdsNode = tree.getNode(f"ATCAIOP1.ADC{i}INT") + dataAdcInt = mdsNode.getData().data() + total_samples = DECIM_RATE * len(dataAdcInt[:, 0]) + driftW[i] = (dataAdcInt[-1, 0] - dataAdcInt[0, 0]) / total_samples + + # if(args.averages): + print(f"EO: {ADC_CHANNELS} ", end='') + for i in range(ADC_CHANNELS): + print(f"{meanD[i]:d} ", end='') + print(" ") + print(f"WO: {ADC_CHANNELS} ", end='') + for i in range(ADC_CHANNELS): + print(f"{driftW[i]:0.3f} ", end='') + print(" ") + print(f"Samples {total_samples}, time {total_samples/2e3:.2f} ms") +""" diff --git a/Analysis/pyqtPlotMdsClient.py b/Analysis/pyqtPlotMdsClient.py index 8470007..3c69bed 100644 --- a/Analysis/pyqtPlotMdsClient.py +++ b/Analysis/pyqtPlotMdsClient.py @@ -15,6 +15,8 @@ from mdsClient import mdsClient from mdsthin.exceptions import TreeNNF import argparse +from ClientMdsThin import ClientMdsThin as Mclient + app = pg.mkQApp("Plotting MARTe2 AtcaIop Data") # mw = QtWidgets.QMainWindow() # mw.resize(800,800) @@ -57,6 +59,9 @@ parser.add_argument('-z', '--zero', action='store_true', args = parser.parse_args() mdsPulseNumber = args.shot +mclient = Mclient(shot=args.shot) +mclient.getData() + # mdsTreeName = 'rtappisttok' mdsTreeName = 'isttokmarte' @@ -82,25 +87,20 @@ start = args.crange[0] - 1 stop = args.crange[1] # for i in range(args.crange[0], args.crange[1]): meanD = np.zeros(ADC_CHANNELS, dtype=int) -driftW = np.zeros(ADC_CHANNELS) -total_samples = 0 -for i in range(ADC_CHANNELS): - dataAdc = client.getData(ADC_RAW.format(i)) - meanD[i] = np.mean(dataAdc[:, 0]).astype(int) - dataAdcInt = client.getData(ADC_INTEG.format(i)) - total_samples = ADC_DECIM_RATE * len(dataAdcInt[:, 0]) - driftW[i] = (dataAdcInt[-1, 0] - dataAdcInt[0, 0]) / total_samples +# driftW = np.zeros(ADC_CHANNELS) if (args.averages): + Eoffset, Woffset = mclient.calcEoWo() + nChannels = len(mclient.adcRawData) print(f"EO: {ADC_CHANNELS} ", end='') - for i in range(ADC_CHANNELS): - print(f"{meanD[i]:d} ", end='') + for i in range(nChannels): + print(f"{Eoffset[i]:d} ", end='') print(" ") print(f"WO: {ADC_CHANNELS} ", end='') for i in range(ADC_CHANNELS): - print(f"{driftW[i]:0.3f} ", end='') + print(f"{Woffset[i]:0.3f} ", end='') print(" ") - print(f"Samples {total_samples}, time {total_samples/2e3:.3f} ms") + # print(f"Samples {total_samples}, time {total_samples/2e3:.3f} ms") for i in range(start, stop): @@ -168,6 +168,13 @@ if __name__ == '__main__': # vim: syntax=python ts=4 sw=4 sts=4 sr et """ +total_samples = 0 +for i in range(ADC_CHANNELS): + dataAdc = client.getData(ADC_RAW.format(i)) + meanD[i] = np.mean(dataAdc[:, 0]).astype(int) + dataAdcInt = client.getData(ADC_INTEG.format(i)) + total_samples = ADC_DECIM_RATE * len(dataAdcInt[:, 0]) + # driftW[i] = (dataAdcInt[-1, 0] - dataAdcInt[0, 0]) / total_samples def getMdsData(tree, node): try: mdsNode = tree.getNode(node) diff --git a/Trees/CreateIsttokMARTe.tcl b/Trees/CreateIsttokMARTe.tcl index 9b529cd..5b5128d 100644 --- a/Trees/CreateIsttokMARTe.tcl +++ b/Trees/CreateIsttokMARTe.tcl @@ -27,55 +27,55 @@ add node IOP_9/model=ATCA_IOP set def \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9" put RT_DECIM "200" put SLOT "9" -set def \isttokmarte::top.hardware.atca_2.iop_9.channel_0 +set def \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.CHANNEL_0 # calibration on 14/05/2025 put gain "1.73887463e-05" -put inp_decim "gain * adc_decim" -put inp_integ "gain * adc_integ / \isttokmarte::top.hardware.atca_2.iop_9.rt_decim / \isttokmarte::top.hardware.atca_2.iop_9.clock_freq" -set def \isttokmarte::top.hardware.atca_2.iop_9.channel_1 +put inp_decim "GAIN * ADC_DECIM" +put inp_integ "GAIN * ADC_INTEG / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.RT_DECIM / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.CLOCK_FREQ" +set def \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.CHANNEL_1 put gain "1.73937683e-05" -put inp_decim "gain * adc_decim" -put inp_integ "gain * adc_integ / \isttokmarte::top.hardware.atca_2.iop_9.rt_decim / \isttokmarte::top.hardware.atca_2.iop_9.clock_freq" -set def \isttokmarte::top.hardware.atca_2.iop_9.channel_2 +put inp_decim "GAIN * ADC_DECIM" +put inp_integ "GAIN * ADC_INTEG / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.RT_DECIM / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.CLOCK_FREQ" +set def \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.CHANNEL_2 put gain "1.74275762e-05" -put inp_decim "gain * adc_decim" -put inp_integ "gain * adc_integ / \isttokmarte::top.hardware.atca_2.iop_9.rt_decim / \isttokmarte::top.hardware.atca_2.iop_9.clock_freq" -set def \isttokmarte::top.hardware.atca_2.iop_9.channel_3 +put inp_decim "GAIN * ADC_DECIM" +put inp_integ "GAIN * ADC_INTEG / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.RT_DECIM / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.CLOCK_FREQ" +set def \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.CHANNEL_3 put gain "1.74994244e-05" -put inp_decim "gain * adc_decim" -put inp_integ "gain * adc_integ / \isttokmarte::top.hardware.atca_2.iop_9.rt_decim / \isttokmarte::top.hardware.atca_2.iop_9.clock_freq" +put inp_decim "GAIN * ADC_DECIM" +put inp_integ "GAIN * ADC_INTEG / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.RT_DECIM / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.CLOCK_FREQ" set def \isttokmarte::top.hardware.atca_2.iop_9.channel_4 put gain "1.73826859e-05" -put inp_decim "gain * adc_decim" -put inp_integ "gain * adc_integ / \isttokmarte::top.hardware.atca_2.iop_9.rt_decim / \isttokmarte::top.hardware.atca_2.iop_9.clock_freq" +put inp_decim "GAIN * ADC_DECIM" +put inp_integ "GAIN * ADC_INTEG / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.RT_DECIM / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.CLOCK_FREQ" set def \isttokmarte::top.hardware.atca_2.iop_9.channel_5 put gain "1.74439575e-05" -put inp_decim "gain * adc_decim" -put inp_integ "gain * adc_integ / \isttokmarte::top.hardware.atca_2.iop_9.rt_decim / \isttokmarte::top.hardware.atca_2.iop_9.clock_freq" +put inp_decim "GAIN * ADC_DECIM" +put inp_integ "GAIN * ADC_INTEG / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.RT_DECIM / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.CLOCK_FREQ" set def \isttokmarte::top.hardware.atca_2.iop_9.channel_6 put gain "1.74532093e-05" -put inp_decim "gain * adc_decim" -put inp_integ "gain * adc_integ / \isttokmarte::top.hardware.atca_2.iop_9.rt_decim / \isttokmarte::top.hardware.atca_2.iop_9.clock_freq" +put inp_decim "GAIN * ADC_DECIM" +put inp_integ "GAIN * ADC_INTEG / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.RT_DECIM / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.CLOCK_FREQ" set def \isttokmarte::top.hardware.atca_2.iop_9.channel_7 put gain "1.73723740e-05" -put inp_decim "gain * adc_decim" -put inp_integ "gain * adc_integ / \isttokmarte::top.hardware.atca_2.iop_9.rt_decim / \isttokmarte::top.hardware.atca_2.iop_9.clock_freq" +put inp_decim "GAIN * ADC_DECIM" +put inp_integ "GAIN * ADC_INTEG / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.RT_DECIM / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.CLOCK_FREQ" set def \isttokmarte::top.hardware.atca_2.iop_9.channel_8 put gain "1.71925327e-05" -put inp_decim "gain * adc_decim" -put inp_integ "gain * adc_integ / \isttokmarte::top.hardware.atca_2.iop_9.rt_decim / \isttokmarte::top.hardware.atca_2.iop_9.clock_freq" +put inp_decim "GAIN * ADC_DECIM" +put inp_integ "GAIN * ADC_INTEG / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.RT_DECIM / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.CLOCK_FREQ" set def \isttokmarte::top.hardware.atca_2.iop_9.channel_9 put gain "1.72739424e-05" -put inp_decim "gain * adc_decim" -put inp_integ "gain * adc_integ / \isttokmarte::top.hardware.atca_2.iop_9.rt_decim / \isttokmarte::top.hardware.atca_2.iop_9.clock_freq" +put inp_decim "GAIN * ADC_DECIM" +put inp_integ "GAIN * ADC_INTEG / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.RT_DECIM / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.CLOCK_FREQ" set def \isttokmarte::top.hardware.atca_2.iop_9.channel_10 put gain "1.73809822e-05" -put inp_decim "gain * adc_decim" -put inp_integ "gain * adc_integ / \isttokmarte::top.hardware.atca_2.iop_9.rt_decim / \isttokmarte::top.hardware.atca_2.iop_9.clock_freq" +put inp_decim "GAIN * ADC_DECIM" +put inp_integ "GAIN * ADC_INTEG / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.RT_DECIM / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.CLOCK_FREQ" set def \isttokmarte::top.hardware.atca_2.iop_9.channel_11 put gain "1.74412886e-05" -put inp_decim "gain * adc_decim" -put inp_integ "gain * adc_integ / \isttokmarte::top.hardware.atca_2.iop_9.rt_decim / \isttokmarte::top.hardware.atca_2.iop_9.clock_freq" +put inp_decim "GAIN * ADC_DECIM" +put inp_integ "GAIN * ADC_INTEG / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.RT_DECIM / \ISTTOKMARTE::TOP.HARDWARE.ATCA_2.IOP_9.CLOCK_FREQ" #set def \ISTTOKMARTE::TOP.INP #add node MEAS0/usage=signal