/*
 *                    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/
 *
 */
package demo;

import java.io.IOException;
import java.util.List;

import org.biojava.nbio.structure.Structure;
import org.biojava.nbio.structure.StructureException;
import org.biojava.nbio.structure.align.util.AtomCache;
import org.biojava.nbio.structure.io.FileParsingParameters;
import org.biojava.nbio.structure.secstruc.DSSPParser;
import org.biojava.nbio.structure.secstruc.SecStrucCalc;
import org.biojava.nbio.structure.secstruc.SecStrucInfo;
import org.biojava.nbio.structure.secstruc.SecStrucTools;

/**
 * Demonstration of how to load a Structure with the SS information, either from
 * the PDB file annotation (Author's assignment) or from the DSSP file in the
 * PDB servers (DSSP assignment).
 *
 * @author Aleix Lafita
 *
 */
public class DemoLoadSecStruc {

	public static void main(String[] args) throws IOException,
			StructureException {

		String pdbID = "5pti";

		// Only change needed to the DEFAULT Structure loading
		FileParsingParameters params = new FileParsingParameters();
		params.setParseSecStruc(true);

		AtomCache cache = new AtomCache();
		cache.setFileParsingParams(params);

		// Use PDB format, because SS cannot be parsed from mmCIF yet
		cache.setUseMmCif(false);

		// The loaded Structure contains the SS assigned by Author (simple)
		Structure s = cache.getStructure(pdbID);

		// Print the Author's assignment (from PDB file)
		System.out.println("Author's assignment: ");
		printSecStruc(s);

		// If the more detailed DSSP prediction is required call this
		DSSPParser.fetch(pdbID, s, true);

		// Print the assignment residue by residue
		System.out.println("DSSP assignment: ");
		printSecStruc(s);

		// finally use BioJava's built in DSSP-like secondary structure assigner
		SecStrucCalc secStrucCalc = new SecStrucCalc();

		// calculate and assign
		secStrucCalc.calculate(s,true);
		printSecStruc(s);

	}

	public static void printSecStruc(Structure s){
		List<SecStrucInfo> ssi = SecStrucTools.getSecStrucInfo(s);
		for (SecStrucInfo ss : ssi) {
			System.out.println(ss.getGroup().getChain().getName() + " "
					+ ss.getGroup().getResidueNumber() + " "
					+ ss.getGroup().getPDBName() + " -> " + ss.toString());
		}
	}
}
