
org.biojava.nbio.structure.align.model.AfpChainWriter Maven / Gradle / Ivy
Show all versions of biojava-structure Show documentation
/*
* 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 Feb 15, 2010
* Author: Andreas Prlic
*
*/
package org.biojava.nbio.structure.align.model;
import org.biojava.nbio.structure.*;
import org.biojava.nbio.structure.align.ce.CeMain;
import org.biojava.nbio.structure.align.ce.CeSideChainMain;
import org.biojava.nbio.structure.align.fatcat.FatCatFlexible;
import org.biojava.nbio.structure.align.seq.SmithWaterman3Daligner;
import org.biojava.nbio.structure.align.util.AFPAlignmentDisplay;
import org.biojava.nbio.structure.jama.Matrix;
import java.io.StringWriter;
import java.util.List;
/** A class to convert the data in an AfpChain object to various String outputs.
*
* @author Andreas Prlic
*
*/
public class AfpChainWriter
{
public static final String newline = System.getProperty("line.separator");
private static int LINELENGTH = 70;
public static String toFatCat(AFPChain afpChain, Atom[] ca1, Atom[] ca2)
{
boolean printLegend = true;
boolean longHeader = true;
boolean showHTML = false;
boolean showAlignmentBlock = false;
return toFatCatCore(afpChain, ca1, ca2, printLegend, longHeader, showHTML, showAlignmentBlock);
}
public static String toScoresList(AFPChain afpChain){
// see sippl On distance and similarity in fold space 2008 bioinformatics
StringWriter writer = new StringWriter();
if ( afpChain.getAlgorithmName().startsWith("CE")) {
writer.append("Z-score " );
writer.append(String.format("%.2f", afpChain.getProbability()));
writer.append(newline);
}
writer.append("Sab (nr. equivalent residues): " );
writer.append(String.valueOf(afpChain.getNrEQR())).append("");
writer.append(newline);
writer.append("Dab (distance between folds a,b): ");
int dab = afpChain.getCa1Length()+afpChain.getCa2Length() - 2 * afpChain.getNrEQR();
writer.append(String.valueOf(dab)).append("");
writer.append(newline);
writer.append("sab (relative similarity): ");
double sab = 2 * afpChain.getNrEQR() / (double)( afpChain.getCa1Length() + afpChain.getCa2Length());
writer.append(String.valueOf(sab)).append("");
writer.append(newline);
writer.append("cab (coverage a): ");
double cab = afpChain.getNrEQR() / (double) afpChain.getCa1Length();
writer.append(String.valueOf(cab)).append("");
writer.append(newline);
writer.append("cba (coverage b): ");
double cba = afpChain.getNrEQR() / (double) afpChain.getCa2Length();
writer.append(String.valueOf(cba)).append("");
writer.append(newline);
writer.append("seq similarity: ");
writer.append(String.valueOf(afpChain.getSimilarity())).append("");
writer.append(newline);
writer.append("TM-score: ");
writer.append(String.valueOf(afpChain.getTMScore())).append("");
writer.append(newline);
return writer.toString();
}
/**
* Output in FatCatCore format
*
* Note that if a circular permutation has occured the residue numbers may
* be innaccurate.
*
* @param afpChain
* @param ca1
* @param ca2
* @param printLegend
* @param longHeader
* @param showHTML
* @param showAlignmentBlock
* @return
*/
public static String toFatCatCore(
AFPChain afpChain,
Atom[] ca1,
Atom[] ca2,
boolean printLegend, boolean longHeader, boolean showHTML, boolean showAlignmentBlock){
//TODO The sequence numbers are inaccurate if a !afpChain.isSequential()
String name1 = afpChain.getName1();
String name2 = afpChain.getName2();
int ca1Length = afpChain.getCa1Length();
int ca2Length = afpChain.getCa2Length();
int blockNum = afpChain.getBlockNum();
int totalLenIni = afpChain.getTotalLenIni();
double totalRmsdIni = afpChain.getTotalRmsdIni();
int optLength = afpChain.getOptLength();
double totalRmsdOpt = afpChain.getTotalRmsdOpt();
double chainRmsd = afpChain.getChainRmsd();
double alignScore = afpChain.getAlignScore();
int alnLength = afpChain.getAlnLength();
int gapLen = afpChain.getGapLen();
List afpSet = afpChain.getAfpSet();
double similarity = afpChain.getSimilarity();
double identity = afpChain.getIdentity();
if (similarity <0 || identity < 0){
afpChain.calcSimilarity();
similarity = afpChain.getSimilarity();
identity = afpChain.getIdentity();
}
String algorithmName = afpChain.getAlgorithmName();
//String version = afpChain.getVersion();
double probability = afpChain.getProbability();
int afpNum = afpSet.size();
int[] blockGap = afpChain.getBlockGap();
double[] blockScore = afpChain.getBlockScore();
double[] blockRmsd = afpChain.getBlockRmsd();
int[] blockSize = afpChain.getBlockSize();
int alnbeg1 = afpChain.getAlnbeg1();
int alnbeg2 = afpChain.getAlnbeg2();
char[] alnseq1 = afpChain.getAlnseq1();
char[] alnseq2 = afpChain.getAlnseq2();
char[] alnsymb = afpChain.getAlnsymb();
// == end of extractation of data values from afpChain
////////////////////////////////
StringBuffer txt = new StringBuffer();
if ( longHeader) {
txt.append(String.format("Align %s.pdb %d with %s.pdb %d", name1, ca1Length, name2, ca2Length));
}
else {
txt.append(String.format("Align %s.pdb Length1: %d with %s.pdb Length2: %d", name1, ca1Length, name2, ca2Length));
}
txt.append(newline);
if ( afpChain.isShortAlign()){
txt.append("Short match");
return txt.toString();
}
//txt.append(String.format("raw-score: %.2f norm.-score: %.2f ", alignScore, normAlignScore));
if ( longHeader ) {
txt.append(String.format( "Twists %d ini-len %d ini-rmsd %.2f opt-equ %d opt-rmsd %.2f chain-rmsd %.2f Score %.2f align-len %d gaps %d (%.2f%%)",
blockNum - 1, totalLenIni, totalRmsdIni, optLength, totalRmsdOpt, chainRmsd, alignScore,
alnLength, gapLen, (100.0 * gapLen/alnLength)) );
txt.append(newline);
} else {
if ( ! longHeader)
printScore(txt,algorithmName,probability,longHeader);
printScoresInLines(afpChain, blockNum, optLength, totalRmsdOpt, alignScore, alnLength, gapLen, identity, similarity,txt);
}
//txt.append(String.format("P-value %.2e Afp-num %d Identity %.2f%% Similarity %.2f%% norm.-score: %.2f"+newline, probability, afpNum, identity * 100, similarity * 100, normAlignScore));
if ( longHeader) {
printScore(txt,algorithmName,probability,longHeader);
txt.append(String.format("Afp-num %d Identity %.2f%% Similarity %.2f%%", afpNum, identity * 100, similarity * 100));
txt.append(newline);
}
int i;
double gap;
if ( longHeader ){
int fragLen = 8 ; // FatCatParameters.DEFAULT_FRAGLEN;
for(i = 0; i < blockNum; i ++) {
gap = blockGap[i] /( (double)blockGap[i] + fragLen * blockSize[i]);
txt.append(String.format( "Block %2d afp %2d score %5.2f rmsd %5.2f gap %d (%.2f%%)",
i, blockSize[i], blockScore[i], blockRmsd[i], blockGap[i], gap));
txt.append(newline);
}
}
int linelen = 70;
String a;
String b;
String c;
int t = 0;
int ap = alnbeg1;
int bp = alnbeg2;
int k, len;
//System.out.println(alnseq1.length + " " + alnseq1.toString());
while((alnLength - t) > 0) {
if(alnLength - t > linelen) len = linelen;
else len = alnLength - t;
if ( ap >= ca1.length)
break;
if ( bp >= ca2.length)
break;
String pdb1 = ca1[ap].getGroup().getResidueNumber().toString();
String pdb2 = ca2[bp].getGroup().getResidueNumber().toString();
//System.err.println("t,len:"+t+":"+len);
String lseq1 = new String(alnseq1).substring(t,t+len);
String lseq2 = new String(alnseq2).substring(t,t+len);
String lsymb = new String(alnsymb).substring(t,t+len);
//System.err.println("B:" + b);
// check conservation and color accordingly, if requested by user.
if ( showHTML ) {
a = "";
b = "";
c = "";
// | ... Structurally equivalent and identical residues
// : ... Structurally equivalent and similar residues
// . ... Structurally equivalent, but not similar residues.
for (int pos = 0 ; pos < lseq1.length() ; pos ++){
char c1 = lseq1.charAt(pos);
char c2 = lseq2.charAt(pos);
char cl = lsymb.charAt(pos);
int block = -1 ;
if ( cl != ' ') {
try {
block = Integer.parseInt(cl+"");
} catch (Exception e){
//
}
}
if ( cl != ' ' ){
if ( showAlignmentBlock && block > -1 ) {
a += "" + c1 + "";
b += "" + c2 + "";
c += "" + cl + "";
} else {
a += getPrefix(c1, c2, 0, block, false).toString() + c1 + "";
b += getPrefix(c1, c2, 1, block, false).toString() + c2 + "";
c += "" + cl + "";
}
} else if ( c1 != '-' && c2 != '-') {
a += "" + c1 + "";
b += "" + c2 + "";
c += "" + cl + "";
} else {
a += "" + c1 + "";
b += "" + c2 + "";
c += "" + cl + "";
}
if(c1 != '-') ap ++;
if(c2 != '-') bp ++;
}
} else {
a = lseq1;
b = lseq2;
c = lsymb;
}
txt.append(newline);
if ( longHeader )
txt.append(String.format("%14s", " "));
else
txt.append(String.format("%14s", " "));
if ( longHeader ) {
for(k = 10; k <= len; k += 10)
txt.append(" . :");
if(k <= len + 5) txt.append(" .");
} else {
for(k = 10; k <= len; k += 10)
txt.append("----+----|");
if(k <= len + 5) txt.append("----+");
}
txt.append(newline);
txt.append(String.format("Chain 1:%5s %s"+newline +"%14s%s"+newline+"Chain 2:%5s %s",
pdb1, a, " ", c, pdb2, b));
txt.append(newline);
if ( ! showHTML){
for(k = 0; k < len; k ++) {
if(a.charAt(k) != '-') ap ++;
if(b.charAt(k) != '-') bp ++;
}
}
t += len;
}
txt.append(newline);
if ( printLegend ){
if ( algorithmName.equalsIgnoreCase(CeMain.algorithmName) ||
algorithmName.equalsIgnoreCase(SmithWaterman3Daligner.algorithmName)){
txt.append("Note: positions are from PDB; | means alignment of identical amino acids, : of similar amino acids ");
} else {
txt.append("Note: positions are from PDB; the numbers between alignments are block index");
}
txt.append(newline);
}
return txt.toString();
}
private static void printScoresInLines(AFPChain afpChain, int blockNum, int optLength, double totalRmsdOpt, double alignScore,
int alnLength, int gapLen, double identity, double similarity, StringBuffer txt)
{
if ( blockNum - 1 > 0) {
txt.append(String.format( "Twists %d ", blockNum -1 ));
txt.append(newline);
}
txt.append(String.format("Equ: %d ", optLength));
txt.append(newline);
txt.append(String.format("RMSD: %.2f ", totalRmsdOpt));
txt.append(newline);
txt.append(String.format("Score: %.2f ", alignScore));
txt.append(newline);
txt.append(String.format("Align-len: %d ", alnLength));
txt.append(newline);
txt.append(String.format("Gaps: %d (%.2f%%)",
gapLen, (100.0 * gapLen/alnLength)) );
txt.append(newline);
if ( afpChain.getTMScore() >= 0) {
txt.append(String.format("TM-score: %.2f",afpChain.getTMScore()));
txt.append(newline);
}
txt.append(newline);
txt.append(String.format("Identity: %.2f%% ", identity * 100 ));
txt.append(newline);
txt.append(String.format("Similarity: %.2f%%", similarity * 100));
txt.append(newline);
}
private static void printScore(StringBuffer txt,
String algorithmName,
double probability,
boolean longHeader)
{
if ( algorithmName.equalsIgnoreCase(CeMain.algorithmName) || algorithmName.equalsIgnoreCase(CeSideChainMain.algorithmName) ){
txt.append(String.format("Z-score %.2f ", probability));
if ( ! longHeader)
txt.append(newline);
} else if ( algorithmName.equalsIgnoreCase(SmithWaterman3Daligner.algorithmName)) {
} else {
if ( longHeader ){
txt.append(String.format("P-value %.2e ",probability));
} else {
txt.append(String.format("P-value: %.2e ",probability));
txt.append(newline);
}
}
}
/**
* Prints the afpChain as a nicely formatted alignment, including alignment
* statistics, the aligned sequences themselves, and information about the
* superposition.
* @param afpChain
* @param ca1
* @param ca2
* @return a String representation as it is used on the RCSB PDB web site for display.
*/
public static String toWebSiteDisplay(AFPChain afpChain, Atom[] ca1, Atom[] ca2 ){
boolean showAlignmentBlock = true;
return toWebSiteDisplay(afpChain, ca1, ca2, showAlignmentBlock);
}
/**
* Prints the afpChain as a nicely formatted alignment, including alignment
* statistics, the aligned sequences themselves, and information about the
* superposition.
* @param afpChain
* @param ca1
* @param ca2
*
* @return a String representation as it is used on the RCSB PDB web site for display.
*/
public static String toWebSiteDisplay(AFPChain afpChain, Atom[] ca1, Atom[] ca2, boolean showAlignmentBlock){
boolean printLegend = true;
boolean longHeader = true;
boolean showHTML = true;
if ( afpChain.getAlgorithmName().equalsIgnoreCase(FatCatFlexible.algorithmName)) {
String msg = toFatCatCore(afpChain,ca1,ca2,printLegend,longHeader,showHTML, showAlignmentBlock);
return msg;
}
boolean showSeq = true;
AFPAlignmentDisplay.getAlign(afpChain, ca1, ca2, showSeq);
// String msg= toFatCatCore(afpChain,ca1,ca2, printLegend,longHeader);
//
String msg = toPrettyAlignment(afpChain, ca1, ca2, showHTML, showAlignmentBlock);
msg = msg + newline +
" | ... Structurally equivalent and identical residues " + newline +
" : ... Structurally equivalent and similar residues " + newline +
" . ... Structurally equivalent, but not similar residues. " + newline;
msg += newline;
msg += " To calculate the coordinates of chain 2 aligned on chain 1 apply the following transformation: ";
msg += newline;
msg += newline;
msg += toRotMat(afpChain);
return msg;
}
private static String toPrettyAlignment(AFPChain afpChain, Atom[] ca1, Atom[] ca2, boolean showHTML, boolean showAlignmentBlock) {
String name1 = afpChain.getName1();
String name2 = afpChain.getName2();
int ca1Length = afpChain.getCa1Length();
int ca2Length = afpChain.getCa2Length();
int blockNum = afpChain.getBlockNum();
int optLength = afpChain.getOptLength();
double totalRmsdOpt = afpChain.getTotalRmsdOpt();
double alignScore = afpChain.getAlignScore();
int alnLength = afpChain.getAlnLength();
int gapLen = afpChain.getGapLen();
double similarity = afpChain.getSimilarity();
double identity = afpChain.getIdentity();
if (similarity <0 || identity < 0){
afpChain.calcSimilarity();
similarity = afpChain.getSimilarity();
identity = afpChain.getIdentity();
}
String algorithmName = afpChain.getAlgorithmName();
//String version = afpChain.getVersion();
double probability = afpChain.getProbability();
// == end of extractation of data values from afpChain
StringBuffer txt = new StringBuffer();
txt.append(String.format("Align %s.pdb Length1: %d with %s.pdb Length2: %d", name1, ca1Length, name2, ca2Length));
txt.append(newline);
if ( afpChain.isShortAlign()){
txt.append("Short match");
return txt.toString();
}
printScore(txt, algorithmName, probability, false);
printScoresInLines(afpChain, blockNum, optLength, totalRmsdOpt, alignScore, alnLength, gapLen,identity, similarity, txt);
txt.append(newline);
int[] optLen = afpChain.getOptLen();
int[][][] optAln = afpChain.getOptAln();
int i, j,p1, p2;
int k;
int p1b = 0;
int p2b = 0;
int len = 0;
StringWriter alnseq1 = new StringWriter();
StringWriter alnseq2 = new StringWriter();
StringWriter alnsymb = new StringWriter();
StringWriter header1 = new StringWriter();
StringWriter footer1 = new StringWriter();
StringWriter header2 = new StringWriter();
StringWriter footer2 = new StringWriter();
StringWriter block = new StringWriter();
int aligPos = -1;
for(i = 0; i < blockNum; i ++) {
for(j = 0; j < optLen[i]; j ++) {
p1 = optAln[i][0][j];
p2 = optAln[i][1][j];
aligPos++;
// System.out.println(p1 + " " + p2 + " " + footer2.toString());
if ( len == 0){
//the first position of sequence in alignment
formatStartingText(p1,p2,header1,header2,footer1,footer2,ca1,ca2);
} else {
// check for gapped region
int lmax = (p1 - p1b - 1)>(p2 - p2b - 1)?(p1 - p1b - 1):(p2 - p2b - 1);
for(k = 0; k < lmax; k ++) {
formatGappedRegion(ca1, ca2, txt, p1, p2, k, p1b, p2b, alnseq1, alnseq2, alnsymb, header1, footer1, header2,
footer2, block,len, showHTML);
len++;
doLenCheck(len,txt,header1,header2,alnseq1,alnsymb,alnseq2,footer1, footer2,block, showHTML) ;
}
}
// ALIGNED REGION
// System.out.println(len + " >" + header1.toString() +"< ");
// System.out.println(len + " >" + header2.toString() +"< ");
// System.out.println(len + " >" + alnseq1.toString() +"< ");
// System.out.println(len + " >" + alnsymb.toString() +"< ");
// System.out.println(len + " >" + alnseq2.toString() +"< ");
// System.out.println(len + " >" + footer1.toString() +"< ");
formatAlignedRegion(afpChain, ca1, ca2, p1, p2, alnseq1, alnseq2, alnsymb, header1, footer1, header2, footer2, block,len, aligPos, showHTML, showAlignmentBlock);
// System.out.println(len + " >" + header1.toString() +"< ");
// System.out.println(len + " >" + header2.toString() +"< ");
// System.out.println(len + " >" + alnseq1.toString() +"< ");
// System.out.println(len + " >" + alnsymb.toString() +"< ");
// System.out.println(len + " >" + alnseq2.toString() +"< ");
// System.out.println(len + " >" + footer1.toString() +"< ");
len++;
doLenCheck(len,txt,header1,header2,alnseq1,alnsymb,alnseq2,footer1, footer2,block, showHTML) ;
p1b = p1;
p2b = p2;
//header1.append(newline);
//header2.append(newline);
}
}
alnLength = len;
doLenCheck(LINELENGTH,txt,header1,header2,alnseq1,alnsymb,alnseq2,footer1, footer2,block, showHTML);
return txt.toString();
}
/**
* Prints the alignment in the simplest form: a list of aligned residues.
* Format is one line per residue pair, tab delimited:
* - 1. PDB number. Includes insertion code
* - 1. Chain.
* - 1. Amino Acid. Three letter code.
* - 2. PDB number.
* - 2. Chain.
* - 2. Amino Acid.
*
* example:
* 152 A ALA 161S A VAL
* Note that this format loses information about blocks.
* @param afpChain
* @param ca1
* @param ca2
* @return a String representation of the aligned pairs.
*/
public static String toAlignedPairs(AFPChain afpChain, Atom[] ca1, Atom[] ca2) {
StringWriter pairs = new StringWriter();
//Write structure names & PDB codes
pairs.append("#Struct1:\t");
pairs.append(afpChain.getName1());
pairs.append("\n");
pairs.append("#Struct2:\t");
pairs.append(afpChain.getName2());
pairs.append("\n");
//Write optimally aligned pairs
pairs.append("#Num1\tChain1\tAA1\tNum2\tChain2\tAA2\n");
int[][][] optAln = afpChain.getOptAln();
int[] blockLen = afpChain.getOptLen();
for( int block=0;block= tmppos) {
//alnseq1[len] = '-';
if ( formatHTML){
alnseq1.append("-");
header1.append(" ");
header2.append(" ");
} else {
alnseq1.append('-');
header1.append(" ");
header2.append(" ");
}
}
else {
if ( formatHTML){
alnseq1.append(getPrefix(oneletter1,oneletter2,0,-1, false));
}
alnseq1.append(oneletter1);
if (formatHTML){
alnseq1.append("");
}
formatPosition(pos1,ca1, len, header1, header2);
}
if(k >= (p2 - p2b - 1)) {
//alnseq2[len] = '-';
if ( formatHTML){
alnseq2.append("-");
footer1.append(" ");
footer2.append(" ");
} else {
alnseq2.append('-');
footer1.append(" ");
footer2.append(" ");
}
}
else {
if ( formatHTML){
alnseq2.append(getPrefix(oneletter1,oneletter2,1, -1, false));
}
alnseq2.append(oneletter2);
if (formatHTML){
alnseq2.append("");
}
formatPosition(pos2, ca2, len, footer1, footer2);
}
//alnsymb[len ++] = ' ';
alnsymb.append(' ');
}
private static CharSequence getPrefix(char oneletter1, char oneletter2,
int i, int blockNr, boolean showAlignmentBlock) {
if ( oneletter1 == '-' || oneletter2 == '-' ) {
// a gap in the alignment.
// label as mismatch
return "";
}
// an aligned position
if ( showAlignmentBlock && blockNr > -1){
return "";
}
// we return the "default" sequence alignment view...
if ( oneletter1 == oneletter2)
return "";
double score = AFPAlignmentDisplay.aaScore(oneletter1,oneletter2);
if ( score > 0 )
return "";
// not similar
return "";
}
private static void formatPosition(int pos1, Atom[] ca, int len, StringWriter header1, StringWriter header2)
{
int linePos = len % LINELENGTH;
if ( header1.getBuffer().length() < linePos) {
// fill up the buffer, we are probably shortly after the start...
for ( int i = header1.getBuffer().length() ; i< linePos ; i++){
header1.append(" ");
}
}
Atom a = ca[pos1];
Group g = a.getGroup();
ResidueNumber residueNumber = g.getResidueNumber();
pos1 = residueNumber.getSeqNum();
boolean hasInsertionCode = false;
if ( residueNumber.getInsCode() != null) {
hasInsertionCode = true;
}
if ( (pos1 %10 == 0) && ( ! hasInsertionCode)) {
CharSequence display = getPDBPos(a);
boolean ignoreH1 = false;
// make sure we don't have a problem with the left boundary...
if ( header1.getBuffer().length()-1 > linePos) {
ignoreH1 = true;
//System.out.println("Ignore h1: " + len + " " + header1.getBuffer().length() + " linePos: " + linePos +" >" + header1.toString() +"<");
}
//System.out.println(len + " p1:" + tmp + " = " + pos1 + " " + " " + display + " " + ignoreH1);
if ( ! ignoreH1) {
header1.append(String.format("%-13s",display ));
header2.append("|");
} else {
header2.append("|");
}
} else if ( hasInsertionCode){
Character insCode = g.getResidueNumber().getInsCode();
if ( insCode != null)
header2.append(insCode);
else {
header2.append("!");
}
} else if ( ((pos1) %5 ) == 0 && len > 5) {
header2.append(".");
} else {
if ( len > 0)
header2.append(" ");
}
}
private static void formatAlignedRegion(AFPChain afpChain, Atom[] ca1, Atom[] ca2, int p1, int p2,
StringWriter alnseq1, StringWriter alnseq2,
StringWriter alnsymb, StringWriter header1, StringWriter footer1, StringWriter header2,
StringWriter footer2, StringWriter block, int len, int aligPos,
boolean showHTML, boolean showAlignmentBlock)
{
char c1;
char c2;
if (( p1 < ca1.length) && (p2< ca2.length)){
c1= getOneLetter(ca1[p1].getGroup());
c2 = getOneLetter(ca2[p2].getGroup());
} else {
c1 = 'X';
c2 = 'X';
}
int blockPos = -1;
if ( afpChain.getBlockNum() > 0) {
blockPos = AFPAlignmentDisplay.getBlockNrForAlignPos(afpChain, aligPos);
}
double score = AFPAlignmentDisplay.aaScore(c1,c2);
if ( showHTML) {
alnseq1.append(getPrefix(c1,c2, 0, blockPos, showAlignmentBlock));
alnseq2.append(getPrefix(c1,c2, 1, blockPos, showAlignmentBlock));
}
alnseq1.append(c1);
alnseq2.append(c2);
if ( showHTML){
alnseq1.append("");
alnseq2.append("");
}
if ( c1 == c2){
if ( showHTML){
alnsymb.append("|");
} else {
alnsymb.append('|');
}
//alnsymb[len ++] = '|';
} else {
if ( score > 1) {
if ( showHTML){
alnsymb.append( ":");
} else {
alnsymb.append( ':');
}
}
else {
if ( showHTML)
alnsymb.append( ".");
else
alnsymb.append( '.');
}
}
if ( p1 < ca1.length)
formatPosition(p1, ca1,len, header1, header2);
if ( p2 < ca2.length)
formatPosition(p2,ca2,len, footer1, footer2);
}
private static void formatStartingText(int p1, int p2, StringWriter header1, StringWriter header2, StringWriter footer1,
StringWriter footer2, Atom[] ca1, Atom[] ca2)
{
header1.append(String.format("%-13s", getPDBPos(ca1[p1])));
header2.append("|");
footer1.append(String.format("%-13s", getPDBPos(ca2[p2])));
footer2.append("|");
}
private static boolean doLenCheck(int len, StringBuffer txt, StringWriter header1, StringWriter header2, StringWriter alnseq1,
StringWriter alnsymb, StringWriter alnseq2, StringWriter footer1, StringWriter footer2, StringWriter block, boolean formatHTML)
{
if ( len % LINELENGTH == 0) {
//txt.append("|");
txt.append(header1);
//txt.append("|");
txt.append(newline);
//txt.append("|");
txt.append(header2);
//txt.append("|");
txt.append(newline);
//txt.append("|");
txt.append(alnseq1);
//txt.append("|");
txt.append(newline);
//txt.append("|");
txt.append(alnsymb);
// txt.append(newline);
// txt.append(block);
//txt.append("|");
txt.append(newline);
//txt.append("|");
txt.append(alnseq2);
//txt.append("|");
txt.append(newline);
//txt.append("|");
txt.append(footer2);
//txt.append("|");
txt.append(newline);
//txt.append("|");
txt.append(footer1);
//txt.append("|");
txt.append(newline);
txt.append(newline);
txt.append(newline);
if (formatHTML ) {
int len1 = alnseq1.getBuffer().length();
int len2 = alnseq2.getBuffer().length();
int lens = alnsymb.getBuffer().length();
alnseq1.getBuffer().replace(0, len1, "");
alnseq2.getBuffer().replace(0, len2, "");
alnsymb.getBuffer().replace(0, lens, "");
header1.getBuffer().replace(0, LINELENGTH, "");
header2.getBuffer().replace(0, LINELENGTH , "");
footer1.getBuffer().replace(0, LINELENGTH, "");
footer2.getBuffer().replace(0, LINELENGTH, "");
block.getBuffer().replace(0, LINELENGTH, "");
} else {
alnseq1.getBuffer().replace(0, LINELENGTH, "");
alnseq2.getBuffer().replace(0, LINELENGTH, "");
alnsymb.getBuffer().replace(0, LINELENGTH, "");
header1.getBuffer().replace(0, LINELENGTH, "");
header2.getBuffer().replace(0, LINELENGTH , "");
footer1.getBuffer().replace(0, LINELENGTH, "");
footer2.getBuffer().replace(0, LINELENGTH, "");
block.getBuffer().replace(0, LINELENGTH, "");
}
StringBuffer buf = header1.getBuffer();
for ( int i=0;i 1) {
txt.append("Operations for block " );
txt.append(blockNr);
txt.append(newline);
}
String origString = "orig";
if ( blockNr > 0)
origString = (blockNr)+"";
txt.append(String.format(" X"+(blockNr+1)+" = (%9.6f)*X"+ origString +" + (%9.6f)*Y"+ origString +" + (%9.6f)*Z"+ origString +" + (%12.6f)",m.get(0,0),m.get(1,0), m.get(2,0), shift.getX()));
txt.append( newline);
txt.append(String.format(" Y"+(blockNr+1)+" = (%9.6f)*X"+ origString +" + (%9.6f)*Y"+ origString +" + (%9.6f)*Z"+ origString +" + (%12.6f)",m.get(0,1),m.get(1,1), m.get(2,1), shift.getY()));
txt.append( newline);
txt.append(String.format(" Z"+(blockNr+1)+" = (%9.6f)*X"+ origString +" + (%9.6f)*Y"+ origString +" + (%9.6f)*Z"+ origString +" + (%12.6f)",m.get(0,2),m.get(1,2), m.get(2,2), shift.getZ()));
txt.append(newline);
}
return txt.toString();
}
public static String toCE(AFPChain afpChain, Atom[] ca1, Atom[] ca2)
{
String name1 = afpChain.getName1();
String name2 = afpChain.getName2();
int optLength = afpChain.getOptLength();
double totalRmsdOpt = afpChain.getTotalRmsdOpt();
int alnLength = afpChain.getAlnLength();
int gapLen = afpChain.getGapLen();
double similarity = afpChain.getSimilarity();
double identity = afpChain.getIdentity();
if (similarity <0 || identity <0 ){
afpChain.calcSimilarity();
similarity = afpChain.getSimilarity();
identity = afpChain.getIdentity();
}
double probability = afpChain.getProbability();
int alnbeg1 = afpChain.getAlnbeg1();
int alnbeg2 = afpChain.getAlnbeg2();
char[] alnseq1 = afpChain.getAlnseq1();
char[] alnseq2 = afpChain.getAlnseq2();
long calculationTime = afpChain.getCalculationTime();
// == end of extractation of data values from afpChain
StringBuffer txt = new StringBuffer();
txt.append("Chain 1: ");
txt.append(name1);
txt.append(" (Size=");
txt.append(ca1.length);
txt.append(")");
txt.append(newline);
txt.append("Chain 2: ");
txt.append(name2);
txt.append(" (Size=");
txt.append(ca2.length);
txt.append(")");
txt.append(newline);
txt.append(newline);
txt.append(String.format("Alignment length = %d Rmsd = %.2fA Z-Score = %.1f",optLength,totalRmsdOpt,probability));
txt.append(String.format(" Gaps = %d(%.1f%%) CPU = %d ms. Sequence identities = %.1f%%",gapLen,( gapLen*100.0/optLength),calculationTime,identity*100));
int linelen = 70;
String a;
String b;
int t = 0;
int ap = alnbeg1;
int bp = alnbeg2;
int k, len;
while((alnLength - t) > 0) {
if(alnLength - t > linelen) len = linelen;
else len = alnLength - t;
//System.err.println("t,len:"+t+":"+len);
a = new String(alnseq1).substring(t,t+len);
b = new String(alnseq2).substring(t,t+len);
//System.err.println("B:" + b);
/*
txt.append(newline);
txt.append(String.format("%14s", " "));
for(k = 10; k <= len; k += 10)
txt.append(" . :");
if(k <= len + 5) txt.append(" .");
*/
//String pdb1 = ca1[ap].getParent().getPDBCode();
//String pdb2 = ca2[bp].getParent().getPDBCode();
txt.append(newline);
txt.append(String.format("Chain 1:%5s %s"+newline+"Chain 2:%5s %s",
(ap+1), a, (bp+1), b));
txt.append(newline);
for(k = 0; k < len; k ++) {
if(a.charAt(k) != '-') ap ++;
if(b.charAt(k) != '-') bp ++;
}
t += len;
}
txt.append(newline);
txt.append(toRotMat(afpChain));
return txt.toString();
}
}