Exemplo n.º 1
0
def runMergeBursts(self, adjust=1):
    '''
    Merge burst products to make it look like stripmap.
    Currently will merge interferogram, lat, lon, z and los.
    '''
    from isceobj.TopsProc.runIon import renameFile
    from isceobj.TopsProc.runIon import runCmd

    #########################################
    #totalLooksThreshold = 9
    totalLooksThreshold = 99999999999999
    #if doing ionospheric correction
    ionCorrection = self.ION_doIon
    ionDirname = 'ion/ion_burst'
    mergedIonname = 'topophase.ion'
    originalIfgname = 'topophase_ori.flat'
    #########################################

    # backing out the tigher constraints for ionosphere as it could itnroduce gabs between along track products produced seperately
    if not ionCorrection:
        adjust = 0

    #########################################
    # STEP 1. SET UP
    #########################################
    virtual = self.useVirtualFiles

    #get frames (subswaths)
    frames = []
    burstIndex = []
    swathList = self._insar.getValidSwathList(self.swaths)
    for swath in swathList:
        minBurst, maxBurst = self._insar.commonMasterBurstLimits(swath - 1)
        if minBurst == maxBurst:
            print('Skipping processing of swath {0}'.format(swath))
            continue
        ifg = self._insar.loadProduct(
            os.path.join(self._insar.fineIfgDirname,
                         'IW{0}.xml'.format(swath)))
        frames.append(ifg)
        burstIndex.append([int(swath), minBurst, maxBurst])

    #adjust valid samples
    validOnly = False
    #determine merged size
    box = mergeBox(frames)
    if adjust == 1:
        #make a copy before doing this
        frames_bak = copy.deepcopy(frames)
        #adjust valid with looks, 'frames' ARE CHANGED AFTER RUNNING THIS
        (burstValidBox, burstValidBox2,
         message) = adjustValidWithLooks(frames,
                                         box,
                                         self.numberAzimuthLooks,
                                         self.numberRangeLooks,
                                         edge=0,
                                         avalid='strict',
                                         rvalid='strict')
        if message != '':
            print(
                '***********************************************************************************'
            )
            print(
                'doing ajustment with looks results in gaps beween bursts/swaths.'
            )
            print('no ajustment made.')
            print(
                'This means a multi-look pixel may contains one-look pixels from different bursts.'
            )
            print(
                '***********************************************************************************'
            )
            #restore
            frames = frames_bak
        else:
            validOnly == True

    #########################################
    # STEP 2. MERGE BURSTS
    #########################################
    mergedir = self._insar.mergedDirname
    os.makedirs(mergedir, exist_ok=True)
    if (self.numberRangeLooks == 1) and (self.numberAzimuthLooks == 1):
        suffix = ''
    else:
        suffix = '.full'

    #merge los, lat, lon, z
    mergeBursts2(frames,
                 os.path.join(self._insar.geometryDirname, 'IW%d',
                              'los_%02d.rdr'),
                 burstIndex,
                 box,
                 os.path.join(mergedir, self._insar.mergedLosName + suffix),
                 virtual=virtual,
                 validOnly=validOnly)
    mergeBursts2(frames,
                 os.path.join(self._insar.geometryDirname, 'IW%d',
                              'lat_%02d.rdr'),
                 burstIndex,
                 box,
                 os.path.join(mergedir, 'lat.rdr' + suffix),
                 virtual=virtual,
                 validOnly=validOnly)
    mergeBursts2(frames,
                 os.path.join(self._insar.geometryDirname, 'IW%d',
                              'lon_%02d.rdr'),
                 burstIndex,
                 box,
                 os.path.join(mergedir, 'lon.rdr' + suffix),
                 virtual=virtual,
                 validOnly=validOnly)
    mergeBursts2(frames,
                 os.path.join(self._insar.geometryDirname, 'IW%d',
                              'hgt_%02d.rdr'),
                 burstIndex,
                 box,
                 os.path.join(mergedir, 'z.rdr' + suffix),
                 virtual=virtual,
                 validOnly=validOnly)
    #merge master and coregistered slave slcs
    mergeBursts2(frames,
                 os.path.join(self._insar.masterSlcProduct, 'IW%d',
                              'burst_%02d.slc'),
                 burstIndex,
                 box,
                 os.path.join(mergedir, 'master.slc' + suffix),
                 virtual=virtual,
                 validOnly=True)
    mergeBursts2(frames,
                 os.path.join(self._insar.fineCoregDirname, 'IW%d',
                              'burst_%02d.slc'),
                 burstIndex,
                 box,
                 os.path.join(mergedir, 'slave.slc' + suffix),
                 virtual=virtual,
                 validOnly=True)
    #merge insar products
    if self.doInSAR:
        mergeBursts2(frames,
                     os.path.join(self._insar.fineIfgDirname, 'IW%d',
                                  'burst_%02d.int'),
                     burstIndex,
                     box,
                     os.path.join(mergedir,
                                  self._insar.mergedIfgname + suffix),
                     virtual=virtual,
                     validOnly=True)
        if self.numberAzimuthLooks * self.numberRangeLooks < totalLooksThreshold:
            mergeBursts2(
                frames,
                os.path.join(self._insar.fineIfgDirname, 'IW%d',
                             'burst_%02d.cor'),
                burstIndex,
                box,
                os.path.join(mergedir,
                             self._insar.correlationFilename + suffix),
                virtual=virtual,
                validOnly=True)
        if ionCorrection == True:
            mergeBursts2(frames,
                         os.path.join(ionDirname, 'IW%d', 'burst_%02d.ion'),
                         burstIndex,
                         box,
                         os.path.join(mergedir, mergedIonname + suffix),
                         virtual=virtual,
                         validOnly=True)

    #########################################
    # STEP 3. MULTIPLE LOOKING MERGED IMAGES
    #########################################
    if suffix not in ['', None]:
        if self.doInSAR:
            multilook(os.path.join(mergedir,
                                   self._insar.mergedIfgname + suffix),
                      outname=os.path.join(mergedir,
                                           self._insar.mergedIfgname),
                      alks=self.numberAzimuthLooks,
                      rlks=self.numberRangeLooks)

            multilook(os.path.join(mergedir,
                                   self._insar.mergedLosName + suffix),
                      outname=os.path.join(mergedir,
                                           self._insar.mergedLosName),
                      alks=self.numberAzimuthLooks,
                      rlks=self.numberRangeLooks)

            if self.numberAzimuthLooks * self.numberRangeLooks < totalLooksThreshold:
                multilook(
                    os.path.join(mergedir,
                                 self._insar.correlationFilename + suffix),
                    outname=os.path.join(mergedir,
                                         self._insar.correlationFilename),
                    alks=self.numberAzimuthLooks,
                    rlks=self.numberRangeLooks)
            else:
                #compute coherence
                cmd = "gdal_translate -of ENVI {} {}".format(
                    os.path.join(mergedir, 'master.slc' + suffix + '.vrt'),
                    os.path.join(mergedir, 'master.slc' + suffix))
                runCmd(cmd)
                cmd = "gdal_translate -of ENVI {} {}".format(
                    os.path.join(mergedir, 'slave.slc' + suffix + '.vrt'),
                    os.path.join(mergedir, 'slave.slc' + suffix))
                runCmd(cmd)
                pwrfile = 'pwr.bil'
                cmd = "imageMath.py -e='real(a)*real(a)+imag(a)*imag(a);real(b)*real(b)+imag(b)*imag(b)' --a={} --b={} -o {} -t float -s BIL".format(
                    os.path.join(mergedir, 'master.slc' + suffix),
                    os.path.join(mergedir, 'slave.slc' + suffix),
                    os.path.join(mergedir, pwrfile + suffix))
                runCmd(cmd)
                cmd = "looks.py -i {} -o {} -r {} -a {}".format(
                    os.path.join(mergedir, pwrfile + suffix),
                    os.path.join(mergedir, pwrfile), self.numberRangeLooks,
                    self.numberAzimuthLooks)
                runCmd(cmd)
                cmd = "imageMath.py -e='((abs(a))!=0)*((b_0*b_1)!=0)*sqrt(b_0*b_1);((abs(a))!=0)*((b_0*b_1)!=0)*abs(a)/(sqrt(b_0*b_1)+((b_0*b_1)==0))' --a={} --b={} -o {} -t float -s BIL".format(
                    os.path.join(mergedir, self._insar.mergedIfgname),
                    os.path.join(mergedir, pwrfile),
                    os.path.join(mergedir, self._insar.correlationFilename))
                runCmd(cmd)
                #remove intermediate files
                os.remove(os.path.join(mergedir, 'master.slc' + suffix))
                os.remove(os.path.join(mergedir, 'slave.slc' + suffix))
                os.remove(os.path.join(mergedir, pwrfile + suffix))
                os.remove(os.path.join(mergedir, pwrfile + suffix + '.xml'))
                os.remove(os.path.join(mergedir, pwrfile + suffix + '.vrt'))
                os.remove(os.path.join(mergedir, pwrfile))
                os.remove(os.path.join(mergedir, pwrfile + '.xml'))
                os.remove(os.path.join(mergedir, pwrfile + '.vrt'))

            if ionCorrection:
                multilook(os.path.join(mergedir, mergedIonname + suffix),
                          outname=os.path.join(mergedir, mergedIonname),
                          alks=self.numberAzimuthLooks,
                          rlks=self.numberRangeLooks)
    else:
        print('Skipping multi-looking ....')

    #########################################
    # STEP 4. APPLY CORRECTIONS
    #########################################
    #do ionospheric and other corrections here
    #should also consider suffix, but usually we use multiple looks, so I ignore it for now.
    if self.doInSAR:
        if ionCorrection:
            print('user choose to do ionospheric correction')

            #define file names
            interferogramFilename = os.path.join(mergedir,
                                                 self._insar.mergedIfgname)
            originalInterferogramFilename = os.path.join(
                mergedir, originalIfgname)
            ionosphereFilename = os.path.join(mergedir, mergedIonname)

            #rename original interferogram to make a backup copy
            if os.path.isfile(originalInterferogramFilename):
                pass
            else:
                renameFile(interferogramFilename,
                           originalInterferogramFilename)

            #do correction
            cmd = "imageMath.py -e='a*exp(-1.0*J*b)' --a={} --b={} -o {} -t cfloat".format(
                originalInterferogramFilename, ionosphereFilename,
                interferogramFilename)
            runCmd(cmd)
Exemplo n.º 2
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)