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