Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ charset = utf-8

# Python source files
[*.py]
indent_style = tab
indent_style = space
indent_size = 4
trim_trailing_whitespace = true
insert_final_newline = true
Expand Down
9 changes: 6 additions & 3 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
# GitHub Actions workflow for Flows's continuous integration.
# GitHub Actions workflow for Flows continuous integration.

name: Tests

on:
push:
branches: [master, devel]
branches: [master, devel, test_ci]
tags: 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10
pull_request_target:
branches: [master, devel]
branches: [master, devel, test_ci]
schedule:
- cron: '0 6 1 * *' # once a month in the morning

Expand Down Expand Up @@ -39,6 +39,7 @@ jobs:
- name: Install dependencies
run: |
python -m pip install --upgrade pip wheel
pip install markupsafe==2.0.1
grep "numpy" requirements.txt | xargs -I {} pip install "{}"
pip install -r requirements.txt

Expand Down Expand Up @@ -109,6 +110,7 @@ jobs:
- name: Install dependencies
run: |
python -m pip install --upgrade pip wheel
pip install markupsafe==2.0.1
grep "numpy" requirements.txt | xargs -I {} pip install "{}"
pip install -r requirements.txt
pip install codecov pytest-cov
Expand Down Expand Up @@ -163,6 +165,7 @@ jobs:
- name: Install dependencies
run: |
python -m pip install --upgrade pip wheel
pip install markupsafe==2.0.1
grep "numpy" requirements.txt | xargs -I {} pip install "{}"
pip install -r requirements.txt

Expand Down
1 change: 1 addition & 0 deletions flows/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@
from .config import load_config

from .version import get_version

__version__ = get_version(pep440=False)
101 changes: 51 additions & 50 deletions flows/aadc_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,53 +15,54 @@
import getpass
from .config import load_config

#--------------------------------------------------------------------------------------------------
class AADC_DB(object): # pragma: no cover
"""
Connection to the central TASOC database.

Attributes:
conn (`psycopg2.Connection` object): Connection to PostgreSQL database.
cursor (`psycopg2.Cursor` object): Cursor to use in database.
"""

def __init__(self, username=None, password=None):
"""
Open connection to central TASOC database.

If ``username`` or ``password`` is not provided or ``None``,
the user will be prompted for them.

Parameters:
username (string or None, optional): Username for AADC database.
password (string or None, optional): Password for AADC database.
"""

config = load_config()

if username is None:
username = config.get('database', 'username', fallback=None)
if username is None:
default_username = getpass.getuser()
username = input('Username [%s]: ' % default_username)
if username == '':
username = default_username

if password is None:
password = config.get('database', 'password', fallback=None)
if password is None:
password = getpass.getpass('Password: ')

# Open database connection:
self.conn = psql.connect('host=10.28.0.127 user=' + username + ' password=' + password + ' dbname=db_aadc')
self.cursor = self.conn.cursor(cursor_factory=DictCursor)

def close(self):
self.cursor.close()
self.conn.close()

def __enter__(self):
return self

def __exit__(self, *args, **kwargs):
self.close()

# --------------------------------------------------------------------------------------------------
class AADC_DB(object): # pragma: no cover
"""
Connection to the central TASOC database.

Attributes:
conn (`psycopg2.Connection` object): Connection to PostgreSQL database.
cursor (`psycopg2.Cursor` object): Cursor to use in database.
"""

def __init__(self, username=None, password=None):
"""
Open connection to central TASOC database.

If ``username`` or ``password`` is not provided or ``None``,
the user will be prompted for them.

Parameters:
username (string or None, optional): Username for AADC database.
password (string or None, optional): Password for AADC database.
"""

config = load_config()

if username is None:
username = config.get('database', 'username', fallback=None)
if username is None:
default_username = getpass.getuser()
username = input('Username [%s]: ' % default_username)
if username == '':
username = default_username

if password is None:
password = config.get('database', 'password', fallback=None)
if password is None:
password = getpass.getpass('Password: ')

# Open database connection:
self.conn = psql.connect('host=10.28.0.127 user=' + username + ' password=' + password + ' dbname=db_aadc')
self.cursor = self.conn.cursor(cursor_factory=DictCursor)

def close(self):
self.cursor.close()
self.conn.close()

def __enter__(self):
return self

def __exit__(self, *args, **kwargs):
self.close()
217 changes: 110 additions & 107 deletions flows/api/catalogs.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,113 +12,116 @@
from functools import lru_cache
from ..config import load_config

#--------------------------------------------------------------------------------------------------

