Changeset 5504 for trunk/GSASIIpwdGUI.py


Ignore:
Timestamp:
Feb 26, 2023 10:06:15 AM (2 years ago)
Author:
toby
Message:

Add multi-histogram view of instrument parameters

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/GSASIIpwdGUI.py

    r5502 r5504  
    23442344        insVal.update({key:data[key][1] for key in instkeys})
    23452345        insRef.update({key:data[key][2] for key in instkeys})
     2346        wx.CallAfter(UpdateInstrumentGrid,G2frame,data)
     2347
     2348    def OnInstMult(event):
     2349        'If checked or unchecked, redisplay window'
    23462350        wx.CallAfter(UpdateInstrumentGrid,G2frame,data)
    23472351       
     
    26412645        G2frame.dataWindow.SetSizer(mainSizer)
    26422646        # end of MakeParameterWindow
     2647       
     2648    plotYsel = {}   # selected Y items
     2649    def MakeMultiParameterWindow(selected=None):
     2650        '''Displays the Instrument parameters for multiple histograms
     2651        in the dataWindow panel
     2652        '''
     2653        plotIndex = {'plotX':0} # index for param name => plotTbl index
     2654                                # plotX is selected X axis
     2655        plotTbl = []   # table of values for each param
     2656        plotLabel = []   # table of values for each param
     2657        def onSelectHists(event):
     2658            'select histograms to show'
     2659            dlg = G2G.G2MultiChoiceDialog(G2frame,
     2660                        'Select histograms to show of type '+data['Type'][1],
     2661                        'Select histograms',hlist)
     2662            dlg.CenterOnParent()
     2663            try:
     2664                if dlg.ShowModal() == wx.ID_OK:
     2665                    selected = dlg.GetSelections()
     2666                else:
     2667                    return
     2668            finally:
     2669                dlg.Destroy()
     2670            wx.CallAfter(MakeMultiParameterWindow,selected)
     2671            return
     2672        def onSelectX(event):
     2673            'respond to change in plotting x axis; save and plot (if y selected)'
     2674            plotIndex['plotX'] = event.GetEventObject().rbindex
     2675            onPrmPlot(event)
     2676           
     2677        def onPrmPlot(event):
     2678            '''Callback after a change to X or Y plot contents
     2679            plots multiple instrument param values vs selected X value.
     2680            If no Y values are selected, any previous plot is deleted.
     2681            '''
     2682            xvals = plotTbl[plotIndex['plotX']]
     2683            xlbl  = plotLabel[plotIndex['plotX']]
     2684            XY = []
     2685            keys = ''
     2686            for k in plotYsel:
     2687                if k == 'plotX': continue
     2688                if not plotYsel[k]: continue
     2689                yvals = plotTbl[plotIndex[k]]
     2690                if keys: keys += ', '
     2691                keys += plotLabel[plotIndex[k]]
     2692                XY.append((xvals,yvals))
     2693            if not XY:
     2694                G2frame.G2plotNB.Delete('Parameter values')
     2695                return
     2696            G2plt.PlotXY(G2frame,XY,labelX=xlbl,labelY=keys,Title='Parameter values',newPlot=True)
     2697
     2698        # gather histograms matching the currently selected histogram
     2699        histoList,histIdList = G2frame.GetHistogramNamesID(['PWDR',])
     2700        hlist = GetHistsLikeSelected(G2frame)
     2701        if selected is None and len(hlist) > 10:  # on initial call this is none
     2702            onSelectHists(None) # lots of histograms, give user a chance to choose
     2703            return
     2704        elif selected is None:  # select all, not so many
     2705            selected = range(len(hlist))
     2706            lbl = 'Instrument parameters for all matching histograms'
     2707        else:
     2708            lbl = 'Instrument parameters for selected histograms'
     2709        wx.BeginBusyCursor()
     2710        h = G2frame.GPXtree.GetItemText(G2frame.PatternId)
     2711        histnames = [h]
     2712        histdict = {h:data}
     2713        histnum = {h:G2frame.GPXtree.GetItemPyData(G2frame.PatternId)[0]['hId']}
     2714        for i in selected:
     2715            h = hlist[i]
     2716            if h not in histoList: # unexpected
     2717                print('hist from GetHistsLikeSelected not in GetHistogramNamesID',h)
     2718                continue
     2719            hid = histIdList[h]
     2720            inst,inst2 = G2frame.GPXtree.GetItemPyData(G2gd.GetGPXtreeItemId(G2frame,hid, 'Instrument Parameters'))
     2721            histnames.append(h)
     2722            histdict[h] = inst
     2723            histnum[h] = G2frame.GPXtree.GetItemPyData(hid)[0]['hId']
     2724
     2725        # start posting info into window
     2726        G2frame.dataWindow.ClearData()
     2727        mainSizer = wx.BoxSizer(wx.VERTICAL)
     2728        topSizer = wx.BoxSizer(wx.HORIZONTAL)
     2729        topSizer.Add(wx.StaticText(G2frame.dataWindow,wx.ID_ANY,lbl))
     2730        if hlist:
     2731            btn = wx.Button(G2frame.dataWindow, wx.ID_ANY,'Select\nHistograms')
     2732            topSizer.Add(btn,0,wx.LEFT|wx.RIGHT,15)
     2733            btn.Bind(wx.EVT_BUTTON,onSelectHists)
     2734        topSizer.Add((20,-1))
     2735        topSizer.Add(G2G.HelpButton(G2frame.dataWindow,helpIndex=G2frame.dataWindow.helpKey))
     2736        mainSizer.Add(topSizer)
     2737
     2738        # create table w/headers
     2739        sdlg = G2frame.dataWindow
     2740        fgs = wx.FlexGridSizer(0,len(histnames)+3,0,0)
     2741        fgs.Add(wx.StaticText(sdlg,wx.ID_ANY,'plot\nas X'),0,wx.LEFT|wx.RIGHT,1)
     2742        fgs.Add(wx.StaticText(sdlg,wx.ID_ANY,'plot\nas Y'),0,wx.LEFT|wx.RIGHT,1)
     2743        fgs.Add(wx.StaticText(sdlg,wx.ID_ANY,'Histogram  '),0,WACV|wx.LEFT,14)
     2744        for i,h in enumerate(histnames):
     2745            if len(h[:5].strip()) > 20:
     2746                fgs.Add(G2G.ScrolledStaticText(sdlg,label=h[5:],
     2747                                               dots=False,lbllen=20)
     2748                            ,0,WACV|wx.LEFT|wx.RIGHT,5)
     2749            else:
     2750                fgs.Add(wx.StaticText(sdlg,wx.ID_ANY,h[5:]),0,WACV|wx.LEFT|wx.RIGHT,5)
     2751
     2752        firstRadio = wx.RB_GROUP
     2753        # put non-editable values at top of table (plot as x but not y)
     2754        keylist = ['num']
     2755        lbllist = ['#']
     2756        if 'T' in data['Type'][1]:
     2757            keylist += ['2-theta']
     2758            lbllist += ['2-theta']
     2759        for key,lbl in zip(keylist,lbllist):
     2760            rb = wx.RadioButton(sdlg,wx.ID_ANY,'',style=firstRadio)
     2761            rb.rbindex = len(plotTbl)
     2762            rb.Bind(wx.EVT_RADIOBUTTON,onSelectX)
     2763            plotLabel.append(lbl)
     2764            fgs.Add(rb,0,wx.ALIGN_CENTER|WACV)
     2765            if firstRadio:
     2766                rb.SetValue(True)
     2767                firstRadio = 0           
     2768            fgs.Add((-1,-1)) # skip y checkbutton
     2769            fgs.Add(wx.StaticText(sdlg,wx.ID_ANY,lbl),0,WACV|wx.LEFT,14)
     2770            plotvals = []
     2771            for h in histnames:
     2772                if key == 'num':
     2773                    val = histnum[h]
     2774                else:
     2775                    val = histdict[h][key][1]
     2776                fgs.Add(wx.StaticText(sdlg,wx.ID_ANY,str(val)),
     2777                    0,wx.ALIGN_CENTER|WACV,0)
     2778                plotvals.append(val)
     2779            plotTbl.append(plotvals)
     2780
     2781        # determine what items will be shown based on histogram type
     2782        Items = []
     2783        if 'C' in data['Type'][1]:               #constant wavelength
     2784            if 'Lam1' in data:
     2785                Items = ['Lam1','Lam2','I(L2)/I(L1)']
     2786            else:
     2787                Items = ['Lam','Zero','Polariz.']
     2788            Items += ['U','V','W','X','Y','Z','SH/L','Azimuth']
     2789        elif 'B' in data['Type'][1]:
     2790            Items = ['Azimuth','Lam','Zero','Polariz.','U','V','W','X','Y','Z','alpha-0','alpha-1','beta-0','beta-1']
     2791        elif 'E' in data['Type'][1]:
     2792            Items = ['2-theta','XE','YE','ZE','A','B','C']
     2793        elif 'T' in data['Type'][1]:            # TOF
     2794            Items = ['difC','difA','difB','Zero','alpha','beta-0','beta-1','beta-q','sig-0','sig-1','sig-2','sig-q','X','Y','Z']
     2795        # display the items in the table
     2796        for k in Items:
     2797            plotYsel[k] = plotYsel.get(k,False)
     2798            #if not l: l = k
     2799            l = k
     2800            rb = wx.RadioButton(sdlg,wx.ID_ANY,'',style=firstRadio)
     2801            rb.rbindex = len(plotTbl)
     2802            rb.Bind(wx.EVT_RADIOBUTTON,onSelectX)
     2803            plotLabel.append(l)
     2804            fgs.Add(rb,0,wx.ALIGN_CENTER|WACV)
     2805            if firstRadio:
     2806                rb.SetValue(True)
     2807                firstRadio = 0
     2808            fgs.Add(G2G.G2CheckBox(sdlg,'',plotYsel,k,OnChange=onPrmPlot),0,wx.ALIGN_CENTER|WACV)
     2809            plotIndex[k] = rb.rbindex
     2810            fgs.Add(wx.StaticText(sdlg,wx.ID_ANY,l),0,WACV|wx.LEFT,14)
     2811            plotvals = []
     2812            for h in histnames:
     2813                miniSizer = wx.BoxSizer(wx.HORIZONTAL)
     2814                itemVal = G2G.ValidatedTxtCtrl(sdlg,histdict[h][k],1,nDig=(10,4),typeHint=float)
     2815                plotvals.append(histdict[h][k][1])
     2816                miniSizer.Add(itemVal)
     2817                miniSizer.Add((2,-1))
     2818                miniSizer.Add(G2G.G2CheckBox(sdlg,'',histdict[h][k],2),0,WACV|wx.RIGHT,15)
     2819                fgs.Add(miniSizer,0,wx.ALIGN_CENTER)
     2820            plotTbl.append(plotvals)
     2821           
     2822        mainSizer.Add(fgs)
     2823        G2frame.dataWindow.SetDataSize()
     2824        G2frame.dataWindow.SetSizer(mainSizer)
     2825        G2frame.dataWindow.SendSizeEvent()
     2826        wx.EndBusyCursor()
     2827        # end of MakeMultiParameterWindow
    26432828               
    26442829    # beginning of UpdateInstrumentGrid code   
     
    27112896        G2frame.Bind(wx.EVT_MENU,OnInstFlagCopy,id=G2G.wxID_INSTFLAGCOPY)
    27122897        G2frame.Bind(wx.EVT_MENU,OnCopy1Val,id=G2G.wxID_INST1VAL)
     2898        G2frame.Bind(wx.EVT_MENU,OnInstMult,id=G2G.wxID_INSTSHOWMULT)       
    27132899    elif 'L' in insVal['Type'] or 'R' in insVal['Type']:                   #SASD & REFD data menu commands
    27142900        G2gd.SetDataMenuBar(G2frame,G2frame.dataWindow.SASDInstMenu)
    27152901        G2frame.Bind(wx.EVT_MENU,OnInstCopy,id=G2G.wxID_SASDINSTCOPY)
    2716     MakeParameterWindow()
     2902    menuitem = G2frame.dataWindow.InstMenu.FindItemById(G2G.wxID_INSTSHOWMULT)
     2903    if menuitem.IsChecked():
     2904        MakeMultiParameterWindow()
     2905    else:
     2906        MakeParameterWindow()
    27172907    G2frame.dataWindow.SendSizeEvent()       
    27182908   
Note: See TracChangeset for help on using the changeset viewer.