ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/osprai/osprai/trunk/ba_class.py
Revision: 61
Committed: Thu May 19 21:39:02 2011 UTC (8 years, 6 months ago) by clausted
File size: 9635 byte(s)
Log Message:
Update docstrings so html looks nice.
Line File contents
1 """
2 ba_class
3 --------
4
5 Biosensor Array class for storing SPRI data.
6 This contains an array of SPR sensorgrams with their
7 associated models and parameters.
8 This can also contain the microarray geometery.
9
10 .. moduleauthor:: Christopher Lausted,
11 Institute for Systems Biology,
12 Yuhang Wan,
13 OSPRAI developers.
14
15 Examples::
16
17 >>> ba1 = BiosensorArray(800,1500) ## Allocate object with 800 spots of 1500 time points.
18 >>> ba1.roi[799].time[1499] = 7502.1 ## Set time in seconds.
19 >>> ba1.roi[799].value[1499] = 0.50 ## Set SPR reflectance signal.
20 >>> ba1.roi[799].name = "anti-IgG" ## Set name of microarray feature.
21 >>> print ba1.roi[799].name
22 anti-IgG
23 >>> ba1 = BiosensorArray(1, 300)
24 >>> ba1.roi[0].simulate(bulkRI=1000, kon=1e4, koff=1e-2, conc=1e-6)
25 >>> print round(ba1.roi[0].value[299], 2)
26 160.64
27 """
28 __version__ = "110426"
29
30
31 ## Import libraries.
32 import numpy as np
33 from datetime import date
34
35
36 class BiosensorArray(object):
37 """
38 The Biosensor Array class holds all ROIs (spots)
39 from an SPRI microarray run.
40
41 ================ =============== =======================================
42 Property Type Description
43 ---------------- --------------- ---------------------------------------
44 roi list of object List of RegOfInterest objects.
45 rois integer Size of roi (Number of ROIs).
46 dpoints integer Number of datapoints in each ROI.
47 primarydatafiles list of string List of file names.
48 comments list of string List of comments regarding experiments.
49 ================ =============== =======================================
50 """
51
52 def __init__(self, roi_size, datapoint_size):
53 """This object is dimensioned upon initialization.""" ## Might improve speed.
54 ## Use a list comprehension to dimension list of classes.
55 self.roi = [RegOfInterest(i,datapoint_size) for i in range(roi_size)]
56 ## Remember the dimensions for quick bounds-checking later.
57 self.rois = roi_size
58 self.dpoints = datapoint_size
59 ## Use these to keep track of laboratory notes.
60 self.primarydatafiles = [""] ## Like "spritdata.txt"
61 self.comments = [""] ## Like "Antibody data from 1 Jan 2010"
62 return
63
64 def xy2uid(self, gx, gy, x, y):
65 """Given roi coordinates, find corresponding uid (index)."""
66 coor1 = (gx, gy, x, y)
67 for roi in self.roi:
68 coor2 = (roi.gridx, roi.gridy, roi.spotx, roi.spoty)
69 if (coor1==coor2): return roi.uid ## Success.
70 return -1 ## Failure.
71
72 def set_plot_all(self):
73 """Choose to plot every sensorgram."""
74 for roi in self.roi: roi.plottable = True
75 return
76
77 def set_plot_list(self, ilist):
78 """Choose a list of sensorgrams to plot"""
79 for roi in self.roi: roi.plottable = False
80 for i in ilist: self.roi[i].plottable = True
81 return
82
83 """End of BiosensorArray class definition."""
84
85
86 class RegOfInterest(object):
87 """
88 This Region Of Interest class can hold one SPR sensorgram.
89
90 =========== =============== =============================================
91 Property Type Description
92 ----------- --------------- ---------------------------------------------
93 uid integer Unique ID integer. Never changes.
94 index integer Changes if ba size changes (add/remove rois).
95 time nparray Usually seconds.
96 value nparray Arbitrary units.
97 dpoints integer Can use for bounds checking.
98 name string Name of ROI.
99 desc string Description of ROI
100
101 gridx integer Can be Block number from GAL file.
102 gridy integer Unused?
103 spotx integer ROI column number.
104 spoty integer ROI row number.
105 bgroi list of integer One or more background ROIs.
106 calibM float Slope used for calibration
107 calibB float Intercept used for calibration.
108 plottable boolean Whether to plot
109
110 injconc list of float One or more analyte concentrations.
111 injstart list of float One or more injection start times.
112 injstop list of float One or more injection start times.
113 injrind list of float One or more expected refractive index jumps.
114
115 flow float Flowrate of injection.
116 model ref to funct Model describing this ROI.
117 params dict of dict Parameters for this model.
118 =========== =============== =============================================
119 """
120
121 def __init__(self, i, datapoint_size):
122 """
123 Each ROI in a list needs a unique ID number which will be i+1.
124 The time and value arrays must be allocated using datapoint_size.
125 """
126 self.uid = i+1 ## Unique ID integer. Never changes.
127 self.index = i ## Changes if ba size changes (add/remove rois).
128 self.time = np.zeros(datapoint_size, dtype=float) ## Usually seconds.
129 self.value = np.zeros(datapoint_size, dtype=float) ## Arbitrary units.
130 self.dpoints = datapoint_size ## Can use for bounds checking.
131 ## Useful optional information. Usually from GAL or Key files.
132 self.name = "Spot%i" % (i+1)
133 self.desc = "Description"
134 self.gridx = 0 ## Can be Block number from GAL file.
135 self.gridy = 0 ## Unused?
136 self.spotx = 0 ## ROI column number.
137 self.spoty = 0 ## ROI row number.
138 self.bgroi = [0] ## One or more background ROIs.
139 self.calibM = 1 ## Slope used for calibration
140 self.calibB = 0 ## Intercept used for calibration.
141 self.plottable = True ## Whether to plot
142 ## Optional injection information. Usually from Clamp or ICM Method files.
143 self.injconc = [0.0] ## One or more analyte concentrations.
144 self.injstart = [0.0] ## One or more injection start times.
145 self.injstop = [0.0] ## One or more injection start times.
146 self.injrind = [0.0] ## One or more expected refractive index jumps.
147 self.flow = 0 ## Flowrate of injection.
148 ## Curve fitting information. Model and model parameters.
149 ## Example model is reference to function like data=simple1to1(times,params)
150 ## Example params = {'Rmax': {'value':1, 'min':0, 'max':10, 'fixed':'float'} }
151 self.model = None ## Model describing this roi. Reference to a function.
152 self.params = [] ## Parameters for this model. A dictionary of dictionaries.
153
154 def time2dp(self, t):
155 """Find datapoint closest to given time."""
156 pos2 = self.time.searchsorted(t) ## Time point just after t.
157 pos2 = min(pos2, len(self.time)-1) ## Avoid indexing error.
158 pos1 = max(pos2-1,0) ## Time point just before t.
159 t2 = abs(self.time[pos2] - t)
160 t1 = abs(self.time[pos1] - t)
161 ## Decide if time point just before or just after is closer.
162 if (t2<t1):
163 return pos2
164 else:
165 return pos1
166
167 def time2val(self, t1, t2):
168 """Return list of SPR values between t1 and t2"""
169 dp1, dp2 = self.time2dp(t1), self.time2dp(t2)
170 return [self.value[i] for i in range(dp1, dp2)]
171
172 def simulate(self, bulkRI=1000, kon=1e4, koff=1e-2, conc=1e-6):
173 """
174 Fill ROI with simulated data from simple 1:1 binding.
175
176 The following parameters are hard-coded.
177
178 * Time 35 - 65 s features jump of ``bulkRI``.
179 * Time 100 - 200 s has binding using ``kon``, ``conc``.
180 * Also jump of ``bulkRI`` / 10.
181 * Time 200 - 300 s has dissociation using koff.
182
183 The model formulas are::
184
185 alpha = c*kon+koff
186 Req = Rmax*c*kon / alpha
187 R = Req * [1 - exp(-t*alpha)]
188
189 """
190 ## Error checking.
191 if (koff <= 0): raise Exception, "Simulation koff must be >0"
192 if (kon < 0): raise Exception, "Simulation kon must be >=0"
193 if (conc < 0): raise Exception, "Simulation conc must be >=0"
194 ## Start with flat line for 300 sec.
195 self.time = np.arange(300)
196 self.value = np.zeros(300)
197 ## Add bulk refractive index jumps.
198 self.value[35:65] += bulkRI
199 self.value[100:199] += (0.1 * bulkRI)
200 ## Add binding.
201 rmax = 1000
202 alpha = conc * kon + koff
203 req = rmax * conc * kon / alpha
204 for t in range(100):
205 self.value[t+100] += req * (1 - np.exp(-t * alpha))
206 ## Add dissociation
207 response = req * (1 - np.exp(-100 * alpha))
208 for t in range(100):
209 self.value[t+200] += response * np.exp(-t * koff)
210 return
211
212 """End of RegOfInterest definition."""
213
214
215 def _test():
216 """
217 Automatic Code testing with doctest.
218 Doctest runs the example code in the docstrings.
219 Enable use of ellipses as wildcard for returned text.
220 """
221 import doctest
222 doctest.testmod(optionflags=doctest.ELLIPSIS)
223
224
225 if __name__ == "__main__":
226 """
227 Code testing.
228 Simply execute 'python ba_class.py'.
229 """
230 _test()
231
232
233 ########################### End of module ############################