Changeset 261


Ignore:
Timestamp:
Mar 11, 2011 2:06:54 PM (11 years ago)
Author:
vondreele
Message:

new fortran fellipse - for fitting ellipses!
GSASIIplot.py - change calibration start to RB not on a point, more foolproof than the shift method
GSASIIimgGUI.py - change status text to reflect above & add another place to dmin
GSASIIimage.py - implement fellipse & tighten up the fitting process

Location:
trunk
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIimage.py

    r257 r261  
    1515import GSASIIplot as G2plt
    1616import GSASIIlattice as G2lat
     17import fellipse as fel
    1718
    1819# trig functions in degrees
     
    5657                   
    5758def FitRing(ring):
    58     Err,parms = FitCircle(ring)
    59     Err /= len(ring)
    60 #    print 'circle error:','%8f'%(Err)
    61     if Err > 20000.:
    62         eparms = FitEllipse(ring)
    63         if eparms:
    64             parms = eparms
     59    err,parms = FitEllipse(ring)
     60    errc,parmsc = FitCircle(ring)
     61    errc = errc[0]/(len(ring)*parmsc[2][0]**2)
     62#    print 'Ellipse?',err,parms
     63#    print 'Circle? ',errc,parmsc
     64    if not parms or errc < .1:
     65        parms = parmsc
    6566    return parms
    6667       
     
    115116    M = np.array((x**2-y**2,x*y,x,y,np.ones_like(x)))
    116117    B = np.array(-(x**2+y**2))
    117     result = nl.lstsq(M.T,B)
    118     return makeParmsEllipse(result[0])
     118    bb,err = fel.fellipse(len(x),x,y,1.E-7)
     119    return err,makeParmsEllipse(bb)
    119120   
    120121def FitDetector(rings,p0,wave):
     
    172173    sphi = sind(phi)
    173174    ring = []
    174     for a in range(-180,180,2):
     175    for a in range(-180,180,1):
    175176        x = radii[0]*cosd(a)
    176177        y = radii[1]*sind(a)
     
    184185            Y /= scaley
    185186            ring.append([X,Y,dsp])
    186     if len(ring) < 10:             #want more than 20deg
     187    if len(ring) < 20:             #want more than 20 deg
    187188        return []
    188189    return ring
     
    334335        return False
    335336       
    336     #setup 180 points on that ring for "good" fit
     337    #setup 360 points on that ring for "good" fit
    337338    Ring = makeRing(1.0,ellipse,pixLimit,cutoff,scalex,scaley,self.ImageZ)
    338339    if Ring:
     
    405406            dist = calcDist(radii,tth)
    406407            distR = 1.-dist/data['distance']
    407             if abs(distR) > 0.1:
    408                 print distR,dist,data['distance']
    409                 del data['rings'][-1]
     408            if abs(distR) > 0.01:
     409#                print distR,dist,data['distance']
     410#                del data['rings'][-1]
    410411                continue
    411412            if distR > 0.001:
     
    415416            else:
    416417                ellipse = newellipse
    417                 if abs((radii[1]/radii[0]-ratio)/ratio) > 0.01:
     418                if abs((radii[1]/radii[0]-ratio)/ratio) > 0.1:
    418419                    print 'Bad fit for ring # %i. Try reducing Pixel search range'%(i)
    419420                    return False
  • trunk/GSASIIimgGUI.py

    r258 r261  
    6969        except ValueError:
    7070            pass
    71         calibDmin.SetValue("%.1f"%(data['calibdmin']))          #reset in case of error 
     71        calibDmin.SetValue("%.2f"%(data['calibdmin']))          #reset in case of error 
    7272               
    7373    def OnAzmthOff(event):
     
    189189        data['setRings'] = False
    190190        setRings.SetValue(data['setRings'])
    191         self.dataFrame.GetStatusBar().SetStatusText('Select > 4 points on 1st used ring; LB to pick, RB to delete; shift LB to finish')
     191        self.dataFrame.GetStatusBar().SetStatusText('Select > 4 points on 1st used ring; LB to pick, RB on point to delete else RB to finish')
    192192        self.ifGetRing = True
    193193       
     
    533533    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Min calib d-spacing '),0,
    534534        wx.ALIGN_CENTER_VERTICAL)
    535     calibDmin = wx.TextCtrl(parent=self.dataDisplay,value=("%.1f" % (data['calibdmin'])),
     535    calibDmin = wx.TextCtrl(parent=self.dataDisplay,value=("%.2f" % (data['calibdmin'])),
    536536        style=wx.TE_PROCESS_ENTER)
    537537    calibDmin.Bind(wx.EVT_TEXT_ENTER,OnCalibDmin)
  • trunk/GSASIIplot.py

    r259 r261  
    10391039            if Ypos and not Page.toolbar._active:         #make sure zoom/pan not selected
    10401040                if event.button == 1:
    1041                     if event.key == 'shift':                #terminate picking?
    1042                         print 'LB shift'
    1043                         self.dataFrame.GetStatusBar().SetStatusText('Calibrating...')
    1044                         if G2img.ImageCalibrate(self,Data):
    1045                             self.dataFrame.GetStatusBar().SetStatusText('Calibration successful')
    1046                             print 'Calibration successful'
    1047                         else:
    1048                             self.dataFrame.GetStatusBar().SetStatusText('Calibration failed')
    1049                             print 'Calibration failed'
    1050                         self.ifGetRing = False
    1051                         G2imG.UpdateImageControls(self,Data,Masks)
    1052                         return
    10531041                    Xpix = Xpos*scalex
    10541042                    Ypix = Ypos*scaley
     
    10601048                        ypos /= scaley
    10611049                        Data['ring'].append([xpos,ypos])
     1050                elif event.button == 3:
     1051                    print 'LB shift'
     1052                    self.dataFrame.GetStatusBar().SetStatusText('Calibrating...')
     1053                    if G2img.ImageCalibrate(self,Data):
     1054                        self.dataFrame.GetStatusBar().SetStatusText('Calibration successful - Show ring picks to check')
     1055                        print 'Calibration successful'
     1056                    else:
     1057                        self.dataFrame.GetStatusBar().SetStatusText('Calibration failed - Show ring picks to diagnose')
     1058                        print 'Calibration failed'
     1059                    self.ifGetRing = False
     1060                    G2imG.UpdateImageControls(self,Data,Masks)
     1061                    return
    10621062                PlotImage(self,newImage=False)
    10631063            return
Note: See TracChangeset for help on using the changeset viewer.