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])
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])
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
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')