diff --git a/Chimera.py b/Chimera.py index 2c7a2c1..f2e5b2b 100644 --- a/Chimera.py +++ b/Chimera.py @@ -1,230 +1,230 @@ 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, 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(g.displaybuffer) currentRMS = np.std(g.displaybuffer) 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()