ctioga2 0.13.1 → 0.14

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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog +26 -0
  3. data/bin/ct2-make-movie +4 -1
  4. data/bin/ctioga2 +1 -1
  5. data/lib/ctioga2/commands/commands.rb +2 -0
  6. data/lib/ctioga2/commands/doc/doc.rb +1 -1
  7. data/lib/ctioga2/commands/doc/documentation-commands.rb +38 -0
  8. data/lib/ctioga2/commands/doc/html.rb +84 -0
  9. data/lib/ctioga2/commands/general-commands.rb +20 -1
  10. data/lib/ctioga2/commands/general-functions.rb +26 -0
  11. data/lib/ctioga2/commands/general-types.rb +1 -0
  12. data/lib/ctioga2/commands/instruction.rb +61 -0
  13. data/lib/ctioga2/commands/interpreter.rb +12 -2
  14. data/lib/ctioga2/data/datacolumn.rb +38 -0
  15. data/lib/ctioga2/data/dataset.rb +6 -5
  16. data/lib/ctioga2/data/filters.rb +12 -5
  17. data/lib/ctioga2/data/stack.rb +105 -22
  18. data/lib/ctioga2/graphics/elements.rb +1 -1
  19. data/lib/ctioga2/graphics/elements/curve2d.rb +1 -1
  20. data/lib/ctioga2/graphics/elements/element.rb +29 -10
  21. data/lib/ctioga2/graphics/elements/primitive.rb +26 -2
  22. data/lib/ctioga2/graphics/elements/subplot.rb +7 -1
  23. data/lib/ctioga2/graphics/generator.rb +1 -2
  24. data/lib/ctioga2/graphics/legends/area.rb +3 -0
  25. data/lib/ctioga2/graphics/root.rb +18 -2
  26. data/lib/ctioga2/graphics/styles/curve.rb +6 -0
  27. data/lib/ctioga2/graphics/styles/drawable.rb +4 -0
  28. data/lib/ctioga2/graphics/styles/factory.rb +4 -5
  29. data/lib/ctioga2/graphics/styles/plot-types.rb +22 -7
  30. data/lib/ctioga2/graphics/subplot-commands.rb +2 -4
  31. data/lib/ctioga2/graphics/types.rb +17 -0
  32. data/lib/ctioga2/graphics/types/boundaries.rb +10 -0
  33. data/lib/ctioga2/graphics/types/boxes.rb +18 -0
  34. data/lib/ctioga2/graphics/types/dimensions.rb +4 -0
  35. data/lib/ctioga2/graphics/types/grid.rb +98 -4
  36. data/lib/ctioga2/graphics/types/point.rb +9 -0
  37. data/lib/ctioga2/metabuilder/types/lists.rb +1 -1
  38. data/lib/ctioga2/metabuilder/types/styles.rb +5 -3
  39. data/lib/ctioga2/plotmaker.rb +28 -5
  40. data/lib/ctioga2/postprocess.rb +28 -0
  41. data/lib/ctioga2/ruby.rb +7 -0
  42. data/lib/ctioga2/utils.rb +45 -0
  43. data/lib/ctioga2/version.rb +2 -2
  44. metadata +4 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a07d4a54cc29cbb71a8bc00666a543ac18e517a7
4
- data.tar.gz: d63a48a1b341054366ca8ac3b3a5340f245a5fb7
3
+ metadata.gz: 6bef5792441b163c872287441af1c3875eb51ae2
4
+ data.tar.gz: dc7ffd6240a7309e651aba7bb7f45cf4e8f204f4
5
5
  SHA512:
