From 05d0329d93d3549ae8ae7dd6b2102addb07f12e6 Mon Sep 17 00:00:00 2001 From: Henry Roe Date: Sat, 23 May 2015 12:49:55 -0700 Subject: [PATCH] added astropy dependency, made search for 2mass dir more robust and fail more gracefully, and output dataframes now have a 'radec' field that is of type astropy.coordinates.SkyCoord --- CHANGES.txt | 8 +++++++ py2mass/.gitignore | 1 + py2mass/__about__.py | 2 +- py2mass/py2mass.py | 51 +++++++++++++++++++++++++++++++++++++------ py2mass/py2mass.pyc | Bin 8959 -> 0 bytes setup.py | 2 +- 6 files changed, 55 insertions(+), 9 deletions(-) create mode 100644 py2mass/.gitignore delete mode 100644 py2mass/py2mass.pyc diff --git a/CHANGES.txt b/CHANGES.txt index 1120ed3..c240da0 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -2,6 +2,14 @@ Py2MASS Change Log ~~~~~~~~~~~~~~~~~~ +------------------ +v0.1.4, 2015-05-23 +------------------ + +- output DataFrame now has 'radec' field that is of type astropy.coordinates.SkyCoord +- added astropy>=1.0.0 dependency +- made search for 2MASS dir more robust & exception more informative when search fails + ------------------ v0.1.3, 2015-05-21 ------------------ diff --git a/py2mass/.gitignore b/py2mass/.gitignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/py2mass/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/py2mass/__about__.py b/py2mass/__about__.py index 8faaf1f..c477327 100644 --- a/py2mass/__about__.py +++ b/py2mass/__about__.py @@ -10,7 +10,7 @@ __uri__ = "https://github.com/henryroe/Py2MASS" # VERSION should be PEP386 compatible (http://www.python.org/dev/peps/pep-0386) -__version__ = "0.1.3" +__version__ = "0.1.4" # Indicates if this version is a release version RELEASE = 'dev' not in __version__ diff --git a/py2mass/py2mass.py b/py2mass/py2mass.py index 3df0cbf..7122611 100644 --- a/py2mass/py2mass.py +++ b/py2mass/py2mass.py @@ -10,6 +10,9 @@ import pickle import pdb import io +import glob +from astropy.coordinates import SkyCoord, ICRS +from astropy import units base_dir = os.path.abspath(os.path.dirname(__file__)) @@ -24,6 +27,9 @@ class Error(Exception): pass +class PathTo2MASSNotFound(Exception): + pass + class FileNotFound(Exception): pass @@ -39,15 +45,16 @@ def _find_2mass_dir(): of the directory. """ paths_to_search = [os.environ.get('2MASS_DIR')] - paths_to_search.append('~/2MASS/') - paths_to_search.append('~/2mass/') + paths_to_search.append('~/2[mM][aA][sS][sS]/') + for cur_path in glob.glob('/Volumes/*/2[mM][aA][sS][sS]'): + paths_to_search.append(cur_path) for cur_path_to_test in paths_to_search: if cur_path_to_test is not None: if os.path.isdir(os.path.expanduser(cur_path_to_test)): return os.path.expanduser(cur_path_to_test) - raise Error("py2mass.py: No 2MASS installation found.\n" + - " User needs to specifiy location with, e.g.:\n" + - " py2mass.set_2mass_path('~/my_2mass_dir')") + raise PathTo2MASSNotFound("py2mass.py: No 2MASS installation found.\n" + + " User needs to specifiy location with, e.g.:\n" + + " py2mass.set_2mass_path('~/my_2mass_dir')") return None try: @@ -79,6 +86,10 @@ def _get_file_object(file_basename): Open the file (with gunzip if necessary) and return the file object. """ + if _2mass_dir is None: + raise PathTo2MASSNotFound("_2mass_dir is None\n" + + " User needs to specifiy location with, e.g.:\n" + + " py2mass.set_2mass_path('~/my_2mass_dir')") if os.path.exists(_2mass_dir + '/' + file_basename + '.gz'): return gzip.open(_2mass_dir + '/' + file_basename + '.gz', 'r') elif os.path.exists(_2mass_dir + '/' + file_basename): @@ -116,7 +127,8 @@ def _convert_xsc_text_to_dataframe(sources_txt): Takes raw lines from extended source catalog (XSC) file and converts to a pandas DataFrame """ xsc_format_descriptor = _get_xsc_format_descriptor() - return read_csv(io.StringIO(unicode(sources_txt)), sep='|', names=xsc_format_descriptor['Parameter Name'].values) + return _add_skycoord_radec_field_xsc(read_csv(io.StringIO(unicode(sources_txt)), sep='|', + names=xsc_format_descriptor['Parameter Name'].values)) def _convert_psc_text_to_dataframe(sources_txt): @@ -124,7 +136,32 @@ def _convert_psc_text_to_dataframe(sources_txt): Takes raw lines from point source catalog (PSC) file and converts to a pandas DataFrame """ psc_format_descriptor = _get_psc_format_descriptor() - return read_csv(io.StringIO(unicode(sources_txt)), sep='|', names=psc_format_descriptor['Column Name'].values) + return _add_skycoord_radec_field_psc(read_csv(io.StringIO(unicode(sources_txt)), sep='|', + names=psc_format_descriptor['Column Name'].values)) + + +def _add_skycoord_radec_field_psc(df): + """ + for PSC objects: + Add the ICRS coordinates as 'radec' column in SkyCoord type object + (ra & dec/decl fields in decimal deg) + """ + df['radec'] = [SkyCoord(df.loc[ix, 'ra'], df.loc[ix, 'dec/decl'], + frame=ICRS, unit=(units.degree, units.degree)) + for ix in df.index] + return df + + +def _add_skycoord_radec_field_xsc(df): + """ + for XSC objects: + Add the Super-coadd centroid as 'radec' column in SkyCoord type object + (sup_ra & sup_dec fields in decimal deg) + """ + df['radec'] = [SkyCoord(df.loc[ix, 'sup_ra'], df.loc[ix, 'sup_dec'], + frame=ICRS, unit=(units.degree, units.degree)) + for ix in df.index] + return df def fetch_2mass_xsc_box(ra_range, dec_range): diff --git a/py2mass/py2mass.pyc b/py2mass/py2mass.pyc deleted file mode 100644 index 2d7737c4f4fb703bf429b393f03b272c3a3bf78e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8959 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 diff --git a/setup.py b/setup.py index a206ce4..dee6ffb 100644 --- a/setup.py +++ b/setup.py @@ -81,7 +81,7 @@ # project is installed. For an analysis of "install_requires" vs pip's # requirements files see: # https://packaging.python.org/en/latest/requirements.html - install_requires=['pandas>=0.10.1'], + install_requires=['pandas>=0.10.1', 'astropy>=1.0.0'], # List additional groups of dependencies here (e.g. development dependencies). # You can install these using the following syntax, for example: