Exemplo n.º 1
0
def runBurstIfg(self):
    '''Create burst interferograms.
    '''

    virtual = self.useVirtualFiles

    swathList = self._insar.getValidSwathList(self.swaths)

    for swath in swathList:

        minBurst, maxBurst = self._insar.commonReferenceBurstLimits(swath - 1)
        nBurst = maxBurst - minBurst

        if nBurst == 0:
            continue

        ifgdir = os.path.join(self._insar.fineIfgDirname,
                              'IW{0}'.format(swath))
        os.makedirs(ifgdir, exist_ok=True)

        ####Load relevant products
        reference = self._insar.loadProduct(
            os.path.join(self._insar.referenceSlcProduct,
                         'IW{0}.xml'.format(swath)))
        secondary = self._insar.loadProduct(
            os.path.join(self._insar.fineCoregDirname,
                         'IW{0}.xml'.format(swath)))

        coregdir = os.path.join(self._insar.fineOffsetsDirname,
                                'IW{0}'.format(swath))

        fineIfg = createTOPSSwathSLCProduct()
        fineIfg.configure()

        for ii in range(minBurst, maxBurst):

            jj = ii - minBurst

            ####Process the top bursts
            masBurst = reference.bursts[ii]
            slvBurst = secondary.bursts[jj]

            referencename = masBurst.image.filename
            secondaryname = slvBurst.image.filename
            rdict = {
                'rangeOff': os.path.join(coregdir,
                                         'range_%02d.off' % (ii + 1)),
                'azimuthOff': os.path.join(coregdir,
                                           'azimuth_%02d.off' % (ii + 1))
            }

            adjustValidLineSample(masBurst, slvBurst)

            if self.doInSAR:
                intname = os.path.join(ifgdir,
                                       '%s_%02d.int' % ('burst', ii + 1))
                fact = 4 * np.pi * slvBurst.rangePixelSize / slvBurst.radarWavelength
                intimage = multiply(referencename,
                                    secondaryname,
                                    intname,
                                    rdict['rangeOff'],
                                    fact,
                                    masBurst,
                                    flatten=True,
                                    alks=self.numberAzimuthLooks,
                                    rlks=self.numberRangeLooks,
                                    virtual=virtual)

            burst = masBurst.clone()

            if self.doInSAR:
                burst.image = intimage

            fineIfg.bursts.append(burst)

            if self.doInSAR:
                ####Estimate coherence
                corname = os.path.join(ifgdir,
                                       '%s_%02d.cor' % ('burst', ii + 1))
                computeCoherence(referencename, secondaryname, corname)

        fineIfg.numberOfBursts = len(fineIfg.bursts)
        self._insar.saveProduct(
            fineIfg,
            os.path.join(self._insar.fineIfgDirname,
                         'IW{0}.xml'.format(swath)))
Exemplo n.º 2
0
def runSubsetOverlaps(self):
    '''
    Create geometry files corresponding to burst overlaps.
    '''
    virtual = self.useVirtualFiles

    if not self.doESD:
        return

    catalog = isceobj.Catalog.createCatalog(self._insar.procDoc.name)

    swathList = self._insar.getValidSwathList(self.swaths)

    for swath in swathList:

        if self._insar.numberOfCommonBursts[swath - 1] < 2:
            print('Skipping subset overlap for swath IW{0}'.format(swath))
            continue

        ####Load master metadata
        mFrame = self._insar.loadProduct(
            os.path.join(self._insar.masterSlcProduct,
                         'IW{0}.xml'.format(swath)))

        ####Output directory for overlap geometry images
        geomdir = os.path.join(self._insar.geometryDirname,
                               'IW{0}'.format(swath))
        outdir = os.path.join(self._insar.geometryDirname,
                              self._insar.overlapsSubDirname,
                              'IW{0}'.format(swath))
        submasterdir = os.path.join(self._insar.masterSlcProduct,
                                    self._insar.overlapsSubDirname,
                                    'IW{0}'.format(swath))

        os.makedirs(outdir, exist_ok=True)
        os.makedirs(submasterdir, exist_ok=True)

        ###Azimuth time interval
        dt = mFrame.bursts[0].azimuthTimeInterval
        topFrame = createTOPSSwathSLCProduct()
        topFrame.configure()

        bottomFrame = createTOPSSwathSLCProduct()
        bottomFrame.configure()

        numCommon = self._insar.numberOfCommonBursts[swath - 1]
        startIndex = self._insar.commonBurstStartMasterIndex[swath - 1]

        ###For each overlap
        for ii in range(numCommon - 1):
            ind = ii + startIndex

            topBurst = mFrame.bursts[ind]
            botBurst = mFrame.bursts[ind + 1]

            overlap_start_time = botBurst.sensingStart
            overlap_end_time = topBurst.sensingStop
            catalog.addItem(
                'Overlap {0} start time - IW-{1}'.format(ind, swath),
                overlap_start_time, 'subset')
            catalog.addItem(
                'Overlap {0} stop time - IW-{1}'.format(ind, swath),
                overlap_end_time, 'subset')

            nLinesOverlap = int(
                np.round(
                    (overlap_end_time - overlap_start_time).total_seconds() /
                    dt)) + 1
            catalog.addItem(
                'Overlap {0} number of lines - IW-{1}'.format(ind, swath),
                nLinesOverlap, 'subset')

            length = topBurst.numberOfLines
            width = topBurst.numberOfSamples

            topStart = int(
                np.round((botBurst.sensingStart - topBurst.sensingStart
                          ).total_seconds() / dt)) + botBurst.firstValidLine
            overlapLen = topBurst.firstValidLine + topBurst.numValidLines - topStart

            catalog.addItem(
                'Overlap {0} number of valid lines - IW-{1}'.format(
                    ind, swath), overlapLen, 'subset')

            ###Create slice objects for overlaps
            topslicey = slice(topStart, topStart + overlapLen)
            topslicex = slice(0, width)

            botslicey = slice(botBurst.firstValidLine,
                              botBurst.firstValidLine + overlapLen)
            botslicex = slice(0, width)

            for prefix in ['lat', 'lon', 'hgt']:
                infile = os.path.join(geomdir,
                                      prefix + '_%02d.rdr' % (ind + 2))
                outfile = os.path.join(
                    outdir, prefix + '_%02d_%02d.rdr' % (ind + 1, ind + 2))

                subset(infile, outfile, botslicey, botslicex, virtual=virtual)

            masname1 = topBurst.image.filename
            masname2 = botBurst.image.filename

            master_outname1 = os.path.join(
                submasterdir, 'burst_top_%02d_%02d.slc' % (ind + 1, ind + 2))
            master_outname2 = os.path.join(
                submasterdir, 'burst_bot_%02d_%02d.slc' % (ind + 1, ind + 2))

            subset(masname1,
                   master_outname1,
                   topslicey,
                   topslicex,
                   virtual=virtual)
            subset(masname2,
                   master_outname2,
                   botslicey,
                   botslicex,
                   virtual=virtual)

            ####TOP frame
            #            burst = copy.deepcopy(topBurst)
            burst = topBurst.clone()
            burst.firstValidLine = 0
            burst.numberOfLines = overlapLen
            burst.numValidLines = overlapLen
            burst.sensingStart = topBurst.sensingStart + datetime.timedelta(
                0, topStart * dt)  # topStart*dt
            burst.sensingStop = topBurst.sensingStart + datetime.timedelta(
                0,
                (topStart + overlapLen - 1) * dt)  # (topStart+overlapLen-1)*dt

            ###Replace file name in image
            burst.image.filename = master_outname1
            burst.image._accessor = None
            burst.image.setLength(overlapLen)
            burst.image.setWidth(width)

            topFrame.bursts.append(burst)

            burst = None

            ####BOTTOM frame
            #            burst = copy.deepcopy(botBurst)
            burst = botBurst.clone()
            burst.firstValidLine = 0
            burst.numberOfLines = overlapLen
            burst.numValidLines = overlapLen
            burst.sensingStart = botBurst.sensingStart + datetime.timedelta(
                seconds=botBurst.firstValidLine * dt)
            burst.sensingStop = botBurst.sensingStart + datetime.timedelta(
                seconds=(botBurst.firstValidLine + overlapLen - 1) * dt)

            ###Replace file name in image
            burst.image.filename = master_outname2
            burst.image.setLength(overlapLen)
            burst.image.setWidth(width)

            bottomFrame.bursts.append(burst)

            burst = None

            print('Top: ', [x.image.filename for x in topFrame.bursts])
            print('Bottom: ', [x.image.filename for x in bottomFrame.bursts])

        topFrame.numberOfBursts = len(topFrame.bursts)
        bottomFrame.numberOfBursts = len(bottomFrame.bursts)

        self._insar.saveProduct(
            topFrame,
            os.path.join(self._insar.masterSlcOverlapProduct,
                         'top_IW{0}.xml'.format(swath)))
        self._insar.saveProduct(
            bottomFrame,
            os.path.join(self._insar.masterSlcOverlapProduct,
                         'bottom_IW{0}.xml'.format(swath)))

    catalog.printToLog(logger, "runSubsetOverlaps")
    self._insar.procDoc.addAllFromCatalog(catalog)
