Changeset 4661


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

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

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIIO.py

    r4654 r4661  
    15501550                self.Phases[phaseName] =  self.G2frame.GPXtree.GetItemPyData(item)
    15511551                item, cookie = self.G2frame.GPXtree.GetNextChild(sub, cookie)
     1552            # Get rigid body info into self.OverallParms
     1553            for key in ('Rigid bodies','Covariance'):
     1554                item = G2gd.GetGPXtreeItemId(self.G2frame,self.G2frame.root,key)
     1555                if item:
     1556                    self.OverallParms[key] = self.G2frame.GPXtree.GetItemPyData(item)
     1557                item, cookie = self.G2frame.GPXtree.GetNextChild(sub, cookie)
    15521558            return
    15531559        elif self.currentExportType == 'single':
  • trunk/GSASIIobj.py

    r4659 r4661  
    18501850        'DebyeU' : 'Debye model Uiso',
    18511851        'RBV.*' : 'Vector rigid body parameter',
    1852         'RBR.*' : 'Residue rigid body parameter',
    18531852        'RBRO([aijk])' : 'Residue rigid body orientation parameter',
    18541853        'RBRP([xyz])' : 'Residue rigid body position parameter',
    18551854        'RBRTr;.*' : 'Residue rigid body torsion parameter',
    18561855        'RBR([TLS])([123AB][123AB])' : 'Residue rigid body group disp. param.',
     1856        'RBRU' : 'Residue rigid body group Uiso param.',
    18571857        'constr([0-9]*)' : 'Parameter from constraint',
    18581858        # supersymmetry parameters  p::<var>:a:o 'Flen','Fcent'?
     
    19001900        'PkSig': 'Bragg peak sigma',
    19011901        'PkGam': 'Bragg peak gamma',
    1902         'e([12][12])' : 'strain tensor e\1',   # strain vars e11, e22, e12
     1902        'e([12][12])' : 'strain tensor e\\1',   # strain vars e11, e22, e12
    19031903        'Dcalc': 'Calc. d-spacing',
    19041904        'Back$': 'background parameter',
     
    19121912        'dif[ABC]':'TOF to d-space calibration',
    19131913        'C\\([0-9]*,[0-9]*\\)' : 'spherical harmonics preferred orientation coef.',
     1914        'Pressure': 'Pressure level for measurement in MPa',
     1915        'Temperature': 'T value for measurement, K',
     1916        'FreePrm([123])': 'User defined measurement parameter \\1',
     1917        'Gonio. radius': 'Distance from sample to detector, mm',
    19141918        }.items():
     1919        # Needs documentation: HAP: LayerDisp, LeBail, newLeBail
     1920        # hist: Azimuth, Chi, Omega, Phi, Bank, nDebye, nPeaks
     1921       
    19151922        if len(value) == 2:
    19161923            #VarDesc[key] = value[0]
  • trunk/GSASIIplot.py

    r4658 r4661  
    10601060                if A > 0.0:
    10611061                    Plot.add_artist(Circle(xy,radius=A,ec='g',fc='w',
    1062                                 picker=True,pickradius=1.,gid=hid))
     1062                                #picker=True,pickradius=1.,
     1063                                               gid=hid))
    10631064                else:
    10641065                    Plot.add_artist(Circle(xy,radius=-A,ec='r',fc='w',
    1065                                 picker=True,pickradius=1.,gid=hid))
     1066                                #picker=True,pickradius=1.,
     1067                                               gid=hid))
    10661068            else:
    10671069                if A > 0.0 and A > B:
     
    10691071                if B:
    10701072                    Plot.add_artist(Circle(xy,radius=B,ec='b',fc='w',
    1071                                 picker=True,pickradius=1.,gid=hid))
     1073                                #picker=True,pickradius=1.,
     1074                                               gid=hid))
    10721075                    if A < B:
    10731076                        Plot.add_artist(Circle(xy,radius=A,ec='g',fc='w'))
     
    70627065                spot = [event.xdata,event.ydata,G2frame.spotSize]
    70637066                Masks['Points'].append(spot)
    7064                 artist = Circle(spot[:2],radius=spot[2]/2,fc='none',ec='r',
    7065                                 picker=True,pickradius=3)
     7067                artist = Circle(spot[:2],radius=spot[2]/2,fc='none',ec='r')
     7068#                                picker=True,pickradius=3)
    70667069                Page.figure.gca().add_artist(artist)
    70677070                artist.itemNumber = len(Masks['Points'])-1
     
    74957498                    spot = [Xpos,Ypos,sig]
    74967499                    Masks['Points'].append(spot)
    7497                     artist = Circle((Xpos,Ypos),radius=spot[2]/2,fc='none',ec='r',
    7498                                 picker=True,pickradius=3)
     7500                    artist = Circle((Xpos,Ypos),radius=spot[2]/2,fc='none',ec='r')
     7501#                                picker=True,pickradius=3)
    74997502                    Page.figure.gca().add_artist(artist)
    75007503                    artist.itemNumber = len(Masks['Points'])-1
     
    78547857            if len(spot):
    78557858                x,y,d = spot
    7856                 artist = Circle((x,y),radius=d/2,fc='none',ec='r',
    7857                                 picker=True,pickradius=3)
     7859                artist = Circle((x,y),radius=d/2,fc='none',ec='r')
     7860#                                picker=True,pickradius=3)
    78587861                Plot.add_artist(artist)
    78597862                artist.itemNumber = i
  • 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
  • trunk/exports/G2export_CIF.py

    r4657 r4661  
    5757import GSASIIspc as G2spc
    5858import GSASIIstrMain as G2stMn
     59import GSASIIstrIO as G2strIO       
    5960import GSASIImapvars as G2mv
    6061import GSASIIElem as G2el
     
    8788        fp.write(name+'\n')
    8889
     90def RBheader(fp):
     91    WriteCIFitem(fp,'\n# RIGID BODY DETAILS')
     92    WriteCIFitem(fp,'loop_\n    _restr_rigid_body_class.class_id\n    _restr_rigid_body_class.details')
    8993
    9094# Refactored over here to allow access by GSASIIscriptable.py
    91 def WriteAtomsNuclear(fp, phasedict, phasenam, parmDict, sigDict, labellist):
     95def WriteAtomsNuclear(fp, phasedict, phasenam, parmDict, sigDict, labellist,
     96                          RBparms={}):
    9297    'Write atom positions to CIF'
    9398    # phasedict = self.Phases[phasenam] # pointer to current phase info
     
    174179        s += PutInCol(at[cs+1],3)
    175180        WriteCIFitem(fp, s)
    176     if naniso == 0: return
    177     # now loop over aniso atoms
    178     WriteCIFitem(fp, '\nloop_' + '\n   _atom_site_aniso_label' +
    179                  '\n   _atom_site_aniso_U_11' + '\n   _atom_site_aniso_U_22' +
    180                  '\n   _atom_site_aniso_U_33' + '\n   _atom_site_aniso_U_12' +
    181                  '\n   _atom_site_aniso_U_13' + '\n   _atom_site_aniso_U_23')
    182     for i,at in enumerate(Atoms):
    183         fval = parmDict.get(fpfx+str(i),at[cfrac])
    184         if fval == 0.0: continue # ignore any atoms that have a occupancy set to 0 (exact)
    185         if at[cia] == 'I': continue
    186         s = PutInCol(labellist[i],6) # label
    187         for j in (2,3,4,5,6,7):
    188             sigdig = -0.0009
    189             var = pfx+varnames[cia+j]+":"+str(i)
    190             val = parmDict.get(var,at[cia+j])
    191             sig = sigDict.get(var,sigdig)
    192             s += PutInCol(G2mth.ValEsd(val,sig),11)
    193         WriteCIFitem(fp, s)
    194 
     181    if naniso != 0:
     182        # now loop over aniso atoms
     183        WriteCIFitem(fp, '\nloop_' + '\n   _atom_site_aniso_label' +
     184                     '\n   _atom_site_aniso_U_11' + '\n   _atom_site_aniso_U_22' +
     185                     '\n   _atom_site_aniso_U_33' + '\n   _atom_site_aniso_U_12' +
     186                     '\n   _atom_site_aniso_U_13' + '\n   _atom_site_aniso_U_23')
     187        for i,at in enumerate(Atoms):
     188            fval = parmDict.get(fpfx+str(i),at[cfrac])
     189            if fval == 0.0: continue # ignore any atoms that have a occupancy set to 0 (exact)
     190            if at[cia] == 'I': continue
     191            s = PutInCol(labellist[i],6) # label
     192            for j in (2,3,4,5,6,7):
     193                sigdig = -0.0009
     194                var = pfx+varnames[cia+j]+":"+str(i)
     195                val = parmDict.get(var,at[cia+j])
     196                sig = sigDict.get(var,sigdig)
     197                s += PutInCol(G2mth.ValEsd(val,sig),11)
     198            WriteCIFitem(fp, s)
     199    # save information about rigid bodies
     200    header = False
     201    num = 0
     202    rbAtoms = []
     203    for irb,RBObj in enumerate(phasedict['RBModels'].get('Residue',[])):
     204        if not header:
     205            header = True
     206            RBheader(fp)
     207        jrb = RBparms['RBIds']['Residue'].index(RBObj['RBId'])
     208        rbsx = str(irb)+':'+str(jrb)
     209        num += 1
     210        WriteCIFitem(fp,'',str(num))
     211        RBModel = RBparms['Residue'][RBObj['RBId']]
     212        SGData = phasedict['General']['SGData']
     213        Sytsym,Mult = G2spc.SytSym(RBObj['Orig'][0],SGData)[:2]
     214        s = '''GSAS-II residue rigid body "{}" with {} atoms
     215  Site symmetry @ origin: {}, multiplicity: {}
     216'''.format(RBObj['RBname'],len(RBModel['rbTypes']),Sytsym,Mult)
     217        for i in G2strIO.WriteResRBModel(RBModel):
     218            s += i
     219        s += '\n Location:\n'
     220        for i in G2strIO.WriteRBObjPOAndSig(pfx,'RBR',rbsx,parmDict,sigDict):
     221            s += i+'\n'
     222        for i in G2strIO.WriteRBObjTLSAndSig(pfx,'RBR',rbsx,
     223                        RBObj['ThermalMotion'][0],parmDict,sigDict):
     224            s += i
     225        nTors = len(RBObj['Torsions'])
     226        if nTors:
     227            for i in G2strIO.WriteRBObjTorAndSig(pfx,rbsx,parmDict,sigDict,
     228                        nTors):
     229                s += i
     230        WriteCIFitem(fp,'',s.rstrip())
     231       
     232        pId = phasedict['pId']
     233        for i in RBObj['Ids']:
     234            lbl = G2obj.LookupAtomLabel(pId,G2obj.LookupAtomId(pId,i))[0]
     235            rbAtoms.append('{:7s} 1_555 {:3d} ?'.format(lbl,num))
     236        #GSASIIpath.IPyBreak()
     237
     238    for irb,RBObj in enumerate(phasedict['RBModels'].get('Vector',[])):
     239        if not header:
     240            header = True
     241            RBheader(fp)
     242        jrb = RBparms['RBIds']['Vector'].index(RBObj['RBId'])
     243        rbsx = str(irb)+':'+str(jrb)
     244        num += 1
     245        WriteCIFitem(fp,'',str(num))
     246        RBModel = RBparms['Vector'][RBObj['RBId']]
     247        SGData = phasedict['General']['SGData']
     248        Sytsym,Mult = G2spc.SytSym(RBObj['Orig'][0],SGData)[:2]
     249        s = '''GSAS-II vector rigid body "{}" with {} atoms
     250  Site symmetry @ origin: {}, multiplicity: {}
     251'''.format(RBObj['RBname'],len(RBModel['rbTypes']),Sytsym,Mult)
     252        for i in G2strIO.WriteVecRBModel(RBModel,sigDict,irb):
     253            s += i
     254        s += '\n Location:\n'
     255        for i in G2strIO.WriteRBObjPOAndSig(pfx,'RBV',rbsx,parmDict,sigDict):
     256            s += i+'\n'
     257        for i in G2strIO.WriteRBObjTLSAndSig(pfx,'RBV',rbsx,
     258                        RBObj['ThermalMotion'][0],parmDict,sigDict):
     259            s += i
     260        WriteCIFitem(fp,'',s.rstrip())
     261       
     262        pId = phasedict['pId']
     263        for i in RBObj['Ids']:
     264            lbl = G2obj.LookupAtomLabel(pId,G2obj.LookupAtomId(pId,i))[0]
     265            rbAtoms.append('{:7s} 1_555 {:3d} ?'.format(lbl,num))
     266
     267    if rbAtoms:
     268        WriteCIFitem(fp,'loop_\n    _restr_rigid_body.id'+
     269            '\n    _restr_rigid_body.atom_site_label\n    _restr_rigid_body.site_symmetry'+
     270            '\n    _restr_rigid_body.class_id\n    _restr_rigid_body.details')
     271        for i,l in enumerate(rbAtoms):
     272            WriteCIFitem(fp,'   {:5d} {}'.format(i+1,l))
     273           
    195274def WriteAtomsMagnetic(fp, phasedict, phasenam, parmDict, sigDict, labellist):
    196275    'Write atom positions to CIF'
     
    560639            if self.ifHKLF:
    561640                controls = self.OverallParms['Controls']
    562                 if controls['F**2']:
    563                     thresh = 'F**2>%.1fu(F**2)'%(controls['UsrReject']['minF/sig'])
    564                 else:
    565                     thresh = 'F>%.1fu(F)'%(controls['UsrReject']['minF/sig'])
    566                 WriteCIFitem(self.fp, '_reflns_threshold_expression', thresh)
     641                try:
     642                    if controls['F**2']:
     643                        thresh = 'F**2>%.1fu(F**2)'%(controls['UsrReject']['minF/sig'])
     644                    else:
     645                        thresh = 'F>%.1fu(F)'%(controls['UsrReject']['minF/sig'])
     646                    WriteCIFitem(self.fp, '_reflns_threshold_expression', thresh)
     647                except KeyError:
     648                    pass
    567649            try:
    568650                vars = str(len(self.OverallParms['Covariance']['varyList']))
     
    11431225                    self.labellist = []
    11441226                WriteAtomsNuclear(self.fp, self.Phases[phasenam], phasenam,
    1145                                   self.parmDict, self.sigDict, self.labellist)
     1227                                  self.parmDict, self.sigDict, self.labellist,
     1228                                      self.OverallParms['Rigid bodies'])
    11461229            else:
    11471230                try:
     
    15221605                    s += PutInCol('.',10)
    15231606                    s += PutInCol(G2mth.ValEsd(ref[9],0),12)
    1524                     s += PutInCol(G2mth.ValEsd(ref[10],-0.9),7)
    15251607                else:
    15261608                    sig = ref[6] * ref[8] / ref[5]
     
    19182000        # load saved CIF author name
    19192001        try:
    1920             self.author = self.OverallParms['Controls'].get("Author",'').strip()
     2002            self.author = self.OverallParms['Controls'].get("Author",'?').strip()
    19212003        except KeyError:
    19222004            pass
     
    21042186        # give the user a window to edit CIF contents
    21052187        if not self.author:
    2106             self.author = self.OverallParms['Controls']["Author"]
     2188            self.author = self.OverallParms['Controls'].get("Author",'?').strip()
    21072189            self.shortauthorname = self.author.replace(',','').replace(' ','')[:20]
    21082190        if not self.author:
Note: See TracChangeset for help on using the changeset viewer.