Exemple #1
0
    def test_open_structure(self):
        param = {}
        param['structure_phase_0'] = 'oPPA.cif'
#        param['structure_datablock'] = 'oPPA'
        structure = reflections.open_structure(param,0)
        self.assertEqual(param['sgno_phase_0'],4)
        self.assertEqual([8.5312,4.8321,10.125,90.00,92.031,90.00],
                          param['unit_cell_phase_0'])
Exemple #2
0
    def test_calc_intensity(self):
        myinput = check_input.parse_input(input_file='simul.inp')
        myinput.read()
        myinput.check()
        myinput.initialize()
        myinput.param['structure_phase_0'] = 'oPPA.cif'
        myinput.param['structure_datablock'] = 'oPPA'

        xtal_structure = reflections.open_structure(myinput.param,0)
        hkl = reflections.gen_miller(myinput.param,0)
        hkl = reflections.calc_intensity(hkl,xtal_structure)
Exemple #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)
Exemple #4
0
def intensity(inp):
    """
        Reject peaks based on intensity
        
        Jette Oddershede, August 27 2008
        """

    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

        for i in range(inp.no_grains):
            for j in range(inp.nrefl[i]):
                h = inp.h[i][j]
                k = inp.k[i][j]
                l = inp.l[i][j]
                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]
                        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)
Exemple #5
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])
Exemple #6
0
def run(options):
    # Check for print_input
    try:
        options.print_input
    except:
        options.print_input = None
    if options.print_input:
        print(help_input.show_input())
        sys.exit()

    # Check if filename is specified
    try:
        options.filename
    except:
        options.filename = None
    if options.filename == None:
        print("\nNo input file supplied [-i filename]\n")
        #Gaelle comment : ? sys.exit() and add raise error instead
        sys.exit()
    #print 'options = ',options
    #print '\n'

    # Check killfile does not exist
    try:
        options.killfile
    except:
        options.killfile = None
    if options.killfile is not None and os.path.exists(options.killfile):
        print("The purpose of the killfile option is to create that file")
        print("only when you want PolyXsim to stop")
        print("If the file already exists when you start PolyXsim, it is")
        print("stopped immediately")
        raise ValueError("Your killfile " + options.killfile +
                         " already exists")

    # Is the input file available?

    # Read and check input

    # Make instance of parse_input class
    print('Reading input\n')

    myinput = check_input.parse_input(input_file=options.filename)

    myinput.read()  # read input file

    print('Checking input\n')
    myinput.check()  # check validity of input
    check_input.interrupt(options.killfile)

    #     if myinput.missing == True:                   # if problem exit
    #         print('MISSING ITEMS')
    #         sys.exit()

    if len(myinput.errors) > 0:
        myinput.show_errors()
        sys.exit()

    print('Initialize parameters etc\n')
    myinput.initialize()  # if ok initialize
    check_input.interrupt(options.killfile)

    # Generate reflections
    hkl = []

    for phase in myinput.param['phase_list']:
        if ('structure_phase_%i' % phase) in myinput.param:
            xtal_structure = reflections.open_structure(myinput.param, phase)
            #print 'UNIT CELL', myinput.param['unit_cell_phase_%i' %phase]
            print('Generating miller indices')
            hkl_tmp = reflections.gen_miller(myinput.param, phase)
            if myinput.param['structure_factors'] != 0:
                print('Structure factor calculation')
                hkl.append(
                    reflections.calc_intensity(hkl_tmp, xtal_structure,
                                               options.killfile))
            else:
                hkl.append(reflections.add_intensity(hkl, myinput.param))
                print('No structure factor calculation')
        else:
            hkl_tmp = reflections.gen_miller(myinput.param, phase)
            hkl.append(reflections.add_intensity(hkl_tmp, myinput.param))

        check_input.interrupt(options.killfile)
    #    if options.killfile is not None and os.path.exists(options.killfile):
    #        raise KeyboardInterrupt()

    generate_grains.generate_grains(myinput.param)
    check_input.interrupt(options.killfile)
    print('Write grains file')
    file_io.write_grains(myinput.param)
    check_input.interrupt(options.killfile)
    print('Write res file')
    file_io.write_res(myinput.param)
    check_input.interrupt(options.killfile)

    if '.hkl' in myinput.param['output']:
        print('Write hkl file')
        file_io.write_hkl(myinput.param, hkl)
    if '.fcf' in myinput.param['output']:
        print('Write fcf file')
        file_io.write_fcf(myinput.param, hkl)
    if '.ubi' in myinput.param['output']:
        print('Write UBI file')
        file_io.write_ubi(myinput.param)
    if '.par' in myinput.param['output']:
        print('Write detector.par file')
        file_io.write_par(myinput.param)
    check_input.interrupt(options.killfile)

    # Determine the reflection parameters for grains
    graindata = find_refl.find_refl(myinput.param, hkl, options.killfile)
    graindata.frameinfo = myinput.frameinfo
    print('Determine reflections positions')
    graindata.run()
    if '.ref' in myinput.param['output']:
        print('Write reflection file')
        graindata.save()
    if '.gve' in myinput.param['output']:
        print('Write g-vector file')
        graindata.write_gve()
    if '.ini' in myinput.param['output']:
        print('Write GrainSpotter ini file - Remember it is just a template')
        graindata.write_ini()
    if '.flt' in myinput.param['output']:
        print('Write filtered peaks file')
        graindata.write_flt()

    if myinput.param['make_image'] == 1:
        if myinput.param['peakshape'][0] == 2:
            image = make_imagestack.make_image(graindata, options.killfile)
            image.setup_odf()
            image.make_image_array()
            image.make_image()
            image.correct_image()
        else:
            image = make_image.make_image(graindata, options.killfile)
            image.make_image()