本文整理汇总了C++中Mapping::mutable_position方法的典型用法代码示例。如果您正苦于以下问题:C++ Mapping::mutable_position方法的具体用法?C++ Mapping::mutable_position怎么用?C++ Mapping::mutable_position使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Mapping
的用法示例。
在下文中一共展示了Mapping::mutable_position方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: create_snp_path
void Caller::create_snp_path(int64_t snp_node, bool secondary_snp) {
// for now we don't write secdonary snp, so we have 1 path per *site*
// and counting paths will give us somethign comparable to snp count
// from bcftools
if (!secondary_snp) {
stringstream name;
name << "SNP_" << snp_node;
Mapping mapping;
Position* pos = mapping.mutable_position();
// make path that covers node forward with no edits. not super
// useful but will use to count snps...
pos->set_node_id(snp_node);
pos->set_offset(0);
mapping.mutable_position()->set_is_reverse(false);
// note: create_path doesn't seem to work.. too rushed to look into
//list<Mapping>& mappings = _call_graph.paths.create_path(name.str());
list<Mapping> mappings;
mappings.push_back(mapping);
_call_graph.paths._paths.insert(make_pair(name.str(), mappings));
}
}
示例2: alignment
// generates a perfect alignment from the graph
Alignment Sampler::alignment(size_t length) {
string seq;
Alignment aln;
Path* path = aln.mutable_path();
pos_t pos = position();
char c = pos_char(pos);
// we do something wildly inefficient but conceptually clean
// for each position in the mapping we add a mapping
// at the end we will simplify the alignment, merging redundant mappings
do {
// add in the char for the current position
seq += c;
Mapping* mapping = path->add_mapping();
*mapping->mutable_position() = make_position(pos);
Edit* edit = mapping->add_edit();
edit->set_from_length(1);
edit->set_to_length(1);
// decide the next position
auto nextc = next_pos_chars(pos);
// no new positions mean we are done; we've reached the end of the graph
if (nextc.empty()) break;
// what positions do we go to next?
vector<pos_t> nextp;
for (auto& n : nextc) nextp.push_back(n.first);
// pick one at random
uniform_int_distribution<int> next_dist(0, nextc.size()-1);
// update our position
pos = nextp.at(next_dist(rng));
// update our char
c = nextc[pos];
} while (seq.size() < length);
// save our sequence in the alignment
aln.set_sequence(seq);
aln = simplify(aln);
{ // name the alignment
string data;
aln.SerializeToString(&data);
int n;
#pragma omp critical(nonce)
n = nonce++;
data += std::to_string(n);
const string hash = sha1head(data, 16);
aln.set_name(hash);
}
// and simplify it
aln.set_identity(identity(aln.path()));
return aln;
}
示例3: main_find
//.........这里部分代码省略.........
stream::for_each(std::cin, lambda);
} else {
ifstream in;
in.open(haplotype_alignments.c_str());
if(!in.is_open()) {
cerr << "[vg find] error: could not open alignments file " << haplotype_alignments << endl;
exit(1);
}
stream::for_each(in, lambda);
}
}
if (extract_threads) {
size_t thread_number = 0;
bool extract_reverse = false;
map<string, list<xg::XG::thread_t> > threads;
if (extract_patterns.empty()) {
threads = xindex.extract_threads(extract_reverse);
} else {
for (auto& pattern : extract_patterns) {
for (auto& t : xindex.extract_threads_matching(pattern, extract_reverse)) {
threads[t.first] = t.second;
}
}
}
for(auto t : threads) {
// Convert to a Path
auto& thread = *t.second.begin();
auto& thread_name = t.first;
Path path;
for(xg::XG::ThreadMapping& m : thread) {
// Convert all the mappings
Mapping mapping;
mapping.mutable_position()->set_node_id(m.node_id);
mapping.mutable_position()->set_is_reverse(m.is_reverse);
*(path.add_mapping()) = mapping;
}
// Get each thread's name
path.set_name(thread_name);
// Give each thread a name
//path.set_name("_thread_" + to_string(thread_number++));
// We need a Graph for serialization purposes. We do one chunk per
// thread in case the threads are long.
Graph g;
*(g.add_path()) = path;
// Dump the graph with its mappings. TODO: can we restrict these to
vector<Graph> gb = { g };
stream::write_buffered(cout, gb, 0);
}
}
if (!gam_file.empty()) {
set<vg::id_t> nodes;
function<void(Alignment&)> lambda = [&nodes](Alignment& aln) {
// accumulate nodes matched by the path
auto& path = aln.path();
for (int i = 0; i < path.mapping_size(); ++i) {
nodes.insert(path.mapping(i).position().node_id());
}
};
if (gam_file == "-") {
stream::for_each(std::cin, lambda);
} else {
示例4: main_xg
//.........这里部分代码省略.........
}
if (edges_on_start) {
vector<Edge> edges = graph->edges_on_start(node_id);
for (auto& edge : edges) {
cout << edge.from() << (edge.from_start()?"-":"+")
<< " -> " << edge.to() << (edge.to_end()?"-":"+") << endl;
}
}
if (edges_on_end) {
vector<Edge> edges = graph->edges_on_end(node_id);
for (auto& edge : edges) {
cout << edge.from() << (edge.from_start()?"-":"+")
<< " -> " << edge.to() << (edge.to_end()?"-":"+") << endl;
}
}
if (node_context) {
Graph g;
graph->neighborhood(node_id, context_steps, g);
if (text_output) {
to_text(cout, g);
} else {
vector<Graph> gb = { g };
stream::write_buffered(cout, gb, 0);
}
}
if (!target.empty()) {
string name;
int64_t start, end;
Graph g;
parse_region(target, name, start, end);
graph->get_path_range(name, start, end, g);
graph->expand_context(g, context_steps);
if (text_output) {
to_text(cout, g);
} else {
vector<Graph> gb = { g };
stream::write_buffered(cout, gb, 0);
}
}
if (extract_threads) {
list<XG::thread_t> threads;
for (auto& p : graph->extract_threads(false)) {
for (auto& t : p.second) {
threads.push_back(t);
}
}
for (auto& p : graph->extract_threads(true)) {
for (auto& t : p.second) {
threads.push_back(t);
}
}
size_t thread_number = 0;
for(XG::thread_t& thread : threads) {
// Convert to a Path
Path path;
for(XG::ThreadMapping& m : thread) {
// Convert all the mappings
Mapping mapping;
mapping.mutable_position()->set_node_id(m.node_id);
mapping.mutable_position()->set_is_reverse(m.is_reverse);
*(path.add_mapping()) = mapping;
}
// Give each thread a name
path.set_name("_thread_" + to_string(thread_number++));
// We need a Graph for serialization purposes. We do one chunk per
// thread in case the threads are long.
Graph g;
*(g.add_path()) = path;
// Dump the graph with its mappings. TODO: can we restrict these to
// mappings to nodes we have already pulled out? Or pull out the
// whole compressed graph?
if (text_output) {
to_text(cout, g);
} else {
vector<Graph> gb = { g };
stream::write_buffered(cout, gb, 0);
}
}
}
if (!b_array_name.empty()) {
// Dump B array
ofstream out;
out.open(b_array_name.c_str());
graph->bs_dump(out);
}
return 0;
}
示例5: align_internal
void Aligner::align_internal(Alignment& alignment, vector<Alignment>* multi_alignments, Graph& g,
int64_t pinned_node_id, bool pin_left, int32_t max_alt_alns, bool print_score_matrices) {
// check input integrity
if (pin_left && !pinned_node_id) {
cerr << "error:[Aligner] cannot choose pinned end in non-pinned alignment" << endl;
exit(EXIT_FAILURE);
}
if (multi_alignments && !pinned_node_id) {
cerr << "error:[Aligner] multiple traceback is not valid in local alignment, only pinned and global" << endl;
exit(EXIT_FAILURE);
}
if (!(multi_alignments) && max_alt_alns != 1) {
cerr << "error:[Aligner] cannot specify maximum number of alignments in single alignment" << endl;
exit(EXIT_FAILURE);
}
// alignment pinning algorithm is based on pinning in bottom right corner, if pinning in top
// left we need to reverse all the sequences first and translate the alignment back later
// create reversed objects if necessary
Graph reversed_graph;
string reversed_sequence;
if (pin_left) {
reversed_sequence.resize(alignment.sequence().length());
reverse_copy(alignment.sequence().begin(), alignment.sequence().end(), reversed_sequence.begin());
reverse_graph(g, reversed_graph);
}
// choose forward or reversed objects
Graph* align_graph;
string* align_sequence;
if (pin_left) {
align_graph = &reversed_graph;
align_sequence = &reversed_sequence;
}
else {
align_graph = &g;
align_sequence = alignment.mutable_sequence();
}
// convert into gssw graph and get the counterpart to pinned node (if pinning)
gssw_node* pinned_node = nullptr;
gssw_graph* graph = create_gssw_graph(*align_graph, pinned_node_id, &pinned_node);
if (pinned_node_id & !pinned_node) {
cerr << "error:[Aligner] pinned node for pinned alignment is not in graph" << endl;
exit(EXIT_FAILURE);
}
// perform dynamic programming
gssw_graph_fill(graph, (*align_sequence).c_str(),
nt_table, score_matrix,
gap_open, gap_extension, 15, 2);
// traceback either from pinned position or optimal local alignment
if (pinned_node) {
// trace back pinned alignment
gssw_graph_mapping** gms = gssw_graph_trace_back_pinned_multi (graph,
pinned_node,
max_alt_alns,
(*align_sequence).c_str(),
(*align_sequence).size(),
nt_table,
score_matrix,
gap_open,
gap_extension);
if (pin_left) {
// translate graph and mappings into original node space
unreverse_graph(reversed_graph);
for (int32_t i = 0; i < max_alt_alns; i++) {
unreverse_graph_mapping(gms[i]);
}
}
// convert optimal alignment and store it in the input Alignment object (in the multi alignment,
// this will have been set to the first in the vector)
if (gms[0]->score > 0) {
// have a mapping, can just convert normally
gssw_mapping_to_alignment(graph, gms[0], alignment, print_score_matrices);
}
else {
// gssw will not identify mappings with 0 score, infer location based on pinning
Mapping* mapping = alignment.mutable_path()->add_mapping();
mapping->set_rank(1);
// locate at the end of the node
Position* position = mapping->mutable_position();
position->set_node_id(pinned_node_id);
position->set_offset(pin_left ? 0 : pinned_node->len);
// soft clip
Edit* edit = mapping->add_edit();
edit->set_to_length(alignment.sequence().length());
edit->set_sequence(alignment.sequence());
}
//.........这里部分代码省略.........
示例6: gssw_mapping_to_alignment
void Aligner::gssw_mapping_to_alignment(gssw_graph* graph,
gssw_graph_mapping* gm,
Alignment& alignment,
bool print_score_matrices) {
alignment.clear_path();
alignment.set_score(gm->score);
alignment.set_query_position(0);
Path* path = alignment.mutable_path();
//alignment.set_cigar(graph_cigar(gm));
gssw_graph_cigar* gc = &gm->cigar;
gssw_node_cigar* nc = gc->elements;
int to_pos = 0;
int from_pos = gm->position;
//cerr << "gm->position " << gm->position << endl;
string& to_seq = *alignment.mutable_sequence();
//cerr << "-------------" << endl;
if (print_score_matrices) {
gssw_graph_print_score_matrices(graph, to_seq.c_str(), to_seq.size(), stderr);
//cerr << alignment.DebugString() << endl;
}
for (int i = 0; i < gc->length; ++i, ++nc) {
if (i > 0) from_pos = 0; // reset for each node after the first
// check that the current alignment has a non-zero length
gssw_cigar* c = nc->cigar;
int l = c->length;
if (l == 0) continue;
gssw_cigar_element* e = c->elements;
Node* from_node = (Node*) nc->node->data;
string& from_seq = *from_node->mutable_sequence();
Mapping* mapping = path->add_mapping();
mapping->mutable_position()->set_node_id(nc->node->id);
mapping->mutable_position()->set_offset(from_pos);
mapping->set_rank(path->mapping_size());
//cerr << from_node->id() << ":" << endl;
for (int j=0; j < l; ++j, ++e) {
Edit* edit;
int32_t length = e->length;
//cerr << e->length << e->type << endl;
switch (e->type) {
case 'M':
case 'X':
case 'N': {
// do the sequences match?
// emit a stream of "SNPs" and matches
int h = from_pos;
int last_start = from_pos;
int k = to_pos;
for ( ; h < from_pos + length; ++h, ++k) {
//cerr << h << ":" << k << " " << from_seq[h] << " " << to_seq[k] << endl;
if (from_seq[h] != to_seq[k]) {
// emit the last "match" region
if (h-last_start > 0) {
edit = mapping->add_edit();
edit->set_from_length(h-last_start);
edit->set_to_length(h-last_start);
}
// set up the SNP
edit = mapping->add_edit();
edit->set_from_length(1);
edit->set_to_length(1);
edit->set_sequence(to_seq.substr(k,1));
last_start = h+1;
}
}
// handles the match at the end or the case of no SNP
if (h-last_start > 0) {
edit = mapping->add_edit();
edit->set_from_length(h-last_start);
edit->set_to_length(h-last_start);
}
to_pos += length;
from_pos += length;
}
break;
case 'D':
edit = mapping->add_edit();
edit->set_from_length(length);
edit->set_to_length(0);
from_pos += length;
break;
case 'I':
edit = mapping->add_edit();
edit->set_from_length(0);
edit->set_to_length(length);
edit->set_sequence(to_seq.substr(to_pos, length));
to_pos += length;
break;
case 'S':
// note that soft clips and insertions are semantically equivalent
// and can only be differentiated by their position in the read
// with soft clips coming at the start or end
edit = mapping->add_edit();
//.........这里部分代码省略.........