Changeset 4661 for trunk/GSASIIstrIO.py


Ignore:
Timestamp:
Nov 27, 2020 8:48:26 PM (11 months ago)
Author:
toby
Message:

update CIF export: add rigid body, fix bug in single xtal ref tbl; picker bug on single xtal plot

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIstrIO.py

    r4629 r4661  
    10451045       
    10461046def GetRigidBodyModels(rigidbodyDict,Print=True,pFile=None):
    1047     'needs a doc string'
     1047    'Get Rigid body info from tree entry and print it to .LST file'
    10481048   
    10491049    def PrintResRBModel(RBModel):
    1050         atNames = RBModel['atNames']
    1051         rbRef = RBModel['rbRef']
    1052         rbSeq = RBModel['rbSeq']
    10531050        pFile.write('Residue RB name: %s no.atoms: %d, No. times used: %d\n'%
    10541051            (RBModel['RBname'],len(RBModel['rbTypes']),RBModel['useCount']))
    1055         pFile.write('    At name       x          y          z\n')
    1056         for name,xyz in zip(atNames,RBModel['rbXYZ']):
    1057             pFile.write('  %8s %10.4f %10.4f %10.4f\n'%(name,xyz[0],xyz[1],xyz[2]))
    1058         pFile.write('Orientation defined by: %s -> %s & %s -> %s\n'%
    1059             (atNames[rbRef[0]],atNames[rbRef[1]],atNames[rbRef[0]],atNames[rbRef[2]]))
    1060         if rbSeq:
    1061             for i,rbseq in enumerate(rbSeq):
    1062 #                nameLst = [atNames[i] for i in rbseq[3]]
    1063                 pFile.write('Torsion sequence %d Bond: %s - %s riding: %s\n'%
    1064                     (i,atNames[rbseq[0]],atNames[rbseq[1]],str([atNames[i] for i in rbseq[3]])))
     1052        for i in WriteResRBModel(RBModel):
     1053            pFile.write(i)
    10651054       
    10661055    def PrintVecRBModel(RBModel):
    1067         rbRef = RBModel['rbRef']
    1068         atTypes = RBModel['rbTypes']
    10691056        pFile.write('Vector RB name: %s no.atoms: %d No. times used: %d\n'%
    10701057            (RBModel['RBname'],len(RBModel['rbTypes']),RBModel['useCount']))
    1071         for i in range(len(RBModel['VectMag'])):
    1072             pFile.write('Vector no.: %d Magnitude: %8.4f Refine? %s\n'%(i,RBModel['VectMag'][i],RBModel['VectRef'][i]))
    1073             pFile.write('  No. Type     vx         vy         vz\n')
    1074             for j,[name,xyz] in enumerate(zip(atTypes,RBModel['rbVect'][i])):
    1075                 pFile.write('  %d   %2s %10.4f %10.4f %10.4f\n'%(j,name,xyz[0],xyz[1],xyz[2]))
    1076         pFile.write('  No. Type      x          y          z\n')
    1077         for i,[name,xyz] in enumerate(zip(atTypes,RBModel['rbXYZ'])):
    1078             pFile.write('  %d   %2s %10.4f %10.4f %10.4f\n'%(i,name,xyz[0],xyz[1],xyz[2]))
     1058        for i in WriteVecRBModel(RBModel):
     1059            pFile.write(i)
    10791060        pFile.write('Orientation defined by: atom %s -> atom %s & atom %s -> atom %s\n'%
    1080             (rbRef[0],rbRef[1],rbRef[0],rbRef[2]))
     1061            (RBModel['rbRef'][0],RBModel['rbRef'][1],RBModel['rbRef'][0],RBModel['rbRef'][2]))
     1062           
    10811063    rbVary = []
    10821064    rbDict = {}
     
    20892071               
    20902072    def PrintRBObjPOAndSig(rbfx,rbsx):
    2091         namstr = '  names :'
    2092         valstr = '  values:'
    2093         sigstr = '  esds  :'
    2094         for i,px in enumerate(['Px:','Py:','Pz:']):
    2095             name = pfx+rbfx+px+rbsx
    2096             namstr += '%12s'%('Pos '+px[1])
    2097             valstr += '%12.5f'%(parmDict[name])
    2098             if name in sigDict:
    2099                 sigstr += '%12.5f'%(sigDict[name])
    2100             else:
    2101                 sigstr += 12*' '
    2102         for i,po in enumerate(['Oa:','Oi:','Oj:','Ok:']):
    2103             name = pfx+rbfx+po+rbsx
    2104             namstr += '%12s'%('Ori '+po[1])
    2105             valstr += '%12.5f'%(parmDict[name])
    2106             if name in sigDict:
    2107                 sigstr += '%12.5f'%(sigDict[name])
    2108             else:
    2109                 sigstr += 12*' '
    2110         pFile.write(namstr+'\n')
    2111         pFile.write(valstr+'\n')
    2112         pFile.write(sigstr+'\n')
     2073        for i in WriteRBObjPOAndSig(pfx,rbfx,rbsx,parmDict,sigDict):
     2074            pFile.write(i+'\n')
    21132075       
    21142076    def PrintRBObjTLSAndSig(rbfx,rbsx,TLS):
    2115         namstr = '  names :'
    2116         valstr = '  values:'
    2117         sigstr = '  esds  :'
    2118         if 'N' not in TLS:
    2119             pFile.write(' Thermal motion:\n')
    2120         if 'T' in TLS:
    2121             for i,pt in enumerate(['T11:','T22:','T33:','T12:','T13:','T23:']):
    2122                 name = pfx+rbfx+pt+rbsx
    2123                 namstr += '%12s'%(pt[:3])
    2124                 valstr += '%12.5f'%(parmDict[name])
    2125                 if name in sigDict:
    2126                     sigstr += '%12.5f'%(sigDict[name])
    2127                 else:
    2128                     sigstr += 12*' '
    2129             pFile.write(namstr+'\n')
    2130             pFile.write(valstr+'\n')
    2131             pFile.write(sigstr+'\n')
    2132         if 'L' in TLS:
    2133             namstr = '  names :'
    2134             valstr = '  values:'
    2135             sigstr = '  esds  :'
    2136             for i,pt in enumerate(['L11:','L22:','L33:','L12:','L13:','L23:']):
    2137                 name = pfx+rbfx+pt+rbsx
    2138                 namstr += '%12s'%(pt[:3])
    2139                 valstr += '%12.3f'%(parmDict[name])
    2140                 if name in sigDict:
    2141                     sigstr += '%12.3f'%(sigDict[name])
    2142                 else:
    2143                     sigstr += 12*' '
    2144             pFile.write(namstr+'\n')
    2145             pFile.write(valstr+'\n')
    2146             pFile.write(sigstr+'\n')
    2147         if 'S' in TLS:
    2148             namstr = '  names :'
    2149             valstr = '  values:'
    2150             sigstr = '  esds  :'
    2151             for i,pt in enumerate(['S12:','S13:','S21:','S23:','S31:','S32:','SAA:','SBB:']):
    2152                 name = pfx+rbfx+pt+rbsx
    2153                 namstr += '%12s'%(pt[:3])
    2154                 valstr += '%12.4f'%(parmDict[name])
    2155                 if name in sigDict:
    2156                     sigstr += '%12.4f'%(sigDict[name])
    2157                 else:
    2158                     sigstr += 12*' '
    2159             pFile.write(namstr+'\n')
    2160             pFile.write(valstr+'\n')
    2161             pFile.write(sigstr+'\n')
    2162         if 'U' in TLS:
    2163             name = pfx+rbfx+'U:'+rbsx
    2164             namstr = '  names :'+'%12s'%('Uiso')
    2165             valstr = '  values:'+'%12.5f'%(parmDict[name])
    2166             if name in sigDict:
    2167                 sigstr = '  esds  :'+'%12.5f'%(sigDict[name])
    2168             else:
    2169                 sigstr = '  esds  :'+12*' '
    2170             pFile.write(namstr+'\n')
    2171             pFile.write(valstr+'\n')
    2172             pFile.write(sigstr+'\n')
     2077        for i in WriteRBObjTLSAndSig(pfx,rbfx,rbsx,TLS,parmDict,sigDict):
     2078            pFile.write(i)
    21732079       
    21742080    def PrintRBObjTorAndSig(rbsx):
    2175         namstr = '  names :'
    2176         valstr = '  values:'
    2177         sigstr = '  esds  :'
    21782081        nTors = len(RBObj['Torsions'])
    21792082        if nTors:
    2180             pFile.write(' Torsions:\n')
    2181             for it in range(nTors):
    2182                 name = pfx+'RBRTr;'+str(it)+':'+rbsx
    2183                 namstr += '%12s'%('Tor'+str(it))
    2184                 valstr += '%12.4f'%(parmDict[name])
    2185                 if name in sigDict:
    2186                     sigstr += '%12.4f'%(sigDict[name])
    2187             pFile.write(namstr+'\n')
    2188             pFile.write(valstr+'\n')
    2189             pFile.write(sigstr+'\n')
     2083            for i in WriteRBObjTorAndSig(pfx,rbsx,parmDict,sigDict,nTors):
     2084                pFile.write(i)
    21902085               
    21912086    def PrintSHtextureAndSig(textureData,SHtextureSig):
     
    36793574                PrintBackgroundSig(Background,backSig)
    36803575               
     3576def WriteRBObjPOAndSig(pfx,rbfx,rbsx,parmDict,sigDict):
     3577    '''Cribbed version of PrintRBObjPOAndSig but returns lists of strings.
     3578    Moved so it can be used in ExportCIF
     3579    '''
     3580    namstr = '  names :'
     3581    valstr = '  values:'
     3582    sigstr = '  esds  :'
     3583    for i,px in enumerate(['Px:','Py:','Pz:']):
     3584        name = pfx+rbfx+px+rbsx
     3585        namstr += '%12s'%('Pos '+px[1])
     3586        valstr += '%12.5f'%(parmDict[name])
     3587        if name in sigDict:
     3588            sigstr += '%12.5f'%(sigDict[name])
     3589        else:
     3590            sigstr += 12*' '
     3591    for i,po in enumerate(['Oa:','Oi:','Oj:','Ok:']):
     3592        name = pfx+rbfx+po+rbsx
     3593        namstr += '%12s'%('Ori '+po[1])
     3594        valstr += '%12.5f'%(parmDict[name])
     3595        if name in sigDict:
     3596            sigstr += '%12.5f'%(sigDict[name])
     3597        else:
     3598            sigstr += 12*' '
     3599    return (namstr,valstr,sigstr)
     3600
     3601def WriteRBObjTLSAndSig(pfx,rbfx,rbsx,TLS,parmDict,sigDict):
     3602    '''Cribbed version of PrintRBObjTLSAndSig but returns lists of strings.
     3603    Moved so it can be used in ExportCIF
     3604    '''
     3605    out = []
     3606    namstr = '  names :'
     3607    valstr = '  values:'
     3608    sigstr = '  esds  :'
     3609    if 'N' not in TLS:
     3610        out.append(' Thermal motion:\n')
     3611    if 'T' in TLS:
     3612        for i,pt in enumerate(['T11:','T22:','T33:','T12:','T13:','T23:']):
     3613            name = pfx+rbfx+pt+rbsx
     3614            namstr += '%12s'%(pt[:3])
     3615            valstr += '%12.5f'%(parmDict[name])
     3616            if name in sigDict:
     3617                sigstr += '%12.5f'%(sigDict[name])
     3618            else:
     3619                sigstr += 12*' '
     3620        out.append(namstr+'\n')
     3621        out.append(valstr+'\n')
     3622        out.append(sigstr+'\n')
     3623    if 'L' in TLS:
     3624        namstr = '  names :'
     3625        valstr = '  values:'
     3626        sigstr = '  esds  :'
     3627        for i,pt in enumerate(['L11:','L22:','L33:','L12:','L13:','L23:']):
     3628            name = pfx+rbfx+pt+rbsx
     3629            namstr += '%12s'%(pt[:3])
     3630            valstr += '%12.3f'%(parmDict[name])
     3631            if name in sigDict:
     3632                sigstr += '%12.3f'%(sigDict[name])
     3633            else:
     3634                sigstr += 12*' '
     3635        out.append(namstr+'\n')
     3636        out.append(valstr+'\n')
     3637        out.append(sigstr+'\n')
     3638    if 'S' in TLS:
     3639        namstr = '  names :'
     3640        valstr = '  values:'
     3641        sigstr = '  esds  :'
     3642        for i,pt in enumerate(['S12:','S13:','S21:','S23:','S31:','S32:','SAA:','SBB:']):
     3643            name = pfx+rbfx+pt+rbsx
     3644            namstr += '%12s'%(pt[:3])
     3645            valstr += '%12.4f'%(parmDict[name])
     3646            if name in sigDict:
     3647                sigstr += '%12.4f'%(sigDict[name])
     3648            else:
     3649                sigstr += 12*' '
     3650        out.append(namstr+'\n')
     3651        out.append(valstr+'\n')
     3652        out.append(sigstr+'\n')
     3653    if 'U' in TLS:
     3654        name = pfx+rbfx+'U:'+rbsx
     3655        namstr = '  names :'+'%12s'%('Uiso')
     3656        valstr = '  values:'+'%12.5f'%(parmDict[name])
     3657        if name in sigDict:
     3658            sigstr = '  esds  :'+'%12.5f'%(sigDict[name])
     3659        else:
     3660            sigstr = '  esds  :'+12*' '
     3661        out.append(namstr+'\n')
     3662        out.append(valstr+'\n')
     3663        out.append(sigstr+'\n')
     3664    return out
     3665
     3666def WriteRBObjTorAndSig(pfx,rbsx,parmDict,sigDict,nTors):
     3667    '''Cribbed version of PrintRBObjTorAndSig but returns lists of strings.
     3668    Moved so it can be used in ExportCIF
     3669    '''
     3670    out = []
     3671    namstr = '  names :'
     3672    valstr = '  values:'
     3673    sigstr = '  esds  :'
     3674    out.append(' Torsions:\n')
     3675    for it in range(nTors):
     3676        name = pfx+'RBRTr;'+str(it)+':'+rbsx
     3677        namstr += '%12s'%('Tor'+str(it))
     3678        valstr += '%12.4f'%(parmDict[name])
     3679        if name in sigDict:
     3680            sigstr += '%12.4f'%(sigDict[name])
     3681    out.append(namstr+'\n')
     3682    out.append(valstr+'\n')
     3683    out.append(sigstr+'\n')
     3684    return out
     3685
     3686def WriteResRBModel(RBModel):
     3687    '''Write description of a residue rigid body. Code shifted from
     3688    PrintResRBModel to make usable from G2export_CIF
     3689    '''
     3690    out = []
     3691    atNames = RBModel['atNames']
     3692    rbRef = RBModel['rbRef']
     3693    rbSeq = RBModel['rbSeq']
     3694    out.append('    At name       x          y          z\n')
     3695    for name,xyz in zip(atNames,RBModel['rbXYZ']):
     3696        out.append('  %8s %10.4f %10.4f %10.4f\n'%(name,xyz[0],xyz[1],xyz[2]))
     3697    out.append('  Orientation defined by: %s -> %s & %s -> %s\n'%
     3698        (atNames[rbRef[0]],atNames[rbRef[1]],atNames[rbRef[0]],atNames[rbRef[2]]))
     3699    if rbSeq:
     3700        for i,rbseq in enumerate(rbSeq):
     3701#                nameLst = [atNames[i] for i in rbseq[3]]
     3702            out.append('  Torsion sequence %d Bond: %s - %s riding: %s\n'%
     3703                    (i,atNames[rbseq[0]],atNames[rbseq[1]],str([atNames[i] for i in rbseq[3]])))
     3704    return out
     3705
     3706def WriteVecRBModel(RBModel,sigDict={},irb=None):
     3707    '''Write description of a vector rigid body. Code shifted from
     3708    PrintVecRBModel to make usable from G2export_CIF
     3709    '''
     3710    out = []
     3711    rbRef = RBModel['rbRef']
     3712    atTypes = RBModel['rbTypes']
     3713    for i in range(len(RBModel['VectMag'])):
     3714        if sigDict and irb is not None:
     3715            name = '::RBV;'+str(i)+':'+str(irb)
     3716            s = G2mth.ValEsd(RBModel['VectMag'][i],sigDict.get(name,-.0001))
     3717            out.append('Vector no.: %d Magnitude: %s\n'%(i,s))
     3718        else:
     3719            out.append('Vector no.: %d Magnitude: %8.4f Refine? %s\n'%
     3720                           (i,RBModel['VectMag'][i],RBModel['VectRef'][i]))
     3721        out.append('  No. Type     vx         vy         vz\n')
     3722        for j,[name,xyz] in enumerate(zip(atTypes,RBModel['rbVect'][i])):
     3723            out.append('  %d   %2s %10.4f %10.4f %10.4f\n'%(j,name,xyz[0],xyz[1],xyz[2]))
     3724    out.append('  No. Type      x          y          z\n')
     3725    for i,[name,xyz] in enumerate(zip(atTypes,RBModel['rbXYZ'])):
     3726        out.append('  %d   %2s %10.4f %10.4f %10.4f\n'%(i,name,xyz[0],xyz[1],xyz[2]))
     3727    return out
Note: See TracChangeset for help on using the changeset viewer.