From b863715572cd11399f66dfd44f981185cd64e1f2 Mon Sep 17 00:00:00 2001 From: Jason Pruitt <55477390+Json-To-String@users.noreply.github.com> Date: Mon, 24 Nov 2025 23:58:33 -0500 Subject: [PATCH 1/3] Add first step in transition from keras to torch --- README.md | 54 ++++++++++------------------------------------- pyproject.toml | 52 +++++++++++++++++++++++++++++++++++++++++++++ src/check_cuda.py | 3 +++ 3 files changed, 66 insertions(+), 43 deletions(-) create mode 100644 pyproject.toml create mode 100644 src/check_cuda.py diff --git a/README.md b/README.md index 01479eb8..9b494f37 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ # Current working summary of project: -(Writeup/Masters Project Report will be included in the repo soon) -(Presentation will be added as well) * Take 5437 objects from [Wittmann et al.](https://iopscience.iop.org/article/10.3847/1538-4365/ab4998) * 7 distinct classes from paper - grouped into 2 / binary classification @@ -14,13 +12,13 @@ * Fed model grayscale images to train and classify - performance lowered so we are confident in the method including color. * Train/test split yields good results, but now we wish to move further out from the center of the PCC where Wittmann et al considered, so we use SDSS SQL queries to obtain more data. * Use SQL to define selection regions in the Red Sequence and radially outward from the center of the cluster. We notice that stars appear here, even though their photometric flag suggests they are galaxies. - * Currently trying to find if there are [flags](https://live-sdss4org-dr16.pantheonsite.io/algorithms/flags_detail/) that appear for stars and not galaxies but this is proving difficult + * Currently trying to find if there are [flags](https://www.sdss4.org/dr16/algorithms/image_quality/) that appear for stars and not galaxies but this is proving difficult * One attempt was to look at the Spectroscopic redshift (z) of the object to discriminate between stars and galaxies' flags but their flags seem mixed * Ignoring the presence of galaxies classified as stars, adding new data based off of Spectroscopic Redshift to the training set helped bolster model performance against independent new data. * Confirmed that adding these new objects did in fact yield good results with an independent testset, searching 90 arcmins radially outward from the center of the Perseus Cluster, and subtracting out common objects with training data. (8/27/24) -* Current steps are to ensure project is reproducable, will include requirements.txt and build steps. Restructuring to implement better practices and formats. +* Current steps are to ensure project is reproducible, will include requirements.txt and build steps. Restructuring to implement better practices and formats. * Was recommended to explore k-fold cross validation for another check of model robustness ``` @@ -36,7 +34,7 @@ JPAstro/ (New name may be needed. Below are the most important files in each dir │ └── WriteUpFigs/ ├── Models/ ├── Notebooks/ -│ ├── perseusResNet50.ipynb (main notebook/driver) +│ ├── entire-pipeline.ipynb (main notebook/driver) │ ├── post-training.ipynb │ ├── Resnet Model Testing.ipynb │ ├── flagChecking.ipynb @@ -48,46 +46,16 @@ JPAstro/ (New name may be needed. Below are the most important files in each dir └── SQL/ ├── pcc_crossmatchQuery.txt └── radialSearchNoColor.txt - -*************idea************ -├── *data/ -│ ├── raw/ -│ │ ├── galaxy_images/ -│ │ │ ├── cluster_1/ -│ │ │ │ ├── galaxy_1.png -│ │ │ │ ├── galaxy_2.png -│ │ │ └── ... -│ │ ├── cluster_2/ -│ │ └── ... -│ └── processed/ -│ ├── train/ -│ ├── val/ -│ └── test/ -├── scripts/ -│ ├── data_preprocessing.py -│ ├── train_model.py -│ ├── evaluate_model.py -│ └── utils.py -├── models/ -│ ├── resnet50_pretrained.h5 -│ ├── resnet50_finetuned.h5 -│ └── model_architecture.py -├── results/ -│ ├── training_logs/ -│ │ ├── log_01.txt -│ │ └── log_02.txt -│ ├── model_predictions/ -│ └── evaluation_metrics/ -│ ├── confusion_matrix.png -│ ├── accuracy_report.txt -│ └── ... -└── config/ - ├── config.yaml - └── hyperparameters.json ``` # Installation -## Method 1 Tensorflow on GPU via conda +## Method 1 uv install +1. Install uv +2. `uv sync` +3. `uv pip install SciScript-Python/py3` + +## Method 2 Tensorflow on GPU via conda (being deprecated) 1. Install anaconda 2. `conda update -n base -c defaults conda` -3. `conda env create -f tensorflow_gpu_modified.yaml` +3. `conda env create -f tf_gpu_astro.yaml` 4. `conda activate tf_gpu_astro` + diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..78b66d17 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,52 @@ +[build-system] +requires = ["setuptools>=61.0", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "JPAstro" +version = "0.1.0" +description = "Galaxy Classification via Convolutional Neural Network" +readme = "README.md" +requires-python = ">=3.12" +license = "MIT" +license-files = ["LICENSE.txt"] +authors = [ { name = "Jason Pruitt" } ] + +dependencies = [ + "opencv-python", + "pandas", + "matplotlib", + "seaborn", + "scikit-learn", + "scikit-image", + "ipykernel", + "ruff>=0.13.3", + "pillow>=11.3.0", + "numpy>=2.0.2", + "pyesasky>=2.0.4", +] + +[project.optional-dependencies] +pytorch = [ + "torch>=2.1.0", + "torchvision>=0.16.0", + "torchaudio>=2.1.0", + "torchmetrics", + "tensorboard>=2.14.1", +] +[tool.uv.sources] +torch = [ + { index = "pytorch-cu128", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, +] +torchvision = [ + { index = "pytorch-cu128", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, +] +[[tool.uv.index]] +name = "pytorch-cu128" +url = "https://download.pytorch.org/whl/cu128" +explicit = true +dynamic = [] + +[project.urls] +"Repository" = "https://github.com/Json-To-String/JPAstro" +"Homepage" = "https://github.com/Json-To-String/JPAstro" diff --git a/src/check_cuda.py b/src/check_cuda.py new file mode 100644 index 00000000..73c24648 --- /dev/null +++ b/src/check_cuda.py @@ -0,0 +1,3 @@ +import torch + +print(torch.cuda.is_available()) \ No newline at end of file From 1a9c1f1424b9974b9331a0ac9a5d45c2bad87baa Mon Sep 17 00:00:00 2001 From: Jason Pruitt <55477390+Json-To-String@users.noreply.github.com> Date: Tue, 25 Nov 2025 01:44:28 -0500 Subject: [PATCH 2/3] Recreate pipeline in torch_trainer with old code as reference, much cleaner. Still need to authenticate SciServer --- Notebooks/torch_trainer.ipynb | 1767 +++++++++++++++++++++++++++++++++ README.md | 1 + pyproject.toml | 1 + src/populateDataset.py | 52 +- 4 files changed, 1795 insertions(+), 26 deletions(-) create mode 100644 Notebooks/torch_trainer.ipynb diff --git a/Notebooks/torch_trainer.ipynb b/Notebooks/torch_trainer.ipynb new file mode 100644 index 00000000..96e2a185 --- /dev/null +++ b/Notebooks/torch_trainer.ipynb @@ -0,0 +1,1767 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 30, + "id": "ea344379", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import os\n", + "import glob\n", + "import PIL.Image as Image\n", + "import PIL" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "132fe8c4", + "metadata": {}, + "outputs": [], + "source": [ + "import SciServer.CasJobs as CasJobs # query with CasJobs, the primary database for the SDSS\n", + "import SciServer.SkyServer as SkyServer # show individual objects through SkyServer\n", + "import SciServer.SciDrive" + ] + }, + { + "cell_type": "markdown", + "id": "e9ddf1e5", + "metadata": {}, + "source": [ + "# 1. Acquire data\n", + "\n", + "`PCC.cat` has the ra, dec, label" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "8f2dc168", + "metadata": {}, + "outputs": [], + "source": [ + "df0 = pd.read_fwf('../PCC_cat.txt', header=None)\n" + ] + }, + { + "cell_type": "markdown", + "id": "ff2840b0", + "metadata": {}, + "source": [ + "# Bright objects\n", + "Unfortunately training the model on incredibly faint images had produced poor results. Our first attempt at rectifying this was choosing the brightest images. Since magnitudes go backwards, we choose a $r < 19.4$ magnitude" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "f45a3e60", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0123456789...1617181920label222324files
5NaNPCC-000649.238841.463119.030.000.690.0119.281.35...-0.11NaNNaNNaNNaNLikely merging systemNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.2388_dec=41.4631.png
6NaNPCC-000749.239241.421519.260.030.970.0520.763.79...0.680.880.66NaNNaNLikely background ETG or unresolved sourceNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.2392_dec=41.4215.png
7NaNPCC-000849.241141.499118.510.011.780.0220.952.50...0.820.930.66NaNNaNCluster or background LTGNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.2411_dec=41.4991.png
10NaNPCC-001149.242041.445419.190.011.510.0221.951.02...0.590.700.47NaNNaNCluster or background LTGNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.242_dec=41.4454.png
25NaNPCC-002649.246641.445119.340.012.040.0221.311.20...0.850.980.75NaNNaNLikely cluster or background edge-on disk galaxyNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.2466_dec=41.4451.png
..................................................................
5386NaNPCC-538749.998541.385618.600.012.840.0622.782.45...0.700.820.65NaNNaNCluster or background LTGNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.9985_dec=41.3856.png
5407NaNPCC-540850.001841.680618.160.000.160.0015.853.30...0.12NaNNaNNaNNaNLikely background ETG or unresolved sourceNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=50.0018_dec=41.6806.png
5416NaNPCC-541750.002841.338418.840.011.270.0220.742.42...0.750.780.71NaNNaNLikely background ETG or unresolved sourceNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=50.0028_dec=41.3384.png
5422NaNPCC-542350.004041.341017.500.011.860.0220.454.00...0.760.930.69NaNNaNLikely background ETG or unresolved sourceNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=50.004_dec=41.341.png
5427NaNPCC-542850.005141.655717.830.012.820.0421.882.69...0.660.730.56NaNNaNCluster or background LTGNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=50.0051_dec=41.6557.png
\n", + "

272 rows × 26 columns

\n", + "
" + ], + "text/plain": [ + " 0 1 2 3 4 5 6 7 8 9 \\\n", + "5 NaN PCC-0006 49.2388 41.4631 19.03 0.00 0.69 0.01 19.28 1.35 \n", + "6 NaN PCC-0007 49.2392 41.4215 19.26 0.03 0.97 0.05 20.76 3.79 \n", + "7 NaN PCC-0008 49.2411 41.4991 18.51 0.01 1.78 0.02 20.95 2.50 \n", + "10 NaN PCC-0011 49.2420 41.4454 19.19 0.01 1.51 0.02 21.95 1.02 \n", + "25 NaN PCC-0026 49.2466 41.4451 19.34 0.01 2.04 0.02 21.31 1.20 \n", + "... .. ... ... ... ... ... ... ... ... ... \n", + "5386 NaN PCC-5387 49.9985 41.3856 18.60 0.01 2.84 0.06 22.78 2.45 \n", + "5407 NaN PCC-5408 50.0018 41.6806 18.16 0.00 0.16 0.00 15.85 3.30 \n", + "5416 NaN PCC-5417 50.0028 41.3384 18.84 0.01 1.27 0.02 20.74 2.42 \n", + "5422 NaN PCC-5423 50.0040 41.3410 17.50 0.01 1.86 0.02 20.45 4.00 \n", + "5427 NaN PCC-5428 50.0051 41.6557 17.83 0.01 2.82 0.04 21.88 2.69 \n", + "\n", + " ... 16 17 18 19 20 \\\n", + "5 ... -0.11 NaN NaN NaN NaN \n", + "6 ... 0.68 0.88 0.66 NaN NaN \n", + "7 ... 0.82 0.93 0.66 NaN NaN \n", + "10 ... 0.59 0.70 0.47 NaN NaN \n", + "25 ... 0.85 0.98 0.75 NaN NaN \n", + "... ... ... ... ... ... ... \n", + "5386 ... 0.70 0.82 0.65 NaN NaN \n", + "5407 ... 0.12 NaN NaN NaN NaN \n", + "5416 ... 0.75 0.78 0.71 NaN NaN \n", + "5422 ... 0.76 0.93 0.69 NaN NaN \n", + "5427 ... 0.66 0.73 0.56 NaN NaN \n", + "\n", + " label 22 23 \\\n", + "5 Likely merging system NaN NaN \n", + "6 Likely background ETG or unresolved source NaN NaN \n", + "7 Cluster or background LTG NaN NaN \n", + "10 Cluster or background LTG NaN NaN \n", + "25 Likely cluster or background edge-on disk galaxy NaN NaN \n", + "... ... ... ... \n", + "5386 Cluster or background LTG NaN NaN \n", + "5407 Likely background ETG or unresolved source NaN NaN \n", + "5416 Likely background ETG or unresolved source NaN NaN \n", + "5422 Likely background ETG or unresolved source NaN NaN \n", + "5427 Cluster or background LTG NaN NaN \n", + "\n", + " 24 \\\n", + "5 http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "6 http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "7 http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "10 http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "25 http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "... ... \n", + "5386 http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "5407 http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "5416 http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "5422 http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "5427 http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "\n", + " files \n", + "5 sdss_ra=49.2388_dec=41.4631.png \n", + "6 sdss_ra=49.2392_dec=41.4215.png \n", + "7 sdss_ra=49.2411_dec=41.4991.png \n", + "10 sdss_ra=49.242_dec=41.4454.png \n", + "25 sdss_ra=49.2466_dec=41.4451.png \n", + "... ... \n", + "5386 sdss_ra=49.9985_dec=41.3856.png \n", + "5407 sdss_ra=50.0018_dec=41.6806.png \n", + "5416 sdss_ra=50.0028_dec=41.3384.png \n", + "5422 sdss_ra=50.004_dec=41.341.png \n", + "5427 sdss_ra=50.0051_dec=41.6557.png \n", + "\n", + "[272 rows x 26 columns]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "brightDF = df0[df0[4] <= 19.4].copy()\n", + "\n", + "brightDF['files'] = (\n", + " \"sdss_ra=\" + brightDF[2].astype(str) +\n", + " \"_dec=\" + brightDF[3].astype(str) +\n", + " \".png\"\n", + ")\n", + "\n", + "brightDF = brightDF.rename(columns={21: \"label\"})\n", + "brightDF" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "393bafa6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0123456789...17181920label222324filesbinary_label
0NaNPCC-292849.687641.226017.820.011.870.0220.843.10...0.270.25NaNNaNCluster or background LTGNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.6876_dec=41.226.png0
1NaNPCC-340849.746341.637719.340.001.400.0121.933.27...1.400.76NaNNaNLikely background ETG or unresolved sourceNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.7463_dec=41.6377.png0
2NaNPCC-496949.943741.378618.530.001.700.0021.370.52...0.320.32NaNNaNCluster or background LTGNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.9437_dec=41.3786.png0
3NaNPCC-158149.508241.406919.000.001.410.0121.271.63...0.890.71NaNNaNCluster or background LTGNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.5082_dec=41.4069.png0
4NaNPCC-057149.343141.598719.090.001.900.0121.501.13...1.040.78NaNNaNCluster or background LTGNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.3431_dec=41.5987.png0
..................................................................
247NaNPCC-504749.952341.557918.070.005.000.0323.171.27...NaN0.28NaNNaNLikely dE/ETGcluster candidateUnsureabout nucleationhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.9523_dec=41.5579.png1
248NaNPCC-099349.414941.561218.910.012.950.0223.201.26...0.630.46NaNNaNLikely dE/ETGcluster candidateUnsureabout nucleationhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.4149_dec=41.5612.png1
249NaNPCC-455149.890241.553617.050.001.090.0018.992.67...0.600.65NaNNaNLikely dE/ETGcluster candidater Brigt central sourcehttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.8902_dec=41.5536.png1
250NaNPCC-295949.692541.404917.430.007.620.0423.071.78...0.640.52NaNNaNLikely dE/ETGcluster candidateUnsureabout nucleationhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.6925_dec=41.4049.png1
251NaNPCC-487649.932641.457015.070.002.950.0019.343.75...0.740.68NaNNaNLikely dE/ETGcluster candidater Brigt central sourcehttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.9326_dec=41.457.png1
\n", + "

