package com.ppfold.algo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Serializable;
import java.util.List;
/**
* Reads and stores the input parameters (matrices) of the algorithm
*
* @author Z.Sukosd
*/
public class Parameters implements Serializable {
private static final long serialVersionUID = -6960312420312527995L;
private boolean entropycalc = false; //Change to enable or disable calculation of entropy
// rules of the grammar
private double[][] prob;
// reduced group
// probabilities
private double[] pr;
// substitution rates diagonalized
private double[][] rV;
private double[][] rD;
private double[][] rV1;
// single group
// unpaired probabilities
private double[] ps;
// unpaired substitution rates diagonalized
private double[][] sV;
private double[][] sD;
private double[][] sV1;
// double group
// paired probabilities
private double[][] pd;
// paired bases substitution rates diagonalized
private double[][] dV;
private double[][] dD;
private double[][] dV1;
public Parameters(double[][] prob, double[] pr, double[] ps, double[][] pd,
double[][] rV, double[][] rD, double[][] rV1,
double[][] sV, double[][] sD, double[][] sV1, double[][] dV,
double[][] dD, double[][] dV1) {
this.prob = prob;
this.ps = ps;
this.pd = pd;
this.pr = pr;
this.rV = rV;
this.rD = rD;
this.rV1 = rV1;
this.sV = sV;
this.sD = sD;
this.sV1 = sV1;
this.dV = dV;
this.dD = dD;
this.dV1 = dV1;
}
public static Parameters readParam(List<String> lines) throws IOException {
double[][] prob = new double[3][2];
// reduced matrices
double[] pr = new double[4];
double[][] rV = new double[4][4];
double[][] rD = new double[4][4];
double[][] rV1 = new double[4][4];
// single group
double[] ps = new double[4];
double[][] sV = new double[4][4];
double[][] sD = new double[4][4];
double[][] sV1 = new double[4][4];
// double group
double[][] pd = new double[4][4];
double[][] dV = new double[16][16];
double[][] dD = new double[16][16];
double[][] dV1 = new double[16][16];
int i = 0;
int state = 0;
int substate = 0;
for (String line : lines) {
if (line.length() > 0 && line.charAt(0) == '>') {
state = state + 1;
substate = 0;
i = 0;
} else {
if (line.trim().length() == 0) {
substate += 1;
i = 0;
} else {
double[] d = line2double(line);
switch (state) {
// Grammar
case 1:
for (int k = 0; k < d.length; k++) {
prob[k][0] = d[k];
prob[k][1] = 1 - d[k];
}
break;
// Reduced group
case 2:
switch (substate) {
// 4x4
case 0:
pr = d;
break;
// 4x4
case 1:
rV[i] = d;
break;
// 4x4
case 2:
rD[i] = d;
break;
// 4x4
case 3:
rV1[i] = d;
break;
default:
break;
}
break;
case 3:
switch (substate) {
// 4x4
case 0:
ps = d;
break;
// 4x4
case 1:
sV[i] = d;
break;
// 4x4
case 2:
sD[i] = d;
break;
// 4x4
case 3:
sV1[i] = d;
break;
default:
break;
}
break;
// Double group
case 4:
switch (substate) {
// 4x4
case 0:
pd[i] = d;
break;
// 16x16
case 1:
dV[i] = d;
break;
// 16x16
case 2:
dD[i] = d;
break;
// 16x16
case 3:
dV1[i] = d;
break;
default:
break;
}
break;
default:
break;
}
i += 1;
}
}
}
return new Parameters(prob, pr, ps, pd, rV, rD, rV1, sV, sD, sV1, dV, dD, dV1);
}
public static Parameters readParam(BufferedReader input) throws IOException {
double[][] prob = new double[3][2];
// reduced matrices
double[] pr = new double[4];
double[][] rV = new double[4][4];
double[][] rD = new double[4][4];
double[][] rV1 = new double[4][4];
// single group
double[] ps = new double[4];
double[][] sV = new double[4][4];
double[][] sD = new double[4][4];
double[][] sV1 = new double[4][4];
// double group
double[][] pd = new double[4][4];
double[][] dV = new double[16][16];
double[][] dD = new double[16][16];
double[][] dV1 = new double[16][16];
int i = 0;
int state = 0;
int substate = 0;
String line = "";
while ((line = input.readLine()) != null) {
if (line.length() > 0 && line.charAt(0) == '>') {
state = state + 1;
substate = 0;
i = 0;
} else {
if (line.trim().length() == 0) {
substate += 1;
i = 0;
} else {
double[] d = line2double(line);
switch (state) {
// Grammar
case 1:
for (int k = 0; k < d.length; k++) {
prob[k][0] = d[k];
prob[k][1] = 1 - d[k];
}
break;
// Reduced group
case 2:
switch (substate) {
// 4x4
case 0:
pr = d;
break;
// 4x4
case 1:
rV[i] = d;
break;
// 4x4
case 2:
rD[i] = d;
break;
// 4x4
case 3:
rV1[i] = d;
break;
default:
break;
}
break;
case 3:
switch (substate) {
// 4x4
case 0:
ps = d;
break;
// 4x4
case 1:
sV[i] = d;
break;
// 4x4
case 2:
sD[i] = d;
break;
// 4x4
case 3:
sV1[i] = d;
break;
default:
break;
}
break;
// Double group
case 4:
switch (substate) {
// 4x4
case 0:
pd[i] = d;
break;
// 16x16
case 1:
dV[i] = d;
break;
// 16x16
case 2:
dD[i] = d;
break;
// 16x16
case 3:
dV1[i] = d;
break;
default:
break;
}
break;
default:
break;
}
i += 1;
}
}
}
return new Parameters(prob, pr, ps, pd, rV, rD, rV1, sV, sD, sV1, dV, dD, dV1);
}
private static double[] line2double(String line) {
if ("".equals(line))
return new double[0];
// ltrim
while (line.charAt(0) == ' ')
line = line.substring(1);
int len = line.length();
// rtrim
while (line.charAt(len - 1) == ' ') {
line = line.substring(0, len - 1);
len--;
}
String[] nums = line.split(" ");
double[] res = new double[nums.length];
for (int k = 0; k < nums.length; k++) {
if (!"".equals(nums[k])) {
res[k] = Double.valueOf(nums[k].trim()).doubleValue();
}
}
return res;
}
public double[] getPr() {
return pr;
}
public void setPr(double[] pr) {
this.pr = pr;
}
public double[][] getrV() {
return rV;
}
public void setrV(double[][] rV) {
this.rV = rV;
}
public double[][] getrD() {
return rD;
}
public void setrD(double[][] rD) {
this.rD = rD;
}
public double[][] getrV1() {
return rV1;
}
public void setrV1(double[][] rV1) {
this.rV1 = rV1;
}
public double[][] getDD() {
return dD;
}
public void setDD(double[][] dd) {
dD = dd;
}
public double[][] getDV() {
return dV;
}
public void setDV(double[][] dv) {
dV = dv;
}
public double[][] getDV1() {
return dV1;
}
public void setDV1(double[][] dv1) {
dV1 = dv1;
}
public double[][] getPd() {
return pd;
}
public void setPd(double[][] pd) {
this.pd = pd;
}
public double[][] getProb() {
return prob;
}
public void setProb(double[][] prob) {
this.prob = prob;
}
public double[] getPs() {
return ps;
}
public void setPs(double[] ps) {
this.ps = ps;
}
public double[][] getSD() {
return sD;
}
public void setSD(double[][] sd) {
sD = sd;
}
public double[][] getSV() {
return sV;
}
public void setSV(double[][] sv) {
sV = sv;
}
public double[][] getSV1() {
return sV1;
}
public void setSV1(double[][] sv1) {
sV1 = sv1;
}
public void setEntropyCalc(boolean value){
entropycalc = value;
}
public boolean getEntropyCalc(){
return entropycalc;
}
}