/*
Copyright (C) 2011 Diego Darriba, David Posada
This program 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.
This program 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 this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package es.uvigo.darwin.jmodeltest;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintStream;
import parser.ParseException;
import converter.Converter;
import converter.DefaultFactory;
import converter.Factory;
import es.uvigo.darwin.jmodeltest.exception.AlignmentParseException;
import es.uvigo.darwin.jmodeltest.io.NullPrintStream;
import es.uvigo.darwin.jmodeltest.selection.AIC;
import es.uvigo.darwin.jmodeltest.selection.AICc;
import es.uvigo.darwin.jmodeltest.selection.BIC;
import es.uvigo.darwin.jmodeltest.selection.DT;
import es.uvigo.darwin.jmodeltest.selection.InformationCriterion;
import es.uvigo.darwin.jmodeltest.utilities.Utilities;
public class ModelTestService {
/**
* Read alignment into a temporary file.
*
* @param inputFile the file to be read
* @param outputFile the file to write in
*
* @throws AlignmentParseException the alignment parse exception.
* @throws FileNotFoundException Signals that the input filename does not exist.
* @throws IOException Signals that an I/O exception has occured.
*/
public static String readAlignment(File inputFile, File outputFile)
throws AlignmentParseException, FileNotFoundException, IOException {
return readAlignment(inputFile, outputFile, true);
}
/**
* Read alignment.
*
* @param inputFile the file to be read
* @param outputFile the file to write in
*
* @throws AlignmentParseException the alignment parse exception.
* @throws FileNotFoundException Signals that the input filename does not exist.
* @throws IOException Signals that an I/O exception has occured.
*/
public static String readAlignment(File inputFile, File outputFile, boolean deleteOnExit)
throws AlignmentParseException, FileNotFoundException, IOException {
StringBuilder text = new StringBuilder();
BufferedReader br = new BufferedReader(
new FileReader(inputFile.getAbsolutePath()));
String s;
while ((s = br.readLine()) != null) {
text.append(s).append("\r\n");
}
br.close();
//Get options
String in = text.toString();
String inO = "";
String inP = "";
String inF = "";
boolean autodetect = true;
boolean collapse = false;
boolean gaps = false;
boolean missing = false;
int limit = 0;
String out = "";
String outO = "Linux";
switch (Utilities.findCurrentOS()) {
case Utilities.OS_WINDOWS:
outO = "Windows";
break;
case Utilities.OS_OSX:
case Utilities.OS_LINUX:
outO = "Linux";
break;
}
String outP = "PhyML";
String outF = "PHYLIP";
boolean lower = false;
boolean numbers = false;
boolean sequential = false;
boolean match = false;
//Get converter and convert MSA
Factory factory = new DefaultFactory();
Converter converter;
PrintStream outPS = System.err;
System.setErr(new PrintStream(new NullPrintStream()));
try {
converter = factory.getConverter(inO, inP, inF, autodetect,
collapse, gaps, missing, limit,
outO, outP, outF, lower, numbers, sequential, match, "ModelTestService");
out = converter.convert(in);
} catch (UnsupportedOperationException ex) {
throw new AlignmentParseException("There's some error in your data: " + ex.getMessage());
} catch (ParseException ex) {
throw new AlignmentParseException("There's some error in your data: " + ex.getMessage());
}
System.setErr(outPS);
if (outputFile.exists()) {
outputFile.delete();
}
outputFile.createNewFile();
if (deleteOnExit) {
outputFile.deleteOnExit();
}
FileWriter fw = new FileWriter(outputFile);
fw.write(out);
fw.close();
return out;
}
public InformationCriterion doIC(int ic, boolean writePAUPblock, boolean doImportances,
boolean doModelAveraging, double confidenceInterval) {
InformationCriterion criterion;
switch (ic) {
case InformationCriterion.IC_AIC:
criterion = new AIC(writePAUPblock, doImportances,
doModelAveraging, confidenceInterval);
break;
case InformationCriterion.IC_AICc:
criterion = new AICc(writePAUPblock, doImportances,
doModelAveraging, confidenceInterval);
break;
case InformationCriterion.IC_BIC:
criterion = new BIC(writePAUPblock, doImportances,
doModelAveraging, confidenceInterval);
break;
case InformationCriterion.IC_DT:
criterion = new DT(writePAUPblock, doImportances, doModelAveraging,
confidenceInterval);
break;
default:
throw new InvalidArgumentException.UnexistentCriterionException(ic);
}
criterion.compute();
return criterion;
}
}