import requests
import pandas as pd
import numpy as np
from tempfile import NamedTemporaryFile
import os
import subprocess
from astropy.io import fits
import matplotlib.pyplot as plt
from . import spacegeometry
[docs]def getChandraObs(
obsID,
fileList
):
pass
[docs]def plotLocalCatalog(
catalogName='xmmsl2_clean.fits',
dirpath='/home/joel/Documents/pythonDev/research/pulsarJPDAF/pulsarData/xray_catalogs/',
fluxKey='FLUX_B8'
):
hdulist = fits.open(dirpath + catalogName)
catalogHeader = hdulist[1].header
catalogData = hdulist[1].data
hdulist.close()
minFlux = np.min(catalogData[fluxKey])
scaledFlux = np.array(catalogData[fluxKey] - minFlux)
maxFlux = np.max(scaledFlux)
scaledFlux = scaledFlux/maxFlux
plt.figure()
for index in range(len(catalogData)):
plt.scatter(catalogData[index]['RA'], catalogData[index]['DEC'], s=scaledFlux[index])
plt.show(block=False)
return
[docs]def localCatalog_coneSearch(
RA,
DEC,
FOV,
catalogName='xmmsl2_clean.fits',
dirpath='/home/joel/Documents/pythonDev/research/pulsarJPDAF/pulsarData/xray_catalogs/',
removeNaNs=True,
fluxKey='FLUX_B8',
extentKey='EXT_B8',
raKey='RA',
decKey='DEC',
srcNameKey='UNIQUE_SRCNAME'
):
hdulist = fits.open(dirpath + catalogName)
catalogHeader = hdulist[1].header
catalogData = hdulist[1].data
hdulist.close()
columns = [srcNameKey, raKey, decKey, fluxKey, extentKey]
savedColumns = []
columnIndexDict = {}
catKeys = list(catalogHeader.keys())
for index in range(len(catalogHeader)):
for column in columns:
if column == catalogHeader[index]:
catKey = catKeys[index]
unitKey = catKey.replace('TYPE', 'UNIT')
if unitKey in catalogHeader:
columnUnit = catalogHeader[unitKey]
else:
columnUnit = None
columnIndexDict[column] = {
'index': index,
'key': catKey
}
if columnUnit:
columnIndexDict[column]['unit'] = columnUnit
columns.remove(column)
savedColumns.append(column)
if columns:
raise ValueError('Did not find columns %s in local catalog.' %columns)
if columnIndexDict[raKey]['unit'] == 'rad':
raConversionFactor = 1
elif columnIndexDict[raKey]['unit'] == 'degrees' or columnIndexDict[raKey]['unit'] == 'degree':
raConversionFactor = np.pi / 180.0
if columnIndexDict[decKey]['unit'] == 'rad':
decConversionFactor = 1
elif columnIndexDict[decKey]['unit'] == 'degrees' or columnIndexDict[decKey]['unit'] == 'degree':
decConversionFactor = np.pi/180.0
if RA['unit'] == 'rad':
referenceRA = RA['value']
elif RA['unit'] == 'degrees':
referenceRA = RA['value'] * np.pi / 180.0
else:
raise ValueError('Unrecougnized RA units %s' % RA['unit'])
if DEC['unit'] == 'rad':
referenceDec = DEC['value']
elif DEC['unit'] == 'degrees':
referenceDec = DEC['value'] * np.pi / 180.0
else:
raise ValueError('Unrecougnized Dec units %s' % DEC['unit'])
if FOV['unit'] == 'rad':
FOVVal = FOV['value']
elif FOV['unit'] == 'degrees':
FOVVal = FOV['value'] * np.pi / 180.0
else:
raise ValueError('Unrecougnized FOV units %s' % FOV['unit'])
referenceUnitVector = spacegeometry.sidUnitVec(
referenceRA,
referenceDec
)
mySourceDF = pd.DataFrame(columns=savedColumns)
for source in catalogData:
sourceUnitVector = spacegeometry.sidUnitVec(
source[raKey] * raConversionFactor,
source[decKey] * decConversionFactor
)
angularDiff = np.arccos(referenceUnitVector.dot(sourceUnitVector))
if angularDiff < (FOVVal/2):
mySrcDict = {}
skipVal = False
for columnName, columnInfo in columnIndexDict.items():
if not skipVal:
if 'unit' in columnInfo:
mySrcDict[columnName] = {
'value': source[columnName],
'unit': columnInfo['unit'].replace('cm2', 'cm^2')
}
else:
mySrcDict[columnName] = source[columnName]
if removeNaNs:
try:
skipVal = np.isnan(source[columnName])
except:
skipVal = False
if not skipVal:
mySourceDF = mySourceDF.append(mySrcDict, ignore_index=True)
return mySourceDF
[docs]def xamin_coneSearch(
RA,
DEC,
FOV,
angleUnits='degrees',
catalog='xray',
removeNullFlux=True,
fluxKey='flux'
):
if angleUnits == 'degrees':
FOVArcmin = FOV * 60
elif angleUnits == 'radians':
FOVArcmin = FOV * 3437.75
elif angleUnits == 'arc':
FOVArcmin = FOV
dirpath = '/home/joel/Documents/pythonDev/modules/ModularFilter/modest/utils'
fieldCommand = 'fields=name,ra,dec,%s' % fluxKey
myCommand = ['java',
'-jar',
dirpath + '/users.jar',
'table=%s' %catalog,
'position=\'%s, %s\'' % (RA, DEC),
'radius=%s' % FOVArcmin,
fieldCommand]
print(myCommand)
# myQuery += ('table=%s' % catalog)
# myQuery += ('position=\'%s, %s\'' % (RA, DEC))
# myQuery += ('radius=%s' % FOV)
# subprocess.call(['java', '-jar', 'users.jar'], env=env)
# process = subprocess.Popen(['java', '-jar', 'users.jar'], stdout=subprocess.PIPE)
process = subprocess.Popen(myCommand, stdout=subprocess.PIPE)
output = process.stdout
print(output)
outputDF = pd.read_csv(output, sep='|', comment='#').dropna(how='any')
outputDF.columns = outputDF.columns.str.strip()
outputDF = outputDF.rename(columns={str.lower(fluxKey):'flux'})
print(outputDF)
for row in range(len(outputDF)):
try:
outputDF.set_value(row, 'flux', outputDF.loc[row]['flux'])
except:
if removeNullFlux is True:
outputDF.drop(row, inplace=True)
# print('Dropping row %i' %(row))
outputDF.reset_index()
return(outputDF)
[docs]def chandraPSC_coneSearch(
RA,
DEC,
FOV,
FOVUnits='degrees',
minSignificance=0
):
if FOVUnits == 'degrees':
FOVArcmin = FOV * 60
elif FOVUnits == 'radians':
FOVArcmin = FOV * 3437.75
elif FOVUnits == 'arcmins':
FOVArcmin = FOV
else:
raise ValueError('Unrecougnized unit for FOV. Use either degrees, radians, or arcmins.')
baseQuery=(
'http://cda.cfa.harvard.edu/csccli/getProperties?query='
'SELECT m.name, m.ra, m.dec, m.flux_aper_b, m.significance ' +
'FROM master_source m ' +
'WHERE (' +
'dbo.cone_distance(m.ra,m.dec,%s,%s)<=%s'
%(RA, DEC, FOVArcmin)
)
if minSignificance > 0:
baseQuery = (
baseQuery +
'AND m.significance > %s)'
%minSignificance
)
else:
baseQuery = baseQuery + ')'
print(baseQuery)
response=requests.get(baseQuery)
# t = TemporaryFile()
# with open('./tmp', 'wb') as f:
# f.write(response.content)
with NamedTemporaryFile(mode='wb', delete=False) as f:
f.write(response.content)
resultsDF = pd.read_csv(f.name, sep='\t', comment='#')
f.close()
os.remove(f.name)
return(resultsDF)