예제 #1
0
def _findxycenter(hdr, im,ext,log):

    def xy_tran(out):
        """
          Function to transform blue coordinates to red frame coordinates
        """
        xref = out[1] - 990.5897
        yref = out[0] - 37.82109
        x = -0.9985259*xref - 0.0178984*yref
        y = -0.0181331*xref + 0.9991414*yref
        return y,x
    
    #hdr = pf.getheader(file)
    #im = pf.getdata(file)
    xcen = hdr.get('xcen')
    ycen = hdr.get('ycen')
    if (xcen == None):
        #ratio,xc,yc = peak2halo('',image=im)
        #xcen = xc
        #ycen = yc
        #if (xcen < 0 or ycen < 0):
        if True:
            if ext == 2:
                # register blue frame to red's frame coordinate system
                im = nd.geometric_transform (im,xy_tran)


            try:
                ndis.display(im,zscale=False)
            except IOError,err:
                sys.stderr.write('\n ***** ERROR: %s Start DS9.\n' % str(err))
                sys.exit(1)
            print " Mark center with left button, then use 'q' to continue, 's' to skip."
            cursor = ndis.readcursor(sample=0)
            cursor = cursor.split()
            if cursor[3] == 's':
                hdr.update("XCEN",-1, "Start mask x-center")
                hdr.update("YCEN",-1, "Start mask y-center")
                updated = True 
                print '\nFrame skipped... ****Make sure not to use it in your science script. ***\n'
                #return updated,xcen,ycen,im
                return xcen,ycen,im
            x1 = float(cursor[0])
            y1 = float(cursor[1])

            xcen,ycen = gcentroid(im, x1,y1,9)
            xcen = xcen[0]
            ycen = ycen[0]
 
            hdr.update("XCEN",xcen, "Start mask x-center")
            hdr.update("YCEN",ycen, "Start mask y-center")
            log.info('                    (%.2f,%.2f) :: ' % (xcen,ycen)+('red','blue')[ext-1])
예제 #2
0
    def getCpoints(self):
        """
          Get control points from a pair of Red and Blue pinholes
          frames from the NICI camera.
          You already have frames 1 and 2 (red and blue)
          from a pinhole image up in DS9.
          Please select at least 6 corresponding points. 

          Once you click 'r' in the Red frame, a red circle is drawn
          around the pinhole and a Blue circle is drawn 'near' the
          blue pinhole; click 'b' there to record the position.
          Press 'q' to finish.
        """
 
        i=0; j=0
        xkey = ''
        print "*** Please get at least 6 corresponding pinholes."
        while xkey != 'q':
            cursor = ndis.readcursor(sample=0)
            ss = cursor.split()
            print ss
            xkey = ss.pop()
            if xkey not in ('r','b','q'):
               print "Please choose a control point on the 'r' or 'b' frame,"
               print " then hit 'r' for red frame or 'b' for 'blue' frame"
               continue
            im = {'r':self.imr, 'b':self.imb, 'q':0}[xkey]
            if xkey == 'q': break
            
            x,y = np.asfarray(ss[:2])
            xc,yc = gcentroid(im[y-10:y+10,x-10:x+10],10,10)
            xc,yc = x+xc[0]-10,y+yc[0]-10

            if xkey == 'r':
                #print "xc,yc: ",xc,yc,x+xc-10,y+yc-10
                self.xyr[i] = xc,yc; i+=1
                ov.circle(x=xc,y=yc,radius=10,color=ov.C_RED,frame=1)
                xn = 990.5897 - 0.9985259*x - 0.0178984*y
                yn = 37.82109 - 0.0181331*x + 0.9991414*y
                #xc,yc = gcentroid(self.imb[yn-13:y+13,xn-13:x+13],13,13)
                #xc,yc = xn+xc[0]-10,yn+yc[0]-10
                ov.circle(x=xn,y=yn,radius=10,color=ov.C_BLUE, frame=2)
                print self.xyr[i-1]
            if xkey == 'b':
                self.xyb[j] = xc,yc; j+=1
                print self.xyb[j-1]
            
        self.npin = j
        self.xyr = np.resize(self.xyr,[j,2])
        self.xyb = np.resize(self.xyb,[j,2])
예제 #3
0
def nici_cntrd(im,hdr,center_im=True):
    """
    Read xcen,ycen and update header if necessary
    If the automatic finding of the center mask fails, then
    the interactive session will start. The SAOIMAGE/ds9
    display must be up. If the default port is busy, then it will
    use port 5199, so make sure you start "ds9 -port 5199".
    """

    xcen = hdr.get('xcen')
    ycen = hdr.get('ycen')
    updated = False
    if (xcen == None):
        ratio,xc,yc = peak2halo('',image=im)
        #xcen = xc[0]
        #ycen = yc[0]
        xcen = xc
        ycen = yc
        if (xcen < 0 or ycen < 0):
            try:
                ndis.display(im)
            except IOError,err:
                sys.stderr.write('\n ***** ERROR: %s Start DS9.\n' % str(err))
                sys.exit(1)
            print " Mark center with left button, then use 'q' to continue, 's' to skip."
            cursor = ndis.readcursor(sample=0)
            cursor = cursor.split()
            if cursor[3] == 's':
                hdr.update("XCEN",-1, "Start mask x-center")
                hdr.update("YCEN",-1, "Start mask y-center")
                updated = True 
                print '\nFrame skipped... ****Make sure not to use it in your science script. ***\n'
                #return updated,xcen,ycen,im
                return xcen,ycen,im
            x1 = float(cursor[0])
            y1 = float(cursor[1])


            box = im[y1-64:y1+64,x1-64:x1+64].copy()
            box -= scipy.signal.signaltools.medfilt2d(np.float32(box),11)
            box = box[32:32+64,32:32+64]

            bbx = box * ((box>(-robust_sigma(box)*5)) & \
                         (box <(15*robust_sigma(box))))

            imbb = congrid(bbx,(1024,1024))
            ndis.display(imbb, name='bbx')
            del imbb

            cursor = ndis.readcursor(sample=0)
            cursor = cursor.split()
            x2 = float(cursor[0])
            y2 = float(cursor[1])

            xcen,ycen = gcentroid(box, x2/16., y2/16., 4)

            xcen = (xcen+x1)[0] - 32
            ycen = (ycen+y1)[0] - 32

        hdr.update("XCEN",xcen, "Start mask x-center")
        hdr.update("YCEN",ycen, "Start mask y-center")

        updated = True 
