Пример #1
0
    def plot_ground_deltat(self, ax=None):
        if ax is None:
            ax = plt.gca()
        plt.sca(ax)
        t = [d.time for d in self.digitization_list if np.isfinite(d.ground)]
        d = [d.ground for d in self.digitization_list if np.isfinite(d.ground)]
        dnew = []
        for time, delay in zip(t, d):
            mex_pos = mex.iau_mars_position(float(time))
            alt = np.sqrt(np.sum(mex_pos * mex_pos)) - mex.mars_mean_radius_km
            dnew.append( (delay - alt * 2. / ais_code.speed_of_light_kms) * 1.0E3)
        plt.plot(t, dnew)

        celsius.ylabel(r'$\Delta\tau_D$ / ms')
Пример #2
0
    def set_orbit(self, orbit, strict=True):
        orbit = int(orbit)
        print('-----------------\nSetting orbit = %d' % orbit)
        # Now the "science"
        successfully = False
        attempts = 0
        while not successfully:
            new_ionogram_list = []
            try:
                new_ionogram_list = ais.read_ais(orbit)
                new_orbit = orbit
                break
            except IOError as e:
                print('No data available for orbit %d' % orbit)
            if strict or attempts > 10:
                raise mex.MEXException("Orbit not found - no data, missing file, or some other bollocks.")
            orbit = orbit - (self.orbit - orbit) / abs(self.orbit - orbit)
            attempts = attempts + 1

        self.ionogram_list = new_ionogram_list
        self.orbit = new_orbit

        new_data = []

        for i in self.ionogram_list:
            i.interpolate_frequencies()

        # for i in range(len(self.ionogram_list) - 2):
        #     if i == 0: continue
        #     new_data.append( np.mean(
        #         np.dstack([ig.data for ig in self.ionogram_list[i:i+2]]), 2))
        # if new_data:
        #     for i in range(len(new_data)):
        #         self.ionogram_list[i].data = new_data[i]


        # If the user specified one, load it, else get the default for the orbit
        if self.load:
            if self._initial_digitization_db:
                self.digitization_db = DigitizationDB(
                            filename=self._initial_digitization_db, verbose=True)
            else:
                self.digitization_db = DigitizationDB(orbit=self.orbit)
            self._digitization_saved = True
        else:
            self.digitization_db = DigitizationDB(load=False)
            self._digitization_saved = False
        # Now we do some processing, generate a data cube for the orbit
        # and generate the timeseries
        self.ionogram_list[0].interpolate_frequencies()
        no_linear_frequencies = self.ionogram_list[0].data.shape[1]
        self.extent = (self.ionogram_list[0].time, self.ionogram_list[-1].time,
                        min(self.ionogram_list[0].frequencies) / 1.0E6,
                        max(self.ionogram_list[0].frequencies) / 1.0E6)
        no_ionograms_expected = ((self.extent[1] - self.extent[0])
                                                        / ais.ais_spacing_seconds + 1)
        no_ionograms_expected = int(round(no_ionograms_expected))
        self.tser_arr_all = np.empty((ais.ais_number_of_delays, no_linear_frequencies,
            no_ionograms_expected))

        if self.debug:
            print('Creating data cube (filling empties)')
            print('Expected number of ionograms = %d, found = %d' % (
                no_ionograms_expected,len(self.ionogram_list)))
        ilast = None
        empty_count = 0
        for i, ig in enumerate(self.ionogram_list):
            ignum = int( round((ig.time - self.extent[0]) / ais.ais_spacing_seconds ))
            if ignum > no_ionograms_expected:
                raise mex.MEXException("Out of range %d, %d, %d"
                    % (len(self.ionogram_list), ignum, no_ionograms_expected))

            ig.interpolate_frequencies()
            self.tser_arr_all[:,:,ignum] = ig.data
            if ilast is not None:
                if (ignum != (ilast + 1)):
                    empty_count += 1
                    self.tser_arr_all[:,:,ilast+1:ignum-1] = -9E99
            ilast = ignum

        if empty_count:
            print('Found %d empty ionograms / missing data' % empty_count)

        # Hold the update for now
        self.set_ionogram(self.ionogram_list[0], update=False)

        errs = np.geterr()
        np.seterr(divide='ignore')
        self.tser_arr = np.log10(np.mean(self.tser_arr_all[::-1,:, :], axis=0))
        self.tser_arr_all = np.log10(self.tser_arr_all)
        np.seterr(**errs)

        # Trajectory info
        self.trajectory = {}
        self.trajectory['t'] = np.arange(self.extent[0], self.extent[1], 60.)
        pos = mex.iau_mars_position(self.trajectory['t'])
        self.trajectory['pos'] = pos / mex.mars_mean_radius_km

        self.message("Set orbit to %d" % self.orbit)

        self.status = None
        self.update()
        return self