def findWorldPosition(self, write=False): # Convert the GRB pixel position to WCS # Make the input file for the IRAF task if self._pixelx == "" or self._pixely == "": print "You did not set an pixel x or pixel y" return 1 coordfilenamein = "%s" % (self._parentimage.replace(".fits", "_skyctran_pixel_in.coo")) coordfilenameout = "%s" % (self._parentimage.replace(".fits", "_skyctran_pixel_out.coo")) try: self.cleanOutputFiles(coordfilenameout) except: print "Error cleaning files" print sys.exc_info()[0] try: coordout = open(coordfilenamein, "w") coordout.write("%10.7f %10.7f" % (self._pixelx, self._pixely)) coordout.close() except: print "File opening failed:" print sys.exc_info()[0] # This subroutine lies in imcoords on IRAF iraf.image() iraf.imcoords() # Set the parameters of skyctran # # input # output # insystem: input coordinate system # outsystem: output coordinate system # lngcolu: RA column no. # latcolu: DEC column no. # ilnguni: RA input coord type # ilnlatuni: DEC input coord type # olnguni: RA output coord type # olatuni: DEC output coord type # ilngfor: RA input float format # ilatfor: DEC input float format # olngfor: RA output float format # olatfor: DEC output float format iraf.skyctran.setParam('input', coordfilenamein) iraf.skyctran.setParam('output', coordfilenameout) iraf.skyctran.setParam('insystem', '%s logical' % self._parentimage) iraf.skyctran.setParam('outsystem', '%s world' % self._parentimage) iraf.skyctran.setParam('lngcolu', '1') iraf.skyctran.setParam('latcolu', '2') iraf.skyctran.setParam('ilnguni', 'logical') iraf.skyctran.setParam('ilatuni', 'logical') iraf.skyctran.setParam('olnguni', 'degrees') iraf.skyctran.setParam('olatuni', 'degrees') iraf.skyctran.setParam('ilngfor', '%10.7f') iraf.skyctran.setParam('ilatfor', '%10.7f') iraf.skyctran.setParam('olngfor', '%10.3f') iraf.skyctran.setParam('olatfor', '%10.3f') iraf.skyctran.setParam('verbose', 'yes') # savepars skyctran = "skyctranpars.par" #iraf.skyctran.saveParList(skyctran) # run skyctran tmp = iraf.skyctran(mode='h', Stdout=1) # Set properties of this object from the output try: coordfile = open(coordfilenameout, "r") # parse the input file coords = coordfile.readlines() coordfile.close() for coord in coords: if coord[0] != "#" and coord[0] != "\n": coordinates = [i for i in coord.replace("\n","").split(" ") if i != ""] # Set the object parameters self._ra = float(coordinates[2]) self._dec = float(coordinates[3]) except: print "File opening failed" print sys.exc_info()[0] # region file for object of interest if write: try: regionout = open("%s" % (self._parentimage.replace(".fits", "_skyctran_object.reg")), "w") if self._MEDFWHM == "": circ = 4.0 else: circ = self._MEDFWHM*1.5 regionout.write("image; circle(%f,%f,%f) # color = red\n" % (self._pixelx, self._pixely, circ)) regionout.close() except: print "Unexpected error:" print sys.exc_info()[0]
def performPhotometry(task, logger): #iraf.prcacheOff() [iraf.unlearn(t) for t in ('phot','pstselect','psf','allstar')] iraf.set(imtype="fits,noinherit") # set image output format iraf.set(clobber="yes") hdu=pyfits.open(task['images'])[0] hdr = hdu.header imdata = hdu.data for key,value in task['fits'].iteritems(): task[key] = hdr.get(value,1) #Sextractor to find stars; add an object for the force detect logger.info('Running SExtractor on [%s]' % os.path.basename(task['images'])) sex = sextractor.SExtractor() makeSexConfig(sex,task) sex.run(task['images']) catalog = sex.catalog() #Set up image parameters MIN_X = max(1,int(task['numpixx']*task['filtfactor'])) MIN_Y = max(1,int(task['numpixy']*task['filtfactor'])) MAX_X = int(task['numpixx']*(1-task['filtfactor'])) MAX_Y = int(task['numpixy']*(1-task['filtfactor'])) AREAXY = '[%s:%s,%s:%s]' % (MIN_X, MAX_X, MIN_Y, MAX_Y) AREANO = '[%s:%s,%s:%s]' % (MIN_X, MAX_X-2*MIN_X, MIN_Y, MAX_Y-2*MIN_Y) try: task['pixscale'] = abs(hdr.get('CD1_1'))*3600. except TypeError: task['pixscale'] = abs(hdr.get('CDELT1'))*3600. task['seeing'] = np.median( sorted([i['FWHM_IMAGE'] for i in catalog])[:int(-len(catalog)*0.5)] ) #Take the median of the "bottom" 50% of objects logger.info('--> %s SExtractor detected bright objects in the field' % (len(catalog),) ) logger.info('--> %0.2f median FWHM of bright objects in the field, in arcsec' % (task['seeing']*task['pixscale'],)) task['objects'] = [(i['ALPHA_J2000'],i['DELTA_J2000']) for i in catalog] task['objects'].append(task['objwcs']) task['objectlist'] = open(os.path.join(task['output_directory'],'objectlist'),'w') task['objectlist'].write('\n'.join([' %s %s' % (i[0],i[1]) for i in task['objects']])) task['objectlist'].close() logger.info('Running iraf.imstat') irafoutput = iraf.imstat(images=task['images']+AREANO,fields='midpt,min,max,stddev', format=0, Stdout=1) task['nimgs'] = hdr.get('NIMGS',1) task['gain'] *= task['nimgs']*2/3. task['ron'] *= np.sqrt(task['nimgs'])/task['nimgs']*constants.INTERPSM[task['band']] task['datamean'], task['datamin'], task['datamax'], task['datastdev'] = map(float, irafoutput[0].split()) irafoutput = iraf.imstat(images=task['images'],fields='stddev,midpt',nclip=25,format=0,cache='yes',Stdout=1) task['skynoise'], task['datamean'] = map(float, irafoutput[0].split() ) task['skynoise'] *= constants.INTERPSM[task['band']] task['airmass'] = hdr.get('AIRMASS',1) task['zmag'] -= (float(task['airmass'])-1.0)*constants.extinction_coefficients[task['band']] task['match_proximity'] = 2.5 * task['seeing'] logger.info('--> %5.2f counts: Sky noise, corrected for drizzle imcombine' % task['skynoise']) logger.info('--> %5.2f Median count value, after background subtraction' % task['datamean']) logger.info('--> %5.2f Airmass' % task['airmass']) #prepare temp files that iraf will use for filename in ('photfile','pstfile','psfimg','opstfile','groupfile','allstarfile','rejfile','subimage'): task[filename] = open(os.path.join(task['output_directory'],filename),'w') task[filename].close() #iraf.phot to get APP magnitudes logger.info('Running iraf.apphot.phot') #apsizes = [i*task['faperture']*task['seeing'] for i in (0.4,0.5,0.6,0.8,1.0,1.2,1.5,2.0,2.5,3.0)] #irafapsizes = ','.join(['%.2f' % i for i in apsizes]) irafapsizes = '%0.2f' % (task['faperture']*task['seeing']) kwargs = dict(image=task['images'],coords=task['objectlist'].name, output=task['photfile'].name, interac='no',scale=1, fwhmpsf=task['seeing'], wcsin='world', wcsout='physical', sigma=task['skynoise'], datamin=task['datamin'], datamax=task['datamax'], readnoi=task['ron'], epadu=task['gain'], itime=task['exposure'], xairmass=task['airmass'], ifilter=task['band'], otime=task['dateobs'], aperture= irafapsizes, zmag=task['zmag'], annulus=task['fannulus']*task['seeing'], dannulus=task['fdannulus']*task['seeing'], calgorithm='gauss', cbox = 1.5*task['seeing'], maxshift=2.0*task['seeing'], mode="h",Stdout=1,verify=0) iraf.phot(**kwargs) if task['band'] not in constants.infrared: #iraf.pstselect to choose objects for PSF modelling logger.info('Running iraf.daophot.pstselect') kwargs = dict(image=task['images'], photfile=task['photfile'].name,pstfile=task['pstfile'].name, maxnpsf=task['pstnumber'], wcsin='physical', wcsout='physical', interac="no",verify='no',scale=1, fwhmpsf=task['seeing'], datamin=0, datamax=task['datamax'], psfrad=3.0*task['seeing'], fitrad=1.0*task['seeing'], recente='yes', nclean=task['nclean'], mode="h",Stdout=1) iraf.pstselect(**kwargs) #iraf.psf to model PSF logger.info('Running iraf.daophot.psf') kwargs = dict( image=task['images'], photfile=task['photfile'].name, pstfile=task['pstfile'].name, psfimage=task['psfimg'].name, opstfile=task['opstfile'].name, groupfile=task['groupfile'].name, wcsin='physical',wcsout='physical', interac="no",verify="no",scale=1, fwhmpsf=task['seeing'], sigma=task['skynoise'], datamin=task['datamin'], datamax=task['datamax'], readnoi=task['ron'], epadu=task['gain'], itime=task['exposure'], xairmass=task['airmass'], ifilter=task['band'], otime=task['dateobs'], function=task['func'], varorder=task['varorder'], saturat='no', psfrad=3.0*task['seeing'], fitrad=1.*task['faperture']*task['seeing'], nclean=task['nclean'], mergerad=1.5*task['seeing'], mode='h',Stdout=1) iraf.psf(**kwargs) logger.info('Running iraf.daophot.allstar') #iraf.allstars to compute PSF photometry; recenter with recenter='yes', mergerad=<value> to avoid duplicate detection kwargs = dict(image=task['images'], photfile=task['photfile'].name, wcsin='physical', wcsout='physical', psfimage=task['psfimg'].name, allstarf=task['allstarfile'].name, rejfile=task['rejfile'].name, subimage=task['subimage'].name, verbose=1,verify='no',scale=1, fwhmpsf=task['seeing'], sigma=task['skynoise'], datamin=task['datamin'], datamax=task['datamax'], readnoi=task['ron'], epadu=task['gain'], itime=task['exposure'], xairmass=task['airmass'], ifilter=task['band'], otime=task['dateobs'], function=task['func'], varorder=task['varorder'], psfrad=3.*task['seeing'], fitrad=1.*task['faperture']*task['seeing'], recenter='yes', mergerad=1.5*task['seeing'], mode='h',Stdout=1) iraf.allstar(**kwargs) #Parse both photometry, convert to RA,DEC,MAG,MAGERR logger.info('iraf tasks complete. Parsing results and calibrating') photometry = {} photometry['APP'] = iraf.txdump(textfiles=task['photfile'].name, fields='XCENTER,YCENTER,MAG,MERR',expr='yes', headers='no',Stdout=1) if task['band'] not in constants.infrared: photometry['PSF'] = iraf.txdump(textfiles=task['allstarfile'].name, fields='XCENTER,YCENTER,MAG,MERR',expr='yes', headers='no',Stdout=1) for phototype in photometry: kwargs = dict(input='STDIN', output='STDOUT', insystem='%s physical' % task['images'], outsystem='%s world' % task['images'], ilatuni='physical', ilnguni='physical', olnguni='degrees', olatuni='degrees', ilngfor='%10.7f', ilatfor='%10.7f', olngfor='%10.5f', olatfor='%10.5f', Stdin=photometry[phototype],Stdout=1) photometry[phototype] = [i.split() for i in iraf.skyctran(**kwargs) if i and not i.startswith('#') and 'INDEF' not in i] photometry[phototype] = [map(float,(i[4],i[5],i[2],i[3])) for i in photometry[phototype] ] #Now we have [(ra,dec,'mag','mageerr'),...] results = calibrate((task['objwcs'][0],task['objwcs'][1]),task,photometry,logger) # if 'PSF' not in results: return results