diff --git a/examples/cassini_isis_cmp.ipynb b/examples/cassini_isis_cmp.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..842205f7d8dad327cbbcfb9ecef313dcda451fc5 --- /dev/null +++ b/examples/cassini_isis_cmp.ipynb @@ -0,0 +1,253 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Comparing a USGSCSM and ISIS camera for Cassini ISS" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pvl\n", + "import numpy as np\n", + "import os\n", + "import pandas as pd\n", + "import knoten\n", + "import csmapi\n", + "\n", + "os.environ['ISISROOT'] = '/usgs/pkgs/isis3.8.0_RC1/install'\n", + "from pysis import isis\n", + "from pysis.exceptions import ProcessError" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Make a CSM sensor model\n", + "Requires N1702360370_1.LBL and N1702360370_1.IMG in data directory" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "fileName = 'data/N1702360370_1.LBL'\n", + "camera = knoten.csm.create_csm(fileName)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Ingest the image and spiceinit" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Set the output location of the resulting .cub\n", + "cub_loc = os.path.splitext(fileName)[0] + '.cub'\n", + "\n", + "try: \n", + " isis.ciss2isis(from_=fileName, to=cub_loc)\n", + "except ProcessError as e:\n", + " print(e.stderr)\n", + "\n", + "try:\n", + " isis.spiceinit(from_=cub_loc, shape='ellipsoid')\n", + "except ProcessError as e:\n", + " print(e.stderr)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Define a function that compares ISIS and USGSCSM pixels" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def check_pixel(camera, cub, line, sample):\n", + " \"\"\"Compares ISIS and USGSCSM pixel.\n", + " \n", + " Takes an image coordinate, projects it to a ground point using ISIS, then projects\n", + " the result back into an image coordinate using USGSCSM and computes the difference\n", + " between image coordinates.\n", + " \"\"\"\n", + " output = isis.campt(from_=cub, line=line, sample=sample)\n", + " pvl_output = pvl.loads(output)\n", + " bodyfixed = pvl_output['GroundPoint']['BodyFixedCoordinate']\n", + " bodyfixed = np.asarray(bodyfixed.value) * 1000\n", + " image_coord = camera.groundToImage(csmapi.EcefCoord(*bodyfixed))\n", + " # (.5,.5) in CSM == (1,1) in ISIS, so we have to subtract (.5,.5) from the ISIS pixels\n", + " line_diff = line - image_coord.line - .5\n", + " sample_diff = sample - image_coord.samp - .5\n", + " return line_diff, sample_diff" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Get the total number of lines / samples" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "isis_label = pvl.load(cub_loc)\n", + "n_samples = isis_label['IsisCube']['Core']['Dimensions']['Samples']\n", + "n_lines = isis_label['IsisCube']['Core']['Dimensions']['Lines']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Compare top left, top right, bottom left, bottom right, and center pixels using check_pixel" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>line</th>\n", + " <th>sample</th>\n", + " <th>line_diff</th>\n", + " <th>sample_diff</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>1.0</td>\n", + " <td>1.0</td>\n", + " <td>-1020.486363</td>\n", + " <td>-1024.409488</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>1.0</td>\n", + " <td>1024.0</td>\n", + " <td>-1020.472731</td>\n", + " <td>1022.315882</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>1024.0</td>\n", + " <td>1.0</td>\n", + " <td>1026.247265</td>\n", + " <td>-1024.418200</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>1024.0</td>\n", + " <td>1024.0</td>\n", + " <td>1026.260599</td>\n", + " <td>1022.307325</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>512.0</td>\n", + " <td>512.0</td>\n", + " <td>1.888677</td>\n", + " <td>-2.053929</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " line sample line_diff sample_diff\n", + "0 1.0 1.0 -1020.486363 -1024.409488\n", + "1 1.0 1024.0 -1020.472731 1022.315882\n", + "2 1024.0 1.0 1026.247265 -1024.418200\n", + "3 1024.0 1024.0 1026.260599 1022.307325\n", + "4 512.0 512.0 1.888677 -2.053929" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pixels_dict = {'line' : [1,1,n_lines, n_lines, n_lines/2],\n", + " 'sample' : [1, n_samples, 1, n_samples, n_samples/2]}\n", + "\n", + "pixels_df = pd.DataFrame.from_dict(pixels_dict)\n", + "pixels_df['line_diff'] = np.NaN\n", + "pixels_df['sample_diff'] = np.NaN\n", + "\n", + "for idx, row in pixels_df.iterrows():\n", + " pixels_df.iloc[idx]['line_diff'], pixels_df.iloc[idx]['sample_diff'] = check_pixel(camera, cub_loc, row['line'], row['sample'])\n", + "\n", + "pixels_df" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.7.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/data/N1702360370_1.IMG b/examples/data/N1702360370_1.IMG new file mode 100644 index 0000000000000000000000000000000000000000..ef12eeb80485d3a37f96fe9beff8b7d096695915 Binary files /dev/null and b/examples/data/N1702360370_1.IMG differ diff --git a/examples/data/N1702360370_1.LBL b/examples/data/N1702360370_1.LBL new file mode 100644 index 0000000000000000000000000000000000000000..6269edb68c147d3cd45a4f2ee584c532525b4582 --- /dev/null +++ b/examples/data/N1702360370_1.LBL @@ -0,0 +1,120 @@ +PDS_VERSION_ID = PDS3 + +/* FILE CHARACTERISTICS */ + +RECORD_TYPE = FIXED_LENGTH +RECORD_BYTES = 1048 +FILE_RECORDS = 1028 + +/* POINTERS TO DATA OBJECTS */ + +^IMAGE_HEADER = ("N1702360370_1.IMG",1) +^TELEMETRY_TABLE = ("N1702360370_1.IMG",4) +^LINE_PREFIX_TABLE = ("N1702360370_1.IMG",5) +^IMAGE = ("N1702360370_1.IMG",5) + +/* IDENTIFICATION DATA ELEMENTS */ + +ANTIBLOOMING_STATE_FLAG = "OFF" +BIAS_STRIP_MEAN = 8.850293 +CALIBRATION_LAMP_STATE_FLAG = "N/A" +COMMAND_FILE_NAME = "trigger_3618_1.ioi" +COMMAND_SEQUENCE_NUMBER = 3618 +DARK_STRIP_MEAN = 0.269221 +DATA_CONVERSION_TYPE = "TABLE" +DATA_SET_ID = "CO-S-ISSNA/ISSWA-2-EDR-V1.0" +DELAYED_READOUT_FLAG = "NO" +DESCRIPTION = "Incomplete product finalized due to truncated lines." +DETECTOR_TEMPERATURE = -89.243546 <DEGC> +EARTH_RECEIVED_START_TIME = 2011-346T22:30:08.981 +EARTH_RECEIVED_STOP_TIME = 2011-346T22:30:49.765 +ELECTRONICS_BIAS = 112 +EXPECTED_MAXIMUM = (62.996498,69.454498) +EXPECTED_PACKETS = 576 +EXPOSURE_DURATION = 4600.000000 +FILTER_NAME = ("CL1","UV3") +FILTER_TEMPERATURE = 0.248629 +FLIGHT_SOFTWARE_VERSION_ID = "1.4" +GAIN_MODE_ID = "29 ELECTRONS PER DN" +IMAGE_MID_TIME = 2011-346T05:02:22.073 +IMAGE_NUMBER = "1702360370" +IMAGE_OBSERVATION_TYPE = {"SCIENCE"} +IMAGE_TIME = 2011-346T05:02:24.373 +INSTRUMENT_DATA_RATE = 182.783997 +INSTRUMENT_HOST_NAME = "CASSINI ORBITER" +INSTRUMENT_ID = "ISSNA" +INSTRUMENT_MODE_ID = "FULL" +INSTRUMENT_NAME = "IMAGING SCIENCE SUBSYSTEM - NARROW ANGLE" +INST_CMPRS_PARAM = ("N/A","N/A","N/A","N/A") +INST_CMPRS_RATE = (5.333330,3.631307) +INST_CMPRS_RATIO = 2.203063 +INST_CMPRS_TYPE = "LOSSLESS" +LIGHT_FLOOD_STATE_FLAG = "ON" +METHOD_DESC = "ISSPT2.7;Enceladus;ISS_158EN_ENCEL001_PRIME" +MISSING_LINES = 31 +MISSING_PACKET_FLAG = "NO" +MISSION_NAME = "CASSINI-HUYGENS" +MISSION_PHASE_NAME = "EXTENDED-EXTENDED MISSION" +OBSERVATION_ID = "ISS_158EN_ENCEL001_PRIME" +OPTICS_TEMPERATURE = (0.627499,1.905708) +ORDER_NUMBER = 16 +PARALLEL_CLOCK_VOLTAGE_INDEX = 9 +PREPARE_CYCLE_INDEX = 4 +PRODUCT_CREATION_TIME = 2011-346T15:34:07.000 +PRODUCT_ID = "1_N1702360370.120" +PRODUCT_VERSION_TYPE = "FINAL" +READOUT_CYCLE_INDEX = 6 +RECEIVED_PACKETS = 523 +SENSOR_HEAD_ELEC_TEMPERATURE = 1.633024 +SEQUENCE_ID = "S71" +SEQUENCE_NUMBER = 16 +SEQUENCE_TITLE = "ISS_158EN_ENCEL001_PRIME" +SHUTTER_MODE_ID = "NACONLY" +SHUTTER_STATE_ID = "ENABLED" +SOFTWARE_VERSION_ID = "ISS 11.00 05-24-2006" +SPACECRAFT_CLOCK_CNT_PARTITION = 1 +SPACECRAFT_CLOCK_START_COUNT = "1702360365.220" +SPACECRAFT_CLOCK_STOP_COUNT = "1702360370.120" +START_TIME = 2011-346T05:02:19.773 +STOP_TIME = 2011-346T05:02:24.373 +TARGET_DESC = "Enceladus" +TARGET_LIST = "N/A" +TARGET_NAME = "ENCELADUS" +TELEMETRY_FORMAT_ID = "S&ER3" +VALID_MAXIMUM = (4095,4095) +OBJECT = IMAGE_HEADER + INTERCHANGE_FORMAT = ASCII + HEADER_TYPE = VICAR2 + BYTES = 3144 + RECORDS = 1 + ^DESCRIPTION = "../../label/vicar2.txt" +END_OBJECT = IMAGE_HEADER +OBJECT = TELEMETRY_TABLE + INTERCHANGE_FORMAT = BINARY + ROWS = 1 + COLUMNS = 2 + ROW_BYTES = 1048 + ^STRUCTURE = "../../label/tlmtab.fmt" + OBJECT = COLUMN + NAME = NULL_PADDING + DATA_TYPE = MSB_UNSIGNED_INTEGER + START_BYTE = 61 + BYTES = 987 + END_OBJECT = COLUMN +END_OBJECT = TELEMETRY_TABLE +OBJECT = LINE_PREFIX_TABLE + INTERCHANGE_FORMAT = BINARY + ROWS = 1024 + COLUMNS = 7 + ROW_BYTES = 24 + ROW_SUFFIX_BYTES = 1024 + ^LINE_PREFIX_STRUCTURE = "../../label/prefix3.fmt" +END_OBJECT = LINE_PREFIX_TABLE +OBJECT = IMAGE + LINES = 1024 + LINE_SAMPLES = 1024 + SAMPLE_BITS = 8 + SAMPLE_TYPE = SUN_INTEGER + LINE_PREFIX_BYTES = 24 +END_OBJECT = IMAGE +END