Changeset 573


Ignore:
Timestamp:
Apr 25, 2012 11:54:23 AM (9 years ago)
Author:
vondreele
Message:

add 'None' as one of the phase data plot options
trap failed charge flipping errors
add atom modify commands
add a new class - SingleFloatDialog? to GSASIIphsGUI.py
can now roll in place charge flip maps with u,d,l,r keys

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIIO.py

    r537 r573  
    10361036            'Cell':[False,]+cell,
    10371037            'Pawley dmin':1.0,
    1038             'Data plot type':'Mustrain',
     1038            'Data plot type':'None',
    10391039            'SH Texture':{
    10401040                'Order':0,
  • trunk/GSASIImath.py

    r569 r573  
    605605        Uniq = np.concatenate((Uniq,-Uniq))+hklHalf
    606606        phi = np.concatenate((phi,-phi))
    607         print hkl-hklHalf
    608         for j,H in enumerate(Uniq):
    609             Fh = Fhkl[H[0],H[1],H[2]]
    610             h,k,l = H-hklHalf
    611             print '(%3d,%3d,%3d) %5.2f %9.5f'%(h,k,l,phi[j],np.angle(Fh,deg=True))       
     607#        print hkl-hklHalf
     608#        for j,H in enumerate(Uniq):
     609#            Fh = Fhkl[H[0],H[1],H[2]]
     610#            h,k,l = H-hklHalf
     611#            print '(%3d,%3d,%3d) %5.2f %9.5f'%(h,k,l,phi[j],np.angle(Fh,deg=True))       
    612612        i += 1
    613613       
     
    667667    sumE = np.sum(ma.array(np.absolute(CEhkl),mask=Emask))
    668668    Ncyc = 0
     669    old = np.seterr(all='raise')
    669670    while True:       
    670         CErho = np.real(fft.fftn(fft.fftshift(CEhkl)))*(1.+0j)
    671         CEsig = np.std(CErho)
    672         CFrho = np.where(np.real(CErho) >= flipData['k-factor']*CEsig,CErho,-CErho)
    673         CFhkl = fft.ifftshift(fft.ifftn(CFrho))
    674         phase = CFhkl/np.absolute(CFhkl)
    675         CEhkl = np.absolute(Ehkl)*phase
    676         Ncyc += 1
    677         sumCF = np.sum(ma.array(np.absolute(CFhkl),mask=Emask))
    678         DEhkl = np.absolute(np.absolute(Ehkl)/sumE-np.absolute(CFhkl)/sumCF)
    679         Rcf = min(100.,np.sum(ma.array(DEhkl,mask=Emask)*100.))
    680         if Rcf < 5.:
     671        try:
     672            CErho = np.real(fft.fftn(fft.fftshift(CEhkl)))*(1.+0j)
     673            CEsig = np.std(CErho)
     674            CFrho = np.where(np.real(CErho) >= flipData['k-factor']*CEsig,CErho,-CErho)
     675            CFhkl = fft.ifftshift(fft.ifftn(CFrho))
     676            phase = CFhkl/np.absolute(CFhkl)
     677            CEhkl = np.absolute(Ehkl)*phase
     678            Ncyc += 1
     679            sumCF = np.sum(ma.array(np.absolute(CFhkl),mask=Emask))
     680            DEhkl = np.absolute(np.absolute(Ehkl)/sumE-np.absolute(CFhkl)/sumCF)
     681            Rcf = min(100.,np.sum(ma.array(DEhkl,mask=Emask)*100.))
     682            if Rcf < 5.:
     683                break
     684            GoOn = pgbar.Update(Rcf,newmsg='%s%8.3f%s\n%s %d'%('Residual Rcf =',Rcf,'%','No.cycles = ',Ncyc))[0]
     685            if not GoOn:
     686                break
     687        except FloatingPointError:
     688            Rcf = 100.
    681689            break
    682         GoOn = pgbar.Update(Rcf,newmsg='%s%8.3f%s\n%s %d'%('Residual Rcf =',Rcf,'%','No.cycles = ',Ncyc))[0]
    683         if not GoOn:
    684             break
     690    np.seterr(**old)
    685691    print 'Charge flip time: %.4f'%(time.time()-time0),'no. elements: %d'%(Ehkl.size)
    686692    print 'No.cycles = ',Ncyc,'Residual Rcf =%8.3f%s'%(Rcf,'%')
    687693    CErho = np.real(fft.fftn(fft.fftshift(CEhkl)))
    688694    roll = findOffset(SGData,CErho,CEhkl)
     695    mapData['Rcf'] = Rcf
    689696    mapData['rho'] = np.roll(np.roll(np.roll(CErho,roll[0],axis=0),roll[1],axis=1),roll[2],axis=2)
    690697    mapData['rhoMax'] = max(np.max(mapData['rho']),-np.min(mapData['rho']))
     698    mapData['rollMap'] = [0,0,0]
    691699    return mapData
    692700   
     
    787795                peaks.append(peak)
    788796                mags.append(x1[0])
     797            if len(peaks) > 100:
     798                break
    789799        rho[rMM[0]:rMP[0],rMM[1]:rMP[1],rMM[2]:rMP[2]] = peakFunc(result[0],rX,rY,rZ,rhoPeak,res,SGData['SGLaue'])
    790800        rho = np.roll(np.roll(np.roll(rho,-rMI[2],axis=2),-rMI[1],axis=1),-rMI[0],axis=0)
  • trunk/GSASIIphsGUI.py

    r568 r573  
    231231        self.Draw(self.data)
    232232       
     233class SingleFloatDialog(wx.Dialog):
     234   
     235    def __init__(self,parent,title,prompt,value,limits=[0.,1.]):
     236        wx.Dialog.__init__(self,parent,-1,title,
     237            pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE)
     238        self.panel = wx.Panel(self)         #just a dummy - gets destroyed in Draw!
     239        self.limits = limits
     240        self.value = value
     241        self.prompt = prompt
     242        self.Draw()
     243       
     244    def Draw(self):
     245       
     246        def OnValItem(event):
     247            try:
     248                val = float(valItem.GetValue())
     249                if val < self.limits[0] or val > self.limits[1]:
     250                    raise ValueError
     251            except ValueError:
     252                val = self.value
     253            self.value = val
     254            valItem.SetValue('%.5g'%(self.value))
     255           
     256        self.panel.Destroy()
     257        self.panel = wx.Panel(self)
     258        mainSizer = wx.BoxSizer(wx.VERTICAL)
     259        mainSizer.Add(wx.StaticText(self.panel,-1,self.prompt),0,wx.ALIGN_CENTER)
     260        valItem = wx.TextCtrl(self.panel,-1,value='%.5g'%(self.value),style=wx.TE_PROCESS_ENTER)
     261        mainSizer.Add(valItem,0,wx.ALIGN_CENTER)
     262        valItem.Bind(wx.EVT_TEXT_ENTER,OnValItem)
     263        valItem.Bind(wx.EVT_KILL_FOCUS,OnValItem)
     264        OkBtn = wx.Button(self.panel,-1,"Ok")
     265        OkBtn.Bind(wx.EVT_BUTTON, self.OnOk)
     266        CancelBtn = wx.Button(self.panel,-1,'Cancel')
     267        CancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel)
     268        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
     269        btnSizer.Add((20,20),1)
     270        btnSizer.Add(OkBtn)
     271        btnSizer.Add(CancelBtn)
     272        btnSizer.Add((20,20),1)
     273        mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
     274        self.panel.SetSizer(mainSizer)
     275        self.panel.Fit()
     276        self.Fit()
     277
     278    def GetValue(self):
     279        return self.value
     280       
     281    def OnOk(self,event):
     282        parent = self.GetParent()
     283        parent.Raise()
     284        self.EndModal(wx.ID_OK)             
     285        self.Destroy()
     286       
     287    def OnCancel(self,event):
     288        parent = self.GetParent()
     289        parent.Raise()
     290        self.EndModal(wx.ID_CANCEL)             
     291        self.Destroy()
     292       
    233293def UpdatePhaseData(G2frame,Item,data,oldPage):
    234294
     
    256316        if 'Map' not in generalData:
    257317            generalData['Map'] = {'MapType':'','RefList':'','Resolution':1.0,
    258                 'rho':[],'rhoMax':0.,'mapSize':10.0,'cutOff':50.}
     318                'rho':[],'rhoMax':0.,'mapSize':10.0,'cutOff':50.,'Flip':False}
    259319        if 'Flip' not in generalData:
    260320            generalData['Flip'] = {'RefList':'','Resolution':1.0,'Norm element':'None',
     
    12041264            atomData = data['Atoms']
    12051265            generalData = data['General']
     1266            colLabels = [Atoms.GetColLabelValue(c) for c in range(Atoms.GetNumberCols())]
     1267            choices = ['Type','x','y','z','frac','I/A','Uiso']
     1268            dlg = wx.SingleChoiceDialog(G2frame,'Select','Atom parameter',choices)
     1269            if dlg.ShowModal() == wx.ID_OK:
     1270                sel = dlg.GetSelection()
     1271                parm = choices[sel]
     1272                cid = colLabels.index(parm)
     1273            dlg.Destroy()
     1274            print parm,cid,indx
     1275            if parm in ['Type']:
     1276                dlg = G2elemGUI.PickElement(G2frame)
     1277                if dlg.ShowModal() == wx.ID_OK:
     1278                    if dlg.Elem not in ['None']:
     1279                        El = dlg.Elem.strip()
     1280                        print El,indx,cid
     1281                        for r in indx:                       
     1282                            atomData[r][cid] = El
     1283                            if len(El) in [2,4]:
     1284                                atomData[r][cid-1] = El[:2]+'(%d)'%(r+1)
     1285                            else:
     1286                                atomData[r][cid-1] = El[:1]+'(%d)'%(r+1)
     1287                        SetupGeneral()
     1288                        if 'Atoms' in data['Drawing']:
     1289                            for r in indx:
     1290                                ID = atomData[r][-1]
     1291                                DrawAtomsReplaceByID(data['Drawing'],atomData[r],ID)
     1292                    FillAtomsGrid()
     1293                dlg.Destroy()
     1294            elif parm in ['I/A']:
     1295                choices = ['Isotropic','Anisotropic']
     1296                dlg = wx.SingleChoiceDialog(G2frame,'Select','Thermal parameter model',choices)
     1297                if dlg.ShowModal() == wx.ID_OK:
     1298                    sel = dlg.GetSelection()
     1299                    parm = choices[sel][0]
     1300                    for r in indx:                       
     1301                        atomData[r][cid] = parm
     1302                    FillAtomsGrid()
     1303            elif parm in ['frac','Uiso']:
     1304                limits = [0.,1.]
     1305                val = 1.0
     1306                if  parm in ['Uiso']:
     1307                    limits = [0.,0.25]
     1308                    val = 0.01
     1309                dlg = SingleFloatDialog(G2frame,'New value','Enter new value for '+parm,val,limits)
     1310                if dlg.ShowModal() == wx.ID_OK:
     1311                    parm = dlg.GetValue()
     1312                    for r in indx:                       
     1313                        atomData[r][cid] = parm
     1314                    SetupGeneral()
     1315                    FillAtomsGrid()
     1316            elif parm in ['x','y','z']:
     1317                limits = [-1.,1.]
     1318                val = 0.
     1319                dlg = SingleFloatDialog(G2frame,'Atom shift','Enter shift for '+parm,val,limits)
     1320                if dlg.ShowModal() == wx.ID_OK:
     1321                    parm = dlg.GetValue()
     1322                    for r in indx:                       
     1323                        atomData[r][cid] += parm
     1324                    SetupGeneral()
     1325                    FillAtomsGrid()
    12061326
    12071327    def AtomTransform(event):
     
    12951415        AA1letter = ['A','R','N','D','C','Q','E','G','H','I',
    12961416            'L','K','M','F','P','S','T','W','Y','V','M',' ',' ',' ']
    1297         defaultDrawing = {'viewPoint':[[0.5,0.5,0.5],[]],'showHydrogen':True,'backColor':[0,0,0],'depthFog':False,
    1298             'Zclip':50.0,'cameraPos':50.,'radiusFactor':0.85,'contourLevel':1.,
    1299             'bondRadius':0.1,'ballScale':0.33,'vdwScale':0.67,'ellipseProb':50,'sizeH':0.50,
    1300             'unitCellBox':False,'showABC':True,'selectedAtoms':[],'Atoms':[],
    1301             'Rotation':[0.0,0.0,0.0,[]],'bondList':{},'testPos':[[-.1,-.1,-.1],[0.0,0.0,0.0],[0,0]]}
     1417        defaultDrawing = {'Atoms':[],'viewPoint':[[0.5,0.5,0.5],[]],'showHydrogen':True,
     1418            'backColor':[0,0,0],'depthFog':False,'Zclip':50.0,'cameraPos':50.,
     1419            'radiusFactor':0.85,'contourLevel':1.,'bondRadius':0.1,'ballScale':0.33,
     1420            'vdwScale':0.67,'ellipseProb':50,'sizeH':0.50,'unitCellBox':False,
     1421            'showABC':True,'selectedAtoms':[],'Atoms':[],'Rotation':[0.0,0.0,0.0,[]],
     1422            'bondList':{},'testPos':[[-.1,-.1,-.1],[0.0,0.0,0.0],[0,0]]}
    13021423        try:
    13031424            drawingData = data['Drawing']
     
    13061427            drawingData = data['Drawing']
    13071428        if not drawingData:                 #fill with defaults if empty
    1308             drawingData = copy.copy(defaultDrawing)
    1309             drawingData['Atoms'] = []
     1429            drawingData.update(defaultDrawing)
    13101430        if 'contourLevel' not in drawingData:
    13111431            drawingData['contourLevel'] = 1.
     
    25642684           
    25652685            plotSizer = wx.BoxSizer(wx.VERTICAL)
    2566             choice = ['Mustrain','Size','Preferred orientation']
     2686            choice = ['None','Mustrain','Size','Preferred orientation']
    25672687            plotSel = wx.RadioBox(DData,-1,'Select plot type:',choices=choice,
    2568                 majorDimension=3,style=wx.RA_SPECIFY_COLS)
     2688                majorDimension=2,style=wx.RA_SPECIFY_COLS)
    25692689            plotSel.SetStringSelection(generalData['Data plot type'])
    25702690            plotSel.Bind(wx.EVT_RADIOBOX,OnPlotSel)   
     
    35143634            return
    35153635        mapData.update(G2mth.FourierMap(data,reflData))
     3636        mapData['Flip'] = False
    35163637        mapSig = np.std(mapData['rho'])
    35173638        data['Drawing']['contourLevel'] = 1.
     
    36013722            mapData.update(G2mth.ChargeFlip(data,reflData,pgbar))
    36023723        finally:
    3603             pgbar.Destroy()       
     3724            pgbar.Destroy()
     3725        mapData['Flip'] = True       
    36043726        mapSig = np.std(mapData['rho'])
     3727        if not data['Drawing']:                 #if new drawing - no drawing data!
     3728            SetupDrawingData()
    36053729        data['Drawing']['contourLevel'] = 1.
    36063730        data['Drawing']['mapSize'] = 10.
    36073731        print ' Charge flip map computed: rhomax = %.3f rhomin = %.3f sigma = %.3f'%(np.max(mapData['rho']),np.min(mapData['rho']),mapSig)
    3608         OnSearchMaps(event)             #does a plot structure at end
     3732        if mapData['Rcf'] < 99.:
     3733            OnSearchMaps(event)             #does a plot structure at end
     3734        else:
     3735            print 'Bad charge flip map - no peak search done'
    36093736               
    36103737    def OnTextureRefine(event):
  • trunk/GSASIIplot.py

    r552 r573  
    12721272    plotDict = {'Mustrain':'Mustrain','Size':'Size','Preferred orientation':'Pref.Ori.'}
    12731273    for ptype in plotDict:
    1274         G2frame.G2plotNB.Delete(ptype)       
     1274        G2frame.G2plotNB.Delete(ptype)
     1275    if plotType in ['None']:
     1276        return       
    12751277
    12761278    for item in useList:
     
    22822284    mapPeaks = []
    22832285    if 'Map Peaks' in data:
    2284         mapPeaks = data['Map Peaks']                       
     2286        mapPeaks = data['Map Peaks']
    22852287    drawingData = data['Drawing']
    22862288    drawAtoms = drawingData['Atoms']
    22872289    mapData = {}
     2290    flipData = {}
    22882291    rhoXYZ = []
    22892292    if 'Map' in generalData:
    22902293        mapData = generalData['Map']
     2294    if 'Flip' in generalData:
     2295        flipData = generalData['Flip']                       
     2296        flipData['mapRoll'] = [0,0,0]
    22912297    cx,ct,cs = drawingData['atomPtrs']
    22922298    Wt = np.array([255,255,255])
     
    23702376       
    23712377    def OnMouseMove(event):
    2372         if event.ShiftDown():
    2373             return       
    23742378        newxy = event.GetPosition()
    23752379        page = getSelection()
     
    24722476        key,xyz = chr(keyCode),event.GetPosition()
    24732477        indx = drawingData['selectedAtoms']
    2474         if key in ['c','C']:
     2478        if key in ['C']:
    24752479            drawingData['viewPoint'] = [[.5,.5,.5],[0,0]]
    24762480            drawingData['testPos'] = [[-.1,-.1,-.1],[0.0,0.0,0.0],[0,0]]
    24772481            drawingData['Rotation'] = [0.0,0.0,0.0,[]]
    24782482            SetViewPointText(drawingData['viewPoint'][0])
    2479         elif key in ['n','N']:
     2483        elif key in ['N']:
    24802484            drawAtoms = drawingData['Atoms']
    24812485            pI = drawingData['viewPoint'][1]
     
    24952499            G2frame.G2plotNB.status.SetStatusText('View point at atom '+drawAtoms[pI[0]][ct-1]+str(pI),1)
    24962500               
    2497         elif key in ['p','P']:
     2501        elif key in ['P']:
    24982502            drawAtoms = drawingData['Atoms']
    24992503            pI = drawingData['viewPoint'][1]
     
    25122516            SetViewPointText(drawingData['viewPoint'][0])           
    25132517            G2frame.G2plotNB.status.SetStatusText('View point at atom '+drawAtoms[pI[0]][ct-1]+str(pI),1)
     2518        elif key in ['U','D','L','R'] and mapData['Flip'] == True:
     2519            dirDict = {'U':[0,1],'D':[0,-1],'L':[-1,0],'R':[1,0]}
     2520            SetMapRoll(dirDict[key])
    25142521        Draw()
    25152522           
     
    25272534        glLightfv(GL_LIGHT0,GL_AMBIENT,[1,1,1,.8])
    25282535        glLightfv(GL_LIGHT0,GL_DIFFUSE,[1,1,1,1])
     2536       
     2537    def SetMapRoll(newxy):
     2538        anglex,angley,anglez,oldxy = drawingData['Rotation']
     2539        Rx = G2lat.rotdMat(anglex,0)
     2540        Ry = G2lat.rotdMat(angley,1)
     2541        Rz = G2lat.rotdMat(anglez,2)
     2542        dxy = np.inner(Bmat,np.inner(Rz,np.inner(Ry,np.inner(Rx,newxy+[0,]))))
     2543        dxy *= np.array([-1,-1,1])
     2544        rho = mapData['rho']
     2545        dxy = np.array(dxy*rho.shape)
     2546        roll = np.where(dxy>0.5,1,np.where(dxy<-.5,-1,0))
     2547        mapData['rho'] = np.roll(np.roll(np.roll(rho,roll[0],axis=0),roll[1],axis=1),roll[2],axis=2)
     2548        drawingData['Rotation'][3] = list(newxy)
    25292549       
    25302550    def SetTranslation(newxy):
Note: See TracChangeset for help on using the changeset viewer.