1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #!/usr/bin/env python
# -*- coding:Utf-8 -*-
import numpy as np
from scipy import interpolate
cluster = np.dtype( [ ('name','|S20'), ('start',np.int), ('stop',np.int) ] )
record = np.dtype( [ ('name','|S20'), ('start',np.int), ('stop',np.int), ('count',np.int) ] )
def extraction_cluster( file_cx, file_cluster ):
enreg = np.loadtxt( file_cx, dtype=record, skiprows=True)
resultats = []
for cx in np.loadtxt( file_cluster, dtype=cluster, skiprows=True) :
# Extraction des enregistrements
c1 = cx['name'] == enreg['name']
c2 = cx['start'] <= enreg['start']
c3 = cx['stop'] >= enreg['stop']
res = np.extract( np.all( [c1,c2,c3], axis=0), enreg)
# Si le nombre d'enregistrements est insuffisant, passe au suivant
if res.size < 4:
print "Interpolation chromosome '%s' impossible (seulement %d enregistrement(s))" % (cx['name'], res.size)
continue
# Interpolation et recherche des points annulant la dérivée
tck = interpolate.splrep( res['start'], res['count'] )
xnew = np.linspace( res['start'][0], res['start'][-1], 256)
yder = interpolate.splev(xnew,tck,der=1)
tckder = interpolate.splrep(xnew,yder)
racines = interpolate.sproot(tckder)
# Recherche de tous les pics (dérivée seconde négative)
yder2 = interpolate.splev(racines,tck,der=2)
x_max = np.extract( yder2 < 0, racines)
y_max = interpolate.splev(x_max,tck)
# Ajout des pics du chromosome à la liste
for x, y in zip(x_max,y_max):
resultats.append((cx['name'], x, y))
return resultats
if __name__ == '__main__':
f_compte, f_cluster = "cDNA_count.txt", "cluster_on_transcript.txt"
print "Affichage des valeurs maxi"
for cx, x, y in extraction_cluster( f_compte, f_cluster ):
print "Chromosome '%s' : %f en %f" % (cx, y, x) |
Partager