comparison geotemco/lib/simile/timeplot/scripts/processor.js @ 0:b12c99b7c3f0

commit for previous development
author Zoe Hong <zhong@mpiwg-berlin.mpg.de>
date Mon, 19 Jan 2015 17:13:49 +0100
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:b12c99b7c3f0
1 /**
2 * Processing Data Source
3 *
4 * @fileOverview Processing Data Source and Operators
5 * @name Processor
6 */
7
8 /* -----------------------------------------------------------------------------
9 * Operators
10 *
11 * These are functions that can be used directly as Timeplot.Processor operators
12 * ----------------------------------------------------------------------------- */
13
14 Timeplot.Operator = {
15
16 /**
17 * This is the operator used when you want to draw the cumulative sum
18 * of a time series and not, for example, their daily values.
19 */
20 sum: function(data, params) {
21 return Timeplot.Math.integral(data.values);
22 },
23
24 /**
25 * This is the operator that is used to 'smooth' a given time series
26 * by taking the average value of a moving window centered around
27 * each value. The size of the moving window is influenced by the 'size'
28 * parameters in the params map.
29 */
30 average: function(data, params) {
31 var size = ("size" in params) ? params.size : 30;
32 var result = Timeplot.Math.movingAverage(data.values, size);
33 return result;
34 }
35 }
36
37 /*==================================================
38 * Processing Data Source
39 *==================================================*/
40
41 /**
42 * A Processor is a special DataSource that can apply an Operator
43 * to the DataSource values and thus return a different one.
44 *
45 * @constructor
46 */
47 Timeplot.Processor = function(dataSource, operator, params) {
48 this._dataSource = dataSource;
49 this._operator = operator;
50 this._params = params;
51
52 this._data = {
53 times: new Array(),
54 values: new Array()
55 };
56
57 this._range = {
58 earliestDate: null,
59 latestDate: null,
60 min: 0,
61 max: 0
62 };
63
64 var processor = this;
65 this._processingListener = {
66 onAddMany: function() { processor._process(); },
67 onClear: function() { processor._clear(); }
68 }
69 this.addListener(this._processingListener);
70 };
71
72 Timeplot.Processor.prototype = {
73
74 _clear: function() {
75 this.removeListener(this._processingListener);
76 this._dataSource._clear();
77 },
78
79 _process: function() {
80 // this method requires the dataSource._process() method to be
81 // called first as to setup the data and range used below
82 // this should be guaranteed by the order of the listener registration
83
84 var data = this._dataSource.getData();
85 var range = this._dataSource.getRange();
86
87 var newValues = this._operator(data, this._params);
88 var newValueRange = Timeplot.Math.range(newValues);
89
90 this._data = {
91 times: data.times,
92 values: newValues
93 };
94
95 this._range = {
96 earliestDate: range.earliestDate,
97 latestDate: range.latestDate,
98 min: newValueRange.min,
99 max: newValueRange.max
100 };
101 },
102
103 getRange: function() {
104 return this._range;
105 },
106
107 getData: function() {
108 return this._data;
109 },
110
111 getValue: Timeplot.DataSource.prototype.getValue,
112
113 getClosestValidTime: Timeplot.DataSource.prototype.getClosestValidTime,
114
115 addListener: function(listener) {
116 this._dataSource.addListener(listener);
117 },
118
119 removeListener: function(listener) {
120 this._dataSource.removeListener(listener);
121 }
122 }