S-Lang contains a number of commonly-used mathematical
functions - such as sin, cos, exp, log - as well as
allowing the use of user-defined functions. These functions
will work on arrays of numbers as well as single elements:
chips> x = 0.456
chips> y = sin(x)
chips> print(y)
0.44036
chips> xarr = [1:10] / 3.0
chips> yarr = sin(xarr)
chips> writeascii(stdout,xarr,yarr)
0.333333 0.327195
0.666667 0.61837
1 0.841471
1.33333 0.971938
1.66667 0.995408
2 0.909297
2.33333 0.723086
2.66667 0.457273
3 0.14112
3.33333 -0.190568
chips> print(yarr[2])
0.841471
S-Lang also provides means to easily manipulate subsets of arrays.
In the example below we use the where() function to find the
array indices of those elements whose values are less than 0.1, and
then print out these indices, together with the corresponding values:
chips> y = sin([0:10:0.5])
chips> i = where( y < 0.1 )
chips> writeascii( stdout, i, y[i] )
0 0
7 -0.350783
8 -0.756802
9 -0.97753
10 -0.958924
11 -0.70554
12 -0.279415
19 -0.0751511
S-Lang variables can be used by ChIPS and Sherpa.
The following plots the previously-calculated x and y arrays
using a S-Lang function - curve() - and then modifies the plot using ChIPS commands.
chips> () = curve(xarr,yarr)
chips> simpleline
chips> symbol none
chips> title "A combined S-Lang/ChIPS plot"
It is also easy to read in a file - using Varmm functions - then
manipulate the data and produce graphical output.
chips> dat = readfile("phas.dat")
chips> print(dat)
_filename = phas.dat
_path = /ciao/data
_filter = NULL
_filetype = 1
_ncols = 2
_nrows = 124
col1 = Float_Type[124]
col2 = Float_Type[124]
chips> () = curve(dat.col1,dat.col2)
chips> newvar = log(dat.col2 + 1) + 10
chips> split 2
chips> () = curve(dat.col1,newvar)
The tips page ("ahelp tips") provides a number
of examples demonstrating how to write S-Lang code.