package abra;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import htsjdk.samtools.SAMFileHeader;
public class SVEvaluator {
public void evaluateAndOutput(String svContigFasta, ReAligner realigner, String tempDir, int readLength, String[] inputSams, String[] tempDirs,
SAMFileHeader[] samHeaders, String structuralVariantFile) throws IOException, InterruptedException {
String svContigsSam = tempDir + "/" + "sv_contigs.sam";
realigner.alignStructuralVariantCandidates(svContigFasta, svContigsSam);
// Extract Breakpoint candidates
SVHandler svHandler = new SVHandler(readLength, realigner.getMinMappingQuality());
String svCandidates = tempDir + "/" + "sv_candidates.fa";
boolean hasCandidates = svHandler.identifySVCandidates(svContigsSam, svCandidates);
if (hasCandidates) {
Aligner aligner = new Aligner(svCandidates, 1);
aligner.index();
String[] svSams = new String[inputSams.length];
List<Map<String, Integer>> svCounts = new ArrayList<Map<String, Integer>>();
Set<String> breakpointIds = new HashSet<String>();
for (int i=0; i<inputSams.length; i++) {
svSams[i] = tempDirs[i] + "/" + "sv_aligned_to_contig.sam";
SVReadCounter svReadCounter = realigner.alignToSVContigs(tempDirs[i], svSams[i], svCandidates, null, samHeaders[i]);
svCounts.add(svReadCounter.getCounts());
breakpointIds.addAll(svReadCounter.getCounts().keySet());
// realigner.alignToContigs(tempDirs[i], svSams[i], svCandidates, null, null);
}
/*
for (int i=0; i<svSams.length; i++) {
SVReadCounter svReadCounter = new SVReadCounter();
Map<String, Integer> counts = svReadCounter.countReadsSupportingBreakpoints(svSams[i], readLength, samHeaders[i]);
svCounts.add(counts);
breakpointIds.addAll(counts.keySet());
}
*/
BufferedWriter writer = new BufferedWriter(new FileWriter(structuralVariantFile, false));
for (String breakpointId : breakpointIds) {
writer.append(breakpointId.replace("+", "_"));
for (Map<String, Integer> counts : svCounts) {
writer.append('\t');
if (counts.containsKey(breakpointId)) {
writer.append(String.valueOf(counts.get(breakpointId)));
} else {
writer.append("0");
}
}
writer.append('\n');
}
writer.close();
}
}
}