Example #1
0
def run(frame,
        orbit,
        dopplerCentroid,
        peg,
        fdHeight,
        chirpextension,
        catalog=None,
        sceneid='NO_ID'):
    """
    Calculate motion compensation correction for Doppler centroid
    """
    rangeSamplingRate = frame.instrument.rangeSamplingRate
    rangePulseDuration = frame.instrument.pulseLength
    chirpSize = int(rangeSamplingRate * rangePulseDuration)

    number_range_bins = frame.numberRangeBins
    logger.info("Correcting Doppler centroid for motion compensation: %s" %
                sceneid)

    fdmocomp = stdproc.createFdMocomp()
    fdmocomp.wireInputPort(name='frame', object=frame)
    fdmocomp.wireInputPort(name='peg', object=peg)
    fdmocomp.wireInputPort(name='orbit', object=orbit)
    fdmocomp.setWidth(number_range_bins)
    fdmocomp.setSatelliteHeight(fdHeight)
    fdmocomp.setDopplerCoefficients([dopplerCentroid, 0.0, 0.0, 0.0])
    fdmocomp.fdmocomp()
    dopplerCorrection = fdmocomp.dopplerCentroid
    if catalog is not None:
        isceobj.Catalog.recordInputsAndOutputs(
            catalog, fdmocomp, "runUpdatePreprocInfo." + sceneid, logger,
            "runUpdatePreprocInfo." + sceneid)
    return dopplerCorrection
Example #2
0
def runFdMocomp(self, use_dop="average"):
    """
    Calculate motion compenstation correction for Doppler centroid
    """
    H1 = self.insar.fdH1
    H2 = self.insar.fdH2
    peg = self.insar.peg
    lookSide = self.insar._lookSide
    referenceOrbit = self.insar.referenceOrbit
    secondaryOrbit = self.insar.secondaryOrbit
    rangeSamplingRate = (
        self.insar.getReferenceFrame().instrument.rangeSamplingRate)
    rangePulseDuration = (
        self.insar.getSecondaryFrame().instrument.pulseLength)
    chirpExtension = self.insar.chirpExtension
    chirpSize = int(rangeSamplingRate * rangePulseDuration)

    number_range_bins = self.insar.numberRangeBins

    referenceCentroid = self.insar.referenceDoppler.fractionalCentroid
    secondaryCentroid = self.insar.secondaryDoppler.fractionalCentroid
    logger.info("Correcting Doppler centroid for motion compensation")

    result = []
    for centroid, frame, orbit, H in zip(
        (referenceCentroid, secondaryCentroid),
        (self.insar.referenceFrame, self.insar.secondaryFrame),
        (referenceOrbit, secondaryOrbit), (H1, H2)):
        fdmocomp = stdproc.createFdMocomp()
        fdmocomp.wireInputPort(name='frame', object=frame)
        fdmocomp.wireInputPort(name='peg', object=peg)
        fdmocomp.wireInputPort(name='orbit', object=orbit)
        fdmocomp.setWidth(number_range_bins)
        fdmocomp.setSatelliteHeight(H)
        fdmocomp.setDopplerCoefficients([centroid, 0.0, 0.0, 0.0])
        fdmocomp.setLookSide(lookSide)
        fdmocomp.fdmocomp()
        result.append(fdmocomp.dopplerCentroid)
        pass

    referenceDopplerCorrection, secondaryDopplerCorrection = result

    #    print referenceDopplerCorrection, secondaryDopplerCorrection
    #    use_dop = "F"
    try:
        fd = USE_DOP[use_dop.upper()](referenceDopplerCorrection,
                                      secondaryDopplerCorrection)
    except KeyError:
        print("Unrecognized use_dop option.  use_dop = ", use_dop)
        print("Not found in dictionary:", USE_DOP.keys())
        sys.exit(1)
        pass

    logger.info("Updated Doppler Centroid: %s" % (fd))
    return fd