# --------------------------------------------------------------------------------------------------
@lru_cache(maxsize=10)
def get_catalog(target, radius=None, output='table'):
"""

Parameters:
target (int or str):
radius (float, optional): Radius around target in degrees to return targets for.
outout (str, optional): Desired output format. Choises are 'table', 'dict', 'json'.
Default='table'.

Returns:
dict: Dictionary with three members:
- 'target': Information about target.
- 'references': Table with information about reference stars close to target.
- 'avoid': Table with stars close to target which should be avoided in FOV selection.

.. codeauthor:: Rasmus Handberg <rasmush@phys.au.dk>
"""

assert output in ('table', 'json', 'dict'), "Invalid output format"

# Get API token from config file:
config = load_config()
token = config.get('api', 'token', fallback=None)
if token is None:
raise RuntimeError("No API token has been defined")

#
r = requests.get('https://flows.phys.au.dk/api/reference_stars.php',
params={'target': target},
headers={'Authorization': 'Bearer ' + token})
r.raise_for_status()
jsn = r.json()

# Convert timestamps to actual Time objects:
jsn['target']['inserted'] = Time(jsn['target']['inserted'], scale='utc')
if jsn['target']['discovery_date'] is not None:
jsn['target']['discovery_date'] = Time(jsn['target']['discovery_date'], scale='utc')

if output in ('json', 'dict'):
return jsn

dict_tables = {}

tab = Table(
names=('targetid', 'target_name', 'target_status', 'ra', 'decl', 'redshift', 'redshift_error', 'discovery_mag', 'catalog_downloaded', 'pointing_model_created', 'inserted', 'discovery_date', 'project', 'host_galaxy', 'ztf_id', 'sntype'),
dtype=('int32', 'str', 'str', 'float64', 'float64', 'float32', 'float32', 'float32', 'bool', 'bool', 'object', 'object', 'str', 'str', 'str', 'str'),
rows=[jsn['target']])

tab['ra'].description = 'Right ascension'
tab['ra'].unit = u.deg
tab['decl'].description = 'Declination'
tab['decl'].unit = u.deg
dict_tables['target'] = tab

for table_name in ('references', 'avoid'):
tab = Table(
names=('starid', 'ra', 'decl', 'pm_ra', 'pm_dec', 'gaia_mag', 'gaia_bp_mag', 'gaia_rp_mag', 'gaia_variability', 'B_mag', 'V_mag', 'H_mag', 'J_mag', 'K_mag', 'u_mag', 'g_mag', 'r_mag', 'i_mag', 'z_mag', 'distance'),
dtype=('int64', 'float64', 'float64', 'float32', 'float32', 'float32', 'float32', 'float32', 'int32', 'float32', 'float32', 'float32', 'float32', 'float32', 'float32', 'float32', 'float32', 'float32', 'float32', 'float64'),
rows=jsn[table_name])

tab['starid'].description = 'Unique identifier in REFCAT2 catalog'
tab['ra'].description = 'Right ascension'
tab['ra'].unit = u.deg
tab['decl'].description = 'Declination'
tab['decl'].unit = u.deg
tab['pm_ra'].description = 'Proper motion in right ascension'
tab['pm_ra'].unit = u.mas/u.yr
tab['pm_dec'].description = 'Proper motion in declination'
tab['pm_dec'].unit = u.mas/u.yr
tab['distance'].description = 'Distance from object to target'
tab['distance'].unit = u.deg

tab['gaia_mag'].description = 'Gaia G magnitude'
tab['gaia_bp_mag'].description = 'Gaia Bp magnitude'
tab['gaia_rp_mag'].description = 'Gaia Rp magnitude'
tab['gaia_variability'].description = 'Gaia variability classification'
tab['B_mag'].description = 'Johnson B magnitude'
tab['V_mag'].description = 'Johnson V magnitude'
tab['H_mag'].description = '2MASS H magnitude'
tab['J_mag'].description = '2MASS J magnitude'
tab['K_mag'].description = '2MASS K magnitude'
tab['u_mag'].description = 'u magnitude'
tab['g_mag'].description = 'g magnitude'
tab['r_mag'].description = 'r magnitude'
tab['i_mag'].description = 'i magnitude'
tab['z_mag'].description = 'z magnitude'

# Add some meta-data to the table as well:
tab.meta['targetid'] = int(dict_tables['target']['targetid'])

dict_tables[table_name] = tab

return dict_tables

#--------------------------------------------------------------------------------------------------
"""

Parameters:
target (int or str):
radius (float, optional): Radius around target in degrees to return targets for.
outout (str, optional): Desired output format. Choises are 'table', 'dict', 'json'.
Default='table'.

Returns:
dict: Dictionary with three members:
- 'target': Information about target.
- 'references': Table with information about reference stars close to target.
- 'avoid': Table with stars close to target which should be avoided in FOV selection.

.. codeauthor:: Rasmus Handberg <rasmush@phys.au.dk>
"""

