Acquiring Data for the Tutorial

We need to download the data we’ll need for this tutorial. From within the dawn_giant directory, make a file called download_data.py, enter the following code into the file, then run python download_data.py (note that ~4 GB will be downloaded to your machine, so ensure that you (a) have enough space and (b) have enough time to complete the download). This script just uses some basic python capabilities to do the downloads so we won’t go into detail about what it is doing here.

import requests
from bs4 import BeautifulSoup
import re
import ftplib

from pathlib import Path

import time


def download_images():

    web_locations = ["https://sbnarchive.psi.edu/pds3/dawn/fc/DWNXFC2_1A/DATA/FITS/20071203_PERFORMANCE/",
                     "https://sbnarchive.psi.edu/pds3/dawn/fc/DWNXFC2_1A/DATA/FITS/20100720_CHKOUT_VIRGEOMCAL/",
                     "https://sbnarchive.psi.edu/pds3/dawn/fc/DWNVFC2_1A/DATA/FITS/2011123_APPROACH/2011123_OPNAV_001/",
                     "https://sbnarchive.psi.edu/pds3/dawn/fc/DWNVFC2_1A/DATA/FITS/2011123_APPROACH/2011165_OPNAV_007/",
                     "https://sbnarchive.psi.edu/pds3/dawn/fc/DWNVFC2_1A/DATA/FITS/2011123_APPROACH/2011198_OPNAV_017/",
                     "https://sbnarchive.psi.edu/pds3/dawn/fc/DWNVFC2_1A/DATA/FITS/2011123_APPROACH/2011218_OPNAV_023/"]

    local_locations = ["cal1",
                       "cal2",
                       "opnav/2011123_OPNAV_001/",
                       "opnav/2011165_OPNAV_007/",
                       "opnav/2011198_OPNAV_017/",
                       "opnav/2011218_OPNAV_023/"]

    filt = re.compile("FC2.*F1.*")

    for addr, dest in zip(web_locations, local_locations):
        page = requests.get(addr)
        soup = BeautifulSoup(page.text)

        local_dir = Path(dest)
        local_dir.mkdir(exist_ok=True, parents=True)

        for p in soup.find_all('a', href=filt):

            if filt.match(p['href']):
                start = time.time()

                local_file = local_dir / p['href']

                r = requests.get(addr+p['href'], stream=True)
                if r.status_code == 200:
                    with local_file.open('wb') as f:
                        for chunk in r:
                            f.write(chunk)

                print('{} complete in {:.3f}'.format(p['href'], time.time()-start), flush=True)


