test_ohmpi_mux.py 4.28 KB
Newer Older
# test ohmpi and multiplexer on test resistances
from ohmpi import OhmPi
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import os
import time

# configure testing
idps = False
board_version = '22.10' # v2.0
use_mux = True
nelec = 16  # max elec in the sequence for testing

# nelec electrodes Wenner sequence
a = np.arange(nelec-3) + start_elec
b = a + 3
m = a + 1
n = a + 2
seq = np.c_[a, b, m, n]

# testing measurement board only
k = OhmPi(idps=idps, use_mux=use_mux)
k.sequence = seq  # we need a sequence for possibly switching the mux
k.reset_mux()  # just for safety
out1 = k.run_measurement(injection_duration=0.25, nb_stack=4, strategy='constant', tx_volt=12, autogain=True)
out2 = k.run_measurement(injection_duration=0.5, nb_stack=2, strategy='vmin', tx_volt=5, autogain=True)
out3 = k.run_measurement(injection_duration=1, nb_stack=1, strategy='vmax', tx_volt=5, autogain=True)

# visual figure of the full wave form
fig, axs = plt.subplots(2, 1, sharex=True)
ax = axs[0]
labels = ['constant', 'vmin', 'vmax']
for i, out in enumerate([out1, out2, out3]):
  data = out['fulldata']
  inan = ~(np.isnan(out['fulldata']).any(1))
  ax.plot(data[inan,2], data[inan,0], '.-', label=labels[i])
ax.set_ylabel('Current AB [mA]')
ax.legend()
ax = axs[1]
for i, out in enumerate([out1, out2, out3]):
  data = out['fulldata']
  inan = ~(np.isnan(out['fulldata']).any(1))
  ax.plot(data[inan,2], data[inan,1], '.-', label=labels[i])
ax.set_ylabel('Voltage MN [mV]')
ax.set_xlabel('Time [s]')
fig.savefig('check-fullwave.jpg')


# test a sequence
if use_mux:
    # manually edit default settings
    k.settings['injection_duration'] = 1
    k.settings['nb_stack'] = 1
    #k.settings['nbr_meas'] = 1
    k.sequence = seq
    k.reset_mux()

    # set quadrupole manually
    k.switch_mux_on(seq[0, :])
    out = k.run_measurement(quad=[3, 3, 3, 3], nb_stack=1, tx_volt=12, strategy='constant', autogain=True)
    k.switch_mux_off(seq[0, :])
    print(out)

    # run rs_check() and save data
    k.rs_check()  # check all electrodes of the sequence

    # check values measured
    fname = sorted(os.listdir('data/'))[-1]
    print(fname)
    dfrs = pd.read_csv('data/' + fname)
    fig, ax = plt.subplots()
    ax.hist(dfrs['RS [kOhm]'])
    ax.set_xticks(np.arange(dfrs.shape[0]))
    ax.set_xticklabels(dfrs['A'].astype(str) + ' - ' +
                       dfrs['B'].astype(str), rotation=90)
    ax.set_ylabel('Contact resistances [kOhm]')
    fig.tight_layout()
    fig.savefig('check-rs.jpg')

    # run sequence synchronously and save data to file
    k.run_sequence(nb_stack=1, injection_duration=0.25)

    # check values measured
    fname = sorted(os.listdir('data/'))[-1]
    print(fname)
    df = pd.read_csv('data/' + fname)
    fig, ax = plt.subplots()
    ax.hist(df['R [ohm]'])
    ax.set_ylabel('Transfer resistance [Ohm]')
    ax.set_xticks(np.arange(df.shape[0]))
    ax.set_xticklabels(df['A'].astype(str) + ','
                       + df['B'].astype(str) + ','
                       + df['M'].astype(str) + ','
                       + df['N'].astype(str), rotation=90)
    fig.tight_layout()
    fig.savefig('check-r.jpg')

    # run sequence asynchronously and save data to file
    k.run_sequence_async(nb_stack=1, injection_duration=0.25)
    time.sleep(2) # if too short, it will still be resetting the mux (= no effect)
    k.interrupt()  # will kill the asynchronous sequence running

    # run a series of asynchronous sequences
    k.settings['nb_meas'] = 2  # run the sequence twice
    k.run_multiple_sequences(nb_stack=1, injection_duration=0.25)
    time.sleep(5)


# look at the noise frequency with FFT
if False:
    from numpy.fft import fft, ifft

    x = data[inan, 1][10:300]
    t = np.linspace(0, len(x)*4, len(x))
    sr = 1/0.004

    X = fft(x)
    N = len(X)
    n = np.arange(N)
    T = N/sr
    freq = n/T 

    plt.figure(figsize = (12, 6))
    plt.subplot(121)

    plt.stem(freq, np.abs(X), 'b', \
             markerfmt=" ", basefmt="-b")
    plt.xlabel('Freq (Hz)')
    plt.ylabel('FFT Amplitude |X(freq)|')
    #plt.xlim(0, 10)

    plt.subplot(122)
    plt.plot(t, ifft(X), 'r')
    plt.xlabel('Time (s)')
    plt.ylabel('Amplitude')
    plt.tight_layout()
    plt.show()