Example #3
0
    def focus(self, mr, fd):
        """
        Focus SAR data

        @param mr (\a make_raw) a make_raw instance
        @param fd (\a float) Doppler centroid for focusing
        """
        import stdproc
        import isceobj
        #from isceobj.Sensor.Generic import Generic

        # Extract some useful variables
        frame = mr.getFrame()
        orbit = frame.getOrbit()
        planet = frame.getInstrument().getPlatform().getPlanet()

        # Calculate Peg Point
        self.logger.info("Calculating Peg Point")
        peg = self.calculatePegPoint(frame, orbit, planet)
        V, H = self.calculateProcessingVelocity(frame, peg)

        # Interpolate orbit
        self.logger.info("Interpolating Orbit")
        pt = stdproc.createPulsetiming()
        pt.wireInputPort(name='frame', object=frame)
        pt.pulsetiming()
        orbit = pt.getOrbit()

        # Convert orbit to SCH coordinates
        self.logger.info("Converting orbit reference frame")
        o2s = stdproc.createOrbit2sch()
        o2s.wireInputPort(name='planet', object=planet)
        o2s.wireInputPort(name='orbit', object=orbit)
        o2s.wireInputPort(name='peg', object=peg)
        o2s.setAverageHeight(H)
        o2s.orbit2sch()

        # Create Raw Image
        rawImage = isceobj.createRawImage()
        filename = frame.getImage().getFilename()
        bytesPerLine = frame.getImage().getXmax()
        goodBytes = bytesPerLine - frame.getImage().getXmin()
        rawImage.setAccessMode('read')
        rawImage.setByteOrder(frame.getImage().byteOrder)
        rawImage.setFilename(filename)
        rawImage.setNumberGoodBytes(goodBytes)
        rawImage.setWidth(bytesPerLine)
        rawImage.setXmin(frame.getImage().getXmin())
        rawImage.setXmax(bytesPerLine)
        rawImage.createImage()

        # Create SLC Image
        slcImage = isceobj.createSlcImage()
        rangeSamplingRate = frame.getInstrument().getRangeSamplingRate()
        rangePulseDuration = frame.getInstrument().getPulseLength()
        chirpSize = int(rangeSamplingRate * rangePulseDuration)
        chirpExtension = 0  #0.5*chirpSize
        numberRangeBins = int(goodBytes / 2) - chirpSize + chirpExtension
        slcImage.setFilename(filename.replace('.raw', '.slc'))
        slcImage.setByteOrder(frame.getImage().byteOrder)
        slcImage.setAccessMode('write')
        slcImage.setDataType('CFLOAT')
        slcImage.setWidth(numberRangeBins)
        slcImage.createImage()

        # Calculate motion compenstation correction for Doppler centroid
        self.logger.info("Correcting Doppler centroid for motion compensation")
        fdmocomp = stdproc.createFdMocomp()
        fdmocomp.wireInputPort(name='frame', object=frame)
        fdmocomp.wireInputPort(name='peg', object=peg)
        fdmocomp.wireInputPort(name='orbit', object=o2s.getOrbit())
        fdmocomp.setWidth(numberRangeBins)
        fdmocomp.setSatelliteHeight(H)
        fdmocomp.setDopplerCoefficients([fd[0], 0.0, 0.0, 0.0])
        fdmocomp.fdmocomp()
        fd[0] = fdmocomp.getDopplerCentroid()
        self.logger.info("Updated Doppler centroid: %s" % (fd))

        # Calculate the motion compensation Doppler centroid correction plus rate
        #self.logger.info("Testing new Doppler code")
        #frate = stdproc.createFRate()
        #frate.wireInputPort(name='frame',object=frame)
        #frate.wireInputPort(name='peg', object=peg)
        #frate.wireInputPort(name='orbit',object=o2s.getOrbit())
        #frate.wireInputPort(name='planet',object=planet)
        #frate.setWidth(numberRangeBins)
        #frate.frate()
        #fd = frate.getDopplerCentroid()
        #fdrate = frate.getDopplerRate()
        #self.logger.info("Updated Doppler centroid and rate: %s %s" % (fd,fdrate))

        synthetic_aperature_length = self._calculateSyntheticAperatureLength(
            frame, V)

        patchSize = self.nextpow2(2 * synthetic_aperature_length)
        valid_az_samples = patchSize - synthetic_aperature_length
        rawFileSize = rawImage.getLength() * rawImage.getWidth()
        linelength = rawImage.getXmax()
        overhead = patchSize - valid_az_samples
        numPatches = (1 + int(
            (rawFileSize / float(linelength) - overhead) / valid_az_samples))

        # Focus image
        self.logger.info("Focusing image")
        focus = stdproc.createFormSLC()
        focus.wireInputPort(name='rawImage', object=rawImage)
        focus.wireInputPort(name='slcImage', object=slcImage)
        focus.wireInputPort(name='orbit', object=o2s.getOrbit())
        focus.wireInputPort(name='frame', object=frame)
        focus.wireInputPort(name='peg', object=peg)
        focus.wireInputPort(name='planet', object=planet)
        focus.setDebugFlag(96)
        focus.setBodyFixedVelocity(V)
        focus.setSpacecraftHeight(H)
        focus.setAzimuthPatchSize(patchSize)
        focus.setNumberValidPulses(valid_az_samples)
        focus.setSecondaryRangeMigrationFlag('n')
        focus.setNumberAzimuthLooks(1)
        focus.setNumberPatches(numPatches)
        focus.setDopplerCentroidCoefficients(fd)
        #focus.setDopplerCentroidCoefficients([fd[0], 0.0, 0.0])
        focus.formslc()
        mocompPos = focus.getMocompPosition()
        fp = open('position.sch', 'w')
        for i in range(len(mocompPos[0])):
            fp.write("%f %f\n" % (mocompPos[0][i], mocompPos[1][i]))
        fp.close()

        slcImage.finalizeImage()
        rawImage.finalizeImage()

        # Recreate the SLC image
        slcImage = isceobj.createSlcImage()
        slcImage.setFilename(filename.replace('.raw', '.slc'))
        slcImage.setAccessMode('read')
        slcImage.setDataType('CFLOAT')
        slcImage.setWidth(numberRangeBins)
        slcImage.createImage()
        width = int(slcImage.getWidth())
        length = int(slcImage.getLength())

        # Create a frame object and write it out using the Generic driver
        frame.setImage(slcImage)
        frame.setOrbit(o2s.getOrbit())
        #writer = Generic()
        #writer.frame = frame
        #writer.write('test.h5',compression='gzip')

        slcImage.finalizeImage()

        self.width = width
        self.length = length