Exemplo n.º 3
0
def runCoarseResamp(self):
    '''
    Create coregistered overlap slaves.
    '''

    if not self.doESD:
        return

    swathList = self._insar.getValidSwathList(self.swaths)

    for swath in swathList:

        if self._insar.numberOfCommonBursts[swath - 1] < 2:
            print('Skipping coarse resamp for swath IW{0}'.format(swath))
            continue

        ####Load slave metadata
        master = self._insar.loadProduct(
            os.path.join(self._insar.masterSlcProduct,
                         'IW{0}.xml'.format(swath)))
        slave = self._insar.loadProduct(
            os.path.join(self._insar.slaveSlcProduct,
                         'IW{0}.xml'.format(swath)))
        masterTop = self._insar.loadProduct(
            os.path.join(self._insar.masterSlcOverlapProduct,
                         'top_IW{0}.xml'.format(swath)))
        masterBottom = self._insar.loadProduct(
            os.path.join(self._insar.masterSlcOverlapProduct,
                         'bottom_IW{0}.xml'.format(swath)))

        dt = slave.bursts[0].azimuthTimeInterval
        dr = slave.bursts[0].rangePixelSize

        ###Output directory for coregistered SLCs
        outdir = os.path.join(self._insar.coarseCoregDirname,
                              self._insar.overlapsSubDirname,
                              'IW{0}'.format(swath))
        if not os.path.isdir(outdir):
            os.makedirs(outdir)

        ###Directory with offsets
        offdir = os.path.join(self._insar.coarseOffsetsDirname,
                              self._insar.overlapsSubDirname,
                              'IW{0}'.format(swath))

        ####Indices w.r.t master
        minBurst, maxBurst = self._insar.commonMasterBurstLimits(swath - 1)
        slaveBurstStart, slaveBurstEnd = self._insar.commonSlaveBurstLimits(
            swath - 1)

        relShifts = getRelativeShifts(master, slave, minBurst, maxBurst,
                                      slaveBurstStart)
        maxBurst = maxBurst - 1  ###For overlaps

        print('Shifts for swath IW-{0}: {1}'.format(swath, relShifts))

        ####Can corporate known misregistration here

        apoly = Poly2D()
        apoly.initPoly(rangeOrder=0, azimuthOrder=0, coeffs=[[0.]])

        rpoly = Poly2D()
        rpoly.initPoly(rangeOrder=0, azimuthOrder=0, coeffs=[[0.]])

        topCoreg = createTOPSSwathSLCProduct()
        topCoreg.configure()

        botCoreg = createTOPSSwathSLCProduct()
        botCoreg.configure()

        for ii in range(minBurst, maxBurst):
            jj = slaveBurstStart + ii - minBurst

            topBurst = masterTop.bursts[ii - minBurst]
            botBurst = masterBottom.bursts[ii - minBurst]
            slvBurst = slave.bursts[jj]

            #####Top burst processing
            try:
                offset = relShifts[jj]
            except:
                raise Exception(
                    'Trying to access shift for slave burst index {0}, which may not overlap with master - IW-{1}'
                    .format(jj, swath))

            outname = os.path.join(
                outdir, 'burst_top_%02d_%02d.slc' % (ii + 1, ii + 2))

            ####Setup initial polynomials
            ### If no misregs are given, these are zero
            ### If provided, can be used for resampling without running to geo2rdr again for fast results
            rdict = {
                'azpoly':
                apoly,
                'rgpoly':
                rpoly,
                'rangeOff':
                os.path.join(offdir,
                             'range_top_%02d_%02d.off' % (ii + 1, ii + 2)),
                'azimuthOff':
                os.path.join(offdir,
                             'azimuth_top_%02d_%02d.off' % (ii + 1, ii + 2))
            }

            ###For future - should account for azimuth and range misreg here .. ignoring for now.
            azCarrPoly, dpoly = slave.estimateAzimuthCarrierPolynomials(
                slvBurst, offset=-1.0 * offset)

            rdict['carrPoly'] = azCarrPoly
            rdict['doppPoly'] = dpoly

            outimg = resampSlave(topBurst, slvBurst, rdict, outname)

            copyBurst = copy.deepcopy(topBurst)
            adjustValidSampleLine(copyBurst, slvBurst)
            copyBurst.image.filename = outimg.filename
            print('After: ', copyBurst.firstValidLine, copyBurst.numValidLines)
            topCoreg.bursts.append(copyBurst)
            #######################################################

            slvBurst = slave.bursts[jj + 1]
            outname = os.path.join(
                outdir, 'burst_bot_%02d_%02d.slc' % (ii + 1, ii + 2))

            ####Setup initial polynomials
            ### If no misregs are given, these are zero
            ### If provided, can be used for resampling without running to geo2rdr again for fast results
            rdict = {
                'azpoly':
                apoly,
                'rgpoly':
                rpoly,
                'rangeOff':
                os.path.join(offdir,
                             'range_bot_%02d_%02d.off' % (ii + 1, ii + 2)),
                'azimuthOff':
                os.path.join(offdir,
                             'azimuth_bot_%02d_%02d.off' % (ii + 1, ii + 2))
            }

            azCarrPoly, dpoly = slave.estimateAzimuthCarrierPolynomials(
                slvBurst, offset=-1.0 * offset)

            rdict['carrPoly'] = azCarrPoly
            rdict['doppPoly'] = dpoly

            outimg = resampSlave(botBurst, slvBurst, rdict, outname)

            copyBurst = copy.deepcopy(botBurst)
            adjustValidSampleLine(copyBurst, slvBurst)
            copyBurst.image.filename = outimg.filename
            print('After: ', copyBurst.firstValidLine, copyBurst.numValidLines)
            botCoreg.bursts.append(copyBurst)
            #######################################################

        topCoreg.numberOfBursts = len(topCoreg.bursts)
        botCoreg.numberOfBursts = len(botCoreg.bursts)

        self._insar.saveProduct(
            topCoreg,
            os.path.join(self._insar.coregOverlapProduct,
                         'top_IW{0}.xml'.format(swath)))
        self._insar.saveProduct(
            botCoreg,
            os.path.join(self._insar.coregOverlapProduct,
                         'bottom_IW{0}.xml'.format(swath)))