예제 #4
0
def pyexam(scidata, function='both', pixelscale=1, frame=1, \
           outFile='testout.txt', verbose=True, pymark=True, \
           residuals=False, clip=True, sigma=3, boxSize=9., \
           debug=False, niters=4.):
        import pylab

        from iqtool.gemplotlib import overlay
        
        # Get box size around each object
        apertureSize = fit.getApSize(pixelscale, boxSize)
 
        outstring = '%10s%12s%12s%12s%12s%12s%12s%12s%12s%12s%12s%12s%12s%12s%12s%12s%12s\n'%('function', 'Cx', 'Cy', 'Bg', 'Peak', 'Wx', 'Wy', 'CooX', 'CooY', 'Ellipticity', 'FWHM_pix','FWHM_arcsec', 'Theta', 'PA_deg', ' FWHMx', 'FWHMy', 'Beta')

        outFile.write(outstring)

        print 'PYEXAM - Please select objects using spacebar, and press \'q\' when finished'
        print '         pressing k, j, r, or  e will make plots along with fits'
        keystroke = ''
        numdisplay.display(scidata, z1=scidata.mean()-scidata.std(),
                           z2=scidata.mean()+scidata.std(), frame=frame)     
        if verbose:
            print '%10s%12s%12s%12s%12s%12s%12s'%('function', 'Coox', 'CooY', 'FWHMpix',
                                                  'FWHMarcsec', 'Ellipticity', 'PAdeg')
      
        gAllstars = []
        mAllstars = []
        done = 'no'
        while done == 'no':
            # Get x,y
            
            cursorInput = numdisplay.readcursor(sample=0)
            components = cursorInput.split()
            xPos = float(components[0])
            yPos = float(components[1]) 
            keystroke = components[3]
            option = ''
            if keystroke == '\\040' or keystroke == 'a' or keystroke == 'k' or keystroke == 'j' or keystroke == 'e' or keystroke == 'r':
                print 'PYEXAM - X:',xPos,'Y:',yPos
                gfitArray=None
                mfitArray=None
                gfxn=None
                mfxn=None
                
                positionCoords = (xPos,yPos)

                stampArray, stampPars = fit.makeStamp(scidata, positionCoords,
                                          apertureSize, outFile, debug=debug)
                
                if stampArray == None: return None, None

                gfitPars, gReturnModel, mfitPars, mReturnModel = \
                    fit.fitprofile(stampArray, function, positionCoords, \
                    outFile, pixelscale, stampPars, debug=debug, frame=frame)

                imageDim = list(scidata.shape) # Gives [y,x] dimensions
                #imageDim.reverse() #give [x,y] dimensions
                
                if gfitPars != None:
                    clipobsPars = ('gauss', gfitPars['CooX'], gfitPars['CooY'],
                                   gfitPars['FWHMpix'],
                                   gfitPars['FWHMarcsec'], gfitPars['Ellip'],
                                   gfitPars['PAdeg'])
                    iqUtil.printPars(clipobsPars, verbose)
                    gAllstars.append(gfitPars)

                    if pymark:
                        overlay.circle(x=gfitPars['CooX']-1,y=gfitPars['CooY']-1, \
                                       radius=gfitPars['FWHMpix'],frame=frame,\
                                       color=204)

                    gfxn = gReturnModel((gfitPars['Bg'], gfitPars['Peak'], \
                                           gfitPars['Cy'], \
                                           gfitPars['Cx'], gfitPars['Wy'], \
                                           gfitPars['Wx'], gfitPars['Theta']+90))

                    gfitArray = np.zeros(imageDim)
                    gfitArray[0:stampPars[3],0:stampPars[1]] = gfxn(*np.indices((stampPars[3], stampPars[1])))
                    
                 
                if mfitPars != None:
                    clipobsPars = ('moffat', mfitPars['CooX'],mfitPars['CooY'],
                                   mfitPars['FWHMpix'],
                                   mfitPars['FWHMarcsec'], mfitPars['Ellip'],
                                   mfitPars['PAdeg'])
                      
                    iqUtil.printPars(clipobsPars, verbose)
                    print mfitPars['CooX']
                    print mfitPars['CooY']
                    print mfitPars['Cx']
                    print mfitPars['Cy']

                    
                    mAllstars.append(mfitPars)
                    if pymark:
                        overlay.circle(x=mfitPars['CooX'],
                                       y=mfitPars['CooY'], frame=frame,
                                       radius=mfitPars['FWHMpix'], color=212)

                    mfxn = mReturnModel((mfitPars['Bg'], mfitPars['Peak'], \
                                        mfitPars['Cy'],\
                                        mfitPars['Cx'], mfitPars['Wy'], \
                                        mfitPars['Wx'], mfitPars['Theta']+90, \
                                        mfitPars['Beta']))
                    mfitArray = np.zeros(imageDim)
                    mfitArray[0:stampPars[3],0:stampPars[1]] = mfxn(*np.indices((stampPars[3], stampPars[1])))

                                   
   
                if keystroke == 'k':
                    print "PYEXAM - Yslice Plotting"
                    pylab.clf()
                    pylab.plot(stampArray.max(0), 'ro')
                    if mfitArray != None:
                        pylab.plot(mfitArray.max(0), 'b', label='moffat fit FWHM='+str(mfitPars['FWHMarcsec']))
                        pylab.axis([0,stampPars[1]-stampPars[0],mfitPars['Bg'],1.3*(mfitPars['Bg']+mfitPars['Peak'])])
                    if gfitArray != None:
                        pylab.plot(gfitArray.max(0), 'g',label='gauss fit FWHM='+str(gfitPars['FWHMarcsec']))
                        pylab.axis([0,stampPars[1]-stampPars[0],gfitPars['Bg'],1.3*(gfitPars['Bg']+gfitPars['Peak'])])
                    pylab.legend()

                if keystroke == 'j':
                    print "PYEXAM - Xslice Plotting"
                    pylab.clf()
                    pylab.plot(stampArray.max(1), 'ro')
                    if mfitArray != None:
                        pylab.plot(mfitArray.max(1), 'b', label='moffat fit FWHM='+str(mfitPars['FWHMarcsec']))
                        pylab.axis([0,stampPars[1]-stampPars[0],mfitPars['Bg'],1.3*(mfitPars['Bg']+mfitPars['Peak'])])
                    if gfitArray != None:
                        pylab.plot(gfitArray.max(1), 'g',label='gauss fit FWHM='+str(gfitPars['FWHMarcsec']))
                        pylab.axis([0,stampPars[1]-stampPars[0],gfitPars['Bg'],1.3*(gfitPars['Bg']+gfitPars['Peak'])])
                    pylab.legend()

                if keystroke == 'r':
                    print "PYEXAM - radial Plotting doesnt work yet!"
                    print "new version"
                    #rad1 = np.sqrt(stampArray.max(1)**2 + stampArray.max(0)**2)
                    pylab.clf()
                    pylab.plot(stampArray.max(1), 'ro')
                    if mfitArray != None:
                        pylab.plot(mfitArray.max(1), 'b', label='moffat fit FWHM='+str(mfitPars['FWHMarcsec']))
                        pylab.axis([0,stampPars[1]-stampPars[0],mfitPars['Bg'],1.3*(mfitPars['Bg']+mfitPars['Peak'])])
                    if gfitArray != None:
                        pylab.plot(gfitArray.max(1), 'g',label='gauss fit FWHM='+str(gfitPars['FWHMarcsec']))
                        pylab.axis([0,stampPars[1]-stampPars[0],gfitPars['Bg'],1.3*(gfitPars['Bg']+gfitPars['Peak'])])
                    pylab.legend()
                    
                    

                if keystroke == 'e':
                    print 'PYEXAM - Plotting contours'
                    pylab.clf()
                    pylab.contour(stampArray)
                                
            elif keystroke == 'q':
                done = 'yes'
                if verbose: print "Done looping through stars"

        if clip:
            if gAllstars:
                if verbose: print "# PYEXAM - performing Gaussian clipping"

                gAllstars, gEllMean, gEllSigma, gFWHMMean, gFWHMSigma = \
                   iqUtil.sigmaClip(gAllstars, outFile, sigma, verbose, niters, garbageStat=garbageStat)
            
                if verbose:
                    print "PYEXAM - Mean Gaussian Ellipticity:", gEllMean
                    print "PYEXAM - Mean Gaussian FWHM (""):", gFWHMMean
                    
            if mAllstars:
                if verbose: print "# PYEXAM - performing Moffat clipping"

                mAllstars, mEllMean, mEllSigma, mFWHMMean, mFWHMSigma = \
                   iqUtil.sigmaClip(mAllstars, outFile, sigma, verbose, niters, garbageStat=garbageStat)

                if verbose:
                    print "PYEXAM - Mean Moffat Ellipticity:", mEllMean
                    print "PYEXAM - Mean Moffat FWHM (""):", mFWHMMean
         

        for star in gAllstars:
            iqUtil.writePars(star, outFile, 'gaussian')

        for star in mAllstars:
            iqUtil.writePars(star, outFile, 'moffat')