6
- metadata.gz: 89f0a3753f9571ac00d67debd05fe2c6cacb2aad6b56f3b16e5ada80027546dee08ac9fd4d7f66a327690f15b2b8fd1a88d5777faa5adde79557399c88d50028
7
- data.tar.gz: b78c99f8c03e09524c002e3d4512958e711eef9443dd0d978db5fc410b1fc53f047a093c8df4530ca1554f1448f3b74175253e01e7735926c9f85cd87c1a3f9d
6
+ metadata.gz: 87f0530a92f0cd9f5328d1d399325b35108bfafce596e12315181d430307eedcb36771e21fb6f68445c2ba6e5aa233d5faaafdba6aeabac7388a6662908e33e5
7
+ data.tar.gz: a521da3bd85d7a7c71e3e982f2d524501cd31c4ceee773f8256c2a3620619e923a632e399a84134b851d01a44044c30334a7fdaf1e6de1046f8471f1d1103b87
data/Changelog CHANGED
@@ -1,3 +1,29 @@
1
+ ctioga2 (0.14)
2
+
3
+ * A --bin command to bin data columns
4
+ * A --hide command
5
+ * A --append command to load a dataset and append it to the previous one
6
+ * a --draw-legend-pictogram to draw the legend pictogram of a curve
7
+ * Selection of plot elements by class for commands that take several
8
+ elements (such as --hide)
9
+ * A series of command-file functions like $(xmax), $(yrange) and so on
10
+ to gather informations about datasets on the stack
11
+ * Can now select the line cap using the /line-cap option (or the
12
+ --line-cap command), especially useful for /path-style=impulses
13
+ * Can now select a dataset using its plot #id
14
+ * A grid:next specification to automatically switch to the next grid
15
+ element
16
+ * More informative error messages when encountering weird data such as
17
+ infinite numbers, see http://sourceforge.net/p/ctioga2/tickets/2/
18
+ * Automatic styles for even/odd rows/columns of grids
19
+ * Switch to YAML for debug output, greatly speeds up writing out debug
20
+ information
21
+ * Now, color mixing between sets occur with !! and not ! as before, not to
22
+ confuse with plain color mixing
23
+ * Quite a few minor improvements/bug fixes
24
+
25
+ -- Vincent Fourmond <vincent.fourmond@9online.fr> Thu 18 Feb 20:48:58 CET 2016
26
+
1
27
  ctioga2 (0.13.1)
2
28
 
3
29
  * Fix installation problems with recent ruby versions
@@ -281,7 +281,10 @@ for f in args
281
281
  "--set", "index", "#{index}",
282
282
  "-f", file, "--name", name, "-r", ct2_page_size]
283
283
  puts "Running: #{ct2_cmdline.join(" ")}"
284
- system(*ct2_cmdline)
284
+ if ! system(*ct2_cmdline)
285
+ puts " -> failed with error code #$?, aborting"
286
+ exit 1
287
+ end
285
288
 
286
289
  b = nil
287
290
 
@@ -50,5 +50,5 @@ require 'ctioga2/plotmaker'
50
50
 
51
51
  plot_maker = CTioga2::PlotMaker.new
52
52
 
53
- plot_maker.run(ARGV)
53
+ exit(plot_maker.run(ARGV))
54
54
 
@@ -293,6 +293,8 @@ module CTioga2
293
293
  if compulsory_args.size != @arguments.size
294
294
  raise ArgumentNumberMismatch, "Command #{@name} was called with #{args.size} arguments, but it takes #{@arguments.size}"
295
295
  end
296
+ plotmaker_target.interpreter.
297
+ add_instruction(Instruction.new(self, compulsory_args, optional_args))
296
298
  args += compulsory_args
297
299
  if has_options?
298
300
  if optional_args
@@ -113,7 +113,7 @@ module CTioga2
113
113
 
114
114
  os = ""
115
115
  for k,v in cmd.optional_arguments
116
- os << " /#{k}=#{v.type.name}"
116
+ os << " /#{k.gsub(/_/,'-')}=#{v.type.name}"
117
117
  end
118
118
  s2 = WordWrapper.wrap(os, size-4) # 4 for the spaces
119
119
  str << "\nOptions: #{s2.join("\n ")}"
@@ -102,6 +102,44 @@ EOH
102
102
  Prints the HTML documentation for all styles.
103
103
  EOH
104
104
 
