def make_pub_scatter_plots(limits, df, angle_label, ax_array=[],
                                symbol='o', i_color=0):

    if len(ax_array) == 0:
        fig = plt.figure(figsize=(3, 5))
        gs = gridspec.GridSpec(2, 1, left=0.1, right=0.9, wspace=0, hspace=0)
        ax_array = [plt.subplot(gs[0]), plt.subplot(gs[1])]

    ax = ax_array[0]
    x = 'zeta'
    y = 'epsilon'
    limit_patch('zeta2', 'epsilon2', limits, ax, b1=2)
    limit_patch('zeta1', 'epsilon1', limits, ax, b1=1)
    ax.plot(df[x], df[y], symbol, mec=gwp.qual_color(i_color),
            mfc='none')
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y])
    plt_format(ax)
    ax.tick_params(labelbottom='off')# ,  labeltop='on', labelright='on')

    ax = ax_array[1]
    x = 'zeta'
    y = 'alpha'
    limit_patch('zeta2', 'alpha', limits, ax, b1=2)
    limit_patch('zeta1', 'alpha', limits, ax, b1=1)
    ax.plot(df[x][0:-1], df[y][1:], symbol, mec=gwp.qual_color(i_color),
            mfc='none')
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y] + ' + 1')
    plt_format(ax)

    return ax_array
def compare_average_in_range(dcd_files, MD=True, show=False):

    fig = plt.figure(figsize=(6, 4))
    gs1 = gridspec.GridSpec(1,
                            1,
                            left=0.075,
                            right=0.75,
                            wspace=0.1,
                            hspace=0,
                            top=0.95)
    ax1 = plt.subplot(gs1[:, 0])
    labels = [
        r'$\delta\theta=60$', r'$\delta\theta=50$', r'$\delta\theta=40$',
        r'$\delta\theta=30$', r'$\delta\theta=20$', r'$\delta\theta=10$',
        r'$\delta\theta=5$', r'$\delta\theta=1$'
    ]

    plt.axhline(95, ls='--', c='DimGray', linewidth=2)
    all_in_range = []
    max_steps = []
    min_steps = []
    for (i, dcd_file) in enumerate(dcd_files):
        all_in_range_file = os.path.join(
            os.path.split(dcd_file)[0], 'average_in_range')
        if MD:
            all_in_range_file += '_MD'
        all_in_range.append(np.loadtxt(all_in_range_file + '.out'))
        max_steps.append(all_in_range[i][-1, 0])
        min_steps.append(all_in_range[i][0, 0])

        ax1.plot(all_in_range[i][:, 0],
                 all_in_range[i][:, 1] * 100,
                 '-',
                 c=gwp.qual_color(i),
                 label=labels[i])

    ax1.set_xscale('log')
    x_min = min(min_steps)
    x_max = min(max_steps)
    ax1.set_xlim([x_min, x_max])
    ax1.set_ylim([73, 102])

    ax1.set_ylabel(r'% in Range')
    ax1.set_xlabel(r'Minimization Iterations')
    default_fontsize = 12
    lg = plt.legend(loc='lower left',
                    scatterpoints=1,
                    numpoints=1,
                    prop={'size': default_fontsize})
    lg.draw_frame(False)
    if show:
        plt.show()
    else:
        save_name = '/home/schowell/data/myData/dihedrals/dsDNA_60bps/average_in_range'
        if MD:
            save_name += '_MD'
        plt.savefig(save_name + '.eps', dpi=400, bbox_inches='tight')
        plt.savefig(save_name + '.png', dpi=400, bbox_inches='tight')
        print 'View figure: \nevince %s.eps &' % save_name
def plot_aez_dihedrals(dcd_files, key, max_frame=None, scale_spb=1,
                       used_goback=False, show=False, prefix=None):
    angle_vs_steps = []
    for dcd_file_name in dcd_files:
        if max_frame:
            npy_file = dcd_file_name[:-4] + '_%d.npy' % max_frame
        else:
            npy_file = dcd_file_name[:-3] + 'npy'

        angle_vs_steps.append(np.load(npy_file))
        print 'loaded percent of good angles file: %s' % npy_file


    fig = plt.figure(figsize=(6.5, 10))
    gs1 = gridspec.GridSpec(3, 1, left=0.1, right=0.75, wspace=0, hspace=0)
    angle_labels = ['alpha', 'beta', 'gamma', 'delta', 'epsilon', 'zeta', 'chi']
    plot_order = [1, 5, 6]  # only plot alpha, beta, and gamma
    default_fontsize = 12
    for (i, i_angle) in enumerate(plot_order):
        ax1 = plt.subplot(gs1[i])
        x_max = []
        for j in xrange(len(dcd_files)):
            ax1.plot(angle_vs_steps[j][:, 0], angle_vs_steps[j][:, i_angle], '-',
                     c=gwp.qual_color(j), label=key[j])
            x_max.append(angle_vs_steps[j][-1, 0])

        ax1.set_ylim([0, 1.1])
        ax1.set_ylabel(r'% in range')
        ax1.set_xlim([0, min(x_max)])
        if i < len(plot_order) - 1:
            ax1.xaxis.set_ticklabels([])
            # ax1.xaxis.set_ticks([])
        else:
            ax1.set_xlabel(r'steps per bp')
        if i == 0:
            lg = plt.legend(loc='upper left', bbox_to_anchor=(1, 1),
                            scatterpoints=1, numpoints=1,
                            prop={'size': default_fontsize})
        ax1.set_title(angle_labels[i_angle-1], y=0.05)

    if show:
        plt.show()
    else:
        save_name = 'dsDNA_60bps/moved_in_range'
        if prefix:
            save_name = save_name + '_' + prefix
        if max_frame:
            save_name += '_' + str(max_frame)
        plt.savefig(save_name + '.eps', dpi=400, bbox_inches='tight')
        plt.savefig(save_name + '.png', dpi=400, bbox_inches='tight')
        print 'saved figures to %s.eps and %s.png' % (save_name, save_name)
    print 'done plotting'
def make_pub_scatter_plots(limits,
                           df,
                           angle_label,
                           ax_array=[],
                           symbol='o',
                           i_color=0):

    if len(ax_array) == 0:
        fig = plt.figure(figsize=(3, 5))
        gs = gridspec.GridSpec(2, 1, left=0.1, right=0.9, wspace=0, hspace=0)
        ax_array = [plt.subplot(gs[0]), plt.subplot(gs[1])]

    ax = ax_array[0]
    x = 'zeta'
    y = 'epsilon'
    limit_patch('zeta2', 'epsilon2', limits, ax, b1=2)
    limit_patch('zeta1', 'epsilon1', limits, ax, b1=1)
    ax.plot(df[x], df[y], symbol, mec=gwp.qual_color(i_color), mfc='none')
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y])
    plt_format(ax)
    ax.tick_params(labelbottom='off')  # ,  labeltop='on', labelright='on')

    ax = ax_array[1]
    x = 'zeta'
    y = 'alpha'
    limit_patch('zeta2', 'alpha', limits, ax, b1=2)
    limit_patch('zeta1', 'alpha', limits, ax, b1=1)
    ax.plot(df[x][0:-1],
            df[y][1:],
            symbol,
            mec=gwp.qual_color(i_color),
            mfc='none')
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y] + ' + 1')
    plt_format(ax)

    return ax_array
