def _get_timeline(self): """ Gets the Timeline metadata. Returns ------- TimelineType """ timeline = TimelineType(CollectStart=self._get_start_time()) pulse_parts = len( self._findall('./sourceAttributes/radarParameters/pulseBandwidth')) tx_pols, tx_rcv_polarizations = self._get_polarizations() if self.generation == 'RS2': pulse_rep_freq = float( self._find('./sourceAttributes' '/radarParameters' '/pulseRepetitionFrequency').text) elif self.generation == 'RCM': pulse_rep_freq = float( self._find('./sourceAttributes' '/radarParameters' '/prfInformation' '/pulseRepetitionFrequency').text) else: raise ValueError('unhandled generation {}'.format(self.generation)) pulse_rep_freq *= pulse_parts if pulse_parts == 2 and self._get_radar_mode().ModeType == 'STRIPMAP': # it's not completely clear why we need an additional factor of 2 for strip map 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
def get_timeline(): # type: () -> TimelineType # NB: IPPEnd must be set, but will be replaced return TimelineType( CollectStart=collect_start, CollectDuration=duration, IPP=[IPPSetType(index=0, TStart=0, TEnd=duration, IPPStart=0, IPPEnd=0), ])
def set_collect_start(collect_start: Union[str, datetime, numpy.datetime64], override: bool = False) -> None: if the_sicd.Timeline is None: the_sicd.Timeline = TimelineType(CollectStart=collect_start) elif the_sicd.Timeline.CollectStart is None or override: the_sicd.Timeline.CollectStart = collect_start
def get_timeline(): # type: () -> TimelineType acq_prf = hf['acquisition_prf'][()] return TimelineType( CollectStart=start_time, CollectDuration=duration, IPP=[IPPSetType(index=0, TStart=0, TEnd=duration, IPPStart=0, IPPEnd=int_func(round(acq_prf*duration)), IPPPoly=[0, acq_prf]), ])
def get_timeline() -> TimelineType: prf = radar['prf'][0]['prf'] return TimelineType(CollectStart=start_time, CollectDuration=duration, IPP=[ IPPSetType(TStart=0, TEnd=duration, IPPStart=0, IPPEnd=duration * prf, IPPPoly=(0, prf)), ])
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 set_collect_start(collect_start, override=False): if the_sicd.Timeline is None: the_sicd.Timeline = TimelineType(CollectStart=collect_start) elif the_sicd.Timeline.CollectStart is None or override: the_sicd.Timeline.CollectStart = collect_start
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'