Changeset 1208


Ignore:
Timestamp:
Jan 30, 2014 4:27:17 PM (8 years ago)
Author:
vondreele
Message:

complete contrast calculator for small angle data.
implement a Load substances from a file

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASII.py

    r1207 r1208  
    15631563            self.PatternTree.SetItemPyData(
    15641564                self.PatternTree.AppendItem(Id,text='Contrast'),
    1565                 {})     #Fill in defaults here
     1565                    {'Substances':{'vacuum':{'Elements':{},'Volume':1.0,'Density':0.0,'Scatt density':0.0}},
     1566                    'Contrast':0.0})
    15661567            self.PatternTree.SetItemPyData(
    15671568                self.PatternTree.AppendItem(Id,text='Models'),
  • trunk/GSASIIElemGUI.py

    r1046 r1208  
    8080        self.EndModal(wx.ID_OK)       
    8181       
     82class PickElements(wx.Dialog):
     83    """Makes periodic table widget for picking elements - caller maintains element list"""
     84    Elem = []
     85    def _init_ctrls(self, prnt,list):
     86        wx.Dialog.__init__(self, id=-1, name='PickElements',
     87              parent=prnt, pos=wx.DefaultPosition, size=wx.Size(580, 360),
     88              style=wx.DEFAULT_DIALOG_STYLE, title='Pick Elements')
     89        panel = wx.Panel(self)
     90       
     91        REcolor = wx.Colour(128, 128, 255)
     92        Metcolor = wx.Colour(192, 192, 192)
     93        Noblecolor = wx.Colour(255, 128, 255)
     94        Alkcolor = wx.Colour(255, 255, 128)
     95        AlkEcolor = wx.Colour(255, 128, 0)
     96        SemMetcolor = wx.Colour(128, 255, 0)
     97        NonMetcolor = wx.Colour(0, 255, 255)
     98        White = wx.Colour(255, 255, 255)
     99        self.Elem = []
     100        for El in list:
     101            self.Elem.append(El.lower().capitalize())
     102       
     103        self.ElTable = [
     104            ("H",   0,0, "Hydrogen",    White,           0.0000),
     105            ("He", 17,0, "Helium",      Noblecolor,      0.0000),
     106            ("Li",  0,1, "Lithium",     Alkcolor,        0.0004),
     107            ("Be",  1,1, "Beryllium",   AlkEcolor,       0.0006),
     108            ("B",  12,1, "Boron",       NonMetcolor,     0.0012),
     109            ("C",  13,1, "Carbon",      NonMetcolor,     0.0018),
     110            ("N",  14,1, "Nitrogen",    NonMetcolor,     0.0030),
     111            ("O",  15,1, "Oxygen",      NonMetcolor,     0.0042),
     112            ("F",  16,1, "Fluorine",    NonMetcolor,     0.0054),
     113            ("Ne", 17,1, "Neon",        Noblecolor,      0.0066),
     114            ("Na",  0,2, "Sodium",      Alkcolor,        0.0084),
     115            ("Mg",  1,2, "Magnesium",   AlkEcolor,       0.0110),
     116            ("Al", 12,2, "Aluminum",    SemMetcolor,     0.0125),
     117            ("Si", 13,2, "Silicon",     NonMetcolor,     0.0158),
     118            ("P",  14,2, "Phosphorus",  NonMetcolor,     0.0180),
     119            ("S",  15,2, "Sulphur",     NonMetcolor,     0.0210),
     120            ("Cl", 16,2, "Chlorine",    NonMetcolor,     0.0250),
     121            ("Ar", 17,2, "Argon",       Noblecolor,      0.0285),
     122            ("K",   0,3, "Potassium",   Alkcolor,        0.0320),
     123            ("Ca",  1,3, "Calcium",     AlkEcolor,       0.0362),
     124            ("Sc",  2,3, "Scandium",    Metcolor,        0.0410),
     125            ("Ti",  3,3, "Titanium",    Metcolor,        0.0460),
     126            ("V",   4,3, "Vanadium",    Metcolor,        0.0510),
     127            ("Cr",  5,3, "Chromium",    Metcolor,        0.0560),
     128            ("Mn",  6,3, "Manganese",   Metcolor,        0.0616),
     129            ("Fe",  7,3, "Iron",        Metcolor,        0.0680),
     130            ("Co",  8,3, "Cobalt",      Metcolor,        0.0740),
     131            ("Ni",  9,3, "Nickel",      Metcolor,        0.0815),
     132            ("Cu", 10,3, "Copper",      Metcolor,        0.0878),
     133            ("Zn", 11,3, "Zinc",        Metcolor,        0.0960),
     134            ("Ga", 12,3, "Gallium",     SemMetcolor,      0.104),
     135            ("Ge", 13,3, "Germanium",   SemMetcolor,      0.114),
     136            ("As", 14,3, "Arsenic",     NonMetcolor,      0.120),
     137            ("Se", 15,3, "Selenium",    NonMetcolor,      0.132),
     138            ("Br", 16,3, "Bromine",     NonMetcolor,      0.141),
     139            ("Kr", 17,3, "Krypton",     Noblecolor,       0.150),
     140            ("Rb",  0,4, "Rubidium",    Alkcolor,         0.159),
     141            ("Sr",  1,4, "Strontium",   AlkEcolor,        0.171),
     142            ("Y",   2,4, "Yittrium",    Metcolor,         0.180),
     143            ("Zr",  3,4, "Zirconium",   Metcolor,         0.192),
     144            ("Nb",  4,4, "Niobium",     Metcolor,         0.204),
     145            ("Mo",  5,4, "Molybdenium", Metcolor,         0.216),
     146            ("Tc",  6,4, "Technetium",  Metcolor,         0.228),
     147            ("Ru",  7,4, "Ruthenium",   Metcolor,         0.246),
     148            ("Rh",  8,4, "Rhodium",     Metcolor,         0.258),
     149            ("Pd",  9,4, "Palladium",   Metcolor,         0.270),
     150            ("Ag", 10,4, "Silver",      Metcolor,         0.285),
     151            ("Cd", 11,4, "Cadmium",     Metcolor,         0.300),
     152            ("In", 12,4, "Indium",      SemMetcolor,      0.318),
     153            ("Sn", 13,4, "Tin",         SemMetcolor,      0.330),
     154            ("Sb", 14,4, "Antimony",    SemMetcolor,      0.348),
     155            ("Te", 15,4, "Tellurium",   NonMetcolor,      0.363),
     156            ("I",  16,4, "Iodine",      NonMetcolor,      0.384),
     157            ("Xe", 17,4, "Xenon",       Noblecolor,       0.396),
     158            ("Cs",  0,5, "Caesium",     Alkcolor,         0.414),
     159            ("Ba",  1,5, "Barium",      AlkEcolor,        0.438),
     160            ("La",  2,5, "Lanthanium",  Metcolor,         0.456),
     161            ("Ce",  3.5,6.5, "Cerium",      REcolor,      0.474),
     162            ("Pr",  4.5,6.5, "Praseodymium",REcolor,      0.492),
     163            ("Nd",  5.5,6.5, "Neodymium",   REcolor,      0.516),
     164            ("Pm",  6.5,6.5, "Promethium",  REcolor,      0.534),
     165            ("Sm",  7.5,6.5, "Samarium",    REcolor,      0.558),
     166            ("Eu",  8.5,6.5, "Europium",    REcolor,      0.582),
     167            ("Gd",  9.5,6.5, "Gadolinium",  REcolor,      0.610),
     168            ("Tb", 10.5,6.5, "Terbium",     REcolor,      0.624),
     169            ("Dy", 11.5,6.5, "Dysprosium",  REcolor,      0.648),
     170            ("Ho", 12.5,6.5, "Holmium",     REcolor,      0.672),
     171            ("Er", 13.5,6.5, "Erbium",      REcolor,      0.696),
     172            ("Tm", 14.5,6.5, "Thulium",     REcolor,      0.723),
     173            ("Yb", 15.5,6.5, "Ytterbium",   REcolor,      0.750),
     174            ("Lu", 16.5,6.5, "Lutetium",    REcolor,      0.780),
     175            ("Hf",  3,5, "Hafnium",     Metcolor,         0.804),
     176            ("Ta",  4,5, "Tantalum",    Metcolor,         0.834),
     177            ("W",   5,5, "Tungsten",    Metcolor,         0.864),
     178            ("Re",  6,5, "Rhenium",     Metcolor,         0.900),
     179            ("Os",  7,5, "Osmium",      Metcolor,         0.919),
     180            ("Ir",  8,5, "Iridium",     Metcolor,         0.948),
     181            ("Pt",  9,5, "Platinium",   Metcolor,         0.984),
     182            ("Au", 10,5, "Gold",        Metcolor,         1.014),
     183            ("Hg", 11,5, "Mercury",     Metcolor,         1.046),
     184            ("Tl", 12,5, "Thallium",    SemMetcolor,      1.080),
     185            ("Pb", 13,5, "Lead",        SemMetcolor,      1.116),
     186            ("Bi", 14,5, "Bismuth",     SemMetcolor,      1.149),
     187            ("Po", 15,5, "Polonium",    SemMetcolor,      1.189),
     188            ("At", 16,5, "Astatine",    NonMetcolor,      1.224),
     189            ("Rn", 17,5, "Radon",       Noblecolor,       1.260),
     190            ("Fr",  0,6, "Francium",    Alkcolor,         1.296),
     191            ("Ra",  1,6, "Radium",      AlkEcolor,        1.332),
     192            ("Ac",  2,6, "Actinium",    Metcolor,         1.374),
     193            ("Th",  3.5,7.5, "Thorium",     REcolor,      1.416),
     194            ("Pa",  4.5,7.5, "Protactinium",REcolor,      1.458),
     195            ("U",   5.5,7.5, "Uranium",     REcolor,      1.470),
     196            ("Np",  6.5,7.5, "Neptunium",   REcolor,      1.536),
     197            ("Pu",  7.5,7.5, "Plutonium",   REcolor,      1.584),
     198            ("Am",  8.5,7.5, "Americium",   REcolor,      1.626),
     199            ("Cm",  9.5,7.5, "Curium",      REcolor,      1.669),
     200            ("Bk", 10.5,7.5, "Berkelium",   REcolor,      1.716),
     201            ("Cf", 11.5,7.5, "Californium", REcolor,      1.764)]
     202           
     203        mainSizer = wx.BoxSizer(wx.VERTICAL)
     204        elPanel = wx.Panel(panel)
     205           
     206        i=0
     207        for E in self.ElTable:
     208            PickElements.ElButton(self,parent=elPanel,name=E[0],
     209                pos=wx.Point(E[1]*30+20,E[2]*30+25),tip=E[3],color=E[4])
     210            i+=1
     211        mainSizer.Add(elPanel,0,wx.EXPAND)
     212        mainSizer.Add((10,10),0)
     213       
     214        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
     215        OkBtn = wx.Button(panel,-1,"Ok")
     216        OkBtn.Bind(wx.EVT_BUTTON, self.OnOk)
     217        cancelBtn = wx.Button(panel,-1,"Cancel")
     218        cancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel)
     219        btnSizer.Add((20,20),1)
     220        btnSizer.Add(OkBtn)
     221        btnSizer.Add((20,20),1)
     222        btnSizer.Add(cancelBtn)
     223        btnSizer.Add((20,20),1)
     224        mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM, 10)
     225        panel.SetSizer(mainSizer)
     226        panel.Fit()
     227                 
     228    def OnOk(self,event):
     229        if self.Elem:
     230            self.EndModal(wx.ID_OK)
     231        else:       
     232            self.EndModal(wx.ID_CANCEL)       
     233       
     234    def OnCancel(self,event):
     235        self.EndModal(wx.ID_CANCEL)       
     236
     237    def __init__(self, parent,list):
     238        self._init_ctrls(parent,list)
     239       
     240    def ElButton(self, parent, name, pos, tip, color):
     241        Black = wx.Colour(0,0,0)
     242        if name in self.Elem:
     243            color = Black
     244        El = wscs.ColourSelect(label=name, parent=parent,colour=color,
     245            pos=pos, size=wx.Size(32, 32), style=wx.RAISED_BORDER)
     246        El.SetBackgroundColour(color)
     247        El.SetLabel(name)
     248        El.SetToolTipString(tip)
     249        El.Bind(wx.EVT_BUTTON, self.OnElButton)
     250
     251    def OnElButton(self, event):
     252        Black = wx.Colour(0,0,0)
     253        btn = event.GetEventObject()
     254        El = btn.GetLabel()
     255        if btn.GetColour() != Black:
     256            for Elem in self.ElTable:
     257                if El in Elem:
     258                    ElColor = Elem[4]
     259            if El in self.Elem:
     260                btn.SetColour(ElColor)
     261                self.Elem.remove(El)
     262            else:
     263                btn.SetColour(wx.Colour(255,0,0))
     264                self.Elem.append(El)
     265       
    82266class DeleteElement(wx.Dialog):
    83267    "Delete element from selected set widget"
  • trunk/GSASIIIO.py

    r1207 r1208  
    887887                G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Reflection Lists'),{})
    888888            elif 'SASD' in name:             
    889                 G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Contrast'),{})
     889                G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Contrast'),
     890                    {'Substances':{'vacuum':{'Elements':{},'Volume':1.0,'Density':0.0,'Scatt density':0.0}},
     891                    'Contrast':0.0})
    890892                G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Models'),{})
    891893        else:
     
    907909                G2frame.PatternTree.SetItemPyData(G2frame.PatternTree.AppendItem(Id,text='Reflection Lists'),{})
    908910            elif 'SASD' in name:             
    909                 G2frame.PatternTree.SetItemPyData(G2frame.PatternTree.AppendItem(Id,text='Contrast'),{})
     911                G2frame.PatternTree.SetItemPyData(G2frame.PatternTree.AppendItem(Id,text='Contrast'),
     912                    {'Substances':{'vacuum':{'Elements':{},'Volume':1.0,'Density':0.0,'Scatt density':0.0}},
     913                    'Contrast':0.0})
    910914                G2frame.PatternTree.SetItemPyData(G2frame.PatternTree.AppendItem(Id,text='Models'),{})
    911915            valuesdict = {
  • trunk/GSASIIgrid.py

    r1207 r1208  
    134134] = [wx.NewId() for item in range(1)]
    135135
    136 [ wxID_MODELCOPY,wxID_MODELFIT
    137 ] = [wx.NewId() for item in range(2)]
     136[ wxID_MODELCOPY,wxID_MODELFIT,wxID_CONTRASTADD,wxID_CONTRASTDELETE,wxID_ADDSUBSTANCE,
     137    wxID_LOADSUBSTANCE,
     138] = [wx.NewId() for item in range(6)]
    138139
    139140[ wxID_SELECTPHASE,
     
    23802381        self.PrefillDataMenu(self.ContrastMenu,helpType='Contrast')
    23812382        self.ContrastEdit = wx.Menu(title='')
    2382         self.ContrastMenu.Append(menu=self.ContrastEdit, title='Models')
     2383        self.ContrastMenu.Append(menu=self.ContrastEdit, title='Edit')
     2384        self.ContrastEdit.Append(id=wxID_ADDSUBSTANCE, kind=wx.ITEM_NORMAL,text='Add substance',
     2385            help='Add new substance')
     2386        self.ContrastEdit.Append(id=wxID_LOADSUBSTANCE, kind=wx.ITEM_NORMAL,text='Load substance',
     2387            help='Load substance from file')
     2388        self.ContrastEdit.Append(id=wxID_CONTRASTADD, kind=wx.ITEM_NORMAL,text='Add elements',
     2389            help='Add elements to substance')
     2390        self.ContrastEdit.Append(id=wxID_CONTRASTDELETE, kind=wx.ITEM_NORMAL,text='Delete elements',
     2391            help='Delete elements from substance')
    23832392        self.PostfillDataMenu()
    23842393       
  • trunk/GSASIImath.py

    r1207 r1208  
    540540       
    541541def getMass(generalData):
    542     '''default doc string
    543    
    544     :param type name: description
    545    
    546     :returns: type name: description
    547    
    548     '''
    549     'Computes mass of unit cell contents'
     542    '''Computes mass of unit cell contents
     543   
     544    :param dict generalData: The General dictionary in Phase
     545   
     546    :returns: float mass: Crystal unit cell mass in AMU.
     547   
     548    '''
    550549    mass = 0.
    551550    for i,elem in enumerate(generalData['AtomTypes']):
     
    554553
    555554def getDensity(generalData):
    556     '''default doc string
    557    
    558     :param type name: description
    559    
    560     :returns: type name: description
     555    '''calculate crystal structure density
     556   
     557    :param dict generalData: The General dictionary in Phase
     558   
     559    :returns: float density: crystal density in gm/cm^3
    561560   
    562561    '''
     
    567566   
    568567def getWave(Parms):
    569     '''default doc string
    570    
    571     :param type name: description
    572    
    573     :returns: type name: description
     568    '''returns wavelength from Instrument parameters dictionary
     569   
     570    :param dict Parms: Instrument parameters;
     571        must contain:
     572        Lam: single wavelength
     573        or
     574        Lam1: Ka1 radiation wavelength
     575   
     576    :returns: float wave: wavelength
    574577   
    575578    '''
     
    578581    except KeyError:
    579582        return Parms['Lam1'][1]
     583       
     584def El2Mass(Elements):
     585    '''compute molecular weight from Elements
     586   
     587    :param dict Elements: elements in molecular formula;
     588        each must contain
     589        Num: number of atoms in formula
     590        Mass: at. wt.
     591   
     592    :returns: float mass: molecular weight.
     593   
     594    '''
     595    mass = 0
     596    for El in Elements:
     597        mass += Elements[El]['Num']*Elements[El]['Mass']
     598    return mass
     599       
     600def Den2Vol(Elements,density):
     601    '''converts density to molecular volume
     602   
     603    :param dict Elements: elements in molecular formula;
     604        each must contain
     605        Num: number of atoms in formula
     606        Mass: at. wt.
     607    :param float density: material density in gm/cm^3
     608   
     609    :returns: float volume: molecular volume in A^3
     610   
     611    '''
     612    return El2Mass(Elements)/(density*0.6022137)
     613   
     614def Vol2Den(Elements,volume):
     615    '''converts volume to density
     616   
     617    :param dict Elements: elements in molecular formula;
     618        each must contain
     619        Num: number of atoms in formula
     620        Mass: at. wt.
     621    :param float volume: molecular volume in A^3
     622   
     623    :returns: float density: material density in gm/cm^3
     624   
     625    '''
     626    return El2Mass(Elements)/(volume*0.6022137)
     627   
     628def El2EstVol(Elements):
     629    '''Estimate volume from molecular formula; assumes atom volume = 10A^3
     630   
     631    :param dict Elements: elements in molecular formula;
     632        each must contain
     633        Num: number of atoms in formula
     634   
     635    :returns: float volume: estimate of molecular volume in A^3
     636   
     637    '''
     638    vol = 0
     639    for El in Elements:
     640        vol += 10.*Elements[El]['Num']
     641    return vol
     642   
     643def XScattDen(Elements,vol,wave=0.):
     644    '''Estimate X-ray scattering density from molecular formula & volume;
     645    ignores valence, but includes anomalous effects
     646   
     647    :param dict Elements: elements in molecular formula;
     648        each element must contain
     649        Num: number of atoms in formula
     650        Z: atomic number
     651    :param float vol: molecular volume in A^3
     652    :param float wave: optional wavelength in A
     653   
     654    :returns: float rho: scattering density in 10^10cm^-2;
     655        if wave > 0 the includes f' contribution
     656   
     657    '''
     658    rho = 0
     659    if wave:
     660        Xanom = XAnomAbs(Elements,wave)
     661    for El in Elements:
     662        f0 = Elements[El]['Z']
     663        if wave:
     664            f0 += Xanom[El][0]
     665        rho += Elements[El]['Num']*f0
     666    return 28.179*rho/vol
     667   
     668def wavekE(wavekE):
     669    '''Convert wavelength to energy & vise versa
     670   
     671    :param float waveKe:wavelength in A or energy in kE
     672   
     673    :returns float waveKe:the other one
     674   
     675    '''
     676    return 12.397639/wavekE
     677       
     678def XAnomAbs(Elements,wave):
     679    kE = wavekE(wave)
     680    Xanom = {}
     681    for El in Elements:
     682        Orbs = G2el.GetXsectionCoeff(El)
     683        Xanom[El] = G2el.FPcalc(Orbs, kE)
     684    return Xanom
     685   
    580686   
    581687################################################################################
  • trunk/GSASIIpwdGUI.py

    r1207 r1208  
    2020import wx
    2121import wx.grid as wg
     22import wx.lib.scrolledpanel as wxscroll
    2223import numpy as np
    2324import numpy.ma as ma
     
    20692070    '''respond to selection of SASD Contrast data tree item.
    20702071    '''
     2072    import Substances as substFile
    20712073   
    2072     def FillDefaultContrast():
    2073         data = {}
     2074    def OnLoadSubstance(event):
     2075        names = substFile.Substances.keys()
     2076        dlg = wx.SingleChoiceDialog(G2frame, 'Which substance?', 'Select substance', names, wx.CHOICEDLG_STYLE)
     2077        try:
     2078            if dlg.ShowModal() == wx.ID_OK:
     2079                name = names[dlg.GetSelection()]
     2080            else:
     2081                return
     2082        finally:
     2083            dlg.Destroy()
     2084        data['Substances'][name] = {'Elements':{},'Volume':1.0,'Density':1.0,
     2085            'Scatt density':0.0,'XAnom density':0.0}
     2086        subst = substFile.Substances[name]
     2087        ElList = subst['Elements'].keys()
     2088        for El in ElList:
     2089            Info = G2elem.GetAtomInfo(El.strip().upper())
     2090            Info.update(subst['Elements'][El])
     2091            data['Substances'][name]['Elements'][El] = Info
     2092            if 'Volume' in subst:
     2093                data['Substances'][name]['Volume'] = subst['Volume']
     2094                data['Substances'][name]['Density'] = \
     2095                    G2mth.Vol2Den(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])
     2096            elif 'Density' in subst:
     2097                data['Substances'][name]['Density'] = subst['Density']
     2098                data['Substances'][name]['Volume'] = \
     2099                    G2mth.Den2Vol(data['Substances'][name]['Elements'],data['Substances'][name]['Density'])
     2100            else:
     2101                data['Substances'][name]['Volume'] = G2mth.El2EstVol(data['Substances'][name]['Elements'])
     2102                data['Substances'][name]['Density'] = \
     2103                    G2mth.Vol2Den(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])
     2104            data['Substances'][name]['Scatt density'] = \
     2105                G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])         
     2106            data['Substances'][name]['XAnom density'] = \
     2107                G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave)         
     2108        UpdateContrastGrid(G2frame,data)
     2109   
     2110    def OnAddSubstance(event):
     2111        dlg = wx.TextEntryDialog(None,'Enter a name for this substance','Substance Name Entry','New substance',
     2112            style=wx.OK)
     2113        if dlg.ShowModal() == wx.ID_OK:
     2114            Name = dlg.GetValue()
     2115            data['Substances'][Name] = {'Elements':{},'Volume':1.0,'Density':1.0,
     2116                'Scatt density':0.0,'XAnom density':0.}
     2117        dlg.Destroy()
     2118        UpdateContrastGrid(G2frame,data)
     2119               
     2120    def OnAddElement(event):       
     2121        TextList = []
     2122        for name in data['Substances']:
     2123            if name != 'vacuum':
     2124                TextList += [name,]
     2125        if not TextList:
     2126            return
     2127        dlg = wx.SingleChoiceDialog(G2frame, 'Which substance?', 'Select substance', TextList, wx.CHOICEDLG_STYLE)
     2128        try:
     2129            if dlg.ShowModal() == wx.ID_OK:
     2130                name = TextList[dlg.GetSelection()]
     2131            else:
     2132                return
     2133        finally:
     2134            dlg.Destroy()
     2135        ElList = data['Substances'][name]['Elements'].keys()
     2136        dlg = G2elemGUI.PickElements(G2frame,ElList)
     2137        if dlg.ShowModal() == wx.ID_OK:
     2138            for El in dlg.Elem:
     2139                El = El.strip().upper()
     2140                Info = G2elem.GetAtomInfo(El)
     2141                Info.update({'Num':1})
     2142                data['Substances'][name]['Elements'][El] = Info
     2143                data['Substances'][name]['Volume'] = G2mth.El2EstVol(data['Substances'][name]['Elements'])
     2144                data['Substances'][name]['Density'] = \
     2145                    G2mth.Vol2Den(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])
     2146                data['Substances'][name]['Scatt density'] = \
     2147                    G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])         
     2148                data['Substances'][name]['XAnom density'] = \
     2149                    G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave)         
     2150        dlg.Destroy()
     2151        UpdateContrastGrid(G2frame,data)
     2152       
     2153    def OnDeleteElement(event):
     2154        TextList = []
     2155        for name in data['Substances']:
     2156            if name != 'vacuum':
     2157                TextList += [name,]
     2158        if not TextList:
     2159            return
     2160        dlg = wx.SingleChoiceDialog(G2frame, 'Which substance?', 'Select substance', TextList, wx.CHOICEDLG_STYLE)
     2161        try:
     2162            if dlg.ShowModal() == wx.ID_OK:
     2163                name = TextList[dlg.GetSelection()]
     2164            else:
     2165                return
     2166        finally:
     2167            dlg.Destroy()
     2168        ElList = data['Substances'][name]['Elements'].keys()
     2169        if len(ElList):
     2170            DE = G2elemGUI.DeleteElement(G2frame,ElList)
     2171            if DE.ShowModal() == wx.ID_OK:
     2172                El = DE.GetDeleteElement().strip().upper()
     2173                del(data['Substances'][name]['Elements'][El])
     2174                data['Substances'][name]['Volume'] = G2mth.El2EstVol(data['Substances'][name]['Elements'])
     2175                data['Substances'][name]['Density'] = \
     2176                    G2mth.Vol2Den(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])
     2177                data['Substances'][name]['Scatt density'] = \
     2178                    G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])         
     2179                data['Substances'][name]['XAnom density'] = \
     2180                    G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave)         
     2181        UpdateContrastGrid(G2frame,data)
     2182               
     2183    def SubstSizer():
     2184       
     2185        def OnValueChange(event):
     2186            Obj = event.GetEventObject()
     2187            if len(Indx[Obj.GetId()]) == 3:
     2188                name,El,keyId = Indx[Obj.GetId()]
     2189                try:
     2190                    value = max(0,int(Obj.GetValue()))
     2191                except ValueError:
     2192                    value = 0
     2193                    Obj.SetValue(str(value))
     2194                data['Substances'][name]['Elements'][El][keyId] = value
     2195                data['Substances'][name]['Volume'] = G2mth.El2EstVol(data['Substances'][name]['Elements'])
     2196                data['Substances'][name]['Density'] = \
     2197                    G2mth.Vol2Den(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])
     2198            else:
     2199                name,keyId = Indx[Obj.GetId()]
     2200                try:
     2201                    value = max(0,float(Obj.GetValue()))
     2202                except ValueError:
     2203                    value = 1.0
     2204                data['Substances'][name][keyId] = value
     2205                if keyId in 'Volume':
     2206                    data['Substances'][name]['Density'] = \
     2207                        G2mth.Vol2Den(data['Substances'][name]['Elements'],value)
     2208                elif keyId in 'Density':
     2209                    data['Substances'][name]['Volume'] = \
     2210                        G2mth.Den2Vol(data['Substances'][name]['Elements'],value)
     2211            data['Substances'][name]['Scatt density'] = \
     2212                G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'])         
     2213            data['Substances'][name]['XAnom density'] = \
     2214                G2mth.XScattDen(data['Substances'][name]['Elements'],data['Substances'][name]['Volume'],wave)         
     2215            UpdateContrastGrid(G2frame,data)
     2216       
     2217        Indx = {}
     2218        Pwr10 = unichr(0x0b9)+unichr(0x0b0)
     2219        Pwrm2 = unichr(0x207b)+unichr(0x0b2)
     2220        substSizer = wx.BoxSizer(wx.VERTICAL)
     2221        substSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Substance list:'),
     2222            0,wx.ALIGN_CENTER_VERTICAL)
     2223        for name in data['Substances']:
     2224            substSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Data for '+name+':'),
     2225                0,wx.ALIGN_CENTER_VERTICAL)
     2226            if name == 'vacuum':
     2227                substSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label='        Not applicable'),
     2228                    0,wx.ALIGN_CENTER_VERTICAL)
     2229            else:   
     2230                elSizer = wx.FlexGridSizer(1,6,5,5)
     2231                Substance = data['Substances'][name]
     2232                Elems = Substance['Elements']
     2233                for El in Elems:
     2234                    elSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' '+El+': '),
     2235                        0,wx.ALIGN_CENTER_VERTICAL)
     2236                    num = wx.TextCtrl(G2frame.dataDisplay,value=str(Elems[El]['Num']),style=wx.TE_PROCESS_ENTER)
     2237                    Indx[num.GetId()] = [name,El,'Num']
     2238                    num.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
     2239                    num.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
     2240                    elSizer.Add(num,0,wx.ALIGN_CENTER_VERTICAL)
     2241                substSizer.Add(elSizer,0)
     2242                vdsSizer = wx.FlexGridSizer(1,4,5,5)
     2243                vdsSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Volume: '),
     2244                    0,wx.ALIGN_CENTER_VERTICAL)
     2245                vol = wx.TextCtrl(G2frame.dataDisplay,value='%.3f'%(Substance['Volume']),style=wx.TE_PROCESS_ENTER)
     2246                Indx[vol.GetId()] = [name,'Volume']
     2247                vol.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
     2248                vol.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
     2249                vdsSizer.Add(vol,0,wx.ALIGN_CENTER_VERTICAL)               
     2250                vdsSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Density: '),
     2251                    0,wx.ALIGN_CENTER_VERTICAL)
     2252                den = wx.TextCtrl(G2frame.dataDisplay,value='%.3f'%(Substance['Density']),style=wx.TE_PROCESS_ENTER)
     2253                Indx[den.GetId()] = [name,'Density']
     2254                den.Bind(wx.EVT_TEXT_ENTER,OnValueChange)       
     2255                den.Bind(wx.EVT_KILL_FOCUS,OnValueChange)
     2256                vdsSizer.Add(den,0,wx.ALIGN_CENTER_VERTICAL)
     2257                substSizer.Add(vdsSizer,0)
     2258                substSizer.Add(wx.StaticText(G2frame.dataDisplay,
     2259                    label=' Scattering density  : %.2f *10%scm%s'%(Substance['Scatt density'],Pwr10,Pwrm2)),
     2260                    0,wx.ALIGN_CENTER_VERTICAL)               
     2261                substSizer.Add(wx.StaticText(G2frame.dataDisplay,
     2262                    label=' Anomalous density : %.2f *10%scm%s'%(Substance['XAnom density'],Pwr10,Pwrm2)),
     2263                    0,wx.ALIGN_CENTER_VERTICAL)               
     2264               
     2265        return substSizer
    20742266           
     2267    Inst = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Instrument Parameters'))[0]
     2268    wave = G2mth.getWave(Inst)
     2269    if G2frame.dataDisplay:
     2270        G2frame.dataFrame.DestroyChildren()
    20752271    G2gd.SetDataMenuBar(G2frame,G2frame.dataFrame.ContrastMenu)
    20762272    if not G2frame.dataFrame.GetStatusBar():
    20772273        Status = G2frame.dataFrame.CreateStatusBar()
    2078     if not len(data):
    2079         FillDefaultContrast()   
    2080     G2frame.dataDisplay = wx.Panel(G2frame.dataFrame)
    2081        
     2274    G2frame.dataDisplay = wxscroll.ScrolledPanel(G2frame.dataFrame)
     2275    G2frame.dataFrame.SetLabel('Contrast calculator')
     2276    G2frame.dataFrame.Bind(wx.EVT_MENU, OnLoadSubstance, id=G2gd.wxID_LOADSUBSTANCE)   
     2277    G2frame.dataFrame.Bind(wx.EVT_MENU, OnAddSubstance, id=G2gd.wxID_ADDSUBSTANCE)   
     2278    G2frame.dataFrame.Bind(wx.EVT_MENU, OnAddElement, id=G2gd.wxID_CONTRASTADD)
     2279    G2frame.dataFrame.Bind(wx.EVT_MENU, OnDeleteElement, id=G2gd.wxID_CONTRASTDELETE)
     2280    mainSizer = wx.BoxSizer(wx.VERTICAL)
     2281    mainSizer.Add(SubstSizer(),0)
     2282
     2283    mainSizer.Layout()   
     2284    G2frame.dataDisplay.SetSizer(mainSizer)
     2285    G2frame.dataDisplay.SetAutoLayout(1)
     2286    G2frame.dataDisplay.SetupScrolling()
     2287    Size = mainSizer.Fit(G2frame.dataFrame)
     2288    Size[0] += 25
     2289    G2frame.dataDisplay.SetSize(Size)
     2290    G2frame.dataFrame.setSizePosLeft(Size)   
     2291           
    20822292       
    20832293################################################################################
     
    21042314    if not len(data):
    21052315        FillDefaultModel()   
    2106     G2frame.dataDisplay = wx.Panel(G2frame.dataFrame)
     2316    G2frame.dataFrame.SetLabel('Modelling')
     2317    G2frame.dataDisplay = wxscroll.ScrolledPanel(G2frame.dataFrame)
    21072318    G2frame.dataFrame.Bind(wx.EVT_MENU, OnCopyModel, id=G2gd.wxID_MODELCOPY)
    21082319    G2frame.dataFrame.Bind(wx.EVT_MENU, OnFitModel, id=G2gd.wxID_MODELFIT)
     2320
     2321    mainSizer.Layout()   
     2322    G2frame.dataDisplay.SetSizer(mainSizer)
     2323    G2frame.dataDisplay.SetAutoLayout(1)
     2324    G2frame.dataDisplay.SetupScrolling()
     2325    Size = mainSizer.Fit(G2frame.dataFrame)
     2326    Size[0] += 25
     2327    G2frame.dataDisplay.SetSize(Size)
     2328    G2frame.dataFrame.setSizePosLeft(Size)   
    21092329       
    21102330   
Note: See TracChangeset for help on using the changeset viewer.