def test_dda_fit(): s = Sphere(n=1.59, r=.2, center=(5, 5, 5)) o = Optics(wavelen=.66, index=1.33, pixel_scale=.1) schema = ImageSchema(optics=o, shape=100) h = Mie.calc_holo(s, schema) def make_scatterer(r, x, y, z): local_s = Sphere(r=r, center=(x, y, z)) return Scatterer(local_s.indicators, n=s.n) parameters = [ par(.18, [.1, .3], name='r', step=.1), par(5, [4, 6], 'x'), par(5, [4, 6], 'y'), par(5.2, [4, 6], 'z') ] p = Parametrization(make_scatterer, parameters) model = Model(p, DDA.calc_holo) res = fit(model, h) assert_parameters_allclose(res.parameters, dict([('r', 0.2003609439787491), ('x', 5.0128083665603995), ('y', 5.0125252883133617), ('z', 4.9775097284878775)]), rtol=1e-3)
def calculateHologram(self): #calculate hologram with current settings self.warning.setText('Calculating...') #self.compute.setChecked(True) scale = self.scale sender = self.sender() ######## hologram calculation (4x big to allow scrolling) start = time.time() sphere = Sphere(n = self.lcd5.value()+.0001j, r = self.lcd4.value(), center = (256*self.scale,256*self.scale,self.lcd3.value())) sphere2 = Sphere(n = self.lcd5.value()+.0001j, r = self.lcd4.value(), center = (self.lcd.value(),self.lcd2.value(),self.lcd3.value())) self.sphObject.setText(repr(sphere2)) schema = ImageSchema(shape = 512, spacing = float(self.pxsizeText.text()), optics = Optics(wavelen = float(self.waveText.text()), index = float(self.mindexText.text()), polarization = [1,0])) schema2 = ImageSchema(shape = 256, spacing = float(self.pxsizeText.text()), optics = Optics(wavelen = float(self.waveText.text()), index = float(self.mindexText.text()), polarization = [1,0])) self.schemaObject.setText(str(repr(schema2))) self.holo = Mie.calc_holo(sphere, schema) self.lastholo = self.holo self.lastZ = self.lcd3.value() end = time.time() #now take only the part that you want to display x = round(self.sld.value()) y = round(self.sld2.value()) im = toimage(self.holo[256-x:512-x,256-y:512-y]) #PIL image #https://github.com/shuge/Enjoy-Qt-Python-Binding/blob/master/image/display_img/pil_to_qpixmap.py #myQtImage = ImageQt(im) #qimage = QtGui.QImage(myQtImage) if im.mode == "RGB": pass elif im.mode == "L": im = im.convert("RGBA") data = im.tostring('raw',"RGBA") qim = QtGui.QImage(data, 256, 256, QtGui.QImage.Format_ARGB32) pixmap = QtGui.QPixmap.fromImage(qim) myScaledPixmap = pixmap.scaled(QtCore.QSize(400,400)) self.warning.setText('') self.hologram.setPixmap(myScaledPixmap) #self.hologram.setScaledContents(True) #myScaledPixmap.scaledToWidth(True) self.timer.setText('Calc. Time: '+str(round(end-start,4))+' s') self.timer.setAlignment(QtCore.Qt.AlignBottom | QtCore.Qt.AlignCenter)
def test_serialization(): par_s = Sphere(center=(par(.567e-5, [0, 1e-5]), par(.576e-6, [0, 1e-5]), par(15e-6, [1e-5, 2e-5])), r=par(8.5e-7, [1e-8, 1e-5]), n=par(1.59, [1, 2])) alpha = par(.6, [.1, 1], 'alpha') schema = ImageSchema(shape=100, spacing=.1151e-6, optics=Optics(.66e-6, 1.33)) model = Model(par_s, Mie.calc_holo, alpha=alpha) holo = Mie.calc_holo(model.scatterer.guess, schema, model.alpha.guess) result = fit(model, holo) temp = tempfile.NamedTemporaryFile() save(temp, result) temp.flush() temp.seek(0) loaded = load(temp) assert_obj_close(result, loaded, context='serialized_result')
def test_layered(): s = Sphere(n = (1,2), r = (1, 2), center = (2, 2, 2)) sch = ImageSchema((10, 10), .2, Optics(.66, 1, (1, 0))) hs = Mie.calc_holo(s, sch) guess = hp.scattering.scatterer.sphere.LayeredSphere((1,2), (par(1.01), par(.99)), (2, 2, 2)) model = Model(guess, Mie.calc_holo) res = fit(model, hs) assert_allclose(res.scatterer.t, (1, 1), rtol = 1e-12)
def test_fit_superposition(): """ Fit Mie superposition to a calculated hologram from two spheres """ # Make a test hologram optics = Optics(wavelen=6.58e-07, index=1.33, polarization=[0.0, 1.0], divergence=0, spacing=None, train=None, mag=None, pixel_scale=[2 * 2.302e-07, 2 * 2.302e-07]) s1 = Sphere(n=1.5891 + 1e-4j, r=.65e-6, center=(1.56e-05, 1.44e-05, 15e-6)) s2 = Sphere(n=1.5891 + 1e-4j, r=.65e-6, center=(3.42e-05, 3.17e-05, 10e-6)) sc = Spheres([s1, s2]) alpha = .629 theory = Mie(optics, 100) holo = theory.calc_holo(sc, alpha) # Now construct the model, and fit parameters = [ Parameter(name='x0', guess=1.6e-5, limit=[0, 1e-4]), Parameter('y0', 1.4e-5, [0, 1e-4]), Parameter('z0', 15.5e-6, [0, 1e-4]), Parameter('r0', .65e-6, [0.6e-6, 0.7e-6]), Parameter('nr', 1.5891, [1, 2]), Parameter('x1', 3.5e-5, [0, 1e-4]), Parameter('y1', 3.2e-5, [0, 1e-4]), Parameter('z1', 10.5e-6, [0, 1e-4]), Parameter('r1', .65e-6, [0.6e-6, 0.7e-6]) ] def make_scatterer(x0, x1, y0, y1, z0, z1, r0, r1, nr): s = Spheres([ Sphere(center=(x0, y0, z0), r=r0, n=nr + 1e-4j), Sphere(center=(x1, y1, z1), r=r1, n=nr + 1e-4j) ]) return s model = Model(parameters, Mie, make_scatterer=make_scatterer, alpha=Parameter('alpha', .63, [.5, 0.8])) result = fit(model, holo) assert_obj_close(result.scatterer, sc) assert_approx_equal(result.alpha, alpha, significant=4) assert_equal(result.model, model) assert_read_matches_write(result)
def test_n(): sph = Sphere(par(.5), 1.6, (5,5,5)) sch = ImageSchema(shape=[100, 100], spacing=[0.1, 0.1], optics=Optics(wavelen=0.66, index=1.33, polarization=[1, 0], divergence=0.0), origin=[0.0, 0.0, 0.0]) model = Model(sph, Mie.calc_holo, alpha=1) holo = Mie.calc_holo(model.scatterer.guess, sch) coster = CostComputer(holo, model, random_subset=.1) assert_allclose(coster.flattened_difference({'n' : .5}), 0)
def test_integer_correctness(): # we keep having bugs where the fitter doesn't schema = ImageSchema(shape = 100, spacing = .1, optics = Optics(wavelen = .660, index = 1.33, polarization = (1, 0))) s = Sphere(center = (10.2, 9.8, 10.3), r = .5, n = 1.58) holo = Mie.calc_holo(s, schema) par_s = Sphere(center = (par(guess = 10, limit = [5,15]), par(10, [5, 15]), par(10, [5, 15])), r = .5, n = 1.58) model = Model(par_s, Mie.calc_holo, alpha = par(.6, [.1, 1])) result = fit(model, holo) assert_allclose(result.scatterer.center, [10.2, 9.8, 10.3])
def test_n(): sph = Sphere(par(.5), 1.6, (5,5,5)) sch = ImageSchema(shape=[100, 100], spacing=[0.1, 0.1], optics=Optics(wavelen=0.66, index=1.33, polarization=[1, 0], divergence=0.0), origin=[0.0, 0.0, 0.0]) model = Model(sph, Mie.calc_holo, alpha=1) holo = Mie.calc_holo(model.scatterer.guess, sch) coster = CostComputer(holo, model, use_random_fraction=.1) assert_allclose(coster.flattened_difference({'n' : .5}), 0)
def test_fit_superposition(): """ Fit Mie superposition to a calculated hologram from two spheres """ # Make a test hologram optics = Optics(wavelen=6.58e-07, index=1.33, polarization=[0.0, 1.0], divergence=0, spacing=None, train=None, mag=None, pixel_scale=[2*2.302e-07, 2*2.302e-07]) s1 = Sphere(n=1.5891+1e-4j, r = .65e-6, center=(1.56e-05, 1.44e-05, 15e-6)) s2 = Sphere(n=1.5891+1e-4j, r = .65e-6, center=(3.42e-05, 3.17e-05, 10e-6)) sc = Spheres([s1, s2]) alpha = .629 theory = Mie(optics, 100) holo = theory.calc_holo(sc, alpha) # Now construct the model, and fit parameters = [Parameter(name = 'x0', guess = 1.6e-5, limit = [0, 1e-4]), Parameter('y0', 1.4e-5, [0, 1e-4]), Parameter('z0', 15.5e-6, [0, 1e-4]), Parameter('r0', .65e-6, [0.6e-6, 0.7e-6]), Parameter('nr', 1.5891, [1, 2]), Parameter('x1', 3.5e-5, [0, 1e-4]), Parameter('y1', 3.2e-5, [0, 1e-4]), Parameter('z1', 10.5e-6, [0, 1e-4]), Parameter('r1', .65e-6, [0.6e-6, 0.7e-6])] def make_scatterer(x0, x1, y0, y1, z0, z1, r0, r1, nr): s = Spheres([ Sphere(center = (x0, y0, z0), r=r0, n = nr+1e-4j), Sphere(center = (x1, y1, z1), r=r1, n = nr+1e-4j)]) return s model = Model(parameters, Mie, make_scatterer=make_scatterer, alpha = Parameter('alpha', .63, [.5, 0.8])) result = fit(model, holo) assert_obj_close(result.scatterer, sc) assert_approx_equal(result.alpha, alpha, significant=4) assert_equal(result.model, model) assert_read_matches_write(result)
def test_dda_fit(): s = Sphere(n = 1.59, r = .2, center = (5, 5, 5)) o = Optics(wavelen = .66, index=1.33, pixel_scale=.1) schema = ImageSchema(optics = o, shape = 100) h = Mie.calc_holo(s, schema) def make_scatterer(r, x, y, z): local_s = Sphere(r = r, center = (x, y, z)) return Scatterer(local_s.indicators, n = s.n) parameters = [par(.18, [.1, .3], name='r', step=.1), par(5, [4, 6], 'x'), par(5, [4,6], 'y'), par(5.2, [4, 6], 'z')] p = Parametrization(make_scatterer, parameters) model = Model(p, DDA.calc_holo) res = fit(model, h) assert_parameters_allclose(res.parameters, OrderedDict([('r', 0.2003609439787491), ('x', 5.0128083665603995), ('y', 5.0125252883133617), ('z', 4.9775097284878775)]), rtol=1e-3)
def test_serialization(): par_s = Sphere(center = (par(.567e-5, [0, 1e-5]), par(.576e-6, [0, 1e-5]), par(15e-6, [1e-5, 2e-5])), r = par(8.5e-7, [1e-8, 1e-5]), n = par(1.59, [1,2])) alpha = par(.6, [.1, 1], 'alpha') schema = ImageSchema(shape = 100, spacing = .1151e-6, optics = Optics(.66e-6, 1.33)) model = Model(par_s, Mie.calc_holo, alpha=alpha) holo = Mie.calc_holo(model.scatterer.guess, schema, model.alpha.guess) result = fit(model, holo) temp = tempfile.NamedTemporaryFile() save(temp, result) temp.flush() temp.seek(0) loaded = load(temp) assert_obj_close(result, loaded, context = 'serialized_result')
import scipy from holopy.scattering.scatterer import Sphere, Spheres from holopy.core import ImageSchema, Optics from holopy.scattering.theory import Mie import matplotlib.pyplot as plt sphere = Sphere(n = 1.59+.0001j, r = .5, center = (4, 3, 5)) schema = ImageSchema(shape = 100, spacing = .1, optics = Optics(wavelen = .660, index = 1.33, polarization = [1,0])) s1 = Sphere(center=(5, 5, 5), n = 1.59, r = .5) s2 = Sphere(center=(4, 4, 5), n = 1.59, r = .5) collection = Spheres([s1, s2]) holo = Mie.calc_holo(collection, schema) scipy.misc.imsave('holoTest.png',holo) plt.imshow(holo) plt.show()
import holopy as hp from holopy.scattering.theory import Mie from holopy.scattering.scatterer import Sphere, Spheres from holopy.core import ImageSchema, Optics schema = ImageSchema(shape=100, spacing=.1, optics=Optics(wavelen=.660, index=1.33, polarization=[1, 0])) s1 = Sphere(center=(5, 5, 5), n=1.59, r=.5) s2 = Sphere(center=(4, 4, 5), n=1.59, r=.5) collection = Spheres([s1, s2]) holo = Mie.calc_holo(collection, schema) hp.show(holo)
import holopy as hp from holopy.scattering.scatterer import Sphere from holopy.scattering.theory import Mie from holopy.core import ImageSchema, Optics schema = ImageSchema(shape = 100, spacing = .1, optics = Optics(wavelen = .660, index = 1.33, polarization = [1,0])) cs = Sphere(center=(2.5, 5, 5), n = (1.59, 1.42),\ r = (0.3, 0.6)) holo = Mie.calc_holo(cs, schema) hp.show(holo)
import holopy as hp from holopy.scattering.scatterer import Sphere from holopy.core import ImageSchema, Optics from holopy.scattering.theory import Mie sphere = Sphere(n=1.59 + .0001j, r=.5, center=(4, 3, 5)) schema = ImageSchema(shape=100, spacing=.1, optics=Optics(wavelen=.660, index=1.33, polarization=[1, 0])) holo = Mie.calc_holo(sphere, schema) hp.show(holo)
import holopy as hp from holopy.scattering.scatterer import Sphere from holopy.core import ImageSchema, Optics from holopy.scattering.theory import Mie sphere = Sphere(n = 1.59+.0001j, r = .5, center = (4, 3, 5)) schema = ImageSchema(shape = 100, spacing = .1, optics = Optics(wavelen = .660, index = 1.33, polarization = [1,0])) holo = Mie.calc_holo(sphere, schema) hp.show(holo)
def calculateHologram(self): # calculate hologram with current settings self.warning.setText("Calculating...") # self.compute.setChecked(True) scale = self.scale sender = self.sender() ######## hologram calculation (4x big to allow scrolling) start = time.time() sphere = Sphere( n=self.lcd5.value() + 0.0001j, r=self.lcd4.value(), center=(256 * self.scale, 256 * self.scale, self.lcd3.value()), ) sphere2 = Sphere( n=self.lcd5.value() + 0.0001j, r=self.lcd4.value(), center=(self.lcd.value(), self.lcd2.value(), self.lcd3.value()), ) self.sphObject.setText(repr(sphere2)) schema = ImageSchema( shape=512, spacing=float(self.pxsizeText.text()), optics=Optics( wavelen=float(self.waveText.text()), index=float(self.mindexText.text()), polarization=[1, 0] ), ) schema2 = ImageSchema( shape=256, spacing=float(self.pxsizeText.text()), optics=Optics( wavelen=float(self.waveText.text()), index=float(self.mindexText.text()), polarization=[1, 0] ), ) self.schemaObject.setText(str(repr(schema2))) self.holo = Mie.calc_holo(sphere, schema) self.lastholo = self.holo self.lastZ = self.lcd3.value() end = time.time() # now take only the part that you want to display x = round(self.sld.value()) y = round(self.sld2.value()) im = toimage(self.holo[256 - x : 512 - x, 256 - y : 512 - y]) # PIL image # https://github.com/shuge/Enjoy-Qt-Python-Binding/blob/master/image/display_img/pil_to_qpixmap.py # myQtImage = ImageQt(im) # qimage = QtGui.QImage(myQtImage) if im.mode == "RGB": pass elif im.mode == "L": im = im.convert("RGBA") data = im.tostring("raw", "RGBA") qim = QtGui.QImage(data, 256, 256, QtGui.QImage.Format_ARGB32) pixmap = QtGui.QPixmap.fromImage(qim) myScaledPixmap = pixmap.scaled(QtCore.QSize(400, 400)) self.warning.setText("") self.hologram.setPixmap(myScaledPixmap) # self.hologram.setScaledContents(True) # myScaledPixmap.scaledToWidth(True) self.timer.setText("Calc. Time: " + str(round(end - start, 4)) + " s") self.timer.setAlignment(QtCore.Qt.AlignBottom | QtCore.Qt.AlignCenter)
import holopy as hp from holopy.scattering.scatterer import Sphere from holopy.scattering.theory import Mie from holopy.core import ImageSchema, Optics schema = ImageSchema(shape=100, spacing=.1, optics=Optics(wavelen=.660, index=1.33, polarization=[1, 0])) cs = Sphere(center=(2.5, 5, 5), n = (1.59, 1.42),\ r = (0.3, 0.6)) holo = Mie.calc_holo(cs, schema) hp.show(holo)
def calculateHologram(self): #calculate hologram with current settings #schema is generic to all scattering theories schema = ImageSchema(shape = [int(self.heightText.text()),int(self.widthText.text())], spacing = float(self.pxsizeText.text()), optics = Optics(wavelen = float(self.waveText.text()), index = float(self.mindexText.text()), polarization = [1.0,0.0])) self.schemaObject.setText(str(repr(schema))) #first sphere is general for both single sphere and two sphere cases sphere = Sphere(n = self.lcd5.value()+.0001j, r = self.lcd4.value(), center = (self.lcd.value(),self.lcd2.value(),self.lcd3.value())) if self.reconstruct.isChecked(): self.slideZ(sphere, schema) start = end = 0 #fake time since reconstruction time is odd to keep track of here else: scale = self.scale sender = self.sender() start = time.time() if self.onesphere.checkState() == 2: self.sphObject.setText(repr(sphere)) #we have two theories to choose from for computing single sphere holograms if sphere.parameters != self.oldscattererparameters: #when changing parameters, always use GPU because it's fast enough self.gpu.toggle() if self.cpu.isChecked(): if sphere.parameters == self.oldMieCPUparameters and repr(schema) == repr(self.oldMieCPUschema): self.holo = self.oldMieCPUHolo print 'loaded cached mie hologram' else: self.holo = Mie.calc_holo(sphere,schema) print 'freshly calculated mie hologram' self.oldMieCPUHolo = self.holo self.oldMieCPUparameters = sphere.parameters self.oldMieCPUschema = schema else: if sphere.parameters == self.oldscattererparameters and repr(schema) == repr(self.oldMieGPUschema): self.holo = self.oldMieGPUHolo print 'loaded cached GPU hologram' else: self.holo = gpuMie.calc_holo(sphere, schema) self.oldMieGPUHolo = self.holo self.oldscattererparameters = sphere.parameters self.oldMieGPUschema = schema self.oldscatterer = sphere self.oldschema = schema else: #we have three theories to choose from for computing single sphere holograms s1 = sphere s2 = Sphere(n = self.lcd5.value()+.0001j, r = self.lcd4.value(), center = (self.lcd7.value(),self.lcd8.value(),self.lcd9.value())) cluster = Spheres([s1, s2]) self.sphObject.setText(repr(cluster)) if cluster.parameters != self.oldscatterer.parameters: self.gpu.toggle() if self.cpu.isChecked(): if cluster.parameters == self.oldMieCPUparameters and repr(schema) == repr(self.oldMieCPUschema): self.holo = self.oldMieCPUHolo print 'loaded cached CPU superposition hologram' else: self.holo = Mie.calc_holo(cluster, schema) self.oldMieCPUHolo = self.holo self.oldMieCPUschema = schema self.oldMieCPUparameters = cluster.parameters if self.multisphere.isChecked(): if cluster.parameters == self.oldMultiparameters and repr(schema) == repr(self.oldMultischema): self.holo = self.oldMultiHolo print 'loaded cached CPU multisphere hologram' else: self.holo = Multisphere.calc_holo(cluster, schema) self.oldtheory = 'multi' self.oldMultiHolo = self.holo self.oldMultiparameters = cluster.parameters self.oldMultischema = schema print 'multisphere calculation done' if self.gpu.isChecked(): if cluster.parameters == self.oldscattererparameters and repr(schema) == repr(self.oldschema): self.holo = self.oldMieGPUHolo print 'loaded cached GPU hologram' else: self.holo = gpuMie.calc_holo(cluster, schema) self.oldMieGPUHolo = self.holo self.oldschema = schema self.oldscatterer = cluster self.oldscattererparameters = cluster.parameters end = time.time() #display the hologram im = scipy.misc.toimage(self.holo) #PIL image #https://github.com/shuge/Enjoy-Qt-Python-Binding/blob/master/image/display_img/pil_to_qpixmap.py if im.mode == "RGB": pass elif im.mode == "L": im = im.convert("RGBA") data = im.tostring('raw',"RGBA") qim = QtGui.QImage(data, float(self.widthText.text()), float(self.heightText.text()), QtGui.QImage.Format_ARGB32) pixmap = QtGui.QPixmap.fromImage(qim) #set size of displayed image with max width or height = 500 px if float(self.widthText.text()) == float(self.heightText.text()): scaledsize = [500,500] else: if float(self.widthText.text()) > float(self.heightText.text()): scaledsize = [500,500/float(self.widthText.text())*float(self.heightText.text())] else: scaledsize = [500/float(self.heightText.text())*float(self.widthText.text()),500] myScaledPixmap = pixmap.scaled(QtCore.QSize(scaledsize[0],scaledsize[1])) self.warning.setText('') self.label.setPixmap(myScaledPixmap) if end-start > 0.03: self.timer.setText('Calc. Time: '+str(round(end-start,4))+' s') else: self.timer.setText('') if self.lcd3.value()<2*self.lcd4.value() or self.lcd9.value()<2*self.lcd4.value(): self.warning.setText('z < sphere diameter') if self.lcd.value() > float(self.heightText.text())*float(self.pxsizeText.text()): self.warning.setText('x out of range, move slider or increase height') if self.lcd2.value() > float(self.widthText.text())*float(self.pxsizeText.text()): self.warning.setText('y out of range, move slider or increase width') if float(self.pxsizeText.text()) <= 0: self.warning.setText('pixel scale must be greater than 0')