ctioga2 0.0 → 0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Changelog +25 -1
- data/lib/ctioga2/commands/commands.rb +13 -2
- data/lib/ctioga2/commands/doc/doc.rb +13 -17
- data/lib/ctioga2/commands/doc/documentation-commands.rb +14 -1
- data/lib/ctioga2/commands/doc/help.rb +136 -25
- data/lib/ctioga2/commands/doc/html.rb +56 -4
- data/lib/ctioga2/commands/doc/introspection.rb +45 -9
- data/lib/ctioga2/commands/doc/man.rb +7 -5
- data/lib/ctioga2/commands/doc/markup.rb +39 -12
- data/lib/ctioga2/commands/doc/wordwrap.rb +70 -0
- data/lib/ctioga2/commands/general-commands.rb +7 -4
- data/lib/ctioga2/commands/general-types.rb +27 -12
- data/lib/ctioga2/commands/interpreter.rb +2 -2
- data/lib/ctioga2/commands/parsers/command-line.rb +9 -5
- data/lib/ctioga2/commands/parsers/file.rb +5 -3
- data/lib/ctioga2/commands/type.rb +10 -3
- data/lib/ctioga2/commands/variables.rb +2 -2
- data/lib/ctioga2/data/backends/backend.rb +17 -15
- data/lib/ctioga2/data/backends/backends.rb +2 -2
- data/lib/ctioga2/data/backends/backends/gnuplot.rb +20 -5
- data/lib/ctioga2/data/backends/backends/math.rb +2 -2
- data/lib/ctioga2/data/backends/backends/text.rb +112 -17
- data/lib/ctioga2/data/backends/description.rb +10 -11
- data/lib/ctioga2/data/datacolumn.rb +73 -14
- data/lib/ctioga2/data/dataset.rb +305 -9
- data/lib/ctioga2/data/filters.rb +49 -1
- data/lib/ctioga2/data/indexed-dtable.rb +137 -0
- data/lib/ctioga2/data/point.rb +98 -7
- data/lib/ctioga2/data/stack.rb +98 -21
- data/lib/ctioga2/graphics/coordinates.rb +19 -2
- data/lib/ctioga2/graphics/elements.rb +12 -2
- data/lib/ctioga2/graphics/elements/containers.rb +14 -2
- data/lib/ctioga2/graphics/elements/contour.rb +67 -0
- data/lib/ctioga2/graphics/elements/curve2d.rb +103 -42
- data/lib/ctioga2/graphics/elements/element.rb +12 -2
- data/lib/ctioga2/graphics/elements/gradient-region.rb +94 -0
- data/lib/ctioga2/graphics/elements/parametric2d.rb +172 -0
- data/lib/ctioga2/graphics/elements/primitive.rb +37 -21
- data/lib/ctioga2/graphics/elements/region.rb +143 -0
- data/lib/ctioga2/graphics/elements/subplot.rb +92 -32
- data/lib/ctioga2/graphics/elements/tangent.rb +99 -0
- data/lib/ctioga2/graphics/elements/xyz-map.rb +126 -0
- data/lib/ctioga2/graphics/generator.rb +91 -6
- data/lib/ctioga2/graphics/legends.rb +26 -21
- data/lib/ctioga2/graphics/legends/area.rb +8 -8
- data/lib/ctioga2/graphics/legends/items.rb +5 -5
- data/lib/ctioga2/graphics/legends/storage.rb +4 -2
- data/lib/ctioga2/graphics/root.rb +24 -2
- data/lib/ctioga2/graphics/styles.rb +8 -0
- data/lib/ctioga2/graphics/styles/axes.rb +49 -23
- data/lib/ctioga2/graphics/styles/base.rb +2 -2
- data/lib/ctioga2/graphics/styles/carrays.rb +9 -2
- data/lib/ctioga2/graphics/styles/colormap.rb +272 -0
- data/lib/ctioga2/graphics/styles/curve.rb +64 -4
- data/lib/ctioga2/graphics/styles/drawable.rb +68 -9
- data/lib/ctioga2/graphics/styles/errorbar.rb +73 -0
- data/lib/ctioga2/graphics/styles/factory.rb +133 -17
- data/lib/ctioga2/graphics/styles/gradients.rb +60 -0
- data/lib/ctioga2/graphics/styles/location.rb +64 -0
- data/lib/ctioga2/graphics/styles/map-axes.rb +164 -0
- data/lib/ctioga2/graphics/styles/plot.rb +165 -62
- data/lib/ctioga2/graphics/styles/sets.rb +14 -1
- data/lib/ctioga2/graphics/styles/texts.rb +44 -34
- data/lib/ctioga2/graphics/subplot-commands.rb +94 -6
- data/lib/ctioga2/graphics/types.rb +113 -35
- data/lib/ctioga2/graphics/types/bijection.rb +3 -3
- data/lib/ctioga2/graphics/types/boundaries.rb +120 -1
- data/lib/ctioga2/graphics/types/dimensions.rb +8 -1
- data/lib/ctioga2/graphics/types/grid.rb +196 -0
- data/lib/ctioga2/graphics/types/location.rb +228 -0
- data/lib/ctioga2/graphics/types/point.rb +2 -2
- data/lib/ctioga2/log.rb +18 -18
- data/lib/ctioga2/metabuilder/type.rb +15 -3
- data/lib/ctioga2/metabuilder/types.rb +2 -2
- data/lib/ctioga2/metabuilder/types/coordinates.rb +13 -1
- data/lib/ctioga2/metabuilder/types/data.rb +50 -0
- data/lib/ctioga2/metabuilder/types/generic.rb +60 -0
- data/lib/ctioga2/metabuilder/types/lists.rb +53 -16
- data/lib/ctioga2/metabuilder/types/styles.rb +26 -45
- data/lib/ctioga2/plotmaker.rb +91 -20
- data/lib/ctioga2/postprocess.rb +8 -8
- data/lib/ctioga2/utils.rb +23 -4
- metadata +107 -75
- data/lib/ctioga2/data/merge.rb +0 -43
data/lib/ctioga2/data/filters.rb
CHANGED
|
@@ -19,7 +19,7 @@ require 'ctioga2/data/backends/factory'
|
|
|
19
19
|
# This module contains all the classes used by ctioga
|
|
20
20
|
module CTioga2
|
|
21
21
|
|
|
22
|
-
Version::register_svn_info('$Revision:
|
|
22
|
+
Version::register_svn_info('$Revision: 194 $', '$Date: 2010-11-22 10:26:54 +0100 (Mon, 22 Nov 2010) $')
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
module Data
|
|
@@ -81,6 +81,8 @@ EOH
|
|
|
81
81
|
TrimFilter =
|
|
82
82
|
Cmd.new("trim", nil, "--trim",
|
|
83
83
|
[CmdArg.new('integer')], {}) do |plotmaker, number, opts|
|
|
84
|
+
## @todo There should be a way to add commands in a type-safe
|
|
85
|
+
## way, without having to convert to string first.
|
|
84
86
|
plotmaker.data_stack.add_to_dataset_hook("trim-last(#{number})")
|
|
85
87
|
end
|
|
86
88
|
|
|
@@ -124,6 +126,52 @@ Install the {command: cherry-pick-last} command as a dataset hook (see
|
|
|
124
126
|
false for subsequent datasets will be removed.
|
|
125
127
|
EOH
|
|
126
128
|
|
|
129
|
+
AverageDupOperation =
|
|
130
|
+
Cmd.new("avg-dup-last", nil, "--avg-dup-last",
|
|
131
|
+
[], {}) do |plotmaker|
|
|
132
|
+
plotmaker.data_stack.last.average_duplicates!
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
AverageDupOperation.describe("Average successive elements with identical X values",
|
|
136
|
+
<<EOH, FiltersGroup)
|
|
137
|
+
Averages successive points with identical X values. This algorithm is
|
|
138
|
+
naive with respect to the min/max values and averages them just as
|
|
139
|
+
well, whereas one might expect something more clever.
|
|
140
|
+
|
|
141
|
+
To average over identical X values when they are not successive in the
|
|
142
|
+
dataset, you might want to hand it over to {command: sort-last} first.
|
|
143
|
+
|
|
144
|
+
EOH
|
|
145
|
+
|
|
146
|
+
AverageDupFilter =
|
|
147
|
+
Cmd.new("avg-dup", nil, "--avg-dup",
|
|
148
|
+
[], {}) do |plotmaker, formula|
|
|
149
|
+
plotmaker.data_stack.add_to_dataset_hook("avg-dup-last()")
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
AverageDupFilter.describe("Systematicallly average successive elements with identical X values",
|
|
153
|
+
<<EOH, FiltersGroup)
|
|
154
|
+
Install the {command: avg-dup-last} command as a dataset hook (see
|
|
155
|
+
{command: dataset-hook}): all datasets acquired after this is on will
|
|
156
|
+
be averaged if they have identical successive values of X.
|
|
157
|
+
EOH
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
SmoothOperation =
|
|
161
|
+
Cmd.new("smooth-last", nil, "--smooth-last",
|
|
162
|
+
[CmdArg.new('integer')], {}) do |plotmaker, number|
|
|
163
|
+
plotmaker.data_stack.last.naive_smooth!(number)
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
SmoothOperation.describe("Smooths data using a gaussian filter",
|
|
167
|
+
<<EOH, FiltersGroup)
|
|
168
|
+
Smooth the data using a simple (naive even) gaussian filter. Good for
|
|
169
|
+
producing 'lines to guide the eye'
|
|
170
|
+
EOH
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
|
|
127
175
|
|
|
128
176
|
end
|
|
129
177
|
end
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# indexed-dtable.rb: A Dtable object with non-uniform XY values
|
|
2
|
+
# copyright (c) 2009 by Vincent Fourmond
|
|
3
|
+
|
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
|
6
|
+
# the Free Software Foundation; either version 2 of the License, or
|
|
7
|
+
# (at your option) any later version.
|
|
8
|
+
|
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
+
# GNU General Public License for more details (in the COPYING file).
|
|
13
|
+
|
|
14
|
+
require 'ctioga2/utils'
|
|
15
|
+
|
|
16
|
+
module CTioga2
|
|
17
|
+
|
|
18
|
+
Version::register_svn_info('$Revision: 181 $', '$Date: 2010-10-27 15:18:35 +0200 (Wed, 27 Oct 2010) $')
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
module Data
|
|
22
|
+
|
|
23
|
+
# An indexed Dtable.
|
|
24
|
+
#
|
|
25
|
+
# This object represents an indexed Dtable, that is a Dtable with
|
|
26
|
+
# given values of X and Y (not necessarily uniform). Its main use
|
|
27
|
+
# is to get back a uniform (non-indexed) Dtable, for use with
|
|
28
|
+
# create_image
|
|
29
|
+
#
|
|
30
|
+
# An important information is that places where there was no data
|
|
31
|
+
# is implicitly represented as NaN
|
|
32
|
+
class IndexedDTable
|
|
33
|
+
|
|
34
|
+
# The underlying Dtable
|
|
35
|
+
attr_accessor :table
|
|
36
|
+
|
|
37
|
+
# X values
|
|
38
|
+
attr_accessor :x_values
|
|
39
|
+
|
|
40
|
+
# Y values
|
|
41
|
+
attr_accessor :y_values
|
|
42
|
+
|
|
43
|
+
def initialize(x, y, t)
|
|
44
|
+
@table = t
|
|
45
|
+
@x_values = x
|
|
46
|
+
@y_values = y
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Returns the XY boundaries of the object
|
|
50
|
+
def xy_boundaries
|
|
51
|
+
return Graphics::Types::Boundaries.bounds(@x_values, @y_values)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Returns the value by which one should shift the X and Y
|
|
55
|
+
# positions of the borders of the images in order to get the
|
|
56
|
+
# points centered on their pixel (for a *uniform* grid !).
|
|
57
|
+
#
|
|
58
|
+
# While this correction looks better on non-uniform grids, it
|
|
59
|
+
# does not guarantee that it places all the points int the
|
|
60
|
+
# middle of their pixel, but that is still true for the ones at
|
|
61
|
+
# the border.
|
|
62
|
+
def xy_correction
|
|
63
|
+
return [(@x_values.last - @x_values.first)/ (2 * @x_values.size),
|
|
64
|
+
(@y_values.last - @y_values.first)/ (2 * @y_values.size)]
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Returns the coordinates of the lower-left XY values
|
|
68
|
+
def ll
|
|
69
|
+
return [@x_values.first, @y_values.first]
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Returns the coordinates of the lower-left XY values
|
|
73
|
+
def lr
|
|
74
|
+
return [@x_values.last, @y_values.first]
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Returns the coordinates of the upper-right XY values
|
|
78
|
+
def ur
|
|
79
|
+
return [@x_values.last, @y_values.last]
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Returns the coordinates of the upper-right XY values
|
|
83
|
+
def ul
|
|
84
|
+
return [@x_values.first, @y_values.last]
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Returns a hash ul,ll,lr with the corresponding values of the
|
|
88
|
+
# the points, with the correction applied if correction is true
|
|
89
|
+
def corner_positions(correction = true)
|
|
90
|
+
dict = {
|
|
91
|
+
'll' => ll,
|
|
92
|
+
'lr' => lr,
|
|
93
|
+
'ul' => ul
|
|
94
|
+
}
|
|
95
|
+
if correction
|
|
96
|
+
dx, dy = *xy_correction
|
|
97
|
+
# This isn't really beautiful, but it just works.
|
|
98
|
+
dict['ll'][0] -= dx
|
|
99
|
+
dict['lr'][0] += dx
|
|
100
|
+
dict['ul'][0] -= dx
|
|
101
|
+
|
|
102
|
+
dict['ll'][1] -= dy
|
|
103
|
+
dict['lr'][1] -= dy
|
|
104
|
+
dict['ul'][1] += dy
|
|
105
|
+
end
|
|
106
|
+
return dict
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def width
|
|
110
|
+
return @x_values.size
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def height
|
|
114
|
+
return @y_values.size
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# Returns a [xs, ys, gaps] triplet suitable for use with
|
|
118
|
+
# t.append_points_with_gaps_to_path to show the given level.
|
|
119
|
+
#
|
|
120
|
+
# @todo add algorithm choice too
|
|
121
|
+
def make_contour(level)
|
|
122
|
+
gaps = []
|
|
123
|
+
# Requires Tioga r598
|
|
124
|
+
xs, ys = *Tioga::FigureMaker.make_contour('data' => @table,
|
|
125
|
+
'xs' => @x_values,
|
|
126
|
+
'ys' => @y_values,
|
|
127
|
+
'gaps' => gaps,
|
|
128
|
+
'level' => level)
|
|
129
|
+
return [xs, ys, gaps]
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
end
|
|
137
|
+
|
data/lib/ctioga2/data/point.rb
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# point.rb: a point in a given dataset
|
|
2
2
|
# copyright (c) 2009 by Vincent Fourmond
|
|
3
|
-
|
|
3
|
+
|
|
4
4
|
# This program is free software; you can redistribute it and/or modify
|
|
5
5
|
# it under the terms of the GNU General Public License as published by
|
|
6
6
|
# the Free Software Foundation; either version 2 of the License, or
|
|
7
7
|
# (at your option) any later version.
|
|
8
|
-
|
|
8
|
+
|
|
9
9
|
# This program is distributed in the hope that it will be useful,
|
|
10
10
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
11
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
@@ -17,7 +17,7 @@ require 'ctioga2/data/dataset'
|
|
|
17
17
|
|
|
18
18
|
module CTioga2
|
|
19
19
|
|
|
20
|
-
Version::register_svn_info('$Revision:
|
|
20
|
+
Version::register_svn_info('$Revision: 112 $', '$Date: 2009-11-09 22:34:12 +0100 (Mon, 09 Nov 2009) $')
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
module Data
|
|
@@ -33,7 +33,9 @@ module CTioga2
|
|
|
33
33
|
attr_accessor :index
|
|
34
34
|
|
|
35
35
|
# Creates a DataPoint with the given information.
|
|
36
|
-
def initialize(index
|
|
36
|
+
def initialize(dataset,index)
|
|
37
|
+
@dataset = dataset
|
|
38
|
+
@index = index
|
|
37
39
|
end
|
|
38
40
|
|
|
39
41
|
# Creates a DataPoint object based on the following _text_
|
|
@@ -50,6 +52,7 @@ module CTioga2
|
|
|
50
52
|
idx = $3.to_i
|
|
51
53
|
end
|
|
52
54
|
dataset = plotmaker.data_stack.stored_dataset(which)
|
|
55
|
+
|
|
53
56
|
if ! dataset
|
|
54
57
|
raise "Invalid or empty dataset: #{which}"
|
|
55
58
|
end
|
|
@@ -61,11 +64,99 @@ module CTioga2
|
|
|
61
64
|
raise "Not a valid datapoint specification: '#{text}'"
|
|
62
65
|
end
|
|
63
66
|
end
|
|
67
|
+
|
|
68
|
+
# @todo functions returning xy values + slope for the given
|
|
69
|
+
# datapoint. For each, possibility to average over several points.
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
# Returns the averaged X value around the datapoint
|
|
73
|
+
def x_val(navg = 3)
|
|
74
|
+
|
|
75
|
+
xvect = @dataset.x.values
|
|
76
|
+
di = (navg-1)/2
|
|
77
|
+
navg = 2*di + 1
|
|
78
|
+
|
|
79
|
+
idx = usable_index(di, xvect.size)
|
|
80
|
+
|
|
81
|
+
xval = 0
|
|
82
|
+
(idx-di).upto(idx+di) do |i|
|
|
83
|
+
xval += xvect[i]
|
|
84
|
+
end
|
|
85
|
+
return xval/(navg)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# Returns the averaged Y value around the datapoint
|
|
90
|
+
def y_val(navg = 3)
|
|
91
|
+
yvect = @dataset.y.values
|
|
92
|
+
di = (navg-1)/2
|
|
93
|
+
navg = 2*di + 1
|
|
94
|
+
|
|
95
|
+
idx = usable_index(di, yvect.size)
|
|
96
|
+
|
|
97
|
+
yval = 0
|
|
98
|
+
(idx-di).upto(idx+di) do |i|
|
|
99
|
+
yval += yvect[i]
|
|
100
|
+
end
|
|
101
|
+
return yval/(navg)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Returns the value of the slope around the datapoint. This is
|
|
105
|
+
# obtained using a linear regression, so it should be rather
|
|
106
|
+
# reliable.
|
|
107
|
+
def slope(navg = 3)
|
|
108
|
+
xvect = @dataset.x.values
|
|
109
|
+
yvect = @dataset.y.values
|
|
110
|
+
di = (navg-1)/2
|
|
111
|
+
navg = 2*di + 1
|
|
112
|
+
|
|
113
|
+
idx = usable_index(di, xvect.size)
|
|
114
|
+
|
|
115
|
+
sx = 0
|
|
116
|
+
sxx = 0
|
|
117
|
+
sxy = 0
|
|
118
|
+
sy = 0
|
|
119
|
+
|
|
120
|
+
(idx-di).upto(idx+di) do |i|
|
|
121
|
+
sx += xvect[i]
|
|
122
|
+
sy += yvect[i]
|
|
123
|
+
sxx += xvect[i]**2
|
|
124
|
+
sxy += xvect[i] * yvect[i]
|
|
125
|
+
end
|
|
126
|
+
if sxx*navg == sx*sx
|
|
127
|
+
return 1
|
|
128
|
+
else
|
|
129
|
+
return (sxy * navg - sx*sy)/(sxx * navg - sx*sx)
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
## Returns the average value of the difference between two
|
|
134
|
+
# consecutive X values
|
|
135
|
+
def dx(navg = 3)
|
|
136
|
+
xvect = @dataset.x.values
|
|
137
|
+
di = (navg-1)/2
|
|
138
|
+
navg = 2*di + 1
|
|
139
|
+
|
|
140
|
+
idx = usable_index(di, xvect.size)
|
|
141
|
+
return (xvect[idx+di]-xvect[idx-di])/navg
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
protected
|
|
146
|
+
# Makes sure the boudaries for averaging are fine
|
|
147
|
+
def usable_index(di, size)
|
|
148
|
+
# Boundary checks
|
|
149
|
+
if @index - di < 0
|
|
150
|
+
return di
|
|
151
|
+
elsif @index + di >= size
|
|
152
|
+
return size - 1 - di
|
|
153
|
+
end
|
|
154
|
+
return @index
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
|
|
64
158
|
end
|
|
65
159
|
|
|
66
|
-
# TODO: functions returning xy values + slope for the given
|
|
67
|
-
# datapoint. For each, possibility to average over several points.
|
|
68
|
-
|
|
69
160
|
end
|
|
70
161
|
|
|
71
162
|
end
|
data/lib/ctioga2/data/stack.rb
CHANGED
|
@@ -25,7 +25,7 @@ require 'ctioga2/data/filters'
|
|
|
25
25
|
# This module contains all the classes used by ctioga
|
|
26
26
|
module CTioga2
|
|
27
27
|
|
|
28
|
-
Version::register_svn_info('$Revision:
|
|
28
|
+
Version::register_svn_info('$Revision: 233 $', '$Date: 2011-01-20 10:26:42 +0100 (Thu, 20 Jan 2011) $')
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
module Data
|
|
@@ -33,7 +33,7 @@ module CTioga2
|
|
|
33
33
|
# This is the central class for acquisition and handling of
|
|
34
34
|
# Dataset objects, retrieved from from a Backends::BackendFactory.
|
|
35
35
|
#
|
|
36
|
-
#
|
|
36
|
+
# \todo provide real stack manipulation functions such as
|
|
37
37
|
#
|
|
38
38
|
# * interpolation: pops the last object from the stack and add its
|
|
39
39
|
# interpolated values on the element before.
|
|
@@ -55,7 +55,7 @@ module CTioga2
|
|
|
55
55
|
# A hook executed every time a dataset is pushed unto the stack
|
|
56
56
|
# using #add_dataset.
|
|
57
57
|
#
|
|
58
|
-
#
|
|
58
|
+
# \todo this string is parsed for each call to
|
|
59
59
|
# #add_dataset. Perhaps it would be good to provide a way to
|
|
60
60
|
# record a Command call, without parsing it from scratch ???
|
|
61
61
|
#
|
|
@@ -77,35 +77,39 @@ module CTioga2
|
|
|
77
77
|
# Performs expansion on the given _set_ with the current
|
|
78
78
|
# backend, retrieves corresponding Dataset objects, pushes them
|
|
79
79
|
# onto the stack and returns them.
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
80
|
+
def get_datasets(set, options = {})
|
|
81
|
+
backend = @backend_factory.current
|
|
82
|
+
sets = backend.expand_sets(set)
|
|
83
|
+
datasets = sets.map do |s|
|
|
84
|
+
backend.dataset(s)
|
|
85
|
+
end
|
|
86
|
+
add_datasets(datasets, options)
|
|
87
|
+
return datasets
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Adds a series of datasets, and perform various operations
|
|
91
|
+
# according to the hash _options_:
|
|
83
92
|
#
|
|
84
93
|
# * 'name' to name each element added to the stack. A %d will be
|
|
85
94
|
# replaced by the number of the dataset within the ones just
|
|
86
95
|
# added.
|
|
87
96
|
#
|
|
88
97
|
# Additional members of the Hash are simply ignored.
|
|
89
|
-
def
|
|
90
|
-
backend = @backend_factory.current
|
|
91
|
-
retval = []
|
|
98
|
+
def add_datasets(datasets, options = {})
|
|
92
99
|
i = 0
|
|
93
|
-
for
|
|
94
|
-
ds
|
|
95
|
-
add_dataset(ds, options['ignore_hooks'])
|
|
100
|
+
for ds in datasets
|
|
101
|
+
store_dataset(ds, options['ignore_hooks'])
|
|
96
102
|
|
|
97
103
|
# Selection
|
|
98
104
|
if options['where']
|
|
99
105
|
ds.select_formula!(options['where'])
|
|
100
106
|
end
|
|
101
107
|
|
|
102
|
-
retval << ds
|
|
103
108
|
if options['name']
|
|
104
109
|
@named_datasets[options['name'] % [i]] = ds
|
|
105
110
|
end
|
|
106
111
|
i += 1
|
|
107
112
|
end
|
|
108
|
-
return retval
|
|
109
113
|
end
|
|
110
114
|
|
|
111
115
|
# Returns the stored dataset, either using its index in the
|
|
@@ -139,16 +143,16 @@ module CTioga2
|
|
|
139
143
|
# necessary.
|
|
140
144
|
#
|
|
141
145
|
# Makes use of Plotmaker.plotmaker
|
|
142
|
-
def
|
|
146
|
+
def store_dataset(dataset, ignore_hooks = false)
|
|
143
147
|
@stack << dataset
|
|
144
148
|
if @dataset_hook && (! ignore_hooks)
|
|
145
|
-
#
|
|
149
|
+
# \todo error handling
|
|
146
150
|
begin
|
|
147
151
|
PlotMaker.plotmaker.interpreter.run_commands(@dataset_hook)
|
|
148
152
|
rescue Exception => e
|
|
149
|
-
error "There was a problem running the dataset hook '#{@dataset_hook}', disabling it"
|
|
153
|
+
error { "There was a problem running the dataset hook '#{@dataset_hook}', disabling it" }
|
|
150
154
|
@dataset_hook = nil
|
|
151
|
-
info "-> '#{format_exception e}'"
|
|
155
|
+
info { "-> '#{format_exception e}'" }
|
|
152
156
|
end
|
|
153
157
|
end
|
|
154
158
|
end
|
|
@@ -172,7 +176,7 @@ module CTioga2
|
|
|
172
176
|
end
|
|
173
177
|
end
|
|
174
178
|
|
|
175
|
-
# Pops the last _n_ datasets off the stack
|
|
179
|
+
# Pops the last _n_ datasets off the stack and pushes back the
|
|
176
180
|
def concatenate_datasets(n = 2)
|
|
177
181
|
ds = @stack.pop
|
|
178
182
|
raise "Nothing on the stack" unless ds
|
|
@@ -184,6 +188,17 @@ module CTioga2
|
|
|
184
188
|
@stack.push(ds)
|
|
185
189
|
end
|
|
186
190
|
|
|
191
|
+
# Merges the last datasets into a new one.
|
|
192
|
+
#
|
|
193
|
+
# Over
|
|
194
|
+
def merge_datasets(n = 2, columns = [0], precision = nil)
|
|
195
|
+
ds = @stack.pop
|
|
196
|
+
raise "Nothing on the stack" unless ds
|
|
197
|
+
datasets = @stack[-1..-(n-1)]
|
|
198
|
+
ds.merge_datasets_in(datasets, columns, precision)
|
|
199
|
+
@stack.push(ds)
|
|
200
|
+
end
|
|
201
|
+
|
|
187
202
|
# Returns the last Dataset pushed onto the stack.
|
|
188
203
|
def last
|
|
189
204
|
return @stack.last
|
|
@@ -223,12 +238,43 @@ number. See the type {type: stored-dataset} for more information.
|
|
|
223
238
|
|
|
224
239
|
EOH
|
|
225
240
|
|
|
241
|
+
ContourOptions = LoadDatasetOptions.dup.update({
|
|
242
|
+
'which' => CmdArg.new('stored-dataset'),
|
|
243
|
+
})
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
MakeContourCommand =
|
|
248
|
+
Cmd.new("make-contour", nil, "--make-contour",
|
|
249
|
+
[ CmdArg.new('float'), ],
|
|
250
|
+
ContourOptions) do |plotmaker, level, opts|
|
|
251
|
+
ds = plotmaker.data_stack.specified_dataset(opts)
|
|
252
|
+
f = ds.make_contour(level)
|
|
253
|
+
name = "Level #{level} for plot '#{ds.name}'"
|
|
254
|
+
newds = Dataset.new(name, [f.x, f.y])
|
|
255
|
+
plotmaker.data_stack.add_datasets([newds], opts)
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
MakeContourCommand.describe("Pushes a contour on the data stack",
|
|
259
|
+
<<EOH, DataStackGroup)
|
|
260
|
+
EOH
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
|
|
226
264
|
|
|
227
265
|
PrintLastCommand =
|
|
228
266
|
Cmd.new("print-dataset", '-P', "--print-dataset",
|
|
229
|
-
[], {
|
|
267
|
+
[], {
|
|
268
|
+
'which' => CmdArg.new('stored-dataset'),
|
|
269
|
+
'save' => CmdArg.new('file'),
|
|
270
|
+
}) do |plotmaker,opts|
|
|
230
271
|
ds = plotmaker.data_stack.specified_dataset(opts)
|
|
231
|
-
|
|
272
|
+
if opts['save']
|
|
273
|
+
out = open(opts['save'], 'w')
|
|
274
|
+
else
|
|
275
|
+
out = STDOUT
|
|
276
|
+
end
|
|
277
|
+
plotmaker.data_stack.print_dataset(ds, out)
|
|
232
278
|
end
|
|
233
279
|
|
|
234
280
|
PrintLastCommand.describe("Prints the dataset last pushed on the stack",
|
|
@@ -251,6 +297,37 @@ stack, concatenates them (older last) and push them back onto the
|
|
|
251
297
|
stack.
|
|
252
298
|
EOH
|
|
253
299
|
|
|
300
|
+
|
|
301
|
+
MergeToLastCommand =
|
|
302
|
+
Cmd.new("merge-datasets", nil, "--merge-datasets",
|
|
303
|
+
[], {'number' => CmdArg.new('integer')}) do |plotmaker, opts|
|
|
304
|
+
nb = opts['number'] || 2
|
|
305
|
+
## @todo all
|
|
306
|
+
plotmaker.data_stack.merge_datasets(nb)
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
MergeToLastCommand.describe("....",
|
|
310
|
+
<<EOH, DataStackGroup)
|
|
311
|
+
....
|
|
312
|
+
EOH
|
|
313
|
+
|
|
314
|
+
XYReglinCommand =
|
|
315
|
+
Cmd.new("xy-reglin", nil, "--xy-reglin", [], {
|
|
316
|
+
'which' => CmdArg.new('stored-dataset'),
|
|
317
|
+
'linear' => CmdArg.new('boolean'),
|
|
318
|
+
}) do |plotmaker,opts|
|
|
319
|
+
stack = plotmaker.data_stack
|
|
320
|
+
ds = stack.specified_dataset(opts)
|
|
321
|
+
coeffs, lines = ds.reglin(opts)
|
|
322
|
+
stack.store_dataset(lines, true)
|
|
323
|
+
stack.store_dataset(coeffs, true)
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
XYReglinCommand.describe("....",
|
|
327
|
+
<<EOH, DataStackGroup)
|
|
328
|
+
....
|
|
329
|
+
EOH
|
|
330
|
+
|
|
254
331
|
SetDatasetHookCommand =
|
|
255
332
|
Cmd.new("dataset-hook", nil, "--dataset-hook",
|
|
256
333
|
[CmdArg.new('commands')], {}) do |plotmaker, commands, opts|
|