def update_radar_collection(sicd, band_name, ind): # type: (SICDType, str, int) -> None chirp_length = band_dict[band_name]['Range Chirp Length'] chirp_rate = abs(band_dict[band_name]['Range Chirp Rate']) sample_rate = band_dict[band_name]['Sampling Rate'] ref_dechirp_time = band_dict[band_name]['Reference Dechirping Time'] win_length = band_dict[band_name]['Echo Sampling Window Length'] rcv_fm_rate = 0 if numpy.isnan(ref_dechirp_time) else ref_dechirp_time # TODO: is this the correct value? band_width = chirp_length*chirp_rate fr_min = center_frequency - 0.5*band_width fr_max = center_frequency + 0.5*band_width sicd.RadarCollection.TxFrequency = TxFrequencyType(Min=fr_min, Max=fr_max) sicd.RadarCollection.Waveform = [ WaveformParametersType(index=0, TxPulseLength=chirp_length, TxRFBandwidth=band_width, TxFreqStart=fr_min, TxFMRate=chirp_rate, ADCSampleRate=sample_rate, RcvFMRate=rcv_fm_rate, RcvWindowLength=win_length/sample_rate), ] sicd.ImageFormation.RcvChanProc.ChanIndices = [ind+1, ] sicd.ImageFormation.TxFrequencyProc = TxFrequencyProcType(MinProc=fr_min, MaxProc=fr_max) sicd.ImageFormation.TxRcvPolarizationProc = sicd.RadarCollection.RcvChannels[ind].TxRcvPolarization
def get_image_formation(): # type: () -> ImageFormationType radar = collect['radar'] algo = collect['image']['algorithm'].upper() processings = None if algo == 'BACKPROJECTION': processings = [ ProcessingType(Type='Backprojected to DEM', Applied=True), ] if algo not in ('PFA', 'RMA', 'RGAZCOMP'): logging.warning( 'Image formation algorithm {} not one of the recognized SICD options, ' 'being set to "OTHER".'.format(algo)) algo = 'OTHER' return ImageFormationType( RcvChanProc=RcvChanProcType(NumChanProc=1, PRFScaleFactor=1), ImageFormAlgo=algo, TStartProc=0, TEndProc=duration, TxRcvPolarizationProc='{}:{}'.format( radar['transmit_polarization'], radar['receive_polarization']), TxFrequencyProc=TxFrequencyProcType( MinProc=radar_collection.TxFrequency.Min, MaxProc=radar_collection.TxFrequency.Max), STBeamComp='NO', ImageBeamComp='NO', AzAutofocus='NO', RgAutofocus='NO', Processings=processings)
def update_image_formation(): center_freq_t = gp['processedCenterFrequency'][()] bw = gp['processedRangeBandwidth'][()] t_sicd.ImageFormation.TxFrequencyProc = TxFrequencyProcType( MinProc=center_freq_t - 0.5*bw, MaxProc=center_freq_t + 0.5*bw, ) return center_freq_t
def _get_image_formation(self, timeline, radar_collection): """ Gets the ImageFormation. Parameters ---------- timeline : TimelineType radar_collection : RadarCollectionType Returns ------- ImageFormationType """ pulse_parts = len( self._findall('./sourceAttributes/radarParameters/pulseBandwidth')) tx_pols, tx_rcv_polarizations = self._get_polarizations() return ImageFormationType( # PRFScaleFactor for either polarimetric or multi-step, but not both. RcvChanProc=RcvChanProcType(NumChanProc=1, PRFScaleFactor=1. / max(pulse_parts, len(tx_pols))), ImageFormAlgo='RMA', TStartProc=0, TEndProc=timeline.CollectDuration, TxFrequencyProc=TxFrequencyProcType( MinProc=radar_collection.TxFrequency.Min, MaxProc=radar_collection.TxFrequency.Max), STBeamComp='GLOBAL', ImageBeamComp='SV', AzAutofocus='NO', RgAutofocus='NO')
def get_image_formation(): # type: () -> ImageFormationType return ImageFormationType( TxRcvPolarizationProc=polarization, ImageFormAlgo='RMA', TStartProc=0, TEndProc=duration, TxFrequencyProc=TxFrequencyProcType(MinProc=min_freq, MaxProc=max_freq), STBeamComp='NO', ImageBeamComp='SV', AzAutofocus='NO', RgAutofocus='NO', RcvChanProc=RcvChanProcType(NumChanProc=1, PRFScaleFactor=1, ChanIndices=[1, ]),)
def try_CMETAA(): tre = None if tres is None else tres['CMETAA'] # type: CMETAA if tre is None: return cmetaa = tre.DATA if the_sicd.GeoData is None: the_sicd.GeoData = GeoDataType() if the_sicd.SCPCOA is None: the_sicd.SCPCOA = SCPCOAType() if the_sicd.Grid is None: the_sicd.Grid = GridType() if the_sicd.Timeline is None: the_sicd.Timeline = TimelineType() if the_sicd.RadarCollection is None: the_sicd.RadarCollection = RadarCollectionType() if the_sicd.ImageFormation is None: the_sicd.ImageFormation = ImageFormationType() the_sicd.SCPCOA.SCPTime = 0.5*float(cmetaa.WF_CDP) the_sicd.GeoData.SCP = SCPType(ECF=tre.get_scp()) the_sicd.SCPCOA.ARPPos = tre.get_arp() the_sicd.SCPCOA.SideOfTrack = cmetaa.CG_LD.strip().upper() the_sicd.SCPCOA.SlantRange = float(cmetaa.CG_SRAC) the_sicd.SCPCOA.DopplerConeAng = float(cmetaa.CG_CAAC) the_sicd.SCPCOA.GrazeAng = float(cmetaa.CG_GAAC) the_sicd.SCPCOA.IncidenceAng = 90 - float(cmetaa.CG_GAAC) if hasattr(cmetaa, 'CG_TILT'): the_sicd.SCPCOA.TwistAng = float(cmetaa.CG_TILT) if hasattr(cmetaa, 'CG_SLOPE'): the_sicd.SCPCOA.SlopeAng = float(cmetaa.CG_SLOPE) the_sicd.ImageData.SCPPixel = [int(cmetaa.IF_DC_IS_COL), int(cmetaa.IF_DC_IS_ROW)] img_corners = tre.get_image_corners() if img_corners is not None: the_sicd.GeoData.ImageCorners = img_corners if cmetaa.CMPLX_SIGNAL_PLANE.upper() == 'S': the_sicd.Grid.ImagePlane = 'SLANT' elif cmetaa.CMPLX_SIGNAL_PLANE.upper() == 'G': the_sicd.Grid.ImagePlane = 'GROUND' else: logger.warning( 'Got unexpected CMPLX_SIGNAL_PLANE value {},\n\t' 'setting ImagePlane to SLANT'.format(cmetaa.CMPLX_SIGNAL_PLANE)) the_sicd.Grid.Row = DirParamType( SS=float(cmetaa.IF_RSS), ImpRespWid=float(cmetaa.IF_RGRES), Sgn=1 if cmetaa.IF_RFFTS.strip() == '-' else -1, # opposite sign convention ImpRespBW=float(cmetaa.IF_RFFT_SAMP)/(float(cmetaa.IF_RSS)*float(cmetaa.IF_RFFT_TOT))) the_sicd.Grid.Col = DirParamType( SS=float(cmetaa.IF_AZSS), ImpRespWid=float(cmetaa.IF_AZRES), Sgn=1 if cmetaa.IF_AFFTS.strip() == '-' else -1, # opposite sign convention ImpRespBW=float(cmetaa.IF_AZFFT_SAMP)/(float(cmetaa.IF_AZSS)*float(cmetaa.IF_AZFFT_TOT))) cmplx_weight = cmetaa.CMPLX_WEIGHT.strip().upper() if cmplx_weight == 'UWT': the_sicd.Grid.Row.WgtType = WgtTypeType(WindowName='UNIFORM') the_sicd.Grid.Col.WgtType = WgtTypeType(WindowName='UNIFORM') elif cmplx_weight == 'HMW': the_sicd.Grid.Row.WgtType = WgtTypeType(WindowName='HAMMING') the_sicd.Grid.Col.WgtType = WgtTypeType(WindowName='HAMMING') elif cmplx_weight == 'HNW': the_sicd.Grid.Row.WgtType = WgtTypeType(WindowName='HANNING') the_sicd.Grid.Col.WgtType = WgtTypeType(WindowName='HANNING') elif cmplx_weight == 'TAY': the_sicd.Grid.Row.WgtType = WgtTypeType( WindowName='TAYLOR', Parameters={ 'SLL': '-{0:d}'.format(int(cmetaa.CMPLX_RNG_SLL)), 'NBAR': '{0:d}'.format(int(cmetaa.CMPLX_RNG_TAY_NBAR))}) the_sicd.Grid.Col.WgtType = WgtTypeType( WindowName='TAYLOR', Parameters={ 'SLL': '-{0:d}'.format(int(cmetaa.CMPLX_AZ_SLL)), 'NBAR': '{0:d}'.format(int(cmetaa.CMPLX_AZ_TAY_NBAR))}) else: logger.warning( 'Got unsupported CMPLX_WEIGHT value {}.\n\tThe resulting SICD will ' 'not have valid weight array populated'.format(cmplx_weight)) the_sicd.Grid.Row.define_weight_function() the_sicd.Grid.Col.define_weight_function() # noinspection PyBroadException try: date_str = cmetaa.T_UTC_YYYYMMMDD time_str = cmetaa.T_HHMMSSUTC date_time = _iso_date_format.format( date_str[:4], date_str[4:6], date_str[6:8], time_str[:2], time_str[2:4], time_str[4:6]) the_sicd.Timeline.CollectStart = numpy.datetime64(date_time, 'us') except Exception: logger.info('Failed extracting start time from CMETAA') pass the_sicd.Timeline.CollectDuration = float(cmetaa.WF_CDP) the_sicd.Timeline.IPP = [ IPPSetType(TStart=0, TEnd=float(cmetaa.WF_CDP), IPPStart=0, IPPEnd=numpy.floor(float(cmetaa.WF_CDP)*float(cmetaa.WF_PRF)), IPPPoly=[0, float(cmetaa.WF_PRF)])] the_sicd.RadarCollection.TxFrequency = TxFrequencyType( Min=float(cmetaa.WF_SRTFR), Max=float(cmetaa.WF_ENDFR)) the_sicd.RadarCollection.TxPolarization = cmetaa.POL_TR.upper() the_sicd.RadarCollection.Waveform = [WaveformParametersType( TxPulseLength=float(cmetaa.WF_WIDTH), TxRFBandwidth=float(cmetaa.WF_BW), TxFreqStart=float(cmetaa.WF_SRTFR), TxFMRate=float(cmetaa.WF_CHRPRT)*1e12)] tx_rcv_pol = '{}:{}'.format(cmetaa.POL_TR.upper(), cmetaa.POL_RE.upper()) the_sicd.RadarCollection.RcvChannels = [ ChanParametersType(TxRcvPolarization=tx_rcv_pol)] the_sicd.ImageFormation.TxRcvPolarizationProc = tx_rcv_pol if_process = cmetaa.IF_PROCESS.strip().upper() if if_process == 'PF': the_sicd.ImageFormation.ImageFormAlgo = 'PFA' scp_ecf = tre.get_scp() fpn_ned = numpy.array( [float(cmetaa.CG_FPNUV_X), float(cmetaa.CG_FPNUV_Y), float(cmetaa.CG_FPNUV_Z)], dtype='float64') ipn_ned = numpy.array( [float(cmetaa.CG_IDPNUVX), float(cmetaa.CG_IDPNUVY), float(cmetaa.CG_IDPNUVZ)], dtype='float64') fpn_ecf = ned_to_ecf(fpn_ned, scp_ecf, absolute_coords=False) ipn_ecf = ned_to_ecf(ipn_ned, scp_ecf, absolute_coords=False) the_sicd.PFA = PFAType(FPN=fpn_ecf, IPN=ipn_ecf) elif if_process in ['RM', 'CD']: the_sicd.ImageFormation.ImageFormAlgo = 'RMA' # the remainder of this is guesswork to define required fields the_sicd.ImageFormation.TStartProc = 0 # guess work the_sicd.ImageFormation.TEndProc = float(cmetaa.WF_CDP) the_sicd.ImageFormation.TxFrequencyProc = TxFrequencyProcType( MinProc=float(cmetaa.WF_SRTFR), MaxProc=float(cmetaa.WF_ENDFR)) # all remaining guess work the_sicd.ImageFormation.STBeamComp = 'NO' the_sicd.ImageFormation.ImageBeamComp = 'SV' if cmetaa.IF_BEAM_COMP[0] == 'Y' else 'NO' the_sicd.ImageFormation.AzAutofocus = 'NO' if cmetaa.AF_TYPE[0] == 'N' else 'SV' the_sicd.ImageFormation.RgAutofocus = 'NO'
def try_CMETAA(): tre = None if tres is None else tres['CMETAA'] if tre is None: return cmetaa = tre.DATA if the_sicd.GeoData is None: the_sicd.GeoData = GeoDataType() if the_sicd.SCPCOA is None: the_sicd.SCPCOA = SCPCOAType() if the_sicd.Grid is None: the_sicd.Grid = GridType() if the_sicd.Timeline is None: the_sicd.Timeline = TimelineType() if the_sicd.RadarCollection is None: the_sicd.RadarCollection = RadarCollectionType() if the_sicd.ImageFormation is None: the_sicd.ImageFormation = ImageFormationType() the_sicd.SCPCOA.SCPTime = 0.5 * cmetaa.WF_CDP if cmetaa.CG_MODEL == 'ECEF': the_sicd.GeoData.SCP = SCPType(ECF=[ cmetaa.CG_SCECN_X, cmetaa.CG_SCECN_Y, cmetaa.cmetaa.CG_SCECN_Z ]) the_sicd.SCPCOA.ARPPos = [ cmetaa.CG_APCEN_X, cmetaa.CG_APCEN_Y, cmetaa.CG_APCEN_Z ] elif cmetaa.CG_MODEL == 'WGS84': the_sicd.GeoData.SCP = SCPType(LLH=[ cmetaa.CG_SCECN_X, cmetaa.CG_SCECN_Y, cmetaa.cmetaa.CG_SCECN_Z ]) the_sicd.SCPCOA.ARPPos = geodetic_to_ecf( [cmetaa.CG_APCEN_X, cmetaa.CG_APCEN_Y, cmetaa.CG_APCEN_Z]) the_sicd.SCPCOA.SideOfTrack = cmetaa.CG_LD the_sicd.SCPCOA.SlantRange = cmetaa.CG_SRAC the_sicd.SCPCOA.DopplerConeAng = cmetaa.CG_CAAC the_sicd.SCPCOA.GrazeAng = cmetaa.CG_GAAC the_sicd.SCPCOA.IncidenceAng = 90 - cmetaa.CG_GAAC if hasattr(cmetaa, 'CG_TILT'): the_sicd.SCPCOA.TwistAng = cmetaa.CG_TILT if hasattr(cmetaa, 'CG_SLOPE'): the_sicd.SCPCOA.SlopeAng = cmetaa.CG_SLOPE the_sicd.ImageData.SCPPixel = [ cmetaa.IF_DC_IS_COL, cmetaa.IF_DC_IS_ROW ] if cmetaa.CG_MAP_TYPE == 'GEOD': the_sicd.GeoData.ImageCorners = [ [cmetaa.CG_PATCH_LTCORUL, cmetaa.CG_PATCH_LGCORUL], [cmetaa.CG_PATCH_LTCORUR, cmetaa.CG_PATCH_LGCORUR], [cmetaa.CG_PATCH_LTCORLR, cmetaa.CG_PATCH_LGCORLR], [cmetaa.CG_PATCH_LTCORLL, cmetaa.CG_PATCH_LNGCOLL] ] if cmetaa.CMPLX_SIGNAL_PLANE[0].upper() == 'S': the_sicd.Grid.ImagePlane = 'SLANT' elif cmetaa.CMPLX_SIGNAL_PLANE[0].upper() == 'G': the_sicd.Grid.ImagePlane = 'GROUND' the_sicd.Grid.Row = DirParamType( SS=cmetaa.IF_RSS, ImpRespWid=cmetaa.IF_RGRES, Sgn=1 if cmetaa.IF_RFFTS == '-' else -1, # opposite sign convention ImpRespBW=cmetaa.IF_RFFT_SAMP / (cmetaa.IF_RSS * cmetaa.IF_RFFT_TOT)) the_sicd.Grid.Col = DirParamType( SS=cmetaa.IF_AZSS, ImpRespWid=cmetaa.IF_AZRES, Sgn=1 if cmetaa.IF_AFFTS == '-' else -1, # opposite sign convention ImpRespBW=cmetaa.IF_AZFFT_SAMP / (cmetaa.IF_AZSS * cmetaa.IF_AZFFT_TOT)) cmplx_weight = cmetaa.CMPLX_WEIGHT if cmplx_weight == 'UWT': the_sicd.Grid.Row.WgtType = WgtTypeType(WindowName='UNIFORM') the_sicd.Grid.Col.WgtType = WgtTypeType(WindowName='UNIFORM') elif cmplx_weight == 'HMW': the_sicd.Grid.Row.WgtType = WgtTypeType(WindowName='HAMMING') the_sicd.Grid.Col.WgtType = WgtTypeType(WindowName='HAMMING') elif cmplx_weight == 'HNW': the_sicd.Grid.Row.WgtType = WgtTypeType(WindowName='HANNING') the_sicd.Grid.Col.WgtType = WgtTypeType(WindowName='HANNING') elif cmplx_weight == 'TAY': the_sicd.Grid.Row.WgtType = WgtTypeType( WindowName='TAYLOR', Parameters={ 'SLL': '{0:0.16G}'.format(-cmetaa.CMPLX_RNG_SLL), 'NBAR': '{0:0.16G}'.format(cmetaa.CMPLX_RNG_TAY_NBAR) }) the_sicd.Grid.Col.WgtType = WgtTypeType( WindowName='TAYLOR', Parameters={ 'SLL': '{0:0.16G}'.format(-cmetaa.CMPLX_AZ_SLL), 'NBAR': '{0:0.16G}'.format(cmetaa.CMPLX_AZ_TAY_NBAR) }) the_sicd.Grid.Row.define_weight_function() the_sicd.Grid.Col.define_weight_function() # noinspection PyBroadException try: date_str = cmetaa.T_UTC_YYYYMMMDD time_str = cmetaa.T_HHMMSSUTC date_time = '{}-{}-{}T{}:{}:{}Z'.format( date_str[:4], date_str[4:6], date_str[6:8], time_str[:2], time_str[2:4], time_str[4:6]) the_sicd.Timeline.CollectStart = numpy.datetime64(date_time, 'us') except: pass the_sicd.Timeline.CollectDuration = cmetaa.WF_CDP the_sicd.Timeline.IPP = [ IPPSetType(TStart=0, TEnd=cmetaa.WF_CDP, IPPStart=0, IPPEnd=numpy.floor(cmetaa.WF_CDP * cmetaa.WF_PRF), IPPPoly=[0, cmetaa.WF_PRF]) ] the_sicd.RadarCollection.TxFrequency = TxFrequencyType( Min=cmetaa.WF_SRTFR, Max=cmetaa.WF_ENDFR) the_sicd.RadarCollection.TxPolarization = cmetaa.POL_TR.upper() the_sicd.RadarCollection.Waveform = [ WaveformParametersType(TxPulseLength=cmetaa.WF_WIDTH, TxRFBandwidth=cmetaa.WF_BW, TxFreqStart=cmetaa.WF_SRTFR, TxFMRate=cmetaa.WF_CHRPRT * 1e12) ] tx_rcv_pol = '{}:{}'.format(cmetaa.POL_TR.upper(), cmetaa.POL_RE.upper()) the_sicd.RadarCollection.RcvChannels = [ ChanParametersType(TxRcvPolarization=tx_rcv_pol) ] the_sicd.ImageFormation.TxRcvPolarizationProc = tx_rcv_pol if_process = cmetaa.IF_PROCESS if if_process == 'PF': the_sicd.ImageFormation.ImageFormAlgo = 'PFA' scp_ecf = the_sicd.GeoData.SCP.ECF.get_array() fpn_ned = numpy.array( [cmetaa.CG_FPNUV_X, cmetaa.CG_FPNUV_Y, cmetaa.CG_FPNUV_Z], dtype='float64') ipn_ned = numpy.array( [cmetaa.CG_IDPNUVX, cmetaa.CG_IDPNUVY, cmetaa.CG_IDPNUVZ], dtype='float64') fpn_ecf = ned_to_ecf(fpn_ned, scp_ecf, absolute_coords=False) ipn_ecf = ned_to_ecf(ipn_ned, scp_ecf, absolute_coords=False) the_sicd.PFA = PFAType(FPN=fpn_ecf, IPN=ipn_ecf) elif if_process in ['RM', 'CD']: the_sicd.ImageFormation.ImageFormAlgo = 'RMA' # the remainder of this is guesswork to define required fields the_sicd.ImageFormation.TStartProc = 0 # guess work the_sicd.ImageFormation.TEndProc = cmetaa.WF_CDP the_sicd.ImageFormation.TxFrequencyProc = TxFrequencyProcType( MinProc=cmetaa.WF_SRTFR, MaxProc=cmetaa.WF_ENDFR) # all remaining guess work the_sicd.ImageFormation.STBeamComp = 'NO' the_sicd.ImageFormation.ImageBeamComp = 'SV' if cmetaa.IF_BEAM_COMP[ 0] == 'Y' else 'NO' the_sicd.ImageFormation.AzAutofocus = 'NO' if cmetaa.AF_TYPE[ 0] == 'N' else 'SV' the_sicd.ImageFormation.RgAutofocus = 'NO'