Optimize creation of reads in ArtificialBAMBuilder
-- Now caches the reads so subsequent calls to makeReads() don't reallocate the reads from scratch each time
This commit is contained in:
parent
e050f649fd
commit
ce160931d5
|
|
@ -62,6 +62,7 @@ public class ArtificialBAMBuilder {
|
|||
int alignmentStart = 1;
|
||||
int readLength = 10;
|
||||
private final ArrayList<String> samples = new ArrayList<String>();
|
||||
private List<GATKSAMRecord> createdReads = null;
|
||||
|
||||
private LinkedList<GATKSAMRecord> additionalReads = new LinkedList<GATKSAMRecord>();
|
||||
|
||||
|
|
@ -102,6 +103,7 @@ public class ArtificialBAMBuilder {
|
|||
}
|
||||
|
||||
public ArtificialBAMBuilder createAndSetHeader(final int nSamples) {
|
||||
createdReads = null;
|
||||
this.header = new SAMFileHeader();
|
||||
header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
|
||||
header.setSequenceDictionary(parser.getContigs());
|
||||
|
|
@ -120,10 +122,12 @@ public class ArtificialBAMBuilder {
|
|||
}
|
||||
|
||||
public void addReads(final GATKSAMRecord readToAdd) {
|
||||
createdReads = null;
|
||||
additionalReads.add(readToAdd);
|
||||
}
|
||||
|
||||
public void addReads(final Collection<GATKSAMRecord> readsToAdd) {
|
||||
createdReads = null;
|
||||
additionalReads.addAll(readsToAdd);
|
||||
}
|
||||
|
||||
|
|
@ -140,26 +144,34 @@ public class ArtificialBAMBuilder {
|
|||
* @return a ordered list of reads
|
||||
*/
|
||||
public List<GATKSAMRecord> makeReads() {
|
||||
final String baseName = "read";
|
||||
List<GATKSAMRecord> reads = new ArrayList<GATKSAMRecord>(nReadsPerLocus*nLoci);
|
||||
for ( int locusI = 0; locusI < nLoci; locusI++) {
|
||||
final int locus = locusI * (skipNLoci + 1);
|
||||
for ( int readI = 0; readI < nReadsPerLocus; readI++ ) {
|
||||
for ( final SAMReadGroupRecord rg : header.getReadGroups() ) {
|
||||
final String readName = String.format("%s.%d.%d.%s", baseName, locus, readI, rg.getId());
|
||||
final GATKSAMRecord read = ArtificialSAMUtils.createArtificialRead(header, readName, 0, alignmentStart + locus, readLength);
|
||||
read.setReadGroup(new GATKSAMReadGroupRecord(rg));
|
||||
reads.add(read);
|
||||
if ( createdReads == null ) {
|
||||
final String baseName = "read";
|
||||
final LinkedList<GATKSAMReadGroupRecord> readGroups = new LinkedList<GATKSAMReadGroupRecord>();
|
||||
for ( final SAMReadGroupRecord rg : header.getReadGroups())
|
||||
readGroups.add(new GATKSAMReadGroupRecord(rg));
|
||||
|
||||
List<GATKSAMRecord> reads = new ArrayList<GATKSAMRecord>(nReadsPerLocus*nLoci);
|
||||
for ( int locusI = 0; locusI < nLoci; locusI++) {
|
||||
final int locus = locusI * (skipNLoci + 1);
|
||||
for ( int readI = 0; readI < nReadsPerLocus; readI++ ) {
|
||||
for ( final GATKSAMReadGroupRecord rg : readGroups ) {
|
||||
final String readName = String.format("%s.%d.%d.%s", baseName, locus, readI, rg.getId());
|
||||
final GATKSAMRecord read = ArtificialSAMUtils.createArtificialRead(header, readName, 0, alignmentStart + locus, readLength);
|
||||
read.setReadGroup(rg);
|
||||
reads.add(read);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! additionalReads.isEmpty() ) {
|
||||
reads.addAll(additionalReads);
|
||||
Collections.sort(reads, new SAMRecordCoordinateComparator());
|
||||
}
|
||||
|
||||
createdReads = new ArrayList<GATKSAMRecord>(reads);
|
||||
}
|
||||
|
||||
if ( ! additionalReads.isEmpty() ) {
|
||||
reads.addAll(additionalReads);
|
||||
Collections.sort(reads, new SAMRecordCoordinateComparator());
|
||||
}
|
||||
|
||||
return reads;
|
||||
return createdReads;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -192,13 +204,13 @@ public class ArtificialBAMBuilder {
|
|||
public int getnReadsPerLocus() { return nReadsPerLocus; }
|
||||
public int getnLoci() { return nLoci; }
|
||||
public int getSkipNLoci() { return skipNLoci; }
|
||||
public ArtificialBAMBuilder setSkipNLoci(int skipNLoci) { this.skipNLoci = skipNLoci; return this; }
|
||||
public ArtificialBAMBuilder setSkipNLoci(int skipNLoci) { this.skipNLoci = skipNLoci; createdReads = null; return this; }
|
||||
public int getAlignmentStart() { return alignmentStart; }
|
||||
public ArtificialBAMBuilder setAlignmentStart(int alignmentStart) { this.alignmentStart = alignmentStart; return this; }
|
||||
public ArtificialBAMBuilder setAlignmentStart(int alignmentStart) { this.alignmentStart = alignmentStart; createdReads = null; return this; }
|
||||
public int getReadLength() { return readLength; }
|
||||
public ArtificialBAMBuilder setReadLength(int readLength) { this.readLength = readLength; return this; }
|
||||
public ArtificialBAMBuilder setReadLength(int readLength) { this.readLength = readLength; createdReads = null; return this; }
|
||||
public SAMFileHeader getHeader() { return header; }
|
||||
public ArtificialBAMBuilder setHeader(SAMFileHeader header) { this.header = header; return this; }
|
||||
public ArtificialBAMBuilder setHeader(SAMFileHeader header) { this.header = header; createdReads = null; return this; }
|
||||
|
||||
public int getAlignmentEnd() {
|
||||
return alignmentStart + nLoci * (skipNLoci + 1) + readLength;
|
||||
|
|
|
|||
Loading…
Reference in New Issue