def plot_replication_program():
    from sampling_KJMA_kinetics import get_oriter_from_oris
    from sampling_KJMA_kinetics import get_origins_from_phantoms
    from sampling_KJMA_kinetics import get_timing_from_oris
    lim = {'y':np.arange(100),'u':np.arange(100),'v':1,'dy':1,'Ny':100,'du':1,'Nu':100}
    phantoms = [(10,20), (20,25), (60,30)]
    phantoms = np.array(phantoms, dtype=[('y',float),('u',float)]) 
    oris = get_origins_from_phantoms(phantoms, lim)
    oriter = get_oriter_from_oris(oris, lim)
    timing = get_timing_from_oris(oris, lim)
    fig, ax = plt.subplots(figsize=(5,5))
    remove_junk_xyplot(ax)
    ax.set_ylim([0, 100])
    ax.set_xlim([0, 100])
    ax.set_yticks([0,100])
    ax.set_xticks([0,100])
    ax.plot(oriter['y'],oriter['u'],color='k', linewidth=2)
    ax.set_xlabel('position')
    ax.set_ylabel('time')
    delta_y = 1
    ax.text(x=10,y=20-delta_y,s=r'$O_1$', color='gray',
            verticalalignment='top', horizontalalignment='center')
    ax.text(x=20,y=25-delta_y,s=r'$O_2$', color='gray',
            verticalalignment='top', horizontalalignment='center')
    ax.text(x=60,y=30-delta_y,s=r'$O_3$', color='gray',
            verticalalignment='top', horizontalalignment='center')
    ax.text(x=17.5,y=27.5+delta_y,s=r'$T_1$', color='gray',
            verticalalignment='bottom', horizontalalignment='center')
    ax.text(x=42.5,y=47.5+delta_y,s=r'$T_2$', color='gray',
        verticalalignment='bottom', horizontalalignment='center')
def animation_replication_program():
    from sampling_KJMA_kinetics import get_oriter_from_oris
    from sampling_KJMA_kinetics import get_origins_from_phantoms
    from sampling_KJMA_kinetics import get_timing_from_oris
    lim = {'y':np.arange(100),'u':np.arange(100),'v':1,'dy':1,'Ny':100,'du':1,'Nu':100}
    phantoms = [(10,20), (20,25), (60,30)]
    phantoms = np.array(phantoms, dtype=[('y',float),('u',float)]) 
    oris = get_origins_from_phantoms(phantoms, lim)
    oriter = get_oriter_from_oris(oris, lim)
    timing = get_timing_from_oris(oris, lim)
    
    dark_color = [(0.10588235294117647, 0.6196078431372549, 0.4666666666666667),
                  (0.8509803921568627, 0.37254901960784315, 0.00784313725490196)]
    
    from matplotlib import animation
    tmin, tmax, x = 0, 100, np.arange(100)
    t = np.linspace(tmin,tmax,200) # time coordinates
    replicated = np.zeros((len(t), len(x)), dtype=int)
    for i, t_i in enumerate(t):
        replicated[i,:] = (timing['u'] < t_i)
    
    fig, ax = plt.subplots(figsize=(5,5))
    ax.spines['top'].set_visible(False) # no top or right spine
    ax.spines['right'].set_visible(False)
    ax.spines['left'].set_visible(False) # no top or right spine
    ax.spines['bottom'].set_visible(False)
    ax.set_ylim([tmin, tmax])
    ax.set_xlim([0, 100])
    ax.set_xticks([])
    ax.set_yticks([])
    ax.set_xlabel('position')
    ax.set_ylabel('time')
    ax.plot(oriter['y'],oriter['u'],color='k', linewidth=2)
    timeline, = ax.plot([],[],color='gray',alpha=0.5, linewidth=2)
    DNA, = ax.plot([],[],color=dark_color[0])
    ax.hlines(y=tmin+2,xmin=x.min(),xmax=x.max(),color=dark_color[1])
    
    def init():
        timeline.set_data([0,99], [0,0])
        DNA.set_data([], [])
        
    def update(n): 
        # n = frame counter
        timeline.set_data([0,100],[t[n],t[n]])
        DNA.set_data(x, tmin+2+2*replicated[n,:])
    
    anim = animation.FuncAnimation(fig, update, init_func=init, frames=len(t), interval=40, blit=True)
    return anim