@@ -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