"""
Calibrate the input files using astrometry.net.

This can only run after some initial processing, done by fixIncoming.py;
the test a header has been fixed is by checking whether BSCALE==-1
"""

import os
import shutil

from gavo.utils import pyfits
from gavo.helpers import processing


class KapteynAnetProcessor(processing.AnetHeaderProcessor):
	headerExt = ".calhdr"
	sp_endob = 100
	sp_plots = False
	sp_indices_015 = ["index-4112.fits", "index-4111.fits",
		"index-4110.fits", "index-4109.fits",]
	sp_indices_080 = ["index-4110.fits", "index-4109.fits",
		"index-4108.fits", "index-4107.fits", "index-206.fits", "index-205.fits"]

	sp_total_timelimit = 100

	sexControl_015 = """DETECT_TYPE CCD
		DETECT_MINAREA   130
		DETECT_THRESH    8
		SEEING_FWHM      2.2
		"""
	sexControl_080 = """DETECT_TYPE CCD
		DETECT_THRESH    6
		SEEING_FWHM      1.2
		"""

	def objectFilter(self, inName):
		"""throws out funny-looking objects from inName and throws out objects
		near the border.
 		"""
		shutil.copy(inName, "origData.fits")
		hdulist = pyfits.open(inName)
		data = hdulist[1].data
		width = max(data.field("X_IMAGE")) # XXX TODO: get from image
		height = max(data.field("Y_IMAGE"))

		data = data[data.field("ELONGATION")<1.5]

		badBorder = 0.15
		data = data[data.field("X_IMAGE")>width*badBorder]
		data = data[data.field("X_IMAGE")<width-width*badBorder]
		data = data[data.field("Y_IMAGE")>height*badBorder]
		data = data[data.field("Y_IMAGE")<height-height*badBorder]
		hdu = pyfits.BinTableHDU(data)
		hdu.writeto("foo.xyls")
		hdulist.close()
		os.rename("foo.xyls", inName)

	def historyFilter(self, value):
		return not ("Created by" in value
			or "more details" in value
			or "Subversion" in value
			or "svn+ssh" in value
			or "2007)" in value)

	def classify(self, srcName):
		hdr = self.getPrimaryHeader(srcName)
		if hdr.has_key("CRVAL1"):
			return "calibrated"
		return "not calibrated"

	def _isProcessed(self, srcName):
		return self.classify(srcName)=="calibrated"

	def _runAnet(self, srcName):
		# pot015 needs different sextractor parameters than pot080
		if "POT015" in srcName:
			self.sexControl = self.sexControl_015
			self.sp_indices = self.sp_indices_015
		else:
			self.sexControl = self.sexControl_080
			self.sp_indices = self.sp_indices_080
		return processing.AnetHeaderProcessor._runAnet(self, srcName)


if __name__=="__main__":
	processing.procmain(KapteynAnetProcessor, "kapteyn/q.rd", "import")
