/*
* PCARateMatrixMammalia.java
*
* Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard
*
* This file is part of BEAST.
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership and licensing.
*
* BEAST is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* BEAST 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with BEAST; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package dr.oldevomodel.substmodel;
import dr.evolution.datatype.Codons;
import java.util.*;
import java.io.*;
/**
* Mammalia rate matrix for PCACodonModel
*
* @author Stefan Zoller
*
*/
public class PCARateMatrixMammalia extends AbstractPCARateMatrix{
// filenames for csv files including actual rate matrices
public static final String FREQS_FILE = "freqs.csv";
public static final String SCALES_FILE = "scales.csv";
public static final String MEANS_FILE = "means.csv";
public static final String FACTORS_FILE = "startfacs.csv";
public static final String PCS_FILE = "pcs.csv";
/**
* constructor
*
* @param nrOfPCs Number of PCs to use
* @param dir Directory which includes the rate matrix csv files
*/
public PCARateMatrixMammalia(int nrOfPCs, String dir) {
super("mammalia", Codons.UNIVERSAL, dir);
// reading data files:
setupMeans();
setupFreqs();
setupScales();
setupStartFacs();
setupPCs(nrOfPCs);
}
private void setupFreqs() {
// 61 frequencies for the codons
double[] f = readSingleArray(FREQS_FILE, 61);
setFrequencies(f);
}
private void setupScales() {
// 1830 scale factors for the PCs
double[] s = readSingleArray(SCALES_FILE, 1830);
setScales(s);
}
private void setupMeans() {
// 1830 mean values for the PCs
double[] m = readSingleArray(MEANS_FILE, 1830);
setMeans(m);
}
private void setupStartFacs() {
// 1830 start factors for the PCs
double[] sf = readSingleArray(FACTORS_FILE, 1830);
setStartFacs(sf);
}
private void setupPCs(int nr) {
double[][] p = new double[nr][1830];
File file = new File(dataDir, PCS_FILE);
try {
BufferedReader bufRdr = new BufferedReader(new FileReader(file));
String line = null;
int row = 0;
int col = 0;
//read each line of text file
while(((line = bufRdr.readLine()) != null) && (row < nr))
{
col = 0;
StringTokenizer st = new StringTokenizer(line,",");
while (st.hasMoreTokens())
{
//get next token and store it in the array
p[row][col] = Double.valueOf(st.nextToken()).doubleValue();
col++;
}
row++;
}
bufRdr.close();
} catch (FileNotFoundException e) {
System.err.println("Caught FileNotFoundException: " + e.getMessage());
} catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
} finally {
}
setPCs(p);
}
private double[] readSingleArray(String filename, int dim) {
File file = new File(dataDir, filename);
double[] arr = new double[dim];
try {
BufferedReader bufRdr = new BufferedReader(new FileReader(file));
String line = null;
int col = 0;
while((line = bufRdr.readLine()) != null) {
StringTokenizer st = new StringTokenizer(line,",");
while (st.hasMoreTokens()) {
arr[col] = Double.valueOf(st.nextToken()).doubleValue();
col++;
}
}
bufRdr.close();
} catch (FileNotFoundException e) {
System.err.println("Caught FileNotFoundException: " + e.getMessage());
} catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
} finally {
}
return arr;
}
}