demo.DemoStructureFromFasta Maven / Gradle / Ivy
/*
* 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 org.biojava.nbio.structure.ResidueNumber;
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.gui.BiojavaJmol;
import org.biojava.nbio.structure.io.FastaStructureParser;
import org.biojava.nbio.core.sequence.ProteinSequence;
import org.biojava.nbio.core.sequence.compound.AminoAcidCompound;
import org.biojava.nbio.core.sequence.compound.AminoAcidCompoundSet;
import org.biojava.nbio.core.sequence.io.GenericFastaHeaderParser;
import org.biojava.nbio.core.sequence.io.ProteinSequenceCreator;
import org.biojava.nbio.core.sequence.io.template.SequenceCreatorInterface;
import org.biojava.nbio.core.sequence.io.template.SequenceHeaderParserInterface;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
/**
* Demo of how to use the {@link FastaStructureParser} class to read protein
* structures from a FASTA file.
*
* @author Spencer Bliven
*
*/
public class DemoStructureFromFasta {
@SuppressWarnings("unused")
public static void getStructureFromFasta() {
// Load a test sequence
// Normally this would come from a file, eg
// File fasta = new File("/path/to/file.fa");
String fastaStr =
"> 4HHB\n" +
"VLSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHFDLSHGSAQVKGHGK\n" +
"KVADALTNAVAHVDDMPNALSALSDLHAHKLRVDPVNFKLLSHCLLVTLAAHLPAEFTPA\n" +
"VHASLDKFLASVSTVLTSKYR\n";
InputStream fasta;
try {
fasta = new ByteArrayInputStream(fastaStr.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return;
}
// Create a header parser to parse the header lines into valid structure accessions.
// The resulting accession can be anything interpretable by AtomCache.getStructure.
// Possible Examples: "4HHB" (whole structure), "d4hhba_" (SCOP domain),
// "4HHB.A:1-15" (residue range)
// For this example, the built-in fasta parser will extract the correct accession.
SequenceHeaderParserInterface headerParser;
headerParser = new GenericFastaHeaderParser();
// Create AtomCache to fetch structures from the PDB
AtomCache cache = new AtomCache();
// Create SequenceCreator. This converts a String to a ProteinSequence
AminoAcidCompoundSet aaSet = AminoAcidCompoundSet.getAminoAcidCompoundSet();
SequenceCreatorInterface creator;
creator = new ProteinSequenceCreator(aaSet);
// parse file
FastaStructureParser parser = new FastaStructureParser(
fasta, headerParser, creator, cache);
try {
parser.process();
} catch (IOException e) {
e.printStackTrace();
return;
} catch (StructureException e) {
e.printStackTrace();
return;
}
// Get info from the parser
ResidueNumber[][] residues = parser.getResidues();
ProteinSequence[] sequences = parser.getSequences();
Structure[] structures = parser.getStructures();
String[] accessions = parser.getAccessions();
// Use it! For example:
// Display the structure, highlighting the sequence
displayStructure( structures[0], residues[0]);
}
/**
* Displays the given structure and highlights the given residues.
*
* @param structure The structure to display
* @param residues A list of residues to highlight
*/
private static void displayStructure(Structure structure,
ResidueNumber[] residues) {
//Display each structure
BiojavaJmol jmol = new BiojavaJmol();
jmol.setStructure(structure);
//Highlight non-null atoms
jmol.evalString("select *; spacefill off; wireframe off; color chain; backbone 0.4; ");
String selectionCmd = buildJmolSelection(residues);
jmol.evalString(selectionCmd);
jmol.evalString("backbone 1.0; select none;");
}
/**
* Converts an array of ResidueNumbers into a jMol selection.
*
* For example, "select 11^ :A.CA or 12^ :A.CA;" would select the
* CA atoms of residues 11-12 on chain A.
* @param residues Residues to include in the selection. Nulls are ignored.
* @return
*/
private static String buildJmolSelection(ResidueNumber[] residues) {
StringBuilder cmd = new StringBuilder("select ");
for(ResidueNumber res : residues) {
if(res != null) {
cmd.append(String.format("%d^%s:%s.CA or ", res.getSeqNum(),
res.getInsCode()==null?" ":res.getInsCode(),
res.getChainName()));
}
}
cmd.append("none;");//easier than removing the railing 'or'
return cmd.toString();
}
public static void main(String[] args) {
getStructureFromFasta();
}
}