def test_ChunkFitter(self): peaknames = ['LaB6_110', 'LaB6_111', 'LaB6_200', 'LaB6_210', 'LaB6_211', 'LaB6_220', 'LaB6_300', 'LaB6_310', 'LaB6_311', 'LaB6_222', 'LaB6_320', 'LaB6_321', 'LaB6_400', 'LaB6_410', 'LaB6_411', 'LaB6_331', 'LaB6_420', 'LaB6_421'] parnames = ['centre','width','area','eta','asymmetry','background'] pks = from_unitcell(self.x,self.y,[4.15695,4.15695,4.15695,90,90,90],'pm-3m',2,7,name='LaB6') fitter = ChunkFitter(self.x,pks) fitter.refine(self.y) result = fitter.lastresult yfit = fitter.lastfit saveplot(self.x,self.y,yfit,'chunkfitter.png') self.assertListEqual(peaknames,[p.name for p in pks]) self.assertItemsEqual(result['LaB6_110'].keys(),parnames) self.assertTupleEqual(yfit.shape,(4096,)) cens = [p.centre.nominal_value for p in pks] self.assertEquals(len(cens),18) self.assertAlmostEquals(cens[0],2.1391,4) self.assertAlmostEquals(cens[2],3.0249,4) self.assertAlmostEquals(cens[4],3.7053,4) self.assertAlmostEquals(cens[8],5.0154,4) self.assertAlmostEquals(cens[12],6.0520,4) self.assertAlmostEquals(cens[16],6.7653,4)
def fit(source,x,material,qmin,qmax,reestimate=True,**kwargs): counts,info = source.next() #build fitter on first go ymin_on_ymax = kwargs.pop('ymin_on_ymax',None) if hasattr(material,'space_group'): peaks = from_unitcell(x.mean(axis=0),counts.mean(axis=0),material.unit_cell, material.space_group,qmin,qmax,name=material.name, ymin_on_ymax=ymin_on_ymax) else: peaks=[] for mat in material: peaks.extend(from_unitcell(x.mean(axis=0),counts.mean(axis=0),mat.unit_cell, mat.space_group,qmin,qmax,name=mat.name, ymin_on_ymax=ymin_on_ymax)) print 'fitting %i peaks'%len(peaks) print [p.name for p in peaks]
def test_PeakFitterAdd(self): peaknames = ['LaB6_110', 'LaB6_111', 'LaB6_200', 'LaB6_210', 'LaB6_211'] pks = from_unitcell(self.x,self.y,[4.15695,4.15695,4.15695,90,90,90],'pm-3m',2,4,name='LaB6') fitter = PeakFitter(self.x,[]) for p in pks: fitter.add(p) fitter.refine(self.y) self.assertListEqual(peaknames,[p.name for p in pks]) cens = [p.centre.nominal_value for p in pks] self.assertEquals(len(cens),5) self.assertAlmostEquals(cens[0],2.1391,4) self.assertAlmostEquals(cens[1],2.6195,4) self.assertAlmostEquals(cens[2],3.0249,4) pks = from_unitcell(self.x,self.y,[4.15695,4.15695,4.15695,90,90,90],'pm-3m',2,4,name='LaB6') fitter = PeakFitter(self.x,[]) fitter.add_many(pks) fitter.refine(self.y) self.assertListEqual(peaknames,[p.name for p in pks]) cens = [p.centre.nominal_value for p in pks] self.assertEquals(len(cens),5) self.assertAlmostEquals(cens[0],2.1391,4) self.assertAlmostEquals(cens[1],2.6195,4) self.assertAlmostEquals(cens[2],3.0249,4) pks = from_unitcell(self.x,self.y,[4.15695,4.15695,4.15695,90,90,90],'pm-3m',2,4,name='LaB6') fitter = PeakFitter(self.x,pks[0:2]) for p in pks[2:]: fitter.add(p) fitter.refine(self.y) self.assertListEqual(peaknames,[p.name for p in pks]) cens = [p.centre.nominal_value for p in pks] self.assertEquals(len(cens),5) self.assertAlmostEquals(cens[0],2.1391,4) self.assertAlmostEquals(cens[1],2.6195,4) self.assertAlmostEquals(cens[2],3.0249,4)
def test_PeakFitterUncertainties(self): y = unumpy.uarray((self.y,np.sqrt(self.y))) peaknames = ['LaB6_110', 'LaB6_111', 'LaB6_200', 'LaB6_210', 'LaB6_211'] pks = from_unitcell(self.x,y,[4.15695,4.15695,4.15695,90,90,90],'pm-3m',2,4,name='LaB6') fitter = PeakFitter(self.x,pks) fitter.refine(y) saveplot(self.x,unumpy.nominal_values(y),fitter.lastfit,'peakfitter_uncertainties.png') self.assertListEqual(peaknames,[p.name for p in pks]) cens = [p.centre.nominal_value for p in pks] self.assertEquals(len(cens),5) self.assertAlmostEquals(cens[0],2.1391,4) self.assertAlmostEquals(cens[1],2.6195,4) self.assertAlmostEquals(cens[2],3.0249,4)
def test_PeakFitter(self): peaknames = ['LaB6_110', 'LaB6_111', 'LaB6_200', 'LaB6_210', 'LaB6_211'] pks = from_unitcell(self.x,self.y,[4.15695,4.15695,4.15695,90,90,90],'pm-3m',2,4,name='LaB6') fitter = PeakFitter(self.x,pks) fitter.refine(self.y) result = fitter.lastresult saveplot(self.x,self.y,fitter.lastfit,'peakfitter.png') cens = [v['centre'].nominal_value for v in result.itervalues()] censu = [v['centre'].std_dev() for v in result.itervalues()] self.assertListEqual([p.centre.nominal_value for p in pks],cens) self.assertListEqual([p.centre.std_dev() for p in pks],censu) self.assertListEqual(peaknames,[p.name for p in pks]) self.assertEquals(len(cens),5) self.assertAlmostEquals(cens[0],2.1391,4) self.assertAlmostEquals(cens[1],2.6195,4) self.assertAlmostEquals(cens[2],3.0249,4)
def makepeaks(x,y): return from_unitcell(x,y,[4.15695,4.15695,4.15695,90,90,90],'pm-3m',2,5,name='LaB6')
for line in ax.xaxis.get_ticklines()+ax.yaxis.get_ticklines(): line.set_markeredgewidth(1) ax.minorticks_off() f.savefig('wavelet_peaksearch.png',dpi=100) if 1: from edxrd.test import get_test_data edxdata = get_test_data.getedxdata() x,y = edxdata['LaB6'] x=np.poly1d([1e-9, 0.001942,0.005])(x) unit_cell = [4.15695,4.15695,4.15695,90,90,90] space_group = 'pm-3m' from edxrd.peaksearch import from_unitcell pks = from_unitcell(x,y,unit_cell,space_group,2,4.4, name='LaB6',shape='g') print pks[0].centre yfit = np.zeros_like(x) for pk in pks: yfit+=pk.profile(x) f,ax = plt.subplots(1,1,figsize=(7,4)) f.subplots_adjust(bottom=0.15) ax.plot(x,y,'b-') ax.plot(x,yfit,'r-',lw=1) ax.set_yticks([]) ax.set_xbound(0.8,6) ax.set_xlabel('$\mathrm{Q} (\AA^{-1})$') f.savefig('unitcell_peaksearch.png',dpi=100) #plt.show()