code: @Override
  	public AFPChain align(Atom[] ca1, Atom[] ca2, Object param)
  	throws StructureException
  	{
  		if(params.isTryAllCPs()) {
  			return alignOptimal(ca1,ca2,param,null);
  		} else {
  			int cpPoint = params.getCPPoint();
  			return alignPermuted(ca1, ca2, param, cpPoint);
  		}
  	}
docs: Finds the optimal alignment between two proteins allowing for a circular
  permutation (CP).
  
  The precise algorithm is controlled by the
  {@link OptimalCECPParameters parameters}. If the parameter
  {@link OptimalCECPParameters#isTryAllCPs() tryAllCPs} is true, all possible
  CP sites are tried and the optimal site is returned. Otherwise, the
  {@link OptimalCECPParameters#getCPPoint() cpPoint} parameter is used to
  determine the CP point, greatly reducing the computation required.
  
  @param ca1 CA atoms of the first protein
  @param ca2 CA atoms of the second protein
  @param param {@link CeParameters} object
  @return The best-scoring alignment
  @throws StructureException
  
  @see #alignOptimal(Atom[], Atom[], Object, AFPChain[])