# Path: ugali/utils/projector.py
# class SphericalRotator:
# class Projector:
#     def __init__(self, lon_ref, lat_ref, zenithal=False):
#     def setReference(self, lon_ref, lat_ref, zenithal=False):
#     def cartesian(self,lon,lat):
#     def rotate(self, lon, lat, invert=False):
#     def __init__(self, lon_ref, lat_ref, proj_type = 'ait'):
#             def rotate(lon,lat,invert=False):
#     def sphereToImage(self, lon, lat):
#     def imageToSphere(self, x, y):
# def sphere2image(lon_ref,lat_ref,lon,lat):
# def image2sphere(lon_ref,lat_ref,x,y):
# def cartesianSphereToImage(lon, lat):
# def cartesianImageToSphere(x,y):
# def aitoffSphereToImage(lon, lat):
# def aitoffImageToSphere(x, y):
# def gnomonicSphereToImage(lon, lat):
# def gnomonicImageToSphere(x, y):
# def angsep2(lon_1, lat_1, lon_2, lat_2):
# def angsep(lon1,lat1,lon2,lat2):
# def galToCel(ll, bb):
# def celToGal(ra, dec):
# def estimate_angle(angle, origin, new_frame, offset=1e-7):
# def gal2cel_angle(glon,glat,angle,offset=1e-7):
# def cel2gal_angle(ra,dec,angle,offset=1e-7):
# def dec2hms(dec):
# def dec2dms(dec):
# def hms2dec(hms):
# def dms2dec(dms):
# def sr2deg(solid_angle):
# def deg2sr(solid_angle):
# def distanceToDistanceModulus(distance):
# def distanceModulusToDistance(distance_modulus):
# def ang2const(lon,lat,coord='gal'):
# def ang2iau(lon,lat,coord='gal'):
# def match(lon1, lat1, lon2, lat2, tol=None, nnearest=1):
#     DEGREE = 360.
#     HOUR = 24.
#     MINUTE = 60.
#     SECOND = 3600.
#     DEGREE = 360.
#     HOUR = 24.
#     MINUTE = 60.
#     SECOND = 3600.
#     DEGREE = 360.
#     HOUR = 24.
#     MINUTE = 60.
#     SECOND = 3600.
#     DEGREE = 360.
#     HOUR = 24.
#     MINUTE = 60.
#     SECOND = 3600.
# 
# Path: ugali/utils/healpix.py
# def ang2pix(nside, lon, lat, nest=False):
#     """
#     Input (lon, lat) in degrees instead of (theta, phi) in radians
#     """
#     theta = np.radians(90. - lat)
#     phi = np.radians(lon)
#     return hp.ang2pix(nside, theta, phi, nest=nest)
# 
# Path: ugali/utils/logger.py
# class SpecialFormatter(logging.Formatter):
#     FORMATS = {'DEFAULT'       : "%(message)s",
#                logging.WARNING : "WARNING: %(message)s",
#                logging.ERROR   : "ERROR: %(message)s"}
#     def format(self, record):
# def file_found(filename,force):


import os,sys
import inspect
import numpy as np
import fitsio
import ugali.utils.projector
import ugali.utils.idl
    import argparse
from os.path import join,abspath,split
from collections import OrderedDict as odict
from numpy.lib.recfunctions import stack_arrays
from ugali.utils.projector import gal2cel, cel2gal
from ugali.utils.healpix import ang2pix
from ugali.utils.shell import get_ugali_dir, get_cat_dir
from ugali.utils.logger import logger
class ExtraClusters(SourceCatalog):
    """
    Collection of recently discovered star clusters
    """
    def _load(self,filename):
        kwargs = dict(delimiter=',')
        if filename is None: 
            filename = os.path.join(self.DATADIR,"extras/extra_clusters.csv")
        self.filename = filename
        raw = np.recfromcsv(filename,**kwargs)
        
        self.data.resize(len(raw))
        self.data['name'] = raw['name']
        
        self.data['ra'] = raw['ra']
        self.data['dec'] = raw['dec']

        self.data['glon'],self.data['glat'] = cel2gal(raw['ra'],raw['dec'])

    

def catalogFactory(name, **kwargs):
    """
    Factory for various catalogs.
    """
    fn = lambda member: inspect.isclass(member) and member.__module__==__name__
    catalogs = odict(inspect.getmembers(sys.modules[__name__], fn))

    if name not in list(catalogs.keys()):
        msg = "%s not found in catalogs:\n %s"%(name,list(catalogs.keys()))

