Changeset 3990


Ignore:
Timestamp:
May 22, 2019 2:04:11 PM (2 years ago)
Author:
vondreele
Message:

MEM Dysnomia now works but can be uncontrolled. No feedback into GSAS-II yet

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIdataGUI.py

    r3982 r3990  
    47164716            histNames = Controls['Seq Data']
    47174717        else: # patch from before Controls['Seq Data'] was implemented
    4718             histNames = G2stIO.GetHistogramNames(GPXfile,['PWDR',])
     4718            histNames = G2stIO.GetHistogramNames(self.GPXfile,['PWDR',])
    47194719        if Controls.get('Reverse Seq'):
    47204720            histNames.reverse()
     
    55835583        #Phase / Dysnomia (Maximum Entropy Method) tab
    55845584        G2G.Define_wxId('wxID_LOADDYSNOMIA', 'wxID_SAVEDYSNOMIA', 'wxID_RUNDYSNOMIA', )       
    5585         self.MEMData = wx.MenuBar()
    5586         self.PrefillDataMenu(self.MEMData)
    5587         self.MEMData.Append(menu=wx.Menu(title=''),title='Select tab')
     5585        self.MEMMenu = wx.MenuBar()
     5586        self.PrefillDataMenu(self.MEMMenu)
     5587        self.MEMMenu.Append(menu=wx.Menu(title=''),title='Select tab')
    55885588        self.MEMDataEdit = wx.Menu(title='')
    5589         self.MEMData.Append(menu=self.MEMDataEdit, title='Operations')
     5589        self.MEMMenu.Append(menu=self.MEMDataEdit, title='Operations')
    55905590        self.MEMDataEdit.Append(G2G.wxID_LOADDYSNOMIA,'Load from Dysnomia file','Load MEM info from Dysnomia file')
    55915591        self.MEMDataEdit.Append(G2G.wxID_SAVEDYSNOMIA,'Save Dysnomia file','Save MEM info in Dysnomia file')
     
    78177817                G2frame.PatternId,'Instrument Parameters'))
    78187818            if 'C' in Inst[0]['Type'][0]:
    7819                 magSizer.Add(wx.StaticText(panel,-1,'2Theta'
    7820                                        ),1,wx.ALIGN_CENTER,1)
     7819                magSizer.Add(wx.StaticText(panel,-1,'2Theta'),1,wx.ALIGN_CENTER,1)
    78217820            else:
    7822                 magSizer.Add(wx.StaticText(panel,-1,'TOF'
    7823                                        ),1,wx.ALIGN_CENTER,1)
     7821                magSizer.Add(wx.StaticText(panel,-1,'TOF'),1,wx.ALIGN_CENTER,1)
    78247822            magSizer.Add(wx.StaticText(panel,-1,'Magnification\nfactor',
    7825                                        style=wx.ALIGN_CENTRE_HORIZONTAL),1,wx.ALIGN_CENTER,1)
     7823                style=wx.ALIGN_CENTRE_HORIZONTAL),1,wx.ALIGN_CENTER,1)
    78267824            magSizer.Add(wx.StaticText(panel,-1,'Delete\nbutton',
    7827                                        style=wx.ALIGN_CENTRE_HORIZONTAL
    7828                                        ),1,wx.ALIGN_CENTER,1)
     7825                style=wx.ALIGN_CENTRE_HORIZONTAL),1,wx.ALIGN_CENTER,1)
    78297826            magSizer.Add(wx.StaticText(panel,-1,'(start)'),1,wx.ALIGN_CENTER,1)
    78307827            edit = G2G.ValidatedTxtCtrl(panel,data[0]['Magnification'][0],1,
    7831                                             nDig=(7,2),
    7832                                             min=0.01,max=1000.,
    7833                                             OnLeave=OnEditMag,size=(65,-1))
     7828                nDig=(7,2),min=0.01,max=1000.,OnLeave=OnEditMag,size=(65,-1))
    78347829            magSizer.Add(edit,1,wx.ALIGN_CENTER,5)
    78357830            magSizer.Add((1,1))
    78367831            for i in range(1,lenmag):
    7837                 edit = G2G.ValidatedTxtCtrl(panel,data[0]['Magnification'][i],0,
    7838                                             nDig=(10,3),
    7839                                             min=data[1][0][0],max=data[1][0][-1],
    7840                                             OnLeave=OnEditMag)
     7832                edit = G2G.ValidatedTxtCtrl(panel,data[0]['Magnification'][i],0,nDig=(10,3),
     7833                    min=data[1][0][0],max=data[1][0][-1],OnLeave=OnEditMag)
    78417834                magSizer.Add(edit)
    78427835                edit = G2G.ValidatedTxtCtrl(panel,data[0]['Magnification'][i],1,
    7843                                             nDig=(7,2),
    7844                                             min=0.01,max=1000.,
    7845                                             OnLeave=OnEditMag,size=(65,-1))
     7836                    nDig=(7,2),min=0.01,max=1000.,OnLeave=OnEditMag,size=(65,-1))
    78467837                magSizer.Add(edit,1,wx.ALIGN_CENTER,5)
    78477838                delmag = wx.Button(panel,wx.ID_ANY,label='Del',size=(40,-1))
     
    78787869            SuperVec = []       
    78797870        refList = data[1]['RefList']
    7880 #        GSASIIpath.IPyBreak()
    78817871        FoMax = np.max(refList.T[5+data[1].get('Super',0)])
    78827872        page = G2frame.G2plotNB.nb.GetSelection()
  • trunk/GSASIIphsGUI.py

    r3982 r3990  
    4040import sys
    4141import random as ran
     42import subprocess as subp
    4243import GSASIIpath
    4344GSASIIpath.SetVersionNumber("$Revision$")
     
    21862187
    21872188            def OnDysnomia(event):
    2188                 generalData['doDysnomia'] = not generalData['doDysnomia']
     2189                data['General']['doDysnomia'] = not data['General']['doDysnomia']
    21892190                pages = [G2frame.phaseDisplay.GetPageText(PageNum) for PageNum in range(G2frame.phaseDisplay.GetPageCount())]
    21902191                if generalData['doDysnomia']:
    21912192                    if 'Dysnomia' not in pages:
    21922193                        G2frame.MEMData = wx.ScrolledWindow(G2frame.phaseDisplay)
     2194                        G2frame.Bind(wx.EVT_MENU, OnLoadDysnomia, id=G2G.wxID_LOADDYSNOMIA)
     2195                        G2frame.Bind(wx.EVT_MENU, OnSaveDysnomia, id=G2G.wxID_SAVEDYSNOMIA)
     2196                        G2frame.Bind(wx.EVT_MENU, OnRunDysnomia, id=G2G.wxID_RUNDYSNOMIA)
    21932197                        G2frame.phaseDisplay.InsertPage(7,G2frame.MEMData,'Dysnomia')
    21942198                        Id = wx.NewId()
    21952199                        TabSelectionIdDict[Id] = 'Dysnomia'
     2200                       
     2201                       
    21962202                        if 'Dysnomia' not in data:  #set defaults here
    21972203                            data['Dysnomia'] = {'DenStart':'uniform','Optimize':'ZSPA','Lagrange':['user',0.001,0.05],
    2198                                 'wt pwr':0,'E_factor':1.,'Ncyc':5000,'prior':'uniform','Lam frac':[1,0,0,0,0,0,0,0]}
     2204                                'wt pwr':0,'E_factor':1.,'Ncyc':5000,'prior':'uniform','Lam frac':[1,0,0,0,0,0,0,0],
     2205                                'overlap':1.0}
    21992206                else:
    22002207                    if 'Dysnomia' in pages:
     
    41254132        ''' Present the controls for running Dysnomia
    41264133        '''
    4127 #data['Dysonmia'] = {'DenStart':'uniform','Optimize':'ZSPA','Lagrange':['user',0.001,0.05],
     4134#data['Dysnomia'] = {'DenStart':'uniform','Optimize':'ZSPA','Lagrange':['user',0.001,0.05],
    41284135#    'wt pwr':0,'E_factor':1.,'Ncyc':5000,'prior':'uniform','Lam frac':[1,0,0,0,0,0,0,0]}
    41294136        def OnOptMeth(event):
     
    41454152            MEMData.GetSizer().Clear(True)
    41464153        DysData = data['Dysnomia']
     4154        if 'overlap' not in DysData:
     4155            DysData['overlap'] = 1.0
    41474156        mainSizer = wx.BoxSizer(wx.VERTICAL)
    41484157        mainSizer.Add(wx.StaticText(MEMData,label=' Maximum Entropy Method (Dysnomia) controls:'))
     
    41534162        OptMeth.Bind(wx.EVT_COMBOBOX,OnOptMeth)
    41544163        lineSizer.Add(OptMeth,0,WACV)
     4164        lineSizer.Add(wx.StaticText(MEMData,label=' Peak overlap factor'),0,WACV)
     4165        overlap = G2G.ValidatedTxtCtrl(MEMData,DysData,'overlap',nDig=(10,4),min=0.1,max=1.)
     4166        lineSizer.Add(overlap,0,WACV)
    41554167        mainSizer.Add(lineSizer)
    41564168        if DysData['Optimize'] == 'ZSPA':
     
    42064218    def OnRunDysnomia(event):
    42074219       
    4208        
     4220#data['Dysnomia'] = {'DenStart':'uniform','Optimize':'ZSPA','Lagrange':['user',0.001,0.05],
     4221#    'wt pwr':0,'E_factor':1.,'Ncyc':5000,'prior':'uniform','Lam frac':[1,0,0,0,0,0,0,0]}
     4222
    42094223        generalData = data['General']
    42104224        Map = generalData['Map']
    4211         Phase = generalData['Name'].replace(' ','_')
    4212         DysData = data['Dysnomia']
    4213         prf = open(Phase+'.prf','w')
    4214         prf.write(Phase+'.mem\n') #or .fos?
    4215         prf.write(Phase+'.out\n')
    4216         prf.write(Phase+'.pgrid\n')
    4217         prf.write(Phase+'.fba\n')
    4218         prf.write(Phase+'_eps.raw\n')
    4219        
    4220        
    4221 
    4222        
    4223         prf.close()
     4225        UseList = Map['RefList']
     4226        pId = G2gd.GetGPXtreeItemId(G2frame,G2frame.root,UseList[0])       #only use 1st histogram
     4227        reflSets = G2frame.GPXtree.GetItemPyData(G2gd.GetGPXtreeItemId(G2frame,pId,'Reflection Lists'))
     4228        reflData = reflSets[generalData['Name']]['RefList']
     4229        Type = Map['Type']
     4230        MEMtype = 0
     4231        if 'N' in Type:
     4232            for el in generalData['Isotope']:
     4233                isotope = generalData['Isotope'][el]
     4234                if generalData['Isotopes'][el][isotope]['SL'][0] < 0.:
     4235                    MEMtype = 1
     4236        prfName = str(G2pwd.makePRFfile(data,MEMtype))
     4237        if not G2pwd.makeMEMfile(data,reflData,MEMtype):
     4238            print('non standard space groupsnot permitted in Dysnomia')
     4239            return
    42244240
    42254241        wx.MessageBox(''' For use of Dysnomia, please cite:
     
    42284244      K. Moma, T. Ikeda, A.A. Belik & F. Izumi, Powder Diffr. 2013, 28, 184-193.
    42294245      doi:10.1017/S088571561300002X''',caption='Dysnomia (MEM)',style=wx.ICON_INFORMATION)
     4246       
     4247        path2GSAS2 = os.path.dirname(os.path.abspath(os.path.expanduser(__file__)))
     4248        DYSNOMIA = os.path.join(path2GSAS2,'Dysnomia','Dysnomia64.exe')
     4249        print('Run '+DYSNOMIA)
     4250       
     4251        subp.call([DYSNOMIA,prfName])
    42304252           
    42314253       
     
    96299651            wx.CallAfter(G2plt.PlotStructure,G2frame,data,firstCall=True)
    96309652        elif text == 'Dysnomia':
    9631             G2gd.SetDataMenuBar(G2frame,G2frame.dataWindow.MEMData)
     9653            G2gd.SetDataMenuBar(G2frame,G2frame.dataWindow.MEMMenu)
    96329654            UpdateDysnomia()
    96339655        elif text == 'Draw Options':
     
    97199741        # Dysnomia (MEM)
    97209742        if data['General']['doDysnomia']:
    9721             FillSelectPageMenu(TabSelectionIdDict, G2frame.dataWindow.MEMData)
     9743            FillSelectPageMenu(TabSelectionIdDict, G2frame.dataWindow.MEMMenu)
    97229744            G2frame.Bind(wx.EVT_MENU, OnLoadDysnomia, id=G2G.wxID_LOADDYSNOMIA)
    97239745            G2frame.Bind(wx.EVT_MENU, OnSaveDysnomia, id=G2G.wxID_SAVEDYSNOMIA)
     
    98589880    G2frame.phaseDisplay.AddPage(MapPeaks,'Map peaks')
    98599881    if data['General']['doDysnomia']:
    9860         G2frame.Dysnomia = wx.ScrolledWindow(G2frame.phaseDisplay)
    9861         G2frame.phaseDisplay.AddPage(G2frame.Dysnomia,'Dysnomia')
     9882        G2frame.MEMData = wx.ScrolledWindow(G2frame.phaseDisplay)
     9883        G2frame.phaseDisplay.AddPage(G2frame.MEMData,'Dysnomia')
    98629884        Pages.append('Dysnomia')       
    98639885    Pages.append('Map peaks')
  • trunk/GSASIIpwd.py

    r3959 r3990  
    28102810    Layers['Sadp']['Img'] = Sapd
    28112811    print (' GETSAD time = %.2fs'%(time.time()-time0))
    2812 #    GSASIIpath.IPyBreak()
    2813    
     2812   
     2813###############################################################################
     2814#### Maximum Entropy Method - Dysnomia
     2815###############################################################################
     2816   
     2817def makePRFfile(data,MEMtype):
     2818    ''' makes Dysnomia .prf control file from Dysnomia GUI controls
     2819   
     2820    ;param dict data: GSAS-II phase data
     2821    :param int MEMtype: 1 for neutron data with negative scattering lengths
     2822                        0 otherwise
     2823    :returns str: name of Dysnomia control file
     2824    '''
     2825
     2826    generalData = data['General']
     2827    pName = generalData['Name'].replace(' ','_')
     2828    DysData = data['Dysnomia']
     2829    prfName = pName+'.prf'
     2830    prf = open(prfName,'w')
     2831    prf.write('$PREFERENCES\n')
     2832    prf.write(pName+'.mem\n') #or .fos?
     2833    prf.write(pName+'.out\n')
     2834    prf.write(pName+'.pgrid\n')
     2835    prf.write(pName+'.fba\n')
     2836    prf.write(pName+'_eps.raw\n')
     2837    prf.write('%d\n'%MEMtype)
     2838    if DysData['DenStart'] == 'uniform':
     2839        prf.write('0\n')
     2840    else:
     2841        prf.write('1\n')
     2842    if DysData['Optimize'] == 'ZSPA':
     2843        prf.write('0\n')
     2844    else:
     2845        prf.write('1\n')
     2846    prf.write('1\n')
     2847    if DysData['Lagrange'][0] == 'user':
     2848        prf.write('0\n')
     2849    else:
     2850        prf.write('1\n')
     2851    prf.write('%.4f %d\n'%(DysData['Lagrange'][1],DysData['wt pwr']))
     2852    prf.write('%.3f\n'%DysData['Lagrange'][2])
     2853    prf.write('%.2f\n'%DysData['E_factor'])
     2854    prf.write('1\n')
     2855    prf.write('0\n')
     2856    prf.write('%d\n'%DysData['Ncyc'])
     2857    prf.write('1\n')
     2858    prf.write('1 0 0 0 0 0 0 0\n')
     2859    if DysData['prior'] == 'uniform':
     2860        prf.write('0\n')
     2861    else:
     2862        prf.write('1\n')
     2863    prf.close()
     2864    return prfName
     2865
     2866def makeMEMfile(data,reflData,MEMtype):
     2867    ''' make Dysnomia .mem file of reflection data, etc.
     2868    ;param dict data: GSAS-II phase data
     2869    :param list reflData: GSAS-II reflection data
     2870    :param int MEMtype: 1 for neutron data with negative scattering lengths
     2871                        0 otherwise
     2872    '''
     2873   
     2874    DysData = data['Dysnomia']
     2875    generalData = data['General']
     2876    pName = generalData['Name'].replace(' ','_')
     2877    memName = pName+'.mem'
     2878    Map = generalData['Map']
     2879    Type = Map['Type']
     2880    UseList = Map['RefList']
     2881    mem = open(memName,'w')
     2882    mem.write('%s\n'%(generalData['Name']+' from '+UseList[0]))
     2883    a,b,c,alp,bet,gam = generalData['Cell'][1:7]
     2884    mem.write('%10.5f%10.5f%10.5f%10.5f,%10.5f%10.5f\n'%(a,b,c,alp,bet,gam))
     2885    mem.write('      0.0000000      0.0000000     -1    0    0    0     P\n')   #dummy PO stuff
     2886    SGSym = generalData['SGData']['SpGrp']
     2887    try:
     2888        SGId = G2spc.spgbyNum.index(SGSym)
     2889    except IndexError:
     2890        return False
     2891    org = 1
     2892    if SGSym in G2spc.spg2origins:
     2893        org = 2
     2894    mapsize = Map['rho'].shape
     2895    sumZ = 0.
     2896    sumpos = 0.
     2897    sumneg = 0.
     2898    mem.write('%5d%5d%5d%5d%5d\n'%(SGId,org,mapsize[0],mapsize[1],mapsize[2]))
     2899    for atm in generalData['NoAtoms']:
     2900        Nat = generalData['NoAtoms'][atm]
     2901        AtInfo = G2elem.GetAtomInfo(atm)
     2902        sumZ += Nat*AtInfo['Z']
     2903        isotope = generalData['Isotope'][atm]
     2904        blen = generalData['Isotopes'][atm][isotope]['SL'][0]
     2905        if blen < 0.:
     2906            sumneg += blen*Nat
     2907        else:
     2908            sumpos += blen*Nat
     2909    if 'X' in Type:
     2910        mem.write('%10.2f  0.001\n'%sumZ)
     2911    elif 'N' in Type and MEMtype:
     2912        mem.write('%10.3f%10.3f 0.001\n'%(sumpos,sumneg))
     2913    else:
     2914        mem.write('%10.3 0.001\n'%sumpos)
     2915       
     2916    refs = []
     2917    prevpos = 0.
     2918    for ref in reflData:
     2919        if 'T' in Type:
     2920            h,k,l,mult,dsp,pos,sig,gam,Fobs,Fcalc,phase,x,x,x,x,prfo = ref[:16]
     2921            FWHM = getgamFW(gam,sig)
     2922        else:
     2923            h,k,l,mult,dsp,pos,sig,gam,Fobs,Fcalc,phase,x,prfo = ref[:13]
     2924            g = gam/100.    #centideg -> deg
     2925            s = np.sqrt(max(sig,0.0001))/100.   #var -> sig in deg
     2926            FWHM = getgamFW(g,s)
     2927        delt = pos-prevpos
     2928        refs.append([h,k,l,mult,pos,FWHM,Fobs,phase,delt])
     2929        prevpos = pos
     2930           
     2931    ovlp = DysData['overlap']
     2932    refs1 = []
     2933    refs2 = []
     2934    nref2 = 0
     2935    iref = 0
     2936    Nref = len(refs)
     2937    start = False
     2938    while iref < Nref-1:
     2939        if refs[iref+1][-1] < ovlp*refs[iref][5]:
     2940            if refs[iref][-1] > ovlp*refs[iref][5]:
     2941                refs2.append([])
     2942                start = True
     2943            if nref2 == len(refs2):
     2944                refs2.append([])
     2945            refs2[nref2].append(refs[iref])
     2946        else:
     2947            if start:
     2948                refs2[nref2].append(refs[iref])
     2949                start = False
     2950                nref2 += 1
     2951            else:
     2952                refs1.append(refs[iref])
     2953        iref += 1
     2954    if start:
     2955        refs2[nref2].append(refs[iref])
     2956    else:
     2957        refs1.append(refs[iref])
     2958   
     2959    mem.write('%5d\n'%len(refs1))
     2960    for ref in refs1:
     2961        h,k,l = ref[:3]
     2962        Fobs = np.sqrt(ref[6])
     2963        mem.write('%5d%5d%5d%10.3f%10.3f%10.3f\n'%(h,k,l,Fobs*npcosd(ref[7]),Fobs*npsind(ref[7]),max(0.01*Fobs,0.1)))
     2964    mem.write('%5d\n'%len(refs2))
     2965    for ref2 in refs2:
     2966        if not len(ref2):
     2967            break
     2968        mem.write('%5d\n'%len(ref2))
     2969        Gsum = 0.
     2970        Msum = 0
     2971        for ref in ref2:
     2972            Gsum += ref[6]*ref[3]
     2973            Msum += ref[3]
     2974        G = np.sqrt(Gsum/Msum)
     2975        h,k,l = ref2[0][:3]
     2976        mem.write('%5d%5d%5d%10.3f%10.3f%5d\n'%(h,k,l,G,max(0.01*G,0.1),ref2[0][3]))
     2977        for ref in ref2[1:]:
     2978            h,k,l,m = ref[:4]
     2979            mem.write('%5d%5d%5d%5d\n'%(h,k,l,m))
     2980    mem.write('0\n')
     2981    mem.close()
     2982    return True
    28142983#testing data
    28152984NeedTestData = True
  • trunk/exports/G2export_examples.py

    r3223 r3990  
    194194            ): return
    195195        self.OpenFile()
    196         hist = self.histnam[0] # there should only be one histogram, in any case take the 1st
     196        hist = list(self.histnam)[0] # there should only be one histogram, in any case take the 1st
    197197        self.Write('\nHistogram '+hist)
    198198        histblk = self.Histograms[hist]
     
    276276            ): return
    277277        self.OpenFile()
    278         hist = self.histnam[0] # there should only be one histogram, in any case take the 1st
     278        hist = list(self.histnam)[0] # there should only be one histogram, in any case take the 1st
    279279        histblk = self.Histograms[hist]
    280280        hklfmt = "{:.0f},{:.0f},{:.0f}"
Note: See TracChangeset for help on using the changeset viewer.