assert output in ('table', 'json', 'dict'), "Invalid output format"

# Get API token from config file:
config = load_config()
token = config.get('api', 'token', fallback=None)
if token is None:
raise RuntimeError("No API token has been defined")

#
r = requests.get('https://flows.phys.au.dk/api/reference_stars.php', params={'target': target},
headers={'Authorization': 'Bearer ' + token})
r.raise_for_status()
jsn = r.json()

# Convert timestamps to actual Time objects:
jsn['target']['inserted'] = Time(jsn['target']['inserted'], scale='utc')
if jsn['target']['discovery_date'] is not None:
jsn['target']['discovery_date'] = Time(jsn['target']['discovery_date'], scale='utc')

if output in ('json', 'dict'):
return jsn

dict_tables = {}

tab = Table(names=(
'targetid', 'target_name', 'target_status', 'ra', 'decl', 'redshift', 'redshift_error', 'discovery_mag',
'catalog_downloaded', 'pointing_model_created', 'inserted', 'discovery_date', 'project', 'host_galaxy',
'ztf_id', 'sntype'), dtype=(
'int32', 'str', 'str', 'float64', 'float64', 'float32', 'float32', 'float32', 'bool', 'bool', 'object',
'object', 'str', 'str', 'str', 'str'), rows=[jsn['target']])

tab['ra'].description = 'Right ascension'
tab['ra'].unit = u.deg
tab['decl'].description = 'Declination'
tab['decl'].unit = u.deg
dict_tables['target'] = tab

for table_name in ('references', 'avoid'):
tab = Table(names=(
'starid', 'ra', 'decl', 'pm_ra', 'pm_dec', 'gaia_mag', 'gaia_bp_mag', 'gaia_rp_mag', 'gaia_variability',
'B_mag', 'V_mag', 'H_mag', 'J_mag', 'K_mag', 'u_mag', 'g_mag', 'r_mag', 'i_mag', 'z_mag', 'distance'),
dtype=('int64', 'float64', 'float64', 'float32', 'float32', 'float32', 'float32', 'float32', 'int32',
'float32', 'float32', 'float32', 'float32', 'float32', 'float32', 'float32', 'float32', 'float32',
'float32', 'float64'), rows=jsn[table_name])

tab['starid'].description = 'Unique identifier in REFCAT2 catalog'
tab['ra'].description = 'Right ascension'
tab['ra'].unit = u.deg
tab['decl'].description = 'Declination'
tab['decl'].unit = u.deg
tab['pm_ra'].description = 'Proper motion in right ascension'
tab['pm_ra'].unit = u.mas / u.yr
tab['pm_dec'].description = 'Proper motion in declination'
tab['pm_dec'].unit = u.mas / u.yr
tab['distance'].description = 'Distance from object to target'
tab['distance'].unit = u.deg

tab['gaia_mag'].description = 'Gaia G magnitude'
tab['gaia_bp_mag'].description = 'Gaia Bp magnitude'
tab['gaia_rp_mag'].description = 'Gaia Rp magnitude'
tab['gaia_variability'].description = 'Gaia variability classification'
tab['B_mag'].description = 'Johnson B magnitude'
tab['V_mag'].description = 'Johnson V magnitude'
tab['H_mag'].description = '2MASS H magnitude'
tab['J_mag'].description = '2MASS J magnitude'
tab['K_mag'].description = '2MASS K magnitude'
tab['u_mag'].description = 'u magnitude'
tab['g_mag'].description = 'g magnitude'
tab['r_mag'].description = 'r magnitude'
tab['i_mag'].description = 'i magnitude'
tab['z_mag'].description = 'z magnitude'

# Add some meta-data to the table as well:
tab.meta['targetid'] = int(dict_tables['target']['targetid'])

dict_tables[table_name] = tab

return dict_tables


# --------------------------------------------------------------------------------------------------
def get_catalog_missing():

# Get API token from config file:
config = load_config()
token = config.get('api', 'token', fallback=None)
if token is None:
raise Exception("No API token has been defined")

#
r = requests.get('https://flows.phys.au.dk/api/catalog_missing.php',
headers={'Authorization': 'Bearer ' + token})
r.raise_for_status()
return r.json()
# Get API token from config file:
config = load_config()
token = config.get('api', 'token', fallback=None)
if token is None:
raise Exception("No API token has been defined")

#
r = requests.get('https://flows.phys.au.dk/api/catalog_missing.php', headers={'Authorization': 'Bearer ' + token})
r.raise_for_status()
return r.json()
Loading