annotate BEDTools-Version-2.14.3/src/windowBed/windowBed.cpp @ 0:dfcd8b6c1bda

Uploaded
author aaronquinlan
date Thu, 03 Nov 2011 10:25:04 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
1 /*****************************************************************************
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
2 windowBed.cpp
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
3
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
4 (c) 2009 - Aaron Quinlan
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
5 Hall Laboratory
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
6 Department of Biochemistry and Molecular Genetics
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
7 University of Virginia
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
8 aaronquinlan@gmail.com
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
9
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
10 Licenced under the GNU General Public License 2.0 license.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
11 ******************************************************************************/
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
12 #include "lineFileUtilities.h"
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
13 #include "windowBed.h"
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
14
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
15
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
16 /*
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
17 Constructor
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
18 */
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
19 BedWindow::BedWindow(string bedAFile, string bedBFile, int leftSlop, int rightSlop,
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
20 bool anyHit, bool noHit, bool writeCount, bool strandWindows,
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
21 bool matchOnSameStrand, bool matchOnDiffStrand, bool bamInput, bool bamOutput, bool isUncompressedBam) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
22
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
23 _bedAFile = bedAFile;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
24 _bedBFile = bedBFile;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
25
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
26 _leftSlop = leftSlop;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
27 _rightSlop = rightSlop;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
28
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
29 _anyHit = anyHit;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
30 _noHit = noHit;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
31 _writeCount = writeCount;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
32 _strandWindows = strandWindows;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
33 _matchOnSameStrand = matchOnSameStrand;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
34 _matchOnDiffStrand = matchOnDiffStrand;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
35 _bamInput = bamInput;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
36 _bamOutput = bamOutput;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
37 _isUncompressedBam = isUncompressedBam;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
38
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
39 _bedA = new BedFile(bedAFile);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
40 _bedB = new BedFile(bedBFile);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
41
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
42 if (_bamInput == false)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
43 WindowIntersectBed();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
44 else
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
45 WindowIntersectBam(_bedAFile);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
46 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
47
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
48
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
49
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
50 /*
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
51 Destructor
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
52 */
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
53 BedWindow::~BedWindow(void) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
54 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
55
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
56
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
57
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
58 void BedWindow::FindWindowOverlaps(const BED &a, vector<BED> &hits) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
59
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
60 /*
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
61 Adjust the start and end of a based on the requested window
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
62 */
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
63
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
64 // update the current feature's start and end
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
65 // according to the slop requested (slop = 0 by default)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
66 CHRPOS aFudgeStart = 0;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
67 CHRPOS aFudgeEnd;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
68 AddWindow(a, aFudgeStart, aFudgeEnd);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
69
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
70 /*
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
71 Now report the hits (if any) based on the window around a.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
72 */
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
73 // get the hits in B for the A feature
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
74 _bedB->FindOverlapsPerBin(a.chrom, aFudgeStart, aFudgeEnd, a.strand, hits, _matchOnSameStrand, _matchOnDiffStrand);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
75
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
76 int numOverlaps = 0;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
77
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
78 // loop through the hits and report those that meet the user's criteria
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
79 vector<BED>::const_iterator h = hits.begin();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
80 vector<BED>::const_iterator hitsEnd = hits.end();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
81 for (; h != hitsEnd; ++h) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
82
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
83 int s = max(aFudgeStart, h->start);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
84 int e = min(aFudgeEnd, h->end);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
85 int overlapBases = (e - s); // the number of overlapping bases b/w a and b
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
86 int aLength = (a.end - a.start); // the length of a in b.p.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
87
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
88 if (s < e) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
89 // is there enough overlap (default ~ 1bp)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
90 if ( ((float) overlapBases / (float) aLength) > 0 ) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
91 numOverlaps++;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
92 if (_anyHit == false && _noHit == false && _writeCount == false) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
93 _bedA->reportBedTab(a);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
94 _bedB->reportBedNewLine(*h);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
95 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
96 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
97 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
98 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
99 if (_anyHit == true && (numOverlaps >= 1)) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
100 _bedA->reportBedNewLine(a); }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
101 else if (_writeCount == true) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
102 _bedA->reportBedTab(a); printf("\t%d\n", numOverlaps);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
103 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
104 else if (_noHit == true && (numOverlaps == 0)) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
105 _bedA->reportBedNewLine(a);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
106 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
107 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
108
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
109
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
110 bool BedWindow::FindOneOrMoreWindowOverlaps(const BED &a) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
111
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
112 // update the current feature's start and end
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
113 // according to the slop requested (slop = 0 by default)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
114 CHRPOS aFudgeStart = 0;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
115 CHRPOS aFudgeEnd;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
116 AddWindow(a, aFudgeStart, aFudgeEnd);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
117
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
118 bool overlapsFound = _bedB->FindOneOrMoreOverlapsPerBin(a.chrom, a.start, a.end, a.strand, _matchOnSameStrand, _matchOnDiffStrand);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
119 return overlapsFound;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
120 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
121
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
122
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
123 void BedWindow::WindowIntersectBed() {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
124
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
125 // load the "B" bed file into a map so
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
126 // that we can easily compare "A" to it for overlaps
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
127 _bedB->loadBedFileIntoMap();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
128
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
129 BED a, nullBed;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
130 int lineNum = 0; // current input line number
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
131 BedLineStatus bedStatus;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
132 vector<BED> hits; // vector of potential hits
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
133 hits.reserve(100);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
134
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
135 _bedA->Open();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
136 while ((bedStatus = _bedA->GetNextBed(a, lineNum)) != BED_INVALID) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
137 if (bedStatus == BED_VALID) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
138 FindWindowOverlaps(a, hits);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
139 hits.clear();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
140 a = nullBed;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
141 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
142 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
143 _bedA->Close();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
144 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
145
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
146
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
147 void BedWindow::WindowIntersectBam(string bamFile) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
148
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
149 // load the "B" bed file into a map so
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
150 // that we can easily compare "A" to it for overlaps
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
151 _bedB->loadBedFileIntoMap();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
152
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
153 // open the BAM file
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
154 BamReader reader;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
155 BamWriter writer;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
156 reader.Open(bamFile);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
157
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
158 // get header & reference information
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
159 string bamHeader = reader.GetHeaderText();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
160 RefVector refs = reader.GetReferenceData();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
161
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
162 // open a BAM output to stdout if we are writing BAM
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
163 if (_bamOutput == true) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
164 // set compression mode
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
165 BamWriter::CompressionMode compressionMode = BamWriter::Compressed;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
166 if ( _isUncompressedBam ) compressionMode = BamWriter::Uncompressed;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
167 writer.SetCompressionMode(compressionMode);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
168 // open our BAM writer
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
169 writer.Open("stdout", bamHeader, refs);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
170 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
171
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
172 vector<BED> hits; // vector of potential hits
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
173 // reserve some space
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
174 hits.reserve(100);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
175
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
176 _bedA->bedType = 6;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
177 BamAlignment bam;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
178 bool overlapsFound;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
179 // get each set of alignments for each pair.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
180 while (reader.GetNextAlignment(bam)) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
181
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
182 if (bam.IsMapped()) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
183 BED a;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
184 a.chrom = refs.at(bam.RefID).RefName;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
185 a.start = bam.Position;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
186 a.end = bam.GetEndPosition(false, false);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
187
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
188 // build the name field from the BAM alignment.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
189 a.name = bam.Name;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
190 if (bam.IsFirstMate()) a.name += "/1";
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
191 if (bam.IsSecondMate()) a.name += "/2";
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
192
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
193 a.score = ToString(bam.MapQuality);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
194 a.strand = "+"; if (bam.IsReverseStrand()) a.strand = "-";
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
195
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
196 if (_bamOutput == true) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
197 overlapsFound = FindOneOrMoreWindowOverlaps(a);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
198 if (overlapsFound == true) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
199 if (_noHit == false)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
200 writer.SaveAlignment(bam);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
201 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
202 else {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
203 if (_noHit == true)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
204 writer.SaveAlignment(bam);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
205 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
206 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
207 else {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
208 FindWindowOverlaps(a, hits);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
209 hits.clear();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
210 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
211 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
212 // BAM IsMapped() is false
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
213 else if (_noHit == true) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
214 writer.SaveAlignment(bam);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
215 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
216 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
217
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
218 // close the relevant BAM files.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
219 reader.Close();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
220 if (_bamOutput == true) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
221 writer.Close();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
222 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
223 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
224
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
225
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
226 void BedWindow::AddWindow(const BED &a, CHRPOS &fudgeStart, CHRPOS &fudgeEnd) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
227 // Does the user want to treat the windows based on strand?
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
228 // If so,
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
229 // if "+", then left is left and right is right
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
230 // if "-", the left is right and right is left.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
231 if (_strandWindows) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
232 if (a.strand == "+") {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
233 if ((int) (a.start - _leftSlop) > 0)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
234 fudgeStart = a.start - _leftSlop;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
235 else fudgeStart = 0;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
236 fudgeEnd = a.end + _rightSlop;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
237 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
238 else {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
239 if ((int) (a.start - _rightSlop) > 0)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
240 fudgeStart = a.start - _rightSlop;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
241 else fudgeStart = 0;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
242 fudgeEnd = a.end + _leftSlop;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
243 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
244 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
245 // If not, add the windows irrespective of strand
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
246 else {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
247 if ((int) (a.start - _leftSlop) > 0)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
248 fudgeStart = a.start - _leftSlop;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
249 else fudgeStart = 0;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
250 fudgeEnd = a.end + _rightSlop;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
251 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
252 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
253