code: public static List<List<List<Integer>>> getOptAlnAsList(AFPChain afpChain) {
  		int[][][] optAln = afpChain.getOptAln();
  		int[] optLen = afpChain.getOptLen();
  		List<List<List<Integer>>> blocks = new ArrayList<List<List<Integer>>>(afpChain.getBlockNum());
  		for(int blockNum=0;blockNum<afpChain.getBlockNum();blockNum++) {
  			//TODO could improve speed an memory by wrapping the arrays with
  			// an unmodifiable list, similar to Arrays.asList(...) but with the
  			// correct size parameter.
  			List<Integer> align1 = new ArrayList<Integer>(optLen[blockNum]);
  			List<Integer> align2 = new ArrayList<Integer>(optLen[blockNum]);
  			for(int pos=0;pos<optLen[blockNum];pos++) {
  				align1.add(optAln[blockNum][0][pos]);
  				align2.add(optAln[blockNum][1][pos]);
  			}
  			List<List<Integer>> block = new ArrayList<List<Integer>>(2);
  			block.add(align1);
  			block.add(align2);
  			blocks.add(block);
  		}
  
  		return blocks;
  	}
docs: Retrieves the optimum alignment from an AFPChain and returns it as a
  java collection. The result is indexed in the same way as
  {@link AFPChain#getOptAln()}, but has the correct size().
  <pre>
  List<List<List<Integer>>> aln = getOptAlnAsList(AFPChain afpChain);
  aln.get(blockNum).get(structureNum={0,1}).get(pos)</pre>
  
  @param afpChain
  @return