Skip to content

Commit 0c4d74d

Browse files
committed
Allow UpdateReadsetFilesHandler to work on BAMs with multiple read groups
1 parent c00391a commit 0c4d74d

File tree

2 files changed

+29
-9
lines changed

2 files changed

+29
-9
lines changed

SequenceAnalysis/src/org/labkey/sequenceanalysis/analysis/UpdateReadsetFilesHandler.java

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
import java.util.ArrayList;
4040
import java.util.Arrays;
4141
import java.util.List;
42+
import java.util.Set;
43+
import java.util.stream.Collectors;
4244

4345
public class UpdateReadsetFilesHandler extends AbstractParameterizedOutputHandler<SequenceOutputHandler.SequenceOutputProcessor>
4446
{
@@ -119,17 +121,25 @@ private SAMFileHeader getAndValidateHeaderForBam(SequenceOutputFile so, String n
119121
try (SamReader reader = samReaderFactory.open(so.getFile()))
120122
{
121123
SAMFileHeader header = reader.getFileHeader().clone();
122-
int nSamples = reader.getFileHeader().getReadGroups().size();
123-
if (nSamples != 1)
124+
List<SAMReadGroupRecord> rgs = header.getReadGroups();
125+
Set<String> distinctLibraries = rgs.stream().map(SAMReadGroupRecord::getLibrary).collect(Collectors.toSet());
126+
if (distinctLibraries.size() > 1)
124127
{
125-
throw new PipelineJobException("File has more than one read group, found: " + nSamples);
128+
throw new PipelineJobException("File has more than one library in read group(s), found: " + distinctLibraries.stream().collect(Collectors.joining(", ")));
126129
}
127130

128-
List<SAMReadGroupRecord> rgs = header.getReadGroups();
129-
String existingSample = rgs.get(0).getSample();
130-
if (existingSample.equals(newRsName))
131+
Set<String> distinctSamples = rgs.stream().map(SAMReadGroupRecord::getSample).collect(Collectors.toSet());
132+
if (distinctSamples.size() > 1)
131133
{
132-
throw new PipelineJobException("Sample names match, aborting");
134+
throw new PipelineJobException("File has more than one sample in read group(s), found: " + distinctSamples.stream().collect(Collectors.joining(", ")));
135+
}
136+
137+
if (
138+
distinctLibraries.stream().filter(x -> !x.equals(newRsName)).count() == 0L &&
139+
distinctSamples.stream().filter(x -> !x.equals(newRsName)).count() == 0L
140+
)
141+
{
142+
throw new PipelineJobException("Sample and library names match in read group(s), aborting");
133143
}
134144

135145
return header;
@@ -252,13 +262,23 @@ private void reheaderBamOrCram(SequenceOutputFile so, JobContext ctx, String new
252262

253263
List<SAMReadGroupRecord> rgs = header.getReadGroups();
254264
String existingSample = rgs.get(0).getSample();
255-
rgs.get(0).setSample(newRsName);
265+
String existingLibrary = rgs.get(0).getLibrary();
266+
rgs.forEach(rg -> {
267+
rg.setSample(newRsName);
268+
rg.setLibrary(newRsName);
269+
});
256270

257271
File headerBam = new File(ctx.getWorkingDirectory(), "header.bam");
258272
try (SAMFileWriter writer = new SAMFileWriterFactory().makeBAMWriter(header, false, headerBam))
259273
{
260274

261275
}
276+
277+
if (!headerBam.exists())
278+
{
279+
throw new PipelineJobException("Expected header was not created: " + headerBam.getPath());
280+
}
281+
262282
ctx.getFileManager().addIntermediateFile(headerBam);
263283
ctx.getFileManager().addIntermediateFile(SequencePipelineService.get().getExpectedIndex(headerBam));
264284

SequenceAnalysis/src/org/labkey/sequenceanalysis/run/bampostprocessing/AddOrReplaceReadGroupsStep.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
*/
2323
public class AddOrReplaceReadGroupsStep extends AbstractCommandPipelineStep<AddOrReplaceReadGroupsWrapper> implements BamProcessingStep
2424
{
25-
public AddOrReplaceReadGroupsStep(PipelineStepProvider provider, PipelineContext ctx)
25+
public AddOrReplaceReadGroupsStep(PipelineStepProvider<?> provider, PipelineContext ctx)
2626
{
2727
super(provider, ctx, new AddOrReplaceReadGroupsWrapper(ctx.getLogger()));
2828
}

0 commit comments

Comments
 (0)