/*
 *                  BioJava development code
 *
 * This code may be freely distributed and modified under the
 * terms of the GNU Lesser General Public Licence.  This should
 * be distributed with the code.  If you do not have a copy,
 * see:
 *
 *      http://www.gnu.org/copyleft/lesser.html
 *
 * Copyright for this code is held jointly by the individual
 * authors.  These should be listed in @author doc comments.
 *
 * For more information on the BioJava project and its aims,
 * or to join the biojava-l mailing list, visit the home page
 * at:
 *
 *      http://www.biojava.org/
 *
 * Created on Sep 12, 2007
 *
 */
package org.biojava.nbio.structure.io;

import org.biojava.nbio.structure.*;

import java.util.ArrayList;
import java.util.List;

/** Converts full atom representations to Calpha only ones.
 *
 * @author Andreas Prlic
 * @version %I% %G%
 */
public class CAConverter {


	/** Convert a List of chain objects to another List of chains, containing C-alpha atoms only.
	 *
	 * @param chains list of chains
	 * @return a list of chains
	 * @deprecated Use the more generic {@link #getRepresentativeAtomsOnly(List)} instead
	 */
	@Deprecated
	public static List<Chain> getCAOnly(List<Chain> chains){
		List<Chain> newChains = new ArrayList<Chain>();

		for (Chain chain : chains){
			Chain newChain = getCAOnly(chain);
			newChains.add(newChain);

		}

		return newChains;



	}


	/** Convert a List of chain objects to another List of chains, containing Representative atoms only.
	 *
	 * @param chains list of chains
	 * @return a list of chains
	 * @since Biojava 4.1.0
	 */
	public static List<Chain> getRepresentativeAtomsOnly(List<Chain> chains){
		List<Chain> newChains = new ArrayList<Chain>();

		for (Chain chain : chains){
			Chain newChain = getRepresentativeAtomsOnly(chain);
			newChains.add(newChain);
		}

		return newChains;
	}

	/** 
	 * Convert a Chain to a new Chain containing C-alpha atoms only.
	 *
	 * @param chain to convert
	 * @return a new chain containing Amino acids with C-alpha only.
	 * @deprecated Use the more generic {@link #getRepresentativeAtomsOnly(Chain)} instead
	 */
	@Deprecated
	public static Chain getCAOnly(Chain chain){

		Chain newChain = new ChainImpl();
		newChain.setChainID(chain.getChainID());
		newChain.setEntityInfo(chain.getEntityInfo());
		newChain.setSwissprotId(chain.getSwissprotId());

		List<Group> groups = chain.getAtomGroups();

		grouploop:
			for (Group g: groups){
				List<Atom> atoms = g.getAtoms();

				if ( ! (g instanceof AminoAcid))
					continue;

				for (Atom a : atoms){

					if ( a.getName().equals(StructureTools.CA_ATOM_NAME) && a.getElement()==Element.C){
						// we got a CA atom in this group!
						AminoAcid n = new AminoAcidImpl();
						n.setPDBName(g.getPDBName());
						n.setResidueNumber(g.getResidueNumber());
						n.addAtom(a);
						newChain.addGroup(n);
						continue grouploop;

					}
				}

			}
		return newChain;
	}


	/** 
	 * Convert a Chain to a new Chain containing C-alpha atoms only.
	 *
	 * @param chain to convert
	 * @return a new chain containing Amino acids with C-alpha only.
	 * @since Biojava 4.1.0
	 */
	public static Chain getRepresentativeAtomsOnly(Chain chain){

		Chain newChain = new ChainImpl();
		newChain.setId(chain.getId());
		newChain.setName(chain.getName());
		newChain.setEntityInfo(chain.getEntityInfo());
		newChain.setSwissprotId(chain.getSwissprotId());

		List<Group> groups = chain.getAtomGroups();

		grouploop:
			for (Group g: groups){
				List<Atom> atoms = g.getAtoms();

				if ( ! (g instanceof AminoAcid))
					continue;

				for (Atom a : atoms){

					if ( a.getName().equals(StructureTools.CA_ATOM_NAME) && a.getElement()==Element.C){
						// we got a CA atom in this group!
						AminoAcid n = new AminoAcidImpl();
						n.setPDBName(g.getPDBName());
						n.setResidueNumber(g.getResidueNumber());
						n.addAtom(a);
						newChain.addGroup(n);
						continue grouploop;

					}
				}

			}
		return newChain;
	}
}
