/**
   * Generates a simple MultipleAlignment: 3 structures with the same Atoms but incorreclty aligned
   * (offset of 1 position) without gaps.
   *
   * @return MultipleAlignment simple MSTA
   * @throws StructureException
   */
  private MultipleAlignment simpleMSTA() throws StructureException {

    // Generate three identical Atom arrays
    List<Atom[]> atomArrays = new ArrayList<Atom[]>(52);
    for (int i = 0; i < 3; i++) atomArrays.add(makeDummyCA(52));

    // Generate the incorrect alignment (0-1-2,1-2-3,etc)
    List<List<Integer>> alnRes = new ArrayList<List<Integer>>(3);
    for (int str = 0; str < 3; str++) {
      List<Integer> chain = new ArrayList<Integer>(50);
      for (int res = 0; res < 50; res++) chain.add(res + str);
      alnRes.add(chain);
    }

    // MultipleAlignment generation
    MultipleAlignment msa = new MultipleAlignmentImpl();
    msa.getEnsemble().setAtomArrays(atomArrays);
    BlockSet bs = new BlockSetImpl(msa);
    Block b = new BlockImpl(bs);
    b.setAlignRes(alnRes);

    // We want the identity transfromations to maintain the missalignment
    Matrix4d ident = new Matrix4d();
    ident.setIdentity();
    msa.setTransformations(Arrays.asList(ident, ident, ident));

    return msa;
  }
  /**
   * Generates a simple MultipleAlignment: 3 structures with the same Atoms but incorreclty aligned
   * with gaps.
   *
   * @return MultipleAlignment gapped MSTA
   * @throws StructureException
   */
  private MultipleAlignment gappedMSTA() throws StructureException {

    // Generate three identical Atom arrays
    List<Atom[]> atomArrays = new ArrayList<Atom[]>(30);
    for (int i = 0; i < 3; i++) atomArrays.add(makeDummyCA(30));

    // Generate alignment with nulls and some missalignments
    List<List<Integer>> alnRes = new ArrayList<List<Integer>>(3);
    List<Integer> chain1 = Arrays.asList(1, 2, 3, 5, 8, 10, 12, 15, 17, 19, 22, null, 24, 27);
    List<Integer> chain2 = Arrays.asList(1, null, 3, 6, 9, 11, 12, 15, null, 18, 22, 24, 26, 28);
    List<Integer> chain3 = Arrays.asList(1, 2, 4, 7, 9, 10, null, 15, null, 17, 22, 24, 26, 28);

    alnRes.add(chain1);
    alnRes.add(chain2);
    alnRes.add(chain3);

    // MultipleAlignment generation
    MultipleAlignment msa = new MultipleAlignmentImpl();
    msa.getEnsemble().setAtomArrays(atomArrays);
    BlockSet bs = new BlockSetImpl(msa);
    Block b = new BlockImpl(bs);
    b.setAlignRes(alnRes);

    // We want the identity transfromations to mantain the missalignments
    Matrix4d ident = new Matrix4d();
    ident.setIdentity();
    msa.setTransformations(Arrays.asList(ident, ident, ident));

    return msa;
  }
  /**
   * Generates an identity MultipleAlignment: 3 structures with the same Atoms and perfectly
   * aligned, so that TM-score = 1 and RMSD = 0.
   *
   * @return MultipleAlignment identity
   * @throws StructureException
   */
  private MultipleAlignment identityMSTA() throws StructureException {

    // Generate the identical Atom arrays
    List<Atom[]> atomArrays = new ArrayList<Atom[]>(20);
    for (int i = 0; i < 3; i++) atomArrays.add(makeDummyCA(20));

    // Generate the identity alignment (1-1-1,2-2-2,etc)
    List<List<Integer>> alnRes = new ArrayList<List<Integer>>(3);
    for (int str = 0; str < 3; str++) {
      List<Integer> chain = new ArrayList<Integer>(20);
      for (int res = 0; res < 20; res++) chain.add(res);
      alnRes.add(chain);
    }

    // MultipleAlignment generation
    MultipleAlignment msa = new MultipleAlignmentImpl();
    msa.getEnsemble().setAtomArrays(atomArrays);
    BlockSet bs = new BlockSetImpl(msa);
    Block b = new BlockImpl(bs);
    b.setAlignRes(alnRes);

    // Superimpose the alignment (which should give the identity matrices)
    ReferenceSuperimposer imposer = new ReferenceSuperimposer();
    imposer.superimpose(msa);

    return msa;
  }