Scripting Reference

This section describes the requirements for extending the Analysis framework.

General

User-made nodes live in the ~/.avis/nodes/ directory. You can create as many subdirectories at any depth. You should not have more than one script with the same filename in the same language, to avoid confusion.

Note

This section describes common properties amongst languages. Please refer to the actual languages for examples.

Format

AViS Accepts these basic data types. They can be either appear single or as an array.

Type Bytes
short 2
int 4
double 8

These few things are parsed by the pre-processor. They are all optional except when stated.

  • Description

    Comments at the top of the script, if any, will be parsed as the description of the node.

  • Input variables

    Variables that will be parsed as the inputs for the node.

  • Output variables

    Variables that will be parsed as the inputs for the node.

  • Progress variable

    A variable which the script sets to display a progress bar on the node.

  • Entry point (not optional)

    The function to be called when the node is executed. It must be a function with no arguments and no return value.

Marks are the single API requirement for an AViS script. Each mark is a comment starting with @ that immediately precedes its target, with no extra spaces or newlines in between. AViS does not, and will never require an include library / header, so your code will be entirely portable as the language allows it.

Example:

`@Some Mark`
This line of code is marked!

You are free to use any variable or function name as you like; the names are entirely local to your script. However, as the names will be shown on the node UI, names longer than 10 letters are not encouraged.

Tip

You can toggle the behavior of name rendering in the Preferences.

Arrays

Arrays in AViS is ordered as C-like: The right-est index advances the fastest. However, code in Fortran should write as normal: advancing the left-est index the fastest.

C++

The general format of a parse-able script is as follows.

  • Description:

    //@Description
    //@This text will appear on the top of the node
    //@This is another line.
    
  • Input variables:

    //@in
    int numberOfFrames = 0;
    
  • Output variables:

    //@out
    int numberOfRedAtoms = 0;
    
  • Progress variable:

    //@progress
    double progressOfTheCode = 0;
    
  • Entry point:

    //@entry
    void DoSomething() {
       //do something fancy!
    }
    

The code can be in global scope, or put into a class with the same name as the script. When the code is classed as such, multiple instances of the script can be used for the same graph, without sharing variables.

Arrays

C-like code uses raw-pointers as dynamic arrays, so you need to know the length of each dimension. They can be specified beside the in or out comment. Length variables can be either: an input or output variable, a variable declared as var, or a constant. All length variables must be of type int.

Example:

//@in cnt
short* takeAnArrayOfSizeCnt = 0;
//@out cnt 3
double* andReturnAnArrayOfSizeCntX3 = 0;

//@in
int birdCount = 0;
//@out numberOfBirds numberOfEggs
double* eggSizes = 0;
//@var
int numberOfEggs = 4;

For multi-dimensional arrays, the items are arranged row-major. That is, the right-est index advances the fastest.

Example:

//@in a b c
int* myArray = 0;

//The element at location [x][y][z] can be accessed as below.
//It is your responsibility to not overflow the indices!
int xyz = myArray[x*b*c + y*c + z];

Tip

If you want a “safe” way of handling pointers, you can use vectors:

//@in 100
double* array = 0;
std::vector<double> _array;

void SetArrays() {
   _array.resize(100);
   array = _array.data();
}

Tip

If you want to use other libraries that require additional compiler/linker flags, you can set them in Preferences. OpenMP flags are available.

Python

Note

As Python variable declarations are implicit, the type of the variable must be specified beside the #@in/#@out comment.

The general format of a parse-able script is as follows.

  • Description:

    #@Description
    #@This text will appear on the top of the node
    #@This is another line.
    
  • Input variables:

    #@in int
    myVar = 0
    
  • Output variables:

    #@out double
    outVar = 0.0
    
  • Entry point:

    #@entry
    def DoSomething:
       #do something fancy!
    

Arrays

AViS uses the NumPy api for Python arrays. The type of variable is list(nt), where n = dim and t = first character of the element type.

Example:

using numpy as np

#@in list(1d)
myArray = np.zeros(5)

#@out list(2i)
myArray = np.zeros((100, 3), dtype=int32)

Fortran

Note

A fortran script should contain a primary module with the same name as the first module.

The general format of a parse-able script is as follows.

  • Description:

    !@Description
    !@This text will appear on the top of the node
    !@This is another line.
    
  • Input variables:

    !@in
    INTEGER :: MYINT
    
  • Output variables:

    !@out
    REAL*8 :: DOUBLEVAR
    
  • Progress variable:

    !@progress
    REAL*8 :: PROGRESSMEOW
    
  • Entry point:

    !@entry
    SUBROUTINE HELLO()
       !say hello!
    end subroutine HELLO
    

Arrays

To allow for interoperability with other languages, arrays must be declared as ALLOCATABLE TARGET s.

Example:

!@in
REAL*8, ALLOCATABLE, TARGET :: SOMEARRAY (:,:)