From 5dfe929da5c9294afb58b6df67232e86a41e2c67 Mon Sep 17 00:00:00 2001 From: Last Davis Vern Date: Wed, 9 Jul 2025 13:02:24 +0200 Subject: [PATCH] Updates to OTF, and added RP100 strain cell power supply, as well as a couple network analysers. Results from the mRS network analyser are questionable at best, and nonsense at worst. Beware. --- cfg/network_analyser_cfg.py | 5 + cfg/psi_nmr_setup_cfg.py | 17 + cfg/razorbill_rp100_cfg.py | 12 + frappy_psi/network_analysers/ZVL/ZVLDriver.py | 195 +++++++ frappy_psi/network_analysers/ZVL/ZVLNode.py | 59 ++ frappy_psi/network_analysers/ZVL/__init__.py | 0 .../network_analysers/mRS/calibration.py | 21 + frappy_psi/network_analysers/mRS/load.txt | 512 ++++++++++++++++++ .../mRS/miniVNAPRO2Driver.py | 209 +++++++ frappy_psi/network_analysers/mRS/open.txt | 512 ++++++++++++++++++ frappy_psi/network_analysers/mRS/short.txt | 512 ++++++++++++++++++ frappy_psi/tnmr/OTFModule.py | 16 +- frappy_psi/uniaxial_cell/RP100.py | 132 +++++ frappy_psi/uniaxial_cell/psi_PSU_RP100.py | 183 +++++++ frappy_psi/uniaxial_cell/psi_serial.py | 117 ++++ 15 files changed, 2494 insertions(+), 8 deletions(-) create mode 100644 cfg/network_analyser_cfg.py create mode 100644 cfg/psi_nmr_setup_cfg.py create mode 100644 cfg/razorbill_rp100_cfg.py create mode 100644 frappy_psi/network_analysers/ZVL/ZVLDriver.py create mode 100644 frappy_psi/network_analysers/ZVL/ZVLNode.py create mode 100644 frappy_psi/network_analysers/ZVL/__init__.py create mode 100644 frappy_psi/network_analysers/mRS/calibration.py create mode 100644 frappy_psi/network_analysers/mRS/load.txt create mode 100644 frappy_psi/network_analysers/mRS/miniVNAPRO2Driver.py create mode 100644 frappy_psi/network_analysers/mRS/open.txt create mode 100644 frappy_psi/network_analysers/mRS/short.txt create mode 100644 frappy_psi/uniaxial_cell/RP100.py create mode 100644 frappy_psi/uniaxial_cell/psi_PSU_RP100.py create mode 100644 frappy_psi/uniaxial_cell/psi_serial.py diff --git a/cfg/network_analyser_cfg.py b/cfg/network_analyser_cfg.py new file mode 100644 index 00000000..44c627fc --- /dev/null +++ b/cfg/network_analyser_cfg.py @@ -0,0 +1,5 @@ +import frappy.core as fc + +Node('example_NA.psi.ch', 'A demo system showing how to connect network analysers', interface='tcp://5000') + +Mod('ZVLNode', 'frappy_psi.network_analysers.ZVL.ZVLNode.ZVLNode', 'ZVL Network Analyser', analyser_ip=Param('169.254.150.182')) # must be connected on the same ethernet network \ No newline at end of file diff --git a/cfg/psi_nmr_setup_cfg.py b/cfg/psi_nmr_setup_cfg.py new file mode 100644 index 00000000..f9b21a9c --- /dev/null +++ b/cfg/psi_nmr_setup_cfg.py @@ -0,0 +1,17 @@ +import frappy.core as fc + +Node('uniaxial_nmr.psi.ch', 'The NMR system running the Scout and controlled with TNMR. Also contains a uniaxial cell (Razorbill RP100), and a network analyser (ZVL)', interface='tcp://5000') + +# TNMR +Mod('tnmr_otf_module', 'frappy_psi.tnmr.OTFModule.ProgrammedSequence', 'NMR Sequence') + +# Razorbill RP100 +Mod('io1', + 'frappy_psi.uniaxial_cell.RP100.RP100IO', + 'communication', + uri='serial://COM10?baudrate=9600+bytesize=8+parity=none+stopbits=1') +Mod('RP100Node_CH1', 'frappy_psi.uniaxial_cell.RP100.VoltageChannel', 'Razorbill RP100 PSU (CH1)', channel=1, io='io1') +Mod('RP100Node_CH2', 'frappy_psi.uniaxial_cell.RP100.VoltageChannel', 'Razorbill RP100 PSU (CH2)', channel=2, io='io1') + +# ZVL Network Analyser +#Mod('ZVLNode', 'frappy_psi.network_analysers.ZVL.ZVLNode.ZVLNode', 'ZVL Network Analyser', analyser_ip=Param('169.254.150.182')) # must be connected on the same ethernet network \ No newline at end of file diff --git a/cfg/razorbill_rp100_cfg.py b/cfg/razorbill_rp100_cfg.py new file mode 100644 index 00000000..4715a22f --- /dev/null +++ b/cfg/razorbill_rp100_cfg.py @@ -0,0 +1,12 @@ +import frappy.core as fc +import serial + +Node('example_RP100.psi.ch', 'A demo system showing how to connect the Razorbill PSU', interface='tcp://5000') + +Mod('io1', + 'frappy_psi.uniaxial_cell.RP100.RP100IO', + 'communication', + uri='serial://COM10?baudrate=9600+bytesize=8+parity=none+stopbits=1') + +Mod('RP100Node_CH1', 'frappy_psi.uniaxial_cell.RP100.VoltageChannel', 'Razorbill RP100 PSU (CH1)', channel=1, io='io1') +Mod('RP100Node_CH2', 'frappy_psi.uniaxial_cell.RP100.VoltageChannel', 'Razorbill RP100 PSU (CH2)', channel=2, io='io1') \ No newline at end of file diff --git a/frappy_psi/network_analysers/ZVL/ZVLDriver.py b/frappy_psi/network_analysers/ZVL/ZVLDriver.py new file mode 100644 index 00000000..4cfc5aa3 --- /dev/null +++ b/frappy_psi/network_analysers/ZVL/ZVLDriver.py @@ -0,0 +1,195 @@ +# NWA Mode +# INST:SEL NWA|SAN"... + +#NEED to enable LXI on net analyzer. DHCP needs to be on + + +import vxi11 +import numpy as np + +import traceback +import time + +class ZVLNetAnalyzer(): + def __init__(self, ip=None): + if(ip is None or ip == ''): + if(len(vxi11.list_devices()) == 1): + ip = vxi11.list_devices()[0] + print('ZVL NA: Selecting ip='+ip) + else: + print('ZVL NA: Please provide an ip from the following:') + print(vxi11.list_devices()) + raise Exception + + self.instrument = vxi11.Instrument(ip) + self.instrument.open() + idn = self.instrument.ask('*IDN?') + print(f'Identity: {idn}') + self.reset() + + self.base_data = np.array([]) + self.base_data = self.get_data()[1] + + def reset(self): + self.instrument.write('*RST') + self.instrument.write('*CLS') + self.instrument.write('INST:NSEL 2') + self.instrument.write('DISPlay:WINDow1:STATe ON') + self.instrument.write(":CALC:PAR:MEAS 'Trc1', 'S11'") + self.instrument.write('CALC:FORM MLOG') + self.instrument.write('INIT:CONT OFF') + #self.instrument.write('INIT:SCOP OFF') + #self.instrument.write('DISPlay:WINDow2:STATe ON') + + def set_freq_range(self, start, stop): + '''In Hz''' + self.instrument.write(f'SENS1:FREQ:STAR {start}') + self.instrument.write(f'SENS1:FREQ:STOP {stop}') + + def set_freq_span(self, center, span): + '''In Hz''' + self.instrument.write(f'SENS1:FREQ:CENT {center}') + self.instrument.write(f'SENS1:FREQ:SPAN {span}') + + def set_averaging_passes(self,avgs): + ''' + Parameters + ''' + assert(avgs <= 1000) + assert(avgs >= 1) + + self.instrument.write('AVER:CLE') + self.instrument.write(f'AVER:COUN {avgs}') + self.instrument.write('AVER ON') + time.sleep(1) + + def clear(self): + self.instrument.write('AVER:CLE') + self.instrument.write('TRAC:CLE') + self.instrument.write('CLE') + + def format_data(self, returned_from_device, complex=True): + d = returned_from_device.split(',') + if(complex): + d = [ float(r) + 1j*float(i) for r, i in zip(d[::2], d[1::2]) ] + else: + d = [ float(i) for i in d ] + return np.array(d) + + def get_data(self, N=1000, units='dB', averaging_passes=1): + '''Returns the frequencies, in Hz, and the magnitudes of S11, in units (see `units` parameter). Note: Testing shows that acquisition time is approx. 0.7ms (mostly linear) per datapoint. Max 1000*averaging_passes datapoints (700ms per averaging pass, really). + + Valid units are: + dB: deciBels (power) + unitless: simply magnitudes of S11 + + Parameters + N: int, between 2 and 1000 inc., the number of points to be returned. (default 1000) + units: str, see above. Units/format of returned data. + averaging_passes: int, describes the number of scans that will be taken and averaged. values can be from 1-999 inclusive (default 1) + ''' + + assert(N>=2) + assert(N<=1000) + assert(averaging_passes>=1) + assert(averaging_passes<=999) + assert(units in ['dB', 'unitless']) + + self.instrument.write(f'SWE:POIN {N}') + self.instrument.write(f'SWE:COUN {averaging_passes}') + + if(N != self.base_data.shape[0]): + data = np.zeros(N, dtype=np.complex128) + else: + data = np.copy(self.base_data) + freqs = np.zeros_like(data) + self.instrument.write('INIT') + while(np.sum(data) == np.sum(self.base_data) or np.all(data == 0)): + total_data = np.zeros_like(data, dtype=np.complex128) + for i in range(1, averaging_passes+1): + data = self.instrument.ask(f'CALC:DATA:NSW? SDAT, {i}') + freqs = self.instrument.ask('CALC:DATA:STIM?') + + data = self.format_data(data) + freqs = self.format_data(freqs, complex=False) + total_data += data + total_data /= averaging_passes + + self.base_data = data + + if(units == 'dB'): + # |total_data| is amplitudes. dB should be in terms of power + total_data = np.log10(np.square(np.abs(total_data)))*10.0 + elif(units == 'unitless'): + total_data = np.abs(total_data) + + return freqs, total_data + + def find_peak(self, range_start=None, range_end=None, scan_width=100_000): + if(range_start is None): + range_start = 9_000 + if(range_end is None): + range_end = 13_600_000_000 + + min_mag = 0 + min_mag_index = 0 + + N=1000 + num_scans = (range_end - range_start)//scan_width + 1 + full_record = np.zeros(N*num_scans) + full_record_fq = np.zeros(N*num_scans) + + i = 1 + s = range_start + e = s + scan_width + while(i <= num_scans): + s = range_start + i*scan_width + e = s + scan_width + self.set_freq_range(s, e) + freqs, data = self.get_data() + mn = np.min(data) + if(mn < min_mag): + min_mag = mn + min_mag_index = np.argmin(data) + (i-1)*N + full_record[(i-1)*N:i*N] = data + full_record_fq[(i-1)*N:i*N] = freqs + i += 1 + + return min_mag, min_mag_index, full_record, full_record_fq + +# example code. profiles the per-point delay for reading data and +#ip = '169.254.150.182' +#import matplotlib.pyplot as plt +#print('start') +#z = ZVLNetAnalyzer(ip) + +#mm, mmi, fr, frq = z.find_peak(50_000_000, 350_000_000, 20_000_000) +#plt.plot(frq, fr) +#plt.axvline(frq[mmi]) +#plt.axhline(mm) +#plt.show() + +#z.reset() +##z.set_freq_range(1_000_000, 2_000_000.5) +##z.set_freq_span(1_000_000, 10_000) +#z.set_freq_span(220_000_000, 50_000_000) + +#Ns = np.linspace(3, 1000, 100).astype(int) +#ts = [] +#for N in Ns: +# st = time.time() +# freqs, data = z.get_data(N) +# et = time.time() +# dt = (et-st) +# print(f'got data, {dt/N} ({dt})') +# ts += [dt] +# +#plt.scatter(Ns, ts) +#plt.show() +#plt.scatter(Ns, np.array(ts)/np.array(Ns)) +#plt.show() + +#input() +#plt.plot(*z.get_data(averaging_passes=1), alpha=0.3) +#plt.plot(*z.get_data(averaging_passes=64), alpha=0.3) +#plt.show() \ No newline at end of file diff --git a/frappy_psi/network_analysers/ZVL/ZVLNode.py b/frappy_psi/network_analysers/ZVL/ZVLNode.py new file mode 100644 index 00000000..699b4edf --- /dev/null +++ b/frappy_psi/network_analysers/ZVL/ZVLNode.py @@ -0,0 +1,59 @@ + +import frappy.core as fc +import frappy + +from frappy_psi.network_analysers.ZVL.ZVLDriver import ZVLNetAnalyzer + +class ZVLNode(fc.Readable): + """A ZVL Network Analyser. + + Use + --- + Set the center (target) and the analyser will be in a BUSY (3XX) state until the output is up to date (at that frequency). + + Attributes + ---------- + value: the magnitude (in dB) of the signal at the set frequency. + status: status tuple (see frappy docs) + pollinterval: see frappy docs + central_freq: the center frequency (in Hz) to be probing + freq_span: the frequency span (in Hz) to be probing + analyser_ip: the IP address of the network analyser. Best to set in the config! + """ + + value = fc.Parameter('value', fc.ArrayOf(fc.FloatRange(unit='dB'), minlen=1000, maxlen=1000), readonly=True) + status = fc.Parameter(datatype=frappy.datatypes.StatusType(fc.Readable, "DISABLED", 'PREPARED', 'BUSY'), default=('IDLE', 'idle')) + pollinterval = fc.Parameter(default=1) + central_freq = fc.Parameter('central_freq', fc.FloatRange(min=9_000, max=13_600_000_000, unit='Hz'), default=10_000_000, readonly=False) + freq_span = fc.Parameter('freq_span', fc.FloatRange(unit='Hz'), default=1_000_000, readonly=False) + + analyser_ip = fc.Parameter('analyser_ip', fc.StringType()) + + def initialReads(self): + self.connect() + + def connect(self): + self.NA = ZVLNetAnalyzer(self.analyser_ip) + self.NA.reset() + self.acq() + + def acq(self): + self.status = ('BUSY', 'acquiring') + self.NA.set_freq_span(self.central_freq, self.freq_span) + self.value = self.NA.get_data()[1] + self.status = ('IDLE', 'idle') + + def write_central_freq(self, f): + self.central_freq = (f) + self.acq() + return self.read_central_freq() + + def write_freq_span(self, f): + self.freq_span = f + self.acq() + return self.read_freq_span() + + def write_analyser_ip(self, ip): + self.analyser_ip = ip + self.connect() + return self.read_analyser_ip() \ No newline at end of file diff --git a/frappy_psi/network_analysers/ZVL/__init__.py b/frappy_psi/network_analysers/ZVL/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/frappy_psi/network_analysers/mRS/calibration.py b/frappy_psi/network_analysers/mRS/calibration.py new file mode 100644 index 00000000..3f3b2638 --- /dev/null +++ b/frappy_psi/network_analysers/mRS/calibration.py @@ -0,0 +1,21 @@ +import numpy as np +import matplotlib.pyplot as plt + +#https://k6jca.blogspot.com/2019/12/vna-notes-on-12-term-error-model-and.html + +Gm1 = np.loadtxt('short.txt', dtype=np.complex128) +Gm2 = np.loadtxt('load.txt', dtype=np.complex128) +Gm3 = np.loadtxt('open.txt', dtype=np.complex128) +G1 = -1 +G2 = 0.1 +G3 = +1 + +e00 = (G1*G2*Gm1*Gm3 - G1*G3*Gm1*Gm2 - G1*G2*Gm2*Gm3 + G2*G3*Gm1*Gm2 + G1*G3*Gm2*Gm3 - G2*G3*Gm1*Gm3)/(G1*G2*Gm1 - G1*G2*Gm2 - G1*G3*Gm1 + G1*G3*Gm3 + G2*G3*Gm2 - G2*G3*Gm3) +e11 = -(G1*Gm2 - G2*Gm1 - G1*Gm3 + G3*Gm1 + G2*Gm3 - G3*Gm2)/(G1*G2*Gm1 - G1*G2*Gm2 - G1*G3*Gm1 + G1*G3*Gm3 + G2*G3*Gm2 - G2*G3*Gm3) +d_e = -(G1*Gm1*Gm2 - G1*Gm1*Gm3 - G2*Gm1*Gm2 + G2*Gm2*Gm3 + G3*Gm1*Gm3 - G3*Gm2*Gm3)/(G1*G2*Gm1 - G1*G2*Gm2 - G1*G3*Gm1 + G1*G3*Gm3 + G2*G3*Gm2 - G2*G3*Gm3) + +plt.plot(e00) +plt.plot(e11) +plt.plot(d_e) +plt.show() + diff --git a/frappy_psi/network_analysers/mRS/load.txt b/frappy_psi/network_analysers/mRS/load.txt new file mode 100644 index 00000000..2c6cd233 --- /dev/null +++ b/frappy_psi/network_analysers/mRS/load.txt @@ -0,0 +1,512 @@ + (8.393220500000000000e+06+8.393549500000000000e+06j) + (8.393189000000000000e+06+8.393587000000000000e+06j) + (8.393040000000000000e+06+8.393432500000000000e+06j) + (8.393214000000000000e+06+8.393590000000000000e+06j) + (8.393271500000000000e+06+8.393523000000000000e+06j) + (8.393238000000000000e+06+8.393567000000000000e+06j) + (8.400645000000000000e+06+8.399830000000000000e+06j) + (8.398921000000000000e+06+8.399180500000000000e+06j) + (8.397804500000000000e+06+8.398085500000000000e+06j) + (8.397149000000000000e+06+8.397401000000000000e+06j) + (8.396773000000000000e+06+8.396955000000000000e+06j) + (8.396498500000000000e+06+8.396731000000000000e+06j) + (8.396285500000000000e+06+8.396640500000000000e+06j) + (8.396145000000000000e+06+8.396782000000000000e+06j) + (8.396369500000000000e+06+8.396647500000000000e+06j) + (8.396107000000000000e+06+8.396581000000000000e+06j) + (8.396232500000000000e+06+8.396340000000000000e+06j) + (8.396399000000000000e+06+8.396630500000000000e+06j) + (8.396388000000000000e+06+8.396476000000000000e+06j) + (8.396309500000000000e+06+8.396394500000000000e+06j) + (8.396322000000000000e+06+8.396740500000000000e+06j) + (8.396292500000000000e+06+8.396536000000000000e+06j) + (8.396286500000000000e+06+8.396494500000000000e+06j) + (8.396189500000000000e+06+8.396585000000000000e+06j) + (8.396350000000000000e+06+8.396549500000000000e+06j) + (8.396263500000000000e+06+8.396521000000000000e+06j) + (8.396117000000000000e+06+8.396540000000000000e+06j) + (8.396011000000000000e+06+8.396475500000000000e+06j) + (8.396178500000000000e+06+8.396269500000000000e+06j) + (8.396147000000000000e+06+8.396265000000000000e+06j) + (8.396261500000000000e+06+8.396286500000000000e+06j) + (8.396193500000000000e+06+8.396301000000000000e+06j) + (8.395957000000000000e+06+8.396229000000000000e+06j) + (8.396043000000000000e+06+8.396263500000000000e+06j) + (8.396185500000000000e+06+8.396339500000000000e+06j) + (8.396134000000000000e+06+8.396188000000000000e+06j) + (8.396083500000000000e+06+8.396051000000000000e+06j) + (8.395899500000000000e+06+8.396200000000000000e+06j) + (8.395915500000000000e+06+8.396227000000000000e+06j) + (8.395978500000000000e+06+8.396292500000000000e+06j) + (8.395986000000000000e+06+8.396219500000000000e+06j) + (8.395929000000000000e+06+8.395990500000000000e+06j) + (8.395517500000000000e+06+8.395998500000000000e+06j) + (8.395757000000000000e+06+8.396063500000000000e+06j) + (8.395824500000000000e+06+8.395926000000000000e+06j) + (8.395876000000000000e+06+8.395926500000000000e+06j) + (8.395732500000000000e+06+8.395793500000000000e+06j) + (8.395700500000000000e+06+8.395969500000000000e+06j) + (8.395727500000000000e+06+8.395932000000000000e+06j) + (8.395808500000000000e+06+8.396022500000000000e+06j) + (8.395839500000000000e+06+8.395907000000000000e+06j) + (8.395757500000000000e+06+8.396010500000000000e+06j) + (8.395437000000000000e+06+8.395753000000000000e+06j) + (8.395848500000000000e+06+8.395840000000000000e+06j) + (8.395310500000000000e+06+8.395874500000000000e+06j) + (8.395586500000000000e+06+8.395743000000000000e+06j) + (8.395663000000000000e+06+8.395992500000000000e+06j) + (8.395733500000000000e+06+8.395871000000000000e+06j) + (8.395469000000000000e+06+8.395900000000000000e+06j) + (8.395293500000000000e+06+8.395688500000000000e+06j) + (8.395394000000000000e+06+8.395639000000000000e+06j) + (8.395335000000000000e+06+8.395466000000000000e+06j) + (8.395461000000000000e+06+8.395491000000000000e+06j) + (8.395120500000000000e+06+8.395513500000000000e+06j) + (8.395450500000000000e+06+8.395676000000000000e+06j) + (8.395308000000000000e+06+8.395655000000000000e+06j) + (8.395498000000000000e+06+8.395471000000000000e+06j) + (8.395268000000000000e+06+8.395497500000000000e+06j) + (8.395185500000000000e+06+8.395477000000000000e+06j) + (8.395153500000000000e+06+8.395585500000000000e+06j) + (8.395021500000000000e+06+8.395461000000000000e+06j) + (8.395067500000000000e+06+8.395328500000000000e+06j) + (8.395035000000000000e+06+8.395425000000000000e+06j) + (8.395315500000000000e+06+8.395462000000000000e+06j) + (8.394988500000000000e+06+8.395341500000000000e+06j) + (8.395122000000000000e+06+8.395406500000000000e+06j) + (8.394902500000000000e+06+8.395337000000000000e+06j) + (8.395348000000000000e+06+8.395374000000000000e+06j) + (8.395168000000000000e+06+8.395550000000000000e+06j) + (8.395406000000000000e+06+8.395593500000000000e+06j) + (8.395208000000000000e+06+8.395653000000000000e+06j) + (8.395192500000000000e+06+8.395737000000000000e+06j) + (8.395329500000000000e+06+8.395401000000000000e+06j) + (8.395516500000000000e+06+8.395434500000000000e+06j) + (8.395260000000000000e+06+8.395414500000000000e+06j) + (8.395152500000000000e+06+8.395320500000000000e+06j) + (8.395135500000000000e+06+8.395309000000000000e+06j) + (8.394902000000000000e+06+8.395315500000000000e+06j) + (8.394994000000000000e+06+8.395074500000000000e+06j) + (8.394872000000000000e+06+8.395178000000000000e+06j) + (8.394916000000000000e+06+8.395150500000000000e+06j) + (8.394903000000000000e+06+8.395122000000000000e+06j) + (8.394895500000000000e+06+8.395216000000000000e+06j) + (8.395025500000000000e+06+8.395166000000000000e+06j) + (8.394869500000000000e+06+8.395093000000000000e+06j) + (8.394729000000000000e+06+8.395047000000000000e+06j) + (8.394785000000000000e+06+8.395067500000000000e+06j) + (8.394971000000000000e+06+8.394803000000000000e+06j) + (8.394901000000000000e+06+8.395190000000000000e+06j) + (8.394638500000000000e+06+8.394926000000000000e+06j) + (8.394663000000000000e+06+8.395015000000000000e+06j) + (8.394786500000000000e+06+8.394834500000000000e+06j) + (8.394675500000000000e+06+8.394942000000000000e+06j) + (8.394787000000000000e+06+8.394720500000000000e+06j) + (8.394701500000000000e+06+8.395125000000000000e+06j) + (8.394962500000000000e+06+8.394980500000000000e+06j) + (8.394939000000000000e+06+8.394876500000000000e+06j) + (8.394699500000000000e+06+8.394797000000000000e+06j) + (8.394653000000000000e+06+8.394781500000000000e+06j) + (8.394809000000000000e+06+8.395020000000000000e+06j) + (8.394730500000000000e+06+8.394820500000000000e+06j) + (8.394519500000000000e+06+8.394920500000000000e+06j) + (8.394705000000000000e+06+8.394998000000000000e+06j) + (8.394590500000000000e+06+8.394770500000000000e+06j) + (8.394372500000000000e+06+8.394742000000000000e+06j) + (8.394574500000000000e+06+8.394924000000000000e+06j) + (8.394496000000000000e+06+8.394772000000000000e+06j) + (8.394586000000000000e+06+8.394782500000000000e+06j) + (8.394519500000000000e+06+8.395182500000000000e+06j) + (8.394792000000000000e+06+8.394666000000000000e+06j) + (8.394858000000000000e+06+8.394707000000000000e+06j) + (8.394676500000000000e+06+8.394765500000000000e+06j) + (8.394458000000000000e+06+8.394703500000000000e+06j) + (8.394494000000000000e+06+8.394947000000000000e+06j) + (8.394451000000000000e+06+8.394779000000000000e+06j) + (8.394487500000000000e+06+8.394720500000000000e+06j) + (8.394562500000000000e+06+8.394595500000000000e+06j) + (8.394577500000000000e+06+8.394865000000000000e+06j) + (8.394308500000000000e+06+8.394839500000000000e+06j) + (8.394282500000000000e+06+8.394815000000000000e+06j) + (8.394375500000000000e+06+8.394659500000000000e+06j) + (8.394449500000000000e+06+8.394648000000000000e+06j) + (8.394444500000000000e+06+8.394695000000000000e+06j) + (8.394304000000000000e+06+8.394614000000000000e+06j) + (8.394444000000000000e+06+8.394796000000000000e+06j) + (8.394348000000000000e+06+8.394629500000000000e+06j) + (8.394446500000000000e+06+8.394709500000000000e+06j) + (8.394404500000000000e+06+8.394439000000000000e+06j) + (8.394328500000000000e+06+8.394348000000000000e+06j) + (8.394051500000000000e+06+8.394344000000000000e+06j) + (8.394423500000000000e+06+8.394395500000000000e+06j) + (8.394297000000000000e+06+8.394714000000000000e+06j) + (8.394248000000000000e+06+8.394522500000000000e+06j) + (8.394147000000000000e+06+8.394370000000000000e+06j) + (8.394082000000000000e+06+8.394331000000000000e+06j) + (8.394110000000000000e+06+8.394256500000000000e+06j) + (8.394289000000000000e+06+8.394290500000000000e+06j) + (8.394263500000000000e+06+8.394431500000000000e+06j) + (8.394253000000000000e+06+8.394323500000000000e+06j) + (8.394152000000000000e+06+8.394424500000000000e+06j) + (8.394121000000000000e+06+8.394424000000000000e+06j) + (8.394325000000000000e+06+8.394583000000000000e+06j) + (8.394062500000000000e+06+8.394416000000000000e+06j) + (8.393868500000000000e+06+8.394337000000000000e+06j) + (8.394012500000000000e+06+8.394163000000000000e+06j) + (8.394105000000000000e+06+8.394423000000000000e+06j) + (8.394327500000000000e+06+8.394118500000000000e+06j) + (8.394202500000000000e+06+8.394465500000000000e+06j) + (8.394065000000000000e+06+8.394405000000000000e+06j) + (8.394144000000000000e+06+8.394324000000000000e+06j) + (8.394312500000000000e+06+8.394176500000000000e+06j) + (8.394055500000000000e+06+8.394360500000000000e+06j) + (8.394112000000000000e+06+8.394395000000000000e+06j) + (8.394010500000000000e+06+8.394238500000000000e+06j) + (8.393976500000000000e+06+8.394354000000000000e+06j) + (8.394038500000000000e+06+8.394376000000000000e+06j) + (8.394011500000000000e+06+8.394384500000000000e+06j) + (8.394096500000000000e+06+8.394291500000000000e+06j) + (8.393938000000000000e+06+8.394355000000000000e+06j) + (8.394053000000000000e+06+8.394286000000000000e+06j) + (8.393929000000000000e+06+8.394238000000000000e+06j) + (8.394086500000000000e+06+8.394255000000000000e+06j) + (8.394042000000000000e+06+8.394362000000000000e+06j) + (8.393918000000000000e+06+8.394241500000000000e+06j) + (8.393904000000000000e+06+8.394282000000000000e+06j) + (8.393841500000000000e+06+8.394209500000000000e+06j) + (8.393839000000000000e+06+8.394542000000000000e+06j) + (8.393842500000000000e+06+8.394273000000000000e+06j) + (8.394104000000000000e+06+8.394311000000000000e+06j) + (8.393819000000000000e+06+8.394396500000000000e+06j) + (8.393954500000000000e+06+8.394098000000000000e+06j) + (8.394009500000000000e+06+8.394346000000000000e+06j) + (8.393747000000000000e+06+8.394067000000000000e+06j) + (8.393726000000000000e+06+8.394306500000000000e+06j) + (8.393810500000000000e+06+8.394176500000000000e+06j) + (8.393921000000000000e+06+8.394208500000000000e+06j) + (8.393947000000000000e+06+8.394071000000000000e+06j) + (8.394101000000000000e+06+8.394280500000000000e+06j) + (8.393766000000000000e+06+8.394238000000000000e+06j) + (8.394091000000000000e+06+8.394234500000000000e+06j) + (8.393954000000000000e+06+8.394060000000000000e+06j) + (8.393875500000000000e+06+8.394197000000000000e+06j) + (8.393977500000000000e+06+8.394036500000000000e+06j) + (8.393903000000000000e+06+8.394020000000000000e+06j) + (8.394041500000000000e+06+8.393974500000000000e+06j) + (8.393851000000000000e+06+8.393983000000000000e+06j) + (8.394070000000000000e+06+8.394125000000000000e+06j) + (8.393775000000000000e+06+8.394058000000000000e+06j) + (8.394043500000000000e+06+8.394093000000000000e+06j) + (8.393635000000000000e+06+8.394132500000000000e+06j) + (8.393886000000000000e+06+8.394290500000000000e+06j) + (8.393815500000000000e+06+8.394327000000000000e+06j) + (8.393544000000000000e+06+8.394264000000000000e+06j) + (8.393903000000000000e+06+8.393982000000000000e+06j) + (8.393867500000000000e+06+8.393912000000000000e+06j) + (8.393835000000000000e+06+8.394093500000000000e+06j) + (8.393817500000000000e+06+8.394087500000000000e+06j) + (8.393881500000000000e+06+8.394135000000000000e+06j) + (8.393909000000000000e+06+8.394352000000000000e+06j) + (8.393700000000000000e+06+8.394259500000000000e+06j) + (8.393711000000000000e+06+8.393948500000000000e+06j) + (8.394060000000000000e+06+8.394311500000000000e+06j) + (8.393848000000000000e+06+8.394385000000000000e+06j) + (8.393895000000000000e+06+8.394256500000000000e+06j) + (8.393774000000000000e+06+8.394142000000000000e+06j) + (8.393616500000000000e+06+8.393983000000000000e+06j) + (8.393602000000000000e+06+8.394065000000000000e+06j) + (8.393937500000000000e+06+8.394229000000000000e+06j) + (8.394063000000000000e+06+8.393958500000000000e+06j) + (8.393905000000000000e+06+8.394112500000000000e+06j) + (8.393682000000000000e+06+8.393935000000000000e+06j) + (8.393583500000000000e+06+8.393946000000000000e+06j) + (8.393715000000000000e+06+8.394017000000000000e+06j) + (8.393933500000000000e+06+8.393892000000000000e+06j) + (8.394004500000000000e+06+8.394108000000000000e+06j) + (8.393948000000000000e+06+8.394285500000000000e+06j) + (8.393710500000000000e+06+8.393984500000000000e+06j) + (8.393826000000000000e+06+8.394006000000000000e+06j) + (8.393637000000000000e+06+8.393969500000000000e+06j) + (8.393780500000000000e+06+8.394249500000000000e+06j) + (8.393707000000000000e+06+8.393969500000000000e+06j) + (8.393840500000000000e+06+8.393923000000000000e+06j) + (8.393518000000000000e+06+8.393929000000000000e+06j) + (8.393587500000000000e+06+8.393837000000000000e+06j) + (8.393723500000000000e+06+8.393924500000000000e+06j) + (8.393832500000000000e+06+8.393993500000000000e+06j) + (8.393943000000000000e+06+8.394032500000000000e+06j) + (8.393731500000000000e+06+8.393832000000000000e+06j) + (8.393655000000000000e+06+8.394298000000000000e+06j) + (8.393638500000000000e+06+8.394338000000000000e+06j) + (8.393871500000000000e+06+8.394083000000000000e+06j) + (8.394024000000000000e+06+8.393891000000000000e+06j) + (8.393794000000000000e+06+8.394109500000000000e+06j) + (8.393576000000000000e+06+8.393926500000000000e+06j) + (8.393924000000000000e+06+8.394091500000000000e+06j) + (8.393689500000000000e+06+8.394202000000000000e+06j) + (8.393832500000000000e+06+8.393927000000000000e+06j) + (8.393678000000000000e+06+8.394060000000000000e+06j) + (8.393556500000000000e+06+8.394030500000000000e+06j) + (8.393514000000000000e+06+8.393935500000000000e+06j) + (8.393749000000000000e+06+8.394186000000000000e+06j) + (8.393810500000000000e+06+8.394023500000000000e+06j) + (8.393745500000000000e+06+8.393957500000000000e+06j) + (8.393774000000000000e+06+8.394004000000000000e+06j) + (8.393888500000000000e+06+8.393958500000000000e+06j) + (8.393796500000000000e+06+8.394077000000000000e+06j) + (8.393669500000000000e+06+8.394235500000000000e+06j) + (8.393975000000000000e+06+8.394108000000000000e+06j) + (8.393704000000000000e+06+8.394299500000000000e+06j) + (8.393840000000000000e+06+8.394002500000000000e+06j) + (8.393510500000000000e+06+8.394135500000000000e+06j) + (8.393783000000000000e+06+8.394105500000000000e+06j) + (8.393615500000000000e+06+8.394105000000000000e+06j) + (8.393967000000000000e+06+8.393806500000000000e+06j) + (8.393633500000000000e+06+8.393886000000000000e+06j) + (8.393646500000000000e+06+8.394050500000000000e+06j) + (8.393560500000000000e+06+8.394115500000000000e+06j) + (8.393812500000000000e+06+8.394125500000000000e+06j) + (8.393950500000000000e+06+8.394014000000000000e+06j) + (8.393674000000000000e+06+8.394027500000000000e+06j) + (8.393737000000000000e+06+8.393783500000000000e+06j) + (8.393706000000000000e+06+8.394154500000000000e+06j) + (8.393816500000000000e+06+8.393684500000000000e+06j) + (8.393877000000000000e+06+8.393977500000000000e+06j) + (8.393913500000000000e+06+8.393949000000000000e+06j) + (8.393652500000000000e+06+8.394076500000000000e+06j) + (8.393705500000000000e+06+8.393979000000000000e+06j) + (8.393801000000000000e+06+8.393996000000000000e+06j) + (8.393578000000000000e+06+8.393899000000000000e+06j) + (8.393519500000000000e+06+8.393911500000000000e+06j) + (8.393608000000000000e+06+8.394098000000000000e+06j) + (8.393606500000000000e+06+8.393723500000000000e+06j) + (8.393600500000000000e+06+8.394055000000000000e+06j) + (8.393689500000000000e+06+8.393887000000000000e+06j) + (8.393476000000000000e+06+8.393917000000000000e+06j) + (8.393621000000000000e+06+8.393793000000000000e+06j) + (8.393383500000000000e+06+8.393850000000000000e+06j) + (8.393702500000000000e+06+8.393670000000000000e+06j) + (8.393614500000000000e+06+8.393955000000000000e+06j) + (8.393708500000000000e+06+8.393751500000000000e+06j) + (8.393464000000000000e+06+8.393804500000000000e+06j) + (8.393337500000000000e+06+8.393625000000000000e+06j) + (8.393672500000000000e+06+8.393846500000000000e+06j) + (8.393574000000000000e+06+8.393936500000000000e+06j) + (8.393582500000000000e+06+8.393844000000000000e+06j) + (8.393491000000000000e+06+8.393997000000000000e+06j) + (8.393684000000000000e+06+8.393675000000000000e+06j) + (8.393610500000000000e+06+8.394064000000000000e+06j) + (8.393642000000000000e+06+8.393822000000000000e+06j) + (8.393786500000000000e+06+8.393828000000000000e+06j) + (8.393737500000000000e+06+8.393928000000000000e+06j) + (8.393701000000000000e+06+8.394067500000000000e+06j) + (8.393781000000000000e+06+8.393863000000000000e+06j) + (8.393366000000000000e+06+8.393913500000000000e+06j) + (8.393732500000000000e+06+8.393807500000000000e+06j) + (8.393240500000000000e+06+8.393840500000000000e+06j) + (8.393289500000000000e+06+8.393580500000000000e+06j) + (8.393351500000000000e+06+8.393672000000000000e+06j) + (8.393179000000000000e+06+8.393788500000000000e+06j) + (8.393566000000000000e+06+8.393857000000000000e+06j) + (8.393487000000000000e+06+8.393817500000000000e+06j) + (8.393256000000000000e+06+8.393800000000000000e+06j) + (8.393201500000000000e+06+8.393760500000000000e+06j) + (8.393318500000000000e+06+8.393449000000000000e+06j) + (8.393540500000000000e+06+8.393609500000000000e+06j) + (8.393332500000000000e+06+8.393775000000000000e+06j) + (8.393443000000000000e+06+8.393681000000000000e+06j) + (8.393249000000000000e+06+8.393677500000000000e+06j) + (8.393287500000000000e+06+8.393479000000000000e+06j) + (8.393307500000000000e+06+8.393512500000000000e+06j) + (8.393213000000000000e+06+8.393641000000000000e+06j) + (8.393518500000000000e+06+8.393401500000000000e+06j) + (8.393210000000000000e+06+8.393588000000000000e+06j) + (8.393365000000000000e+06+8.393597000000000000e+06j) + (8.393365000000000000e+06+8.393469500000000000e+06j) + (8.393252000000000000e+06+8.393714500000000000e+06j) + (8.393391000000000000e+06+8.393605000000000000e+06j) + (8.393420000000000000e+06+8.393523000000000000e+06j) + (8.393548500000000000e+06+8.393670000000000000e+06j) + (8.393272500000000000e+06+8.393791000000000000e+06j) + (8.393384500000000000e+06+8.393674500000000000e+06j) + (8.393392500000000000e+06+8.393508000000000000e+06j) + (8.393351000000000000e+06+8.393802000000000000e+06j) + (8.393506500000000000e+06+8.393765500000000000e+06j) + (8.393337500000000000e+06+8.393899500000000000e+06j) + (8.393659500000000000e+06+8.393919000000000000e+06j) + (8.393412000000000000e+06+8.393691500000000000e+06j) + (8.393407500000000000e+06+8.393756000000000000e+06j) + (8.393579500000000000e+06+8.393834000000000000e+06j) + (8.393455500000000000e+06+8.393600000000000000e+06j) + (8.393413000000000000e+06+8.393748500000000000e+06j) + (8.393707000000000000e+06+8.393784500000000000e+06j) + (8.393478000000000000e+06+8.393869500000000000e+06j) + (8.393647500000000000e+06+8.393621500000000000e+06j) + (8.393394000000000000e+06+8.393572500000000000e+06j) + (8.393377000000000000e+06+8.393748000000000000e+06j) + (8.393432000000000000e+06+8.393677500000000000e+06j) + (8.393293000000000000e+06+8.393761000000000000e+06j) + (8.393477500000000000e+06+8.393461000000000000e+06j) + (8.393484000000000000e+06+8.393568500000000000e+06j) + (8.393272500000000000e+06+8.393769000000000000e+06j) + (8.393235500000000000e+06+8.393818000000000000e+06j) + (8.393216500000000000e+06+8.393860000000000000e+06j) + (8.393401500000000000e+06+8.393753000000000000e+06j) + (8.393282000000000000e+06+8.393482500000000000e+06j) + (8.393351000000000000e+06+8.393715000000000000e+06j) + (8.393379500000000000e+06+8.393749000000000000e+06j) + (8.393446500000000000e+06+8.393764000000000000e+06j) + (8.393607000000000000e+06+8.393825000000000000e+06j) + (8.393392500000000000e+06+8.393964500000000000e+06j) + (8.393684000000000000e+06+8.393587000000000000e+06j) + (8.393447000000000000e+06+8.393971500000000000e+06j) + (8.393325500000000000e+06+8.393840500000000000e+06j) + (8.393341500000000000e+06+8.393678500000000000e+06j) + (8.393376500000000000e+06+8.393733000000000000e+06j) + (8.393742500000000000e+06+8.393912500000000000e+06j) + (8.393422000000000000e+06+8.393721500000000000e+06j) + (8.393488500000000000e+06+8.393929500000000000e+06j) + (8.393646500000000000e+06+8.393750500000000000e+06j) + (8.393372000000000000e+06+8.393526000000000000e+06j) + (8.393491500000000000e+06+8.393737500000000000e+06j) + (8.393400000000000000e+06+8.393685500000000000e+06j) + (8.393337500000000000e+06+8.394016500000000000e+06j) + (8.393399500000000000e+06+8.393659500000000000e+06j) + (8.393332500000000000e+06+8.393648000000000000e+06j) + (8.393470000000000000e+06+8.393645000000000000e+06j) + (8.393464000000000000e+06+8.393548000000000000e+06j) + (8.393436000000000000e+06+8.393628500000000000e+06j) + (8.393490000000000000e+06+8.393759000000000000e+06j) + (8.393633500000000000e+06+8.393736500000000000e+06j) + (8.393333000000000000e+06+8.393745500000000000e+06j) + (8.393279500000000000e+06+8.393691000000000000e+06j) + (8.393228000000000000e+06+8.393584000000000000e+06j) + (8.393310500000000000e+06+8.393663000000000000e+06j) + (8.393495500000000000e+06+8.393474500000000000e+06j) + (8.393409500000000000e+06+8.393735500000000000e+06j) + (8.393350000000000000e+06+8.393352000000000000e+06j) + (8.393425000000000000e+06+8.393730000000000000e+06j) + (8.393621500000000000e+06+8.393808500000000000e+06j) + (8.393698500000000000e+06+8.393854500000000000e+06j) + (8.393376000000000000e+06+8.393748000000000000e+06j) + (8.393459500000000000e+06+8.393692000000000000e+06j) + (8.393508500000000000e+06+8.393645500000000000e+06j) + (8.393350000000000000e+06+8.393557500000000000e+06j) + (8.393439000000000000e+06+8.393708000000000000e+06j) + (8.393525500000000000e+06+8.393589000000000000e+06j) + (8.393285000000000000e+06+8.393783000000000000e+06j) + (8.393338500000000000e+06+8.393558500000000000e+06j) + (8.393512500000000000e+06+8.393520000000000000e+06j) + (8.393541000000000000e+06+8.393708500000000000e+06j) + (8.393622000000000000e+06+8.393731500000000000e+06j) + (8.393510500000000000e+06+8.393793500000000000e+06j) + (8.393416500000000000e+06+8.393811000000000000e+06j) + (8.393411500000000000e+06+8.393805000000000000e+06j) + (8.393441500000000000e+06+8.393723500000000000e+06j) + (8.393517000000000000e+06+8.393574500000000000e+06j) + (8.393536000000000000e+06+8.393745500000000000e+06j) + (8.393544000000000000e+06+8.393844000000000000e+06j) + (8.393387000000000000e+06+8.393501500000000000e+06j) + (8.393402000000000000e+06+8.393533000000000000e+06j) + (8.393399500000000000e+06+8.393467500000000000e+06j) + (8.393472000000000000e+06+8.393735500000000000e+06j) + (8.393370000000000000e+06+8.393760000000000000e+06j) + (8.393397500000000000e+06+8.393637500000000000e+06j) + (8.393401000000000000e+06+8.393702500000000000e+06j) + (8.393425000000000000e+06+8.393603000000000000e+06j) + (8.393356500000000000e+06+8.393931500000000000e+06j) + (8.393611500000000000e+06+8.393998500000000000e+06j) + (8.393456500000000000e+06+8.393748500000000000e+06j) + (8.393387500000000000e+06+8.393762500000000000e+06j) + (8.393575000000000000e+06+8.393766500000000000e+06j) + (8.393592000000000000e+06+8.393900000000000000e+06j) + (8.393725500000000000e+06+8.393704000000000000e+06j) + (8.393305000000000000e+06+8.393939000000000000e+06j) + (8.393477500000000000e+06+8.393907000000000000e+06j) + (8.393662000000000000e+06+8.393660500000000000e+06j) + (8.393484500000000000e+06+8.393880500000000000e+06j) + (8.393610500000000000e+06+8.393648500000000000e+06j) + (8.393591500000000000e+06+8.393726000000000000e+06j) + (8.393437000000000000e+06+8.393957500000000000e+06j) + (8.393500500000000000e+06+8.393678000000000000e+06j) + (8.393714000000000000e+06+8.393725500000000000e+06j) + (8.393527000000000000e+06+8.393702500000000000e+06j) + (8.393515000000000000e+06+8.393792500000000000e+06j) + (8.393625000000000000e+06+8.393502500000000000e+06j) + (8.393525000000000000e+06+8.393764000000000000e+06j) + (8.393689000000000000e+06+8.393842500000000000e+06j) + (8.393490000000000000e+06+8.393698000000000000e+06j) + (8.393599000000000000e+06+8.393804000000000000e+06j) + (8.393469000000000000e+06+8.393796500000000000e+06j) + (8.393415500000000000e+06+8.393727000000000000e+06j) + (8.393331000000000000e+06+8.393620000000000000e+06j) + (8.393675000000000000e+06+8.393916000000000000e+06j) + (8.393453000000000000e+06+8.393661500000000000e+06j) + (8.393530500000000000e+06+8.393741000000000000e+06j) + (8.393544000000000000e+06+8.393820000000000000e+06j) + (8.393270500000000000e+06+8.393762000000000000e+06j) + (8.393300000000000000e+06+8.393920000000000000e+06j) + (8.393500000000000000e+06+8.393816000000000000e+06j) + (8.393440000000000000e+06+8.393629000000000000e+06j) + (8.393460500000000000e+06+8.393814500000000000e+06j) + (8.393352000000000000e+06+8.393756500000000000e+06j) + (8.393398000000000000e+06+8.393607000000000000e+06j) + (8.393619500000000000e+06+8.393760000000000000e+06j) + (8.393495500000000000e+06+8.393974500000000000e+06j) + (8.393627000000000000e+06+8.393727500000000000e+06j) + (8.393292500000000000e+06+8.393819000000000000e+06j) + (8.393329000000000000e+06+8.393387500000000000e+06j) + (8.393225000000000000e+06+8.393515000000000000e+06j) + (8.393628000000000000e+06+8.393707000000000000e+06j) + (8.393383500000000000e+06+8.393565000000000000e+06j) + (8.393473500000000000e+06+8.393837500000000000e+06j) + (8.393331000000000000e+06+8.393623500000000000e+06j) + (8.393330500000000000e+06+8.393611000000000000e+06j) + (8.393286500000000000e+06+8.393519000000000000e+06j) + (8.393447500000000000e+06+8.393725000000000000e+06j) + (8.393354000000000000e+06+8.393609000000000000e+06j) + (8.393258500000000000e+06+8.393615500000000000e+06j) + (8.393443000000000000e+06+8.393596000000000000e+06j) + (8.393344500000000000e+06+8.393564500000000000e+06j) + (8.393349500000000000e+06+8.393477500000000000e+06j) + (8.393189500000000000e+06+8.393551000000000000e+06j) + (8.393151000000000000e+06+8.393645000000000000e+06j) + (8.393141500000000000e+06+8.393373500000000000e+06j) + (8.393249500000000000e+06+8.393472500000000000e+06j) + (8.393059500000000000e+06+8.393532000000000000e+06j) + (8.393131500000000000e+06+8.393299000000000000e+06j) + (8.393052500000000000e+06+8.393163500000000000e+06j) + (8.393142500000000000e+06+8.393554500000000000e+06j) + (8.393163500000000000e+06+8.393418500000000000e+06j) + (8.393327500000000000e+06+8.393560000000000000e+06j) + (8.393344500000000000e+06+8.393608000000000000e+06j) + (8.393350500000000000e+06+8.393505000000000000e+06j) + (8.393320000000000000e+06+8.393565500000000000e+06j) + (8.393545000000000000e+06+8.393425500000000000e+06j) + (8.393374500000000000e+06+8.393446000000000000e+06j) + (8.393225000000000000e+06+8.393545000000000000e+06j) + (8.393541000000000000e+06+8.393752500000000000e+06j) + (8.393566500000000000e+06+8.393733500000000000e+06j) + (8.393544000000000000e+06+8.394112500000000000e+06j) + (8.393385500000000000e+06+8.393815000000000000e+06j) + (8.393264000000000000e+06+8.393794000000000000e+06j) + (8.393503000000000000e+06+8.393870000000000000e+06j) + (8.393400500000000000e+06+8.393828000000000000e+06j) + (8.393440500000000000e+06+8.393621500000000000e+06j) + (8.393346000000000000e+06+8.393616500000000000e+06j) + (8.393208500000000000e+06+8.393579000000000000e+06j) + (8.393245500000000000e+06+8.393642000000000000e+06j) + (8.393500500000000000e+06+8.393876000000000000e+06j) + (8.393461500000000000e+06+8.393732500000000000e+06j) + (8.393447000000000000e+06+8.393729500000000000e+06j) + (8.393434000000000000e+06+8.393800000000000000e+06j) + (8.393313500000000000e+06+8.393596500000000000e+06j) + (8.393486000000000000e+06+8.393703500000000000e+06j) + (8.393463500000000000e+06+8.393807000000000000e+06j) + (8.393266000000000000e+06+8.393569500000000000e+06j) + (8.393587500000000000e+06+8.393637000000000000e+06j) + (8.393420000000000000e+06+8.393695000000000000e+06j) + (8.393650000000000000e+06+8.393715500000000000e+06j) + (8.393458000000000000e+06+8.393684000000000000e+06j) + (8.393414500000000000e+06+8.393772000000000000e+06j) + (8.393450000000000000e+06+8.393963500000000000e+06j) diff --git a/frappy_psi/network_analysers/mRS/miniVNAPRO2Driver.py b/frappy_psi/network_analysers/mRS/miniVNAPRO2Driver.py new file mode 100644 index 00000000..ef033faf --- /dev/null +++ b/frappy_psi/network_analysers/mRS/miniVNAPRO2Driver.py @@ -0,0 +1,209 @@ +import serial +from serial.tools.list_ports import comports + +import numpy as np +import time + + + + + + +import matplotlib.pyplot as plt + + +def get_comports(): + return [c.name for c in comports()] + +class miniVNA_PRO2(): + '''All information here was ripped from the "open source" JAR that mRS provides''' + port = '' + data = np.array([]) + freqs = np.array([]) + infostr = 'uninitialised' + + # calibration + e00 = 0 + e11 = 0 + d_e = 0 + calibrated = False + + properties = { + 'max_freq': 220_000_000, #Hz + 'min_freq': 10_000, + 'min_samplerate': 0, + 'max_samplerate': 4, + 'generator_ports': 2, # num + 'mult': 8.25955249230769, + } + + def __init__(self, port=''): + if(port == ''): + cs = get_comports() + if(len(cs) == 1): + print('miniVNA PRO2: No COM port provided. Using the only one available, ' + cs[0]) + port = cs[0] + else: + print('miniVNA PRO2: Please provide a COM port from the following:\n' + str(cs)) + raise Exception + + self.port = serial.Serial(port, 921600, timeout=1, parity=serial.PARITY_NONE) + self.reset() + print('miniVNA PRO2 connected with serial information:') + print(self.get_info()) + + def __del__(self): + self.port.close() + + def calibrate(self, freqs): + #https://k6jca.blogspot.com/2019/12/vna-notes-on-12-term-error-model-and.html + + self.calibrated_freqs = freqs + + Gm1 = np.loadtxt('short.txt', dtype=np.complex128) + Gm2 = np.loadtxt('load.txt', dtype=np.complex128) + Gm3 = np.loadtxt('open.txt', dtype=np.complex128) + G1 = -1 + G2 = 0.1 + G3 = +1 + + self.e00 = (G1*G2*Gm1*Gm3 - G1*G3*Gm1*Gm2 - G1*G2*Gm2*Gm3 + G2*G3*Gm1*Gm2 + G1*G3*Gm2*Gm3 - G2*G3*Gm1*Gm3)/(G1*G2*Gm1 - G1*G2*Gm2 - G1*G3*Gm1 + G1*G3*Gm3 + G2*G3*Gm2 - G2*G3*Gm3) + self.e11 = -(G1*Gm2 - G2*Gm1 - G1*Gm3 + G3*Gm1 + G2*Gm3 - G3*Gm2)/(G1*G2*Gm1 - G1*G2*Gm2 - G1*G3*Gm1 + G1*G3*Gm3 + G2*G3*Gm2 - G2*G3*Gm3) + self.d_e = -(G1*Gm1*Gm2 - G1*Gm1*Gm3 - G2*Gm1*Gm2 + G2*Gm2*Gm3 + G3*Gm1*Gm3 - G3*Gm2*Gm3)/(G1*G2*Gm1 - G1*G2*Gm2 - G1*G3*Gm1 + G1*G3*Gm3 + G2*G3*Gm2 - G2*G3*Gm3) + self.calibrated = True + + def write_cmd(self, args): + if not(isinstance(args, list)): + args = [args] + args = [ str(a) for a in args ] + c = '\r'.join(args) + '\r' + self.port.write(bytes(c, 'utf-8')) + + def read_line(self): + return self.port.readline()[:-2].decode('utf-8') # last two bytes are always \r\n + + def get_info(self): + self.write_cmd('9') + self.port.timeout = 3 + self.infostr = self.read_line() + return self.infostr + + def reset(self): + self.write_cmd([9,9]) + time.sleep(3) + self.port.reset_input_buffer() + self.port.reset_output_buffer() + + def sweep(self, f0: float, f1: float, N: int = 128, sample_rate: int = 0, mode = 1): + '''Mode 1 designates that we're reading the DET (reflection) port... I think''' + print('Starting sweep') + st = time.time() + d = (f1 - f0) / (N - 1) + + f0 -= 4 * d + N += 4 + + assert(sample_rate <= self.properties['max_samplerate'] and sample_rate >= self.properties['min_samplerate']) + + if(d > f1 - 10_000): + d = 0.0 + if(d == 0.0): + i = N + else: + i = N+1 + + self.write_cmd(['10' + str(mode), (f0-d) * self.properties['mult'], sample_rate, N+1, (f1-f0+d)/N * self.properties['mult']]) + self.port.set_buffer_size(rx_size = 12*(N+10)) + while(self.port.in_waiting < 12*N): # prepare the first read. It takes a second, okay? + time.sleep(0.1) + percent = self.port.in_waiting/(12*N) + L = 50 + print(f'\rminiVNA PRO2: Progress: {int(100*percent):>3d}% [{"".join(["="]*int(percent*L) + [" "]*(L-int(percent*L)))}]', end='') + + raw_data = np.zeros((N, 12), dtype=np.uint8) + progress = 0 + failures = 0 + while(progress < N): + incoming = self.port.read(12) + conv = np.frombuffer(incoming, dtype=np.uint8) + raw_data[progress,:len(conv)] = conv + progress += 1 + et = time.time() + print(f'\nSweep took {et-st:.2f}s') + + self.data = np.zeros((N,), dtype=np.complex128) + # processing one at a time to avoid overflows + self.data += 1j/2 * raw_data[:,0] + self.data += 1j/2 * raw_data[:,1]*256 + self.data += 1j/2 * raw_data[:,2]*65536 + self.data += 1/2 * raw_data[:,3] + self.data += 1/2 * raw_data[:,4]*256 + self.data += 1/2 * raw_data[:,5]*65536 + self.data -= 1j/2 * raw_data[:,6] + self.data += 1j/2 * raw_data[:,7]*256 + self.data += 1j/2 * raw_data[:,8]*65536 + self.data -= 1/2 * raw_data[:,9] + self.data += 1/2 * raw_data[:,10]*256 + self.data += 1/2 * raw_data[:,11]*65536 + + self.freq = np.linspace(f0, f1, N)[4:] + self.data = self.data[4:]# / 777_472_127_994 # normalize + #self.data = np.convolve(self.data, np.exp(-np.square(1/2 * + + e00 = np.interp(self.freq, self.calibrated_freqs, self.e00) if self.calibrated else 0 + e11 = np.interp(self.freq, self.calibrated_freqs, self.e11) if self.calibrated else 0 + d_e = np.interp(self.freq, self.calibrated_freqs, self.d_e) if self.calibrated else -1 + self.data = (self.data - e00) / (self.data * e11 - d_e) + # (f1 - f0) / (N-1) * i + f0 + + et = time.time() + print(f'Completed sweep. Full function took {et-st:.2f}s') + + def start_generator(self, freq_I, freq_Q, att_I, att_Q, phase): + + self.write_cmd([2, freq_I, freq_Q, phase, 3, att_Q, att_I]) + time.sleep(3) + while(self.port.in_waiting > 0): + print(self.port.read(1), end='') + +m = miniVNA_PRO2('COM9') + +#plt.plot(m.freq, np.real(m.data), label='0') +#plt.plot(m.freq, np.imag(m.data), label='0') +#plt.plot(m.freq, np.abs(m.data), label='0', color='k') + + +#m.calibrate(np.linspace(40_000_000, 50_000_000, 512)) +#m.start_generator(40_000_000, 50_000_000, 30, 30, 0) +#m.test_gen() + +f0 = 15_000_000 +f1 = 60_000_000 +m.sweep(f0, f1, N=512, sample_rate=4) +if(False): + short = m.data + for i in range(10): + m.sweep(f0, f1, N=512, sample_rate=4) + short += m.data + short /= 11 +if(True): + plt.plot(m.freq, np.imag(m.data)) + plt.plot(m.freq, np.real(m.data)) + plt.plot(m.freq, np.abs(m.data)) + plt.show() +if(False): + input('attach device') + m.sweep(f0, f1, N=512, sample_rate=4) + full_data = m.data + + plt.plot(m.freq, np.abs(full_data)) + plt.plot(m.freq, np.abs(cord_data)) + plt.plot(m.freq, np.abs(full_data - cord_data)) + + plt.legend() + plt.show() + +inp = input('save?') +if(inp == 'y'): + np.savetxt(input('fn') + '.txt', m.data) + \ No newline at end of file diff --git a/frappy_psi/network_analysers/mRS/open.txt b/frappy_psi/network_analysers/mRS/open.txt new file mode 100644 index 00000000..098a4460 --- /dev/null +++ b/frappy_psi/network_analysers/mRS/open.txt @@ -0,0 +1,512 @@ + (8.364007500000000000e+06+8.365357500000000000e+06j) + (8.364065500000000000e+06+8.365302000000000000e+06j) + (8.363858000000000000e+06+8.365604500000000000e+06j) + (8.364083500000000000e+06+8.365331000000000000e+06j) + (8.363859000000000000e+06+8.365310500000000000e+06j) + (8.364118500000000000e+06+8.365513000000000000e+06j) + (8.391019000000000000e+06+8.386613000000000000e+06j) + (8.389462500000000000e+06+8.391152000000000000e+06j) + (8.387515500000000000e+06+8.388812500000000000e+06j) + (8.386334000000000000e+06+8.387286000000000000e+06j) + (8.385897500000000000e+06+8.386700000000000000e+06j) + (8.385262000000000000e+06+8.385957000000000000e+06j) + (8.384888500000000000e+06+8.385688500000000000e+06j) + (8.384688500000000000e+06+8.385242500000000000e+06j) + (8.384212000000000000e+06+8.385499000000000000e+06j) + (8.384402000000000000e+06+8.384805500000000000e+06j) + (8.384111000000000000e+06+8.384820500000000000e+06j) + (8.383890000000000000e+06+8.384668500000000000e+06j) + (8.383921000000000000e+06+8.384578000000000000e+06j) + (8.383785500000000000e+06+8.384592000000000000e+06j) + (8.383019000000000000e+06+8.383915000000000000e+06j) + (8.382944500000000000e+06+8.383897500000000000e+06j) + (8.383104000000000000e+06+8.383521000000000000e+06j) + (8.382638500000000000e+06+8.383515500000000000e+06j) + (8.382558000000000000e+06+8.383559500000000000e+06j) + (8.382250500000000000e+06+8.383142500000000000e+06j) + (8.381766000000000000e+06+8.382729500000000000e+06j) + (8.381615500000000000e+06+8.382754500000000000e+06j) + (8.381600000000000000e+06+8.382578500000000000e+06j) + (8.381388000000000000e+06+8.382242500000000000e+06j) + (8.380949000000000000e+06+8.381910000000000000e+06j) + (8.380541000000000000e+06+8.381504000000000000e+06j) + (8.380315500000000000e+06+8.381740000000000000e+06j) + (8.380283000000000000e+06+8.381322000000000000e+06j) + (8.380078500000000000e+06+8.381467000000000000e+06j) + (8.379700000000000000e+06+8.381306000000000000e+06j) + (8.379249000000000000e+06+8.380769000000000000e+06j) + (8.378776000000000000e+06+8.380254000000000000e+06j) + (8.378629000000000000e+06+8.380297500000000000e+06j) + (8.378521500000000000e+06+8.380045500000000000e+06j) + (8.378648500000000000e+06+8.379652000000000000e+06j) + (8.378147500000000000e+06+8.379632500000000000e+06j) + (8.377768500000000000e+06+8.379072500000000000e+06j) + (8.377292500000000000e+06+8.378726500000000000e+06j) + (8.377161500000000000e+06+8.378890500000000000e+06j) + (8.377197500000000000e+06+8.378072000000000000e+06j) + (8.376674000000000000e+06+8.378291500000000000e+06j) + (8.376399500000000000e+06+8.378151000000000000e+06j) + (8.376209500000000000e+06+8.377887000000000000e+06j) + (8.375659000000000000e+06+8.377454000000000000e+06j) + (8.375392500000000000e+06+8.376973000000000000e+06j) + (8.375392000000000000e+06+8.376973000000000000e+06j) + (8.374860500000000000e+06+8.376836000000000000e+06j) + (8.374569500000000000e+06+8.376608500000000000e+06j) + (8.374336500000000000e+06+8.376006500000000000e+06j) + (8.374241000000000000e+06+8.376152500000000000e+06j) + (8.374032500000000000e+06+8.375937500000000000e+06j) + (8.373862000000000000e+06+8.375571500000000000e+06j) + (8.373460000000000000e+06+8.375586500000000000e+06j) + (8.373055500000000000e+06+8.374885500000000000e+06j) + (8.372864000000000000e+06+8.374831500000000000e+06j) + (8.372578500000000000e+06+8.374939000000000000e+06j) + (8.372517500000000000e+06+8.374646500000000000e+06j) + (8.372270000000000000e+06+8.374482000000000000e+06j) + (8.372139000000000000e+06+8.374008500000000000e+06j) + (8.371512000000000000e+06+8.373672000000000000e+06j) + (8.371528000000000000e+06+8.373472500000000000e+06j) + (8.371141000000000000e+06+8.373078500000000000e+06j) + (8.370735000000000000e+06+8.373159500000000000e+06j) + (8.370442000000000000e+06+8.372414500000000000e+06j) + (8.370478000000000000e+06+8.372688000000000000e+06j) + (8.369979500000000000e+06+8.372269000000000000e+06j) + (8.369894500000000000e+06+8.371964500000000000e+06j) + (8.369411500000000000e+06+8.371692000000000000e+06j) + (8.369152500000000000e+06+8.371645000000000000e+06j) + (8.369084500000000000e+06+8.371184500000000000e+06j) + (8.368959000000000000e+06+8.371144000000000000e+06j) + (8.368465000000000000e+06+8.370635000000000000e+06j) + (8.368373000000000000e+06+8.370515000000000000e+06j) + (8.368054500000000000e+06+8.370605000000000000e+06j) + (8.368059500000000000e+06+8.370119000000000000e+06j) + (8.367707000000000000e+06+8.370207000000000000e+06j) + (8.367063500000000000e+06+8.369945500000000000e+06j) + (8.366989500000000000e+06+8.369593500000000000e+06j) + (8.366922500000000000e+06+8.369132000000000000e+06j) + (8.366494000000000000e+06+8.369232000000000000e+06j) + (8.366226500000000000e+06+8.368987500000000000e+06j) + (8.366002000000000000e+06+8.368623000000000000e+06j) + (8.365805000000000000e+06+8.368447000000000000e+06j) + (8.365270500000000000e+06+8.368052500000000000e+06j) + (8.365311500000000000e+06+8.368004000000000000e+06j) + (8.364929000000000000e+06+8.367532500000000000e+06j) + (8.364550500000000000e+06+8.367380000000000000e+06j) + (8.364204000000000000e+06+8.367399000000000000e+06j) + (8.364384500000000000e+06+8.367229500000000000e+06j) + (8.364393500000000000e+06+8.366735000000000000e+06j) + (8.363827000000000000e+06+8.366661000000000000e+06j) + (8.363561000000000000e+06+8.366695500000000000e+06j) + (8.363317000000000000e+06+8.366358000000000000e+06j) + (8.363420000000000000e+06+8.366079000000000000e+06j) + (8.362864500000000000e+06+8.366107500000000000e+06j) + (8.362807500000000000e+06+8.365464000000000000e+06j) + (8.362480500000000000e+06+8.365258000000000000e+06j) + (8.362318500000000000e+06+8.365355000000000000e+06j) + (8.361955000000000000e+06+8.364786500000000000e+06j) + (8.361670000000000000e+06+8.365067000000000000e+06j) + (8.361579500000000000e+06+8.364476500000000000e+06j) + (8.361546000000000000e+06+8.364661500000000000e+06j) + (8.361071000000000000e+06+8.363856500000000000e+06j) + (8.360896000000000000e+06+8.363686500000000000e+06j) + (8.360845500000000000e+06+8.363829000000000000e+06j) + (8.360575500000000000e+06+8.363337500000000000e+06j) + (8.360226000000000000e+06+8.363310500000000000e+06j) + (8.359857000000000000e+06+8.363197500000000000e+06j) + (8.359720000000000000e+06+8.362795500000000000e+06j) + (8.359504500000000000e+06+8.362672000000000000e+06j) + (8.359133500000000000e+06+8.362785000000000000e+06j) + (8.358873500000000000e+06+8.362260500000000000e+06j) + (8.358934500000000000e+06+8.362138000000000000e+06j) + (8.358456000000000000e+06+8.361549000000000000e+06j) + (8.358213500000000000e+06+8.361674500000000000e+06j) + (8.358065000000000000e+06+8.361034000000000000e+06j) + (8.358120500000000000e+06+8.360855500000000000e+06j) + (8.357569000000000000e+06+8.361050500000000000e+06j) + (8.357351500000000000e+06+8.360750000000000000e+06j) + (8.356905500000000000e+06+8.360573000000000000e+06j) + (8.357130500000000000e+06+8.360254000000000000e+06j) + (8.356489500000000000e+06+8.359858000000000000e+06j) + (8.356424000000000000e+06+8.359749000000000000e+06j) + (8.356435500000000000e+06+8.359836000000000000e+06j) + (8.356085000000000000e+06+8.359173500000000000e+06j) + (8.355927500000000000e+06+8.359394000000000000e+06j) + (8.355390500000000000e+06+8.358640000000000000e+06j) + (8.355142500000000000e+06+8.358586000000000000e+06j) + (8.355224000000000000e+06+8.358738500000000000e+06j) + (8.354756000000000000e+06+8.358261000000000000e+06j) + (8.354691000000000000e+06+8.357864000000000000e+06j) + (8.354481000000000000e+06+8.358196000000000000e+06j) + (8.354125000000000000e+06+8.357849000000000000e+06j) + (8.354209500000000000e+06+8.357630500000000000e+06j) + (8.353896500000000000e+06+8.357535000000000000e+06j) + (8.353915500000000000e+06+8.356912000000000000e+06j) + (8.353890000000000000e+06+8.357499000000000000e+06j) + (8.353753000000000000e+06+8.357149500000000000e+06j) + (8.353530500000000000e+06+8.357237000000000000e+06j) + (8.353502000000000000e+06+8.356692000000000000e+06j) + (8.353132000000000000e+06+8.357132500000000000e+06j) + (8.353743000000000000e+06+8.357028000000000000e+06j) + (8.353381000000000000e+06+8.357125500000000000e+06j) + (8.353335000000000000e+06+8.356588500000000000e+06j) + (8.353529000000000000e+06+8.357087500000000000e+06j) + (8.353111500000000000e+06+8.357127000000000000e+06j) + (8.353197500000000000e+06+8.357116500000000000e+06j) + (8.353514500000000000e+06+8.356962500000000000e+06j) + (8.353678500000000000e+06+8.357229000000000000e+06j) + (8.353921000000000000e+06+8.357332000000000000e+06j) + (8.353406500000000000e+06+8.357383500000000000e+06j) + (8.353468000000000000e+06+8.357255000000000000e+06j) + (8.354004500000000000e+06+8.357470500000000000e+06j) + (8.354174000000000000e+06+8.357559500000000000e+06j) + (8.353846000000000000e+06+8.357848000000000000e+06j) + (8.354283000000000000e+06+8.357597500000000000e+06j) + (8.354077000000000000e+06+8.357789000000000000e+06j) + (8.354122000000000000e+06+8.357624000000000000e+06j) + (8.354422000000000000e+06+8.357874000000000000e+06j) + (8.354469500000000000e+06+8.357897500000000000e+06j) + (8.354363000000000000e+06+8.357941000000000000e+06j) + (8.354464000000000000e+06+8.358270000000000000e+06j) + (8.354661500000000000e+06+8.358401000000000000e+06j) + (8.354548500000000000e+06+8.358225000000000000e+06j) + (8.354632000000000000e+06+8.358371000000000000e+06j) + (8.354727500000000000e+06+8.358551000000000000e+06j) + (8.354442500000000000e+06+8.358503500000000000e+06j) + (8.354929000000000000e+06+8.358847000000000000e+06j) + (8.355141500000000000e+06+8.358949000000000000e+06j) + (8.355038500000000000e+06+8.358395500000000000e+06j) + (8.355264500000000000e+06+8.358528000000000000e+06j) + (8.355022000000000000e+06+8.358498500000000000e+06j) + (8.355388500000000000e+06+8.358584500000000000e+06j) + (8.355461500000000000e+06+8.358981500000000000e+06j) + (8.355358000000000000e+06+8.358537000000000000e+06j) + (8.355237000000000000e+06+8.358820000000000000e+06j) + (8.355364500000000000e+06+8.359329500000000000e+06j) + (8.355532000000000000e+06+8.359098500000000000e+06j) + (8.355663500000000000e+06+8.358969500000000000e+06j) + (8.355636000000000000e+06+8.359203000000000000e+06j) + (8.355265000000000000e+06+8.358928500000000000e+06j) + (8.355489000000000000e+06+8.359380500000000000e+06j) + (8.355628500000000000e+06+8.359158500000000000e+06j) + (8.355703000000000000e+06+8.359141000000000000e+06j) + (8.355503500000000000e+06+8.359174000000000000e+06j) + (8.355789500000000000e+06+8.359664500000000000e+06j) + (8.356107000000000000e+06+8.359504000000000000e+06j) + (8.355532500000000000e+06+8.359281500000000000e+06j) + (8.356033500000000000e+06+8.359426000000000000e+06j) + (8.356091000000000000e+06+8.359321000000000000e+06j) + (8.355974500000000000e+06+8.359438000000000000e+06j) + (8.355632000000000000e+06+8.359295000000000000e+06j) + (8.355745500000000000e+06+8.359607000000000000e+06j) + (8.355898500000000000e+06+8.359260500000000000e+06j) + (8.355899000000000000e+06+8.359875000000000000e+06j) + (8.355944000000000000e+06+8.359566000000000000e+06j) + (8.355882500000000000e+06+8.359408000000000000e+06j) + (8.356019000000000000e+06+8.359654000000000000e+06j) + (8.356046500000000000e+06+8.359937000000000000e+06j) + (8.356042000000000000e+06+8.359759500000000000e+06j) + (8.355959500000000000e+06+8.359718500000000000e+06j) + (8.355835000000000000e+06+8.359563000000000000e+06j) + (8.356001000000000000e+06+8.359631500000000000e+06j) + (8.356524500000000000e+06+8.359638500000000000e+06j) + (8.356297000000000000e+06+8.359523000000000000e+06j) + (8.356208000000000000e+06+8.359800000000000000e+06j) + (8.356093500000000000e+06+8.359894000000000000e+06j) + (8.356074000000000000e+06+8.359684000000000000e+06j) + (8.356396500000000000e+06+8.360014000000000000e+06j) + (8.356380000000000000e+06+8.360117500000000000e+06j) + (8.356232500000000000e+06+8.359928500000000000e+06j) + (8.356362000000000000e+06+8.359903500000000000e+06j) + (8.356244000000000000e+06+8.359898000000000000e+06j) + (8.356247500000000000e+06+8.359549000000000000e+06j) + (8.356274500000000000e+06+8.359776500000000000e+06j) + (8.356241000000000000e+06+8.360012500000000000e+06j) + (8.356160000000000000e+06+8.360158500000000000e+06j) + (8.356130500000000000e+06+8.359471000000000000e+06j) + (8.356152000000000000e+06+8.359800500000000000e+06j) + (8.356033000000000000e+06+8.359396500000000000e+06j) + (8.355938000000000000e+06+8.359473500000000000e+06j) + (8.355870000000000000e+06+8.359504000000000000e+06j) + (8.355816000000000000e+06+8.359534500000000000e+06j) + (8.356015500000000000e+06+8.359526000000000000e+06j) + (8.355735500000000000e+06+8.359290500000000000e+06j) + (8.355943500000000000e+06+8.359031500000000000e+06j) + (8.355636500000000000e+06+8.359264500000000000e+06j) + (8.355774000000000000e+06+8.359376500000000000e+06j) + (8.355711000000000000e+06+8.358931500000000000e+06j) + (8.355413000000000000e+06+8.359131000000000000e+06j) + (8.355596000000000000e+06+8.359442000000000000e+06j) + (8.355620500000000000e+06+8.359155500000000000e+06j) + (8.355420000000000000e+06+8.359023500000000000e+06j) + (8.355404000000000000e+06+8.358920000000000000e+06j) + (8.355496000000000000e+06+8.358992000000000000e+06j) + (8.354895500000000000e+06+8.358802500000000000e+06j) + (8.355203000000000000e+06+8.358495000000000000e+06j) + (8.355168500000000000e+06+8.358789500000000000e+06j) + (8.355040500000000000e+06+8.358730500000000000e+06j) + (8.354889000000000000e+06+8.358882500000000000e+06j) + (8.355036500000000000e+06+8.358606000000000000e+06j) + (8.355112500000000000e+06+8.358464000000000000e+06j) + (8.354896000000000000e+06+8.358263000000000000e+06j) + (8.354783000000000000e+06+8.358303500000000000e+06j) + (8.354627500000000000e+06+8.358265000000000000e+06j) + (8.354819500000000000e+06+8.358476000000000000e+06j) + (8.354852000000000000e+06+8.358274000000000000e+06j) + (8.354815000000000000e+06+8.358373000000000000e+06j) + (8.354642000000000000e+06+8.358466000000000000e+06j) + (8.354888000000000000e+06+8.358452000000000000e+06j) + (8.354578500000000000e+06+8.358260500000000000e+06j) + (8.354747000000000000e+06+8.358096500000000000e+06j) + (8.354551500000000000e+06+8.358255000000000000e+06j) + (8.354384000000000000e+06+8.357849500000000000e+06j) + (8.354623500000000000e+06+8.358196500000000000e+06j) + (8.354216500000000000e+06+8.357928000000000000e+06j) + (8.355090000000000000e+06+8.357991500000000000e+06j) + (8.354754000000000000e+06+8.358193500000000000e+06j) + (8.354554000000000000e+06+8.358251500000000000e+06j) + (8.354764000000000000e+06+8.357984000000000000e+06j) + (8.354608500000000000e+06+8.357900000000000000e+06j) + (8.354587000000000000e+06+8.358002500000000000e+06j) + (8.354503500000000000e+06+8.357877000000000000e+06j) + (8.354636000000000000e+06+8.357554000000000000e+06j) + (8.354648000000000000e+06+8.358228000000000000e+06j) + (8.354641500000000000e+06+8.358095500000000000e+06j) + (8.354487500000000000e+06+8.357916500000000000e+06j) + (8.354612000000000000e+06+8.358132000000000000e+06j) + (8.354728500000000000e+06+8.357821000000000000e+06j) + (8.354637000000000000e+06+8.357915500000000000e+06j) + (8.354874500000000000e+06+8.357999500000000000e+06j) + (8.354755000000000000e+06+8.357858000000000000e+06j) + (8.354699000000000000e+06+8.358001000000000000e+06j) + (8.354602500000000000e+06+8.358145500000000000e+06j) + (8.354749000000000000e+06+8.358039000000000000e+06j) + (8.354656500000000000e+06+8.357965000000000000e+06j) + (8.354514500000000000e+06+8.357858000000000000e+06j) + (8.354552000000000000e+06+8.357973500000000000e+06j) + (8.354940000000000000e+06+8.358275000000000000e+06j) + (8.354847000000000000e+06+8.358120500000000000e+06j) + (8.354556000000000000e+06+8.358256000000000000e+06j) + (8.354794000000000000e+06+8.358046000000000000e+06j) + (8.354640000000000000e+06+8.357748000000000000e+06j) + (8.354522500000000000e+06+8.358060500000000000e+06j) + (8.354480000000000000e+06+8.357972500000000000e+06j) + (8.354499500000000000e+06+8.357727000000000000e+06j) + (8.354751000000000000e+06+8.357975500000000000e+06j) + (8.354581500000000000e+06+8.358101500000000000e+06j) + (8.354810000000000000e+06+8.358197500000000000e+06j) + (8.354964000000000000e+06+8.358243000000000000e+06j) + (8.354822500000000000e+06+8.358374500000000000e+06j) + (8.354664000000000000e+06+8.357955000000000000e+06j) + (8.354608000000000000e+06+8.358069000000000000e+06j) + (8.354938000000000000e+06+8.358573000000000000e+06j) + (8.354666500000000000e+06+8.358069500000000000e+06j) + (8.355007000000000000e+06+8.358038500000000000e+06j) + (8.355005500000000000e+06+8.358452500000000000e+06j) + (8.354888000000000000e+06+8.358197500000000000e+06j) + (8.354978000000000000e+06+8.357996000000000000e+06j) + (8.354968500000000000e+06+8.358525000000000000e+06j) + (8.355174000000000000e+06+8.358455500000000000e+06j) + (8.354920500000000000e+06+8.358269000000000000e+06j) + (8.355141500000000000e+06+8.357899500000000000e+06j) + (8.355022000000000000e+06+8.358011500000000000e+06j) + (8.355215500000000000e+06+8.358280500000000000e+06j) + (8.354964500000000000e+06+8.357841500000000000e+06j) + (8.355284000000000000e+06+8.358155500000000000e+06j) + (8.355031000000000000e+06+8.358451500000000000e+06j) + (8.355381000000000000e+06+8.358462000000000000e+06j) + (8.355682500000000000e+06+8.358159000000000000e+06j) + (8.355444500000000000e+06+8.358277000000000000e+06j) + (8.355238500000000000e+06+8.358469000000000000e+06j) + (8.355074500000000000e+06+8.358433500000000000e+06j) + (8.355541500000000000e+06+8.358519500000000000e+06j) + (8.355251500000000000e+06+8.358332500000000000e+06j) + (8.355238000000000000e+06+8.358397000000000000e+06j) + (8.355381500000000000e+06+8.358360500000000000e+06j) + (8.355385500000000000e+06+8.358785500000000000e+06j) + (8.355581500000000000e+06+8.358550000000000000e+06j) + (8.355613500000000000e+06+8.358380000000000000e+06j) + (8.355375500000000000e+06+8.358638000000000000e+06j) + (8.355642000000000000e+06+8.358605500000000000e+06j) + (8.355299500000000000e+06+8.358279000000000000e+06j) + (8.355755000000000000e+06+8.358738000000000000e+06j) + (8.355521500000000000e+06+8.358691000000000000e+06j) + (8.355342000000000000e+06+8.358660500000000000e+06j) + (8.355416500000000000e+06+8.358679000000000000e+06j) + (8.355363000000000000e+06+8.358536500000000000e+06j) + (8.355579500000000000e+06+8.358570500000000000e+06j) + (8.355489500000000000e+06+8.358802500000000000e+06j) + (8.355712500000000000e+06+8.358789500000000000e+06j) + (8.355544000000000000e+06+8.358732000000000000e+06j) + (8.356071500000000000e+06+8.358831500000000000e+06j) + (8.355995500000000000e+06+8.358632500000000000e+06j) + (8.355788000000000000e+06+8.359079000000000000e+06j) + (8.355772000000000000e+06+8.358702000000000000e+06j) + (8.356126500000000000e+06+8.359359500000000000e+06j) + (8.356141500000000000e+06+8.359008500000000000e+06j) + (8.355795500000000000e+06+8.358754000000000000e+06j) + (8.356291500000000000e+06+8.359168500000000000e+06j) + (8.356148000000000000e+06+8.359162000000000000e+06j) + (8.356188000000000000e+06+8.358935000000000000e+06j) + (8.356242500000000000e+06+8.359176000000000000e+06j) + (8.356400500000000000e+06+8.359190500000000000e+06j) + (8.356252500000000000e+06+8.359465500000000000e+06j) + (8.356321500000000000e+06+8.359224000000000000e+06j) + (8.356710000000000000e+06+8.359076000000000000e+06j) + (8.356287500000000000e+06+8.359242000000000000e+06j) + (8.356715000000000000e+06+8.359201000000000000e+06j) + (8.356327500000000000e+06+8.359446500000000000e+06j) + (8.356567500000000000e+06+8.359476500000000000e+06j) + (8.356516000000000000e+06+8.359383000000000000e+06j) + (8.356456000000000000e+06+8.359134000000000000e+06j) + (8.356453500000000000e+06+8.359282500000000000e+06j) + (8.356641500000000000e+06+8.359399500000000000e+06j) + (8.356661500000000000e+06+8.359382500000000000e+06j) + (8.356433500000000000e+06+8.359080000000000000e+06j) + (8.356676000000000000e+06+8.359186000000000000e+06j) + (8.356741500000000000e+06+8.359193000000000000e+06j) + (8.356308500000000000e+06+8.359325500000000000e+06j) + (8.356491500000000000e+06+8.359397000000000000e+06j) + (8.356644500000000000e+06+8.359186500000000000e+06j) + (8.356983500000000000e+06+8.359830500000000000e+06j) + (8.356795000000000000e+06+8.359642500000000000e+06j) + (8.356779500000000000e+06+8.359603500000000000e+06j) + (8.356741500000000000e+06+8.359312500000000000e+06j) + (8.357241000000000000e+06+8.359978000000000000e+06j) + (8.356745500000000000e+06+8.359750000000000000e+06j) + (8.356780000000000000e+06+8.359537000000000000e+06j) + (8.356984500000000000e+06+8.359655000000000000e+06j) + (8.357301000000000000e+06+8.359898500000000000e+06j) + (8.357323500000000000e+06+8.359740500000000000e+06j) + (8.357142500000000000e+06+8.359931000000000000e+06j) + (8.357374000000000000e+06+8.359918500000000000e+06j) + (8.357193500000000000e+06+8.359997500000000000e+06j) + (8.357173000000000000e+06+8.359861500000000000e+06j) + (8.357493500000000000e+06+8.359788000000000000e+06j) + (8.357770500000000000e+06+8.359944500000000000e+06j) + (8.357524500000000000e+06+8.359991000000000000e+06j) + (8.357563000000000000e+06+8.360247000000000000e+06j) + (8.357619500000000000e+06+8.360023500000000000e+06j) + (8.357370500000000000e+06+8.360080000000000000e+06j) + (8.357555500000000000e+06+8.360391500000000000e+06j) + (8.357758500000000000e+06+8.360335500000000000e+06j) + (8.357796500000000000e+06+8.360466000000000000e+06j) + (8.357994000000000000e+06+8.360426500000000000e+06j) + (8.357830000000000000e+06+8.360061000000000000e+06j) + (8.357754000000000000e+06+8.360391500000000000e+06j) + (8.357707500000000000e+06+8.360680500000000000e+06j) + (8.358126500000000000e+06+8.360801000000000000e+06j) + (8.357967500000000000e+06+8.360670500000000000e+06j) + (8.357925500000000000e+06+8.360407500000000000e+06j) + (8.358146500000000000e+06+8.360712500000000000e+06j) + (8.358280500000000000e+06+8.360684000000000000e+06j) + (8.358224500000000000e+06+8.360634500000000000e+06j) + (8.358232500000000000e+06+8.360545500000000000e+06j) + (8.358117500000000000e+06+8.360564000000000000e+06j) + (8.358337000000000000e+06+8.360801000000000000e+06j) + (8.358212000000000000e+06+8.360774500000000000e+06j) + (8.358179500000000000e+06+8.360812500000000000e+06j) + (8.358236000000000000e+06+8.360805500000000000e+06j) + (8.358547500000000000e+06+8.360912500000000000e+06j) + (8.358509000000000000e+06+8.360860000000000000e+06j) + (8.358427000000000000e+06+8.361074000000000000e+06j) + (8.358734000000000000e+06+8.361315000000000000e+06j) + (8.359037500000000000e+06+8.361382000000000000e+06j) + (8.358759000000000000e+06+8.361304000000000000e+06j) + (8.358816000000000000e+06+8.361136500000000000e+06j) + (8.359130000000000000e+06+8.361198500000000000e+06j) + (8.359015500000000000e+06+8.361644500000000000e+06j) + (8.359108500000000000e+06+8.361160000000000000e+06j) + (8.358728000000000000e+06+8.361256000000000000e+06j) + (8.358898500000000000e+06+8.361231000000000000e+06j) + (8.359065500000000000e+06+8.361460000000000000e+06j) + (8.359322500000000000e+06+8.361362000000000000e+06j) + (8.359080500000000000e+06+8.361593500000000000e+06j) + (8.359302000000000000e+06+8.361546000000000000e+06j) + (8.359139000000000000e+06+8.361634500000000000e+06j) + (8.359262000000000000e+06+8.361448000000000000e+06j) + (8.359216000000000000e+06+8.361412000000000000e+06j) + (8.359505500000000000e+06+8.361435000000000000e+06j) + (8.359447500000000000e+06+8.361529000000000000e+06j) + (8.359481500000000000e+06+8.361612500000000000e+06j) + (8.359483500000000000e+06+8.361833000000000000e+06j) + (8.359418500000000000e+06+8.361650500000000000e+06j) + (8.359771000000000000e+06+8.362031000000000000e+06j) + (8.359656500000000000e+06+8.361778500000000000e+06j) + (8.359521500000000000e+06+8.361841500000000000e+06j) + (8.359731500000000000e+06+8.361932500000000000e+06j) + (8.359556500000000000e+06+8.362038500000000000e+06j) + (8.360103500000000000e+06+8.362117500000000000e+06j) + (8.359785000000000000e+06+8.362110500000000000e+06j) + (8.359576000000000000e+06+8.362230000000000000e+06j) + (8.359834000000000000e+06+8.362033500000000000e+06j) + (8.360023000000000000e+06+8.362154500000000000e+06j) + (8.360301000000000000e+06+8.362223500000000000e+06j) + (8.359927000000000000e+06+8.362106000000000000e+06j) + (8.360215500000000000e+06+8.362148000000000000e+06j) + (8.360263000000000000e+06+8.362264500000000000e+06j) + (8.360263000000000000e+06+8.362399500000000000e+06j) + (8.360319500000000000e+06+8.362266500000000000e+06j) + (8.360607000000000000e+06+8.362167500000000000e+06j) + (8.360294000000000000e+06+8.362161500000000000e+06j) + (8.360378500000000000e+06+8.362484500000000000e+06j) + (8.360769000000000000e+06+8.362385000000000000e+06j) + (8.360491500000000000e+06+8.362623000000000000e+06j) + (8.360300500000000000e+06+8.362328500000000000e+06j) + (8.360927000000000000e+06+8.362365500000000000e+06j) + (8.360711000000000000e+06+8.362666000000000000e+06j) + (8.360823500000000000e+06+8.362705000000000000e+06j) + (8.360527000000000000e+06+8.362968000000000000e+06j) + (8.360676500000000000e+06+8.362999000000000000e+06j) + (8.360493000000000000e+06+8.362632500000000000e+06j) + (8.360724000000000000e+06+8.363023000000000000e+06j) + (8.360616500000000000e+06+8.362785000000000000e+06j) + (8.361081000000000000e+06+8.362864500000000000e+06j) + (8.360916000000000000e+06+8.362723500000000000e+06j) + (8.361013500000000000e+06+8.363015500000000000e+06j) + (8.361131000000000000e+06+8.363050000000000000e+06j) + (8.360938500000000000e+06+8.363280000000000000e+06j) + (8.361671500000000000e+06+8.363168000000000000e+06j) + (8.361575500000000000e+06+8.363243000000000000e+06j) + (8.361553000000000000e+06+8.363277500000000000e+06j) + (8.361483000000000000e+06+8.363483000000000000e+06j) + (8.361594500000000000e+06+8.363559500000000000e+06j) + (8.361495000000000000e+06+8.363281000000000000e+06j) + (8.361554000000000000e+06+8.363359500000000000e+06j) + (8.361603000000000000e+06+8.363270000000000000e+06j) + (8.361646500000000000e+06+8.363337500000000000e+06j) + (8.361925000000000000e+06+8.363434000000000000e+06j) + (8.361486500000000000e+06+8.363402000000000000e+06j) + (8.362111500000000000e+06+8.363725000000000000e+06j) + (8.362101500000000000e+06+8.364128000000000000e+06j) + (8.361590000000000000e+06+8.363848000000000000e+06j) + (8.362237000000000000e+06+8.363701000000000000e+06j) + (8.361791000000000000e+06+8.363717500000000000e+06j) + (8.362275000000000000e+06+8.363746500000000000e+06j) + (8.362148000000000000e+06+8.363805000000000000e+06j) + (8.362214000000000000e+06+8.364109000000000000e+06j) + (8.362264500000000000e+06+8.364100500000000000e+06j) + (8.362468500000000000e+06+8.363959500000000000e+06j) + (8.362481000000000000e+06+8.364176500000000000e+06j) + (8.362404500000000000e+06+8.364112000000000000e+06j) + (8.362494500000000000e+06+8.364413000000000000e+06j) + (8.362447000000000000e+06+8.364366500000000000e+06j) + (8.362642500000000000e+06+8.364388500000000000e+06j) + (8.362428000000000000e+06+8.364134500000000000e+06j) + (8.362832500000000000e+06+8.364109500000000000e+06j) + (8.362847000000000000e+06+8.364258500000000000e+06j) + (8.362710000000000000e+06+8.364445000000000000e+06j) + (8.363054000000000000e+06+8.364600000000000000e+06j) + (8.362973500000000000e+06+8.364582000000000000e+06j) + (8.362947500000000000e+06+8.364678500000000000e+06j) + (8.363079000000000000e+06+8.364663000000000000e+06j) + (8.362890000000000000e+06+8.364480500000000000e+06j) + (8.362941500000000000e+06+8.364564000000000000e+06j) + (8.362806500000000000e+06+8.364567500000000000e+06j) + (8.363075000000000000e+06+8.364704000000000000e+06j) + (8.363314500000000000e+06+8.365005500000000000e+06j) + (8.363296000000000000e+06+8.364863000000000000e+06j) + (8.363705500000000000e+06+8.364962000000000000e+06j) + (8.363393000000000000e+06+8.365013500000000000e+06j) + (8.363610500000000000e+06+8.365184000000000000e+06j) + (8.363336000000000000e+06+8.365232000000000000e+06j) + (8.363727500000000000e+06+8.365057000000000000e+06j) + (8.363583000000000000e+06+8.365205500000000000e+06j) diff --git a/frappy_psi/network_analysers/mRS/short.txt b/frappy_psi/network_analysers/mRS/short.txt new file mode 100644 index 00000000..08720298 --- /dev/null +++ b/frappy_psi/network_analysers/mRS/short.txt @@ -0,0 +1,512 @@ + (8.385667000000000000e+06+8.384307500000000000e+06j) + (8.385636500000000000e+06+8.383965500000000000e+06j) + (8.385790500000000000e+06+8.384234500000000000e+06j) + (8.385286500000000000e+06+8.384065500000000000e+06j) + (8.385371000000000000e+06+8.383834500000000000e+06j) + (8.385634000000000000e+06+8.383886500000000000e+06j) + (8.399140500000000000e+06+8.400726500000000000e+06j) + (8.397174000000000000e+06+8.397423000000000000e+06j) + (8.395836000000000000e+06+8.396709500000000000e+06j) + (8.395416000000000000e+06+8.396093500000000000e+06j) + (8.394981500000000000e+06+8.395751000000000000e+06j) + (8.395058500000000000e+06+8.395818500000000000e+06j) + (8.394843000000000000e+06+8.395904500000000000e+06j) + (8.395118000000000000e+06+8.395530000000000000e+06j) + (8.395054500000000000e+06+8.395711500000000000e+06j) + (8.395172500000000000e+06+8.395394000000000000e+06j) + (8.395146000000000000e+06+8.395875000000000000e+06j) + (8.395212500000000000e+06+8.395734000000000000e+06j) + (8.395040000000000000e+06+8.395668500000000000e+06j) + (8.395521000000000000e+06+8.395597500000000000e+06j) + (8.395414500000000000e+06+8.395610000000000000e+06j) + (8.395087000000000000e+06+8.395914000000000000e+06j) + (8.395189000000000000e+06+8.395755000000000000e+06j) + (8.395198500000000000e+06+8.395594000000000000e+06j) + (8.395250000000000000e+06+8.395684500000000000e+06j) + (8.395252500000000000e+06+8.395604000000000000e+06j) + (8.395474000000000000e+06+8.396010000000000000e+06j) + (8.395257000000000000e+06+8.395914000000000000e+06j) + (8.395637000000000000e+06+8.396055500000000000e+06j) + (8.395429500000000000e+06+8.396156500000000000e+06j) + (8.395295000000000000e+06+8.395638000000000000e+06j) + (8.395339000000000000e+06+8.396107500000000000e+06j) + (8.395497500000000000e+06+8.395815000000000000e+06j) + (8.395572000000000000e+06+8.396204500000000000e+06j) + (8.395621000000000000e+06+8.395741000000000000e+06j) + (8.395588000000000000e+06+8.395658000000000000e+06j) + (8.395571000000000000e+06+8.395923500000000000e+06j) + (8.395569000000000000e+06+8.395976000000000000e+06j) + (8.395427500000000000e+06+8.395962000000000000e+06j) + (8.395463000000000000e+06+8.396254500000000000e+06j) + (8.395696000000000000e+06+8.395941000000000000e+06j) + (8.395356000000000000e+06+8.395756000000000000e+06j) + (8.395645000000000000e+06+8.396018500000000000e+06j) + (8.395837500000000000e+06+8.396121000000000000e+06j) + (8.395609000000000000e+06+8.396417000000000000e+06j) + (8.395586000000000000e+06+8.396093000000000000e+06j) + (8.395452000000000000e+06+8.396341500000000000e+06j) + (8.395841500000000000e+06+8.395961500000000000e+06j) + (8.395813500000000000e+06+8.396154000000000000e+06j) + (8.395686500000000000e+06+8.396429000000000000e+06j) + (8.395560000000000000e+06+8.396047000000000000e+06j) + (8.395921500000000000e+06+8.396279500000000000e+06j) + (8.395718500000000000e+06+8.396111000000000000e+06j) + (8.395761500000000000e+06+8.395715000000000000e+06j) + (8.395951000000000000e+06+8.396298000000000000e+06j) + (8.395848000000000000e+06+8.396028500000000000e+06j) + (8.395736000000000000e+06+8.396124500000000000e+06j) + (8.395876500000000000e+06+8.396254500000000000e+06j) + (8.395787000000000000e+06+8.396103000000000000e+06j) + (8.395863500000000000e+06+8.396129500000000000e+06j) + (8.395969000000000000e+06+8.396246500000000000e+06j) + (8.396178000000000000e+06+8.396184500000000000e+06j) + (8.395832000000000000e+06+8.396177000000000000e+06j) + (8.395908500000000000e+06+8.396461000000000000e+06j) + (8.395947000000000000e+06+8.396416000000000000e+06j) + (8.395815000000000000e+06+8.396041500000000000e+06j) + (8.396048500000000000e+06+8.396078500000000000e+06j) + (8.395978500000000000e+06+8.396455000000000000e+06j) + (8.396176500000000000e+06+8.396419000000000000e+06j) + (8.396197000000000000e+06+8.396073000000000000e+06j) + (8.396211000000000000e+06+8.396405000000000000e+06j) + (8.396332000000000000e+06+8.396708000000000000e+06j) + (8.396247500000000000e+06+8.396729500000000000e+06j) + (8.396303000000000000e+06+8.396311000000000000e+06j) + (8.396235500000000000e+06+8.396432500000000000e+06j) + (8.396176500000000000e+06+8.396452500000000000e+06j) + (8.396445000000000000e+06+8.396832500000000000e+06j) + (8.396296500000000000e+06+8.396452500000000000e+06j) + (8.396640500000000000e+06+8.396450500000000000e+06j) + (8.396556000000000000e+06+8.396796500000000000e+06j) + (8.396642000000000000e+06+8.396397000000000000e+06j) + (8.396336000000000000e+06+8.396562500000000000e+06j) + (8.396363000000000000e+06+8.396423500000000000e+06j) + (8.396236000000000000e+06+8.396481000000000000e+06j) + (8.396368500000000000e+06+8.396635500000000000e+06j) + (8.396471500000000000e+06+8.396847500000000000e+06j) + (8.396162000000000000e+06+8.396555000000000000e+06j) + (8.396430500000000000e+06+8.396504000000000000e+06j) + (8.396503000000000000e+06+8.396966000000000000e+06j) + (8.396334500000000000e+06+8.396440500000000000e+06j) + (8.396709500000000000e+06+8.396671500000000000e+06j) + (8.396899500000000000e+06+8.396954000000000000e+06j) + (8.396808000000000000e+06+8.396875000000000000e+06j) + (8.396648500000000000e+06+8.396694000000000000e+06j) + (8.396850000000000000e+06+8.396807500000000000e+06j) + (8.396889500000000000e+06+8.397189000000000000e+06j) + (8.396816500000000000e+06+8.397160500000000000e+06j) + (8.396759000000000000e+06+8.396997500000000000e+06j) + (8.396771000000000000e+06+8.397231000000000000e+06j) + (8.396772500000000000e+06+8.397023000000000000e+06j) + (8.396985000000000000e+06+8.397185500000000000e+06j) + (8.396998500000000000e+06+8.397255000000000000e+06j) + (8.397182500000000000e+06+8.396889500000000000e+06j) + (8.397074500000000000e+06+8.397141000000000000e+06j) + (8.397148500000000000e+06+8.397360500000000000e+06j) + (8.397393000000000000e+06+8.397193000000000000e+06j) + (8.397238500000000000e+06+8.397328500000000000e+06j) + (8.397241000000000000e+06+8.397169000000000000e+06j) + (8.397159000000000000e+06+8.397606000000000000e+06j) + (8.397243000000000000e+06+8.397550500000000000e+06j) + (8.397365000000000000e+06+8.397437000000000000e+06j) + (8.397485500000000000e+06+8.397441000000000000e+06j) + (8.397380000000000000e+06+8.397509000000000000e+06j) + (8.397639000000000000e+06+8.397717000000000000e+06j) + (8.397759000000000000e+06+8.397882000000000000e+06j) + (8.397681000000000000e+06+8.397790500000000000e+06j) + (8.397782000000000000e+06+8.397981500000000000e+06j) + (8.397811500000000000e+06+8.398170500000000000e+06j) + (8.398046000000000000e+06+8.398516500000000000e+06j) + (8.397892500000000000e+06+8.398110500000000000e+06j) + (8.398301000000000000e+06+8.398166000000000000e+06j) + (8.398386500000000000e+06+8.398215000000000000e+06j) + (8.398181500000000000e+06+8.398182500000000000e+06j) + (8.398467000000000000e+06+8.398309000000000000e+06j) + (8.398555500000000000e+06+8.398632500000000000e+06j) + (8.398604000000000000e+06+8.398818000000000000e+06j) + (8.398328000000000000e+06+8.398630500000000000e+06j) + (8.398661500000000000e+06+8.398766500000000000e+06j) + (8.398551500000000000e+06+8.398653000000000000e+06j) + (8.398731000000000000e+06+8.398595000000000000e+06j) + (8.399063000000000000e+06+8.398526500000000000e+06j) + (8.398811500000000000e+06+8.398762500000000000e+06j) + (8.399057500000000000e+06+8.398865000000000000e+06j) + (8.399263500000000000e+06+8.399098000000000000e+06j) + (8.399199000000000000e+06+8.399001500000000000e+06j) + (8.399187000000000000e+06+8.399206000000000000e+06j) + (8.399470500000000000e+06+8.398995000000000000e+06j) + (8.399542000000000000e+06+8.399119000000000000e+06j) + (8.399272500000000000e+06+8.399335500000000000e+06j) + (8.399459500000000000e+06+8.399404000000000000e+06j) + (8.399563000000000000e+06+8.399334500000000000e+06j) + (8.399296500000000000e+06+8.399319500000000000e+06j) + (8.399390500000000000e+06+8.399391000000000000e+06j) + (8.399365000000000000e+06+8.399060000000000000e+06j) + (8.399365000000000000e+06+8.399208000000000000e+06j) + (8.399413500000000000e+06+8.398997000000000000e+06j) + (8.399731000000000000e+06+8.399115500000000000e+06j) + (8.399357500000000000e+06+8.399415000000000000e+06j) + (8.399317500000000000e+06+8.399244000000000000e+06j) + (8.399074500000000000e+06+8.399319500000000000e+06j) + (8.398957000000000000e+06+8.399221000000000000e+06j) + (8.399023500000000000e+06+8.398615000000000000e+06j) + (8.398738000000000000e+06+8.398931500000000000e+06j) + (8.398793500000000000e+06+8.398579000000000000e+06j) + (8.398502000000000000e+06+8.398284000000000000e+06j) + (8.398380000000000000e+06+8.398319500000000000e+06j) + (8.398317000000000000e+06+8.398223500000000000e+06j) + (8.398336500000000000e+06+8.398139500000000000e+06j) + (8.398256000000000000e+06+8.397987500000000000e+06j) + (8.397990500000000000e+06+8.397907500000000000e+06j) + (8.397970500000000000e+06+8.397661000000000000e+06j) + (8.397727500000000000e+06+8.397881000000000000e+06j) + (8.397686000000000000e+06+8.397289000000000000e+06j) + (8.397473000000000000e+06+8.397194000000000000e+06j) + (8.397243500000000000e+06+8.397239000000000000e+06j) + (8.397064500000000000e+06+8.396977500000000000e+06j) + (8.396965000000000000e+06+8.396686000000000000e+06j) + (8.397255500000000000e+06+8.396922000000000000e+06j) + (8.396775000000000000e+06+8.396572500000000000e+06j) + (8.396783000000000000e+06+8.396595500000000000e+06j) + (8.396958000000000000e+06+8.396425000000000000e+06j) + (8.396695000000000000e+06+8.396348000000000000e+06j) + (8.396515500000000000e+06+8.396301500000000000e+06j) + (8.396361500000000000e+06+8.396590000000000000e+06j) + (8.396288500000000000e+06+8.396021000000000000e+06j) + (8.396401000000000000e+06+8.395978000000000000e+06j) + (8.396043000000000000e+06+8.395744000000000000e+06j) + (8.396111000000000000e+06+8.396230500000000000e+06j) + (8.396214000000000000e+06+8.395743500000000000e+06j) + (8.395986000000000000e+06+8.395950000000000000e+06j) + (8.395854000000000000e+06+8.395805000000000000e+06j) + (8.395685000000000000e+06+8.395310500000000000e+06j) + (8.395567000000000000e+06+8.395366000000000000e+06j) + (8.395502500000000000e+06+8.395337500000000000e+06j) + (8.395268500000000000e+06+8.395121000000000000e+06j) + (8.395241000000000000e+06+8.394993000000000000e+06j) + (8.395152000000000000e+06+8.395186000000000000e+06j) + (8.395170500000000000e+06+8.394755000000000000e+06j) + (8.395093000000000000e+06+8.395001500000000000e+06j) + (8.395064000000000000e+06+8.395015500000000000e+06j) + (8.395185000000000000e+06+8.394729500000000000e+06j) + (8.394882500000000000e+06+8.394444000000000000e+06j) + (8.394670500000000000e+06+8.394234000000000000e+06j) + (8.394511000000000000e+06+8.394110000000000000e+06j) + (8.394464500000000000e+06+8.394287000000000000e+06j) + (8.394173000000000000e+06+8.394577500000000000e+06j) + (8.394518500000000000e+06+8.394019000000000000e+06j) + (8.394236500000000000e+06+8.394119500000000000e+06j) + (8.394394000000000000e+06+8.394069500000000000e+06j) + (8.394666000000000000e+06+8.393757000000000000e+06j) + (8.394421500000000000e+06+8.394270500000000000e+06j) + (8.394041000000000000e+06+8.393837500000000000e+06j) + (8.393869500000000000e+06+8.393718000000000000e+06j) + (8.393931000000000000e+06+8.393752500000000000e+06j) + (8.393983000000000000e+06+8.393306000000000000e+06j) + (8.394060500000000000e+06+8.393546000000000000e+06j) + (8.393488000000000000e+06+8.393438000000000000e+06j) + (8.393584000000000000e+06+8.393560500000000000e+06j) + (8.393759500000000000e+06+8.393198000000000000e+06j) + (8.393413000000000000e+06+8.393231000000000000e+06j) + (8.393289000000000000e+06+8.393200000000000000e+06j) + (8.393595000000000000e+06+8.393265000000000000e+06j) + (8.393325000000000000e+06+8.393077500000000000e+06j) + (8.393346000000000000e+06+8.392879500000000000e+06j) + (8.393201000000000000e+06+8.392959000000000000e+06j) + (8.393423500000000000e+06+8.393239000000000000e+06j) + (8.393318500000000000e+06+8.393290500000000000e+06j) + (8.393183000000000000e+06+8.393101000000000000e+06j) + (8.393185000000000000e+06+8.393199000000000000e+06j) + (8.393416500000000000e+06+8.393047000000000000e+06j) + (8.393276500000000000e+06+8.393075500000000000e+06j) + (8.392810500000000000e+06+8.392877500000000000e+06j) + (8.393088500000000000e+06+8.392893000000000000e+06j) + (8.393100000000000000e+06+8.392807500000000000e+06j) + (8.393488500000000000e+06+8.392777500000000000e+06j) + (8.393497000000000000e+06+8.393050000000000000e+06j) + (8.393366500000000000e+06+8.392763000000000000e+06j) + (8.393268000000000000e+06+8.392913000000000000e+06j) + (8.393269500000000000e+06+8.392641500000000000e+06j) + (8.393355500000000000e+06+8.392841000000000000e+06j) + (8.393471000000000000e+06+8.393044000000000000e+06j) + (8.393233000000000000e+06+8.392791000000000000e+06j) + (8.393588000000000000e+06+8.392706500000000000e+06j) + (8.393249000000000000e+06+8.392891500000000000e+06j) + (8.393544500000000000e+06+8.392775000000000000e+06j) + (8.393478000000000000e+06+8.393101000000000000e+06j) + (8.393605000000000000e+06+8.392981000000000000e+06j) + (8.393534000000000000e+06+8.393194000000000000e+06j) + (8.393461500000000000e+06+8.393132500000000000e+06j) + (8.393543500000000000e+06+8.393149000000000000e+06j) + (8.393254500000000000e+06+8.392959500000000000e+06j) + (8.393546500000000000e+06+8.392912000000000000e+06j) + (8.393279500000000000e+06+8.392944000000000000e+06j) + (8.393579500000000000e+06+8.392974500000000000e+06j) + (8.393264500000000000e+06+8.393242000000000000e+06j) + (8.393417500000000000e+06+8.393322500000000000e+06j) + (8.393644000000000000e+06+8.393299500000000000e+06j) + (8.393462500000000000e+06+8.393153000000000000e+06j) + (8.393410000000000000e+06+8.393070500000000000e+06j) + (8.393798000000000000e+06+8.393173000000000000e+06j) + (8.393551500000000000e+06+8.393332500000000000e+06j) + (8.393685000000000000e+06+8.392890500000000000e+06j) + (8.393504000000000000e+06+8.392762000000000000e+06j) + (8.393403500000000000e+06+8.392908500000000000e+06j) + (8.393350000000000000e+06+8.393318500000000000e+06j) + (8.393448500000000000e+06+8.393053000000000000e+06j) + (8.393186500000000000e+06+8.393019500000000000e+06j) + (8.393570500000000000e+06+8.392983000000000000e+06j) + (8.393539500000000000e+06+8.392957000000000000e+06j) + (8.393754000000000000e+06+8.393165000000000000e+06j) + (8.393721000000000000e+06+8.393209500000000000e+06j) + (8.393583000000000000e+06+8.392959500000000000e+06j) + (8.393572000000000000e+06+8.393372500000000000e+06j) + (8.393566500000000000e+06+8.393085500000000000e+06j) + (8.393619500000000000e+06+8.392952500000000000e+06j) + (8.393537500000000000e+06+8.392817000000000000e+06j) + (8.393724500000000000e+06+8.393247500000000000e+06j) + (8.393776000000000000e+06+8.392905000000000000e+06j) + (8.393706000000000000e+06+8.393108500000000000e+06j) + (8.393490500000000000e+06+8.393329000000000000e+06j) + (8.393641000000000000e+06+8.392889000000000000e+06j) + (8.393774000000000000e+06+8.393136500000000000e+06j) + (8.393574500000000000e+06+8.393034000000000000e+06j) + (8.393943500000000000e+06+8.392873000000000000e+06j) + (8.393428000000000000e+06+8.392889500000000000e+06j) + (8.393530000000000000e+06+8.392745000000000000e+06j) + (8.393472500000000000e+06+8.392758000000000000e+06j) + (8.393109500000000000e+06+8.392884000000000000e+06j) + (8.393313000000000000e+06+8.393074000000000000e+06j) + (8.393712500000000000e+06+8.392796000000000000e+06j) + (8.393769000000000000e+06+8.393095000000000000e+06j) + (8.393493000000000000e+06+8.392645000000000000e+06j) + (8.393620000000000000e+06+8.393015500000000000e+06j) + (8.393406500000000000e+06+8.392953500000000000e+06j) + (8.393428500000000000e+06+8.392560000000000000e+06j) + (8.393236000000000000e+06+8.392521000000000000e+06j) + (8.393196500000000000e+06+8.392476000000000000e+06j) + (8.393324500000000000e+06+8.392707000000000000e+06j) + (8.393389000000000000e+06+8.392780500000000000e+06j) + (8.393291000000000000e+06+8.392574000000000000e+06j) + (8.393402500000000000e+06+8.392778500000000000e+06j) + (8.393213000000000000e+06+8.392492000000000000e+06j) + (8.393144000000000000e+06+8.392548000000000000e+06j) + (8.393182500000000000e+06+8.392488000000000000e+06j) + (8.392954000000000000e+06+8.392678000000000000e+06j) + (8.393091500000000000e+06+8.392505500000000000e+06j) + (8.393219500000000000e+06+8.392049500000000000e+06j) + (8.393152000000000000e+06+8.392668500000000000e+06j) + (8.393195000000000000e+06+8.392571000000000000e+06j) + (8.392995000000000000e+06+8.392478500000000000e+06j) + (8.393010500000000000e+06+8.392656000000000000e+06j) + (8.392847000000000000e+06+8.392315000000000000e+06j) + (8.393265000000000000e+06+8.392568500000000000e+06j) + (8.393313000000000000e+06+8.392590500000000000e+06j) + (8.393040000000000000e+06+8.392435000000000000e+06j) + (8.393110500000000000e+06+8.392488500000000000e+06j) + (8.392996000000000000e+06+8.392488000000000000e+06j) + (8.393539500000000000e+06+8.392262500000000000e+06j) + (8.393002500000000000e+06+8.392364500000000000e+06j) + (8.393073500000000000e+06+8.392408500000000000e+06j) + (8.393048500000000000e+06+8.392302500000000000e+06j) + (8.393101500000000000e+06+8.392325000000000000e+06j) + (8.393257500000000000e+06+8.392431000000000000e+06j) + (8.392907500000000000e+06+8.392077000000000000e+06j) + (8.392962500000000000e+06+8.392211500000000000e+06j) + (8.393260500000000000e+06+8.392183000000000000e+06j) + (8.393190500000000000e+06+8.392197000000000000e+06j) + (8.392742500000000000e+06+8.391771500000000000e+06j) + (8.392888500000000000e+06+8.392176500000000000e+06j) + (8.392710500000000000e+06+8.392084500000000000e+06j) + (8.392818000000000000e+06+8.391851000000000000e+06j) + (8.392707000000000000e+06+8.391993000000000000e+06j) + (8.392725500000000000e+06+8.391786500000000000e+06j) + (8.392507000000000000e+06+8.391816000000000000e+06j) + (8.392743000000000000e+06+8.391983500000000000e+06j) + (8.392775000000000000e+06+8.391692500000000000e+06j) + (8.392431000000000000e+06+8.391745000000000000e+06j) + (8.392321000000000000e+06+8.391532000000000000e+06j) + (8.392477500000000000e+06+8.391836500000000000e+06j) + (8.392244500000000000e+06+8.391534500000000000e+06j) + (8.392471500000000000e+06+8.391745500000000000e+06j) + (8.392315500000000000e+06+8.391718500000000000e+06j) + (8.392443500000000000e+06+8.391551000000000000e+06j) + (8.392470500000000000e+06+8.391403000000000000e+06j) + (8.392113500000000000e+06+8.391120500000000000e+06j) + (8.392165500000000000e+06+8.391288500000000000e+06j) + (8.391993500000000000e+06+8.391251000000000000e+06j) + (8.392065500000000000e+06+8.391225500000000000e+06j) + (8.392160500000000000e+06+8.391071000000000000e+06j) + (8.392016500000000000e+06+8.391615000000000000e+06j) + (8.392045500000000000e+06+8.390976500000000000e+06j) + (8.391875000000000000e+06+8.391109000000000000e+06j) + (8.391832500000000000e+06+8.390903000000000000e+06j) + (8.391799500000000000e+06+8.391308000000000000e+06j) + (8.391937500000000000e+06+8.390740000000000000e+06j) + (8.391732000000000000e+06+8.390921000000000000e+06j) + (8.391814000000000000e+06+8.390930000000000000e+06j) + (8.391899500000000000e+06+8.390844000000000000e+06j) + (8.391498000000000000e+06+8.390973500000000000e+06j) + (8.392123500000000000e+06+8.390921000000000000e+06j) + (8.391833500000000000e+06+8.390515000000000000e+06j) + (8.391984000000000000e+06+8.390999000000000000e+06j) + (8.391483500000000000e+06+8.390719500000000000e+06j) + (8.391806500000000000e+06+8.390740000000000000e+06j) + (8.391654000000000000e+06+8.390854000000000000e+06j) + (8.391723000000000000e+06+8.390646500000000000e+06j) + (8.391497500000000000e+06+8.390394500000000000e+06j) + (8.391567500000000000e+06+8.390652000000000000e+06j) + (8.391485500000000000e+06+8.390556000000000000e+06j) + (8.391582000000000000e+06+8.390692500000000000e+06j) + (8.391370000000000000e+06+8.390141500000000000e+06j) + (8.391529000000000000e+06+8.390255000000000000e+06j) + (8.391452000000000000e+06+8.390660500000000000e+06j) + (8.391648000000000000e+06+8.390581500000000000e+06j) + (8.391531500000000000e+06+8.390712500000000000e+06j) + (8.391817000000000000e+06+8.390289500000000000e+06j) + (8.391420500000000000e+06+8.390414500000000000e+06j) + (8.391412500000000000e+06+8.390543500000000000e+06j) + (8.391285500000000000e+06+8.390131500000000000e+06j) + (8.391549000000000000e+06+8.390230500000000000e+06j) + (8.391210500000000000e+06+8.390215500000000000e+06j) + (8.391255500000000000e+06+8.390106500000000000e+06j) + (8.391070000000000000e+06+8.390260000000000000e+06j) + (8.391228000000000000e+06+8.390303000000000000e+06j) + (8.390890500000000000e+06+8.390247500000000000e+06j) + (8.391171000000000000e+06+8.390213500000000000e+06j) + (8.391234000000000000e+06+8.389817000000000000e+06j) + (8.390988500000000000e+06+8.389951500000000000e+06j) + (8.391196000000000000e+06+8.389607500000000000e+06j) + (8.390673500000000000e+06+8.389852000000000000e+06j) + (8.390712500000000000e+06+8.389754500000000000e+06j) + (8.390610000000000000e+06+8.389778500000000000e+06j) + (8.390809500000000000e+06+8.389831000000000000e+06j) + (8.390731500000000000e+06+8.389624500000000000e+06j) + (8.391127000000000000e+06+8.389613000000000000e+06j) + (8.390676000000000000e+06+8.389778000000000000e+06j) + (8.390762000000000000e+06+8.389732500000000000e+06j) + (8.390574500000000000e+06+8.389346500000000000e+06j) + (8.390702000000000000e+06+8.389736500000000000e+06j) + (8.390640500000000000e+06+8.389479500000000000e+06j) + (8.390443500000000000e+06+8.389715000000000000e+06j) + (8.390876000000000000e+06+8.389685500000000000e+06j) + (8.390766500000000000e+06+8.389545500000000000e+06j) + (8.390612000000000000e+06+8.389520000000000000e+06j) + (8.390539500000000000e+06+8.389576500000000000e+06j) + (8.390512000000000000e+06+8.389313500000000000e+06j) + (8.390385500000000000e+06+8.389224000000000000e+06j) + (8.390530000000000000e+06+8.389149500000000000e+06j) + (8.390064500000000000e+06+8.389277500000000000e+06j) + (8.390132500000000000e+06+8.389273500000000000e+06j) + (8.390220000000000000e+06+8.388913500000000000e+06j) + (8.390081500000000000e+06+8.389129000000000000e+06j) + (8.390235000000000000e+06+8.389152000000000000e+06j) + (8.390174000000000000e+06+8.389044500000000000e+06j) + (8.389801000000000000e+06+8.388986000000000000e+06j) + (8.390000500000000000e+06+8.389149500000000000e+06j) + (8.390224000000000000e+06+8.388880000000000000e+06j) + (8.389718000000000000e+06+8.389006500000000000e+06j) + (8.390161500000000000e+06+8.389077500000000000e+06j) + (8.389984000000000000e+06+8.388413500000000000e+06j) + (8.389837500000000000e+06+8.388952000000000000e+06j) + (8.390120500000000000e+06+8.388709000000000000e+06j) + (8.390051500000000000e+06+8.388711000000000000e+06j) + (8.390099000000000000e+06+8.388797000000000000e+06j) + (8.389775000000000000e+06+8.388617500000000000e+06j) + (8.389785500000000000e+06+8.388293500000000000e+06j) + (8.389708500000000000e+06+8.388560000000000000e+06j) + (8.389902000000000000e+06+8.388612000000000000e+06j) + (8.389703000000000000e+06+8.388427000000000000e+06j) + (8.389722000000000000e+06+8.388688000000000000e+06j) + (8.389742500000000000e+06+8.388382000000000000e+06j) + (8.389639500000000000e+06+8.388505500000000000e+06j) + (8.390153000000000000e+06+8.388312500000000000e+06j) + (8.389495000000000000e+06+8.388356000000000000e+06j) + (8.389980000000000000e+06+8.388667000000000000e+06j) + (8.389390500000000000e+06+8.388503000000000000e+06j) + (8.389341500000000000e+06+8.388218000000000000e+06j) + (8.389382000000000000e+06+8.387973000000000000e+06j) + (8.389449500000000000e+06+8.388178500000000000e+06j) + (8.389468500000000000e+06+8.387971000000000000e+06j) + (8.389368500000000000e+06+8.388039500000000000e+06j) + (8.389173000000000000e+06+8.387755000000000000e+06j) + (8.389378500000000000e+06+8.387974500000000000e+06j) + (8.389314500000000000e+06+8.387880000000000000e+06j) + (8.389153000000000000e+06+8.387995000000000000e+06j) + (8.388979500000000000e+06+8.387798500000000000e+06j) + (8.389121000000000000e+06+8.387767500000000000e+06j) + (8.389040000000000000e+06+8.387720500000000000e+06j) + (8.389135000000000000e+06+8.387620000000000000e+06j) + (8.389012500000000000e+06+8.388011500000000000e+06j) + (8.388980000000000000e+06+8.387632000000000000e+06j) + (8.388964000000000000e+06+8.387583000000000000e+06j) + (8.388779000000000000e+06+8.387457500000000000e+06j) + (8.388935000000000000e+06+8.387466500000000000e+06j) + (8.388629500000000000e+06+8.387498000000000000e+06j) + (8.388763500000000000e+06+8.387506500000000000e+06j) + (8.389004000000000000e+06+8.387733500000000000e+06j) + (8.388627000000000000e+06+8.387525500000000000e+06j) + (8.388498500000000000e+06+8.387207500000000000e+06j) + (8.388575000000000000e+06+8.387171500000000000e+06j) + (8.388183000000000000e+06+8.387255500000000000e+06j) + (8.388390000000000000e+06+8.386965000000000000e+06j) + (8.388363000000000000e+06+8.386958500000000000e+06j) + (8.388193500000000000e+06+8.387068000000000000e+06j) + (8.388336500000000000e+06+8.386769500000000000e+06j) + (8.388323000000000000e+06+8.387085500000000000e+06j) + (8.388039000000000000e+06+8.386946000000000000e+06j) + (8.388103000000000000e+06+8.387187500000000000e+06j) + (8.388137000000000000e+06+8.386652500000000000e+06j) + (8.388015000000000000e+06+8.386750500000000000e+06j) + (8.388340000000000000e+06+8.386979000000000000e+06j) + (8.388442500000000000e+06+8.386931000000000000e+06j) + (8.387821500000000000e+06+8.386628000000000000e+06j) + (8.387926500000000000e+06+8.386365000000000000e+06j) + (8.387697500000000000e+06+8.386562000000000000e+06j) + (8.388090500000000000e+06+8.386393500000000000e+06j) + (8.387813000000000000e+06+8.386557500000000000e+06j) + (8.387832500000000000e+06+8.386187000000000000e+06j) + (8.388003500000000000e+06+8.386421000000000000e+06j) + (8.387758000000000000e+06+8.386512000000000000e+06j) + (8.387368000000000000e+06+8.386613500000000000e+06j) + (8.388145000000000000e+06+8.386433500000000000e+06j) + (8.387606500000000000e+06+8.386117000000000000e+06j) + (8.387710500000000000e+06+8.386119000000000000e+06j) + (8.387440000000000000e+06+8.386229000000000000e+06j) + (8.387440000000000000e+06+8.386223500000000000e+06j) + (8.387472000000000000e+06+8.385968000000000000e+06j) + (8.387494500000000000e+06+8.386050500000000000e+06j) + (8.387669000000000000e+06+8.386171000000000000e+06j) + (8.387336000000000000e+06+8.385965500000000000e+06j) + (8.387462000000000000e+06+8.385955000000000000e+06j) + (8.387306500000000000e+06+8.385734000000000000e+06j) + (8.387279500000000000e+06+8.385672000000000000e+06j) + (8.387227000000000000e+06+8.385553500000000000e+06j) + (8.387041500000000000e+06+8.385544000000000000e+06j) + (8.387028000000000000e+06+8.385838500000000000e+06j) + (8.387087500000000000e+06+8.385639500000000000e+06j) + (8.387197000000000000e+06+8.385687000000000000e+06j) + (8.387131000000000000e+06+8.385668500000000000e+06j) + (8.387356000000000000e+06+8.385775000000000000e+06j) + (8.387359000000000000e+06+8.385625000000000000e+06j) + (8.386991500000000000e+06+8.385656500000000000e+06j) + (8.387146000000000000e+06+8.385554500000000000e+06j) + (8.386874500000000000e+06+8.385631000000000000e+06j) + (8.386935500000000000e+06+8.385544000000000000e+06j) + (8.386813500000000000e+06+8.385385000000000000e+06j) + (8.386678500000000000e+06+8.385405000000000000e+06j) + (8.386534500000000000e+06+8.385293000000000000e+06j) + (8.386517500000000000e+06+8.385638500000000000e+06j) + (8.386699500000000000e+06+8.385362000000000000e+06j) + (8.386421500000000000e+06+8.385207500000000000e+06j) + (8.386783000000000000e+06+8.384978000000000000e+06j) + (8.386512500000000000e+06+8.384933000000000000e+06j) + (8.386544000000000000e+06+8.385165500000000000e+06j) + (8.386627000000000000e+06+8.385115000000000000e+06j) + (8.386277000000000000e+06+8.384790500000000000e+06j) + (8.386113500000000000e+06+8.384894500000000000e+06j) + (8.386580500000000000e+06+8.384664000000000000e+06j) + (8.386204500000000000e+06+8.384761000000000000e+06j) + (8.386087500000000000e+06+8.384669000000000000e+06j) + (8.386153500000000000e+06+8.384801500000000000e+06j) + (8.386219000000000000e+06+8.384759500000000000e+06j) diff --git a/frappy_psi/tnmr/OTFModule.py b/frappy_psi/tnmr/OTFModule.py index abd10c6d..d240f6bf 100644 --- a/frappy_psi/tnmr/OTFModule.py +++ b/frappy_psi/tnmr/OTFModule.py @@ -39,7 +39,7 @@ class ProgrammedSequence(fc.Readable): Attributes ---------- value: an array of complexes representing the TNMR data return (technically inherited from Readable) - sequence_data: an array of structs: keys are { 'pulse_width': (width of pulse in us), 'pulse_height': (amplitude of pulse in a.u.), 'delay_time': (delay time in us), 'phase_cycle': (a str denoting a phase cycle, e.g., '0 1 2 3') } + sequence_data: an array of structs: keys are { 'pulse_width': (width of pulse in us), 'pulse_height': (amplitude of pulse in percentage - 30 is 30%, 0.3 is 0.3% etc.), 'delay_time': (delay time in us), 'phase_cycle': (a str denoting a phase cycle, e.g., '0 1 2 3') } Acquisition Parameters ---------------------- @@ -77,16 +77,16 @@ class ProgrammedSequence(fc.Readable): # basic title = fc.Parameter('title', fc.StringType(), default='Sequence', readonly=False) - sequence_data = fc.Parameter('sequence_config', fc.ArrayOf(fc.StructOf(pulse_width=fc.FloatRange(unit='u'), - pulse_height=fc.FloatRange(), - delay_time=fc.FloatRange(unit='u'), + sequence_data = fc.Parameter('sequence_config', fc.ArrayOf(fc.StructOf(pulse_width=fc.FloatRange(unit='usecs'), + pulse_height=fc.FloatRange(unit='%'), + delay_time=fc.FloatRange(unit='usecs'), phase_cycle=fc.StringType())), default=[], readonly=False) # final details - acquisition_time = fc.Parameter('acquisition_time', fc.FloatRange(unit='u'), readonly=False, group='sequence_editor', default=204.8) # this is a limit set by the dwell limit and number of acquisition points - ringdown_time = fc.Parameter('ringdown_time', fc.FloatRange(unit='u'), readonly=False, group='sequence_editor', default=1) - pre_acquisition_time = fc.Parameter('pre_acquisition_time', fc.FloatRange(unit='u'), readonly=False, group='sequence_editor', default=1) - post_acquisition_time = fc.Parameter('post_acquisition_time', fc.FloatRange(unit='m'), readonly=False, group='sequence_editor', default=500) + acquisition_time = fc.Parameter('acquisition_time', fc.FloatRange(unit='usecs'), readonly=False, group='sequence_editor', default=204.8) # this is a limit set by the dwell limit and number of acquisition points + ringdown_time = fc.Parameter('ringdown_time', fc.FloatRange(unit='usecs'), readonly=False, group='sequence_editor', default=1) + pre_acquisition_time = fc.Parameter('pre_acquisition_time', fc.FloatRange(unit='usecs'), readonly=False, group='sequence_editor', default=1) + post_acquisition_time = fc.Parameter('post_acquisition_time', fc.FloatRange(unit='msecs'), readonly=False, group='sequence_editor', default=500) acq_phase_cycle = fc.Parameter('acq_phase_cycle', fc.StringType(), readonly=False, group='sequence_editor', default='') num_scans = fc.Parameter('num_scans', fc.IntRange(), readonly=False, group='sequence_editor', default=16) obs_freq = fc.Parameter('obs_freq', fc.FloatRange(unit='MHz'), readonly=False, group='sequence_editor', default=213.16) diff --git a/frappy_psi/uniaxial_cell/RP100.py b/frappy_psi/uniaxial_cell/RP100.py new file mode 100644 index 00000000..6680a69a --- /dev/null +++ b/frappy_psi/uniaxial_cell/RP100.py @@ -0,0 +1,132 @@ +# ***************************************************************************** +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# Module authors: +# Paul M. Neves +# ***************************************************************************** + +from frappy.core import Readable, Parameter, FloatRange, HasIO, StringIO, Property, IntRange,\ + IDLE, BUSY, WARN, ERROR, Drivable, BoolType, Attached +from ast import literal_eval + + +class RP100IO(StringIO): + """communication with RP100""" + end_of_line = '\n' + #wait_before = 0.05 + identification = [('*IDN?', r'Razorbill,.*')] + + +class VoltageChannel(HasIO, Drivable): + """a voltage output with loop""" + + temp = Attached('frappy.core.Readable', mandatory=False) + + # define the communication class for automatic creation of the IO module + ioClass = RP100IO + + # internal property to configure the channel + channel = Property('the voltage channel', datatype=IntRange(1,2)) + + # modifying a property of inherited parameters (unit is propagated to the FloatRange datatype) + value = Parameter('output voltage', FloatRange(-210, 210, unit='V'), + readonly=True) + target = Parameter('target voltage', FloatRange(-210, 210, unit='V'), + readonly=False) + meas_voltage = Parameter('measured output voltage', FloatRange(-250, 250, unit='V'), + readonly=True) + meas_current = Parameter('measured output current', FloatRange(-0.007, 0.007, unit='A'), + readonly=True) + max_target = Parameter('max. target', FloatRange(0, 210, unit='V'), readonly=False, default=210) + min_target = Parameter('max. target', FloatRange(-210, 0, unit='V'), readonly=False, default=-210) + slew_rate = Parameter('voltage slew rate', FloatRange(0.1e-3, 100e3, unit='V/s'), readonly=False, default=1) + output_state = Parameter('output on or off', BoolType(), readonly=False) + + def doPoll(self): + super().doPoll() + + # calculate temperature dependent voltage limits + if(self.temp): + temp = self.temp.target + if temp > 250: + self.max_target = 120 + self.min_target = -20 + elif temp >= 100: + self.max_target = 120 + self.min_target = -50 + (temp-100)/5 + elif temp >= 10: + self.max_target = 200 - 8*(temp-10)/9 + self.min_target = -200 + 5*(temp-10)/3 + elif temp < 10: + self.max_target = 200 + self.min_target = -200 + + # if the current voltage exceeds these limits, reduce voltage to max/min + if self.target > self.max_target: + self.write_target(self.max_target) + if self.target < self.min_target: + self.write_target(self.min_target) + + def read_value(self): + # using the inherited HasIO.communicate method to send a command and get the reply + reply = self.communicate(f'SOUR{self.channel}:VOLT:NOW?') + return float(reply) + + def read_status(self): + while True: + code, text = literal_eval(self.communicate(f'SYST:ERR?')) + if code == 0: + break + self.log.warning('got error %d %s', code, text) + return IDLE, '' + + def read_target(self): + # read back the target value + target = float(self.communicate(f'SOUR{self.channel}:VOLT?')) + return target + + def write_target(self, target): + # write here the target to the hardware + status = self.read_output_state() + + if target > self.max_target: + target = self.max_target + self.log.warning('Attempted to set voltage above maximum allowed voltage. Setting to max allowed instead.') + if target < self.min_target: + target = self.min_target + self.log.warning('Attempted to set voltage below minimum allowed voltage. Setting to min allowed instead.') + self.communicate(f'SOUR{self.channel}:VOLT {target};*OPC?') + return self.read_target() # return the read back value + + def read_slew_rate(self): + return float(self.communicate(f'SOUR{self.channel}:VOLT:SLEW?')) + + def write_slew_rate(self, slew_rate): + self.communicate(f'SOUR{self.channel}:VOLT:SLEW {slew_rate};*OPC?') + return self.read_slew_rate() + + def read_output_state(self): + a = int(self.communicate(f'OUTP{self.channel}?')) + return bool(a) + + def write_output_state(self, output_state): + self.communicate(f'OUTP{self.channel} {int(output_state)};*OPC?') + return self.read_slew_rate() + + def read_meas_voltage(self): + return float(self.communicate(f'MEAS{self.channel}:VOLT?')) + + def read_meas_current(self): + return float(self.communicate(f'MEAS{self.channel}:CURR?')) \ No newline at end of file diff --git a/frappy_psi/uniaxial_cell/psi_PSU_RP100.py b/frappy_psi/uniaxial_cell/psi_PSU_RP100.py new file mode 100644 index 00000000..1c08bf56 --- /dev/null +++ b/frappy_psi/uniaxial_cell/psi_PSU_RP100.py @@ -0,0 +1,183 @@ +''' +Force reader class (specially for FC100) +Based on the psiSerial class +(c) 2023 Jonas Philipe +''' + +import os +import time +import numpy as np +import traceback +import threading + +from frappy_psi.uniaxial_cell.psi_serial import * + +class psu_RP100_serialwrapper(): + _instance = None + _lock = threading.Lock() + port = None + + def __new__(cls, *args, **kwargs): + with cls._lock: + if cls._instance is None: + print('New RP100 object opened') + cls._instance = super().__new__(cls) + cls.port = psu_RP100(*args, **kwargs) + return cls._instance + + +class psu_RP100(psiSerial): + + def __init__(self,**kwargs): + print('INIT') + super(psu_RP100,self).__init__(**kwargs) + self.customConnectionError = b'DEVICE CONNECTION ERROR\r\n' + self.endOfLine='\n' # different end of line than the standard Arduino + ''' + ----------------------------------------- + RP100 power supply class. + Serial interaction with power supply. + Inherits from class psiSerial. + ----------------------------------------- + Commands: + self.enable(channel): + IN: string "channel", values contain "CH1" or "CH2". + e.g.: self.enable('CH1') enables channel 1. + OUT: + + ''' + self.channel1=False + self.channel2=False + + self.statusChannel1 = None + self.statusChannel2 = None + + self._port_opened = True + + def __del__(self): + self.reset() + + def to_bool(self, line): + return line[0] == b'0' + + def reset(self): + self.psi_write('*RST') + time.sleep(1) + + def enable(self,channel): + ''' + self.enable(channel): + IN: string "channel", values contain "CH1" or "CH2". + e.g.: self.enable('CH1') enables channel 1. + OUT: + ''' + try: + # Read status first: + self.statusChannel1=self.to_bool(self.psi_write_readline('OUTP1?',response_code=False)) + self.statusChannel2=self.to_bool(self.psi_write_readline('OUTP2?',response_code=False)) + except: + print('Cannot read source status.') + + try: + if channel.find('CH1')>-1 and not self.statusChannel1: + self.psi_write_readline('OUTP1 1',response_code=False) + self.statusChannel1=self.to_bool(self.psi_write_readline('OUTP1?',response_code=False)) + if channel.find('CH2')>-1 and not self.statusChannel2: + self.psi_write_readline('OUTP2 1',response_code=False) + self.statusChannel2=self.to_bool(self.psi_write_readline('OUTP2?',response_code=False)) + except: + print('Could not enable the selected channel. Make sure the arguments are correct: "CH1" and / or "CH2". Full TB below') + traceback.print_exc() + + def disable(self,channel): + ''' + self.enable(channel): + IN: string "channel", values contain "CH1" or "CH2". + e.g.: self.enable('CH1') enables channel 1. + OUT: + ''' + try: + # Read status first: + self.statusChannel1=self.to_bool(self.psi_write_readline('OUTP1?',response_code=False)) + self.statusChannel2=self.to_bool(self.psi_write_readline('OUTP2?',response_code=False)) + except: + print('Cannot read source status.') + traceback.print_exc() + + try: + if channel.find('CH1')>-1 and self.statusChannel1: + self.psi_write_readline('OUTP1 0',response_code=False) + self.statusChannel1=self.to_bool(self.psi_write_readline('OUTP1?',response_code=False)) + if channel.find('CH2')>-1 and self.statusChannel2: + self.psi_write_readline('OUTP2 0',response_code=False) + self.statusChannel2=self.to_bool(self.psi_write_readline('OUTP2?',response_code=False)) + except: + print('Could not enable the selected channel. Make sure the arguments are correct: "CH1" and / or "CH2".') + + def read_source_voltage(self,**kwargs): + s1 = self.psi_write_readline('SOUR1:VOLT:NOW?',response_code=False) + s2 = self.psi_write_readline('SOUR2:VOLT:NOW?',response_code=False) + try: + s1 = float(s1) + except: + print(s1) + s1 = None + try: + s2 = float(s2) + except: + print(s2) + s2 = None + return s1,s2 + + def set_slew(self,slew_value,**kwargs): + ''' + Set ramping voltage to all channels. + Keyword: channel. + Example: channel='CH1,CH2' or channel='CH1' + ''' + assert(slew_value >= 0.1e-3 and slew_value <= 100e3) + + try: + cc = kwargs['channel'] + except: + cc = 'CH1,CH2' + if cc.find('CH1')>-1: + self.psi_write_readline('SOUR1:VOLT:SLEW '+str(slew_value),response_code=False) + if cc.find('CH2')>-1: + self.psi_write_readline('SOUR2:VOLT:SLEW '+str(slew_value),response_code=False) + + def read_slew(self,**kwargs): + s1 = self.psi_write_readline('SOUR1:VOLT:SLEW?',response_code=False) + s2 = self.psi_write_readline('SOUR2:VOLT:SLEW?',response_code=False) + return s1.decode(),s2.decode() + + def measure_voltage(self,**kwargs): + s1 = self.psi_write_readline('MEAS1:VOLT?',response_code=False) + s2 = self.psi_write_readline('MEAS2:VOLT?',response_code=False) + try: + s1 = float(s1) + except: + print(s1) + s1 = None + try: + s2 = float(s2) + except: + print(s2) + s2 = None + return s1,s2 + + def set_voltage(self,source,voltage,**kwargs): + ''' + Need to implement security limits on the voltage at some point! + ''' + assert(voltage <= 230 and voltage >= -230) + if source == 'SOUR1' or source == 'SOUR2': + a = self.psi_write_readline(source+':VOLT '+str(voltage),response_code=False) + return a + + def clear(self): + ''' + Clears status code + ''' + a=self.psi_write_readline('*CLS') + return a diff --git a/frappy_psi/uniaxial_cell/psi_serial.py b/frappy_psi/uniaxial_cell/psi_serial.py new file mode 100644 index 00000000..982818b1 --- /dev/null +++ b/frappy_psi/uniaxial_cell/psi_serial.py @@ -0,0 +1,117 @@ +''' +PSI class to interact with arduino +Read capacitance of FC100 cell +''' + +import os +import time +import serial + +class psiSerial(serial.Serial): + def __init__(self,**kwargs): + super(psiSerial,self).__init__(**kwargs) + # Default values + #self.port='COM8' + #self.baudrate=9600 + #self.bytesize=8 + #self.bitstop=1 + #self.parity='N' + self.timeout=0.1 # Read timeout of 0.1s default + self.customConnectionError = b'DEVICE CONNECTION ERROR\r\n' + self.maxAttempts = 10 + self.sleep_after_open = 0.1 #s + self.endOfLine = "\r" + self.writeWhileEmpty = False + + def psi_open(self,**kwargs): + self.custom_is_open = False + while not self.custom_is_open: + try: + self.open() + except: + '' + if self.is_open: + a=self.readline() + if a != self.customConnectionError: + self.custom_is_open = True + else: + self.close() + print('Serial port is open. Wait for',self.sleep_after_open,'seconds.') + time.sleep(self.sleep_after_open) + + def psi_write(self,string,**kwargs): + ''' + IN: string + OUT: serial.Serial.write(bstring) + where bstring is a string decorated by + "b'" +string+"\r\n". + + Opt.: book write_debug: writes the input string and output + encoded string. + ''' + try: + self.write_debug = kwargs['write_debug'] + except: + self.write_debug = False + try: + response_code = kwargs['response_code'] + except: + response_code = True + + self.write_response = 0 + natempt = 0 + bstring = string+self.endOfLine + bstring=bstring.encode() + + if response_code: + while self.write_response != 8 and natempt < self.maxAttempts: + try: + self.write_response=int(self.write(bstring)) + if self.write_debug: + print('Input string:',string) + print('Output:',bstring) + print('write response:',self.write_response) + except: + '' + natempt+=1 + if natempt >= self.maxAttempts: + print('Max attempt reached for psi_write.') + else: + self.write_response=int(self.write(bstring)) + if self.write_debug: + print('Input string:',string) + print('Output:',bstring) + print('write response:',self.write_response) + + def psi_read(self,**kwargs): + ''' + Function psi_read reads one byte. + ''' + return self.read() + + def psi_readline(self,**kwargs): + a = self.readline() + return a + + def psi_write_readline(self,string,**kwargs): + self.psi_write(string,**kwargs) + a=self.psi_readline(**kwargs) + if a == self.customConnectionError: + print('Connection dropped. Restart.') + print('------------------------------') + self.psi_close() + self.psi_open() + self.psi_write_readline(string,**kwargs) + if a == b'' and self.writeWhileEmpty: + print('a = b"". Retry.') + print('------------------------------') + self.psi_close() + self.psi_open() + self.psi_write_readline(string,**kwargs) + return a + + + def psi_close(self,**kwargs): + self.close() + time.sleep(self.sleep_after_open) +