#!/usr/bin/env python3 import isce from isce.components.isceobj.Sensor import createSensor import shelve import argparse import glob import datetime from isce.components.isceobj.Util import Poly1D from isce.components.isceobj.Planet.AstronomicalHandbook import Const from isce.components.isceobj.Util.decorators import use_api from isceobj.Orbit import Orbit from isceobj.Util.Poly2D import Poly2D from isceobj.Planet.Planet import Planet from isceobj.Constants import SPEED_OF_LIGHT import os from isceobj.Planet.AstronomicalHandbook import Const def cmdLineParse(): ''' Command line parser. ''' parser = argparse.ArgumentParser(description='Unpack LT1 SLC data and store metadata in pickle file.') parser.add_argument('-i','--input', dest='RSATdir', type=str, required=True, help='Input LT1 SLC directory') parser.add_argument('-o', '--output', dest='slcdir', type=str, required=True, help='Output unpacked SLC directory') return parser.parse_args() @use_api def unpack(RSATdir, slcname): ''' Unpack LT1 data to binary SLC file. assume HH only for now ''' ###Search for imagery and XML files in input directory imgnames = glob.glob(os.path.join(RSATdir,'LT1*.tiff')) if len(imgnames) <= 0: imgnames = glob.glob(os.path.join(RSATdir,'LT1*.tif')) imgname = imgnames[0] xmlname = glob.glob(os.path.join(RSATdir, 'LT1*.meta.xml'))[0] ####Create output SLC directory if needed if not os.path.isdir(slcname): os.mkdir(slcname) date = os.path.basename(slcname) #####Create an LT1 object and wire it obj = createSensor('LT1ABLT1ABREPEAT') obj.configure() obj.xml = xmlname obj.tiff = imgname obj.output = os.path.join(slcname, date+'.slc') ####Extract the image and write the XML file for the SLC obj.extractImage() obj.frame.getImage().renderHdr() ####Save the doppler polynomial ####CEOS already provides doppler polynomial ####as a function of range pixel coeffs = obj.doppler_coeff poly = Poly1D.Poly1D() poly.initPoly(order=len(coeffs)-1) poly.setCoeffs(coeffs) ####Save the FMrate polynomial ####CEOS already provides FMrate polynomial ####as a function of range pixel fcoeffs = obj.azfmrate_coeff # fcoeffs = [0.0, 0.0, 0.0] # zero-Doppler geometry, so this is not used fpoly = Poly1D.Poly1D() fpoly.initPoly(order=len(fcoeffs)-1) fpoly.setCoeffs(fcoeffs) ####Save required metadata for further use ####All data is output to a shelve file pickName = os.path.join(slcname, 'data') with shelve.open(pickName, "c") as db: db['frame'] = obj.frame db['doppler'] = poly db['fmrate'] = fpoly def mainUnpackFrame(RSATdir,slcdir): if slcdir.endswith('/'): slcdir = slcdir[:-1] if RSATdir.endswith('/'): RSATdir = RSATdir[:-1] unpack(RSATdir, slcdir) if __name__ == '__main__': ''' Main driver. ''' inps = cmdLineParse() if inps.slcdir.endswith('/'): inps.slcdir = inps.slcdir[:-1] if inps.RSATdir.endswith('/'): inps.RSATdir = inps.RSATdir[:-1] unpack(inps.RSATdir, inps.slcdir)