Commit 6f13154044ca7a37420ee3a250a4679750824e41
1 parent
025f38a0
Additional UI changes.
Showing
5 changed files
with
127 additions
and
56 deletions
Show diff stats
mstm-gui.py
@@ -11,6 +11,9 @@ from PyQt4 import QtGui | @@ -11,6 +11,9 @@ from PyQt4 import QtGui | ||
11 | from PyQt4 import QtCore | 11 | from PyQt4 import QtCore |
12 | from PyQt4 import uic | 12 | from PyQt4 import uic |
13 | 13 | ||
14 | +#Matplotlib libraries | ||
15 | +import matplotlib.pyplot as plt | ||
16 | + | ||
14 | class GuiWindow(QtGui.QMainWindow): | 17 | class GuiWindow(QtGui.QMainWindow): |
15 | 18 | ||
16 | params = ParameterClass('msinput.inp') | 19 | params = ParameterClass('msinput.inp') |
@@ -21,8 +24,6 @@ class GuiWindow(QtGui.QMainWindow): | @@ -21,8 +24,6 @@ class GuiWindow(QtGui.QMainWindow): | ||
21 | self.ui.spinEndLambda.setValue(self.params.maxLambda) | 24 | self.ui.spinEndLambda.setValue(self.params.maxLambda) |
22 | self.ui.spinNumSamples.setValue(self.params.nSamples) | 25 | self.ui.spinNumSamples.setValue(self.params.nSamples) |
23 | self.ui.spinNumSpheres.setValue(int(self.params['number_spheres'])) | 26 | self.ui.spinNumSpheres.setValue(int(self.params['number_spheres'])) |
24 | - #self.ui.spinAlpha.setValue(float(self.params['incident_azimuth_angle_deg'])) | ||
25 | - #self.ui.spinBeta.setValue(float(self.params['incident_polar_angle_deg'])) | ||
26 | 27 | ||
27 | fi = QtCore.QFileInfo(self.params.matFilename) | 28 | fi = QtCore.QFileInfo(self.params.matFilename) |
28 | self.ui.txtMaterial.setText(fi.baseName()) | 29 | self.ui.txtMaterial.setText(fi.baseName()) |
@@ -37,6 +38,12 @@ class GuiWindow(QtGui.QMainWindow): | @@ -37,6 +38,12 @@ class GuiWindow(QtGui.QMainWindow): | ||
37 | self.params.nSpheres = self.ui.spinNumSpheres.value() | 38 | self.params.nSpheres = self.ui.spinNumSpheres.value() |
38 | self.params['incident_azimuth_angle_deg'] = self.ui.spinAlpha.value() | 39 | self.params['incident_azimuth_angle_deg'] = self.ui.spinAlpha.value() |
39 | self.params['incident_polar_angle_deg'] = self.ui.spinBeta.value() | 40 | self.params['incident_polar_angle_deg'] = self.ui.spinBeta.value() |
41 | + self.params.showOutput = self.ui.chkShowOutput.isChecked() | ||
42 | + self.params.inWater = self.ui.chkInWater.isChecked() | ||
43 | + if self.ui.chkRandomOrientation.isChecked(): | ||
44 | + self.params['fixed_or_random_orientation'] = 1 | ||
45 | + else: | ||
46 | + self.params['fixed_or_random_orientation'] = 0 | ||
40 | 47 | ||
41 | 48 | ||
42 | #global parameters for dimers | 49 | #global parameters for dimers |
@@ -45,7 +52,26 @@ class GuiWindow(QtGui.QMainWindow): | @@ -45,7 +52,26 @@ class GuiWindow(QtGui.QMainWindow): | ||
45 | return self.params | 52 | return self.params |
46 | 53 | ||
47 | def simulate(self): | 54 | def simulate(self): |
48 | - self.results = RunSimulation(self.params) | 55 | + self.results = RunSimulation() |
56 | + | ||
57 | + #plot results of interest | ||
58 | + wl = self.results['lambda'] | ||
59 | + | ||
60 | + if int(self.params['fixed_or_random_orientation']) == 0: | ||
61 | + unpol = self.results['extinction_unpolarized'] | ||
62 | + para = self.results['extinction_parallel'] | ||
63 | + perp = self.results['extinction_perpendicular'] | ||
64 | + plt.plot(wl, unpol, 'r-', label='unpolarized') | ||
65 | + plt.plot(wl, para, 'g-', label='parallel') | ||
66 | + plt.plot(wl, perp, 'b-', label='perpendicular') | ||
67 | + else: | ||
68 | + total = self.results['extinction_total'] | ||
69 | + plt.plot(wl, total, 'r-', label='extinction') | ||
70 | + | ||
71 | + plt.legend(loc = 'upper left') | ||
72 | + plt.ylabel('Extinction') | ||
73 | + plt.xlabel('Wavelength (um)') | ||
74 | + plt.show() | ||
49 | 75 | ||
50 | def saveresults(self): | 76 | def saveresults(self): |
51 | fileName = QtGui.QFileDialog.getSaveFileName(w, 'Save Spectral Results', '', 'DAT data files (*.dat)') | 77 | fileName = QtGui.QFileDialog.getSaveFileName(w, 'Save Spectral Results', '', 'DAT data files (*.dat)') |
@@ -98,7 +124,12 @@ class ProgressBar(QtGui.QWidget): | @@ -98,7 +124,12 @@ class ProgressBar(QtGui.QWidget): | ||
98 | self.progressbar.setValue(val) | 124 | self.progressbar.setValue(val) |
99 | 125 | ||
100 | 126 | ||
101 | -def RunSimulation(parameters): | 127 | +def RunSimulation(): |
128 | + | ||
129 | + #set the parameters based on the UI | ||
130 | + parameters = w.getParams() | ||
131 | + | ||
132 | + | ||
102 | 133 | ||
103 | #load the material | 134 | #load the material |
104 | material = MaterialClass(parameters.matFilename) | 135 | material = MaterialClass(parameters.matFilename) |
@@ -106,17 +137,14 @@ def RunSimulation(parameters): | @@ -106,17 +137,14 @@ def RunSimulation(parameters): | ||
106 | #add water if necessary | 137 | #add water if necessary |
107 | if parameters.inWater: | 138 | if parameters.inWater: |
108 | material.addSolution(1.33) | 139 | material.addSolution(1.33) |
109 | - | ||
110 | - #set the parameters based on the UI | ||
111 | - parameters = w.getParams() | ||
112 | - | 140 | + |
113 | #range for simulation | 141 | #range for simulation |
114 | minLambda = parameters.minLambda | 142 | minLambda = parameters.minLambda |
115 | maxLambda = parameters.maxLambda | 143 | maxLambda = parameters.maxLambda |
116 | nSamples = parameters.nSamples | 144 | nSamples = parameters.nSamples |
117 | 145 | ||
118 | #store the simulation results | 146 | #store the simulation results |
119 | - results = SimParserClass() | 147 | + results = SimParserClass(parameters) |
120 | 148 | ||
121 | #create a progress bar | 149 | #create a progress bar |
122 | pbar = ProgressBar(total=nSamples) | 150 | pbar = ProgressBar(total=nSamples) |
@@ -136,6 +164,8 @@ def RunSimulation(parameters): | @@ -136,6 +164,8 @@ def RunSimulation(parameters): | ||
136 | parameters['imag_ref_index_scale_factor'] = n.imag | 164 | parameters['imag_ref_index_scale_factor'] = n.imag |
137 | parameters['length_scale_factor'] = (2.0 * 3.14159)/l | 165 | parameters['length_scale_factor'] = (2.0 * 3.14159)/l |
138 | parameters['scattering_plane_angle_deg'] = gamma; | 166 | parameters['scattering_plane_angle_deg'] = gamma; |
167 | + #parameters['fixed_or_random_orientation'] = 0 | ||
168 | + #print(parameters['fixed_or_random_orientation']) | ||
139 | 169 | ||
140 | 170 | ||
141 | parameters.clearSpheres() | 171 | parameters.clearSpheres() |
@@ -147,25 +177,17 @@ def RunSimulation(parameters): | @@ -147,25 +177,17 @@ def RunSimulation(parameters): | ||
147 | 177 | ||
148 | #run the binary | 178 | #run the binary |
149 | from subprocess import call | 179 | from subprocess import call |
150 | - devnull = open('/dev/null', 'w') | ||
151 | - call(["./ms-tmatrix", "scriptParams.inp"], stdout=devnull) | 180 | + if parameters.showOutput: |
181 | + call(["./ms-tmatrix", "scriptParams.inp"]) | ||
182 | + else: | ||
183 | + devnull = open('/dev/null', 'w') | ||
184 | + call(["./ms-tmatrix", "scriptParams.inp"], stdout=devnull) | ||
152 | 185 | ||
153 | results.parseSimFile(l, 'test.dat') | 186 | results.parseSimFile(l, 'test.dat') |
154 | 187 | ||
155 | #update the progress bar | 188 | #update the progress bar |
156 | pbar.update_progressbar(i+1) | 189 | pbar.update_progressbar(i+1) |
157 | - | ||
158 | - | ||
159 | - #plot results of interest | ||
160 | - import matplotlib.pyplot as plt | ||
161 | - wl = results['lambda'] | ||
162 | - unpol = results['extinction_unpolarized'] | ||
163 | - para = results['extinction_parallel'] | ||
164 | - perp = results['extinction_perpendicular'] | ||
165 | - plt.plot(wl, unpol, 'r-', wl, para, 'g-', wl, perp, 'b-') | ||
166 | - plt.ylabel('Extinction') | ||
167 | - plt.xlabel('Wavelength (um)') | ||
168 | - plt.show() | 190 | + print(i+1) |
169 | 191 | ||
170 | #return the results | 192 | #return the results |
171 | return results; | 193 | return results; |
@@ -175,12 +197,6 @@ def RunSimulation(parameters): | @@ -175,12 +197,6 @@ def RunSimulation(parameters): | ||
175 | 197 | ||
176 | 198 | ||
177 | 199 | ||
178 | -#input template file name | ||
179 | -inpFilename = 'msinput.inp' | ||
180 | - | ||
181 | -#output spectral file name | ||
182 | -outFilename = 'spectralOut.txt' | ||
183 | - | ||
184 | #sphere radii | 200 | #sphere radii |
185 | a = 0.025 | 201 | a = 0.025 |
186 | #distance between spheres | 202 | #distance between spheres |
@@ -193,17 +209,6 @@ gamma = 0 | @@ -193,17 +209,6 @@ gamma = 0 | ||
193 | #results stored for each spectral sample | 209 | #results stored for each spectral sample |
194 | resultLabels = {'lambda', 'extinction_unpolarized', 'extinction_parallel', 'extinction_perpendicular'} | 210 | resultLabels = {'lambda', 'extinction_unpolarized', 'extinction_parallel', 'extinction_perpendicular'} |
195 | 211 | ||
196 | - | ||
197 | - | ||
198 | - | ||
199 | - | ||
200 | -outFile = open(outFilename, 'w') | ||
201 | - | ||
202 | -#number of characters in the progress bar | ||
203 | -pb_max = 50 | ||
204 | - | ||
205 | - | ||
206 | - | ||
207 | #create a Qt window | 212 | #create a Qt window |
208 | app = QtGui.QApplication(sys.argv) | 213 | app = QtGui.QApplication(sys.argv) |
209 | w = GuiWindow() | 214 | w = GuiWindow() |
mstm_guiwindow.ui
@@ -93,6 +93,9 @@ | @@ -93,6 +93,9 @@ | ||
93 | <height>22</height> | 93 | <height>22</height> |
94 | </rect> | 94 | </rect> |
95 | </property> | 95 | </property> |
96 | + <property name="maximum"> | ||
97 | + <number>9999</number> | ||
98 | + </property> | ||
96 | </widget> | 99 | </widget> |
97 | <widget class="QLabel" name="label_3"> | 100 | <widget class="QLabel" name="label_3"> |
98 | <property name="geometry"> | 101 | <property name="geometry"> |
@@ -155,6 +158,19 @@ | @@ -155,6 +158,19 @@ | ||
155 | <double>0.100000000000000</double> | 158 | <double>0.100000000000000</double> |
156 | </property> | 159 | </property> |
157 | </widget> | 160 | </widget> |
161 | + <widget class="QCheckBox" name="chkRandomOrientation"> | ||
162 | + <property name="geometry"> | ||
163 | + <rect> | ||
164 | + <x>190</x> | ||
165 | + <y>60</y> | ||
166 | + <width>161</width> | ||
167 | + <height>19</height> | ||
168 | + </rect> | ||
169 | + </property> | ||
170 | + <property name="text"> | ||
171 | + <string>Random Orientation</string> | ||
172 | + </property> | ||
173 | + </widget> | ||
158 | </widget> | 174 | </widget> |
159 | <widget class="QGroupBox" name="groupBox_2"> | 175 | <widget class="QGroupBox" name="groupBox_2"> |
160 | <property name="geometry"> | 176 | <property name="geometry"> |
@@ -320,6 +336,32 @@ | @@ -320,6 +336,32 @@ | ||
320 | </property> | 336 | </property> |
321 | </widget> | 337 | </widget> |
322 | </widget> | 338 | </widget> |
339 | + <widget class="QCheckBox" name="chkShowOutput"> | ||
340 | + <property name="geometry"> | ||
341 | + <rect> | ||
342 | + <x>400</x> | ||
343 | + <y>120</y> | ||
344 | + <width>131</width> | ||
345 | + <height>19</height> | ||
346 | + </rect> | ||
347 | + </property> | ||
348 | + <property name="text"> | ||
349 | + <string>MS-TM output</string> | ||
350 | + </property> | ||
351 | + </widget> | ||
352 | + <widget class="QCheckBox" name="chkInWater"> | ||
353 | + <property name="geometry"> | ||
354 | + <rect> | ||
355 | + <x>350</x> | ||
356 | + <y>20</y> | ||
357 | + <width>83</width> | ||
358 | + <height>19</height> | ||
359 | + </rect> | ||
360 | + </property> | ||
361 | + <property name="text"> | ||
362 | + <string>in water</string> | ||
363 | + </property> | ||
364 | + </widget> | ||
323 | </widget> | 365 | </widget> |
324 | <widget class="QMenuBar" name="menubar"> | 366 | <widget class="QMenuBar" name="menubar"> |
325 | <property name="geometry"> | 367 | <property name="geometry"> |
mstm_materials.py
@@ -15,9 +15,10 @@ class MaterialClass: | @@ -15,9 +15,10 @@ class MaterialClass: | ||
15 | materialList = [] | 15 | materialList = [] |
16 | 16 | ||
17 | def __init__(self, fileName=""): | 17 | def __init__(self, fileName=""): |
18 | - if fileName == "": | ||
19 | - materialList = [] | ||
20 | - else: | 18 | + |
19 | + self.materialList = [] | ||
20 | + | ||
21 | + if fileName != "": | ||
21 | self.loadFile(fileName) | 22 | self.loadFile(fileName) |
22 | 23 | ||
23 | #when the material is cast to a string, create the list of refractive indices | 24 | #when the material is cast to a string, create the list of refractive indices |
mstm_parameters.py
@@ -9,6 +9,9 @@ class ParameterClass: | @@ -9,6 +9,9 @@ class ParameterClass: | ||
9 | matFilename = 'etaSilver.txt' | 9 | matFilename = 'etaSilver.txt' |
10 | #are the sphere's in water? | 10 | #are the sphere's in water? |
11 | inWater = False | 11 | inWater = False |
12 | + | ||
13 | + #show console output from the MS-TM FORTRAN program | ||
14 | + showOutput = False | ||
12 | 15 | ||
13 | paramDict = {} | 16 | paramDict = {} |
14 | sphereList = [] | 17 | sphereList = [] |
mstm_simparser.py
@@ -2,34 +2,54 @@ class SimParserClass: | @@ -2,34 +2,54 @@ class SimParserClass: | ||
2 | 2 | ||
3 | simResults = dict() | 3 | simResults = dict() |
4 | 4 | ||
5 | - def __init__(self): | ||
6 | - self.simResults['lambda'] = list() | 5 | + def __init__(self, parameters): |
6 | + | ||
7 | + self.params = parameters; | ||
8 | + | ||
9 | + self.simResults['lambda'] = list() | ||
10 | + | ||
7 | self.simResults['extinction_unpolarized'] = list() | 11 | self.simResults['extinction_unpolarized'] = list() |
8 | self.simResults['extinction_parallel'] = list() | 12 | self.simResults['extinction_parallel'] = list() |
9 | self.simResults['extinction_perpendicular'] = list() | 13 | self.simResults['extinction_perpendicular'] = list() |
14 | + self.simResults['extinction_total'] = list() | ||
15 | + | ||
16 | + | ||
10 | 17 | ||
11 | def parseSimFile(self, l, fileName): | 18 | def parseSimFile(self, l, fileName): |
12 | self.simResults['lambda'].append(l) | 19 | self.simResults['lambda'].append(l) |
13 | inFile = open(fileName, 'r') | 20 | inFile = open(fileName, 'r') |
14 | 21 | ||
22 | + | ||
15 | while True: | 23 | while True: |
24 | + | ||
16 | line = inFile.readline().strip() | 25 | line = inFile.readline().strip() |
17 | 26 | ||
18 | - if line == 'scattering matrix elements': | ||
19 | - break | ||
20 | - elif line == 'unpolarized total ext, abs, scat efficiencies, w.r.t. xv, and asym. parm': | ||
21 | - values = inFile.readline().strip().split(' ') | ||
22 | - self.simResults['extinction_unpolarized'].append(values[0]) | ||
23 | - elif line == 'parallel total ext, abs, scat efficiencies': | ||
24 | - values = inFile.readline().strip().split(' ') | ||
25 | - self.simResults['extinction_parallel'].append(values[0]) | ||
26 | - elif line == 'perpendicular total ext, abs, scat efficiencies': | ||
27 | - values = inFile.readline().strip().split(' ') | ||
28 | - self.simResults['extinction_perpendicular'].append(values[0]) | 27 | + if int(self.params['fixed_or_random_orientation']) == 0: |
28 | + if line == 'scattering matrix elements': | ||
29 | + break | ||
30 | + elif line == 'unpolarized total ext, abs, scat efficiencies, w.r.t. xv, and asym. parm': | ||
31 | + values = inFile.readline().strip().split(' ') | ||
32 | + self.simResults['extinction_unpolarized'].append(values[0]) | ||
33 | + elif line == 'parallel total ext, abs, scat efficiencies': | ||
34 | + values = inFile.readline().strip().split(' ') | ||
35 | + self.simResults['extinction_parallel'].append(values[0]) | ||
36 | + elif line == 'perpendicular total ext, abs, scat efficiencies': | ||
37 | + values = inFile.readline().strip().split(' ') | ||
38 | + self.simResults['extinction_perpendicular'].append(values[0]) | ||
39 | + | ||
40 | + else: | ||
41 | + #print('making it here') | ||
42 | + #print(self.params['fixed_or_random_orientation']) | ||
43 | + if line == 'scattering matrix elements': | ||
44 | + break | ||
45 | + elif line == 'total ext, abs, scat efficiencies, w.r.t. xv, and asym. parm': | ||
46 | + values = inFile.readline().strip().split(' ') | ||
47 | + self.simResults['extinction_total'].append(values[0]) | ||
29 | 48 | ||
30 | def saveFile(self, fileName): | 49 | def saveFile(self, fileName): |
31 | outFile = open(fileName, 'w') | 50 | outFile = open(fileName, 'w') |
32 | outFile.write(str(self)) | 51 | outFile.write(str(self)) |
52 | + outFile.close() | ||
33 | 53 | ||
34 | def __getitem__(self, key): | 54 | def __getitem__(self, key): |
35 | return self.simResults[key]; | 55 | return self.simResults[key]; |