252 rows × 27 columns

\n", + "
" + ], + "text/plain": [ + " 0 1 2 3 4 5 6 7 8 9 \\\n", + "0 NaN PCC-2928 49.6876 41.2260 17.82 0.01 1.87 0.02 20.84 3.10 \n", + "1 NaN PCC-3408 49.7463 41.6377 19.34 0.00 1.40 0.01 21.93 3.27 \n", + "2 NaN PCC-4969 49.9437 41.3786 18.53 0.00 1.70 0.00 21.37 0.52 \n", + "3 NaN PCC-1581 49.5082 41.4069 19.00 0.00 1.41 0.01 21.27 1.63 \n", + "4 NaN PCC-0571 49.3431 41.5987 19.09 0.00 1.90 0.01 21.50 1.13 \n", + ".. .. ... ... ... ... ... ... ... ... ... \n", + "247 NaN PCC-5047 49.9523 41.5579 18.07 0.00 5.00 0.03 23.17 1.27 \n", + "248 NaN PCC-0993 49.4149 41.5612 18.91 0.01 2.95 0.02 23.20 1.26 \n", + "249 NaN PCC-4551 49.8902 41.5536 17.05 0.00 1.09 0.00 18.99 2.67 \n", + "250 NaN PCC-2959 49.6925 41.4049 17.43 0.00 7.62 0.04 23.07 1.78 \n", + "251 NaN PCC-4876 49.9326 41.4570 15.07 0.00 2.95 0.00 19.34 3.75 \n", + "\n", + " ... 17 18 19 20 label \\\n", + "0 ... 0.27 0.25 NaN NaN Cluster or background LTG \n", + "1 ... 1.40 0.76 NaN NaN Likely background ETG or unresolved source \n", + "2 ... 0.32 0.32 NaN NaN Cluster or background LTG \n", + "3 ... 0.89 0.71 NaN NaN Cluster or background LTG \n", + "4 ... 1.04 0.78 NaN NaN Cluster or background LTG \n", + ".. ... ... ... ... ... ... \n", + "247 ... NaN 0.28 NaN NaN Likely dE/ETGcluster candidate \n", + "248 ... 0.63 0.46 NaN NaN Likely dE/ETGcluster candidate \n", + "249 ... 0.60 0.65 NaN NaN Likely dE/ETGcluster candidate \n", + "250 ... 0.64 0.52 NaN NaN Likely dE/ETGcluster candidate \n", + "251 ... 0.74 0.68 NaN NaN Likely dE/ETGcluster candidate \n", + "\n", + " 22 23 \\\n", + "0 NaN NaN \n", + "1 NaN NaN \n", + "2 NaN NaN \n", + "3 NaN NaN \n", + "4 NaN NaN \n", + ".. ... ... \n", + "247 Unsure about nucleation \n", + "248 Unsure about nucleation \n", + "249 r Brig t central source \n", + "250 Unsure about nucleation \n", + "251 r Brig t central source \n", + "\n", + " 24 \\\n", + "0 http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "1 http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "2 http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "3 http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "4 http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + ".. ... \n", + "247 http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "248 http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "249 http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "250 http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "251 http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "\n", + " files binary_label \n", + "0 sdss_ra=49.6876_dec=41.226.png 0 \n", + "1 sdss_ra=49.7463_dec=41.6377.png 0 \n", + "2 sdss_ra=49.9437_dec=41.3786.png 0 \n", + "3 sdss_ra=49.5082_dec=41.4069.png 0 \n", + "4 sdss_ra=49.3431_dec=41.5987.png 0 \n", + ".. ... ... \n", + "247 sdss_ra=49.9523_dec=41.5579.png 1 \n", + "248 sdss_ra=49.4149_dec=41.5612.png 1 \n", + "249 sdss_ra=49.8902_dec=41.5536.png 1 \n", + "250 sdss_ra=49.6925_dec=41.4049.png 1 \n", + "251 sdss_ra=49.9326_dec=41.457.png 1 \n", + "\n", + "[252 rows x 27 columns]" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "L_BG_LTG = \"Cluster or background LTG\"\n", + "BG_ETG = \"Likely background ETG or unresolved source\"\n", + "EDGE_DISK = \"Likely cluster or background edge-on disk galaxy\"\n", + "dE_ETG = \"Likely dE/ETGcluster candidate\"\n", + "MERGING = \"Likely merging system\"\n", + "POSS_dE = \"Possible dE/ETGcluster candidate\"\n", + "WEAK_BG = \"background galaxy with possibly weak substructure\"\n", + "desired = {\n", + " L_BG_LTG: 384,\n", + " BG_ETG: 400,\n", + " EDGE_DISK: 400,\n", + " dE_ETG: None,\n", + " MERGING: None,\n", + " POSS_dE: None,\n", + " WEAK_BG: None,\n", + "}\n", + "\n", + "groups = []\n", + "for lbl, group in brightDF.groupby(\"label\"):\n", + " n = desired.get(lbl) # type: ignore\n", + " if n is None:\n", + " groups.append(group)\n", + " else:\n", + " k = min(n, len(group))\n", + " groups.append(group.sample(n=k, random_state=42))\n", + "\n", + "downSampleDf0 = pd.concat(groups, ignore_index=True)\n", + "\n", + "# old labels 0,1,2,6 -> new label 0 : background, \n", + "# old labels 3 + 5 -> new label 1 : cluster galaxy\n", + "map_to_binary = {\n", + " L_BG_LTG: 0,\n", + " BG_ETG: 0,\n", + " EDGE_DISK: 0,\n", + " WEAK_BG: 0,\n", + " \n", + " dE_ETG: 1,\n", + " POSS_dE: 1,\n", + " MERGING: 1, # if this belongs with the positives\n", + "}\n", + "\n", + "downSampleDf1 = downSampleDf0.assign(\n", + " binary_label = downSampleDf0['label'].map(map_to_binary)\n", + ")\n", + "\n", + "# rebalance to equalize classes 0 vs. 1\n", + "df0_bin = downSampleDf1[downSampleDf1['binary_label'] == 0]\n", + "df1_bin = downSampleDf1[downSampleDf1['binary_label'] == 1]\n", + "\n", + "min_size = min(len(df0_bin), len(df1_bin))\n", + "\n", + "downSampleDf1_balanced = pd.concat([\n", + " df0_bin.sample(n=min_size, random_state=42),\n", + " df1_bin.sample(n=min_size, random_state=42)\n", + "]).reset_index(drop=True)\n", + "\n", + "downSampleDf1_balanced\n" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "d57144a0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0123456789...1920label222324filesbinary_labelradec
0NaNPCC-260549.646941.450518.420.001.930.0121.053.24...NaNNaNCluster or background LTGNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.6469_dec=41.4505.png049.646941.4505
1NaNPCC-076649.375741.313215.980.000.260.0221.821.58...NaNNaNCluster or background LTGNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.3757_dec=41.3132.png049.375741.3132
2NaNPCC-016849.275841.541517.690.004.860.0221.931.66...NaNNaNCluster or background LTGNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.2758_dec=41.5415.png049.275841.5415
3NaNPCC-051449.332941.499918.530.001.950.0021.440.51...NaNNaNCluster or background LTGNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.3329_dec=41.4999.png049.332941.4999
4NaNPCC-133649.470941.346519.190.002.220.0122.070.80...NaNNaNCluster or background LTGNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.4709_dec=41.3465.png049.470941.3465
..................................................................
267NaNPCC-219549.602841.536718.460.002.240.0121.881.99...Clusterorbackground galaxy with possibly weak substructureNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.6028_dec=41.5367.png049.602841.5367
268NaNPCC-297149.694741.587619.330.000.840.0020.791.08...Clusterorbackground galaxy with possibly weak substructureNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.6947_dec=41.5876.png049.694741.5876
269NaNPCC-328649.731441.556318.950.003.700.0222.711.10...Clusterorbackground galaxy with possibly weak substructureNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.7314_dec=41.5563.png049.731441.5563
270NaNPCC-346249.754541.302718.940.000.700.0019.662.14...Clusterorbackground galaxy with possibly weak substructureNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.7545_dec=41.3027.png049.754541.3027
271NaNPCC-496749.943541.603319.310.010.900.0120.872.55...Clusterorbackground galaxy with possibly weak substructureNaNNaNhttp://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl...sdss_ra=49.9435_dec=41.6033.png049.943541.6033
\n", + "

272 rows × 29 columns

