package org.nextprot.api.blast.service;
import org.nextprot.api.blast.domain.BlastSearchParams;
import org.nextprot.api.blast.domain.BlastSequenceInput;
import org.nextprot.api.blast.domain.gen.BlastResult;
import org.nextprot.api.blast.domain.gen.Report;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* Executes locally installed blastP program with protein sequence query
*/
public class BlastPRunner extends BlastProgram<BlastPRunner.FastaEntry, Report, BlastSequenceInput> {
public BlastPRunner(BlastSequenceInput config) {
super("blastp", config);
Objects.requireNonNull(config.getBinPath(), "binary path is missing");
}
@Override
protected void writeFastaInput(PrintWriter pw, FastaEntry fastaEntry) {
BlastProgram.writeFastaEntry(pw, fastaEntry.getHeader(), fastaEntry.getSequence());
}
@Override
protected void preConfig(FastaEntry fastaEntry, BlastSequenceInput config) {
config.setTitle(fastaEntry.getHeader());
config.setSequence(fastaEntry.getSequence());
}
@Override
protected Report buildOutputFromStdout(String stdout) throws IOException {
return BlastResult.fromJson(stdout).getBlastOutput2().get(0).getReport();
}
@Override
protected List<String> buildCommandLine(BlastSequenceInput input, File fastaFile) {
List<String> command = new ArrayList<>();
command.add(input.getBinPath());
command.add("-db");
command.add(input.getNextprotBlastDbPath());
command.add("-query");
command.add(fastaFile.getAbsolutePath());
command.add("-outfmt");
command.add("15");
if (input.getSearchParams() != null) {
BlastSearchParams searchParams = input.getSearchParams();
if (searchParams.getMatrix() != null) {
command.add("-matrix");
command.add(searchParams.getMatrix().toString());
}
if (searchParams.getEvalue() != null) {
command.add("-evalue");
command.add(String.valueOf(searchParams.getEvalue()));
}
if (searchParams.getGapOpen() != null) {
command.add("-gapopen");
command.add(String.valueOf(searchParams.getGapOpen()));
}
if (searchParams.getGapExtend() != null) {
command.add("-gapextend");
command.add(String.valueOf(searchParams.getGapExtend()));
}
}
return command;
}
/** A fasta sequence query */
public static class FastaEntry {
private final String header;
private final String sequence;
public FastaEntry(String header, String sequence) {
this.header = header;
this.sequence = sequence;
}
public String getHeader() {
return header;
}
public String getSequence() {
return sequence;
}
}
}