def compare_average_in_range(dcd_files, MD=True, show=False):

    fig = plt.figure(figsize=(6, 4))
    gs1 = gridspec.GridSpec(1, 1, left=0.075, right=0.75, wspace=0.1,
                            hspace=0, top=0.95)
    ax1 = plt.subplot(gs1[:, 0])
    labels = [r'$\delta\theta=60$', r'$\delta\theta=50$', r'$\delta\theta=40$',
              r'$\delta\theta=30$', r'$\delta\theta=20$', r'$\delta\theta=10$',
              r'$\delta\theta=5$', r'$\delta\theta=1$']

    plt.axhline(95, ls='--', c='DimGray', linewidth=2)
    all_in_range = []
    max_steps = []
    min_steps = []
    for (i, dcd_file) in enumerate(dcd_files):
        all_in_range_file = os.path.join(os.path.split(dcd_file)[0],
                                    'average_in_range')
        if MD:
            all_in_range_file += '_MD'
        all_in_range.append(np.loadtxt(all_in_range_file + '.out'))
        max_steps.append(all_in_range[i][-1, 0])
        min_steps.append(all_in_range[i][0, 0])

        ax1.plot(all_in_range[i][:, 0], all_in_range[i][:, 1]*100, '-',
                 c=gwp.qual_color(i), label=labels[i])

    ax1.set_xscale('log')
    x_min = min(min_steps)
    x_max = min(max_steps)
    ax1.set_xlim([x_min, x_max])
    ax1.set_ylim([73, 102])

    ax1.set_ylabel(r'% in Range')
    ax1.set_xlabel(r'Minimization Iterations')
    default_fontsize = 12
    lg = plt.legend(loc='lower left', scatterpoints=1, numpoints=1,
                    prop={'size': default_fontsize})
    lg.draw_frame(False)
    if show:
        plt.show()
    else:
        save_name = '/home/schowell/data/myData/dihedrals/dsDNA_60bps/average_in_range'
        if MD:
            save_name += '_MD'
        plt.savefig(save_name + '.eps', dpi=400, bbox_inches='tight')
        plt.savefig(save_name + '.png', dpi=400, bbox_inches='tight')
        print 'View figure: \nevince %s.eps &' % save_name
Example #6
0
def show_ncp_geometry(all_ncp_plot_vars):
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    import x_dna.util.gw_plot as gwp

    fig = plt.figure(figsize=(10, 6))
    ax = fig.add_subplot(111, projection='3d')
    n_ncps = len(all_ncp_plot_vars)

    axis_mag = [90, 130]
    i = 0

    all_origins = [all_ncp_plot_vars[i].ncp_origin for i in xrange(n_ncps)]
    all_origins = np.array(all_origins)

    ncp_colors = [gwp.qual_color(0), gwp.qual_color(6),
                  gwp.qual_color(8), gwp.qual_color(2)]
    axes_colors = [gwp.qual_color(9), gwp.qual_color(1)]
    limits = []
    for i in xrange(n_ncps):
        ncp_origin = all_ncp_plot_vars[i].ncp_origin
        ncp_axes = all_ncp_plot_vars[i].ncp_axes
        # NCP axes
        labels = ['Cylinder Axes', 'Dyad Axes']
        for (j, axis) in enumerate(ncp_axes[[2, 0]]):
            axes_vec = np.vstack((axis * (-axis_mag[j] / 2) + ncp_origin,
                                  axis * (axis_mag[j] / 2) + ncp_origin))
            limits.append(axes_vec)
            if i == 0:
                ax.plot(axes_vec[:, 0], axes_vec[:, 1], axes_vec[:, 2],
                        c=axes_colors[j], label=labels[j], linewidth=3)
                ncp1_o = all_ncp_plot_vars[i].ncp_origin
                if j == 1:
                    ncp2_o = all_ncp_plot_vars[i + 2].ncp_origin
                    stack_axis = ncp2_o - ncp1_o
                    stack_axis = stack_axis / \
                        np.sqrt(stack_axis.dot(stack_axis))
                    stack_vec = np.vstack((stack_axis * (-axis_mag[1] / 2) + ncp1_o,
                                           stack_axis * (axis_mag[1] / 2) + ncp2_o))
                    limits.append(stack_vec)
                    ax.plot(stack_vec[:, 0], stack_vec[:, 1], stack_vec[:, 2],
                            c=gwp.qual_color(4), linewidth=3, label='Stack Axes')
                    ax.plot(all_origins[:, 0], all_origins[:, 1],
                            all_origins[:, 2], linewidth=2, c=gwp.qual_color(3),
                            label='Center-to-Center Segments')
            else:
                ax.plot(axes_vec[:, 0], axes_vec[:, 1], axes_vec[:, 2],
                        c=axes_colors[j], linewidth=3)

    center = np.array(all_origins).mean(axis=0)
    ax.plot([center[0]], [center[1]], [center[2]], marker='*',
            c=gwp.qual_color(7), ms=10, label='Array Center', linestyle='None')

    for i in xrange(n_ncps):
        coor = all_ncp_plot_vars[i].coor
        # plot the coordinates the cylinder was fit to
        coor_label = "NCP %d" % (i + 1)
        ax.plot(coor[:, 0], coor[:, 1], coor[:, 2], 'k', linewidth=5)
        ax.plot(coor[:, 0], coor[:, 1], coor[:, 2], c=ncp_colors[i], linewidth=4,
                label=coor_label)

    i = 1
    ncp1_o = all_ncp_plot_vars[i].ncp_origin
    ncp2_o = all_ncp_plot_vars[i + 2].ncp_origin
    stack_axis = ncp2_o - ncp1_o
    stack_axis = stack_axis / np.sqrt(stack_axis.dot(stack_axis))
    stack_vec = np.vstack((stack_axis * (-axis_mag[0] / 2) + ncp1_o,
                           stack_axis * (axis_mag[0] / 2) + ncp2_o))
    limits.append(stack_vec)
    ax.plot(stack_vec[:, 0], stack_vec[:, 1], stack_vec[:, 2],
            c=gwp.qual_color(4), linewidth=3)

    limits = np.array(limits).reshape(len(limits) * 2, 3)
    extent = (limits.max(axis=0) - limits.min(axis=0)).max() / 2
    ax.set_xlim([center[0] - extent, center[0] + extent])
    ax.set_ylim([center[1] - extent, center[1] + extent])
    ax.set_zlim([center[2] - extent, center[2] + extent])
    # DO NOT RESIZE THE IMAGE: it messes up the scale

    # Shrink current axis by 40% so the legend is visible
    box = ax.get_position()
    ax.set_position([box.x0, box.y0, box.width * 0.7, box.height])

    # Put a legend
    ax.set_axis_off()
    # plt.title('Nucleosome Array Geometry Definitions')

    lg = plt.legend(loc='upper left', numpoints=1, bbox_to_anchor=(1, 0.5))
    lg.draw_frame(False)
    plt.show()
    return
