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 */