/*
* Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
* Copyright (C) 2014 The Jalview Authors
*
* This file is part of Jalview.
*
* Jalview is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* Jalview is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Jalview. If not, see .
* The Jalview Authors are detailed in the 'AUTHORS' file.
*/
package jalview.analysis;
import java.util.ArrayList;
import java.util.Hashtable;
public class SecStrConsensus {
/**
* Internal class to represent a simple base-pair.
* @author Yawn
* [JBPNote: ^^ is that Anne Menard or Ya(w)nn Ponty, I wonder ! ]
*/
public static class SimpleBP{
int bp5;
int bp3;
public SimpleBP()
{
}
public SimpleBP(int i5, int i3)
{
bp5=i5;
bp3=i3;
}
public void setBP5(int i5)
{
bp5=i5;
}
public void setBP3(int i3)
{
bp3=i3;
}
public int getBP5()
{
return bp5;
}
public int getBP3()
{
return bp3;
}
public String toString()
{
return "("+bp5+","+bp3+")";
}
}
public static int[] extractConsensus(ArrayList> bps)
{
// We do not currently know the length of the alignment
// => Estimate it as the biggest index of a base-pair plus one.
int maxlength = 0;
for (ArrayList strs : bps)
{
for (SimpleBP bp : strs)
{
maxlength = Math.max(1+Math.max(bp.bp5, bp.bp3), maxlength);
}
}
// Now we have a good estimate for length, allocate and initialize data
// to be fed to the dynamic programming procedure.
ArrayList> seq = new ArrayList>();
for (int i=0;i()); }
for (ArrayList strs : bps)
{
for (SimpleBP bp : strs)
{
int i = bp.bp5;
int j = bp.bp3;
Hashtable h = seq.get(i);
if (!h.containsKey(j))
{
h.put(j, 0.0);
}
h.put(j, h.get(j)+1.);
}
}
// At this point, seq contains, at each position i, a hashtable which associates,
// to each possible end j, the number of time a base-pair (i,j) occurs in the alignment
// We can now run the dynamic programming procedure on this data
double[][] mat = fillMatrix(seq);
ArrayList res = backtrack(mat,seq);
// Convert it to an array, ie finalres[i] = j >= 0 iff a base-pair (i,j) is present
// in the consensus, or -1 otherwise
int[] finalres = new int[seq.size()];
for (int i=0;i> seq, int i, int k)
{
return seq.get(i).containsKey(k);
}
// Returns the score of a potential base-pair, ie the number of structures in which it is found.
private static double basePairScore(ArrayList> seq, int i, int k)
{
return seq.get(i).get(k);
}
private static double[][] fillMatrix(ArrayList> seq)
{
int n = seq.size();
double[][] tab = new double[n][n];
for(int m=1;m<=n;m++)
{
for(int i=0;ii+1)
{
fact1 = tab[i+1][k-1];
}
double fact2 = 0;
if (k backtrack(double[][] tab,ArrayList> seq)
{
return backtrack(tab,seq,0,seq.size()-1);
}
private static ArrayList backtrack(double[][] tab,ArrayList> seq, int i, int j)
{
ArrayList result = new ArrayList();
if (i indices = new ArrayList();
indices.add(-1);
for (int k=i+1;k<=j;k++)
{
indices.add(k);
}
for (int k : indices)
{
if (k==-1)
{
if (tab[i][j] == tab[i+1][j])
{
result = backtrack(tab, seq, i+1,j);
}
}
else
{
if (canBasePair(seq,i,k))
{
double fact1 = 0;
if (k>i+1)
{
fact1 = tab[i+1][k-1];
}
double fact2 = 0;
if (k