-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path1_Flow_Experiment.py
More file actions
240 lines (184 loc) · 6.49 KB
/
1_Flow_Experiment.py
File metadata and controls
240 lines (184 loc) · 6.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
from Machines import PHDSyringePump as PHDPump
import time
import seabreeze.spectrometers as sb
import datetime
import logging
import os
import sys
import numpy as np
import serial
import pyqtgraph as pg
from pyqtgraph.Qt import QtGui
from PySide import QtCore
experiment_name = input("Enter Experiment Name: ")
experiment_time = float(input("How long should the experiment run? (Minutes) "))
experiment_time = float(experiment_time * 60)
pump_flow1 = float(input("Pump1 Flow Rate (ml/min): "))
pump_flow2 = float(input("Pump2 Flow Rate (ml/min): "))
spectral_int_time = float(input("Spectral Integration Time (Seconds): "))
start_time = float(time.time())
today = datetime.date.today()
todaystr = today.isoformat()
experiment_name = "./data/" + todaystr + "/" + experiment_name
spectral_int_time = float(spectral_int_time * 1000000)
#create directory
#if not os.path.exists(experiment_name):
# os.makedirs(experiment_name)
if os.path.exists(experiment_name):
print("Experiment already exists . . . . exiting")
time.sleep (5)
sys.exit()
else:
os.makedirs(experiment_name)
#############
##Set up logging##
#############
log_formatter = logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s', datefmt='%d/%m/%Y %H:%M:%S')
#File to log to
logFile = os.path.join(experiment_name) + "/logfile.txt"
#Setup File handler
file_handler = logging.FileHandler(logFile)
file_handler.setFormatter(log_formatter)
file_handler.setLevel(logging.INFO)
#Setup Stream Handler (console)
#stream_handler = logging.StreamHandler()
#stream_handler.setFormatter(log_formatter)
#stream_handler.setLevel(logging.INFO)
#Get logger
logger = logging.getLogger('root')
logger.setLevel(logging.INFO)
#Add both Handlers
logger.addHandler(file_handler)
#logger.addHandler(stream_handler)
#################
##Connect to machines##
#################
#Pump
Pump1 = PHDPump.sPump("COM6")
Pump2 = PHDPump.sPump("COM8")
#Dilution_pump = connect_here
logger.info("Connected to Pumps")
#Spectrometer
specdevs = sb.list_devices()
spec = sb.Spectrometer(specdevs[0])
logger.info("Connected to: " + str(specdevs[0]))
def start_dark_reference():
global dark_ref
spec.integration_time_micros(spectral_int_time)
dark_ref = spec.intensities()
def start_reference():
global reference
#Dilution_pump.start()
#time.sleep(10)
spec.integration_time_micros(spectral_int_time)
reference = spec.intensities()
#time.sleep(1)
#Dilution_pump.stop()
def start_experiment():
global wl
global raw_spectral_data
global refd_spectral_data
global start_time
global spec_time
global lambda_max
wl = spec.wavelengths()
raw_spectral_data = spec.wavelengths()
Abs_spectral_data = spec.wavelengths()
spec_time = np.array(0)
start_time = time.time()
lambda_max = np.array(0)
logger.info ("Experiment started at: " + time.strftime("%H:%M:%S | %d-%m-%Y"))
#set-up and start pump
Pump1.set_flow_rate(pump_flow1)
Pump2.set_flow_rate(pump_flow2)
Pump1.start()
Pump2.start()
#QtGui.QApplication.setGraphicsSystem('raster')
app = QtGui.QApplication([])
mw = QtGui.QMainWindow()
mw.setWindowTitle("Flow Experimental System")
#mw.resize(600,400)
mw.setGeometry(6,150, 650,450 )
cw = QtGui.QWidget()
mw.setCentralWidget(cw)
l = QtGui.QVBoxLayout()
cw.setLayout(l)
pw = pg.PlotWidget(name="UV Spectrum")
l.addWidget(pw)
pw2 = pg.PlotWidget(name="Lambda Max Vs Time")
l.addWidget(pw2)
mw.show()
## Create an empty plot curve to be filled later, set its pen
p1 = pw.plot(pen=2, title="UV Spectrum" )
pw.enableAutoRange(enable=True)
pw.setYRange(-2,2,padding=0)
pw.setLabel('left', 'Absorbance', units='Arbitr. Units')
pw.setLabel('bottom', 'Wavelength', units='nm')
p2 = pw2.plot(pen=2, symbol = 'o', symbolPen = 2, title="Lambda Max Vs Time")
pw2.enableAutoRange(enable=True)
pw2.setLabel('left', 'Max Intensity', units='Arbitr. Units')
pw2.setLabel('bottom', 'Time', units='s')
while (float(time.time()) < start_time+float(experiment_time)):
spectrum = spec.intensities()
sp_time = time.time()
raw_spectral_data = np.vstack((raw_spectral_data, spectrum))
Abs_spectral_data = np.vstack((Abs_spectral_data, np.log10((reference - dark_ref)/(spectrum - dark_ref))))
spec_time = np.append(spec_time, [sp_time-start_time])
curr_lambda_max = np.amax(spectrum - reference)
lambda_max = np.append(lambda_max, [curr_lambda_max])
#Update Plot
p1.setData(wl,np.log10((reference - dark_ref)/(spectrum - dark_ref)))
p2.setData(spec_time, lambda_max)
pg.QtGui.QApplication.processEvents()
time.sleep((spectral_int_time/1000000)+0.05)
def shutdown_and_save():
global wl
global raw_spectral_data
global refd_spectral_data
global start_time
global spec_time
global lambda_max
global Abs_spectral_data
logger.info("Experiment complete at: " + time.strftime("%H:%M:%S | %d-%m-%Y"))
Pump1.stop()
Pump2.stop()
final_data = raw_spectral_data
final_Abs = Abs_spectral_data
Where_Nan = np.isnan(Abs_spectral_data)
Where_Inf = np.isinf(Abs_spectral_data)
final_Abs[Where_Nan] = 0
final_Abs[Where_Inf] = 0
np.savetxt(os.path.join(experiment_name) + "/spectral_results.csv", final_data , fmt="%s", delimiter=",")
np.savetxt(os.path.join(experiment_name) + "/Abs_spectral_results.csv", final_Abs, fmt="%s", delimiter=",")
np.savetxt(os.path.join(experiment_name) + "/reference.csv", reference, fmt="%s", delimiter=",")
np.savetxt(os.path.join(experiment_name) + "/dark_reference.csv", dark_ref, fmt="%s", delimiter=",")
np.savetxt(os.path.join(experiment_name) + "/wl.csv", wl, fmt="%s", delimiter=",")
np.savetxt(os.path.join(experiment_name) + "/times.csv", spec_time, fmt="%s", delimiter=",")
logger.info("Spectral data saved as: " + os.path.join(experiment_name) + "/spectral_results.csv")
###############
## RUNNING CODE ##
###############
input("Close light shutter and push enter . . . ")
time.sleep(1)
start_dark_reference()
input("Open light shutter and push enter . . . ")
input("Start dilution pump and push enter when ready to take reference . . .")
start_reference()
logger.info ("Reference Acquired at: " + time.strftime("%H:%M:%S | %d-%m-%Y"))
input("Push Enter to Start Experiment. . . ")
try:
start_experiment()
shutdown_and_save()
Pump1.disconnect()
Pump2.disconnect()
exit()
except KeyboardInterrupt:
logger.info("Experiment Interrupted at: " + time.strftime("%H:%M:%S | %d-%m-%Y"))
shutdown_and_save()
Pump1.disconnect()
Pump2.disconnect()
exit()
if __name__ == '__main__':
import sys
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
QtGui.QApplication.instance().exec_()