예제 #1
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)
예제 #2
0
 def test_find_omega_general_nowedge(self):
     # generate random gvector
     hkl = n.array([
         round(n.random.rand() * 10 - 5),
         round(n.random.rand() * 10 - 5),
         round(n.random.rand() * 10 - 5)
     ])
     ucell = n.array([
         3.5 + n.random.rand(), 3.5 + n.random.rand(),
         3.5 + n.random.rand(), 89.5 + n.random.rand(),
         89.5 + n.random.rand(), 89.5 + n.random.rand()
     ])
     B = tools.form_b_mat(ucell)
     U = tools.euler_to_u(n.random.rand() * 2. * n.pi,
                          n.random.rand() * 2. * n.pi,
                          n.random.rand() * n.pi)
     wavelength = 0.95 + n.random.rand() * 0.1
     gvec = n.dot(U, n.dot(B, hkl))
     tth = tools.tth(ucell, hkl, wavelength)
     # calculate corresponding eta and Omega using tools.find_omega_general
     (omega1,
      eta1) = tools.find_omega_general(gvec * wavelength / (4. * n.pi), tth,
                                       0, 0)
     Om1 = []
     for i in range(len(omega1)):
         Om1.append(tools.form_omega_mat_general(omega1[i], 0, 0))
     # calculate corresponding eta and Omega using tools.find_omega_wedge
     omega2 = tools.find_omega(gvec, tth)
     Om2 = []
     for i in range(len(omega2)):
         Om2.append(tools.form_omega_mat(omega2[i]))
     #assert
     for i in range(len(omega1)):
         #            print Om1[i]
         #            print Om2[i]
         diff = n.abs(Om1[i] - Om2[i]).sum()
         self.assertAlmostEqual(diff, 0, 9)
예제 #3
0
def intensity(inp):
        """
        Reject peaks based on intensity
        
        Jette Oddershede, August 27 2008
        Absorption correction added December 2011
        """
        
        if  inp.files['structure_file'] != None:
            inp.param['structure_phase_0'] = inp.files['structure_file']
            xtal_structure = reflections.open_structure(inp.param,0)
            hkl = reflections.gen_miller(inp.param,0)
            hkl = reflections.calc_intensity(hkl,xtal_structure)
#            print hkl
            
            if inp.fit['abs_mu'] > 0:
                xmin = min(inp.fit['abs_xlim'])*1e3
                xmax = max(inp.fit['abs_xlim'])*1e3
                ymin = min(inp.fit['abs_ylim'])*1e3
                ymax = max(inp.fit['abs_ylim'])*1e3
            
            for i in range(inp.no_grains):
                x = deepcopy(inp.values['x%s' %i])
                y = deepcopy(inp.values['y%s' %i])
                z = deepcopy(inp.values['z%s' %i])
                #Make sure that grain not outside of bounds for doing the correction
                if inp.fit['abs_mu'] > 0:
                    if x < xmin:
                        x = xmin
                    elif x > xmax:
                        x = xmax
                    if y < ymin:
                        y = ymin                
                    elif y > ymax:
                        y = ymax                
                for j in range(inp.nrefl[i]):
                    h = inp.h[i][j]
                    k = inp.k[i][j]
                    l = inp.l[i][j]
                    # Absorption correction start
                    if inp.fit['abs_mu'] > 0:
                        w = inp.w[inp.id[i][j]]
                        dety = inp.dety[inp.id[i][j]]
                        detz = inp.detz[inp.id[i][j]]
                        Omega = tools.form_omega_mat_general(w*n.pi/180.,inp.values['wx']*n.pi/180.,inp.values['wy']*n.pi/180.)
                        R = tools.detect_tilt(inp.values['tx'],inp.values['ty'],inp.values['tz'])
                        d_out = n.dot(R,n.array([[0],
                                                [(dety-inp.values['cy'])*inp.values['py']],
                                                [(detz-inp.values['cz'])*inp.values['pz']]])) 
                        d_out = d_out + n.array([[inp.values['L']],[0],[0]]) - n.dot(Omega,n.array([[x],[y],[z]]))
                        d_out = n.dot(n.transpose(Omega),d_out/n.sqrt(n.sum(d_out**2)))
                        d_in = n.dot(n.transpose(Omega),n.array([[-1],[0],[0]])) #from grain to source!
                        # distance to bounding planes assuming d_in and d_out unit vectors
                        xdist_in = 1e6
                        xdist_out = 1e6
                        ydist_in = 1e6
                        ydist_out = 1e6
                        if d_in[0] < 0:
                            xdist_in = (x-xmin)/abs(d_in[0,0])
                        elif d_in[0] > 0:
                            xdist_in = (xmax-x)/abs(d_in[0,0])
                        if d_in[1] < 0:
                            ydist_in = (y-ymin)/abs(d_in[1,0])
                        elif d_in[1] > 0:
                            ydist_in = (ymax-y)/abs(d_in[1,0])
                        dist_in = min(xdist_in,ydist_in)
                        if d_out[0] < 0:
                            xdist_out = (x-xmin)/abs(d_out[0,0])
                        elif d_out[0] > 0:
                            xdist_out = (xmax-x)/abs(d_out[0,0])
                        if d_out[1] < 0:
                            ydist_out = (y-ymin)/abs(d_out[1,0])
                        elif d_out[1] > 0:
                            ydist_out = (ymax-y)/abs(d_out[1,0])
                        dist_out = min(xdist_out,ydist_out)
                        dist = dist_in + dist_out
                        # abs_mu in mm-1 and dist in microns
                        exponential = n.exp(inp.fit['abs_mu']*dist*1e-3)
                        #print h,k,l,w,x,y,z,dist_in*1e-3,dist_out*1e-3,dist*1e-3,exponential
                    else:
                        exponential = 1.
                    
                    # Absorption correction end
                    value = False
                    for m in range(len(hkl)):
                        if hkl[m][0] == h and hkl[m][1] == k and hkl[m][2] == l:
                            inp.volume[i][j] = inp.F2vol[inp.id[i][j]]/hkl[m][3]*exponential
                            value = True
                            break
                        else:
                            pass
                    if value == False:
#                        print i+1,j+1,h,k,l,'should never go here, ask osho for help...'
                        inp.volume[i][j] = -1
                        
            data = deepcopy(inp.volume)
            minvol = []
            maxvol = []
            for i in range(inp.no_grains):
                if i+1 in inp.fit['skip']:
                    pass
                else:
                    rej = []
                    newreject = 1
                    while newreject > 0:
                        tmp = len(rej)
                        mad(data[i],rej,inp.fit['rej_vol'])
                        newreject = len(rej) - tmp
                    avgdata = n.sum(data[i])/len(data[i])
                    sigdata = spread(data[i])
                    if len(rej) > 1:
                        avgrej = n.sum(rej)/len(rej)
                        sigrej = spread(rej)
                    elif len(rej) == 1:
                        avgrej = rej[0]
                        sigrej = 0                
                    else:
                        avgrej = 0
                        sigrej = 0
                if len(data[i]) > 0:
                    minvol.append(max(0,min(data[i])))
                    maxvol.append(max(data[i]))
                else: 
                    minvol.append(0)
                    maxvol.append(-1)
                    if i+1 not in inp.fit['skip']:
                        inp.fit['skip'].append(i+1)
                    