def download_spice():
    ftp = ftplib.FTP('naif.jpl.nasa.gov')

    ftp.login()

    ftp.cwd('pub/naif/DAWN/kernels/')

    files = ['lsk/naif0012.tls',
             'pck/pck00008.tpc',
             'spk/de432.bsp',
             'spk/sb_vesta_ssd_120716.bsp',
             'pck/dawn_vesta_v02.tpc',
             'fk/dawn_v14.tf',
             'fk/dawn_vesta_v00.tf',
             'sclk/DAWN_203_SCLKSCET.00090.tsc',
             'spk/dawn_rec_070927-070930_081218_v1.bsp',
             'spk/dawn_rec_070930-071201_081218_v1.bsp',
             'spk/dawn_rec_071201-080205_081218_v1.bsp',
             'spk/dawn_rec_100208-100316_100323_v1.bsp',
             'spk/dawn_rec_100316-100413_100422_v1.bsp',
             'spk/dawn_rec_100413-100622_100830_v1.bsp',
             'spk/dawn_rec_100622-100824_100830_v1.bsp',
             'spk/dawn_rec_100824-101130_101202_v1.bsp',
             'spk/dawn_rec_101130-110201_110201_v1.bsp',
             'spk/dawn_rec_101130-110419_pred_110419-110502_110420_v1.bsp',
             'spk/dawn_rec_101130-110606_pred_110606-110628_110609_v1.bsp',
             'spk/dawn_rec_110201-110328_110328_v1.bsp',
             'spk/dawn_rec_110328-110419_110419_v1.bsp',
             'spk/dawn_rec_110328-110419_110420_v1.bsp',
             'spk/dawn_rec_110416-110802_110913_v1.bsp',
             'spk/dawn_rec_110802-110831_110922_v1.bsp',
             'spk/dawn_rec_110831-110928_111221_v1.bsp',
             'spk/dawn_rec_110928-111102_111221_v1.bsp',
             'spk/dawn_rec_110928-111102_120615_v1.bsp',
             'spk/dawn_rec_111102-111210_120618_v1.bsp',
             'spk/dawn_rec_111211-120501_120620_v1.bsp',
             'ck/dawn_fc_v3.bc',
             'ck/dawn_sc_071203_071209.bc',
             'ck/dawn_sc_071210_071216.bc',
             'ck/dawn_sc_071217_071223.bc',
             'ck/dawn_sc_071224_071230.bc',
             'ck/dawn_sc_071231_080106.bc',
             'ck/dawn_sc_100705_100711.bc',
             'ck/dawn_sc_100712_100718.bc',
             'ck/dawn_sc_100719_100725.bc',
             'ck/dawn_sc_100726_100801.bc',
             'ck/dawn_sc_110502_110508.bc',
             'ck/dawn_sc_110509_110515.bc',
             'ck/dawn_sc_110516_110522.bc',
             'ck/dawn_sc_110523_110529.bc',
             'ck/dawn_sc_110530_110605.bc',
             'ck/dawn_sc_110606_110612.bc',
             'ck/dawn_sc_110613_110619.bc',
             'ck/dawn_sc_110620_110626.bc',
             'ck/dawn_sc_110627_110703.bc',
             'ck/dawn_sc_110704_110710.bc',
             'ck/dawn_sc_110711_110717.bc',
             'ck/dawn_sc_110718_110724.bc',
             'ck/dawn_sc_110725_110731.bc',
             'ck/dawn_sc_110801_110807.bc',
             'ck/dawn_sc_110808_110814.bc',
             'ck/dawn_sc_110815_110821.bc',
             'ck/dawn_sc_110822_110828.bc',
             'ck/dawn_sc_110829_110904.bc',
             'dsk/old_versions/vesta_gaskell_512_110825.bds'
             ]

    for file in files:
        start = time.time()

        local = Path('kernels').joinpath(file)

        local.parent.mkdir(exist_ok=True, parents=True)

        with local.open('wb') as ofile:
            ftp.retrbinary('RETR {}'.format(file), ofile.write)

        print('{} done in {:.3f}'.format(file, time.time()-start), flush=True)


if __name__ == '__main__':
    download_spice()
    download_images()

Directories cal1 and cal2 provide images that we will use to perform geometric camera calibration of the camera we are going to use. Directory opnav contains the OpNav images we will use GIANT to process once we have completed our calibration. All of the image directories also include label (.LBL) files which provide meta data about the images. Directory kernels contains NAIF Spice kernels that provide our a priori position and pointing information to feed GIANT.

Once the download is complete, enter the following commands in the terminal to prepare the shape model and the rest of our directory.

mkdir shape_model
cd shape_model
ingest_shape ../kernels/dsk/old_versions/vesta_gaskell_512_110825.bds "Vesta SPC" -p ../kernels/pck/dawn_vesta_02.tpc -m 18 -e # convert the shape into the GIANT format
cd ..
mkdir scripts

Directory shape_model contains the shape model file, and function ingest_shape builds the GIANT version of the shape model for us and stores it in this directory. Finally, directory scripts is where we will write our scripts to use GIANT to actually process images.

Finally, we need to build the GIANT star catalogue (alternatively, you can contact Andrew, andrew.j.liounis@nasa.gov, if you would like a pre-built star catalogue. To do this run the command line script included with GIANT build_catalogue with the following settings

build_catalogue -m 12 -n 0

This will likely take a while to run because it requires first downloading the UCAC4 catalogue, which is about 9 GB in size. If you already have the UCAC4 catalogue downloaded to your machine (with the original directory structure) you can skip the download step by adding the -u option with the path to the root of the UCAC4 directory structure.