package aliview.aligner;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import org.apache.log4j.Logger;
import aliview.subprocesses.SubProcessWindow;
public class Aligner {
private static final Logger logger = Logger.getLogger(Aligner.class);
private static final String LF = System.getProperty("line.separator");
public static void muscleProfileAlign(File in1, File in2, File out){
muscleProfileAlign(in1, in2, out, null);
}
public static void muscleProfileAlign(File in1, File in2, File out, SubProcessWindow subProcessWin){
boolean wasProcessInterrupted = false;
try {
String[] commandArray = new String[]{
MuscleWrapper.getMusclePath().toString(),
"-profile",
"-in1",in1.toString(),
"-in2",in2.toString(),
"-out",out.toString()
};
for(String token: commandArray){
logger.info(token);
}
String totalCommand = "";
for(String token: commandArray){
totalCommand += token + " ";
}
logger.info(totalCommand);
// String command = "muscle -in " + in.getAbsolutePath() + " -out " + out.getAbsolutePath();
// ProcessBuilder builder = new ProcessBuilder(command);
// builder.redirectErrorStream(true);
// Process p = builder.start();
Process subprocess = Runtime.getRuntime().exec(commandArray);
// so that process gets killed when window destroys
subProcessWin.setActiveProcess(subprocess);
Scanner sc = new Scanner(subprocess.getInputStream());
Scanner errorSc = new Scanner(subprocess.getErrorStream());
// First read errors (but everything is written in error stream so use ordinary info-logger)
// // with the redirect above we dont need to check error - everything is sent to standard
while (errorSc.hasNext()){
//logger.info(errorSc.nextLine());
String nextLine = errorSc.nextLine();
subProcessWin.appendOutput(nextLine + LF);
System.out.println(nextLine);
}
while (sc.hasNext()){
//logger.info(sc.nextLine());
String nextLine = sc.nextLine();
subProcessWin.appendOutput(nextLine + LF);
System.out.println(nextLine);
}
// clean up external process
try {
subprocess.waitFor();
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
subprocess.destroy();
logger.info("done");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void mafftAlign(File in, File out, final SubProcessWindow subProcessWin) throws IOException {
boolean wasProcessInterrupted = false;
String[] commandArray = new String[]{
"mafft",
"--localpair",
"--maxiterate","1000",
in.toString()
};
ProcessBuilder probuilder = new ProcessBuilder( commandArray );
for(String token: commandArray){
logger.info(token);
}
String totalCommand = "";
for(String token: commandArray){
totalCommand += token + " ";
}
logger.info(totalCommand);
// String command = "muscle -in " + in.getAbsolutePath() + " -out " + out.getAbsolutePath();
// ProcessBuilder builder = new ProcessBuilder(command);
// builder.redirectErrorStream(true);
// Process p = builder.start();
//probuilder.redirectErrorStream(true);
Process subprocess = probuilder.start();
// so that process gets killed when window destroys
subProcessWin.setActiveProcess(subprocess);
//
// BufferedReader reader = new BufferedReader (new InputStreamReader(stdout));
// BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));
//
//
//
// while (scan.hasNext()) {
// String input = scan.nextLine();
// if (input.trim().equals("exit")) {
// // Putting 'exit' amongst the echo --EOF--s below doesn't work.
// writer.write("exit\n");
// } else {
// writer.write("((" + input + ") && echo --EOF--) || echo --EOF--\n");
// }
// writer.flush();
//
// String line = reader.readLine();
// while (line != null && ! line.trim().equals("--EOF--")) {
// System.out.println ("Stdout: " + line);
// line = reader.readLine();
// }
// if (line == null) {
// break;
// }
// }
Scanner sc = new Scanner(subprocess.getInputStream());
final Scanner errorSc = new Scanner(subprocess.getErrorStream());
// First read errors (but everything is written in error stream so use ordinary info-logger)
// with the redirect above we dont need to check error - everything is sent to standard
Thread errorReaderThread = new Thread(new Runnable(){
public void run(){
while (errorSc.hasNext()){
//logger.info(errorSc.nextLine());
String nextLine = errorSc.nextLine();
subProcessWin.appendOutput(nextLine + LF);
System.out.println(nextLine);
}
logger.info("errorReaderThread-finished");
}
});
errorReaderThread.start();
BufferedWriter buffOut = new BufferedWriter(new FileWriter(out));
while (sc.hasNext()){
//logger.info(sc.nextLine());
String nextLine = sc.nextLine();
buffOut.append(nextLine + LF);
//subProcessWin.appendOutput(nextLine + LF);
//System.out.println(nextLine);
}
sc.close();
buffOut.close();
// clean up external process
try {
subprocess.waitFor();
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
subprocess.destroy();
logger.info("done");
}
public static void muscleAlign(File in, File out, SubProcessWindow subProcessWin){
try {
//
String[] commandArray = new String[]{
MuscleWrapper.getMusclePath().toString(), // "muscle"
"-in",in.toString(),
"-out",out.toString()
};
for(String token: commandArray){
logger.info(token);
}
String totalCommand = "";
for(String token: commandArray){
totalCommand += token + " ";
}
logger.info(totalCommand);
// String command = "muscle -in " + in.getAbsolutePath() + " -out " + out.getAbsolutePath();
// ProcessBuilder builder = new ProcessBuilder(command);
// builder.redirectErrorStream(true);
// Process p = builder.start();
Process subprocess = Runtime.getRuntime().exec(commandArray);
// so that process gets killed when window destroys
subProcessWin.setActiveProcess(subprocess);
Scanner sc = new Scanner(subprocess.getInputStream());
Scanner errorSc = new Scanner(subprocess.getErrorStream());
// First read errors (but everything is written in error stream so use ordinary info-logger)
// // with the redirect above we dont need to check error - everything is sent to standard
while (errorSc.hasNext()){
//logger.info(errorSc.nextLine());
String nextLine = errorSc.nextLine();
subProcessWin.appendOutput(nextLine + LF);
System.err.println(nextLine);
}
while (sc.hasNext()){
//logger.info(sc.nextLine());
String nextLine = sc.nextLine();
subProcessWin.appendOutput(nextLine + LF);
System.out.println(nextLine);
}
// clean up external process
try {
subprocess.waitFor();
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
subprocess.destroy();
logger.info("done");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
public static void mafftAlign(File in, File out){
try {
//
String[] commandArray = new String[]{
"mafft",
"--maxiterate", "1000",
"--localpair", in.toString(),
">",out.toString()
};
for(String token: commandArray){
logger.info(token);
}
String totalCommand = "";
for(String token: commandArray){
totalCommand += token + " ";
}
logger.info(totalCommand);
// String command = "muscle -in " + in.getAbsolutePath() + " -out " + out.getAbsolutePath();
// ProcessBuilder builder = new ProcessBuilder(command);
// builder.redirectErrorStream(true);
// Process p = builder.start();
Process p = Runtime.getRuntime().exec(totalCommand);
Scanner sc = new Scanner(p.getInputStream());
Scanner errorSc = new Scanner(p.getErrorStream());
// First read errors (but everything is written in error stream so use ordinary info-logger)
// // with the redirect above we dont need to check error - everything is sent to standard
while (errorSc.hasNext()){
//logger.info(errorSc.nextLine());
System.out.println(errorSc.nextLine());
}
while (sc.hasNext()){
//logger.info(sc.nextLine());
System.out.println(sc.nextLine());
}
// clean up external process
try {
p.waitFor();
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
p.destroy();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
*/
class AlignResult{
private boolean wasDestroyedByUser;
protected AlignResult() {
}
protected AlignResult(boolean wasDestroyedByUser) {
this.wasDestroyedByUser = wasDestroyedByUser;
}
public boolean wasDestroyedByUser() {
return wasDestroyedByUser;
}
public boolean isWasDestroyedByUser() {
return wasDestroyedByUser;
}
public void setWasDestroyedByUser(boolean wasDestroyedByUser) {
this.wasDestroyedByUser = wasDestroyedByUser;
}
}
}