105
+ HTMLColorsOptions = {
106
+ 'columns' => CmdArg.new('integer'),
107
+ 'class' => CmdArg.new('text'),
108
+ 'div-class' => CmdArg.new('text'),
109
+ 'rect-width' => CmdArg.new('integer'),
110
+ 'rect-height' => CmdArg.new('integer')
111
+ }
112
+
113
+
114
+ WriteHTMLColors =
115
+ Cmd.new("write-html-colors", nil, "--write-html-colors",
116
+ [], HTMLColorsOptions) do |plotmaker, opts|
117
+ html = HTML.new(plotmaker.interpreter.doc)
118
+ html.write_colors(opts)
119
+ end
120
+
121
+ WriteHTMLColors.describe("HTML documentation for colors",
122
+ <<EOH, DocumentationGenerationGroup)
123
+ Prints the HTML documentation for the colors, i.e. a color list.
124
+ EOH
125
+
126
+ WriteHTMLColorSets =
127
+ Cmd.new("write-html-color-sets", nil, "--write-html-color-sets",
128
+ [], HTMLColorsOptions.
129
+ merge({
130
+ 'include' => CmdArg.new('regexp'),
131
+ 'exclude' => CmdArg.new('regexp')
132
+ })) do |plotmaker, opts|
133
+ html = HTML.new(plotmaker.interpreter.doc)
134
+ html.write_color_sets(opts)
135
+ end
136
+
137
+ WriteHTMLColorSets.describe("HTML documentation for color sets",
138
+ <<EOH, DocumentationGenerationGroup)
139
+ Prints the HTML documentation for the color sets, i.e. the list of
140
+ all the sets together with the corresponding colors
141
+ EOH
142
+
105
143
 
106
144
  WriteHTMLBackends =