#                   print '\n',i, avgdata, sigdata, len(data[i]), minvol[i], maxvol[i],'\n   ',avgrej, sigrej, len(reject)#,'\n',data[i],'\n',reject

            delete = 0
            for i in range(inp.no_grains):
                if i+1 in inp.fit['skip']:
                    pass
                else:
                    for j in range(inp.nrefl[i]-1,-1,-1):
                        if inp.volume[i][j] < minvol[i] or inp.volume[i][j] > maxvol[i]:
                            reject(inp,i,j,'intensity')
                            delete = delete + 1
                    
            print 'Rejected', delete, 'peaks because of different intensity scales'
            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 make_image(self, frame_number=None):
        """
        makeimage script produces edf diffraction images using the reflection information
        
                Henning Osholm Sorensen, June 23, 2006.
        python translation Jette Oddershede, March 31, 2008
        """
        peakshape = self.graindata.param['peakshape']
        if peakshape[0] == 0:  # spike peak, 2x2 pixels
            peak_add = 1
            frame_add = 1
            peakwsig = 0
        elif peakshape[0] == 1:  # 3d Gaussian peak
            peak_add = max(1, int(round(peakshape[1])))
            frame_add = max(1, int(round(peakshape[1])))
            peakwsig = peakshape[2]
        elif peakshape[0] == 3:  # 3d Gaussian peak in 2theta,eta,omega
            peak_add = 1
            frame_add = 1
            cen_tth = int(1.5 * peakshape[1] / Delta_tth)
            frame_tth = 2 * cen_tth + 1
            fwhm_tth = peakshape[1] / Delta_tth
            cen_eta = int(1.5 * peakshape[2] / Delta_eta)
            frame_eta = 2 * cen_eta + 1
            fwhm_eta = peakshape[2] / Delta_eta
            raw_tth_eta = n.zeros((frame_tth, frame_eta))
            raw_tth_eta[cen_tth, cen_eta] = 1
            filter_tth_eta = ndimage.gaussian_filter(
                raw_tth_eta, [0.5 * fwhm_tth, 0.5 * fwhm_eta])
            peakwsig = 1.

        framedimy = int(self.graindata.param['dety_size'] + 2 * frame_add)
        framedimz = int(self.graindata.param['detz_size'] + 2 * frame_add)

        totalrefl = 0
        if frame_number == None:
            no_frames = list(range(len(self.graindata.frameinfo)))
            print('Generating diffraction images')
        else:
            no_frames = [frame_number]

        for i in no_frames:
            check_input.interrupt(self.killfile)
            t1 = time.clock()
            nrefl = 0
            frame = n.zeros((framedimy, framedimz))
            omega = self.graindata.frameinfo[i].omega
            omega_step = self.graindata.param['omega_step']
            # Jettes hack to add relative movement of sample and detector, modelled to be Gaussian in y and z direction with a spread of 1 micron
            # movement of 1 micron along x judged to be irrelevant, at least for farfield data
            y_move = n.random.normal(0, 1. / self.graindata.param['dety_size'])
            z_move = n.random.normal(0, 1. / self.graindata.param['detz_size'])
            # loop over grains
            for j in range(self.graindata.param['no_grains']):
                # loop over reflections for each grain
                gr_pos = n.array(self.graindata.param['pos_grains_%s' % j])
                for k in range(len(self.graindata.grain[j].refs)):
                    # exploit that the reflection list is sorted according to omega
                    if self.graindata.grain[j].refs[k,A_id['omega']]*180/n.pi > \
                            omega+omega_step+2*peakwsig:
                        break
                    elif self.graindata.grain[j].refs[k,A_id['omega']]*180/n.pi < \
                            omega-2*peakwsig:
                        continue
                    dety = self.graindata.grain[j].refs[
                        k, A_id['detyd']]  # must be spot position after
                    detz = self.graindata.grain[j].refs[
                        k, A_id['detzd']]  # applying spatial distortion
                    #apply hack
                    #                   dety = self.graindata.grain[j].refs[k,A_id['dety']] + y_move
                    #                   detz = self.graindata.grain[j].refs[k,A_id['detz']] + z_move
                    ndety = int(round(dety))
                    ndetz = int(round(detz))
                    yrange = list(
                        range(ndety + frame_add - peak_add,
                              ndety + frame_add + peak_add + 1))
                    zrange = list(
                        range(ndetz + frame_add - peak_add,
                              ndetz + frame_add + peak_add + 1))
                    intensity = int(
                        round(self.graindata.grain[j].refs[k, A_id['Int']]))
                    nrefl = nrefl + 1
                    totalrefl = totalrefl + 1
                    # Gaussian along omega
                    if peakshape[0] == 1 or peakshape[0] == 3:
                        fraction = norm.cdf((omega-self.graindata.grain[j].refs[k,A_id['omega']]*180/n.pi+omega_step)/(0.5*peakwsig))\
                                  -norm.cdf((omega-self.graindata.grain[j].refs[k,A_id['omega']]*180/n.pi)/(0.5*peakwsig))
                    else:
                        fraction = 1.
                    if peakshape[0] == 3:
                        # Gaussian peaks along 2theta,eta
                        tth = self.graindata.grain[j].refs[k, A_id['tth']]
                        eta = self.graindata.grain[j].refs[k, A_id['eta']]
                        Om = tools.form_omega_mat_general(
                            self.graindata.grain[j].refs[k, A_id['omega']], 0,
                            -1. * self.graindata.param['wedge'] * n.pi / 180.)
                        [tx, ty, tz] = n.dot(Om, gr_pos)
                        for t in range(frame_tth):
                            tth_present = tth + (
                                t - cen_tth) * Delta_tth * n.pi / 180.
                            for e in range(frame_eta):
                                eta_present = eta + (
                                    e - cen_eta) * Delta_eta * n.pi / 180.
                                [dety_present,
                                 detz_present] = detector.det_coor2(
                                     tth_present,
                                     eta_present,
                                     self.graindata.param['distance'],
                                     self.graindata.param['y_size'],
                                     self.graindata.param['z_size'],
                                     self.graindata.param['dety_center'],
                                     self.graindata.param['detz_center'],
                                     self.graindata.R,
                                     tx,
                                     ty,
                                     tz,
                                 )

                                if self.graindata.param['spatial'] != None:
                                    from ImageD11 import blobcorrector
                                    self.spatial = blobcorrector.correctorclass(
                                        self.graindata.param['spatial'])
                                    # To match the coordinate system of the spline file
                                    # SPLINE(i,j): i = detz; j = (dety_size-1)-dety
                                    # Well at least if the spline file is for frelon2k
                                    (x, y) = detector.detyz_to_xy(
                                        [dety_present, detz_present],
                                        self.graindata.param['o11'],
                                        self.graindata.param['o12'],
                                        self.graindata.param['o21'],
                                        self.graindata.param['o22'],
                                        self.graindata.param['dety_size'],
                                        self.graindata.param['detz_size'])
                                    # Do the spatial distortion
                                    (xd, yd) = self.spatial.distort(x, y)

                                    # transform coordinates back to dety,detz
                                    (dety_present,
                                     detz_present) = detector.xy_to_detyz(
                                         [xd, yd], self.graindata.param['o11'],
                                         self.graindata.param['o12'],
                                         self.graindata.param['o21'],
                                         self.graindata.param['o22'],
                                         self.graindata.param['dety_size'],
                                         self.graindata.param['detz_size'])

                                y = int(round(dety_present))
                                z = int(round(detz_present))
                                try:
                                    frame[y + frame_add, z + frame_add] = frame[
                                        y + frame_add, z +
                                        frame_add] + fraction * intensity * filter_tth_eta[
                                            t, e]
                                except:
                                    # FIXME                                    print("Unhandled exception in make_image.py")
                                    pass

                    else:
                        # Generate spikes, 2x2 pixels
                        for y in yrange:
                            for z in zrange:
                                if y > 0 and y < framedimy and z > 0 and z < framedimz and abs(
                                        dety + frame_add - y) < 1 and abs(
                                            detz + frame_add - z) < 1:
                                    #                                   frame[y-1,z] = frame[y-1,z] + fraction*intensity*(1-abs(dety+frame_add-y))*(1-abs(detz+frame_add-z))
                                    y = int(round(y))
                                    z = int(round(z))
                                    frame[y, z] = frame[
                                        y, z] + fraction * intensity * (
                                            1 - abs(dety + frame_add - y)) * (
                                                1 - abs(detz + frame_add - z))

            # 2D Gaussian on detector
            if peakshape[0] == 1:
                frame = ndimage.gaussian_filter(frame, peakshape[1] * 0.5)
            # add background
            if self.graindata.param['bg'] > 0:
                frame = frame + self.graindata.param['bg'] * n.ones(
                    (framedimy, framedimz))
            # add noise
            if self.graindata.param['noise'] != 0:
                frame = n.random.poisson(frame)
            # apply psf
            if self.graindata.param['psf'] != 0:
                frame = ndimage.gaussian_filter(
                    frame, self.graindata.param['psf'] * 0.5)
            # resize, convert to integers and flip to same orientation as experimental frames
            frame = frame[frame_add:framedimy - frame_add,
                          frame_add:framedimz - frame_add]

            # limit values above 16 bit to be 16bit
            frame = n.clip(frame, 0, 2**16 - 1)
            # convert to integers
            frame = n.uint16(frame)

            #flip detector orientation according to input: o11, o12, o21, o22
            frame = detector.trans_orientation(frame,
                                               self.graindata.param['o11'],
                                               self.graindata.param['o12'],
                                               self.graindata.param['o21'],
                                               self.graindata.param['o22'],
                                               'inverse')
            # Output frames
            if '.edf' in self.graindata.param['output']:
                self.write_edf(i, frame)
            if '.edf.gz' in self.graindata.param['output']:
                self.write_edf(i, frame, usegzip=True)
            if '.tif' in self.graindata.param['output']:
                self.write_tif(i, frame)
            if '.tif16bit' in self.graindata.param['output']:
                self.write_tif16bit(i, frame)
            print('\rDone frame %i took %8f s' % (i + 1, time.clock() - t1),
                  end=' ')
            sys.stdout.flush()