Exemplo n.º 4
0
def runFineResamp(self):
    '''
    Create coregistered overlap slaves.
    '''


    swathList = self._insar.getValidSwathList(self.swaths)


    for swath in swathList:
        ####Load slave metadata
        master = self._insar.loadProduct( os.path.join(self._insar.masterSlcProduct, 'IW{0}.xml'.format(swath)))
        slave = self._insar.loadProduct( os.path.join(self._insar.slaveSlcProduct, 'IW{0}.xml'.format(swath)))

        dt = slave.bursts[0].azimuthTimeInterval
        dr = slave.bursts[0].rangePixelSize


        ###Output directory for coregistered SLCs
        outdir = os.path.join(self._insar.fineCoregDirname, 'IW{0}'.format(swath))
        if not os.path.isdir(outdir):
            os.makedirs(outdir)

    
        ###Directory with offsets
        offdir = os.path.join(self._insar.fineOffsetsDirname, 'IW{0}'.format(swath))

        ####Indices w.r.t master
        minBurst, maxBurst = self._insar.commonMasterBurstLimits(swath-1)
        slaveBurstStart, slaveBurstEnd = self._insar.commonSlaveBurstLimits(swath-1)

        if minBurst == maxBurst:
            print('Skipping processing of swath {0}'.format(swath))
            continue

        relShifts = getRelativeShifts(master, slave, minBurst, maxBurst, slaveBurstStart)
        print('Shifts IW-{0}: '.format(swath), relShifts) 
   
        ####Can corporate known misregistration here
        apoly = Poly2D()
        apoly.initPoly(rangeOrder=0,azimuthOrder=0,coeffs=[[0.]])

        rpoly = Poly2D()
        rpoly.initPoly(rangeOrder=0,azimuthOrder=0,coeffs=[[0.]])


        misreg_az = self._insar.slaveTimingCorrection / dt
        misreg_rg = self._insar.slaveRangeCorrection / dr


        coreg = createTOPSSwathSLCProduct()
        coreg.configure()

        for ii in range(minBurst, maxBurst):
            jj = slaveBurstStart + ii - minBurst 
    
            masBurst = master.bursts[ii]
            slvBurst = slave.bursts[jj]

            try:
                offset = relShifts[jj]
            except:
                raise Exception('Trying to access shift for slave burst index {0}, which may not overlap with master for swath {1}'.format(jj, swath))

            outname = os.path.join(outdir, 'burst_%02d.slc'%(ii+1))
        
            ####Setup initial polynomials
            ### If no misregs are given, these are zero
            ### If provided, can be used for resampling without running to geo2rdr again for fast results
            rdict = {'azpoly' : apoly,
                     'rgpoly' : rpoly,
                     'rangeOff' : os.path.join(offdir, 'range_%02d.off'%(ii+1)),
                    'azimuthOff': os.path.join(offdir, 'azimuth_%02d.off'%(ii+1))}


            ###For future - should account for azimuth and range misreg here .. ignoring for now.
            azCarrPoly, dpoly = slave.estimateAzimuthCarrierPolynomials(slvBurst, offset = -1.0 * offset)

            rdict['carrPoly'] = azCarrPoly
            rdict['doppPoly'] = dpoly

            outimg = resampSlave(masBurst, slvBurst, rdict, outname)
            minAz, maxAz, minRg, maxRg = getValidLines(slvBurst, rdict, outname,
                    misreg_az = misreg_az - offset, misreg_rng = misreg_rg)


