Page MenuHomec4science

Chimera.py
No OneTemporary

File Metadata

Created
Fri, May 10, 00:19

Chimera.py

import ChimeraSettings as C
import ok
import ChimeraControls
import os
import pickle
from PyQt5 import QtGui
import datetime
import numpy as np
import time
import csv
import matplotlib.pyplot as plt
import functions
from matplotlib.ticker import EngFormatter
Amp = EngFormatter(unit='A', places=2)
Time = EngFormatter(unit='s', places=2)
Volt = EngFormatter(unit='V', places=2)
Cond = EngFormatter(unit='S', places=2)
# Main Chimera Launcher
class Launcher:
def __init__(self, loadedInstance=None):
if loadedInstance is None:
self.ChimeraSettings = C.ChimeraSettings()
else:
self.ChimeraSettings = loadedInstance
# Initialize Chimera
self.xem = ok.FrontPanel()
ChimeraControls.InitializeChimera(self.ChimeraSettings,self.xem)
# Set savingfolder
self.SetSavingFolder(os.getcwd())
# Variables
self.lowpass = 2e3
self.displaySamplerate = self.lowpass*2
self.IVUseAlternatingV = True
self.LowerIV = 0.0
self.HigherIV = 0.0
self.StepIV = 0.0
self.timeIV = 2
# if os.stat("store.pckl").st_size:
# ChimeraSettings.setStoredValues()
# Data variables
# self.blockvalues = np.empty((1048576,), dtype=np.uint16)
# self.readvalues = ChimeraControls.ConvertBlockvalues(self.ChimeraSettings, blockvalues)
#self.displaybuffer
#self.blockvalues
# self.newbiasvalue = 0
def Initialize(self):
ChimeraControls.InitializeChimera(self.ChimeraSettings, self.xem)
def SetSavingFolder(self, savingFolder, experimentName = 'Untitled'):
self.DataFolder = savingFolder
self.todaysfolder = str(datetime.date.today())
self.experimentName = experimentName
if not os.path.exists(self.DataFolder):
os.makedirs(self.DataFolder)
if not os.path.exists(os.path.join(self.DataFolder, self.todaysfolder)):
os.makedirs(os.path.join(self.DataFolder, self.todaysfolder))
print('Files are saved in ' + os.path.join(os.path.join(self.DataFolder, self.todaysfolder), self.experimentName))
def SetExperimentName(self, experimentName):
self.SetSavingFolder(self.DataFolder, experimentName=experimentName)
def SetVoltage(self, sb, write=True):
self.newbiasvalue = sb
# self.ChimeraSettings.RestartBuffer = True
if write:
self.SaveVoltage()
ChimeraControls.CHIMERA_updateDACvalues1(self.ChimeraSettings, self.xem, self.newbiasvalue)
def RecordTraceRaw(self):
blockvalues = ChimeraControls.CHIMERA_process_triggers(self.ChimeraSettings,self.xem)
#self.blockvalues = blockvalues
readvalues = ChimeraControls.ConvertBlockvalues(self.ChimeraSettings, blockvalues)
#self.readvalues = readvalues
return readvalues
def RecordTrace(self):
blockvalues = ChimeraControls.CHIMERA_process_triggers(self.ChimeraSettings,self.xem)
#self.blockvalues = blockvalues
readvalues = ChimeraControls.ConvertBlockvalues(self.ChimeraSettings, blockvalues)
#self.readvalues = readvalues
Samplerate = self.ChimeraSettings.ADCSAMPLERATE
displaybuffer, self.displaySamplerate = functions.LowPass(readvalues, Samplerate, self.lowpass)
#displaybuffer = ChimeraControls.lowpass(self.ChimeraSettings, readvalues, cutoff=self.lowpass)
return displaybuffer
#def SaveSettings(self, fileName):
# if fileName is not None and not os.path.exists(fileName):
# filePath = os.path.split(fileName)
# if not os.path.isdir(filePath):
# os.mkdir(filePath)
# else:
# fileName = QtGui.QFileDialog.getOpenFileName()
# fileName = fileName[0]
# print(fileName)
#
# f = open(fileName, 'rb')
# ChimeraSettings = self.ChimeraSettings
# pickle.dump(ChimeraSettings, f)
# f.close()
# print('Saved as ' + fileName)
def LoadInstance(self, fileName):
if fileName is None or os.path.exists(fileName):
fileName = QtGui.QFileDialog.getOpenFileName()
fileName = fileName[0]
print(fileName)
f = open(fileName, 'rb')
ChimeraSettings = pickle.load(f)
f.close()
self.ChimeraSettings = ChimeraSettings
print('Loaded from ' + fileName + '. Re-initializing...')
ChimeraControls.InitializeChimera(self.ChimeraSettings, self.xem)
def updateBW(self):
out = ChimeraControls.CHIMERA_bandwidthtimer(self.ChimeraSettings, self.xem)
text1 = "Time\n{0}\nUSB Read Rate\n{1:} kHz\nUSB Write Rate\n{2}".format(out['text_time'],
out['USB_readrate'],
out['USB_writerate'])
print(text1)
text2 = "Buffer\n{0} kB\nBuffer Size\n{1} %\nSeconds buffered\n{2:.3f} sec".format(out['buffer'],
out['bufferPC'],
out['bufferseconds'])
print(text2)
# def update(self):
# def PlotData(self):
def ResetBuffer(self):
print("Buffer is resetting...")
ans1 = self.xem.SetWireInValue(self.ChimeraSettings.EP_WIREIN_TEST1, self.ChimeraSettings.EPBIT_GLOBALRESET, self.ChimeraSettings.EPBIT_GLOBALRESET)
self.xem.UpdateWireIns()
time.sleep(0.1)
ans2 = self.xem.SetWireInValue(self.ChimeraSettings.EP_WIREIN_TEST1, 0, self.ChimeraSettings.EPBIT_GLOBALRESET)
self.xem.UpdateWireIns()
#self.RestartBuffer = 1
def ZeroVolt(self):
Vdelta = 0.02
print('Measuring at {} ...'.format(Volt.format_data(Vdelta)), end='')
self.SetVoltage(Vdelta, write=False)
self.ResetBuffer()
time.sleep(1)
measI1 = np.mean(self.RecordTrace())
print('{}'.format(Amp.format_data(measI1)))
print('Measuring at {} ...'.format(Volt.format_data(0)), end='')
self.SetVoltage(0, write=False)
self.ResetBuffer()
time.sleep(1)
measI2 = np.mean(self.RecordTrace())
print('{}'.format(Amp.format_data(measI2)))
deltaI = measI1-measI2
if deltaI == 0:
print('Error, cannot zero voltage: deltaI = 0')
else:
measR = Vdelta / deltaI
self.ResetBuffer()
self.ChimeraSettings.voltageOffset += -measI2 * measR
print('New voltage offset: {}'.format(Volt.format_data(self.ChimeraSettings.voltageOffset)))
ChimeraControls.CHIMERA_updateDACvalues1(self.ChimeraSettings, self.xem)
self.SetVoltage(self.ChimeraSettings.voltageOffset)
def SaveVoltage(self):
savingFolder = os.path.join(self.DataFolder, self.todaysfolder)
savingName = self.experimentName + 'Vdata.csv'
fullpath = os.path.join(savingFolder, savingName)
data = [datetime.datetime.now(), self.newbiasvalue]
with open(fullpath, 'w') as csvfile:
writeline = csv.writer(csvfile, delimiter=',')
writeline.writerows(data)
class ChimeraPlot:
def __init__(self, Chimera):
self.fig, self.ax = plt.subplots(1, 1)
self.ax.set_xlabel('Time [s]')
self.ax.set_ylabel('Current [nA]')
self.samplerate = Chimera.displaySamplerate
def Update(self, trace):
x = np.arange(len(g.trace)) / self.samplerate
currentIDC = np.mean(trace)
currentRMS = np.std(trace)
if self.ax.lines:
for line in self.ax.lines:
line.set_xdata(x)
line.set_ydata(trace)
else:
self.ax.plot(x, trace)
self.ax.set_ylim([currentIDC - 10 * currentRMS, currentIDC + 10 * currentRMS])
self.fig.canvas.draw()

Event Timeline