107
145
  Cmd.new("write-html-backends", nil, "--write-html-backends",
@@ -279,7 +279,91 @@ module CTioga2
279
279
  end
280
280
  end
281
281
  end
282
+ end
283
+
284
+ def write_color_list(colors, opts, out = STDOUT, color_names = nil)
285
+ columns = opts["columns"] || 5
286
+ cls = opts["class"] || "color-list"
287
+ div_cls = opts["div-class"]
288
+ rw = opts["rect-width"] || 80
289
+ rh = opts["rect-height"] || 40
290
+
291
+ div_common = (div_cls ? "class='#{div_cls}' style='" :
292
+ "style='width:#{rw};height:#{rh};")
293
+
294
+ out.puts "<table class='#{cls}'>"
295
+
296
+ idx = 0
297
+ for color in colors
298
+ if idx % columns == 0
299
+ if idx > 0
300
+ out.puts "</tr>"
301
+ end
302
+ out.puts "<tr>"
303
+ end
304
+ if color
305
+
306
+ cls = "##{Utils::color_to_html(color)}"
282
307
 
308
+ if color_names
309
+ c = color_names[idx]
310
+ else
311
+ c = Utils::color_name_by_value(color)
312
+ end
313
+ cb = if c
314
+ "#{c}<br/>"
315
+ else
316
+ ""
317
+ end
318
+
319
+ out.puts "<td><div #{div_common}background-color: #{cls};color: #{cls};'>#{cb}</div>#{cb}#{cls}</td>"
320
+ else
321
+ out.puts "<td>no color</td>"
322
+ end
323
+ idx += 1
324
+ end
325
+
326
+ out.puts "</tr></table>"
327
+
328
+ end
329
+
330
+ # Writes out a list
331
+ #
332
+ #@todo Split that to just write an ordered list of colors (get
333
+ #their names ?)
334
+ def write_colors(opts, out = STDOUT)
335
+ clrs = Tioga::ColorConstants::constants.sort
336
+ colors = clrs.map do |c|
337
+ Tioga::ColorConstants::const_get(c)
338
+ end
339
+ color_names = clrs.map do |c|
340
+ c.to_s
341
+ end
342
+
343
+ write_color_list(colors, opts, out, color_names)
344
+ end
345
+
346
+ def write_color_sets(opts, out = STDOUT)
347
+ sets = Graphics::Styles::CurveStyleFactory::parameters['color'].sets
348
+ set_names = sets.keys.sort
349
+
350
+ if opts['include']
351
+ set_names = set_names.select do |x|
352
+ x =~ opts['include']
353
+ end
354
+ elsif opts['exclude']
355
+ set_names = set_names.select do |x|
356
+ x !~ opts['exclude']
357
+ end
358
+ end
359
+
360
+ set_names = sets.keys.sort
361
+
362
+ for s in set_names
363
+ out.puts "<h5>Color set: <code>#{s}</code></h5>"
364
+ colors = sets[s]
365
+ write_color_list(colors, opts, out)
366
+ end
283
367
  end
284
368
 
285
369
 
@@ -169,9 +169,13 @@ EOH
169
169
  With this on, ctioga2 writes a whole lot of debugging information. You
170
170
  probably will not need that unless you intend to file a bug report or
171
171
  to tackle a problem yourself.
172
+
173
+ Be warned that it *will* slow down very significantly the processing
174
+ of ctioga2 (up to hundreds of times slower), especially if you are not
175
+ redirecting the output to a file.
172
176
  EOH
173
177
 
174
- # Includes a file
178
+ # Prints the command-line used
175
179
  EchoCmd =
176
180
  Cmd.new("echo", nil, "--echo", [ ]) do |plotmaker|
177
181
  STDERR.puts "Command-line used: "
@@ -183,7 +187,22 @@ EOH
183
187
  Writes the whole command-line used to standard error, quoted in such a
184
188
  way that it should be usable directly for copy/paste.
185
189
  EOH
190
+
191
+ # Writes down the list of instruction run so far
192
+ PrintInstructionsCmd =
193
+ Cmd.new("print-instructions", nil, "--print-instructions", [ ]) do |plotmaker|
194
+ for ins in plotmaker.interpreter.instructions
195
+ puts ins.to_s
196
+ end
197
+ end
186
198
 
199
+ PrintInstructionsCmd.describe("Prints the list of all the instructions run so far",
200
+ <<EOH, GeneralGroup)
201
+ Writes the list of all the instructions run so far.
202
+
203
+ This is not very helpful for now, possibly.
204
+ EOH
205
+
187
206
 
188
207
  end
189
208
  end
@@ -53,6 +53,8 @@ Running this will give the following syntax error:
53
53
  Doing it right would require the use of a decent amount of quotes.
54
54
  EOD
55
55
 
56
+ # dataset functions
57
+
56
58
  FuncPoint = Function.new("point", "Get dataset point information") do |pm, what, spec, *rest|
57
59
  dataset = if rest.first
58
60
  pm.data_stack.stored_dataset(rest.first)
@@ -106,6 +108,30 @@ optional third. It is parsed as {type: stored-dataset}
106
108
 
107
109
  EOD
108
110
 
111
+ Stats = []
112
+ [:x, :y, :z].each do |col|
113
+ [:min, :max, :range, :avg].each do |what|
114
+ name = "#{col}#{what}"
115
+ Stats << Function.new(name, "Gets the #{what} of the #{col} column") do |pm, ds, *rest|
116
+ dataset = pm.data_stack.stored_dataset(ds)
117
+ cln = dataset.send(col)
118
+ clv = cln.values
119
+ case what
120
+ when :range
121
+ "#{clv.min}:#{clv.max}"
122
+ when :avg
123
+ return clv.sum/clv.size
124
+ else
125
+ clv.send(what)
126
+ end
127
+ end
128
+ Stats.last.describe <<EOD
129
+ This is replaced by the the value of '#{what}' from the column '#{col}',
130
+ applied to the dataset given.
131
+ EOD
132
+ end
133
+ end
134
+
109
135
 
110
136
 
111
137
  end
@@ -159,6 +159,7 @@ A dataset that has already been loaded. It is either:
159
159
  dataset), 1 the second, -1 the last one, -2 the one before the last
