ISCE_INSAR/contrib/stack/alosStack/read_data.py

302 lines
11 KiB
Python

#!/usr/bin/env python3
#
# Author: Cunren Liang
# Copyright 2015-present, NASA-JPL/Caltech
#
import os
import glob
import datetime
import numpy as np
import isce, isceobj
import isceobj.Sensor.MultiMode as MultiMode
from StackPulic import saveProduct
from StackPulic import acquisitionModesAlos2
def getAlos2StackDirs(dataDir):
'''
1. this function takes the data directory containing a list of folders, in each of
which data of a date is located, and then returns a list of date directory sorted
by acquisition date.
2. under dataDir, only folders are recognized
'''
import os
import glob
def sorter(item):
#return date
return item.split('-')[-2]
#get only folders in dataDir
dateDirs = sorted(glob.glob(os.path.join(dataDir, '*')))
dateDirs = [x for x in dateDirs if os.path.isdir(x)]
ndate = len(dateDirs)
#get first LED files in dateDirs
dateFirstleaderFiles = [sorted(glob.glob(os.path.join(x, 'LED-ALOS2*-*-*')))[0] for x in dateDirs]
#sort first LED files using date in LED file name
dateFirstleaderFiles = sorted(dateFirstleaderFiles, key=sorter)
#keep only directory from the path
dateDirs = [os.path.dirname(x) for x in dateFirstleaderFiles]
return dateDirs
def cmdLineParse():
'''
command line parser.
'''
import sys
import argparse
parser = argparse.ArgumentParser(description='read a number of dates of data')
parser.add_argument('-idir', dest='idir', type=str, required=True,
help = 'input directory where data of each date is located. only folders are recognized')
parser.add_argument('-odir', dest='odir', type=str, required=True,
help = 'output directory where data of each date is output')
parser.add_argument('-ref_date', dest='ref_date', type=str, required=True,
help = 'reference date. format: YYMMDD')
parser.add_argument('-sec_date', dest='sec_date', type=str, nargs='+', default=[],
help = 'a number of secondary dates seperated by blanks, can also include reference date. format: YYMMDD YYMMDD YYMMDD. If provided, only read data of these dates')
parser.add_argument('-pol', dest='pol', type=str, default='HH',
help = 'polarization to process, default: HH')
parser.add_argument('-frames', dest='frames', type=str, nargs='+', default=None,
help = 'frames to process, must specify frame numbers of reference if frames are different among dates. e.g. -frames 2800 2850')
parser.add_argument('-starting_swath', dest='starting_swath', type=int, default=None,
help = 'starting swath to process.')
parser.add_argument('-ending_swath', dest='ending_swath', type=int, default=None,
help = 'starting swath to process')
parser.add_argument('-virtual', dest='virtual', action='store_true', default=False,
help='use virtual file')
if len(sys.argv) <= 1:
print('')
parser.print_help()
sys.exit(1)
else:
return parser.parse_args()
if __name__ == '__main__':
inps = cmdLineParse()
#get user parameters from input
idir = inps.idir
odir = inps.odir
dateReference = inps.ref_date
dateSecondary = inps.sec_date
pol = inps.pol
framesInput = inps.frames
startingSwath = inps.starting_swath
endingSwath = inps.ending_swath
useVirtualFile = inps.virtual
#######################################################
#date directories sorted by acquistion date retrieved from filenames under each directory
dateDirs = getAlos2StackDirs(os.path.abspath(idir))
ndate = len(dateDirs)
if framesInput is not None:
framesInput = sorted(framesInput)
else:
framesInput = None
#1. find index of reference date:
dates = []
dateIndexReference = None
for i in range(ndate):
ledFiles = sorted(glob.glob(os.path.join(dateDirs[i], 'LED-ALOS2*-*-*')))
date = os.path.basename(ledFiles[0]).split('-')[-2]
dates.append(date)
if date == dateReference:
dateIndexReference = i
if dateIndexReference is None:
raise Exception('cannot get reference date {} from the data list, pleasae check your input'.format(dateReference))
#2. check if data are in the same mode
spotlightModes, stripmapModes, scansarNominalModes, scansarWideModes, scansarModes = acquisitionModesAlos2()
#first frame of reference date
ledFilesReference = sorted(glob.glob(os.path.join(dateDirs[dateIndexReference], 'LED-ALOS2*-*-*')))
modeReference = os.path.basename(ledFilesReference[0]).split('-')[-1][0:3]
if modeReference in spotlightModes:
modeGroupReference = spotlightModes
if modeReference in stripmapModes:
modeGroupReference = stripmapModes
if modeReference in scansarNominalModes:
modeGroupReference = scansarNominalModes
if modeReference in scansarWideModes:
modeGroupReference = scansarWideModes
#check aquistion mode of all frames of each date
for i in range(ndate):
ledFiles = sorted(glob.glob(os.path.join(dateDirs[i], 'LED-ALOS2*-*-*')))
nframe = len(ledFiles)
for j in range(nframe):
mode = os.path.basename(ledFiles[j]).split('-')[-1][0:3]
if mode not in modeGroupReference:
raise Exception('all data must be in the same acquistion mode: spotlight, stripmap, or ScanSAR mode')
#3. find frame numbers and save it in a 2-d list
frames = []
#if not set, find frames automatically
if framesInput is None:
for i in range(ndate):
frames0 = []
ledFiles = sorted(glob.glob(os.path.join(dateDirs[i], 'LED-ALOS2*-*-*')))
for led in ledFiles:
frames0.append( os.path.basename(led).split('-')[-3][-4:] )
frames.append(sorted(frames0))
else:
for i in range(ndate):
frames.append(framesInput)
framesReference = frames[dateIndexReference]
#check if there is equal number of frames
nframe = len(frames[dateIndexReference])
for i in range(ndate):
if nframe != len(frames[i]):
raise Exception('there are not equal number of frames to process, please check your directory of each date')
#4. set starting and ending swaths
if modeReference in spotlightModes:
if startingSwath is None:
startingSwath = 1
if endingSwath is None:
endingSwath = 1
if modeReference in stripmapModes:
if startingSwath is None:
startingSwath = 1
if endingSwath is None:
endingSwath = 1
if modeReference in scansarNominalModes:
if startingSwath is None:
startingSwath = 1
if endingSwath is None:
endingSwath = 5
if modeReference in scansarWideModes:
if startingSwath is None:
startingSwath = 1
if endingSwath is None:
endingSwath = 7
#print result
print('\nlist of dates:')
print(' index date frames')
print('=======================================================')
for i in range(ndate):
if dates[i] == dateReference:
print(' %03d %s'%(i, dates[i])+' {}'.format(frames[i])+' reference')
else:
print(' %03d %s'%(i, dates[i])+' {}'.format(frames[i]))
print('\n')
##################################################
#1. create directories and read data
##################################################
if not os.path.isdir(odir):
print('output directory {} does not exist, create'.format(odir))
os.makedirs(odir, exist_ok=True)
os.chdir(odir)
for i in range(ndate):
ledFiles = sorted(glob.glob(os.path.join(dateDirs[i], 'LED-ALOS2*-*-*')))
date = os.path.basename(ledFiles[0]).split('-')[-2]
dateDir = date
if dateSecondary != []:
if date not in dateSecondary:
continue
if os.path.isdir(dateDir):
print('{} already exists, do not create'.format(dateDir))
continue
else:
os.makedirs(dateDir, exist_ok=True)
os.chdir(dateDir)
sensor = MultiMode.createSensor(sensor='ALOS2', name=None)
sensor.configure()
sensor.track.configure()
for j in range(nframe):
#frame number starts with 1
frameDir = 'f{}_{}'.format(j+1, framesReference[j])
os.makedirs(frameDir, exist_ok=True)
os.chdir(frameDir)
#attach a frame to reference and secondary
frameObj = MultiMode.createFrame()
frameObj.configure()
sensor.track.frames.append(frameObj)
#swath number starts with 1
for k in range(startingSwath, endingSwath+1):
print('processing date {} frame {} swath {}'.format(date, framesReference[j], k))
swathDir = 's{}'.format(k)
os.makedirs(swathDir, exist_ok=True)
os.chdir(swathDir)
#attach a swath to sensor
swathObj = MultiMode.createSwath()
swathObj.configure()
sensor.track.frames[-1].swaths.append(swathObj)
#setup sensor
#sensor.leaderFile = sorted(glob.glob(os.path.join(dateDirs[i], 'LED-ALOS2*{}-*-*'.format(framesReference[j]))))[0]
sensor.leaderFile = sorted(glob.glob(os.path.join(dateDirs[i], 'LED-ALOS2*{}-*-*'.format(frames[i][j]))))[0]
if modeReference in scansarModes:
#sensor.imageFile = sorted(glob.glob(os.path.join(dateDirs[i], 'IMG-{}-ALOS2*{}-*-*-F{}'.format(pol.upper(), framesReference[j], k))))[0]
sensor.imageFile = sorted(glob.glob(os.path.join(dateDirs[i], 'IMG-{}-ALOS2*{}-*-*-F{}'.format(pol.upper(), frames[i][j], k))))[0]
else:
#sensor.imageFile = sorted(glob.glob(os.path.join(dateDirs[i], 'IMG-{}-ALOS2*{}-*-*'.format(pol.upper(), framesReference[j]))))[0]
sensor.imageFile = sorted(glob.glob(os.path.join(dateDirs[i], 'IMG-{}-ALOS2*{}-*-*'.format(pol.upper(), frames[i][j]))))[0]
sensor.outputFile = date + '.slc'
sensor.useVirtualFile = useVirtualFile
#read sensor
(imageFDR, imageData)=sensor.readImage()
(leaderFDR, sceneHeaderRecord, platformPositionRecord, facilityRecord)=sensor.readLeader()
sensor.setSwath(leaderFDR, sceneHeaderRecord, platformPositionRecord, facilityRecord, imageFDR, imageData)
sensor.setFrame(leaderFDR, sceneHeaderRecord, platformPositionRecord, facilityRecord, imageFDR, imageData)
sensor.setTrack(leaderFDR, sceneHeaderRecord, platformPositionRecord, facilityRecord, imageFDR, imageData)
os.chdir('../')
#!!!frame numbers of all dates are reset to those of reference date
sensor.track.frames[j].frameNumber = framesReference[j]
saveProduct(sensor.track.frames[-1], date + '.frame.xml')
os.chdir('../')
saveProduct(sensor.track, date + '.track.xml')
os.chdir('../')