First of all, let me all wish you a happy new year, with all my wishes of health and succes. I sincerely hope this year will be simpler for most people as last year !
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=$sum
The 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..4
The 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...
About QSoas
QSoas is a powerful open source data analysis program that focuses on flexibility and powerful fitting capacities. It is released under the
GNU General Public License. It is described in
Fourmond, Anal. Chem., 2016, 88 (10), pp 5050–5052. Current version is
3.0. You can download its source code
there (or clone from the
GitHub repository) and compile it yourself, or buy precompiled versions for MacOS and Windows
there.