예제 #1
0
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)
   

                    
예제 #2
0
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)
예제 #3
0
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)
예제 #4
0
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)
예제 #5
0
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