Exemple #1
0
 def test_dec2dms(self):
     self.assertEqual(dms_ex, dec2dms(dec_ex))
     self.assertEqual(-dms_ex, dec2dms(-dec_ex))
Exemple #2
0
def reducesetup(obslist, strict=False, zerodist=False, meanmulti=False):
    """
    Takes a list of Observations from one setup and
    means together FL, FR pairs of Observations.
    :param obslist: List of Observations (i.e. from one InstSetup)
    :param strict: If True, all single-face Obs are ignored. If False, all
    single-face Obs are included and converted to Face Left
    :param zerodist: If True, Obs with Slope Distance of Zero are included.
    If False, these are ignored
    :param meanmulti: If True, multiple rounds of observations are reduced
    to a single FL-sense Observation
    :return: a reduced list of Observations
    """
    # Remove obs with sd_obs == 0
    if not zerodist:
        for ob in obslist:
            if ob.sd_obs == 0:
                obslist.remove(ob)

    # Group obs numbers by to_id
    uniqueto = []
    for ob in obslist:
        uniqueto.append(ob.to_id)
    uniqueto = list(set(uniqueto))
    # Sort Obs by to_id and face
    meanedobs = []
    for unique_id in uniqueto:
        fl_list = []
        fr_list = []
        for ob in obslist:
            if ob.to_id == unique_id and ob.face == 'FL':
                fl_list.append(ob)
            elif ob.to_id == unique_id and ob.face == 'FR':
                fr_list.append(ob)
            elif ob.to_id != unique_id and (ob.face == 'FL' or ob.face == 'FR'):
                pass
            else:
                raise ValueError('Invalid Face')
        obsdict = {unique_id: {'FL': fl_list, 'FR': fr_list}}

        # Group Obs into FL, FR pairs and mean (Remove all non-paired obs)
        if strict:
            for key in obsdict:
                pairedlist = list(zip(obsdict[key]['FL'], obsdict[key]['FR']))
                for pair in pairedlist:
                    meanob = meanfaces(pair[0], pair[1])
                    meanedobs.append(meanob)
        # Group Obs into FL, FR pairs and mean (Keep all non-paired obs)
        elif not strict:
            for key in obsdict:
                pairedlist = list(itertools.zip_longest(obsdict[key]['FL'], obsdict[key]['FR'], fillvalue=None))
                for pair in pairedlist:
                    meanob = meanfaces(pair[0], pair[1])
                    meanedobs.append(meanob)
    # Mean multiple repeated measurements into a single FL observation
    if meanmulti:
        multiob = []
        to_ids = set([i.to_id for i in meanedobs])
        for id in to_ids:
            matchedobs = []
            for ob in meanedobs:
                if ob.to_id == id:
                    matchedobs.append(ob)
            ob1 = matchedobs[0]
            repeat_hz = [ob.hz_obs.dec() for ob in matchedobs]
            repeat_hz = sorted(repeat_hz)
            repeat_va = [ob.va_obs.dec() for ob in matchedobs]
            repeat_sd = [ob.sd_obs for ob in matchedobs]
            # Finds where Horizontal Obseravtions are either side of 360, converts those on 360 side to negative
            hz_diff = [j - i for i, j in zip(repeat_hz[:-1], repeat_hz[1:])]
            bigjump = 1e100
            for num, i in enumerate(hz_diff):
                if i > 180:
                    bigjump = num
            for num, ob in enumerate(repeat_hz):
                if num > bigjump:
                    repeat_hz[num] = repeat_hz[num] - 360
            # Mean Repeated Observations
            mean_hz = mean(repeat_hz)
            if mean_hz < 0:
                mean_hz += 360
            mean_va = mean(repeat_va)
            mean_sd = mean(repeat_sd)
            # Compute Standard Deviations for Observations
            if len(repeat_hz) > 2:
                hz_stdev = stdev(repeat_hz)
            else:
                hz_stdev = 0.0
            if len(repeat_va) > 2:
                va_stdev = stdev(repeat_va)
            else:
                va_stdev = 0.0
            if len(repeat_sd) > 2:
                sd_stdev = stdev(repeat_sd)
            else:
                sd_stdev = 0.0
            # Compute number of rounds of observations completed
            sum_rounds = 0
            for ob in matchedobs:
                sum_rounds += ob.rounds
            # Output Meaned Observation
            multiob.append(Observation(ob1.from_id,
                                       id,
                                       ob1.inst_height,
                                       ob1.target_height,
                                       ob1.face,
                                       sum_rounds,
                                       dec2dms(mean_hz),
                                       dd2sec(hz_stdev),
                                       dec2dms(mean_va),
                                       dd2sec(va_stdev),
                                       mean_sd,
                                       sd_stdev))
        meanedobs = multiob
    # Order list of meaned obs
    sorted_meanedobs = sorted(meanedobs, key=operator.attrgetter('hz_obs'))
    return sorted_meanedobs