Changeset 4104 for trunk/GSASIIimgGUI.py


Ignore:
Timestamp:
Aug 20, 2019 9:06:16 PM (4 years ago)
Author:
toby
Message:

new mode for combined fit of wavelength to a set of images

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIimgGUI.py

    r4102 r4104  
    193193               
    194194    def OnRecalibrate(event):
     195        '''Use existing calibration values as starting point for a calibration
     196        fit
     197        '''
    195198        G2img.ImageRecalibrate(G2frame,G2frame.ImageZ,data,masks)
    196199        wx.CallAfter(UpdateImageControls,G2frame,data,masks)
    197200       
    198201    def OnRecalibAll(event):
     202        '''Use existing calibration values as starting point for a calibration
     203        fit for a selected series of images
     204        '''
    199205        Names = G2gd.GetGPXtreeDataNames(G2frame,['IMG ',])
    200206        dlg = G2G.G2MultiChoiceDialog(G2frame,'Image calibration controls','Select images to recalibrate:',Names)
     
    247253        G2plt.PlotExposedImage(G2frame,event=None)
    248254        G2frame.GPXtree.SelectItem(Id)
     255
     256    def OnDistRecalib(event):
     257        '''Assemble rings & calibration input for a series of images with
     258        differing distances
     259        '''
     260        obsArr = np.array([]).reshape(0,4)
     261        parmDict = {}
     262        varList = []
     263        Names = G2gd.GetGPXtreeDataNames(G2frame,['IMG ',])
     264        dlg = G2G.G2MultiChoiceDialog(G2frame,'Image calibration controls','Select images to recalibrate:',Names)
     265        try:
     266            wx.BeginBusyCursor()
     267            if dlg.ShowModal() == wx.ID_OK:
     268                items = dlg.GetSelections()
     269                print('Scanning for ring picks...')
     270#                G2frame.EnablePlot = False
     271                for item in items:
     272                    name = Names[item]
     273                    print ('getting rings for',name)
     274                    G2frame.Image = G2gd.GetGPXtreeItemId(G2frame,G2frame.root,name)
     275                    Data = G2frame.GPXtree.GetItemPyData(G2gd.GetGPXtreeItemId(G2frame,G2frame.Image,'Image Controls'))
     276                    G2frame.ImageZ = GetImageZ(G2frame,Data)
     277                    Data['setRings'] = True
     278                    Mid = G2gd.GetGPXtreeItemId(G2frame,G2frame.Image,'Masks')
     279                    Masks = G2frame.GPXtree.GetItemPyData(Mid)
     280                    result = G2img.ImageRecalibrate(G2frame,G2frame.ImageZ,Data,Masks,getRingsOnly=True)
     281                    if not len(result):
     282                        print('calibrant missing from local image calibrants files')
     283                        return
     284                    # add detector set dist into data array, create a single really large array
     285                    distarr = np.zeros_like(result[:,2:3])
     286                    if 'setdist' not in Data:
     287                        print('Distance (setdist) not in image metadata')
     288                        return
     289                    distarr += Data['setdist']
     290                    obsArr = np.concatenate((
     291                        obsArr,
     292                        np.concatenate((result[:,0:2],distarr,result[:,2:3]),axis=1)),axis=0)
     293                    # create a parameter dict for combined fit
     294                    if 'wavelength' not in parmDict:
     295                        parmDict['wavelength'] = Data['wavelength']
     296                        if Data['varyList']['wave']:
     297                            varList += ['wavelength']
     298                        parmDict['dep'] = Data['DetDepth']
     299                        if Data['varyList']['dep']:
     300                            varList += ['dep']
     301                        # distance flag determines if individual values are refined
     302                        if not Data['varyList']['dist']:
     303                            # starts as zero, single variable, always refined
     304                            parmDict['deltaDist'] = 0.
     305                            varList += ['deltaDist']
     306                        parmDict['phi'] = Data['rotation']
     307                        if Data['varyList']['phi']:
     308                            varList += ['phi']
     309                        parmDict['tilt'] = Data['tilt']
     310                        if Data['varyList']['tilt']:
     311                            varList += ['tilt']
     312                    key = str(int(Data['setdist']))
     313                    if 'deltaDist' not in parmDict:
     314                        # starts as zero, variable refined for each image
     315                         parmDict['delta'+key] = 0
     316                         varList += ['delta'+key]
     317                    for i,z in enumerate(['X','Y']):
     318                        v = 'det-'+z
     319                        if v+key in parmDict:
     320                            print('Error: two images with setdist ~=',key)
     321                            return
     322                        parmDict[v+key] = Data['center'][i]
     323                        if Data['varyList'][v]:
     324                            varList += [v+key]
     325                #GSASIIpath.IPyBreak()
     326                print('\nFitting',len(obsArr.shape[0]),'ring picks...')
     327                result = G2img.FitMultiDist(obsArr,varList,parmDict)
     328                # create a sequential table?
     329#                Id =  G2gd.GetGPXtreeItemId(G2frame,G2frame.root,'Sequential image calibration results')
     330#                if Id:
     331#                    SeqResult = G2frame.GPXtree.GetItemPyData(Id)
     332#                else:
     333#                    Id = G2frame.GPXtree.AppendItem(parent=G2frame.root,text='Sequential image calibration results')
     334                #SeqResult = {'SeqPseudoVars':{},'SeqParFitEqList':[]}
     335#                    vals,varyList,sigList,parmDict,covar = result
     336#                    sigList = list(sigList)
     337#                    if 'dist' not in varyList:
     338#                        vals.append(parmDict['dist'])
     339#                        varyList.append('dist')
     340#                        sigList.append(None)
     341#                    vals.append(Data.get('setdist',Data['distance']))
     342#                    # add setdist to varylist etc. so that it is displayed in Seq Res table
     343#                    varyList.append('setdist')
     344#                    sigList.append(None)
     345#                    covar = np.lib.pad(covar, (0,1), 'constant')
     346#                    vals.append(Data.get('samplechangerpos',Data['samplechangerpos']))
     347#                    varyList.append('chgrpos')
     348#                    sigList.append(None)
     349                   
     350#                    SeqResult[name] = {'variables':vals,'varyList':varyList,'sig':sigList,'Rvals':[],
     351#                        'covMatrix':covar,'title':name,'parmDict':parmDict}
     352#                SeqResult['histNames'] = Names               
     353#                G2frame.GPXtree.SetItemPyData(Id,SeqResult)
     354        finally:
     355            dlg.Destroy()
     356            wx.EndBusyCursor()
     357
     358#        print ('All selected images recalibrated - results in Sequential image calibration results')
     359#        G2frame.G2plotNB.Delete('Sequential refinement')    #clear away probably invalid plot
     360#        G2plt.PlotExposedImage(G2frame,event=None)
     361#        G2frame.GPXtree.SelectItem(Id)
     362
    249363       
    250364    def OnClearCalib(event):
     
    12871401    G2frame.Bind(wx.EVT_MENU, OnRecalibrate, id=G2G.wxID_IMRECALIBRATE)
    12881402    G2frame.Bind(wx.EVT_MENU, OnRecalibAll, id=G2G.wxID_IMRECALIBALL)
     1403    G2frame.Bind(wx.EVT_MENU, OnDistRecalib, id=G2G.wxID_IMDISTRECALIB)
    12891404    G2frame.Bind(wx.EVT_MENU, OnClearCalib, id=G2G.wxID_IMCLEARCALIB)
    12901405#    if data.get('calibrant'):
Note: See TracChangeset for help on using the changeset viewer.