private Double[] getDataVec(List<DataRow> rows, Attribute param) {
   Double[] vect = new Double[rows.size()];
   int n = 0;
   for (DataRow row : rows) {
     vect[n] = param.getDoubleAttribute(row);
     n++;
   }
   return vect;
 }
  @Override
  protected BufferedDataTable[] execute(BufferedDataTable[] inData, ExecutionContext exec)
      throws Exception {

    BufferedDataTable input = inData[0];

    // Get the condition attribute
    Attribute treatmentAttribute =
        new InputTableAttribute(this.treatmentAttribute.getStringValue(), input);

    // Get the library and reference condition names
    String libraryName = AbstractScreenTrafoModel.getAndValidateTreatment(reference);
    String referenceName = AbstractScreenTrafoModel.getAndValidateTreatment(library);

    // Get the parameter and make sure there all double value columns
    List<Attribute> parameters = getParameterList(input);

    // Split the columns according to groups contained in the condition column
    Map<String, List<DataRow>> groupedRows = AttributeUtils.splitRows(input, treatmentAttribute);
    List<DataRow> libraryRows = groupedRows.get(libraryName);
    List<DataRow> referenceRows = groupedRows.get(referenceName);

    int progress = parameters.size();
    BufTableUtils.updateProgress(exec, progress / 2, progress);

    // Initialize
    BufferedDataContainer container = exec.createDataContainer(new DataTableSpec(getListSpec()));
    MutualInformation mutualinfo = new MutualInformation();
    mutualinfo.set_base(logbase.getDoubleValue());
    mutualinfo.set_method(method.getStringValue());
    mutualinfo.set_axeslinking(linkaxes.getBooleanValue());

    DataCell[] cells = new DataCell[container.getTableSpec().getNumColumns()];
    int p = 0;

    // Calculate mutual information
    for (Attribute parameter : parameters) {

      Double[] x = getDataVec(libraryRows, parameter);
      Double[] y = getDataVec(referenceRows, parameter);
      mutualinfo.set_vectors(x, y);

      if (binning.getIntValue() == 0) {
        mutualinfo.set_binning();
      } else {
        mutualinfo.set_binning(binning.getIntValue());
      }
      int[] bins = mutualinfo.get_binning();

      Double[] res = mutualinfo.calculate();

      cells[0] = new StringCell(parameter.getName());
      cells[1] = new DoubleCell(res[0]);
      cells[2] = new DoubleCell(res[1]);
      cells[3] = new DoubleCell(res[2]);
      cells[4] = new IntCell(bins[0]);
      cells[5] = new IntCell(bins[1]);
      cells[6] = new DoubleCell(mutualinfo.get_logbase());
      cells[7] = new StringCell(mutualinfo.get_method());

      container.addRowToTable(new DefaultRow("row" + p, cells));

      BufTableUtils.updateProgress(exec, (progress + p++) / 2, progress);
      exec.checkCanceled();
    }

    container.close();
    return new BufferedDataTable[] {container.getTable()};
  }