예제 #6
0
    def make_image(self, grainno=None, refl=None):
        from scipy import ndimage
        if grainno == None:
            do_grains = list(range(self.graindata.param['no_grains']))
        else:
            do_grains = [grainno]

        # loop over grains
        for grainno in do_grains:
            gr_pos = n.array(self.graindata.param['pos_grains_%s' \
                    %(self.graindata.param['grain_list'][grainno])])
            B = self.graindata.grain[grainno].B
            SU = n.dot(self.graindata.S, self.graindata.grain[grainno].U)
            if refl == None:
                do_refs = list(range(len(self.graindata.grain[grainno].refs)))
            else:
                do_refs = [refl]
            # loop over reflections for each grain

            for nref in do_refs:
                # exploit that the reflection list is sorted according to omega
                print('\rDoing reflection %i of %i for grain %i of %i' %
                      (nref + 1, len(self.graindata.grain[grainno].refs),
                       grainno + 1, self.graindata.param['no_grains']),
                      end=' ')
                sys.stdout.flush()
                #print 'Doing reflection: %i' %nref
                if self.graindata.param['odf_type'] == 3:
                    intensity = 1
                else:
                    intensity = self.graindata.grain[grainno].refs[nref,
                                                                   A_id['Int']]

                hkl = n.array([
                    self.graindata.grain[grainno].refs[nref, A_id['h']],
                    self.graindata.grain[grainno].refs[nref, A_id['k']],
                    self.graindata.grain[grainno].refs[nref, A_id['l']]
                ])
                Gc = n.dot(B, hkl)
                for i in range(self.odf.shape[0]):
                    for j in range(self.odf.shape[1]):
                        for k in range(self.odf.shape[2]):
                            check_input.interrupt(self.killfile)
                            if self.odf[i, j, k] > self.odf_cut:
                                Gtmp = n.dot(self.Uodf[i, j, k], Gc)
                                Gw = n.dot(SU, Gtmp)
                                Glen = n.sqrt(n.dot(Gw, Gw))
                                tth = 2 * n.arcsin(Glen /
                                                   (2 * abs(self.graindata.K)))
                                costth = n.cos(tth)
                                Qw = Gw * self.graindata.param[
                                    'wavelength'] / (4. * n.pi)
                                (Omega, eta) = tools.find_omega_general(
                                    Qw, tth, self.wx, self.wy)
                                try:
                                    minpos = n.argmin(
                                        n.abs(Omega -
                                              self.graindata.grain[grainno].
                                              refs[nref, A_id['omega']]))
                                except:
                                    print(Omega)
                                if len(Omega) == 0:
                                    continue
                                omega = Omega[minpos]
                                # if omega not in rotation range continue to next step
                                if (self.graindata.param['omega_start']*n.pi/180) > omega or\
                                    omega > (self.graindata.param['omega_end']*n.pi/180):
                                    continue
                                Om = tools.form_omega_mat_general(
                                    omega, self.wx, self.wy)
                                Gt = n.dot(Om, Gw)

                                # Calc crystal position at present omega
                                [tx, ty, tz] = n.dot(Om, gr_pos)

                                (dety, detz) = detector.det_coor(
                                    Gt, costth,
                                    self.graindata.param['wavelength'],
                                    self.graindata.param['distance'],
                                    self.graindata.param['y_size'],
                                    self.graindata.param['z_size'],
                                    self.graindata.param['dety_center'],
                                    self.graindata.param['detz_center'],
                                    self.graindata.R, tx, ty, tz)

                                if self.graindata.param['spatial'] != None:
                                    # To match the coordinate system of the spline file
                                    # SPLINE(i,j): i = detz; j = (dety_size-1)-dety
                                    # Well at least if the spline file is for frelon2k
                                    (x, y) = detector.detyz_to_xy(
                                        [dety, detz],
                                        self.graindata.param['o11'],
                                        self.graindata.param['o12'],
                                        self.graindata.param['o21'],
                                        self.graindata.param['o22'],
                                        self.graindata.param['dety_size'],
                                        self.graindata.param['detz_size'])
                                    # Do the spatial distortion
                                    (xd, yd) = self.spatial.distort(x, y)

                                    # transform coordinates back to dety,detz
                                    (dety, detz) = detector.xy_to_detyz(
                                        [xd, yd], self.graindata.param['o11'],
                                        self.graindata.param['o12'],
                                        self.graindata.param['o21'],
                                        self.graindata.param['o22'],
                                        self.graindata.param['dety_size'],
                                        self.graindata.param['detz_size'])

                                if dety > -0.5 and dety <= self.graindata.param['dety_size']-0.5 and\
                                    detz > -0.5 and detz <= self.graindata.param['detz_size']-0.5:
                                    dety = int(round(dety))
                                    detz = int(round(detz))
                                    frame_no = int(n.floor((omega*180/n.pi-self.graindata.param['omega_start'])/\
                                                self.graindata.param['omega_step']))
                                    self.frames[frame_no][
                                        dety, detz] = self.frames[frame_no][
                                            dety,
                                            detz] + intensity * self.odf[i, j,
                                                                         k]
