def __call__(self, *args, **kwargs): """Log the data passed via *args, and send them to the plotting process, if available.""" finished = False save_figure = '' x_values = None igs = nm.arange(self.n_gr) full = True if kwargs: if 'finished' in kwargs: finished = kwargs['finished'] if 'save_figure' in kwargs: save_figure = kwargs['save_figure'] if 'x' in kwargs: x_values = kwargs['x'] if 'igs' in kwargs: igs = nm.array(kwargs['igs']) full = False if save_figure and (self.plot_pipe is not None): self.plot_pipe.send(['save', save_figure]) ok = self.plot_pipe.recv() if finished: self.terminate() return ls = len(args), self.n_arg if full and (ls[0] != ls[1]): if kwargs: return else: msg = 'log called with wrong number of arguments! (%d == %d)' \ % ls raise IndexError(msg) for ig in igs: if (x_values is not None) and (x_values[ig] is not None): self.x_values[ig].append(x_values[ig]) else: if len(self.x_values[ig]): ii = self.x_values[ig][-1] + 1 else: ii = 0 self.x_values[ig].append(ii) for ig, ii, iseq, name in self.iter_names(igs): aux = args[iseq] if isinstance(aux, nm.ndarray): aux = nm.array(aux, ndmin=1) if len(aux) == 1: aux = aux[0] else: raise ValueError, 'can log only scalars (%s)' % aux key = name_to_key(name, ii) self.data[key].append(aux) if self.output: self.output(('%%s: %%s: %s' % self.formats[key]) % (name, self.x_values[ig][-1], aux)) if self.is_plot and self.can_plot: if self.n_calls == 0: atexit.register(self.terminate) self.__class__.count += 1 self.plot_pipe, plotter_pipe = Pipe() self.plotter = ProcessPlotter(self.aggregate) self.plot_process = Process( target=self.plotter, args=(plotter_pipe, self.get_log_name(), self.data_names, self.yscales, self.xlabels, self.ylabels)) self.plot_process.daemon = True self.plot_process.start() self.plot_data(igs) self.n_calls += 1