<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://alida.informatik.uni-halle.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Posch</id>
	<title>Alida - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://alida.informatik.uni-halle.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Posch"/>
	<link rel="alternate" type="text/html" href="https://alida.informatik.uni-halle.de/index.php/Special:Contributions/Posch"/>
	<updated>2026-04-09T23:49:04Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.38.2</generator>
	<entry>
		<id>https://alida.informatik.uni-halle.de/index.php?title=Java_quick&amp;diff=280</id>
		<title>Java quick</title>
		<link rel="alternate" type="text/html" href="https://alida.informatik.uni-halle.de/index.php?title=Java_quick&amp;diff=280"/>
		<updated>2016-03-17T16:16:07Z</updated>

		<summary type="html">&lt;p&gt;Posch: /* Graphical workflow editor: Grappa */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here we introduce Alida's operator concept with some code snippets of &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt; and sub-classed demo operators.&lt;br /&gt;
we focus on Alida's capabilities to automatically generate user interfaces.&lt;br /&gt;
&lt;br /&gt;
=  First operator =&lt;br /&gt;
&lt;br /&gt;
As a first example of an Alida operator we implement the row or column wise&lt;br /&gt;
sum for a 2D array of Doubles.&lt;br /&gt;
The class &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt; extending &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt; features three member variables&lt;br /&gt;
holding the input 2D array, an enum to indicate the mode of summation (&amp;lt;code&amp;gt;ROW&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;COLUMN&amp;lt;/code&amp;gt;), and&lt;br /&gt;
an 1D array of the sums to be computed and returned by the operator.&lt;br /&gt;
Alida requires only to annotate these members with the @Parameter annotation&lt;br /&gt;
which declares &lt;br /&gt;
&lt;br /&gt;
* the direction (&amp;lt;code&amp;gt;IN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;OUT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INOUT&amp;lt;/code&amp;gt;), &lt;br /&gt;
* whether the parameter is required,&lt;br /&gt;
* an optional textual description,&lt;br /&gt;
* and a label used, e.g. in the graphical user interface automatically generated&lt;br /&gt;
		to execute the operator.&lt;br /&gt;
&lt;br /&gt;
It is important to add a public standard constructor (without arguments)&lt;br /&gt;
to be able to use Java's reflection mechanism.&lt;br /&gt;
Finally, the abstract method &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; of &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt; has to be overridden&lt;br /&gt;
implementing the functionality of the operator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
				level=ALDAOperator.Level.APPLICATION)&lt;br /&gt;
public class MatrixSum extends ALDOperator {&lt;br /&gt;
&lt;br /&gt;
  /** Choose row or colum wise sum&lt;br /&gt;
    */&lt;br /&gt;
  public static enum SummarizeMode {&lt;br /&gt;
	/** row wise */&lt;br /&gt;
	ROW,&lt;br /&gt;
&lt;br /&gt;
	/** column wise */&lt;br /&gt;
	COLUMN&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Input matrix&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;Input matrix&amp;quot;, required = true, &lt;br /&gt;
  		direction = Parameter.Direction.IN, description = &amp;quot;Input matrix.&amp;quot;)&lt;br /&gt;
  private Double[][] matrix;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Mode of summarizing&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;Summarize mode&amp;quot;, required = true, &lt;br /&gt;
  		direction = Parameter.Direction.IN, description = &amp;quot;Sum over columns or rows?&amp;quot;)&lt;br /&gt;
  private SummarizeMode summarizeMode = SummarizeMode.ROW;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * 1D Array of sums.&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;sums&amp;quot;,  &lt;br /&gt;
  		direction = Parameter.Direction.OUT, description = &amp;quot;Row or column wise sums.&amp;quot;)&lt;br /&gt;
  private Double[] sums = null;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Default constructor.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public MatrixSum() throws ALDOperatorException {&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Constructor.&lt;br /&gt;
	 * &lt;br /&gt;
	 * @param matrix	Input matrix.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public MatrixSum(Double[] [] matrix) throws ALDOperatorException {&lt;br /&gt;
		this.matrix = matrix;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	protected void operate() {&lt;br /&gt;
		if ( matrix == null ) &lt;br /&gt;
			sums = null;&lt;br /&gt;
&lt;br /&gt;
		// calculate sums&lt;br /&gt;
		if ( summarizeMode == SummarizeMode.ROW ) {&lt;br /&gt;
			sums = new Double[matrix.length];&lt;br /&gt;
			for ( int row = 0 ; row &amp;lt; matrix.length ; row++ ) {&lt;br /&gt;
				sums[row] = 0.0;&lt;br /&gt;
				for ( int col = 0 ; col &amp;lt; matrix[0].length ; col++ )&lt;br /&gt;
					sums[row] += matrix[row][col];&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			sums = new Double[matrix[0].length];&lt;br /&gt;
			for ( int col = 0 ; col &amp;lt; matrix[0].length ; col++ ) {&lt;br /&gt;
				sums[col] = 0.0;&lt;br /&gt;
				for ( int row = 0 ; row &amp;lt; matrix.length ; row++ )&lt;br /&gt;
					sums[col] += matrix[row][col];&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These are the basic requirements for the operator to be used on the programming level.&lt;br /&gt;
An example of this use is included in the example in the next section.&lt;br /&gt;
&lt;br /&gt;
If we further annotate the class with &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
this is all needed to also facilitate &lt;br /&gt;
execution of this operator via a graphical and a command line user interface&lt;br /&gt;
automatically generated by Alida.&lt;br /&gt;
(Setting &amp;lt;code&amp;gt;level=ALDAOperator.Level.APPLICATION&amp;lt;/code&amp;gt; declares this operator an application&lt;br /&gt;
which is used in the GUI to control display of available operators.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Invocation via a graphical user interface ==&lt;br /&gt;
&lt;br /&gt;
Alida comes with one single application to execute Alida operators&lt;br /&gt;
with a automatically generated graphical user interface which may be&lt;br /&gt;
started from command line by&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunnerGUI&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will pop up a window to choose an operator to execute.&lt;br /&gt;
Arranged according to the package structure all operators allows to be executed&lt;br /&gt;
via the graphical user interface according to their &amp;lt;code&amp;gt;genericExecutionMode&amp;lt;/code&amp;gt;&lt;br /&gt;
are displayed.&lt;br /&gt;
Initially packages are unfolded up to a predefined depth.&lt;br /&gt;
Unfold the demo package, select &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt;, and choose the &amp;quot;Configure Operator&amp;quot; button.&lt;br /&gt;
This will pop up another window which allows you to configure the input parameters&lt;br /&gt;
of the operator.&lt;br /&gt;
Important note: After finishing to input the data matrix entering the final matrix elements&lt;br /&gt;
you have to select a previous matrix element due to subtle AWT details.&lt;br /&gt;
For the enumeration to select the mode Alida has automatically generated&lt;br /&gt;
a combo box to allow convenient selections.&lt;br /&gt;
If you are finished with the parameter configuration you want to invoke the operator&lt;br /&gt;
using the run button.&lt;br /&gt;
On completion of &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt; the interface will pop up the result window which allows you&lt;br /&gt;
to inspect the outcome of the operation.&lt;br /&gt;
&lt;br /&gt;
==   Invocation via command line ==&lt;br /&gt;
&lt;br /&gt;
The command line user interface of Alida allows to invoke all Alida operator&lt;br /&gt;
properly annotated to allows generic execution.&lt;br /&gt;
&lt;br /&gt;
You may invoke the matrix summation operator by&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix='[[1,2,3],[4,5,6]]' sums=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
which returns as result on standard output&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sums = [6.0,15.0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter values are specified as name=value pairs.&lt;br /&gt;
Alida's syntax for 2D array should be self-explanatory  from this example.&lt;br /&gt;
As the mode of summation is not supplied as a parameter its default is used&lt;br /&gt;
&lt;br /&gt;
Note, the command&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix='[[1,2,3],[4,5,6]]' &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
will return no output as the command line user interface returns only output parameters requested.&lt;br /&gt;
&lt;br /&gt;
The enumeration defined in &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt; is supported by the&lt;br /&gt;
user interface without further action required as shown in the next example.&lt;br /&gt;
This also demonstrates redirection of output&lt;br /&gt;
to a file, sums.out in this case.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix='[[1,2,3],[4,5,6]]' &lt;br /&gt;
	summarizeMode=COLUMN sums=@sums.out+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Input can be read from file as well:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix=@data sums=-+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where the file data contains the string defining the matrix, e.g., &amp;lt;code&amp;gt;[[1,2,3],[4,5,6]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Adding more features to an operator =&lt;br /&gt;
&lt;br /&gt;
We now generalize this example to realize not only summation over rows or&lt;br /&gt;
columns, but arbitrary summarizing operations.&lt;br /&gt;
This shows Alida's feature to allow an operator as parameter of another operator.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
First we generalize &amp;lt;code&amp;gt;ALDArraySum&amp;lt;/code&amp;gt; to the operator &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt;&lt;br /&gt;
which also takes a 2D array and an enum indicating the mode of marginalization (&amp;lt;code&amp;gt;ROW&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;COLUMN&amp;lt;/code&amp;gt;).&lt;br /&gt;
It takes an additional input parameter which specifies the operation to be applied on each&lt;br /&gt;
row or column.&lt;br /&gt;
&lt;br /&gt;
This parameter is itself an Alida operator and of type &amp;lt;code&amp;gt;ALDSummarizeArrayOp&amp;lt;/code&amp;gt;&lt;br /&gt;
which is implemented as an abstract class.&lt;br /&gt;
This abstract operator defines a summarizing operator&lt;br /&gt;
which takes a 1D array as input and returns a summarizing scalar.&lt;br /&gt;
As this is an abstract class there is no need to override the &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt;&lt;br /&gt;
method, however some getter and setter methods are provided.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  @Parameter( label= &amp;quot;Input 1D array&amp;quot;, required = true, &lt;br /&gt;
  		direction = Parameter.Direction.IN, description = &amp;quot;Input array (1D).&amp;quot;)&lt;br /&gt;
  protected Double[] data;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Summarizing scalar&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;Summarizing scalar&amp;quot;,  &lt;br /&gt;
  		direction = Parameter.Direction.OUT, description = &amp;quot;Summarizing scalar of the 1D arra&amp;quot;)&lt;br /&gt;
  protected Double summary = null;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Default constructor.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public ALDSummarizeArrayOp() throws ALDOperatorException {&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Returns the 1D array&lt;br /&gt;
	 * @return data array&lt;br /&gt;
	 */&lt;br /&gt;
	public Double[] getData() {&lt;br /&gt;
		return this.data;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Sets the 1D array&lt;br /&gt;
	 * @param data&lt;br /&gt;
	 */&lt;br /&gt;
	public void setData( Double[] data) {&lt;br /&gt;
		this.data = data;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we add concrete examples of such a summarizing operation, in this case&lt;br /&gt;
summation (&amp;lt;code&amp;gt;ALDArraySum&amp;lt;/code&amp;gt;), to return the mean (&amp;lt;code&amp;gt;ALDArrayMean&amp;lt;/code&amp;gt;), and the minimum (&amp;lt;code&amp;gt;ALDArrayMin&amp;lt;/code&amp;gt;).&lt;br /&gt;
Each implements the  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method and has to supply a standard constructor.&lt;br /&gt;
In this example we add another constructor for convenience.&lt;br /&gt;
This operators are declared as operators on the standard in contrast to &lt;br /&gt;
application level, as they are not expected to be invoked as an application.&lt;br /&gt;
However, setting the level to standard in the menu of the graphical user interface&lt;br /&gt;
stills allows their execution.&lt;br /&gt;
When extending the abstract super class it is necessary to annotate the&lt;br /&gt;
class with &amp;lt;code&amp;gt;@ALDDerivedClass&amp;lt;/code&amp;gt; in order to allow Alida's dataIO mechanism to find the derived class&lt;br /&gt;
in the automatically generated user interface.&lt;br /&gt;
This holds for other parameter types as well.&lt;br /&gt;
More specifically, if an instance of a class is to be supplied in an automatically &lt;br /&gt;
generated user interface as a value for a parameter of one of its super classes,&lt;br /&gt;
Alida requires the annotation &amp;lt;code&amp;gt;@ALDDerivedClass&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDDerivedClass&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
        level=ALDAOperator.Level.STANDARD)&lt;br /&gt;
public class ALDArraySum extends ALDSummarizeArrayOp {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void operate() {&lt;br /&gt;
        summary = 0.0;&lt;br /&gt;
        for ( int i = 0 ; i &amp;lt; data.length ; i++ )&lt;br /&gt;
            summary += data[i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Default constructor.&lt;br /&gt;
     * @throws ALDOperatorException&lt;br /&gt;
     */&lt;br /&gt;
    public ALDArraySum() throws ALDOperatorException {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we are ready to implement &lt;br /&gt;
the &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt; operator, which also demonstrates supplemental parameters.&lt;br /&gt;
This supplementals, e.g., control debugging output or returning of intermediate results.&lt;br /&gt;
For demo purposes we declare a supplemental input parameter &amp;lt;code&amp;gt;returnElapsedTime&amp;lt;/code&amp;gt;.&lt;br /&gt;
If it is set to true the operator will return the elapsed time in a second&lt;br /&gt;
supplemental parameter with direction output.&lt;br /&gt;
&lt;br /&gt;
Again, the operation is implemented in the  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method and the remainder of the&lt;br /&gt;
class supplies getter and setter methods for convenience.&lt;br /&gt;
The  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method give also an example of the invocation of an operator on the&lt;br /&gt;
programming level.&lt;br /&gt;
In this case, an instance of the operator is already passed as a parameter.&lt;br /&gt;
Its parameters are set, in this case each 1D array to be summarized in turn.&lt;br /&gt;
Upon return from the method &amp;lt;code&amp;gt;runOp()&amp;lt;/code&amp;gt; the results may be retrieved from the operator object,&lt;br /&gt;
in this example with the &amp;lt;code&amp;gt;getSummary()&amp;lt;/code&amp;gt; method.&lt;br /&gt;
Besides getter and setter methods as implemented in each operator&lt;br /&gt;
Alida provides also a generic get and set methods applicable to&lt;br /&gt;
all parameters of an operator.&lt;br /&gt;
Note, that the operator is not invoked by its  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method, but via&lt;br /&gt;
the &amp;lt;code&amp;gt;runOp()&amp;lt;/code&amp;gt; method implemented the base class &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt;.&lt;br /&gt;
This methods validates the parameters before invocation of  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt;.&lt;br /&gt;
Furthermore, it take all necessary measures for Alida's processing&lt;br /&gt;
history which automatically logs&lt;br /&gt;
all manipulative actions on the data and corresponding parameter settings. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
            level=ALDAOperator.Level.APPLICATION)&lt;br /&gt;
public class ApplyToMatrix extends ALDOperator {&lt;br /&gt;
&lt;br /&gt;
    /** Choose row or colum wise sum&lt;br /&gt;
      */&lt;br /&gt;
    public static enum SummarizeMode {&lt;br /&gt;
      /** row wise */&lt;br /&gt;
      ROW,&lt;br /&gt;
      /** column wise */&lt;br /&gt;
      COLUMN&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Input matrix&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Input matrix&amp;quot;, required = true, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Input matrix.&amp;quot;)&lt;br /&gt;
    private Double[][] matrix;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Mode of summarizing&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Summarize mode&amp;quot;, required = true, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Sum over columns or rows.&amp;quot;)&lt;br /&gt;
    private SummarizeMode summarizeMode = SummarizeMode.ROW;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Summarizing opererator&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Summarizing operator&amp;quot;, required = true, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Specifies the summarizing operation to apply&amp;quot;)&lt;br /&gt;
    private ALDSummarizeArrayOp summarizeOp;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 1D Array of summaries.&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;summaries&amp;quot;,  &lt;br /&gt;
          direction = Parameter.Direction.OUT, description = &amp;quot;Row or column wise summaries&amp;quot;)&lt;br /&gt;
    private Double[] summaries = null;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Supplemental to request elapsed time to be returned&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Return elapsed time&amp;quot;, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Request elapsed time consumed to be returned&amp;quot;,&lt;br /&gt;
        supplemental=true)&lt;br /&gt;
    private boolean returnElapsedTime = false;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Elpased time &lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Elapsed time&amp;quot;,  &lt;br /&gt;
          direction = Parameter.Direction.OUT, description = &amp;quot;Elapsed time of operation in milliseconds&amp;quot;,&lt;br /&gt;
        supplemental=true)&lt;br /&gt;
    private long elapsedTime;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Default constructor.&lt;br /&gt;
     * @throws ALDOperatorException&lt;br /&gt;
     */&lt;br /&gt;
    public ApplyToMatrix() throws ALDOperatorException {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Constructor.&lt;br /&gt;
     * &lt;br /&gt;
     * @param matrix    Input matrix.&lt;br /&gt;
     * @throws ALDOperatorException&lt;br /&gt;
     */&lt;br /&gt;
    public ApplyToMatrix(Double[] [] matrix) throws ALDOperatorException {&lt;br /&gt;
        this.matrix = matrix;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void operate() throws ALDOperatorException,ALDProcessingDAGException {&lt;br /&gt;
        if ( returnElapsedTime ) &lt;br /&gt;
            elapsedTime = System.currentTimeMillis();&lt;br /&gt;
&lt;br /&gt;
        if ( matrix == null ) &lt;br /&gt;
            summaries = null;&lt;br /&gt;
&lt;br /&gt;
        // calculate summaries&lt;br /&gt;
        if ( summarizeMode == SummarizeMode.ROW ) {&lt;br /&gt;
            summaries = new Double[matrix.length];&lt;br /&gt;
            for ( int row = 0 ; row &amp;lt; matrix.length ; row++ ) {&lt;br /&gt;
                summarizeOp.setData(matrix[row]);&lt;br /&gt;
                summarizeOp.runOp();&lt;br /&gt;
                summaries[row] = summarizeOp.getSummary();&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            summaries = new Double[matrix[0].length];&lt;br /&gt;
            Double[] tmp = new Double[matrix.length];&lt;br /&gt;
            for ( int col = 0 ; col &amp;lt; matrix[0].length ; col++ ) {&lt;br /&gt;
                for ( int row = 0 ; row &amp;lt; matrix.length ; row++ )&lt;br /&gt;
                    tmp[row] = matrix[row][col];&lt;br /&gt;
&lt;br /&gt;
                summarizeOp.setData(tmp);&lt;br /&gt;
                summarizeOp.runOp();&lt;br /&gt;
                summaries[col] = summarizeOp.getSummary();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if ( returnElapsedTime ) &lt;br /&gt;
            elapsedTime = System.currentTimeMillis() - elapsedTime;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // ==============================================================&lt;br /&gt;
    // Getter and setter methods&lt;br /&gt;
    /** Get value of returnElapsedTime.&lt;br /&gt;
      * Explanation: Request elapsed time consumed to be returned.&lt;br /&gt;
      * @return value of returnElapsedTime&lt;br /&gt;
      */&lt;br /&gt;
    public boolean getReturnElapsedTime(){&lt;br /&gt;
        return returnElapsedTime;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /** Set value of returnElapsedTime.&lt;br /&gt;
      * Explanation: Request elapsed time consumed to be returned.&lt;br /&gt;
      * @param value New value of returnElapsedTime&lt;br /&gt;
      */&lt;br /&gt;
    public void setReturnElapsedTime( boolean value){&lt;br /&gt;
        this.returnElapsedTime = value;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==   Invocation via a graphical user interface ==&lt;br /&gt;
&lt;br /&gt;
If the graphical interface is still running just select our new operator&lt;br /&gt;
and begin to configure it.&lt;br /&gt;
For the parameter summarizing operator you have a choice of all operators extending&lt;br /&gt;
the abstract operator &amp;lt;code&amp;gt;ALDSummarizeArrayOp&amp;lt;/code&amp;gt;.&lt;br /&gt;
All which is necessary on the implementation side is proper annotation of the extending&lt;br /&gt;
classes with &amp;lt;code&amp;gt;@ALDDerivedClass&amp;lt;/code&amp;gt;.&lt;br /&gt;
As the selected operator may have its own parameters you may want to configure it.&lt;br /&gt;
In our example this is not necessary as the input array is, of course, supplied&lt;br /&gt;
by the &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt; operator.&lt;br /&gt;
Do not forget to input your data before hitting the run button.&lt;br /&gt;
After return, again a result window give you the results of the operation.&lt;br /&gt;
Note, if you did not tick Return elapsed time&amp;quot; this window will show zero&lt;br /&gt;
for the time elapsed as the operator has not been request to stop the time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==   Invocation via command line ==&lt;br /&gt;
&lt;br /&gt;
When invoking the &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt; operator from command line&lt;br /&gt;
we have to handle derived classes as value for parameters.&lt;br /&gt;
In the graphical user interface Alida features a combo box where&lt;br /&gt;
we may choose from.&lt;br /&gt;
In the command line interface Alida allows to prefix the value of a parameter&lt;br /&gt;
with a derived class to be passed to the operator.&lt;br /&gt;
This is necessary as Alida as, of course, no way to itself&lt;br /&gt;
decide if and which derived class is to be used.&lt;br /&gt;
Alida's syntax is to enclose the class name in a dollar sign and a colon.&lt;br /&gt;
As evident in the following example, abbreviations are of the fully&lt;br /&gt;
qualified class name are accepted as long as they are unambiguous.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner Apply \&lt;br /&gt;
	matrix='[[1,2,3],[4,5,6]]' \&lt;br /&gt;
	summarizeMode=ROW \&lt;br /&gt;
	summarizeOp='&amp;lt;math&amp;gt;ALDArrayMean:{}' \&lt;br /&gt;
	summaries=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
results in&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
summaries = [2.0,5.0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ALDOpRunner&amp;lt;/code&amp;gt; may be persuaded to show all operators derived from &amp;lt;code&amp;gt;ALDSummarizeArrayOp&amp;lt;/code&amp;gt;&lt;br /&gt;
and known within the user interface if we enter an invalid class name:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner \&lt;br /&gt;
	Apply matrix='[[1,2,3],[4,5,6]]' \&lt;br /&gt;
	summarizeMode=ROW summarizeOp='&amp;lt;/math&amp;gt;dd:{}' \&lt;br /&gt;
	summaries=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
yields&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALDStandardizedDataIOCmdline::readData found 0 derived classes matching &amp;lt;dd&amp;gt;&lt;br /&gt;
      derived classes available:&lt;br /&gt;
	de.unihalle.informatik.Alida.demo.ALDArrayMean&lt;br /&gt;
	de.unihalle.informatik.Alida.demo.ALDArrayMin&lt;br /&gt;
	de.unihalle.informatik.Alida.demo.ALDArraySum&lt;br /&gt;
ERROR: reading parameter &amp;lt;summarizeOp&amp;gt; returns null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supplemental parameters are handled like other parameters&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner Apply \&lt;br /&gt;
	matrix='[[1,2,3],[4,5,6]]' \&lt;br /&gt;
	summarizeMode=COLUMN \&lt;br /&gt;
	summarizeOp='&amp;lt;math&amp;gt;ALDArrayMin:{}' \&lt;br /&gt;
	summaries=- \&lt;br /&gt;
	returnElapsedTime=true \&lt;br /&gt;
	elapsedTime=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
gives&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	summaries = [1.0,2.0,3.0]&lt;br /&gt;
	elapsedTime = 4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=   Adding more data types as parameters =&lt;br /&gt;
&lt;br /&gt;
Alida provides automatic IO of primitive data types, enumerations, arrays, collections,&lt;br /&gt;
and operators.&lt;br /&gt;
In addition so called parameterized classes are supported.&lt;br /&gt;
Any Java class may be declared to be a parameterized class in Alida&lt;br /&gt;
by annotating the class &amp;lt;code&amp;gt;@ALDParametrizedClass&amp;lt;/code&amp;gt; as shown in the&lt;br /&gt;
class &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt;.&lt;br /&gt;
All member variables to be known to and handled by Alida's user interface&lt;br /&gt;
simply need to be annotated with &amp;lt;code&amp;gt;@ALDClassParameter&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Here we implement a toy version of experimental data &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt;.&lt;br /&gt;
A complete experiment contains&lt;br /&gt;
data of a time series of measurements of variable length.&lt;br /&gt;
Additional information is a descriptive string, the time resolution in milliseconds,&lt;br /&gt;
and whether baseline correction has been applied.&lt;br /&gt;
&lt;br /&gt;
The class is annotated by &amp;lt;code&amp;gt;@ALDParametrizedClass&amp;lt;/code&amp;gt;, and&lt;br /&gt;
and all members to be handle in Alida'a user interfaces are&lt;br /&gt;
to be annotated with &amp;lt;code&amp;gt;@ALDParametrizedClass&amp;lt;/code&amp;gt;.&lt;br /&gt;
The label field has the same semantics as for parameters of operators.&lt;br /&gt;
These annotations are the only implementational overhead&lt;br /&gt;
to allow Alida to automatically generate user interfaces&lt;br /&gt;
where the parameterized class acts as a parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDParametrizedClass&lt;br /&gt;
public class ExperimentalData1D extends ALDData {&lt;br /&gt;
	&lt;br /&gt;
    /** Description */&lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;description&amp;quot;, dataIOOrder = 1)&lt;br /&gt;
    private String description = null;&lt;br /&gt;
&lt;br /&gt;
    /** The data  */&lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;data&amp;quot;, dataIOOrder = 2)&lt;br /&gt;
    private Double[] data = null;&lt;br /&gt;
&lt;br /&gt;
    /** Are the data baseline corrected? */&lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;Baseline corrected&amp;quot;,&lt;br /&gt;
    			dataIOOrder = 3)&lt;br /&gt;
    private boolean baselineCorrected = false;&lt;br /&gt;
    &lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;Time resolution in milliseconds&amp;quot;, dataIOOrder = 4)&lt;br /&gt;
    private Float timeResolution = Float.NaN;&lt;br /&gt;
&lt;br /&gt;
    /** &lt;br /&gt;
     * Standard constructor is required&lt;br /&gt;
      */&lt;br /&gt;
    public ExperimentalData1D() {&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /** Constructor for an experiment.&lt;br /&gt;
      * Baseline correction is assumed to be false and nothung known about&lt;br /&gt;
      * the time resolution.&lt;br /&gt;
      *&lt;br /&gt;
      * @param  description   a textual description of the experiment&lt;br /&gt;
      * @param  data   measurements&lt;br /&gt;
      */&lt;br /&gt;
    public ExperimentalData1D( String description, Double[] data) {    &lt;br /&gt;
        this( description, data, false, Float.NaN);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is shown below for a simple normalizing operator &amp;lt;code&amp;gt;SmoothData1D&amp;lt;/code&amp;gt;&lt;br /&gt;
which takes experimental data as input an returns a new instance&lt;br /&gt;
of &amp;lt;code&amp;gt;ExperimentalData&amp;lt;/code&amp;gt; which contains smoothed data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDDerivedClass&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
              level=ALDAOperator.Level.APPLICATION)&lt;br /&gt;
public class SmoothData1D extends ALDOperator {&lt;br /&gt;
&lt;br /&gt;
	public enum SmoothingMethod {&lt;br /&gt;
		MEDIAN, MEAN, GAUSSIAN&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/** 1D Experiment&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label= &amp;quot;1D Experiment&amp;quot;, required = true, &lt;br /&gt;
			direction = Parameter.Direction.IN, &lt;br /&gt;
			description = &amp;quot;1D Experiment&amp;quot;,&lt;br /&gt;
			dataIOOrder = 1)&lt;br /&gt;
	protected ExperimentalData1D experiment;&lt;br /&gt;
&lt;br /&gt;
	/** Smoothing method&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label = &amp;quot;Smoothing method&amp;quot;, required = true,&lt;br /&gt;
			direction = Parameter.Direction.IN,&lt;br /&gt;
			callback = &amp;quot;smoothingMethodChanged&amp;quot;,&lt;br /&gt;
			description = &amp;quot;Smoothing method&amp;quot;,&lt;br /&gt;
			paramModificationMode = ParameterModificationMode.MODIFIES_INTERFACE,&lt;br /&gt;
			dataIOOrder = 2)&lt;br /&gt;
	SmoothingMethod smoothingMethod = SmoothingMethod.MEDIAN;&lt;br /&gt;
&lt;br /&gt;
	/** Window width&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label = &amp;quot;Window width&amp;quot;, required = true,&lt;br /&gt;
			direction = Parameter.Direction.IN,&lt;br /&gt;
			description = &amp;quot;Window width (should be uneven)&amp;quot;,&lt;br /&gt;
			dataIOOrder = 3)&lt;br /&gt;
	Integer width = 3;&lt;br /&gt;
&lt;br /&gt;
	/** Standard deviation of Gaussian&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label = &amp;quot;Standdard deviation of Gaussian&amp;quot;, required = true,&lt;br /&gt;
			direction = Parameter.Direction.IN,&lt;br /&gt;
			description = &amp;quot;Standdard deviation of Gaussian&amp;quot;,&lt;br /&gt;
			dataIOOrder = 3)&lt;br /&gt;
	Float sigma = 1.0F;&lt;br /&gt;
&lt;br /&gt;
	/** Smoothed 1D Experiment&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label= &amp;quot;Smothed 1D Experiment&amp;quot;,  &lt;br /&gt;
			direction = Parameter.Direction.OUT, &lt;br /&gt;
			description = &amp;quot;Smothed1D Experiment&amp;quot;,&lt;br /&gt;
			dataIOOrder = 1)&lt;br /&gt;
	protected ExperimentalData1D smoothedExperiment;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Default constructor.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public SmoothData1D() throws ALDOperatorException {&lt;br /&gt;
		// necessary handle dynamic parameters correctly&lt;br /&gt;
		smoothingMethodChanged();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	protected void operate() {&lt;br /&gt;
		this.fireOperatorExecutionProgressEvent(&lt;br /&gt;
				new ALDOperatorExecutionProgressEvent(this, &lt;br /&gt;
						&amp;quot;Starting to smooth 1D Data...&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
		Double[] smoothedData;&lt;br /&gt;
		if ( smoothingMethod == SmoothingMethod.MEDIAN) {&lt;br /&gt;
			smoothedData = median( experiment.getData(), this.width);&lt;br /&gt;
		} else {&lt;br /&gt;
			smoothedData = smoothByConvolution();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		smoothedExperiment = new ExperimentalData1D( experiment.getDescription() + &amp;quot; (smoothed)&amp;quot;, &lt;br /&gt;
				smoothedData, experiment.isBaselineCorrected(), experiment.getTimeResolution());&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This mechanism applies in a recursive fashion, i.e. a parameterized class may&lt;br /&gt;
(recursively) contain a member variable which itself is a parametrized class.&lt;br /&gt;
Likewise, an operator acting as a parameter of another operator&lt;br /&gt;
may in turn have a parameter of type &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==   Invocation via a graphical user interface ==&lt;br /&gt;
&lt;br /&gt;
Invoking and configuring &amp;lt;code&amp;gt;SmoothData1D&amp;lt;/code&amp;gt; from the graphical user interface&lt;br /&gt;
shows as the only required parameter the experimental data.&lt;br /&gt;
This parameterized class can be configured in a separate  window&lt;br /&gt;
very similar to to configuration of operators.&lt;br /&gt;
Likewise the resulting normalized experimental data&lt;br /&gt;
may be inspected in their own window.&lt;br /&gt;
&lt;br /&gt;
Obviously this is a toy example, as we would not expect the measurements to&lt;br /&gt;
be entered manually, but rather stored and read from file in a specialized format.&lt;br /&gt;
This is one of the rare cases where &lt;br /&gt;
custom data IO provider need to be implemented, in this&lt;br /&gt;
case for &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==   Invocation via command line ==&lt;br /&gt;
&lt;br /&gt;
Again, invocation from command line is provided by Alida in an automatic&lt;br /&gt;
way with no further implementational overhead.&lt;br /&gt;
The syntax for parameterized classes es a comma separated list of name=value pairs&lt;br /&gt;
enclosed in curly brackets where name refers to annotated member variables of&lt;br /&gt;
the parameterized class.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner SmoothData1D \&lt;br /&gt;
	experiment='{ baselineCorrected=false , \&lt;br /&gt;
                      description=&amp;quot;my experiment&amp;quot; , \&lt;br /&gt;
                      data=[1.0,2.0,2.2,3.3,2.0,1.0,1.0,1.0,1.0,2.0,3.3,2.0] }' \&lt;br /&gt;
        smoothingMethod=GAUSSIAN \&lt;br /&gt;
	smoothedExperiment=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
yields&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
smoothedExperiment = { baselineCorrected=false , &lt;br /&gt;
    data=[1.28,1.85,2.37,2.76,2.05,1.23,1.01,1.01,1.23,2.05,2.73,2.35] , &lt;br /&gt;
    timeResolution=NaN , &lt;br /&gt;
    description=&amp;quot;my experiment&amp;quot; (smoothed) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If a class derived from &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt; was to be supplied to the operator,&lt;br /&gt;
the curly brackets can be prefixed by a derive class definition starting with a dollar sign&lt;br /&gt;
and ending with a colon as shown for the summarizing operators above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Graphical workflow editor: Grappa =&lt;br /&gt;
Most of the time complex data analysis tasks cannot be solved by only applying a&lt;br /&gt;
single operator to the data. Rather, selections of various operators need to be&lt;br /&gt;
combined into more sophisticated workflows to extract desired result data.&lt;br /&gt;
Alida inherently supports the development of such workflows. &lt;br /&gt;
Grappa, the Graphical Programming &lt;br /&gt;
Editor for Alida, allows for designing and manipulating workflows via graph edit operations, hence, offers &lt;br /&gt;
an intuitive interface and large flexibility for developing workflows.&lt;br /&gt;
&lt;br /&gt;
A workflow in Alida is defined as a graph data structure. Each node of the graph represents an Alida operator, while edges between &lt;br /&gt;
different nodes encode the flow of data and control. Each node owns a selection of input and output ports which are associated with the&lt;br /&gt;
operator's parameters. Consequently, edges are directed, i.e., an edge always&lt;br /&gt;
connects an output port of one operator node with an input port of another. Grappa visualizes such workflow graphs and supports manual editing, manipulation, and also workflow execution&lt;br /&gt;
and analysis of results.&lt;br /&gt;
&lt;br /&gt;
Grappa can be started using the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;java de.unihalle.informatik.Alida.tools.ALDGrappaRunner&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grappa's main window is&lt;br /&gt;
basically divided into two sections. On the left, the node selection menu is&lt;br /&gt;
visible, while on the right the workbench area is located. &lt;br /&gt;
In addition, the window features a menubar for configuring Grappa, loading and&lt;br /&gt;
saving workflows, and accessing the online help. At the bottom of the window a&lt;br /&gt;
panel displaying status and progress messages is available.&lt;br /&gt;
&lt;br /&gt;
A demo workflow is supplied with the distribution. To load this workflow right click into the workbench area to pop up the&lt;br /&gt;
context menue. Select &amp;lt;code&amp;gt;'Load'&amp;lt;/code&amp;gt; navigate to the base directory where you unpacked the distribution.&lt;br /&gt;
From there navigate further to &amp;lt;code&amp;gt;share/examples/workflows&amp;lt;/code&amp;gt; select &amp;lt;code&amp;gt;Demo.awf&amp;lt;/code&amp;gt;&lt;br /&gt;
and load the sample workflow. This workflow is also described in manual of Alida.&lt;br /&gt;
&lt;br /&gt;
== Operator node selection menu == &lt;br /&gt;
In the selection menu on the left of Grappa's main window all Alida operators found in the &lt;br /&gt;
classpath upon initialization are listed as potential nodes for Grappa workflows. &lt;br /&gt;
In analogy to the graphical user interface&lt;br /&gt;
they are arranged in a hierarchical ordering &lt;br /&gt;
according to their package structure. The different package subtrees can be&lt;br /&gt;
folded and unfolded by double-clicking on a folder's name in the selection tree,&lt;br /&gt;
or by single-clicking on the circle displayed left to the folder icon. Above the&lt;br /&gt;
tree view an operator filter is available which allows to select operators&lt;br /&gt;
according to their names. For filtering, enter a substring into the text&lt;br /&gt;
field and press the return key. &lt;br /&gt;
Operator nodes can be added to a workflow by double-clicking on the operator&lt;br /&gt;
name. A new operator node is then instantiated in the top left corner of the&lt;br /&gt;
corresponding workflow tab, i.e., the active workflow (see below).&lt;br /&gt;
Alternatively, an operator can be selected by clicking once on its name &lt;br /&gt;
and afterwards clicking once on the position in the workflow tab where the new&lt;br /&gt;
operator node should be positioned.&lt;br /&gt;
 &lt;br /&gt;
== Workbench area == &lt;br /&gt;
Workflows can be designed and executed in the workbench area on the right of the main window. It allows for instantiating&lt;br /&gt;
multiple workflows in parallel where each workflow is linked to an individual tab of the workbench panel. &lt;br /&gt;
A new workflow tab can be added via the item &amp;lt;code&amp;gt;'New'&amp;lt;/code&amp;gt; in the context menu of the workbench. &lt;br /&gt;
The context menu is displayed upon right-click on an empty location of the workbench area. &lt;br /&gt;
Upon selecting the item &amp;lt;code&amp;gt;'New'&amp;lt;/code&amp;gt; a new tab is added to the workbench panel.&lt;br /&gt;
By default, the name of the new workflow is 'Untitled', but it can easily be&lt;br /&gt;
renamed via the corresponding item &amp;lt;code&amp;gt;'Rename'&amp;lt;/code&amp;gt; in the context menu. Via this&lt;br /&gt;
menu it is also possible to close a workflow tab if no longer required. Note&lt;br /&gt;
that its contents are lost if not saved before! The currently selected tab in&lt;br /&gt;
the workbench contains the active workflow which can be edited and where&lt;br /&gt;
new operator nodes can be added as outlined in the previous subsection.&lt;br /&gt;
&lt;br /&gt;
For each operator selected via the selection menu, a&lt;br /&gt;
node in terms of a rectangle is added to the currently active workflow. Above the rectangle &lt;br /&gt;
the name of the operator is displayed, while on its left and right side the operator's input and output ports are shown as circles and &lt;br /&gt;
squares. Circles are associated with operator parameters of directions &amp;lt;code&amp;gt;IN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;OUT&amp;lt;/code&amp;gt;, while squares refer to parameters with&lt;br /&gt;
direction &amp;lt;code&amp;gt;INOUT&amp;lt;/code&amp;gt;. The latter ports are duplicated on both sides of the node.&lt;br /&gt;
The colors of the circles indicate their type. Blue circles refer to required parameters, yellow circles are associated with optional &lt;br /&gt;
parameters, and red circles are linked to supplemental parameters. To the left and right of the ports,&lt;br /&gt;
respectively, the name of the corresponding parameters are written.  &lt;br /&gt;
Once operator nodes have been added to a workflow, they can easily be dragged&lt;br /&gt;
and repositioned as well as resized via intuitive mouse actions. &lt;br /&gt;
&lt;br /&gt;
For each operator node a context menu can be popped up by clicking the node with the right mouse&lt;br /&gt;
button. From this menu it is possible to delete the node (item &amp;lt;code&amp;gt;'Remove'&amp;lt;/code&amp;gt;), or to configure the&lt;br /&gt;
view via the item &amp;lt;code&amp;gt;'Options'&amp;lt;/code&amp;gt;. It, e.g., allows to select the set of operator parameter ports&lt;br /&gt;
to be shown, i.e. either all parameters or just the subset of non-expert parameters. From the&lt;br /&gt;
context menu of a node it is also possible to configure the node (item &amp;lt;code&amp;gt;'Configure'&amp;lt;/code&amp;gt;).  &lt;br /&gt;
&lt;br /&gt;
On selecting the item for&lt;br /&gt;
configuration, a window is displayed which allows to enter parameter values.&lt;br /&gt;
The window is automatically generated, i.e., actually the same &lt;br /&gt;
mechanisms as for executing operators via the graphical operator runner are applied. Accordingly, &lt;br /&gt;
the configuration window is identical to the corresponding operator control&lt;br /&gt;
window and shares the same layout, except for the control buttons and the batch&lt;br /&gt;
mode tab which are missing.&lt;br /&gt;
&lt;br /&gt;
Operator parameters for a certain node can directly be specified via the&lt;br /&gt;
configuration window, they can be loaded from a proper parameter file in XML&lt;br /&gt;
format, or they&lt;br /&gt;
can be configured by dragging edges between ports of different nodes with the&lt;br /&gt;
mouse to propagate output data from one node as input data to another. To add an&lt;br /&gt;
edge, move the mouse over an output port of a node until the port is surrounded&lt;br /&gt;
by a green square, then press the left mouse button. Subsequently, while keeping&lt;br /&gt;
the button pressed, move the mouse to the desired input port of another node.&lt;br /&gt;
Once a green rectangle shows up around the target input port, release the&lt;br /&gt;
button. Note that on dragging edges Grappa performs type and validity checks.&lt;br /&gt;
Only ports being associated with compatible parameter data types can be&lt;br /&gt;
linked to each other. Two parameter data types are compatible if they are&lt;br /&gt;
either equal, the target data type is a super class of the source data type, or&lt;br /&gt;
if Alida has access to a converter allowing to transform the source data type&lt;br /&gt;
into the target type. Also&lt;br /&gt;
edges are forbidden that would induce cycles into the workflow graph.&lt;br /&gt;
&lt;br /&gt;
Nodes in a workflow can have different states indicated by the color of their border. &lt;br /&gt;
Red framed nodes are not ready for execution, i.e., their configuration is not&lt;br /&gt;
complete. If a node is readily configured and can directly be executed, its&lt;br /&gt;
border has a yellow color, while nodes that are configured, however, require&lt;br /&gt;
additional input data from preceeding operator nodes have an orange color.&lt;br /&gt;
Prior to executing these orange nodes it is, thus, necessary to execute the&lt;br /&gt;
preceeding nodes first.&lt;br /&gt;
Note that Grappa takes care of such dependencies, i.e., automatically executes&lt;br /&gt;
nodes first from which result data is required for proper workflow or node&lt;br /&gt;
execution. The state of a node is updated by Grappa in real-time, i.e., each&lt;br /&gt;
change in its configuration directly invokes internal checkings and may result in a change of the node's color.&lt;br /&gt;
&lt;br /&gt;
Grappa offers various modes for executing a&lt;br /&gt;
complete workflow or parts of it.&lt;br /&gt;
From the context menu of the workbench the item &lt;br /&gt;
&amp;lt;code&amp;gt;'Run'&amp;lt;/code&amp;gt; is available which executes the complete workflow, i.e., all nodes&lt;br /&gt;
currently present on the tab. From the context menu of a single node and its &amp;lt;code&amp;gt;'Run ...'&amp;lt;/code&amp;gt; item also the whole workflow can be executed (item &amp;lt;code&amp;gt;'Workflow'&amp;lt;/code&amp;gt;).&lt;br /&gt;
Alternatively, via the item &amp;lt;code&amp;gt;'Nodes from here'&amp;lt;/code&amp;gt; it is possible to only execute the nodes of the workflow subgraph for which the &lt;br /&gt;
current node is the root (of course considering required dependencies). Finally, the item &amp;lt;code&amp;gt;'Node'&amp;lt;/code&amp;gt; allows for running the workflow&lt;br /&gt;
until the node in question. As mentioned before, Grappa automatically takes care&lt;br /&gt;
of resolving dependencies, i.e., upon executing a node all nodes having a yellow&lt;br /&gt;
or orange border and being predecessors of the node in question are also executed. Note that the execution of a workflow will fail if one of the nodes is still colored red, or if a node does not produce proper output data required by others. &lt;br /&gt;
&lt;br /&gt;
After successful execution of the workflow or a subset of nodes, the colors of&lt;br /&gt;
the corresponding nodes change to green indicating that result data are&lt;br /&gt;
available. For all terminal nodes having no successor the result frames are&lt;br /&gt;
automatically opened.&lt;br /&gt;
For all other nodes the result data can graphically be examined via the nodes'&lt;br /&gt;
context menus from which the result windows can manually be opened. &lt;br /&gt;
Once a node has been executed and is colored in green, it is not possible to&lt;br /&gt;
re-execute the node until its configuration, or at least the configuration of&lt;br /&gt;
one of its preceeding nodes, was changed.&lt;br /&gt;
&lt;br /&gt;
== Menubar == &lt;br /&gt;
The Grappa main window features a menubar offering quick&lt;br /&gt;
access to the basic functions of Grappa and some additional convenience functionality simplifying&lt;br /&gt;
the work with the editor. &lt;br /&gt;
&lt;br /&gt;
Via the menu item &amp;lt;code&amp;gt;'File'&amp;lt;/code&amp;gt; workflows can be saved to and read from&lt;br /&gt;
disk. By saving a workflow currently two files are written to disk, one containing the information&lt;br /&gt;
about the nodes and their configuration, and one storing graphical information&lt;br /&gt;
regarding the current workflow layout. Both are required to load a workflow&lt;br /&gt;
again. The first one has the extension &amp;lt;code&amp;gt;'.awf'&amp;lt;/code&amp;gt;, the latter one the&lt;br /&gt;
extension &amp;lt;code&amp;gt;'.awf.gui'&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Via the menu item &amp;lt;code&amp;gt;'Workflow'&amp;lt;/code&amp;gt; new workflows can be added and existing ones be renamed, &lt;br /&gt;
closed, executed or interrupted.  &lt;br /&gt;
Alida supports two categories of&lt;br /&gt;
operators, i.e. operators mainly dedicated to direct application by non-expert users&lt;br /&gt;
and operators for special tasks and expert usage. Via the item &amp;lt;code&amp;gt;'Options'&amp;lt;/code&amp;gt; the menubar allows&lt;br /&gt;
to switch the view in the selection menu between both categories. Also progress messages triggered by the&lt;br /&gt;
operator node during execution and optionally shown in the status panel can be enabled or&lt;br /&gt;
disabled via this menu. Finally, the menu item &amp;lt;code&amp;gt;'Help'&amp;lt;/code&amp;gt; grants access to Alida's online help system&lt;br /&gt;
where information about its functionality and descriptions of the operators can be found.&lt;/div&gt;</summary>
		<author><name>Posch</name></author>
	</entry>
	<entry>
		<id>https://alida.informatik.uni-halle.de/index.php?title=Java_quick&amp;diff=262</id>
		<title>Java quick</title>
		<link rel="alternate" type="text/html" href="https://alida.informatik.uni-halle.de/index.php?title=Java_quick&amp;diff=262"/>
		<updated>2016-02-23T22:32:51Z</updated>

		<summary type="html">&lt;p&gt;Posch: /* Graphical workflow editor: Grappa */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here we introduce Alida's operator concept with some code snippets of &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt; and sub-classed demo operators.&lt;br /&gt;
we focus on Alida's capabilities to automatically generate user interfaces.&lt;br /&gt;
&lt;br /&gt;
=  First operator =&lt;br /&gt;
&lt;br /&gt;
As a first example of an Alida operator we implement the row or column wise&lt;br /&gt;
sum for a 2D array of Doubles.&lt;br /&gt;
The class &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt; extending &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt; features three member variables&lt;br /&gt;
holding the input 2D array, an enum to indicate the mode of summation (&amp;lt;code&amp;gt;ROW&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;COLUMN&amp;lt;/code&amp;gt;), and&lt;br /&gt;
an 1D array of the sums to be computed and returned by the operator.&lt;br /&gt;
Alida requires only to annotate these members with the @Parameter annotation&lt;br /&gt;
which declares &lt;br /&gt;
&lt;br /&gt;
* the direction (&amp;lt;code&amp;gt;IN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;OUT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INOUT&amp;lt;/code&amp;gt;), &lt;br /&gt;
* whether the parameter is required,&lt;br /&gt;
* an optional textual description,&lt;br /&gt;
* and a label used, e.g. in the graphical user interface automatically generated&lt;br /&gt;
		to execute the operator.&lt;br /&gt;
&lt;br /&gt;
It is important to add a public standard constructor (without arguments)&lt;br /&gt;
to be able to use Java's reflection mechanism.&lt;br /&gt;
Finally, the abstract method &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; of &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt; has to be overridden&lt;br /&gt;
implementing the functionality of the operator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
				level=ALDAOperator.Level.APPLICATION)&lt;br /&gt;
public class MatrixSum extends ALDOperator {&lt;br /&gt;
&lt;br /&gt;
  /** Choose row or colum wise sum&lt;br /&gt;
    */&lt;br /&gt;
  public static enum SummarizeMode {&lt;br /&gt;
	/** row wise */&lt;br /&gt;
	ROW,&lt;br /&gt;
&lt;br /&gt;
	/** column wise */&lt;br /&gt;
	COLUMN&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Input matrix&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;Input matrix&amp;quot;, required = true, &lt;br /&gt;
  		direction = Parameter.Direction.IN, description = &amp;quot;Input matrix.&amp;quot;)&lt;br /&gt;
  private Double[][] matrix;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Mode of summarizing&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;Summarize mode&amp;quot;, required = true, &lt;br /&gt;
  		direction = Parameter.Direction.IN, description = &amp;quot;Sum over columns or rows?&amp;quot;)&lt;br /&gt;
  private SummarizeMode summarizeMode = SummarizeMode.ROW;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * 1D Array of sums.&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;sums&amp;quot;,  &lt;br /&gt;
  		direction = Parameter.Direction.OUT, description = &amp;quot;Row or column wise sums.&amp;quot;)&lt;br /&gt;
  private Double[] sums = null;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Default constructor.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public MatrixSum() throws ALDOperatorException {&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Constructor.&lt;br /&gt;
	 * &lt;br /&gt;
	 * @param matrix	Input matrix.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public MatrixSum(Double[] [] matrix) throws ALDOperatorException {&lt;br /&gt;
		this.matrix = matrix;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	protected void operate() {&lt;br /&gt;
		if ( matrix == null ) &lt;br /&gt;
			sums = null;&lt;br /&gt;
&lt;br /&gt;
		// calculate sums&lt;br /&gt;
		if ( summarizeMode == SummarizeMode.ROW ) {&lt;br /&gt;
			sums = new Double[matrix.length];&lt;br /&gt;
			for ( int row = 0 ; row &amp;lt; matrix.length ; row++ ) {&lt;br /&gt;
				sums[row] = 0.0;&lt;br /&gt;
				for ( int col = 0 ; col &amp;lt; matrix[0].length ; col++ )&lt;br /&gt;
					sums[row] += matrix[row][col];&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			sums = new Double[matrix[0].length];&lt;br /&gt;
			for ( int col = 0 ; col &amp;lt; matrix[0].length ; col++ ) {&lt;br /&gt;
				sums[col] = 0.0;&lt;br /&gt;
				for ( int row = 0 ; row &amp;lt; matrix.length ; row++ )&lt;br /&gt;
					sums[col] += matrix[row][col];&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These are the basic requirements for the operator to be used on the programming level.&lt;br /&gt;
An example of this use is included in the example in the next section.&lt;br /&gt;
&lt;br /&gt;
If we further annotate the class with &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
this is all needed to also facilitate &lt;br /&gt;
execution of this operator via a graphical and a command line user interface&lt;br /&gt;
automatically generated by Alida.&lt;br /&gt;
(Setting &amp;lt;code&amp;gt;level=ALDAOperator.Level.APPLICATION&amp;lt;/code&amp;gt; declares this operator an application&lt;br /&gt;
which is used in the GUI to control display of available operators.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Invocation via a graphical user interface ==&lt;br /&gt;
&lt;br /&gt;
Alida comes with one single application to execute Alida operators&lt;br /&gt;
with a automatically generated graphical user interface which may be&lt;br /&gt;
started from command line by&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunnerGUI&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will pop up a window to choose an operator to execute.&lt;br /&gt;
Arranged according to the package structure all operators allows to be executed&lt;br /&gt;
via the graphical user interface according to their &amp;lt;code&amp;gt;genericExecutionMode&amp;lt;/code&amp;gt;&lt;br /&gt;
are displayed.&lt;br /&gt;
Initially packages are unfolded up to a predefined depth.&lt;br /&gt;
Unfold the demo package, select &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt;, and choose the &amp;quot;Configure Operator&amp;quot; button.&lt;br /&gt;
This will pop up another window which allows you to configure the input parameters&lt;br /&gt;
of the operator.&lt;br /&gt;
Important note: After finishing to input the data matrix entering the final matrix elements&lt;br /&gt;
you have to select a previous matrix element due to subtle AWT details.&lt;br /&gt;
For the enumeration to select the mode Alida has automatically generated&lt;br /&gt;
a combo box to allow convenient selections.&lt;br /&gt;
If you are finished with the parameter configuration you want to invoke the operator&lt;br /&gt;
using the run button.&lt;br /&gt;
On completion of &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt; the interface will pop up the result window which allows you&lt;br /&gt;
to inspect the outcome of the operation.&lt;br /&gt;
&lt;br /&gt;
==   Invocation via command line ==&lt;br /&gt;
&lt;br /&gt;
The command line user interface of Alida allows to invoke all Alida operator&lt;br /&gt;
properly annotated to allows generic execution.&lt;br /&gt;
&lt;br /&gt;
You may invoke the matrix summation operator by&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix='[[1,2,3],[4,5,6]]' sums=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
which returns as result on standard output&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sums = [6.0,15.0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter values are specified as name=value pairs.&lt;br /&gt;
Alida's syntax for 2D array should be self-explanatory  from this example.&lt;br /&gt;
As the mode of summation is not supplied as a parameter its default is used&lt;br /&gt;
&lt;br /&gt;
Note, the command&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix='[[1,2,3],[4,5,6]]' &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
will return no output as the command line user interface returns only output parameters requested.&lt;br /&gt;
&lt;br /&gt;
The enumeration defined in &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt; is supported by the&lt;br /&gt;
user interface without further action required as shown in the next example.&lt;br /&gt;
This also demonstrates redirection of output&lt;br /&gt;
to a file, sums.out in this case.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix='[[1,2,3],[4,5,6]]' &lt;br /&gt;
	summarizeMode=COLUMN sums=@sums.out+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Input can be read from file as well:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix=@data sums=-+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where the file data contains the string defining the matrix, e.g., &amp;lt;code&amp;gt;[[1,2,3],[4,5,6]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Adding more features to an operator =&lt;br /&gt;
&lt;br /&gt;
We now generalize this example to realize not only summation over rows or&lt;br /&gt;
columns, but arbitrary summarizing operations.&lt;br /&gt;
This shows Alida's feature to allow an operator as parameter of another operator.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
First we generalize &amp;lt;code&amp;gt;ALDArraySum&amp;lt;/code&amp;gt; to the operator &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt;&lt;br /&gt;
which also takes a 2D array and an enum indicating the mode of marginalization (&amp;lt;code&amp;gt;ROW&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;COLUMN&amp;lt;/code&amp;gt;).&lt;br /&gt;
It takes an additional input parameter which specifies the operation to be applied on each&lt;br /&gt;
row or column.&lt;br /&gt;
&lt;br /&gt;
This parameter is itself an Alida operator and of type &amp;lt;code&amp;gt;ALDSummarizeArrayOp&amp;lt;/code&amp;gt;&lt;br /&gt;
which is implemented as an abstract class.&lt;br /&gt;
This abstract operator defines a summarizing operator&lt;br /&gt;
which takes a 1D array as input and returns a summarizing scalar.&lt;br /&gt;
As this is an abstract class there is no need to override the &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt;&lt;br /&gt;
method, however some getter and setter methods are provided.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  @Parameter( label= &amp;quot;Input 1D array&amp;quot;, required = true, &lt;br /&gt;
  		direction = Parameter.Direction.IN, description = &amp;quot;Input array (1D).&amp;quot;)&lt;br /&gt;
  protected Double[] data;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Summarizing scalar&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;Summarizing scalar&amp;quot;,  &lt;br /&gt;
  		direction = Parameter.Direction.OUT, description = &amp;quot;Summarizing scalar of the 1D arra&amp;quot;)&lt;br /&gt;
  protected Double summary = null;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Default constructor.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public ALDSummarizeArrayOp() throws ALDOperatorException {&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Returns the 1D array&lt;br /&gt;
	 * @return data array&lt;br /&gt;
	 */&lt;br /&gt;
	public Double[] getData() {&lt;br /&gt;
		return this.data;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Sets the 1D array&lt;br /&gt;
	 * @param data&lt;br /&gt;
	 */&lt;br /&gt;
	public void setData( Double[] data) {&lt;br /&gt;
		this.data = data;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we add concrete examples of such a summarizing operation, in this case&lt;br /&gt;
summation (&amp;lt;code&amp;gt;ALDArraySum&amp;lt;/code&amp;gt;), to return the mean (&amp;lt;code&amp;gt;ALDArrayMean&amp;lt;/code&amp;gt;), and the minimum (&amp;lt;code&amp;gt;ALDArrayMin&amp;lt;/code&amp;gt;).&lt;br /&gt;
Each implements the  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method and has to supply a standard constructor.&lt;br /&gt;
In this example we add another constructor for convenience.&lt;br /&gt;
This operators are declared as operators on the standard in contrast to &lt;br /&gt;
application level, as they are not expected to be invoked as an application.&lt;br /&gt;
However, setting the level to standard in the menu of the graphical user interface&lt;br /&gt;
stills allows their execution.&lt;br /&gt;
When extending the abstract super class it is necessary to annotate the&lt;br /&gt;
class with &amp;lt;code&amp;gt;@ALDDerivedClass&amp;lt;/code&amp;gt; in order to allow Alida's dataIO mechanism to find the derived class&lt;br /&gt;
in the automatically generated user interface.&lt;br /&gt;
This holds for other parameter types as well.&lt;br /&gt;
More specifically, if an instance of a class is to be supplied in an automatically &lt;br /&gt;
generated user interface as a value for a parameter of one of its super classes,&lt;br /&gt;
Alida requires the annotation &amp;lt;code&amp;gt;@ALDDerivedClass&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDDerivedClass&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
        level=ALDAOperator.Level.STANDARD)&lt;br /&gt;
public class ALDArraySum extends ALDSummarizeArrayOp {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void operate() {&lt;br /&gt;
        summary = 0.0;&lt;br /&gt;
        for ( int i = 0 ; i &amp;lt; data.length ; i++ )&lt;br /&gt;
            summary += data[i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Default constructor.&lt;br /&gt;
     * @throws ALDOperatorException&lt;br /&gt;
     */&lt;br /&gt;
    public ALDArraySum() throws ALDOperatorException {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we are ready to implement &lt;br /&gt;
the &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt; operator, which also demonstrates supplemental parameters.&lt;br /&gt;
This supplementals, e.g., control debugging output or returning of intermediate results.&lt;br /&gt;
For demo purposes we declare a supplemental input parameter &amp;lt;code&amp;gt;returnElapsedTime&amp;lt;/code&amp;gt;.&lt;br /&gt;
If it is set to true the operator will return the elapsed time in a second&lt;br /&gt;
supplemental parameter with direction output.&lt;br /&gt;
&lt;br /&gt;
Again, the operation is implemented in the  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method and the remainder of the&lt;br /&gt;
class supplies getter and setter methods for convenience.&lt;br /&gt;
The  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method give also an example of the invocation of an operator on the&lt;br /&gt;
programming level.&lt;br /&gt;
In this case, an instance of the operator is already passed as a parameter.&lt;br /&gt;
Its parameters are set, in this case each 1D array to be summarized in turn.&lt;br /&gt;
Upon return from the method &amp;lt;code&amp;gt;runOp()&amp;lt;/code&amp;gt; the results may be retrieved from the operator object,&lt;br /&gt;
in this example with the &amp;lt;code&amp;gt;getSummary()&amp;lt;/code&amp;gt; method.&lt;br /&gt;
Besides getter and setter methods as implemented in each operator&lt;br /&gt;
Alida provides also a generic get and set methods applicable to&lt;br /&gt;
all parameters of an operator.&lt;br /&gt;
Note, that the operator is not invoked by its  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method, but via&lt;br /&gt;
the &amp;lt;code&amp;gt;runOp()&amp;lt;/code&amp;gt; method implemented the base class &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt;.&lt;br /&gt;
This methods validates the parameters before invocation of  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt;.&lt;br /&gt;
Furthermore, it take all necessary measures for Alida's processing&lt;br /&gt;
history which automatically logs&lt;br /&gt;
all manipulative actions on the data and corresponding parameter settings. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
            level=ALDAOperator.Level.APPLICATION)&lt;br /&gt;
public class ApplyToMatrix extends ALDOperator {&lt;br /&gt;
&lt;br /&gt;
    /** Choose row or colum wise sum&lt;br /&gt;
      */&lt;br /&gt;
    public static enum SummarizeMode {&lt;br /&gt;
      /** row wise */&lt;br /&gt;
      ROW,&lt;br /&gt;
      /** column wise */&lt;br /&gt;
      COLUMN&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Input matrix&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Input matrix&amp;quot;, required = true, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Input matrix.&amp;quot;)&lt;br /&gt;
    private Double[][] matrix;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Mode of summarizing&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Summarize mode&amp;quot;, required = true, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Sum over columns or rows.&amp;quot;)&lt;br /&gt;
    private SummarizeMode summarizeMode = SummarizeMode.ROW;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Summarizing opererator&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Summarizing operator&amp;quot;, required = true, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Specifies the summarizing operation to apply&amp;quot;)&lt;br /&gt;
    private ALDSummarizeArrayOp summarizeOp;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 1D Array of summaries.&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;summaries&amp;quot;,  &lt;br /&gt;
          direction = Parameter.Direction.OUT, description = &amp;quot;Row or column wise summaries&amp;quot;)&lt;br /&gt;
    private Double[] summaries = null;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Supplemental to request elapsed time to be returned&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Return elapsed time&amp;quot;, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Request elapsed time consumed to be returned&amp;quot;,&lt;br /&gt;
        supplemental=true)&lt;br /&gt;
    private boolean returnElapsedTime = false;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Elpased time &lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Elapsed time&amp;quot;,  &lt;br /&gt;
          direction = Parameter.Direction.OUT, description = &amp;quot;Elapsed time of operation in milliseconds&amp;quot;,&lt;br /&gt;
        supplemental=true)&lt;br /&gt;
    private long elapsedTime;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Default constructor.&lt;br /&gt;
     * @throws ALDOperatorException&lt;br /&gt;
     */&lt;br /&gt;
    public ApplyToMatrix() throws ALDOperatorException {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Constructor.&lt;br /&gt;
     * &lt;br /&gt;
     * @param matrix    Input matrix.&lt;br /&gt;
     * @throws ALDOperatorException&lt;br /&gt;
     */&lt;br /&gt;
    public ApplyToMatrix(Double[] [] matrix) throws ALDOperatorException {&lt;br /&gt;
        this.matrix = matrix;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void operate() throws ALDOperatorException,ALDProcessingDAGException {&lt;br /&gt;
        if ( returnElapsedTime ) &lt;br /&gt;
            elapsedTime = System.currentTimeMillis();&lt;br /&gt;
&lt;br /&gt;
        if ( matrix == null ) &lt;br /&gt;
            summaries = null;&lt;br /&gt;
&lt;br /&gt;
        // calculate summaries&lt;br /&gt;
        if ( summarizeMode == SummarizeMode.ROW ) {&lt;br /&gt;
            summaries = new Double[matrix.length];&lt;br /&gt;
            for ( int row = 0 ; row &amp;lt; matrix.length ; row++ ) {&lt;br /&gt;
                summarizeOp.setData(matrix[row]);&lt;br /&gt;
                summarizeOp.runOp();&lt;br /&gt;
                summaries[row] = summarizeOp.getSummary();&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            summaries = new Double[matrix[0].length];&lt;br /&gt;
            Double[] tmp = new Double[matrix.length];&lt;br /&gt;
            for ( int col = 0 ; col &amp;lt; matrix[0].length ; col++ ) {&lt;br /&gt;
                for ( int row = 0 ; row &amp;lt; matrix.length ; row++ )&lt;br /&gt;
                    tmp[row] = matrix[row][col];&lt;br /&gt;
&lt;br /&gt;
                summarizeOp.setData(tmp);&lt;br /&gt;
                summarizeOp.runOp();&lt;br /&gt;
                summaries[col] = summarizeOp.getSummary();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if ( returnElapsedTime ) &lt;br /&gt;
            elapsedTime = System.currentTimeMillis() - elapsedTime;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // ==============================================================&lt;br /&gt;
    // Getter and setter methods&lt;br /&gt;
    /** Get value of returnElapsedTime.&lt;br /&gt;
      * Explanation: Request elapsed time consumed to be returned.&lt;br /&gt;
      * @return value of returnElapsedTime&lt;br /&gt;
      */&lt;br /&gt;
    public boolean getReturnElapsedTime(){&lt;br /&gt;
        return returnElapsedTime;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /** Set value of returnElapsedTime.&lt;br /&gt;
      * Explanation: Request elapsed time consumed to be returned.&lt;br /&gt;
      * @param value New value of returnElapsedTime&lt;br /&gt;
      */&lt;br /&gt;
    public void setReturnElapsedTime( boolean value){&lt;br /&gt;
        this.returnElapsedTime = value;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==   Invocation via a graphical user interface ==&lt;br /&gt;
&lt;br /&gt;
If the graphical interface is still running just select our new operator&lt;br /&gt;
and begin to configure it.&lt;br /&gt;
For the parameter summarizing operator you have a choice of all operators extending&lt;br /&gt;
the abstract operator &amp;lt;code&amp;gt;ALDSummarizeArrayOp&amp;lt;/code&amp;gt;.&lt;br /&gt;
All which is necessary on the implementation side is proper annotation of the extending&lt;br /&gt;
classes with &amp;lt;code&amp;gt;@ALDDerivedClass&amp;lt;/code&amp;gt;.&lt;br /&gt;
As the selected operator may have its own parameters you may want to configure it.&lt;br /&gt;
In our example this is not necessary as the input array is, of course, supplied&lt;br /&gt;
by the &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt; operator.&lt;br /&gt;
Do not forget to input your data before hitting the run button.&lt;br /&gt;
After return, again a result window give you the results of the operation.&lt;br /&gt;
Note, if you did not tick Return elapsed time&amp;quot; this window will show zero&lt;br /&gt;
for the time elapsed as the operator has not been request to stop the time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==   Invocation via command line ==&lt;br /&gt;
&lt;br /&gt;
When invoking the &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt; operator from command line&lt;br /&gt;
we have to handle derived classes as value for parameters.&lt;br /&gt;
In the graphical user interface Alida features a combo box where&lt;br /&gt;
we may choose from.&lt;br /&gt;
In the command line interface Alida allows to prefix the value of a parameter&lt;br /&gt;
with a derived class to be passed to the operator.&lt;br /&gt;
This is necessary as Alida as, of course, no way to itself&lt;br /&gt;
decide if and which derived class is to be used.&lt;br /&gt;
Alida's syntax is to enclose the class name in a dollar sign and a colon.&lt;br /&gt;
As evident in the following example, abbreviations are of the fully&lt;br /&gt;
qualified class name are accepted as long as they are unambiguous.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner Apply \&lt;br /&gt;
	matrix='[[1,2,3],[4,5,6]]' \&lt;br /&gt;
	summarizeMode=ROW \&lt;br /&gt;
	summarizeOp='&amp;lt;math&amp;gt;ALDArrayMean:{}' \&lt;br /&gt;
	summaries=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
results in&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
summaries = [2.0,5.0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ALDOpRunner&amp;lt;/code&amp;gt; may be persuaded to show all operators derived from &amp;lt;code&amp;gt;ALDSummarizeArrayOp&amp;lt;/code&amp;gt;&lt;br /&gt;
and known within the user interface if we enter an invalid class name:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner \&lt;br /&gt;
	Apply matrix='[[1,2,3],[4,5,6]]' \&lt;br /&gt;
	summarizeMode=ROW summarizeOp='&amp;lt;/math&amp;gt;dd:{}' \&lt;br /&gt;
	summaries=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
yields&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALDStandardizedDataIOCmdline::readData found 0 derived classes matching &amp;lt;dd&amp;gt;&lt;br /&gt;
      derived classes available:&lt;br /&gt;
	de.unihalle.informatik.Alida.demo.ALDArrayMean&lt;br /&gt;
	de.unihalle.informatik.Alida.demo.ALDArrayMin&lt;br /&gt;
	de.unihalle.informatik.Alida.demo.ALDArraySum&lt;br /&gt;
ERROR: reading parameter &amp;lt;summarizeOp&amp;gt; returns null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supplemental parameters are handled like other parameters&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner Apply \&lt;br /&gt;
	matrix='[[1,2,3],[4,5,6]]' \&lt;br /&gt;
	summarizeMode=COLUMN \&lt;br /&gt;
	summarizeOp='&amp;lt;math&amp;gt;ALDArrayMin:{}' \&lt;br /&gt;
	summaries=- \&lt;br /&gt;
	returnElapsedTime=true \&lt;br /&gt;
	elapsedTime=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
gives&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	summaries = [1.0,2.0,3.0]&lt;br /&gt;
	elapsedTime = 4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=   Adding more data types as parameters =&lt;br /&gt;
&lt;br /&gt;
Alida provides automatic IO of primitive data types, enumerations, arrays, collections,&lt;br /&gt;
and operators.&lt;br /&gt;
In addition so called parameterized classes are supported.&lt;br /&gt;
Any Java class may be declared to be a parameterized class in Alida&lt;br /&gt;
by annotating the class &amp;lt;code&amp;gt;@ALDParametrizedClass&amp;lt;/code&amp;gt; as shown in the&lt;br /&gt;
class &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt;.&lt;br /&gt;
All member variables to be known to and handled by Alida's user interface&lt;br /&gt;
simply need to be annotated with &amp;lt;code&amp;gt;@ALDClassParameter&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Here we implement a toy version of experimental data &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt;.&lt;br /&gt;
A complete experiment contains&lt;br /&gt;
data of a time series of measurements of variable length.&lt;br /&gt;
Additional information is a descriptive string, the time resolution in milliseconds,&lt;br /&gt;
and whether baseline correction has been applied.&lt;br /&gt;
&lt;br /&gt;
The class is annotated by &amp;lt;code&amp;gt;@ALDParametrizedClass&amp;lt;/code&amp;gt;, and&lt;br /&gt;
and all members to be handle in Alida'a user interfaces are&lt;br /&gt;
to be annotated with &amp;lt;code&amp;gt;@ALDParametrizedClass&amp;lt;/code&amp;gt;.&lt;br /&gt;
The label field has the same semantics as for parameters of operators.&lt;br /&gt;
These annotations are the only implementational overhead&lt;br /&gt;
to allow Alida to automatically generate user interfaces&lt;br /&gt;
where the parameterized class acts as a parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDParametrizedClass&lt;br /&gt;
public class ExperimentalData1D extends ALDData {&lt;br /&gt;
	&lt;br /&gt;
    /** Description */&lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;description&amp;quot;, dataIOOrder = 1)&lt;br /&gt;
    private String description = null;&lt;br /&gt;
&lt;br /&gt;
    /** The data  */&lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;data&amp;quot;, dataIOOrder = 2)&lt;br /&gt;
    private Double[] data = null;&lt;br /&gt;
&lt;br /&gt;
    /** Are the data baseline corrected? */&lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;Baseline corrected&amp;quot;,&lt;br /&gt;
    			dataIOOrder = 3)&lt;br /&gt;
    private boolean baselineCorrected = false;&lt;br /&gt;
    &lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;Time resolution in milliseconds&amp;quot;, dataIOOrder = 4)&lt;br /&gt;
    private Float timeResolution = Float.NaN;&lt;br /&gt;
&lt;br /&gt;
    /** &lt;br /&gt;
     * Standard constructor is required&lt;br /&gt;
      */&lt;br /&gt;
    public ExperimentalData1D() {&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /** Constructor for an experiment.&lt;br /&gt;
      * Baseline correction is assumed to be false and nothung known about&lt;br /&gt;
      * the time resolution.&lt;br /&gt;
      *&lt;br /&gt;
      * @param  description   a textual description of the experiment&lt;br /&gt;
      * @param  data   measurements&lt;br /&gt;
      */&lt;br /&gt;
    public ExperimentalData1D( String description, Double[] data) {    &lt;br /&gt;
        this( description, data, false, Float.NaN);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is shown below for a simple normalizing operator &amp;lt;code&amp;gt;SmoothData1D&amp;lt;/code&amp;gt;&lt;br /&gt;
which takes experimental data as input an returns a new instance&lt;br /&gt;
of &amp;lt;code&amp;gt;ExperimentalData&amp;lt;/code&amp;gt; which contains smoothed data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDDerivedClass&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
              level=ALDAOperator.Level.APPLICATION)&lt;br /&gt;
public class SmoothData1D extends ALDOperator {&lt;br /&gt;
&lt;br /&gt;
	public enum SmoothingMethod {&lt;br /&gt;
		MEDIAN, MEAN, GAUSSIAN&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/** 1D Experiment&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label= &amp;quot;1D Experiment&amp;quot;, required = true, &lt;br /&gt;
			direction = Parameter.Direction.IN, &lt;br /&gt;
			description = &amp;quot;1D Experiment&amp;quot;,&lt;br /&gt;
			dataIOOrder = 1)&lt;br /&gt;
	protected ExperimentalData1D experiment;&lt;br /&gt;
&lt;br /&gt;
	/** Smoothing method&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label = &amp;quot;Smoothing method&amp;quot;, required = true,&lt;br /&gt;
			direction = Parameter.Direction.IN,&lt;br /&gt;
			callback = &amp;quot;smoothingMethodChanged&amp;quot;,&lt;br /&gt;
			description = &amp;quot;Smoothing method&amp;quot;,&lt;br /&gt;
			paramModificationMode = ParameterModificationMode.MODIFIES_INTERFACE,&lt;br /&gt;
			dataIOOrder = 2)&lt;br /&gt;
	SmoothingMethod smoothingMethod = SmoothingMethod.MEDIAN;&lt;br /&gt;
&lt;br /&gt;
	/** Window width&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label = &amp;quot;Window width&amp;quot;, required = true,&lt;br /&gt;
			direction = Parameter.Direction.IN,&lt;br /&gt;
			description = &amp;quot;Window width (should be uneven)&amp;quot;,&lt;br /&gt;
			dataIOOrder = 3)&lt;br /&gt;
	Integer width = 3;&lt;br /&gt;
&lt;br /&gt;
	/** Standard deviation of Gaussian&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label = &amp;quot;Standdard deviation of Gaussian&amp;quot;, required = true,&lt;br /&gt;
			direction = Parameter.Direction.IN,&lt;br /&gt;
			description = &amp;quot;Standdard deviation of Gaussian&amp;quot;,&lt;br /&gt;
			dataIOOrder = 3)&lt;br /&gt;
	Float sigma = 1.0F;&lt;br /&gt;
&lt;br /&gt;
	/** Smoothed 1D Experiment&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label= &amp;quot;Smothed 1D Experiment&amp;quot;,  &lt;br /&gt;
			direction = Parameter.Direction.OUT, &lt;br /&gt;
			description = &amp;quot;Smothed1D Experiment&amp;quot;,&lt;br /&gt;
			dataIOOrder = 1)&lt;br /&gt;
	protected ExperimentalData1D smoothedExperiment;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Default constructor.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public SmoothData1D() throws ALDOperatorException {&lt;br /&gt;
		// necessary handle dynamic parameters correctly&lt;br /&gt;
		smoothingMethodChanged();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	protected void operate() {&lt;br /&gt;
		this.fireOperatorExecutionProgressEvent(&lt;br /&gt;
				new ALDOperatorExecutionProgressEvent(this, &lt;br /&gt;
						&amp;quot;Starting to smooth 1D Data...&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
		Double[] smoothedData;&lt;br /&gt;
		if ( smoothingMethod == SmoothingMethod.MEDIAN) {&lt;br /&gt;
			smoothedData = median( experiment.getData(), this.width);&lt;br /&gt;
		} else {&lt;br /&gt;
			smoothedData = smoothByConvolution();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		smoothedExperiment = new ExperimentalData1D( experiment.getDescription() + &amp;quot; (smoothed)&amp;quot;, &lt;br /&gt;
				smoothedData, experiment.isBaselineCorrected(), experiment.getTimeResolution());&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This mechanism applies in a recursive fashion, i.e. a parameterized class may&lt;br /&gt;
(recursively) contain a member variable which itself is a parametrized class.&lt;br /&gt;
Likewise, an operator acting as a parameter of another operator&lt;br /&gt;
may in turn have a parameter of type &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==   Invocation via a graphical user interface ==&lt;br /&gt;
&lt;br /&gt;
Invoking and configuring &amp;lt;code&amp;gt;SmoothData1D&amp;lt;/code&amp;gt; from the graphical user interface&lt;br /&gt;
shows as the only required parameter the experimental data.&lt;br /&gt;
This parameterized class can be configured in a separate  window&lt;br /&gt;
very similar to to configuration of operators.&lt;br /&gt;
Likewise the resulting normalized experimental data&lt;br /&gt;
may be inspected in their own window.&lt;br /&gt;
&lt;br /&gt;
Obviously this is a toy example, as we would not expect the measurements to&lt;br /&gt;
be entered manually, but rather stored and read from file in a specialized format.&lt;br /&gt;
This is one of the rare cases where &lt;br /&gt;
custom data IO provider need to be implemented, in this&lt;br /&gt;
case for &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==   Invocation via command line ==&lt;br /&gt;
&lt;br /&gt;
Again, invocation from command line is provided by Alida in an automatic&lt;br /&gt;
way with no further implementational overhead.&lt;br /&gt;
The syntax for parameterized classes es a comma separated list of name=value pairs&lt;br /&gt;
enclosed in curly brackets where name refers to annotated member variables of&lt;br /&gt;
the parameterized class.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner SmoothData1D \&lt;br /&gt;
	experiment='{ baselineCorrected=false , \&lt;br /&gt;
                      description=&amp;quot;my experiment&amp;quot; , \&lt;br /&gt;
                      data=[1.0,2.0,2.2,3.3,2.0,1.0,1.0,1.0,1.0,2.0,3.3,2.0] }' \&lt;br /&gt;
        smoothingMethod=GAUSSIAN \&lt;br /&gt;
	smoothedExperiment=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
yields&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
smoothedExperiment = { baselineCorrected=false , &lt;br /&gt;
    data=[1.28,1.85,2.37,2.76,2.05,1.23,1.01,1.01,1.23,2.05,2.73,2.35] , &lt;br /&gt;
    timeResolution=NaN , &lt;br /&gt;
    description=&amp;quot;my experiment&amp;quot; (smoothed) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If a class derived from &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt; was to be supplied to the operator,&lt;br /&gt;
the curly brackets can be prefixed by a derive class definition starting with a dollar sign&lt;br /&gt;
and ending with a colon as shown for the summarizing operators above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Graphical workflow editor: Grappa =&lt;br /&gt;
Most of the time complex data analysis tasks cannot be solved by only applying a&lt;br /&gt;
single operator to the data. Rather, selections of various operators need to be&lt;br /&gt;
combined into more sophisticated workflows to extract desired result data.&lt;br /&gt;
Alida inherently supports the development of such workflows. &lt;br /&gt;
Grappa, the Graphical Programming &lt;br /&gt;
Editor for Alida, allows for designing and manipulating workflows via graph edit operations, hence, offers &lt;br /&gt;
an intuitive interface and large flexibility for developing workflows.&lt;br /&gt;
&lt;br /&gt;
A workflow in Alida is defined as a graph data structure. Each node of the graph represents an Alida operator, while edges between &lt;br /&gt;
different nodes encode the flow of data and control. Each node owns a selection of input and output ports which are associated with the&lt;br /&gt;
operator's parameters. Consequently, edges are directed, i.e., an edge always&lt;br /&gt;
connects an output port of one operator node with an input port of another. Grappa visualizes such workflow graphs and supports manual editing, manipulation, and also workflow execution&lt;br /&gt;
and analysis of results.&lt;br /&gt;
&lt;br /&gt;
Grappa can be started using the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;java de.unihalle.informatik.Alida.tools.ALDGrappaRunner&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grappa's main window is&lt;br /&gt;
basically divided into two sections. On the left, the node selection menu is&lt;br /&gt;
visible, while on the right the workbench area is located. &lt;br /&gt;
In addition, the window features a menubar for configuring Grappa, loading and&lt;br /&gt;
saving workflows, and accessing the online help. At the bottom of the window a&lt;br /&gt;
panel displaying status and progress messages is available.&lt;br /&gt;
&lt;br /&gt;
== Operator node selection menu == &lt;br /&gt;
In the selection menu on the left of Grappa's main window all Alida operators found in the &lt;br /&gt;
classpath upon initialization are listed as potential nodes for Grappa workflows. &lt;br /&gt;
In analogy to the graphical user interface&lt;br /&gt;
they are arranged in a hierarchical ordering &lt;br /&gt;
according to their package structure. The different package subtrees can be&lt;br /&gt;
folded and unfolded by double-clicking on a folder's name in the selection tree,&lt;br /&gt;
or by single-clicking on the circle displayed left to the folder icon. Above the&lt;br /&gt;
tree view an operator filter is available which allows to select operators&lt;br /&gt;
according to their names. For filtering, enter a substring into the text&lt;br /&gt;
field and press the return key. &lt;br /&gt;
Operator nodes can be added to a workflow by double-clicking on the operator&lt;br /&gt;
name. A new operator node is then instantiated in the top left corner of the&lt;br /&gt;
corresponding workflow tab, i.e., the active workflow (see below).&lt;br /&gt;
Alternatively, an operator can be selected by clicking once on its name &lt;br /&gt;
and afterwards clicking once on the position in the workflow tab where the new&lt;br /&gt;
operator node should be positioned.&lt;br /&gt;
 &lt;br /&gt;
== Workbench area == &lt;br /&gt;
Workflows can be designed and executed in the workbench area on the right of the main window. It allows for instantiating&lt;br /&gt;
multiple workflows in parallel where each workflow is linked to an individual tab of the workbench panel. &lt;br /&gt;
A new workflow tab can be added via the item &amp;lt;code&amp;gt;'New'&amp;lt;/code&amp;gt; in the context menu of the workbench. &lt;br /&gt;
The context menu is displayed upon right-click on an empty location of the workbench area. &lt;br /&gt;
Upon selecting the item &amp;lt;code&amp;gt;'New'&amp;lt;/code&amp;gt; a new tab is added to the workbench panel.&lt;br /&gt;
By default, the name of the new workflow is 'Untitled', but it can easily be&lt;br /&gt;
renamed via the corresponding item &amp;lt;code&amp;gt;'Rename'&amp;lt;/code&amp;gt; in the context menu. Via this&lt;br /&gt;
menu it is also possible to close a workflow tab if no longer required. Note&lt;br /&gt;
that its contents are lost if not saved before! The currently selected tab in&lt;br /&gt;
the workbench contains the active workflow which can be edited and where&lt;br /&gt;
new operator nodes can be added as outlined in the previous subsection.&lt;br /&gt;
&lt;br /&gt;
For each operator selected via the selection menu, a&lt;br /&gt;
node in terms of a rectangle is added to the currently active workflow. Above the rectangle &lt;br /&gt;
the name of the operator is displayed, while on its left and right side the operator's input and output ports are shown as circles and &lt;br /&gt;
squares. Circles are associated with operator parameters of directions &amp;lt;code&amp;gt;IN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;OUT&amp;lt;/code&amp;gt;, while squares refer to parameters with&lt;br /&gt;
direction &amp;lt;code&amp;gt;INOUT&amp;lt;/code&amp;gt;. The latter ports are duplicated on both sides of the node.&lt;br /&gt;
The colors of the circles indicate their type. Blue circles refer to required parameters, yellow circles are associated with optional &lt;br /&gt;
parameters, and red circles are linked to supplemental parameters. To the left and right of the ports,&lt;br /&gt;
respectively, the name of the corresponding parameters are written.  &lt;br /&gt;
Once operator nodes have been added to a workflow, they can easily be dragged&lt;br /&gt;
and repositioned as well as resized via intuitive mouse actions. &lt;br /&gt;
&lt;br /&gt;
For each operator node a context menu can be popped up by clicking the node with the right mouse&lt;br /&gt;
button. From this menu it is possible to delete the node (item &amp;lt;code&amp;gt;'Remove'&amp;lt;/code&amp;gt;), or to configure the&lt;br /&gt;
view via the item &amp;lt;code&amp;gt;'Options'&amp;lt;/code&amp;gt;. It, e.g., allows to select the set of operator parameter ports&lt;br /&gt;
to be shown, i.e. either all parameters or just the subset of non-expert parameters. From the&lt;br /&gt;
context menu of a node it is also possible to configure the node (item &amp;lt;code&amp;gt;'Configure'&amp;lt;/code&amp;gt;).  &lt;br /&gt;
&lt;br /&gt;
On selecting the item for&lt;br /&gt;
configuration, a window is displayed which allows to enter parameter values.&lt;br /&gt;
The window is automatically generated, i.e., actually the same &lt;br /&gt;
mechanisms as for executing operators via the graphical operator runner are applied. Accordingly, &lt;br /&gt;
the configuration window is identical to the corresponding operator control&lt;br /&gt;
window and shares the same layout, except for the control buttons and the batch&lt;br /&gt;
mode tab which are missing.&lt;br /&gt;
&lt;br /&gt;
Operator parameters for a certain node can directly be specified via the&lt;br /&gt;
configuration window, they can be loaded from a proper parameter file in XML&lt;br /&gt;
format, or they&lt;br /&gt;
can be configured by dragging edges between ports of different nodes with the&lt;br /&gt;
mouse to propagate output data from one node as input data to another. To add an&lt;br /&gt;
edge, move the mouse over an output port of a node until the port is surrounded&lt;br /&gt;
by a green square, then press the left mouse button. Subsequently, while keeping&lt;br /&gt;
the button pressed, move the mouse to the desired input port of another node.&lt;br /&gt;
Once a green rectangle shows up around the target input port, release the&lt;br /&gt;
button. Note that on dragging edges Grappa performs type and validity checks.&lt;br /&gt;
Only ports being associated with compatible parameter data types can be&lt;br /&gt;
linked to each other. Two parameter data types are compatible if they are&lt;br /&gt;
either equal, the target data type is a super class of the source data type, or&lt;br /&gt;
if Alida has access to a converter allowing to transform the source data type&lt;br /&gt;
into the target type. Also&lt;br /&gt;
edges are forbidden that would induce cycles into the workflow graph.&lt;br /&gt;
&lt;br /&gt;
Nodes in a workflow can have different states indicated by the color of their border. &lt;br /&gt;
Red framed nodes are not ready for execution, i.e., their configuration is not&lt;br /&gt;
complete. If a node is readily configured and can directly be executed, its&lt;br /&gt;
border has a yellow color, while nodes that are configured, however, require&lt;br /&gt;
additional input data from preceeding operator nodes have an orange color.&lt;br /&gt;
Prior to executing these orange nodes it is, thus, necessary to execute the&lt;br /&gt;
preceeding nodes first.&lt;br /&gt;
Note that Grappa takes care of such dependencies, i.e., automatically executes&lt;br /&gt;
nodes first from which result data is required for proper workflow or node&lt;br /&gt;
execution. The state of a node is updated by Grappa in real-time, i.e., each&lt;br /&gt;
change in its configuration directly invokes internal checkings and may result in a change of the node's color.&lt;br /&gt;
&lt;br /&gt;
Grappa offers various modes for executing a&lt;br /&gt;
complete workflow or parts of it.&lt;br /&gt;
From the context menu of the workbench the item &lt;br /&gt;
&amp;lt;code&amp;gt;'Run'&amp;lt;/code&amp;gt; is available which executes the complete workflow, i.e., all nodes&lt;br /&gt;
currently present on the tab. From the context menu of a single node and its &amp;lt;code&amp;gt;'Run ...'&amp;lt;/code&amp;gt; item also the whole workflow can be executed (item &amp;lt;code&amp;gt;'Workflow'&amp;lt;/code&amp;gt;).&lt;br /&gt;
Alternatively, via the item &amp;lt;code&amp;gt;'Nodes from here'&amp;lt;/code&amp;gt; it is possible to only execute the nodes of the workflow subgraph for which the &lt;br /&gt;
current node is the root (of course considering required dependencies). Finally, the item &amp;lt;code&amp;gt;'Node'&amp;lt;/code&amp;gt; allows for running the workflow&lt;br /&gt;
until the node in question. As mentioned before, Grappa automatically takes care&lt;br /&gt;
of resolving dependencies, i.e., upon executing a node all nodes having a yellow&lt;br /&gt;
or orange border and being predecessors of the node in question are also executed. Note that the execution of a workflow will fail if one of the nodes is still colored red, or if a node does not produce proper output data required by others. &lt;br /&gt;
&lt;br /&gt;
After successful execution of the workflow or a subset of nodes, the colors of&lt;br /&gt;
the corresponding nodes change to green indicating that result data are&lt;br /&gt;
available. For all terminal nodes having no successor the result frames are&lt;br /&gt;
automatically opened.&lt;br /&gt;
For all other nodes the result data can graphically be examined via the nodes'&lt;br /&gt;
context menus from which the result windows can manually be opened. &lt;br /&gt;
Once a node has been executed and is colored in green, it is not possible to&lt;br /&gt;
re-execute the node until its configuration, or at least the configuration of&lt;br /&gt;
one of its preceeding nodes, was changed.&lt;br /&gt;
&lt;br /&gt;
== Menubar == &lt;br /&gt;
The Grappa main window features a menubar offering quick&lt;br /&gt;
access to the basic functions of Grappa and some additional convenience functionality simplifying&lt;br /&gt;
the work with the editor. &lt;br /&gt;
&lt;br /&gt;
Via the menu item &amp;lt;code&amp;gt;'File'&amp;lt;/code&amp;gt; workflows can be saved to and read from&lt;br /&gt;
disk. By saving a workflow currently two files are written to disk, one containing the information&lt;br /&gt;
about the nodes and their configuration, and one storing graphical information&lt;br /&gt;
regarding the current workflow layout. Both are required to load a workflow&lt;br /&gt;
again. The first one has the extension &amp;lt;code&amp;gt;'.awf'&amp;lt;/code&amp;gt;, the latter one the&lt;br /&gt;
extension &amp;lt;code&amp;gt;'.awf.gui'&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Via the menu item &amp;lt;code&amp;gt;'Workflow'&amp;lt;/code&amp;gt; new workflows can be added and existing ones be renamed, &lt;br /&gt;
closed, executed or interrupted.  &lt;br /&gt;
Alida supports two categories of&lt;br /&gt;
operators, i.e. operators mainly dedicated to direct application by non-expert users&lt;br /&gt;
and operators for special tasks and expert usage. Via the item &amp;lt;code&amp;gt;'Options'&amp;lt;/code&amp;gt; the menubar allows&lt;br /&gt;
to switch the view in the selection menu between both categories. Also progress messages triggered by the&lt;br /&gt;
operator node during execution and optionally shown in the status panel can be enabled or&lt;br /&gt;
disabled via this menu. Finally, the menu item &amp;lt;code&amp;gt;'Help'&amp;lt;/code&amp;gt; grants access to Alida's online help system&lt;br /&gt;
where information about its functionality and descriptions of the operators can be found.&lt;/div&gt;</summary>
		<author><name>Posch</name></author>
	</entry>
	<entry>
		<id>https://alida.informatik.uni-halle.de/index.php?title=Java_quick&amp;diff=261</id>
		<title>Java quick</title>
		<link rel="alternate" type="text/html" href="https://alida.informatik.uni-halle.de/index.php?title=Java_quick&amp;diff=261"/>
		<updated>2016-02-23T22:31:21Z</updated>

		<summary type="html">&lt;p&gt;Posch: /* Menubar and shortcuts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here we introduce Alida's operator concept with some code snippets of &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt; and sub-classed demo operators.&lt;br /&gt;
we focus on Alida's capabilities to automatically generate user interfaces.&lt;br /&gt;
&lt;br /&gt;
=  First operator =&lt;br /&gt;
&lt;br /&gt;
As a first example of an Alida operator we implement the row or column wise&lt;br /&gt;
sum for a 2D array of Doubles.&lt;br /&gt;
The class &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt; extending &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt; features three member variables&lt;br /&gt;
holding the input 2D array, an enum to indicate the mode of summation (&amp;lt;code&amp;gt;ROW&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;COLUMN&amp;lt;/code&amp;gt;), and&lt;br /&gt;
an 1D array of the sums to be computed and returned by the operator.&lt;br /&gt;
Alida requires only to annotate these members with the @Parameter annotation&lt;br /&gt;
which declares &lt;br /&gt;
&lt;br /&gt;
* the direction (&amp;lt;code&amp;gt;IN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;OUT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INOUT&amp;lt;/code&amp;gt;), &lt;br /&gt;
* whether the parameter is required,&lt;br /&gt;
* an optional textual description,&lt;br /&gt;
* and a label used, e.g. in the graphical user interface automatically generated&lt;br /&gt;
		to execute the operator.&lt;br /&gt;
&lt;br /&gt;
It is important to add a public standard constructor (without arguments)&lt;br /&gt;
to be able to use Java's reflection mechanism.&lt;br /&gt;
Finally, the abstract method &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; of &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt; has to be overridden&lt;br /&gt;
implementing the functionality of the operator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
				level=ALDAOperator.Level.APPLICATION)&lt;br /&gt;
public class MatrixSum extends ALDOperator {&lt;br /&gt;
&lt;br /&gt;
  /** Choose row or colum wise sum&lt;br /&gt;
    */&lt;br /&gt;
  public static enum SummarizeMode {&lt;br /&gt;
	/** row wise */&lt;br /&gt;
	ROW,&lt;br /&gt;
&lt;br /&gt;
	/** column wise */&lt;br /&gt;
	COLUMN&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Input matrix&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;Input matrix&amp;quot;, required = true, &lt;br /&gt;
  		direction = Parameter.Direction.IN, description = &amp;quot;Input matrix.&amp;quot;)&lt;br /&gt;
  private Double[][] matrix;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Mode of summarizing&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;Summarize mode&amp;quot;, required = true, &lt;br /&gt;
  		direction = Parameter.Direction.IN, description = &amp;quot;Sum over columns or rows?&amp;quot;)&lt;br /&gt;
  private SummarizeMode summarizeMode = SummarizeMode.ROW;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * 1D Array of sums.&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;sums&amp;quot;,  &lt;br /&gt;
  		direction = Parameter.Direction.OUT, description = &amp;quot;Row or column wise sums.&amp;quot;)&lt;br /&gt;
  private Double[] sums = null;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Default constructor.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public MatrixSum() throws ALDOperatorException {&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Constructor.&lt;br /&gt;
	 * &lt;br /&gt;
	 * @param matrix	Input matrix.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public MatrixSum(Double[] [] matrix) throws ALDOperatorException {&lt;br /&gt;
		this.matrix = matrix;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	protected void operate() {&lt;br /&gt;
		if ( matrix == null ) &lt;br /&gt;
			sums = null;&lt;br /&gt;
&lt;br /&gt;
		// calculate sums&lt;br /&gt;
		if ( summarizeMode == SummarizeMode.ROW ) {&lt;br /&gt;
			sums = new Double[matrix.length];&lt;br /&gt;
			for ( int row = 0 ; row &amp;lt; matrix.length ; row++ ) {&lt;br /&gt;
				sums[row] = 0.0;&lt;br /&gt;
				for ( int col = 0 ; col &amp;lt; matrix[0].length ; col++ )&lt;br /&gt;
					sums[row] += matrix[row][col];&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			sums = new Double[matrix[0].length];&lt;br /&gt;
			for ( int col = 0 ; col &amp;lt; matrix[0].length ; col++ ) {&lt;br /&gt;
				sums[col] = 0.0;&lt;br /&gt;
				for ( int row = 0 ; row &amp;lt; matrix.length ; row++ )&lt;br /&gt;
					sums[col] += matrix[row][col];&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These are the basic requirements for the operator to be used on the programming level.&lt;br /&gt;
An example of this use is included in the example in the next section.&lt;br /&gt;
&lt;br /&gt;
If we further annotate the class with &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
this is all needed to also facilitate &lt;br /&gt;
execution of this operator via a graphical and a command line user interface&lt;br /&gt;
automatically generated by Alida.&lt;br /&gt;
(Setting &amp;lt;code&amp;gt;level=ALDAOperator.Level.APPLICATION&amp;lt;/code&amp;gt; declares this operator an application&lt;br /&gt;
which is used in the GUI to control display of available operators.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Invocation via a graphical user interface ==&lt;br /&gt;
&lt;br /&gt;
Alida comes with one single application to execute Alida operators&lt;br /&gt;
with a automatically generated graphical user interface which may be&lt;br /&gt;
started from command line by&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunnerGUI&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will pop up a window to choose an operator to execute.&lt;br /&gt;
Arranged according to the package structure all operators allows to be executed&lt;br /&gt;
via the graphical user interface according to their &amp;lt;code&amp;gt;genericExecutionMode&amp;lt;/code&amp;gt;&lt;br /&gt;
are displayed.&lt;br /&gt;
Initially packages are unfolded up to a predefined depth.&lt;br /&gt;
Unfold the demo package, select &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt;, and choose the &amp;quot;Configure Operator&amp;quot; button.&lt;br /&gt;
This will pop up another window which allows you to configure the input parameters&lt;br /&gt;
of the operator.&lt;br /&gt;
Important note: After finishing to input the data matrix entering the final matrix elements&lt;br /&gt;
you have to select a previous matrix element due to subtle AWT details.&lt;br /&gt;
For the enumeration to select the mode Alida has automatically generated&lt;br /&gt;
a combo box to allow convenient selections.&lt;br /&gt;
If you are finished with the parameter configuration you want to invoke the operator&lt;br /&gt;
using the run button.&lt;br /&gt;
On completion of &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt; the interface will pop up the result window which allows you&lt;br /&gt;
to inspect the outcome of the operation.&lt;br /&gt;
&lt;br /&gt;
==   Invocation via command line ==&lt;br /&gt;
&lt;br /&gt;
The command line user interface of Alida allows to invoke all Alida operator&lt;br /&gt;
properly annotated to allows generic execution.&lt;br /&gt;
&lt;br /&gt;
You may invoke the matrix summation operator by&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix='[[1,2,3],[4,5,6]]' sums=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
which returns as result on standard output&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sums = [6.0,15.0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter values are specified as name=value pairs.&lt;br /&gt;
Alida's syntax for 2D array should be self-explanatory  from this example.&lt;br /&gt;
As the mode of summation is not supplied as a parameter its default is used&lt;br /&gt;
&lt;br /&gt;
Note, the command&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix='[[1,2,3],[4,5,6]]' &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
will return no output as the command line user interface returns only output parameters requested.&lt;br /&gt;
&lt;br /&gt;
The enumeration defined in &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt; is supported by the&lt;br /&gt;
user interface without further action required as shown in the next example.&lt;br /&gt;
This also demonstrates redirection of output&lt;br /&gt;
to a file, sums.out in this case.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix='[[1,2,3],[4,5,6]]' &lt;br /&gt;
	summarizeMode=COLUMN sums=@sums.out+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Input can be read from file as well:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix=@data sums=-+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where the file data contains the string defining the matrix, e.g., &amp;lt;code&amp;gt;[[1,2,3],[4,5,6]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Adding more features to an operator =&lt;br /&gt;
&lt;br /&gt;
We now generalize this example to realize not only summation over rows or&lt;br /&gt;
columns, but arbitrary summarizing operations.&lt;br /&gt;
This shows Alida's feature to allow an operator as parameter of another operator.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
First we generalize &amp;lt;code&amp;gt;ALDArraySum&amp;lt;/code&amp;gt; to the operator &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt;&lt;br /&gt;
which also takes a 2D array and an enum indicating the mode of marginalization (&amp;lt;code&amp;gt;ROW&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;COLUMN&amp;lt;/code&amp;gt;).&lt;br /&gt;
It takes an additional input parameter which specifies the operation to be applied on each&lt;br /&gt;
row or column.&lt;br /&gt;
&lt;br /&gt;
This parameter is itself an Alida operator and of type &amp;lt;code&amp;gt;ALDSummarizeArrayOp&amp;lt;/code&amp;gt;&lt;br /&gt;
which is implemented as an abstract class.&lt;br /&gt;
This abstract operator defines a summarizing operator&lt;br /&gt;
which takes a 1D array as input and returns a summarizing scalar.&lt;br /&gt;
As this is an abstract class there is no need to override the &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt;&lt;br /&gt;
method, however some getter and setter methods are provided.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  @Parameter( label= &amp;quot;Input 1D array&amp;quot;, required = true, &lt;br /&gt;
  		direction = Parameter.Direction.IN, description = &amp;quot;Input array (1D).&amp;quot;)&lt;br /&gt;
  protected Double[] data;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Summarizing scalar&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;Summarizing scalar&amp;quot;,  &lt;br /&gt;
  		direction = Parameter.Direction.OUT, description = &amp;quot;Summarizing scalar of the 1D arra&amp;quot;)&lt;br /&gt;
  protected Double summary = null;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Default constructor.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public ALDSummarizeArrayOp() throws ALDOperatorException {&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Returns the 1D array&lt;br /&gt;
	 * @return data array&lt;br /&gt;
	 */&lt;br /&gt;
	public Double[] getData() {&lt;br /&gt;
		return this.data;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Sets the 1D array&lt;br /&gt;
	 * @param data&lt;br /&gt;
	 */&lt;br /&gt;
	public void setData( Double[] data) {&lt;br /&gt;
		this.data = data;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we add concrete examples of such a summarizing operation, in this case&lt;br /&gt;
summation (&amp;lt;code&amp;gt;ALDArraySum&amp;lt;/code&amp;gt;), to return the mean (&amp;lt;code&amp;gt;ALDArrayMean&amp;lt;/code&amp;gt;), and the minimum (&amp;lt;code&amp;gt;ALDArrayMin&amp;lt;/code&amp;gt;).&lt;br /&gt;
Each implements the  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method and has to supply a standard constructor.&lt;br /&gt;
In this example we add another constructor for convenience.&lt;br /&gt;
This operators are declared as operators on the standard in contrast to &lt;br /&gt;
application level, as they are not expected to be invoked as an application.&lt;br /&gt;
However, setting the level to standard in the menu of the graphical user interface&lt;br /&gt;
stills allows their execution.&lt;br /&gt;
When extending the abstract super class it is necessary to annotate the&lt;br /&gt;
class with &amp;lt;code&amp;gt;@ALDDerivedClass&amp;lt;/code&amp;gt; in order to allow Alida's dataIO mechanism to find the derived class&lt;br /&gt;
in the automatically generated user interface.&lt;br /&gt;
This holds for other parameter types as well.&lt;br /&gt;
More specifically, if an instance of a class is to be supplied in an automatically &lt;br /&gt;
generated user interface as a value for a parameter of one of its super classes,&lt;br /&gt;
Alida requires the annotation &amp;lt;code&amp;gt;@ALDDerivedClass&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDDerivedClass&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
        level=ALDAOperator.Level.STANDARD)&lt;br /&gt;
public class ALDArraySum extends ALDSummarizeArrayOp {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void operate() {&lt;br /&gt;
        summary = 0.0;&lt;br /&gt;
        for ( int i = 0 ; i &amp;lt; data.length ; i++ )&lt;br /&gt;
            summary += data[i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Default constructor.&lt;br /&gt;
     * @throws ALDOperatorException&lt;br /&gt;
     */&lt;br /&gt;
    public ALDArraySum() throws ALDOperatorException {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we are ready to implement &lt;br /&gt;
the &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt; operator, which also demonstrates supplemental parameters.&lt;br /&gt;
This supplementals, e.g., control debugging output or returning of intermediate results.&lt;br /&gt;
For demo purposes we declare a supplemental input parameter &amp;lt;code&amp;gt;returnElapsedTime&amp;lt;/code&amp;gt;.&lt;br /&gt;
If it is set to true the operator will return the elapsed time in a second&lt;br /&gt;
supplemental parameter with direction output.&lt;br /&gt;
&lt;br /&gt;
Again, the operation is implemented in the  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method and the remainder of the&lt;br /&gt;
class supplies getter and setter methods for convenience.&lt;br /&gt;
The  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method give also an example of the invocation of an operator on the&lt;br /&gt;
programming level.&lt;br /&gt;
In this case, an instance of the operator is already passed as a parameter.&lt;br /&gt;
Its parameters are set, in this case each 1D array to be summarized in turn.&lt;br /&gt;
Upon return from the method &amp;lt;code&amp;gt;runOp()&amp;lt;/code&amp;gt; the results may be retrieved from the operator object,&lt;br /&gt;
in this example with the &amp;lt;code&amp;gt;getSummary()&amp;lt;/code&amp;gt; method.&lt;br /&gt;
Besides getter and setter methods as implemented in each operator&lt;br /&gt;
Alida provides also a generic get and set methods applicable to&lt;br /&gt;
all parameters of an operator.&lt;br /&gt;
Note, that the operator is not invoked by its  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method, but via&lt;br /&gt;
the &amp;lt;code&amp;gt;runOp()&amp;lt;/code&amp;gt; method implemented the base class &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt;.&lt;br /&gt;
This methods validates the parameters before invocation of  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt;.&lt;br /&gt;
Furthermore, it take all necessary measures for Alida's processing&lt;br /&gt;
history which automatically logs&lt;br /&gt;
all manipulative actions on the data and corresponding parameter settings. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
            level=ALDAOperator.Level.APPLICATION)&lt;br /&gt;
public class ApplyToMatrix extends ALDOperator {&lt;br /&gt;
&lt;br /&gt;
    /** Choose row or colum wise sum&lt;br /&gt;
      */&lt;br /&gt;
    public static enum SummarizeMode {&lt;br /&gt;
      /** row wise */&lt;br /&gt;
      ROW,&lt;br /&gt;
      /** column wise */&lt;br /&gt;
      COLUMN&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Input matrix&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Input matrix&amp;quot;, required = true, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Input matrix.&amp;quot;)&lt;br /&gt;
    private Double[][] matrix;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Mode of summarizing&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Summarize mode&amp;quot;, required = true, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Sum over columns or rows.&amp;quot;)&lt;br /&gt;
    private SummarizeMode summarizeMode = SummarizeMode.ROW;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Summarizing opererator&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Summarizing operator&amp;quot;, required = true, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Specifies the summarizing operation to apply&amp;quot;)&lt;br /&gt;
    private ALDSummarizeArrayOp summarizeOp;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 1D Array of summaries.&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;summaries&amp;quot;,  &lt;br /&gt;
          direction = Parameter.Direction.OUT, description = &amp;quot;Row or column wise summaries&amp;quot;)&lt;br /&gt;
    private Double[] summaries = null;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Supplemental to request elapsed time to be returned&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Return elapsed time&amp;quot;, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Request elapsed time consumed to be returned&amp;quot;,&lt;br /&gt;
        supplemental=true)&lt;br /&gt;
    private boolean returnElapsedTime = false;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Elpased time &lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Elapsed time&amp;quot;,  &lt;br /&gt;
          direction = Parameter.Direction.OUT, description = &amp;quot;Elapsed time of operation in milliseconds&amp;quot;,&lt;br /&gt;
        supplemental=true)&lt;br /&gt;
    private long elapsedTime;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Default constructor.&lt;br /&gt;
     * @throws ALDOperatorException&lt;br /&gt;
     */&lt;br /&gt;
    public ApplyToMatrix() throws ALDOperatorException {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Constructor.&lt;br /&gt;
     * &lt;br /&gt;
     * @param matrix    Input matrix.&lt;br /&gt;
     * @throws ALDOperatorException&lt;br /&gt;
     */&lt;br /&gt;
    public ApplyToMatrix(Double[] [] matrix) throws ALDOperatorException {&lt;br /&gt;
        this.matrix = matrix;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void operate() throws ALDOperatorException,ALDProcessingDAGException {&lt;br /&gt;
        if ( returnElapsedTime ) &lt;br /&gt;
            elapsedTime = System.currentTimeMillis();&lt;br /&gt;
&lt;br /&gt;
        if ( matrix == null ) &lt;br /&gt;
            summaries = null;&lt;br /&gt;
&lt;br /&gt;
        // calculate summaries&lt;br /&gt;
        if ( summarizeMode == SummarizeMode.ROW ) {&lt;br /&gt;
            summaries = new Double[matrix.length];&lt;br /&gt;
            for ( int row = 0 ; row &amp;lt; matrix.length ; row++ ) {&lt;br /&gt;
                summarizeOp.setData(matrix[row]);&lt;br /&gt;
                summarizeOp.runOp();&lt;br /&gt;
                summaries[row] = summarizeOp.getSummary();&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            summaries = new Double[matrix[0].length];&lt;br /&gt;
            Double[] tmp = new Double[matrix.length];&lt;br /&gt;
            for ( int col = 0 ; col &amp;lt; matrix[0].length ; col++ ) {&lt;br /&gt;
                for ( int row = 0 ; row &amp;lt; matrix.length ; row++ )&lt;br /&gt;
                    tmp[row] = matrix[row][col];&lt;br /&gt;
&lt;br /&gt;
                summarizeOp.setData(tmp);&lt;br /&gt;
                summarizeOp.runOp();&lt;br /&gt;
                summaries[col] = summarizeOp.getSummary();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if ( returnElapsedTime ) &lt;br /&gt;
            elapsedTime = System.currentTimeMillis() - elapsedTime;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // ==============================================================&lt;br /&gt;
    // Getter and setter methods&lt;br /&gt;
    /** Get value of returnElapsedTime.&lt;br /&gt;
      * Explanation: Request elapsed time consumed to be returned.&lt;br /&gt;
      * @return value of returnElapsedTime&lt;br /&gt;
      */&lt;br /&gt;
    public boolean getReturnElapsedTime(){&lt;br /&gt;
        return returnElapsedTime;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /** Set value of returnElapsedTime.&lt;br /&gt;
      * Explanation: Request elapsed time consumed to be returned.&lt;br /&gt;
      * @param value New value of returnElapsedTime&lt;br /&gt;
      */&lt;br /&gt;
    public void setReturnElapsedTime( boolean value){&lt;br /&gt;
        this.returnElapsedTime = value;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==   Invocation via a graphical user interface ==&lt;br /&gt;
&lt;br /&gt;
If the graphical interface is still running just select our new operator&lt;br /&gt;
and begin to configure it.&lt;br /&gt;
For the parameter summarizing operator you have a choice of all operators extending&lt;br /&gt;
the abstract operator &amp;lt;code&amp;gt;ALDSummarizeArrayOp&amp;lt;/code&amp;gt;.&lt;br /&gt;
All which is necessary on the implementation side is proper annotation of the extending&lt;br /&gt;
classes with &amp;lt;code&amp;gt;@ALDDerivedClass&amp;lt;/code&amp;gt;.&lt;br /&gt;
As the selected operator may have its own parameters you may want to configure it.&lt;br /&gt;
In our example this is not necessary as the input array is, of course, supplied&lt;br /&gt;
by the &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt; operator.&lt;br /&gt;
Do not forget to input your data before hitting the run button.&lt;br /&gt;
After return, again a result window give you the results of the operation.&lt;br /&gt;
Note, if you did not tick Return elapsed time&amp;quot; this window will show zero&lt;br /&gt;
for the time elapsed as the operator has not been request to stop the time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==   Invocation via command line ==&lt;br /&gt;
&lt;br /&gt;
When invoking the &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt; operator from command line&lt;br /&gt;
we have to handle derived classes as value for parameters.&lt;br /&gt;
In the graphical user interface Alida features a combo box where&lt;br /&gt;
we may choose from.&lt;br /&gt;
In the command line interface Alida allows to prefix the value of a parameter&lt;br /&gt;
with a derived class to be passed to the operator.&lt;br /&gt;
This is necessary as Alida as, of course, no way to itself&lt;br /&gt;
decide if and which derived class is to be used.&lt;br /&gt;
Alida's syntax is to enclose the class name in a dollar sign and a colon.&lt;br /&gt;
As evident in the following example, abbreviations are of the fully&lt;br /&gt;
qualified class name are accepted as long as they are unambiguous.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner Apply \&lt;br /&gt;
	matrix='[[1,2,3],[4,5,6]]' \&lt;br /&gt;
	summarizeMode=ROW \&lt;br /&gt;
	summarizeOp='&amp;lt;math&amp;gt;ALDArrayMean:{}' \&lt;br /&gt;
	summaries=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
results in&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
summaries = [2.0,5.0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ALDOpRunner&amp;lt;/code&amp;gt; may be persuaded to show all operators derived from &amp;lt;code&amp;gt;ALDSummarizeArrayOp&amp;lt;/code&amp;gt;&lt;br /&gt;
and known within the user interface if we enter an invalid class name:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner \&lt;br /&gt;
	Apply matrix='[[1,2,3],[4,5,6]]' \&lt;br /&gt;
	summarizeMode=ROW summarizeOp='&amp;lt;/math&amp;gt;dd:{}' \&lt;br /&gt;
	summaries=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
yields&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALDStandardizedDataIOCmdline::readData found 0 derived classes matching &amp;lt;dd&amp;gt;&lt;br /&gt;
      derived classes available:&lt;br /&gt;
	de.unihalle.informatik.Alida.demo.ALDArrayMean&lt;br /&gt;
	de.unihalle.informatik.Alida.demo.ALDArrayMin&lt;br /&gt;
	de.unihalle.informatik.Alida.demo.ALDArraySum&lt;br /&gt;
ERROR: reading parameter &amp;lt;summarizeOp&amp;gt; returns null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supplemental parameters are handled like other parameters&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner Apply \&lt;br /&gt;
	matrix='[[1,2,3],[4,5,6]]' \&lt;br /&gt;
	summarizeMode=COLUMN \&lt;br /&gt;
	summarizeOp='&amp;lt;math&amp;gt;ALDArrayMin:{}' \&lt;br /&gt;
	summaries=- \&lt;br /&gt;
	returnElapsedTime=true \&lt;br /&gt;
	elapsedTime=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
gives&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	summaries = [1.0,2.0,3.0]&lt;br /&gt;
	elapsedTime = 4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=   Adding more data types as parameters =&lt;br /&gt;
&lt;br /&gt;
Alida provides automatic IO of primitive data types, enumerations, arrays, collections,&lt;br /&gt;
and operators.&lt;br /&gt;
In addition so called parameterized classes are supported.&lt;br /&gt;
Any Java class may be declared to be a parameterized class in Alida&lt;br /&gt;
by annotating the class &amp;lt;code&amp;gt;@ALDParametrizedClass&amp;lt;/code&amp;gt; as shown in the&lt;br /&gt;
class &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt;.&lt;br /&gt;
All member variables to be known to and handled by Alida's user interface&lt;br /&gt;
simply need to be annotated with &amp;lt;code&amp;gt;@ALDClassParameter&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Here we implement a toy version of experimental data &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt;.&lt;br /&gt;
A complete experiment contains&lt;br /&gt;
data of a time series of measurements of variable length.&lt;br /&gt;
Additional information is a descriptive string, the time resolution in milliseconds,&lt;br /&gt;
and whether baseline correction has been applied.&lt;br /&gt;
&lt;br /&gt;
The class is annotated by &amp;lt;code&amp;gt;@ALDParametrizedClass&amp;lt;/code&amp;gt;, and&lt;br /&gt;
and all members to be handle in Alida'a user interfaces are&lt;br /&gt;
to be annotated with &amp;lt;code&amp;gt;@ALDParametrizedClass&amp;lt;/code&amp;gt;.&lt;br /&gt;
The label field has the same semantics as for parameters of operators.&lt;br /&gt;
These annotations are the only implementational overhead&lt;br /&gt;
to allow Alida to automatically generate user interfaces&lt;br /&gt;
where the parameterized class acts as a parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDParametrizedClass&lt;br /&gt;
public class ExperimentalData1D extends ALDData {&lt;br /&gt;
	&lt;br /&gt;
    /** Description */&lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;description&amp;quot;, dataIOOrder = 1)&lt;br /&gt;
    private String description = null;&lt;br /&gt;
&lt;br /&gt;
    /** The data  */&lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;data&amp;quot;, dataIOOrder = 2)&lt;br /&gt;
    private Double[] data = null;&lt;br /&gt;
&lt;br /&gt;
    /** Are the data baseline corrected? */&lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;Baseline corrected&amp;quot;,&lt;br /&gt;
    			dataIOOrder = 3)&lt;br /&gt;
    private boolean baselineCorrected = false;&lt;br /&gt;
    &lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;Time resolution in milliseconds&amp;quot;, dataIOOrder = 4)&lt;br /&gt;
    private Float timeResolution = Float.NaN;&lt;br /&gt;
&lt;br /&gt;
    /** &lt;br /&gt;
     * Standard constructor is required&lt;br /&gt;
      */&lt;br /&gt;
    public ExperimentalData1D() {&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /** Constructor for an experiment.&lt;br /&gt;
      * Baseline correction is assumed to be false and nothung known about&lt;br /&gt;
      * the time resolution.&lt;br /&gt;
      *&lt;br /&gt;
      * @param  description   a textual description of the experiment&lt;br /&gt;
      * @param  data   measurements&lt;br /&gt;
      */&lt;br /&gt;
    public ExperimentalData1D( String description, Double[] data) {    &lt;br /&gt;
        this( description, data, false, Float.NaN);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is shown below for a simple normalizing operator &amp;lt;code&amp;gt;SmoothData1D&amp;lt;/code&amp;gt;&lt;br /&gt;
which takes experimental data as input an returns a new instance&lt;br /&gt;
of &amp;lt;code&amp;gt;ExperimentalData&amp;lt;/code&amp;gt; which contains smoothed data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDDerivedClass&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
              level=ALDAOperator.Level.APPLICATION)&lt;br /&gt;
public class SmoothData1D extends ALDOperator {&lt;br /&gt;
&lt;br /&gt;
	public enum SmoothingMethod {&lt;br /&gt;
		MEDIAN, MEAN, GAUSSIAN&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/** 1D Experiment&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label= &amp;quot;1D Experiment&amp;quot;, required = true, &lt;br /&gt;
			direction = Parameter.Direction.IN, &lt;br /&gt;
			description = &amp;quot;1D Experiment&amp;quot;,&lt;br /&gt;
			dataIOOrder = 1)&lt;br /&gt;
	protected ExperimentalData1D experiment;&lt;br /&gt;
&lt;br /&gt;
	/** Smoothing method&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label = &amp;quot;Smoothing method&amp;quot;, required = true,&lt;br /&gt;
			direction = Parameter.Direction.IN,&lt;br /&gt;
			callback = &amp;quot;smoothingMethodChanged&amp;quot;,&lt;br /&gt;
			description = &amp;quot;Smoothing method&amp;quot;,&lt;br /&gt;
			paramModificationMode = ParameterModificationMode.MODIFIES_INTERFACE,&lt;br /&gt;
			dataIOOrder = 2)&lt;br /&gt;
	SmoothingMethod smoothingMethod = SmoothingMethod.MEDIAN;&lt;br /&gt;
&lt;br /&gt;
	/** Window width&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label = &amp;quot;Window width&amp;quot;, required = true,&lt;br /&gt;
			direction = Parameter.Direction.IN,&lt;br /&gt;
			description = &amp;quot;Window width (should be uneven)&amp;quot;,&lt;br /&gt;
			dataIOOrder = 3)&lt;br /&gt;
	Integer width = 3;&lt;br /&gt;
&lt;br /&gt;
	/** Standard deviation of Gaussian&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label = &amp;quot;Standdard deviation of Gaussian&amp;quot;, required = true,&lt;br /&gt;
			direction = Parameter.Direction.IN,&lt;br /&gt;
			description = &amp;quot;Standdard deviation of Gaussian&amp;quot;,&lt;br /&gt;
			dataIOOrder = 3)&lt;br /&gt;
	Float sigma = 1.0F;&lt;br /&gt;
&lt;br /&gt;
	/** Smoothed 1D Experiment&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label= &amp;quot;Smothed 1D Experiment&amp;quot;,  &lt;br /&gt;
			direction = Parameter.Direction.OUT, &lt;br /&gt;
			description = &amp;quot;Smothed1D Experiment&amp;quot;,&lt;br /&gt;
			dataIOOrder = 1)&lt;br /&gt;
	protected ExperimentalData1D smoothedExperiment;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Default constructor.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public SmoothData1D() throws ALDOperatorException {&lt;br /&gt;
		// necessary handle dynamic parameters correctly&lt;br /&gt;
		smoothingMethodChanged();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	protected void operate() {&lt;br /&gt;
		this.fireOperatorExecutionProgressEvent(&lt;br /&gt;
				new ALDOperatorExecutionProgressEvent(this, &lt;br /&gt;
						&amp;quot;Starting to smooth 1D Data...&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
		Double[] smoothedData;&lt;br /&gt;
		if ( smoothingMethod == SmoothingMethod.MEDIAN) {&lt;br /&gt;
			smoothedData = median( experiment.getData(), this.width);&lt;br /&gt;
		} else {&lt;br /&gt;
			smoothedData = smoothByConvolution();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		smoothedExperiment = new ExperimentalData1D( experiment.getDescription() + &amp;quot; (smoothed)&amp;quot;, &lt;br /&gt;
				smoothedData, experiment.isBaselineCorrected(), experiment.getTimeResolution());&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This mechanism applies in a recursive fashion, i.e. a parameterized class may&lt;br /&gt;
(recursively) contain a member variable which itself is a parametrized class.&lt;br /&gt;
Likewise, an operator acting as a parameter of another operator&lt;br /&gt;
may in turn have a parameter of type &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==   Invocation via a graphical user interface ==&lt;br /&gt;
&lt;br /&gt;
Invoking and configuring &amp;lt;code&amp;gt;SmoothData1D&amp;lt;/code&amp;gt; from the graphical user interface&lt;br /&gt;
shows as the only required parameter the experimental data.&lt;br /&gt;
This parameterized class can be configured in a separate  window&lt;br /&gt;
very similar to to configuration of operators.&lt;br /&gt;
Likewise the resulting normalized experimental data&lt;br /&gt;
may be inspected in their own window.&lt;br /&gt;
&lt;br /&gt;
Obviously this is a toy example, as we would not expect the measurements to&lt;br /&gt;
be entered manually, but rather stored and read from file in a specialized format.&lt;br /&gt;
This is one of the rare cases where &lt;br /&gt;
custom data IO provider need to be implemented, in this&lt;br /&gt;
case for &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==   Invocation via command line ==&lt;br /&gt;
&lt;br /&gt;
Again, invocation from command line is provided by Alida in an automatic&lt;br /&gt;
way with no further implementational overhead.&lt;br /&gt;
The syntax for parameterized classes es a comma separated list of name=value pairs&lt;br /&gt;
enclosed in curly brackets where name refers to annotated member variables of&lt;br /&gt;
the parameterized class.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner SmoothData1D \&lt;br /&gt;
	experiment='{ baselineCorrected=false , \&lt;br /&gt;
                      description=&amp;quot;my experiment&amp;quot; , \&lt;br /&gt;
                      data=[1.0,2.0,2.2,3.3,2.0,1.0,1.0,1.0,1.0,2.0,3.3,2.0] }' \&lt;br /&gt;
        smoothingMethod=GAUSSIAN \&lt;br /&gt;
	smoothedExperiment=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
yields&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
smoothedExperiment = { baselineCorrected=false , &lt;br /&gt;
    data=[1.28,1.85,2.37,2.76,2.05,1.23,1.01,1.01,1.23,2.05,2.73,2.35] , &lt;br /&gt;
    timeResolution=NaN , &lt;br /&gt;
    description=&amp;quot;my experiment&amp;quot; (smoothed) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If a class derived from &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt; was to be supplied to the operator,&lt;br /&gt;
the curly brackets can be prefixed by a derive class definition starting with a dollar sign&lt;br /&gt;
and ending with a colon as shown for the summarizing operators above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Graphical workflow editor: Grappa =&lt;br /&gt;
Most of the time complex data analysis tasks cannot be solved by only applying a&lt;br /&gt;
single operator to the data. Rather, selections of various operators need to be&lt;br /&gt;
combined into more sophisticated workflows to extract desired result data.&lt;br /&gt;
Alida inherently supports the development of such workflows. &lt;br /&gt;
Grappa, the Graphical Programming &lt;br /&gt;
Editor for Alida, allows for designing and manipulating workflows via graph edit operations, hence, offers &lt;br /&gt;
an intuitive interface and large flexibility for developing workflows.&lt;br /&gt;
&lt;br /&gt;
A workflow in Alida is defined as a graph data structure. Each node of the graph represents an Alida operator, while edges between &lt;br /&gt;
different nodes encode the flow of data and control. Each node owns a selection of input and output ports which are associated with the&lt;br /&gt;
operator's parameters. Consequently, edges are directed, i.e., an edge always&lt;br /&gt;
connects an output port of one operator node with an input port of another. Grappa visualizes such workflow graphs and supports manual editing, manipulation, and also workflow execution&lt;br /&gt;
and analysis of results.&lt;br /&gt;
&lt;br /&gt;
Grappa can be started using the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;java de.unihalle.informatik.Alida.tools.ALDGrappaRunner&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grappa's main window is&lt;br /&gt;
basically divided into two sections. On the left, the node selection menu is&lt;br /&gt;
visible, while on the right the workbench area is located. &lt;br /&gt;
In addition, the window features a menubar for configuring Grappa, loading and&lt;br /&gt;
saving workflows, and accessing the online help. At the bottom of the window a&lt;br /&gt;
panel displaying status and progress messages is available.&lt;br /&gt;
&lt;br /&gt;
== Operator node selection menu == &lt;br /&gt;
In the selection menu on the left of Grappa's main window all Alida operators found in the &lt;br /&gt;
classpath upon initialization are listed as potential nodes for Grappa workflows. &lt;br /&gt;
In analogy to the graphical user interface&lt;br /&gt;
they are arranged in a hierarchical ordering &lt;br /&gt;
according to their package structure. The different package subtrees can be&lt;br /&gt;
folded and unfolded by double-clicking on a folder's name in the selection tree,&lt;br /&gt;
or by single-clicking on the circle displayed left to the folder icon. Above the&lt;br /&gt;
tree view an operator filter is available which allows to select operators&lt;br /&gt;
according to their names. For filtering, enter a substring into the text&lt;br /&gt;
field and press the return key. &lt;br /&gt;
Operator nodes can be added to a workflow by double-clicking on the operator&lt;br /&gt;
name. A new operator node is then instantiated in the top left corner of the&lt;br /&gt;
corresponding workflow tab, i.e., the active workflow (see below).&lt;br /&gt;
Alternatively, an operator can be selected by clicking once on its name &lt;br /&gt;
and afterwards clicking once on the position in the workflow tab where the new&lt;br /&gt;
operator node should be positioned.&lt;br /&gt;
 &lt;br /&gt;
== Workbench area == &lt;br /&gt;
Workflows can be designed and executed in the workbench area on the right of the main window. It allows for instantiating&lt;br /&gt;
multiple workflows in parallel where each workflow is linked to an individual tab of the workbench panel. &lt;br /&gt;
A new workflow tab can be added via the item &amp;lt;code&amp;gt;'New'&amp;lt;/code&amp;gt; in the context menu of the workbench. &lt;br /&gt;
The context menu is displayed upon right-click on an empty location of the workbench area. &lt;br /&gt;
Upon selecting the item &amp;lt;code&amp;gt;'New'&amp;lt;/code&amp;gt; a new tab is added to the workbench panel.&lt;br /&gt;
By default, the name of the new workflow is 'Untitled', but it can easily be&lt;br /&gt;
renamed via the corresponding item &amp;lt;code&amp;gt;'Rename'&amp;lt;/code&amp;gt; in the context menu. Via this&lt;br /&gt;
menu it is also possible to close a workflow tab if no longer required. Note&lt;br /&gt;
that its contents are lost if not saved before! The currently selected tab in&lt;br /&gt;
the workbench contains the active workflow which can be edited and where&lt;br /&gt;
new operator nodes can be added as outlined in the previous subsection.&lt;br /&gt;
&lt;br /&gt;
For each operator selected via the selection menu, a&lt;br /&gt;
node in terms of a rectangle is added to the currently active workflow. Above the rectangle &lt;br /&gt;
the name of the operator is displayed, while on its left and right side the operator's input and output ports are shown as circles and &lt;br /&gt;
squares. Circles are associated with operator parameters of directions &amp;lt;code&amp;gt;IN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;OUT&amp;lt;/code&amp;gt;, while squares refer to parameters with&lt;br /&gt;
direction &amp;lt;code&amp;gt;INOUT&amp;lt;/code&amp;gt;. The latter ports are duplicated on both sides of the node.&lt;br /&gt;
The colors of the circles indicate their type. Blue circles refer to required parameters, yellow circles are associated with optional &lt;br /&gt;
parameters, and red circles are linked to supplemental parameters. To the left and right of the ports,&lt;br /&gt;
respectively, the name of the corresponding parameters are written.  &lt;br /&gt;
Once operator nodes have been added to a workflow, they can easily be dragged&lt;br /&gt;
and repositioned as well as resized via intuitive mouse actions. &lt;br /&gt;
&lt;br /&gt;
For each operator node a context menu can be popped up by clicking the node with the right mouse&lt;br /&gt;
button. From this menu it is possible to delete the node (item &amp;lt;code&amp;gt;'Remove'&amp;lt;/code&amp;gt;), or to configure the&lt;br /&gt;
view via the item &amp;lt;code&amp;gt;'Options'&amp;lt;/code&amp;gt;. It, e.g., allows to select the set of operator parameter ports&lt;br /&gt;
to be shown, i.e. either all parameters or just the subset of non-expert parameters. From the&lt;br /&gt;
context menu of a node it is also possible to configure the node (item &amp;lt;code&amp;gt;'Configure'&amp;lt;/code&amp;gt;).  &lt;br /&gt;
&lt;br /&gt;
On selecting the item for&lt;br /&gt;
configuration, a window is displayed which allows to enter parameter values.&lt;br /&gt;
The window is automatically generated, i.e., actually the same &lt;br /&gt;
mechanisms as for executing operators via the graphical operator runner are applied. Accordingly, &lt;br /&gt;
the configuration window is identical to the corresponding operator control&lt;br /&gt;
window and shares the same layout, except for the control buttons and the batch&lt;br /&gt;
mode tab which are missing.&lt;br /&gt;
&lt;br /&gt;
Operator parameters for a certain node can directly be specified via the&lt;br /&gt;
configuration window, they can be loaded from a proper parameter file in XML&lt;br /&gt;
format, or they&lt;br /&gt;
can be configured by dragging edges between ports of different nodes with the&lt;br /&gt;
mouse to propagate output data from one node as input data to another. To add an&lt;br /&gt;
edge, move the mouse over an output port of a node until the port is surrounded&lt;br /&gt;
by a green square, then press the left mouse button. Subsequently, while keeping&lt;br /&gt;
the button pressed, move the mouse to the desired input port of another node.&lt;br /&gt;
Once a green rectangle shows up around the target input port, release the&lt;br /&gt;
button. Note that on dragging edges Grappa performs type and validity checks.&lt;br /&gt;
Only ports being associated with compatible parameter data types can be&lt;br /&gt;
linked to each other. Two parameter data types are compatible if they are&lt;br /&gt;
either equal, the target data type is a super class of the source data type, or&lt;br /&gt;
if Alida has access to a converter allowing to transform the source data type&lt;br /&gt;
into the target type. Also&lt;br /&gt;
edges are forbidden that would induce cycles into the workflow graph.&lt;br /&gt;
&lt;br /&gt;
Nodes in a workflow can have different states indicated by the color of their border. &lt;br /&gt;
Red framed nodes are not ready for execution, i.e., their configuration is not&lt;br /&gt;
complete. If a node is readily configured and can directly be executed, its&lt;br /&gt;
border has a yellow color, while nodes that are configured, however, require&lt;br /&gt;
additional input data from preceeding operator nodes have an orange color.&lt;br /&gt;
Prior to executing these orange nodes it is, thus, necessary to execute the&lt;br /&gt;
preceeding nodes first.&lt;br /&gt;
Note that Grappa takes care of such dependencies, i.e., automatically executes&lt;br /&gt;
nodes first from which result data is required for proper workflow or node&lt;br /&gt;
execution. The state of a node is updated by Grappa in real-time, i.e., each&lt;br /&gt;
change in its configuration directly invokes internal checkings and may result in a change of the node's color.&lt;br /&gt;
&lt;br /&gt;
Grappa offers various modes for executing a&lt;br /&gt;
complete workflow or parts of it.&lt;br /&gt;
From the context menu of the workbench the item &lt;br /&gt;
&amp;lt;code&amp;gt;'Run'&amp;lt;/code&amp;gt; is available which executes the complete workflow, i.e., all nodes&lt;br /&gt;
currently present on the tab. From the context menu of a single node and its &amp;lt;code&amp;gt;'Run\ldots'&amp;lt;/code&amp;gt; item also the whole workflow can be executed (item &amp;lt;code&amp;gt;'Workflow'&amp;lt;/code&amp;gt;).&lt;br /&gt;
Alternatively, via the item &amp;lt;code&amp;gt;'Nodes from here'&amp;lt;/code&amp;gt; it is possible to only execute the nodes of the workflow subgraph for which the &lt;br /&gt;
current node is the root (of course considering required dependencies). Finally, the item &amp;lt;code&amp;gt;'Node'&amp;lt;/code&amp;gt; allows for running the workflow&lt;br /&gt;
until the node in question. As mentioned before, Grappa automatically takes care&lt;br /&gt;
of resolving dependencies, i.e., upon executing a node all nodes having a yellow&lt;br /&gt;
or orange border and being predecessors of the node in question are also executed. Note that the execution of a workflow will fail if one of the nodes is still colored red, or if a node does not produce proper output data required by others. &lt;br /&gt;
&lt;br /&gt;
After successful execution of the workflow or a subset of nodes, the colors of&lt;br /&gt;
the corresponding nodes change to green indicating that result data are&lt;br /&gt;
available. For all terminal nodes having no successor the result frames are&lt;br /&gt;
automatically opened.&lt;br /&gt;
For all other nodes the result data can graphically be examined via the nodes'&lt;br /&gt;
context menus from which the result windows can manually be opened. &lt;br /&gt;
Once a node has been executed and is colored in green, it is not possible to&lt;br /&gt;
re-execute the node until its configuration, or at least the configuration of&lt;br /&gt;
one of its preceeding nodes, was changed.&lt;br /&gt;
&lt;br /&gt;
== Menubar == &lt;br /&gt;
The Grappa main window features a menubar offering quick&lt;br /&gt;
access to the basic functions of Grappa and some additional convenience functionality simplifying&lt;br /&gt;
the work with the editor. &lt;br /&gt;
&lt;br /&gt;
Via the menu item &amp;lt;code&amp;gt;'File'&amp;lt;/code&amp;gt; workflows can be saved to and read from&lt;br /&gt;
disk. By saving a workflow currently two files are written to disk, one containing the information&lt;br /&gt;
about the nodes and their configuration, and one storing graphical information&lt;br /&gt;
regarding the current workflow layout. Both are required to load a workflow&lt;br /&gt;
again. The first one has the extension &amp;lt;code&amp;gt;'.awf'&amp;lt;/code&amp;gt;, the latter one the&lt;br /&gt;
extension &amp;lt;code&amp;gt;'.awf.gui'&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Via the menu item &amp;lt;code&amp;gt;'Workflow'&amp;lt;/code&amp;gt; new workflows can be added and existing ones be renamed, &lt;br /&gt;
closed, executed or interrupted.  &lt;br /&gt;
Alida supports two categories of&lt;br /&gt;
operators, i.e. operators mainly dedicated to direct application by non-expert users&lt;br /&gt;
and operators for special tasks and expert usage. Via the item &amp;lt;code&amp;gt;'Options'&amp;lt;/code&amp;gt; the menubar allows&lt;br /&gt;
to switch the view in the selection menu between both categories. Also progress messages triggered by the&lt;br /&gt;
operator node during execution and optionally shown in the status panel can be enabled or&lt;br /&gt;
disabled via this menu. Finally, the menu item &amp;lt;code&amp;gt;'Help'&amp;lt;/code&amp;gt; grants access to Alida's online help system&lt;br /&gt;
where information about its functionality and descriptions of the operators can be found.&lt;/div&gt;</summary>
		<author><name>Posch</name></author>
	</entry>
	<entry>
		<id>https://alida.informatik.uni-halle.de/index.php?title=Java_quick&amp;diff=260</id>
		<title>Java quick</title>
		<link rel="alternate" type="text/html" href="https://alida.informatik.uni-halle.de/index.php?title=Java_quick&amp;diff=260"/>
		<updated>2016-02-23T22:30:50Z</updated>

		<summary type="html">&lt;p&gt;Posch: /* Graphical workflow editor: Grappa */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here we introduce Alida's operator concept with some code snippets of &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt; and sub-classed demo operators.&lt;br /&gt;
we focus on Alida's capabilities to automatically generate user interfaces.&lt;br /&gt;
&lt;br /&gt;
=  First operator =&lt;br /&gt;
&lt;br /&gt;
As a first example of an Alida operator we implement the row or column wise&lt;br /&gt;
sum for a 2D array of Doubles.&lt;br /&gt;
The class &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt; extending &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt; features three member variables&lt;br /&gt;
holding the input 2D array, an enum to indicate the mode of summation (&amp;lt;code&amp;gt;ROW&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;COLUMN&amp;lt;/code&amp;gt;), and&lt;br /&gt;
an 1D array of the sums to be computed and returned by the operator.&lt;br /&gt;
Alida requires only to annotate these members with the @Parameter annotation&lt;br /&gt;
which declares &lt;br /&gt;
&lt;br /&gt;
* the direction (&amp;lt;code&amp;gt;IN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;OUT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INOUT&amp;lt;/code&amp;gt;), &lt;br /&gt;
* whether the parameter is required,&lt;br /&gt;
* an optional textual description,&lt;br /&gt;
* and a label used, e.g. in the graphical user interface automatically generated&lt;br /&gt;
		to execute the operator.&lt;br /&gt;
&lt;br /&gt;
It is important to add a public standard constructor (without arguments)&lt;br /&gt;
to be able to use Java's reflection mechanism.&lt;br /&gt;
Finally, the abstract method &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; of &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt; has to be overridden&lt;br /&gt;
implementing the functionality of the operator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
				level=ALDAOperator.Level.APPLICATION)&lt;br /&gt;
public class MatrixSum extends ALDOperator {&lt;br /&gt;
&lt;br /&gt;
  /** Choose row or colum wise sum&lt;br /&gt;
    */&lt;br /&gt;
  public static enum SummarizeMode {&lt;br /&gt;
	/** row wise */&lt;br /&gt;
	ROW,&lt;br /&gt;
&lt;br /&gt;
	/** column wise */&lt;br /&gt;
	COLUMN&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Input matrix&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;Input matrix&amp;quot;, required = true, &lt;br /&gt;
  		direction = Parameter.Direction.IN, description = &amp;quot;Input matrix.&amp;quot;)&lt;br /&gt;
  private Double[][] matrix;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Mode of summarizing&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;Summarize mode&amp;quot;, required = true, &lt;br /&gt;
  		direction = Parameter.Direction.IN, description = &amp;quot;Sum over columns or rows?&amp;quot;)&lt;br /&gt;
  private SummarizeMode summarizeMode = SummarizeMode.ROW;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * 1D Array of sums.&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;sums&amp;quot;,  &lt;br /&gt;
  		direction = Parameter.Direction.OUT, description = &amp;quot;Row or column wise sums.&amp;quot;)&lt;br /&gt;
  private Double[] sums = null;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Default constructor.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public MatrixSum() throws ALDOperatorException {&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Constructor.&lt;br /&gt;
	 * &lt;br /&gt;
	 * @param matrix	Input matrix.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public MatrixSum(Double[] [] matrix) throws ALDOperatorException {&lt;br /&gt;
		this.matrix = matrix;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	protected void operate() {&lt;br /&gt;
		if ( matrix == null ) &lt;br /&gt;
			sums = null;&lt;br /&gt;
&lt;br /&gt;
		// calculate sums&lt;br /&gt;
		if ( summarizeMode == SummarizeMode.ROW ) {&lt;br /&gt;
			sums = new Double[matrix.length];&lt;br /&gt;
			for ( int row = 0 ; row &amp;lt; matrix.length ; row++ ) {&lt;br /&gt;
				sums[row] = 0.0;&lt;br /&gt;
				for ( int col = 0 ; col &amp;lt; matrix[0].length ; col++ )&lt;br /&gt;
					sums[row] += matrix[row][col];&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			sums = new Double[matrix[0].length];&lt;br /&gt;
			for ( int col = 0 ; col &amp;lt; matrix[0].length ; col++ ) {&lt;br /&gt;
				sums[col] = 0.0;&lt;br /&gt;
				for ( int row = 0 ; row &amp;lt; matrix.length ; row++ )&lt;br /&gt;
					sums[col] += matrix[row][col];&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These are the basic requirements for the operator to be used on the programming level.&lt;br /&gt;
An example of this use is included in the example in the next section.&lt;br /&gt;
&lt;br /&gt;
If we further annotate the class with &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
this is all needed to also facilitate &lt;br /&gt;
execution of this operator via a graphical and a command line user interface&lt;br /&gt;
automatically generated by Alida.&lt;br /&gt;
(Setting &amp;lt;code&amp;gt;level=ALDAOperator.Level.APPLICATION&amp;lt;/code&amp;gt; declares this operator an application&lt;br /&gt;
which is used in the GUI to control display of available operators.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Invocation via a graphical user interface ==&lt;br /&gt;
&lt;br /&gt;
Alida comes with one single application to execute Alida operators&lt;br /&gt;
with a automatically generated graphical user interface which may be&lt;br /&gt;
started from command line by&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunnerGUI&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will pop up a window to choose an operator to execute.&lt;br /&gt;
Arranged according to the package structure all operators allows to be executed&lt;br /&gt;
via the graphical user interface according to their &amp;lt;code&amp;gt;genericExecutionMode&amp;lt;/code&amp;gt;&lt;br /&gt;
are displayed.&lt;br /&gt;
Initially packages are unfolded up to a predefined depth.&lt;br /&gt;
Unfold the demo package, select &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt;, and choose the &amp;quot;Configure Operator&amp;quot; button.&lt;br /&gt;
This will pop up another window which allows you to configure the input parameters&lt;br /&gt;
of the operator.&lt;br /&gt;
Important note: After finishing to input the data matrix entering the final matrix elements&lt;br /&gt;
you have to select a previous matrix element due to subtle AWT details.&lt;br /&gt;
For the enumeration to select the mode Alida has automatically generated&lt;br /&gt;
a combo box to allow convenient selections.&lt;br /&gt;
If you are finished with the parameter configuration you want to invoke the operator&lt;br /&gt;
using the run button.&lt;br /&gt;
On completion of &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt; the interface will pop up the result window which allows you&lt;br /&gt;
to inspect the outcome of the operation.&lt;br /&gt;
&lt;br /&gt;
==   Invocation via command line ==&lt;br /&gt;
&lt;br /&gt;
The command line user interface of Alida allows to invoke all Alida operator&lt;br /&gt;
properly annotated to allows generic execution.&lt;br /&gt;
&lt;br /&gt;
You may invoke the matrix summation operator by&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix='[[1,2,3],[4,5,6]]' sums=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
which returns as result on standard output&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sums = [6.0,15.0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter values are specified as name=value pairs.&lt;br /&gt;
Alida's syntax for 2D array should be self-explanatory  from this example.&lt;br /&gt;
As the mode of summation is not supplied as a parameter its default is used&lt;br /&gt;
&lt;br /&gt;
Note, the command&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix='[[1,2,3],[4,5,6]]' &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
will return no output as the command line user interface returns only output parameters requested.&lt;br /&gt;
&lt;br /&gt;
The enumeration defined in &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt; is supported by the&lt;br /&gt;
user interface without further action required as shown in the next example.&lt;br /&gt;
This also demonstrates redirection of output&lt;br /&gt;
to a file, sums.out in this case.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix='[[1,2,3],[4,5,6]]' &lt;br /&gt;
	summarizeMode=COLUMN sums=@sums.out+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Input can be read from file as well:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix=@data sums=-+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where the file data contains the string defining the matrix, e.g., &amp;lt;code&amp;gt;[[1,2,3],[4,5,6]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Adding more features to an operator =&lt;br /&gt;
&lt;br /&gt;
We now generalize this example to realize not only summation over rows or&lt;br /&gt;
columns, but arbitrary summarizing operations.&lt;br /&gt;
This shows Alida's feature to allow an operator as parameter of another operator.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
First we generalize &amp;lt;code&amp;gt;ALDArraySum&amp;lt;/code&amp;gt; to the operator &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt;&lt;br /&gt;
which also takes a 2D array and an enum indicating the mode of marginalization (&amp;lt;code&amp;gt;ROW&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;COLUMN&amp;lt;/code&amp;gt;).&lt;br /&gt;
It takes an additional input parameter which specifies the operation to be applied on each&lt;br /&gt;
row or column.&lt;br /&gt;
&lt;br /&gt;
This parameter is itself an Alida operator and of type &amp;lt;code&amp;gt;ALDSummarizeArrayOp&amp;lt;/code&amp;gt;&lt;br /&gt;
which is implemented as an abstract class.&lt;br /&gt;
This abstract operator defines a summarizing operator&lt;br /&gt;
which takes a 1D array as input and returns a summarizing scalar.&lt;br /&gt;
As this is an abstract class there is no need to override the &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt;&lt;br /&gt;
method, however some getter and setter methods are provided.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  @Parameter( label= &amp;quot;Input 1D array&amp;quot;, required = true, &lt;br /&gt;
  		direction = Parameter.Direction.IN, description = &amp;quot;Input array (1D).&amp;quot;)&lt;br /&gt;
  protected Double[] data;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Summarizing scalar&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;Summarizing scalar&amp;quot;,  &lt;br /&gt;
  		direction = Parameter.Direction.OUT, description = &amp;quot;Summarizing scalar of the 1D arra&amp;quot;)&lt;br /&gt;
  protected Double summary = null;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Default constructor.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public ALDSummarizeArrayOp() throws ALDOperatorException {&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Returns the 1D array&lt;br /&gt;
	 * @return data array&lt;br /&gt;
	 */&lt;br /&gt;
	public Double[] getData() {&lt;br /&gt;
		return this.data;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Sets the 1D array&lt;br /&gt;
	 * @param data&lt;br /&gt;
	 */&lt;br /&gt;
	public void setData( Double[] data) {&lt;br /&gt;
		this.data = data;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we add concrete examples of such a summarizing operation, in this case&lt;br /&gt;
summation (&amp;lt;code&amp;gt;ALDArraySum&amp;lt;/code&amp;gt;), to return the mean (&amp;lt;code&amp;gt;ALDArrayMean&amp;lt;/code&amp;gt;), and the minimum (&amp;lt;code&amp;gt;ALDArrayMin&amp;lt;/code&amp;gt;).&lt;br /&gt;
Each implements the  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method and has to supply a standard constructor.&lt;br /&gt;
In this example we add another constructor for convenience.&lt;br /&gt;
This operators are declared as operators on the standard in contrast to &lt;br /&gt;
application level, as they are not expected to be invoked as an application.&lt;br /&gt;
However, setting the level to standard in the menu of the graphical user interface&lt;br /&gt;
stills allows their execution.&lt;br /&gt;
When extending the abstract super class it is necessary to annotate the&lt;br /&gt;
class with &amp;lt;code&amp;gt;@ALDDerivedClass&amp;lt;/code&amp;gt; in order to allow Alida's dataIO mechanism to find the derived class&lt;br /&gt;
in the automatically generated user interface.&lt;br /&gt;
This holds for other parameter types as well.&lt;br /&gt;
More specifically, if an instance of a class is to be supplied in an automatically &lt;br /&gt;
generated user interface as a value for a parameter of one of its super classes,&lt;br /&gt;
Alida requires the annotation &amp;lt;code&amp;gt;@ALDDerivedClass&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDDerivedClass&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
        level=ALDAOperator.Level.STANDARD)&lt;br /&gt;
public class ALDArraySum extends ALDSummarizeArrayOp {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void operate() {&lt;br /&gt;
        summary = 0.0;&lt;br /&gt;
        for ( int i = 0 ; i &amp;lt; data.length ; i++ )&lt;br /&gt;
            summary += data[i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Default constructor.&lt;br /&gt;
     * @throws ALDOperatorException&lt;br /&gt;
     */&lt;br /&gt;
    public ALDArraySum() throws ALDOperatorException {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we are ready to implement &lt;br /&gt;
the &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt; operator, which also demonstrates supplemental parameters.&lt;br /&gt;
This supplementals, e.g., control debugging output or returning of intermediate results.&lt;br /&gt;
For demo purposes we declare a supplemental input parameter &amp;lt;code&amp;gt;returnElapsedTime&amp;lt;/code&amp;gt;.&lt;br /&gt;
If it is set to true the operator will return the elapsed time in a second&lt;br /&gt;
supplemental parameter with direction output.&lt;br /&gt;
&lt;br /&gt;
Again, the operation is implemented in the  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method and the remainder of the&lt;br /&gt;
class supplies getter and setter methods for convenience.&lt;br /&gt;
The  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method give also an example of the invocation of an operator on the&lt;br /&gt;
programming level.&lt;br /&gt;
In this case, an instance of the operator is already passed as a parameter.&lt;br /&gt;
Its parameters are set, in this case each 1D array to be summarized in turn.&lt;br /&gt;
Upon return from the method &amp;lt;code&amp;gt;runOp()&amp;lt;/code&amp;gt; the results may be retrieved from the operator object,&lt;br /&gt;
in this example with the &amp;lt;code&amp;gt;getSummary()&amp;lt;/code&amp;gt; method.&lt;br /&gt;
Besides getter and setter methods as implemented in each operator&lt;br /&gt;
Alida provides also a generic get and set methods applicable to&lt;br /&gt;
all parameters of an operator.&lt;br /&gt;
Note, that the operator is not invoked by its  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method, but via&lt;br /&gt;
the &amp;lt;code&amp;gt;runOp()&amp;lt;/code&amp;gt; method implemented the base class &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt;.&lt;br /&gt;
This methods validates the parameters before invocation of  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt;.&lt;br /&gt;
Furthermore, it take all necessary measures for Alida's processing&lt;br /&gt;
history which automatically logs&lt;br /&gt;
all manipulative actions on the data and corresponding parameter settings. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
            level=ALDAOperator.Level.APPLICATION)&lt;br /&gt;
public class ApplyToMatrix extends ALDOperator {&lt;br /&gt;
&lt;br /&gt;
    /** Choose row or colum wise sum&lt;br /&gt;
      */&lt;br /&gt;
    public static enum SummarizeMode {&lt;br /&gt;
      /** row wise */&lt;br /&gt;
      ROW,&lt;br /&gt;
      /** column wise */&lt;br /&gt;
      COLUMN&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Input matrix&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Input matrix&amp;quot;, required = true, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Input matrix.&amp;quot;)&lt;br /&gt;
    private Double[][] matrix;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Mode of summarizing&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Summarize mode&amp;quot;, required = true, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Sum over columns or rows.&amp;quot;)&lt;br /&gt;
    private SummarizeMode summarizeMode = SummarizeMode.ROW;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Summarizing opererator&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Summarizing operator&amp;quot;, required = true, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Specifies the summarizing operation to apply&amp;quot;)&lt;br /&gt;
    private ALDSummarizeArrayOp summarizeOp;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 1D Array of summaries.&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;summaries&amp;quot;,  &lt;br /&gt;
          direction = Parameter.Direction.OUT, description = &amp;quot;Row or column wise summaries&amp;quot;)&lt;br /&gt;
    private Double[] summaries = null;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Supplemental to request elapsed time to be returned&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Return elapsed time&amp;quot;, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Request elapsed time consumed to be returned&amp;quot;,&lt;br /&gt;
        supplemental=true)&lt;br /&gt;
    private boolean returnElapsedTime = false;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Elpased time &lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Elapsed time&amp;quot;,  &lt;br /&gt;
          direction = Parameter.Direction.OUT, description = &amp;quot;Elapsed time of operation in milliseconds&amp;quot;,&lt;br /&gt;
        supplemental=true)&lt;br /&gt;
    private long elapsedTime;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Default constructor.&lt;br /&gt;
     * @throws ALDOperatorException&lt;br /&gt;
     */&lt;br /&gt;
    public ApplyToMatrix() throws ALDOperatorException {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Constructor.&lt;br /&gt;
     * &lt;br /&gt;
     * @param matrix    Input matrix.&lt;br /&gt;
     * @throws ALDOperatorException&lt;br /&gt;
     */&lt;br /&gt;
    public ApplyToMatrix(Double[] [] matrix) throws ALDOperatorException {&lt;br /&gt;
        this.matrix = matrix;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void operate() throws ALDOperatorException,ALDProcessingDAGException {&lt;br /&gt;
        if ( returnElapsedTime ) &lt;br /&gt;
            elapsedTime = System.currentTimeMillis();&lt;br /&gt;
&lt;br /&gt;
        if ( matrix == null ) &lt;br /&gt;
            summaries = null;&lt;br /&gt;
&lt;br /&gt;
        // calculate summaries&lt;br /&gt;
        if ( summarizeMode == SummarizeMode.ROW ) {&lt;br /&gt;
            summaries = new Double[matrix.length];&lt;br /&gt;
            for ( int row = 0 ; row &amp;lt; matrix.length ; row++ ) {&lt;br /&gt;
                summarizeOp.setData(matrix[row]);&lt;br /&gt;
                summarizeOp.runOp();&lt;br /&gt;
                summaries[row] = summarizeOp.getSummary();&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            summaries = new Double[matrix[0].length];&lt;br /&gt;
            Double[] tmp = new Double[matrix.length];&lt;br /&gt;
            for ( int col = 0 ; col &amp;lt; matrix[0].length ; col++ ) {&lt;br /&gt;
                for ( int row = 0 ; row &amp;lt; matrix.length ; row++ )&lt;br /&gt;
                    tmp[row] = matrix[row][col];&lt;br /&gt;
&lt;br /&gt;
                summarizeOp.setData(tmp);&lt;br /&gt;
                summarizeOp.runOp();&lt;br /&gt;
                summaries[col] = summarizeOp.getSummary();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if ( returnElapsedTime ) &lt;br /&gt;
            elapsedTime = System.currentTimeMillis() - elapsedTime;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // ==============================================================&lt;br /&gt;
    // Getter and setter methods&lt;br /&gt;
    /** Get value of returnElapsedTime.&lt;br /&gt;
      * Explanation: Request elapsed time consumed to be returned.&lt;br /&gt;
      * @return value of returnElapsedTime&lt;br /&gt;
      */&lt;br /&gt;
    public boolean getReturnElapsedTime(){&lt;br /&gt;
        return returnElapsedTime;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /** Set value of returnElapsedTime.&lt;br /&gt;
      * Explanation: Request elapsed time consumed to be returned.&lt;br /&gt;
      * @param value New value of returnElapsedTime&lt;br /&gt;
      */&lt;br /&gt;
    public void setReturnElapsedTime( boolean value){&lt;br /&gt;
        this.returnElapsedTime = value;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==   Invocation via a graphical user interface ==&lt;br /&gt;
&lt;br /&gt;
If the graphical interface is still running just select our new operator&lt;br /&gt;
and begin to configure it.&lt;br /&gt;
For the parameter summarizing operator you have a choice of all operators extending&lt;br /&gt;
the abstract operator &amp;lt;code&amp;gt;ALDSummarizeArrayOp&amp;lt;/code&amp;gt;.&lt;br /&gt;
All which is necessary on the implementation side is proper annotation of the extending&lt;br /&gt;
classes with &amp;lt;code&amp;gt;@ALDDerivedClass&amp;lt;/code&amp;gt;.&lt;br /&gt;
As the selected operator may have its own parameters you may want to configure it.&lt;br /&gt;
In our example this is not necessary as the input array is, of course, supplied&lt;br /&gt;
by the &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt; operator.&lt;br /&gt;
Do not forget to input your data before hitting the run button.&lt;br /&gt;
After return, again a result window give you the results of the operation.&lt;br /&gt;
Note, if you did not tick Return elapsed time&amp;quot; this window will show zero&lt;br /&gt;
for the time elapsed as the operator has not been request to stop the time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==   Invocation via command line ==&lt;br /&gt;
&lt;br /&gt;
When invoking the &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt; operator from command line&lt;br /&gt;
we have to handle derived classes as value for parameters.&lt;br /&gt;
In the graphical user interface Alida features a combo box where&lt;br /&gt;
we may choose from.&lt;br /&gt;
In the command line interface Alida allows to prefix the value of a parameter&lt;br /&gt;
with a derived class to be passed to the operator.&lt;br /&gt;
This is necessary as Alida as, of course, no way to itself&lt;br /&gt;
decide if and which derived class is to be used.&lt;br /&gt;
Alida's syntax is to enclose the class name in a dollar sign and a colon.&lt;br /&gt;
As evident in the following example, abbreviations are of the fully&lt;br /&gt;
qualified class name are accepted as long as they are unambiguous.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner Apply \&lt;br /&gt;
	matrix='[[1,2,3],[4,5,6]]' \&lt;br /&gt;
	summarizeMode=ROW \&lt;br /&gt;
	summarizeOp='&amp;lt;math&amp;gt;ALDArrayMean:{}' \&lt;br /&gt;
	summaries=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
results in&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
summaries = [2.0,5.0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ALDOpRunner&amp;lt;/code&amp;gt; may be persuaded to show all operators derived from &amp;lt;code&amp;gt;ALDSummarizeArrayOp&amp;lt;/code&amp;gt;&lt;br /&gt;
and known within the user interface if we enter an invalid class name:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner \&lt;br /&gt;
	Apply matrix='[[1,2,3],[4,5,6]]' \&lt;br /&gt;
	summarizeMode=ROW summarizeOp='&amp;lt;/math&amp;gt;dd:{}' \&lt;br /&gt;
	summaries=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
yields&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALDStandardizedDataIOCmdline::readData found 0 derived classes matching &amp;lt;dd&amp;gt;&lt;br /&gt;
      derived classes available:&lt;br /&gt;
	de.unihalle.informatik.Alida.demo.ALDArrayMean&lt;br /&gt;
	de.unihalle.informatik.Alida.demo.ALDArrayMin&lt;br /&gt;
	de.unihalle.informatik.Alida.demo.ALDArraySum&lt;br /&gt;
ERROR: reading parameter &amp;lt;summarizeOp&amp;gt; returns null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supplemental parameters are handled like other parameters&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner Apply \&lt;br /&gt;
	matrix='[[1,2,3],[4,5,6]]' \&lt;br /&gt;
	summarizeMode=COLUMN \&lt;br /&gt;
	summarizeOp='&amp;lt;math&amp;gt;ALDArrayMin:{}' \&lt;br /&gt;
	summaries=- \&lt;br /&gt;
	returnElapsedTime=true \&lt;br /&gt;
	elapsedTime=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
gives&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	summaries = [1.0,2.0,3.0]&lt;br /&gt;
	elapsedTime = 4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=   Adding more data types as parameters =&lt;br /&gt;
&lt;br /&gt;
Alida provides automatic IO of primitive data types, enumerations, arrays, collections,&lt;br /&gt;
and operators.&lt;br /&gt;
In addition so called parameterized classes are supported.&lt;br /&gt;
Any Java class may be declared to be a parameterized class in Alida&lt;br /&gt;
by annotating the class &amp;lt;code&amp;gt;@ALDParametrizedClass&amp;lt;/code&amp;gt; as shown in the&lt;br /&gt;
class &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt;.&lt;br /&gt;
All member variables to be known to and handled by Alida's user interface&lt;br /&gt;
simply need to be annotated with &amp;lt;code&amp;gt;@ALDClassParameter&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Here we implement a toy version of experimental data &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt;.&lt;br /&gt;
A complete experiment contains&lt;br /&gt;
data of a time series of measurements of variable length.&lt;br /&gt;
Additional information is a descriptive string, the time resolution in milliseconds,&lt;br /&gt;
and whether baseline correction has been applied.&lt;br /&gt;
&lt;br /&gt;
The class is annotated by &amp;lt;code&amp;gt;@ALDParametrizedClass&amp;lt;/code&amp;gt;, and&lt;br /&gt;
and all members to be handle in Alida'a user interfaces are&lt;br /&gt;
to be annotated with &amp;lt;code&amp;gt;@ALDParametrizedClass&amp;lt;/code&amp;gt;.&lt;br /&gt;
The label field has the same semantics as for parameters of operators.&lt;br /&gt;
These annotations are the only implementational overhead&lt;br /&gt;
to allow Alida to automatically generate user interfaces&lt;br /&gt;
where the parameterized class acts as a parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDParametrizedClass&lt;br /&gt;
public class ExperimentalData1D extends ALDData {&lt;br /&gt;
	&lt;br /&gt;
    /** Description */&lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;description&amp;quot;, dataIOOrder = 1)&lt;br /&gt;
    private String description = null;&lt;br /&gt;
&lt;br /&gt;
    /** The data  */&lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;data&amp;quot;, dataIOOrder = 2)&lt;br /&gt;
    private Double[] data = null;&lt;br /&gt;
&lt;br /&gt;
    /** Are the data baseline corrected? */&lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;Baseline corrected&amp;quot;,&lt;br /&gt;
    			dataIOOrder = 3)&lt;br /&gt;
    private boolean baselineCorrected = false;&lt;br /&gt;
    &lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;Time resolution in milliseconds&amp;quot;, dataIOOrder = 4)&lt;br /&gt;
    private Float timeResolution = Float.NaN;&lt;br /&gt;
&lt;br /&gt;
    /** &lt;br /&gt;
     * Standard constructor is required&lt;br /&gt;
      */&lt;br /&gt;
    public ExperimentalData1D() {&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /** Constructor for an experiment.&lt;br /&gt;
      * Baseline correction is assumed to be false and nothung known about&lt;br /&gt;
      * the time resolution.&lt;br /&gt;
      *&lt;br /&gt;
      * @param  description   a textual description of the experiment&lt;br /&gt;
      * @param  data   measurements&lt;br /&gt;
      */&lt;br /&gt;
    public ExperimentalData1D( String description, Double[] data) {    &lt;br /&gt;
        this( description, data, false, Float.NaN);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is shown below for a simple normalizing operator &amp;lt;code&amp;gt;SmoothData1D&amp;lt;/code&amp;gt;&lt;br /&gt;
which takes experimental data as input an returns a new instance&lt;br /&gt;
of &amp;lt;code&amp;gt;ExperimentalData&amp;lt;/code&amp;gt; which contains smoothed data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDDerivedClass&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
              level=ALDAOperator.Level.APPLICATION)&lt;br /&gt;
public class SmoothData1D extends ALDOperator {&lt;br /&gt;
&lt;br /&gt;
	public enum SmoothingMethod {&lt;br /&gt;
		MEDIAN, MEAN, GAUSSIAN&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/** 1D Experiment&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label= &amp;quot;1D Experiment&amp;quot;, required = true, &lt;br /&gt;
			direction = Parameter.Direction.IN, &lt;br /&gt;
			description = &amp;quot;1D Experiment&amp;quot;,&lt;br /&gt;
			dataIOOrder = 1)&lt;br /&gt;
	protected ExperimentalData1D experiment;&lt;br /&gt;
&lt;br /&gt;
	/** Smoothing method&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label = &amp;quot;Smoothing method&amp;quot;, required = true,&lt;br /&gt;
			direction = Parameter.Direction.IN,&lt;br /&gt;
			callback = &amp;quot;smoothingMethodChanged&amp;quot;,&lt;br /&gt;
			description = &amp;quot;Smoothing method&amp;quot;,&lt;br /&gt;
			paramModificationMode = ParameterModificationMode.MODIFIES_INTERFACE,&lt;br /&gt;
			dataIOOrder = 2)&lt;br /&gt;
	SmoothingMethod smoothingMethod = SmoothingMethod.MEDIAN;&lt;br /&gt;
&lt;br /&gt;
	/** Window width&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label = &amp;quot;Window width&amp;quot;, required = true,&lt;br /&gt;
			direction = Parameter.Direction.IN,&lt;br /&gt;
			description = &amp;quot;Window width (should be uneven)&amp;quot;,&lt;br /&gt;
			dataIOOrder = 3)&lt;br /&gt;
	Integer width = 3;&lt;br /&gt;
&lt;br /&gt;
	/** Standard deviation of Gaussian&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label = &amp;quot;Standdard deviation of Gaussian&amp;quot;, required = true,&lt;br /&gt;
			direction = Parameter.Direction.IN,&lt;br /&gt;
			description = &amp;quot;Standdard deviation of Gaussian&amp;quot;,&lt;br /&gt;
			dataIOOrder = 3)&lt;br /&gt;
	Float sigma = 1.0F;&lt;br /&gt;
&lt;br /&gt;
	/** Smoothed 1D Experiment&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label= &amp;quot;Smothed 1D Experiment&amp;quot;,  &lt;br /&gt;
			direction = Parameter.Direction.OUT, &lt;br /&gt;
			description = &amp;quot;Smothed1D Experiment&amp;quot;,&lt;br /&gt;
			dataIOOrder = 1)&lt;br /&gt;
	protected ExperimentalData1D smoothedExperiment;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Default constructor.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public SmoothData1D() throws ALDOperatorException {&lt;br /&gt;
		// necessary handle dynamic parameters correctly&lt;br /&gt;
		smoothingMethodChanged();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	protected void operate() {&lt;br /&gt;
		this.fireOperatorExecutionProgressEvent(&lt;br /&gt;
				new ALDOperatorExecutionProgressEvent(this, &lt;br /&gt;
						&amp;quot;Starting to smooth 1D Data...&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
		Double[] smoothedData;&lt;br /&gt;
		if ( smoothingMethod == SmoothingMethod.MEDIAN) {&lt;br /&gt;
			smoothedData = median( experiment.getData(), this.width);&lt;br /&gt;
		} else {&lt;br /&gt;
			smoothedData = smoothByConvolution();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		smoothedExperiment = new ExperimentalData1D( experiment.getDescription() + &amp;quot; (smoothed)&amp;quot;, &lt;br /&gt;
				smoothedData, experiment.isBaselineCorrected(), experiment.getTimeResolution());&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This mechanism applies in a recursive fashion, i.e. a parameterized class may&lt;br /&gt;
(recursively) contain a member variable which itself is a parametrized class.&lt;br /&gt;
Likewise, an operator acting as a parameter of another operator&lt;br /&gt;
may in turn have a parameter of type &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==   Invocation via a graphical user interface ==&lt;br /&gt;
&lt;br /&gt;
Invoking and configuring &amp;lt;code&amp;gt;SmoothData1D&amp;lt;/code&amp;gt; from the graphical user interface&lt;br /&gt;
shows as the only required parameter the experimental data.&lt;br /&gt;
This parameterized class can be configured in a separate  window&lt;br /&gt;
very similar to to configuration of operators.&lt;br /&gt;
Likewise the resulting normalized experimental data&lt;br /&gt;
may be inspected in their own window.&lt;br /&gt;
&lt;br /&gt;
Obviously this is a toy example, as we would not expect the measurements to&lt;br /&gt;
be entered manually, but rather stored and read from file in a specialized format.&lt;br /&gt;
This is one of the rare cases where &lt;br /&gt;
custom data IO provider need to be implemented, in this&lt;br /&gt;
case for &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==   Invocation via command line ==&lt;br /&gt;
&lt;br /&gt;
Again, invocation from command line is provided by Alida in an automatic&lt;br /&gt;
way with no further implementational overhead.&lt;br /&gt;
The syntax for parameterized classes es a comma separated list of name=value pairs&lt;br /&gt;
enclosed in curly brackets where name refers to annotated member variables of&lt;br /&gt;
the parameterized class.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner SmoothData1D \&lt;br /&gt;
	experiment='{ baselineCorrected=false , \&lt;br /&gt;
                      description=&amp;quot;my experiment&amp;quot; , \&lt;br /&gt;
                      data=[1.0,2.0,2.2,3.3,2.0,1.0,1.0,1.0,1.0,2.0,3.3,2.0] }' \&lt;br /&gt;
        smoothingMethod=GAUSSIAN \&lt;br /&gt;
	smoothedExperiment=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
yields&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
smoothedExperiment = { baselineCorrected=false , &lt;br /&gt;
    data=[1.28,1.85,2.37,2.76,2.05,1.23,1.01,1.01,1.23,2.05,2.73,2.35] , &lt;br /&gt;
    timeResolution=NaN , &lt;br /&gt;
    description=&amp;quot;my experiment&amp;quot; (smoothed) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If a class derived from &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt; was to be supplied to the operator,&lt;br /&gt;
the curly brackets can be prefixed by a derive class definition starting with a dollar sign&lt;br /&gt;
and ending with a colon as shown for the summarizing operators above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Graphical workflow editor: Grappa =&lt;br /&gt;
Most of the time complex data analysis tasks cannot be solved by only applying a&lt;br /&gt;
single operator to the data. Rather, selections of various operators need to be&lt;br /&gt;
combined into more sophisticated workflows to extract desired result data.&lt;br /&gt;
Alida inherently supports the development of such workflows. &lt;br /&gt;
Grappa, the Graphical Programming &lt;br /&gt;
Editor for Alida, allows for designing and manipulating workflows via graph edit operations, hence, offers &lt;br /&gt;
an intuitive interface and large flexibility for developing workflows.&lt;br /&gt;
&lt;br /&gt;
A workflow in Alida is defined as a graph data structure. Each node of the graph represents an Alida operator, while edges between &lt;br /&gt;
different nodes encode the flow of data and control. Each node owns a selection of input and output ports which are associated with the&lt;br /&gt;
operator's parameters. Consequently, edges are directed, i.e., an edge always&lt;br /&gt;
connects an output port of one operator node with an input port of another. Grappa visualizes such workflow graphs and supports manual editing, manipulation, and also workflow execution&lt;br /&gt;
and analysis of results.&lt;br /&gt;
&lt;br /&gt;
Grappa can be started using the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;java de.unihalle.informatik.Alida.tools.ALDGrappaRunner&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grappa's main window is&lt;br /&gt;
basically divided into two sections. On the left, the node selection menu is&lt;br /&gt;
visible, while on the right the workbench area is located. &lt;br /&gt;
In addition, the window features a menubar for configuring Grappa, loading and&lt;br /&gt;
saving workflows, and accessing the online help. At the bottom of the window a&lt;br /&gt;
panel displaying status and progress messages is available.&lt;br /&gt;
&lt;br /&gt;
== Operator node selection menu == &lt;br /&gt;
In the selection menu on the left of Grappa's main window all Alida operators found in the &lt;br /&gt;
classpath upon initialization are listed as potential nodes for Grappa workflows. &lt;br /&gt;
In analogy to the graphical user interface&lt;br /&gt;
they are arranged in a hierarchical ordering &lt;br /&gt;
according to their package structure. The different package subtrees can be&lt;br /&gt;
folded and unfolded by double-clicking on a folder's name in the selection tree,&lt;br /&gt;
or by single-clicking on the circle displayed left to the folder icon. Above the&lt;br /&gt;
tree view an operator filter is available which allows to select operators&lt;br /&gt;
according to their names. For filtering, enter a substring into the text&lt;br /&gt;
field and press the return key. &lt;br /&gt;
Operator nodes can be added to a workflow by double-clicking on the operator&lt;br /&gt;
name. A new operator node is then instantiated in the top left corner of the&lt;br /&gt;
corresponding workflow tab, i.e., the active workflow (see below).&lt;br /&gt;
Alternatively, an operator can be selected by clicking once on its name &lt;br /&gt;
and afterwards clicking once on the position in the workflow tab where the new&lt;br /&gt;
operator node should be positioned.&lt;br /&gt;
 &lt;br /&gt;
== Workbench area == &lt;br /&gt;
Workflows can be designed and executed in the workbench area on the right of the main window. It allows for instantiating&lt;br /&gt;
multiple workflows in parallel where each workflow is linked to an individual tab of the workbench panel. &lt;br /&gt;
A new workflow tab can be added via the item &amp;lt;code&amp;gt;'New'&amp;lt;/code&amp;gt; in the context menu of the workbench. &lt;br /&gt;
The context menu is displayed upon right-click on an empty location of the workbench area. &lt;br /&gt;
Upon selecting the item &amp;lt;code&amp;gt;'New'&amp;lt;/code&amp;gt; a new tab is added to the workbench panel.&lt;br /&gt;
By default, the name of the new workflow is 'Untitled', but it can easily be&lt;br /&gt;
renamed via the corresponding item &amp;lt;code&amp;gt;'Rename'&amp;lt;/code&amp;gt; in the context menu. Via this&lt;br /&gt;
menu it is also possible to close a workflow tab if no longer required. Note&lt;br /&gt;
that its contents are lost if not saved before! The currently selected tab in&lt;br /&gt;
the workbench contains the active workflow which can be edited and where&lt;br /&gt;
new operator nodes can be added as outlined in the previous subsection.&lt;br /&gt;
&lt;br /&gt;
For each operator selected via the selection menu, a&lt;br /&gt;
node in terms of a rectangle is added to the currently active workflow. Above the rectangle &lt;br /&gt;
the name of the operator is displayed, while on its left and right side the operator's input and output ports are shown as circles and &lt;br /&gt;
squares. Circles are associated with operator parameters of directions &amp;lt;code&amp;gt;IN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;OUT&amp;lt;/code&amp;gt;, while squares refer to parameters with&lt;br /&gt;
direction &amp;lt;code&amp;gt;INOUT&amp;lt;/code&amp;gt;. The latter ports are duplicated on both sides of the node.&lt;br /&gt;
The colors of the circles indicate their type. Blue circles refer to required parameters, yellow circles are associated with optional &lt;br /&gt;
parameters, and red circles are linked to supplemental parameters. To the left and right of the ports,&lt;br /&gt;
respectively, the name of the corresponding parameters are written.  &lt;br /&gt;
Once operator nodes have been added to a workflow, they can easily be dragged&lt;br /&gt;
and repositioned as well as resized via intuitive mouse actions. &lt;br /&gt;
&lt;br /&gt;
For each operator node a context menu can be popped up by clicking the node with the right mouse&lt;br /&gt;
button. From this menu it is possible to delete the node (item &amp;lt;code&amp;gt;'Remove'&amp;lt;/code&amp;gt;), or to configure the&lt;br /&gt;
view via the item &amp;lt;code&amp;gt;'Options'&amp;lt;/code&amp;gt;. It, e.g., allows to select the set of operator parameter ports&lt;br /&gt;
to be shown, i.e. either all parameters or just the subset of non-expert parameters. From the&lt;br /&gt;
context menu of a node it is also possible to configure the node (item &amp;lt;code&amp;gt;'Configure'&amp;lt;/code&amp;gt;).  &lt;br /&gt;
&lt;br /&gt;
On selecting the item for&lt;br /&gt;
configuration, a window is displayed which allows to enter parameter values.&lt;br /&gt;
The window is automatically generated, i.e., actually the same &lt;br /&gt;
mechanisms as for executing operators via the graphical operator runner are applied. Accordingly, &lt;br /&gt;
the configuration window is identical to the corresponding operator control&lt;br /&gt;
window and shares the same layout, except for the control buttons and the batch&lt;br /&gt;
mode tab which are missing.&lt;br /&gt;
&lt;br /&gt;
Operator parameters for a certain node can directly be specified via the&lt;br /&gt;
configuration window, they can be loaded from a proper parameter file in XML&lt;br /&gt;
format, or they&lt;br /&gt;
can be configured by dragging edges between ports of different nodes with the&lt;br /&gt;
mouse to propagate output data from one node as input data to another. To add an&lt;br /&gt;
edge, move the mouse over an output port of a node until the port is surrounded&lt;br /&gt;
by a green square, then press the left mouse button. Subsequently, while keeping&lt;br /&gt;
the button pressed, move the mouse to the desired input port of another node.&lt;br /&gt;
Once a green rectangle shows up around the target input port, release the&lt;br /&gt;
button. Note that on dragging edges Grappa performs type and validity checks.&lt;br /&gt;
Only ports being associated with compatible parameter data types can be&lt;br /&gt;
linked to each other. Two parameter data types are compatible if they are&lt;br /&gt;
either equal, the target data type is a super class of the source data type, or&lt;br /&gt;
if Alida has access to a converter allowing to transform the source data type&lt;br /&gt;
into the target type. Also&lt;br /&gt;
edges are forbidden that would induce cycles into the workflow graph.&lt;br /&gt;
&lt;br /&gt;
Nodes in a workflow can have different states indicated by the color of their border. &lt;br /&gt;
Red framed nodes are not ready for execution, i.e., their configuration is not&lt;br /&gt;
complete. If a node is readily configured and can directly be executed, its&lt;br /&gt;
border has a yellow color, while nodes that are configured, however, require&lt;br /&gt;
additional input data from preceeding operator nodes have an orange color.&lt;br /&gt;
Prior to executing these orange nodes it is, thus, necessary to execute the&lt;br /&gt;
preceeding nodes first.&lt;br /&gt;
Note that Grappa takes care of such dependencies, i.e., automatically executes&lt;br /&gt;
nodes first from which result data is required for proper workflow or node&lt;br /&gt;
execution. The state of a node is updated by Grappa in real-time, i.e., each&lt;br /&gt;
change in its configuration directly invokes internal checkings and may result in a change of the node's color.&lt;br /&gt;
&lt;br /&gt;
Grappa offers various modes for executing a&lt;br /&gt;
complete workflow or parts of it.&lt;br /&gt;
From the context menu of the workbench the item &lt;br /&gt;
&amp;lt;code&amp;gt;'Run'&amp;lt;/code&amp;gt; is available which executes the complete workflow, i.e., all nodes&lt;br /&gt;
currently present on the tab. From the context menu of a single node and its &amp;lt;code&amp;gt;'Run\ldots'&amp;lt;/code&amp;gt; item also the whole workflow can be executed (item &amp;lt;code&amp;gt;'Workflow'&amp;lt;/code&amp;gt;).&lt;br /&gt;
Alternatively, via the item &amp;lt;code&amp;gt;'Nodes from here'&amp;lt;/code&amp;gt; it is possible to only execute the nodes of the workflow subgraph for which the &lt;br /&gt;
current node is the root (of course considering required dependencies). Finally, the item &amp;lt;code&amp;gt;'Node'&amp;lt;/code&amp;gt; allows for running the workflow&lt;br /&gt;
until the node in question. As mentioned before, Grappa automatically takes care&lt;br /&gt;
of resolving dependencies, i.e., upon executing a node all nodes having a yellow&lt;br /&gt;
or orange border and being predecessors of the node in question are also executed. Note that the execution of a workflow will fail if one of the nodes is still colored red, or if a node does not produce proper output data required by others. &lt;br /&gt;
&lt;br /&gt;
After successful execution of the workflow or a subset of nodes, the colors of&lt;br /&gt;
the corresponding nodes change to green indicating that result data are&lt;br /&gt;
available. For all terminal nodes having no successor the result frames are&lt;br /&gt;
automatically opened.&lt;br /&gt;
For all other nodes the result data can graphically be examined via the nodes'&lt;br /&gt;
context menus from which the result windows can manually be opened. &lt;br /&gt;
Once a node has been executed and is colored in green, it is not possible to&lt;br /&gt;
re-execute the node until its configuration, or at least the configuration of&lt;br /&gt;
one of its preceeding nodes, was changed.&lt;br /&gt;
&lt;br /&gt;
== Menubar and shortcuts == &lt;br /&gt;
The Grappa main window features a menubar offering quick&lt;br /&gt;
access to the basic functions of Grappa and some additional convenience functionality simplifying&lt;br /&gt;
the work with the editor. &lt;br /&gt;
&lt;br /&gt;
Via the menu item &amp;lt;code&amp;gt;'File'&amp;lt;/code&amp;gt; workflows can be saved to and read from&lt;br /&gt;
disk. By saving a workflow currently two files are written to disk, one containing the information&lt;br /&gt;
about the nodes and their configuration, and one storing graphical information&lt;br /&gt;
regarding the current workflow layout. Both are required to load a workflow&lt;br /&gt;
again. The first one has the extension &amp;lt;code&amp;gt;'.awf'&amp;lt;/code&amp;gt;, the latter one the&lt;br /&gt;
extension &amp;lt;code&amp;gt;'.awf.gui'&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Via the menu item &amp;lt;code&amp;gt;'Workflow'&amp;lt;/code&amp;gt; new workflows can be added and existing ones be renamed, &lt;br /&gt;
closed, executed or interrupted.  &lt;br /&gt;
Alida supports two categories of&lt;br /&gt;
operators, i.e. operators mainly dedicated to direct application by non-expert users&lt;br /&gt;
and operators for special tasks and expert usage. Via the item &amp;lt;code&amp;gt;'Options'&amp;lt;/code&amp;gt; the menubar allows&lt;br /&gt;
to switch the view in the selection menu between both categories. Also progress messages triggered by the&lt;br /&gt;
operator node during execution and optionally shown in the status panel can be enabled or&lt;br /&gt;
disabled via this menu. Finally, the menu item &amp;lt;code&amp;gt;'Help'&amp;lt;/code&amp;gt; grants access to Alida's online help system&lt;br /&gt;
where information about its functionality and descriptions of the operators can be found.&lt;/div&gt;</summary>
		<author><name>Posch</name></author>
	</entry>
	<entry>
		<id>https://alida.informatik.uni-halle.de/index.php?title=Java_quick&amp;diff=259</id>
		<title>Java quick</title>
		<link rel="alternate" type="text/html" href="https://alida.informatik.uni-halle.de/index.php?title=Java_quick&amp;diff=259"/>
		<updated>2016-02-23T22:20:49Z</updated>

		<summary type="html">&lt;p&gt;Posch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here we introduce Alida's operator concept with some code snippets of &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt; and sub-classed demo operators.&lt;br /&gt;
we focus on Alida's capabilities to automatically generate user interfaces.&lt;br /&gt;
&lt;br /&gt;
=  First operator =&lt;br /&gt;
&lt;br /&gt;
As a first example of an Alida operator we implement the row or column wise&lt;br /&gt;
sum for a 2D array of Doubles.&lt;br /&gt;
The class &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt; extending &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt; features three member variables&lt;br /&gt;
holding the input 2D array, an enum to indicate the mode of summation (&amp;lt;code&amp;gt;ROW&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;COLUMN&amp;lt;/code&amp;gt;), and&lt;br /&gt;
an 1D array of the sums to be computed and returned by the operator.&lt;br /&gt;
Alida requires only to annotate these members with the @Parameter annotation&lt;br /&gt;
which declares &lt;br /&gt;
&lt;br /&gt;
* the direction (&amp;lt;code&amp;gt;IN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;OUT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INOUT&amp;lt;/code&amp;gt;), &lt;br /&gt;
* whether the parameter is required,&lt;br /&gt;
* an optional textual description,&lt;br /&gt;
* and a label used, e.g. in the graphical user interface automatically generated&lt;br /&gt;
		to execute the operator.&lt;br /&gt;
&lt;br /&gt;
It is important to add a public standard constructor (without arguments)&lt;br /&gt;
to be able to use Java's reflection mechanism.&lt;br /&gt;
Finally, the abstract method &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; of &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt; has to be overridden&lt;br /&gt;
implementing the functionality of the operator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
				level=ALDAOperator.Level.APPLICATION)&lt;br /&gt;
public class MatrixSum extends ALDOperator {&lt;br /&gt;
&lt;br /&gt;
  /** Choose row or colum wise sum&lt;br /&gt;
    */&lt;br /&gt;
  public static enum SummarizeMode {&lt;br /&gt;
	/** row wise */&lt;br /&gt;
	ROW,&lt;br /&gt;
&lt;br /&gt;
	/** column wise */&lt;br /&gt;
	COLUMN&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Input matrix&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;Input matrix&amp;quot;, required = true, &lt;br /&gt;
  		direction = Parameter.Direction.IN, description = &amp;quot;Input matrix.&amp;quot;)&lt;br /&gt;
  private Double[][] matrix;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Mode of summarizing&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;Summarize mode&amp;quot;, required = true, &lt;br /&gt;
  		direction = Parameter.Direction.IN, description = &amp;quot;Sum over columns or rows?&amp;quot;)&lt;br /&gt;
  private SummarizeMode summarizeMode = SummarizeMode.ROW;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * 1D Array of sums.&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;sums&amp;quot;,  &lt;br /&gt;
  		direction = Parameter.Direction.OUT, description = &amp;quot;Row or column wise sums.&amp;quot;)&lt;br /&gt;
  private Double[] sums = null;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Default constructor.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public MatrixSum() throws ALDOperatorException {&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Constructor.&lt;br /&gt;
	 * &lt;br /&gt;
	 * @param matrix	Input matrix.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public MatrixSum(Double[] [] matrix) throws ALDOperatorException {&lt;br /&gt;
		this.matrix = matrix;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	protected void operate() {&lt;br /&gt;
		if ( matrix == null ) &lt;br /&gt;
			sums = null;&lt;br /&gt;
&lt;br /&gt;
		// calculate sums&lt;br /&gt;
		if ( summarizeMode == SummarizeMode.ROW ) {&lt;br /&gt;
			sums = new Double[matrix.length];&lt;br /&gt;
			for ( int row = 0 ; row &amp;lt; matrix.length ; row++ ) {&lt;br /&gt;
				sums[row] = 0.0;&lt;br /&gt;
				for ( int col = 0 ; col &amp;lt; matrix[0].length ; col++ )&lt;br /&gt;
					sums[row] += matrix[row][col];&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			sums = new Double[matrix[0].length];&lt;br /&gt;
			for ( int col = 0 ; col &amp;lt; matrix[0].length ; col++ ) {&lt;br /&gt;
				sums[col] = 0.0;&lt;br /&gt;
				for ( int row = 0 ; row &amp;lt; matrix.length ; row++ )&lt;br /&gt;
					sums[col] += matrix[row][col];&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These are the basic requirements for the operator to be used on the programming level.&lt;br /&gt;
An example of this use is included in the example in the next section.&lt;br /&gt;
&lt;br /&gt;
If we further annotate the class with &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
this is all needed to also facilitate &lt;br /&gt;
execution of this operator via a graphical and a command line user interface&lt;br /&gt;
automatically generated by Alida.&lt;br /&gt;
(Setting &amp;lt;code&amp;gt;level=ALDAOperator.Level.APPLICATION&amp;lt;/code&amp;gt; declares this operator an application&lt;br /&gt;
which is used in the GUI to control display of available operators.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Invocation via a graphical user interface ==&lt;br /&gt;
&lt;br /&gt;
Alida comes with one single application to execute Alida operators&lt;br /&gt;
with a automatically generated graphical user interface which may be&lt;br /&gt;
started from command line by&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunnerGUI&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will pop up a window to choose an operator to execute.&lt;br /&gt;
Arranged according to the package structure all operators allows to be executed&lt;br /&gt;
via the graphical user interface according to their &amp;lt;code&amp;gt;genericExecutionMode&amp;lt;/code&amp;gt;&lt;br /&gt;
are displayed.&lt;br /&gt;
Initially packages are unfolded up to a predefined depth.&lt;br /&gt;
Unfold the demo package, select &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt;, and choose the &amp;quot;Configure Operator&amp;quot; button.&lt;br /&gt;
This will pop up another window which allows you to configure the input parameters&lt;br /&gt;
of the operator.&lt;br /&gt;
Important note: After finishing to input the data matrix entering the final matrix elements&lt;br /&gt;
you have to select a previous matrix element due to subtle AWT details.&lt;br /&gt;
For the enumeration to select the mode Alida has automatically generated&lt;br /&gt;
a combo box to allow convenient selections.&lt;br /&gt;
If you are finished with the parameter configuration you want to invoke the operator&lt;br /&gt;
using the run button.&lt;br /&gt;
On completion of &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt; the interface will pop up the result window which allows you&lt;br /&gt;
to inspect the outcome of the operation.&lt;br /&gt;
&lt;br /&gt;
==   Invocation via command line ==&lt;br /&gt;
&lt;br /&gt;
The command line user interface of Alida allows to invoke all Alida operator&lt;br /&gt;
properly annotated to allows generic execution.&lt;br /&gt;
&lt;br /&gt;
You may invoke the matrix summation operator by&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix='[[1,2,3],[4,5,6]]' sums=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
which returns as result on standard output&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sums = [6.0,15.0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter values are specified as name=value pairs.&lt;br /&gt;
Alida's syntax for 2D array should be self-explanatory  from this example.&lt;br /&gt;
As the mode of summation is not supplied as a parameter its default is used&lt;br /&gt;
&lt;br /&gt;
Note, the command&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix='[[1,2,3],[4,5,6]]' &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
will return no output as the command line user interface returns only output parameters requested.&lt;br /&gt;
&lt;br /&gt;
The enumeration defined in &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt; is supported by the&lt;br /&gt;
user interface without further action required as shown in the next example.&lt;br /&gt;
This also demonstrates redirection of output&lt;br /&gt;
to a file, sums.out in this case.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix='[[1,2,3],[4,5,6]]' &lt;br /&gt;
	summarizeMode=COLUMN sums=@sums.out+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Input can be read from file as well:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix=@data sums=-+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where the file data contains the string defining the matrix, e.g., &amp;lt;code&amp;gt;[[1,2,3],[4,5,6]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Adding more features to an operator =&lt;br /&gt;
&lt;br /&gt;
We now generalize this example to realize not only summation over rows or&lt;br /&gt;
columns, but arbitrary summarizing operations.&lt;br /&gt;
This shows Alida's feature to allow an operator as parameter of another operator.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
First we generalize &amp;lt;code&amp;gt;ALDArraySum&amp;lt;/code&amp;gt; to the operator &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt;&lt;br /&gt;
which also takes a 2D array and an enum indicating the mode of marginalization (&amp;lt;code&amp;gt;ROW&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;COLUMN&amp;lt;/code&amp;gt;).&lt;br /&gt;
It takes an additional input parameter which specifies the operation to be applied on each&lt;br /&gt;
row or column.&lt;br /&gt;
&lt;br /&gt;
This parameter is itself an Alida operator and of type &amp;lt;code&amp;gt;ALDSummarizeArrayOp&amp;lt;/code&amp;gt;&lt;br /&gt;
which is implemented as an abstract class.&lt;br /&gt;
This abstract operator defines a summarizing operator&lt;br /&gt;
which takes a 1D array as input and returns a summarizing scalar.&lt;br /&gt;
As this is an abstract class there is no need to override the &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt;&lt;br /&gt;
method, however some getter and setter methods are provided.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  @Parameter( label= &amp;quot;Input 1D array&amp;quot;, required = true, &lt;br /&gt;
  		direction = Parameter.Direction.IN, description = &amp;quot;Input array (1D).&amp;quot;)&lt;br /&gt;
  protected Double[] data;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Summarizing scalar&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;Summarizing scalar&amp;quot;,  &lt;br /&gt;
  		direction = Parameter.Direction.OUT, description = &amp;quot;Summarizing scalar of the 1D arra&amp;quot;)&lt;br /&gt;
  protected Double summary = null;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Default constructor.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public ALDSummarizeArrayOp() throws ALDOperatorException {&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Returns the 1D array&lt;br /&gt;
	 * @return data array&lt;br /&gt;
	 */&lt;br /&gt;
	public Double[] getData() {&lt;br /&gt;
		return this.data;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Sets the 1D array&lt;br /&gt;
	 * @param data&lt;br /&gt;
	 */&lt;br /&gt;
	public void setData( Double[] data) {&lt;br /&gt;
		this.data = data;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we add concrete examples of such a summarizing operation, in this case&lt;br /&gt;
summation (&amp;lt;code&amp;gt;ALDArraySum&amp;lt;/code&amp;gt;), to return the mean (&amp;lt;code&amp;gt;ALDArrayMean&amp;lt;/code&amp;gt;), and the minimum (&amp;lt;code&amp;gt;ALDArrayMin&amp;lt;/code&amp;gt;).&lt;br /&gt;
Each implements the  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method and has to supply a standard constructor.&lt;br /&gt;
In this example we add another constructor for convenience.&lt;br /&gt;
This operators are declared as operators on the standard in contrast to &lt;br /&gt;
application level, as they are not expected to be invoked as an application.&lt;br /&gt;
However, setting the level to standard in the menu of the graphical user interface&lt;br /&gt;
stills allows their execution.&lt;br /&gt;
When extending the abstract super class it is necessary to annotate the&lt;br /&gt;
class with &amp;lt;code&amp;gt;@ALDDerivedClass&amp;lt;/code&amp;gt; in order to allow Alida's dataIO mechanism to find the derived class&lt;br /&gt;
in the automatically generated user interface.&lt;br /&gt;
This holds for other parameter types as well.&lt;br /&gt;
More specifically, if an instance of a class is to be supplied in an automatically &lt;br /&gt;
generated user interface as a value for a parameter of one of its super classes,&lt;br /&gt;
Alida requires the annotation &amp;lt;code&amp;gt;@ALDDerivedClass&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDDerivedClass&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
        level=ALDAOperator.Level.STANDARD)&lt;br /&gt;
public class ALDArraySum extends ALDSummarizeArrayOp {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void operate() {&lt;br /&gt;
        summary = 0.0;&lt;br /&gt;
        for ( int i = 0 ; i &amp;lt; data.length ; i++ )&lt;br /&gt;
            summary += data[i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Default constructor.&lt;br /&gt;
     * @throws ALDOperatorException&lt;br /&gt;
     */&lt;br /&gt;
    public ALDArraySum() throws ALDOperatorException {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we are ready to implement &lt;br /&gt;
the &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt; operator, which also demonstrates supplemental parameters.&lt;br /&gt;
This supplementals, e.g., control debugging output or returning of intermediate results.&lt;br /&gt;
For demo purposes we declare a supplemental input parameter &amp;lt;code&amp;gt;returnElapsedTime&amp;lt;/code&amp;gt;.&lt;br /&gt;
If it is set to true the operator will return the elapsed time in a second&lt;br /&gt;
supplemental parameter with direction output.&lt;br /&gt;
&lt;br /&gt;
Again, the operation is implemented in the  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method and the remainder of the&lt;br /&gt;
class supplies getter and setter methods for convenience.&lt;br /&gt;
The  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method give also an example of the invocation of an operator on the&lt;br /&gt;
programming level.&lt;br /&gt;
In this case, an instance of the operator is already passed as a parameter.&lt;br /&gt;
Its parameters are set, in this case each 1D array to be summarized in turn.&lt;br /&gt;
Upon return from the method &amp;lt;code&amp;gt;runOp()&amp;lt;/code&amp;gt; the results may be retrieved from the operator object,&lt;br /&gt;
in this example with the &amp;lt;code&amp;gt;getSummary()&amp;lt;/code&amp;gt; method.&lt;br /&gt;
Besides getter and setter methods as implemented in each operator&lt;br /&gt;
Alida provides also a generic get and set methods applicable to&lt;br /&gt;
all parameters of an operator.&lt;br /&gt;
Note, that the operator is not invoked by its  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method, but via&lt;br /&gt;
the &amp;lt;code&amp;gt;runOp()&amp;lt;/code&amp;gt; method implemented the base class &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt;.&lt;br /&gt;
This methods validates the parameters before invocation of  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt;.&lt;br /&gt;
Furthermore, it take all necessary measures for Alida's processing&lt;br /&gt;
history which automatically logs&lt;br /&gt;
all manipulative actions on the data and corresponding parameter settings. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
            level=ALDAOperator.Level.APPLICATION)&lt;br /&gt;
public class ApplyToMatrix extends ALDOperator {&lt;br /&gt;
&lt;br /&gt;
    /** Choose row or colum wise sum&lt;br /&gt;
      */&lt;br /&gt;
    public static enum SummarizeMode {&lt;br /&gt;
      /** row wise */&lt;br /&gt;
      ROW,&lt;br /&gt;
      /** column wise */&lt;br /&gt;
      COLUMN&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Input matrix&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Input matrix&amp;quot;, required = true, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Input matrix.&amp;quot;)&lt;br /&gt;
    private Double[][] matrix;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Mode of summarizing&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Summarize mode&amp;quot;, required = true, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Sum over columns or rows.&amp;quot;)&lt;br /&gt;
    private SummarizeMode summarizeMode = SummarizeMode.ROW;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Summarizing opererator&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Summarizing operator&amp;quot;, required = true, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Specifies the summarizing operation to apply&amp;quot;)&lt;br /&gt;
    private ALDSummarizeArrayOp summarizeOp;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 1D Array of summaries.&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;summaries&amp;quot;,  &lt;br /&gt;
          direction = Parameter.Direction.OUT, description = &amp;quot;Row or column wise summaries&amp;quot;)&lt;br /&gt;
    private Double[] summaries = null;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Supplemental to request elapsed time to be returned&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Return elapsed time&amp;quot;, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Request elapsed time consumed to be returned&amp;quot;,&lt;br /&gt;
        supplemental=true)&lt;br /&gt;
    private boolean returnElapsedTime = false;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Elpased time &lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Elapsed time&amp;quot;,  &lt;br /&gt;
          direction = Parameter.Direction.OUT, description = &amp;quot;Elapsed time of operation in milliseconds&amp;quot;,&lt;br /&gt;
        supplemental=true)&lt;br /&gt;
    private long elapsedTime;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Default constructor.&lt;br /&gt;
     * @throws ALDOperatorException&lt;br /&gt;
     */&lt;br /&gt;
    public ApplyToMatrix() throws ALDOperatorException {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Constructor.&lt;br /&gt;
     * &lt;br /&gt;
     * @param matrix    Input matrix.&lt;br /&gt;
     * @throws ALDOperatorException&lt;br /&gt;
     */&lt;br /&gt;
    public ApplyToMatrix(Double[] [] matrix) throws ALDOperatorException {&lt;br /&gt;
        this.matrix = matrix;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void operate() throws ALDOperatorException,ALDProcessingDAGException {&lt;br /&gt;
        if ( returnElapsedTime ) &lt;br /&gt;
            elapsedTime = System.currentTimeMillis();&lt;br /&gt;
&lt;br /&gt;
        if ( matrix == null ) &lt;br /&gt;
            summaries = null;&lt;br /&gt;
&lt;br /&gt;
        // calculate summaries&lt;br /&gt;
        if ( summarizeMode == SummarizeMode.ROW ) {&lt;br /&gt;
            summaries = new Double[matrix.length];&lt;br /&gt;
            for ( int row = 0 ; row &amp;lt; matrix.length ; row++ ) {&lt;br /&gt;
                summarizeOp.setData(matrix[row]);&lt;br /&gt;
                summarizeOp.runOp();&lt;br /&gt;
                summaries[row] = summarizeOp.getSummary();&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            summaries = new Double[matrix[0].length];&lt;br /&gt;
            Double[] tmp = new Double[matrix.length];&lt;br /&gt;
            for ( int col = 0 ; col &amp;lt; matrix[0].length ; col++ ) {&lt;br /&gt;
                for ( int row = 0 ; row &amp;lt; matrix.length ; row++ )&lt;br /&gt;
                    tmp[row] = matrix[row][col];&lt;br /&gt;
&lt;br /&gt;
                summarizeOp.setData(tmp);&lt;br /&gt;
                summarizeOp.runOp();&lt;br /&gt;
                summaries[col] = summarizeOp.getSummary();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if ( returnElapsedTime ) &lt;br /&gt;
            elapsedTime = System.currentTimeMillis() - elapsedTime;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // ==============================================================&lt;br /&gt;
    // Getter and setter methods&lt;br /&gt;
    /** Get value of returnElapsedTime.&lt;br /&gt;
      * Explanation: Request elapsed time consumed to be returned.&lt;br /&gt;
      * @return value of returnElapsedTime&lt;br /&gt;
      */&lt;br /&gt;
    public boolean getReturnElapsedTime(){&lt;br /&gt;
        return returnElapsedTime;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /** Set value of returnElapsedTime.&lt;br /&gt;
      * Explanation: Request elapsed time consumed to be returned.&lt;br /&gt;
      * @param value New value of returnElapsedTime&lt;br /&gt;
      */&lt;br /&gt;
    public void setReturnElapsedTime( boolean value){&lt;br /&gt;
        this.returnElapsedTime = value;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==   Invocation via a graphical user interface ==&lt;br /&gt;
&lt;br /&gt;
If the graphical interface is still running just select our new operator&lt;br /&gt;
and begin to configure it.&lt;br /&gt;
For the parameter summarizing operator you have a choice of all operators extending&lt;br /&gt;
the abstract operator &amp;lt;code&amp;gt;ALDSummarizeArrayOp&amp;lt;/code&amp;gt;.&lt;br /&gt;
All which is necessary on the implementation side is proper annotation of the extending&lt;br /&gt;
classes with &amp;lt;code&amp;gt;@ALDDerivedClass&amp;lt;/code&amp;gt;.&lt;br /&gt;
As the selected operator may have its own parameters you may want to configure it.&lt;br /&gt;
In our example this is not necessary as the input array is, of course, supplied&lt;br /&gt;
by the &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt; operator.&lt;br /&gt;
Do not forget to input your data before hitting the run button.&lt;br /&gt;
After return, again a result window give you the results of the operation.&lt;br /&gt;
Note, if you did not tick Return elapsed time&amp;quot; this window will show zero&lt;br /&gt;
for the time elapsed as the operator has not been request to stop the time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==   Invocation via command line ==&lt;br /&gt;
&lt;br /&gt;
When invoking the &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt; operator from command line&lt;br /&gt;
we have to handle derived classes as value for parameters.&lt;br /&gt;
In the graphical user interface Alida features a combo box where&lt;br /&gt;
we may choose from.&lt;br /&gt;
In the command line interface Alida allows to prefix the value of a parameter&lt;br /&gt;
with a derived class to be passed to the operator.&lt;br /&gt;
This is necessary as Alida as, of course, no way to itself&lt;br /&gt;
decide if and which derived class is to be used.&lt;br /&gt;
Alida's syntax is to enclose the class name in a dollar sign and a colon.&lt;br /&gt;
As evident in the following example, abbreviations are of the fully&lt;br /&gt;
qualified class name are accepted as long as they are unambiguous.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner Apply \&lt;br /&gt;
	matrix='[[1,2,3],[4,5,6]]' \&lt;br /&gt;
	summarizeMode=ROW \&lt;br /&gt;
	summarizeOp='&amp;lt;math&amp;gt;ALDArrayMean:{}' \&lt;br /&gt;
	summaries=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
results in&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
summaries = [2.0,5.0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ALDOpRunner&amp;lt;/code&amp;gt; may be persuaded to show all operators derived from &amp;lt;code&amp;gt;ALDSummarizeArrayOp&amp;lt;/code&amp;gt;&lt;br /&gt;
and known within the user interface if we enter an invalid class name:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner \&lt;br /&gt;
	Apply matrix='[[1,2,3],[4,5,6]]' \&lt;br /&gt;
	summarizeMode=ROW summarizeOp='&amp;lt;/math&amp;gt;dd:{}' \&lt;br /&gt;
	summaries=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
yields&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALDStandardizedDataIOCmdline::readData found 0 derived classes matching &amp;lt;dd&amp;gt;&lt;br /&gt;
      derived classes available:&lt;br /&gt;
	de.unihalle.informatik.Alida.demo.ALDArrayMean&lt;br /&gt;
	de.unihalle.informatik.Alida.demo.ALDArrayMin&lt;br /&gt;
	de.unihalle.informatik.Alida.demo.ALDArraySum&lt;br /&gt;
ERROR: reading parameter &amp;lt;summarizeOp&amp;gt; returns null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supplemental parameters are handled like other parameters&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner Apply \&lt;br /&gt;
	matrix='[[1,2,3],[4,5,6]]' \&lt;br /&gt;
	summarizeMode=COLUMN \&lt;br /&gt;
	summarizeOp='&amp;lt;math&amp;gt;ALDArrayMin:{}' \&lt;br /&gt;
	summaries=- \&lt;br /&gt;
	returnElapsedTime=true \&lt;br /&gt;
	elapsedTime=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
gives&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	summaries = [1.0,2.0,3.0]&lt;br /&gt;
	elapsedTime = 4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=   Adding more data types as parameters =&lt;br /&gt;
&lt;br /&gt;
Alida provides automatic IO of primitive data types, enumerations, arrays, collections,&lt;br /&gt;
and operators.&lt;br /&gt;
In addition so called parameterized classes are supported.&lt;br /&gt;
Any Java class may be declared to be a parameterized class in Alida&lt;br /&gt;
by annotating the class &amp;lt;code&amp;gt;@ALDParametrizedClass&amp;lt;/code&amp;gt; as shown in the&lt;br /&gt;
class &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt;.&lt;br /&gt;
All member variables to be known to and handled by Alida's user interface&lt;br /&gt;
simply need to be annotated with &amp;lt;code&amp;gt;@ALDClassParameter&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Here we implement a toy version of experimental data &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt;.&lt;br /&gt;
A complete experiment contains&lt;br /&gt;
data of a time series of measurements of variable length.&lt;br /&gt;
Additional information is a descriptive string, the time resolution in milliseconds,&lt;br /&gt;
and whether baseline correction has been applied.&lt;br /&gt;
&lt;br /&gt;
The class is annotated by &amp;lt;code&amp;gt;@ALDParametrizedClass&amp;lt;/code&amp;gt;, and&lt;br /&gt;
and all members to be handle in Alida'a user interfaces are&lt;br /&gt;
to be annotated with &amp;lt;code&amp;gt;@ALDParametrizedClass&amp;lt;/code&amp;gt;.&lt;br /&gt;
The label field has the same semantics as for parameters of operators.&lt;br /&gt;
These annotations are the only implementational overhead&lt;br /&gt;
to allow Alida to automatically generate user interfaces&lt;br /&gt;
where the parameterized class acts as a parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDParametrizedClass&lt;br /&gt;
public class ExperimentalData1D extends ALDData {&lt;br /&gt;
	&lt;br /&gt;
    /** Description */&lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;description&amp;quot;, dataIOOrder = 1)&lt;br /&gt;
    private String description = null;&lt;br /&gt;
&lt;br /&gt;
    /** The data  */&lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;data&amp;quot;, dataIOOrder = 2)&lt;br /&gt;
    private Double[] data = null;&lt;br /&gt;
&lt;br /&gt;
    /** Are the data baseline corrected? */&lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;Baseline corrected&amp;quot;,&lt;br /&gt;
    			dataIOOrder = 3)&lt;br /&gt;
    private boolean baselineCorrected = false;&lt;br /&gt;
    &lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;Time resolution in milliseconds&amp;quot;, dataIOOrder = 4)&lt;br /&gt;
    private Float timeResolution = Float.NaN;&lt;br /&gt;
&lt;br /&gt;
    /** &lt;br /&gt;
     * Standard constructor is required&lt;br /&gt;
      */&lt;br /&gt;
    public ExperimentalData1D() {&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /** Constructor for an experiment.&lt;br /&gt;
      * Baseline correction is assumed to be false and nothung known about&lt;br /&gt;
      * the time resolution.&lt;br /&gt;
      *&lt;br /&gt;
      * @param  description   a textual description of the experiment&lt;br /&gt;
      * @param  data   measurements&lt;br /&gt;
      */&lt;br /&gt;
    public ExperimentalData1D( String description, Double[] data) {    &lt;br /&gt;
        this( description, data, false, Float.NaN);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is shown below for a simple normalizing operator &amp;lt;code&amp;gt;SmoothData1D&amp;lt;/code&amp;gt;&lt;br /&gt;
which takes experimental data as input an returns a new instance&lt;br /&gt;
of &amp;lt;code&amp;gt;ExperimentalData&amp;lt;/code&amp;gt; which contains smoothed data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDDerivedClass&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
              level=ALDAOperator.Level.APPLICATION)&lt;br /&gt;
public class SmoothData1D extends ALDOperator {&lt;br /&gt;
&lt;br /&gt;
	public enum SmoothingMethod {&lt;br /&gt;
		MEDIAN, MEAN, GAUSSIAN&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/** 1D Experiment&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label= &amp;quot;1D Experiment&amp;quot;, required = true, &lt;br /&gt;
			direction = Parameter.Direction.IN, &lt;br /&gt;
			description = &amp;quot;1D Experiment&amp;quot;,&lt;br /&gt;
			dataIOOrder = 1)&lt;br /&gt;
	protected ExperimentalData1D experiment;&lt;br /&gt;
&lt;br /&gt;
	/** Smoothing method&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label = &amp;quot;Smoothing method&amp;quot;, required = true,&lt;br /&gt;
			direction = Parameter.Direction.IN,&lt;br /&gt;
			callback = &amp;quot;smoothingMethodChanged&amp;quot;,&lt;br /&gt;
			description = &amp;quot;Smoothing method&amp;quot;,&lt;br /&gt;
			paramModificationMode = ParameterModificationMode.MODIFIES_INTERFACE,&lt;br /&gt;
			dataIOOrder = 2)&lt;br /&gt;
	SmoothingMethod smoothingMethod = SmoothingMethod.MEDIAN;&lt;br /&gt;
&lt;br /&gt;
	/** Window width&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label = &amp;quot;Window width&amp;quot;, required = true,&lt;br /&gt;
			direction = Parameter.Direction.IN,&lt;br /&gt;
			description = &amp;quot;Window width (should be uneven)&amp;quot;,&lt;br /&gt;
			dataIOOrder = 3)&lt;br /&gt;
	Integer width = 3;&lt;br /&gt;
&lt;br /&gt;
	/** Standard deviation of Gaussian&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label = &amp;quot;Standdard deviation of Gaussian&amp;quot;, required = true,&lt;br /&gt;
			direction = Parameter.Direction.IN,&lt;br /&gt;
			description = &amp;quot;Standdard deviation of Gaussian&amp;quot;,&lt;br /&gt;
			dataIOOrder = 3)&lt;br /&gt;
	Float sigma = 1.0F;&lt;br /&gt;
&lt;br /&gt;
	/** Smoothed 1D Experiment&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label= &amp;quot;Smothed 1D Experiment&amp;quot;,  &lt;br /&gt;
			direction = Parameter.Direction.OUT, &lt;br /&gt;
			description = &amp;quot;Smothed1D Experiment&amp;quot;,&lt;br /&gt;
			dataIOOrder = 1)&lt;br /&gt;
	protected ExperimentalData1D smoothedExperiment;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Default constructor.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public SmoothData1D() throws ALDOperatorException {&lt;br /&gt;
		// necessary handle dynamic parameters correctly&lt;br /&gt;
		smoothingMethodChanged();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	protected void operate() {&lt;br /&gt;
		this.fireOperatorExecutionProgressEvent(&lt;br /&gt;
				new ALDOperatorExecutionProgressEvent(this, &lt;br /&gt;
						&amp;quot;Starting to smooth 1D Data...&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
		Double[] smoothedData;&lt;br /&gt;
		if ( smoothingMethod == SmoothingMethod.MEDIAN) {&lt;br /&gt;
			smoothedData = median( experiment.getData(), this.width);&lt;br /&gt;
		} else {&lt;br /&gt;
			smoothedData = smoothByConvolution();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		smoothedExperiment = new ExperimentalData1D( experiment.getDescription() + &amp;quot; (smoothed)&amp;quot;, &lt;br /&gt;
				smoothedData, experiment.isBaselineCorrected(), experiment.getTimeResolution());&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This mechanism applies in a recursive fashion, i.e. a parameterized class may&lt;br /&gt;
(recursively) contain a member variable which itself is a parametrized class.&lt;br /&gt;
Likewise, an operator acting as a parameter of another operator&lt;br /&gt;
may in turn have a parameter of type &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==   Invocation via a graphical user interface ==&lt;br /&gt;
&lt;br /&gt;
Invoking and configuring &amp;lt;code&amp;gt;SmoothData1D&amp;lt;/code&amp;gt; from the graphical user interface&lt;br /&gt;
shows as the only required parameter the experimental data.&lt;br /&gt;
This parameterized class can be configured in a separate  window&lt;br /&gt;
very similar to to configuration of operators.&lt;br /&gt;
Likewise the resulting normalized experimental data&lt;br /&gt;
may be inspected in their own window.&lt;br /&gt;
&lt;br /&gt;
Obviously this is a toy example, as we would not expect the measurements to&lt;br /&gt;
be entered manually, but rather stored and read from file in a specialized format.&lt;br /&gt;
This is one of the rare cases where &lt;br /&gt;
custom data IO provider need to be implemented, in this&lt;br /&gt;
case for &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==   Invocation via command line ==&lt;br /&gt;
&lt;br /&gt;
Again, invocation from command line is provided by Alida in an automatic&lt;br /&gt;
way with no further implementational overhead.&lt;br /&gt;
The syntax for parameterized classes es a comma separated list of name=value pairs&lt;br /&gt;
enclosed in curly brackets where name refers to annotated member variables of&lt;br /&gt;
the parameterized class.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner SmoothData1D \&lt;br /&gt;
	experiment='{ baselineCorrected=false , \&lt;br /&gt;
                      description=&amp;quot;my experiment&amp;quot; , \&lt;br /&gt;
                      data=[1.0,2.0,2.2,3.3,2.0,1.0,1.0,1.0,1.0,2.0,3.3,2.0] }' \&lt;br /&gt;
        smoothingMethod=GAUSSIAN \&lt;br /&gt;
	smoothedExperiment=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
yields&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
smoothedExperiment = { baselineCorrected=false , &lt;br /&gt;
    data=[1.28,1.85,2.37,2.76,2.05,1.23,1.01,1.01,1.23,2.05,2.73,2.35] , &lt;br /&gt;
    timeResolution=NaN , &lt;br /&gt;
    description=&amp;quot;my experiment&amp;quot; (smoothed) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If a class derived from &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt; was to be supplied to the operator,&lt;br /&gt;
the curly brackets can be prefixed by a derive class definition starting with a dollar sign&lt;br /&gt;
and ending with a colon as shown for the summarizing operators above.&lt;br /&gt;
&lt;br /&gt;
= Graphical workflow editor: Grappa =&lt;br /&gt;
Most of the time complex data analysis tasks cannot be solved by only applying a&lt;br /&gt;
single operator to the data. Rather, selections of various operators need to be&lt;br /&gt;
combined into more sophisticated {\em workflows} to extract desired result data.&lt;br /&gt;
Alida inherently supports the development of such workflows. &lt;br /&gt;
Grappa, the Graphical Programming &lt;br /&gt;
Editor for Alida allows for designing and manipulating workflows via graph edit operations, hence, offers &lt;br /&gt;
an intuitive interface and large flexibility for developing workflows.&lt;br /&gt;
&lt;br /&gt;
A workflow in Alida is defined as a graph data structure. Each node of the graph represents an Alida operator, while edges between &lt;br /&gt;
different nodes encode the flow of data and control. Each node owns a selection of input and output ports which are associated with the&lt;br /&gt;
operator's parameters. Consequently, edges are directed, i.e., an edge always&lt;br /&gt;
connects an output port of one operator node with an input port of another. Grappa visualizes such workflow graphs and supports manual editing, manipulation, and also workflow execution&lt;br /&gt;
and analysis of results.&lt;/div&gt;</summary>
		<author><name>Posch</name></author>
	</entry>
	<entry>
		<id>https://alida.informatik.uni-halle.de/index.php?title=Java_quick&amp;diff=258</id>
		<title>Java quick</title>
		<link rel="alternate" type="text/html" href="https://alida.informatik.uni-halle.de/index.php?title=Java_quick&amp;diff=258"/>
		<updated>2016-02-23T12:12:09Z</updated>

		<summary type="html">&lt;p&gt;Posch: /* Adding more data types as parameters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here we introduce Alida's operator concept with some code snippets of &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt; and sub-classed demo operators.&lt;br /&gt;
we focus on Alida's capabilities to automatically generate user interfaces.&lt;br /&gt;
&lt;br /&gt;
=  First operator =&lt;br /&gt;
&lt;br /&gt;
As a first example of an Alida operator we implement the row or column wise&lt;br /&gt;
sum for a 2D array of Doubles.&lt;br /&gt;
The class &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt; extending &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt; features three member variables&lt;br /&gt;
holding the input 2D array, an enum to indicate the mode of summation (&amp;lt;code&amp;gt;ROW&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;COLUMN&amp;lt;/code&amp;gt;), and&lt;br /&gt;
an 1D array of the sums to be computed and returned by the operator.&lt;br /&gt;
Alida requires only to annotate these members with the @Parameter annotation&lt;br /&gt;
which declares &lt;br /&gt;
&lt;br /&gt;
* the direction (&amp;lt;code&amp;gt;IN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;OUT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INOUT&amp;lt;/code&amp;gt;), &lt;br /&gt;
* whether the parameter is required,&lt;br /&gt;
* an optional textual description,&lt;br /&gt;
* and a label used, e.g. in the graphical user interface automatically generated&lt;br /&gt;
		to execute the operator.&lt;br /&gt;
&lt;br /&gt;
It is important to add a public standard constructor (without arguments)&lt;br /&gt;
to be able to use Java's reflection mechanism.&lt;br /&gt;
Finally, the abstract method &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; of &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt; has to be overridden&lt;br /&gt;
implementing the functionality of the operator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
				level=ALDAOperator.Level.APPLICATION)&lt;br /&gt;
public class MatrixSum extends ALDOperator {&lt;br /&gt;
&lt;br /&gt;
  /** Choose row or colum wise sum&lt;br /&gt;
    */&lt;br /&gt;
  public static enum SummarizeMode {&lt;br /&gt;
	/** row wise */&lt;br /&gt;
	ROW,&lt;br /&gt;
&lt;br /&gt;
	/** column wise */&lt;br /&gt;
	COLUMN&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Input matrix&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;Input matrix&amp;quot;, required = true, &lt;br /&gt;
  		direction = Parameter.Direction.IN, description = &amp;quot;Input matrix.&amp;quot;)&lt;br /&gt;
  private Double[][] matrix;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Mode of summarizing&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;Summarize mode&amp;quot;, required = true, &lt;br /&gt;
  		direction = Parameter.Direction.IN, description = &amp;quot;Sum over columns or rows?&amp;quot;)&lt;br /&gt;
  private SummarizeMode summarizeMode = SummarizeMode.ROW;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * 1D Array of sums.&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;sums&amp;quot;,  &lt;br /&gt;
  		direction = Parameter.Direction.OUT, description = &amp;quot;Row or column wise sums.&amp;quot;)&lt;br /&gt;
  private Double[] sums = null;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Default constructor.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public MatrixSum() throws ALDOperatorException {&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Constructor.&lt;br /&gt;
	 * &lt;br /&gt;
	 * @param matrix	Input matrix.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public MatrixSum(Double[] [] matrix) throws ALDOperatorException {&lt;br /&gt;
		this.matrix = matrix;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	protected void operate() {&lt;br /&gt;
		if ( matrix == null ) &lt;br /&gt;
			sums = null;&lt;br /&gt;
&lt;br /&gt;
		// calculate sums&lt;br /&gt;
		if ( summarizeMode == SummarizeMode.ROW ) {&lt;br /&gt;
			sums = new Double[matrix.length];&lt;br /&gt;
			for ( int row = 0 ; row &amp;lt; matrix.length ; row++ ) {&lt;br /&gt;
				sums[row] = 0.0;&lt;br /&gt;
				for ( int col = 0 ; col &amp;lt; matrix[0].length ; col++ )&lt;br /&gt;
					sums[row] += matrix[row][col];&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			sums = new Double[matrix[0].length];&lt;br /&gt;
			for ( int col = 0 ; col &amp;lt; matrix[0].length ; col++ ) {&lt;br /&gt;
				sums[col] = 0.0;&lt;br /&gt;
				for ( int row = 0 ; row &amp;lt; matrix.length ; row++ )&lt;br /&gt;
					sums[col] += matrix[row][col];&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These are the basic requirements for the operator to be used on the programming level.&lt;br /&gt;
An example of this use is included in the example in the next section.&lt;br /&gt;
&lt;br /&gt;
If we further annotate the class with &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
this is all needed to also facilitate &lt;br /&gt;
execution of this operator via a graphical and a command line user interface&lt;br /&gt;
automatically generated by Alida.&lt;br /&gt;
(Setting &amp;lt;code&amp;gt;level=ALDAOperator.Level.APPLICATION&amp;lt;/code&amp;gt; declares this operator an application&lt;br /&gt;
which is used in the GUI to control display of available operators.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Invocation via a graphical user interface ==&lt;br /&gt;
&lt;br /&gt;
Alida comes with one single application to execute Alida operators&lt;br /&gt;
with a automatically generated graphical user interface which may be&lt;br /&gt;
started from command line by&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunnerGUI&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will pop up a window to choose an operator to execute.&lt;br /&gt;
Arranged according to the package structure all operators allows to be executed&lt;br /&gt;
via the graphical user interface according to their &amp;lt;code&amp;gt;genericExecutionMode&amp;lt;/code&amp;gt;&lt;br /&gt;
are displayed.&lt;br /&gt;
Initially packages are unfolded up to a predefined depth.&lt;br /&gt;
Unfold the demo package, select &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt;, and choose the &amp;quot;Configure Operator&amp;quot; button.&lt;br /&gt;
This will pop up another window which allows you to configure the input parameters&lt;br /&gt;
of the operator.&lt;br /&gt;
Important note: After finishing to input the data matrix entering the final matrix elements&lt;br /&gt;
you have to select a previous matrix element due to subtle AWT details.&lt;br /&gt;
For the enumeration to select the mode Alida has automatically generated&lt;br /&gt;
a combo box to allow convenient selections.&lt;br /&gt;
If you are finished with the parameter configuration you want to invoke the operator&lt;br /&gt;
using the run button.&lt;br /&gt;
On completion of &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt; the interface will pop up the result window which allows you&lt;br /&gt;
to inspect the outcome of the operation.&lt;br /&gt;
&lt;br /&gt;
==   Invocation via command line ==&lt;br /&gt;
&lt;br /&gt;
The command line user interface of Alida allows to invoke all Alida operator&lt;br /&gt;
properly annotated to allows generic execution.&lt;br /&gt;
&lt;br /&gt;
You may invoke the matrix summation operator by&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix='[[1,2,3],[4,5,6]]' sums=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
which returns as result on standard output&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sums = [6.0,15.0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter values are specified as name=value pairs.&lt;br /&gt;
Alida's syntax for 2D array should be self-explanatory  from this example.&lt;br /&gt;
As the mode of summation is not supplied as a parameter its default is used&lt;br /&gt;
&lt;br /&gt;
Note, the command&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix='[[1,2,3],[4,5,6]]' &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
will return no output as the command line user interface returns only output parameters requested.&lt;br /&gt;
&lt;br /&gt;
The enumeration defined in &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt; is supported by the&lt;br /&gt;
user interface without further action required as shown in the next example.&lt;br /&gt;
This also demonstrates redirection of output&lt;br /&gt;
to a file, sums.out in this case.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix='[[1,2,3],[4,5,6]]' &lt;br /&gt;
	summarizeMode=COLUMN sums=@sums.out+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Input can be read from file as well:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix=@data sums=-+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where the file data contains the string defining the matrix, e.g., &amp;lt;code&amp;gt;[[1,2,3],[4,5,6]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Adding more features to an operator =&lt;br /&gt;
&lt;br /&gt;
We now generalize this example to realize not only summation over rows or&lt;br /&gt;
columns, but arbitrary summarizing operations.&lt;br /&gt;
This shows Alida's feature to allow an operator as parameter of another operator.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
First we generalize &amp;lt;code&amp;gt;ALDArraySum&amp;lt;/code&amp;gt; to the operator &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt;&lt;br /&gt;
which also takes a 2D array and an enum indicating the mode of marginalization (&amp;lt;code&amp;gt;ROW&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;COLUMN&amp;lt;/code&amp;gt;).&lt;br /&gt;
It takes an additional input parameter which specifies the operation to be applied on each&lt;br /&gt;
row or column.&lt;br /&gt;
&lt;br /&gt;
This parameter is itself an Alida operator and of type &amp;lt;code&amp;gt;ALDSummarizeArrayOp&amp;lt;/code&amp;gt;&lt;br /&gt;
which is implemented as an abstract class.&lt;br /&gt;
This abstract operator defines a summarizing operator&lt;br /&gt;
which takes a 1D array as input and returns a summarizing scalar.&lt;br /&gt;
As this is an abstract class there is no need to override the &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt;&lt;br /&gt;
method, however some getter and setter methods are provided.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  @Parameter( label= &amp;quot;Input 1D array&amp;quot;, required = true, &lt;br /&gt;
  		direction = Parameter.Direction.IN, description = &amp;quot;Input array (1D).&amp;quot;)&lt;br /&gt;
  protected Double[] data;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Summarizing scalar&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;Summarizing scalar&amp;quot;,  &lt;br /&gt;
  		direction = Parameter.Direction.OUT, description = &amp;quot;Summarizing scalar of the 1D arra&amp;quot;)&lt;br /&gt;
  protected Double summary = null;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Default constructor.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public ALDSummarizeArrayOp() throws ALDOperatorException {&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Returns the 1D array&lt;br /&gt;
	 * @return data array&lt;br /&gt;
	 */&lt;br /&gt;
	public Double[] getData() {&lt;br /&gt;
		return this.data;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Sets the 1D array&lt;br /&gt;
	 * @param data&lt;br /&gt;
	 */&lt;br /&gt;
	public void setData( Double[] data) {&lt;br /&gt;
		this.data = data;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we add concrete examples of such a summarizing operation, in this case&lt;br /&gt;
summation (&amp;lt;code&amp;gt;ALDArraySum&amp;lt;/code&amp;gt;), to return the mean (&amp;lt;code&amp;gt;ALDArrayMean&amp;lt;/code&amp;gt;), and the minimum (&amp;lt;code&amp;gt;ALDArrayMin&amp;lt;/code&amp;gt;).&lt;br /&gt;
Each implements the  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method and has to supply a standard constructor.&lt;br /&gt;
In this example we add another constructor for convenience.&lt;br /&gt;
This operators are declared as operators on the standard in contrast to &lt;br /&gt;
application level, as they are not expected to be invoked as an application.&lt;br /&gt;
However, setting the level to standard in the menu of the graphical user interface&lt;br /&gt;
stills allows their execution.&lt;br /&gt;
When extending the abstract super class it is necessary to annotate the&lt;br /&gt;
class with &amp;lt;code&amp;gt;@ALDDerivedClass&amp;lt;/code&amp;gt; in order to allow Alida's dataIO mechanism to find the derived class&lt;br /&gt;
in the automatically generated user interface.&lt;br /&gt;
This holds for other parameter types as well.&lt;br /&gt;
More specifically, if an instance of a class is to be supplied in an automatically &lt;br /&gt;
generated user interface as a value for a parameter of one of its super classes,&lt;br /&gt;
Alida requires the annotation &amp;lt;code&amp;gt;@ALDDerivedClass&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDDerivedClass&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
        level=ALDAOperator.Level.STANDARD)&lt;br /&gt;
public class ALDArraySum extends ALDSummarizeArrayOp {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void operate() {&lt;br /&gt;
        summary = 0.0;&lt;br /&gt;
        for ( int i = 0 ; i &amp;lt; data.length ; i++ )&lt;br /&gt;
            summary += data[i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Default constructor.&lt;br /&gt;
     * @throws ALDOperatorException&lt;br /&gt;
     */&lt;br /&gt;
    public ALDArraySum() throws ALDOperatorException {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we are ready to implement &lt;br /&gt;
the &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt; operator, which also demonstrates supplemental parameters.&lt;br /&gt;
This supplementals, e.g., control debugging output or returning of intermediate results.&lt;br /&gt;
For demo purposes we declare a supplemental input parameter &amp;lt;code&amp;gt;returnElapsedTime&amp;lt;/code&amp;gt;.&lt;br /&gt;
If it is set to true the operator will return the elapsed time in a second&lt;br /&gt;
supplemental parameter with direction output.&lt;br /&gt;
&lt;br /&gt;
Again, the operation is implemented in the  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method and the remainder of the&lt;br /&gt;
class supplies getter and setter methods for convenience.&lt;br /&gt;
The  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method give also an example of the invocation of an operator on the&lt;br /&gt;
programming level.&lt;br /&gt;
In this case, an instance of the operator is already passed as a parameter.&lt;br /&gt;
Its parameters are set, in this case each 1D array to be summarized in turn.&lt;br /&gt;
Upon return from the method &amp;lt;code&amp;gt;runOp()&amp;lt;/code&amp;gt; the results may be retrieved from the operator object,&lt;br /&gt;
in this example with the &amp;lt;code&amp;gt;getSummary()&amp;lt;/code&amp;gt; method.&lt;br /&gt;
Besides getter and setter methods as implemented in each operator&lt;br /&gt;
Alida provides also a generic get and set methods applicable to&lt;br /&gt;
all parameters of an operator.&lt;br /&gt;
Note, that the operator is not invoked by its  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method, but via&lt;br /&gt;
the &amp;lt;code&amp;gt;runOp()&amp;lt;/code&amp;gt; method implemented the base class &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt;.&lt;br /&gt;
This methods validates the parameters before invocation of  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt;.&lt;br /&gt;
Furthermore, it take all necessary measures for Alida's processing&lt;br /&gt;
history which automatically logs&lt;br /&gt;
all manipulative actions on the data and corresponding parameter settings. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
            level=ALDAOperator.Level.APPLICATION)&lt;br /&gt;
public class ApplyToMatrix extends ALDOperator {&lt;br /&gt;
&lt;br /&gt;
    /** Choose row or colum wise sum&lt;br /&gt;
      */&lt;br /&gt;
    public static enum SummarizeMode {&lt;br /&gt;
      /** row wise */&lt;br /&gt;
      ROW,&lt;br /&gt;
      /** column wise */&lt;br /&gt;
      COLUMN&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Input matrix&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Input matrix&amp;quot;, required = true, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Input matrix.&amp;quot;)&lt;br /&gt;
    private Double[][] matrix;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Mode of summarizing&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Summarize mode&amp;quot;, required = true, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Sum over columns or rows.&amp;quot;)&lt;br /&gt;
    private SummarizeMode summarizeMode = SummarizeMode.ROW;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Summarizing opererator&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Summarizing operator&amp;quot;, required = true, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Specifies the summarizing operation to apply&amp;quot;)&lt;br /&gt;
    private ALDSummarizeArrayOp summarizeOp;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 1D Array of summaries.&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;summaries&amp;quot;,  &lt;br /&gt;
          direction = Parameter.Direction.OUT, description = &amp;quot;Row or column wise summaries&amp;quot;)&lt;br /&gt;
    private Double[] summaries = null;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Supplemental to request elapsed time to be returned&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Return elapsed time&amp;quot;, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Request elapsed time consumed to be returned&amp;quot;,&lt;br /&gt;
        supplemental=true)&lt;br /&gt;
    private boolean returnElapsedTime = false;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Elpased time &lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Elapsed time&amp;quot;,  &lt;br /&gt;
          direction = Parameter.Direction.OUT, description = &amp;quot;Elapsed time of operation in milliseconds&amp;quot;,&lt;br /&gt;
        supplemental=true)&lt;br /&gt;
    private long elapsedTime;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Default constructor.&lt;br /&gt;
     * @throws ALDOperatorException&lt;br /&gt;
     */&lt;br /&gt;
    public ApplyToMatrix() throws ALDOperatorException {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Constructor.&lt;br /&gt;
     * &lt;br /&gt;
     * @param matrix    Input matrix.&lt;br /&gt;
     * @throws ALDOperatorException&lt;br /&gt;
     */&lt;br /&gt;
    public ApplyToMatrix(Double[] [] matrix) throws ALDOperatorException {&lt;br /&gt;
        this.matrix = matrix;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void operate() throws ALDOperatorException,ALDProcessingDAGException {&lt;br /&gt;
        if ( returnElapsedTime ) &lt;br /&gt;
            elapsedTime = System.currentTimeMillis();&lt;br /&gt;
&lt;br /&gt;
        if ( matrix == null ) &lt;br /&gt;
            summaries = null;&lt;br /&gt;
&lt;br /&gt;
        // calculate summaries&lt;br /&gt;
        if ( summarizeMode == SummarizeMode.ROW ) {&lt;br /&gt;
            summaries = new Double[matrix.length];&lt;br /&gt;
            for ( int row = 0 ; row &amp;lt; matrix.length ; row++ ) {&lt;br /&gt;
                summarizeOp.setData(matrix[row]);&lt;br /&gt;
                summarizeOp.runOp();&lt;br /&gt;
                summaries[row] = summarizeOp.getSummary();&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            summaries = new Double[matrix[0].length];&lt;br /&gt;
            Double[] tmp = new Double[matrix.length];&lt;br /&gt;
            for ( int col = 0 ; col &amp;lt; matrix[0].length ; col++ ) {&lt;br /&gt;
                for ( int row = 0 ; row &amp;lt; matrix.length ; row++ )&lt;br /&gt;
                    tmp[row] = matrix[row][col];&lt;br /&gt;
&lt;br /&gt;
                summarizeOp.setData(tmp);&lt;br /&gt;
                summarizeOp.runOp();&lt;br /&gt;
                summaries[col] = summarizeOp.getSummary();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if ( returnElapsedTime ) &lt;br /&gt;
            elapsedTime = System.currentTimeMillis() - elapsedTime;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // ==============================================================&lt;br /&gt;
    // Getter and setter methods&lt;br /&gt;
    /** Get value of returnElapsedTime.&lt;br /&gt;
      * Explanation: Request elapsed time consumed to be returned.&lt;br /&gt;
      * @return value of returnElapsedTime&lt;br /&gt;
      */&lt;br /&gt;
    public boolean getReturnElapsedTime(){&lt;br /&gt;
        return returnElapsedTime;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /** Set value of returnElapsedTime.&lt;br /&gt;
      * Explanation: Request elapsed time consumed to be returned.&lt;br /&gt;
      * @param value New value of returnElapsedTime&lt;br /&gt;
      */&lt;br /&gt;
    public void setReturnElapsedTime( boolean value){&lt;br /&gt;
        this.returnElapsedTime = value;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==   Invocation via a graphical user interface ==&lt;br /&gt;
&lt;br /&gt;
If the graphical interface is still running just select our new operator&lt;br /&gt;
and begin to configure it.&lt;br /&gt;
For the parameter summarizing operator you have a choice of all operators extending&lt;br /&gt;
the abstract operator &amp;lt;code&amp;gt;ALDSummarizeArrayOp&amp;lt;/code&amp;gt;.&lt;br /&gt;
All which is necessary on the implementation side is proper annotation of the extending&lt;br /&gt;
classes with &amp;lt;code&amp;gt;@ALDDerivedClass&amp;lt;/code&amp;gt;.&lt;br /&gt;
As the selected operator may have its own parameters you may want to configure it.&lt;br /&gt;
In our example this is not necessary as the input array is, of course, supplied&lt;br /&gt;
by the &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt; operator.&lt;br /&gt;
Do not forget to input your data before hitting the run button.&lt;br /&gt;
After return, again a result window give you the results of the operation.&lt;br /&gt;
Note, if you did not tick Return elapsed time&amp;quot; this window will show zero&lt;br /&gt;
for the time elapsed as the operator has not been request to stop the time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==   Invocation via command line ==&lt;br /&gt;
&lt;br /&gt;
When invoking the &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt; operator from command line&lt;br /&gt;
we have to handle derived classes as value for parameters.&lt;br /&gt;
In the graphical user interface Alida features a combo box where&lt;br /&gt;
we may choose from.&lt;br /&gt;
In the command line interface Alida allows to prefix the value of a parameter&lt;br /&gt;
with a derived class to be passed to the operator.&lt;br /&gt;
This is necessary as Alida as, of course, no way to itself&lt;br /&gt;
decide if and which derived class is to be used.&lt;br /&gt;
Alida's syntax is to enclose the class name in a dollar sign and a colon.&lt;br /&gt;
As evident in the following example, abbreviations are of the fully&lt;br /&gt;
qualified class name are accepted as long as they are unambiguous.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner Apply \&lt;br /&gt;
	matrix='[[1,2,3],[4,5,6]]' \&lt;br /&gt;
	summarizeMode=ROW \&lt;br /&gt;
	summarizeOp='&amp;lt;math&amp;gt;ALDArrayMean:{}' \&lt;br /&gt;
	summaries=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
results in&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
summaries = [2.0,5.0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ALDOpRunner&amp;lt;/code&amp;gt; may be persuaded to show all operators derived from &amp;lt;code&amp;gt;ALDSummarizeArrayOp&amp;lt;/code&amp;gt;&lt;br /&gt;
and known within the user interface if we enter an invalid class name:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner \&lt;br /&gt;
	Apply matrix='[[1,2,3],[4,5,6]]' \&lt;br /&gt;
	summarizeMode=ROW summarizeOp='&amp;lt;/math&amp;gt;dd:{}' \&lt;br /&gt;
	summaries=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
yields&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALDStandardizedDataIOCmdline::readData found 0 derived classes matching &amp;lt;dd&amp;gt;&lt;br /&gt;
      derived classes available:&lt;br /&gt;
	de.unihalle.informatik.Alida.demo.ALDArrayMean&lt;br /&gt;
	de.unihalle.informatik.Alida.demo.ALDArrayMin&lt;br /&gt;
	de.unihalle.informatik.Alida.demo.ALDArraySum&lt;br /&gt;
ERROR: reading parameter &amp;lt;summarizeOp&amp;gt; returns null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supplemental parameters are handled like other parameters&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner Apply \&lt;br /&gt;
	matrix='[[1,2,3],[4,5,6]]' \&lt;br /&gt;
	summarizeMode=COLUMN \&lt;br /&gt;
	summarizeOp='&amp;lt;math&amp;gt;ALDArrayMin:{}' \&lt;br /&gt;
	summaries=- \&lt;br /&gt;
	returnElapsedTime=true \&lt;br /&gt;
	elapsedTime=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
gives&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	summaries = [1.0,2.0,3.0]&lt;br /&gt;
	elapsedTime = 4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=   Adding more data types as parameters =&lt;br /&gt;
&lt;br /&gt;
Alida provides automatic IO of primitive data types, enumerations, arrays, collections,&lt;br /&gt;
and operators.&lt;br /&gt;
In addition so called parameterized classes are supported.&lt;br /&gt;
Any Java class may be declared to be a parameterized class in Alida&lt;br /&gt;
by annotating the class &amp;lt;code&amp;gt;@ALDParametrizedClass&amp;lt;/code&amp;gt; as shown in the&lt;br /&gt;
class &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt;.&lt;br /&gt;
All member variables to be known to and handled by Alida's user interface&lt;br /&gt;
simply need to be annotated with &amp;lt;code&amp;gt;@ALDClassParameter&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Here we implement a toy version of experimental data &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt;.&lt;br /&gt;
A complete experiment contains&lt;br /&gt;
data of a time series of measurements of variable length.&lt;br /&gt;
Additional information is a descriptive string, the time resolution in milliseconds,&lt;br /&gt;
and whether baseline correction has been applied.&lt;br /&gt;
&lt;br /&gt;
The class is annotated by &amp;lt;code&amp;gt;@ALDParametrizedClass&amp;lt;/code&amp;gt;, and&lt;br /&gt;
and all members to be handle in Alida'a user interfaces are&lt;br /&gt;
to be annotated with &amp;lt;code&amp;gt;@ALDParametrizedClass&amp;lt;/code&amp;gt;.&lt;br /&gt;
The label field has the same semantics as for parameters of operators.&lt;br /&gt;
These annotations are the only implementational overhead&lt;br /&gt;
to allow Alida to automatically generate user interfaces&lt;br /&gt;
where the parameterized class acts as a parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDParametrizedClass&lt;br /&gt;
public class ExperimentalData1D extends ALDData {&lt;br /&gt;
	&lt;br /&gt;
    /** Description */&lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;description&amp;quot;, dataIOOrder = 1)&lt;br /&gt;
    private String description = null;&lt;br /&gt;
&lt;br /&gt;
    /** The data  */&lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;data&amp;quot;, dataIOOrder = 2)&lt;br /&gt;
    private Double[] data = null;&lt;br /&gt;
&lt;br /&gt;
    /** Are the data baseline corrected? */&lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;Baseline corrected&amp;quot;,&lt;br /&gt;
    			dataIOOrder = 3)&lt;br /&gt;
    private boolean baselineCorrected = false;&lt;br /&gt;
    &lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;Time resolution in milliseconds&amp;quot;, dataIOOrder = 4)&lt;br /&gt;
    private Float timeResolution = Float.NaN;&lt;br /&gt;
&lt;br /&gt;
    /** &lt;br /&gt;
     * Standard constructor is required&lt;br /&gt;
      */&lt;br /&gt;
    public ExperimentalData1D() {&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /** Constructor for an experiment.&lt;br /&gt;
      * Baseline correction is assumed to be false and nothung known about&lt;br /&gt;
      * the time resolution.&lt;br /&gt;
      *&lt;br /&gt;
      * @param  description   a textual description of the experiment&lt;br /&gt;
      * @param  data   measurements&lt;br /&gt;
      */&lt;br /&gt;
    public ExperimentalData1D( String description, Double[] data) {    &lt;br /&gt;
        this( description, data, false, Float.NaN);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is shown below for a simple normalizing operator &amp;lt;code&amp;gt;SmoothData1D&amp;lt;/code&amp;gt;&lt;br /&gt;
which takes experimental data as input an returns a new instance&lt;br /&gt;
of &amp;lt;code&amp;gt;ExperimentalData&amp;lt;/code&amp;gt; which contains smoothed data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDDerivedClass&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
              level=ALDAOperator.Level.APPLICATION)&lt;br /&gt;
public class SmoothData1D extends ALDOperator {&lt;br /&gt;
&lt;br /&gt;
	public enum SmoothingMethod {&lt;br /&gt;
		MEDIAN, MEAN, GAUSSIAN&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/** 1D Experiment&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label= &amp;quot;1D Experiment&amp;quot;, required = true, &lt;br /&gt;
			direction = Parameter.Direction.IN, &lt;br /&gt;
			description = &amp;quot;1D Experiment&amp;quot;,&lt;br /&gt;
			dataIOOrder = 1)&lt;br /&gt;
	protected ExperimentalData1D experiment;&lt;br /&gt;
&lt;br /&gt;
	/** Smoothing method&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label = &amp;quot;Smoothing method&amp;quot;, required = true,&lt;br /&gt;
			direction = Parameter.Direction.IN,&lt;br /&gt;
			callback = &amp;quot;smoothingMethodChanged&amp;quot;,&lt;br /&gt;
			description = &amp;quot;Smoothing method&amp;quot;,&lt;br /&gt;
			paramModificationMode = ParameterModificationMode.MODIFIES_INTERFACE,&lt;br /&gt;
			dataIOOrder = 2)&lt;br /&gt;
	SmoothingMethod smoothingMethod = SmoothingMethod.MEDIAN;&lt;br /&gt;
&lt;br /&gt;
	/** Window width&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label = &amp;quot;Window width&amp;quot;, required = true,&lt;br /&gt;
			direction = Parameter.Direction.IN,&lt;br /&gt;
			description = &amp;quot;Window width (should be uneven)&amp;quot;,&lt;br /&gt;
			dataIOOrder = 3)&lt;br /&gt;
	Integer width = 3;&lt;br /&gt;
&lt;br /&gt;
	/** Standard deviation of Gaussian&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label = &amp;quot;Standdard deviation of Gaussian&amp;quot;, required = true,&lt;br /&gt;
			direction = Parameter.Direction.IN,&lt;br /&gt;
			description = &amp;quot;Standdard deviation of Gaussian&amp;quot;,&lt;br /&gt;
			dataIOOrder = 3)&lt;br /&gt;
	Float sigma = 1.0F;&lt;br /&gt;
&lt;br /&gt;
	/** Smoothed 1D Experiment&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label= &amp;quot;Smothed 1D Experiment&amp;quot;,  &lt;br /&gt;
			direction = Parameter.Direction.OUT, &lt;br /&gt;
			description = &amp;quot;Smothed1D Experiment&amp;quot;,&lt;br /&gt;
			dataIOOrder = 1)&lt;br /&gt;
	protected ExperimentalData1D smoothedExperiment;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Default constructor.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public SmoothData1D() throws ALDOperatorException {&lt;br /&gt;
		// necessary handle dynamic parameters correctly&lt;br /&gt;
		smoothingMethodChanged();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	protected void operate() {&lt;br /&gt;
		this.fireOperatorExecutionProgressEvent(&lt;br /&gt;
				new ALDOperatorExecutionProgressEvent(this, &lt;br /&gt;
						&amp;quot;Starting to smooth 1D Data...&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
		Double[] smoothedData;&lt;br /&gt;
		if ( smoothingMethod == SmoothingMethod.MEDIAN) {&lt;br /&gt;
			smoothedData = median( experiment.getData(), this.width);&lt;br /&gt;
		} else {&lt;br /&gt;
			smoothedData = smoothByConvolution();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		smoothedExperiment = new ExperimentalData1D( experiment.getDescription() + &amp;quot; (smoothed)&amp;quot;, &lt;br /&gt;
				smoothedData, experiment.isBaselineCorrected(), experiment.getTimeResolution());&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This mechanism applies in a recursive fashion, i.e. a parameterized class may&lt;br /&gt;
(recursively) contain a member variable which itself is a parametrized class.&lt;br /&gt;
Likewise, an operator acting as a parameter of another operator&lt;br /&gt;
may in turn have a parameter of type &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==   Invocation via a graphical user interface ==&lt;br /&gt;
&lt;br /&gt;
Invoking and configuring &amp;lt;code&amp;gt;SmoothData1D&amp;lt;/code&amp;gt; from the graphical user interface&lt;br /&gt;
shows as the only required parameter the experimental data.&lt;br /&gt;
This parameterized class can be configured in a separate  window&lt;br /&gt;
very similar to to configuration of operators.&lt;br /&gt;
Likewise the resulting normalized experimental data&lt;br /&gt;
may be inspected in their own window.&lt;br /&gt;
&lt;br /&gt;
Obviously this is a toy example, as we would not expect the measurements to&lt;br /&gt;
be entered manually, but rather stored and read from file in a specialized format.&lt;br /&gt;
This is one of the rare cases where &lt;br /&gt;
custom data IO provider need to be implemented, in this&lt;br /&gt;
case for &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==   Invocation via command line ==&lt;br /&gt;
&lt;br /&gt;
Again, invocation from command line is provided by Alida in an automatic&lt;br /&gt;
way with no further implementational overhead.&lt;br /&gt;
The syntax for parameterized classes es a comma separated list of name=value pairs&lt;br /&gt;
enclosed in curly brackets where name refers to annotated member variables of&lt;br /&gt;
the parameterized class.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner SmoothData1D \&lt;br /&gt;
	experiment='{ baselineCorrected=false , \&lt;br /&gt;
                      description=&amp;quot;my experiment&amp;quot; , \&lt;br /&gt;
                      data=[1.0,2.0,2.2,3.3,2.0,1.0,1.0,1.0,1.0,2.0,3.3,2.0] }' \&lt;br /&gt;
        smoothingMethod=GAUSSIAN \&lt;br /&gt;
	smoothedExperiment=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
yields&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
smoothedExperiment = { baselineCorrected=false , &lt;br /&gt;
    data=[1.28,1.85,2.37,2.76,2.05,1.23,1.01,1.01,1.23,2.05,2.73,2.35] , &lt;br /&gt;
    timeResolution=NaN , &lt;br /&gt;
    description=&amp;quot;my experiment&amp;quot; (smoothed) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If a class derived from &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt; was to be supplied to the operator,&lt;br /&gt;
the curly brackets can be prefixed by a derive class definition starting with a dollar sign&lt;br /&gt;
and ending with a colon as shown for the summarizing operators above.&lt;/div&gt;</summary>
		<author><name>Posch</name></author>
	</entry>
	<entry>
		<id>https://alida.informatik.uni-halle.de/index.php?title=Java_quick&amp;diff=257</id>
		<title>Java quick</title>
		<link rel="alternate" type="text/html" href="https://alida.informatik.uni-halle.de/index.php?title=Java_quick&amp;diff=257"/>
		<updated>2016-02-23T12:10:06Z</updated>

		<summary type="html">&lt;p&gt;Posch: /* Adding more data types as parameters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here we introduce Alida's operator concept with some code snippets of &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt; and sub-classed demo operators.&lt;br /&gt;
we focus on Alida's capabilities to automatically generate user interfaces.&lt;br /&gt;
&lt;br /&gt;
=  First operator =&lt;br /&gt;
&lt;br /&gt;
As a first example of an Alida operator we implement the row or column wise&lt;br /&gt;
sum for a 2D array of Doubles.&lt;br /&gt;
The class &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt; extending &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt; features three member variables&lt;br /&gt;
holding the input 2D array, an enum to indicate the mode of summation (&amp;lt;code&amp;gt;ROW&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;COLUMN&amp;lt;/code&amp;gt;), and&lt;br /&gt;
an 1D array of the sums to be computed and returned by the operator.&lt;br /&gt;
Alida requires only to annotate these members with the @Parameter annotation&lt;br /&gt;
which declares &lt;br /&gt;
&lt;br /&gt;
* the direction (&amp;lt;code&amp;gt;IN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;OUT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INOUT&amp;lt;/code&amp;gt;), &lt;br /&gt;
* whether the parameter is required,&lt;br /&gt;
* an optional textual description,&lt;br /&gt;
* and a label used, e.g. in the graphical user interface automatically generated&lt;br /&gt;
		to execute the operator.&lt;br /&gt;
&lt;br /&gt;
It is important to add a public standard constructor (without arguments)&lt;br /&gt;
to be able to use Java's reflection mechanism.&lt;br /&gt;
Finally, the abstract method &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; of &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt; has to be overridden&lt;br /&gt;
implementing the functionality of the operator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
				level=ALDAOperator.Level.APPLICATION)&lt;br /&gt;
public class MatrixSum extends ALDOperator {&lt;br /&gt;
&lt;br /&gt;
  /** Choose row or colum wise sum&lt;br /&gt;
    */&lt;br /&gt;
  public static enum SummarizeMode {&lt;br /&gt;
	/** row wise */&lt;br /&gt;
	ROW,&lt;br /&gt;
&lt;br /&gt;
	/** column wise */&lt;br /&gt;
	COLUMN&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Input matrix&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;Input matrix&amp;quot;, required = true, &lt;br /&gt;
  		direction = Parameter.Direction.IN, description = &amp;quot;Input matrix.&amp;quot;)&lt;br /&gt;
  private Double[][] matrix;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Mode of summarizing&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;Summarize mode&amp;quot;, required = true, &lt;br /&gt;
  		direction = Parameter.Direction.IN, description = &amp;quot;Sum over columns or rows?&amp;quot;)&lt;br /&gt;
  private SummarizeMode summarizeMode = SummarizeMode.ROW;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * 1D Array of sums.&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;sums&amp;quot;,  &lt;br /&gt;
  		direction = Parameter.Direction.OUT, description = &amp;quot;Row or column wise sums.&amp;quot;)&lt;br /&gt;
  private Double[] sums = null;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Default constructor.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public MatrixSum() throws ALDOperatorException {&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Constructor.&lt;br /&gt;
	 * &lt;br /&gt;
	 * @param matrix	Input matrix.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public MatrixSum(Double[] [] matrix) throws ALDOperatorException {&lt;br /&gt;
		this.matrix = matrix;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	protected void operate() {&lt;br /&gt;
		if ( matrix == null ) &lt;br /&gt;
			sums = null;&lt;br /&gt;
&lt;br /&gt;
		// calculate sums&lt;br /&gt;
		if ( summarizeMode == SummarizeMode.ROW ) {&lt;br /&gt;
			sums = new Double[matrix.length];&lt;br /&gt;
			for ( int row = 0 ; row &amp;lt; matrix.length ; row++ ) {&lt;br /&gt;
				sums[row] = 0.0;&lt;br /&gt;
				for ( int col = 0 ; col &amp;lt; matrix[0].length ; col++ )&lt;br /&gt;
					sums[row] += matrix[row][col];&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			sums = new Double[matrix[0].length];&lt;br /&gt;
			for ( int col = 0 ; col &amp;lt; matrix[0].length ; col++ ) {&lt;br /&gt;
				sums[col] = 0.0;&lt;br /&gt;
				for ( int row = 0 ; row &amp;lt; matrix.length ; row++ )&lt;br /&gt;
					sums[col] += matrix[row][col];&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These are the basic requirements for the operator to be used on the programming level.&lt;br /&gt;
An example of this use is included in the example in the next section.&lt;br /&gt;
&lt;br /&gt;
If we further annotate the class with &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
this is all needed to also facilitate &lt;br /&gt;
execution of this operator via a graphical and a command line user interface&lt;br /&gt;
automatically generated by Alida.&lt;br /&gt;
(Setting &amp;lt;code&amp;gt;level=ALDAOperator.Level.APPLICATION&amp;lt;/code&amp;gt; declares this operator an application&lt;br /&gt;
which is used in the GUI to control display of available operators.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Invocation via a graphical user interface ==&lt;br /&gt;
&lt;br /&gt;
Alida comes with one single application to execute Alida operators&lt;br /&gt;
with a automatically generated graphical user interface which may be&lt;br /&gt;
started from command line by&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunnerGUI&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will pop up a window to choose an operator to execute.&lt;br /&gt;
Arranged according to the package structure all operators allows to be executed&lt;br /&gt;
via the graphical user interface according to their &amp;lt;code&amp;gt;genericExecutionMode&amp;lt;/code&amp;gt;&lt;br /&gt;
are displayed.&lt;br /&gt;
Initially packages are unfolded up to a predefined depth.&lt;br /&gt;
Unfold the demo package, select &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt;, and choose the &amp;quot;Configure Operator&amp;quot; button.&lt;br /&gt;
This will pop up another window which allows you to configure the input parameters&lt;br /&gt;
of the operator.&lt;br /&gt;
Important note: After finishing to input the data matrix entering the final matrix elements&lt;br /&gt;
you have to select a previous matrix element due to subtle AWT details.&lt;br /&gt;
For the enumeration to select the mode Alida has automatically generated&lt;br /&gt;
a combo box to allow convenient selections.&lt;br /&gt;
If you are finished with the parameter configuration you want to invoke the operator&lt;br /&gt;
using the run button.&lt;br /&gt;
On completion of &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt; the interface will pop up the result window which allows you&lt;br /&gt;
to inspect the outcome of the operation.&lt;br /&gt;
&lt;br /&gt;
==   Invocation via command line ==&lt;br /&gt;
&lt;br /&gt;
The command line user interface of Alida allows to invoke all Alida operator&lt;br /&gt;
properly annotated to allows generic execution.&lt;br /&gt;
&lt;br /&gt;
You may invoke the matrix summation operator by&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix='[[1,2,3],[4,5,6]]' sums=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
which returns as result on standard output&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sums = [6.0,15.0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter values are specified as name=value pairs.&lt;br /&gt;
Alida's syntax for 2D array should be self-explanatory  from this example.&lt;br /&gt;
As the mode of summation is not supplied as a parameter its default is used&lt;br /&gt;
&lt;br /&gt;
Note, the command&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix='[[1,2,3],[4,5,6]]' &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
will return no output as the command line user interface returns only output parameters requested.&lt;br /&gt;
&lt;br /&gt;
The enumeration defined in &amp;lt;code&amp;gt;MatrixSum&amp;lt;/code&amp;gt; is supported by the&lt;br /&gt;
user interface without further action required as shown in the next example.&lt;br /&gt;
This also demonstrates redirection of output&lt;br /&gt;
to a file, sums.out in this case.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix='[[1,2,3],[4,5,6]]' &lt;br /&gt;
	summarizeMode=COLUMN sums=@sums.out+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Input can be read from file as well:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner MatrixSum matrix=@data sums=-+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where the file data contains the string defining the matrix, e.g., &amp;lt;code&amp;gt;[[1,2,3],[4,5,6]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Adding more features to an operator =&lt;br /&gt;
&lt;br /&gt;
We now generalize this example to realize not only summation over rows or&lt;br /&gt;
columns, but arbitrary summarizing operations.&lt;br /&gt;
This shows Alida's feature to allow an operator as parameter of another operator.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
First we generalize &amp;lt;code&amp;gt;ALDArraySum&amp;lt;/code&amp;gt; to the operator &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt;&lt;br /&gt;
which also takes a 2D array and an enum indicating the mode of marginalization (&amp;lt;code&amp;gt;ROW&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;COLUMN&amp;lt;/code&amp;gt;).&lt;br /&gt;
It takes an additional input parameter which specifies the operation to be applied on each&lt;br /&gt;
row or column.&lt;br /&gt;
&lt;br /&gt;
This parameter is itself an Alida operator and of type &amp;lt;code&amp;gt;ALDSummarizeArrayOp&amp;lt;/code&amp;gt;&lt;br /&gt;
which is implemented as an abstract class.&lt;br /&gt;
This abstract operator defines a summarizing operator&lt;br /&gt;
which takes a 1D array as input and returns a summarizing scalar.&lt;br /&gt;
As this is an abstract class there is no need to override the &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt;&lt;br /&gt;
method, however some getter and setter methods are provided.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  @Parameter( label= &amp;quot;Input 1D array&amp;quot;, required = true, &lt;br /&gt;
  		direction = Parameter.Direction.IN, description = &amp;quot;Input array (1D).&amp;quot;)&lt;br /&gt;
  protected Double[] data;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Summarizing scalar&lt;br /&gt;
   */&lt;br /&gt;
  @Parameter( label= &amp;quot;Summarizing scalar&amp;quot;,  &lt;br /&gt;
  		direction = Parameter.Direction.OUT, description = &amp;quot;Summarizing scalar of the 1D arra&amp;quot;)&lt;br /&gt;
  protected Double summary = null;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Default constructor.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public ALDSummarizeArrayOp() throws ALDOperatorException {&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Returns the 1D array&lt;br /&gt;
	 * @return data array&lt;br /&gt;
	 */&lt;br /&gt;
	public Double[] getData() {&lt;br /&gt;
		return this.data;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Sets the 1D array&lt;br /&gt;
	 * @param data&lt;br /&gt;
	 */&lt;br /&gt;
	public void setData( Double[] data) {&lt;br /&gt;
		this.data = data;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we add concrete examples of such a summarizing operation, in this case&lt;br /&gt;
summation (&amp;lt;code&amp;gt;ALDArraySum&amp;lt;/code&amp;gt;), to return the mean (&amp;lt;code&amp;gt;ALDArrayMean&amp;lt;/code&amp;gt;), and the minimum (&amp;lt;code&amp;gt;ALDArrayMin&amp;lt;/code&amp;gt;).&lt;br /&gt;
Each implements the  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method and has to supply a standard constructor.&lt;br /&gt;
In this example we add another constructor for convenience.&lt;br /&gt;
This operators are declared as operators on the standard in contrast to &lt;br /&gt;
application level, as they are not expected to be invoked as an application.&lt;br /&gt;
However, setting the level to standard in the menu of the graphical user interface&lt;br /&gt;
stills allows their execution.&lt;br /&gt;
When extending the abstract super class it is necessary to annotate the&lt;br /&gt;
class with &amp;lt;code&amp;gt;@ALDDerivedClass&amp;lt;/code&amp;gt; in order to allow Alida's dataIO mechanism to find the derived class&lt;br /&gt;
in the automatically generated user interface.&lt;br /&gt;
This holds for other parameter types as well.&lt;br /&gt;
More specifically, if an instance of a class is to be supplied in an automatically &lt;br /&gt;
generated user interface as a value for a parameter of one of its super classes,&lt;br /&gt;
Alida requires the annotation &amp;lt;code&amp;gt;@ALDDerivedClass&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDDerivedClass&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
        level=ALDAOperator.Level.STANDARD)&lt;br /&gt;
public class ALDArraySum extends ALDSummarizeArrayOp {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void operate() {&lt;br /&gt;
        summary = 0.0;&lt;br /&gt;
        for ( int i = 0 ; i &amp;lt; data.length ; i++ )&lt;br /&gt;
            summary += data[i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Default constructor.&lt;br /&gt;
     * @throws ALDOperatorException&lt;br /&gt;
     */&lt;br /&gt;
    public ALDArraySum() throws ALDOperatorException {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we are ready to implement &lt;br /&gt;
the &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt; operator, which also demonstrates supplemental parameters.&lt;br /&gt;
This supplementals, e.g., control debugging output or returning of intermediate results.&lt;br /&gt;
For demo purposes we declare a supplemental input parameter &amp;lt;code&amp;gt;returnElapsedTime&amp;lt;/code&amp;gt;.&lt;br /&gt;
If it is set to true the operator will return the elapsed time in a second&lt;br /&gt;
supplemental parameter with direction output.&lt;br /&gt;
&lt;br /&gt;
Again, the operation is implemented in the  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method and the remainder of the&lt;br /&gt;
class supplies getter and setter methods for convenience.&lt;br /&gt;
The  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method give also an example of the invocation of an operator on the&lt;br /&gt;
programming level.&lt;br /&gt;
In this case, an instance of the operator is already passed as a parameter.&lt;br /&gt;
Its parameters are set, in this case each 1D array to be summarized in turn.&lt;br /&gt;
Upon return from the method &amp;lt;code&amp;gt;runOp()&amp;lt;/code&amp;gt; the results may be retrieved from the operator object,&lt;br /&gt;
in this example with the &amp;lt;code&amp;gt;getSummary()&amp;lt;/code&amp;gt; method.&lt;br /&gt;
Besides getter and setter methods as implemented in each operator&lt;br /&gt;
Alida provides also a generic get and set methods applicable to&lt;br /&gt;
all parameters of an operator.&lt;br /&gt;
Note, that the operator is not invoked by its  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt; method, but via&lt;br /&gt;
the &amp;lt;code&amp;gt;runOp()&amp;lt;/code&amp;gt; method implemented the base class &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt;.&lt;br /&gt;
This methods validates the parameters before invocation of  &amp;lt;code&amp;gt;operate()&amp;lt;/code&amp;gt;.&lt;br /&gt;
Furthermore, it take all necessary measures for Alida's processing&lt;br /&gt;
history which automatically logs&lt;br /&gt;
all manipulative actions on the data and corresponding parameter settings. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
            level=ALDAOperator.Level.APPLICATION)&lt;br /&gt;
public class ApplyToMatrix extends ALDOperator {&lt;br /&gt;
&lt;br /&gt;
    /** Choose row or colum wise sum&lt;br /&gt;
      */&lt;br /&gt;
    public static enum SummarizeMode {&lt;br /&gt;
      /** row wise */&lt;br /&gt;
      ROW,&lt;br /&gt;
      /** column wise */&lt;br /&gt;
      COLUMN&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Input matrix&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Input matrix&amp;quot;, required = true, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Input matrix.&amp;quot;)&lt;br /&gt;
    private Double[][] matrix;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Mode of summarizing&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Summarize mode&amp;quot;, required = true, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Sum over columns or rows.&amp;quot;)&lt;br /&gt;
    private SummarizeMode summarizeMode = SummarizeMode.ROW;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Summarizing opererator&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Summarizing operator&amp;quot;, required = true, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Specifies the summarizing operation to apply&amp;quot;)&lt;br /&gt;
    private ALDSummarizeArrayOp summarizeOp;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * 1D Array of summaries.&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;summaries&amp;quot;,  &lt;br /&gt;
          direction = Parameter.Direction.OUT, description = &amp;quot;Row or column wise summaries&amp;quot;)&lt;br /&gt;
    private Double[] summaries = null;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Supplemental to request elapsed time to be returned&lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Return elapsed time&amp;quot;, &lt;br /&gt;
          direction = Parameter.Direction.IN, description = &amp;quot;Request elapsed time consumed to be returned&amp;quot;,&lt;br /&gt;
        supplemental=true)&lt;br /&gt;
    private boolean returnElapsedTime = false;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Elpased time &lt;br /&gt;
     */&lt;br /&gt;
    @Parameter( label= &amp;quot;Elapsed time&amp;quot;,  &lt;br /&gt;
          direction = Parameter.Direction.OUT, description = &amp;quot;Elapsed time of operation in milliseconds&amp;quot;,&lt;br /&gt;
        supplemental=true)&lt;br /&gt;
    private long elapsedTime;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Default constructor.&lt;br /&gt;
     * @throws ALDOperatorException&lt;br /&gt;
     */&lt;br /&gt;
    public ApplyToMatrix() throws ALDOperatorException {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Constructor.&lt;br /&gt;
     * &lt;br /&gt;
     * @param matrix    Input matrix.&lt;br /&gt;
     * @throws ALDOperatorException&lt;br /&gt;
     */&lt;br /&gt;
    public ApplyToMatrix(Double[] [] matrix) throws ALDOperatorException {&lt;br /&gt;
        this.matrix = matrix;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void operate() throws ALDOperatorException,ALDProcessingDAGException {&lt;br /&gt;
        if ( returnElapsedTime ) &lt;br /&gt;
            elapsedTime = System.currentTimeMillis();&lt;br /&gt;
&lt;br /&gt;
        if ( matrix == null ) &lt;br /&gt;
            summaries = null;&lt;br /&gt;
&lt;br /&gt;
        // calculate summaries&lt;br /&gt;
        if ( summarizeMode == SummarizeMode.ROW ) {&lt;br /&gt;
            summaries = new Double[matrix.length];&lt;br /&gt;
            for ( int row = 0 ; row &amp;lt; matrix.length ; row++ ) {&lt;br /&gt;
                summarizeOp.setData(matrix[row]);&lt;br /&gt;
                summarizeOp.runOp();&lt;br /&gt;
                summaries[row] = summarizeOp.getSummary();&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            summaries = new Double[matrix[0].length];&lt;br /&gt;
            Double[] tmp = new Double[matrix.length];&lt;br /&gt;
            for ( int col = 0 ; col &amp;lt; matrix[0].length ; col++ ) {&lt;br /&gt;
                for ( int row = 0 ; row &amp;lt; matrix.length ; row++ )&lt;br /&gt;
                    tmp[row] = matrix[row][col];&lt;br /&gt;
&lt;br /&gt;
                summarizeOp.setData(tmp);&lt;br /&gt;
                summarizeOp.runOp();&lt;br /&gt;
                summaries[col] = summarizeOp.getSummary();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if ( returnElapsedTime ) &lt;br /&gt;
            elapsedTime = System.currentTimeMillis() - elapsedTime;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // ==============================================================&lt;br /&gt;
    // Getter and setter methods&lt;br /&gt;
    /** Get value of returnElapsedTime.&lt;br /&gt;
      * Explanation: Request elapsed time consumed to be returned.&lt;br /&gt;
      * @return value of returnElapsedTime&lt;br /&gt;
      */&lt;br /&gt;
    public boolean getReturnElapsedTime(){&lt;br /&gt;
        return returnElapsedTime;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /** Set value of returnElapsedTime.&lt;br /&gt;
      * Explanation: Request elapsed time consumed to be returned.&lt;br /&gt;
      * @param value New value of returnElapsedTime&lt;br /&gt;
      */&lt;br /&gt;
    public void setReturnElapsedTime( boolean value){&lt;br /&gt;
        this.returnElapsedTime = value;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==   Invocation via a graphical user interface ==&lt;br /&gt;
&lt;br /&gt;
If the graphical interface is still running just select our new operator&lt;br /&gt;
and begin to configure it.&lt;br /&gt;
For the parameter summarizing operator you have a choice of all operators extending&lt;br /&gt;
the abstract operator &amp;lt;code&amp;gt;ALDSummarizeArrayOp&amp;lt;/code&amp;gt;.&lt;br /&gt;
All which is necessary on the implementation side is proper annotation of the extending&lt;br /&gt;
classes with &amp;lt;code&amp;gt;@ALDDerivedClass&amp;lt;/code&amp;gt;.&lt;br /&gt;
As the selected operator may have its own parameters you may want to configure it.&lt;br /&gt;
In our example this is not necessary as the input array is, of course, supplied&lt;br /&gt;
by the &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt; operator.&lt;br /&gt;
Do not forget to input your data before hitting the run button.&lt;br /&gt;
After return, again a result window give you the results of the operation.&lt;br /&gt;
Note, if you did not tick Return elapsed time&amp;quot; this window will show zero&lt;br /&gt;
for the time elapsed as the operator has not been request to stop the time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==   Invocation via command line ==&lt;br /&gt;
&lt;br /&gt;
When invoking the &amp;lt;code&amp;gt;ApplyToMatrix&amp;lt;/code&amp;gt; operator from command line&lt;br /&gt;
we have to handle derived classes as value for parameters.&lt;br /&gt;
In the graphical user interface Alida features a combo box where&lt;br /&gt;
we may choose from.&lt;br /&gt;
In the command line interface Alida allows to prefix the value of a parameter&lt;br /&gt;
with a derived class to be passed to the operator.&lt;br /&gt;
This is necessary as Alida as, of course, no way to itself&lt;br /&gt;
decide if and which derived class is to be used.&lt;br /&gt;
Alida's syntax is to enclose the class name in a dollar sign and a colon.&lt;br /&gt;
As evident in the following example, abbreviations are of the fully&lt;br /&gt;
qualified class name are accepted as long as they are unambiguous.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner Apply \&lt;br /&gt;
	matrix='[[1,2,3],[4,5,6]]' \&lt;br /&gt;
	summarizeMode=ROW \&lt;br /&gt;
	summarizeOp='&amp;lt;math&amp;gt;ALDArrayMean:{}' \&lt;br /&gt;
	summaries=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
results in&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
summaries = [2.0,5.0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ALDOpRunner&amp;lt;/code&amp;gt; may be persuaded to show all operators derived from &amp;lt;code&amp;gt;ALDSummarizeArrayOp&amp;lt;/code&amp;gt;&lt;br /&gt;
and known within the user interface if we enter an invalid class name:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner \&lt;br /&gt;
	Apply matrix='[[1,2,3],[4,5,6]]' \&lt;br /&gt;
	summarizeMode=ROW summarizeOp='&amp;lt;/math&amp;gt;dd:{}' \&lt;br /&gt;
	summaries=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
yields&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALDStandardizedDataIOCmdline::readData found 0 derived classes matching &amp;lt;dd&amp;gt;&lt;br /&gt;
      derived classes available:&lt;br /&gt;
	de.unihalle.informatik.Alida.demo.ALDArrayMean&lt;br /&gt;
	de.unihalle.informatik.Alida.demo.ALDArrayMin&lt;br /&gt;
	de.unihalle.informatik.Alida.demo.ALDArraySum&lt;br /&gt;
ERROR: reading parameter &amp;lt;summarizeOp&amp;gt; returns null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supplemental parameters are handled like other parameters&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner Apply \&lt;br /&gt;
	matrix='[[1,2,3],[4,5,6]]' \&lt;br /&gt;
	summarizeMode=COLUMN \&lt;br /&gt;
	summarizeOp='&amp;lt;math&amp;gt;ALDArrayMin:{}' \&lt;br /&gt;
	summaries=- \&lt;br /&gt;
	returnElapsedTime=true \&lt;br /&gt;
	elapsedTime=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
gives&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	summaries = [1.0,2.0,3.0]&lt;br /&gt;
	elapsedTime = 4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=   Adding more data types as parameters =&lt;br /&gt;
&lt;br /&gt;
Alida provides automatic IO of primitive data types, enumerations, arrays, collections,&lt;br /&gt;
and operators.&lt;br /&gt;
In addition so called parameterized classes are supported.&lt;br /&gt;
Any Java class may be declared to be a parameterized class in Alida&lt;br /&gt;
by annotating the class &amp;lt;code&amp;gt;@ALDParametrizedClass&amp;lt;/code&amp;gt; as shown in the&lt;br /&gt;
class &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt;.&lt;br /&gt;
All member variables to be known to and handled by Alida's user interface&lt;br /&gt;
simply need to be annotated with &amp;lt;code&amp;gt;@ALDClassParameter&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Here we implement a toy version of experimental data &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt;.&lt;br /&gt;
A complete experiment contains&lt;br /&gt;
data of a time series of measurements of variable length.&lt;br /&gt;
Additional information is a descriptive string, the time resolution in milliseconds,&lt;br /&gt;
and whether baseline correction has been applied.&lt;br /&gt;
&lt;br /&gt;
The class is annotated by &amp;lt;code&amp;gt;@ALDParametrizedClass&amp;lt;/code&amp;gt;, and&lt;br /&gt;
and all members to be handle in Alida'a user interfaces are&lt;br /&gt;
to be annotated with &amp;lt;code&amp;gt;@ALDParametrizedClass&amp;lt;/code&amp;gt;.&lt;br /&gt;
The label field has the same semantics as for parameters of operators.&lt;br /&gt;
These annotations are the only implementational overhead&lt;br /&gt;
to allow Alida to automatically generate user interfaces&lt;br /&gt;
where the parameterized class acts as a parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDParametrizedClass&lt;br /&gt;
public class ExperimentalData1D extends ALDData {&lt;br /&gt;
	&lt;br /&gt;
    /** Description */&lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;description&amp;quot;, dataIOOrder = 1)&lt;br /&gt;
    private String description = null;&lt;br /&gt;
&lt;br /&gt;
    /** The data  */&lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;data&amp;quot;, dataIOOrder = 2)&lt;br /&gt;
    private Double[] data = null;&lt;br /&gt;
&lt;br /&gt;
    /** Are the data baseline corrected? */&lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;Baseline corrected&amp;quot;,&lt;br /&gt;
    			dataIOOrder = 3)&lt;br /&gt;
    private boolean baselineCorrected = false;&lt;br /&gt;
    &lt;br /&gt;
    @ALDClassParameter(label=&amp;quot;Time resolution in milliseconds&amp;quot;, dataIOOrder = 4)&lt;br /&gt;
    private Float timeResolution = Float.NaN;&lt;br /&gt;
&lt;br /&gt;
    /** &lt;br /&gt;
     * Standard constructor is required&lt;br /&gt;
      */&lt;br /&gt;
    public ExperimentalData1D() {&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /** Constructor for an experiment.&lt;br /&gt;
      * Baseline correction is assumed to be false and nothung known about&lt;br /&gt;
      * the time resolution.&lt;br /&gt;
      *&lt;br /&gt;
      * @param  description   a textual description of the experiment&lt;br /&gt;
      * @param  data   measurements&lt;br /&gt;
      */&lt;br /&gt;
    public ExperimentalData1D( String description, Double[] data) {    &lt;br /&gt;
        this( description, data, false, Float.NaN);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is shown below for a simple normalizing operator &amp;lt;code&amp;gt;SmoothData1D&amp;lt;/code&amp;gt;&lt;br /&gt;
which takes experimental data as input an returns a new instance&lt;br /&gt;
of &amp;lt;code&amp;gt;ExperimentalData&amp;lt;/code&amp;gt; which contains smoothed data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ALDDerivedClass&lt;br /&gt;
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,&lt;br /&gt;
              level=ALDAOperator.Level.APPLICATION)&lt;br /&gt;
public class SmoothData1D extends ALDOperator {&lt;br /&gt;
&lt;br /&gt;
	public enum SmoothingMethod {&lt;br /&gt;
		MEDIAN, MEAN, GAUSSIAN&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/** 1D Experiment&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label= &amp;quot;1D Experiment&amp;quot;, required = true, &lt;br /&gt;
			direction = Parameter.Direction.IN, &lt;br /&gt;
			description = &amp;quot;1D Experiment&amp;quot;,&lt;br /&gt;
			dataIOOrder = 1)&lt;br /&gt;
	protected ExperimentalData1D experiment;&lt;br /&gt;
&lt;br /&gt;
	/** Smoothing method&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label = &amp;quot;Smoothing method&amp;quot;, required = true,&lt;br /&gt;
			direction = Parameter.Direction.IN,&lt;br /&gt;
			callback = &amp;quot;smoothingMethodChanged&amp;quot;,&lt;br /&gt;
			description = &amp;quot;Smoothing method&amp;quot;,&lt;br /&gt;
			paramModificationMode = ParameterModificationMode.MODIFIES_INTERFACE,&lt;br /&gt;
			dataIOOrder = 2)&lt;br /&gt;
	SmoothingMethod smoothingMethod = SmoothingMethod.MEDIAN;&lt;br /&gt;
&lt;br /&gt;
	/** Window width&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label = &amp;quot;Window width&amp;quot;, required = true,&lt;br /&gt;
			direction = Parameter.Direction.IN,&lt;br /&gt;
			description = &amp;quot;Window width (should be uneven)&amp;quot;,&lt;br /&gt;
			dataIOOrder = 3)&lt;br /&gt;
	Integer width = 3;&lt;br /&gt;
&lt;br /&gt;
	/** Standard deviation of Gaussian&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label = &amp;quot;Standdard deviation of Gaussian&amp;quot;, required = true,&lt;br /&gt;
			direction = Parameter.Direction.IN,&lt;br /&gt;
			description = &amp;quot;Standdard deviation of Gaussian&amp;quot;,&lt;br /&gt;
			dataIOOrder = 3)&lt;br /&gt;
	Float sigma = 1.0F;&lt;br /&gt;
&lt;br /&gt;
	/** Smoothed 1D Experiment&lt;br /&gt;
	 */&lt;br /&gt;
	@Parameter( label= &amp;quot;Smothed 1D Experiment&amp;quot;,  &lt;br /&gt;
			direction = Parameter.Direction.OUT, &lt;br /&gt;
			description = &amp;quot;Smothed1D Experiment&amp;quot;,&lt;br /&gt;
			dataIOOrder = 1)&lt;br /&gt;
	protected ExperimentalData1D smoothedExperiment;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Default constructor.&lt;br /&gt;
	 * @throws ALDOperatorException&lt;br /&gt;
	 */&lt;br /&gt;
	public SmoothData1D() throws ALDOperatorException {&lt;br /&gt;
		// necessary handle dynamic parameters correctly&lt;br /&gt;
		smoothingMethodChanged();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	protected void operate() {&lt;br /&gt;
		this.fireOperatorExecutionProgressEvent(&lt;br /&gt;
				new ALDOperatorExecutionProgressEvent(this, &lt;br /&gt;
						&amp;quot;Starting to smooth 1D Data...&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
		Double[] smoothedData;&lt;br /&gt;
		if ( smoothingMethod == SmoothingMethod.MEDIAN) {&lt;br /&gt;
			smoothedData = median( experiment.getData(), this.width);&lt;br /&gt;
		} else {&lt;br /&gt;
			smoothedData = smoothByConvolution();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		smoothedExperiment = new ExperimentalData1D( experiment.getDescription() + &amp;quot; (smoothed)&amp;quot;, &lt;br /&gt;
				smoothedData, experiment.isBaselineCorrected(), experiment.getTimeResolution());&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This mechanism applies in a recursive fashion, i.e. a parameterized class may&lt;br /&gt;
(recursively) contain a member variable which itself is a parametrized class.&lt;br /&gt;
Likewise, an operator acting as a parameter of another operator&lt;br /&gt;
may in turn have a parameter of type &amp;lt;code&amp;gt;ALDOperator&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==   Invocation via a graphical user interface ==&lt;br /&gt;
&lt;br /&gt;
Invoking and configuring &amp;lt;code&amp;gt;SmoothData1D&amp;lt;/code&amp;gt; from the graphical user interface&lt;br /&gt;
shows as the only required parameter the experimental data.&lt;br /&gt;
This parameterized class can be configured in a separate  window&lt;br /&gt;
very similar to to configuration of operators.&lt;br /&gt;
Likewise the resulting normalized experimental data&lt;br /&gt;
may be inspected in their own window.&lt;br /&gt;
&lt;br /&gt;
Obviously this is a toy example, as we would not expect the measurements to&lt;br /&gt;
be entered manually, but rather stored and read from file in a specialized format.&lt;br /&gt;
This is one of the rare cases where &lt;br /&gt;
custom data IO provider need to be implemented, in this&lt;br /&gt;
case for &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==   Invocation via command line ==&lt;br /&gt;
&lt;br /&gt;
Again, invocation from command line is provided by Alida in an automatic&lt;br /&gt;
way with no further implementational overhead.&lt;br /&gt;
The syntax for parameterized classes es a comma separated list of name=value pairs&lt;br /&gt;
enclosed in curly brackets where name refers to annotated member variables of&lt;br /&gt;
the parameterized class.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java de.unihalle.informatik.Alida.tools.ALDOpRunner SmoothData1D \&lt;br /&gt;
	experiment='{ baselineCorrected=false , \&lt;br /&gt;
                      description=&amp;quot;my experiment&amp;quot; , \&lt;br /&gt;
                      data=[1.0,2.0,2.2,3.3,2.0,1.0,1.0,1.0,1.0,2.0,3.3,2.0] }' \&lt;br /&gt;
        smoothingMethod=GAUSSIAN \&lt;br /&gt;
	smoothedExperiment=-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
yields&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
smoothedExperiment = { baselineCorrected=false , &lt;br /&gt;
    data=[1.28,1.85,2.37,2.76,2.05,1.23,1.01,1.01,1.23,2.05,2.73,2.35] , &lt;br /&gt;
    timeResolution=NaN , &lt;br /&gt;
    description=&amp;quot;my experiment&amp;quot; (smoothed) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If a class derived from &amp;lt;code&amp;gt;ExperimentalData1D&amp;lt;/code&amp;gt; was to be supplied to the operator,&lt;br /&gt;
the curly brackets can be prefixed by a derive class definition starting with a dollar sign&lt;br /&gt;
and ending with a colon as shown for the summarizing operators above.&lt;/div&gt;</summary>
		<author><name>Posch</name></author>
	</entry>
	<entry>
		<id>https://alida.informatik.uni-halle.de/index.php?title=Installation&amp;diff=110</id>
		<title>Installation</title>
		<link rel="alternate" type="text/html" href="https://alida.informatik.uni-halle.de/index.php?title=Installation&amp;diff=110"/>
		<updated>2012-12-20T14:25:14Z</updated>

		<summary type="html">&lt;p&gt;Posch: /* Java */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;On this page you find install instructions for Alida in C++ and in Java.&lt;br /&gt;
&lt;br /&gt;
== Java ==&lt;br /&gt;
&lt;br /&gt;
Extract the download Alida_bin.zip and change the current working directory to the top level directory&lt;br /&gt;
of the extracted files.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
You can start grappa using&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcsh share/scripts/runAlida.tcsh &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bash share/scripts/runAlida.bash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you grant execute permissions to these scripts you can start them directly, e.g.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
share/scripts/runAlida.tcsh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you in addition modify the variable ALIDA_HOME in these scripts you can start them from any&lt;br /&gt;
any directory.&lt;br /&gt;
&lt;br /&gt;
To start the graphical user interface to configure and start operators you may use&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
share/scripts/runAlida.tcsh guioprunner&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The command line interface is invoked, e.g., via&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
share/scripts/runAlida.tcsh oprunner -h&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
which displays the help message.&lt;br /&gt;
&lt;br /&gt;
== C++ ==&lt;br /&gt;
The C++ implementation of Alida currently works only on Linux machines.&lt;br /&gt;
For installing Alida perform the following steps:&lt;br /&gt;
&lt;br /&gt;
# Download the tar or zip archive from the [[Downloads]] section of this website.&lt;br /&gt;
# Extract the archive to a directory of your choice which we denote by ''ALIDA_HOME'' in the following.&lt;br /&gt;
# Download [http://loki-lib.sourceforge.net/index.php?n=Main.HomePage Loki], i.e. go to the [http://sourceforge.net/projects/loki-lib/files/Loki/ SourceForge project page] and download release 0.1.7 of the Loki library.&lt;br /&gt;
# Extract the Loki archive to the folder ''ALIDA_HOME/external''.&amp;lt;br&amp;gt;Alternatively you can extract it somewhere else and set a link to that directory in ''ALIDA_HOME/external''.&lt;br /&gt;
# Define an environment variable ''''ALIDA_CPP'''' with the path of your Alida installation, i.e. the path of ''ALIDA_HOME''.&lt;br /&gt;
# Enter the directory ''ALIDA_HOME/src'' and type 'make'.&lt;br /&gt;
# The demo operator and the command line operator runner will be built.&amp;lt;br&amp;gt;To run the demo operator, enter the directory ''ALIDA_HOME/src/runner/o.&amp;lt;your-machine&amp;gt;'' and execute it with &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./ALDOpRunner DemoOperator intval=4711 doubleval=0.999999 floatval=0.123 stringval=&amp;quot;Alida-Cpp&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Optional: include OpenCV demo operator and provider ====&lt;br /&gt;
&lt;br /&gt;
To activate the OpenCV demo you need to have the OpenCV available on your system. Install instructions can be found [http://opencv.willowgarage.com/wiki/InstallGuide here].&amp;lt;br&amp;gt;&lt;br /&gt;
To build the OpenCV related classes of Alida edit the configuration file ''ALIDA_HOME/src/config.mk''.&amp;lt;br&amp;gt;&lt;br /&gt;
On top of the file you find a configuration section which defines three variables:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#############################################################################&lt;br /&gt;
# user-specific configuration&lt;br /&gt;
#############################################################################&lt;br /&gt;
&lt;br /&gt;
OPENCV_SUPPORT = no&lt;br /&gt;
OPENCV_INCLUDE = /usr/include&lt;br /&gt;
OPENCV_LIB = /usr/lib&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Change the value of '''OPENCV_SUPPORT''' to 'yes' and set include and library path variables according to your OpenCV installation.&amp;lt;br&amp;gt;&lt;br /&gt;
Afterwards rebuild Alida by running 'make clean all'. The OpenCV demo operator can be run with&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./ALDOpRunner DemoOperatorOpenCV inputImg=&amp;lt;example_image&amp;gt; sigma=151&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Posch</name></author>
	</entry>
	<entry>
		<id>https://alida.informatik.uni-halle.de/index.php?title=Main_Page&amp;diff=109</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://alida.informatik.uni-halle.de/index.php?title=Main_Page&amp;diff=109"/>
		<updated>2012-12-20T13:59:45Z</updated>

		<summary type="html">&lt;p&gt;Posch: /* News */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== [[News]] ==&lt;br /&gt;
&lt;br /&gt;
* 12/20/2010 &amp;lt;br&amp;gt;Release of version 2.0.&amp;lt;br&amp;gt;  This version includes the graphical editor '''Grappa''' to compose workflows of operators.&lt;br /&gt;
&lt;br /&gt;
* 11/10/2012: &amp;lt;br&amp;gt; Updated version of Chipory available for download.&lt;br /&gt;
&lt;br /&gt;
* 26/07/2012: &amp;lt;br&amp;gt; Alida will be presented at the '''''ImageJ User &amp;amp; Developer Conference 2012''''' to be held at the end of October in Mondorf-les-Bains, Luxembourg.&amp;lt;br&amp;gt; There will be a poster presentation combined with a demo entitled [http://imagejconf.tudor.lu/program/poster/birgit_moeller996310491 '''Automatic Generation of Processing Histories using Alida'''].&amp;lt;br&amp;gt; It will provide an introduction to the processing history mechanism implemented in Alida, and its usage.&amp;lt;br&amp;gt; Also a talk will be given about our new graphical editor ''Grappa'' entitled '''Graphical Programming in Alida and ImageJ 2.0 with Grappa'''.&lt;br /&gt;
&lt;br /&gt;
* 12/07/2012: &amp;lt;br&amp;gt;New release of chipory ready for download&lt;br /&gt;
&lt;br /&gt;
* 21/03/2012:&amp;lt;br&amp;gt; Alida will be presented at the '''''IEEE International Symposium on Biomedical Imaging (ISBI)''''' to be held at the end of April in Barcelona.&amp;lt;br&amp;gt; There will be a poster presentation combined with a demo at the '''''Bioimage Analysis Workshop on Open Source Software''''' held in conjunction with ISBI.&amp;lt;br&amp;gt; The title will be '''ALIDA - Automatic generation of user interfaces for data analysis algorithms'''.&lt;br /&gt;
&lt;br /&gt;
* 12/03/2012:&amp;lt;br&amp;gt; The Alida concept now features a prototypical implementation in C++! It supports generic operator execution from command line.&amp;lt;br&amp;gt;Release 0.1 is available now from the download page.&lt;br /&gt;
&lt;br /&gt;
* 02/03/2012:&amp;lt;br&amp;gt;Alida release 1.2 has just been published! You can get the new version in the download section!&amp;lt;br&amp;gt;Main new feature: generic user interface generation for operators to use them from commandline and via a Swing GUI!&lt;br /&gt;
&lt;br /&gt;
== Alida - &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;A&amp;lt;/span&amp;gt;dvanced &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;L&amp;lt;/span&amp;gt;ibrary for &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;I&amp;lt;/span&amp;gt;ntegrated &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;D&amp;lt;/span&amp;gt;evelopment of Data Analysis &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;A&amp;lt;/span&amp;gt;pplications ==&lt;br /&gt;
&lt;br /&gt;
...formerly known as Alida - &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;A&amp;lt;/span&amp;gt;utomatic &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;L&amp;lt;/span&amp;gt;ogging of Process &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;I&amp;lt;/span&amp;gt;nformation in &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;D&amp;lt;/span&amp;gt;ata &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;A&amp;lt;/span&amp;gt;nalysis &lt;br /&gt;
&lt;br /&gt;
Alida defines a concept for designing libraries and toolkits in data analysis. It supports and simplifies integrated algorithm development by inherently joining algorithm implementation, automatic analysis process documentation and fully generic generation of user interfaces. In Alida each data analysis or manipulation action is realized in terms of an operator that acts on given data to produce desired output data. As all operators implement a common interface definition, their input and output parameters are accessible in a standardized manner, and they can also be invoced in a predefined way. &lt;br /&gt;
&lt;br /&gt;
Calls to operators not only produce data analysis results, but are at the same time registered within the framework together with all input and output objects as well as parameters settings of the various operators. These data acquired during an analysis process and the order of operator calls form a directed graph datastructure containing all relevant information for later reconstruction or verification of the analysis procedure. Alida allows to make the directed graph datastructure explicit in terms of XML representations which can be visually explored with appropriate graphical frontends like Chipory, or might be stored in data bases for archival purposes.&lt;br /&gt;
&lt;br /&gt;
Alida's operator concept is well-suited to ease algorithm development and their application to real-world problems by non-expert users. Due to the operator interface definition and the unified handling of operators it is for example possible to automatically generate user interfaces for operators, i.e. graphical frontends or commanline interfaces.&lt;br /&gt;
&lt;br /&gt;
== Licensing information ==&lt;br /&gt;
Alida is free software: you can redistribute it and/or modify under the terms of the [http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3] or (at your option) any later version as published by the [http://www.fsf.org/ Free Software Foundation].&lt;br /&gt;
&lt;br /&gt;
== Current releases ==&lt;br /&gt;
&lt;br /&gt;
==== Java ====&lt;br /&gt;
You can download Alida's Java implementation in version 1.2 [[Downloads | here]]. &amp;lt;br /&amp;gt;&lt;br /&gt;
You can find the API documentation for this release [http://www2.informatik.uni-halle.de/agprbio/alida/api/java/index.html here].&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== C++ ====&lt;br /&gt;
You can download Alida's prototypical C++ implementation in version 0.1 [[Downloads | here]]. &amp;lt;br /&amp;gt;&lt;br /&gt;
You can find the API documentation for this release [http://www2.informatik.uni-halle.de/agprbio/alida/api/cpp/index.html here].&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Manual ==&lt;br /&gt;
Alida offers you a user and programmer manual you can download [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/manual/AlidaManual.pdf here]. Note that the manual is currently focussed on the mature Java implementation, but it will be updated in near future to cover both implementations.&lt;br /&gt;
&lt;br /&gt;
== Bug reports &amp;amp; Feature requests ==&lt;br /&gt;
Bug reports and feature requests can be submitted via the [http://www2.informatik.uni-halle.de/agprbio/mitobo-bts/bug_report_page.php bugtracking system] or by mail to [mailto:alida@informatik.uni-halle.de alida@informatik.uni-halle.de].&amp;lt;br /&amp;gt;&lt;br /&gt;
Before reporting a new bug, please check if that bug has already been submitted in the [http://www2.informatik.uni-halle.de/agprbio/mitobo-bts/view_all_bug_page.php report list].&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Posch</name></author>
	</entry>
	<entry>
		<id>https://alida.informatik.uni-halle.de/index.php?title=Downloads&amp;diff=108</id>
		<title>Downloads</title>
		<link rel="alternate" type="text/html" href="https://alida.informatik.uni-halle.de/index.php?title=Downloads&amp;diff=108"/>
		<updated>2012-12-20T13:26:48Z</updated>

		<summary type="html">&lt;p&gt;Posch: /* Java implementation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Java implementation =&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
Alida's implementation in Java requires Java 1.6 or later. &lt;br /&gt;
Alida requires some external jars which are included in the Alida binary zipfile since V2.0.&lt;br /&gt;
&lt;br /&gt;
For earlier versions the following external jars are needed to use Alida:&lt;br /&gt;
&lt;br /&gt;
* [http://xmlbeans.apache.org/ XMLBeans], Version 2.5.0&lt;br /&gt;
* [http://xstream.codehaus.org/ XStream], Version 1.3.1&lt;br /&gt;
* [http://javahelp.java.net/ JavaHelp], Version 2.0_05&lt;br /&gt;
&lt;br /&gt;
In addition, Alida requires some more libraries which are in-house developments:&lt;br /&gt;
&lt;br /&gt;
* Alida also requires some graphml extensions to be found in '''''aldgraphml.jar'''''.&lt;br /&gt;
* The graphical operator runner features an online help system based on [http://javahelp.java.net/ JavaHelp System] which is included in '''Alida-Help.jar'''.&lt;br /&gt;
&lt;br /&gt;
If you download the Alida binary zipfile you will find these two libraries in the subdirectory ''intjars'' of the zipfile.&amp;lt;br/&amp;gt; Make sure that all of them are in the classpath when executing the operator runners.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Current release (v2.0)==&lt;br /&gt;
* Alida Java Binaries [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_bin.zip zip] (includes Alida binaries, license information and the file ''aldgraphml.jar'' with Alida's extensions of graphml)&lt;br /&gt;
* Alida Java Sources [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_src.zip zip] (includes only the sources, license files and some READMEs on how to use and compile Alida)&lt;br /&gt;
* Alida Java API [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_api.zip zip] (includes Javadocs of Alida's API)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Archive of Alida's Java releases ==&lt;br /&gt;
&lt;br /&gt;
{| border = &amp;quot;1&amp;quot; cellpadding = &amp;quot;5pt&amp;quot; cellspacing = &amp;quot;0&amp;quot; style = &amp;quot;border-color: #DDD; text-align: center; width: 80%&amp;quot;&lt;br /&gt;
! Version &lt;br /&gt;
! Binaries &lt;br /&gt;
! Sources &lt;br /&gt;
! API &lt;br /&gt;
! Date&lt;br /&gt;
|-&lt;br /&gt;
| 2.0&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_bin-2.0.zip zip]&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_src-2.0.zip zip]&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_api-2.0.zip zip]&lt;br /&gt;
| March 2nd, 2012&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| 1.2&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_bin-1.2.zip zip]&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_src-1.2.zip zip]&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_api-1.2.zip zip]&lt;br /&gt;
| March 2nd, 2012&lt;br /&gt;
|-&lt;br /&gt;
| 1.1&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_bin-1.1.zip zip]&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_src-1.1.zip zip]&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_api-1.1.zip zip]&lt;br /&gt;
| Sep 14th, 2011&lt;br /&gt;
|-&lt;br /&gt;
| 1.0&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_bin-1.0.zip zip]&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_src-1.0.zip zip]&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_api-1.0.zip zip]&lt;br /&gt;
| May 9th, 2011&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= C++ implementation =&lt;br /&gt;
&lt;br /&gt;
Alida's implementation in C++ requires Linux as operating system. &lt;br /&gt;
&lt;br /&gt;
The following external libraries are needed:&lt;br /&gt;
&lt;br /&gt;
* [http://loki-lib.sourceforge.net/index.php?n=Main.HomePage Loki], Version 0.17&lt;br /&gt;
&lt;br /&gt;
Optionally a prototypical implementation of an OpenCV wrapper is included for which the OpenCV library is required:&lt;br /&gt;
* [http://opencv.willowgarage.com/wiki/ OpenCV], Version 2.1 or higher (refer to the [[Installation]] section for details on compiling the OpenCV wrapper)&lt;br /&gt;
&lt;br /&gt;
== Current release (v0.1)==&lt;br /&gt;
* Alida C++ Sources [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/cpp/Alida-Cpp_src.zip zip] (includes the sources, license files and some READMEs on how to use and compile Alida)&lt;br /&gt;
* Alida C++ API [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/cpp/Alida-Cpp_api.zip zip] (includes Doxygen documentation of Alida's C++ API)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Archive of Alida's C++ releases ==&lt;br /&gt;
&lt;br /&gt;
{| border = &amp;quot;1&amp;quot; cellpadding = &amp;quot;5pt&amp;quot; cellspacing = &amp;quot;0&amp;quot; style = &amp;quot;border-color: #DDD; text-align: center; width: 80%&amp;quot;&lt;br /&gt;
! Version &lt;br /&gt;
! Sources &lt;br /&gt;
! API &lt;br /&gt;
! Date&lt;br /&gt;
|-&lt;br /&gt;
| 0.1&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/cpp/Alida-Cpp_src-0.1.zip zip] [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/cpp/Alida-Cpp_src-0.1.tgz tgz] &lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/cpp/Alida-Cpp_api-0.1.zip zip] [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/cpp/Alida-Cpp_api-0.1.tgz tgz]&lt;br /&gt;
| March 12th, 2012&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Manual =&lt;br /&gt;
&lt;br /&gt;
Detailed information about Alida, its API and usage, can be found in the user and programmer manual. &lt;br /&gt;
&lt;br /&gt;
* Alida-Manual, Version 1.3 [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/manual/AlidaManual.pdf pdf]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Additional resources =&lt;br /&gt;
&lt;br /&gt;
* '''Chipory''' - a graph visualization tool for displaying MiToBo history graphs&amp;lt;br/&amp;gt;Chipory is an extended version of the [http://www.cs.bilkent.edu.tr/~ivis/chisio.html Chisio software] developed at the Bilkent University in Turkey.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The zip file below contains all necessary files. Download this file and unpack it into a folder of your choice.&lt;br /&gt;
&lt;br /&gt;
* To use Chipory on a Linux system with 32-bit architecture just type './Chipory.sh'.&amp;lt;BR&amp;gt;&lt;br /&gt;
* In case that your machine has a 64-bit architecture running Linux, call './Chipory_64.sh'.&amp;lt;BR&amp;gt;&lt;br /&gt;
* For Windows with 32-bit architecture a self extracting installer  including an executable of Chipory is available.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Download the current release as of 7-12-2012:&lt;br /&gt;
* Chipory binary  [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/Chipory.zip zip]&lt;br /&gt;
* self extracting installer for Windows [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/chipory-setup.exe chipory-setup.exe]&lt;br /&gt;
Source code for Chipory is available upon request.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Logo =&lt;br /&gt;
&lt;br /&gt;
* Alida logo as [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/Alida_logo.pdf PDF]&lt;/div&gt;</summary>
		<author><name>Posch</name></author>
	</entry>
	<entry>
		<id>https://alida.informatik.uni-halle.de/index.php?title=Downloads&amp;diff=107</id>
		<title>Downloads</title>
		<link rel="alternate" type="text/html" href="https://alida.informatik.uni-halle.de/index.php?title=Downloads&amp;diff=107"/>
		<updated>2012-12-20T13:25:49Z</updated>

		<summary type="html">&lt;p&gt;Posch: /* Requirements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Java implementation =&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
Alida's implementation in Java requires Java 1.6 or later. &lt;br /&gt;
Alida requires some external jars which are included in the Alida binary zipfile since V2.0.&lt;br /&gt;
&lt;br /&gt;
For earlier versions the following external jars are needed to use Alida:&lt;br /&gt;
&lt;br /&gt;
* [http://xmlbeans.apache.org/ XMLBeans], Version 2.5.0&lt;br /&gt;
* [http://xstream.codehaus.org/ XStream], Version 1.3.1&lt;br /&gt;
* [http://javahelp.java.net/ JavaHelp], Version 2.0_05&lt;br /&gt;
&lt;br /&gt;
In addition, Alida requires some more libraries which are in-house developments:&lt;br /&gt;
&lt;br /&gt;
* Alida also requires some graphml extensions to be found in '''''aldgraphml.jar'''''.&lt;br /&gt;
* The graphical operator runner features an online help system based on [http://javahelp.java.net/ JavaHelp System] which is included in '''Alida-Help.jar'''.&lt;br /&gt;
&lt;br /&gt;
If you download the Alida binary zipfile you will find these two libraries in the subdirectory ''intjars'' of the zipfile.&amp;lt;br/&amp;gt; Make sure that all of them are in the classpath when executing the operator runners.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Current release (v1.2)==&lt;br /&gt;
* Alida Java Binaries [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_bin.zip zip] (includes Alida binaries, license information and the file ''aldgraphml.jar'' with Alida's extensions of graphml)&lt;br /&gt;
* Alida Java Sources [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_src.zip zip] (includes only the sources, license files and some READMEs on how to use and compile Alida)&lt;br /&gt;
* Alida Java API [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_api.zip zip] (includes Javadocs of Alida's API)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Archive of Alida's Java releases ==&lt;br /&gt;
&lt;br /&gt;
{| border = &amp;quot;1&amp;quot; cellpadding = &amp;quot;5pt&amp;quot; cellspacing = &amp;quot;0&amp;quot; style = &amp;quot;border-color: #DDD; text-align: center; width: 80%&amp;quot;&lt;br /&gt;
! Version &lt;br /&gt;
! Binaries &lt;br /&gt;
! Sources &lt;br /&gt;
! API &lt;br /&gt;
! Date&lt;br /&gt;
|-&lt;br /&gt;
| 1.2&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_bin-1.2.zip zip]&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_src-1.2.zip zip]&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_api-1.2.zip zip]&lt;br /&gt;
| March 2nd, 2012&lt;br /&gt;
|-&lt;br /&gt;
| 1.1&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_bin-1.1.zip zip]&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_src-1.1.zip zip]&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_api-1.1.zip zip]&lt;br /&gt;
| Sep 14th, 2011&lt;br /&gt;
|-&lt;br /&gt;
| 1.0&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_bin-1.0.zip zip]&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_src-1.0.zip zip]&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_api-1.0.zip zip]&lt;br /&gt;
| May 9th, 2011&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= C++ implementation =&lt;br /&gt;
&lt;br /&gt;
Alida's implementation in C++ requires Linux as operating system. &lt;br /&gt;
&lt;br /&gt;
The following external libraries are needed:&lt;br /&gt;
&lt;br /&gt;
* [http://loki-lib.sourceforge.net/index.php?n=Main.HomePage Loki], Version 0.17&lt;br /&gt;
&lt;br /&gt;
Optionally a prototypical implementation of an OpenCV wrapper is included for which the OpenCV library is required:&lt;br /&gt;
* [http://opencv.willowgarage.com/wiki/ OpenCV], Version 2.1 or higher (refer to the [[Installation]] section for details on compiling the OpenCV wrapper)&lt;br /&gt;
&lt;br /&gt;
== Current release (v0.1)==&lt;br /&gt;
* Alida C++ Sources [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/cpp/Alida-Cpp_src.zip zip] (includes the sources, license files and some READMEs on how to use and compile Alida)&lt;br /&gt;
* Alida C++ API [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/cpp/Alida-Cpp_api.zip zip] (includes Doxygen documentation of Alida's C++ API)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Archive of Alida's C++ releases ==&lt;br /&gt;
&lt;br /&gt;
{| border = &amp;quot;1&amp;quot; cellpadding = &amp;quot;5pt&amp;quot; cellspacing = &amp;quot;0&amp;quot; style = &amp;quot;border-color: #DDD; text-align: center; width: 80%&amp;quot;&lt;br /&gt;
! Version &lt;br /&gt;
! Sources &lt;br /&gt;
! API &lt;br /&gt;
! Date&lt;br /&gt;
|-&lt;br /&gt;
| 0.1&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/cpp/Alida-Cpp_src-0.1.zip zip] [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/cpp/Alida-Cpp_src-0.1.tgz tgz] &lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/cpp/Alida-Cpp_api-0.1.zip zip] [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/cpp/Alida-Cpp_api-0.1.tgz tgz]&lt;br /&gt;
| March 12th, 2012&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Manual =&lt;br /&gt;
&lt;br /&gt;
Detailed information about Alida, its API and usage, can be found in the user and programmer manual. &lt;br /&gt;
&lt;br /&gt;
* Alida-Manual, Version 1.3 [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/manual/AlidaManual.pdf pdf]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Additional resources =&lt;br /&gt;
&lt;br /&gt;
* '''Chipory''' - a graph visualization tool for displaying MiToBo history graphs&amp;lt;br/&amp;gt;Chipory is an extended version of the [http://www.cs.bilkent.edu.tr/~ivis/chisio.html Chisio software] developed at the Bilkent University in Turkey.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The zip file below contains all necessary files. Download this file and unpack it into a folder of your choice.&lt;br /&gt;
&lt;br /&gt;
* To use Chipory on a Linux system with 32-bit architecture just type './Chipory.sh'.&amp;lt;BR&amp;gt;&lt;br /&gt;
* In case that your machine has a 64-bit architecture running Linux, call './Chipory_64.sh'.&amp;lt;BR&amp;gt;&lt;br /&gt;
* For Windows with 32-bit architecture a self extracting installer  including an executable of Chipory is available.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Download the current release as of 7-12-2012:&lt;br /&gt;
* Chipory binary  [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/Chipory.zip zip]&lt;br /&gt;
* self extracting installer for Windows [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/chipory-setup.exe chipory-setup.exe]&lt;br /&gt;
Source code for Chipory is available upon request.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Logo =&lt;br /&gt;
&lt;br /&gt;
* Alida logo as [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/Alida_logo.pdf PDF]&lt;/div&gt;</summary>
		<author><name>Posch</name></author>
	</entry>
	<entry>
		<id>https://alida.informatik.uni-halle.de/index.php?title=Main_Page&amp;diff=106</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://alida.informatik.uni-halle.de/index.php?title=Main_Page&amp;diff=106"/>
		<updated>2012-10-11T09:16:57Z</updated>

		<summary type="html">&lt;p&gt;Posch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== [[News]] ==&lt;br /&gt;
&lt;br /&gt;
* 11/10/2012: &amp;lt;br&amp;gt; Updated version of Chipory available for download.&lt;br /&gt;
&lt;br /&gt;
* 26/07/2012: &amp;lt;br&amp;gt; Alida will be presented at the '''''ImageJ User &amp;amp; Developer Conference 2012''''' to be held at the end of October in Mondorf-les-Bains, Luxembourg.&amp;lt;br&amp;gt; There will be a poster presentation combined with a demo entitled [http://imagejconf.tudor.lu/program/poster/birgit_moeller996310491 '''Automatic Generation of Processing Histories using Alida'''].&amp;lt;br&amp;gt; It will provide an introduction to the processing history mechanism implemented in Alida, and its usage.&amp;lt;br&amp;gt; Also a talk will be given about our new graphical editor ''Grappa'' entitled '''Graphical Programming in Alida and ImageJ 2.0 with Grappa'''.&lt;br /&gt;
&lt;br /&gt;
* 12/07/2012: &amp;lt;br&amp;gt;New release of chipory ready for download&lt;br /&gt;
&lt;br /&gt;
* 21/03/2012:&amp;lt;br&amp;gt; Alida will be presented at the '''''IEEE International Symposium on Biomedical Imaging (ISBI)''''' to be held at the end of April in Barcelona.&amp;lt;br&amp;gt; There will be a poster presentation combined with a demo at the '''''Bioimage Analysis Workshop on Open Source Software''''' held in conjunction with ISBI.&amp;lt;br&amp;gt; The title will be '''ALIDA - Automatic generation of user interfaces for data analysis algorithms'''.&lt;br /&gt;
&lt;br /&gt;
* 12/03/2012:&amp;lt;br&amp;gt; The Alida concept now features a prototypical implementation in C++! It supports generic operator execution from command line.&amp;lt;br&amp;gt;Release 0.1 is available now from the download page.&lt;br /&gt;
&lt;br /&gt;
* 02/03/2012:&amp;lt;br&amp;gt;Alida release 1.2 has just been published! You can get the new version in the download section!&amp;lt;br&amp;gt;Main new feature: generic user interface generation for operators to use them from commandline and via a Swing GUI!&lt;br /&gt;
&lt;br /&gt;
== Alida - &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;A&amp;lt;/span&amp;gt;dvanced &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;L&amp;lt;/span&amp;gt;ibrary for &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;I&amp;lt;/span&amp;gt;ntegrated &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;D&amp;lt;/span&amp;gt;evelopment of Data Analysis &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;A&amp;lt;/span&amp;gt;pplications ==&lt;br /&gt;
&lt;br /&gt;
...formerly known as Alida - &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;A&amp;lt;/span&amp;gt;utomatic &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;L&amp;lt;/span&amp;gt;ogging of Process &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;I&amp;lt;/span&amp;gt;nformation in &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;D&amp;lt;/span&amp;gt;ata &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;A&amp;lt;/span&amp;gt;nalysis &lt;br /&gt;
&lt;br /&gt;
Alida defines a concept for designing libraries and toolkits in data analysis. It supports and simplifies integrated algorithm development by inherently joining algorithm implementation, automatic analysis process documentation and fully generic generation of user interfaces. In Alida each data analysis or manipulation action is realized in terms of an operator that acts on given data to produce desired output data. As all operators implement a common interface definition, their input and output parameters are accessible in a standardized manner, and they can also be invoced in a predefined way. &lt;br /&gt;
&lt;br /&gt;
Calls to operators not only produce data analysis results, but are at the same time registered within the framework together with all input and output objects as well as parameters settings of the various operators. These data acquired during an analysis process and the order of operator calls form a directed graph datastructure containing all relevant information for later reconstruction or verification of the analysis procedure. Alida allows to make the directed graph datastructure explicit in terms of XML representations which can be visually explored with appropriate graphical frontends like Chipory, or might be stored in data bases for archival purposes.&lt;br /&gt;
&lt;br /&gt;
Alida's operator concept is well-suited to ease algorithm development and their application to real-world problems by non-expert users. Due to the operator interface definition and the unified handling of operators it is for example possible to automatically generate user interfaces for operators, i.e. graphical frontends or commanline interfaces.&lt;br /&gt;
&lt;br /&gt;
== Licensing information ==&lt;br /&gt;
Alida is free software: you can redistribute it and/or modify under the terms of the [http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3] or (at your option) any later version as published by the [http://www.fsf.org/ Free Software Foundation].&lt;br /&gt;
&lt;br /&gt;
== Current releases ==&lt;br /&gt;
&lt;br /&gt;
==== Java ====&lt;br /&gt;
You can download Alida's Java implementation in version 1.2 [[Downloads | here]]. &amp;lt;br /&amp;gt;&lt;br /&gt;
You can find the API documentation for this release [http://www2.informatik.uni-halle.de/agprbio/alida/api/java/index.html here].&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== C++ ====&lt;br /&gt;
You can download Alida's prototypical C++ implementation in version 0.1 [[Downloads | here]]. &amp;lt;br /&amp;gt;&lt;br /&gt;
You can find the API documentation for this release [http://www2.informatik.uni-halle.de/agprbio/alida/api/cpp/index.html here].&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Manual ==&lt;br /&gt;
Alida offers you a user and programmer manual you can download [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/manual/AlidaManual.pdf here]. Note that the manual is currently focussed on the mature Java implementation, but it will be updated in near future to cover both implementations.&lt;br /&gt;
&lt;br /&gt;
== Bug reports &amp;amp; Feature requests ==&lt;br /&gt;
Bug reports and feature requests can be submitted via the [http://www2.informatik.uni-halle.de/agprbio/mitobo-bts/bug_report_page.php bugtracking system] or by mail to [mailto:alida@informatik.uni-halle.de alida@informatik.uni-halle.de].&amp;lt;br /&amp;gt;&lt;br /&gt;
Before reporting a new bug, please check if that bug has already been submitted in the [http://www2.informatik.uni-halle.de/agprbio/mitobo-bts/view_all_bug_page.php report list].&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Posch</name></author>
	</entry>
	<entry>
		<id>https://alida.informatik.uni-halle.de/index.php?title=Main_Page&amp;diff=104</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://alida.informatik.uni-halle.de/index.php?title=Main_Page&amp;diff=104"/>
		<updated>2012-07-12T14:31:27Z</updated>

		<summary type="html">&lt;p&gt;Posch: /* News */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== [[News]] ==&lt;br /&gt;
&lt;br /&gt;
* 12/07/2012: &amp;lt;br&amp;gt;New release of chipory ready for download&lt;br /&gt;
&lt;br /&gt;
* 21/03/2012:&amp;lt;br&amp;gt; Alida will be presented at the '''''IEEE International Symposium on Biomedical Imaging (ISBI)''''' to be held at the end of April in Barcelona.&amp;lt;br&amp;gt; There will be a poster presentation combined with a demo at the '''''Bioimage Analysis Workshop on Open Source Software''''' held in conjunction with ISBI.&amp;lt;br&amp;gt; The title will be '''ALIDA - Automatic generation of user interfaces for data analysis algorithms'''.&lt;br /&gt;
&lt;br /&gt;
* 12/03/2012:&amp;lt;br&amp;gt; The Alida concept now features a prototypical implementation in C++! It supports generic operator execution from command line.&amp;lt;br&amp;gt;Release 0.1 is available now from the download page.&lt;br /&gt;
&lt;br /&gt;
* 02/03/2012:&amp;lt;br&amp;gt;Alida release 1.2 has just been published! You can get the new version in the download section!&amp;lt;br&amp;gt;Main new feature: generic user interface generation for operators to use them from commandline and via a Swing GUI!&lt;br /&gt;
&lt;br /&gt;
== Alida - &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;A&amp;lt;/span&amp;gt;dvanced &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;L&amp;lt;/span&amp;gt;ibrary for &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;I&amp;lt;/span&amp;gt;ntegrated &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;D&amp;lt;/span&amp;gt;evelopment of Data Analysis &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;A&amp;lt;/span&amp;gt;pplications ==&lt;br /&gt;
&lt;br /&gt;
...formerly known as Alida - &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;A&amp;lt;/span&amp;gt;utomatic &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;L&amp;lt;/span&amp;gt;ogging of Process &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;I&amp;lt;/span&amp;gt;nformation in &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;D&amp;lt;/span&amp;gt;ata &amp;lt;span style=&amp;quot;color:#CC0000&amp;quot;&amp;gt;A&amp;lt;/span&amp;gt;nalysis &lt;br /&gt;
&lt;br /&gt;
Alida defines a concept for designing libraries and toolkits in data analysis. It supports and simplifies integrated algorithm development by inherently joining algorithm implementation, automatic analysis process documentation and fully generic generation of user interfaces. In Alida each data analysis or manipulation action is realized in terms of an operator that acts on given data to produce desired output data. As all operators implement a common interface definition, their input and output parameters are accessible in a standardized manner, and they can also be invoced in a predefined way. &lt;br /&gt;
&lt;br /&gt;
Calls to operators not only produce data analysis results, but are at the same time registered within the framework together with all input and output objects as well as parameters settings of the various operators. These data acquired during an analysis process and the order of operator calls form a directed graph datastructure containing all relevant information for later reconstruction or verification of the analysis procedure. Alida allows to make the directed graph datastructure explicit in terms of XML representations which can be visually explored with appropriate graphical frontends like Chipory, or might be stored in data bases for archival purposes.&lt;br /&gt;
&lt;br /&gt;
Alida's operator concept is well-suited to ease algorithm development and their application to real-world problems by non-expert users. Due to the operator interface definition and the unified handling of operators it is for example possible to automatically generate user interfaces for operators, i.e. graphical frontends or commanline interfaces.&lt;br /&gt;
&lt;br /&gt;
== Licensing information ==&lt;br /&gt;
Alida is free software: you can redistribute it and/or modify under the terms of the [http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3] or (at your option) any later version as published by the [http://www.fsf.org/ Free Software Foundation].&lt;br /&gt;
&lt;br /&gt;
== Current releases ==&lt;br /&gt;
&lt;br /&gt;
==== Java ====&lt;br /&gt;
You can download Alida's Java implementation in version 1.2 [[Downloads | here]]. &amp;lt;br /&amp;gt;&lt;br /&gt;
You can find the API documentation for this release [http://www2.informatik.uni-halle.de/agprbio/alida/api/java/index.html here].&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== C++ ====&lt;br /&gt;
You can download Alida's prototypical C++ implementation in version 0.1 [[Downloads | here]]. &amp;lt;br /&amp;gt;&lt;br /&gt;
You can find the API documentation for this release [http://www2.informatik.uni-halle.de/agprbio/alida/api/cpp/index.html here].&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Manual ==&lt;br /&gt;
Alida offers you a user and programmer manual you can download [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/manual/AlidaManual.pdf here]. Note that the manual is currently focussed on the mature Java implementation, but it will be updated in near future to cover both implementations.&lt;br /&gt;
&lt;br /&gt;
== Bug reports &amp;amp; Feature requests ==&lt;br /&gt;
Bug reports and feature requests can be submitted via the [http://www2.informatik.uni-halle.de/agprbio/mitobo-bts/bug_report_page.php bugtracking system] or by mail to [mailto:alida@informatik.uni-halle.de alida@informatik.uni-halle.de].&amp;lt;br /&amp;gt;&lt;br /&gt;
Before reporting a new bug, please check if that bug has already been submitted in the [http://www2.informatik.uni-halle.de/agprbio/mitobo-bts/view_all_bug_page.php report list].&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Posch</name></author>
	</entry>
	<entry>
		<id>https://alida.informatik.uni-halle.de/index.php?title=Downloads&amp;diff=103</id>
		<title>Downloads</title>
		<link rel="alternate" type="text/html" href="https://alida.informatik.uni-halle.de/index.php?title=Downloads&amp;diff=103"/>
		<updated>2012-07-12T14:30:00Z</updated>

		<summary type="html">&lt;p&gt;Posch: /* Additional resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Java implementation =&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
Alida's implementation in Java requires Java 1.6 or later. &lt;br /&gt;
&lt;br /&gt;
The following external jars are needed to use Alida:&lt;br /&gt;
&lt;br /&gt;
* [http://xmlbeans.apache.org/ XMLBeans], Version 2.5.0&lt;br /&gt;
* [http://xstream.codehaus.org/ XStream], Version 1.3.1&lt;br /&gt;
* [http://javahelp.java.net/ JavaHelp], Version 2.0_05&lt;br /&gt;
&lt;br /&gt;
In addition, Alida requires some more libraries which are either in-house developments or result from modifications of other libraries:&lt;br /&gt;
&lt;br /&gt;
* We use a slightly modified version of [http://http://sezpoz.java.net/ SezPoz] for annotation indexing. You can get the modified version [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/sezpoz-1.9-alida.jar here].&lt;br /&gt;
* Alida also requires some graphml extensions to be found in '''''aldgraphml.jar''''' [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/aldgraphml.jar jar].&lt;br /&gt;
* The graphical operator runner features an online help system based on [http://javahelp.java.net/ JavaHelp System], the corresponding '''Alida-Help.jar''' can be found [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/Alida-Help.jar here].&lt;br /&gt;
&lt;br /&gt;
If you download the Alida binary zipfile you will find these two libraries in the subdirectory ''intjars'' of the zipfile.&amp;lt;br/&amp;gt; Make sure that all of them are in the classpath when executing the operator runners.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Current release (v1.2)==&lt;br /&gt;
* Alida Java Binaries [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_bin.zip zip] (includes Alida binaries, license information and the file ''aldgraphml.jar'' with Alida's extensions of graphml)&lt;br /&gt;
* Alida Java Sources [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_src.zip zip] (includes only the sources, license files and some READMEs on how to use and compile Alida)&lt;br /&gt;
* Alida Java API [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_api.zip zip] (includes Javadocs of Alida's API)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Archive of Alida's Java releases ==&lt;br /&gt;
&lt;br /&gt;
{| border = &amp;quot;1&amp;quot; cellpadding = &amp;quot;5pt&amp;quot; cellspacing = &amp;quot;0&amp;quot; style = &amp;quot;border-color: #DDD; text-align: center; width: 80%&amp;quot;&lt;br /&gt;
! Version &lt;br /&gt;
! Binaries &lt;br /&gt;
! Sources &lt;br /&gt;
! API &lt;br /&gt;
! Date&lt;br /&gt;
|-&lt;br /&gt;
| 1.2&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_bin-1.2.zip zip]&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_src-1.2.zip zip]&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_api-1.2.zip zip]&lt;br /&gt;
| March 2nd, 2012&lt;br /&gt;
|-&lt;br /&gt;
| 1.1&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_bin-1.1.zip zip]&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_src-1.1.zip zip]&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_api-1.1.zip zip]&lt;br /&gt;
| Sep 14th, 2011&lt;br /&gt;
|-&lt;br /&gt;
| 1.0&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_bin-1.0.zip zip]&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_src-1.0.zip zip]&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/java/Alida_api-1.0.zip zip]&lt;br /&gt;
| May 9th, 2011&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= C++ implementation =&lt;br /&gt;
&lt;br /&gt;
Alida's implementation in C++ requires Linux as operating system. &lt;br /&gt;
&lt;br /&gt;
The following external libraries are needed:&lt;br /&gt;
&lt;br /&gt;
* [http://loki-lib.sourceforge.net/index.php?n=Main.HomePage Loki], Version 0.17&lt;br /&gt;
&lt;br /&gt;
Optionally a prototypical implementation of an OpenCV wrapper is included for which the OpenCV library is required:&lt;br /&gt;
* [http://opencv.willowgarage.com/wiki/ OpenCV], Version 2.1 or higher (refer to the [[Installation]] section for details on compiling the OpenCV wrapper)&lt;br /&gt;
&lt;br /&gt;
== Current release (v0.1)==&lt;br /&gt;
* Alida C++ Sources [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/cpp/Alida-Cpp_src.zip zip] (includes the sources, license files and some READMEs on how to use and compile Alida)&lt;br /&gt;
* Alida C++ API [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/cpp/Alida-Cpp_api.zip zip] (includes Doxygen documentation of Alida's C++ API)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Archive of Alida's C++ releases ==&lt;br /&gt;
&lt;br /&gt;
{| border = &amp;quot;1&amp;quot; cellpadding = &amp;quot;5pt&amp;quot; cellspacing = &amp;quot;0&amp;quot; style = &amp;quot;border-color: #DDD; text-align: center; width: 80%&amp;quot;&lt;br /&gt;
! Version &lt;br /&gt;
! Sources &lt;br /&gt;
! API &lt;br /&gt;
! Date&lt;br /&gt;
|-&lt;br /&gt;
| 0.1&lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/cpp/Alida-Cpp_src-0.1.zip zip] [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/cpp/Alida-Cpp_src-0.1.tgz tgz] &lt;br /&gt;
| [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/cpp/Alida-Cpp_api-0.1.zip zip] [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/cpp/Alida-Cpp_api-0.1.tgz tgz]&lt;br /&gt;
| March 12th, 2012&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Manual =&lt;br /&gt;
&lt;br /&gt;
Detailed information about Alida, its API and usage, can be found in the user and programmer manual. &lt;br /&gt;
&lt;br /&gt;
* Alida-Manual, Version 1.3 [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/manual/AlidaManual.pdf pdf]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Additional resources =&lt;br /&gt;
&lt;br /&gt;
* '''Chipory''' - a graph visualization tool for displaying MiToBo history graphs&amp;lt;br/&amp;gt;Chipory is an extended version of the [http://www.cs.bilkent.edu.tr/~ivis/chisio.html Chisio software] developed at the Bilkent University in Turkey.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The zip file below contains all necessary files. Download this file and unpack it into a folder of your choice.&lt;br /&gt;
&lt;br /&gt;
* To use Chipory on a Linux system with 32-bit architecture just type './Chipory.sh'.&amp;lt;BR&amp;gt;&lt;br /&gt;
* In case that your machine has a 64-bit architecture running Linux, call './Chipory_64.sh'.&amp;lt;BR&amp;gt;&lt;br /&gt;
* For Windows with 32-bit architecture a self extracting installer  including an executable of Chipory is available.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Download the current release as of 7-12-2012:&lt;br /&gt;
* Chipory binary  [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/Chipory.zip zip]&lt;br /&gt;
* self extracting installer for Windows [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/chipory-setup.exe chipory-setup.exe]&lt;br /&gt;
Source code for Chipory is available upon request.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Logo =&lt;br /&gt;
&lt;br /&gt;
* Alida logo as [http://www2.informatik.uni-halle.de/agprbio/alida/downloads/Alida_logo.pdf PDF]&lt;/div&gt;</summary>
		<author><name>Posch</name></author>
	</entry>
	<entry>
		<id>https://alida.informatik.uni-halle.de/index.php?title=Downloads&amp;diff=36</id>
		<title>Downloads</title>
		<link rel="alternate" type="text/html" href="https://alida.informatik.uni-halle.de/index.php?title=Downloads&amp;diff=36"/>
		<updated>2011-05-05T09:13:53Z</updated>

		<summary type="html">&lt;p&gt;Posch: /* Additional resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
== Requirements ==&lt;br /&gt;
Alida requires Java 1.6 or later. &lt;br /&gt;
&lt;br /&gt;
The following external jars are needed to use Alida:&lt;br /&gt;
&lt;br /&gt;
* [http://xmlbeans.apache.org/ XMLBeans], Version 2.5.0&lt;br /&gt;
* [http://xstream.codehaus.org/ XStream], Version 1.3.1&lt;br /&gt;
&lt;br /&gt;
Alida also requires some graphml extensions to be find in '''''aldgraphml.jar''''' [http://www.informatik.uni-halle.de/alida/downloads/aldgraphml.jar jar].&amp;lt;br&amp;gt;&lt;br /&gt;
If you download the Alida binary zipfile you will find the library in subdirectory intjars in the zipfile.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Current release (v0.9)==&lt;br /&gt;
* Alida Binaries [http://www.informatik.uni-halle.de/alida/downloads/Alida_bin-1.0.zip zip] (includes Alida binaries, license information and the file ''aldgraphml.jar'' with Alida's extensions of graphml)&lt;br /&gt;
* Alida Sources [http://www.informatik.uni-halle.de/alida/downloads/Alida_src-1.0.zip zip] (includes only the sources, license files and some READMEs on how to use and compile Alida)&lt;br /&gt;
* Alida API [http://www.informatik.uni-halle.de/alida/downloads/Alida_api-1.0.zip zip] (includes Javadocs of Alida's API)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== All versions of Alida ==&lt;br /&gt;
&lt;br /&gt;
{| border = &amp;quot;1&amp;quot; cellpadding = &amp;quot;5pt&amp;quot; cellspacing = &amp;quot;0&amp;quot; style = &amp;quot;border-color: #DDD; text-align: center; width: 80%&amp;quot;&lt;br /&gt;
! Version &lt;br /&gt;
! Binaries &lt;br /&gt;
! Sources &lt;br /&gt;
! API &lt;br /&gt;
! Date&lt;br /&gt;
|-&lt;br /&gt;
| 1.0&lt;br /&gt;
| [http://www.informatik.uni-halle.de/alida/downloads/Alida_bin-1.0.zip zip]&lt;br /&gt;
| [http://www.informatik.uni-halle.de/alida/downloads/Alida_src-1.0.zip zip]&lt;br /&gt;
| [http://www.informatik.uni-halle.de/alida/downloads/Alida_api-1.0.zip zip]&lt;br /&gt;
| May 9th, 2011&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Manual ==&lt;br /&gt;
&lt;br /&gt;
Detailed information about Alida, its API and usage, can be found in the user and programmer manual. &lt;br /&gt;
&lt;br /&gt;
* Alida-Manual, Version 1.0 [http://www.informatik.uni-halle.de/alida/downloads/manual/AlidaManual.pdf pdf]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Additional resources ==&lt;br /&gt;
&lt;br /&gt;
* '''Chipory''' - a graph visualization tool for displaying MiToBo history graphs&amp;lt;br/&amp;gt;Chipory is an extended version of the [http://www.cs.bilkent.edu.tr/~ivis/chisio.html Chisio software] developed at the Bilkent University in Turkey.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The zip file below contains all necessary files. Download this file and unpack it into a folder of your choice.&lt;br /&gt;
&lt;br /&gt;
* To use Chipory on a Linux system with 32-bit architecture just type './Chipory.sh'.&amp;lt;BR&amp;gt;&lt;br /&gt;
* In case that your machine has a 64-bit architecture running Linux, call './Chipory_64.sh'.&amp;lt;BR&amp;gt;&lt;br /&gt;
* For Windows with 32-bit architecture a self extracting installer  including an executable of Chipory is available.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Download the current release:&lt;br /&gt;
[http&lt;br /&gt;
* Chipory binary  [http://www.informatik.uni-halle.de/alida/downloads/Chipory.zip zip]&lt;br /&gt;
* self extracting installer for Windows [http://www.informatik.uni-halle.de/alida/downloads/chipory-setup.exe chipory-setup.exe]&lt;br /&gt;
Source code for Chipory is available upon request.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Logo ==&lt;br /&gt;
&lt;br /&gt;
* Chipory logo as [http://www.informatik.uni-halle.de/mitobo/downloads/MiToBo_logo.pdf PDF] or [http://www.informatik.uni-halle.de/mitobo/downloads/MiToBo_logo.png PNG]&lt;/div&gt;</summary>
		<author><name>Posch</name></author>
	</entry>
</feed>