diff --git a/noxfile.py b/noxfile.py index 57568db..ff8da4e 100644 --- a/noxfile.py +++ b/noxfile.py @@ -10,7 +10,7 @@ DIR = Path(__file__).parent.resolve() -nox.options.sessions = ["lint", "tests"] # "pylint", +nox.options.sessions = ["lint", "pylint", "tests"] @nox.session diff --git a/pyproject.toml b/pyproject.toml index d839770..ef2101f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,16 +29,17 @@ classifiers = [ ] dynamic = ["version"] dependencies = [ - "numpy", - "scipy>1.10", + "asdf", + "dustmaps", "astropy", - "matplotlib", + "astroquery", "gala", "galstreams", + "matplotlib", + "numba", + "numpy", "pyia", - "astroquery", - "dustmaps", - "asdf", + "scipy>1.10", "ugali", ] @@ -81,6 +82,7 @@ addopts = ["-ra", "--showlocals", "--strict-markers", "--strict-config"] xfail_strict = true filterwarnings = [ "error", + "ignore:numpy.ndarray size changed", ] log_cli_level = "INFO" testpaths = [ @@ -153,6 +155,7 @@ isort.required-imports = ["from __future__ import annotations"] [tool.ruff.lint.per-file-ignores] "docs/conf.py" = ["A001", "D100", "INP001"] +"scripts/**" = ["INP001"] "tests/**" = ["ANN", "D1", "INP", "S101", "T20"] "noxfile.py" = ["T20"] "__init__.py" = ["F403"] @@ -168,7 +171,11 @@ similarities.ignore-imports = "yes" messages_control.disable = [ "design", "fixme", - "line-too-long", - "missing-module-docstring", "wrong-import-position", + # TODO: fix these and remove + "attribute-defined-outside-init", + "duplicate-code", + "invalid-name", + "no-member", + "unused-variable", ] diff --git a/src/cats/combine_pm_cmd.py b/scripts/combine_pm_cmd.py similarity index 92% rename from src/cats/combine_pm_cmd.py rename to scripts/combine_pm_cmd.py index 92c8757..e933c96 100644 --- a/src/cats/combine_pm_cmd.py +++ b/scripts/combine_pm_cmd.py @@ -8,8 +8,8 @@ import matplotlib.pyplot as plt import pandas as pd -from cats.cmd.CMD import Isochrone -from cats.pawprint.pawprint import Footprint2D, Pawprint +from cats.cmd import Isochrone +from cats.pawprint import Footprint2D, Pawprint plt.rc("xtick", top=True, direction="in", labelsize=15) plt.rc("ytick", right=True, direction="in", labelsize=15) @@ -50,9 +50,7 @@ def generate_isochrone_vertices( return o.simpleSln(0.1, 15, mass_thresh=0.83)[0] -def generate_pm_vertices( - cat: Any, sky_poly: Any, cmd_poly: Any, config: Any -) -> list[list[float]]: +def generate_pm_vertices() -> list[list[float]]: """Generate Proper Motion Vertices. Use the generated class to make a new polygon for the given catalog in PM @@ -80,7 +78,7 @@ def main() -> int: cat = at.Table.read(config.streaminfo.cat_fn) # load in file with the sky footprint. - sky_poly, bg_poly = load_sky_region(config.streaminfo.sky_print) + sky_poly, _ = load_sky_region(config.streaminfo.sky_print) # have an initial selection for the PM region that is very wide # this could also be stored in a footprint diff --git a/src/cats/cmd/_core.py b/src/cats/cmd/_core.py index e46e2b9..728357f 100644 --- a/src/cats/cmd/_core.py +++ b/src/cats/cmd/_core.py @@ -2,16 +2,15 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Callable +from typing import TYPE_CHECKING, Any import astropy.units as u import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import scipy -from astropy.convolution import Gaussian1DKernel, convolve from astropy.coordinates import Distance -from isochrones.mist import MIST_Isochrone +from isochrones.mist import MIST_Isochrone # pylint: disable=import-error from matplotlib.patches import PathPatch from scipy.interpolate import InterpolatedUnivariateSpline, interp1d from scipy.signal import correlate2d @@ -22,7 +21,6 @@ if TYPE_CHECKING: from matplotlib.figure import Figure - from numpy.typing import NDArray from cats.pawprint import Pawprint @@ -271,7 +269,9 @@ def correct_isochrone(self) -> None: signal = signal.T ccor2d = correlate2d(self.CMD_data, signal) - y, x = np.unravel_index(np.argmax(ccor2d), ccor2d.shape) + y, x = np.unravel_index( + np.argmax(ccor2d), ccor2d.shape + ) # pylint: disable=W0632 self.x_shift = (x - len(ccor2d[0]) / 2.0) * (self.x_edges[1] - self.x_edges[0]) self.y_shift = (y - len(ccor2d) / 2.0) * (self.y_edges[1] - self.y_edges[0]) @@ -395,9 +395,6 @@ def simpleSln( self.color[ind] + coloff + tol, fill_value="extrapolate", ) - # iso_model = interp1d( - # self.mag[ind] + magoff, self.color[ind] + coloff, fill_value="extrapolate" - # ) hb_print, self.hb_mask = self.make_hb_print() @@ -413,6 +410,7 @@ def simpleSln( return cmd_footprint, self.cmd_mask, hb_print, self.hb_mask, self.pawprint def make_hb_print(self) -> None: + """Make the horizontal branch polygon mask.""" # probably want to incorporate this into cmdprint and have two # discontinuous regions if self.phot_survey == "PS1": @@ -568,68 +566,67 @@ def plot_CMD(self, scale_err: float = 2) -> Figure: return fig - def convolve_1d(self, probabilities: NDArray, mag_err: NDArray) -> NDArray: - """1D Gaussian convolution. - - Parameters - ---------- - probabilities : NDArray - Probability of the magnitudes. - mag_err : NDArray - Uncertainty in the magnitudes. - """ - self.probabilities = probabilities - self.mag_err = mag_err - - sigma = mag_err / self.ybin # error in pixel units - kernel = Gaussian1DKernel(sigma) - convolved = convolve(probabilities, kernel) - - self.convolved = convolved - - def convolve_errors( - self, - g_errors: Callable[[NDArray], NDArray], - r_errors: Callable[[NDArray], NDArray], - intr_err: float = 0.1, - ) -> None: - """1D Gaussian convolution of the data with uncertainties. - - Parameters - ---------- - g_errors, r_errors : Callable[[ndarray], ndarray] - g, r magnitude uncertainties. - intr_err: - Free to set. Default is 0.1. - """ - for i in range(len(probabilities)): - probabilities[i] = convolve_1d( - probabilities[i], - np.sqrt( - g_errors(self.x_bins[i]) ** 2 - + r_errors(self.y_bins[i]) ** 2 - + intr_err**2 - ), - sel.fx_bins[1] - self.x_bins[0], - ) - - self.probabilities = probabilities - - def errFn(self) -> None: - """Generate the errors for the magnitudes.""" - gerrs = np.zeros(len(self.y_bins)) - rerrs = np.zeros(len(self.x_bins)) - - for i in range(len(self.y_bins)): - gerrs[i] = np.nanmedian( - self.cat["g0"][abs(self.cat["g0"] - self.y_bins[i]) < self.ybin / 2] - ) - rerrs[i] = np.nanmedian( - self.cat["r0"][abs(self.cat["g0"] - self.x_bins[i]) < self.xbin / 2] - ) - - gerrs = interp1d(self.y_bins, gerrs, fill_value="extrapolate") - rerrs = interp1d(self.x_bins, rerrs, fill_value="extrapolate") - - self.gerrs = gerrs - self.rerrs = rerrs + # def convolve_1d(self, probabilities: NDArray, mag_err: NDArray) -> NDArray: + # """1D Gaussian convolution. + + # Parameters + # ---------- + # probabilities : NDArray + # Probability of the magnitudes. + # mag_err : NDArray + # Uncertainty in the magnitudes. + # """ + # self.probabilities = probabilities + # self.mag_err = mag_err + + # sigma = mag_err / self.ybin # error in pixel units + # kernel = Gaussian1DKernel(sigma) + # convolved = convolve(probabilities, kernel) + + # self.convolved = convolved + + # def convolve_errors( + # self, + # probabilities: NDArray, + # g_errors: Callable[[NDArray], NDArray], + # r_errors: Callable[[NDArray], NDArray], + # intr_err: float = 0.1, + # ) -> None: + # """1D Gaussian convolution of the data with uncertainties. + + # Parameters + # ---------- + # probabilities : NDArray + # Probability of the magnitudes. + # g_errors, r_errors : Callable[[ndarray], ndarray] + # g, r magnitude uncertainties. + # intr_err: + # Free to set. Default is 0.1. + # """ + # for i in range(len(probabilities)): + # probabilities[i] = self.convolve_1d( + # probabilities[i], + # np.sqrt( + # g_errors(self.x_bins[i]) ** 2 + # + r_errors(self.y_bins[i]) ** 2 + # + intr_err**2 + # ), + # self.fx_bins[1] - self.x_bins[0], + # ) + + # self.probabilities = probabilities + + # TODO: remove this function? + # def errFn(self) -> None: + # """Generate the errors for the magnitudes.""" + # g0 = self.cat["g0"] + # r0 = self.cat["r0"] + # yhb = self.ybin / 2 # half bin size + # xhb = self.xbin / 2 + # gerrs = np.array([np.nanmedian(g0[abs(g0 - yb) < yhb]) for yb in self.y_bins]) + # rerrs = np.array( # TODO: are we sure this is right? + # [np.nanmedian(r0[abs(g0 - xb) < xhb]) for xb in self.x_bins] + # ) + + # self.gerrs = interp1d(self.y_bins, gerrs, fill_value="extrapolate") + # self.rerrs = interp1d(self.x_bins, rerrs, fill_value="extrapolate") diff --git a/src/cats/pawprint/_core.py b/src/cats/pawprint/_core.py index dda8a5a..c6d7543 100644 --- a/src/cats/pawprint/_core.py +++ b/src/cats/pawprint/_core.py @@ -1,3 +1,5 @@ +"""Core classes for pawprint.""" + from __future__ import annotations __all__ = ["Pawprint"] @@ -12,6 +14,8 @@ from astropy.coordinates import SkyCoord from gala.coordinates import GreatCircleICRSFrame +from cats.pawprint._footprint import Footprint2D + if TYPE_CHECKING: from typing_extensions import Self @@ -79,8 +83,9 @@ def __init__(self, data: dict[str, Any]) -> None: @classmethod def from_file(cls: type[Self], fname: str) -> Self: + """Create a pawprint from an asdf file.""" data = {} - with asdf.open("fname") as a: + with asdf.open(fname) as a: # first transfer the stuff that goes directly data["stream_name"] = a["stream_name"] data["pawprint_ID"] = a["pawprint_ID"] @@ -115,6 +120,8 @@ def from_file(cls: type[Self], fname: str) -> Self: def pawprint_from_galstreams( cls: type[Self], stream_name: str, pawprint_ID: Any, width: float ) -> Self: + """Create a pawprint from galstreams data.""" + def _get_stream_frame_from_file(summary_file: str) -> GreatCircleICRSFrame: t = apt.QTable.read(summary_file) @@ -162,7 +169,7 @@ def _get_stream_frame_from_file(summary_file: str) -> GreatCircleICRSFrame: try: # one standard deviation on each side (is this wide enough?) data["width"] = 2 * data["track"].track_width["width_phi2"] - except Exception: + except KeyError: data["width"] = width data["stream_vertices"] = data["track"].create_sky_polygon_footprint_from_track( width=data["width"], phi2_offset=0.0 * u.deg @@ -183,6 +190,7 @@ def _get_stream_frame_from_file(summary_file: str) -> GreatCircleICRSFrame: def add_cmd_footprint( self, new_footprint: Any, color: Any, mag: Any, name: str ) -> None: + """Add a color-magnitude diagram footprint.""" if self.cmd_filters is None: self.cmd_filters = dict((name, [color, mag])) self.cmdprint = dict((name, new_footprint)) @@ -191,14 +199,24 @@ def add_cmd_footprint( self.cmdprint[name] = new_footprint def add_pm_footprint(self, new_footprint: Any, name: str) -> None: + """Add a proper motion footprint.""" if self.pmprint is None: self.pmprint = dict((name, new_footprint)) else: self.pmprint[name] = new_footprint def save_pawprint(self) -> None: - # WARNING this doesn't save the track yet - need schema - # WARNING the stream frame doesn't save right either + """Save the pawprint to an asdf file. + + .. warning:: + + This doesn't save the track yet. + + .. todo:: + + Make an ASDF schema for the track and the frame, and then the + pawprint. + """ fname = self.stream_name + self.pawprint_ID + ".asdf" tree = { "stream_name": self.stream_name, diff --git a/src/cats/pawprint/_footprint.py b/src/cats/pawprint/_footprint.py index d18bcd8..838f9aa 100644 --- a/src/cats/pawprint/_footprint.py +++ b/src/cats/pawprint/_footprint.py @@ -1,3 +1,5 @@ +"""Footprint class.""" + from __future__ import annotations __all__ = ["Footprint2D"] @@ -43,10 +45,13 @@ def __init__( self.footprint_type = footprint_type self.footprint = mpl_path(self.vertices) + # =============================================================== + @classmethod def from_vertices( cls: type[Self], vertex_coordinates: Any, footprint_type: Any ) -> Self: + """Initialize from vertices.""" return cls(vertex_coordinates, footprint_type) @classmethod @@ -58,40 +63,48 @@ def from_box( max2: float, footprint_type: str, ) -> Self: - vertices = cls.get_vertices_from_box(min1, max1, min2, max2) + """Initialize from a box.""" + vertices = get_vertices_from_box(min1, max1, min2, max2) return cls(vertices, footprint_type) @classmethod def from_file(cls: type[Self], fname: str) -> Self: + """Initialize from a file.""" with apt.Table.read(fname) as t: vertices = t["vertices"] footprint_type = t["footprint_type"] return cls(vertices, footprint_type) - def get_vertices_from_box( - self, min1: float, max1: float, min2: float, max2: float - ) -> list[list[float]]: - return [[min1, min2], [min1, max2], [max1, min2], [max1, max2]] + # =============================================================== def inside_footprint(self, data: SkyCoord | Any) -> NDArray[bool_] | None: + """Check if a point is inside the footprint.""" if isinstance(data, SkyCoord): if self.stream_frame is None: print("can't!") return None - else: - pts = np.array( - [ - data.transform_to(self.stream_frame).phi1.value, - data.transform_to(self.stream_frame).phi2.value, - ] - ).T - return self.footprint.contains_points(pts) - else: - return self.footprint.contains_points(data) + + pts = np.array( + [ + data.transform_to(self.stream_frame).phi1.value, + data.transform_to(self.stream_frame).phi2.value, + ] + ).T + return self.footprint.contains_points(pts) + + return self.footprint.contains_points(data) def export(self) -> dict[str, Any]: + """Export the footprint to a dictionary.""" data = {} data["stream_frame"] = self.stream_frame data["vertices"] = self.vertices data["footprint_type"] = self.footprint_type return data + + +def get_vertices_from_box( + min1: float, max1: float, min2: float, max2: float +) -> list[list[float]]: + """Get vertices from a box.""" + return [[min1, min2], [min1, max2], [max1, min2], [max1, max2]] diff --git a/src/cats/photometry/_base.py b/src/cats/photometry/_base.py index 3aed24d..03b754b 100644 --- a/src/cats/photometry/_base.py +++ b/src/cats/photometry/_base.py @@ -1,3 +1,5 @@ +"""Base class for photometric surveys.""" + from __future__ import annotations __all__ = ["AbstractPhotometricSurvey"] @@ -54,6 +56,7 @@ def __init_subclass__(cls) -> None: @classmethod def from_tablelike(cls: type[Self], data: str | Table) -> Self: + """Initialize from a table-like object.""" if isinstance(data, str): return cls(QTable.read(data)) return cls(data) diff --git a/src/cats/photometry/_builtin/desi.py b/src/cats/photometry/_builtin/desi.py index 5cedcb3..4247304 100644 --- a/src/cats/photometry/_builtin/desi.py +++ b/src/cats/photometry/_builtin/desi.py @@ -1,3 +1,5 @@ +"""DES year 6 Photometric Survey.""" + from __future__ import annotations __all__ = ["DESY6Phot"] @@ -11,20 +13,28 @@ from cats.photometry._base import AbstractPhotometricSurvey if TYPE_CHECKING: + from dustmaps.map_base import DustMap from numpy import bool_ + from numpy.typing import NDArray class DESY6BandNames(TypedDict): + """DESY6 band names.""" + WAVG_MAG_PSF_G: str WAVG_MAG_PSF_R: str class DESY6ExtinctionCoeffs(TypedDict): + """DESY6 extinction coefficients.""" + g: float r: float class DESY6Phot(AbstractPhotometricSurvey): + """DESY6 Photometric Survey.""" + band_names: ClassVar[DESY6BandNames] = { "WAVG_MAG_PSF_G": "g", "WAVG_MAG_PSF_R": "r", @@ -40,7 +50,7 @@ def get_star_mask(self) -> NDArray[bool_]: return (self.data["EXT_FITVD"] >= 0) & (self.data["EXT_FITVD"] < 2) def get_ext_corrected_phot( - self, dustmaps_cls: tuple[Dustmap] | None = None + self, dustmaps_cls: tuple[DustMap] | None = None ) -> QTable: if dustmaps_cls is None: dustmaps_cls = self.dustmaps_cls @@ -49,17 +59,16 @@ def get_ext_corrected_phot( ebv = dustmaps_cls().query(c) tbl = QTable() - new_band_names = [] for short_name in self.band_names.values(): + # Compute extinction correction Ax = self.extinction_coeffs[short_name] * ebv + + # Apply correction tbl[f"A_{short_name}"] = Ax tbl[f"{short_name}0"] = self.data[f"BDF_MAG_{short_name.upper()}_CORRECTED"] - # - new_band_names.append(f"{short_name}0") - # Metadata - tbl.meta["band_names"] = new_band_names + tbl.meta["band_names"] = [f"{k}0" for k in self.band_names.values()] tbl.meta["dustmap"] = dustmaps_cls.__class__.__name__ return tbl diff --git a/src/cats/photometry/_builtin/gaia.py b/src/cats/photometry/_builtin/gaia.py index b43483b..0b8c723 100644 --- a/src/cats/photometry/_builtin/gaia.py +++ b/src/cats/photometry/_builtin/gaia.py @@ -1,3 +1,5 @@ +"""Gaia DR3 Photometric Survey.""" + from __future__ import annotations __all__ = ["GaiaDR3Phot"] @@ -18,12 +20,16 @@ class GaiaDR3BandNames(TypedDict): + """Gaia DR3 band names.""" + phot_g_mean_mag: str phot_bp_mean_mag: str phot_rp_mean_mag: str class GaiaDR3Phot(AbstractPhotometricSurvey): + """Gaia DR3 Photometric Survey.""" + band_names: ClassVar[GaiaDR3BandNames] = { "phot_g_mean_mag": "G", "phot_bp_mean_mag": "BP", diff --git a/src/cats/photometry/_builtin/ps1.py b/src/cats/photometry/_builtin/ps1.py index 6602822..6ba0ca6 100644 --- a/src/cats/photometry/_builtin/ps1.py +++ b/src/cats/photometry/_builtin/ps1.py @@ -1,3 +1,5 @@ +"""Pan-STARRS1 Photometric Survey.""" + from __future__ import annotations __all__ = ["PS1Phot"] @@ -15,6 +17,8 @@ class PS1BandNames(TypedDict): + """PS1 band names.""" + gMeanPSFMag: str rMeanPSFMag: str iMeanPSFMag: str @@ -23,6 +27,8 @@ class PS1BandNames(TypedDict): class PS1ExtinctionCoeffs(TypedDict): + """PS1 extinction coefficients.""" + g: str r: str i: str @@ -31,6 +37,8 @@ class PS1ExtinctionCoeffs(TypedDict): class PS1Phot(AbstractPhotometricSurvey): + """Pan-STARRS1 Photometric Survey.""" + band_names: ClassVar[PS1BandNames] = { "gMeanPSFMag": "g", "rMeanPSFMag": "r", diff --git a/src/cats/proper_motions.py b/src/cats/proper_motions.py index c57695a..c893292 100644 --- a/src/cats/proper_motions.py +++ b/src/cats/proper_motions.py @@ -11,10 +11,10 @@ from matplotlib.colors import LogNorm from mpl_toolkits.axes_grid1 import make_axes_locatable from scipy.interpolate import InterpolatedUnivariateSpline as IUS -from scipy.spatial import ConvexHull +from scipy.spatial import ConvexHull # pylint: disable=no-name-in-module from cats.inputs import stream_inputs as inputs -from cats.pawprint.pawprint import Footprint2D +from cats.pawprint._footprint import Footprint2D if TYPE_CHECKING: from matplotlib.cm import ScalarMappable @@ -47,7 +47,7 @@ def rough_pm_poly( track_pm2_max = np.max(track.pm_phi2.value) # make rectangular box around this region with an extra 2 mas/yr on each side - rough_pm_poly = np.array( + poly = np.array( [ [track_pm1_min - buffer, track_pm2_min - buffer], [track_pm1_min - buffer, track_pm2_max + buffer], @@ -56,7 +56,7 @@ def rough_pm_poly( ] ) - pawprint.pmprint = Footprint2D(rough_pm_poly, footprint_type="cartesian") + pawprint.pmprint = Footprint2D(poly, footprint_type="cartesian") pm_points = np.vstack((data["pm_phi1_cosphi2_unrefl"], data["pm_phi2_unrefl"])).T rough_pm_mask = pawprint.pmprint.inside_footprint(pm_points) @@ -192,12 +192,9 @@ def __init__( self.data, x_width=3.0, y_width=3.0, draw_histograms=True ) print( - "Post-fitting (pm1_mean, pm2_mean, pm1_std, pm2_std): {} \n".format( - peak_locations - ) + "Post-fitting (pm1_mean, pm2_mean, pm1_std, pm2_std): " + f"{peak_locations} \n" ) - # except: - # print('Skipping peak pm fitting') ################################################ ## Ellipse-like proper motion cut in PM space ## @@ -249,8 +246,6 @@ def __init__( ) = self.build_pm12_polys_and_masks() self.mask = self.pm1_mask & self.pm2_mask & self.spatial_mask_on & self.CMD_mask - return - def from_galstreams(self) -> tuple[IUS, IUS, IUS, IUS]: """Get tracks from galstreams with splines.""" stream_frame = self.stream_obj.stream_frame @@ -751,12 +746,12 @@ def plot_pm_hist( _colorbar(im3) if (pms[0] is None) or (pms[1] is None): - ax1.axvline(self.best_pm[0], ls="--", c="k", lw=1) - ax2.axvline(self.best_pm[0], ls="--", c="k", lw=1) - ax3.axvline(self.best_pm[0], ls="--", c="k", lw=1) - ax1.axhline(self.best_pm[1], ls="--", c="k", lw=1) - ax2.axhline(self.best_pm[1], ls="--", c="k", lw=1) - ax3.axhline(self.best_pm[1], ls="--", c="k", lw=1) + ax1.axvline(self.best_pm_phi1_mean, ls="--", c="k", lw=1) + ax2.axvline(self.best_pm_phi1_mean, ls="--", c="k", lw=1) + ax3.axvline(self.best_pm_phi1_mean, ls="--", c="k", lw=1) + ax1.axhline(self.best_pm_phi2_mean, ls="--", c="k", lw=1) + ax2.axhline(self.best_pm_phi2_mean, ls="--", c="k", lw=1) + ax3.axhline(self.best_pm_phi2_mean, ls="--", c="k", lw=1) else: ax1.axvline(pms[0], ls="--", c="k", lw=1) ax2.axvline(pms[0], ls="--", c="k", lw=1) @@ -905,7 +900,7 @@ def find_peak_location( # draw proper motions of the on-stream, off-stream and residual histogram if draw_histograms: - fig, axes = plt.subplots( + _, axes = plt.subplots( 1, 3, figsize=(15, 5), sharex=True, sharey=True, constrained_layout=True ) diff --git a/tests/cmd/test_GD1.py b/tests_WIP/cmd/GD1.py similarity index 92% rename from tests/cmd/test_GD1.py rename to tests_WIP/cmd/GD1.py index e61e48d..0fc58fe 100644 --- a/tests/cmd/test_GD1.py +++ b/tests_WIP/cmd/GD1.py @@ -1,9 +1,9 @@ from __future__ import annotations import astropy.table as at -from CMD import Isochrone -from cats.pawprint.pawprint import Footprint2D, Pawprint +from cats.cmd import Isochrone +from cats.pawprint import Footprint2D, Pawprint # Note: if already loaded, we can just write: fn = "/Users/Tavangar/CATS_workshop/cats/data/joined-GD-1.fits" diff --git a/tests/cmd/gd1_testcmd.png b/tests_WIP/cmd/gd1_testcmd.png similarity index 100% rename from tests/cmd/gd1_testcmd.png rename to tests_WIP/cmd/gd1_testcmd.png diff --git a/tests/cmd/test_run_GD-1.py b/tests_WIP/cmd/run_GD-1.py similarity index 100% rename from tests/cmd/test_run_GD-1.py rename to tests_WIP/cmd/run_GD-1.py diff --git a/tests/cmd/test_run_Jhelum.py b/tests_WIP/cmd/run_Jhelum.py similarity index 100% rename from tests/cmd/test_run_Jhelum.py rename to tests_WIP/cmd/run_Jhelum.py diff --git a/tests/cmd/test_run_Pal5.py b/tests_WIP/cmd/run_Pal5.py similarity index 100% rename from tests/cmd/test_run_Pal5.py rename to tests_WIP/cmd/run_Pal5.py diff --git a/tests/pawprint/test_mwe.py b/tests_WIP/pawprint/mwe.py similarity index 100% rename from tests/pawprint/test_mwe.py rename to tests_WIP/pawprint/mwe.py