Changeset 1086


Ignore:
Timestamp:
Oct 5, 2013 5:51:48 PM (8 years ago)
Author:
toby
Message:

finish dummy (simulated) histogram

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASII.py

    r1084 r1086  
    586586            kind=wx.ITEM_NORMAL,text='guess format from file')
    587587        self.Bind(wx.EVT_MENU, self.OnImportPowder, id=item.GetId())
     588        submenu.AppendSeparator()
    588589        item = submenu.Append(wx.ID_ANY,
    589590            help='Create a powder data set entry that will be simulated',
     
    10161017
    10171018    def OnDummyPowder(self,event):
    1018         '''Called in response to an Import/Powder Data/... menu item
    1019         to read a powder diffraction data set.
    1020         dict self.ImportMenuId is used to look up the specific
    1021         reader item associated with the menu item, which will be
    1022         None for the last menu item, which is the "guess" option
    1023         where all appropriate formats will be tried.
    1024 
    1025         Also reads an instrument parameter file for each dataset.
    1026         '''
    1027         print 'Start Dummy'
     1019        '''Called in response to Import/Powder Data/Simulate menu item
     1020        to create a Dummy powder diffraction data set.
     1021
     1022        Reads an instrument parameter file and then gets input from the user
     1023        '''
    10281024        rd = G2IO.ImportPowderData(
    10291025            extensionlist=tuple(),
     
    10311027            formatName = 'Simulate dataset',
    10321028            longFormatName = 'Compute a simulated pattern')
    1033         # rd.powderdata = [
    1034         #     np.array(x), # x-axis values
    1035         #     np.array(y), # powder pattern intensities
    1036         #     np.array(w), # 1/sig(intensity)^2 values (weights)
    1037         #     np.zeros(N), # calc. intensities (zero)
    1038         #     np.zeros(N), # calc. background (zero)
    1039         #     np.zeros(N), # obs-calc profiles
    1040         #     ]
    1041         # rd.powderentry[0] = filename
     1029        rd.powderentry[0] = '' # no filename
    10421030        # #self.powderentry[1] = pos # bank offset (N/A here)
    1043         # rd.powderentry[2] = 1 # xye file only has one bank
    1044         # rd.idstring = ospath.basename(filename)
    1045         return
     1031        rd.powderentry[2] = 1 # only one bank
     1032        rd.comments.append('This is a dummy dataset for powder pattern simulation')
    10461033        self.CheckNotebook()
    10471034        Iparm = None
    10481035        lastIparmfile = ''
    10491036        lastdatafile = ''
     1037        self.zipfile = None
    10501038        # get instrument parameters for
    10511039        Iparm1,Iparm2 = self.GetPowderIparm(rd, Iparm, lastIparmfile, lastdatafile)
    1052 
    1053         for rd in rdlist:
    1054             if rd.repeat_instparm:
    1055                 lastIparmfile = rd.instfile
    1056             lastdatafile = rd.powderentry[0]
    1057             print 'Read powder data '+str(rd.idstring)+ \
    1058                 ' from file '+str(self.lastimport) + \
    1059                 ' with parameters from '+str(rd.instmsg)
    1060             # data are read, now store them in the tree
    1061             Id = self.PatternTree.AppendItem(parent=self.root,
    1062                 text='PWDR '+rd.idstring)
    1063             if 'T' in Iparm1['Type'][0]:
    1064                 if not rd.clockWd and rd.GSAS:
    1065                     rd.powderdata[0] *= 100.        #put back the CW centideg correction
    1066                 cw = np.diff(rd.powderdata[0])
    1067                 rd.powderdata[0] = rd.powderdata[0][:-1]+cw/2.
    1068                 rd.powderdata[1] = rd.powderdata[1][:-1]/cw
    1069                 rd.powderdata[2] = rd.powderdata[2][:-1]*cw**2  #1/var=w at this point
    1070                 if 'Itype' in Iparm2:
    1071                     Ibeg = np.searchsorted(rd.powderdata[0],Iparm2['Tminmax'][0])
    1072                     Ifin = np.searchsorted(rd.powderdata[0],Iparm2['Tminmax'][1])
    1073                     rd.powderdata[0] = rd.powderdata[0][Ibeg:Ifin]
    1074                     YI,WYI = G2pwd.calcIncident(Iparm2,rd.powderdata[0])
    1075                     rd.powderdata[1] = rd.powderdata[1][Ibeg:Ifin]/YI
    1076                     var = 1./rd.powderdata[2][Ibeg:Ifin]
    1077                     var += WYI*rd.powderdata[1]**2
    1078                     var /= YI**2
    1079                     rd.powderdata[2] = 1./var
    1080                 rd.powderdata[3] = np.zeros_like(rd.powderdata[0])                                       
    1081                 rd.powderdata[4] = np.zeros_like(rd.powderdata[0])                                       
    1082                 rd.powderdata[5] = np.zeros_like(rd.powderdata[0])                                       
    1083             Tmin = min(rd.powderdata[0])
    1084             Tmax = max(rd.powderdata[0])
    1085             self.PatternTree.SetItemPyData(Id,[{'wtFactor':1.0,'Dummy':True},rd.powderdata])
    1086             self.PatternTree.SetItemPyData(
    1087                 self.PatternTree.AppendItem(Id,text='Comments'),
    1088                 rd.comments)
    1089             self.PatternTree.SetItemPyData(
    1090                 self.PatternTree.AppendItem(Id,text='Limits'),
    1091                 [(Tmin,Tmax),[Tmin,Tmax]])
    1092             self.PatternId = G2gd.GetPatternTreeItemId(self,Id,'Limits')
    1093             self.PatternTree.SetItemPyData(
    1094                 self.PatternTree.AppendItem(Id,text='Background'),
    1095                 [['chebyschev',True,3,1.0,0.0,0.0],
    1096                  {'nDebye':0,'debyeTerms':[],'nPeaks':0,'peaksList':[]}])
    1097             self.PatternTree.SetItemPyData(
    1098                 self.PatternTree.AppendItem(Id,text='Instrument Parameters'),
    1099                 [Iparm1,Iparm2])
    1100             self.PatternTree.SetItemPyData(
    1101                 self.PatternTree.AppendItem(Id,text='Sample Parameters'),
    1102                 rd.Sample)
    1103             self.PatternTree.SetItemPyData(
    1104                 self.PatternTree.AppendItem(Id,text='Peak List')
    1105                 ,[])
    1106             self.PatternTree.SetItemPyData(
    1107                 self.PatternTree.AppendItem(Id,text='Index Peak List'),
    1108                 [])
    1109             self.PatternTree.SetItemPyData(
    1110                 self.PatternTree.AppendItem(Id,text='Unit Cells List'),
    1111                 [])
    1112             self.PatternTree.SetItemPyData(
    1113                 self.PatternTree.AppendItem(Id,text='Reflection Lists'),
    1114                 {})
    1115             self.PatternTree.Expand(Id)
     1040        if 'T' in Iparm1['Type'][0]:
     1041            print('TOF simulation not supported yet')
     1042            return False
     1043        else:
     1044            # need to get name, 2theta start, end, step
     1045            rd.idstring = ' CW'
     1046            if 'X' in Iparm1['Type'][0]:
     1047                rd.idstring = 'CW x-ray simulation'
     1048            else:
     1049                rd.idstring = 'CW neutron simulation'
     1050            # base initial range on wavelength
     1051            wave = Iparm1.get('Lam')
     1052            if wave:
     1053                wave = wave[0]
     1054            else:
     1055                wave = Iparm1.get('Lam1')
     1056                if wave:
     1057                    wave = wave[0]
     1058        N = 0
     1059        while (N < 3): # insist on a dataset with a few points
     1060            names = ('dataset name', 'start angle', 'end angle', 'step size')
     1061            if not wave or wave < 1.0:
     1062                inp = [rd.idstring, 10.,40.,0.005] # see names for what's what
     1063            else:
     1064                inp = [rd.idstring, 10.,80.,0.01] # see names for what's what
     1065            dlg = G2gd.ScrolledMultiEditor(
     1066                self,[inp] * len(inp),range(len(inp)),names,
     1067                header='Enter simulation name and range',
     1068                minvals=(None,0.001,0.001,0.0001),
     1069                maxvals=(None,180.,180.,.1),
     1070                sizevals=((225,-1),)
     1071                )
     1072            dlg.CenterOnParent()
     1073            if dlg.ShowModal() == wx.ID_OK:
     1074                if inp[1] > inp[2]:
     1075                    end,start,step = inp[1:]
     1076                else:               
     1077                    start,end,step = inp[1:]
     1078                step = abs(step)
     1079            else:
     1080                return False
     1081            x = np.arange(start,end+step,step)
     1082            N = len(x)
     1083        rd.powderdata = [
     1084            np.array(x), # x-axis values
     1085            None, # powder pattern intensities
     1086            None, # 1/sig(intensity)^2 values (weights)
     1087            np.zeros(N), # calc. intensities (zero)
     1088            np.zeros(N), # calc. background (zero)
     1089            np.zeros(N), # obs-calc profiles
     1090            ]
     1091        Tmin = min(rd.powderdata[0])
     1092        Tmax = max(rd.powderdata[0])
     1093        # data are read, now store them in the tree
     1094        Id = self.PatternTree.AppendItem(parent=self.root,
     1095                                         text='PWDR '+rd.idstring)           
     1096        self.PatternTree.SetItemPyData(Id,[{'wtFactor':1.0,'Dummy':True},rd.powderdata])
     1097        self.PatternTree.SetItemPyData(
     1098            self.PatternTree.AppendItem(Id,text='Comments'),
     1099            rd.comments)
     1100        self.PatternTree.SetItemPyData(
     1101            self.PatternTree.AppendItem(Id,text='Limits'),
     1102            [(Tmin,Tmax),[Tmin,Tmax]])
     1103        self.PatternId = G2gd.GetPatternTreeItemId(self,Id,'Limits')
     1104        self.PatternTree.SetItemPyData(
     1105            self.PatternTree.AppendItem(Id,text='Background'),
     1106            [['chebyschev',True,3,1.0,0.0,0.0],
     1107             {'nDebye':0,'debyeTerms':[],'nPeaks':0,'peaksList':[]}])
     1108        self.PatternTree.SetItemPyData(
     1109            self.PatternTree.AppendItem(Id,text='Instrument Parameters'),
     1110            [Iparm1,Iparm2])
     1111        self.PatternTree.SetItemPyData(
     1112            self.PatternTree.AppendItem(Id,text='Sample Parameters'),
     1113            rd.Sample)
     1114        self.PatternTree.SetItemPyData(
     1115            self.PatternTree.AppendItem(Id,text='Peak List')
     1116            ,[])
     1117        self.PatternTree.SetItemPyData(
     1118            self.PatternTree.AppendItem(Id,text='Index Peak List'),
     1119            [])
     1120        self.PatternTree.SetItemPyData(
     1121            self.PatternTree.AppendItem(Id,text='Unit Cells List'),
     1122            [])
     1123        self.PatternTree.SetItemPyData(
     1124            self.PatternTree.AppendItem(Id,text='Reflection Lists'),
     1125            {})
     1126        self.PatternTree.Expand(Id)
    11161127        self.PatternTree.SelectItem(Id)
     1128        print('Added simulation powder data '+str(rd.idstring)+
     1129              ' with parameters from '+str(rd.instmsg))
    11171130        return # success
    1118 
    1119     def OnDummyPowder(self,event):
    1120         import testit
    1121         reload(testit)
    1122         testit.OnDummyPowder(self,event)
    1123         return
    1124 
    11251131
    11261132    def _init_Exports(self,menu):
  • trunk/GSASIIgrid.py

    r1080 r1086  
    758758      value for the current row to all fields below (default is False)
    759759     
     760    :param list minvals: optional list of minimum values for validation
     761      of float or int values. Ignored if value is None.
     762    :param list maxvals: optional list of maximum values for validation
     763      of float or int values. Ignored if value is None.
     764    :param list sizevals: optional list of wx.Size values for each input
     765      widget. Ignored if value is None.
    760766    :returns: the wx.Dialog created here. Use method .ShowModal() to display it.
    761767   
     
    786792    def __init__(self,parent,dictlst,elemlst,prelbl=[],postlbl=[],
    787793                 title='Edit items',header='',size=(300,250),
    788                  CopyButton=False):
     794                 CopyButton=False,
     795                 minvals=[],maxvals=[],sizevals=[]):
    789796        if len(dictlst) != len(elemlst):
    790797            raise Exception,"ScrolledMultiEditor error: len(dictlst) != len(elemlst) "+str(len(dictlst))+" != "+str(len(elemlst))
     
    823830            else:
    824831                subSizer.Add(wx.StaticText(panel,wx.ID_ANY,str(prelbl[i])))
     832            kargs = {}
     833            if i < len(minvals):
     834                if minvals[i] is not None: kargs['min']=minvals[i]
     835            if i < len(maxvals):
     836                if maxvals[i] is not None: kargs['max']=maxvals[i]
     837            if i < len(sizevals):
     838                if sizevals[i]: kargs['size']=sizevals[i]
    825839            if CopyButton:
    826840                import wx.lib.colourselect as wscs
     
    836850                subSizer.Add(but)
    837851            # create the validated TextCrtl, store it and add it to the sizer
    838             ctrl = ValidatedTxtCtrl(panel,d,k,OKcontrol=self.ControlOKButton)
     852            ctrl = ValidatedTxtCtrl(panel,d,k,OKcontrol=self.ControlOKButton,
     853                                    **kargs)
    839854            self.ValidatedControlsList.append(ctrl)
    840855            subSizer.Add(ctrl)
     
    30193034       
    30203035def UpdatePWHKPlot(G2frame,kind,item):
    3021     '''Needs a doc string
     3036    '''Called when the histogram main tree entry is called. Displays the
     3037    histogram weight factor, refinement statistics for the histogram
     3038    and the range of data for a simulation.
     3039
     3040    Also invokes a plot of the histogram.
    30223041    '''
     3042    def onEditSimRange(event):
     3043        'Edit simulation range'
     3044        inp = [
     3045            min(data[1][0]),
     3046            max(data[1][0]),
     3047            None
     3048            ]
     3049        inp[2] = (inp[1] - inp[0])/(len(data[1][0])-1.)
     3050        names = ('start angle', 'end angle', 'step size')
     3051        dictlst = [inp] * len(inp)
     3052        elemlst = range(len(inp))
     3053        dlg = ScrolledMultiEditor(
     3054            G2frame,[inp] * len(inp), range(len(inp)), names,
     3055            header='Edit simulation range',
     3056            minvals=(0.001,0.001,0.0001),
     3057            maxvals=(180.,180.,.1),
     3058            )
     3059        dlg.CenterOnParent()
     3060        val = dlg.ShowModal()
     3061        dlg.Destroy()
     3062        if val != wx.ID_OK: return
     3063        if inp[0] > inp[1]:
     3064            end,start,step = inp
     3065        else:               
     3066            start,end,step = inp
     3067        step = abs(step)
     3068        newdata = np.arange(start,end+step,step)
     3069        if len(newdata) < 2: return # too small a range - reject
     3070        data[1][0] = newdata
     3071        data[1][1] = data[1][2] = None
     3072        UpdatePWHKPlot(G2frame,kind,item) # redisplay data screen
    30233073
    30243074    def OnErrorAnalysis(event):
     
    30513101    wtSizer.Add(wtval,0,wx.ALIGN_CENTER_VERTICAL)
    30523102    mainSizer.Add(wtSizer)
     3103    if data[0].get('Dummy'):
     3104        simSizer = wx.BoxSizer(wx.HORIZONTAL)
     3105        Tmin = min(data[1][0])
     3106        Tmax = max(data[1][0])
     3107        num = len(data[1][0])
     3108        step = (Tmax - Tmin)/(num-1)
     3109        t = u'2\u03b8' # 2theta
     3110        lbl =  u'Simulation range: {:.2f} to {:.2f} {:s}\nwith {:.4f} steps ({:d} points)'
     3111        lbl += u'\n(Edit range resets observed intensities).'
     3112        lbl = lbl.format(Tmin,Tmax,t,step,num)
     3113        simSizer.Add(wx.StaticText(G2frame.dataDisplay,wx.ID_ANY,lbl),
     3114                    0,wx.ALIGN_CENTER_VERTICAL)
     3115        but = wx.Button(G2frame.dataDisplay,wx.ID_ANY,"Edit range")
     3116        but.Bind(wx.EVT_BUTTON,onEditSimRange)
     3117        simSizer.Add(but,0,wx.ALIGN_CENTER_VERTICAL)
     3118        mainSizer.Add(simSizer)
    30533119    if 'Nobs' in data[0]:
    30543120        mainSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,
  • trunk/GSASIIplot.py

    r1084 r1086  
    723723    for Pattern in PlotList:
    724724        xye = Pattern[1]
    725         if xye is None: continue
     725        if xye[1] is None: continue
    726726        if Ymax is None: Ymax = max(xye[1])
    727727        Ymax = max(Ymax,max(xye[1]))
Note: See TracChangeset for help on using the changeset viewer.