ctioga2 0.0
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/COPYING +339 -0
- data/Changelog +6 -0
- data/bin/ctioga2 +26 -0
- data/lib/ctioga2/commands/arguments.rb +58 -0
- data/lib/ctioga2/commands/commands.rb +258 -0
- data/lib/ctioga2/commands/doc/doc.rb +118 -0
- data/lib/ctioga2/commands/doc/documentation-commands.rb +119 -0
- data/lib/ctioga2/commands/doc/help.rb +95 -0
- data/lib/ctioga2/commands/doc/html.rb +230 -0
- data/lib/ctioga2/commands/doc/introspection.rb +211 -0
- data/lib/ctioga2/commands/doc/man.rb +279 -0
- data/lib/ctioga2/commands/doc/markup.rb +359 -0
- data/lib/ctioga2/commands/general-commands.rb +119 -0
- data/lib/ctioga2/commands/general-types.rb +118 -0
- data/lib/ctioga2/commands/groups.rb +73 -0
- data/lib/ctioga2/commands/interpreter.rb +257 -0
- data/lib/ctioga2/commands/parsers/command-line.rb +187 -0
- data/lib/ctioga2/commands/parsers/file.rb +186 -0
- data/lib/ctioga2/commands/strings.rb +303 -0
- data/lib/ctioga2/commands/type.rb +100 -0
- data/lib/ctioga2/commands/variables.rb +101 -0
- data/lib/ctioga2/data/backends/backend.rb +260 -0
- data/lib/ctioga2/data/backends/backends.rb +39 -0
- data/lib/ctioga2/data/backends/backends/gnuplot.rb +140 -0
- data/lib/ctioga2/data/backends/backends/math.rb +121 -0
- data/lib/ctioga2/data/backends/backends/text.rb +335 -0
- data/lib/ctioga2/data/backends/description.rb +405 -0
- data/lib/ctioga2/data/backends/factory.rb +73 -0
- data/lib/ctioga2/data/backends/parameter.rb +109 -0
- data/lib/ctioga2/data/datacolumn.rb +245 -0
- data/lib/ctioga2/data/dataset.rb +233 -0
- data/lib/ctioga2/data/filters.rb +131 -0
- data/lib/ctioga2/data/merge.rb +43 -0
- data/lib/ctioga2/data/point.rb +72 -0
- data/lib/ctioga2/data/stack.rb +294 -0
- data/lib/ctioga2/graphics/coordinates.rb +73 -0
- data/lib/ctioga2/graphics/elements.rb +111 -0
- data/lib/ctioga2/graphics/elements/containers.rb +111 -0
- data/lib/ctioga2/graphics/elements/curve2d.rb +155 -0
- data/lib/ctioga2/graphics/elements/element.rb +90 -0
- data/lib/ctioga2/graphics/elements/primitive.rb +256 -0
- data/lib/ctioga2/graphics/elements/subplot.rb +140 -0
- data/lib/ctioga2/graphics/generator.rb +68 -0
- data/lib/ctioga2/graphics/legends.rb +108 -0
- data/lib/ctioga2/graphics/legends/area.rb +199 -0
- data/lib/ctioga2/graphics/legends/items.rb +183 -0
- data/lib/ctioga2/graphics/legends/provider.rb +58 -0
- data/lib/ctioga2/graphics/legends/storage.rb +65 -0
- data/lib/ctioga2/graphics/root.rb +209 -0
- data/lib/ctioga2/graphics/styles.rb +30 -0
- data/lib/ctioga2/graphics/styles/axes.rb +247 -0
- data/lib/ctioga2/graphics/styles/background.rb +122 -0
- data/lib/ctioga2/graphics/styles/base.rb +115 -0
- data/lib/ctioga2/graphics/styles/carrays.rb +53 -0
- data/lib/ctioga2/graphics/styles/curve.rb +101 -0
- data/lib/ctioga2/graphics/styles/drawable.rb +87 -0
- data/lib/ctioga2/graphics/styles/factory.rb +351 -0
- data/lib/ctioga2/graphics/styles/legend.rb +63 -0
- data/lib/ctioga2/graphics/styles/plot.rb +410 -0
- data/lib/ctioga2/graphics/styles/sets.rb +64 -0
- data/lib/ctioga2/graphics/styles/texts.rb +277 -0
- data/lib/ctioga2/graphics/subplot-commands.rb +141 -0
- data/lib/ctioga2/graphics/types.rb +188 -0
- data/lib/ctioga2/graphics/types/bijection.rb +79 -0
- data/lib/ctioga2/graphics/types/boundaries.rb +170 -0
- data/lib/ctioga2/graphics/types/boxes.rb +157 -0
- data/lib/ctioga2/graphics/types/dimensions.rb +157 -0
- data/lib/ctioga2/graphics/types/point.rb +247 -0
- data/lib/ctioga2/log.rb +97 -0
- data/lib/ctioga2/metabuilder/type.rb +316 -0
- data/lib/ctioga2/metabuilder/types.rb +39 -0
- data/lib/ctioga2/metabuilder/types/coordinates.rb +124 -0
- data/lib/ctioga2/metabuilder/types/dates.rb +43 -0
- data/lib/ctioga2/metabuilder/types/lists.rb +188 -0
- data/lib/ctioga2/metabuilder/types/numbers.rb +97 -0
- data/lib/ctioga2/metabuilder/types/strings.rb +93 -0
- data/lib/ctioga2/metabuilder/types/styles.rb +178 -0
- data/lib/ctioga2/plotmaker.rb +677 -0
- data/lib/ctioga2/postprocess.rb +115 -0
- data/lib/ctioga2/utils.rb +120 -0
- data/setup.rb +1586 -0
- metadata +144 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# stack.rb: the data stack
|
|
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
|
+
require 'ctioga2/data/datacolumn'
|
|
16
|
+
require 'ctioga2/data/backends/backends'
|
|
17
|
+
require 'ctioga2/data/backends/factory'
|
|
18
|
+
|
|
19
|
+
# This module contains all the classes used by ctioga
|
|
20
|
+
module CTioga2
|
|
21
|
+
|
|
22
|
+
Version::register_svn_info('$Revision: 82 $', '$Date: 2009-06-11 22:28:14 +0200 (Thu, 11 Jun 2009) $')
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
module Data
|
|
26
|
+
|
|
27
|
+
# A series of commands that can be used as "filters", as they act
|
|
28
|
+
# upon the last Dataset pushed unto the stack.
|
|
29
|
+
module Filters
|
|
30
|
+
|
|
31
|
+
FiltersGroup =
|
|
32
|
+
CmdGroup.new('filter', "Filters",
|
|
33
|
+
"The commands in this group act upon the last
|
|
34
|
+
dataset pushed unto the data stack: they can be viewed as filters.",
|
|
35
|
+
101)
|
|
36
|
+
|
|
37
|
+
SortOperation =
|
|
38
|
+
Cmd.new("sort-last", nil, "--sort-last",
|
|
39
|
+
[], {}) do |plotmaker, opts|
|
|
40
|
+
plotmaker.data_stack.last.sort!
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
SortOperation.describe("Sorts the last dataset according to X values",
|
|
44
|
+
<<EOH, FiltersGroup)
|
|
45
|
+
Sorts the last dataset pushed unto the stack according to X values. Can be
|
|
46
|
+
used as a filter.
|
|
47
|
+
|
|
48
|
+
See also {command: sort}.
|
|
49
|
+
EOH
|
|
50
|
+
|
|
51
|
+
SortFilter =
|
|
52
|
+
Cmd.new("sort", nil, "--sort",
|
|
53
|
+
[], {}) do |plotmaker, opts|
|
|
54
|
+
plotmaker.data_stack.add_to_dataset_hook('sort-last()')
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
SortFilter.describe("Systematically sort subsequent datasets",
|
|
58
|
+
<<EOH, FiltersGroup)
|
|
59
|
+
Install the {command: sort-last} command as a dataset hook (see {command:
|
|
60
|
+
dataset-hook}): all subsequent datasets will be sorted according to
|
|
61
|
+
their X values.
|
|
62
|
+
EOH
|
|
63
|
+
|
|
64
|
+
TrimOperation =
|
|
65
|
+
Cmd.new("trim-last", nil, "--trim-last",
|
|
66
|
+
[CmdArg.new('integer')], {}) do |plotmaker, number, opts|
|
|
67
|
+
plotmaker.data_stack.last.trim!(number)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
TrimOperation.describe("Only keeps every n points in the last dataset",
|
|
71
|
+
<<EOH, FiltersGroup)
|
|
72
|
+
Only keeps one every ? data point on the last dataset pushed unto the
|
|
73
|
+
data stack. Useful when data have too many points to avoid creating
|
|
74
|
+
heavy PDF files that take ages to display with no additional benefits.
|
|
75
|
+
|
|
76
|
+
This operation is very crude and does not average data.
|
|
77
|
+
|
|
78
|
+
See also {command: trim}.
|
|
79
|
+
EOH
|
|
80
|
+
|
|
81
|
+
TrimFilter =
|
|
82
|
+
Cmd.new("trim", nil, "--trim",
|
|
83
|
+
[CmdArg.new('integer')], {}) do |plotmaker, number, opts|
|
|
84
|
+
plotmaker.data_stack.add_to_dataset_hook("trim-last(#{number})")
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
TrimFilter.describe("Systematically trim subsequent datasets",
|
|
88
|
+
<<EOH, FiltersGroup)
|
|
89
|
+
Install the {command: trim-last} command as a dataset hook (see {command:
|
|
90
|
+
dataset-hook}): all subsequent datasets will be trimmed to keep only
|
|
91
|
+
every n point.
|
|
92
|
+
EOH
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
CherryPickOperation =
|
|
96
|
+
Cmd.new("cherry-pick-last", nil, "--cherry-pick-last",
|
|
97
|
+
[CmdArg.new('text')], {}) do |plotmaker, formula|
|
|
98
|
+
plotmaker.data_stack.last.select_formula!(formula)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
CherryPickOperation.describe("Removes data from the last dataset for which the formula is false",
|
|
102
|
+
<<EOH, FiltersGroup)
|
|
103
|
+
|
|
104
|
+
Removes the data from the last dataset in the data stack for which the
|
|
105
|
+
formula returns false.
|
|
106
|
+
|
|
107
|
+
See also the {command: cherry-pick} command to apply the selection to
|
|
108
|
+
all datasets.
|
|
109
|
+
|
|
110
|
+
You might find it much easier to use the /where option of the
|
|
111
|
+
{command: plot} or {command: load} commands.
|
|
112
|
+
EOH
|
|
113
|
+
|
|
114
|
+
CherryPickFilter =
|
|
115
|
+
Cmd.new("cherry-pick", nil, "--cherry-pick",
|
|
116
|
+
[CmdArg.new('text')], {}) do |plotmaker, formula|
|
|
117
|
+
plotmaker.data_stack.add_to_dataset_hook("cherry-pick-last(#{formula})")
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
CherryPickFilter.describe("Systematicallly remove data for which the formula is false",
|
|
121
|
+
<<EOH, FiltersGroup)
|
|
122
|
+
Install the {command: cherry-pick-last} command as a dataset hook (see
|
|
123
|
+
{command: dataset-hook}): all points for which the formula returns
|
|
124
|
+
false for subsequent datasets will be removed.
|
|
125
|
+
EOH
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# stack.rb: the data stack
|
|
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
|
+
require 'ctioga2/data/datacolumn'
|
|
16
|
+
require 'ctioga2/data/dataset'
|
|
17
|
+
|
|
18
|
+
# This module contains all the classes used by ctioga
|
|
19
|
+
module CTioga2
|
|
20
|
+
|
|
21
|
+
Version::register_svn_info('$Revision: 21 $', '$Date: 2009-04-30 14:11:53 +0200 (Thu, 30 Apr 2009) $')
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
module Data
|
|
25
|
+
|
|
26
|
+
# This module provides function to deal with the merging of
|
|
27
|
+
# several datasets.
|
|
28
|
+
module MergeDatasets
|
|
29
|
+
|
|
30
|
+
# Merges two or more datasets so that their X values match. If
|
|
31
|
+
# _prec_ isn't _nil_, it is a Float which must not be greater
|
|
32
|
+
# than the difference between two X values that should be
|
|
33
|
+
# regarded as equal.
|
|
34
|
+
#
|
|
35
|
+
# TODO !
|
|
36
|
+
def merge_datasets(prec, *datasets)
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# point.rb: a point in a given dataset
|
|
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
|
+
require 'ctioga2/data/datacolumn'
|
|
16
|
+
require 'ctioga2/data/dataset'
|
|
17
|
+
|
|
18
|
+
module CTioga2
|
|
19
|
+
|
|
20
|
+
Version::register_svn_info('$Revision: 76 $', '$Date: 2009-06-03 01:44:44 +0200 (Wed, 03 Jun 2009) $')
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
module Data
|
|
24
|
+
|
|
25
|
+
# This class represents a datapoint, ie. an index in a given
|
|
26
|
+
# DataSet.
|
|
27
|
+
class DataPoint
|
|
28
|
+
|
|
29
|
+
# The Dataset object the point is in
|
|
30
|
+
attr_accessor :dataset
|
|
31
|
+
|
|
32
|
+
# The index of the data point within the Dataset
|
|
33
|
+
attr_accessor :index
|
|
34
|
+
|
|
35
|
+
# Creates a DataPoint with the given information.
|
|
36
|
+
def initialize(index, dataset)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Creates a DataPoint object based on the following _text_
|
|
40
|
+
# specification. It needs a reference to a _plotmaker_, since it
|
|
41
|
+
# accesses the data stack.
|
|
42
|
+
#
|
|
43
|
+
# Specification: ({_dataset_})?(_relative_|@_index_)
|
|
44
|
+
def self.from_text(plotmaker, text)
|
|
45
|
+
if text =~ /^(?:\s*\{([^}]+)\})?\s*(?:([.\d]+)|@(\d+))\s*$/
|
|
46
|
+
which = $1 || -1
|
|
47
|
+
if $2
|
|
48
|
+
rel = Float($2)
|
|
49
|
+
else
|
|
50
|
+
idx = $3.to_i
|
|
51
|
+
end
|
|
52
|
+
dataset = plotmaker.data_stack.stored_dataset(which)
|
|
53
|
+
if ! dataset
|
|
54
|
+
raise "Invalid or empty dataset: #{which}"
|
|
55
|
+
end
|
|
56
|
+
if rel
|
|
57
|
+
idx = (rel * dataset.x.values.size).to_i
|
|
58
|
+
end
|
|
59
|
+
return DataPoint.new(dataset, idx)
|
|
60
|
+
else
|
|
61
|
+
raise "Not a valid datapoint specification: '#{text}'"
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# TODO: functions returning xy values + slope for the given
|
|
67
|
+
# datapoint. For each, possibility to average over several points.
|
|
68
|
+
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
|
72
|
+
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
# stack.rb: the data stack
|
|
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
|
+
require 'ctioga2/data/datacolumn'
|
|
16
|
+
require 'ctioga2/data/dataset'
|
|
17
|
+
require 'ctioga2/data/backends/backends'
|
|
18
|
+
require 'ctioga2/data/backends/factory'
|
|
19
|
+
|
|
20
|
+
require 'ctioga2/data/point'
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
require 'ctioga2/data/filters'
|
|
24
|
+
|
|
25
|
+
# This module contains all the classes used by ctioga
|
|
26
|
+
module CTioga2
|
|
27
|
+
|
|
28
|
+
Version::register_svn_info('$Revision: 83 $', '$Date: 2009-06-11 23:18:35 +0200 (Thu, 11 Jun 2009) $')
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
module Data
|
|
32
|
+
|
|
33
|
+
# This is the central class for acquisition and handling of
|
|
34
|
+
# Dataset objects, retrieved from from a Backends::BackendFactory.
|
|
35
|
+
#
|
|
36
|
+
# TODO: provide real stack manipulation functions such as
|
|
37
|
+
#
|
|
38
|
+
# * interpolation: pops the last object from the stack and add its
|
|
39
|
+
# interpolated values on the element before.
|
|
40
|
+
# * mathematical functions on each column (DataColumn)
|
|
41
|
+
# * other stack-based operations.
|
|
42
|
+
class DataStack
|
|
43
|
+
|
|
44
|
+
include Log
|
|
45
|
+
|
|
46
|
+
# The array containing all the Dataset used so far.
|
|
47
|
+
attr_accessor :stack
|
|
48
|
+
|
|
49
|
+
# The BackendFactory used for retrieving data from named sets.
|
|
50
|
+
attr_accessor :backend_factory
|
|
51
|
+
|
|
52
|
+
# Named datasets
|
|
53
|
+
attr_accessor :named_datasets
|
|
54
|
+
|
|
55
|
+
# A hook executed every time a dataset is pushed unto the stack
|
|
56
|
+
# using #add_dataset.
|
|
57
|
+
#
|
|
58
|
+
# TODO: this string is parsed for each call to
|
|
59
|
+
# #add_dataset. Perhaps it would be good to provide a way to
|
|
60
|
+
# record a Command call, without parsing it from scratch ???
|
|
61
|
+
#
|
|
62
|
+
# Although, with variables, that could be interesting to reparse
|
|
63
|
+
# everytime, since any change in the variables would be taken
|
|
64
|
+
# into account.
|
|
65
|
+
attr_accessor :dataset_hook
|
|
66
|
+
|
|
67
|
+
# Creates a new DataStack object.
|
|
68
|
+
def initialize
|
|
69
|
+
@stack = Array.new
|
|
70
|
+
|
|
71
|
+
@named_datasets = Hash.new
|
|
72
|
+
|
|
73
|
+
# Defaults to the 'text' backend
|
|
74
|
+
@backend_factory = Data::Backends::BackendFactory.new('text')
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Performs expansion on the given _set_ with the current
|
|
78
|
+
# backend, retrieves corresponding Dataset objects, pushes them
|
|
79
|
+
# onto the stack and returns them.
|
|
80
|
+
#
|
|
81
|
+
# _options_ is a Hash that can contain the options available to the
|
|
82
|
+
# 'load' command:
|
|
83
|
+
#
|
|
84
|
+
# * 'name' to name each element added to the stack. A %d will be
|
|
85
|
+
# replaced by the number of the dataset within the ones just
|
|
86
|
+
# added.
|
|
87
|
+
#
|
|
88
|
+
# Additional members of the Hash are simply ignored.
|
|
89
|
+
def get_datasets(set, options = {})
|
|
90
|
+
backend = @backend_factory.current
|
|
91
|
+
retval = []
|
|
92
|
+
i = 0
|
|
93
|
+
for s in backend.expand_sets(set)
|
|
94
|
+
ds = backend.dataset(s)
|
|
95
|
+
add_dataset(ds, options['ignore_hooks'])
|
|
96
|
+
|
|
97
|
+
# Selection
|
|
98
|
+
if options['where']
|
|
99
|
+
ds.select_formula!(options['where'])
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
retval << ds
|
|
103
|
+
if options['name']
|
|
104
|
+
@named_datasets[options['name'] % [i]] = ds
|
|
105
|
+
end
|
|
106
|
+
i += 1
|
|
107
|
+
end
|
|
108
|
+
return retval
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Returns the stored dataset, either using its index in the
|
|
112
|
+
# stack, or its name in the dataset.
|
|
113
|
+
def stored_dataset(spec)
|
|
114
|
+
if spec.is_a? Numeric or spec =~ /^\s*-?\d+\s*$/
|
|
115
|
+
spec = spec.to_i
|
|
116
|
+
return @stack[spec]
|
|
117
|
+
else
|
|
118
|
+
if @named_datasets.key? spec
|
|
119
|
+
return @named_datasets[spec]
|
|
120
|
+
else
|
|
121
|
+
raise "Unkown named dataset from the stack: '#{spec}'"
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Gets a dataset from the given _options_ hash. If a 'which' key
|
|
127
|
+
# is present, it is used as an argument for #stored_dataset;
|
|
128
|
+
# else, -1 is used.
|
|
129
|
+
def specified_dataset(options)
|
|
130
|
+
spec = if options && options['which']
|
|
131
|
+
options['which']
|
|
132
|
+
else
|
|
133
|
+
-1
|
|
134
|
+
end
|
|
135
|
+
return stored_dataset(spec)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# Adds a Dataset object onto the stack, running hooks if
|
|
139
|
+
# necessary.
|
|
140
|
+
#
|
|
141
|
+
# Makes use of Plotmaker.plotmaker
|
|
142
|
+
def add_dataset(dataset, ignore_hooks = false)
|
|
143
|
+
@stack << dataset
|
|
144
|
+
if @dataset_hook && (! ignore_hooks)
|
|
145
|
+
# TODO: error handling
|
|
146
|
+
begin
|
|
147
|
+
PlotMaker.plotmaker.interpreter.run_commands(@dataset_hook)
|
|
148
|
+
rescue Exception => e
|
|
149
|
+
error "There was a problem running the dataset hook '#{@dataset_hook}', disabling it"
|
|
150
|
+
@dataset_hook = nil
|
|
151
|
+
info "-> '#{format_exception e}'"
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# Appends a set of commands to the dataset hook
|
|
157
|
+
def add_to_dataset_hook(commands)
|
|
158
|
+
if @dataset_hook
|
|
159
|
+
@dataset_hook << "\n#{commands}"
|
|
160
|
+
else
|
|
161
|
+
@dataset_hook = commands
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# Writes the contents of the the given _dataset_ (a DataSet
|
|
166
|
+
# object) to the given _io_ stream.
|
|
167
|
+
def print_dataset(dataset, io)
|
|
168
|
+
io.puts "# #{dataset.name}"
|
|
169
|
+
io.puts "# #{dataset.column_names.join("\t")}"
|
|
170
|
+
dataset.each_values do |i, *vals|
|
|
171
|
+
io.puts vals.join("\t")
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
# Pops the last _n_ datasets off the stack
|
|
176
|
+
def concatenate_datasets(n = 2)
|
|
177
|
+
ds = @stack.pop
|
|
178
|
+
raise "Nothing on the stack" unless ds
|
|
179
|
+
(n-1).times do
|
|
180
|
+
ds2 = @stack.pop
|
|
181
|
+
raise "Not enough datasets on the stack" unless ds2
|
|
182
|
+
ds << ds2
|
|
183
|
+
end
|
|
184
|
+
@stack.push(ds)
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# Returns the last Dataset pushed onto the stack.
|
|
188
|
+
def last
|
|
189
|
+
return @stack.last
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
DataStackGroup =
|
|
196
|
+
CmdGroup.new('stack', "Data stack manipulation",
|
|
197
|
+
"Commands for manipulation of the data stack",
|
|
198
|
+
100)
|
|
199
|
+
|
|
200
|
+
LoadDatasetOptions = {
|
|
201
|
+
'name' => CmdArg.new('text'),
|
|
202
|
+
'where' => CmdArg.new('text'),
|
|
203
|
+
'ignore_hooks' => CmdArg.new('boolean')
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
LoadDataCommand =
|
|
207
|
+
Cmd.new("load", '-L', "--load",
|
|
208
|
+
[ CmdArg.new('dataset'), ],
|
|
209
|
+
LoadDatasetOptions) do |plotmaker, set, opts|
|
|
210
|
+
plotmaker.data_stack.get_datasets(set, opts)
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
LoadDataCommand.describe("Load given sets onto the data stack",
|
|
214
|
+
<<EOH, DataStackGroup)
|
|
215
|
+
Use the current backend to load the given dataset(s) onto the data stack.
|
|
216
|
+
|
|
217
|
+
If the name option is given, the last dataset loaded this way (if
|
|
218
|
+
dataset expansion occurs) gets named, or, if it contains a %d (or
|
|
219
|
+
similar construct), each dataset gets named with %d replace with the
|
|
220
|
+
number of the dataset within the expansion (starting at 0). This name
|
|
221
|
+
can be used to further use the dataset without remembering its
|
|
222
|
+
number. See the type {type: stored-dataset} for more information.
|
|
223
|
+
|
|
224
|
+
EOH
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
PrintLastCommand =
|
|
228
|
+
Cmd.new("print-dataset", '-P', "--print-dataset",
|
|
229
|
+
[], {'which' => CmdArg.new('stored-dataset')}) do |plotmaker,opts|
|
|
230
|
+
ds = plotmaker.data_stack.specified_dataset(opts)
|
|
231
|
+
plotmaker.data_stack.print_dataset(ds, STDOUT)
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
PrintLastCommand.describe("Prints the dataset last pushed on the stack",
|
|
235
|
+
<<EOH, DataStackGroup)
|
|
236
|
+
Prints to standard output data contained in the last dataset pushed
|
|
237
|
+
onto the stack, or the given stored dataset if the which option is given.
|
|
238
|
+
EOH
|
|
239
|
+
|
|
240
|
+
ConcatLastCommand =
|
|
241
|
+
Cmd.new("join-datasets", nil, "--join-datasets",
|
|
242
|
+
[], {'number' => CmdArg.new('integer')}) do |plotmaker, opts|
|
|
243
|
+
nb = opts['number'] || 2
|
|
244
|
+
plotmaker.data_stack.concatenate_datasets(nb)
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
ConcatLastCommand.describe("Concatenates the last datasets on the stack",
|
|
248
|
+
<<EOH, DataStackGroup)
|
|
249
|
+
Pops the last two (or number, if it is specified) datasets from the
|
|
250
|
+
stack, concatenates them (older last) and push them back onto the
|
|
251
|
+
stack.
|
|
252
|
+
EOH
|
|
253
|
+
|
|
254
|
+
SetDatasetHookCommand =
|
|
255
|
+
Cmd.new("dataset-hook", nil, "--dataset-hook",
|
|
256
|
+
[CmdArg.new('commands')], {}) do |plotmaker, commands, opts|
|
|
257
|
+
plotmaker.data_stack.dataset_hook = commands
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
SetDatasetHookCommand.describe("Sets the dataset hook",
|
|
261
|
+
<<EOH, DataStackGroup)
|
|
262
|
+
The dataset hook is a series of commands such as those in the command
|
|
263
|
+
files that are run every time after a dataset is added onto the data
|
|
264
|
+
stack. Its main use is to provide automatic filtering of data, but any
|
|
265
|
+
arbitrary command can be used, so enjoy !
|
|
266
|
+
EOH
|
|
267
|
+
|
|
268
|
+
ClearDatasetHookCommand =
|
|
269
|
+
Cmd.new("dataset-hook-clear", nil, "--dataset-hook-clear",
|
|
270
|
+
[], {}) do |plotmaker, opts|
|
|
271
|
+
plotmaker.data_stack.dataset_hook = nil
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
ClearDatasetHookCommand.describe("Clears the dataset hook",
|
|
275
|
+
<<EOH, DataStackGroup)
|
|
276
|
+
Clears the dataset hook. See {command: dataset-hook} for more information.
|
|
277
|
+
EOH
|
|
278
|
+
|
|
279
|
+
AddDatasetHookCommand =
|
|
280
|
+
Cmd.new("dataset-hook-add", nil, "--dataset-hook-add",
|
|
281
|
+
[CmdArg.new('commands')], {}) do |plotmaker, commands, opts|
|
|
282
|
+
plotmaker.data_stack.add_to_dataset_hook(commands)
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
AddDatasetHookCommand.describe("Adds commands to the dataset hook",
|
|
286
|
+
<<EOH, DataStackGroup)
|
|
287
|
+
Adds the given commands to the dataset hook. See {command: dataset-hook}
|
|
288
|
+
for more information about the dataset hook.
|
|
289
|
+
EOH
|
|
290
|
+
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
end
|
|
294
|
+
|