Program: 17038
Project: 17038
Buggy source:
/** 
 * a simple matching approach that tries to do a 1:1 mapping between SEQRES and ATOM records returns true if this simple matching approach worked fine
 * @param seqRes
 * @param atomList
 * @return
 */
private boolean trySimpleMatch(Chain seqRes,Chain atomRes){
  List<Group> seqResGroups=seqRes.getAtomGroups();
  List<Group> atmResGroups=atomRes.getAtomGroups();
  if (DEBUG) {
    System.err.println("String_Node_Str" + atomRes.getChainID() + "String_Node_Str"+ seqRes.getChainID());
  }
  boolean startAt1=true;
  for (int atomResPos=0; atomResPos < atmResGroups.size(); atomResPos++) {
    Group atomResGroup=atmResGroups.get(atomResPos);
    String threeLetterCode=atomResGroup.getPDBName();
    if (excludeTypes.contains(threeLetterCode)) {
      continue;
    }
    ResidueNumber atomResNum=atomResGroup.getResidueNumber();
    int seqResPos=atomResNum.getSeqNum();
    if (seqResPos < 0) {
      if (DEBUG)       System.err.println("String_Node_Str");
      return false;
    }
    if (seqResPos == 0) {
      Group seqResGroup=seqResGroups.get(0);
      if (seqResGroup.getPDBName().equals(atomResGroup.getPDBName())) {
        startAt1=false;
      }
 else {
        if (DEBUG) {
          System.err.println("String_Node_Str" + seqResGroup.getPDBName() + "String_Node_Str"+ atomResGroup.getPDBName()+ "String_Node_Str");
        }
        return false;
      }
    }
    if (startAt1)     seqResPos--;
    if (startAt1 && seqResPos >= seqResGroups.size()) {
      if (atomResGroup instanceof AminoAcid) {
        if (DEBUG)         System.err.println("String_Node_Str" + seqResPos + "String_Node_Str"+ seqResGroups.size()+ "String_Node_Str"+ atomResGroup);
        return false;
      }
 else {
        continue;
      }
    }
    if (seqResPos < 0) {
      System.err.println("String_Node_Str" + atomRes.getChainID() + "String_Node_Str"+ atomResGroup);
    }
    if (seqResPos >= seqResGroups.size()) {
      if (atomResGroup instanceof AminoAcid)       return false;
 else       continue;
    }
    Group seqResGroup=seqResGroups.get(seqResPos);
    if (!seqResGroup.getPDBName().trim().equals(atomResGroup.getPDBName().trim())) {
      if (DEBUG)       System.err.println("String_Node_Str" + seqResPos + "String_Node_Str"+ atomResGroup+ "String_Node_Str"+ seqResGroup);
      return false;
    }
    seqResGroups.set(seqResPos,atomResGroup);
  }
  return true;
}

Fixed version (ground truth):
/** 
 * a simple matching approach that tries to do a 1:1 mapping between SEQRES and ATOM records returns true if this simple matching approach worked fine
 * @param seqRes
 * @param atomList
 * @return
 */
private boolean trySimpleMatch(Chain seqRes,Chain atomRes){
  List<Group> seqResGroups=seqRes.getAtomGroups();
  List<Group> atmResGroups=atomRes.getAtomGroups();
  if (DEBUG) {
    System.err.println("String_Node_Str" + atomRes.getChainID() + "String_Node_Str"+ atmResGroups.size()+ "String_Node_Str"+ seqRes.getChainID()+ "String_Node_Str"+ seqResGroups.size()+ "String_Node_Str");
  }
  boolean startAt1=true;
  for (int atomResPos=0; atomResPos < atmResGroups.size(); atomResPos++) {
    Group atomResGroup=atmResGroups.get(atomResPos);
    String threeLetterCode=atomResGroup.getPDBName();
    if (excludeTypes.contains(threeLetterCode)) {
      continue;
    }
    ResidueNumber atomResNum=atomResGroup.getResidueNumber();
    int seqResPos=atomResNum.getSeqNum();
    if (seqResPos < 0) {
      if (DEBUG)       System.err.println("String_Node_Str");
      return false;
    }
    if (seqResPos == 0) {
      Group seqResGroup=seqResGroups.get(0);
      if (seqResGroup.getPDBName().equals(atomResGroup.getPDBName())) {
        startAt1=false;
      }
 else {
        if (DEBUG) {
          System.err.println("String_Node_Str" + seqResGroup.getPDBName() + "String_Node_Str"+ atomResGroup.getPDBName()+ "String_Node_Str");
        }
        return false;
      }
    }
    if (startAt1)     seqResPos--;
    if (startAt1 && seqResPos >= seqResGroups.size()) {
      if (atomResGroup instanceof AminoAcid) {
        if (DEBUG)         System.err.println("String_Node_Str" + seqResPos + "String_Node_Str"+ seqResGroups.size()+ "String_Node_Str"+ atomResGroup);
        return false;
      }
 else       if (atomResGroup instanceof NucleotideImpl) {
        if (DEBUG)         System.err.println("String_Node_Str" + seqResPos + "String_Node_Str"+ seqResGroups.size()+ "String_Node_Str"+ atomResGroup);
        return false;
      }
 else {
        continue;
      }
    }
    if (seqResPos < 0) {
      System.err.println("String_Node_Str" + atomRes.getChainID() + "String_Node_Str"+ atomResGroup);
    }
    if (seqResPos >= seqResGroups.size()) {
      if (DEBUG)       System.err.println("String_Node_Str" + seqResPos);
      if (atomResGroup instanceof AminoAcid)       return false;
 else       continue;
    }
    Group seqResGroup=seqResGroups.get(seqResPos);
    if (!seqResGroup.getPDBName().trim().equals(atomResGroup.getPDBName().trim())) {
      if (DEBUG)       System.err.println("String_Node_Str" + seqResPos + "String_Node_Str"+ atomResGroup+ "String_Node_Str"+ seqResGroup);
      return false;
    }
    if (DEBUG)     System.err.println("String_Node_Str" + seqResPos + "String_Node_Str"+ atomResGroup);
    seqResGroups.set(seqResPos,atomResGroup);
  }
  return true;
}