160
160
  and so on. (it works just like Ruby's arrays).
161
161
  * The name of a named dataset.
162
+ * @#@ followed by the id of a plot element
162
163
  EOD
163
164
 
164
165
  # Something meant to be fed to PlotStyle#get_axis_style
@@ -0,0 +1,61 @@
1
+ # instruction.rb: an instruction
2
+ # copyright (c) 2015 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/commands/arguments'
16
+ require 'ctioga2/commands/groups'
17
+
18
+ module CTioga2
19
+
20
+ module Commands
21
+
22
+
23
+ # This class represents an instruction, i.e. the execution of one
24
+ # Command. It is different in Command in that, for most of them,
25
+ # there will be arguments
26
+ class Instruction
27
+
28
+ # The Command
29
+ attr_accessor :command
30
+
31
+ # The list of its arguments, already in the correct type.
32
+ attr_accessor :arguments
33
+
34
+ # The options, already in the correct type
35
+ attr_accessor :options
36
+
37
+ def initialize(cmd, args, opts)
38
+ if not cmd.respond_to?(:run_command)
39
+ c = Interpreter.command(cmd)
40
+ if ! c
41
+ raise "Invalid command #{cmd}"
42
+ end
43
+ cmd = c
44
+ end
45
+ @command = cmd
46
+ @arguments = args
47
+ @options = opts
48
+ end
49
+
50
+ # Runs this instruction again
51
+ def run(plotmaker_target)
52
+ @command.run_command(plotmaker_target, @arguments, @options)
53
+ end
54
+
55
+ def to_s
56
+ "#{@command.name} #{@arguments.inspect} #{@options.inspect}"
57
+ end
58
+ end
59
+ end
60
+ end
61
+
@@ -13,6 +13,7 @@
13
13
 
14
14
  require 'ctioga2/utils'
15
15
  require 'ctioga2/commands/commands'
16
+ require 'ctioga2/commands/instruction'
16
17
  require 'ctioga2/commands/context'
17
18
  require 'ctioga2/commands/variables'
18
19
  require 'ctioga2/commands/strings'
@@ -65,8 +66,6 @@ module CTioga2
65
66
  # All types defined so fat
66
67
  @@types = {}
67
68
 
68
-
69
-
70
69
  # Registers a given command. This is called automatically from
71
70
  # Command.new, so you should not have to do it yourself.
72
71
  def self.register_command(command)
@@ -166,6 +165,9 @@ module CTioga2
166
165
  # The current context
167
166
  attr_accessor :context
168
167
 
168
+ # The list of Instruction that were run so far
169
+ attr_accessor :instructions
170
+
169
171
  # Creates an Interpreter with _target_ as the PlotMaker target
170
172
  # object.
171
173
  #
@@ -192,7 +194,15 @@ module CTioga2
192
194
 
193
195
  @file_parser = Parsers::FileParser.new
194
196
  @context = ParsingContext.new
197
+ @instructions = []
198
+ end
199
+
200
+ # Adds the given instruction to the list of Instruction that
201
+ # were run so far.
202
+ def add_instruction(instruction)
203
+ @instructions << instruction
195
204
  end
205
+
196
206
 
197
207
  # Calls the given function and returns the result
198
208
  def call_function(name, args)
@@ -291,6 +291,44 @@ module CTioga2
291
291
  end
292
292
  end
293
293
 
294
+ # Bins the values of the columns into nb bins between min and
295
+ # max. Values outside that range are not taken into account. If
296
+ # @a normalize is true, then each value is normalized by the
297
+ # total number of samples.
298
+ #
299
+ # It returns [xv, yv], where xv are the centers of the bins, and
300
+ # yv the counts
301
+ #
302
+ # Does not take into account the error columns.
303
+ def bin(min, max, nb, normalize = false)
304
+ total = @values.size*1.0
305
+ xv = Dobjects::Dvector.new(nb)
306
+ yv = Dobjects::Dvector.new(nb)
307
+
308
+ 0.upto(nb-1) do |i|
309
+ xv[i] = min + (max-min)*(i+0.5)/nb
310
+ yv[i] = 0
311
+ end
312
+
313
+ for v in @values
314
+ idx = (v-min)/(max-min)
315
+ if idx > 1.0 or idx < 0
316
+ next
317
+ end
318
+ idx = (idx*nb).to_i
319
+ if idx == nb
320
+ idx = nb-1 # case v = max
321
+ end
322
+ yv[idx] += 1
323
+ end
324
+
325
+ if normalize
326
+ yv *= (1.0/total)
327
+ end
328
+
329
+ return [xv, yv]
330
+ end
331
+
294
332
  # Averages over the given indices, and puts the result at the
295
333
  # target index.
296
334
  #