Example #7
0
def show_ncp_geometry(all_ncp_plot_vars):
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    import x_dna.util.gw_plot as gwp

    fig = plt.figure(figsize=(10, 6))
    ax = fig.add_subplot(111, projection='3d')
    n_ncps = len(all_ncp_plot_vars)

    axis_mag = [90, 130]
    i = 0

    all_origins = [all_ncp_plot_vars[i].ncp_origin for i in xrange(n_ncps)]
    all_origins = np.array(all_origins)

    ncp_colors = [
        gwp.qual_color(0),
        gwp.qual_color(6),
        gwp.qual_color(8),
        gwp.qual_color(2)
    ]
    axes_colors = [gwp.qual_color(9), gwp.qual_color(1)]
    limits = []
    for i in xrange(n_ncps):
        ncp_origin = all_ncp_plot_vars[i].ncp_origin
        ncp_axes = all_ncp_plot_vars[i].ncp_axes
        # NCP axes
        labels = ['Cylinder Axes', 'Dyad Axes']
        for (j, axis) in enumerate(ncp_axes[[2, 0]]):
            axes_vec = np.vstack((axis * (-axis_mag[j] / 2) + ncp_origin,
                                  axis * (axis_mag[j] / 2) + ncp_origin))
            limits.append(axes_vec)
            if i == 0:
                ax.plot(axes_vec[:, 0],
                        axes_vec[:, 1],
                        axes_vec[:, 2],
                        c=axes_colors[j],
                        label=labels[j],
                        linewidth=3)
                ncp1_o = all_ncp_plot_vars[i].ncp_origin
                if j == 1:
                    ncp2_o = all_ncp_plot_vars[i + 2].ncp_origin
                    stack_axis = ncp2_o - ncp1_o
                    stack_axis = stack_axis / \
                        np.sqrt(stack_axis.dot(stack_axis))
                    stack_vec = np.vstack(
                        (stack_axis * (-axis_mag[1] / 2) + ncp1_o,
                         stack_axis * (axis_mag[1] / 2) + ncp2_o))
                    limits.append(stack_vec)
                    ax.plot(stack_vec[:, 0],
                            stack_vec[:, 1],
                            stack_vec[:, 2],
                            c=gwp.qual_color(4),
                            linewidth=3,
                            label='Stack Axes')
                    ax.plot(all_origins[:, 0],
                            all_origins[:, 1],
                            all_origins[:, 2],
                            linewidth=2,
                            c=gwp.qual_color(3),
                            label='Center-to-Center Segments')
            else:
                ax.plot(axes_vec[:, 0],
                        axes_vec[:, 1],
                        axes_vec[:, 2],
                        c=axes_colors[j],
                        linewidth=3)

    center = np.array(all_origins).mean(axis=0)
    ax.plot([center[0]], [center[1]], [center[2]],
            marker='*',
            c=gwp.qual_color(7),
            ms=10,
            label='Array Center',
            linestyle='None')

    for i in xrange(n_ncps):
        coor = all_ncp_plot_vars[i].coor
        # plot the coordinates the cylinder was fit to
        coor_label = "NCP %d" % (i + 1)
        ax.plot(coor[:, 0], coor[:, 1], coor[:, 2], 'k', linewidth=5)
        ax.plot(coor[:, 0],
                coor[:, 1],
                coor[:, 2],
                c=ncp_colors[i],
                linewidth=4,
                label=coor_label)

    i = 1
    ncp1_o = all_ncp_plot_vars[i].ncp_origin
    ncp2_o = all_ncp_plot_vars[i + 2].ncp_origin
    stack_axis = ncp2_o - ncp1_o
    stack_axis = stack_axis / np.sqrt(stack_axis.dot(stack_axis))
    stack_vec = np.vstack((stack_axis * (-axis_mag[0] / 2) + ncp1_o,
                           stack_axis * (axis_mag[0] / 2) + ncp2_o))
    limits.append(stack_vec)
    ax.plot(stack_vec[:, 0],
            stack_vec[:, 1],
            stack_vec[:, 2],
            c=gwp.qual_color(4),
            linewidth=3)

    limits = np.array(limits).reshape(len(limits) * 2, 3)
    extent = (limits.max(axis=0) - limits.min(axis=0)).max() / 2
    ax.set_xlim([center[0] - extent, center[0] + extent])
    ax.set_ylim([center[1] - extent, center[1] + extent])
    ax.set_zlim([center[2] - extent, center[2] + extent])
    # DO NOT RESIZE THE IMAGE: it messes up the scale

    # Shrink current axis by 40% so the legend is visible
    box = ax.get_position()
    ax.set_position([box.x0, box.y0, box.width * 0.7, box.height])

    # Put a legend
    ax.set_axis_off()
    # plt.title('Nucleosome Array Geometry Definitions')

    lg = plt.legend(loc='upper left', numpoints=1, bbox_to_anchor=(1, 0.5))
    lg.draw_frame(False)
    plt.show()
    return
def make_selected_scatter_plots(limits, df, angle_label, ax_array=[],
                                symbol='x', i_color=0):

    if len(ax_array) == 0:
        fig, ax_array = plt.subplots(3, 3)

    ax = ax_array[0, 0]
    x = 'zeta'
    y = 'alpha'
    limit_patch('zeta1', 'alpha', limits, ax)
    limit_patch('zeta2', 'alpha', limits, ax)
    ax.plot(df[x][0:-1], df[y][1:], symbol, c=gwp.qual_color(i_color))
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y] + ' + 1')
    plt_format(ax)
    ax.tick_params(labelbottom='off') # , labeltop='on')

    ax = ax_array[0, 1]
    x = 'zeta'
    y = 'beta'
    limit_patch('zeta1', 'beta1', limits, ax)
    limit_patch('zeta1', 'beta2', limits, ax)
    limit_patch('zeta2', 'beta1', limits, ax)
    limit_patch('zeta2', 'beta2', limits, ax)
    ax.plot(df[x][0:-1], df[y][1:], symbol, c=gwp.qual_color(i_color))
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y] + ' + 1')
    plt_format(ax)
    ax.tick_params(labelleft='off', labelbottom='off') # , labeltop='on')

    ax = ax_array[0, 2]
    x = 'zeta'
    y = 'epsilon'
    limit_patch('zeta1', 'epsilon1', limits, ax)
    limit_patch('zeta2', 'epsilon2', limits, ax)
    ax.plot(df[x], df[y], symbol, c=gwp.qual_color(i_color))
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y])
    plt_format(ax)
    ax.tick_params(
        labelleft='off', labelbottom='off')# ,  labeltop='on', labelright='on')

    ax = ax_array[1, 0]
    x = 'alpha'
    y = 'gamma'
    limit_patch('alpha', 'gamma', limits, ax)
    ax.plot(df[x], df[y], symbol, c=gwp.qual_color(i_color))
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y])
    plt_format(ax)
    ax.tick_params(labelbottom='off')

    ax = ax_array[1, 1]
    x = 'zeta'
    y = 'chi'
    limit_patch('zeta1', 'chi1pu', limits, ax)
    limit_patch('zeta1', 'chi1py', limits, ax)
    limit_patch('zeta2', 'chi2', limits, ax)
    ax.plot(df[x], df[y],  symbol, c=gwp.qual_color(i_color))
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y])
    plt_format(ax)
    ax.tick_params(labelleft='off', labelbottom='off')

    ax = ax_array[1, 2]
    x = 'delta'
    y = 'chi'
    limit_patch('delta1', 'chi1pu', limits, ax)
    limit_patch('delta1', 'chi1py', limits, ax)
    limit_patch('delta2', 'chi2', limits, ax)
    ax.plot(df[x], df[y],  symbol, c=gwp.qual_color(i_color))
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y])
    plt_format(ax)
    # , labelright='on')
    ax.tick_params(labelleft='off', labelbottom='off')

    ax = ax_array[2, 0]
    x = 'zeta'
    y = 'zeta'
    limit_patch('zeta1', 'zeta1', limits, ax)
    limit_patch('zeta1', 'zeta2', limits, ax)
    limit_patch('zeta2', 'zeta1', limits, ax)
    # limit_patch('zeta2', 'zeta2', limits, ax)
    ax.plot(df[x][:-1], df[y][1:],  symbol, c=gwp.qual_color(i_color))
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y] + ' + 1')
    plt_format(ax)

    ax = ax_array[2, 1]
    x = 'epsilon'
    y = 'epsilon'
    limit_patch('epsilon1', 'epsilon1', limits, ax)
    limit_patch('epsilon1', 'epsilon2', limits, ax)
    limit_patch('epsilon2', 'epsilon1', limits, ax)
    # limit_patch('epsilon2', 'epsilon2', limits, ax)
    ax.plot(df[x][:-1], df[y][1:],  symbol, c=gwp.qual_color(i_color))
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y] + ' + 1')
    plt_format(ax)
    ax.tick_params(labelleft='off')

    ax = ax_array[2, 2]
    x = 'zeta'
    y = 'delta'
    limit_patch('zeta1', 'delta1', limits, ax)
    limit_patch('zeta2', 'delta2', limits, ax)
    ax.plot(df[x], df[y],  symbol, c=gwp.qual_color(i_color))
    ax.tick_params(labelleft='off')  # , labelright='on')
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y])
    plt_format(ax)

    return ax_array