# Path: ugali/utils/projector.py
# class SphericalRotator:
# class Projector:
#     def __init__(self, lon_ref, lat_ref, zenithal=False):
#     def setReference(self, lon_ref, lat_ref, zenithal=False):
#     def cartesian(self,lon,lat):
#     def rotate(self, lon, lat, invert=False):
#     def __init__(self, lon_ref, lat_ref, proj_type = 'ait'):
#             def rotate(lon,lat,invert=False):
#     def sphereToImage(self, lon, lat):
#     def imageToSphere(self, x, y):
# def sphere2image(lon_ref,lat_ref,lon,lat):
# def image2sphere(lon_ref,lat_ref,x,y):
# def cartesianSphereToImage(lon, lat):
# def cartesianImageToSphere(x,y):
# def aitoffSphereToImage(lon, lat):
# def aitoffImageToSphere(x, y):
# def gnomonicSphereToImage(lon, lat):
# def gnomonicImageToSphere(x, y):
# def angsep2(lon_1, lat_1, lon_2, lat_2):
# def angsep(lon1,lat1,lon2,lat2):
# def galToCel(ll, bb):
# def celToGal(ra, dec):
# def estimate_angle(angle, origin, new_frame, offset=1e-7):
# def gal2cel_angle(glon,glat,angle,offset=1e-7):
# def cel2gal_angle(ra,dec,angle,offset=1e-7):
# def dec2hms(dec):
# def dec2dms(dec):
# def hms2dec(hms):
# def dms2dec(dms):
# def sr2deg(solid_angle):
# def deg2sr(solid_angle):
# def distanceToDistanceModulus(distance):
# def distanceModulusToDistance(distance_modulus):
# def ang2const(lon,lat,coord='gal'):
# def ang2iau(lon,lat,coord='gal'):
# def match(lon1, lat1, lon2, lat2, tol=None, nnearest=1):
#     DEGREE = 360.
#     HOUR = 24.
#     MINUTE = 60.
#     SECOND = 3600.
#     DEGREE = 360.
#     HOUR = 24.
#     MINUTE = 60.
#     SECOND = 3600.
#     DEGREE = 360.
#     HOUR = 24.
#     MINUTE = 60.
#     SECOND = 3600.
#     DEGREE = 360.
#     HOUR = 24.
#     MINUTE = 60.
#     SECOND = 3600.
# 
# Path: ugali/utils/healpix.py
# def ang2pix(nside, lon, lat, nest=False):
#     """
#     Input (lon, lat) in degrees instead of (theta, phi) in radians
#     """
#     theta = np.radians(90. - lat)
#     phi = np.radians(lon)
#     return hp.ang2pix(nside, theta, phi, nest=nest)
# 
# Path: ugali/utils/logger.py
# class SpecialFormatter(logging.Formatter):
#     FORMATS = {'DEFAULT'       : "%(message)s",
#                logging.WARNING : "WARNING: %(message)s",
#                logging.ERROR   : "ERROR: %(message)s"}
#     def format(self, record):
# def file_found(filename,force):


# Path: ugali/candidate/associate.py
import os,sys
import inspect
import numpy as np
import fitsio
import ugali.utils.projector
import ugali.utils.idl
    import argparse
from os.path import join,abspath,split
from collections import OrderedDict as odict
from numpy.lib.recfunctions import stack_arrays
from ugali.utils.projector import gal2cel, cel2gal
from ugali.utils.healpix import ang2pix
from ugali.utils.shell import get_ugali_dir, get_cat_dir
from ugali.utils.logger import logger

class ExtraClusters(SourceCatalog):
    """
    Collection of recently discovered star clusters
    """
    def _load(self,filename):
        kwargs = dict(delimiter=',')
        if filename is None: 
            filename = os.path.join(self.DATADIR,"extras/extra_clusters.csv")
        self.filename = filename
        raw = np.recfromcsv(filename,**kwargs)
        
        self.data.resize(len(raw))
        self.data['name'] = raw['name']
        
        self.data['ra'] = raw['ra']
        self.data['dec'] = raw['dec']

        self.data['glon'],self.data['glat'] = cel2gal(raw['ra'],raw['dec'])

    

def catalogFactory(name, **kwargs):
    """
    Factory for various catalogs.
    """
    fn = lambda member: inspect.isclass(member) and member.__module__==__name__
    catalogs = odict(inspect.getmembers(sys.modules[__name__], fn))

    if name not in list(catalogs.keys()):
        msg = "%s not found in catalogs:\n %s"%(name,list(catalogs.keys()))

        logger.error(msg)