def make_video_of_tsne_iterations(iterations, video_dir, data_file_name='interim_{:0>6}.dat',
                                  video_file_name='tsne_video.mp4', figsize=(15, 15), dpi=200, fps=30,
                                  movie_metadata=None, labels_dict=None, cm=None, cm_remapping=None, subtitle=None,
                                  label_name='Label', legent_on=True, label_array=None, sizes=None, markers=None,
                                  color=None, max_screen=False):
    iters = np.arange(iterations)
    FFMpegWriter = animation.writers['ffmpeg']
    metadata = None
    if movie_metadata:
        metadata = movie_metadata
    writer = FFMpegWriter(fps=fps, bitrate=-1, metadata=metadata)
    if cm is None:
        cm = plt.cm.Dark2
    fig = plt.figure(figsize=figsize, dpi=dpi)
    ax = fig.add_subplot(111)
    with writer.saving(fig, join(video_dir, video_file_name), dpi):
        for it in iters:
            ax.cla()
            tsne = TSNE.load_tsne_result(video_dir, data_file_name.format(it))
            tsne = np.transpose(tsne)
            plot_tsne(tsne, labels_dict=labels_dict, cm=cm, cm_remapping=cm_remapping, subtitle=subtitle,
                      label_name=label_name, legent_on=legent_on, label_array=label_array, axes=ax, sizes=sizes,
                      markers=markers, color=color, max_screen=max_screen)
            min_x = np.min(tsne[0, :])
            max_x = np.max(tsne[0, :])
            min_y = np.min(tsne[1, :])
            max_y = np.max(tsne[1, :])
            range_x = np.max(np.abs([min_x, max_x]))
            range_y = np.max(np.abs([min_y, max_y]))

            plt.ylim([-range_y, range_y])
            plt.xlim([-range_x, range_x])
            writer.grab_frame()
gpu_mem = 0.9
eta = 200
early_exaggeration = 4.0
seed = 400000
verbose = 3
randseed = 0
tsne = tsne_spikes.t_sne_spikes(kwx_file_path, path_to_save_tmp_data=path_to_save_tmp_data,
                                hdf5_dir_to_pca=r'channel_groups/1/features_masks',
                                mask_data=True, perplexity=perplexity, theta=theta, iterations=iterations,
                                gpu_mem=gpu_mem, seed=seed, eta=eta, early_exaggeration=early_exaggeration,
                                verbose=verbose, indices_of_spikes_to_tsne=range(spikes_used), randseed=randseed)



# Load t-sne results
tsne = TSNE.load_tsne_result(results_dir, 'result_tsne40K_com46k_p500_it1k_th05_eta200.dat')
tsne = np.transpose(tsne)
tsne = np.load(join(results_dir, 't_sne_results_s130k_100per_200lr_02theta.npy'))


# 2D plot
pf.plot_tsne(tsne, labels_dict=spikes_labeled_dict, subtitle='T-sne of first 130k spikes from Synthetic Data',
             label_name='"Cell" No', cm=plt.cm.jet, markers=['.', '^'], sizes=[3, 20])
pf.plot_tsne(tsne, labels_dict=None, subtitle='T-sne of 86000 spikes from Synthetic Data, not labeled', label_name=None)



#--------------------------------------------------------------------------------------
# CHECK QUALITY OF FIT
# 1) DBSCAN
def fit_dbscan(data, eps, min_samples, show=True, juxta_cluster_indices_grouped=None, threshold_legend=None):
print("Scikit t-sne took {} seconds, ({} minutes), for {} spikes".format(t1-t0, (t1-t0)/60, up_to_extra_spike))

# save the python scikit generated t-sne results
threshold = 5.5
file_name = r'D:\Data\George\Projects\SpikeSorting\Joana_Paired_128ch\2015-09-03\Analysis\t_tsne_ivm_data_{}sp_{}per_{}ee_{}lr_{}tp_{}thres.pkl'\
    .format(len(indices_of_data_for_tsne), perplexity, early_exaggeration, learning_rate, number_of_time_points, threshold)
file = open(file_name, 'bw')
pickle.dump((ivm_data_filtered, t_tsne, juxta_cluster_indices_grouped, perplexity, early_exaggeration, learning_rate), file)
file.close()


tsne_bhcuda.save_data_for_tsne(data_for_tsne, r'E:\George\SourceCode\Repos\t_sne_bhcuda\bin\windows', 'data.dat',
                               theta=0.6, perplexity=50, eta=200, no_dims=2, iterations=1000, seed=0, gpu_mem=0.8,
                               randseed=-1)
t_tsne = np.transpose(tsne_bhcuda.load_tsne_result(
            r'D:\Data\George\Projects\SpikeSorting\Joana_Paired_128ch\2015-09-03\Analysis\klustakwik\threshold_6_5std',
            'result_final_allspikes.dat'))



# T-sne with my conda package
path = r'D:\Data\George\Projects\SpikeSorting\Joana_Paired_128ch\2015-09-03\Analysis\klustakwik\threshold_6_5std'
kwx_file_path = os.path.join(path, r'threshold_6_5std.kwx')
video = os.path.join(path, r'video')
indices_of_data_for_tsne = None #range(40000)
seed = 0
perplexity = 100.0
theta = 0.2
learning_rate = 200.0
iterations = 5000
gpu_mem = 0.2