def compare_min_dihedrals(raw_dcd_files, min_dcd_files, key, max_frame=None,
                       scale_spb=1, used_goback=False, show=False, prefix=None):
    raw_angle_vs_steps = []
    min_angle_vs_steps = []
    raw_all_in_range = []
    min_all_in_range = []

    for dcd_file_name in min_dcd_files:
        if max_frame:
            npy_file = dcd_file_name[:-4] + '_%d.npy' % max_frame
        else:
            npy_file = dcd_file_name[:-3] + 'npy'

        all_in_range_file = dcd_file_name[:-4] + '_ave_in_range'
        try:
            if 'MD' in prefix:
                npy_file = npy_file.replace('.npy', '_MD.npy')
                all_in_range_file += '_MD'
        except:
            pass

        min_angle_vs_steps.append(np.load(npy_file))
        min_all_in_range.append(np.loadtxt(all_in_range_file + '.out'))
        print 'loaded percent in range files: \n%s \n%s' % (npy_file,
                                                            all_in_range_file)

    for dcd_file_name in raw_dcd_files:
        if max_frame:
            npy_file = dcd_file_name[:-4] + '_%d.npy' % max_frame
        else:
            npy_file = dcd_file_name[:-3] + 'npy'

        all_in_range_file = dcd_file_name[:-4] + '_ave_in_range'
        try:
            if 'MD' in prefix:
                npy_file = npy_file.replace('.npy', '_MD.npy')
                all_in_range_file += '_MD'
        except:
            pass

        raw_angle_vs_steps.append(np.load(npy_file))
        raw_all_in_range.append(np.loadtxt(all_in_range_file + '.out'))
        print 'loaded percent in range files: \n%s \n%s' % (npy_file,
                                                            all_in_range_file)

    fig = plt.figure(figsize=(5, 12))
    gs = gridspec.GridSpec(8, 2, left=0.1, right=0.75, wspace=0.07, hspace=0)
    angle_labels = [r'$\alpha$', r'$\beta$', r'$\gamma$', r'$\delta$',
                    r'$\epsilon$', r'$\zeta$', r'$\chi$', r'All']
    plot_order = [0, 2, 3, 4, 7, 1, 5, 6] # change to show select angles
    default_fontsize = 12

    def plot_settings(ax, x_min, x_max):
        ax.set_ylim([71, 104])
        ax.set_xscale('log')
        ax.set_xlim([min(x_min), min(x_max)])

    for (i, i_angle) in enumerate(plot_order):
        ax = plt.subplot(gs[i, 0])
        plt.axhline(95, ls='--', c='DimGray', linewidth=2)
        x_max = []
        x_min = []
        for j in xrange(len(raw_dcd_files)):
            if i_angle == 0:
                ax.plot(raw_all_in_range[j][:, 0],
                         raw_all_in_range[j][:, 1]*100, '-',
                         c=gwp.qual_color(j), label=key[j])
                x_max.append(raw_all_in_range[j][-1, 0])
                x_min.append(raw_all_in_range[j][0, 0])
                ax.text(18, 107, 'Raw')
            else:
                ax.plot(raw_angle_vs_steps[j][:, 0],
                         raw_angle_vs_steps[j][:, i_angle]*100, '-',
                         c=gwp.qual_color(j), label=key[j])
                x_max.append(raw_angle_vs_steps[j][-1, 0])
                x_min.append(raw_angle_vs_steps[j][0, 0])
        plot_settings(ax, x_min, x_max)
        ax.set_ylabel(r'% in range')
        if i < len(plot_order) - 1:
            ax.xaxis.set_ticklabels([])
            # ax1.xaxis.set_ticks([])
        else:
            ax.set_xlabel(r'steps per bp')
        ax.set_title(angle_labels[i_angle-1], y=0.03, x=0.12)

    for (i, i_angle) in enumerate(plot_order):
        ax = plt.subplot(gs[i, 1])
        plt.axhline(95, ls='--', c='DimGray', linewidth=2)
        for j in xrange(len(min_dcd_files)):
            if i_angle == 0:
                ax.plot(min_all_in_range[j][:, 0],
                         min_all_in_range[j][:, 1]*100, '-',
                         c=gwp.qual_color(j), label=key[j])
                ax.text(9, 107, 'Minimized')
            else:
                ax.plot(min_angle_vs_steps[j][:, 0],
                         min_angle_vs_steps[j][:, i_angle]*100, '-',
                         c=gwp.qual_color(j), label=key[j])
        plot_settings(ax, x_min, x_max)
        ax.yaxis.set_ticklabels([])
        if i < len(plot_order) - 1:
            ax.xaxis.set_ticklabels([])
            # ax1.xaxis.set_ticks([])
        else:
            ax.set_xlabel(r'steps per bp')
        ax.set_title(angle_labels[i_angle-1], y=0.03, x=0.12)

        if i == 0:
            lg = plt.legend(loc='upper left', bbox_to_anchor=(1, 1),
                            scatterpoints=1, numpoints=1,
                            prop={'size': default_fontsize})

    path = 'dsDNA_60bps/'
    save_name = 'raw_min_percent_in_range'
    if prefix:
        save_name = prefix + '_' + save_name
    if max_frame:
        save_name += '_' + str(max_frame)
    plt.savefig(path + save_name + '.eps', dpi=400, bbox_inches='tight')
    plt.savefig(path + save_name + '.png', dpi=400, bbox_inches='tight')
    print 'saved figures to %s.eps and %s.png' % (save_name, save_name)
    if show:
        plt.show()

    print 'done plotting'
