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')
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