Changeset 2161 for trunk/GSASIIIO.py


Ignore:
Timestamp:
Mar 4, 2016 2:34:44 PM (6 years ago)
Author:
vondreele
Message:

Add GUI for layer stacking structures - almost complete; new phase type = 'faulted'
Add load from DIFFaX command files for stacking structures

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIIO.py

    r2152 r2161  
    962962    return Id       #last powder pattern generated
    963963           
    964 # def powderFxyeSave(G2frame,exports,powderfile):
    965 #     'Save a powder histogram as a GSAS FXYE file'
    966 #     head,tail = ospath.split(powderfile)
    967 #     name,ext = tail.split('.')
    968 #     for i,export in enumerate(exports):
    969 #         filename = ospath.join(head,name+'-%03d.'%(i)+ext)
    970 #         prmname = filename.strip(ext)+'prm'
    971 #         prm = open(prmname,'w')      #old style GSAS parm file
    972 #         PickId = G2gd.GetPatternTreeItemId(G2frame, G2frame.root, export)
    973 #         Inst = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame, \
    974 #             PickId, 'Instrument Parameters'))[0]
    975 #         prm.write( '            123456789012345678901234567890123456789012345678901234567890        '+'\n')
    976 #         prm.write( 'INS   BANK      1                                                               '+'\n')
    977 #         prm.write(('INS   HTYPE   %sR                                                              '+'\n')%(Inst['Type'][0]))
    978 #         if 'Lam1' in Inst:              #Ka1 & Ka2
    979 #             prm.write(('INS  1 ICONS%10.7f%10.7f    0.0000               0.990    0     0.500   '+'\n')%(Inst['Lam1'][0],Inst['Lam2'][0]))
    980 #         elif 'Lam' in Inst:             #single wavelength
    981 #             prm.write(('INS  1 ICONS%10.7f%10.7f    0.0000               0.990    0     0.500   '+'\n')%(Inst['Lam'][1],0.0))
    982 #         prm.write( 'INS  1 IRAD     0                                                               '+'\n')
    983 #         prm.write( 'INS  1I HEAD                                                                    '+'\n')
    984 #         prm.write( 'INS  1I ITYP    0    0.0000  180.0000         1                                 '+'\n')
    985 #         prm.write(('INS  1DETAZM%10.3f                                                          '+'\n')%(Inst['Azimuth'][0]))
    986 #         prm.write( 'INS  1PRCF1     3    8   0.00100                                                '+'\n')
    987 #         prm.write(('INS  1PRCF11     %15.6g%15.6g%15.6g%15.6g   '+'\n')%(Inst['U'][1],Inst['V'][1],Inst['W'][1],0.0))
    988 #         prm.write(('INS  1PRCF12     %15.6g%15.6g%15.6g%15.6g   '+'\n')%(Inst['X'][1],Inst['Y'][1],Inst['SH/L'][1]/2.,Inst['SH/L'][1]/2.))
    989 #         prm.close()
    990 #         file = open(filename,'w')
    991 #         print 'save powder pattern to file: ',filename
    992 #         x,y,w,yc,yb,yd = G2frame.PatternTree.GetItemPyData(PickId)[1]
    993 #         file.write(powderfile+'\n')
    994 #         file.write('Instrument parameter file:'+ospath.split(prmname)[1]+'\n')
    995 #         file.write('BANK 1 %d %d CONS %.2f %.2f 0 0 FXYE\n'%(len(x),len(x),\
    996 #             100.*x[0],100.*(x[1]-x[0])))
    997 #         s = list(np.sqrt(1./np.array(w)))       
    998 #         XYW = zip(x,y,s)
    999 #         for X,Y,S in XYW:
    1000 #             file.write("%15.6g %15.6g %15.6g\n" % (100.*X,Y,max(S,1.0)))
    1001 #         file.close()
    1002 #         print 'powder pattern file '+filename+' written'
    1003        
    1004 # def powderXyeSave(G2frame,exports,powderfile):
    1005 #     'Save a powder histogram as a Topas XYE file'
    1006 #     head,tail = ospath.split(powderfile)
    1007 #     name,ext = tail.split('.')
    1008 #     for i,export in enumerate(exports):
    1009 #         filename = ospath.join(head,name+'-%03d.'%(i)+ext)
    1010 #         PickId = G2gd.GetPatternTreeItemId(G2frame, G2frame.root, export)
    1011 #         file = open(filename,'w')
    1012 #         file.write('#%s\n'%(export))
    1013 #         print 'save powder pattern to file: ',filename
    1014 #         x,y,w,yc,yb,yd = G2frame.PatternTree.GetItemPyData(PickId)[1]
    1015 #         s = list(np.sqrt(1./np.array(w)))       
    1016 #         XYW = zip(x,y,s)
    1017 #         for X,Y,W in XYW:
    1018 #             file.write("%15.6g %15.6g %15.6g\n" % (X,Y,W))
    1019 #         file.close()
    1020 #         print 'powder pattern file '+filename+' written'
    1021        
    1022964def PDFSave(G2frame,exports):
    1023965    'Save a PDF G(r) and S(Q) in column formats'
     
    23712313    else:
    23722314        print('No Export routine supports extension '+extension)
     2315       
     2316def ReadDIFFaX(DIFFaXfile):
     2317    print 'read ',DIFFaXfile
     2318    Layer = {'Laue':'-1','Cell':[False,1.,1.,1.,90.,90.,90,1.],'Width':[[10.,10.],[False,False]],
     2319        'Layers':[],'Stacking':[],'Transitions':[],'Toler':0.01}
     2320    df = open(DIFFaXfile,'r')
     2321    lines = df.readlines()
     2322    df.close()
     2323    struct = False
     2324    Struct = []
     2325    stack = False
     2326    Stack = []
     2327    trans = False
     2328    Trans = []
     2329    instr = False
     2330    for diff in lines:
     2331        diff = diff[:-1].lower()
     2332        if '!'  in diff:
     2333            continue
     2334        while '}' in diff: #strip comments
     2335            iB = diff.index('{')
     2336            iF = diff.index('}')+1
     2337            if iB:
     2338                diff = diff[:iB]
     2339            else:
     2340                diff = diff[iF:]
     2341        if not diff:
     2342            continue
     2343        if diff.strip() == 'instrumental':
     2344            instr = True
     2345            continue
     2346        if diff.strip() == 'structural':
     2347            instr = False
     2348            struct = True
     2349            continue
     2350        elif diff.strip() == 'stacking':
     2351            struct = False
     2352            stack = True
     2353            continue
     2354        elif diff.strip() == 'transitions':
     2355            stack = False
     2356            trans = True
     2357            continue
     2358        diff = diff.strip()
     2359        if struct:
     2360            if diff:
     2361                Struct.append(diff)
     2362        elif stack:
     2363            if diff:
     2364                Stack.append(diff)
     2365        elif trans:
     2366            if diff:
     2367                Trans.append(diff)
     2368   
     2369#STRUCTURE records
     2370    laueRec = Struct[1].split()
     2371    Layer['Laue'] = laueRec[0]
     2372    if Layer['Laue'] == 'unknown' and len(laueRec) > 1:
     2373        Layer['Toler'] = float(laueRec[1])    #tolerance for 'unknown'?
     2374    if Layer['Laue'] == '2/m(1)': Layer['Laue'] = '2/m(c)'
     2375    if Layer['Laue'] == '2/m(2)': Layer['Laue'] = '2/m(ab)'
     2376    cell = Struct[0].split()
     2377    Layer['Cell'] = [False,float(cell[0]),float(cell[1]),float(cell[2]),90.,90.,float(cell[3]),1.0]
     2378    nLayers = int(Struct[2])
     2379    N = 3
     2380    if 'layer' not in Struct[3]:
     2381        N = 4
     2382        if Struct[3] != 'infinite':
     2383            width = Struct[3].split()
     2384            Layer['Width'][0] = [float(width[0]),float(width[1])]
     2385    for nL in range(nLayers):
     2386        if '=' in Struct[N]:
     2387            name = Struct[N].split('=')
     2388            sameas = int(name[1])-1
     2389            Layer['Layers'].append({'Name':name[0],'SameAs':Layer['Layers'][sameas]['Name'],'Symm':'None','Atoms':[]})
     2390            N += 1
     2391            continue
     2392        Symm = 'None'
     2393        if 'centro' in Struct[N+1]: Symm = '-1'
     2394        Layer['Layers'].append({'Name':Struct[N],'SameAs':'','Symm':Symm,'Atoms':[]})
     2395        N += 2
     2396        iatm = 0
     2397        while 'layer' not in Struct[N]:
     2398            atom = Struct[N][4:].split()
     2399            atomType = G2el.FixValence(Struct[N][:4]).strip().capitalize()
     2400            atomName = '%s(%s)'%(atomType,atom[0])
     2401            newVals = []
     2402            for val in atom[1:6]:
     2403                if '/' in val:
     2404                    newVals.append(eval(val+'.'))
     2405                else:
     2406                    newVals.append(float(val))               
     2407            atomRec = [atomName,atomType,'',newVals[0],newVals[1],newVals[2],newVals[4],newVals[3]/80.]
     2408            Layer['Layers'][-1]['Atoms'].append(atomRec)
     2409            N += 1
     2410            if N > len(Struct)-1:
     2411                break
     2412#TRANSITIONS records
     2413    transArray = []
     2414    N = 0
     2415    for i in range(nLayers):
     2416        transArray.append([])
     2417        for j in range(nLayers):
     2418            vals = Trans[N].split()
     2419            newVals = []
     2420            for val in vals[:4]:
     2421                if '/' in val:
     2422                    newVals.append(eval(val+'.'))
     2423                else:
     2424                    newVals.append(float(val))
     2425            transArray[-1].append(newVals+['',False])
     2426            N += 1
     2427    Layer['Transitions'] = transArray
     2428#STACKING records
     2429    Layer['Stacking'] = [Stack[0],'']
     2430    if Stack[0] == 'recursive':
     2431        Layer['Stacking'][1] = Stack[1]
     2432    elif Stack[0] == 'explicit':
     2433        if Stack[1] == 'random':
     2434            Layer['Stacking'][1] = Stack[1]
     2435        else:
     2436            Layer['Stacking'][1] = 'list'
     2437            Layer['Stacking'].append('')
     2438            for stack in Stack[2:]:
     2439                Layer['Stacking'][2] += ' '+stack
     2440    return Layer
    23732441
    23742442def ReadCIF(URLorFile):
Note: See TracChangeset for help on using the changeset viewer.