import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
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);
}
/**
* 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();
}
}
/**
* 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;
}
/**
* 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 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;
}
/**
* 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);
}
/**
* 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;
}
/**
* 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;
}
/**
* 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.