Mercurial > repos > aaronquinlan > multi_intersect
comparison BEDTools-Version-2.14.3/src/pairToBed/pairToBed.h @ 0:dfcd8b6c1bda
Uploaded
author | aaronquinlan |
---|---|
date | Thu, 03 Nov 2011 10:25:04 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:dfcd8b6c1bda |
---|---|
1 /***************************************************************************** | |
2 pairToBed.h | |
3 | |
4 (c) 2009 - Aaron Quinlan | |
5 Hall Laboratory | |
6 Department of Biochemistry and Molecular Genetics | |
7 University of Virginia | |
8 aaronquinlan@gmail.com | |
9 | |
10 Licenced under the GNU General Public License 2.0 license. | |
11 ******************************************************************************/ | |
12 #ifndef INTERSECTBED_H | |
13 #define INTERSECTBED_H | |
14 | |
15 #include "api/BamReader.h" | |
16 #include "api/BamWriter.h" | |
17 #include "api/BamAux.h" | |
18 using namespace BamTools; | |
19 | |
20 #include "bedFile.h" | |
21 #include "bedFilePE.h" | |
22 #include <vector> | |
23 #include <iostream> | |
24 #include <fstream> | |
25 | |
26 using namespace std; | |
27 | |
28 | |
29 | |
30 /************************************************** | |
31 Helper function protoypes | |
32 **************************************************/ | |
33 void IsCorrectMappingForBEDPE (const BamAlignment &bam, const RefVector &refs, BEDPE &a); | |
34 | |
35 | |
36 | |
37 //************************************************ | |
38 // Class methods and elements | |
39 //************************************************ | |
40 class BedIntersectPE { | |
41 | |
42 public: | |
43 | |
44 // constructor | |
45 BedIntersectPE(string bedAFilePE, string bedBFile, float overlapFraction, | |
46 string searchType, bool sameStrand, bool diffStrand, bool bamInput, bool bamOutput, bool uncompressedBam, bool useEditDistance); | |
47 // destructor | |
48 ~BedIntersectPE(void); | |
49 | |
50 void FindOverlaps(const BEDPE &, vector<BED> &hits1, vector<BED> &hits2, const string &type); | |
51 | |
52 bool FindOneOrMoreOverlaps(const BEDPE &, const string &type); | |
53 | |
54 void FindSpanningOverlaps(const BEDPE &a, vector<BED> &hits, const string &type); | |
55 bool FindOneOrMoreSpanningOverlaps(const BEDPE &a, const string &type); | |
56 | |
57 void IntersectBedPE(); | |
58 void IntersectBamPE(string bamFile); | |
59 | |
60 void DetermineBedPEInput(); | |
61 | |
62 private: | |
63 | |
64 string _bedAFilePE; | |
65 string _bedBFile; | |
66 float _overlapFraction; | |
67 string _searchType; | |
68 bool _sameStrand; | |
69 bool _diffStrand; | |
70 bool _useEditDistance; | |
71 bool _bamInput; | |
72 bool _bamOutput; | |
73 bool _isUncompressedBam; | |
74 | |
75 // instance of a paired-end bed file class. | |
76 BedFilePE *_bedA; | |
77 | |
78 // instance of a bed file class. | |
79 BedFile *_bedB; | |
80 | |
81 inline | |
82 void ConvertBamToBedPE(const BamAlignment &bam1, const BamAlignment &bam2, const RefVector &refs, BEDPE &a) { | |
83 | |
84 // initialize BEDPE variables | |
85 a.start1 = a.start2 = a.end1 = a.end2 = -1; | |
86 a.chrom1 = a.chrom2 = "."; | |
87 a.strand1 = a.strand2 = '.'; | |
88 uint32_t editDistance1, editDistance2; | |
89 editDistance1 = editDistance2 = 0; | |
90 | |
91 // take the qname from end 1. | |
92 a.name = bam1.Name; | |
93 | |
94 // end 1 | |
95 if (bam1.IsMapped()) { | |
96 a.chrom1 = refs.at(bam1.RefID).RefName; | |
97 a.start1 = bam1.Position; | |
98 a.end1 = bam1.GetEndPosition(false, false); | |
99 a.strand1 = "+"; | |
100 if (bam1.IsReverseStrand()) a.strand1 = "-"; | |
101 | |
102 // extract the edit distance from the NM tag | |
103 // if possible. otherwise, complain. | |
104 if (_useEditDistance == true) { | |
105 if (bam1.GetTag("NM", editDistance1) == false) { | |
106 cerr << "The edit distance tag (NM) was not found in the BAM file. Please disable -ed. Exiting\n"; | |
107 exit(1); | |
108 } | |
109 } | |
110 } | |
111 | |
112 // end 2 | |
113 if (bam2.IsMapped()) { | |
114 a.chrom2 = refs.at(bam2.RefID).RefName; | |
115 a.start2 = bam2.Position; | |
116 a.end2 = bam2.GetEndPosition(false, false); | |
117 a.strand2 = "+"; | |
118 if (bam2.IsReverseStrand()) a.strand2 = "-"; | |
119 | |
120 // extract the edit distance from the NM tag | |
121 // if possible. otherwise, complain. | |
122 if (_useEditDistance == true) { | |
123 if (bam2.GetTag("NM", editDistance2) == false) { | |
124 cerr << "The edit distance tag (NM) was not found in the BAM file. Please disable -ed. Exiting\n"; | |
125 exit(1); | |
126 } | |
127 } | |
128 } | |
129 | |
130 // swap the ends if necessary | |
131 if ( a.chrom1 > a.chrom2 || ((a.chrom1 == a.chrom2) && (a.start1 > a.start2)) ) { | |
132 swap(a.chrom1, a.chrom2); | |
133 swap(a.start1, a.start2); | |
134 swap(a.end1, a.end2); | |
135 swap(a.strand1, a.strand2); | |
136 } | |
137 | |
138 // compute the minimum mapping quality b/w the two ends of the pair. | |
139 a.score = "0"; | |
140 if (_useEditDistance == false) { | |
141 if (bam1.IsMapped() == true && bam2.IsMapped() == true) | |
142 a.score = ToString(min(bam1.MapQuality, bam2.MapQuality)); | |
143 } | |
144 // BEDPE using edit distance | |
145 else { | |
146 if (bam1.IsMapped() == true && bam2.IsMapped() == true) | |
147 a.score = ToString((int) (editDistance1 + editDistance2)); | |
148 else if (bam1.IsMapped() == true) | |
149 a.score = ToString((int) editDistance1); | |
150 else if (bam2.IsMapped() == true) | |
151 a.score = ToString((int) editDistance2); | |
152 } | |
153 }; | |
154 | |
155 inline | |
156 void ProcessBamBlock (const BamAlignment &bam1, const BamAlignment &bam2, | |
157 const RefVector &refs, | |
158 BamWriter &writer); | |
159 }; | |
160 | |
161 #endif /* PEINTERSECTBED_H */ |