def make_selected_scatter_plots(limits,
                                df,
                                angle_label,
                                ax_array=[],
                                symbol='x',
                                i_color=0):

    if len(ax_array) == 0:
        fig, ax_array = plt.subplots(3, 3)

    ax = ax_array[0, 0]
    x = 'zeta'
    y = 'alpha'
    limit_patch('zeta1', 'alpha', limits, ax, b1=1)
    limit_patch('zeta2', 'alpha', limits, ax, b1=2)
    ax.plot(df[x][0:-1], df[y][1:], symbol, c=gwp.qual_color(i_color))
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y] + ' + 1')
    plt_format(ax)
    ax.tick_params(labelbottom='off')  # , labeltop='on')

    ax = ax_array[0, 1]
    x = 'zeta'
    y = 'beta'
    limit_patch('zeta1', 'beta1', limits, ax, b1=1)
    limit_patch('zeta1', 'beta2', limits, ax, b1=3)
    limit_patch('zeta2', 'beta1', limits, ax, b1=3)
    limit_patch('zeta2', 'beta2', limits, ax, b1=2)
    ax.plot(df[x][0:-1], df[y][1:], symbol, c=gwp.qual_color(i_color))
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y] + ' + 1')
    plt_format(ax)
    ax.tick_params(labelleft='off', labelbottom='off')  # , labeltop='on')

    ax = ax_array[0, 2]
    x = 'zeta'
    y = 'epsilon'
    limit_patch('zeta1', 'epsilon1', limits, ax, b1=1)
    limit_patch('zeta2', 'epsilon2', limits, ax, b1=2)
    ax.plot(df[x], df[y], symbol, c=gwp.qual_color(i_color))
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y])
    plt_format(ax)
    ax.tick_params(labelleft='off',
                   labelbottom='off')  # ,  labeltop='on', labelright='on')

    ax = ax_array[1, 0]
    x = 'alpha'
    y = 'gamma'
    limit_patch('alpha', 'gamma', limits, ax, b1=1)
    ax.plot(df[x], df[y], symbol, c=gwp.qual_color(i_color))
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y])
    plt_format(ax)
    ax.tick_params(labelbottom='off')

    ax = ax_array[1, 1]
    x = 'zeta'
    y = 'chi'
    limit_patch('zeta1', 'chi1pu', limits, ax, b1=1)
    limit_patch('zeta1', 'chi1py', limits, ax, b1=1)
    limit_patch('zeta2', 'chi2', limits, ax, b1=2)
    ax.plot(df[x], df[y], symbol, c=gwp.qual_color(i_color))
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y])
    plt_format(ax)
    ax.tick_params(labelleft='off', labelbottom='off')

    ax = ax_array[1, 2]
    x = 'delta'
    y = 'chi'
    limit_patch('delta1', 'chi1pu', limits, ax, b1=1)
    limit_patch('delta1', 'chi1py', limits, ax, b1=1)
    limit_patch('delta2', 'chi2', limits, ax, b1=2)
    ax.plot(df[x], df[y], symbol, c=gwp.qual_color(i_color))
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y])
    plt_format(ax)
    # , labelright='on')
    ax.tick_params(labelleft='off', labelbottom='off')

    ax = ax_array[2, 0]
    x = 'zeta'
    y = 'zeta'
    limit_patch('zeta1', 'zeta1', limits, ax, b1=1)
    limit_patch('zeta1', 'zeta2', limits, ax, b1=3)
    limit_patch('zeta2', 'zeta1', limits, ax, b1=3)
    # limit_patch('zeta2', 'zeta2', limits, ax, b1=True)
    ax.plot(df[x][:-1], df[y][1:], symbol, c=gwp.qual_color(i_color))
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y] + ' + 1')
    plt_format(ax)

    ax = ax_array[2, 1]
    x = 'epsilon'
    y = 'epsilon'
    limit_patch('epsilon1', 'epsilon1', limits, ax, b1=1)
    limit_patch('epsilon1', 'epsilon2', limits, ax, b1=3)
    limit_patch('epsilon2', 'epsilon1', limits, ax, b1=3)
    # limit_patch('epsilon2', 'epsilon2', limits, ax, b1=True)
    ax.plot(df[x][:-1], df[y][1:], symbol, c=gwp.qual_color(i_color))
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y] + ' + 1')
    plt_format(ax)
    ax.tick_params(labelleft='off')

    ax = ax_array[2, 2]
    x = 'zeta'
    y = 'delta'
    limit_patch('zeta1', 'delta1', limits, ax, b1=True)
    limit_patch('zeta2', 'delta2', limits, ax, b1=True)
    ax.plot(df[x], df[y], symbol, c=gwp.qual_color(i_color))
    ax.tick_params(labelleft='off')  # , labelright='on')
    ax.set_xlabel(angle_label[x])
    ax.set_ylabel(angle_label[y])
    plt_format(ax)

    return ax_array
