Changeset 1515


Ignore:
Timestamp:
Oct 3, 2014 10:38:49 AM (8 years ago)
Author:
vondreele
Message:

allow '#' comments in GSAS iparm files.
add class G2ColumnIDDialog for loading sample data for all histograms from a text file. This file has optional '#' comments followed by columns of data items each line begins with a file name that matches the file names for the histograms.
This class allows simple arithmetic modification of a column of data.
G2MultiChoiceDialog now allows selection of a block of items
Add 'Time' to Sample parameters - typically clock time
Further work on modulated structures
change default .gsa GSAS powder data extension to .gda - a lot more common.

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASII.py

    r1512 r1515  
    901901            Iparm = {}
    902902            for S in fp:
     903                if '#' in S[0]:
     904                    continue
    903905                Iparm[S[:12]] = S[12:-1]
    904906        except IOError:
  • trunk/GSASIIgrid.py

    r1512 r1515  
    110110
    111111[ wxID_BACKCOPY,wxID_LIMITCOPY, wxID_SAMPLECOPY, wxID_SAMPLECOPYSOME, wxID_BACKFLAGCOPY, wxID_SAMPLEFLAGCOPY,
    112     wxID_SAMPLESAVE, wxID_SAMPLELOAD,wxID_ADDEXCLREGION,wxID_SETSCALE,wxID_SAMPLE1VAL
    113 ] = [wx.NewId() for item in range(11)]
     112    wxID_SAMPLESAVE, wxID_SAMPLELOAD,wxID_ADDEXCLREGION,wxID_SETSCALE,wxID_SAMPLE1VAL,wxID_ALLSAMPLELOAD,
     113] = [wx.NewId() for item in range(12)]
    114114
    115115[ wxID_INSTPRMRESET,wxID_CHANGEWAVETYPE,wxID_INSTCOPY, wxID_INSTFLAGCOPY, wxID_INSTLOAD,
     
    11571157        self.OKbtn.SetDefault()
    11581158        # create scrolled panel and sizer
    1159         panel = wxscroll.ScrolledPanel(
    1160             self, wx.ID_ANY,
    1161             size=size,
     1159        panel = wxscroll.ScrolledPanel(self, wx.ID_ANY,size=size,
    11621160            style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER)
    11631161        cols = 4
     
    17861784            topSizer.Add(self.filterBox,0,wx.ALL|WACV,0)
    17871785        Sizer.Add(topSizer,0,wx.ALL|wx.EXPAND,8)
     1786        self.trigger = False
    17881787        self.clb = wx.CheckListBox(self, wx.ID_ANY, (30,30), wx.DefaultSize, ChoiceList)
     1788        self.clb.Bind(wx.EVT_CHECKLISTBOX,self.OnCheck)
    17891789        if monoFont:
    17901790            font1 = wx.Font(self.clb.GetFont().GetPointSize(),
     
    18201820        self.SetSizer(Sizer)
    18211821        self.CenterOnParent()
     1822       
    18221823    def GetSelections(self):
    18231824        'Returns a list of the indices for the selected choices'
     
    18271828        # return all selections, shown or hidden
    18281829        return [i for i in range(len(self.Selections)) if self.Selections[i]]
     1830       
    18291831    def SetSelections(self,selList):
    18301832        '''Sets the selection indices in selList as selected. Resets any previous
     
    18451847            [i for i in range(len(self.filterlist)) if self.Selections[self.filterlist[i]]]
    18461848            ) # Note anything previously checked will be cleared.
     1849           
    18471850    def _SetAll(self,event):
    18481851        'Set all viewed choices on'
    18491852        self.clb.SetChecked(range(len(self.filterlist)))
     1853       
    18501854    def _ToggleAll(self,event):
    18511855        'flip the state of all viewed choices'
    18521856        for i in range(len(self.filterlist)):
    18531857            self.clb.Check(i,not self.clb.IsChecked(i))
     1858           
    18541859    def onChar(self,event):
     1860        'for keyboard events. self.trigger is used in self.OnCheck below'
    18551861        self.OKbtn.Enable(False)
     1862        if event.GetKeyCode() == wx.WXK_SHIFT:
     1863            self.trigger = True
    18561864        if self.timer.IsRunning():
    18571865            self.timer.Stop()
    18581866        self.timer.Start(1000,oneShot=True)
    18591867        event.Skip()
     1868       
     1869    def OnCheck(self,event):
     1870        '''for CheckListBox events; if Shift key down this sets all unset
     1871            entries below the selected one'''
     1872        if self.trigger:
     1873            id = event.GetSelection()
     1874            name = self.clb.GetString(id)           
     1875            iB = id-1
     1876            if iB < 0:
     1877                return
     1878            while not self.clb.IsChecked(iB):
     1879                self.clb.Check(iB)
     1880                iB -= 1
     1881                if iB < 0:
     1882                    break
     1883        self.trigger = not self.trigger
     1884       
    18601885    def Filter(self,event):
    18611886        if self.timer.IsRunning():
     
    18641889        txt = self.filterBox.GetValue()
    18651890        self.clb.Clear()
     1891       
    18661892        self.Update()
    18671893        self.filterlist = []
     
    19972023################################################################################
    19982024
     2025class G2ColumnIDDialog(wx.Dialog):
     2026    '''A dialog for matching column data to desired items; some columns may be ignored.
     2027   
     2028    :param wx.Frame ParentFrame: reference to parent frame
     2029    :param str title: heading above list of choices
     2030    :param str header: Title to place on window frame
     2031    :param list ChoiceList: a list of possible choices for the columns
     2032    :param list ColumnData: lists of column data to be matched with ChoiceList
     2033    :param bool monoFont: If False (default), use a variable-spaced font;
     2034      if True use a equally-spaced font.
     2035    :param kw: optional keyword parameters for the wx.Dialog may
     2036      be included such as size [which defaults to `(320,310)`] and
     2037      style (which defaults to ``wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER | wx.CENTRE | wx.OK | wx.CANCEL``);
     2038      note that ``wx.OK`` and ``wx.CANCEL`` controls
     2039      the presence of the eponymous buttons in the dialog.
     2040    :returns: the name of the created dialog
     2041   
     2042    '''
     2043
     2044    def __init__(self,parent, title, header,Comments,ChoiceList, ColumnData,
     2045                 monoFont=False, **kw):
     2046
     2047        def OnOk(sevent):
     2048            OK = True
     2049            selCols = []
     2050            for col in self.sel:
     2051                item = col.GetValue()
     2052                if item != ' ' and item in selCols:
     2053                    OK = False
     2054                    break
     2055                else:
     2056                    selCols.append(item)
     2057            parent = self.GetParent()
     2058            if not OK:
     2059                parent.ErrorDialog('Duplicate',item+' selected more than once')
     2060                return
     2061            parent.Raise()
     2062            self.EndModal(wx.ID_OK)
     2063           
     2064        def OnModify(event):
     2065            Obj = event.GetEventObject()
     2066            icol,colData = Indx[Obj.GetId()]
     2067            modify = Obj.GetValue()
     2068            if not modify:
     2069                return
     2070            print 'Modify column',icol,' by', modify
     2071            for i,item in enumerate(self.ColumnData[icol]):
     2072                self.ColumnData[icol][i] = str(eval(item+modify))
     2073            colData.SetValue('\n'.join(self.ColumnData[icol]))
     2074            Obj.SetValue('')
     2075           
     2076        # process keyword parameters, notably style
     2077        options = {'size':(600,310), # default Frame keywords
     2078                   'style':wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER|wx.CENTRE| wx.OK | wx.CANCEL,
     2079                   }
     2080        options.update(kw)
     2081        self.Comments = ''.join(Comments)
     2082        self.ChoiceList = ChoiceList
     2083        self.ColumnData = ColumnData
     2084        nCol = len(ColumnData)
     2085        if options['style'] & wx.OK:
     2086            useOK = True
     2087            options['style'] ^= wx.OK
     2088        else:
     2089            useOK = False
     2090        if options['style'] & wx.CANCEL:
     2091            useCANCEL = True
     2092            options['style'] ^= wx.CANCEL
     2093        else:
     2094            useCANCEL = False       
     2095        # create the dialog frame
     2096        wx.Dialog.__init__(self,parent,wx.ID_ANY,header,**options)
     2097        panel = wxscroll.ScrolledPanel(self)
     2098        # fill the dialog
     2099        Sizer = wx.BoxSizer(wx.VERTICAL)
     2100        Sizer.Add((-1,5))
     2101        Sizer.Add(wx.StaticText(panel,label=title),0,WACV)
     2102        if self.Comments:
     2103            Sizer.Add(wx.StaticText(panel,label=' Header lines:'),0,WACV)
     2104            Sizer.Add(wx.TextCtrl(panel,value=self.Comments,size=(200,-1),
     2105                style=wx.TE_MULTILINE|wx.TE_READONLY|wx.TE_DONTWRAP),0,wx.ALL|wx.EXPAND|WACV,8)
     2106        columnsSizer = wx.FlexGridSizer(0,nCol,5,10)
     2107        self.sel = []
     2108        self.mod = []
     2109        Indx = {}
     2110        for icol,col in enumerate(self.ColumnData):
     2111            colSizer = wx.BoxSizer(wx.VERTICAL)
     2112            colSizer.Add(wx.StaticText(panel,label=' Column #%d Select:'%(icol)),0,WACV)
     2113            self.sel.append(wx.ComboBox(panel,value=' ',choices=self.ChoiceList,style=wx.CB_READONLY|wx.CB_DROPDOWN))
     2114            colSizer.Add(self.sel[-1])
     2115            colData = wx.TextCtrl(panel,value='\n'.join(self.ColumnData[icol]),size=(120,-1),
     2116                style=wx.TE_MULTILINE|wx.TE_READONLY|wx.TE_DONTWRAP)
     2117            colSizer.Add(colData,0,WACV)
     2118            colSizer.Add(wx.StaticText(panel,label=' Modify by:'),0,WACV)
     2119            mod = wx.TextCtrl(panel,size=(120,-1),value='',style=wx.TE_PROCESS_ENTER)
     2120            mod.Bind(wx.EVT_TEXT_ENTER,OnModify)
     2121            mod.Bind(wx.EVT_KILL_FOCUS,OnModify)
     2122            Indx[mod.GetId()] = [icol,colData]
     2123            colSizer.Add(mod,0,WACV)
     2124            columnsSizer.Add(colSizer)
     2125        Sizer.Add(columnsSizer)
     2126        Sizer.Add(wx.StaticText(panel,label=' For modify by, enter arithimetic string eg. "-12345.67". "+","-","*","/","**" all allowed'),0,WACV)
     2127        Sizer.Add((-1,10))
     2128        # OK/Cancel buttons
     2129        btnsizer = wx.StdDialogButtonSizer()
     2130        if useOK:
     2131            self.OKbtn = wx.Button(panel, wx.ID_OK)
     2132            self.OKbtn.SetDefault()
     2133            btnsizer.AddButton(self.OKbtn)
     2134            self.OKbtn.Bind(wx.EVT_BUTTON, OnOk)
     2135        if useCANCEL:
     2136            btn = wx.Button(panel, wx.ID_CANCEL)
     2137            btnsizer.AddButton(btn)
     2138        btnsizer.Realize()
     2139        Sizer.Add((-1,5))
     2140        Sizer.Add(btnsizer,0,wx.ALIGN_LEFT,20)
     2141        Sizer.Add((-1,5))
     2142        # OK done, let's get outa here
     2143        panel.SetSizer(Sizer)
     2144        panel.SetAutoLayout(1)
     2145        panel.SetupScrolling()
     2146        Size = [450,375]
     2147        panel.SetSize(Size)
     2148        Size[0] += 25; Size[1]+= 25
     2149        self.SetSize(Size)
     2150       
     2151    def GetSelection(self):
     2152        'Returns the selected sample parm for each column'
     2153        selCols = []
     2154        for item in self.sel:
     2155            selCols.append(item.GetValue())
     2156        return selCols,self.ColumnData
     2157
     2158################################################################################
     2159
    19992160def ItemSelector(ChoiceList, ParentFrame=None,
    20002161                 title='Select an item',
     
    31113272        self.SampleEdit.Append(id=wxID_SAMPLE1VAL, kind=wx.ITEM_NORMAL,text='Set one value',
    31123273            help='Set one sample parameter value across multiple histograms')
     3274        self.SampleEdit.Append(id=wxID_ALLSAMPLELOAD, kind=wx.ITEM_NORMAL,text='Load all samples',
     3275            help='Load sample parmameters over multiple histograms')
    31133276
    31143277        self.PostfillDataMenu()
     
    41974360            sampleParmDict = {'Sample load':[],}
    41984361        else:
    4199             sampleParmDict = {'Temperature':[],'Pressure':[],
     4362            sampleParmDict = {'Temperature':[],'Pressure':[],'Time':[],
    42004363                              'FreePrm1':[],'FreePrm2':[],'FreePrm3':[],}
    42014364        Controls = G2frame.PatternTree.GetItemPyData(
     
    49725135        Types += [wg.GRID_VALUE_FLOAT,]
    49735136    # add unique cell parameters
    4974     if Controls['ShowCell']:
     5137    if Controls.get('ShowCell',False):
    49755138        for pId in sorted(RecpCellTerms):
    49765139            pfx = str(pId)+'::' # prefix for A values from phase
     
    50525215            G2mv.InitVars()
    50535216            parmDict = data[name].get('parmDict')
     5217            badVary = data[name].get('badVary',[])
    50545218            if parmDict and Controls['ShowCell']:
    50555219                constraintInfo = data[name].get('constraintInfo',[[],[],{},[],seqnum])
     
    51005264    )
    51015265    name = histNames[0]
     5266   
    51025267    indepVarDict = {     #  values in table w/o ESDs
    51035268        var:colList[i][0] for i,var in enumerate(colLabels) if colSigs[i] is None
  • trunk/GSASIIphsGUI.py

    r1506 r1515  
    512512           
    513513            def OnSuperGp(event):   #need a check on supersymmetry group rules here!
    514                 generalData['SuperSg'] = event.GetValue()
     514                SSymbol = superGp.GetValue()
     515                SSGData = G2spc.SSpcGroup(generalData['SGData'],SSymbol)
     516                generalData['SuperSg'] = SSymbol
    515517           
    516518            def OnDim(event):
     
    528530                if not np.any(np.array(Vec)):
    529531                    Vec = generalData['SuperVec'][ind][0]
    530                 generalData['modVects'][ind][0] = hkl
     532                generalData['modVects'][ind][0] = Vec
    531533                h,k,l = Vec
    532534                Obj.SetValue('%.3f %.3f %.3f'%(h,k,l))
     
    563565                vecSizer.Add(wx.StaticText(General,label=' Modulation vector #%d: '%(i+1)),0,WACV)
    564566                vec = generalData['SuperVec'][i][0]
    565                 Vec = wx.TextCtrl(General,
     567                Vec = wx.TextCtrl(General,size=wx.Size(120,24),
    566568                    value=' %.3f %.3f %.3f '%(vec[0],vec[1],vec[2]),
    567569                    style=wx.TE_PROCESS_ENTER)
  • trunk/GSASIIpwd.py

    r1496 r1515  
    12481248    InstPrint(Inst,sigDict)
    12491249           
    1250 def DoPeakFit(FitPgm,Peaks,Background,Limits,Inst,Inst2,data,oneCycle=False,controls=None,dlg=None):
     1250def DoPeakFit(FitPgm,Peaks,Background,Limits,Inst,Inst2,data,prevVaryList=[],oneCycle=False,controls=None,dlg=None):
    12511251    'needs a doc string'
    12521252       
     
    15011501    parmDict['Pdabc'] = []      #dummy Pdabc
    15021502    parmDict.update(Inst2)      #put in real one if there
    1503     varyList = bakVary+insVary+peakVary
     1503    if prevVaryList:
     1504        varyList = prevVaryList[:]
     1505    else:
     1506        varyList = bakVary+insVary+peakVary
     1507    fullvaryList = varyList[:]
    15041508    while True:
    15051509        begin = time.time()
    15061510        values =  np.array(Dict2Values(parmDict, varyList))
    15071511        Rvals = {}
     1512        badVary = []
    15081513        if FitPgm == 'LSQ':
    15091514            try:
     
    15321537                    if not np.sum(result[2]['fjac'],axis=1)[i]:
    15331538                        print 'Removing parameter: ',varyList[ipvt-1]
     1539                        badVary.append(varyList[ipvt-1])
    15341540                        del(varyList[ipvt-1])
    15351541                        break
     
    15481554    GetPeaksParms(Inst,parmDict,Peaks,varyList)   
    15491555    PeaksPrint(dataType,parmDict,sigDict,varyList)
    1550     return sigDict,result,sig,Rvals,varyList,parmDict
     1556    return sigDict,result,sig,Rvals,varyList,parmDict,fullvaryList,badVary
    15511557
    15521558def calcIncident(Iparm,xdata):
  • trunk/GSASIIpwdGUI.py

    r1512 r1515  
    7777        'Scale':[1.0,True],'Type':'Debye-Scherrer','Absorption':[0.0,False],
    7878        'DisplaceX':[0.0,False],'DisplaceY':[0.0,False],'Diffuse':[],
    79         'Temperature':300.,'Pressure':0.1,
     79        'Temperature':300.,'Pressure':0.1,'Time':0.0,
    8080        'FreePrm1':0.,'FreePrm2':0.,'FreePrm3':0.,
    8181        'Gonio. radius':200.0,
     
    116116    parms.append(['Chi','Goniometer chi:',[10,3]])
    117117    parms.append(['Phi','Goniometer phi:',[10,3]])
     118    parms.append(['Time','Clock time (s)',[12,3]])
    118119    parms.append(['Temperature','Sample temperature (K): ',[10,3]])
    119120    parms.append(['Pressure','Sample pressure (MPa): ',[10,3]])
     
    409410        Reverse = False
    410411        CopyForward = False
    411         choice = ['Copy from prev.',]       #'Reverse sequence',
     412        choice = ['Reverse sequence','Copy from prev.',]
    412413        dlg = wx.MultiChoiceDialog(G2frame.dataFrame,'Sequential controls','Select controls',choice)
    413414        if dlg.ShowModal() == wx.ID_OK:
     
    426427        oneCycle = False
    427428        FitPgm = 'LSQ'
     429        prevVaryList = []
     430        if Reverse:
     431            names.reverse()
    428432        try:
    429433            for i,name in enumerate(names):
     
    434438                PatternId =  G2gd.GetPatternTreeItemId(G2frame,G2frame.root,name)
    435439                if i and CopyForward:
    436                     G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Peak List'),peaks)
     440                    G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Peak List'),copy.copy(peaks))
     441                    prevVaryList = varyList[:]
    437442                peaks = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Peak List'))
    438443                background = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Background'))
     
    447452                dlg2.SetPosition(wx.Point(screenSize[2]-Size[0]-305,screenSize[1]+5))
    448453                try:
    449                     peaks['sigDict'],result,sig,Rvals,varyList,parmDict = G2pwd.DoPeakFit(FitPgm,peaks['peaks'],
    450                         background,limits,inst,inst2,data,oneCycle,controls,dlg2)
     454                    peaks['sigDict'],result,sig,Rvals,varyList,parmDict,fullvaryList,badVary = G2pwd.DoPeakFit(FitPgm,peaks['peaks'],
     455                        background,limits,inst,inst2,data,prevVaryList,oneCycle,controls,dlg2)
    451456                finally:
    452457                    dlg2.Destroy()   
    453                 G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Peak List'),peaks)
     458                G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Peak List'),copy.copy(peaks))
    454459                SeqResult[name] = {'variables':result[0],'varyList':varyList,'sig':sig,'Rvals':Rvals,
    455                     'covMatrix':np.eye(len(result[0])),'title':name,'parmDict':parmDict}
     460                    'covMatrix':np.eye(len(result[0])),'title':name,'parmDict':parmDict,
     461                    'fullVary':fullvaryList,'badVary':badVary}
    456462            else:
    457463                dlg.Destroy()
     
    500506        dlg.SetPosition(wx.Point(screenSize[2]-Size[0]-305,screenSize[1]+5))
    501507        try:
    502             peaks['sigDict'] = G2pwd.DoPeakFit(FitPgm,peaks['peaks'],background,limits,inst,inst2,data,oneCycle,controls,dlg)[0]
     508            peaks['sigDict'] = G2pwd.DoPeakFit(FitPgm,peaks['peaks'],background,limits,inst,inst2,data,[],oneCycle,controls,dlg)[0]
    503509        finally:
    504510            wx.EndBusyCursor()   
    505         G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Peak List'),peaks)
    506         UpdatePeakGrid(G2frame,peaks)
     511        G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Peak List'),copy.copy(peaks))
     512        UpdatePeakGrid(G2frame,copy.copy(peaks))
    507513        G2plt.PlotPatterns(G2frame,plotType='PWDR')
    508514        print 'finished'
     
    15821588        finally:
    15831589            dlg.Destroy()
     1590           
     1591    def OnAllSampleLoad(event):
     1592        filename = ''
     1593        dlg = wx.FileDialog(G2frame, 'Choose multihistogram metadata text file', '.', '',
     1594            'metadata file (*.*)|*.*',wx.OPEN|wx.CHANGE_DIR)
     1595        try:
     1596            if dlg.ShowModal() == wx.ID_OK:
     1597                filename = dlg.GetPath()
     1598                File = open(filename,'r')
     1599                S = File.readline()
     1600                newItems = []
     1601                itemNames = []
     1602                Comments = []
     1603                while S:
     1604                    if S[0] == '#':
     1605                        Comments.append(S)
     1606                        S = File.readline()
     1607                        continue
     1608                    S.replace(',',' ')
     1609                    S.replace('\t',' ')
     1610                    Stuff = S[:-1].split(' ')
     1611                    itemNames.append(Stuff[0])
     1612                    newItems.append(Stuff[1:])
     1613                    S = File.readline()               
     1614                File.close()
     1615        finally:
     1616            dlg.Destroy()
     1617        if not filename:
     1618            G2frame.ErrorDialog('Nothing to do','No file selected')
     1619            return
     1620        dataDict = dict(zip(itemNames,newItems))
     1621        ifany = False
     1622        Controls = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Controls'))
     1623        Names = [' ','Phi','Chi','Omega','Time','Temperature','Pressure']
     1624        freeNames = {}
     1625        for name in ['FreePrm1','FreePrm2','FreePrm3']:
     1626            freeNames[Controls[name]] = name
     1627            Names.append(Controls[name])
     1628        dlg = G2gd.G2ColumnIDDialog( G2frame,' Choose multihistogram metadata columns:',
     1629            'Select columns',Comments,Names,np.array(newItems).T)
     1630        try:
     1631            if dlg.ShowModal() == wx.ID_OK:
     1632                colNames,newData = dlg.GetSelection()
     1633                dataDict = dict(zip(itemNames,newData.T))
     1634                for item in colNames:
     1635                    if item != ' ':
     1636                        ifany = True
     1637        finally:
     1638            dlg.Destroy()
     1639        if not ifany:
     1640            G2frame.ErrorDialog('Nothing to do','No columns identified')
     1641            return
     1642        histList = [G2frame.PatternTree.GetItemText(G2frame.PatternId),]
     1643        histList += GetHistsLikeSelected(G2frame)
     1644        colIds = {}
     1645        for i,name in enumerate(colNames):
     1646            if name != ' ':
     1647                colIds[name] = i
     1648        for hist in histList:
     1649            name = hist.split()[1]  #this is file name
     1650            newItems = {}
     1651            for item in colIds:
     1652                key = freeNames.get(item,item)
     1653                newItems[key] = float(dataDict[name][colIds[item]])
     1654            Id = G2gd.GetPatternTreeItemId(G2frame,G2frame.root,hist)
     1655            sampleData = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Sample Parameters'))
     1656            sampleData.update(newItems)       
     1657        UpdateSampleGrid(G2frame,data)       
    15841658   
    15851659    def OnSetScale(event):
     
    17811855    G2frame.Bind(wx.EVT_MENU, OnSampleLoad, id=G2gd.wxID_SAMPLELOAD)
    17821856    G2frame.Bind(wx.EVT_MENU, OnCopy1Val, id=G2gd.wxID_SAMPLE1VAL)
     1857    G2frame.Bind(wx.EVT_MENU, OnAllSampleLoad, id=G2gd.wxID_ALLSAMPLELOAD)
    17831858    if 'SASD' in histName:
    17841859        G2frame.dataFrame.SetScale.Enable(True)
     
    17971872    if type(data['Temperature']) is int:
    17981873        data['Temperature'] = float(data['Temperature'])
     1874    if 'Time' not in data:
     1875        data['Time'] = 0.0
    17991876    if 'FreePrm1' not in Controls:
    18001877        Controls['FreePrm1'] = 'Sample humidity (%)'
     
    18801957        parmSizer.Add(parmVal,1,wx.EXPAND)
    18811958    Info = {}
    1882 
    18831959       
    18841960    for key in ('FreePrm1','FreePrm2','FreePrm3'):
  • trunk/GSASIIspc.py

    r1489 r1515  
    2929npsind = lambda x: np.sin(x*np.pi/180.)
    3030npcosd = lambda x: np.cos(x*np.pi/180.)
     31   
     32################################################################################
     33#### Space group codes
     34################################################################################
    3135
    3236def SpcGroup(SGSymbol):
     
    293297    for l in SGPrint(A):
    294298        print l
    295 
     299       
     300################################################################################
     301#### Superspace group codes
     302################################################################################
     303       
     304def SSpcGroup(SGData,SSymbol):
     305    """
     306    Determines supersymmetry information from superspace group name; currently only for (3+1) superlattices
     307
     308    :param SGData: space group data structure as defined in SpcGroup above.
     309    :param SSymbol: superspace group symbol extension (string) defining modulation direction & generator info.
     310    :returns: (SSGError,SSGData)
     311       * SGError = 0 for no errors; >0 for errors (see SGErrors below for details)
     312       * SSGData - is a dict (see :ref:`Superspace Group object<SSGData_table>`) with entries:
     313       
     314             * 'SpGrp': superspace group symbol extension to space group symbol, accidental spaces removed
     315             * 'LauePtGp':  one of '-1', '2/m', 'mmm', '4/mmm', '-3m', '-31m', '6/mmm'
     316             * 'LaueMod': one of '(abg)', '(ab0)', '(ab1/2)', '(a0g)', (a1/2g)','(0bg)', '(1/2bg)',
     317               '(a00)', '(a01/2)', '(a1/20)', (a1/21/2)', '(a01)', '(a10)',
     318               '(0b0)', '(0b1/2)', '(1/2b0)', (1/2b1/2)', '(0b1)', '(1b0)',
     319               '(00g)', '(01/2g)', '(1/20g)', (1/21/2g)', '(01g)', '(10g)','(1/3/1/3g)'
     320             * 'SGLatt': one of 'P', 'A', 'B', 'C', 'I', 'F', 'R'
     321             * 'SGCen': 4D cell centering vectors [0,0,0,0] at least
     322             * 'SGOps': 4D symmetry operations as [M,T] so that M*x+T = x'
     323
     324    """
     325   
     326    def splitSSsym(SSymbol):
     327        ' Splits supersymmetry symbol into two lists of strings'
     328        modsym,gensym = SSymbol.replace(' ','').split(')')
     329        nfrac = modsym.count('/')
     330        modsym = modsym.lstrip('(')
     331        if nfrac == 0:
     332            modsym = list(modsym)
     333        elif nfrac == 1:
     334            pos = modsym.find('/')
     335            if pos == 1:
     336                modsym = [modsym[:3],modsym[3],modsym[4]]
     337            elif pos == 2:
     338                modsym = [modsym[0],modsym[1:4],modsym[4]]
     339            else:
     340                modsym = [modsym[0],modsym[1],modsym[2:]]
     341        else:
     342            lpos = modsym.find('/')
     343            rpos = modsym.rfind('/')
     344            if lpos == 1 and rpos == 4:
     345                modsym = [modsym[:3],modsym[3:6],modsym[6]]
     346            elif lpos == 1 and rpos == 5:
     347                modsym = [modsym[:3],modsym[3],modsym[4:]]
     348            else:
     349                modsym = [modsym[0],modsym[1:4],modsym[4:]]
     350        gensym = list(gensym)
     351        return modsym,gensym
     352       
     353    modsym,gensym = splitSSsym(SSymbol)
     354    print modsym,gensym
     355    T = np.zeros(4)
     356    for iop,op in enumerate(SGData['SGOps']):
     357        ssop = np.eye(4)
     358        ssop[:3,:3] = op[0]
     359        T[:3] = op[1]
     360                   
     361        print SSMT2text(ssop,T)
     362    return None
     363
     364def SSGPrint(SGData,SSGData):
     365    '''
     366    Print the output of SSpcGroup in a nicely formatted way. Used in SSpaceGroup
     367
     368    :param SGData: space group data structure as defined in SpcGroup above.
     369    :param SSGData: from :func:`SSpcGroup`
     370    :returns:
     371        SSGText - list of strings with the superspace group details
     372    '''
     373    Mult = len(SGData['SGCen'])*len(SGData['SGOps'])*(int(SGData['SGInv'])+1)
     374    SSGText = []
     375    SSGText.append(' Superspace Group: '+SSGData['SSpGrp'])
     376    CentStr = 'centrosymmetric'
     377    if not SGData['SGInv']:
     378        CentStr = 'non'+CentStr
     379    if SGData['SGLatt'] in 'ABCIFR':
     380        SSGText.append(' The lattice is '+CentStr+' '+SSGData['SSGLatt']+'-centered '+SSGData['SSGSys'].lower())
     381    else:
     382        SGText.append(' The superlattice is '+CentStr+' '+'primitive '+SSGData['SSGSys'].lower())       
     383    SSGText.append(' Multiplicity of a general site is '+str(Mult))
     384    SSGText.append(' The Laue symmetry is '+SGData['SGLaue'])
     385    if SGData['SGUniq'] in ['a','b','c']:
     386        SSGText.append(' The unique monoclinic axis is '+SGData['SGUniq'])
     387    if SGData['SGInv']:
     388        SSGText.append(' The inversion center is located at 0,0,0')
     389    if SGData['SGPolax']:
     390        SSGText.append(' The location of the origin is arbitrary in '+SGData['SGPolax'])
     391    SSGText.append('\n'+' The equivalent positions are:')
     392    if len(SSGData['SSGCen']) > 1:
     393        SSGText.append('\n ('+SSLatt2text(SSGData['SSGCen'])+')+\n')
     394    Ncol = 2
     395    line = ' '
     396    col = 0
     397    for iop,[M,T] in enumerate(SSGData['SSGOps']):
     398        OPtxt = SSMT2text(M,T)
     399        Fld = '(%2i) '%(iop+1)+OPtxt+'\t'
     400        line += Fld
     401        if '/' not in Fld:
     402            line += '\t'
     403        col += 1
     404        if col == Ncol:
     405            SSGText.append(line)       
     406            line = ' '
     407            col = 0
     408    SSGText.append(line)       
     409    return SSGText
     410
     411def SSMT2text(M,T):
     412    "From superspace group matrix/translation operator returns text version"
     413    XYZS = ('X','Y','Z','S')
     414    TRA = ('   ','ERR','1/6','1/4','1/3','ERR','1/2','ERR','2/3','3/4','5/6','ERR')
     415    Fld = ''
     416    for j in range(4):
     417        IJ = ''
     418        for k in range(4):
     419            txt = str(int(round(M[j][k])))
     420            txt = txt.replace('1',XYZS[k]).replace('0','')
     421            if IJ and M[j][k] > 0:
     422                IJ += '+'+txt
     423            else:
     424                IJ += txt
     425        IK = int(round(T[j]*12))%12
     426        if IK:
     427            if IJ[0] == '-':
     428                Fld += TRA[IK]+IJ
     429            else:
     430                Fld += TRA[IK]+'+'+IJ
     431        else:
     432            Fld += IJ
     433        if j != 3: Fld += ', '
     434    return Fld
     435   
     436def SSLatt2text(SSGCen):
     437    "Lattice centering vectors to text"
     438    lattTxt = ''
     439    for vec in SGCen:
     440        for item in vec:
     441            if int(item*12.):
     442                lattTxt += '1/%d,'%(12/int(item*12))
     443            else:
     444                lattTxt += '0,'
     445        lattTxt[-1] = ';'
     446    return lattTxt[:-1]
     447       
     448def SSpaceGroup(SGSymbol,SSymbol):
     449    '''
     450    Print the output of SSpcGroup in a nicely formatted way.
     451
     452    :param SGSymbol: space group symbol with spaces between axial fields.
     453    :param SSymbol: superspace group symbol extension (string).
     454    :returns: nothing
     455    '''
     456
     457    E,A = SpcGroup(SGSymbol)
     458    if E > 0:
     459        print SGErrors(E)
     460        return
     461    E,B = SSpcGroup(A,SSymbol)   
     462    if E > 0:
     463        print SGErrors(E)
     464        return
     465    for l in SGPrint(B):
     466        print l
     467       
    296468def MoveToUnitCell(xyz):
    297469    '''
     
    8671039                print M2
    8681040                X = [-1,-1,-1]
    869                
    870            
    871            
    8721041        else:               #rotations
    8731042            print 'rotation',Es
  • trunk/imports/G2pwd_fxye.py

    r1506 r1515  
    2525    def __init__(self):
    2626        super(self.__class__,self).__init__( # fancy way to self-reference
    27             extensionlist=('.fxye','.raw','.gsas','.gsa','.RAW','.GSAS','.GSA'),
     27            extensionlist=('.fxye','.raw','.gsas','.gda','.RAW','.GSAS','.GDA'),
    2828            strictExtension=False,
    2929            formatName = 'GSAS powder data',
Note: See TracChangeset for help on using the changeset viewer.