Skip to content

Commit 223b851

Browse files
committed
Only use samtools merge when the inputs are sorted
1 parent fcec9d9 commit 223b851

1 file changed

Lines changed: 30 additions & 6 deletions

File tree

‎SequenceAnalysis/src/org/labkey/sequenceanalysis/pipeline/SequenceAlignmentTask.java‎

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1307,7 +1307,6 @@ private File doAlignThenMerge(ReferenceGenome referenceGenome, Readset rs, Map<R
13071307
RecordedAction mergeAction = new RecordedAction(MERGE_ALIGNMENT_ACTIONNAME);
13081308
Date start = new Date();
13091309
mergeAction.setStartTime(start);
1310-
SamtoolsMerger merger = new SamtoolsMerger(getPipelineJob().getLogger());
13111310
List<File> bams = new ArrayList<>();
13121311
for (File o : alignOutputs)
13131312
{
@@ -1317,20 +1316,45 @@ private File doAlignThenMerge(ReferenceGenome referenceGenome, Readset rs, Map<R
13171316
getHelper().getFileManager().addIntermediateFile(SequenceAnalysisService.get().getExpectedBamOrCramIndex(o));
13181317
}
13191318

1320-
bam = new File(alignOutputs.get(0).getParent(), FileUtil.getBaseName(alignOutputs.get(0).getName()) + ".merged.bam");
1319+
bam = new File(alignOutputs.getFirst().getParent(), FileUtil.getBaseName(alignOutputs.getFirst().getName()) + ".merged.bam");
13211320
getHelper().getFileManager().addOutput(mergeAction, "Merged BAM", bam);
1321+
Set<SAMFileHeader.SortOrder> sortOrders = alignOutputs.stream().map(x -> {
1322+
try
1323+
{
1324+
return SequenceUtil.getBamSortOrder(x);
1325+
}
1326+
catch (IOException e)
1327+
{
1328+
throw new RuntimeException(e);
1329+
}
1330+
}).collect(Collectors.toSet());
1331+
13221332
//NOTE: merged BAMs will be deleted as intermediate files, and if we delete too early this breaks job resume
1323-
merger.mergeBams(bams, bam);
1324-
getHelper().getFileManager().addCommandsToAction(merger.getCommandsExecuted(), mergeAction);
1333+
String toolName;
1334+
if (sortOrders.size() > 1 || sortOrders.iterator().next() != SAMFileHeader.SortOrder.coordinate)
1335+
{
1336+
toolName = "MergeSamFiles";
1337+
MergeSamFilesWrapper merger = new MergeSamFilesWrapper(getPipelineJob().getLogger());
1338+
merger.execute(bams, bam, false);
1339+
getHelper().getFileManager().addCommandsToAction(merger.getCommandsExecuted(), mergeAction);
1340+
}
1341+
else
1342+
{
1343+
// This will be faster, but requires sorted input:
1344+
toolName = "Samtools merge";
1345+
SamtoolsMerger merger = new SamtoolsMerger(getPipelineJob().getLogger());
1346+
merger.mergeBams(bams, bam);
1347+
getHelper().getFileManager().addCommandsToAction(merger.getCommandsExecuted(), mergeAction);
1348+
}
13251349

13261350
Date end = new Date();
13271351
mergeAction.setEndTime(end);
1328-
getJob().getLogger().info("MergeSamFiles Duration: " + DurationFormatUtils.formatDurationWords(end.getTime() - start.getTime(), true, true));
1352+
getJob().getLogger().info(toolName + " Duration: " + DurationFormatUtils.formatDurationWords(end.getTime() - start.getTime(), true, true));
13291353
alignActions.add(mergeAction);
13301354
}
13311355
else
13321356
{
1333-
bam = alignOutputs.get(0);
1357+
bam = alignOutputs.getFirst();
13341358
}
13351359

13361360
return bam;

0 commit comments

Comments
 (0)