本文整理汇总了C++中RefVector类的典型用法代码示例。如果您正苦于以下问题:C++ RefVector类的具体用法?C++ RefVector怎么用?C++ RefVector使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了RefVector类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: SV_Pair
//{{{ SV_Pair:: SV_Pair(const BamAlignment &bam_a,
// if both reads are on the same chrome, then read_l must map before read_r
// if the reads are on different strands then read_l must be on the lexo
// lesser chrom (using the string.compare() method)
SV_Pair::
SV_Pair(const BamAlignment &bam_a,
const BamAlignment &bam_b,
const RefVector &refs,
int _weight,
int _ev_id,
SV_PairReader *_reader)
{
reader = _reader;
if ( bam_a.MapQuality < bam_b.MapQuality )
min_mapping_quality = bam_a.MapQuality;
else
min_mapping_quality = bam_b.MapQuality;
struct interval tmp_a, tmp_b;
tmp_a.start = bam_a.Position;
tmp_a.end = bam_a.GetEndPosition(false, false) - 1;
tmp_a.chr = refs.at(bam_a.RefID).RefName;
if ( bam_a.IsReverseStrand() == true )
tmp_a.strand = '-';
else
tmp_a.strand = '+';
tmp_b.start = bam_b.Position;
tmp_b.end = bam_b.GetEndPosition(false, false) - 1;
tmp_b.chr = refs.at(bam_b.RefID).RefName;
if ( bam_b.IsReverseStrand() == true )
tmp_b.strand = '-';
else
tmp_b.strand = '+';
//if ( tmp_a.chr.compare(tmp_b.chr) > 0 ) {
if ( bam_a.RefID < bam_b.RefID ) {
read_l = tmp_a;
read_r = tmp_b;
//} else if ( tmp_a.chr.compare(tmp_b.chr) < 0 ) {
} else if ( bam_a.RefID > bam_b.RefID) {
read_l = tmp_b;
read_r = tmp_a;
} else { // ==
if (tmp_a.start > tmp_b.start) {
read_l = tmp_b;
read_r = tmp_a;
} else {
read_l = tmp_a;
read_r = tmp_b;
}
}
weight = _weight;
ev_id = _ev_id;
}
示例2: CollectCoverageBam
void BedCoverage::CollectCoverageBam(string bamFile) {
// load the "B" bed file into a map so
// that we can easily compare "A" to it for overlaps
_bedB->loadBedCovFileIntoMap();
// open the BAM file
BamReader reader;
reader.Open(bamFile);
// get header & reference information
string header = reader.GetHeaderText();
RefVector refs = reader.GetReferenceData();
// convert each aligned BAM entry to BED
// and compute coverage on B
BamAlignment bam;
while (reader.GetNextAlignment(bam)) {
if (bam.IsMapped()) {
// treat the BAM alignment as a single "block"
if (_obeySplits == false) {
// construct a new BED entry from the current BAM alignment.
BED a;
a.chrom = refs.at(bam.RefID).RefName;
a.start = bam.Position;
a.end = bam.GetEndPosition(false, false);
a.strand = "+";
if (bam.IsReverseStrand()) a.strand = "-";
_bedB->countHits(a, _sameStrand, _diffStrand, _countsOnly);
}
// split the BAM alignment into discrete blocks and
// look for overlaps only within each block.
else {
// vec to store the discrete BED "blocks" from a
bedVector bedBlocks;
// since we are counting coverage, we do want to split blocks when a
// deletion (D) CIGAR op is encountered (hence the true for the last parm)
GetBamBlocks(bam, refs.at(bam.RefID).RefName, bedBlocks, false, true);
// use countSplitHits to avoid over-counting each split chunk
// as distinct read coverage.
_bedB->countSplitHits(bedBlocks, _sameStrand, _diffStrand, _countsOnly);
}
}
}
// report the coverage (summary or histogram) for BED B.
if (_countsOnly == true)
ReportCounts();
else
ReportCoverage();
// close the BAM file
reader.Close();
}
示例3: process_pair
//{{{ void process_pair(const BamAlignment &curr,
void
SV_Pair::
process_pair(const BamAlignment &curr,
const RefVector refs,
map<string, BamAlignment> &mapped_pairs,
UCSCBins<SV_BreakPoint*> &r_bin,
int weight,
int ev_id,
SV_PairReader *reader)
{
if (mapped_pairs.find(curr.Name) == mapped_pairs.end())
mapped_pairs[curr.Name] = curr;
else {
SV_Pair *new_pair = new SV_Pair(mapped_pairs[curr.Name],
curr,
refs,
weight,
ev_id,
reader);
//cerr << count_clipped(curr.CigarData) << "\t" <<
//count_clipped(mapped_pairs[curr.Name].CigarData) << endl;
if ( new_pair->is_sane() &&
new_pair->is_aberrant() &&
(count_clipped(curr.CigarData) > 0) &&
(count_clipped(mapped_pairs[curr.Name].CigarData) > 0) ) {
SV_BreakPoint *new_bp = new_pair->get_bp();
#ifdef TRACE
cerr << "READ\t" <<
refs.at(mapped_pairs[curr.Name].RefID).RefName << "," <<
mapped_pairs[curr.Name].Position << "," <<
(mapped_pairs[curr.Name].GetEndPosition(false, false) - 1)
<< "\t" <<
refs.at(curr.RefID).RefName << "," <<
curr.Position << "," <<
(curr.GetEndPosition(false, false) - 1)
<<
endl;
cerr << "\tPE\t" << *new_bp << endl;
#endif
new_bp->cluster(r_bin);
} else {
delete(new_pair);
}
mapped_pairs.erase(curr.Name);
}
}
示例4: get_ref_lengths
long get_ref_lengths(int id, RefVector ref) {
long length = 0;
for (size_t i = 0; i < (size_t) id && i < ref.size(); i++) {
length += (long) ref[i].RefLength + (long) Parameter::Instance()->max_dist;
}
return length;
}
示例5:
GenomeFile::GenomeFile(const RefVector &genome) {
for (size_t i = 0; i < genome.size(); ++i) {
string chrom = genome[i].RefName;
int length = genome[i].RefLength;
_chromSizes[chrom] = length;
_chromList.push_back(chrom);
}
}
示例6: calc_pos
long Breakpoint::calc_pos(long pos, RefVector ref) {
size_t i = 0;
pos -= ref[i].RefLength;
while (i < ref.size() && pos >= 0) {
i++;
pos -= ref[i].RefLength;
}
return pos + ref[i].RefLength;
}
示例7: getBamBlocks
void getBamBlocks(const BamAlignment &bam, const RefVector &refs,
vector<BED> &blocks, bool breakOnDeletionOps) {
CHRPOS currPosition = bam.Position;
CHRPOS blockStart = bam.Position;
string chrom = refs.at(bam.RefID).RefName;
string name = bam.Name;
string strand = "+";
string score = ToString(bam.MapQuality);
char prevOp = '\0';
if (bam.IsReverseStrand()) strand = "-";
bool blocksFound = false;
vector<CigarOp>::const_iterator cigItr = bam.CigarData.begin();
vector<CigarOp>::const_iterator cigEnd = bam.CigarData.end();
for ( ; cigItr != cigEnd; ++cigItr ) {
if (cigItr->Type == 'M') {
currPosition += cigItr->Length;
// we only want to create a new block if the current M op
// was preceded by an N op or a D op (and we are breaking on D ops)
if ((prevOp == 'D' && breakOnDeletionOps == true) || (prevOp == 'N')) {
blocks.push_back( BED(chrom, blockStart, currPosition, name, score, strand) );
blockStart = currPosition;
}
}
else if (cigItr->Type == 'D') {
if (breakOnDeletionOps == false)
currPosition += cigItr->Length;
else {
blocksFound = true;
currPosition += cigItr->Length;
blockStart = currPosition;
}
}
else if (cigItr->Type == 'N') {
blocks.push_back( BED(chrom, blockStart, currPosition, name, score, strand) );
blocksFound = true;
currPosition += cigItr->Length;
blockStart = currPosition;
}
else if (cigItr->Type == 'S' || cigItr->Type == 'H' || cigItr->Type == 'P' || cigItr->Type == 'I') {
// do nothing
}
else {
cerr << "Input error: invalid CIGAR type (" << cigItr->Type
<< ") for: " << bam.Name << endl;
exit(1);
}
prevOp = cigItr->Type;
}
// if there were no splits, we just create a block representing the contiguous alignment.
if (blocksFound == false) {
blocks.push_back( BED(chrom, bam.Position, currPosition, name, score, strand) );
}
}
示例8: fuck_off
long fuck_off(long pos, RefVector ref, std::string &chr) {
size_t i = 0;
pos -= (ref[i].RefLength + Parameter::Instance()->max_dist);
while (i < ref.size() && pos >= 0) {
i++;
pos -= ((long) ref[i].RefLength + (long) Parameter::Instance()->max_dist);
}
chr = ref[i].RefName;
return pos + ref[i].RefLength + (long) Parameter::Instance()->max_dist;
}
示例9: get_chr
std::string Breakpoint::get_chr(long pos, RefVector ref) {
// std::cout << "pos: " << pos << std::endl;
size_t id = 0;
while (id < ref.size() && pos >= 0) {
pos -= (long) ref[id].RefLength;
// std::cout << id << std::endl;
id++;
}
return ref[id - 1].RefName;
}
示例10: spk
//-------------------------------------------------------------------------
void XList::sortByElementNumber(String order){
// Get the number of sessions per speaker
LKVector spk(0,0);
for(unsigned long i=0;i<_vector.size();i++){
LKVector::type sps;
sps.idx = i;
sps.lk = _vector.getObject(i).getElementCount();
spk.addValue(sps);
}
// Sort Xlines of the temporary XList by element number
spk.descendingSort();
// Copy the current RefVector<XLine> into a temporary one
RefVector<XLine> tmpX;
for(unsigned long i=0;i<_vector.size();i++){
XLine *ll = new XLine(_vector.getObject(i));
tmpX.addObject(*ll);
}
// Remove all elements from the XList
_vector.deleteAllObjects();
// Fill the XList according to the number of elements
if(order == "descend"){
for(unsigned long i=0;i<tmpX.size();i++){
_vector.addObject(tmpX.getObject(spk[i].idx));
}
}
else if(order == "ascend"){
for(long i=tmpX.size()-1;i>=0;i--){
_vector.addObject(tmpX.getObject(spk[i].idx));
}
}
}
示例11: getBamBlocks
void getBamBlocks(const BamAlignment &bam, const RefVector &refs,
BedVec &blocks, bool breakOnDeletionOps) {
CHRPOS currPosition = bam.Position;
CHRPOS blockStart = bam.Position;
string chrom = refs.at(bam.RefID).RefName;
string name = bam.Name;
string strand = "+";
float score = bam.MapQuality;
if (bam.IsReverseStrand()) strand = "-";
vector<CigarOp>::const_iterator cigItr = bam.CigarData.begin();
vector<CigarOp>::const_iterator cigEnd = bam.CigarData.end();
for ( ; cigItr != cigEnd; ++cigItr ) {
if (cigItr->Type == 'M') {
currPosition += cigItr->Length;
blocks.push_back( Bed(chrom, blockStart, currPosition, name, score, strand) );
blockStart = currPosition;
}
else if (cigItr->Type == 'D') {
if (breakOnDeletionOps == false)
currPosition += cigItr->Length;
else {
currPosition += cigItr->Length;
blockStart = currPosition;
}
}
else if (cigItr->Type == 'N') {
currPosition += cigItr->Length;
blockStart = currPosition; }
else if (cigItr->Type == 'S' || cigItr->Type == 'H' || cigItr->Type == 'P' || cigItr->Type == 'I') {
// do nothing
}
else {
cerr << "Input error: invalid CIGAR type (" << cigItr->Type
<< ") for: " << bam.Name << endl;
exit(1);
}
}
}
示例12: BedFile
void BedIntersect::IntersectBam(string bamFile) {
// load the "B" bed file into a map so
// that we can easily compare "A" to it for overlaps
_bedB = new BedFile(_bedBFile);
_bedB->loadBedFileIntoMap();
// create a dummy BED A file for printing purposes if not
// using BAM output.
if (_bamOutput == false) {
_bedA = new BedFile(_bedAFile);
_bedA->bedType = 12;
}
// open the BAM file
BamReader reader;
BamWriter writer;
reader.Open(bamFile);
// get header & reference information
string bamHeader = reader.GetHeaderText();
RefVector refs = reader.GetReferenceData();
// open a BAM output to stdout if we are writing BAM
if (_bamOutput == true) {
// set compression mode
BamWriter::CompressionMode compressionMode = BamWriter::Compressed;
if ( _isUncompressedBam ) compressionMode = BamWriter::Uncompressed;
writer.SetCompressionMode(compressionMode);
// open our BAM writer
writer.Open("stdout", bamHeader, refs);
}
vector<BED> hits;
// reserve some space
hits.reserve(100);
BamAlignment bam;
// get each set of alignments for each pair.
while (reader.GetNextAlignment(bam)) {
// save an unaligned read if -v
if (!bam.IsMapped()) {
if (_noHit == true)
writer.SaveAlignment(bam);
continue;
}
// break alignment into discrete blocks,
bedVector bed_blocks;
string chrom = refs.at(bam.RefID).RefName;
GetBamBlocks(bam, chrom, bed_blocks, false, true);
// create a basic BED entry from the BAM alignment
BED bed;
MakeBedFromBam(bam, chrom, bed_blocks, bed);
bool overlapsFound = false;
if ((_bamOutput == true) && (_obeySplits == false))
{
overlapsFound = _bedB->anyHits(bed.chrom, bed.start, bed.end,
bed.strand, _sameStrand, _diffStrand,
_overlapFraction, _reciprocal);
}
else if ( ((_bamOutput == true) && (_obeySplits == true)) ||
((_bamOutput == false) && (_obeySplits == true)) )
{
// find the hits that overlap with the full span of the blocked BED
_bedB->allHits(bed.chrom, bed.start, bed.end, bed.strand,
hits, _sameStrand, _diffStrand,
_overlapFraction, _reciprocal);
// find the overlaps between the block in A and B
overlapsFound = FindBlockedOverlaps(bed, bed_blocks, hits, _bamOutput);
}
else if ((_bamOutput == false) && (_obeySplits == false))
{
FindOverlaps(bed, hits);
}
// save the BAM alignment if overlap reqs. were met
if (_bamOutput == true) {
if ((overlapsFound == true) && (_noHit == false))
writer.SaveAlignment(bam);
else if ((overlapsFound == false) && (_noHit == true))
writer.SaveAlignment(bam);
}
hits.clear();
}
// close the relevant BAM files.
reader.Close();
if (_bamOutput == true) {
writer.Close();
}
}
示例13: OpenAnnoFiles
void TagBam::Tag() {
// open the annotations files for processing;
OpenAnnoFiles();
// open the BAM file
BamReader reader;
BamWriter writer;
if (!reader.Open(_bamFile)) {
cerr << "Failed to open BAM file " << _bamFile << endl;
exit(1);
}
// get header & reference information
string bamHeader = reader.GetHeaderText();
RefVector refs = reader.GetReferenceData();
// set compression mode
BamWriter::CompressionMode compressionMode = BamWriter::Compressed;
// if ( _isUncompressedBam ) compressionMode = BamWriter::Uncompressed;
writer.SetCompressionMode(compressionMode);
// open our BAM writer
writer.Open("stdout", bamHeader, refs);
// rip through the BAM file and test for overlaps with each annotation file.
BamAlignment al;
vector<BED> hits;
while (reader.GetNextAlignment(al)) {
if (al.IsMapped() == true) {
BED a;
a.chrom = refs.at(al.RefID).RefName;
a.start = al.Position;
a.end = al.GetEndPosition(false, false);
a.strand = "+";
if (al.IsReverseStrand()) a.strand = "-";
ostringstream annotations;
// annotate the BAM file based on overlaps with the annotation files.
for (size_t i = 0; i < _annoFiles.size(); ++i)
{
// grab the current annotation file.
BedFile *anno = _annoFiles[i];
if (!_useNames && !_useScores && !_useIntervals) {
// add the label for this annotation file to tag if there is overlap
if (anno->anyHits(a.chrom, a.start, a.end, a.strand,
_sameStrand, _diffStrand, _overlapFraction, false))
{
annotations << _annoLabels[i] << ";";
}
}
// use the score field
else if (!_useNames && _useScores && !_useIntervals) {
anno->allHits(a.chrom, a.start, a.end, a.strand,
hits, _sameStrand, _diffStrand, 0.0, false);
for (size_t i = 0; i < hits.size(); ++i) {
annotations << hits[i].score;
if (i < hits.size() - 1) annotations << ",";
}
if (hits.size() > 0) annotations << ";";
hits.clear();
}
// use the name field from the annotation files to populate tag
else if (_useNames && !_useScores && !_useIntervals) {
anno->allHits(a.chrom, a.start, a.end, a.strand,
hits, _sameStrand, _diffStrand, 0.0, false);
for (size_t j = 0; j < hits.size(); ++j) {
annotations << hits[j].name;
if (j < hits.size() - 1) annotations << ",";
}
if (hits.size() > 0) annotations << ";";
hits.clear();
}
// use the full interval information annotation files to populate tag
else if (!_useNames && !_useScores && _useIntervals) {
anno->allHits(a.chrom, a.start, a.end, a.strand,
hits, _sameStrand, _diffStrand, 0.0, false);
for (size_t j = 0; j < hits.size(); ++j) {
annotations << _annoLabels[i] << ":" <<
hits[j].chrom << ":" <<
hits[j].start << "-" <<
hits[j].end << "," <<
hits[j].name << "," <<
hits[j].score << "," <<
hits[j].strand;
if (j < hits.size() - 1) annotations << ",";
}
if (hits.size() > 0) annotations << ";";
hits.clear();
}
}
// were there any overlaps with which to make a tag?
if (annotations.str().size() > 0) {
al.AddTag(_tag, "Z", annotations.str().substr(0, annotations.str().size() - 1)); // get rid of the last ";"
}
}
writer.SaveAlignment(al);
}
reader.Close();
//.........这里部分代码省略.........
示例14: atoi
// this has been copied from bamtools utilities, since it isn't in the API. Original file is bamtools_utilities.cpp.
// Like the rest of Bamtools, it is under the BSD license.
bool Filter::ParseRegionString(const string& regionString, BamRegion& region)
{
// -------------------------------
// parse region string
// check first for empty string
if ( regionString.empty() )
return false;
// non-empty string, look for a colom
size_t foundFirstColon = regionString.find(':');
// store chrom strings, and numeric positions
string chrom;
int startPos;
int stopPos;
// no colon found
// going to use entire contents of requested chromosome
// just store entire region string as startChrom name
// use BamReader methods to check if its valid for current BAM file
if ( foundFirstColon == string::npos ) {
chrom = regionString;
startPos = 0;
stopPos = -1;
}
// colon found, so we at least have some sort of startPos requested
else {
// store start chrom from beginning to first colon
chrom = regionString.substr(0,foundFirstColon);
// look for ".." after the colon
size_t foundRangeDots = regionString.find("..", foundFirstColon+1);
// no dots found
// so we have a startPos but no range
// store contents before colon as startChrom, after as startPos
if ( foundRangeDots == string::npos ) {
startPos = atoi( regionString.substr(foundFirstColon+1).c_str() );
stopPos = -1;
}
// ".." found, so we have some sort of range selected
else {
// store startPos between first colon and range dots ".."
startPos = atoi( regionString.substr(foundFirstColon+1, foundRangeDots-foundFirstColon-1).c_str() );
// look for second colon
size_t foundSecondColon = regionString.find(':', foundRangeDots+1);
// no second colon found
// so we have a "standard" chrom:start..stop input format (on single chrom)
if ( foundSecondColon == string::npos ) {
stopPos = atoi( regionString.substr(foundRangeDots+2).c_str() );
} else {
return false;
}
}
}
// -------------------------------
// validate reference IDs & genomic positions
const RefVector references = getReferences();
int RefID = -1;
for(int i = 0; i < references.size(); i++) {
if(references[i].RefName == chrom)
RefID = i;
}
// if startRefID not found, return false
if ( RefID == -1 ) {
cerr << "Can't find chromosome'" << chrom << "'" << endl;
return false;
}
// startPos cannot be greater than or equal to reference length
const RefData& startReference = references.at(RefID);
if ( startPos >= startReference.RefLength ) {
cerr << "Start position (" << startPos << ") after end of the reference sequence (" << startReference.RefLength << ")" << endl;
return false;
}
// stopPosition cannot be larger than reference length
const RefData& stopReference = references.at(RefID);
if ( stopPos > stopReference.RefLength ) {
cerr << "Start position (" << stopPos << ") after end of the reference sequence (" << stopReference.RefLength << ")" << endl;
return false;
}
// if no stopPosition specified, set to reference end
if ( stopPos == -1 ) stopPos = stopReference.RefLength;
// -------------------------------
//.........这里部分代码省略.........
示例15: ResetChromCoverage
void BedGenomeCoverage::CoverageBam(string bamFile) {
ResetChromCoverage();
// open the BAM file
BamReader reader;
if (!reader.Open(bamFile)) {
cerr << "Failed to open BAM file " << bamFile << endl;
exit(1);
}
// get header & reference information
string header = reader.GetHeaderText();
RefVector refs = reader.GetReferenceData();
// load the BAM header references into a BEDTools "genome file"
_genome = new GenomeFile(refs);
// convert each aligned BAM entry to BED
// and compute coverage on B
BamAlignment bam;
while (reader.GetNextAlignment(bam)) {
// skip if the read is unaligned
if (bam.IsMapped() == false)
continue;
bool _isReverseStrand = bam.IsReverseStrand();
//changing second mate's strand to opposite
if( _dUTP && bam.IsPaired() && bam.IsMateMapped() && bam.IsSecondMate())
_isReverseStrand = !bam.IsReverseStrand();
// skip if we care about strands and the strand isn't what
// the user wanted
if ( (_filterByStrand == true) &&
((_requestedStrand == "-") != _isReverseStrand) )
continue;
// extract the chrom, start and end from the BAM alignment
string chrom(refs.at(bam.RefID).RefName);
CHRPOS start = bam.Position;
CHRPOS end = bam.GetEndPosition(false, false) - 1;
// are we on a new chromosome?
if ( chrom != _currChromName )
StartNewChrom(chrom);
if(_pair_chip_) {
// Skip if not a proper pair
if (bam.IsPaired() && (!bam.IsProperPair() or !bam.IsMateMapped()) )
continue;
// Skip if wrong coordinates
if( ( (bam.Position<bam.MatePosition) && bam.IsReverseStrand() ) ||
( (bam.MatePosition < bam.Position) && bam.IsMateReverseStrand() ) ) {
//chemically designed: left on positive strand, right on reverse one
continue;
}
/*if(_haveSize) {
if (bam.IsFirstMate() && bam.IsReverseStrand()) { //put fragmentSize in to the middle of pair end_fragment
int mid = bam.MatePosition+abs(bam.InsertSize)/2;
if(mid<_fragmentSize/2)
AddCoverage(0, mid+_fragmentSize/2);
else
AddCoverage(mid-_fragmentSize/2, mid+_fragmentSize/2);
}
else if (bam.IsFirstMate() && bam.IsMateReverseStrand()) { //put fragmentSize in to the middle of pair end_fragment
int mid = start+abs(bam.InsertSize)/2;
if(mid<_fragmentSize/2)
AddCoverage(0, mid+_fragmentSize/2);
else
AddCoverage(mid-_fragmentSize/2, mid+_fragmentSize/2);
}
} else */
if (bam.IsFirstMate() && bam.IsReverseStrand()) { //prolong to the mate to the left
AddCoverage(bam.MatePosition, end);
}
else if (bam.IsFirstMate() && bam.IsMateReverseStrand()) { //prolong to the mate to the right
AddCoverage(start, start + abs(bam.InsertSize) - 1);
}
} else if (_haveSize) {
if(bam.IsReverseStrand()) {
if(end<_fragmentSize) { //sometimes fragmentSize is bigger :(
AddCoverage(0, end);
} else {
AddCoverage(end + 1 - _fragmentSize, end );
}
} else {
AddCoverage(start,start+_fragmentSize - 1);
}
} else
// add coverage accordingly.
if (!_only_5p_end && !_only_3p_end) {
bedVector bedBlocks;
// we always want to split blocks when a D CIGAR op is found.
// if the user invokes -split, we want to also split on N ops.
if (_obeySplits) { // "D" true, "N" true
GetBamBlocks(bam, refs.at(bam.RefID).RefName, bedBlocks, true, true);
}
else { // "D" true, "N" false
GetBamBlocks(bam, refs.at(bam.RefID).RefName, bedBlocks, true, false);
//.........这里部分代码省略.........