def plot_good_dihedrals(dcd_file_name,
                        max_frame=None,
                        scale_spb=1,
                        used_goback=False,
                        show=False,
                        MD=True):
    if MD:
        if max_frame:
            npy_file = dcd_file_name[:-4] + '_MD_%d.npy' % max_frame
        else:
            npy_file = dcd_file_name[:-4] + '_MD.npy'
    else:
        if max_frame:
            npy_file = dcd_file_name[:-4] + '_%d.npy' % max_frame
        else:
            npy_file = dcd_file_name[:-4] + '.npy'

    try:
        angle_vs_steps = np.load(npy_file)
        print 'loaded percent of good angles file: %s' % npy_file

    except:
        print 'failed to load percent of good angles file: %s' % npy_file

        angles = pd.read_hdf(dcd_file_name[:-3] + 'hdf', 'angles')
        angles['-90'] = np.abs(-90 - (angles['epsilon'] - angles['zeta']))
        angles['+90'] = np.abs(90 - (angles['epsilon'] - angles['zeta']))
        angles['min'] = angles.loc[:, ['+90', '-90']].min(axis=1)
        angles['B-type'] = 'B'
        angles.loc[angles['min'] == angles['+90'], 'B-type'] = 'BII'
        angles.loc[angles['min'] == angles['-90'], 'B-type'] = 'BI'

        try:
            scale_spb == 1  # enforce there is not a scale
            all_spb = np.loadtxt(dcd_file_name[:-3] + 'spb')
            print('loaded steps/bead file: %s' % (dcd_file_name[:-3] + 'spb'))

        except:
            print(
                'failed to load steps/bead file: %s \n'
                'using %f step/s between frames' %
                (dcd_file_name[:-3] + 'spb', scale_spb))
            all_spb = np.unique(angles['frame'])
            all_spb = all_spb.reshape(len(all_spb), 1)
            all_spb = np.concatenate((all_spb, all_spb * scale_spb), axis=1)

        if max_frame:
            nf = max_frame
        else:
            nf = len(all_spb)
        spb, indices = np.unique(all_spb[:nf, 1], return_inverse=True)
        n_steps = len(spb)

        angle_vs_steps = np.zeros((n_steps, 8))  # 7 angles
        angle_vs_steps[:, 0] = spb

        if MD:
            limit_file = ('/home/schowell/data/myData/dihedrals/'
                          'dsDNA_60bps/md_angles.txt')
        else:
            limit_file = ('/home/schowell/data/myData/dihedrals/'
                          'dsDNA_60bps/dna_angles.txt')
        limits = pd.read_csv(limit_file, index_col=0)
        limits['low'] = limits['mean'] - 2 * limits['sd']
        limits['high'] = limits['mean'] + 2 * limits['sd']

        for (i, steps) in enumerate(spb):
            if used_goback:
                df, _ = get_step_i_dihedrals(i, indices, angles)
            else:
                df = angles[angles['frame'] == i + 1]

            beta_good = sum(((df['beta'] > limits.loc['beta1']['low'])
                             & (df['beta'] < limits.loc['beta1']['high'])
                             & (df['B-type'] == 'BI'))
                            | ((df['beta'] > limits.loc['beta2']['low'])
                               & (df['beta'] < limits.loc['beta2']['high'])
                               & (df['B-type'] == 'BII')))
            n_beta = df['beta'].notnull().sum() * 1.0
            angle_vs_steps[i, 2] = beta_good / n_beta

            gamma_good = sum((df['gamma'] > limits.loc['gamma']['low'])
                             & (df['gamma'] < limits.loc['gamma']['high']))
            n_gamma = df['gamma'].notnull().sum() * 1.0
            angle_vs_steps[i, 3] = gamma_good / n_gamma

            delta_good = sum(((df['delta'] > limits.loc['delta1']['low'])
                              & (df['delta'] < limits.loc['delta1']['high'])
                              & (df['B-type'] == 'BI'))
                             | ((df['delta'] > limits.loc['delta2']['low'])
                                & (df['delta'] < limits.loc['delta2']['high'])
                                & (df['B-type'] == 'BII')))
            n_delta = df['delta'].notnull().sum() * 1.0
            angle_vs_steps[i, 4] = delta_good / n_delta

            chi_good = sum((((df['resname'] == 'C') | (df['resname'] == 'T'))
                            & (df['chi'] > limits.loc['chi1py']['low'])
                            & (df['chi'] < limits.loc['chi1py']['high'])
                            & (df['B-type'] == 'BI'))
                           | (((df['resname'] == 'G') | (df['resname'] == 'A'))
                              & (df['chi'] > limits.loc['chi1pu']['low'])
                              & (df['chi'] < limits.loc['chi1pu']['high'])
                              & (df['B-type'] == 'BI'))
                           | ((df['chi'] > limits.loc['chi2']['low'])
                              & (df['chi'] < limits.loc['chi2']['high'])
                              & (df['B-type'] == 'BII')))
            n_chi = df['chi'].notnull().sum() * 1.0
            angle_vs_steps[i, 7] = chi_good / n_chi

            alpha_good = sum((df['alpha'] > limits.loc['alpha']['low'])
                             & (df['alpha'] < limits.loc['alpha']['high']))
            n_alpha = df['alpha'].notnull().sum() * 1.0
            angle_vs_steps[i, 1] = alpha_good / n_alpha

            epsilon_good = sum((
                (df['epsilon'] > limits.loc['epsilon1']['low'])
                & (df['epsilon'] < limits.loc['epsilon1']['high'])
                & (df['B-type'] == 'BI')) | (
                    (df['epsilon'] > limits.loc['epsilon2']['low'])
                    & (df['epsilon'] < limits.loc['epsilon2']['high'])
                    & (df['B-type'] == 'BII')))
            n_epsilon = df['epsilon'].notnull().sum() * 1.0
            angle_vs_steps[i, 5] = epsilon_good / n_epsilon

            zeta_good = sum(((df['zeta'] > limits.loc['zeta1']['low'])
                             & (df['zeta'] < limits.loc['zeta1']['high'])
                             & (df['B-type'] == 'BI'))
                            | ((df['zeta'] > limits.loc['zeta2']['low'])
                               & (df['zeta'] < limits.loc['zeta2']['high'])
                               & (df['B-type'] == 'BII')))
            n_zeta = df['zeta'].notnull().sum() * 1.0
            angle_vs_steps[i, 6] = zeta_good / n_zeta

        np.save(npy_file, angle_vs_steps)

    fig = plt.figure()  # figsize=(6, 4))
    gs1 = gridspec.GridSpec(1,
                            1,
                            left=0.075,
                            right=0.75,
                            wspace=0.1,
                            hspace=0,
                            top=0.95)
    ax1 = plt.subplot(gs1[:, 0])
    angle_labels = [
        r'$\alpha$', r'$\beta$', r'$\gamma$', r'$\delta$', r'$\epsilon$',
        r'$\zeta$', r'$\chi$'
    ]
    plot_order = [2, 3, 4, 7, 1, 5, 6]
    # plot_order = [1, 5, 6]
    # plot_order = [2, 3, 4, 7]
    ax1.axhline(95, ls='--', c='DimGray', linewidth=2)
    # label=r'$2\sigma$ cutoff')
    if len(angle_vs_steps) > 2:
        for (c, i_angle) in enumerate(plot_order):
            ax1.plot(angle_vs_steps[:, 0],
                     angle_vs_steps[:, i_angle] * 100,
                     '-',
                     c=gwp.qual_color(c),
                     label=angle_labels[i_angle - 1])
        ax1.set_ylim([73, 102])
        ax1.set_xscale('log')
        x_max = angle_vs_steps[-1, 0]
        x_min = angle_vs_steps[0, 0]
        ax1.set_xlim([x_min, x_max])
    else:
        for (c, i_angle) in enumerate(plot_order):
            ax1.plot(angle_vs_steps[:, 0],
                     angle_vs_steps[:, i_angle] * 100,
                     '-',
                     color=gwp.qual_color(c),
                     marker=gwp.symbol_order(c),
                     mec=gwp.qual_color(c),
                     label=angle_labels[i_angle - 1],
                     markersize=15,
                     mfc='none')
        ax1.set_ylim([-1, 110])

    ax1.set_ylabel(r'% of Dihedrals in $2\sigma$ Range')
    ax1.set_xlabel(r'Minimization Iterations')
    default_fontsize = 12
    lg = plt.legend(loc='lower left',
                    scatterpoints=1,
                    numpoints=1,
                    prop={'size': default_fontsize})
    lg.draw_frame(False)
    if show:
        plt.show()
    else:
        save_name = '%s_in_range' % dcd_file_name[:-4]
        if MD:
            save_name += '_MD'
        if max_frame:
            save_name += '_' + str(max_frame)
        plt.savefig(save_name + '.eps', dpi=400, bbox_inches='tight')
        plt.savefig(save_name + '.png', dpi=400, bbox_inches='tight')
        print 'View figure: \nevince %s.eps &' % save_name

    print 'done plotting'

    all_in_range_file = dcd_file_name[:-4] + '_ave_in_range'
    if MD:
        all_in_range_file += '_MD'
    all_in_range = np.copy(angle_vs_steps[:, :2])
    all_in_range[:, 1] = angle_vs_steps[:, 1:].mean(axis=1)
    np.savetxt(all_in_range_file + '.out', all_in_range)