#            copyBurst = copy.deepcopy(masBurst)
            copyBurst = masBurst.clone()
            adjustValidSampleLine(copyBurst, slvBurst,
                                         minAz=minAz, maxAz=maxAz,
                                         minRng=minRg, maxRng=maxRg)
            copyBurst.image.filename = outimg.filename
            print('After: ', copyBurst.firstValidLine, copyBurst.numValidLines)
            coreg.bursts.append(copyBurst)
            #######################################################

        coreg.numberOfBursts = len(coreg.bursts)

        self._insar.saveProduct(coreg, os.path.join(self._insar.fineCoregDirname, 'IW{0}.xml'.format(swath)))
Exemplo n.º 5
0
def runOverlapIfg(self):
    '''Create overlap interferograms.
    '''

    virtual = self.useVirtualFiles
    if not self.doESD:
        return 


    swathList = self._insar.getValidSwathList(self.swaths)

    for swath in swathList:

        if self._insar.numberOfCommonBursts[swath-1] < 2:
            print('Skipping overlap ifg for swath IW{0}'.format(swath))
            continue

        minBurst = self._insar.commonBurstStartMasterIndex[swath-1]
        maxBurst = minBurst + self._insar.numberOfCommonBursts[swath-1]

        nBurst = maxBurst - minBurst

        ifgdir = os.path.join( self._insar.coarseIfgDirname, self._insar.overlapsSubDirname, 'IW{0}'.format(swath))
        if not os.path.exists(ifgdir):
            os.makedirs(ifgdir)

        ####All indexing is w.r.t stack master for overlaps
        maxBurst = maxBurst - 1
   

        ####Load relevant products
        topMaster = self._insar.loadProduct(os.path.join(self._insar.masterSlcOverlapProduct, 'top_IW{0}.xml'.format(swath)))
        botMaster = self._insar.loadProduct(os.path.join(self._insar.masterSlcOverlapProduct, 'bottom_IW{0}.xml'.format(swath)))

        topCoreg = self._insar.loadProduct( os.path.join(self._insar.coregOverlapProduct,'top_IW{0}.xml'.format(swath)))
        botCoreg = self._insar.loadProduct( os.path.join(self._insar.coregOverlapProduct, 'bottom_IW{0}.xml'.format(swath)))

        coregdir = os.path.join(self._insar.coarseOffsetsDirname, self._insar.overlapsSubDirname, 'IW{0}'.format(swath))

        topIfg = createTOPSSwathSLCProduct()
        topIfg.configure()

        botIfg = createTOPSSwathSLCProduct()
        botIfg.configure()

        for ii in range(minBurst, maxBurst):
    
            jj = ii - minBurst

            ####Process the top bursts
            master = topMaster.bursts[jj] 
            slave  = topCoreg.bursts[jj]

            mastername = master.image.filename
            slavename = slave.image.filename
            rdict = {'rangeOff' : os.path.join(coregdir, 'range_top_%02d_%02d.off'%(ii+1,ii+2)),
                     'azimuthOff': os.path.join(coregdir, 'azimuth_top_%02d_%02d.off'%(ii+1,ii+2))}
            
            
            adjustValidLineSample(master,slave)
        
            intname = os.path.join(ifgdir, '%s_top_%02d_%02d.int'%('burst',ii+1,ii+2))
            fact = 4 * np.pi * slave.rangePixelSize / slave.radarWavelength
            intimage = multiply(mastername, slavename, intname,
                        rdict['rangeOff'], fact, master, flatten=True,
                        alks = self.numberAzimuthLooks, rlks=self.numberRangeLooks)

            burst = copy.deepcopy(master)
            burst.image = intimage
            topIfg.bursts.append(burst)



            ####Process the bottom bursts
            master = botMaster.bursts[jj]
            slave = botCoreg.bursts[jj]


            mastername =  master.image.filename
            slavename = slave.image.filename
            rdict = {'rangeOff' : os.path.join(coregdir, 'range_bot_%02d_%02d.off'%(ii+1,ii+2)),
                    'azimuthOff': os.path.join(coregdir, 'azimuth_bot_%02d_%02d.off'%(ii+1,ii+2))}

            adjustValidLineSample(master,slave)
            intname = os.path.join(ifgdir, '%s_bot_%02d_%02d.int'%('burst',ii+1,ii+2))
            fact = 4 * np.pi * slave.rangePixelSize / slave.radarWavelength
            intimage = multiply(mastername, slavename, intname,
                        rdict['rangeOff'], fact, master, flatten=True,
                        alks = self.numberAzimuthLooks, rlks=self.numberRangeLooks,
                        virtual=virtual)

            burst = copy.deepcopy(master)
            burst.image = intimage
            botIfg.bursts.append(burst)


        topIfg.numberOfBursts = len(topIfg.bursts)
        botIfg.numberOfBursts = len(botIfg.bursts)

        self._insar.saveProduct(topIfg, os.path.join(self._insar.coarseIfgOverlapProduct, 'top_IW{0}.xml'.format(swath)))
        self._insar.saveProduct(botIfg, os.path.join(self._insar.coarseIfgOverlapProduct, 'bottom_IW{0}.xml'.format(swath)))
