Ejemplo n.º 1
0
 def get_radar_collection():
     # type: () -> RadarCollectionType
     tx_pols = []
     chan_params = []
     for i, bdname in enumerate(band_dict):
         if 'Polarisation' in band_dict[bdname]:
             pol = band_dict[bdname]['Polarisation']
         elif 'Polarization' in h5_dict:
             pol = h5_dict['Polarization']
         else:
             raise ValueError(
                 'Failed finding polarization for file {}\nmission id {}'
                 .format(self._file_name, self._mission_id))
         tx_pols.append(pol[0])
         chan_params.append(
             ChanParametersType(TxRcvPolarization=self._parse_pol(pol),
                                index=i))
     if len(tx_pols) == 1:
         return RadarCollectionType(RcvChannels=chan_params,
                                    TxPolarization=tx_pols[0])
     else:
         return RadarCollectionType(RcvChannels=chan_params,
                                    TxPolarization='SEQUENCE',
                                    TxSequence=[
                                        TxStepType(TxPolarization=pol,
                                                   index=i + 1)
                                        for i, pol in enumerate(tx_pols)
                                    ])
Ejemplo n.º 2
0
        def get_radar_collection():
            # type: () -> RadarCollectionType
            tx_pols = []
            chan_params = []

            if self.mission_id == 'CSG' and len(band_dict) == 1 and \
                    h5_dict['Acquisition Mode'].upper() == 'QUADPOL':
                # it seems like 2nd generation files only contain one polarization
                pols = ['HH', 'HV', 'VH', 'VV']
                tx_pols.extend([pol[0] for pol in pols])
                chan_params.extend([
                    ChanParametersType(TxRcvPolarization=self._parse_pol(pol),
                                       index=i + 1)
                    for i, pol in enumerate(pols)
                ])
            else:
                for i, bdname in enumerate(band_dict):
                    pol = self._get_polarization(h5_dict, band_dict, bdname)
                    tx_pols.append(pol[0])
                    chan_params.append(
                        ChanParametersType(
                            TxRcvPolarization=self._parse_pol(pol),
                            index=i + 1))

            if len(tx_pols) == 1:
                return RadarCollectionType(RcvChannels=chan_params,
                                           TxPolarization=tx_pols[0])
            else:
                return RadarCollectionType(RcvChannels=chan_params,
                                           TxPolarization='SEQUENCE',
                                           TxSequence=[
                                               TxStepType(TxPolarization=pol,
                                                          index=i + 1)
                                               for i, pol in enumerate(tx_pols)
                                           ])
Ejemplo n.º 3
0
Archivo: csk.py Proyecto: LordHui/sarpy
 def get_radar_collection():
     # type: () -> RadarCollectionType
     tx_pols = []
     chan_params = []
     for i, bdname in enumerate(band_dict):
         pol = band_dict[bdname]['Polarisation']
         tx_pols.append(pol[0])
         chan_params.append(ChanParametersType(TxRcvPolarization=self._parse_pol(pol), index=i))
     if len(tx_pols) == 1:
         return RadarCollectionType(RcvChannels=chan_params, TxPolarization=tx_pols[0])
     else:
         return RadarCollectionType(RcvChannels=chan_params,
                                    TxPolarization='SEQUENCE',
                                    TxSequence=[TxStepType(TxPolarization=pol,
                                                           index=i+1) for i, pol in enumerate(tx_pols)])
Ejemplo n.º 4
0
        def define_radar_collection():
            tx_rcv_pol_t = []
            tx_pol = []
            for entry in pols:
                tx_rcv_pol_t.append('{}:{}'.format(entry[0], entry[1]))
                if entry[0] not in tx_pol:
                    tx_pol.append(entry[0])
            center_freq_t = gp['acquiredCenterFrequency'][()]
            bw = gp['acquiredRangeBandwidth'][()]
            tx_freq = TxFrequencyType(Min=center_freq_t - 0.5 * bw,
                                      Max=center_freq_t + 0.5 * bw)
            rcv_chans = [
                ChanParametersType(TxRcvPolarization=pol)
                for pol in tx_rcv_pol_t
            ]
            if len(tx_pol) == 1:
                tx_sequence = None
                tx_pol = tx_pol[0]
            else:
                tx_sequence = [
                    TxStepType(WFIndex=j + 1, TxPolarization=pol)
                    for j, pol in enumerate(tx_pol)
                ]
                tx_pol = 'SEQUENCE'

            t_sicd.RadarCollection = RadarCollectionType(
                TxFrequency=tx_freq,
                RcvChannels=rcv_chans,
                TxPolarization=tx_pol,
                TxSequence=tx_sequence)
            return tx_rcv_pol_t
