7171import org .labkey .sequenceanalysis .ReadDataImpl ;
7272import org .labkey .sequenceanalysis .SequenceReadsetImpl ;
7373import org .labkey .sequenceanalysis .run .RestoreSraDataHandler ;
74+ import org .labkey .sequenceanalysis .run .SamtoolsMerger ;
7475import org .labkey .sequenceanalysis .run .bampostprocessing .SortSamStep ;
7576import org .labkey .sequenceanalysis .run .preprocessing .TrimmomaticWrapper ;
7677import org .labkey .sequenceanalysis .run .util .AddOrReplaceReadGroupsWrapper ;
@@ -1306,7 +1307,6 @@ private File doAlignThenMerge(ReferenceGenome referenceGenome, Readset rs, Map<R
13061307 RecordedAction mergeAction = new RecordedAction (MERGE_ALIGNMENT_ACTIONNAME );
13071308 Date start = new Date ();
13081309 mergeAction .setStartTime (start );
1309- MergeSamFilesWrapper mergeSamFilesWrapper = new MergeSamFilesWrapper (getJob ().getLogger ());
13101310 List <File > bams = new ArrayList <>();
13111311 for (File o : alignOutputs )
13121312 {
@@ -1316,20 +1316,45 @@ private File doAlignThenMerge(ReferenceGenome referenceGenome, Readset rs, Map<R
13161316 getHelper ().getFileManager ().addIntermediateFile (SequenceAnalysisService .get ().getExpectedBamOrCramIndex (o ));
13171317 }
13181318
1319- 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" );
13201320 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+
13211332 //NOTE: merged BAMs will be deleted as intermediate files, and if we delete too early this breaks job resume
1322- mergeSamFilesWrapper .execute (bams , bam , false );
1323- getHelper ().getFileManager ().addCommandsToAction (mergeSamFilesWrapper .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+ }
13241349
13251350 Date end = new Date ();
13261351 mergeAction .setEndTime (end );
1327- 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 ));
13281353 alignActions .add (mergeAction );
13291354 }
13301355 else
13311356 {
1332- bam = alignOutputs .get ( 0 );
1357+ bam = alignOutputs .getFirst ( );
13331358 }
13341359
13351360 return bam ;
0 commit comments