import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
/**
* Classe che rappresenta una collezione di stringhe di DNA tutte ele stringhe
* hanno la stessa lunghezza
*
* @author sandrof
*
*/
public class DNAStrings {
// rappresenta una lista di liste di nucleotidi
private List<List<Nucleotide>> seq;
// numero di stringhe presenti nella collezione
private int t;
// lunghezza di ciascuna stringa
private int n;
/**
* Costruttore
*
* @param l
* lista di liste di nucleotidi
* @param nString
* numero di stringhe
* @param nNucleotid
* numero di nucleotidi per ciascuna stringa
*/
public DNAStrings(List<List<Nucleotide>> l, int nString, int nNucleotid) {
seq = l;
t = nString;
n = nNucleotid;
}
/**
* Calcola il consenso di una lista di posizioni dalla prima alla posizione
* index. Il consenso e' calcolato come somma dei consensi delle colonne
* nella matrice di allineamento
*
* @param s
* lista di posizioni
* @param l
* lunghezza delle stringhe per cui si calcola il consenso
* @param index
* posizione finale per cui si deve calcolare il consenso
* @return la somma del consenso delle colonne della matrice di allineamento
*/
public int score(List<Integer> s, int l, int index) {
Nucleotide[][] allignedMatrix = new Nucleotide[index][l];
for (int riga = 0; riga < index; riga++) {
for (int colonna = 0; colonna < l; colonna++) {
List<Nucleotide> dnaString = seq.get(riga);
Integer displacement = s.get(riga);
allignedMatrix[riga][colonna] = dnaString.get(displacement + colonna - 1);
}
}
// print(allignedMatrix);
// System.out.println();
return matrixScore(allignedMatrix, index);
}
/**
* processa una stringa di caratteri e crea una corrispondente stringa di
* nucleotidi
*
* @param line
* stringa di caratteri
* @return stringa di nucleotidi corrispondente
*/
private static List<Nucleotide> parse(String line) {
List<Nucleotide> res = new LinkedList<Nucleotide>();
String upperCaseLine = line.toUpperCase();
for (int i = 0; i < upperCaseLine.length(); i++) {
res.add(Nucleotide.parse(upperCaseLine.charAt(i)));
}
return res;
}
/**
* Legge da file una collezione di stringhe di nucleotidi e crea un oggetto
* DNAStrings
*
* @param br
* buffered reader inizializzato sul file contenente la
* collezione di stringhe
* @return un oggetto DNAStrings opportunamente inizializzato
* @throws IOException
*/
public static DNAStrings readFromFile(BufferedReader br) throws IOException {
List<List<Nucleotide>> l = new LinkedList<List<Nucleotide>>();
String line = br.readLine();
int nString = 0;
int nNucleotid = 0;
while (line != null) {
nNucleotid = line.length();
List<Nucleotide> dnaString = parse(line);
l.add(dnaString);
line = br.readLine();
nString++;
}
return new DNAStrings(l, nString, nNucleotid);
}
/***
* Calcola il profilo di consenso per un vettore di nucleotidi
*
* @param c
* vettore di nucleotidi
* @return il profilo di consenso
*/
private int[] getProfile(Nucleotide[] c) {
int[] profile = new int[4];
for (int i = 0; i < c.length; i++) {
switch (c[i]) {
case A:
profile[0]++;
break;
case C:
profile[1]++;
break;
case G:
profile[2]++;
break;
case T:
profile[3]++;
break;
default:
break;
}
}
return profile;
}
/**
* metodo di servizio: ritorna il massimo di un vettore di interi positivi
*
* @param profile
* il vettore di interi
* @return il masismo intero contenuto nel vettore
*/
private int getMax(int[] profile) {
int max = 0;
for (int i = 0; i < profile.length; i++) {
if (max < profile[i]) {
max = profile[i];
}
}
return max;
}
/**
* Calcola il consenso data una matrice di allineamento fino alla riga index
*
* @param allignedMatrix
* matrice di alineamento
* @param index
* riga fino alla quale si calcola il consenso
* @return il consenso della matrice
*/
private int matrixScore(Nucleotide[][] allignedMatrix, int index) {
int max = 0;
// fisso la colonna
for (int j = 0; j < allignedMatrix[0].length; j++) {
// lunghezza tmp=index
Nucleotide[] tmp = new Nucleotide[index];
// scorro tutta la riga index
for (int i = 0; i < index; i++) {
// alla posizione [i] assegno i valori della riga e della
// colonna
tmp[i] = allignedMatrix[i][j];
}
int[] k = getProfile(tmp);
max += getMax(k);
}
return max;
}
/**
* Restituisce il numero di stringhe presenti nella collezione
*
* @return numero di stringhe presenti nella collezione
*/
public int getNumString() {
return t;
}
/**
* Restituisce il numero di nucleotidi presenti in ciascuna stringa
*
* @return numero di nucleotidi presenti in ciascuna stringa
*/
public int getNumNucleotid() {
return n;
}
/**
* Calcola il consenso di una lista di posizioni dalla prima alla posizione
* index, e sovrastima il valore di consenso dalla riga index in poi. Il
* consenso finale e' calcolato come somma dei consensi delle colonne nella
* matrice di allineamento
*
* @param s
* lista di posizioni
* @param l
* lunghezza delle stringhe per cui si calcola il consenso
* @param index
* posizione fino a cui calcola in maniera esatta il consenso
* @return una sovrastima del consenso della matrice di allineamento
*/
public int optimisticScore(List<Integer> s, int l, int index) {
System.out.println("Metodo da implementare");
return -1;
}
/**
* stampa una matrice di nucelotidi
*
* @param allignedMatrix
* matrice da stampare
*/
private void print(Nucleotide[][] allignedMatrix) {
for (int i = 0; i < allignedMatrix.length; i++) {
for (int j = 0; j < allignedMatrix[0].length; j++) {
System.out.print(" " + allignedMatrix[i][j]);
}
System.out.println();
}
}
/**
* metodo di test
*
*/
public static void main(String[] args) {
String filename = "dna-consenso.dat";
DNAStrings dnaFromFile = null;
try {
FileReader fr = new FileReader(filename);
BufferedReader br = new BufferedReader(fr);
dnaFromFile = readFromFile(br);
System.out.println(dnaFromFile.seq);
} catch (IOException e) {
e.printStackTrace();
}
List<Integer> s = new LinkedList<Integer>();
for (int i = 0; i < dnaFromFile.getNumString(); i++) {
s.add(i, i + 1);
}
s.clear();
s.add(4);
s.add(4);
s.add(1);
s.add(2);
System.out.println(s);
System.out.println("valore del consenso completo " + dnaFromFile.score(s, 6, s.size()));
System.out.println("valore del consenso fino alla seconda stringa " + dnaFromFile.score(s, 6, 2));
System.out.println(
"valore del consenso ottimistico fino alla seconda stringa " + dnaFromFile.optimisticScore(s, 6, 2));
}
}
Be the first to comment
You can use [html][/html], [css][/css], [php][/php] and more to embed the code. Urls are automatically hyperlinked. Line breaks and paragraphs are automatically generated.