Ejemplo n.º 5
0
    def _get_radar_collection(self):
        """
        Gets the RadarCollection.

        Returns
        -------
        RadarCollectionType
        """
        radar_params = self._get_radar_params()
        center_freq = self._get_center_frequency()
        # Ultrafine and spotlight modes have t pulses, otherwise just one.
        bandwidth_elements = sorted(radar_params.findall('pulseBandwidth'),
                                    key=lambda x: x.get('pulse'))
        pulse_length_elements = sorted(radar_params.findall('pulseLength'),
                                       key=lambda x: x.get('pulse'))
        adc_elements = sorted(radar_params.findall('adcSamplingRate'),
                              key=lambda x: x.get('pulse'))
        samples_per_echo = float(radar_params.find('samplesPerEchoLine').text)
        wf_params = []
        bandwidths = numpy.empty((len(bandwidth_elements), ),
                                 dtype=numpy.float64)
        for i, (bwe, ple, adce) in enumerate(
                zip(bandwidth_elements, pulse_length_elements, adc_elements)):
            bandwidths[i] = float(bwe.text)
            samp_rate = float(adce.text)
            wf_params.append(
                WaveformParametersType(index=i,
                                       TxRFBandwidth=float(bwe.text),
                                       TxPulseLength=float(ple.text),
                                       ADCSampleRate=samp_rate,
                                       RcvWindowLength=samples_per_echo /
                                       samp_rate,
                                       RcvDemodType='CHIRP',
                                       RcvFMRate=0))
        tot_bw = numpy.sum(bandwidths)
        tx_freq = TxFrequencyType(Min=center_freq - 0.5 * tot_bw,
                                  Max=center_freq + 0.5 * tot_bw)
        radar_collection = RadarCollectionType(TxFrequency=tx_freq,
                                               Waveform=wf_params)
        radar_collection.Waveform[0].TxFreqStart = tx_freq.Min
        for i in range(1, len(bandwidth_elements)):
            radar_collection.Waveform[i].TxFreqStart = radar_collection.Waveform[i-1].TxFreqStart + \
                                                       radar_collection.Waveform[i-1].TxRFBandwidth
        tx_pols, tx_rcv_polarizations = self._get_polarizations(
            radar_params=radar_params)
        radar_collection.RcvChannels = [
            ChanParametersType(TxRcvPolarization=entry, index=i)
            for i, entry in enumerate(tx_rcv_polarizations)
        ]
        if len(tx_pols) == 1:
            radar_collection.TxPolarization = tx_pols[0]
        else:
            radar_collection.TxPolarization = 'SEQUENCE'
            radar_collection.TxSequence = [
                TxStepType(TxPolarization=entry, index=i)
                for i, entry in enumerate(tx_pols)
            ]
        return radar_collection
Ejemplo n.º 6
0
 def get_radar_collection():
     # type : () -> RadarCollection
     return RadarCollectionType(
         TxPolarization=tx_pol,
         TxFrequency=(min_freq, max_freq),
         Waveform=[WaveformParametersType(TxFreqStart=min_freq,
                                          TxRFBandwidth=tx_bandwidth,
                                          TxPulseLength=hf['chirp_duration'][()],
                                          ADCSampleRate=hf['range_sampling_rate'][()],
                                          RcvDemodType='CHIRP',
                                          RcvFMRate=0,
                                          index=1)],
         RcvChannels=[ChanParametersType(TxRcvPolarization=polarization,
                                         index=1)])
Ejemplo n.º 7
0
        def get_radar_colection():
            # type: () -> RadarCollectionType

            radar = collect['radar']
            freq_min = fc - 0.5*bw
            return RadarCollectionType(
                TxPolarization=radar['transmit_polarization'],
                TxFrequency=TxFrequencyType(Min=freq_min, Max=freq_min + bw),
                Waveform=[WaveformParametersType(
                    TxRFBandwidth=bw,
                    TxPulseLength=radar['pulse_duration'],
                    RcvDemodType='CHIRP',
                    ADCSampleRate=radar['sampling_frequency'],
                    TxFreqStart=freq_min)],
                RcvChannels=[ChanParametersType(
                    TxRcvPolarization='{}:{}'.format(radar['transmit_polarization'],
                                                     radar['receive_polarization']))])
Ejemplo n.º 8
0
    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'
Ejemplo n.º 9
0
    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'