Changeset 4659 for trunk/GSASIIElem.py


Ignore:
Timestamp:
Nov 21, 2020 2:15:49 PM (11 months ago)
Author:
toby
Message:

extensive Origin 1->2 updates; merge SetupGeneral? into a single routine in G2Elem; read sym ops from CIF; fix sites sym/mult after cood xform

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIElem.py

    r4629 r4659  
    543543    return (FP, FPP, Mu)
    544544   
    545 
     545mapDefault = {'MapType':'','RefList':'','GridStep':0.25,'Show bonds':True,
     546                'rho':[],'rhoMax':0.,'mapSize':10.0,'cutOff':50.,'Flip':False}
     547
     548def SetupGeneral(data, dirname):
     549    '''Initialize the General sections of the Phase tree contents
     550    Called by SetupGeneral in GSASIIphsGUI and in GSASIIscriptable.SetupGeneral
     551    '''
     552    generalData = data['General']
     553    atomData = data['Atoms']
     554    generalData['AtomTypes'] = []
     555    generalData['Isotopes'] = {}
     556# various patches
     557    if 'Isotope' not in generalData:
     558        generalData['Isotope'] = {}
     559    if 'Data plot type' not in generalData:
     560        generalData['Data plot type'] = 'Mustrain'
     561    if 'POhkl' not in generalData:
     562        generalData['POhkl'] = [0,0,1]
     563    if 'Map' not in generalData:
     564        generalData['Map'] = mapDefault.copy()
     565    if 'Flip' not in generalData:
     566        generalData['Flip'] = {'RefList':'','GridStep':0.25,'Norm element':'None',
     567            'k-factor':0.1,'k-Max':20.,}
     568    if 'testHKL' not in generalData['Flip']:
     569        generalData['Flip']['testHKL'] = [[0,0,2],[2,0,0],[1,1,1],[0,2,0],[1,2,3]]
     570    if 'doPawley' not in generalData:
     571        generalData['doPawley'] = False     #ToDo: change to ''
     572    if 'Pawley dmin' not in generalData:
     573        generalData['Pawley dmin'] = 1.0
     574    if 'Pawley dmax' not in generalData:
     575        generalData['Pawley dmax'] = 100.0
     576    if 'Pawley neg wt' not in generalData:
     577        generalData['Pawley neg wt'] = 0.0
     578    if '3Dproj' not in generalData:
     579        generalData['3Dproj'] = ''
     580    if 'doDysnomia' not in generalData:
     581        generalData['doDysnomia'] = False
     582    if 'Algolrithm' in generalData.get('MCSA controls',{}) or \
     583        'MCSA controls' not in generalData:
     584        generalData['MCSA controls'] = {'Data source':'','Annealing':[0.7,0.1,250],
     585        'dmin':2.8,'Algorithm':'log','fast parms':[0.8,0.6],'log slope':0.9,
     586        'Cycles':1,'Results':[],'newDmin':True}
     587    if 'AtomPtrs' not in generalData:
     588        generalData['AtomPtrs'] = [3,1,7,9]
     589        if generalData['Type'] == 'macromolecular':
     590            generalData['AtomPtrs'] = [6,4,10,12]
     591        elif generalData['Type'] == 'magnetic':
     592            generalData['AtomPtrs'] = [3,1,10,12]
     593    if generalData['Modulated']:
     594        if 'Super' not in generalData:
     595            generalData['Super'] = 1
     596            generalData['SuperVec'] = [[0.,0.,0.],False,1]
     597            generalData['SSGData'] = {}
     598        if '4DmapData' not in generalData:
     599            generalData['4DmapData'] = mapDefault.copy()
     600            generalData['4DmapData'].update({'MapType':'Fobs'})
     601        atomData = data['Atoms']
     602        for atom in atomData:
     603#                if 'SS1' not in atom:
     604#                    atom += [[],[],{'SS1':{'waveType':'Fourier','Sfrac':[],'Spos':[],'Sadp':[],'Smag':[]}}]
     605            if isinstance(atom[-1],dict) and 'waveType' in atom[-1]['SS1']:
     606                waveType = atom[-1]['SS1']['waveType']
     607                for parm in ['Sfrac','Spos','Sadp','Smag']:
     608                    if len(atom[-1]['SS1'][parm]):
     609                        wType = 'Fourier'
     610                        if parm == 'Sfrac':
     611                            if 'Crenel' in waveType:
     612                                wType = 'Crenel'
     613                        elif parm == 'Spos':
     614                            if not 'Crenel' in waveType:
     615                                wType = waveType
     616                        atom[-1]['SS1'][parm] = [wType,]+list(atom[-1]['SS1'][parm])
     617                del atom[-1]['SS1']['waveType']
     618    else:
     619        generalData['Super'] = 0
     620    if 'Modulated' not in generalData:
     621        generalData['Modulated'] = False
     622    if 'HydIds' not in generalData:
     623        generalData['HydIds'] = {}
     624    if generalData['Type'] == 'magnetic':
     625        if 'SGGray' not in generalData['SGData']:
     626            generalData['SGData']['SGGray'] = False
     627    if 'Resolution' in generalData['Map']:
     628        generalData['Map']['GridStep'] = generalData['Map']['Resolution']/2.
     629        generalData['Flip']['GridStep'] = generalData['Flip']['Resolution']/2.
     630        del generalData['Map']['Resolution']
     631        del generalData['Flip']['Resolution']
     632    if 'Compare' not in generalData:
     633        generalData['Compare'] = {'Oatoms':'','Tatoms':'',
     634                'Tilts':{'Otilts':[],'Ttilts':[]},
     635            'Bonds':{'Obonds':[],'Tbonds':[]},'Vects':{'Ovec':[],'Tvec':[]},
     636            'dVects':{'Ovec':[],'Tvec':[]},'Sampling':1.0}
     637    if 'Sampling' not in generalData['Compare']:
     638        generalData['Compare']['Sampling'] = 1.0
     639
     640# end of patches
     641    cx,ct,cs,cia = generalData['AtomPtrs']
     642    generalData['NoAtoms'] = {}
     643    generalData['BondRadii'] = []
     644    generalData['AngleRadii'] = []
     645    generalData['vdWRadii'] = []
     646    generalData['AtomMass'] = []
     647    generalData['Color'] = []
     648    if generalData['Type'] == 'magnetic':
     649        generalData['MagDmin'] = generalData.get('MagDmin',1.0)
     650        landeg = generalData.get('Lande g',[])
     651    generalData['Mydir'] = dirname
     652    badList = {}
     653    for iat,atom in enumerate(atomData):
     654        atom[ct] = atom[ct].lower().capitalize()              #force to standard form
     655        if generalData['AtomTypes'].count(atom[ct]):
     656            generalData['NoAtoms'][atom[ct]] += atom[cx+3]*float(atom[cs+1])
     657        elif atom[ct] != 'UNK':
     658            Info = GetAtomInfo(atom[ct])
     659            if not Info:
     660                if atom[ct] not in badList:
     661                    badList[atom[ct]] = 0
     662                badList[atom[ct]] += 1
     663                atom[ct] = 'UNK'
     664                continue
     665            atom[ct] = Info['Symbol'] # N.B. symbol might be changed by GetAtomInfo
     666            generalData['AtomTypes'].append(atom[ct])
     667            generalData['Z'] = Info['Z']
     668            generalData['Isotopes'][atom[ct]] = Info['Isotopes']
     669            generalData['BondRadii'].append(Info['Drad'])
     670            generalData['AngleRadii'].append(Info['Arad'])
     671            generalData['vdWRadii'].append(Info['Vdrad'])
     672            if atom[ct] in generalData['Isotope']:
     673                if generalData['Isotope'][atom[ct]] not in generalData['Isotopes'][atom[ct]]:
     674                    isotope = list(generalData['Isotopes'][atom[ct]].keys())[-1]
     675                    generalData['Isotope'][atom[ct]] = isotope
     676                generalData['AtomMass'].append(Info['Isotopes'][generalData['Isotope'][atom[ct]]]['Mass'])
     677            else:
     678                generalData['Isotope'][atom[ct]] = 'Nat. Abund.'
     679                if 'Nat. Abund.' not in generalData['Isotopes'][atom[ct]]:
     680                    isotope = list(generalData['Isotopes'][atom[ct]].keys())[-1]
     681                    generalData['Isotope'][atom[ct]] = isotope
     682                generalData['AtomMass'].append(Info['Mass'])
     683            generalData['NoAtoms'][atom[ct]] = atom[cx+3]*float(atom[cs+1])
     684            generalData['Color'].append(Info['Color'])
     685            if generalData['Type'] == 'magnetic':
     686                if len(landeg) < len(generalData['AtomTypes']):
     687                    landeg.append(2.0)
     688    if generalData['Type'] == 'magnetic':
     689        generalData['Lande g'] = landeg[:len(generalData['AtomTypes'])]
     690
     691    F000X = 0.
     692    F000N = 0.
     693    for i,elem in enumerate(generalData['AtomTypes']):
     694        F000X += generalData['NoAtoms'][elem]*generalData['Z']
     695        isotope = generalData['Isotope'][elem]
     696        F000N += generalData['NoAtoms'][elem]*generalData['Isotopes'][elem][isotope]['SL'][0]
     697    generalData['F000X'] = F000X
     698    generalData['F000N'] = F000N
     699    generalData['Mass'] = G2mth.getMass(generalData)
     700 
     701    if badList:
     702        msg = 'Warning: element symbol(s) not found:'
     703        for key in badList:
     704            msg += '\n\t' + key
     705            if badList[key] > 1:
     706                msg += ' (' + str(badList[key]) + ' times)'
     707        #wx.MessageBox(msg,caption='Element symbol error')
     708        raise ValueError("Phase error:\n" + msg)       
Note: See TracChangeset for help on using the changeset viewer.