def tableForEachStar(obj, distLimit):
	print "Output all stars within",distLimit,"arcsec to:",ao.starsFile(obj,instr=instrUsed)
	g = open(ao.starsFile(obj,instr=instrUsed),"w")
	print >>g, "\t".join(["object",obj])
	
	for filt in filters:	
		if obj in objectDict[filt]:
			### Output fwhm for filter
			print >>g, "\t".join([ filt, "fwhm", str(round(fwhmDict[obj,filt],2)) ])
			### Does this object have additional nearby stars on the image?
			apertures, starn, xySkyDict, starDict = ao.readPhotMagFile(ao.koiFilterDir(obj,filt,instrUsed), ao.finalKOIimageFile(obj,filt,instrUsed), magSuffix=".mag")
		#	print os.path.isfile(ao.koiFilterDir(obj,filt,instrUsed)+ao.finalKOIimageFile(obj,filt,instrUsed)+".mag")
			
			### Make a koi class for use in undoing rotations
			k = koiPlusFilter.koiPlusFilter(obj,filt,instrUsed)
			refX = eval(xySkyDict[1][0])
			refY = eval(xySkyDict[1][1])
			refXerr = eval(xySkyDict[1][4])
			refYerr = eval(xySkyDict[1][5])
			if k.dir12 == "N":
				northDeltaX = k.arrowDeltaX12
				northDeltaY = k.arrowDeltaY12
				eastDeltaX = k.arrowDeltaX10
				eastDeltaY = k.arrowDeltaY10
			else:
				northDeltaX = k.arrowDeltaX10
				northDeltaY = k.arrowDeltaY10
				eastDeltaX = k.arrowDeltaX12
				eastDeltaY = k.arrowDeltaY12
			
			closeComps = []
			print obj, " has ",len(xySkyDict)-1," comp stars (any distance) in",filt
			### Note stars are 1, not 0, indexed
			for nn in range(1,len(xySkyDict)+1):
				#### Distance ####
			#	distPx = math.sqrt( (eval(xySkyDict[nn][0])-eval(xySkyDict[1][0]))**2 +  (eval(xySkyDict[nn][1])-eval(xySkyDict[1][1]))**2 )
				thisX = eval(xySkyDict[nn][0]) 
				thisY = eval(xySkyDict[nn][1])
				thisXerr = eval(xySkyDict[nn][4])
				thisYerr = eval(xySkyDict[nn][5])
			#	print thisX, thisXerr, thisY, thisYerr, obj, refXerr, refYerr
				deltaX =  thisX - refX
				deltaY =  thisY - refY
				deltaXerr = math.sqrt(thisXerr**2+refXerr**2)
				deltaYerr = math.sqrt(thisYerr**2+refYerr**2)
				## in pixels
				if ((thisX == refX) & (thisY == refY)):
					distPx = math.sqrt( (thisX-refX)**2 + (thisY-refY)**2 )
					distErrPx = 0
				else:
					distPx, distErrPx = gb.distanceWithErrors(deltaX,deltaY,deltaXerr,deltaYerr)
				## in arcsec
				distArcsec = eval(settings[obj]["Plate_scale_"+filt]) * distPx
				distArcsecErr = eval(settings[obj]["Plate_scale_"+filt]) * distErrPx
				## Get position angles in degrees
				useDeltaX, useDeltaY = undoRotations(k.rotation, deltaX, deltaY)
			#	print "\nDiag:",useDeltaX, useDeltaY, "unflipped from",deltaX,deltaY,k.rotation
				if ((thisX == refX) & (thisY == refY)):
					angle = 0
				else:
					angle = getPA(useDeltaX, useDeltaY,northDeltaX,northDeltaY,eastDeltaX,eastDeltaY) 
				#	print "Diag PA:", useDeltaX, useDeltaY, northDeltaX, northDeltaY, eastDeltaX, eastDeltaY, angle
				#### Delta-magnitude ####
				try:
					deltaMag = eval(starDict[nn,'5.00'][3])-eval(starDict[1,'5.00'][3])
				except:
					deltaMag = eval(starDict[nn,'1.00'][3])-eval(starDict[1,'1.00'][3])
					print obj,"WARNING: aperture of 1 instead of 5 px; mag values unreliable. A PSF fit binary?\n"
	
				### Now check if it is within our desired cutoff distance
				if distArcsec <= distLimit:
					closeComps.append([str(round(distArcsec,2)), str(round(deltaMag,2)), xySkyDict[nn][0], xySkyDict[nn][1], str(round(angle,1))])
			#### We want to output the target star even if there are no others (for its pixel location and fwhm)
		##	print obj,closeComps,"\n\n"
			print >>g, "Star","Dist","Delta-mag","X_pixel","Y_pixel","PA"
			for nn,comp in enumerate(closeComps):
				listOut = gb.flattenList([[str(nn)], closeComps[nn]])
				print >>g, gb.listToString(listOut,tab="\t")
		else:
			print "object wasn't found for this filter:",obj,filt
	
	g.close()
def tableForAllStars(distCutoffArcsec=closeDist, filters =["J","Ks"], extra=""):
	print "Making table of all stars within:",distCutoffArcsec," arcsec"
	g  = open(ao.compFileSorted(distCutoffArcsec, extra+".tsv"),"w")
	gTex = open(ao.compFileSorted(distCutoffArcsec, extra+".tex"),"w")
	## options for ARIES/Ks only
	delimiter = "\t&"
	print >>gTex, delimiter.join(["KNNNNN", "KeplerID", "KepMag", "Jmag", "Kmag","Filt","Star","Dist","PA","$\Delta_Mag$", "$Kep_{Dwarf}$", "\\\\"])
	delimiter = "\t" 
	print >>g, delimiter.join(["KNNNNN", "KeplerID", "KepMag", "Jmag", "Kmag", "Filt", "Star","Dist","PA","Delta_Mag", "Kep_Dwarf"])
	
	for obj in useObjects:
		firstLineForObj = True # switch this when the first line is output
		## read in the summary file
		ss = open(ao.starsFile(obj,instr=instrUsed),"r")
		lines = ss.readlines()
		ss.close()
		## find each filter
		filtersFound=[]
		for ii,line in enumerate(lines):
			elems = line.split("\t")
			if elems[0] in filters:
				filtersFound.append(elems[0])
		
		## read in the detected stars for each filter
		fwhm = lines[1].rstrip().split()[2]
		for line in lines:
			elems = line.rstrip().split()
			if elems[0] == 'J':
				filt = 'J'
			elif elems[0] == 'Ks':
				filt = 'Ks'
			## get rid of headers, also star 0
			if elems[0] not in ["0","J","Ks","Star","object"]:
			#	print line, "xx", elems,"xx"
				num = elems[0]
				dist = elems[1]
				deltaMag = elems[2]
				xCoord = elems[3]
				yCoord = elems[4]
				pa = elems[5]
				## estimate the kepler mag from K
				try:
					kMag = catalogs.getObjMag2MASS(obj,"Ks")[0]
					jMag = catalogs.getObjMag2MASS(obj,"J")[0]
				except:
					jMag = "--"
					kMag = "--"
			#	print "DIAG:",obj,kMag,jMag
				
				try:
					kepID = ksasDict[obj]["kepid"]
					kepMag = ksasDict[obj]["kpmag"]
					### There used to be a bug here (pre April 2013)! This should return the Kepler magnitude of the COMPANION, not the TARGET
					if filt == "Ks":
						kepMagDwarf = str(round(kepler.kepMagCiardi("Ks", eval(kMag)+eval(deltaMag)),1))
					elif filt == "J":
						kepMagDwarf = str(round(kepler.kepMagCiardi("J", eval(jMag)+eval(deltaMag)),1))
					else:
						kepMagDwarf = "--"
					### Should allow for J AND K, since the transform is better, but matching stars is tricksy
				except:
					kepID = "--"
					kepMag = "--"
					kepMagDwarf = "--"
				
				### Print info
				if eval(dist) <= distCutoffArcsec:
					if (firstLineForObj):
						output = [obj, kepID, kepMag, jMag, kMag, filt, num,dist, pa, deltaMag, kepMagDwarf]
						firstLineForObj = False ## for next star
					else:
						output = ["--", "--", "--","--", "--", filt, num, dist, pa, deltaMag, kepMagDwarf]
					delimiter = "\t&"
					print >>gTex, delimiter.join(output), "\\\\"
					delimiter = "\t"
					print >>g, delimiter.join(output)
	gTex.close()
	g.close()
	useObjects = []
	for obj in objectDirListing:
		useObjects.append(obj)

print "Using:",useObjects
filters = ao.filterNames
print "Searching for filters:",filters

## Import settings files
settings={}
fwhmDict={}
for obj in useObjects:
	settings[obj]={}
	settings[obj]=ao.readSettingsFile(ao.settingsFile(obj,instr=instrUsed))
	## Import fwhm from stars file
	starInfo=ao.readStarsFile(ao.starsFile(obj,instr=instrUsed),delimiter="\t")
	for filt in filters:
		fwhmDict[obj,filt] = "NA"
		for xx in starInfo:
			if xx[0] == filt:
				fwhmDict[obj, filt] = xx[2]
#print fwhmDict['IQAur','Ks']
#print fwhmDict

################### END PREAMBLE ############################


#### Import limiting mag files
bigDict={}; byApDict={}; allApsForObj={}; byApDictKepMag = {}
for filt in filters:
	for obj in useObjects: