Changeset 1138 for trunk/GSASII.py


Ignore:
Timestamp:
Nov 7, 2013 12:12:55 PM (9 years ago)
Author:
toby
Message:

major constraints revision

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASII.py

    r1128 r1138  
    556556            Id = self.PatternTree.AppendItem(parent=self.root,
    557557                                             text='HKLF '+HistName)
    558             self.PatternTree.SetItemPyData(Id,[{'wtFactor':1.0,'Dummy':False},rd.RefDict])
     558            valuesdict = {
     559                'wtFactor':1.0,
     560                'Dummy':False,
     561                'ranId':ran.randint(0,sys.maxint),
     562                }
     563            self.PatternTree.SetItemPyData(Id,[valuesdict,rd.RefDict])
    559564            Sub = self.PatternTree.AppendItem(Id,text='Instrument Parameters')
    560565            self.PatternTree.SetItemPyData(Sub,rd.Parameters)
     
    980985            Tmin = min(rd.powderdata[0])
    981986            Tmax = max(rd.powderdata[0])
    982             self.PatternTree.SetItemPyData(Id,[{'wtFactor':1.0,'Dummy':False},rd.powderdata])
     987            valuesdict = {
     988                'wtFactor':1.0,
     989                'Dummy':False,
     990                'ranId':ran.randint(0,sys.maxint),
     991                }
     992            rd.Sample['ranId'] = valuesdict['ranId'] # this should be removed someday
     993            self.PatternTree.SetItemPyData(Id,[valuesdict,rd.powderdata])
    983994            self.PatternTree.SetItemPyData(
    984995                self.PatternTree.AppendItem(Id,text='Comments'),
     
    10931104        Id = self.PatternTree.AppendItem(parent=self.root,
    10941105                                         text='PWDR '+inp[0])
    1095         self.PatternTree.SetItemPyData(Id,[{'wtFactor':1.0,'Dummy':True},rd.powderdata])
     1106        valuesdict = {
     1107            'wtFactor':1.0,
     1108            'Dummy':True,
     1109            'ranId':ran.randint(0,sys.maxint),
     1110            }
     1111        self.PatternTree.SetItemPyData(Id,[valuesdict,rd.powderdata])
    10961112        self.PatternTree.SetItemPyData(
    10971113            self.PatternTree.AppendItem(Id,text='Comments'),
     
    17371753        def GetData(self):
    17381754            return self.data
    1739            
    1740     class ConstraintDialog(wx.Dialog):
    1741         '''Window to edit Constraint values
    1742         '''
    1743         def __init__(self,parent,title,text,data,separator='*'):
    1744             wx.Dialog.__init__(self,parent,-1,title,
    1745                 pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE)
    1746             self.data = data
    1747             panel = wx.Panel(self)
    1748             mainSizer = wx.BoxSizer(wx.VERTICAL)
    1749             topLabl = wx.StaticText(panel,-1,text)
    1750             mainSizer.Add((10,10),1)
    1751             mainSizer.Add(topLabl,0,wx.ALIGN_CENTER_VERTICAL|wx.LEFT,10)
    1752             mainSizer.Add((10,10),1)
    1753             dataGridSizer = wx.FlexGridSizer(rows=len(data),cols=2,hgap=2,vgap=2)
    1754             for id,item in enumerate(self.data[:-1]):
    1755                 lbl = item[1]
    1756                 if lbl[-1] != '=': lbl += ' ' + separator + ' '
    1757                 name = wx.StaticText(panel,-1,lbl,size=wx.Size(200,20),
    1758                                      style=wx.ALIGN_RIGHT)
    1759                 scale = wx.TextCtrl(panel,id,'%.3f'%(item[0]),style=wx.TE_PROCESS_ENTER)
    1760                 scale.Bind(wx.EVT_TEXT_ENTER,self.OnScaleChange)
    1761                 scale.Bind(wx.EVT_KILL_FOCUS,self.OnScaleChange)
    1762                 dataGridSizer.Add(name,0,wx.LEFT,10)
    1763                 dataGridSizer.Add(scale,0,wx.RIGHT,10)
    1764             mainSizer.Add(dataGridSizer,0,wx.EXPAND)
    1765             OkBtn = wx.Button(panel,-1,"Ok")
    1766             OkBtn.Bind(wx.EVT_BUTTON, self.OnOk)
    1767             cancelBtn = wx.Button(panel,-1,"Cancel")
    1768             cancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel)
    1769             btnSizer = wx.BoxSizer(wx.HORIZONTAL)
    1770             btnSizer.Add((20,20),1)
    1771             btnSizer.Add(OkBtn)
    1772             btnSizer.Add((20,20),1)
    1773             btnSizer.Add(cancelBtn)
    1774             btnSizer.Add((20,20),1)
    1775            
    1776             mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
    1777             panel.SetSizer(mainSizer)
    1778             panel.Fit()
    1779             self.Fit()
    1780             self.CenterOnParent()
    1781            
    1782         def OnNameChange(self,event):
    1783             self.data[-1] = self.name.GetValue()
    1784            
    1785         def OnScaleChange(self,event):
    1786             id = event.GetId()
    1787             value = self.FindWindowById(id).GetValue()
    1788             try:
    1789                 self.data[id][0] = float(value)
    1790                 self.FindWindowById(id).SetValue('%.3f'%(self.data[id][0]))
    1791             except ValueError:
    1792                 if value and '-' not in value[0]:
    1793                     print 'bad input - numbers only'
    1794                     self.FindWindowById(id).SetValue('0.000')
    1795            
    1796         def OnOk(self,event):
    1797             parent = self.GetParent()
    1798             parent.Raise()
    1799             self.EndModal(wx.ID_OK)             
    1800            
    1801         def OnCancel(self,event):
    1802             parent = self.GetParent()
    1803             parent.Raise()
    1804             self.EndModal(wx.ID_CANCEL)             
    1805            
    1806         def GetData(self):
    1807             return self.data
    1808            
     1755                       
    18091756    def OnPwdrSum(self,event):
    18101757        'Sum together powder data(?)'
     
    18861833                    if Id:
    18871834                        Sample = G2pdG.SetDefaultSample()
    1888                         self.PatternTree.SetItemPyData(Id,[{'wtFactor':1.0,'Dummy':False},[np.array(Xsum),np.array(Ysum),np.array(Wsum),
     1835                        valuesdict = {
     1836                            'wtFactor':1.0,
     1837                            'Dummy':False,
     1838                            'ranId':ran.randint(0,sys.maxint),
     1839                            }
     1840                        self.PatternTree.SetItemPyData(Id,[valuesdict,[np.array(Xsum),np.array(Ysum),np.array(Wsum),
    18891841                            np.array(YCsum),np.array(YBsum),np.array(YDsum)]])
    18901842                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Comments'),Comments)                   
     
    24572409        PWDRdata['Sample Parameters'] = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PWDRname,'Sample Parameters'))
    24582410        PWDRdata['Reflection Lists'] = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PWDRname,'Reflection Lists'))
    2459         if 'ranId' not in PWDRdata['Sample Parameters']:
    2460             PWDRdata['Sample Parameters']['ranId'] = ran.randint(0,sys.maxint)
    2461         PWDRdata['ranId'] = PWDRdata['Sample Parameters']['ranId']
     2411        if 'ranId' not in PWDRdata:  # patch, add a random Id
     2412            PWDRdata['ranId'] = ran.randint(0,sys.maxint)
     2413        if 'ranId' not in PWDRdata['Sample Parameters']:  # I hope this becomes obsolete at some point
     2414            PWDRdata['Sample Parameters']['ranId'] = PWDRdata['ranId']
    24622415        return PWDRdata
    24632416
     
    24832436       
    24842437    def GetPhaseData(self):
    2485         '''Returns a list of defined phases. Used only in GSASIIgrid
    2486         Note routine :meth:`GSASIIstruct.GetPhaseData` also exists.
     2438        '''Returns a dict with defined phases.
     2439        Note routine :func:`GSASIIstrIO.GetPhaseData` also exists to
     2440        get same info from GPX file.
    24872441        '''
    24882442        phaseData = {}
     
    24902444            sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
    24912445        else:
    2492             print 'no phases to be refined'
    2493             return
     2446            print 'no phases found in GetPhaseData'
     2447            sub = None
    24942448        if sub:
    24952449            item, cookie = self.PatternTree.GetFirstChild(sub)
     
    25002454                    phaseData[phaseName]['ranId'] = ran.randint(0,sys.maxint)         
    25012455                item, cookie = self.PatternTree.GetNextChild(sub, cookie)
    2502         return phaseData               
     2456        return phaseData
     2457
     2458    def GetPhaseNames(self):
     2459        '''Returns a list of defined phases.
     2460        Note routine :func:`GSASIIstrIO.GetPhaseNames` also exists to
     2461        get same info from GPX file.
     2462        '''
     2463        phaseNames = []
     2464        if G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
     2465            sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
     2466        else:
     2467            print 'no phases found in GetPhaseNames'
     2468            sub = None
     2469        if sub:
     2470            item, cookie = self.PatternTree.GetFirstChild(sub)
     2471            while item:
     2472                phase = self.PatternTree.GetItemText(item)
     2473                phaseNames.append(phase)
     2474                item, cookie = self.PatternTree.GetNextChild(sub, cookie)
     2475        return phaseNames
     2476   
     2477    def GetHistogramNames(self,hType):
     2478        """ Returns a list of histogram names found in the GSASII data tree
     2479        Note routine :func:`GSASIIstrIO.GetHistogramNames` also exists to
     2480        get same info from GPX file.
     2481       
     2482        :param str hType: list of histogram types
     2483        :return: list of histogram names
     2484       
     2485        """
     2486        HistogramNames = []
     2487        if self.PatternTree.GetCount():
     2488            item, cookie = self.PatternTree.GetFirstChild(self.root)
     2489            while item:
     2490                name = self.PatternTree.GetItemText(item)
     2491                if name[:4] in hType:
     2492                    HistogramNames.append(name)       
     2493                item, cookie = self.PatternTree.GetNextChild(self.root, cookie)               
     2494
     2495        return HistogramNames
     2496
    25032497                   
    25042498    def GetUsedHistogramsAndPhasesfromTree(self):
    25052499        ''' Returns all histograms that are found in any phase
    2506         and any phase that uses a histogram
    2507         :returns: two dicts:
     2500        and any phase that uses a histogram.
     2501        This also assigns numbers to used phases and histograms by the
     2502        order they appear in the file.
     2503        Note routine :func:`GSASIIstrIO.GetUsedHistogramsAndPhasesfromTree` also exists to
     2504        get same info from GPX file.
     2505
     2506        :returns: (Histograms,Phases)
    25082507
    25092508            * Histograms = dictionary of histograms as {name:data,...}
    25102509            * Phases = dictionary of phases that use histograms
    25112510        '''
    2512         phaseData = self.GetPhaseData()
    2513         if not phaseData:
    2514             return {},{}
    25152511        Histograms = {}
    25162512        Phases = {}
     2513        phaseNames = self.GetPhaseNames()
     2514        phaseData = self.GetPhaseData()
     2515        histoList = self.GetHistogramNames(['PWDR','HKLF'])
     2516
    25172517        for phase in phaseData:
    25182518            Phase = phaseData[phase]
    25192519            if Phase['Histograms']:
    25202520                if phase not in Phases:
     2521                    pId = phaseNames.index(phase)
     2522                    Phase['pId'] = pId
    25212523                    Phases[phase] = Phase
    25222524                for hist in Phase['Histograms']:
    2523                     if hist not in Histograms:
     2525                    if 'Use' not in Phase['Histograms'][hist]:      #patch: add Use flag as True
     2526                        Phase['Histograms'][hist]['Use'] = True         
     2527                    if hist not in Histograms and Phase['Histograms'][hist]['Use']:
    25242528                        item = G2gd.GetPatternTreeItemId(self,self.root,hist)
    2525                         if 'PWDR' in hist[:4]:
    2526                             Histograms[hist] = self.GetPWDRdatafromTree(item)
    2527                         elif 'HKLF' in hist[:4]:
    2528                             Histograms[hist] = self.GetHKLFdatafromTree(item)
    2529                         #future restraint, etc. histograms here
     2529                        if item:
     2530                            if 'PWDR' in hist[:4]:
     2531                                Histograms[hist] = self.GetPWDRdatafromTree(item)
     2532                            elif 'HKLF' in hist[:4]:
     2533                                Histograms[hist] = self.GetHKLFdatafromTree(item)
     2534                            hId = histoList.index(hist)
     2535                            Histograms[hist]['hId'] = hId
     2536                        else: # would happen if a referenced histogram were renamed or deleted
     2537                            print('For phase "'+str(phase)+
     2538                                  '" unresolved reference to histogram "'+str(hist)+'"')
    25302539        return Histograms,Phases
    25312540       
Note: See TracChangeset for help on using the changeset viewer.