import numpy as np

"""
Explanation: Clustering Hierárquico com SciPy
End of explanation
"""


import csv
csvfile = open('data/cellcycle.txt', 'r')
reader = csv.reader(csvfile, delimiter='\t')

"""
Explanation: Carregando os dados
O arquivo cellcycle.txt é uma tabela tipo TSV (tab separated values) com a informação de expressão gênica de 6178 genes:
End of explanation
"""


cycles = reader.next()[1:]

print len(cycles)
print cycles[0:5]

"""
Explanation: A primeira linha contém o nome das colunas:
End of explanation
"""


genes = [row[0] for row in reader]

print len(genes)
print genes[0:5]

csvfile.close()

"""
Explanation: Já a primeira coluna contém o nome dos genes:
End of explanation
"""


data = np.genfromtxt('data/cellcycle.txt', delimiter='\t', skip_header=1, 
                     usecols=range(1, 83), missing_values='', filling_values=0.)
X = data[0:250,:]
n, m = X.shape
print n, m

X

%matplotlib notebook
import matplotlib.pyplot as plt

"""
Explanation: Para facilitar a visualização, vamos trabalhar com os primeiros 250 genes:
End of explanation
"""


from scipy.cluster.hierarchy import dendrogram, linkage

Z = linkage(X, 'ward')

"""
Explanation: Clustering
End of explanation
"""


print Z[0:5]
print '...'
print Z[-6:-1]

Z.shape

"""
Explanation: $Z$ é uma matriz $(n−1) \times4$ 
Clusters Z[i, 0] e Z[i, 1] são combinados para formar o cluster $i$. 
A distância entre os clusters mesclados em $i$ é Z[i, 2]
O número de observações no cluster $i$ e Z[i,4]
End of explanation
"""


llf = lambda id : genes[id]

plt.figure(figsize=(12, 30))
plt.title('Dendrograma')
plt.ylabel('Gene')
plt.xlabel(u'Distância (Ward)')
den = dendrogram(Z, orientation='left', leaf_font_size=9, leaf_label_func=llf)

"""
Explanation: Exibição de um dendograma
Função que, para um índice $i$, devolve o nome do gene:
End of explanation
"""


import seaborn as sns

plt.figure(2, figsize=(12,36))
hm = sns.heatmap(X[den['leaves'],:], square=True, cbar=False, xticklabels=False)
gene_labels = [genes[i] for i in den['leaves']]
ylabels = hm.set_yticklabels(gene_labels, rotation=0)

"""
Explanation: Heatmap de genes aglomerados
End of explanation
"""


