Program: 16637
Project: 16637
Buggy source:
/** 
 * Method that converts the symmetric units of a structure into different chains, so that internal symmetry can be translated into quaternary. <p> Application: obtain the internal symmetry axis with the quaternary  symmetry code in biojava or calculate independent subunit properties.
 * @param symmetry MultipleAlignment of the subunits only
 * @return Structure with different chains for every symmetric unit
 */
public static Structure getQuaternaryStructure(MultipleAlignment symmetry){
  if (!symmetry.getEnsemble().getAlgorithmName().contains("String_Node_Str")) {
    throw new IllegalArgumentException("String_Node_Str");
  }
  Atom[] atoms=symmetry.getAtomArrays().get(0);
  Structure cloned=atoms[0].getGroup().getChain().getParent().clone();
  atoms=StructureTools.getRepresentativeAtomArray(cloned);
  Structure symm=new StructureImpl();
  symm.setChains(new ArrayList<Chain>());
  char chainID='A';
  for (int i=0; i < symmetry.size(); i++) {
    Chain newCh=new ChainImpl();
    newCh.setChainID(chainID + "String_Node_Str");
    chainID++;
    symm.addChain(newCh);
    Block align=symmetry.getBlock(0);
    int count=0;
    Integer start=null;
    while (start == null && count < align.length()) {
      start=align.getAlignRes().get(i).get(0 + count);
      count++;
    }
    count=1;
    Integer end=null;
    while (end == null && count <= align.length()) {
      end=align.getAlignRes().get(i).get(align.length() - count);
      count++;
    }
    end++;
    Atom[] subunit=Arrays.copyOfRange(atoms,start,end);
    for (int k=0; k < subunit.length; k++)     newCh.addGroup((Group)subunit[k].getGroup().clone());
  }
  return symm;
}

Fixed version (ground truth):
/** 
 * Method that converts the symmetric units of a structure into different chains, so that internal symmetry can be translated into quaternary. <p> Application: obtain the internal symmetry axis with the quaternary  symmetry code in biojava or calculate independent subunit properties.
 * @param symmetry MultipleAlignment of the subunits only
 * @return Structure with different chains for every symmetric unit
 */
public static Structure getQuaternaryStructure(MultipleAlignment symmetry){
  if (!symmetry.getEnsemble().getAlgorithmName().contains("String_Node_Str")) {
    throw new IllegalArgumentException("String_Node_Str");
  }
  Atom[] atoms=symmetry.getAtomArrays().get(0);
  Structure cloned=atoms[0].getGroup().getChain().getStructure().clone();
  atoms=StructureTools.getRepresentativeAtomArray(cloned);
  Structure symm=new StructureImpl();
  symm.setChains(new ArrayList<Chain>());
  char chainID='A';
  for (int i=0; i < symmetry.size(); i++) {
    Chain newCh=new ChainImpl();
    newCh.setChainID(chainID + "String_Node_Str");
    chainID++;
    symm.addChain(newCh);
    Block align=symmetry.getBlock(0);
    int count=0;
    Integer start=null;
    while (start == null && count < align.length()) {
      start=align.getAlignRes().get(i).get(0 + count);
      count++;
    }
    count=1;
    Integer end=null;
    while (end == null && count <= align.length()) {
      end=align.getAlignRes().get(i).get(align.length() - count);
      count++;
    }
    end++;
    Atom[] subunit=Arrays.copyOfRange(atoms,start,end);
    for (int k=0; k < subunit.length; k++)     newCh.addGroup((Group)subunit[k].getGroup().clone());
  }
  return symm;
}