Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#!/usr/bin/env python3
# Author: Cunren Liang
# Copyright 2021
import os
import glob
import argparse
import numpy as np
import isce
import isceobj
from isceobj.TopsProc.runMergeBursts import mergeBox
from isceobj.TopsProc.runMergeBursts import adjustValidWithLooks
from isceobj.TopsProc.runMergeBursts import mergeBurstsVirtual
from isceobj.TopsProc.runMergeBursts import multilook as multilook2
from Stack import ionParam
import s1a_isce_utils as ut
def createParser():
'''
Create command line parser.
'''
parser = argparse.ArgumentParser(description='merge bursts for ionosphere estimation')
parser.add_argument('-i', '--reference', type=str, dest='reference', required=True,
help='directory with the reference image. will be merged in a box defined by reference')
parser.add_argument('-s', '--stack', type=str, dest='stack', default = None,
help='directory with the stack xml files which includes the common valid region of each burst in the stack')
parser.add_argument('-d', '--dirname', type=str, dest='dirname', required=True,
help='directory with products to merge')
parser.add_argument('-n', '--name_pattern', type=str, dest='name_pattern', required=True,
help = 'a name pattern of burst products that will be merged. e.g.: fine_*.int')
parser.add_argument('-o', '--outfile', type=str, dest='outfile', required=True,
help='output merged file')
parser.add_argument('-r', '--nrlks', type=int, dest='nrlks', default=1,
help = 'number of range looks')
parser.add_argument('-a', '--nalks', type=int, dest='nalks', default=1,
help = 'number of azimuth looks')
parser.add_argument('-u', '--nrlks0', type=int, dest='nrlks0', default=1,
help = 'number of range looks 0')
parser.add_argument('-v', '--nalks0', type=int, dest='nalks0', default=1,
help = 'number of azimuth looks 0')
parser.add_argument('-x', '--rvalid', type=int, dest='rvalid', default=None,
help = 'number of valid samples in a multilook window in range, 1<=rvalid<=nrlks. default: nrlks')
parser.add_argument('-y', '--avalid', type=int, dest='avalid', default=None,
help = 'number of valid lines in a multilook window in azimuth, 1<=avalid<=nalks. default: nalks')
parser.add_argument('-w', '--swath', type=int, dest='swath', default=None,
help = 'swaths to merge, 1 or 2 or 3. default: all swaths')
return parser
def cmdLineParse(iargs = None):
'''
Command line parser.
'''
parser = createParser()
inps = parser.parse_args(args=iargs)
return inps
def updateValid(frame1, frame2):
'''
update frame1 valid with frame2 valid
'''
min1 = frame1.bursts[0].burstNumber
max1 = frame1.bursts[-1].burstNumber
min2 = frame2.bursts[0].burstNumber
max2 = frame2.bursts[-1].burstNumber
minBurst = max(min1, min2)
maxBurst = min(max1, max2)
for ii in range(minBurst, maxBurst + 1):
frame1.bursts[ii-min1].firstValidLine = frame2.bursts[ii-min2].firstValidLine
frame1.bursts[ii-min1].firstValidSample = frame2.bursts[ii-min2].firstValidSample
frame1.bursts[ii-min1].numValidLines = frame2.bursts[ii-min2].numValidLines
frame1.bursts[ii-min1].numValidSamples = frame2.bursts[ii-min2].numValidSamples
return
def main(iargs=None):
'''
merge bursts
'''
inps=cmdLineParse(iargs)
if inps.rvalid is None:
inps.rvalid = 'strict'
else:
if not (1 <= inps.rvalid <= inps.nrlks):
raise Exception('1<=rvalid<=nrlks')
if inps.avalid is None:
inps.avalid = 'strict'
else:
if not (1 <= inps.avalid <= inps.nalks):
raise Exception('1<=avalid<=nalks')
namePattern = inps.name_pattern.split('*')
frameReferenceList=[]
frameProductList=[]
burstList = []
swathList = ut.getSwathList(inps.reference)
for swath in swathList:
frameReference = ut.loadProduct(os.path.join(inps.reference, 'IW{0}.xml'.format(swath)))
minBurst = frameReference.bursts[0].burstNumber
maxBurst = frameReference.bursts[-1].burstNumber
if minBurst==maxBurst:
print('Skipping processing of swath {0}'.format(swath))
continue
frameProduct = ut.loadProduct(os.path.join(inps.dirname, 'IW{0}.xml'.format(swath)))
minBurst = frameProduct.bursts[0].burstNumber
maxBurst = frameProduct.bursts[-1].burstNumber
if inps.stack is not None:
print('Updating the valid region of each burst to the common valid region of the stack')
frameStack = ut.loadProduct(os.path.join(inps.stack, 'IW{0}.xml'.format(swath)))
updateValid(frameReference, frameStack)
updateValid(frameProduct, frameStack)
frameReferenceList.append(frameReference)
if inps.swath is not None:
if swath == inps.swath:
frameProductList.append(frameProduct)
burstList.append([os.path.join(inps.dirname, 'IW{0}'.format(swath), namePattern[0]+'%02d'%(x)+namePattern[1]) for x in range(minBurst, maxBurst+1)])
else:
frameProductList.append(frameProduct)
burstList.append([os.path.join(inps.dirname, 'IW{0}'.format(swath), namePattern[0]+'%02d'%(x)+namePattern[1]) for x in range(minBurst, maxBurst+1)])
os.makedirs(os.path.dirname(inps.outfile), exist_ok=True)
suffix = '.full'
if (inps.nrlks0 == 1) and (inps.nalks0 == 1):
suffix=''
box = mergeBox(frameReferenceList)
#adjust valid with looks, 'frames' ARE CHANGED AFTER RUNNING THIS
#here numberRangeLooks, instead of numberRangeLooks0, is used, since we need to do next step multilooking after unwrapping. same for numberAzimuthLooks.
(burstValidBox, burstValidBox2, message) = adjustValidWithLooks(frameProductList, box, inps.nalks, inps.nrlks, edge=0, avalid=inps.avalid, rvalid=inps.rvalid)
mergeBurstsVirtual(frameProductList, burstList, box, inps.outfile+suffix)
if suffix not in ['',None]:
multilook2(inps.outfile+suffix,
outname = inps.outfile,
alks = inps.nalks0, rlks=inps.nrlks0)
#this is never used for ionosphere correction
else:
print('Skipping multi-looking ....')
if __name__ == '__main__' :
'''
Merge products burst-by-burst.
'''
main()