def refine(inp,killfile=None): check_input.interrupt(killfile) while inp.fit['goon'] != 'end': check_input.set_globals(inp) # build functions to minimise from FitAllB import build_fcn build_fcn.FCN(inp) import fcn reload(fcn) # minuit fitting from FitAllB import fit lsqr = fit.fit_minuit(inp) lsqr.refine() check_input.copy_globals(inp)
def mean_ia(inp,limit,only=None): """ Calculate the internal angle for each peak and store in inp.mena_ia[inp.no_grains][inp.nrefl[i]] Jette Oddershede Januar 2009 """ import build_fcn build_fcn.FCN(inp) import fcn reload(fcn) delete = 0 for i in range(inp.no_grains): if i+1 in inp.fit['skip']: pass else: rod = n.array([inp.rod[i][0]+inp.values['rodx%s' %i],inp.rod[i][1]+inp.values['rody%s' %i],inp.rod[i][2]+inp.values['rodz%s' %i]]) for j in range(inp.nrefl[i]-1,-1,-1): Omega = tools.form_omega_mat_general(inp.w[inp.id[i][j]]*n.pi/180,inp.values['wx']*n.pi/180,inp.values['wy']*n.pi/180) gexp = fcn.gexp(inp.w[inp.id[i][j]],inp.dety[inp.id[i][j]],inp.detz[inp.id[i][j]], inp.values['wx'],inp.values['wy'],inp.values['tx'],inp.values['ty'],inp.values['tz'], inp.values['py'],inp.values['pz'],inp.values['cy'],inp.values['cz'],inp.values['L'], inp.values['x%s' %i],inp.values['y%s' %i],inp.values['z%s' %i]) gcalc = fcn.gcalc(inp.values['a'],inp.values['b'],inp.values['c'],inp.values['alpha'],inp.values['beta'],inp.values['gamma'], inp.h[i][j],inp.k[i][j],inp.l[i][j], rod[0],rod[1],rod[2], inp.values['epsaa%s' %i],inp.values['epsab%s' %i],inp.values['epsac%s' %i], inp.values['epsbb%s' %i],inp.values['epsbc%s' %i],inp.values['epscc%s' %i]) # gexp = n.dot(Omega,gexp) # gcalc = n.dot(Omega,gcalc) inp.mean_ia[i][j] = IA(n.transpose(gexp)[0],n.transpose(gcalc)[0]) # print i+1,inp.mean_ia[i][j] if inp.mean_ia[i][j] > limit: delete = delete + 1 reject(inp,i,j,'ia') if only != []: print 'Rejected', delete, 'reflection based on internal angles' insignificant(inp)
def residual(inp,limit,only=None): """ Reject outliers peaks based on residuals until mean<limit*median Jette Oddershede, Risoe DTU, May 15 2008 """ # must update inp.vars because the order here is [i][j] in stead of [id[i][j]], the latter doesn't change when peaks are rejected, the former does. # calculate experimental errors using the present values import error error.vars(inp) # build functions to minimise import build_fcn build_fcn.FCN(inp) #refinement update import fcn reload(fcn) for i in range(inp.no_grains): if i+1 in inp.fit['skip']: pass else: for j in range(inp.nrefl[i]): inp.residual[i][j] = fcn.peak(inp.values['a'],inp.values['b'],inp.values['c'],inp.values['alpha'],inp.values['beta'],inp.values['gamma'], inp.h[i][j],inp.k[i][j],inp.l[i][j], inp.w[inp.id[i][j]],inp.dety[inp.id[i][j]],inp.detz[inp.id[i][j]], #n.array([inp.Syy[inp.id[i][j]],inp.Szz[inp.id[i][j]],inp.Sww[inp.id[i][j]]]), inp.vars[i][j], inp.values['wx'],inp.values['wy'], inp.values['tx'],inp.values['ty'],inp.values['tz'], inp.values['py'],inp.values['pz'], inp.values['cy'],inp.values['cz'], inp.values['L'], inp.values['x%s' %i],inp.values['y%s' %i],inp.values['z%s' %i], inp.rod[i][0]+inp.values['rodx%s' %i], inp.rod[i][1]+inp.values['rody%s' %i], inp.rod[i][2]+inp.values['rodz%s' %i], inp.values['epsaa%s' %i],inp.values['epsab%s' %i],inp.values['epsac%s' %i], inp.values['epsbb%s' %i],inp.values['epsbc%s' %i],inp.values['epscc%s' %i]) data = deepcopy(inp.residual) maxres = [0]*inp.no_grains for i in range(inp.no_grains): data[i].sort() if i+1 in inp.fit['skip']: pass else: mean = int(n.sum(data[i])/len(data[i])) medi = median(data[i]) # print i, len(data[i]), medi, mean,'\n',data[i] while mean > limit*medi: data[i].pop() mean = int(n.sum(data[i])/inp.nrefl[i]) medi = median(data[i]) maxres[i] = max(data[i]) # print i, len(data[i]),medi,mean,'\n',data[i],'\n' delete = 0 if only==None: only = range(1,1+inp.no_grains) for i in range(inp.no_grains): if i+1 in inp.fit['skip'] or i+1 not in only: pass else: for j in range(inp.nrefl[i]-1,-1,-1): # loop backwards to make pop work if inp.residual[i][j] > maxres[i]: delete = delete + 1 reject(inp,i,j,'residual') if only != []: print 'Rejected', delete, 'reflection based on residuals' insignificant(inp)
def mean_ia_old(inp,limit,only=None): """ Calculate the internal angle for each peak and store in inp.mena_ia[inp.no_grains][inp.nrefl[i]] Jette Oddershede Januar 2009 """ import build_fcn build_fcn.FCN(inp) import fcn reload(fcn) for i in range(inp.no_grains): if i+1 in inp.fit['skip']: pass else: rod = n.array([inp.rod[i][0]+inp.values['rodx%s' %i],inp.rod[i][1]+inp.values['rody%s' %i],inp.rod[i][2]+inp.values['rodz%s' %i]]) for j in range(inp.nrefl[i]): Omega = tools.form_omega_mat_general(inp.w[inp.id[i][j]]*n.pi/180,inp.values['wx']*n.pi/180,inp.values['wy']*n.pi/180) gexp = fcn.gexp(inp.w[inp.id[i][j]],inp.dety[inp.id[i][j]],inp.detz[inp.id[i][j]], inp.values['wx'],inp.values['wy'],inp.values['tx'],inp.values['ty'],inp.values['tz'], inp.values['py'],inp.values['pz'],inp.values['cy'],inp.values['cz'],inp.values['L'], inp.values['x%s' %i],inp.values['y%s' %i],inp.values['z%s' %i]) gcalc = fcn.gcalc(inp.values['a'],inp.values['b'],inp.values['c'],inp.values['alpha'],inp.values['beta'],inp.values['gamma'], inp.h[i][j],inp.k[i][j],inp.l[i][j], rod[0],rod[1],rod[2], inp.values['epsaa%s' %i],inp.values['epsab%s' %i],inp.values['epsac%s' %i], inp.values['epsbb%s' %i],inp.values['epsbc%s' %i],inp.values['epscc%s' %i]) gexp = n.dot(Omega,gexp) gcalc = n.dot(Omega,gcalc) # print int(inp.h[i][j]), int(inp.k[i][j]), int(inp.l[i][j]),inp.w[inp.id[i][j]],inp.dety[inp.id[i][j]],inp.detz[inp.id[i][j]],'gexp', 2*n.pi*n.transpose(gexp)[0]/inp.param['wavelength'] # print int(inp.h[i][j]), int(inp.k[i][j]), int(inp.l[i][j]),inp.w[inp.id[i][j]],inp.dety[inp.id[i][j]],inp.detz[inp.id[i][j]],'gcalc', 2*n.pi*n.transpose(gcalc)[0]/inp.param['wavelength'] inp.mean_ia[i][j] = IA(n.transpose(gexp)[0],n.transpose(gcalc)[0]) # inp.mean_ia[i][j] = IAforrod(n.transpose(gexp)[0],n.transpose(gcalc)[0],rod) # print inp.h[i][j], inp.k[i][j], inp.l[i][j], inp.id[i][j], inp.mean_ia[i][j] data = deepcopy(inp.mean_ia) maxia = [0]*inp.no_grains for i in range(inp.no_grains): data[i].sort() if i+1 in inp.fit['skip']: pass else: mean = n.sum(data[i])/len(data[i]) medi = median(data[i]) # print i, len(data[i]), medi, mean,'\n',data[i] while mean > limit*medi: data[i].pop() mean = n.sum(data[i])/inp.nrefl[i] medi = median(data[i]) maxia[i] = max(data[i]) # print i, len(data[i]),medi,mean,'\n',data[i],'\n' delete = 0 if only==None: only = range(1,1+inp.no_grains) for i in range(inp.no_grains): if i+1 in inp.fit['skip'] or i+1 not in only: pass else: for j in range(inp.nrefl[i]-1,-1,-1): # loop backwards to make pop work if inp.mean_ia[i][j] > maxia[i]: delete = delete + 1 reject(inp,i,j,'ia') if only != []: print 'Rejected', delete, 'reflection based on internal angles' insignificant(inp)
def grain_values(lsqr): # """ # Calculate the contributions from each grain # For extreme contributions print a warning (*****) # # Jette Oddershede, Risoe DTU, May 15 2008 # """ # rebuild function and load import build_fcn build_fcn.FCN(lsqr.inp) import fcn reload(fcn) # save values before making a new lsqr of minuit # temp1 = deepcopy(lsqr.m.values) # temp2 = deepcopy(lsqr.m.errors) # temp3 = deepcopy(lsqr.m.fixed) # temp4 = deepcopy(lsqr.mg.tol) g = n.zeros((lsqr.inp.no_grains)) lsqr.inp.fit['poor'] = [] lsqr.poor_value = [] lsqr.poor_nrefl = [] for i in range(lsqr.inp.no_grains): if i+1 in lsqr.inp.fit['skip']: pass else: for j in range(lsqr.inp.nrefl[i]): g[i] = g[i] + fcn.peak(lsqr.m.values['a'],lsqr.m.values['b'],lsqr.m.values['c'],lsqr.m.values['alpha'],lsqr.m.values['beta'],lsqr.m.values['gamma'], lsqr.inp.h[i][j],lsqr.inp.k[i][j],lsqr.inp.l[i][j], lsqr.inp.w[lsqr.inp.id[i][j]],lsqr.inp.dety[lsqr.inp.id[i][j]],lsqr.inp.detz[lsqr.inp.id[i][j]], lsqr.inp.vars[i][j], lsqr.m.values['wx'],lsqr.m.values['wy'], lsqr.m.values['tx'],lsqr.m.values['ty'],lsqr.m.values['tz'], lsqr.m.values['py'],lsqr.m.values['pz'], lsqr.m.values['cy'],lsqr.m.values['cz'], lsqr.m.values['L'], lsqr.m.values['x%s' %i],lsqr.m.values['y%s' %i],lsqr.m.values['z%s' %i], lsqr.inp.rod[i][0]+lsqr.m.values['rodx%s' %i], lsqr.inp.rod[i][1]+lsqr.m.values['rody%s' %i], lsqr.inp.rod[i][2]+lsqr.m.values['rodz%s' %i], lsqr.m.values['epsaa%s' %i],lsqr.m.values['epsab%s' %i],lsqr.m.values['epsac%s' %i], lsqr.m.values['epsbb%s' %i],lsqr.m.values['epsbc%s' %i],lsqr.m.values['epscc%s' %i]) # for i in range(lsqr.inp.no_grains): # if i+1 not in lsqr.inp.fit['skip']: # # make new lsqr of minuit # lsqr.mg = Minuit(fcn.FCNgrain) # lsqr.mg.values = temp1 # lsqr.mg.values['i'] = i # lsqr.mg.scan(("L",1,lsqr.mg.values['L']-1,lsqr.mg.values['L']+1)) # scan to set lsqr.m.fval, function starting value # g[i] = lsqr.mg.fval data = [] poor = [] for i in range(lsqr.inp.no_grains): if i+1 not in lsqr.inp.fit['skip']: data.append(g[i]/lsqr.inp.nrefl[i]) reject.mad(data,poor,lsqr.inp.fit['rej_vol']**2) for i in range(lsqr.inp.no_grains): if i+1 not in lsqr.inp.fit['skip']: print 'Grain %i %i: %e %f' %(i+1,lsqr.inp.nrefl[i],g[i],g[i]/lsqr.inp.nrefl[i]) # give back old values # lsqr.m.errors = temp2 # lsqr.m.fixed = temp3 # lsqr.mg.tol = temp4 return g