ctioga2 0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. data/COPYING +339 -0
  2. data/Changelog +6 -0
  3. data/bin/ctioga2 +26 -0
  4. data/lib/ctioga2/commands/arguments.rb +58 -0
  5. data/lib/ctioga2/commands/commands.rb +258 -0
  6. data/lib/ctioga2/commands/doc/doc.rb +118 -0
  7. data/lib/ctioga2/commands/doc/documentation-commands.rb +119 -0
  8. data/lib/ctioga2/commands/doc/help.rb +95 -0
  9. data/lib/ctioga2/commands/doc/html.rb +230 -0
  10. data/lib/ctioga2/commands/doc/introspection.rb +211 -0
  11. data/lib/ctioga2/commands/doc/man.rb +279 -0
  12. data/lib/ctioga2/commands/doc/markup.rb +359 -0
  13. data/lib/ctioga2/commands/general-commands.rb +119 -0
  14. data/lib/ctioga2/commands/general-types.rb +118 -0
  15. data/lib/ctioga2/commands/groups.rb +73 -0
  16. data/lib/ctioga2/commands/interpreter.rb +257 -0
  17. data/lib/ctioga2/commands/parsers/command-line.rb +187 -0
  18. data/lib/ctioga2/commands/parsers/file.rb +186 -0
  19. data/lib/ctioga2/commands/strings.rb +303 -0
  20. data/lib/ctioga2/commands/type.rb +100 -0
  21. data/lib/ctioga2/commands/variables.rb +101 -0
  22. data/lib/ctioga2/data/backends/backend.rb +260 -0
  23. data/lib/ctioga2/data/backends/backends.rb +39 -0
  24. data/lib/ctioga2/data/backends/backends/gnuplot.rb +140 -0
  25. data/lib/ctioga2/data/backends/backends/math.rb +121 -0
  26. data/lib/ctioga2/data/backends/backends/text.rb +335 -0
  27. data/lib/ctioga2/data/backends/description.rb +405 -0
  28. data/lib/ctioga2/data/backends/factory.rb +73 -0
  29. data/lib/ctioga2/data/backends/parameter.rb +109 -0
  30. data/lib/ctioga2/data/datacolumn.rb +245 -0
  31. data/lib/ctioga2/data/dataset.rb +233 -0
  32. data/lib/ctioga2/data/filters.rb +131 -0
  33. data/lib/ctioga2/data/merge.rb +43 -0
  34. data/lib/ctioga2/data/point.rb +72 -0
  35. data/lib/ctioga2/data/stack.rb +294 -0
  36. data/lib/ctioga2/graphics/coordinates.rb +73 -0
  37. data/lib/ctioga2/graphics/elements.rb +111 -0
  38. data/lib/ctioga2/graphics/elements/containers.rb +111 -0
  39. data/lib/ctioga2/graphics/elements/curve2d.rb +155 -0
  40. data/lib/ctioga2/graphics/elements/element.rb +90 -0
  41. data/lib/ctioga2/graphics/elements/primitive.rb +256 -0
  42. data/lib/ctioga2/graphics/elements/subplot.rb +140 -0
  43. data/lib/ctioga2/graphics/generator.rb +68 -0
  44. data/lib/ctioga2/graphics/legends.rb +108 -0
  45. data/lib/ctioga2/graphics/legends/area.rb +199 -0
  46. data/lib/ctioga2/graphics/legends/items.rb +183 -0
  47. data/lib/ctioga2/graphics/legends/provider.rb +58 -0
  48. data/lib/ctioga2/graphics/legends/storage.rb +65 -0
  49. data/lib/ctioga2/graphics/root.rb +209 -0
  50. data/lib/ctioga2/graphics/styles.rb +30 -0
  51. data/lib/ctioga2/graphics/styles/axes.rb +247 -0
  52. data/lib/ctioga2/graphics/styles/background.rb +122 -0
  53. data/lib/ctioga2/graphics/styles/base.rb +115 -0
  54. data/lib/ctioga2/graphics/styles/carrays.rb +53 -0
  55. data/lib/ctioga2/graphics/styles/curve.rb +101 -0
  56. data/lib/ctioga2/graphics/styles/drawable.rb +87 -0
  57. data/lib/ctioga2/graphics/styles/factory.rb +351 -0
  58. data/lib/ctioga2/graphics/styles/legend.rb +63 -0
  59. data/lib/ctioga2/graphics/styles/plot.rb +410 -0
  60. data/lib/ctioga2/graphics/styles/sets.rb +64 -0
  61. data/lib/ctioga2/graphics/styles/texts.rb +277 -0
  62. data/lib/ctioga2/graphics/subplot-commands.rb +141 -0
  63. data/lib/ctioga2/graphics/types.rb +188 -0
  64. data/lib/ctioga2/graphics/types/bijection.rb +79 -0
  65. data/lib/ctioga2/graphics/types/boundaries.rb +170 -0
  66. data/lib/ctioga2/graphics/types/boxes.rb +157 -0
  67. data/lib/ctioga2/graphics/types/dimensions.rb +157 -0
  68. data/lib/ctioga2/graphics/types/point.rb +247 -0
  69. data/lib/ctioga2/log.rb +97 -0
  70. data/lib/ctioga2/metabuilder/type.rb +316 -0
  71. data/lib/ctioga2/metabuilder/types.rb +39 -0
  72. data/lib/ctioga2/metabuilder/types/coordinates.rb +124 -0
  73. data/lib/ctioga2/metabuilder/types/dates.rb +43 -0
  74. data/lib/ctioga2/metabuilder/types/lists.rb +188 -0
  75. data/lib/ctioga2/metabuilder/types/numbers.rb +97 -0
  76. data/lib/ctioga2/metabuilder/types/strings.rb +93 -0
  77. data/lib/ctioga2/metabuilder/types/styles.rb +178 -0
  78. data/lib/ctioga2/plotmaker.rb +677 -0
  79. data/lib/ctioga2/postprocess.rb +115 -0
  80. data/lib/ctioga2/utils.rb +120 -0
  81. data/setup.rb +1586 -0
  82. metadata +144 -0
