protected void runAlgorithm() {
    // Retrieve a list of string values dictating where elements are supposed to occur in a table.
    tableStructure = buildingModel.getTableStructure();
    headers = new ArrayList<String>();
    colsToUse = new ListOrderedSet<Integer>();
    int count = tableStructure.size() + 1;
    for (int i = 0; i < tableStructure.size(); i++) {
      // modify this to only add those factors which appear in temp factors.
      if (tableStructure.get(i)[0].toLowerCase().equals("factors")) {
        for (TempFactors factor : factorsToAdd) {
          String newFactor = "Factor Value[" + factor.getFactorName().trim() + "]";
          addFactor(count, newFactor, factor, i);
        }
      } else if (tableStructure.get(i)[0].toLowerCase().contains("factor value[")) {
        // doing nothing with this factor
      } else if (tableStructure.get(i)[0].toLowerCase().contains("characteristics[")) {

        String newChar = tableStructure.get(i)[0];

        headers.add(newChar);
        colsToUse.add(i);

      } else {
        headers.add(tableStructure.get(i)[0]);
        colsToUse.add(i);
      }
    }

    performAssayCentricTask();
  }
  /**
   * This is a check employed to ensure that we are not adding factors that are already defined
   * inside the configuration.
   *
   * @param columnName - Name of column to be added.
   * @return boolean - true if already present, false otherwise
   */
  protected boolean checkForFactorExistence(String columnName) {

    for (TempFactors tf : factorsToAdd) {
      String fullFactorName = "Factor Value[" + tf.getFactorName() + "]";
      if (fullFactorName.equalsIgnoreCase(columnName)) {
        return true;
      }
    }

    return false;
  }
  private int addFactor(int count, String newFactor, TempFactors factor, int nextIndex) {
    headers.add(newFactor);
    colsToUse.add(nextIndex);

    TableFieldObject newFo;
    boolean unitAdded = false;

    for (TimeUnitPair tup : factor.getFactorLevels()) {
      if (!tup.getUnit().trim().equals("")) {
        headers.add("Unit");
        unitAdded = true;

        break;
      }
    }

    if (unitAdded) {
      // add factor column field first
      newFo =
          new TableFieldObject(
              count, newFactor, "Factor", DataTypes.STRING, "", false, false, false);
      buildingModel.addField(newFo);
      count++;

      newFo =
          new TableFieldObject(
              count,
              "Unit",
              "Unit to give meaning to it's associated value",
              DataTypes.ONTOLOGY_TERM,
              "",
              false,
              false,
              false);
      buildingModel.addField(newFo);
      count++;
    } else {
      newFo =
          new TableFieldObject(
              count, newFactor, "Factor", DataTypes.ONTOLOGY_TERM, "", false, false, false);
      buildingModel.addField(newFo);
      count++;
    }

    return count;
  }