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 User Rev File contents
1 clausted 7 """
2 clausted 47 ba_class
3     --------
4 clausted 7
5 clausted 47 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 clausted 48
17 clausted 47 >>> 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 clausted 58 >>> 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 clausted 7 """
28 clausted 59 __version__ = "110426"
29 clausted 7
30 clausted 47
31 clausted 7 ## Import libraries.
32     import numpy as np
33     from datetime import date
34    
35    
36     class BiosensorArray(object):
37 clausted 27 """
38     The Biosensor Array class holds all ROIs (spots)
39     from an SPRI microarray run.
40    
41 clausted 47 ================ =============== =======================================
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 clausted 27 """
51    
52 clausted 7 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 clausted 47 return
63 clausted 7
64     def xy2uid(self, gx, gy, x, y):
65     """Given roi coordinates, find corresponding uid (index)."""
66     coor1 = (gx, gy, x, y)
67 clausted 50 for roi in self.roi:
68     coor2 = (roi.gridx, roi.gridy, roi.spotx, roi.spoty)
69     if (coor1==coor2): return roi.uid ## Success.
70 clausted 7 return -1 ## Failure.
71    
72     def set_plot_all(self):
73     """Choose to plot every sensorgram."""
74 clausted 50 for roi in self.roi: roi.plottable = True
75 clausted 47 return
76 clausted 7
77     def set_plot_list(self, ilist):
78     """Choose a list of sensorgrams to plot"""
79 clausted 50 for roi in self.roi: roi.plottable = False
80 clausted 7 for i in ilist: self.roi[i].plottable = True
81 clausted 47 return
82    
83     """End of BiosensorArray class definition."""
84 clausted 7
85    
86     class RegOfInterest(object):
87 clausted 27 """
88     This Region Of Interest class can hold one SPR sensorgram.
89    
90 clausted 47 =========== =============== =============================================
91 clausted 27 Property Type Description
92 clausted 47 ----------- --------------- ---------------------------------------------
93 clausted 27 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 clausted 47 =========== =============== =============================================
119 clausted 27 """
120    
121 clausted 7 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 clausted 17 ## Curve fitting information. Model and model parameters.
149     ## Example model is reference to function like data=simple1to1(times,params)
150 clausted 28 ## Example params = {'Rmax': {'value':1, 'min':0, 'max':10, 'fixed':'float'} }
151 clausted 17 self.model = None ## Model describing this roi. Reference to a function.
152     self.params = [] ## Parameters for this model. A dictionary of dictionaries.
153 clausted 7
154     def time2dp(self, t):
155     """Find datapoint closest to given time."""
156 clausted 13 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 clausted 7 t2 = abs(self.time[pos2] - t)
160     t1 = abs(self.time[pos1] - t)
161 clausted 13 ## Decide if time point just before or just after is closer.
162 clausted 7 if (t2<t1):
163     return pos2
164     else:
165     return pos1
166 clausted 12
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 clausted 13 return [self.value[i] for i in range(dp1, dp2)]
171 clausted 58
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 clausted 61
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 clausted 58 alpha = c*kon+koff
186     Req = Rmax*c*kon / alpha
187     R = Req * [1 - exp(-t*alpha)]
188 clausted 61
189 clausted 58 """
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 clausted 12
212 clausted 47 """End of RegOfInterest definition."""
213 clausted 7
214 clausted 50
215 clausted 58 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 ############################