예제 #7
0
def find_refl(inp):
        """
        From U, (x,y,z) and B determined for the far-field case 
        calculate the possible reflection on the near-field detector 
        output[grainno][reflno]=[h,k,l,omega,dety,detz,tth,eta]
        """
        S = n.array([[1, 0, 0],[0, 1, 0],[0, 0, 1]])
        R = tools.detect_tilt(inp.param['tilt_x'],
                              inp.param['tilt_y'],
                              inp.param['tilt_z'])
        inp.possible = []

        # if structure info is given use this
        if  inp.files['structure_file'] != None:
            inp.param['structure_phase_0'] = inp.files['structure_file']
            xtal_structure = reflections.open_structure(inp.param,0)
            HKL = reflections.gen_miller(inp.param,0)
        else:
            inp.param['unit_cell_phase_0'] = inp.unit_cell		
            inp.param['sgno_phase_0'] = inp.fit['sgno']
            HKL = reflections.gen_miller(inp.param,0)

        for grainno in range(inp.no_grains):
            inp.possible.append([])
            if grainno+1 not in inp.fit['skip']:
                B = tools.epsilon_to_b(n.array([inp.values['epsaa%s' %grainno],
                                                inp.values['epsab%s' %grainno],
                                                inp.values['epsac%s' %grainno],
                                                inp.values['epsbb%s' %grainno],
                                                inp.values['epsbc%s' %grainno],
                                                inp.values['epscc%s' %grainno]]),
                                       inp.unit_cell)
                U = tools.rod_to_u([inp.rod[grainno][0]+inp.values['rodx%s' %grainno],
                                    inp.rod[grainno][1]+inp.values['rody%s' %grainno],
                                    inp.rod[grainno][2]+inp.values['rodz%s' %grainno]])
                gr_pos = n.array([inp.values['x%s' %grainno],
                                  inp.values['y%s' %grainno],
                                  inp.values['z%s' %grainno]])
            

  
                for hkl in HKL:
                    Gc = n.dot(B,hkl[0:3])
                    Gw = n.dot(S,n.dot(U,Gc))
                    tth = tools.tth2(Gw,inp.param['wavelength'])
