7 import matplotlib.pyplot as plt
8 import matplotlib.ticker as mtick
15 from matplotlib.pyplot import xlabel
19 # TODO : to be replaced with a proper log system
21 LOG_FILE_NAME = os.path.splitext(__main__.__file__)[0] + '.log'
23 LOG_FILE_NAME = 'resultsBaseProcess.log'
24 logging.basicConfig(filename=LOG_FILE_NAME, level=logging.DEBUG)
25 # logging.basicConfig(filename=__main__.__file__+'resDb.log', level=logging.WARNING)
27 # TODO : shouldn't we use join??
30 def create_file_list(workDir, ext=None, fname_glob=None):
31 expanded_path = os.path.expanduser(workDir)
32 abs_path = os.path.abspath(expanded_path)
33 # TODO : we should test if directory exists
34 if fname_glob is None:
35 pattern_for_files = abs_path + '/*' + ext
37 pattern_for_files = abs_path + '/' + fname_glob
38 file_list = glob.glob(pattern_for_files)
41 # TODO : we should use regexp instead?
45 # TODO : the new tag system should be implemented
47 def __init__(self, file_name,
57 self.file_name = os.path.abspath(file_name)
58 absolute_root_name, ext = os.path.splitext(self.file_name)
59 root_name = os.path.basename(absolute_root_name)
60 self.root_name = root_name
61 self.file_extension = ext
63 self.tags.update(set(tags))
66 self.variable = variable
67 self.instant = instant
69 self.is_stationnary = is_stationnary
71 self.default_probe = self.create_default_probe()
72 # self.checkResFieldIsValid() # useless
73 for k in ['file_extension', 'code', 'variable',
74 'instant', 'step', 'is_stationnary', 'dim', 'default_probe', 'solver']:
75 self.tags.add('required:{}={}'.format(k, self.__dict__[k]))
79 for k, v in self.__dict__.items():
80 txt += "\t{}={}\n".format(k, v)
83 # does this really make sense?
85 # TODO : can be replaced with a prop
86 def setTags(self, newTags):
90 def __init__(self, file_name,variable_name,
96 self.file_name = file_name
97 self.variable_name=variable_name
98 self.probe_name = name
100 self.extract_data = ExtractData
101 self._tags = set(['required:probe_id={}'.format(self)])
102 self._tags.update(tags)
106 return self._tags.union(self.field_result.tags)
109 def master_tag(self):
110 return string.join(self._tags.union(self.field_result.tags), sep=";")
114 return self.extract_data(self)
117 def variable_name(self):
118 return self.variable_name
122 return self.file_name
125 # is it really useful?
126 def build_marker_default(probe):
129 # is it really useful?
130 def build_color_default(probe):
138 self.title = "empty title"
139 self.x_label = "xLabel"
140 self.y_label = "yLabel"
144 repr_str = '''\txRange={}
149 '''.format(self.x_range, self.y_range, self.title, self.x_label, self.y_label)
150 repr_str += "\tprobeList=\n"
151 for p in self.probes:
152 repr_str += "\t{}\n".format(p.name)
155 # the following seems quite useless
156 # # TODO: wtf! use attribute or property
157 # def set_xRange(self, xRange):
158 # self.xRange = xRange
160 # # TODO: wtf! use attribute or property
161 # def set_yRange(self, yRange):
162 # self.yRange = yRange
164 # # TODO: wtf! use attribute or property
165 # def set_xLabel(self, xLabel):
166 # self.xLabel = xLabel
168 # # TODO: wtf! use attribute or property
169 # def set_yLabel(self, yLabel):
170 # self.yLabel = yLabel
172 # TODO: use join instead?
174 def reset_probes(self):
178 def append_probes(self, new_probes):
179 self.probes += new_probes
181 # TODO: wtf! use attribute or property
182 def set_title(self, title):
187 build_label=build_label_default,
188 build_marker=build_marker_default,
189 build_color=build_color_default
192 probe_view_settings = {k: {} for k in self.probes}
193 logging.debug(probe_view_settings)
195 master_tag_dict = {p.master_tag: p for p in self.probes}
196 # TODO: can the following nested loop be recast into a single loop?
197 for pattern, settings in view_settings.items():
198 for p in dpath.search(master_tag_dict, "/" + pattern).values():
199 probe_view_settings[p].update(settings)
201 logging.debug(probe_view_settings)
203 fig = plt.figure(figsize=(10, 10))
204 plt.xlabel(self.x_label)
205 plt.ylabel(self.y_label)
206 plt.title(self.title)
208 plt.gca().ticklabel_format(useOffset=False, style='sci')
209 tickFormat = mtick.FormatStrFormatter("%.4e")
210 plt.gca().get_yaxis().set_major_formatter(tickFormat)
211 if len(self.x_range) > 0:
212 plt.xlim(self.x_range[0], self.x_range[1])
213 if len(self.y_range) > 0:
214 plt.ylim(self.y_range[0], self.y_range[1])
216 for probe in self.probes:
217 logging.debug(probe.file_name
219 + probe.variable_name)
221 # TODO : can we write this if-then in a more pythonist way?
222 if build_label == None:
225 probe_label = build_label(probe)
226 if build_color == None:
229 probe_color = build_color(probe)
231 plot_args = probe_view_settings[probe]
232 # plotArgs.update({'label' : probe_label})
233 plot_args['label'] = probe_label
234 # logging.debug(plotArgs)
235 plt.plot(x, var, **plot_args)
237 plt.legend(loc='best', frameon=False)
241 def plot_all_probes(db, variable_list, view_settings={}, x_range={}, y_range={}, x_label={}, y_label={}):
243 x_label = {k: 'x' for k in variable_list}
245 y_label = dict(zip(variable_list, variable_list))
246 for variable in variable_list:
247 probe_list = [f.get_default_probe()
248 for f in db if f.variable == variable]
249 data_view = DataView()
250 data_view.append_probes(probe_list)
251 data_view.y_label = y_label.get(variable, [])
252 data_view.x_label = x_label.get(variable, [])
253 data_view.x_range = x_range.get(variable, [])
254 data_view.y_range = y_range.get(variable, [])
255 data_view.set_title(variable)
256 data_view.plot(view_settings=view_settings)