Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
# set TimeCAPoly
ss_zd_s = get_image_col_spacing_zdt()
eta_mid = ss_zd_s * float(out_sicd.ImageData.SCPPixel.Col)
sicd.RMA.INCA.TimeCAPoly = Poly1DType(
Coefs=[first_line_relative_start+eta_mid, ss_zd_s/out_sicd.Grid.Col.SS])
range_time_scp = sicd.RMA.INCA.R_CA_SCP*2/speed_of_light
# get velocity polynomial
vel_poly = sicd.Position.ARPPoly.derivative(1, return_poly=True)
# We pick a single velocity magnitude at closest approach to represent
# the entire burst. This is valid, since the magnitude of the velocity
# changes very little.
vm_ca = numpy.linalg.norm(vel_poly(sicd.RMA.INCA.TimeCAPoly[0]))
az_rate_times, az_rate_t0, k_a_poly = get_azimuth_fm_estimates(start)
# find the closest fm rate polynomial
az_rate_poly_ind = int(numpy.argmin(numpy.abs(az_rate_times - sicd.RMA.INCA.TimeCAPoly[0])))
az_rate_poly = Poly1DType(Coefs=k_a_poly[az_rate_poly_ind])
dr_ca_poly = az_rate_poly.shift(t_0=az_rate_t0[az_rate_poly_ind] - range_time_scp,
alpha=2/speed_of_light,
return_poly=False)
r_ca = numpy.array([sicd.RMA.INCA.R_CA_SCP, 1], dtype=numpy.float64)
sicd.RMA.INCA.DRateSFPoly = numpy.reshape(
-numpy.convolve(dr_ca_poly, r_ca)*(speed_of_light/(2*center_frequency*vm_ca*vm_ca)),
(-1, 1))
# Doppler Centroid
dc_est_times, dc_t0, data_dc_poly = get_doppler_estimates(start)
# find the closest doppler centroid polynomial
dc_poly_ind = int(numpy.argmin(numpy.abs(dc_est_times - sicd.RMA.INCA.TimeCAPoly[0])))
# we are going to move the respective polynomial from reference point as dc_t0 to
# reference point at SCP time.
dc_poly = Poly1DType(Coefs=data_dc_poly[dc_poly_ind])
# Fit DeltaKCOAPoly, DopCentroidPoly, and TimeCOAPoly from data
def strip_poly(arr):
# strip worthless (all zero) highest order terms
# find last non-zero index
last_ind = arr.size
for i in range(arr.size-1, -1, -1):
if arr[i] != 0:
break
last_ind = i
return Poly1DType(Coefs=arr[:last_ind])
pulse_rep_freq *= 2
lines_processed = [
float(entry.text) for entry in self._findall('./imageGenerationParameters'
'/sarProcessingInformation'
'/numberOfLinesProcessed')]
# there should be one entry of num_lines_processed for each transmit/receive polarization
# and they should all be the same. Omit if this is not the case.
if (len(lines_processed) == len(tx_rcv_polarizations)) and \
all(x == lines_processed[0] for x in lines_processed):
num_lines_processed = lines_processed[0]*len(tx_pols)
duration = num_lines_processed/pulse_rep_freq
timeline.CollectDuration = duration
timeline.IPP = [IPPSetType(
index=0, TStart=0, TEnd=duration, IPPStart=0,
IPPEnd=int(num_lines_processed),
IPPPoly=Poly1DType(Coefs=(0, pulse_rep_freq))), ]
return timeline
"""
# prepare array workspace
out = numpy.copy(self._coefs)
if t_0 != 0 and out.size > 1:
siz = out.size
# let's use horner's method, so iterate from top down
for i in range(siz):
index = siz-i-1
if i > 0:
out[index:siz-1] -= t_0*out[index+1:siz]
if alpha != 1 and out.size > 1:
out *= numpy.power(alpha, numpy.arange(out.size))
if return_poly:
return Poly1DType(Coefs=out)
else:
return out
az_rate_poly_ind = int(numpy.argmin(numpy.abs(az_rate_times - sicd.RMA.INCA.TimeCAPoly[0])))
az_rate_poly = Poly1DType(Coefs=k_a_poly[az_rate_poly_ind])
dr_ca_poly = az_rate_poly.shift(t_0=az_rate_t0[az_rate_poly_ind] - range_time_scp,
alpha=2/speed_of_light,
return_poly=False)
r_ca = numpy.array([sicd.RMA.INCA.R_CA_SCP, 1], dtype=numpy.float64)
sicd.RMA.INCA.DRateSFPoly = numpy.reshape(
-numpy.convolve(dr_ca_poly, r_ca)*(speed_of_light/(2*center_frequency*vm_ca*vm_ca)),
(-1, 1))
# Doppler Centroid
dc_est_times, dc_t0, data_dc_poly = get_doppler_estimates(start)
# find the closest doppler centroid polynomial
dc_poly_ind = int(numpy.argmin(numpy.abs(dc_est_times - sicd.RMA.INCA.TimeCAPoly[0])))
# we are going to move the respective polynomial from reference point as dc_t0 to
# reference point at SCP time.
dc_poly = Poly1DType(Coefs=data_dc_poly[dc_poly_ind])
# Fit DeltaKCOAPoly, DopCentroidPoly, and TimeCOAPoly from data
tau_0 = float(root_node.find('./imageAnnotation/imageInformation/slantRangeTime').text)
delta_tau_s = 1./float(root_node.find('./generalAnnotation/productInformation/rangeSamplingRate').text)
image_data = sicd.ImageData
grid = sicd.Grid
inca = sicd.RMA.INCA
# common use for the fitting efforts
poly_order = 2
grid_samples = poly_order + 4
cols = numpy.linspace(0, image_data.NumCols - 1, grid_samples, dtype=numpy.int64)
rows = numpy.linspace(0, image_data.NumRows - 1, grid_samples, dtype=numpy.int64)
coords_az = get_im_physical_coords(cols, grid, image_data, 'col')
coords_rg = get_im_physical_coords(rows, grid, image_data, 'row')
coords_az_2d, coords_rg_2d = numpy.meshgrid(coords_az, coords_rg)
def update_timeline(sicd, band_name): # type: (SICDType, str) -> None
prf = band_dict[band_name]['PRF']
duration = sicd.Timeline.CollectDuration
ipp_el = sicd.Timeline.IPP[0]
ipp_el.IPPEnd = duration
ipp_el.TEnd = duration
ipp_el.IPPPoly = Poly1DType(Coefs=(0, prf))
Parameters
----------
der_order : int
the order of the derivative
return_poly : bool
return a Poly1DType if True, otherwise return the coefficient array.
Returns
-------
Poly1DType|numpy.ndarray
"""
coefs = numpy.polynomial.polynomial.polyder(self._coefs, der_order)
if return_poly:
return Poly1DType(Coefs=coefs)
return coefs
def update_rma_and_grid(sicd, first_line_relative_start, start, return_time_dets=False):
# type: (SICDType, Union[float, int], numpy.datetime64, bool) -> Union[None, Tuple[float, float]]
center_frequency = get_center_frequency()
# set TimeCAPoly
ss_zd_s = get_image_col_spacing_zdt()
eta_mid = ss_zd_s * float(out_sicd.ImageData.SCPPixel.Col)
sicd.RMA.INCA.TimeCAPoly = Poly1DType(
Coefs=[first_line_relative_start+eta_mid, ss_zd_s/out_sicd.Grid.Col.SS])
range_time_scp = sicd.RMA.INCA.R_CA_SCP*2/speed_of_light
# get velocity polynomial
vel_poly = sicd.Position.ARPPoly.derivative(1, return_poly=True)
# We pick a single velocity magnitude at closest approach to represent
# the entire burst. This is valid, since the magnitude of the velocity
# changes very little.
vm_ca = numpy.linalg.norm(vel_poly(sicd.RMA.INCA.TimeCAPoly[0]))
az_rate_times, az_rate_t0, k_a_poly = get_azimuth_fm_estimates(start)
# find the closest fm rate polynomial
az_rate_poly_ind = int(numpy.argmin(numpy.abs(az_rate_times - sicd.RMA.INCA.TimeCAPoly[0])))
az_rate_poly = Poly1DType(Coefs=k_a_poly[az_rate_poly_ind])
dr_ca_poly = az_rate_poly.shift(t_0=az_rate_t0[az_rate_poly_ind] - range_time_scp,
alpha=2/speed_of_light,
return_poly=False)
r_ca = numpy.array([sicd.RMA.INCA.R_CA_SCP, 1], dtype=numpy.float64)
"""
Represents a single variable polynomial for each of `X`, `Y`, and `Z`. This gives position in ECF coordinates
as a function of a single dependent variable.
"""
_fields = ('X', 'Y', 'Z')
_required = _fields
# descriptors
X = _SerializableDescriptor(
'X', Poly1DType, _required, strict=True,
docstring='The polynomial for the X coordinate.') # type: Poly1DType
Y = _SerializableDescriptor(
'Y', Poly1DType, _required, strict=True,
docstring='The polynomial for the Y coordinate.') # type: Poly1DType
Z = _SerializableDescriptor(
'Z', Poly1DType, _required, strict=True,
docstring='The polynomial for the Z coordinate.') # type: Poly1DType
def __init__(self, X=None, Y=None, Z=None, **kwargs):
"""
Parameters
----------
X : Poly1DType|numpy.ndarray|list|tuple
Y : Poly1DType|numpy.ndarray|list|tuple
Z : Poly1DType|numpy.ndarray|list|tuple
kwargs : dict
"""
if '_xml_ns' in kwargs:
self._xml_ns = kwargs['_xml_ns']
if '_xml_ns_key' in kwargs:
self._xml_ns_key = kwargs['_xml_ns_key']