\n", + "
" + ], + "text/plain": [ + " 0 1 2 3 4 5 6 7 8 9 \\\n", + "0 NaN PCC-2605 49.6469 41.4505 18.42 0.00 1.93 0.01 21.05 3.24 \n", + "1 NaN PCC-0766 49.3757 41.3132 15.98 0.00 0.26 0.02 21.82 1.58 \n", + "2 NaN PCC-0168 49.2758 41.5415 17.69 0.00 4.86 0.02 21.93 1.66 \n", + "3 NaN PCC-0514 49.3329 41.4999 18.53 0.00 1.95 0.00 21.44 0.51 \n", + "4 NaN PCC-1336 49.4709 41.3465 19.19 0.00 2.22 0.01 22.07 0.80 \n", + ".. .. ... ... ... ... ... ... ... ... ... \n", + "267 NaN PCC-2195 49.6028 41.5367 18.46 0.00 2.24 0.01 21.88 1.99 \n", + "268 NaN PCC-2971 49.6947 41.5876 19.33 0.00 0.84 0.00 20.79 1.08 \n", + "269 NaN PCC-3286 49.7314 41.5563 18.95 0.00 3.70 0.02 22.71 1.10 \n", + "270 NaN PCC-3462 49.7545 41.3027 18.94 0.00 0.70 0.00 19.66 2.14 \n", + "271 NaN PCC-4967 49.9435 41.6033 19.31 0.01 0.90 0.01 20.87 2.55 \n", + "\n", + " ... 19 20 label \\\n", + "0 ... NaN NaN Cluster or background LTG \n", + "1 ... NaN NaN Cluster or background LTG \n", + "2 ... NaN NaN Cluster or background LTG \n", + "3 ... NaN NaN Cluster or background LTG \n", + "4 ... NaN NaN Cluster or background LTG \n", + ".. ... ... ... ... \n", + "267 ... Cluster or background galaxy with possibly weak substructure \n", + "268 ... Cluster or background galaxy with possibly weak substructure \n", + "269 ... Cluster or background galaxy with possibly weak substructure \n", + "270 ... Cluster or background galaxy with possibly weak substructure \n", + "271 ... Cluster or background galaxy with possibly weak substructure \n", + "\n", + " 22 23 24 \\\n", + "0 NaN NaN http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "1 NaN NaN http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "2 NaN NaN http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "3 NaN NaN http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "4 NaN NaN http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + ".. ... ... ... \n", + "267 NaN NaN http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "268 NaN NaN http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "269 NaN NaN http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "270 NaN NaN http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "271 NaN NaN http://dc.zah.uni-heidelberg.de/pcc/q/stamp/dl... \n", + "\n", + " files binary_label ra dec \n", + "0 sdss_ra=49.6469_dec=41.4505.png 0 49.6469 41.4505 \n", + "1 sdss_ra=49.3757_dec=41.3132.png 0 49.3757 41.3132 \n", + "2 sdss_ra=49.2758_dec=41.5415.png 0 49.2758 41.5415 \n", + "3 sdss_ra=49.3329_dec=41.4999.png 0 49.3329 41.4999 \n", + "4 sdss_ra=49.4709_dec=41.3465.png 0 49.4709 41.3465 \n", + ".. ... ... ... ... \n", + "267 sdss_ra=49.6028_dec=41.5367.png 0 49.6028 41.5367 \n", + "268 sdss_ra=49.6947_dec=41.5876.png 0 49.6947 41.5876 \n", + "269 sdss_ra=49.7314_dec=41.5563.png 0 49.7314 41.5563 \n", + "270 sdss_ra=49.7545_dec=41.3027.png 0 49.7545 41.3027 \n", + "271 sdss_ra=49.9435_dec=41.6033.png 0 49.9435 41.6033 \n", + "\n", + "[272 rows x 29 columns]" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "PCC_list = downSampleDf1['files'].to_list()\n", + "columnLength = len(PCC_list)\n", + "ra_list = [None] * columnLength\n", + "dec_list = [None] * columnLength\n", + "for i in range(columnLength):\n", + " splitted = PCC_list[i].split('=')\n", + " ra_list[i] = float(splitted[1][:-4])\n", + " dec_list[i] = float(splitted[2][:-4])\n", + "\n", + "downSampleDf1['ra'] = ra_list\n", + "downSampleDf1['dec'] = dec_list\n", + "downSampleDf1" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "f82a0132", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "binary_label\n", + "0 146\n", + "1 126\n", + "Name: count, dtype: int64\n", + "binary_label\n", + "0 126\n", + "1 126\n", + "Name: count, dtype: int64\n" + ] + } + ], + "source": [ + "print(downSampleDf1['binary_label'].value_counts())\n", + "print(downSampleDf1_balanced['binary_label'].value_counts())\n" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "14e81668", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "specbgs: 117\n", + "specmems: 116\n", + "total specs 233\n", + "True\n", + "pccbgs: 146\n", + "pccmems: 126\n", + "total pccs: 272\n", + "True\n", + "Total: 505 \n" + ] + } + ], + "source": [ + "searchDf = pd.read_csv('../Sheets/SpecSearchNoCuts.csv')\n", + "searchDf = searchDf.drop_duplicates(subset = 'objID') # sometimes SDSS has some objID duplicates\n", + "# pcc_crossDf = pcc_crossDf.drop_duplicates(subset = 'objID')\n", + "\n", + "## Members 0.01 < spec-z < 0.033, else are NonMembers \n", + "specMembers = searchDf['z'].between(0.01, 0.033)\n", + "specNonMembers = np.invert(specMembers)\n", + "\n", + "searchDf_specMembers = searchDf.loc[specMembers].copy()\n", + "searchDf_specMembers['binary_label'] = np.ones(int(searchDf_specMembers.shape[0]), dtype = int)\n", + "\n", + "searchDf_specNonMembers = searchDf.loc[specNonMembers].copy()\n", + "searchDf_specNonMembers['binary_label'] = np.zeros(int(searchDf_specNonMembers.shape[0]), dtype = int)\n", + "\n", + "pcc_nonMembers = downSampleDf1.loc[(downSampleDf1['binary_label'] == 0)]\n", + "pcc_Members = downSampleDf1.loc[(downSampleDf1['binary_label'] == 1)]\n", + "\n", + "## sanity checks\n", + "print('specbgs:', searchDf_specNonMembers.shape[0])\n", + "print('specmems:', searchDf_specMembers.shape[0])\n", + "print('total specs', searchDf_specNonMembers.shape[0] + searchDf_specMembers.shape[0])\n", + "print(searchDf_specNonMembers.shape[0] + searchDf_specMembers.shape[0] == searchDf.shape[0])\n", + "\n", + "print('pccbgs:', pcc_nonMembers.shape[0])\n", + "print('pccmems:', pcc_Members.shape[0])\n", + "print('total pccs:', pcc_nonMembers.shape[0] + pcc_Members.shape[0])\n", + "print(pcc_nonMembers.shape[0] + pcc_Members.shape[0] == downSampleDf1.shape[0])\n", + "\n", + "print(f'Total: {searchDf_specNonMembers.shape[0] + searchDf_specMembers.shape[0] + pcc_nonMembers.shape[0] + pcc_Members.shape[0]} ')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "4d2449ed", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
radecbinary_label
PCC_Bg049.64690041.4505000
149.37570041.3132000
249.27580041.5415000
349.33290041.4999000
449.47090041.3465000
...............
Spec_Mems20650.62274641.0504451
21050.69459341.9412301
21149.70584940.8275891
21249.11265841.1802161
21349.47027540.8972441
\n", + "

505 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " ra dec binary_label\n", + "PCC_Bg 0 49.646900 41.450500 0\n", + " 1 49.375700 41.313200 0\n", + " 2 49.275800 41.541500 0\n", + " 3 49.332900 41.499900 0\n", + " 4 49.470900 41.346500 0\n", + "... ... ... ...\n", + "Spec_Mems 206 50.622746 41.050445 1\n", + " 210 50.694593 41.941230 1\n", + " 211 49.705849 40.827589 1\n", + " 212 49.112658 41.180216 1\n", + " 213 49.470275 40.897244 1\n", + "\n", + "[505 rows x 3 columns]" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# pcc_crossDf[['objID', 'ra', 'dec']]\n", + "trainObjs = pd.concat([pcc_nonMembers[['ra', 'dec', 'binary_label']],\n", + " pcc_Members[['ra', 'dec', 'binary_label']],\n", + " searchDf_specNonMembers[['ra', 'dec', 'binary_label']],\n", + " searchDf_specMembers[['ra', 'dec', 'binary_label']]],\n", + " keys = ('PCC_Bg', 'PCC_Mems', 'Spec_Bg', 'Spec_Mems')) # want to preserve where these come from\n", + "\n", + "trainObjs" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "c01a43c0", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n", + "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", + " token = Authentication.getToken()\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mKeyboardInterrupt\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[31]\u001b[39m\u001b[32m, line 19\u001b[39m\n\u001b[32m 16\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 17\u001b[39m \u001b[38;5;66;03m# for id, r, d in zip(searchDf['objID'], trainObjs['ra'], trainObjs['dec']):\u001b[39;00m\n\u001b[32m 18\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m r, d, l \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m(trainObjs[\u001b[33m'\u001b[39m\u001b[33mra\u001b[39m\u001b[33m'\u001b[39m], trainObjs[\u001b[33m'\u001b[39m\u001b[33mdec\u001b[39m\u001b[33m'\u001b[39m], trainObjs[\u001b[33m'\u001b[39m\u001b[33mbinary_label\u001b[39m\u001b[33m'\u001b[39m]):\n\u001b[32m---> \u001b[39m\u001b[32m19\u001b[39m img_array = \u001b[43mSkyServer\u001b[49m\u001b[43m.\u001b[49m\u001b[43mgetJpegImgCutout\u001b[49m\u001b[43m(\u001b[49m\u001b[43mra\u001b[49m\u001b[43m=\u001b[49m\u001b[43mr\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdec\u001b[49m\u001b[43m=\u001b[49m\u001b[43md\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mwidth\u001b[49m\u001b[43m=\u001b[49m\u001b[43mimg_width\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mheight\u001b[49m\u001b[43m=\u001b[49m\u001b[43mimg_height\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mscale\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m0.1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[32m 20\u001b[39m \u001b[43m \u001b[49m\u001b[43mdataRelease\u001b[49m\u001b[43m=\u001b[49m\u001b[43mSkyServer_DataRelease\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 21\u001b[39m \u001b[38;5;66;03m# print(f'{id}-label={labeler(z)}')\u001b[39;00m\n\u001b[32m 22\u001b[39m \u001b[38;5;66;03m# outPicTemplate = f'{id}-label={labeler(z)}.png'\u001b[39;00m\n\u001b[32m 23\u001b[39m outPicTemplate = \u001b[33mf\u001b[39m\u001b[33m'\u001b[39m\u001b[33msdss_ra=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mr\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m_dec=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00md\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m-label=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00ml\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m.png\u001b[39m\u001b[33m'\u001b[39m\n", + "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:128\u001b[39m, in \u001b[36mgetJpegImgCutout\u001b[39m\u001b[34m(ra, dec, scale, width, height, opt, query, dataRelease)\u001b[39m\n\u001b[32m 125\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m token \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m token != \u001b[33m\"\u001b[39m\u001b[33m\"\u001b[39m:\n\u001b[32m 126\u001b[39m headers[\u001b[33m'\u001b[39m\u001b[33mX-Auth-Token\u001b[39m\u001b[33m'\u001b[39m] = token\n\u001b[32m--> \u001b[39m\u001b[32m128\u001b[39m response = \u001b[43mrequests\u001b[49m\u001b[43m.\u001b[49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m=\u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[32m 129\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m response.status_code != \u001b[32m200\u001b[39m:\n\u001b[32m 130\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m response.status_code == \u001b[32m404\u001b[39m \u001b[38;5;129;01mor\u001b[39;00m response.status_code == \u001b[32m500\u001b[39m:\n", + "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\requests\\api.py:73\u001b[39m, in \u001b[36mget\u001b[39m\u001b[34m(url, params, **kwargs)\u001b[39m\n\u001b[32m 62\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mget\u001b[39m(url, params=\u001b[38;5;28;01mNone\u001b[39;00m, **kwargs):\n\u001b[32m 63\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33mr\u001b[39m\u001b[33;03m\"\"\"Sends a GET request.\u001b[39;00m\n\u001b[32m 64\u001b[39m \n\u001b[32m 65\u001b[39m \u001b[33;03m :param url: URL for the new :class:`Request` object.\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 70\u001b[39m \u001b[33;03m :rtype: requests.Response\u001b[39;00m\n\u001b[32m 71\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m73\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mget\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[43m=\u001b[49m\u001b[43mparams\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\requests\\api.py:59\u001b[39m, in \u001b[36mrequest\u001b[39m\u001b[34m(method, url, **kwargs)\u001b[39m\n\u001b[32m 55\u001b[39m \u001b[38;5;66;03m# By using the 'with' statement we are sure the session is closed, thus we\u001b[39;00m\n\u001b[32m 56\u001b[39m \u001b[38;5;66;03m# avoid leaving sockets open which can trigger a ResourceWarning in some\u001b[39;00m\n\u001b[32m 57\u001b[39m \u001b[38;5;66;03m# cases, and look like a memory leak in others.\u001b[39;00m\n\u001b[32m 58\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m sessions.Session() \u001b[38;5;28;01mas\u001b[39;00m session:\n\u001b[32m---> \u001b[39m\u001b[32m59\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43msession\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m=\u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m=\u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\requests\\sessions.py:589\u001b[39m, in \u001b[36mSession.request\u001b[39m\u001b[34m(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\u001b[39m\n\u001b[32m 584\u001b[39m send_kwargs = {\n\u001b[32m 585\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mtimeout\u001b[39m\u001b[33m\"\u001b[39m: timeout,\n\u001b[32m 586\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mallow_redirects\u001b[39m\u001b[33m\"\u001b[39m: allow_redirects,\n\u001b[32m 587\u001b[39m }\n\u001b[32m 588\u001b[39m send_kwargs.update(settings)\n\u001b[32m--> \u001b[39m\u001b[32m589\u001b[39m resp = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mprep\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43msend_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 591\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m resp\n", + "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\requests\\sessions.py:703\u001b[39m, in \u001b[36mSession.send\u001b[39m\u001b[34m(self, request, **kwargs)\u001b[39m\n\u001b[32m 700\u001b[39m start = preferred_clock()\n\u001b[32m 702\u001b[39m \u001b[38;5;66;03m# Send the request\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m703\u001b[39m r = \u001b[43madapter\u001b[49m\u001b[43m.\u001b[49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 705\u001b[39m \u001b[38;5;66;03m# Total elapsed time of the request (approximately)\u001b[39;00m\n\u001b[32m 706\u001b[39m elapsed = preferred_clock() - start\n", + "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\requests\\adapters.py:644\u001b[39m, in \u001b[36mHTTPAdapter.send\u001b[39m\u001b[34m(self, request, stream, timeout, verify, cert, proxies)\u001b[39m\n\u001b[32m 641\u001b[39m timeout = TimeoutSauce(connect=timeout, read=timeout)\n\u001b[32m 643\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m644\u001b[39m resp = \u001b[43mconn\u001b[49m\u001b[43m.\u001b[49m\u001b[43murlopen\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 645\u001b[39m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m.\u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 646\u001b[39m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m=\u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 647\u001b[39m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m.\u001b[49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 648\u001b[39m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m.\u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 649\u001b[39m \u001b[43m \u001b[49m\u001b[43mredirect\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 650\u001b[39m \u001b[43m \u001b[49m\u001b[43massert_same_host\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 651\u001b[39m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 652\u001b[39m \u001b[43m \u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 653\u001b[39m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mmax_retries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 654\u001b[39m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 655\u001b[39m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[43m=\u001b[49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 656\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 658\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m (ProtocolError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[32m 659\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m(err, request=request)\n", + "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\urllib3\\connectionpool.py:787\u001b[39m, in \u001b[36mHTTPConnectionPool.urlopen\u001b[39m\u001b[34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, preload_content, decode_content, **response_kw)\u001b[39m\n\u001b[32m 784\u001b[39m response_conn = conn \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m release_conn \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 786\u001b[39m \u001b[38;5;66;03m# Make the request on the HTTPConnection object\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m787\u001b[39m response = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_make_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 788\u001b[39m \u001b[43m \u001b[49m\u001b[43mconn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 789\u001b[39m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 790\u001b[39m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 791\u001b[39m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtimeout_obj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 792\u001b[39m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[43m=\u001b[49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 793\u001b[39m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m=\u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 794\u001b[39m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[43m=\u001b[49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 795\u001b[39m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[43m=\u001b[49m\u001b[43mretries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 796\u001b[39m \u001b[43m \u001b[49m\u001b[43mresponse_conn\u001b[49m\u001b[43m=\u001b[49m\u001b[43mresponse_conn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 797\u001b[39m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[43m=\u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 798\u001b[39m \u001b[43m \u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[43m=\u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 799\u001b[39m \u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mresponse_kw\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 800\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 802\u001b[39m \u001b[38;5;66;03m# Everything went great!\u001b[39;00m\n\u001b[32m 803\u001b[39m clean_exit = \u001b[38;5;28;01mTrue\u001b[39;00m\n", + "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\urllib3\\connectionpool.py:534\u001b[39m, in \u001b[36mHTTPConnectionPool._make_request\u001b[39m\u001b[34m(self, conn, method, url, body, headers, retries, timeout, chunked, response_conn, preload_content, decode_content, enforce_content_length)\u001b[39m\n\u001b[32m 532\u001b[39m \u001b[38;5;66;03m# Receive the response from the server\u001b[39;00m\n\u001b[32m 533\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m534\u001b[39m response = \u001b[43mconn\u001b[49m\u001b[43m.\u001b[49m\u001b[43mgetresponse\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 535\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m (BaseSSLError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 536\u001b[39m \u001b[38;5;28mself\u001b[39m._raise_timeout(err=e, url=url, timeout_value=read_timeout)\n", + "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\urllib3\\connection.py:565\u001b[39m, in \u001b[36mHTTPConnection.getresponse\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 562\u001b[39m _shutdown = \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m.sock, \u001b[33m\"\u001b[39m\u001b[33mshutdown\u001b[39m\u001b[33m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[32m 564\u001b[39m \u001b[38;5;66;03m# Get the response from http.client.HTTPConnection\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m565\u001b[39m httplib_response = \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mgetresponse\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 567\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 568\u001b[39m assert_header_parsing(httplib_response.msg)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~\\AppData\\Roaming\\uv\\python\\cpython-3.13.7-windows-x86_64-none\\Lib\\http\\client.py:1430\u001b[39m, in \u001b[36mHTTPConnection.getresponse\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 1428\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 1429\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1430\u001b[39m \u001b[43mresponse\u001b[49m\u001b[43m.\u001b[49m\u001b[43mbegin\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1431\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m:\n\u001b[32m 1432\u001b[39m \u001b[38;5;28mself\u001b[39m.close()\n", + "\u001b[36mFile \u001b[39m\u001b[32m~\\AppData\\Roaming\\uv\\python\\cpython-3.13.7-windows-x86_64-none\\Lib\\http\\client.py:331\u001b[39m, in \u001b[36mHTTPResponse.begin\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 329\u001b[39m \u001b[38;5;66;03m# read until we get a non-100 response\u001b[39;00m\n\u001b[32m 330\u001b[39m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m331\u001b[39m version, status, reason = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_read_status\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 332\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m status != CONTINUE:\n\u001b[32m 333\u001b[39m \u001b[38;5;28;01mbreak\u001b[39;00m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~\\AppData\\Roaming\\uv\\python\\cpython-3.13.7-windows-x86_64-none\\Lib\\http\\client.py:292\u001b[39m, in \u001b[36mHTTPResponse._read_status\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 291\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_read_status\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[32m--> \u001b[39m\u001b[32m292\u001b[39m line = \u001b[38;5;28mstr\u001b[39m(\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mfp\u001b[49m\u001b[43m.\u001b[49m\u001b[43mreadline\u001b[49m\u001b[43m(\u001b[49m\u001b[43m_MAXLINE\u001b[49m\u001b[43m \u001b[49m\u001b[43m+\u001b[49m\u001b[43m \u001b[49m\u001b[32;43m1\u001b[39;49m\u001b[43m)\u001b[49m, \u001b[33m\"\u001b[39m\u001b[33miso-8859-1\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 293\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(line) > _MAXLINE:\n\u001b[32m 294\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m LineTooLong(\u001b[33m\"\u001b[39m\u001b[33mstatus line\u001b[39m\u001b[33m\"\u001b[39m)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~\\AppData\\Roaming\\uv\\python\\cpython-3.13.7-windows-x86_64-none\\Lib\\socket.py:719\u001b[39m, in \u001b[36mSocketIO.readinto\u001b[39m\u001b[34m(self, b)\u001b[39m\n\u001b[32m 717\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mOSError\u001b[39;00m(\u001b[33m\"\u001b[39m\u001b[33mcannot read from timed out object\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 718\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m719\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_sock\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrecv_into\u001b[49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 720\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m timeout:\n\u001b[32m 721\u001b[39m \u001b[38;5;28mself\u001b[39m._timeout_occurred = \u001b[38;5;28;01mTrue\u001b[39;00m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~\\AppData\\Roaming\\uv\\python\\cpython-3.13.7-windows-x86_64-none\\Lib\\ssl.py:1304\u001b[39m, in \u001b[36mSSLSocket.recv_into\u001b[39m\u001b[34m(self, buffer, nbytes, flags)\u001b[39m\n\u001b[32m 1300\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m flags != \u001b[32m0\u001b[39m:\n\u001b[32m 1301\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 1302\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mnon-zero flags not allowed in calls to recv_into() on \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[33m\"\u001b[39m %\n\u001b[32m 1303\u001b[39m \u001b[38;5;28mself\u001b[39m.\u001b[34m__class__\u001b[39m)\n\u001b[32m-> \u001b[39m\u001b[32m1304\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnbytes\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbuffer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1305\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 1306\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m().recv_into(buffer, nbytes, flags)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~\\AppData\\Roaming\\uv\\python\\cpython-3.13.7-windows-x86_64-none\\Lib\\ssl.py:1138\u001b[39m, in \u001b[36mSSLSocket.read\u001b[39m\u001b[34m(self, len, buffer)\u001b[39m\n\u001b[32m 1136\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 1137\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m buffer \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1138\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_sslobj\u001b[49m\u001b[43m.\u001b[49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mlen\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbuffer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1139\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 1140\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m._sslobj.read(\u001b[38;5;28mlen\u001b[39m)\n", + "\u001b[31mKeyboardInterrupt\u001b[39m: " + ] + } + ], + "source": [ + "\n", + "# trainObjs = trainObjs.drop_duplicates(subset = 'objID')\n", + "trainObjs['binary_label'] = pd.to_numeric(trainObjs['binary_label'], downcast='integer')\n", + "\n", + "img_width, img_height = 200, 200\n", + "SkyServer_DataRelease = 'DR16'\n", + "\n", + "dirName = 'PCC-and-SpecSearch'\n", + "outDir = os.path.join('..', 'Images', dirName)\n", + "\n", + "fileList = list()\n", + "if not os.path.exists(outDir):\n", + " os.makedirs(outDir)\n", + " \n", + "if len(glob.glob(os.path.join(outDir, '*.png'))) == trainObjs.shape[0]:\n", + " print('Skipping Populate')\n", + "else:\n", + " # for id, r, d in zip(searchDf['objID'], trainObjs['ra'], trainObjs['dec']):\n", + " for r, d, l in zip(trainObjs['ra'], trainObjs['dec'], trainObjs['binary_label']):\n", + " img_array = SkyServer.getJpegImgCutout(ra=r, dec=d, width=img_width, height=img_height, scale=0.1, \n", + " dataRelease=SkyServer_DataRelease)\n", + " # print(f'{id}-label={labeler(z)}')\n", + " # outPicTemplate = f'{id}-label={labeler(z)}.png'\n", + " outPicTemplate = f'sdss_ra={r}_dec={d}-label={l}.png'\n", + " \n", + " img0 = PIL.Image.fromarray(img_array, 'RGB')\n", + " img0.save(f'{outDir}/{outPicTemplate}')\n", + " fileList.append(f'{outPicTemplate}')\n", + "\n", + "print(f'Finished populate with {len(fileList)} images')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bf582b23", + "metadata": {}, + "outputs": [], + "source": [ + "final_df = pd.concat([\n", + " searchDf_specMembers[['files','labels']],\n", + " searchDf_specNonMembers[['files','labels']],\n", + " pcc_Members.rename(columns={'binary_label':'labels'})[['files','labels']],\n", + " pcc_nonMembers.rename(columns={'binary_label':'labels'})[['files','labels']]\n", + "]).reset_index(drop=True)\n", + "final_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1c43301b", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "JPAstro", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/README.md b/README.md index 9b494f37..6ea1d77a 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ JPAstro/ (New name may be needed. Below are the most important files in each dir 1. Install uv 2. `uv sync` 3. `uv pip install SciScript-Python/py3` + 1. Follow the steps to authenticate SciServer (you'll have to change the relevant files) ## Method 2 Tensorflow on GPU via conda (being deprecated) 1. Install anaconda diff --git a/pyproject.toml b/pyproject.toml index 78b66d17..8aacfa18 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,6 +24,7 @@ dependencies = [ "pillow>=11.3.0", "numpy>=2.0.2", "pyesasky>=2.0.4", + "requests>=2.32.5", ] [project.optional-dependencies] diff --git a/src/populateDataset.py b/src/populateDataset.py index b532082a..7c9e9dbd 100644 --- a/src/populateDataset.py +++ b/src/populateDataset.py @@ -1,35 +1,35 @@ - import requests import pandas as pd -import sys import os -#from skimage import io, transform -import matplotlib.pyplot as plt import time -# testUrl = f'https://skyserver.sdss.org/dr16/SkyServerWS/ImgCutout/getjpeg?TaskName=Skyserver.Explore.Image&ra={raEx}&dec={dcEx}&scale=0.1&width=200&height=200' - - -df0 = pd.read_fwf('PCC_cat.txt', header=None) +# testUrl = f'https://skyserver.sdss.org/dr16/SkyServerWS/ImgCutout/getjpeg?TaskName=Skyserver.Explore.Image&ra={raEx}&dec={dcEx}&scale=0.1&width=200&height=200' +df0 = (pd.read_fwf("PCC_cat.txt", header=None),) ra = df0[2] dec = df0[3] -outDir = 'SDSS400' -height = 400 -width = 400 - -for i in range(len(ra)): -# for i in range(800): - urlVar = f'https://skyserver.sdss.org/dr16/SkyServerWS/ImgCutout/' f'getjpeg?TaskName=Skyserver.Explore.Image&ra={str(ra[i]).strip()}' f'&dec={str(dec[i]).strip()}&scale=0.1&width={width}&height={height}' - - # tell the loop to pause for a bit - every 100 images - if i%100==0: - time.sleep(5) - - img_data = requests.get(urlVar).content - with open(f'{outDir}/sdss_ra={ra[i]}_dec={dec[i]}.png', 'wb') as handler: - handler.write(img_data) - -#images = [f'https://skyserver.sdss.org/dr16/SkyServerWS/ImgCutout/' f'getjpeg?TaskName=Skyserver.Explore.Image&ra={str(ra[i]).strip()}' f'&dec={str(dec[i]).strip()}&scale=0.1&width=200&height=200' for i in range(len(ra))] -# os.path.join('SDSS', f'sdss_ra={str(df0[2][1])}_dec={str(df0[3][1])}.jpeg') +def populateDataset( + outDir="SDSS200", + height=200, + width=200, + scale=0.1, +): + for i in range(len(ra)): + urlVar = ( + f"https://skyserver.sdss.org/dr16/SkyServerWS/ImgCutout/" + f"getjpeg?TaskName=Skyserver.Explore.Image&ra={str(ra[i]).strip()}" + f"&dec={str(dec[i]).strip()}&scale={scale}&width={width}&height={height}" + ) + + # tell the loop to pause for a bit - every 100 images (to avoid timeout) + if i % 100 == 0: + time.sleep(5) + + img_data = requests.get(urlVar).content + out_path = os.path.join(outDir, f"sdss_ra={str(ra[i])}_dec={str(dec[i])}.png") + with open(out_path, "wb") as handler: + handler.write(img_data) + +if __name__ == "__main__": + populateDataset() \ No newline at end of file From f68d97e4d2642db4aaf4621ffaa41528f0d0b763 Mon Sep 17 00:00:00 2001 From: Jason Pruitt <55477390+Json-To-String@users.noreply.github.com> Date: Thu, 1 Jan 2026 22:34:31 -0500 Subject: [PATCH 3/3] Add working pytorch notebook --- Notebooks/torch_trainer.ipynb | 1785 +++++++++++++++++++++++++++++---- 1 file changed, 1609 insertions(+), 176 deletions(-) diff --git a/Notebooks/torch_trainer.ipynb b/Notebooks/torch_trainer.ipynb index 96e2a185..850a111b 100644 --- a/Notebooks/torch_trainer.ipynb +++ b/Notebooks/torch_trainer.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 30, + "execution_count": 84, "id": "ea344379", "metadata": {}, "outputs": [], @@ -12,12 +12,13 @@ "import os\n", "import glob\n", "import PIL.Image as Image\n", - "import PIL" + "import PIL\n", + "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 85, "id": "132fe8c4", "metadata": {}, "outputs": [], @@ -39,7 +40,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 86, "id": "8f2dc168", "metadata": {}, "outputs": [], @@ -58,7 +59,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 87, "id": "f45a3e60", "metadata": {}, "outputs": [ @@ -445,7 +446,7 @@ "[272 rows x 26 columns]" ] }, - "execution_count": 23, + "execution_count": 87, "metadata": {}, "output_type": "execute_result" } @@ -465,7 +466,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 88, "id": "393bafa6", "metadata": {}, "outputs": [ @@ -852,7 +853,7 @@ "[252 rows x 27 columns]" ] }, - "execution_count": 24, + "execution_count": 88, "metadata": {}, "output_type": "execute_result" } @@ -919,7 +920,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 89, "id": "d57144a0", "metadata": {}, "outputs": [ @@ -1293,7 +1294,7 @@ "[272 rows x 29 columns]" ] }, - "execution_count": 25, + "execution_count": 89, "metadata": {}, "output_type": "execute_result" } @@ -1315,7 +1316,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 90, "id": "f82a0132", "metadata": {}, "outputs": [ @@ -1336,12 +1337,12 @@ ], "source": [ "print(downSampleDf1['binary_label'].value_counts())\n", - "print(downSampleDf1_balanced['binary_label'].value_counts())\n" + "print(downSampleDf1_balanced['binary_label'].value_counts())" ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 91, "id": "14e81668", "metadata": {}, "outputs": [ @@ -1395,7 +1396,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 92, "id": "4d2449ed", "metadata": {}, "outputs": [ @@ -1518,7 +1519,7 @@ "[505 rows x 3 columns]" ] }, - "execution_count": 28, + "execution_count": 92, "metadata": {}, "output_type": "execute_result" } @@ -1536,164 +1537,29 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 93, "id": "c01a43c0", "metadata": {}, "outputs": [ { - "name": "stderr", + "name": "stdout", "output_type": "stream", "text": [ - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n", - "c:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:124: Warning: In Authentication.getToken: Authentication token is not defined: the user did not log in with the Authentication.login function, or the token has not been stored in the command line argument --ident.\n", - " token = Authentication.getToken()\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[31m---------------------------------------------------------------------------\u001b[39m", - "\u001b[31mKeyboardInterrupt\u001b[39m Traceback (most recent call last)", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[31]\u001b[39m\u001b[32m, line 19\u001b[39m\n\u001b[32m 16\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 17\u001b[39m \u001b[38;5;66;03m# for id, r, d in zip(searchDf['objID'], trainObjs['ra'], trainObjs['dec']):\u001b[39;00m\n\u001b[32m 18\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m r, d, l \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m(trainObjs[\u001b[33m'\u001b[39m\u001b[33mra\u001b[39m\u001b[33m'\u001b[39m], trainObjs[\u001b[33m'\u001b[39m\u001b[33mdec\u001b[39m\u001b[33m'\u001b[39m], trainObjs[\u001b[33m'\u001b[39m\u001b[33mbinary_label\u001b[39m\u001b[33m'\u001b[39m]):\n\u001b[32m---> \u001b[39m\u001b[32m19\u001b[39m img_array = \u001b[43mSkyServer\u001b[49m\u001b[43m.\u001b[49m\u001b[43mgetJpegImgCutout\u001b[49m\u001b[43m(\u001b[49m\u001b[43mra\u001b[49m\u001b[43m=\u001b[49m\u001b[43mr\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdec\u001b[49m\u001b[43m=\u001b[49m\u001b[43md\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mwidth\u001b[49m\u001b[43m=\u001b[49m\u001b[43mimg_width\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mheight\u001b[49m\u001b[43m=\u001b[49m\u001b[43mimg_height\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mscale\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m0.1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[32m 20\u001b[39m \u001b[43m \u001b[49m\u001b[43mdataRelease\u001b[49m\u001b[43m=\u001b[49m\u001b[43mSkyServer_DataRelease\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 21\u001b[39m \u001b[38;5;66;03m# print(f'{id}-label={labeler(z)}')\u001b[39;00m\n\u001b[32m 22\u001b[39m \u001b[38;5;66;03m# outPicTemplate = f'{id}-label={labeler(z)}.png'\u001b[39;00m\n\u001b[32m 23\u001b[39m outPicTemplate = \u001b[33mf\u001b[39m\u001b[33m'\u001b[39m\u001b[33msdss_ra=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mr\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m_dec=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00md\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m-label=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00ml\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m.png\u001b[39m\u001b[33m'\u001b[39m\n", - "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\SciServer\\SkyServer.py:128\u001b[39m, in \u001b[36mgetJpegImgCutout\u001b[39m\u001b[34m(ra, dec, scale, width, height, opt, query, dataRelease)\u001b[39m\n\u001b[32m 125\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m token \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m token != \u001b[33m\"\u001b[39m\u001b[33m\"\u001b[39m:\n\u001b[32m 126\u001b[39m headers[\u001b[33m'\u001b[39m\u001b[33mX-Auth-Token\u001b[39m\u001b[33m'\u001b[39m] = token\n\u001b[32m--> \u001b[39m\u001b[32m128\u001b[39m response = \u001b[43mrequests\u001b[49m\u001b[43m.\u001b[49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m=\u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[32m 129\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m response.status_code != \u001b[32m200\u001b[39m:\n\u001b[32m 130\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m response.status_code == \u001b[32m404\u001b[39m \u001b[38;5;129;01mor\u001b[39;00m response.status_code == \u001b[32m500\u001b[39m:\n", - "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\requests\\api.py:73\u001b[39m, in \u001b[36mget\u001b[39m\u001b[34m(url, params, **kwargs)\u001b[39m\n\u001b[32m 62\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mget\u001b[39m(url, params=\u001b[38;5;28;01mNone\u001b[39;00m, **kwargs):\n\u001b[32m 63\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33mr\u001b[39m\u001b[33;03m\"\"\"Sends a GET request.\u001b[39;00m\n\u001b[32m 64\u001b[39m \n\u001b[32m 65\u001b[39m \u001b[33;03m :param url: URL for the new :class:`Request` object.\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 70\u001b[39m \u001b[33;03m :rtype: requests.Response\u001b[39;00m\n\u001b[32m 71\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m73\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mget\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[43m=\u001b[49m\u001b[43mparams\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\requests\\api.py:59\u001b[39m, in \u001b[36mrequest\u001b[39m\u001b[34m(method, url, **kwargs)\u001b[39m\n\u001b[32m 55\u001b[39m \u001b[38;5;66;03m# By using the 'with' statement we are sure the session is closed, thus we\u001b[39;00m\n\u001b[32m 56\u001b[39m \u001b[38;5;66;03m# avoid leaving sockets open which can trigger a ResourceWarning in some\u001b[39;00m\n\u001b[32m 57\u001b[39m \u001b[38;5;66;03m# cases, and look like a memory leak in others.\u001b[39;00m\n\u001b[32m 58\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m sessions.Session() \u001b[38;5;28;01mas\u001b[39;00m session:\n\u001b[32m---> \u001b[39m\u001b[32m59\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43msession\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m=\u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m=\u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\requests\\sessions.py:589\u001b[39m, in \u001b[36mSession.request\u001b[39m\u001b[34m(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\u001b[39m\n\u001b[32m 584\u001b[39m send_kwargs = {\n\u001b[32m 585\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mtimeout\u001b[39m\u001b[33m\"\u001b[39m: timeout,\n\u001b[32m 586\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mallow_redirects\u001b[39m\u001b[33m\"\u001b[39m: allow_redirects,\n\u001b[32m 587\u001b[39m }\n\u001b[32m 588\u001b[39m send_kwargs.update(settings)\n\u001b[32m--> \u001b[39m\u001b[32m589\u001b[39m resp = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mprep\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43msend_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 591\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m resp\n", - "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\requests\\sessions.py:703\u001b[39m, in \u001b[36mSession.send\u001b[39m\u001b[34m(self, request, **kwargs)\u001b[39m\n\u001b[32m 700\u001b[39m start = preferred_clock()\n\u001b[32m 702\u001b[39m \u001b[38;5;66;03m# Send the request\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m703\u001b[39m r = \u001b[43madapter\u001b[49m\u001b[43m.\u001b[49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 705\u001b[39m \u001b[38;5;66;03m# Total elapsed time of the request (approximately)\u001b[39;00m\n\u001b[32m 706\u001b[39m elapsed = preferred_clock() - start\n", - "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\requests\\adapters.py:644\u001b[39m, in \u001b[36mHTTPAdapter.send\u001b[39m\u001b[34m(self, request, stream, timeout, verify, cert, proxies)\u001b[39m\n\u001b[32m 641\u001b[39m timeout = TimeoutSauce(connect=timeout, read=timeout)\n\u001b[32m 643\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m644\u001b[39m resp = \u001b[43mconn\u001b[49m\u001b[43m.\u001b[49m\u001b[43murlopen\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 645\u001b[39m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m.\u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 646\u001b[39m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m=\u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 647\u001b[39m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m.\u001b[49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 648\u001b[39m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m.\u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 649\u001b[39m \u001b[43m \u001b[49m\u001b[43mredirect\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 650\u001b[39m \u001b[43m \u001b[49m\u001b[43massert_same_host\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 651\u001b[39m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 652\u001b[39m \u001b[43m \u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 653\u001b[39m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mmax_retries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 654\u001b[39m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 655\u001b[39m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[43m=\u001b[49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 656\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 658\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m (ProtocolError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[32m 659\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m(err, request=request)\n", - "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\urllib3\\connectionpool.py:787\u001b[39m, in \u001b[36mHTTPConnectionPool.urlopen\u001b[39m\u001b[34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, preload_content, decode_content, **response_kw)\u001b[39m\n\u001b[32m 784\u001b[39m response_conn = conn \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m release_conn \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 786\u001b[39m \u001b[38;5;66;03m# Make the request on the HTTPConnection object\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m787\u001b[39m response = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_make_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 788\u001b[39m \u001b[43m \u001b[49m\u001b[43mconn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 789\u001b[39m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 790\u001b[39m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 791\u001b[39m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtimeout_obj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 792\u001b[39m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[43m=\u001b[49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 793\u001b[39m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m=\u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 794\u001b[39m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[43m=\u001b[49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 795\u001b[39m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[43m=\u001b[49m\u001b[43mretries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 796\u001b[39m \u001b[43m \u001b[49m\u001b[43mresponse_conn\u001b[49m\u001b[43m=\u001b[49m\u001b[43mresponse_conn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 797\u001b[39m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[43m=\u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 798\u001b[39m \u001b[43m \u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[43m=\u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 799\u001b[39m \u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mresponse_kw\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 800\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 802\u001b[39m \u001b[38;5;66;03m# Everything went great!\u001b[39;00m\n\u001b[32m 803\u001b[39m clean_exit = \u001b[38;5;28;01mTrue\u001b[39;00m\n", - "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\urllib3\\connectionpool.py:534\u001b[39m, in \u001b[36mHTTPConnectionPool._make_request\u001b[39m\u001b[34m(self, conn, method, url, body, headers, retries, timeout, chunked, response_conn, preload_content, decode_content, enforce_content_length)\u001b[39m\n\u001b[32m 532\u001b[39m \u001b[38;5;66;03m# Receive the response from the server\u001b[39;00m\n\u001b[32m 533\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m534\u001b[39m response = \u001b[43mconn\u001b[49m\u001b[43m.\u001b[49m\u001b[43mgetresponse\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 535\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m (BaseSSLError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 536\u001b[39m \u001b[38;5;28mself\u001b[39m._raise_timeout(err=e, url=url, timeout_value=read_timeout)\n", - "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\jsonp\\Documents\\Github\\JPAstro\\.venv\\Lib\\site-packages\\urllib3\\connection.py:565\u001b[39m, in \u001b[36mHTTPConnection.getresponse\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 562\u001b[39m _shutdown = \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m.sock, \u001b[33m\"\u001b[39m\u001b[33mshutdown\u001b[39m\u001b[33m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[32m 564\u001b[39m \u001b[38;5;66;03m# Get the response from http.client.HTTPConnection\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m565\u001b[39m httplib_response = \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mgetresponse\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 567\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 568\u001b[39m assert_header_parsing(httplib_response.msg)\n", - "\u001b[36mFile \u001b[39m\u001b[32m~\\AppData\\Roaming\\uv\\python\\cpython-3.13.7-windows-x86_64-none\\Lib\\http\\client.py:1430\u001b[39m, in \u001b[36mHTTPConnection.getresponse\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 1428\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 1429\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1430\u001b[39m \u001b[43mresponse\u001b[49m\u001b[43m.\u001b[49m\u001b[43mbegin\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1431\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m:\n\u001b[32m 1432\u001b[39m \u001b[38;5;28mself\u001b[39m.close()\n", - "\u001b[36mFile \u001b[39m\u001b[32m~\\AppData\\Roaming\\uv\\python\\cpython-3.13.7-windows-x86_64-none\\Lib\\http\\client.py:331\u001b[39m, in \u001b[36mHTTPResponse.begin\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 329\u001b[39m \u001b[38;5;66;03m# read until we get a non-100 response\u001b[39;00m\n\u001b[32m 330\u001b[39m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m331\u001b[39m version, status, reason = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_read_status\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 332\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m status != CONTINUE:\n\u001b[32m 333\u001b[39m \u001b[38;5;28;01mbreak\u001b[39;00m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~\\AppData\\Roaming\\uv\\python\\cpython-3.13.7-windows-x86_64-none\\Lib\\http\\client.py:292\u001b[39m, in \u001b[36mHTTPResponse._read_status\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 291\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_read_status\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[32m--> \u001b[39m\u001b[32m292\u001b[39m line = \u001b[38;5;28mstr\u001b[39m(\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mfp\u001b[49m\u001b[43m.\u001b[49m\u001b[43mreadline\u001b[49m\u001b[43m(\u001b[49m\u001b[43m_MAXLINE\u001b[49m\u001b[43m \u001b[49m\u001b[43m+\u001b[49m\u001b[43m \u001b[49m\u001b[32;43m1\u001b[39;49m\u001b[43m)\u001b[49m, \u001b[33m\"\u001b[39m\u001b[33miso-8859-1\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 293\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(line) > _MAXLINE:\n\u001b[32m 294\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m LineTooLong(\u001b[33m\"\u001b[39m\u001b[33mstatus line\u001b[39m\u001b[33m\"\u001b[39m)\n", - "\u001b[36mFile \u001b[39m\u001b[32m~\\AppData\\Roaming\\uv\\python\\cpython-3.13.7-windows-x86_64-none\\Lib\\socket.py:719\u001b[39m, in \u001b[36mSocketIO.readinto\u001b[39m\u001b[34m(self, b)\u001b[39m\n\u001b[32m 717\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mOSError\u001b[39;00m(\u001b[33m\"\u001b[39m\u001b[33mcannot read from timed out object\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 718\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m719\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_sock\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrecv_into\u001b[49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 720\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m timeout:\n\u001b[32m 721\u001b[39m \u001b[38;5;28mself\u001b[39m._timeout_occurred = \u001b[38;5;28;01mTrue\u001b[39;00m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~\\AppData\\Roaming\\uv\\python\\cpython-3.13.7-windows-x86_64-none\\Lib\\ssl.py:1304\u001b[39m, in \u001b[36mSSLSocket.recv_into\u001b[39m\u001b[34m(self, buffer, nbytes, flags)\u001b[39m\n\u001b[32m 1300\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m flags != \u001b[32m0\u001b[39m:\n\u001b[32m 1301\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 1302\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mnon-zero flags not allowed in calls to recv_into() on \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[33m\"\u001b[39m %\n\u001b[32m 1303\u001b[39m \u001b[38;5;28mself\u001b[39m.\u001b[34m__class__\u001b[39m)\n\u001b[32m-> \u001b[39m\u001b[32m1304\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnbytes\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbuffer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1305\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 1306\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m().recv_into(buffer, nbytes, flags)\n", - "\u001b[36mFile \u001b[39m\u001b[32m~\\AppData\\Roaming\\uv\\python\\cpython-3.13.7-windows-x86_64-none\\Lib\\ssl.py:1138\u001b[39m, in \u001b[36mSSLSocket.read\u001b[39m\u001b[34m(self, len, buffer)\u001b[39m\n\u001b[32m 1136\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 1137\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m buffer \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1138\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_sslobj\u001b[49m\u001b[43m.\u001b[49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mlen\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbuffer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1139\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 1140\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m._sslobj.read(\u001b[38;5;28mlen\u001b[39m)\n", - "\u001b[31mKeyboardInterrupt\u001b[39m: " + "Skipping Populate\n", + "Finished populate with 505 images\n" ] } ], "source": [ - "\n", + "import warnings\n", "# trainObjs = trainObjs.drop_duplicates(subset = 'objID')\n", "trainObjs['binary_label'] = pd.to_numeric(trainObjs['binary_label'], downcast='integer')\n", "\n", + "# TODO: This should be in the populate dataset steps\n", "img_width, img_height = 200, 200\n", "SkyServer_DataRelease = 'DR16'\n", "\n", - "dirName = 'PCC-and-SpecSearch'\n", + "dirName = 'PCC-and-SpecSearch-2025'\n", "outDir = os.path.join('..', 'Images', dirName)\n", "\n", "fileList = list()\n", @@ -1702,43 +1568,1610 @@ " \n", "if len(glob.glob(os.path.join(outDir, '*.png'))) == trainObjs.shape[0]:\n", " print('Skipping Populate')\n", + " for r, d, label in zip(trainObjs['ra'], trainObjs['dec'], trainObjs['binary_label']):\n", + " outPicTemplate = f'sdss_ra={r}_dec={d}-label={label}.png'\n", + " fileList.append(f'{outPicTemplate}')\n", + "\n", "else:\n", " # for id, r, d in zip(searchDf['objID'], trainObjs['ra'], trainObjs['dec']):\n", - " for r, d, l in zip(trainObjs['ra'], trainObjs['dec'], trainObjs['binary_label']):\n", - " img_array = SkyServer.getJpegImgCutout(ra=r, dec=d, width=img_width, height=img_height, scale=0.1, \n", - " dataRelease=SkyServer_DataRelease)\n", - " # print(f'{id}-label={labeler(z)}')\n", - " # outPicTemplate = f'{id}-label={labeler(z)}.png'\n", - " outPicTemplate = f'sdss_ra={r}_dec={d}-label={l}.png'\n", - " \n", - " img0 = PIL.Image.fromarray(img_array, 'RGB')\n", - " img0.save(f'{outDir}/{outPicTemplate}')\n", - " fileList.append(f'{outPicTemplate}')\n", + " with warnings.catch_warnings():\n", + " warnings.simplefilter(\"ignore\")\n", + " for r, d, label in zip(trainObjs['ra'], trainObjs['dec'], trainObjs['binary_label']):\n", + " img_array = SkyServer.getJpegImgCutout(ra=r, dec=d, width=img_width, height=img_height, scale=0.1, \n", + " dataRelease=SkyServer_DataRelease)\n", + " # print(f'{id}-label={labeler(z)}')\n", + " # outPicTemplate = f'{id}-label={labeler(z)}.png'\n", + " outPicTemplate = f'sdss_ra={r}_dec={d}-label={label}.png'\n", + " \n", + " img0 = PIL.Image.fromarray(img_array, 'RGB')\n", + " img0.save(f'{outDir}/{outPicTemplate}')\n", + " fileList.append(f'{os.path.abspath(outPicTemplate)}')\n", "\n", "print(f'Finished populate with {len(fileList)} images')" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 94, "id": "bf582b23", "metadata": {}, "outputs": [], "source": [ - "final_df = pd.concat([\n", - " searchDf_specMembers[['files','labels']],\n", - " searchDf_specNonMembers[['files','labels']],\n", - " pcc_Members.rename(columns={'binary_label':'labels'})[['files','labels']],\n", - " pcc_nonMembers.rename(columns={'binary_label':'labels'})[['files','labels']]\n", - "]).reset_index(drop=True)\n", - "final_df" + "# final_df = pd.concat([\n", + "# searchDf_specMembers[['files','binary_label']],\n", + "# searchDf_specNonMembers[['files','binary_label']],\n", + "# # pcc_Members.rename(columns={'binary_label':'labels'})[['files','labels']],\n", + "# # pcc_nonMembers.rename(columns={'binary_label':'labels'})[['files','labels']]\n", + "# pcc_Members,\n", + "# pcc_nonMembers\n", + "# ]).reset_index(drop=True)\n", + "# final_df" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 95, "id": "1c43301b", "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
radecbinary_labelrelpaths
PCC_Bg049.64690041.4505000sdss_ra=49.6469_dec=41.4505-label=0.png
149.37570041.3132000sdss_ra=49.3757_dec=41.3132-label=0.png
249.27580041.5415000sdss_ra=49.2758_dec=41.5415-label=0.png
349.33290041.4999000sdss_ra=49.3329_dec=41.4999-label=0.png
449.47090041.3465000sdss_ra=49.4709_dec=41.3465-label=0.png
..................
Spec_Mems20650.62274641.0504451sdss_ra=50.622745654887_dec=41.0504450153301-l...
21050.69459341.9412301sdss_ra=50.6945934204297_dec=41.9412303787257-...
21149.70584940.8275891sdss_ra=49.7058490785794_dec=40.8275889370729-...
21249.11265841.1802161sdss_ra=49.112658441068_dec=41.1802159335769-l...
21349.47027540.8972441sdss_ra=49.4702754784142_dec=40.8972443909435-...
\n", + "

505 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " ra dec binary_label \\\n", + "PCC_Bg 0 49.646900 41.450500 0 \n", + " 1 49.375700 41.313200 0 \n", + " 2 49.275800 41.541500 0 \n", + " 3 49.332900 41.499900 0 \n", + " 4 49.470900 41.346500 0 \n", + "... ... ... ... \n", + "Spec_Mems 206 50.622746 41.050445 1 \n", + " 210 50.694593 41.941230 1 \n", + " 211 49.705849 40.827589 1 \n", + " 212 49.112658 41.180216 1 \n", + " 213 49.470275 40.897244 1 \n", + "\n", + " relpaths \n", + "PCC_Bg 0 sdss_ra=49.6469_dec=41.4505-label=0.png \n", + " 1 sdss_ra=49.3757_dec=41.3132-label=0.png \n", + " 2 sdss_ra=49.2758_dec=41.5415-label=0.png \n", + " 3 sdss_ra=49.3329_dec=41.4999-label=0.png \n", + " 4 sdss_ra=49.4709_dec=41.3465-label=0.png \n", + "... ... \n", + "Spec_Mems 206 sdss_ra=50.622745654887_dec=41.0504450153301-l... \n", + " 210 sdss_ra=50.6945934204297_dec=41.9412303787257-... \n", + " 211 sdss_ra=49.7058490785794_dec=40.8275889370729-... \n", + " 212 sdss_ra=49.112658441068_dec=41.1802159335769-l... \n", + " 213 sdss_ra=49.4702754784142_dec=40.8972443909435-... \n", + "\n", + "[505 rows x 4 columns]" + ] + }, + "execution_count": 95, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "trainObjs['relpaths'] = fileList\n", + "trainObjs" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "id": "bc76bf67", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
radecbinary_labelrelpathsabspaths
PCC_Bg049.64690041.4505000sdss_ra=49.6469_dec=41.4505-label=0.png..\\Images\\PCC-and-SpecSearch-2025\\sdss_ra=49.6...
149.37570041.3132000sdss_ra=49.3757_dec=41.3132-label=0.png..\\Images\\PCC-and-SpecSearch-2025\\sdss_ra=49.3...
249.27580041.5415000sdss_ra=49.2758_dec=41.5415-label=0.png..\\Images\\PCC-and-SpecSearch-2025\\sdss_ra=49.2...
349.33290041.4999000sdss_ra=49.3329_dec=41.4999-label=0.png..\\Images\\PCC-and-SpecSearch-2025\\sdss_ra=49.3...
449.47090041.3465000sdss_ra=49.4709_dec=41.3465-label=0.png..\\Images\\PCC-and-SpecSearch-2025\\sdss_ra=49.4...
.....................
Spec_Mems20650.62274641.0504451sdss_ra=50.622745654887_dec=41.0504450153301-l.....\\Images\\PCC-and-SpecSearch-2025\\sdss_ra=50.6...
21050.69459341.9412301sdss_ra=50.6945934204297_dec=41.9412303787257-.....\\Images\\PCC-and-SpecSearch-2025\\sdss_ra=50.6...
21149.70584940.8275891sdss_ra=49.7058490785794_dec=40.8275889370729-.....\\Images\\PCC-and-SpecSearch-2025\\sdss_ra=49.7...
21249.11265841.1802161sdss_ra=49.112658441068_dec=41.1802159335769-l.....\\Images\\PCC-and-SpecSearch-2025\\sdss_ra=49.1...
21349.47027540.8972441sdss_ra=49.4702754784142_dec=40.8972443909435-.....\\Images\\PCC-and-SpecSearch-2025\\sdss_ra=49.4...
\n", + "