Exemplo n.º 6
0
def main(iargs=None):
    '''
    check overlap among all acquistions, only keep the bursts that in the common overlap,
    and then renumber the bursts.
    '''
    inps = cmdLineParse(iargs)

    referenceDir = inps.reference
    secondaryDir = sorted(glob.glob(os.path.join(inps.secondarys, '*')))

    acquistionDir = [referenceDir] + secondaryDir


    invalidSwath = []
    for i in [1, 2, 3]:
        for x in acquistionDir:
            if not (os.path.isdir(os.path.join(x, 'IW{}'.format(i))) and os.path.isfile(os.path.join(x, 'IW{}.xml'.format(i)))):
                invalidSwath.append(i)
                break

    if invalidSwath == [1, 2, 3]:
        raise Exception('there are no common swaths among the acquistions')
    else:
        validSwath = [i for i in [1, 2, 3] if i not in invalidSwath]
        print('valid swath from scanning acquistion directory: {}'.format(validSwath))


    invalidSwath2 = []
    for swath in validSwath:
        referenceSwath = ut.loadProduct(os.path.join(referenceDir, 'IW{0}.xml'.format(swath)))

        burstoffsetAll = []
        minBurstAll = []
        maxBurstAll = []
        secondarySwathAll = []
        for secondaryDirX in secondaryDir:
            secondarySwath = ut.loadProduct(os.path.join(secondaryDirX, 'IW{0}.xml'.format(swath)))

            secondarySwathAll.append(secondarySwath)

            burstoffset, minBurst, maxBurst = referenceSwath.getCommonBurstLimits(secondarySwath)
            burstoffsetAll.append(burstoffset)
            minBurstAll.append(minBurst)
            maxBurstAll.append(maxBurst)

        minBurst = max(minBurstAll)
        maxBurst = min(maxBurstAll)

        numBurst = maxBurst - minBurst



        if minBurst >= maxBurst:
            invalidSwath2.append(swath)
        else:
            #add reference
            swathAll = [referenceSwath] + secondarySwathAll
            burstoffsetAll = [0] + burstoffsetAll

            for dirx, swathx, burstoffsetx in zip(acquistionDir, swathAll, burstoffsetAll):

                swathTmp = createTOPSSwathSLCProduct()
                swathTmp.configure()

                #change reserved burst properties and remove non-overlap bursts
                for jj in range(len(swathx.bursts)):
                    ii = jj - burstoffsetx
                    #burstFileName = os.path.join(os.path.abspath(dirx), 'IW{}'.format(swath), os.path.basename(swathx.bursts[jj].image.filename))
                    burstFileName = os.path.join(os.path.abspath(dirx), 'IW{}'.format(swath), 'burst_%02d'%(jj+1) + '.slc')
                    if minBurst <= ii < maxBurst:
                        kk = ii - minBurst
                        #change burst properties
                        swathx.bursts[jj].burstNumber = kk + 1
                        swathx.bursts[jj].image.filename = os.path.join(os.path.dirname(swathx.bursts[jj].image.filename), 'burst_%02d'%(kk+1) + '.slc')
                        swathTmp.bursts.append(swathx.bursts[jj])
                    else:
                        #remove non-overlap bursts
                        #os.remove(burstFileName)
                        os.remove(burstFileName+'.vrt')
                        os.remove(burstFileName+'.xml')
                        #remove geometry files accordingly if provided
                        if dirx == referenceDir:
                            if inps.geom_reference is not None:
                                for fileType in ['hgt', 'incLocal', 'lat', 'lon', 'los', 'shadowMask']:
                                    geomFileName = os.path.join(os.path.abspath(inps.geom_reference), 'IW{}'.format(swath), fileType + '_%02d'%(jj+1) + '.rdr')
                                    os.remove(geomFileName)
                                    os.remove(geomFileName+'.vrt')
                                    os.remove(geomFileName+'.xml')


                #change reserved burst file names
                for jj in range(len(swathx.bursts)):
                    ii = jj - burstoffsetx
                    #burstFileName = os.path.join(os.path.abspath(dirx), 'IW{}'.format(swath), os.path.basename(swathx.bursts[jj].image.filename))
                    burstFileName = os.path.join(os.path.abspath(dirx), 'IW{}'.format(swath), 'burst_%02d'%(jj+1) + '.slc')
                    if minBurst <= ii < maxBurst:
                        kk = ii - minBurst
                        burstFileNameNew = os.path.join(os.path.abspath(dirx), 'IW{}'.format(swath), 'burst_%02d'%(kk+1) + '.slc')
                        if burstFileName != burstFileNameNew:
                            img = isceobj.createImage()
                            img.load(burstFileName + '.xml')
                            img.setFilename(burstFileNameNew)
                            #img.extraFilename = burstFileNameNew+'.vrt'
                            img.renderHdr()

                            #still use original vrt
                            os.remove(burstFileName+'.xml')
                            os.remove(burstFileNameNew+'.vrt')
                            os.rename(burstFileName+'.vrt', burstFileNameNew+'.vrt')
                        #change geometry file names accordingly if provided
                        if dirx == referenceDir:
                            if inps.geom_reference is not None:
                                for fileType in ['hgt', 'incLocal', 'lat', 'lon', 'los', 'shadowMask']:
                                    geomFileName = os.path.join(os.path.abspath(inps.geom_reference), 'IW{}'.format(swath), fileType + '_%02d'%(jj+1) + '.rdr')
                                    geomFileNameNew = os.path.join(os.path.abspath(inps.geom_reference), 'IW{}'.format(swath), fileType + '_%02d'%(kk+1) + '.rdr')
                                    if geomFileName != geomFileNameNew:
                                        renameFile(geomFileName, geomFileNameNew)


                #change swath properties
                swathx.bursts = swathTmp.bursts
                swathx.numberOfBursts = numBurst

                #remove original and write new
                os.remove( os.path.join(dirx, 'IW{}.xml'.format(swath)) )
                ut.saveProduct(swathx, os.path.join(dirx, 'IW{}.xml'.format(swath)))

                
    #remove invalid swaths
    invalidSwath3 = list(sorted(set(invalidSwath+invalidSwath2)))
    for swath in invalidSwath3:
        for dirx in acquistionDir:
            iwdir = os.path.join(dirx, 'IW{}'.format(swath))
            iwxml = os.path.join(dirx, 'IW{}.xml'.format(swath))
            if os.path.isdir(iwdir):
                shutil.rmtree(iwdir)
            if os.path.isfile(iwxml):
                os.remove(iwxml)