Example #12
0
def plot_good_dihedrals(dcd_file_name, max_frame=None, scale_spb=1,
                        used_goback=False, show=False, MD=True):
    if MD:
        if max_frame:
            npy_file = dcd_file_name[:-4] + '_MD_%d.npy' % max_frame
        else:
            npy_file = dcd_file_name[:-4] + '_MD.npy'
    else:
        if max_frame:
            npy_file = dcd_file_name[:-4] + '_%d.npy' % max_frame
        else:
            npy_file = dcd_file_name[:-4] + '.npy'

    try:
        angle_vs_steps = np.load(npy_file)
        print 'loaded percent of good angles file: %s' % npy_file

    except:
        print 'failed to load percent of good angles file: %s' % npy_file

        angles = pd.read_hdf(dcd_file_name[:-3] + 'hdf', 'angles')
        angles['-90'] = np.abs(-90 - (angles['epsilon'] - angles['zeta']))
        angles['+90'] = np.abs(90 - (angles['epsilon'] - angles['zeta']))
        angles['min'] = angles.loc[:,['+90', '-90']].min(axis=1)
        angles['B-type'] = 'B'
        angles.loc[angles['min'] == angles['+90'], 'B-type'] = 'BII'
        angles.loc[angles['min'] == angles['-90'], 'B-type'] = 'BI'

        try:
            scale_spb == 1  # enforce there is not a scale
            all_spb = np.loadtxt(dcd_file_name[:-3] + 'spb')
            print ('loaded steps/bead file: %s' %
                   (dcd_file_name[:-3] + 'spb'))

        except:
            print ('failed to load steps/bead file: %s \n'
                   'using %f step/s between frames' %
                   (dcd_file_name[:-3] + 'spb', scale_spb))
            all_spb = np.unique(angles['frame'])
            all_spb = all_spb.reshape(len(all_spb), 1)
            all_spb = np.concatenate((all_spb, all_spb*scale_spb), axis=1)

        if max_frame:
            nf = max_frame
        else:
            nf = len(all_spb)
        spb, indices = np.unique(all_spb[:nf, 1], return_inverse=True)
        n_steps = len(spb)

        angle_vs_steps = np.zeros((n_steps, 8))  # 7 angles
        angle_vs_steps[:, 0] = spb

        if MD:
            limit_file = ('/home/schowell/data/myData/dihedrals/'
                          'dsDNA_60bps/md_angles.txt')
        else:
            limit_file = ('/home/schowell/data/myData/dihedrals/'
                          'dsDNA_60bps/dna_angles.txt')
        limits = pd.read_csv(limit_file, index_col=0)
        limits['low'] = limits['mean'] - 2 * limits['sd']
        limits['high'] = limits['mean'] + 2 * limits['sd']

        for (i, steps) in enumerate(spb):
            if used_goback:
                df, _ = get_step_i_dihedrals(i, indices, angles)
            else:
                df = angles[angles['frame'] == i+1]

            beta_good = sum(
                ((df['beta'] > limits.loc['beta1']['low']) &
                 (df['beta'] < limits.loc['beta1']['high']) &
                 (df['B-type'] == 'BI')) |
                ((df['beta'] > limits.loc['beta2']['low']) &
                 (df['beta'] < limits.loc['beta2']['high']) &
                 (df['B-type'] == 'BII')))
            n_beta = df['beta'].notnull().sum() * 1.0
            angle_vs_steps[i, 2] = beta_good / n_beta

            gamma_good = sum(
                (df['gamma'] > limits.loc['gamma']['low']) &
                (df['gamma'] < limits.loc['gamma']['high']))
            n_gamma = df['gamma'].notnull().sum() * 1.0
            angle_vs_steps[i, 3] = gamma_good / n_gamma

            delta_good = sum(
                ((df['delta'] > limits.loc['delta1']['low']) &
                 (df['delta'] < limits.loc['delta1']['high']) &
                (df['B-type'] == 'BI'))  |
                ((df['delta'] > limits.loc['delta2']['low']) &
                 (df['delta'] < limits.loc['delta2']['high']) &
                 (df['B-type'] == 'BII')))
            n_delta = df['delta'].notnull().sum() * 1.0
            angle_vs_steps[i, 4] = delta_good / n_delta

            chi_good = sum(
                (((df['resname'] == 'C') | (df['resname'] == 'T')) &
                 (df['chi'] > limits.loc['chi1py']['low']) &
                 (df['chi'] < limits.loc['chi1py']['high']) &
                 (df['B-type'] == 'BI'))  |
                (((df['resname'] == 'G') | (df['resname'] == 'A')) &
                 (df['chi'] > limits.loc['chi1pu']['low']) &
                 (df['chi'] < limits.loc['chi1pu']['high']) &
                 (df['B-type'] == 'BI'))  |
                ((df['chi'] > limits.loc['chi2']['low']) &
                 (df['chi'] < limits.loc['chi2']['high']) &
                 (df['B-type'] == 'BII')))
            n_chi = df['chi'].notnull().sum() * 1.0
            angle_vs_steps[i, 7] = chi_good / n_chi

            alpha_good = sum(
                (df['alpha'] > limits.loc['alpha']['low']) &
                (df['alpha'] < limits.loc['alpha']['high']))
            n_alpha = df['alpha'].notnull().sum() * 1.0
            angle_vs_steps[i, 1] = alpha_good / n_alpha

            epsilon_good = sum(
                ((df['epsilon'] > limits.loc['epsilon1']['low']) &
                 (df['epsilon'] < limits.loc['epsilon1']['high']) &
                 (df['B-type'] == 'BI'))  |
                ((df['epsilon'] > limits.loc['epsilon2']['low']) &
                 (df['epsilon'] < limits.loc['epsilon2']['high']) &
                 (df['B-type'] == 'BII')))
            n_epsilon = df['epsilon'].notnull().sum() * 1.0
            angle_vs_steps[i, 5] = epsilon_good / n_epsilon

            zeta_good = sum(
                ((df['zeta'] > limits.loc['zeta1']['low']) &
                 (df['zeta'] < limits.loc['zeta1']['high']) &
                 (df['B-type'] == 'BI'))  |
                ((df['zeta'] > limits.loc['zeta2']['low']) &
                 (df['zeta'] < limits.loc['zeta2']['high']) &
                 (df['B-type'] == 'BII')))
            n_zeta = df['zeta'].notnull().sum() * 1.0
            angle_vs_steps[i, 6] = zeta_good / n_zeta

        np.save(npy_file, angle_vs_steps)

    fig = plt.figure() # figsize=(6, 4))
    gs1 = gridspec.GridSpec(1, 1, left=0.075, right=0.75, wspace=0.1,
                            hspace=0, top=0.95)
    ax1 = plt.subplot(gs1[:, 0])
    angle_labels = [r'$\alpha$', r'$\beta$', r'$\gamma$', r'$\delta$',
                    r'$\epsilon$', r'$\zeta$', r'$\chi$']
    plot_order = [2, 3, 4, 7, 1, 5, 6]
    # plot_order = [1, 5, 6]
    # plot_order = [2, 3, 4, 7]
    ax1.axhline(95, ls='--', c='DimGray', linewidth=2)
             # label=r'$2\sigma$ cutoff')
    if len(angle_vs_steps)>2:
        for (c, i_angle) in enumerate(plot_order):
            ax1.plot(angle_vs_steps[:, 0], angle_vs_steps[:, i_angle]*100, '-',
                     c=gwp.qual_color(c), label=angle_labels[i_angle - 1])
        ax1.set_ylim([73, 102])
        ax1.set_xscale('log')
        x_max = angle_vs_steps[-1, 0]
        x_min = angle_vs_steps[0, 0]
        ax1.set_xlim([x_min, x_max])
    else:
        for (c, i_angle) in enumerate(plot_order):
            ax1.plot(angle_vs_steps[:, 0], angle_vs_steps[:, i_angle]*100, '-',
                     color=gwp.qual_color(c), marker=gwp.symbol_order(c),
                     mec=gwp.qual_color(c), label=angle_labels[i_angle - 1],
                     markersize=15, mfc='none')
        ax1.set_ylim([-1, 110])

    ax1.set_ylabel(r'% of Dihedrals in $2\sigma$ Range')
    ax1.set_xlabel(r'Minimization Iterations')
    default_fontsize = 12
    lg = plt.legend(loc='lower left', scatterpoints=1, numpoints=1,
                    prop={'size': default_fontsize})
    lg.draw_frame(False)
    if show:
        plt.show()
    else:
        save_name = '%s_in_range' % dcd_file_name[:-4]
        if MD:
            save_name += '_MD'
        if max_frame:
            save_name += '_' + str(max_frame)
        plt.savefig(save_name + '.eps', dpi=400, bbox_inches='tight')
        plt.savefig(save_name + '.png', dpi=400, bbox_inches='tight')
        print 'View figure: \nevince %s.eps &' % save_name

    print 'done plotting'

    all_in_range_file = dcd_file_name[:-4] + '_ave_in_range'
    if MD:
        all_in_range_file += '_MD'
    all_in_range = np.copy(angle_vs_steps[:,:2])
    all_in_range[:,1] = angle_vs_steps[:,1:].mean(axis=1)
    np.savetxt(all_in_range_file + '.out', all_in_range)
