Merged Rolf Schmidt's illysam branch
[hooke.git] / hooke / ui / gui / results.py
1 #!/usr/bin/env python\r
2 \r
3 '''\r
4 results.py\r
5 \r
6 Result and Results classes for Hooke.\r
7 \r
8 Copyright 2009 by Dr. Rolf Schmidt (Concordia University, Canada)\r
9 \r
10 This program is released under the GNU General Public License version 2.\r
11 '''\r
12 \r
13 from numpy import nan\r
14 \r
15 import prettyformat\r
16 import lib.curve\r
17 \r
18 DEFAULT_COLOR = 'green'\r
19 DEFAULT_DECIMAL = 2\r
20 DEFAULT_STYLE = 'scatter'\r
21 \r
22 class Result(lib.curve.Curve):\r
23     def __init__(self):\r
24         lib.curve.Curve.__init__(self)\r
25         self.color = DEFAULT_COLOR\r
26         self.result = {}\r
27         self.style = DEFAULT_STYLE\r
28 \r
29 class Results(object):\r
30     def __init__(self):\r
31         self.columns = []\r
32         self.decimals = {}\r
33         self.has_multipliers = False\r
34         self.multipliers = {}\r
35         self.results = []\r
36         self.separator='\t'\r
37         self.units = {}\r
38 \r
39     def get_pretty_value(self, column, value):\r
40         if self.has_multipliers and self.has_results():\r
41             multiplier = self.multipliers[column]\r
42             decimals = self.decimals[column]\r
43             return prettyformat.pretty_format(value, '', decimals, multiplier, True)\r
44         return str(value)\r
45 \r
46     def has_results(self):\r
47         return len(self.results) > 0\r
48 \r
49     def get_header_as_list(self):\r
50         header_list = []\r
51         if self.has_results():\r
52             if not self.has_multipliers:\r
53                 self.set_multipliers()\r
54             for column in self.columns:\r
55                 unit_str = ''.join([prettyformat.get_prefix(self.multipliers[column]), self.units[column]])\r
56                 header_str = ''.join([column, ' [', unit_str, ']'])\r
57                 header_list.append(header_str)\r
58         return header_list\r
59 \r
60     def get_header_as_str(self, separator=None):\r
61         if separator is None:\r
62             separator = self.separator\r
63         return separator.join(map(str, self.get_header_as_list()))\r
64 \r
65     def get_result_as_list(self, index=0):\r
66         if index >= 0 and index < len(self.results):\r
67             result_list = []\r
68             if self.has_results():\r
69                 if not self.has_multipliers:\r
70                     self.set_multipliers()\r
71                 for column in self.columns:\r
72                     result_str = prettyformat.pretty_format(self.results[index].result[column], '', self.decimals[column], self.multipliers[column], True)\r
73                     result_list.append(result_str)\r
74             return result_list\r
75         else:\r
76             return None\r
77 \r
78     def get_result_as_string(self, index=0):\r
79         results_list = self.get_result_as_list(index)\r
80         if results_list is not None:\r
81             return self.separator.join(map(str, results_list))\r
82         else:\r
83             return ''\r
84 \r
85     def set_decimal(self, column, decimal=DEFAULT_DECIMAL):\r
86         if self.decimals.has_key(column):\r
87             self.decimals[column] = decimal\r
88 \r
89     def set_decimals(self, decimals=DEFAULT_DECIMAL):\r
90         if decimals < 0:\r
91             #set default value if necessary\r
92             decimals = DEFAULT_DECIMAL\r
93         for column in self.columns:\r
94             self.decimals[column] = decimals\r
95 \r
96     def set_multipliers(self, index=0):\r
97         if self.has_results():\r
98             for column in self.columns:\r
99                 #result will contain the results dictionary at 'index'\r
100                 result = self.results[index].result\r
101                 #in position 0 of the result we find the value\r
102                 self.multipliers[column] = prettyformat.get_multiplier(result[column])\r
103             self.has_multipliers = True\r
104         else:\r
105             self.has_multipliers = False\r
106 \r
107     def update(self):\r
108         pass\r
109 \r
110 \r
111 class ResultsFJC(Results):\r
112     def __init__(self):\r
113         Results.__init__(self)\r
114         self.columns = ['Contour length', 'sigma contour length', 'Kuhn length', 'sigma Kuhn length', 'Rupture force', 'Slope', 'Loading rate']\r
115         self.units['Contour length'] = 'm'\r
116         self.units['sigma contour length'] = 'm'\r
117         self.units['Kuhn length'] = 'm'\r
118         self.units['sigma Kuhn length'] = 'm'\r
119         self.units['Rupture force'] = 'N'\r
120         self.units['Slope'] = 'N/m'\r
121         self.units['Loading rate'] = 'N/s'\r
122         self.set_decimals(2)\r
123 \r
124     def set_multipliers(self, index=0):\r
125         if self.has_results():\r
126             for column in self.columns:\r
127                 #result will contain the results dictionary at 'index'\r
128                 result = self.results[index].result\r
129                 #in position 0 of the result we find the value\r
130                 if column == 'sigma contour length':\r
131                     self.multipliers[column] = self.multipliers['Contour length']\r
132                 elif column == 'sigma Kuhn length':\r
133                     self.multipliers[column] = self.multipliers['Kuhn length']\r
134                 else:\r
135                     self.multipliers[column] = prettyformat.get_multiplier(result[column])\r
136             self.has_multipliers = True\r
137         else:\r
138             self.has_multipliers = False\r
139 \r
140 class ResultsMultiDistance(Results):\r
141     def __init__(self):\r
142         Results.__init__(self)\r
143         self.columns = ['Distance']\r
144         self.units['Distance'] = 'm'\r
145         self.set_decimals(2)\r
146 \r
147     def update(self):\r
148         if (self.results) > 0:\r
149             for result in self.results:\r
150                 if result.visible:\r
151                     reference_peak = result.x\r
152                     break\r
153 \r
154             for result in self.results:\r
155                 if result.visible:\r
156                     result.result['Distance'] = reference_peak - result.x\r
157                     reference_peak = result.x\r
158                 else:\r
159                     result.result['Distance'] = nan\r
160 \r
161 \r
162 class ResultsWLC(Results):\r
163     def __init__(self):\r
164         Results.__init__(self)\r
165         self.columns = ['Contour length', 'sigma contour length', 'Persistence length', 'sigma persistence length', 'Rupture force', 'Slope', 'Loading rate']\r
166         self.units['Contour length'] = 'm'\r
167         self.units['sigma contour length'] = 'm'\r
168         self.units['Persistence length'] = 'm'\r
169         self.units['sigma persistence length'] = 'm'\r
170         self.units['Rupture force'] = 'N'\r
171         self.units['Slope'] = 'N/m'\r
172         self.units['Loading rate'] = 'N/s'\r
173         self.set_decimals(2)\r
174 \r
175     def set_multipliers(self, index=0):\r
176         if self.has_results():\r
177             for column in self.columns:\r
178                 #result will contain the results dictionary at 'index'\r
179                 result = self.results[index].result\r
180                 #in position 0 of the result we find the value\r
181                 if column == 'sigma contour length':\r
182                     self.multipliers[column] = self.multipliers['Contour length']\r
183                 elif column == 'sigma persistence length':\r
184                     self.multipliers[column] = self.multipliers['Persistence length']\r
185                 else:\r
186                     self.multipliers[column] = prettyformat.get_multiplier(result[column])\r
187             self.has_multipliers = True\r
188         else:\r
189             self.has_multipliers = False\r