ISCE_INSAR/components/isceobj/Alos2burstProc/runExtractBurst.py

136 lines
6.7 KiB
Python

#
# Author: Cunren Liang
# Copyright 2015-present, NASA-JPL/Caltech
#
import os
import glob
import logging
import datetime
#import subprocess
import numpy as np
import isceobj
from isceobj.Alos2Proc.Alos2ProcPublic import create_xml
from isceobj.Alos2Proc.Alos2ProcPublic import mosaicBurstAmplitude
from contrib.alos2proc.alos2proc import extract_burst
logger = logging.getLogger('isce.alos2burstinsar.runExtractBurst')
def runExtractBurst(self):
'''extract bursts.
'''
catalog = isceobj.Catalog.createCatalog(self._insar.procDoc.name)
self.updateParamemetersFromUser()
masterTrack = self._insar.loadTrack(master=True)
slaveTrack = self._insar.loadTrack(master=False)
#demFile = os.path.abspath(self._insar.dem)
#wbdFile = os.path.abspath(self._insar.wbd)
###############################################################################
for i, frameNumber in enumerate(self._insar.masterFrames):
frameDir = 'f{}_{}'.format(i+1, frameNumber)
os.chdir(frameDir)
for j, swathNumber in enumerate(range(self._insar.startingSwath, self._insar.endingSwath + 1)):
swathDir = 's{}'.format(swathNumber)
os.chdir(swathDir)
print('extracting bursts frame {}, swath {}'.format(frameNumber, swathNumber))
az_ratio1 = 20.0
for k in range(2):
if k==0:
#master
swath = masterTrack.frames[i].swaths[j]
unsynLines = self._insar.burstUnsynchronizedTime * swath.prf
extractDir = self._insar.masterBurstPrefix
burstPrefix = self._insar.masterBurstPrefix
fullApertureSlc = self._insar.masterSlc
magnitude = self._insar.masterMagnitude
else:
#slave
swath = slaveTrack.frames[i].swaths[j]
unsynLines = -self._insar.burstUnsynchronizedTime * swath.prf
extractDir = self._insar.slaveBurstPrefix
burstPrefix = self._insar.slaveBurstPrefix
fullApertureSlc = self._insar.slaveSlc
magnitude = self._insar.slaveMagnitude
#UPDATE SWATH PARAMETERS 1
#########################################################################################
if self._insar.burstSynchronization <= self.burstSynchronizationThreshold:
swath.burstLength -= abs(unsynLines)
if unsynLines < 0:
swath.burstStartTime += datetime.timedelta(seconds=abs(unsynLines)/swath.prf)
#########################################################################################
#extract burst
os.makedirs(extractDir, exist_ok=True)
os.chdir(extractDir)
if os.path.isfile(os.path.join('../', fullApertureSlc)):
os.rename(os.path.join('../', fullApertureSlc), fullApertureSlc)
os.rename(os.path.join('../', fullApertureSlc+'.vrt'), fullApertureSlc+'.vrt')
os.rename(os.path.join('../', fullApertureSlc+'.xml'), fullApertureSlc+'.xml')
extract_burst(fullApertureSlc, burstPrefix, swath.prf, swath.prfFraction, swath.burstLength, swath.burstCycleLength-swath.burstLength, \
(swath.burstStartTime - swath.sensingStart).total_seconds() * swath.prf, swath.azimuthFmrateVsPixel, swath.dopplerVsPixel, az_ratio1, 0.0)
#read output parameters
with open('extract_burst.txt', 'r') as f:
lines = f.readlines()
offsetFromFirstBurst = []
for linex in lines:
if 'total number of bursts extracted' in linex:
numberOfBursts = int(linex.split(':')[1])
if 'output burst length' in linex:
burstSlcNumberOfLines = int(linex.split(':')[1])
if 'line number of first line of first output burst in original SLC (1.0/prf)' in linex:
fb_ln = float(linex.split(':')[1])
if 'bsl of first output burst' in linex:
bsl_firstburst = float(linex.split(':')[1])
if 'offset from first burst' in linex:
offsetFromFirstBurst.append(int(linex.split(',')[0].split(':')[1]))
#time of first line of first burst raw
firstBurstRawStartTime = swath.sensingStart + datetime.timedelta(seconds=bsl_firstburst/swath.prf)
#time of first line of first burst slc
#original time is at the upper edge of first line, we change it to center of first line.
sensingStart = swath.sensingStart + datetime.timedelta(seconds=fb_ln/swath.prf+(az_ratio1-1.0)/2.0/swath.prf)
numberOfLines = offsetFromFirstBurst[numberOfBursts-1] + burstSlcNumberOfLines
for ii in range(numberOfBursts):
burstFile = burstPrefix + '_%02d.slc'%(ii+1)
create_xml(burstFile, swath.numberOfSamples, burstSlcNumberOfLines, 'slc')
#UPDATE SWATH PARAMETERS 2
#########################################################################################
swath.numberOfLines = numberOfLines
#this is also the time of the first line of the first burst slc
swath.sensingStart = sensingStart
swath.azimuthPixelSize = az_ratio1 * swath.azimuthPixelSize
swath.azimuthLineInterval = az_ratio1 * swath.azimuthLineInterval
swath.numberOfBursts = numberOfBursts
swath.firstBurstRawStartTime = firstBurstRawStartTime
swath.firstBurstSlcStartTime = sensingStart
swath.burstSlcFirstLineOffsets = offsetFromFirstBurst
swath.burstSlcNumberOfSamples = swath.numberOfSamples
swath.burstSlcNumberOfLines = burstSlcNumberOfLines
#########################################################################################
#create a magnitude image
mosaicBurstAmplitude(swath, burstPrefix, magnitude, numberOfLooksThreshold=4)
os.chdir('../')
os.chdir('../')
self._insar.saveProduct(masterTrack.frames[i], self._insar.masterFrameParameter)
self._insar.saveProduct(slaveTrack.frames[i], self._insar.slaveFrameParameter)
os.chdir('../')
###############################################################################
catalog.printToLog(logger, "runExtractBurst")
self._insar.procDoc.addAllFromCatalog(catalog)