def read_mex_orbits(fname): """docstring for read_mex_orbits""" # 11 2004 JAN 11 02:23:03 1/0021867775.48376 2004 JAN 11 07:24:05 238.65 -11.59 270.18 -2.24 274.35 86.64 0.717 228.71 357.75 222497088.5 12965.68 utc_date = np.dtype([('Year','int'), ('MonthStr','a',3), ('Day','int'),('Time','a',8)]) print('Reading %s ... ' % fname, end=' ') orbit_list = celsius.OrbitDict() lines = 0 with open(fname) as f: f.readline() f.readline() for line in f.readlines(): try: parts = line.lstrip().split(' ') n = int(parts[0]) tmp = celsius.Orbit( n, celsius.utcstr_to_spiceet(parts[4]), celsius.utcstr_to_spiceet(parts[1]), name='MEX') orbit_list[n] = tmp lines += 1 except Exception as e: if 'Unable to determine' in parts[4]: break else: raise for k in orbit_list: if k > 1: orbit_list[k].start = orbit_list[k-1].apoapsis else: orbit_list[k].start = orbit_list[k].periapsis - 1.0 orbit_list[k].finish = orbit_list[k].apoapsis print(' Read %d lines' % lines) return orbit_list
def plot_aspera_els(start, finish=None, verbose=False, ax=None, colorbar=True, vmin=None, vmax=None, cmap=None, safe=True): """docstring for plot_aspera_els""" if cmap is None: cmap = plt.cm.Spectral_r if ax is None: ax = plt.gca() plt.sca(ax) if finish is None: finish = start + 86400. if vmin is None: vmin = 5. if vmax is None: vmax = 9. no_days = (finish - start) / 86400. if verbose: print('Plotting ASPERA/ELS between %s and %s...' % (celsius.utcstr(start, 'ISOC'), celsius.utcstr(finish, 'ISOC'))) directory = mex.data_directory + 'aspera/els/' all_files_to_read = [] for et in np.arange(start - 10., finish + 10., 86400.): dt = celsius.spiceet_to_datetime(et) f_name = directory + 'MEX_ELS_EFLUX_%4d%02d%02d_*.cef' % (dt.year, dt.month, dt.day) all_day_files = glob.glob(f_name) if not all_day_files: if verbose: print("No files matched %s" % f_name) else: all_files_to_read.extend(all_day_files) success = False all_extents = [] for f_name in all_files_to_read: try: # Find energy bins: with open(f_name, 'r') as f: line_no = 0 while line_no < 43: line_no += 1 line = f.readline() if 'DATA = ' in line: energy_bins = np.fromstring(line[7:], sep=',') energy_bins.sort() break else: raise IOError("No ENERGY_BINS info found in header") data = np.loadtxt(f_name, skiprows = 43, converters={1:lambda x: celsius.utcstr_to_spiceet(x[:-1])}) if data.shape[1] != (energy_bins.shape[0] + 2): raise ValueError("Size of ENERGY_BINS and DATA doesn't match") # Check timing: dt = np.diff(data[:,1]) spacing = np.median(dt) # checks = abs(dt - spacing) > (spacing/100.) # if np.any(checks): # # raise ValueError("Spacing is not constant: %d differ by more than 1%% of %f:" % (np.sum(checks), spacing)) # print "Spacing is not constant: %d differ by more than 1%% of %f (Maximum = %f):" % (np.sum(checks), spacing, max(abs(dt - spacing))) # # if safe and (max(abs(dt - spacing)) > 10.): # print '-- To big spacing - dumping' # continue # Interpolate to constant spacing: n_records = int((data[-1,1] - data[0,1]) / spacing) new_data = np.empty((n_records, data.shape[1])) + np.nan new_data[:,1] = np.linspace(data[0,1], data[-1,1], n_records) for i in range(3, data.shape[1]): new_data[:,i] = np.interp(new_data[:,1],data[:,1], data[:,i], left=np.nan, right=np.nan) data = new_data extent = (data[0,1], data[-1,1], energy_bins[0], energy_bins[-1]) if (extent[0] > finish) or (extent[1] < start): if verbose: print("This block not within plot range - dumping") continue all_extents.append(extent) if verbose: print('Plotting ASPERA ELS block, Time: %s - %s, Energy: %f - %f' % ( celsius.utcstr(extent[0],'ISOC'), celsius.utcstr(extent[1],'ISOC'), extent[2], extent[3])) print('Shape = ', data.shape) plt.imshow(np.log10(data[:,3:].T), interpolation="nearest", aspect='auto', extent=extent, vmin=vmin, vmax=vmax, cmap=cmap) success = True except IOError as e: if verbose: print('Error reading %f' % f_name) print('--', e) continue if success and colorbar: plt.xlim(start, finish) plt.ylim(max([e[2] for e in all_extents]), min([e[3] for e in all_extents])) celsius.ylabel('E / eV') plt.yscale('log') cmap.set_under('w') old_ax = plt.gca() plt.colorbar(cax=celsius.make_colorbar_cax(), cmap=cmap, ticks=[5,6,7,8,9]) plt.ylabel(r'log$_{10}$ D.E.F.') plt.sca(old_ax)