bool ConvertTool::ConvertToolPrivate::RunPileupConversion(BamMultiReader* reader) { // check for valid BamMultiReader if ( reader == 0 ) return false; // set up our pileup format 'visitor' ConvertPileupFormatVisitor* v = new ConvertPileupFormatVisitor(m_references, m_settings->FastaFilename, m_settings->IsPrintingPileupMapQualities, &m_out); // set up PileupEngine PileupEngine pileup; pileup.AddVisitor(v); // iterate through data BamAlignment al; while ( reader->GetNextAlignment(al) ) pileup.AddAlignment(al); pileup.Flush(); // clean up delete v; v = 0; // return success return true; }
bool CoverageTool::CoverageToolPrivate::Run(void) { // if output filename given ofstream outFile; if ( m_settings->HasOutputFile ) { // open output file stream outFile.open(m_settings->OutputFilename.c_str()); if ( !outFile ) { cerr << "bamtools coverage ERROR: could not open " << m_settings->OutputFilename << " for output" << endl; return false; } // set m_out to file's streambuf m_out.rdbuf(outFile.rdbuf()); } //open our BAM reader BamReader reader; if ( !reader.Open(m_settings->InputBamFilename) ) { cerr << "bamtools coverage ERROR: could not open input BAM file: " << m_settings->InputBamFilename << endl; return false; } // retrieve references m_references = reader.GetReferenceData(); // set up our output 'visitor' CoverageVisitor* cv = new CoverageVisitor(m_references, &m_out); // set up pileup engine with 'visitor' PileupEngine pileup; pileup.AddVisitor(cv); // process input data BamAlignment al; while ( reader.GetNextAlignment(al) ) pileup.AddAlignment(al); // clean up reader.Close(); if ( m_settings->HasOutputFile ) outFile.close(); delete cv; cv = 0; // return success return true; }
void GenericIndividualSnpCall::simpleSnpCall(string &fastaObj, BamReader &bamObj, int chrID, int leftPosition, int rightPosition, vector<Allele> &variantCandidates, map<int,list<tuple<char,int,int,double>>> &bamData) { set<int> BlockSnpPositions; vector<Allele> BlockSnpAlleles; // rewind bamObj.Rewind(); // set region bamObj.SetRegion(chrID, leftPosition, chrID, rightPosition); BamAlignment al; // search SNP positions in the region while (bamObj.GetNextAlignment(al)) { if (!GenericBamAlignmentTools::goodAlignment(al)) continue; if (!al.HasTag("MD")) continue; vector<long> SnpInAlignment; GenericBamAlignmentTools::getBamAlignmentMismatches(al, SnpInAlignment); for (int i=0; i<SnpInAlignment.size(); i++) { BlockSnpPositions.insert(SnpInAlignment[i]); } } // pileup visitor SimpleSnpCallPileupVisitor visitor(&fastaObj, chrID, leftPosition, rightPosition, m_downSample, &BlockSnpPositions, &BlockSnpAlleles, &bamData); PileupEngine SimpleSnpCallPileupEngine; SimpleSnpCallPileupEngine.AddVisitor(&visitor); // rewind bamObj.Rewind(); // set region bamObj.SetRegion(chrID, leftPosition, chrID, rightPosition); // load data while(bamObj.GetNextAlignment(al)) { if (!GenericBamAlignmentTools::goodAlignment(al)) continue; if (!GenericBamAlignmentTools::validMapQuality(al, m_minMapQuality)) continue; if (!GenericBamAlignmentTools::validReadIdentity(al, m_maxMismatchFrac)) continue; if (!GenericBamAlignmentTools::validReadLength(al, m_minReadLength)) continue; if (!al.HasTag("MD")) continue; SimpleSnpCallPileupEngine.AddAlignment(al); } SimpleSnpCallPileupEngine.Flush(); // Filter SNP candidiate for (int i=0; i<BlockSnpAlleles.size(); i++) { Allele allele = BlockSnpAlleles[i]; if (allele.m_alleleDepth < m_minSnpRead) continue; if (allele.m_alleleDepth < m_minSnpFrac*allele.m_globalDepth) continue; variantCandidates.push_back(allele); } }