Esempio n. 1
0
def top_down_SolarSystem(discoveries,
                         inner_limit=6,      # truncate at 8 AU to show that we don't have sensitivity in close
                         extent=83,          # extend to 83 AU as indicative only, sensitivity is to ~300 AU
                         plot_discoveries=None,
                         plot_colossos=False,
                         plot_blocks=None,
                         plot_galaxy=False,
                         feature_blocks=None,
                         plot_Ijiraq=False,  # detected Ijiraq at 9.80 AU in the 13AE block
                         label_blocks=True,
                         savefilename=None):
    """
    Plot the OSSOS discoveries on a top-down Solar System showing the position of Neptune and model TNOs.
    Discoveries are plotted each at their time of discovery according to the value in the Version Release.
    Coordinates should be polar to account for RA hours, radial axis is in AU.
    :return: a saved plot

    This is not a 'projection' of the particles into any common plane.  Each wedge is a different latitude above
    the plane, but inside each wedge it is heliocentric distance vs RA.
     That is fine.  It's just important to know that if someone asks we know this is NOT (for example) a projection of each
    object down into the ecliptic.
     A very minor future long-term improvement is that the galactic
    plane wedge is not (I don't think) symmetric around 18h and 6h.
    I think that lines of constant (say 15 degree galactic lat) are
    centered a little off (I think the wedge would 'twist' a little
    bit counter-clockwise).  I am not absolutely sure along the
    ecliptic where the b= +/- 15 degree lines are but I don't
    think they are symmetric?
    """
    fig = plt.figure(figsize=(6, 6))
    rect = [0.01, 0.01, 0.95, .95]  # the plot occupies not all the figspace

    ax1 = fig.add_axes(rect, polar=True, frameon=False)  # theta (RA) is zero at E, increases anticlockwise
    ax1.set_aspect('equal')

    ax1.set_rlim(0, extent)
    ax1.set_rgrids([20, 40, 60, 80], labels=["", "", '20 au', '40 au', '60 au', '80 au'], angle=190, alpha=0.45)  # angle = 308
    ax1.yaxis.set_major_locator(MultipleLocator(20))
    ax1.xaxis.set_major_locator(MultipleLocator(math.radians(15)))  # every 2 hours
    ax1.grid(axis='x', color='k', linestyle='--', alpha=0.2)
    ax1.set_xticklabels(['', '0h', "", '2h', "", '4h', "", '6h', "", '8h', "", '10h', "", '12h', "", '14h', "", '16h',
                         "", '18h', "", '20h', "", '22h', "", ],
                        # ""])  # str(r)+'h' for r in range(-1,24)],
                        #        ['', '0h', '2h', '4h', '6h', '8h', '10h', '12h', '14h', '16h', '18h', '20h', '22h'],
                        color='b', alpha=0.6)  # otherwise they get in the way


    if plot_galaxy:
        # plot exclusion zones due to Galactic plane: RAs indicate where bar starts, rather than its centre angle
        width = math.radians(3 * 15)
        plt.bar(math.radians(4.5 * 15), extent, width=width, color=plot_fanciness.ALMOST_BLACK, linewidth=0, alpha=0.2)
        plt.bar(math.radians(16.5 * 15), extent, width=width, color=plot_fanciness.ALMOST_BLACK, linewidth=0, alpha=0.2)
        ax1.annotate('galactic plane', (math.radians(6.9 * 15), extent - 15), size=10, color='k', alpha=0.45)
        ax1.annotate('  galactic plane\navoidance zone', (math.radians(16.9 * 15), extent - 12), size=10, color='k', alpha=0.45)

    # again RAs indicate where bar starts, so subtract half the block width from the block centrepoints
    # and approximate blocks as math.radians(7) degrees wide.

    for blockname, block in list(parameters.BLOCKS.items()):
        if plot_blocks:
            if blockname in plot_blocks:
                if feature_blocks is not None and blockname in feature_blocks:
                    colour = 'm' #'#E47833'
                    alpha = 0.25
                else:
                    colour = 'b'
                    alpha = 0.1
                # if blockname.startswith('13') or blockname.startswith('14'):
                    width = math.radians(7) # the 3 x 7 field layout
                # else:
                #     width = math.radians(5) # the 4 x 5 field layout

                # cmap = plt.get_cmap('Blues')
                # if blockname.endswith('AO'):
                #     colour = '#E47833'
                #     alpha = 0.17
                #     cmap = plt.get_cmap('Oranges')  # colorbrewer.sequential.Oranges_3.mpl_colors

                ax1.bar(ephem.hours(block["RA"]) - math.radians(3.5), extent, linewidth=0.1,
                        width=width, bottom=inner_limit, zorder=0, color=colour, alpha=alpha)
                if label_blocks:
                    ax1.annotate(blockname[3], (ephem.hours(block["RA"]) + math.radians(0.36), extent - 3.), size=15,
                                 color='b')

    # No optional on these just yet
    plot_planets_plus_Pluto(ax1)
    ra, dist, hlat, Hmag = parsers.synthetic_model_kbos(kbotype='resonant', arrays=True, maglimit=24.7)
    # can't plot Hmag as marker size in current setup.
    ax1.scatter(ra, dist, marker='o', s=2, facecolor=plot_fanciness.ALMOST_BLACK,
                edgecolor=plot_fanciness.ALMOST_BLACK, linewidth=0.1, alpha=0.12, zorder=1)

    if plot_discoveries is not None:
        plot_ossos_discoveries(ax1, discoveries, plot_discoveries, plot_colossos=plot_colossos)

    # special detection in 13AE: Saturn's moon Ijiraq at 2013-04-09 shows inner limit of sensitivity.
    if plot_Ijiraq:
        # Position from Horizons as it's excluded from the list of detections
        ax1.scatter(ephem.hours('14 29 46.57'), 9.805,
                    marker='o', s=4, facecolor='b', edgecolor=plot_fanciness.ALMOST_BLACK, linewidth=0.15, alpha=0.8)

    plt.draw()
    if savefilename is not None:
        outfile = '{}.pdf'.format(savefilename)
    else:
        outfile = 'topdown_RA_d_OSSOS_v{}.pdf'.format(parameters.RELEASE_VERSION)
    plt.savefig(outfile, transparent=True, bbox_inches='tight')

    return
Esempio n. 2
0
def plot_synthetic_kbos(ax, coverage):
    ra, dec, hlat, Hmag = parsers.synthetic_model_kbos(kbotype='resonant', arrays=True, maglimit=24.7)
    ax.scatter(ra, dec, c='k', marker='.', s=1, alpha=0.8)

    return ax
Esempio n. 3
0
def plot_synthetic_kbos(ax, coverage):
    ra, dec, hlat, Hmag = parsers.synthetic_model_kbos(kbotype='resonant', arrays=True, maglimit=24.7)
    ax.scatter(ra, dec, c='k', marker='.', s=1, alpha=0.8)

    return ax