de89d3bc
dmayerich
Initial commit.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#!/usr/bin/python
from mstm_materials import *
from mstm_parameters import *
from mstm_simparser import *
import time
import sys
#PyQt4 libraries
from PyQt4 import QtGui
from PyQt4 import QtCore
from PyQt4 import uic
|
6f131540
dmayerich
Additional UI cha...
|
14
15
16
|
#Matplotlib libraries
import matplotlib.pyplot as plt
|
de89d3bc
dmayerich
Initial commit.
|
17
18
19
20
21
22
23
24
25
26
|
class GuiWindow(QtGui.QMainWindow):
params = ParameterClass('msinput.inp')
def setParams(self):
#update the Gui based on values in the parameters structure
self.ui.spinStartLambda.setValue(self.params.minLambda)
self.ui.spinEndLambda.setValue(self.params.maxLambda)
self.ui.spinNumSamples.setValue(self.params.nSamples)
self.ui.spinNumSpheres.setValue(int(self.params['number_spheres']))
|
de89d3bc
dmayerich
Initial commit.
|
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
fi = QtCore.QFileInfo(self.params.matFilename)
self.ui.txtMaterial.setText(fi.baseName())
#update global parameters for the dimer simulation
self.ui.spinSpacing.setValue(d)
def getParams(self):
self.params.minLambda = self.ui.spinStartLambda.value()
self.params.maxLambda = self.ui.spinEndLambda.value()
self.params.nSamples = self.ui.spinNumSamples.value()
self.params.nSpheres = self.ui.spinNumSpheres.value()
self.params['incident_azimuth_angle_deg'] = self.ui.spinAlpha.value()
self.params['incident_polar_angle_deg'] = self.ui.spinBeta.value()
|
6f131540
dmayerich
Additional UI cha...
|
41
42
43
44
45
46
|
self.params.showOutput = self.ui.chkShowOutput.isChecked()
self.params.inWater = self.ui.chkInWater.isChecked()
if self.ui.chkRandomOrientation.isChecked():
self.params['fixed_or_random_orientation'] = 1
else:
self.params['fixed_or_random_orientation'] = 0
|
de89d3bc
dmayerich
Initial commit.
|
47
48
49
50
51
52
53
54
|
#global parameters for dimers
d = self.ui.spinSpacing.value()
return self.params
def simulate(self):
|
6f131540
dmayerich
Additional UI cha...
|
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
self.results = RunSimulation()
#plot results of interest
wl = self.results['lambda']
if int(self.params['fixed_or_random_orientation']) == 0:
unpol = self.results['extinction_unpolarized']
para = self.results['extinction_parallel']
perp = self.results['extinction_perpendicular']
plt.plot(wl, unpol, 'r-', label='unpolarized')
plt.plot(wl, para, 'g-', label='parallel')
plt.plot(wl, perp, 'b-', label='perpendicular')
else:
total = self.results['extinction_total']
plt.plot(wl, total, 'r-', label='extinction')
plt.legend(loc = 'upper left')
plt.ylabel('Extinction')
plt.xlabel('Wavelength (um)')
plt.show()
|
de89d3bc
dmayerich
Initial commit.
|
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
|
def saveresults(self):
fileName = QtGui.QFileDialog.getSaveFileName(w, 'Save Spectral Results', '', 'DAT data files (*.dat)')
if fileName:
self.results.saveFile(fileName)
def loadmaterial(self):
fileName = QtGui.QFileDialog.getOpenFileName(w, 'Load Material Refractive Index', '', 'TXT data files (*.txt)')
if fileName:
self.params.matFilename = fileName
fi = QtCore.QFileInfo(fileName)
self.ui.txtMaterial.setText(fi.baseName())
def __init__(self):
QtGui.QWidget.__init__(self)
#dimer-specific settings
self.params['number_spheres'] = 2
self.params['sphere_position_file'] = ''
#load the UI window
self.ui = uic.loadUi('mstm_guiwindow.ui')
#update the displayed parameters
self.setParams()
#display the UI
self.ui.show()
#simulation button
self.connect(self.ui.btnSimulate, QtCore.SIGNAL("clicked()"), self.simulate)
self.connect(self.ui.mnuSaveResults, QtCore.SIGNAL("triggered()"), self.saveresults)
self.connect(self.ui.mnuLoadMaterial, QtCore.SIGNAL("triggered()"), self.loadmaterial)
class ProgressBar(QtGui.QWidget):
def __init__(self, parent=None, total=20):
super(ProgressBar, self).__init__(parent)
self.name_line = QtGui.QLineEdit()
self.progressbar = QtGui.QProgressBar()
self.progressbar.setMinimum(1)
self.progressbar.setMaximum(total)
main_layout = QtGui.QGridLayout()
main_layout.addWidget(self.progressbar, 0, 0)
self.setLayout(main_layout)
self.setWindowTitle("Progress")
def update_progressbar(self, val):
self.progressbar.setValue(val)
|
6f131540
dmayerich
Additional UI cha...
|
127
128
129
130
131
132
|
def RunSimulation():
#set the parameters based on the UI
parameters = w.getParams()
|
de89d3bc
dmayerich
Initial commit.
|
133
134
135
136
137
138
139
|
#load the material
material = MaterialClass(parameters.matFilename)
#add water if necessary
if parameters.inWater:
material.addSolution(1.33)
|
6f131540
dmayerich
Additional UI cha...
|
140
|
|
de89d3bc
dmayerich
Initial commit.
|
141
142
143
144
145
146
|
#range for simulation
minLambda = parameters.minLambda
maxLambda = parameters.maxLambda
nSamples = parameters.nSamples
#store the simulation results
|
6f131540
dmayerich
Additional UI cha...
|
147
|
results = SimParserClass(parameters)
|
de89d3bc
dmayerich
Initial commit.
|
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
#create a progress bar
pbar = ProgressBar(total=nSamples)
pbar.show()
#for each wavelength in the material
for i in range(nSamples):
l = minLambda + i*(maxLambda - minLambda)/(nSamples - 1)
#set the computed parameters
m = material[l]
n = m.n
parameters['real_ref_index_scale_factor'] = n.real
parameters['imag_ref_index_scale_factor'] = n.imag
parameters['length_scale_factor'] = (2.0 * 3.14159)/l
parameters['scattering_plane_angle_deg'] = gamma;
|
6f131540
dmayerich
Additional UI cha...
|
167
168
|
#parameters['fixed_or_random_orientation'] = 0
#print(parameters['fixed_or_random_orientation'])
|
de89d3bc
dmayerich
Initial commit.
|
169
170
171
172
173
174
175
176
177
178
179
|
parameters.clearSpheres()
parameters.addSphere(a, -(d + 2*a)/2, 0, 0)
parameters.addSphere(a, (d + 2*a)/2, 0, 0)
#save the scripted input file
parameters.saveFile('scriptParams.inp')
#run the binary
from subprocess import call
|
6f131540
dmayerich
Additional UI cha...
|
180
181
182
183
184
|
if parameters.showOutput:
call(["./ms-tmatrix", "scriptParams.inp"])
else:
devnull = open('/dev/null', 'w')
call(["./ms-tmatrix", "scriptParams.inp"], stdout=devnull)
|
de89d3bc
dmayerich
Initial commit.
|
185
186
187
188
189
|
results.parseSimFile(l, 'test.dat')
#update the progress bar
pbar.update_progressbar(i+1)
|
6f131540
dmayerich
Additional UI cha...
|
190
|
print(i+1)
|
de89d3bc
dmayerich
Initial commit.
|
191
192
193
194
195
196
197
198
199
|
#return the results
return results;
|
de89d3bc
dmayerich
Initial commit.
|
200
201
202
203
204
205
206
207
208
209
210
211
|
#sphere radii
a = 0.025
#distance between spheres
d = 0.002
#incident light directions
alpha = 0
beta = 0
gamma = 0
#results stored for each spectral sample
resultLabels = {'lambda', 'extinction_unpolarized', 'extinction_parallel', 'extinction_perpendicular'}
|
de89d3bc
dmayerich
Initial commit.
|
212
213
214
215
|
#create a Qt window
app = QtGui.QApplication(sys.argv)
w = GuiWindow()
sys.exit(app.exec_())
|