Commit 1683c7bd authored by Adam Paquette's avatar Adam Paquette
Browse files

Updated script with argparsing. Included csv for potential testing.

parent 4d61f5c3
Loading
Loading
Loading
Loading

bin/Socetnet2ISIS.py

deleted100644 → 0
+0 −73
Original line number Diff line number Diff line
import os
import warnings
import numpy as np

from plio.examples import get_path
from plio.io.io_bae import read_atf, read_gpf, read_ipf
from plio.spatial.transformations import *
import plio.io.io_controlnetwork as cn

import pandas as pd

# TODO: Change script to potentially handle configuration files

# Setup the at_file and path to cubes
cub_path = '/Volumes/Blueman/'
at_file = get_path('CTX_Athabasca_Middle_step0.atf')

# Define ipf mapping to cubs
image_dict = {'P01_001540_1889_XI_08N204W' : 'P01_001540_1889_XI_08N204W.lev1.cub',
              'P01_001606_1897_XI_09N203W' : 'P01_001606_1897_XI_09N203W.lev1.cub',
              'P02_001804_1889_XI_08N204W' : 'P02_001804_1889_XI_08N204W.lev1.cub',
              'P03_002226_1895_XI_09N203W' : 'P03_002226_1895_XI_09N203W.lev1.cub',
              'P03_002371_1888_XI_08N204W' : 'P03_002371_1888_XI_08N204W.lev1.cub',
              'P19_008344_1894_XN_09N203W' : 'P19_008344_1894_XN_09N203W.lev1.cub',
              'P20_008845_1894_XN_09N203W' : 'P20_008845_1894_XN_09N203W.lev1.cub'}

##
# End Config
##

# Read in and setup the atf dict of information
atf_dict = read_atf(at_file)

# Get the gpf and ipf files using atf dict
gpf_file = os.path.join(atf_dict['PATH'], atf_dict['GP_FILE']);
ipf_list = [os.path.join(atf_dict['PATH'], i) for i in atf_dict['IMAGE_IPF']]

# Read in the gpf file and ipf file(s) into seperate dataframes
gpf_df = read_gpf(gpf_file)
ipf_df = read_ipf(ipf_list)

# Check for differences between point ids using each dataframes
# point ids as a reference
gpf_pt_idx = pd.Index(pd.unique(gpf_df['point_id']))
ipf_pt_idx = pd.Index(pd.unique(ipf_df['pt_id']))

point_diff = ipf_pt_idx.difference(gpf_pt_idx)

if len(point_diff) != 0:
    warnings.warn("The following points found in ipf files missing from gpf file: \n\n{}. \
                  \n\nContinuing, but these points will be missing from the control network".format(list(point_diff)))

# Merge the two dataframes on their point id columns
socet_df = ipf_df.merge(gpf_df, left_on='pt_id', right_on='point_id')

# Apply the transformations
apply_transformations(atf_dict, socet_df)

# Define column remap for socet dataframe
column_remap = {'l.': 'y', 's.': 'x',
                'res_l': 'LineResidual', 'res_s': 'SampleResidual', 'known': 'Type',
                'lat_Y_North': 'AprioriY', 'long_X_East': 'AprioriX', 'ht': 'AprioriZ',
                'sig0': 'AprioriLatitudeSigma', 'sig1': 'AprioriLongitudeSigma', 'sig2': 'AprioriRadiusSigma'}

# Rename the columns using the column remap above
socet_df.rename(columns = column_remap, inplace=True)

images = pd.unique(socet_df['ipf_file'])

serial_dict = serial_numbers(image_dict, cub_path)

# creates the control network
cn.to_isis('/Volumes/Blueman/test.net', socet_df, serial_dict)
+79 −2
Original line number Diff line number Diff line
#!/usr/bin/env python
import argparse
import os
import sys
import warnings
import csv
import numpy as np

from plio.examples import get_path
from plio.io.io_bae import read_atf, read_gpf, read_ipf
from plio.spatial.transformations import *
import plio.io.io_controlnetwork as cn

import pandas as pd

def parse_args():
    parser = argparse.ArgumentParser()

    # Add args here
    parser.add_argument('at_file', help='Path to the .atf file for a project.')
    parser.add_argument('cub_file_path', help='Path to cube files related to ipf files.')
    parser.add_argument('cub_ipf_map', help='Path to map file for all ipfs and cubes.')
    parser.add_argument('--outpath', help='Directory for the control network to be output to.',
                                        required = False)

    return parser.parse_args()