#                    print hkl[0:3],tth*180./n.pi
                    costth = n.cos(tth)
                    (Omega, Eta) = tools.find_omega_general(inp.param['wavelength']/(4.*n.pi)*Gw,
                                                            tth,
                                                            inp.values['wx']*n.pi/180,
                                                            inp.values['wy']*n.pi/180)  
                    if len(Omega) > 0:
                        for solution in range(len(Omega)):
                            omega = Omega[solution]
                            eta = Eta[solution]
                            for i in range(len(inp.fit['w_limit'])//2):
                                if  (inp.fit['w_limit'][2*i]*n.pi/180) < omega and\
                                    omega < (inp.fit['w_limit'][2*i+1]*n.pi/180):
                                # form Omega rotation matrix
                                    Om = tools.form_omega_mat_general(omega,inp.values['wx']*n.pi/180,inp.values['wy']*n.pi/180)  
                                    Gt = n.dot(Om,Gw) 
                                # Calc crystal position at present omega
                                    [tx,ty,tz]= n.dot(Om,gr_pos)
                                # Calc detector coordinate for peak 
                                    (dety, detz) = detector.det_coor(Gt,costth,
                                                                    inp.param['wavelength'],
                                                                    inp.param['distance'],
                                                                    inp.param['y_size'],
                                                                    inp.param['z_size'],
                                                                    inp.param['y_center'],
                                                                    inp.param['z_center'],
                                                                    R,tx,ty,tz)
                            #If peak within detector frame store it in possible
                                    if (-0.5 < dety) and\
                                        (dety < inp.fit['dety_size']-0.5) and\
                                        (-0.5 < detz) and\
                                        (detz < inp.fit['detz_size']-0.5):
                                        inp.possible[grainno].append([hkl[0],
                                                                      hkl[1],
                                                                      hkl[2],
                                                                      omega*180/n.pi,
                                                                      dety,
                                                                      detz,
                                                                      tth,
                                                                      eta])
예제 #8
0
    def run(self):
        spot_id = 0
        # Generate orientations of the grains and loop over all grains
        print('no of grains ', self.param['no_grains'])
        for grainno in range(self.param['no_grains']):
            A = []
            U = self.param['U_grains_%s' % (self.param['grain_list'][grainno])]
            if len(self.param['phase_list']) == 1:
                phase = self.param['phase_list'][0]
            else:
                phase = self.param['phase_grains_%s' %
                                   (self.param['grain_list'][grainno])]
            unit_cell = self.param['unit_cell_phase_%i' % phase]
            self.grain.append(variables.grain_cont(U))
            gr_pos = n.array(self.param['pos_grains_%s' %
                                        (self.param['grain_list'][grainno])])
            gr_eps = n.array(self.param['eps_grains_%s' %
                                        (self.param['grain_list'][grainno])])
            # Calculate the B-matrix based on the strain tensor for each grain
            B = tools.epsilon_to_b(gr_eps, unit_cell)
            # add B matrix to grain container
            self.grain[grainno].B = B
            V = tools.cell_volume(unit_cell)
            grain_vol = n.pi / 6 * self.param[
                'size_grains_%s' % self.param['grain_list'][grainno]]**3

            #            print 'GRAIN NO: ',self.param['grain_list'][grainno]
            #            print 'GRAIN POSITION of grain ',self.param['grain_list'][grainno],': ',gr_pos
            #            print 'STRAIN TENSOR COMPONENTS (e11 e12 e13 e22 e23 e33) of grain ',self.param['grain_list'][grainno],':\n',gr_eps
            #            print 'U of grain ',self.param['grain_list'][grainno],':\n',U
            nrefl = 0

            # Calculate these values:
            # totalnr, grainno, refno, hkl, omega, 2theta, eta, dety, detz
            # For all reflections in Ahkl that fulfill omega_start < omega < omega_end.
            # All angles in Grain are in degrees
            for hkl in self.hkl[self.param['phase_list'].index(phase)]:
                check_input.interrupt(self.killfile)
                Gc = n.dot(B, hkl[0:3])
                Gw = n.dot(self.S, n.dot(U, Gc))
                tth = tools.tth2(Gw, self.param['wavelength'])
                costth = n.cos(tth)
                (Omega, Eta) = tools.find_omega_general(
                    Gw * self.param['wavelength'] / (4. * n.pi), tth, self.wx,
                    self.wy)
                if len(Omega) > 0:
                    for solution in range(len(Omega)):
                        omega = Omega[solution]
                        eta = Eta[solution]
                        if  (self.param['omega_start']*n.pi/180) < omega and\
                                omega < (self.param['omega_end']*n.pi/180):
                            # form Omega rotation matrix
                            Om = tools.form_omega_mat_general(
                                omega, self.wx, self.wy)
                            Gt = n.dot(Om, Gw)

                            # Calc crystal position at present omega and continue if this is outside the illuminated volume
                            [tx, ty, tz] = n.dot(Om, gr_pos)
                            if self.param['beam_width'] != None:
                                if n.abs(ty) > self.param['beam_width'] / 2.:
                                    continue

                            # Calc detector coordinate for peak
                            (dety, detz) = detector.det_coor(
                                Gt, costth, self.param['wavelength'],
                                self.param['distance'], self.param['y_size'],
                                self.param['z_size'],
                                self.param['dety_center'],
                                self.param['detz_center'], self.R, tx, ty, tz)

                            #If shoebox extends outside detector exclude it
                            if (-0.5 > dety) or\
                               (dety > self.param['dety_size']-0.5) or\
                               (-0.5 > detz) or\
                               (detz > self.param['detz_size']-0.5):
                                continue

                            if self.param['spatial'] != None:
                                # To match the coordinate system of the spline file
                                (x, y) = detector.detyz_to_xy(
                                    [dety, detz], self.param['o11'],
                                    self.param['o12'], self.param['o21'],
                                    self.param['o22'], self.param['dety_size'],
                                    self.param['detz_size'])
                                # Do the spatial distortion
                                (xd, yd) = self.spatial.distort(x, y)
                                # transform coordinates back to dety,detz
                                (detyd, detzd) = detector.xy_to_detyz(
                                    [xd, yd], self.param['o11'],
                                    self.param['o12'], self.param['o21'],
                                    self.param['o22'], self.param['dety_size'],
                                    self.param['detz_size'])
                            else:
                                detyd = dety
                                detzd = detz

                            if self.param['beampol_apply'] == 1:
                                #Polarization factor (Kahn, J. Appl. Cryst. (1982) 15, 330-337.)
                                rho = n.pi / 2.0 + eta + self.param[
                                    'beampol_direct'] * n.pi / 180.0
                                P = 0.5 * (1 + costth*costth -\
                                         self.param['beampol_factor']*n.cos(2*rho)*n.sin(tth)**2)
                            else:
                                P = 1.0

                            #Lorentz factor
                            if self.param['lorentz_apply'] == 1:
                                if eta != 0:
                                    L = 1 / (n.sin(tth) * abs(n.sin(eta)))
                                else:
                                    L = n.inf
                            else:
                                L = 1.0

                            overlaps = 0  # set the number overlaps to zero

                            if self.param['intensity_const'] != 1:
                                intensity = int_intensity(
                                    hkl[3], L, P, self.param['beamflux'],
                                    self.param['wavelength'], V, grain_vol)
                            else:
                                intensity = hkl[3]

                            A.append([
                                self.param['grain_list'][grainno], nrefl,
                                spot_id, hkl[0], hkl[1], hkl[2], tth, omega,
                                eta, dety, detz, detyd, detzd, Gw[0], Gw[1],
                                Gw[2], L, P, hkl[3], intensity, overlaps
                            ])
                            nrefl = nrefl + 1
                            spot_id = spot_id + 1

#           print 'Length of Grain', len(self.grain[0].refl)
            A = n.array(A)
            if len(A) > 0:
                # sort rows according to omega
                A = A[n.argsort(A, 0)[:, A_id['omega']], :]

                # Renumber the reflections
                A[:, A_id['ref_id']] = n.arange(nrefl)

                # Renumber the spot_id
                A[:,
                  A_id['spot_id']] = n.arange(n.min(A[:, A_id['spot_id']]),
                                              n.max(A[:, A_id['spot_id']]) + 1)
            else:
                A = n.zeros((0, len(A_id)))
            # save reflection info in grain container
            self.grain[grainno].refs = A
            print('\rDone %3i grain(s) of %3i' %
                  (grainno + 1, self.param['no_grains']),
                  end=' ')
            sys.stdout.flush()

        print('\n')