From 1683c7bd582aa731a2ffd0037e0d2237edeb8691 Mon Sep 17 00:00:00 2001 From: Adam Paquette <acpaquette@usgs.gov> Date: Fri, 11 May 2018 18:19:08 -0700 Subject: [PATCH] Updated script with argparsing. Included csv for potential testing. --- bin/Socetnet2ISIS.py | 73 --------------------------- bin/socet2isis | 81 +++++++++++++++++++++++++++++- plio/examples/SocetSet/cub_map.csv | 7 +++ plio/spatial/transformations.py | 7 +-- 4 files changed, 87 insertions(+), 81 deletions(-) delete mode 100644 bin/Socetnet2ISIS.py create mode 100644 plio/examples/SocetSet/cub_map.csv diff --git a/bin/Socetnet2ISIS.py b/bin/Socetnet2ISIS.py deleted file mode 100644 index a410606..0000000 --- a/bin/Socetnet2ISIS.py +++ /dev/null @@ -1,73 +0,0 @@ -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) diff --git a/bin/socet2isis b/bin/socet2isis index 44255ae..2fe0580 100644 --- a/bin/socet2isis +++ b/bin/socet2isis @@ -1,15 +1,92 @@ #!/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()) \ No newline at end of file + main(parse_args()) diff --git a/plio/examples/SocetSet/cub_map.csv b/plio/examples/SocetSet/cub_map.csv new file mode 100644 index 0000000..cca0f2c --- /dev/null +++ b/plio/examples/SocetSet/cub_map.csv @@ -0,0 +1,7 @@ +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 diff --git a/plio/spatial/transformations.py b/plio/spatial/transformations.py index 18160ee..efc4ad6 100644 --- a/plio/spatial/transformations.py +++ b/plio/spatial/transformations.py @@ -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 -- GitLab