For the first post of the year, I wanted to show you how to take advantage of Ruby, the programming language embedded in QSoas, to make various things, like:
- creating a column with the sum of Y values;
- extending values that are present only in a few lines;
- renaming datasets using a pattern.
Summing the values in a column
When using commands that take formulas (Ruby code), like apply-formula, the code is run for every single point, for which all the values are updated. In particulier, the state of the previous point is not known. However, it is possible to store values in what is called global variables, whose name start with an$
sign. Using this, we can keep track of the previous values. For instance, to create a new column with the sum of the y
values, one can use the following approach:
QSoas> eval $sum=0 QSoas> apply-formula /extra-columns=1 $sum+=y;y2=$sumThe first line initializes the variable to 0, before we start summing, and the code in the second line is run for each dataset row, in order. For the first row, for instance,
$sum
is initially 0 (from the eval
line); after the execution of the code, it is now the first value of y
. After the second row, the second value of y
is added, and so on. The image below shows the resulting y2
when used on:
QSoas> generate-dataset -1 1 x
Extending values in a column
Another use of the global variables is to add "missing" data. For instance, let's imagine that a files given the variation of current over time as the potential is changed, but the potential is only changed stepwise and only indicated when it changes:## time current potential 0 0.1 0.5 1 0.2 2 0.3 3 0.2 4 1.2 0.6 5 1.3 ...If you need to have the values everywhere, for instance if you need to split on their values, you could also use a global variable, taking advantage of the fact that missing values are represented by QSoas using "Not A Number" values, which can be detected using the Ruby function
nan?
:
QSoas> apply-formula "if y2.nan?; then y2=$value; else $value=y2;end"Note the need of quotes because there are spaces in the ruby code. If the value of
y2
is NaN, that is it is missing, then it is taken from the global variable $value
else $value
is set the current value of y2
. Hence, the values are propagated down:
## time current potential 0 0.1 0.5 1 0.2 0.5 2 0.3 0.5 3 0.2 0.5 4 1.2 0.6 5 1.3 0.6 ...Of course, this doesn't work if the first value of
y2
is missing.
Renaming using a pattern
The command save-datasets can be used to save a whole series of datasets to the disk. It can also rename them on the fly, and, using the/mode=rename
option, does only the renaming part, without saving. You can make full use of meta-data (see also a first post here)for renaming. The full power is unlocked using the /expression=
option. For instance, for renaming the last 5 datasets (so numbers 0 to 4) using a scheme based on the value of their pH
meta-data, you can use the following code:
QSoas> save-datasets /mode=rename /expression='"dataset-#{$meta.pH}"' 0..4The double quotes are cumbersome but necessary, since the outer quotes (
'
) prevent the inner ones ("
) to be removed and the inner quotes are here to indicate to Ruby that we are dealing with text. The bit inside #{...}
is interpreted by Ruby as Ruby code; here it is $meta.pH
, the value of the "pH" meta-data. Finally the 0..4
specifies the datasets to work with. So theses datasets will change name to become dataset-7
for pH 7, etc...