annotate BEDTools-Version-2.14.3/src/flankBed/flankBed.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 flankBed.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 Licensed 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 "flankBed.h"
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
14
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
15
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
16 BedFlank::BedFlank(string &bedFile, string &genomeFile, bool forceStrand, float leftFlank, float rightFlank, bool fractional) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
17
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
18 _bedFile = bedFile;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
19 _genomeFile = genomeFile;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
20 _forceStrand = forceStrand;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
21 _leftFlank = leftFlank;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
22 _rightFlank = rightFlank;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
23 _fractional = fractional;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
24
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
25 _bed = new BedFile(bedFile);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
26 _genome = new GenomeFile(genomeFile);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
27
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
28 // get going, slop it up.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
29 FlankBed();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
30 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
31
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
32
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
33 BedFlank::~BedFlank(void) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
34
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
35 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
36
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
37
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
38 void BedFlank::FlankBed() {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
39
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
40 int lineNum = 0;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
41 BED bedEntry, nullBed; // used to store the current BED line from the BED file.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
42 BedLineStatus bedStatus;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
43
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
44 _bed->Open();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
45 bedStatus = _bed->GetNextBed(bedEntry, lineNum);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
46 while (bedStatus != BED_INVALID) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
47 if (bedStatus == BED_VALID) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
48
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
49 int leftFlank = _leftFlank;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
50 int rightFlank = _rightFlank;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
51 if (_fractional == true) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
52 leftFlank = (int) (_leftFlank * bedEntry.size());
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
53 rightFlank = (int) (_rightFlank * bedEntry.size());
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
54 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
55
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
56 if ((_forceStrand == false) || (bedEntry.strand == "+"))
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
57 {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
58 AddFlank(bedEntry, leftFlank, rightFlank);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
59 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
60 else if ((_forceStrand == true) && (bedEntry.strand == "-" ))
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
61 {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
62 AddStrandedFlank(bedEntry, leftFlank, rightFlank);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
63 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
64 bedEntry = nullBed;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
65 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
66 bedStatus = _bed->GetNextBed(bedEntry, lineNum);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
67 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
68 _bed->Close();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
69 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
70
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
71
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
72 void BedFlank::AddFlank(BED &bed, int leftFlank, int rightFlank) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
73
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
74 int chromSize = _genome->getChromSize(bed.chrom);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
75 if (chromSize == -1) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
76 cerr << "ERROR: chrom \"" << bed.chrom << "\" not found in genome file. Exiting." << endl;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
77 exit(1);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
78 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
79
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
80 // init. our left and right flanks to the original BED entry.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
81 // we'll create the flanks from these coordinates.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
82 BED left = bed;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
83 BED right = bed;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
84
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
85 // make the left flank (if necessary)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
86 if (leftFlank > 0) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
87 if ( (static_cast<int>(left.start) - leftFlank) > 0)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
88 {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
89 left.end = left.start;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
90 left.start -= leftFlank;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
91 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
92 else
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
93 {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
94 left.end = left.start;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
95 left.start = 0;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
96 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
97 // report the left flank
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
98 _bed->reportBedNewLine(left);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
99 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
100
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
101 // make the left flank (if necessary)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
102 if (rightFlank > 0) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
103 if ( (static_cast<int>(right.end) + (rightFlank+1)) <= static_cast<int>(chromSize))
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
104 {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
105 right.start = right.end;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
106 right.end += (rightFlank);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
107 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
108 else {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
109 right.start = right.end;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
110 right.end += chromSize;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
111 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
112 // report the right flank
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
113 _bed->reportBedNewLine(right);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
114 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
115 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
116
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
117
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
118 void BedFlank::AddStrandedFlank(BED &bed, int leftFlank, int rightFlank) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
119
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
120 int chromSize = _genome->getChromSize(bed.chrom);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
121 if (chromSize == -1) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
122 cerr << "ERROR: chrom \"" << bed.chrom << "\" not found in genome file. Exiting." << endl;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
123 exit(1);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
124 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
125
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
126 // init. our left and right flanks to the original BED entry.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
127 // we'll create the flanks from these coordinates.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
128 BED left = bed;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
129 BED right = bed;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
130
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
131 // make the left flank (if necessary)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
132 if (rightFlank > 0) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
133 if ( (static_cast<int>(left.start) - rightFlank) > 0)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
134 {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
135 left.end = left.start;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
136 left.start -= rightFlank;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
137 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
138 else
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
139 {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
140 left.end = left.start;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
141 left.start = 0;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
142 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
143 // report the left flank
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
144 _bed->reportBedNewLine(left);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
145 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
146
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
147 // make the left flank (if necessary)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
148 if (leftFlank > 0) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
149 if ( (static_cast<int>(right.end) + leftFlank) <= static_cast<int>(chromSize))
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
150 {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
151 right.start = right.end;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
152 right.end += leftFlank;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
153 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
154 else {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
155 right.start = right.end;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
156 right.end = chromSize;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
157 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
158 // report the right flank
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
159 _bed->reportBedNewLine(right);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
160 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
161 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
162
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
163