annotate tools/myTools/bin/sfa/analysis/perturb.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 # -*- coding: utf-8 -*-
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
2
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
3 import numpy as np
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
4
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
5
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
6 def analyze_perturb(alg, data, targets, b=None, get_trj=False):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
7 """Perform signal flow analysis under perturbations.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
8
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
9 Parameters
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
10 ----------
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
11 alg : sfa.Algorithm
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
12 Algorithm object.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
13
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
14 data : sfa.Data
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
15 Data object which has perturbation data.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
16
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
17 targets : list
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
18 List of node names, which are the keys of data.n2i.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
19
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
20 b : numpy.ndarray
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
21 Basic vector for signaling sources or basal activities.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
22
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
23 get_trj : bool (optional)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
24 Decide to get the trajectory of activity change.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
25
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
26 Returns
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
27 -------
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
28 act : numpy.ndarray
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
29 Change in the activities. It is usually calculated
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
30 as x2 - x1, where x is
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
31 the a vector of activities at steady-state.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
32
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
33 F : numpy.ndarray
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
34 A matrix of signal flows.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
35 It is usually calculated as W2*x1 - W1*x1,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
36 where W is weight matrix and
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
37 x is a vector of activities at steady-state.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
38
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
39 trj : numpy.ndarray (optional)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
40 Trajectory of activity change, which is returned
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
41 if get_trj is True.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
42 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
43 N = data.A.shape[0]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
44
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
45 if b is None:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
46 b = np.zeros((N,), dtype=np.float)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
47 elif b.size != N:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
48 raise TypeError("The size of b should be equal to %d"%(N))
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
49
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
50 inds = []
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
51 vals = []
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
52 alg.apply_inputs(inds, vals)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
53 b[inds] = vals
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
54
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
55 W_ctrl = alg.W.copy()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
56 x_ctrl, trj_ctrl = alg.propagate_iterative(
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
57 W_ctrl,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
58 b,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
59 b,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
60 alg.params.alpha,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
61 get_trj=get_trj)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
62
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
63 if data.has_link_perturb:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
64 W_pert = W_ctrl.copy()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
65 alg.apply_perturbations(targets, inds, vals, W_pert)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
66 alg.W = W_pert
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
67 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
68 W_pert = W_ctrl
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
69 alg.apply_perturbations(targets, inds, vals)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
70
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
71 b[inds] = vals
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
72 x_pert, trj_pert = alg.propagate_iterative(
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
73 W_pert,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
74 b,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
75 b,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
76 alg.params.alpha,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
77 get_trj=get_trj)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
78
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
79 act_change = x_pert - x_ctrl
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
80
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
81 if data.has_link_perturb:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
82 F = W_pert*x_pert - W_ctrl*x_ctrl
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
83 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
84 F = W_ctrl*act_change
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
85
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
86 ret = [act_change, F] # return objects
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
87 if get_trj:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
88 if trj_pert.shape[0] != trj_ctrl.shape[0]:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
89 trj_ctrl, trj_pert = resize_trj(trj_ctrl, trj_pert)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
90
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
91 trj_change = trj_pert - trj_ctrl
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
92 ret.append(trj_change)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
93
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
94 return tuple(ret)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
95
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
96
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
97 def resize_trj(trj_ctrl, trj_pert):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
98 # Prepare the comparison
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
99 trjs = [trj_pert, trj_ctrl]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
100 ind_trjs = [0, 1]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
101 func_key = lambda x: trjs[x].shape[0]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
102
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
103 # Find smaller and bigger arrays.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
104 ind_smaller = min(ind_trjs, key=func_key)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
105 ind_bigger = max(ind_trjs, key=func_key)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
106 smaller = trjs[ind_smaller]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
107 bigger = trjs[ind_bigger]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
108
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
109 # Resize the smaller one.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
110 smaller_resized = np.zeros_like(bigger)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
111 smaller_resized[:smaller.shape[0], :] = smaller
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
112 smaller_resized[smaller.shape[0]:, :] = smaller[-1, :]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
113
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
114 if ind_smaller == 0:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
115 trj_pert = smaller_resized
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
116 elif ind_smaller == 1:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
117 trj_ctrl = smaller_resized
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
118 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
119 err_msg = "Invalid index for trajectories: %d" % (ind_smaller)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
120 raise IndexError(err_msg)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
121
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
122 return trj_ctrl, trj_pert