annotate tools/myTools/bin/SFA_insilico.py @ 1:7e5c71b2e71f draft default tip

Uploaded
author laurenmarazzi
date Wed, 22 Dec 2021 16:00:34 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
1 #!/usr/bin/env python3
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
2
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
3
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
4 import os
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
5 import numpy as np
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
6 import pandas as pd
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
7 import networkx as nx
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
8 import random
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
9 import sfa
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
10 import csv
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
11 import sys
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
12 import statistics
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
13
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
14
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
15
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
16 fpath = os.path.join(sys.argv[1]) #location of networkfile
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
17 qdata_all=pd.read_csv(sys.argv[2],index_col = 0)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
18 all_samples=pd.read_csv(sys.argv[3],delim_whitespace=True, index_col = False)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
19 npert=int(sys.argv[4])
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
20 phenotypes = all_samples.phenotype.unique()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
21 class ThreeNodeCascade(sfa.base.Data):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
22 def __init__(self):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
23 super().__init__()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
24 self._abbr = "TNC"
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
25 self._name = "A simple three node cascade"
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
26
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
27 signs = {'activates':1, 'inhibits':-1}
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
28 A, n2i, dg = sfa.read_sif(fpath, signs=signs, as_nx=True)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
29 self._A = A
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
30 self._n2i = n2i
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
31 self._dg = dg
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
32 self._i2n = {idx: name for name, idx in n2i.items()}
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
33
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
34 # end of def __init__
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
35 # end of def class
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
36
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
37
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
38 def gen_basal_states(npert,nnode,pre,opts):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
39 numpert=int(npert) # number of perturbations to generate
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
40 numnodes=int(nnode) # number of nodes to generate them for
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
41 prefix = pre # prefix for column labels
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
42 options=opts.split(',')
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
43 df1=pd.DataFrame()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
44 if numpert > len(options)**numnodes:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
45 numpert = len(options)**numnodes
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
46 while len(df1.index)<numpert:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
47 temp=np.random.choice(a=options,size=[500000,numnodes]) # set to 200,000 to ensure unique random combinations in a timely manner (or 500,000 to run faster)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
48 df1=pd.DataFrame(temp)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
49 df1=df1.drop_duplicates()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
50 if len(df1.index)>numpert:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
51 df1=df1.iloc[0:numpert,]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
52 l1=[]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
53 for i in range(0,numpert):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
54 l1.append(prefix+'_' + str(i+1).rjust(len(str(numpert)), '0'))
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
55 df1.index=l1
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
56
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
57 return df1
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
58
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
59
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
60 if __name__ == "__main__":
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
61 ## initalize parameters from SFA
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
62 data = ThreeNodeCascade()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
63 algs = sfa.AlgorithmSet()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
64 alg = algs.create('SP')
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
65 alg.data = data
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
66 alg.params.apply_weight_norm = True
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
67 alg.initialize()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
68 alg.params.exsol_forbidden=True
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
69 alg.params.alpha=0.9
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
70
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
71
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
72
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
73 netnodes=list(data.dg.nodes)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
74 expnodes=list(set(netnodes) & set(qdata_all.index))
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
75 samples=gen_basal_states(npert,len(expnodes),'attr','0,-1,1')
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
76 samples.columns=expnodes
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
77 n = data.dg.number_of_nodes() #the number of nodes
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
78 b = np.zeros((n,))
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
79 switch_num = int(len(samples)/len(phenotypes)) + (len(phenotypes) % len(samples) > 0)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
80 l=0
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
81 logss=pd.DataFrame(index=samples.index,columns=netnodes,copy=True)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
82 for i in range(len(phenotypes)):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
83 m=switch_num*i
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
84 qs = all_samples[all_samples.isin([phenotypes[i]]).any(axis=1)]['name'].tolist()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
85 qdata=qdata_all.loc[:,qs]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
86 pi=[]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
87 samples2=samples.iloc[l:switch_num+m]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
88 minv=pd.Series(index = qdata.index, data = [np.amin(qdata.loc[node,]) for node in qdata.index])
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
89 maxv=pd.Series(index = qdata.index, data = [np.amax(qdata.loc[node,]) for node in qdata.index])
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
90 q1=pd.Series(index = qdata.index, data = [np.quantile(qdata.loc[node,],.33) for node in qdata.index])
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
91 q2=pd.Series(index = qdata.index, data = [np.quantile(qdata.loc[node,],.66) for node in qdata.index])
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
92
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
93 for name, item in samples2.iterrows(): #for each simulated initial condition
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
94 enodes=item.index.tolist()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
95 for node in enodes: # set initial state to simulated value
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
96 if item.loc[node]==1: # if 1
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
97 number=np.random.uniform(low=q2[node], high=maxv[node]) #generate a random value for the node in the upper quartile
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
98 elif item.loc[node]==-1: # if -1
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
99 number=np.random.uniform(low=minv[node], high=q1[node]) #generate a random value for the node in the lower quartile
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
100 else: #item.loc[node]==0
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
101 number=np.random.uniform(low=q1[node], high=q2[node]) #generate a random value for the node in the middle
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
102 b[data.n2i[node]]=number
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
103 x = alg.compute(b,pi) # Run SFA calculation
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
104 logss.loc[name,netnodes]=x[0]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
105 l=switch_num+m
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
106 logss=logss.astype(float).round(3)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
107 logss.to_csv('attrs_insilico.tsv', sep=' ',float_format='%.3f',index_label="name",chunksize=10000)