/**
  * true if some match is scored
  *
  * @return as above
  */
 @Override
 public boolean isMatchPresent() {
   for (IScoredScan scan : m_Scores.values()) {
     if (scan.isMatchPresent()) return true;
   }
   return false;
 }
 /**
  * combine two scores
  *
  * @param added
  */
 public void addTo(IMultiScorer added) {
   IScoredScan[] scoredScans = added.getScoredScans();
   for (int i = 0; i < scoredScans.length; i++) {
     IScoredScan addedScan = scoredScans[i];
     IScoredScan current = getScoredScan(addedScan.getAlgorithm());
     if (current == null) addAlgorithm(addedScan);
     else ((ScoredScan) current).addTo(addedScan);
   }
 }
  /**
   * make a form suitable to 1) reconstruct the original given access to starting conditions
   *
   * @param adder !null where to put the data
   */
  public void serializeAsString(IXMLAppender adder) {
    String[] algorithms = getScoringAlgorithms();

    String tag = TAG;
    adder.openTag(tag);
    adder.endTag();
    adder.cr();

    for (int i = 0; i < algorithms.length; i++) {
      String algorithm = algorithms[i];
      IScoredScan scoredScan = getScoredScan(algorithm);
      scoredScan.serializeAsString(adder);
    }
    adder.closeTag(tag);
  }
 public void addAlgorithm(IScoredScan scan) {
   String key = scan.getAlgorithm();
   if (m_Scores.containsKey(key)) {
     throw new IllegalStateException("duplicate algorithm " + key);
   } else {
     m_Scores.put(key, scan);
   }
 }