annotate BEDTools-Version-2.14.3/src/slopBed/slopBed.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 slopBed.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 "slopBed.h"
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
14
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
15
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
16 BedSlop::BedSlop(string &bedFile, string &genomeFile, bool forceStrand, float leftSlop, float rightSlop, 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 _leftSlop = leftSlop;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
22 _rightSlop = rightSlop;
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 SlopBed();
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 BedSlop::~BedSlop(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 BedSlop::SlopBed() {
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 if (_fractional == false) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
49 AddSlop(bedEntry, (int) _leftSlop, (int) _rightSlop);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
50 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
51 else {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
52 int leftSlop = (int) (_leftSlop * bedEntry.size());
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
53 int rightSlop = (int) (_rightSlop * bedEntry.size());
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
54 AddSlop(bedEntry, leftSlop, rightSlop);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
55 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
56 _bed->reportBedNewLine(bedEntry);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
57 bedEntry = nullBed;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
58 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
59 bedStatus = _bed->GetNextBed(bedEntry, lineNum);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
60 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
61 _bed->Close();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
62 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
63
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
64
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
65 void BedSlop::AddSlop(BED &bed, int leftSlop, int rightSlop) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
66
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
67 // special handling if the BED entry is on the negative
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
68 // strand and the user cares about strandedness.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
69 CHRPOS chromSize = _genome->getChromSize(bed.chrom);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
70
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
71 if ( (_forceStrand) && (bed.strand == "-") ) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
72 // inspect the start
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
73 if ( (static_cast<int>(bed.start) - rightSlop) > 0 ) bed.start -= rightSlop;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
74 else bed.start = 0;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
75
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
76 // inspect the start
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
77 if ( (static_cast<int>(bed.end) + leftSlop) <= static_cast<int>(chromSize)) bed.end += leftSlop;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
78 else bed.end = chromSize;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
79 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
80 else {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
81 // inspect the start
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
82 if ( (static_cast<int>(bed.start) - leftSlop) > 0) bed.start -= leftSlop;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
83 else bed.start = 0;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
84
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
85 // inspect the end
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
86 if ( (static_cast<int>(bed.end) + rightSlop) <= static_cast<int>(chromSize)) bed.end += rightSlop;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
87 else bed.end = chromSize;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
88 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
89 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
90
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
91