@@ -0,0 +1,73 @@
1
+ # coordinates.rb: coordinate transformations
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/log'
16
+
17
+
18
+ module CTioga2
19
+
20
+ Version::register_svn_info('$Revision: 2 $', '$Date: 2009-04-25 14:03:30 +0200 (Sat, 25 Apr 2009) $')
21
+
22
+ module Graphics
23
+
24
+ # Deals with transforming the coordinates of all datasets
25
+ #
26
+ # TODO:
27
+ # * offsets
28
+ # * scales
29
+ # * x/y log
30
+ # * non-linear transformations ?
31
+ # * the possibility to provide locations using this.
32
+ # * conversion of datasets.
33
+ class CoordinateTransforms
34
+
35
+ # A scaling factor for coordinates:
36
+ attr_accessor :x_scale, :y_scale
37
+
38
+ # An offset for coordinates
39
+ attr_accessor :x_offset, :y_offset
40
+
41
+ # Whether to use logarithmic coordinates
42
+ attr_accessor :x_log, :y_log
43
+
44
+ # Creates a CoordinateTransformations object.
45
+ def initialize
46
+ end
47
+
48
+ # Apply a transformation to a Data::Dataset holding 2D signals.
49
+ # Modifies the dataset in place.
50
+ def transform_2d!(dataset)
51
+ for w in [:x , :y]
52
+ if v = self.send("#{w}_scale")
53
+ dataset.send(w).apply do |x|
54
+ x.mul!(v)
55
+ end
56
+ end
57
+ if v = self.send("#{w}_offset")
58
+ dataset.send(w).apply do |x|
59
+ x.add!(v)
60
+ end
61
+ end
62
+ if v = self.send("#{w}_log")
63
+ dataset.send(w).apply do |x|
64
+ x.safe_log10!
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ end
72
+ end
73
+
@@ -0,0 +1,111 @@
1
+ # elements.rb: all drawable objects
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, but
10
+ # WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # General Public License for more details (in the COPYING file).
13
+
14
+
15
+ require 'ctioga2/graphics/types'
16
+ require 'ctioga2/graphics/elements/element'
17
+ require 'ctioga2/graphics/elements/containers'
18
+ require 'ctioga2/graphics/elements/subplot'
19
+ require 'ctioga2/graphics/elements/curve2d'
20
+ require 'ctioga2/graphics/elements/primitive'
21
+
22
+ module CTioga2
23
+
24
+ Version::register_svn_info('$Revision: 55 $', '$Date: 2009-05-27 00:01:34 +0200 (Wed, 27 May 2009) $')
25
+
26
+ module Graphics
27
+
28
+ # Now, various commands pertaining to various drawables
29
+
30
+ PlotCoordinatesGroup = CmdGroup.new('coordinates',
31
+ "Plot coordinates",
32
+ "Plot coordinates", 2)
33
+ PlotMarginCommand =
34
+ Cmd.new("margin",nil,"--margin",
35
+ [ CmdArg.new('float') ]) do |plotmaker, margin|
36
+ plotmaker.root_object.current_plot.style.plot_margin = margin
37
+ end
38
+
39
+ PlotMarginCommand.describe("Leaves a margin around data points",
40
+ <<EOH, PlotCoordinatesGroup)
41
+ Leaves a margin around the data points. Expressed in relative size of the
42
+ whole plot.
43
+ EOH
44
+
45
+
46
+ # Various coordinate-related commands:
47
+ CoordinateRelatedCommands = []
48
+ [:x, :y].each do |x|
49
+ cmd =
50
+ Cmd.new("#{x}range",nil,"--#{x}range",
51
+ [ CmdArg.new('partial-float-range') ]) do |plotmaker, range|
52
+ plotmaker.root_object.current_plot.
53
+ user_boundaries.set_from_range(range, x)
54
+ end
55
+ cmd.describe("Sets the #{x.to_s.upcase} range",
56
+ <<EOH, PlotCoordinatesGroup)
57
+ Sets the range of the #{x.to_s.upcase} coordinates.
58
+ EOH
59
+ CoordinateRelatedCommands << cmd
60
+
61
+ cmd =
62
+ Cmd.new("#{x}offset",nil,"--#{x}offset",
63
+ [ CmdArg.new('float') ]) do |plotmaker, val|
64
+ plotmaker.root_object.current_plot.
65
+ style.transforms.send("#{x}_offset=", val)
66
+ end
67
+ cmd.describe("Offset #{x.to_s.upcase} data",
68
+ <<EOH, PlotCoordinatesGroup)
69
+ Adds the given offset to all #{x.to_s.upcase} coordinates.
70
+ EOH
71
+ CoordinateRelatedCommands << cmd
72
+
73
+ cmd =
74
+ Cmd.new("#{x}scale",nil,"--#{x}scale",
75
+ [ CmdArg.new('float') ]) do |plotmaker, val|
76
+ plotmaker.root_object.current_plot.
77
+ style.transforms.send("#{x}_scale=", val)
78
+ end
79
+ cmd.describe("Scale #{x.to_s.upcase} data",
80
+ <<EOH, PlotCoordinatesGroup)
81
+ Multiplies the #{x.to_s.upcase} coordinates by this factor.
82
+ EOH
83
+ CoordinateRelatedCommands << cmd
84
+
85
+ # Alias
86
+ cmd =
87
+ Cmd.new("#{x}fact",nil,"--#{x}fact",
88
+ [ CmdArg.new('float') ]) do |plotmaker, val|
89
+ plotmaker.root_object.current_plot.
90
+ style.transforms.send("#{x}_scale=", val)
91
+ end
92
+ cmd.describe("Alias for #{x}scale",
93
+ <<EOH, PlotCoordinatesGroup)
94
+ Alias for {command: #{x}scale}.
95
+ EOH
96
+ CoordinateRelatedCommands << cmd
97
+
98
+ cmd =
99
+ Cmd.new("#{x}log",nil,"--#{x}log",
100
+ [ CmdArg.new('boolean') ]) do |plotmaker, val|
101
+ plotmaker.root_object.current_plot.
102
+ style.send("set_log_scale", x, val)
103
+ end
104
+ cmd.describe("Use log scale for #{x.to_s.upcase}",
105
+ <<EOH, PlotCoordinatesGroup)
106
+ Uses a logarithmic scale for the #{x.to_s.upcase} axis.
107
+ EOH
108
+ CoordinateRelatedCommands << cmd
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,111 @@
1
+ # containers.rb: drawables that contains other drawables
2
+ # copyright (c) 2006, 2007, 2008, 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
+
15
+ require 'ctioga2/utils'
16
+ require 'ctioga2/log'
17
+
18
+ module CTioga2
19
+
20
+ Version::register_svn_info('$Revision: 38 $', '$Date: 2009-05-07 23:11:55 +0200 (Thu, 07 May 2009) $')
21
+
22
+ module Graphics
23
+
24
+ module Elements
25
+
26
+ # A Container is a drawable object that contains several others, its
27
+ # #elements.
28
+ class Container < TiogaElement
29
+
30
+ # All drawable Element contained in this object. It may
31
+ # contain other Container subobjects.
32
+ attr_accessor :elements
33
+
34
+ # The subframe position of this element with respect to its
35
+ # parent. It is a Types::Box object.
36
+ attr_accessor :subframe
37
+
38
+ # A reference to the RootObject
39
+ attr_accessor :root_object
40
+
41
+ # The Legends::LegendArea dedicated to the display of the
42
+ # legend of this object and its children, or _nil_ if the
43
+ # parent should handle the display.
44
+ attr_accessor :legend_area
45
+
46
+ # The Legends::LegendStorage that holds all the legends of the
47
+ # object
48
+ attr_accessor :legend_storage
49
+
50
+ # Creates an empty new Container with the given _parent_.
51
+ def initialize(parent = nil, root = nil)
52
+ @parent = parent
53
+
54
+ # elements to be given to tioga
55
+ @elements = []
56
+
57
+ # By default the frame takes up all the space.
58
+ @subframe = Types::MarginsBox.new(0, 0, 0, 0)
59
+
60
+ @root_object = root
61
+
62
+ @legend_storage = Legends::LegendStorage.new
63
+
64
+ # By default, don't display legends.
65
+ @legend_area = nil
66
+ end
67
+
68
+ # Returns the number of child elements
69
+ def size
70
+ return @elements.size
71
+ end
72
+
73
+ # Adds an element
74
+ def add_element(element)
75
+ element.parent = self
76
+ @elements << element
77
+
78
+ # If the element has a curve_style, we add it as a
79
+ # CurveLegend
80
+ if element.respond_to?(:curve_style) and
81
+ element.curve_style.has_legend?
82
+ add_legend_item(Legends::CurveLegend.new(element.curve_style))
83
+ elsif element.is_a? Container
84
+ add_legend_item(element)
85
+ end
86
+ end
87
+
88
+
89
+ # Adds a legend item to the #associated_legend_storage
90
+ def add_legend_item(item)
91
+ @legend_storage.add_item(item)
92
+ end
93
+
94
+ # TODO: provide coordinate conversion facilities...
95
+
96
+ protected
97
+
98
+ # Creates the appropriate subfigure and draws all its elements
99
+ # within.
100
+ def real_do(t)
101
+ t.subfigure(@subframe.to_frame_margins(t)) do
102
+ for el in @elements
103
+ el.do(t)
104
+ end
105
+ end
106
+ end
107
+
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,155 @@
1
+ # curve2d.rb: a 2D curve
2
+ # copyright (c) 2006, 2007, 2008, 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, but
10
+ # WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # General Public License for more details (in the COPYING file).
13
+
14
+ require 'ctioga2/utils'
15
+ require 'ctioga2/log'
16
+
17
+ require 'Dobjects/Function'
18
+
19
+
20
+ module CTioga2
21
+
22
+ Version::register_svn_info('$Revision: 55 $', '$Date: 2009-05-27 00:01:34 +0200 (Wed, 27 May 2009) $')
23
+
24
+ module Graphics
25
+
26
+ module Elements
27
+
28
+ # A Curve2D object represents a 2D curve, along with its style and so
29
+ # on.
30
+ class Curve2D < TiogaElement
31
+
32
+ include Log
33
+ include Dobjects
34
+
35
+ # A Dobjects::Function holding the "real" X and Y values, for
36
+ # the sake of manipulations.
37
+ attr_accessor :function
38
+
39
+ # The Data::Dataset object that should get plotted.
40
+ attr_accessor :dataset
41
+
42
+ # A Styles::CurveStyle object saying how the curve should be
43
+ # drawn.
44
+ attr_accessor :curve_style
45
+
46
+ # Creates a new Curve2D object with the given _dataset_ and
47
+ # _style_.
48
+ def initialize(dataset, style = nil)
49
+ @dataset = dataset
50
+ if @dataset.size > 2
51
+ warn "Columns Y2 and further were ignored for set #{dataset.name}"
52
+ end
53
+ # We build the function on a duplicate of the values ?
54
+ @function = Function.new(@dataset.x.values.dup,
55
+ @dataset.y.values.dup)
56
+
57
+ # We remove NaN, as they are not very liked by Tioga...
58
+ #
59
+ # TODO: maybe there should be a way to *split* on NaN rather
60
+ # than to ignore them ?
61
+ @function.strip_nan
62
+
63
+ @curve_style = style
64
+ end
65
+
66
+ # Returns the Types::Boundaries of this curve.
67
+ def get_boundaries
68
+ return Types::Boundaries.bounds(@function.x, @function.y)
69
+ end
70
+
71
+ # Creates a path for the given curve. This should be defined
72
+ # with care, as it will be used for instance for region
73
+ # coloring and stroking. The function should only append to
74
+ # the current path, not attempt to create a new path or empty
75
+ # what was done before.
76
+ def make_path(t)
77
+ bnds = parent.real_boundaries
78
+ # if @style.interpolate
79
+ # for f in @function.split_monotonic
80
+ # new_f = f.bound_values(*bnds.to_a)
81
+ # t.append_interpolant_to_path(f.make_interpolant)
82
+ # end
83
+ # else
84
+ f = @function.bound_values(*bnds.extrema)
85
+ t.append_points_to_path(f.x, f.y)
86
+ # end
87
+ end
88
+
89
+ # Strokes the path.
90
+ def draw_path(t)
91
+ if @curve_style.has_line?
92
+ t.context do
93
+ @curve_style.line.set_stroke_style(t)
94
+ make_path(t)
95
+ t.stroke
96
+ end
97
+ end
98
+ end
99
+
100
+ # Draws the markers, if applicable.
101
+ def draw_markers(t)
102
+ if @curve_style.has_marker?
103
+ xs = @function.x
104
+ ys = @function.y
105
+ @curve_style.marker.draw_markers_at(t, xs, ys)
106
+ end
107
+ end
108
+
109
+ # A function to close the path created by make_path.
110
+ # Overridden in the histogram code.
111
+ def close_path(t, y0)
112
+ t.append_point_to_path(@function.x.last, y0)
113
+ t.append_point_to_path(@function.x.first, y0)
114
+ t.close_path
115
+ end
116
+
117
+ # Draws the filled region according to the :fill_type element
118
+ # of the style pseudo-hash. It can be:
119
+ def draw_fill(t)
120
+ # y = y_value(@style.fill_type)
121
+ # return unless y
122
+
123
+ # t.fill_transparency = @style.fill_transparency || 0
124
+ # # Now is the tricky part. To do the actual fill, we first make a
125
+ # # path according to the make_path function.
126
+ # make_path(t)
127
+
128
+ # # Then we add two line segments that go from the end to the
129
+ # # beginning.
130
+ # close_path(t, y)
131
+
132
+ # # Now the path is ready. Just strike -- or, rather, fill !
133
+ # t.fill_color = @style.fill_color
134
+ # t.fill
135
+ end
136
+
137
+ def real_do(t)
138
+ debug "Plotting curve #{inspect}"
139
+ t.context do
140
+ # TODO reinstate the choice of the order of drawing ???
141
+ draw_path(t)
142
+ draw_markers(t)
143
+ # # The fill is always first
144
+ # draw_fill(t)
145
+
146
+ # for op in CurveStyle::DrawingOrder[@style[:drawing_order]]
147
+ # self.send("draw_#{op}".to_sym, t)
148
+ # end
149
+ end
150
+ end
151
+
152
+ end
153
+ end
154
+ end
155
+ end