505 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " ra dec binary_label \\\n", + "PCC_Bg 0 49.646900 41.450500 0 \n", + " 1 49.375700 41.313200 0 \n", + " 2 49.275800 41.541500 0 \n", + " 3 49.332900 41.499900 0 \n", + " 4 49.470900 41.346500 0 \n", + "... ... ... ... \n", + "Spec_Mems 206 50.622746 41.050445 1 \n", + " 210 50.694593 41.941230 1 \n", + " 211 49.705849 40.827589 1 \n", + " 212 49.112658 41.180216 1 \n", + " 213 49.470275 40.897244 1 \n", + "\n", + " relpaths \\\n", + "PCC_Bg 0 sdss_ra=49.6469_dec=41.4505-label=0.png \n", + " 1 sdss_ra=49.3757_dec=41.3132-label=0.png \n", + " 2 sdss_ra=49.2758_dec=41.5415-label=0.png \n", + " 3 sdss_ra=49.3329_dec=41.4999-label=0.png \n", + " 4 sdss_ra=49.4709_dec=41.3465-label=0.png \n", + "... ... \n", + "Spec_Mems 206 sdss_ra=50.622745654887_dec=41.0504450153301-l... \n", + " 210 sdss_ra=50.6945934204297_dec=41.9412303787257-... \n", + " 211 sdss_ra=49.7058490785794_dec=40.8275889370729-... \n", + " 212 sdss_ra=49.112658441068_dec=41.1802159335769-l... \n", + " 213 sdss_ra=49.4702754784142_dec=40.8972443909435-... \n", + "\n", + " abspaths \n", + "PCC_Bg 0 ..\\Images\\PCC-and-SpecSearch-2025\\sdss_ra=49.6... \n", + " 1 ..\\Images\\PCC-and-SpecSearch-2025\\sdss_ra=49.3... \n", + " 2 ..\\Images\\PCC-and-SpecSearch-2025\\sdss_ra=49.2... \n", + " 3 ..\\Images\\PCC-and-SpecSearch-2025\\sdss_ra=49.3... \n", + " 4 ..\\Images\\PCC-and-SpecSearch-2025\\sdss_ra=49.4... \n", + "... ... \n", + "Spec_Mems 206 ..\\Images\\PCC-and-SpecSearch-2025\\sdss_ra=50.6... \n", + " 210 ..\\Images\\PCC-and-SpecSearch-2025\\sdss_ra=50.6... \n", + " 211 ..\\Images\\PCC-and-SpecSearch-2025\\sdss_ra=49.7... \n", + " 212 ..\\Images\\PCC-and-SpecSearch-2025\\sdss_ra=49.1... \n", + " 213 ..\\Images\\PCC-and-SpecSearch-2025\\sdss_ra=49.4... \n", + "\n", + "[505 rows x 5 columns]" + ] + }, + "execution_count": 96, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "img_dir = os.path.join(\"..\", \"Images\", \"PCC-and-SpecSearch-2025\") # Assuming being run from Notebooks dir\n", + "abspaths = []\n", + "for x in trainObjs['relpaths']:\n", + " abspaths.append(os.path.join(img_dir, x))\n", + "trainObjs['abspaths'] = abspaths\n", + "trainObjs" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "id": "e92c0175", + "metadata": {}, + "outputs": [], + "source": [ + "from torch.utils.data import Dataset\n", + "from PIL import Image\n", + "import torch\n", + "\n", + "class GalaxyDataset(Dataset):\n", + " def __init__(self, df, transform=None):\n", + " self.df = df\n", + " self.transform = transform\n", + "\n", + " def __len__(self):\n", + " return len(self.df)\n", + "\n", + " def __getitem__(self, idx):\n", + " row = self.df.iloc[idx]\n", + "\n", + " # load image using absolute path\n", + " img_path = row['abspaths']\n", + " image = Image.open(img_path).convert(\"RGB\")\n", + "\n", + " # load label\n", + " label = torch.tensor(int(row['binary_label']), dtype=torch.long)\n", + "\n", + " if self.transform:\n", + " image = self.transform(image)\n", + "\n", + " return image, label\n" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "id": "bdc623e6", + "metadata": {}, + "outputs": [], + "source": [ + "from torchvision import transforms\n", + "\n", + "train_tfms = transforms.Compose([\n", + " transforms.Resize((224,224)),\n", + " transforms.RandomHorizontalFlip(),\n", + " transforms.RandomRotation(10),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(\n", + " mean=[0.485, 0.456, 0.406],\n", + " std=[0.229, 0.224, 0.225]\n", + " )\n", + "])\n", + "\n", + "test_tfms = transforms.Compose([\n", + " transforms.Resize((224,224)),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(\n", + " mean=[0.485, 0.456, 0.406],\n", + " std=[0.229, 0.224, 0.225]\n", + " )\n", + "])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "id": "9c286144", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.model_selection import train_test_split\n" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "id": "4ffbc81b", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "train_df, test_df = train_test_split(trainObjs, test_size=0.20, stratify=trainObjs['binary_label'])\n", + "train_df, val_df = train_test_split(train_df, test_size=0.20, stratify=train_df['binary_label'])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "id": "3e14f134", + "metadata": {}, + "outputs": [], + "source": [ + "from torch.utils.data import DataLoader\n", + "\n", + "train_ds = GalaxyDataset(train_df, transform=train_tfms)\n", + "val_ds = GalaxyDataset(val_df, transform=test_tfms)\n", + "test_ds = GalaxyDataset(test_df, transform=test_tfms)\n", + "\n", + "train_loader = DataLoader(train_ds, batch_size=32, shuffle=True, num_workers=0)\n", + "val_loader = DataLoader(val_ds, batch_size=32, shuffle=False, num_workers=0)\n", + "test_loader = DataLoader(test_ds, batch_size=32, shuffle=False, num_workers=0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "id": "9db69ace", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<__main__.GalaxyDataset at 0x2241b39c2f0>" + ] + }, + "execution_count": 102, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train_ds" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "id": "67c4a6c2", + "metadata": {}, + "outputs": [], + "source": [ + "import torch.nn as nn\n", + "from torchvision import models\n", + "\n", + "model = models.resnet18(weights=models.ResNet18_Weights.IMAGENET1K_V1)\n", + "\n", + "# replace final layer for binary classification\n", + "num_feats = model.fc.in_features\n", + "model.fc = nn.Linear(num_feats, 2)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "id": "7268e063", + "metadata": {}, + "outputs": [], + "source": [ + "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", + "model = model.to(device)\n", + "criterion = nn.CrossEntropyLoss()\n", + "optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "id": "dc772d97", + "metadata": {}, + "outputs": [], + "source": [ + "def train_epoch(model, loader, optimizer, criterion):\n", + " model.train()\n", + " total_loss = 0\n", + "\n", + " for imgs, labels in loader:\n", + " imgs, labels = imgs.to(device), labels.to(device)\n", + "\n", + " optimizer.zero_grad()\n", + " outputs = model(imgs)\n", + " loss = criterion(outputs, labels)\n", + " loss.backward()\n", + " optimizer.step()\n", + "\n", + " total_loss += loss.item()\n", + "\n", + " return total_loss / len(loader)\n", + "\n", + "\n", + "def eval_epoch(model, loader, criterion):\n", + " model.eval()\n", + " total_loss = 0\n", + " correct = 0\n", + "\n", + " with torch.no_grad():\n", + " for imgs, labels in loader:\n", + " imgs, labels = imgs.to(device), labels.to(device)\n", + " outputs = model(imgs)\n", + " loss = criterion(outputs, labels)\n", + "\n", + " total_loss += loss.item()\n", + " preds = outputs.argmax(dim=1)\n", + " correct += (preds == labels).sum().item()\n", + "\n", + " accuracy = correct / len(loader.dataset)\n", + " return total_loss / len(loader), accuracy\n" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "id": "51d39e09", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 2%|▏ | 1/50 [00:02<01:59, 2.45s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1: train_loss=0.4717 | val_loss=0.4666 | val_acc=0.7654\n", + "(val_acc: 0.7654)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 4%|▍ | 2/50 [00:04<01:38, 2.06s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 2: train_loss=0.2682 | val_loss=0.5058 | val_acc=0.7778\n", + "(val_acc: 0.7778)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 6%|▌ | 3/50 [00:05<01:28, 1.89s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 3: train_loss=0.1936 | val_loss=0.3471 | val_acc=0.8889\n", + "(val_acc: 0.8889)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 8%|▊ | 4/50 [00:07<01:23, 1.81s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 4: train_loss=0.1380 | val_loss=0.3091 | val_acc=0.8889\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 10%|█ | 5/50 [00:09<01:18, 1.74s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 5: train_loss=0.0700 | val_loss=0.4364 | val_acc=0.8395\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 12%|█▏ | 6/50 [00:10<01:15, 1.71s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 6: train_loss=0.0856 | val_loss=0.3379 | val_acc=0.8765\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 14%|█▍ | 7/50 [00:12<01:11, 1.67s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 7: train_loss=0.0553 | val_loss=0.4149 | val_acc=0.8765\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 16%|█▌ | 8/50 [00:14<01:09, 1.66s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 8: train_loss=0.0698 | val_loss=0.3787 | val_acc=0.8148\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 18%|█▊ | 9/50 [00:15<01:07, 1.64s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 9: train_loss=0.0694 | val_loss=0.6110 | val_acc=0.8519\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 20%|██ | 10/50 [00:17<01:05, 1.63s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 10: train_loss=0.0617 | val_loss=0.3498 | val_acc=0.9012\n", + "(val_acc: 0.9012)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 22%|██▏ | 11/50 [00:19<01:04, 1.66s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 11: train_loss=0.1109 | val_loss=0.3197 | val_acc=0.9012\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 24%|██▍ | 12/50 [00:20<01:01, 1.63s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 12: train_loss=0.0798 | val_loss=0.5029 | val_acc=0.8395\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 26%|██▌ | 13/50 [00:22<00:59, 1.61s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 13: train_loss=0.0283 | val_loss=0.5528 | val_acc=0.8765\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 28%|██▊ | 14/50 [00:23<00:57, 1.60s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 14: train_loss=0.0317 | val_loss=0.5214 | val_acc=0.8642\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 30%|███ | 15/50 [00:25<00:55, 1.58s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 15: train_loss=0.2570 | val_loss=0.3957 | val_acc=0.9012\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 32%|███▏ | 16/50 [00:26<00:53, 1.58s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 16: train_loss=0.0722 | val_loss=0.8243 | val_acc=0.8395\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 34%|███▍ | 17/50 [00:28<00:51, 1.58s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 17: train_loss=0.0368 | val_loss=0.5898 | val_acc=0.8272\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 36%|███▌ | 18/50 [00:30<00:50, 1.58s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 18: train_loss=0.1706 | val_loss=0.5549 | val_acc=0.8395\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 38%|███▊ | 19/50 [00:31<00:49, 1.59s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 19: train_loss=0.0653 | val_loss=0.5782 | val_acc=0.8889\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 40%|████ | 20/50 [00:33<00:48, 1.62s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 20: train_loss=0.0443 | val_loss=0.6494 | val_acc=0.8889\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 42%|████▏ | 21/50 [00:34<00:46, 1.62s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 21: train_loss=0.0357 | val_loss=0.5232 | val_acc=0.8765\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 44%|████▍ | 22/50 [00:36<00:44, 1.59s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 22: train_loss=0.0609 | val_loss=0.5794 | val_acc=0.9012\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 46%|████▌ | 23/50 [00:38<00:42, 1.58s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 23: train_loss=0.0297 | val_loss=0.9269 | val_acc=0.8025\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 48%|████▊ | 24/50 [00:39<00:40, 1.57s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 24: train_loss=0.0464 | val_loss=0.6887 | val_acc=0.8765\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 50%|█████ | 25/50 [00:41<00:39, 1.59s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 25: train_loss=0.0512 | val_loss=0.7554 | val_acc=0.8395\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 52%|█████▏ | 26/50 [00:42<00:38, 1.62s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 26: train_loss=0.0661 | val_loss=0.6608 | val_acc=0.8642\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 54%|█████▍ | 27/50 [00:44<00:37, 1.62s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 27: train_loss=0.2460 | val_loss=1.0620 | val_acc=0.8025\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 56%|█████▌ | 28/50 [00:46<00:35, 1.63s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 28: train_loss=0.1088 | val_loss=0.7073 | val_acc=0.8519\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 58%|█████▊ | 29/50 [00:47<00:34, 1.63s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 29: train_loss=0.1148 | val_loss=0.4860 | val_acc=0.9012\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 60%|██████ | 30/50 [00:49<00:33, 1.65s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 30: train_loss=0.0731 | val_loss=0.4130 | val_acc=0.8765\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 62%|██████▏ | 31/50 [00:51<00:31, 1.64s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 31: train_loss=0.0252 | val_loss=0.4227 | val_acc=0.9012\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 64%|██████▍ | 32/50 [00:52<00:29, 1.63s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 32: train_loss=0.0154 | val_loss=0.5208 | val_acc=0.8889\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 66%|██████▌ | 33/50 [00:54<00:27, 1.63s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 33: train_loss=0.0132 | val_loss=0.5112 | val_acc=0.8765\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 68%|██████▊ | 34/50 [00:55<00:25, 1.62s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 34: train_loss=0.0092 | val_loss=0.5015 | val_acc=0.8889\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 70%|███████ | 35/50 [00:57<00:24, 1.62s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 35: train_loss=0.0089 | val_loss=0.4365 | val_acc=0.9012\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 72%|███████▏ | 36/50 [00:59<00:22, 1.62s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 36: train_loss=0.0194 | val_loss=0.4164 | val_acc=0.9012\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 74%|███████▍ | 37/50 [01:00<00:20, 1.61s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 37: train_loss=0.0225 | val_loss=0.4658 | val_acc=0.9012\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 76%|███████▌ | 38/50 [01:02<00:19, 1.64s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 38: train_loss=0.0175 | val_loss=0.4343 | val_acc=0.9259\n", + "(val_acc: 0.9259)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 78%|███████▊ | 39/50 [01:04<00:18, 1.66s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 39: train_loss=0.0088 | val_loss=0.4500 | val_acc=0.9259\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 80%|████████ | 40/50 [01:05<00:16, 1.69s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 40: train_loss=0.0137 | val_loss=0.4246 | val_acc=0.9136\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 82%|████████▏ | 41/50 [01:07<00:14, 1.66s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 41: train_loss=0.0029 | val_loss=0.4461 | val_acc=0.9012\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 84%|████████▍ | 42/50 [01:09<00:13, 1.67s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 42: train_loss=0.0047 | val_loss=0.4434 | val_acc=0.8889\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 86%|████████▌ | 43/50 [01:10<00:11, 1.63s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 43: train_loss=0.0076 | val_loss=0.4414 | val_acc=0.9136\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 88%|████████▊ | 44/50 [01:12<00:09, 1.63s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 44: train_loss=0.0021 | val_loss=0.4315 | val_acc=0.9136\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 90%|█████████ | 45/50 [01:13<00:08, 1.61s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 45: train_loss=0.1947 | val_loss=0.4867 | val_acc=0.9136\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 92%|█████████▏| 46/50 [01:15<00:06, 1.63s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 46: train_loss=0.2136 | val_loss=0.5481 | val_acc=0.9136\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 94%|█████████▍| 47/50 [01:17<00:04, 1.61s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 47: train_loss=0.1112 | val_loss=0.3793 | val_acc=0.9259\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 96%|█████████▌| 48/50 [01:18<00:03, 1.62s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 48: train_loss=0.0425 | val_loss=0.4124 | val_acc=0.9012\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 98%|█████████▊| 49/50 [01:20<00:01, 1.65s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 49: train_loss=0.2443 | val_loss=0.5492 | val_acc=0.9136\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 50/50 [01:22<00:00, 1.64s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 50: train_loss=0.0634 | val_loss=0.4833 | val_acc=0.9012\n", + "\n", + "Best validation accuracy: 0.9259\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "from tqdm import tqdm\n", + "\n", + "train_losses = []\n", + "val_losses = []\n", + "val_accs = []\n", + "best_val_acc = 0\n", + "best_model_path = 'best_galaxy_model.pt'\n", + "\n", + "for epoch in tqdm(range(50)):\n", + " train_loss = train_epoch(model, train_loader, optimizer, criterion)\n", + " val_loss, val_acc = eval_epoch(model, val_loader, criterion)\n", + "\n", + " train_losses.append(train_loss)\n", + " val_losses.append(val_loss)\n", + " val_accs.append(val_acc)\n", + "\n", + " print(f\"Epoch {epoch+1}: \"\n", + " f\"train_loss={train_loss:.4f} | \"\n", + " f\"val_loss={val_loss:.4f} | \"\n", + " f\"val_acc={val_acc:.4f}\")\n", + " \n", + " if val_acc > best_val_acc:\n", + " best_val_acc = val_acc\n", + " torch.save(model.state_dict(), best_model_path)\n", + " print(f\"(val_acc: {best_val_acc:.4f})\")\n", + "\n", + "print(f\"\\nBest validation accuracy: {best_val_acc:.4f}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "id": "d09010fc", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "fig, axes = plt.subplots(1, 2, figsize=(12, 4))\n", + "\n", + "axes[0].plot(train_losses, label='Train Loss', marker='o')\n", + "axes[0].plot(val_losses, label='Val Loss', marker='s')\n", + "axes[0].set_xlabel('Epoch')\n", + "axes[0].set_ylabel('Loss')\n", + "axes[0].set_title('Training and Validation Loss')\n", + "axes[0].legend()\n", + "axes[0].grid(True)\n", + "\n", + "axes[1].plot(val_accs, label='Val Accuracy', marker='o', color='green')\n", + "axes[1].set_xlabel('Epoch')\n", + "axes[1].set_ylabel('Accuracy')\n", + "axes[1].set_title('Validation Accuracy')\n", + "axes[1].legend()\n", + "axes[1].grid(True)\n", + "\n", + "plt.tight_layout()\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "id": "35b76584", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loaded best model weights (best_val_acc: 0.9259)\n", + "\n", + "Test Results:\n", + "Test Loss: 0.6895\n", + "Test Accuracy: 0.8317\n" + ] + } + ], + "source": [ + "model.load_state_dict(torch.load(best_model_path))\n", + "print(f\"Loaded best model weights (best_val_acc: {best_val_acc:.4f})\")\n", + "\n", + "test_loss, test_acc = eval_epoch(model, test_loader, criterion)\n", + "print(\"\\nTest Results:\")\n", + "print(f\"Test Loss: {test_loss:.4f}\")\n", + "print(f\"Test Accuracy: {test_acc:.4f}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "id": "1c1936e5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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Sp04cSLeGgiad3zs2LHkahcAAECKVrlyZXv11Vdt+vTptmLFCmvYsGF0nc58+fIFunkAUpmjR49at27drHTp0vb5559bunTpXN2oP/74wy1aBQApIiilYp0zZ868YPuMGTNc4U4AAACYjR071hU779Chg/Xp08euv/561y2zZ8+222+/nS4C4DfKiLrhhhts1KhRFhUV5Wa5rF+/3r1PsYAVgBSx+p5X37597YEHHrBt27bZXXfd5bYtXbrU1UjQIAsAAABmN998s/vSF5eKB6dNm5YuAuA3JUuWtDx58liuXLls9OjRLigFACkyKNWoUSP79NNPbfDgwS4IlSlTJitXrpx99dVXdvXVV/umlQAAACnU2rVrbePGje5nZZVXrFgx0E0CEOK04qeyohSACg8Pd1P15s2bZwULFnRlVwAgxQalRDURvHURVEfqww8/dPOTNeg6d+5ccrcRAAAgxdEy61rVSvWkcuTIEV3TpVatWq7sgbIWACA5HT9+3CUPKBh15swZu/baa61Hjx7uNupGAQiJmlJeWmmvZcuWVqBAAReF11S+NWvWJG/rAAAAUqjnn3/eLRCjWi5Hjhxxl99++82d0HvhhRcC3TwAIUQrfb7zzjuubtTQoUNdQKpOnTrxrpoOACk2U2r//v02bdo0mzp1qhtQPfzwwxYZGemm81HkHAAA4H8WLFhgS5YssRtvvDF6m8ZLEyZMcEuxA0ByWLVqlXXq1MnNWhEtqqBMqXvvvdfSpElDJwMIjUwp1ZJSgbxff/3VrdLw119/2Wuvvebb1gEAAKTgzIX4ardom24DgOQwZMgQF5DKli2bjRw50mVn6rsbASkAIZUp9eWXX7pU8+eee85KlCjh21YBAACkcCpt0LFjR1d7U+UO5M8//7TOnTtb7dq1A908ACnUyZMnLSoqKrpWnUqpFC5c2F555RXLmzdvoJsHAL7JlFJaqArnVapUyapWrWqvv/66HT58OGnPBgAAkEporKRyByouXLx4cXcpVqyY20a2OYCkUoble++952avvPjii9HbS5UqZRMnTiQgBSC0M6VuvfVWd9HUvZkzZ9rbb79tXbp0cW+OixcvdtH5rFmz+ra1AAAAKYTGRj/99JMtXbrUNm7c6LapvpSKDwNAUmhBKdWN+u6779z1r776yk6dOmWZM2emIwGkrtX3smTJYk899ZTL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bl27drU//vjDbatUqZKrG1W9evVANw8AgMtCXi8AAACQAowePdoFpK655hp7++237fvvvycgBQBI0ciUAgAAAILQ4cOHLX369JY9e3ZLkyaNy4qaOXOm9e7d27JmzRro5gEAcMXIlAIAAACCSFRUlI0bN85KlChhAwYMiN5evnx5GzJkCAEpAEDIIFMKAAAACBLz58+3Ll262ObNm931lStX2tmzZy1dOobtAIDQQ6YUAAAAEGAbN260e+65xxo2bOgCUnny5LFJkybZmjVrCEgBAEIWp1wAAACAAJoxY4a1aNHCzp0752pIdezY0V566SVXSwpIbfR3oCmsvqbnUAZiRESEe074F/2f8o9B+vTpLW3atFfcDoJSAAAAQADVrFnTMmfObLVq1bKRI0e6WlJAauPxeGz//v129OhRvz2fVrLcs2ePW0gA/kX/h8YxyJEjh9vHlfwNEZQCAAAA/Gjx4sW2YMECGzVqlLuuAf2GDRuscOHCHAekWt6AVN68eV2Q1teBovPnz9uJEyfsqquusrAwqtr4G/2fso+Bx+OxU6dO2cGDB931/PnzX3Y7CEoBAAAAfrB161br2rWrff755+763XffbXXr1nU/E5BCaqapQ96AVK5cufz2hfzMmTOWMWNGglIBQP+n/GOQKVMm978CU/rbvdypfISEAQAAAB/6999/rVu3bla6dGkXkFIND9WNqlSpEv0O/H9tG1GGFICUw/s3eyV14MiUAgAAAHyU/TF16lRXtPzQoUNum1bYGz16tJUqVYo+B+KgthOQ+v5mCUoBAAAAPqAzx0OGDHEBKQWhFIxSUAoAAPwX0/cAAACAZLJz5047e/as+1l1OsaPH29jx461X3/9lYAUAMTj77//djWJ9P6J4PH7779boUKF7OTJkz59HoJSAAAAwBU6fvy49erVy0qWLGlvvfVW9PZGjRq5+lHp06enj4EQ9OSTT7opTLro77xYsWLWo0cPi4iIuOC+X3zxhdWoUcOyZs3qavHccsstNm3atHj3+/HHH1vNmjUte/bsbnW0m2++2V555RU7cuTIRduzbNkya9CggSsYr+e46aab3AILf/75pwWrQYMG2X333WdFixa94Lb69eu7Ato//PDDBbepfzp16nTBdvVpjhw5Ym07duyY9enTx2Wt6oSBVj2tU6eOzZkzx60k5yvLly+3ihUrWnh4uF1//fUJHu+YZs2aZeXLl3fH79prr7URI0ZYUvf78ssvR/9eei9xp40/++yzVqFCBcuSJYvlyZPHHYNNmzZF367fnVtvvdVl+foSQSkAAADgClYveuedd+yGG26woUOHupWMVqxYQX8CqYhW0ty3b59t377dxowZY5MmTbL+/fvHus9rr73mvvRXq1bNvvvuO5c9+cgjj7jAgBZCiEnBk2bNmrmg1Zdffmm//fabjRo1yn755RebPn16gu3Q8yrQooCLglrKdJk4caJbbEGPv1x6X/OVU6dOudp7Tz/99AW37d6927799lvr0KGDvf3225f9HFrZ8fbbb7f//Oc/7uTBTz/9ZF9//bXrYwUQ1T++sGPHDmvYsKHVqlXL1q1b5wJorVu3toULFyb4mC+//NIee+wx93uh4/7GG2+436nXX389yfvV4hr6vfReVq1aFet2BbW03w0bNrjHKjhXr149Vw/Rq1WrVvbmm29GZwD7AjWlAAAAgMugAb6yoPQFR3S2WmeU7733XvoTSEWUraJAkBQuXNgFhhYvXmzDhg1z2/bs2eOylRQ8GDx4cPTjtC1Dhgz2wgsv2EMPPWRVq1a177//3t1H0371/uKlLKK6deu6AEt89u7d6/aji4IYMR935513Rj9OGTSffvqpC2Z46bl08U6fU/aX7q+g2IQJE9zra968uS1dutQF1GIqV66cNW3a1Pr16+euK1NUATAFTvTcak+7du0S7Lv58+e7/SsjJy4F/PV++txzz0Vn7GTKlMmSqnfv3u61bdmyxQoUKBC9XScT9LqUOeULCggqc84bELzxxhvd54aOjzLA4jN9+nRr0qSJC0rJdddd5wJp+l1q3769y3hK7H610qv39zI+bdu2dRlk2bJls7CwMHv11Vfd8VRfFS9e3N1Hv3PKztPJltq1aydr/0S30yd7BQAAAEKYpptoVT3RgF5fyJ5//nn3BRNA8mj02io7dDzSR93psfMej4W51cNiryCWJ2u4ff589cvaq7JblN2jaVdes2fPdgsfxM2IkmeeecYFTT788EMXlHr//ffddL2EAjlxp6V5ffTRRy6jSZk/SXlcQhSA0nubgmteWrhh27Zt0QELZdgo40tZWaK2671Q2TeaFvbzzz9bmzZt3PSwli1bxvs8CqZUqlTpgu3K2lFQSkExTTtT0F/9+Pjjjyc5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2qPxlLKa9BgFb06fPu3GM8pSVwaVXkP58uVtwYIFsU4KdujQwfLnz28ZM2Z04zWNf+KbvqcxkVSoUMFt13grbvbR5MmTXTv0vDFpPKcgktdnn31mFStWdM953XXX2YABAy6ZSZ8uXTr3OgsWLOjGkw899JAtXrw41hjx6aefjh67aWypLK6Y2Vbvvvuue25v1pUy5hMz/gRwZQhKAQgaGiRoACRLly51Z/Y0oPjiiy8sKirK6tev7wZqK1eutG+++cauuuoqd3bS+5hRo0a5FPG3337bDdyUtv3JJ59c9DmfeOIJ+/DDD238+PHuzNqkSZPcfjXY+/jjj9191A6lqHsHLxqQ/ec//7GJEyfahg0brHPnztaiRQtbsWJF9ODlgQcesEaNGrk09tatW1vPnj193HsAACCYaMqcxhcaKyjg8dVXX7kTZgl57LHHXIDohx9+sLVr17qxgzLIZdu2bW7M07RpU/v1119dBpDGOgoaJXWspaCQgjwa12jsNHLkSLdPjbMaN25sW7dudfdV23WycNasWW4s9P7771vRokXj3e/333/v/lfAS2MmlUuIS4Giv//+25YtWxa9TWM1BcL02kVjPI3NOnbsaL///rsbl2lspxOViaWAkTLBYmbZ6zWrbz/66CO33379+lnv3r3da5Nu3bq5wJP6WO3X5fbbb0/U+BPAFfIAQAC0bNnSc99997mfz58/71m8eLEnPDzc061bN3dbvnz5PJGRkdH3nz59uqdkyZLuvl66PVOmTJ6FCxe66/nz5/cMHz48+vaoqChPoUKFop9HatSo4enYsaP7efPmzUqjcs8dn2XLlrnb//nnn+htERERnsyZM3u+/fbbWPd9+umnPc2bN3c/9+rVy3PTTTfFuv3FF1+8YF8AACBl05glbdq0nixZskRfHnzwwXjv+9FHH3ly5coVff2dd97xZM+ePfp61qxZPdOmTYv3sRpntG3bNta2lStXesLCwjynT5+O9zFx979lyxbPDTfc4KlcubK7XqBAAc+gQYNiPeaWW27xtGvXzv38/PPPe+66665YY6+YNK755JNP3M87duxw13/++ecL+ifmOEw/P/XUU9HXJ02a5Npx7tw5d7127dqewYMHx9qHxoAa4yWkf//+rh/U9xkzZnTt0GX06NGei2nfvr2nadOmCbY1seNPAFeGmlIAAkYZUDrb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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ROC AUC Score: 0.9053\n" + ] + } + ], + "source": [ + "from sklearn.metrics import confusion_matrix, roc_curve, auc, roc_auc_score\n", + "from sklearn.preprocessing import label_binarize\n", + "import seaborn as sns\n", + "\n", + "all_preds = []\n", + "all_labels = []\n", + "all_probs = []\n", + "\n", + "model.eval()\n", + "with torch.no_grad():\n", + " for imgs, labels in test_loader:\n", + " imgs = imgs.to(device)\n", + " outputs = model(imgs)\n", + " probs = torch.softmax(outputs, dim=1)\n", + " preds = outputs.argmax(dim=1)\n", + " \n", + " all_preds.extend(preds.cpu().numpy())\n", + " all_labels.extend(labels.numpy())\n", + " all_probs.extend(probs.cpu().numpy())\n", + "\n", + "all_preds = np.array(all_preds)\n", + "all_labels = np.array(all_labels)\n", + "all_probs = np.array(all_probs)\n", + "\n", + "cm = confusion_matrix(all_labels, all_preds)\n", + "roc_auc = roc_auc_score(all_labels, all_probs[:, 1])\n", + "fpr, tpr, _ = roc_curve(all_labels, all_probs[:, 1])\n", + "fig, axes = plt.subplots(1, 2, figsize=(12, 4))\n", + "\n", + "sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', ax=axes[0], cbar=False)\n", + "axes[0].set_xlabel('Predicted')\n", + "axes[0].set_ylabel('Actual')\n", + "axes[0].set_title('Confusion Matrix')\n", + "\n", + "axes[1].plot(fpr, tpr, label=f'ROC Curve (AUC = {roc_auc:.4f})', linewidth=2)\n", + "axes[1].plot([0, 1], [0, 1], 'k--', label='Random Classifier')\n", + "axes[1].set_xlabel('False Positive Rate')\n", + "axes[1].set_ylabel('True Positive Rate')\n", + "axes[1].set_title('ROC AUC Curve')\n", + "axes[1].legend()\n", + "axes[1].grid(True)\n", + "\n", + "plt.tight_layout()\n", + "plt.show()\n", + "\n", + "print(f\"\\nROC AUC Score: {roc_auc:.4f}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8e9359f4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.8462 0.8302 0.8381 53\n", + " 1 0.8163 0.8333 0.8247 48\n", + "\n", + " accuracy 0.8317 101\n", + " macro avg 0.8312 0.8318 0.8314 101\n", + "weighted avg 0.8320 0.8317 0.8317 101\n", + "\n", + "Per-class metrics:\n", + " Class 0: precision=0.8462 recall=0.8302 f1=0.8381\n", + " Class 1: precision=0.8163 recall=0.8333 f1=0.8247\n", + "\n", + "Macro: precision=0.8312 recall=0.8318 f1=0.8314\n", + "\n", + "Matthews Correlation Coefficient (MCC): 0.6630\n", + "\n", + "Average Precision (AUPRC): 0.9004\n", + "Brier score: 0.140243\n" + ] + }, + { + "data": { + "image/png": "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WdpUm1iFife4P14vUl3qvw5jE77wGvBcVatWVeMrmPij/14UNYEN2TLQnnge3BcTeNBv0ac9H/qL6B/idngvMAZY2kAvxuPQtypNwMsQ3issHkhKSpKYmJgC/2eqNj148KB6bVqtcKTUfPzxx1X/yZQ2bdqkJuEhAFpR+JzjNRNVGh0R2YTPPvsM09B1v//+uy42NlYXERGh++6773Q1atTQeXp66i5evKhuN3z4cHW78ePHF7j/33//ra7/+uuvC1y/fv36AtfHx8frfH19dV26dNGlpaUVuG1ubm7+eTxP/fr18y+//PLLOj8/P112dnaRr+HPP/9Uz4W/kJmZqQsMDNSFhoYWeK5ffvlF3W7y5MkFng/XvfnmmwUes3379rqOHTuW2H5nz55V9582bZpqv+joaNUmnTp1Utf/8MMP+bedPn26ztvbW3fixIkCj4E2dXZ21l24cEFd/uOPP9R9X3rppULPp99Wqamphf6/T58+ukaNGhW47pZbblEnw23Ge1+catWq6dq2basrLTzmlClTCl2P9xPtbPiZ6969e6H3dciQIeq907/+0qVLOicnpwLv0R133KELCwvTpaenF2ibm266Sde0adNSbzMREdmHhIQEtW/p169fqe9jyv2o1p948cUXC+yX7r77bp2bm5vqI+jfF32bmJiYAs+DfV9GRkaB665du6arVauW7vHHH8+/Do9V1D4X1+kfiu3fv19dfvLJJwvcbuzYsep69Dn099e47q+//sq/Dtvo7u6ue+WVV3TFGTBggLovtrc0DNu0qH5gce314Ycfqv8LDw8vcH2rVq10t99+e5n7X0WpU6eObuDAgaXqQ69YsUJXs2ZN1Wa4XNZ+i2Gf1libGPvsou+Lfq/+6wY8Fk67d+/Ov+78+fM6Dw8P9Z4Zvha0d1k+988//3yBz5vm+PHj6volS5YUuP6+++7TNWjQoEB/Fr755ht1+x07dhR6LCIiMj3td3/Xrl0Frl+4cKG6funSperyjBkzdFWqVNENHjxY98EHH6hxj4CAAPVbrr/Px/6idu3aah+IvhD20atXry7y+adOnaqeB/vBuXPnqucdOnSobty4cUXuh7CvDQoK0o0ZM0btX+bMmaNr3ry5ztXVVbdv3778223YsEE9Nva9ixcvVqcXXnhBN2jQoPzbTJgwQb2ukSNH6pYtW6Z79913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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from sklearn.metrics import (precision_score, recall_score, f1_score,\n", + " classification_report, precision_recall_curve,\n", + " average_precision_score, matthews_corrcoef,\n", + " brier_score_loss)\n", + "from sklearn.calibration import calibration_curve\n", + "\n", + "y_true = all_labels\n", + "y_pred = all_preds\n", + "y_score = all_probs[:, 1]\n", + "\n", + "prec_per_class = precision_score(y_true, y_pred, average=None)\n", + "rec_per_class = recall_score(y_true, y_pred, average=None)\n", + "f1_per_class = f1_score(y_true, y_pred, average=None)\n", + "\n", + "print('\\nClassification Report:')\n", + "print(classification_report(y_true, y_pred, digits=4))\n", + "\n", + "print('Per-class metrics:')\n", + "for i, (p, r, f) in enumerate(zip(prec_per_class, rec_per_class, f1_per_class)):\n", + " print(f' Class {i}: precision={p:.4f} recall={r:.4f} f1={f:.4f}')\n", + "\n", + "prec_macro = precision_score(y_true, y_pred, average='macro')\n", + "rec_macro = recall_score(y_true, y_pred, average='macro')\n", + "f1_macro = f1_score(y_true, y_pred, average='macro')\n", + "print(f'\\nMacro: precision={prec_macro:.4f} recall={rec_macro:.4f} f1={f1_macro:.4f}')\n", + "\n", + "mcc = matthews_corrcoef(y_true, y_pred)\n", + "print(f'\\nMatthews Correlation Coefficient (MCC): {mcc:.4f}')\n", + "\n", + "prec_pr, rec_pr, pr_thresh = precision_recall_curve(y_true, y_score)\n", + "auprc = average_precision_score(y_true, y_score)\n", + "print(f'\\nAverage Precision (AUPRC): {auprc:.4f}')\n", + "\n", + "brier = brier_score_loss(y_true, y_score)\n", + "print(f'Brier score: {brier:.6f}')\n", + "\n", + "prob_true, prob_pred = calibration_curve(y_true, y_score, n_bins=10)\n", + "\n", + "fig, axes = plt.subplots(1, 3, figsize=(18, 4))\n", + "\n", + "axes[0].plot(rec_pr, prec_pr, label=f'AUPRC={auprc:.4f}', linewidth=2)\n", + "axes[0].set_xlabel('Recall')\n", + "axes[0].set_ylabel('Precision')\n", + "axes[0].set_title('Precision-Recall Curve')\n", + "axes[0].legend()\n", + "axes[0].grid(True)\n", + "\n", + "axes[1].plot(prob_pred, prob_true, marker='o', label='Calibration')\n", + "axes[1].plot([0, 1], [0, 1], 'k--', label='Perfectly calibrated')\n", + "axes[1].set_xlabel('Mean predicted probability')\n", + "axes[1].set_ylabel('Fraction of positives')\n", + "axes[1].set_title('Calibration Curve (Reliability)')\n", + "axes[1].legend()\n", + "axes[1].grid(True)\n", + "\n", + "labels = [f'Class {i}' for i in range(len(prec_per_class))]\n", + "x = np.arange(len(labels))\n", + "width = 0.25\n", + "axes[2].bar(x - width, prec_per_class, width, label='Precision')\n", + "axes[2].bar(x, rec_per_class, width, label='Recall')\n", + "axes[2].bar(x + width, f1_per_class, width, label='F1')\n", + "axes[2].set_xticks(x)\n", + "axes[2].set_xticklabels(labels)\n", + "axes[2].set_ylabel('Score')\n", + "axes[2].set_title('Per-class Precision / Recall / F1')\n", + "axes[2].legend()\n", + "axes[2].grid(True)\n", + "\n", + "plt.tight_layout()\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "55254b04", + "metadata": {}, "outputs": [], "source": [] }