annotate BEDTools-Version-2.14.3/src/utils/BamTools-Ancillary/BamAncillary.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 bamAncillary.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 "BamAncillary.h"
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
13 using namespace std;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
14
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
15 // 10 15 20 25 30 4000
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
16 // acccctttggacct---ataggga.................aaaa
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
17 // acccc---ggaccttttataggga.................aaaa
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
18 // 5M 3D 6M 2I 7M 20N 4M
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
19
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
20 namespace BamTools {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
21 void getBamBlocks(const BamAlignment &bam, const RefVector &refs,
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
22 vector<BED> &blocks, bool breakOnDeletionOps) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
23
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
24 CHRPOS currPosition = bam.Position;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
25 CHRPOS blockStart = bam.Position;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
26 string chrom = refs.at(bam.RefID).RefName;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
27 string name = bam.Name;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
28 string strand = "+";
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
29 string score = ToString(bam.MapQuality);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
30 char prevOp = '\0';
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
31 if (bam.IsReverseStrand()) strand = "-";
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
32 bool blocksFound = false;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
33
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
34 vector<CigarOp>::const_iterator cigItr = bam.CigarData.begin();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
35 vector<CigarOp>::const_iterator cigEnd = bam.CigarData.end();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
36 for ( ; cigItr != cigEnd; ++cigItr ) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
37 if (cigItr->Type == 'M') {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
38 currPosition += cigItr->Length;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
39 // we only want to create a new block if the current M op
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
40 // was preceded by an N op or a D op (and we are breaking on D ops)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
41 if ((prevOp == 'D' && breakOnDeletionOps == true) || (prevOp == 'N')) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
42 blocks.push_back( BED(chrom, blockStart, currPosition, name, score, strand) );
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
43 blockStart = currPosition;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
44 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
45 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
46 else if (cigItr->Type == 'D') {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
47 if (breakOnDeletionOps == false)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
48 currPosition += cigItr->Length;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
49 else {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
50 currPosition += cigItr->Length;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
51 blockStart = currPosition;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
52 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
53 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
54 else if (cigItr->Type == 'N') {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
55 currPosition += cigItr->Length;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
56 blockStart = currPosition;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
57 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
58 else if (cigItr->Type == 'S' || cigItr->Type == 'H' || cigItr->Type == 'P' || cigItr->Type == 'I') {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
59 // do nothing
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
60 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
61 else {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
62 cerr << "Input error: invalid CIGAR type (" << cigItr->Type
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
63 << ") for: " << bam.Name << endl;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
64 exit(1);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
65 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
66 prevOp = cigItr->Type;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
67 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
68 // if there were no splits, we just create a block representing the contiguous alignment.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
69 if (blocksFound == false) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
70 blocks.push_back( BED(chrom, bam.Position, currPosition, name, score, strand) );
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
71 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
72 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
73 }