def main(args):
    print('Getting some work done')
    # Setup the at_file, path to cubes, and control network out path
    at_file = args.at_file
    cnet_out = os.path.split(os.path.splitext(at_file)[0])[1]
    cub_path = args.cub_file_path

    if(args.outpath):
        outpath = args.outpath
    else:
        outpath = os.path.split(at_file)[0]

    with open(args.cub_ipf_map) as cub_ipf_map:
        reader = csv.reader(cub_ipf_map, delimiter = ',')
        image_dict = dict([(row[0], row[1]) for row in reader])

    # Read in and setup the atf dict of information
    atf_dict = read_atf(at_file)

    # Get the gpf and ipf files using atf dict
    gpf_file = os.path.join(atf_dict['PATH'], atf_dict['GP_FILE']);
    ipf_list = [os.path.join(atf_dict['PATH'], i) for i in atf_dict['IMAGE_IPF']]

    # Read in the gpf file and ipf file(s) into seperate dataframes
    gpf_df = read_gpf(gpf_file)
    ipf_df = read_ipf(ipf_list)

    # Check for differences between point ids using each dataframes
    # point ids as a reference
    gpf_pt_idx = pd.Index(pd.unique(gpf_df['point_id']))
    ipf_pt_idx = pd.Index(pd.unique(ipf_df['pt_id']))

    point_diff = ipf_pt_idx.difference(gpf_pt_idx)

    if len(point_diff) != 0:
        warnings.warn("The following points found in ipf files missing from gpf file: " +
        "\n\n{}\n\n".format("\n".join(point_diff)) +
        "Continuing, but these points will be missing from the control " +
        "network.", stacklevel=3)

    # Merge the two dataframes on their point id columns
    socet_df = ipf_df.merge(gpf_df, left_on='pt_id', right_on='point_id')

    # Apply the transformations
    apply_transformations(atf_dict, socet_df)

    # Define column remap for socet dataframe
    column_remap = {'l.': 'y', 's.': 'x',
                    'res_l': 'LineResidual', 'res_s': 'SampleResidual', 'known': 'Type',
                    'lat_Y_North': 'AprioriY', 'long_X_East': 'AprioriX', 'ht': 'AprioriZ',
                    'sig0': 'AprioriLatitudeSigma', 'sig1': 'AprioriLongitudeSigma',
                    'sig2': 'AprioriRadiusSigma'}

    # Rename the columns using the column remap above
    socet_df.rename(columns = column_remap, inplace=True)

    images = pd.unique(socet_df['ipf_file'])

    serial_dict = serial_numbers(image_dict, cub_path)

    # creates the control network
    cn.to_isis(os.path.join(outpath, cnet_out + '.net'), socet_df, serial_dict)

if __name__ == '__main__':
    main(parse_args())
+7 −0
Original line number Diff line number Diff line
P01_001540_1889_XI_08N204W,P01_001540_1889_XI_08N204W.lev1.cub
P01_001606_1897_XI_09N203W,P01_001606_1897_XI_09N203W.lev1.cub
P02_001804_1889_XI_08N204W,P02_001804_1889_XI_08N204W.lev1.cub
P03_002226_1895_XI_09N203W,P03_002226_1895_XI_09N203W.lev1.cub
P03_002371_1888_XI_08N204W,P03_002371_1888_XI_08N204W.lev1.cub
P19_008344_1894_XN_09N203W,P19_008344_1894_XN_09N203W.lev1.cub
P20_008845_1894_XN_09N203W,P20_008845_1894_XN_09N203W.lev1.cub
+1 −6
Original line number Diff line number Diff line
@@ -45,7 +45,6 @@ def line_sample_size(record, path):
        sample_size = int(sample_size)/2.0 + record['s.'] + 1
        return sample_size, line_size, img_index

# converts known to ISIS keywords
def known(record):
    """
    Converts the known field from a socet dataframe into the
@@ -67,7 +66,6 @@ def known(record):
    elif record['known'] == 1 or record['known'] == 2 or record['known'] == 3:
        return 'Constrained'

# converts +/- 180 system to 0 - 360 system
def to_360(num):
    """
    Transforms a given number into 0 - 360 space
@@ -140,7 +138,6 @@ def og2oc(dlat, dMajorRadius, dMinorRadius):
        print ("Error in og2oc conversion")
    return dlat

# gets eRadius and pRadius from a .prj file
def get_axis(file):
    """
    Gets eRadius and pRadius from a .prj file
@@ -291,7 +288,5 @@ def serial_numbers(image_dict, path):
    serial_dict = dict()

    for key in image_dict:
        snum = sn.generate_serial_number(os.path.join(path, image_dict[key]))
        snum = snum.replace('Mars_Reconnaissance_Orbiter', 'MRO')
        serial_dict[key] = snum
        serial_dict[key] = sn.generate_serial_number(os.path.join(path, image_dict[key]))
    return serial_dict