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
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
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