def plot_aez_dihedrals(dcd_files,
                       key,
                       max_frame=None,
                       scale_spb=1,
                       used_goback=False,
                       show=False,
                       prefix=None):
    angle_vs_steps = []
    for dcd_file_name in dcd_files:
        if max_frame:
            npy_file = dcd_file_name[:-4] + '_%d.npy' % max_frame
        else:
            npy_file = dcd_file_name[:-3] + 'npy'

        angle_vs_steps.append(np.load(npy_file))
        print 'loaded percent of good angles file: %s' % npy_file

    fig = plt.figure(figsize=(6.5, 10))
    gs1 = gridspec.GridSpec(3, 1, left=0.1, right=0.75, wspace=0, hspace=0)
    angle_labels = [
        'alpha', 'beta', 'gamma', 'delta', 'epsilon', 'zeta', 'chi'
    ]
    plot_order = [1, 5, 6]  # only plot alpha, beta, and gamma
    default_fontsize = 12
    for (i, i_angle) in enumerate(plot_order):
        ax1 = plt.subplot(gs1[i])
        x_max = []
        for j in xrange(len(dcd_files)):
            ax1.plot(angle_vs_steps[j][:, 0],
                     angle_vs_steps[j][:, i_angle],
                     '-',
                     c=gwp.qual_color(j),
                     label=key[j])
            x_max.append(angle_vs_steps[j][-1, 0])

        ax1.set_ylim([0, 1.1])
        ax1.set_ylabel(r'% in range')
        ax1.set_xlim([0, min(x_max)])
        if i < len(plot_order) - 1:
            ax1.xaxis.set_ticklabels([])
            # ax1.xaxis.set_ticks([])
        else:
            ax1.set_xlabel(r'steps per bp')
        if i == 0:
            lg = plt.legend(loc='upper left',
                            bbox_to_anchor=(1, 1),
                            scatterpoints=1,
                            numpoints=1,
                            prop={'size': default_fontsize})
        ax1.set_title(angle_labels[i_angle - 1], y=0.05)

    if show:
        plt.show()
    else:
        save_name = 'dsDNA_60bps/moved_in_range'
        if prefix:
            save_name = save_name + '_' + prefix
        if max_frame:
            save_name += '_' + str(max_frame)
        plt.savefig(save_name + '.eps', dpi=400, bbox_inches='tight')
        plt.savefig(save_name + '.png', dpi=400, bbox_inches='tight')
        print 'saved figures to %s.eps and %s.png' % (save_name, save_name)
    print 'done plotting'
def compare_min_dihedrals(raw_dcd_files,
                          min_dcd_files,
                          key,
                          max_frame=None,
                          scale_spb=1,
                          used_goback=False,
                          show=False,
                          prefix=None):
    raw_angle_vs_steps = []
    min_angle_vs_steps = []
    raw_all_in_range = []
    min_all_in_range = []

    for dcd_file_name in min_dcd_files:
        if max_frame:
            npy_file = dcd_file_name[:-4] + '_%d.npy' % max_frame
        else:
            npy_file = dcd_file_name[:-3] + 'npy'

        all_in_range_file = dcd_file_name[:-4] + '_ave_in_range'
        try:
            if 'MD' in prefix:
                npy_file = npy_file.replace('.npy', '_MD.npy')
                all_in_range_file += '_MD'
        except:
            pass

        min_angle_vs_steps.append(np.load(npy_file))
        min_all_in_range.append(np.loadtxt(all_in_range_file + '.out'))
        print 'loaded percent in range files: \n%s \n%s' % (npy_file,
                                                            all_in_range_file)

    for dcd_file_name in raw_dcd_files:
        if max_frame:
            npy_file = dcd_file_name[:-4] + '_%d.npy' % max_frame
        else:
            npy_file = dcd_file_name[:-3] + 'npy'

        all_in_range_file = dcd_file_name[:-4] + '_ave_in_range'
        try:
            if 'MD' in prefix:
                npy_file = npy_file.replace('.npy', '_MD.npy')
                all_in_range_file += '_MD'
        except:
            pass

        raw_angle_vs_steps.append(np.load(npy_file))
        raw_all_in_range.append(np.loadtxt(all_in_range_file + '.out'))
        print 'loaded percent in range files: \n%s \n%s' % (npy_file,
                                                            all_in_range_file)

    fig = plt.figure(figsize=(5, 12))
    gs = gridspec.GridSpec(8, 2, left=0.1, right=0.75, wspace=0.07, hspace=0)
    angle_labels = [
        r'$\alpha$', r'$\beta$', r'$\gamma$', r'$\delta$', r'$\epsilon$',
        r'$\zeta$', r'$\chi$', r'All'
    ]
    plot_order = [0, 2, 3, 4, 7, 1, 5, 6]  # change to show select angles
    default_fontsize = 12

    def plot_settings(ax, x_min, x_max):
        ax.set_ylim([71, 104])
        ax.set_xscale('log')
        ax.set_xlim([min(x_min), min(x_max)])

    for (i, i_angle) in enumerate(plot_order):
        ax = plt.subplot(gs[i, 0])
        plt.axhline(95, ls='--', c='DimGray', linewidth=2)
        x_max = []
        x_min = []
        for j in xrange(len(raw_dcd_files)):
            if i_angle == 0:
                ax.plot(raw_all_in_range[j][:, 0],
                        raw_all_in_range[j][:, 1] * 100,
                        '-',
                        c=gwp.qual_color(j),
                        label=key[j])
                x_max.append(raw_all_in_range[j][-1, 0])
                x_min.append(raw_all_in_range[j][0, 0])
                ax.text(18, 107, 'Raw')
            else:
                ax.plot(raw_angle_vs_steps[j][:, 0],
                        raw_angle_vs_steps[j][:, i_angle] * 100,
                        '-',
                        c=gwp.qual_color(j),
                        label=key[j])
                x_max.append(raw_angle_vs_steps[j][-1, 0])
                x_min.append(raw_angle_vs_steps[j][0, 0])
        plot_settings(ax, x_min, x_max)
        ax.set_ylabel(r'% in range')
        if i < len(plot_order) - 1:
            ax.xaxis.set_ticklabels([])
            # ax1.xaxis.set_ticks([])
        else:
            ax.set_xlabel(r'steps per bp')
        ax.set_title(angle_labels[i_angle - 1], y=0.03, x=0.12)

    for (i, i_angle) in enumerate(plot_order):
        ax = plt.subplot(gs[i, 1])
        plt.axhline(95, ls='--', c='DimGray', linewidth=2)
        for j in xrange(len(min_dcd_files)):
            if i_angle == 0:
                ax.plot(min_all_in_range[j][:, 0],
                        min_all_in_range[j][:, 1] * 100,
                        '-',
                        c=gwp.qual_color(j),
                        label=key[j])
                ax.text(9, 107, 'Minimized')
            else:
                ax.plot(min_angle_vs_steps[j][:, 0],
                        min_angle_vs_steps[j][:, i_angle] * 100,
                        '-',
                        c=gwp.qual_color(j),
                        label=key[j])
        plot_settings(ax, x_min, x_max)
        ax.yaxis.set_ticklabels([])
        if i < len(plot_order) - 1:
            ax.xaxis.set_ticklabels([])
            # ax1.xaxis.set_ticks([])
        else:
            ax.set_xlabel(r'steps per bp')
        ax.set_title(angle_labels[i_angle - 1], y=0.03, x=0.12)

        if i == 0:
            lg = plt.legend(loc='upper left',
                            bbox_to_anchor=(1, 1),
                            scatterpoints=1,
                            numpoints=1,
                            prop={'size': default_fontsize})

    path = 'dsDNA_60bps/'
    save_name = 'raw_min_percent_in_range'
    if prefix:
        save_name = prefix + '_' + save_name
    if max_frame:
        save_name += '_' + str(max_frame)
    plt.savefig(path + save_name + '.eps', dpi=400, bbox_inches='tight')
    plt.savefig(path + save_name + '.png', dpi=400, bbox_inches='tight')
    print 'saved figures to %s.eps and %s.png' % (save_name, save_name)
    if show:
        plt.show()

    print 'done plotting'