64,685
社区成员
发帖
与我相关
我的任务
分享
typedef struct cr{
string contig;
string gi;
map<string, int> gi_map;
bool tag;
int reads;
float chimerity_rate;
string::size_type length;
}cr;
map<string, cr> contig2read;
while(getline(fin_sam, line))
{
if(line[0] == ' ' || line[0] == '\t' || line[0] == '\n' || line[0] == '@')
{
continue;
}
else
{
//cout << line << endl;
i = 0;
tabnum = 0;
//这里主要获得每一行的相关值
while(tabnum < 2) //here tab is "|"
{
if(line[i] == '|')
{
tabnum++;
}
++i;
}
gi.assign(line, 0, i);
//cout << reads << endl;
i = 0;
tabnum = 0;
k = 0;
while(tabnum < 11)
{
if(line[i] == '\t')
{
++tabnum;
if(tabnum == 2)
{
k = i;
}
if(tabnum == 3)
{
contig.assign(line, k + 1, i - k - 1);
if(contig == "*" || contig == "0")
{
break;
}
}
if(tabnum == 5)
{
map_quality.assign(line, i + 1, 1);
if(map_quality == "*" || map_quality == "0")
{
break;
}
}
if(tabnum == 11)
{
unique_tag.assign(line, i + 1, 6);
break;
}
}
++i;
if(i < line.size())
{
continue;
}
else
{
unique_tag.clear();
break;
}
}
if(contig == "*" || contig == "0" || map_quality == "*" || map_quality == "0")
{
unique_tag.clear();
continue;
}
else if(unique_tag == "XT:A:U")
{
//如果满足相关的条件
contig2read_iter = contig2read.find(contig);
if(contig2read_iter == contig2read.end())
{
//看看行中的contig是否已经加入map容器
wc.contig = contig;
wc.tag = 1;
wc.gi = gi;
wc.reads = 1;
wc.gi_map.insert(make_pair(gi, 1));
contig2read.insert(make_pair(contig, wc));
}
else
{
//看看行中的contig是否已经加入map容器
if(1 == contig2read_iter->second.tag)
{
//对gi进行判断,看看是否已经在容器中
if(gi == contig2read_iter->second.gi)
{
++(contig2read_iter->second.reads);
contig2read_iter->second.gi_map_iter = (contig2read_iter->second.gi_map).find(gi);
++(contig2read_iter->second.gi_map_iter->second);
}
else
{
++(contig2read_iter->second.reads);
contig2read_iter->second.gi_map_iter = (contig2read_iter->second.gi_map).find(gi);
if(contig2read_iter->second.gi_map_iter == contig2read_iter->second.gi_map.end())
{
contig2read_iter->second.gi_map.insert(make_pair(gi, 1));
}
else
{
++(contig2read_iter->second.gi_map_iter->second);
}
contig2read_iter->second.tag = 0;
}
}
else
{
++(contig2read_iter->second.reads);
contig2read_iter->second.gi_map_iter = (contig2read_iter->second.gi_map).find(gi);
if(contig2read_iter->second.gi_map_iter == contig2read_iter->second.gi_map.end())
{
contig2read_iter->second.gi_map.insert(make_pair(gi, 1));
}
else
{
++(contig2read_iter->second.gi_map_iter->second);
}
}
}
}
else
{
unique_tag.clear();
continue;
}
}
}
while(getline(fin_sam, line))
{
if(line[0] == ' ' || line[0] == '\t' || line[0] == '\n' || line[0] == '@')
{
continue;
}
else
{
//cout << line << endl;
i = 0;
tabnum = 0;
while(tabnum < 2) //here tab is "|"
{
if(line[i] == '|')
{
tabnum++;
}
++i;
}
gi.clear();
gi.assign(line, 0, i);
//cout << reads << endl;
i = 0;
tabnum = 0;
k = 0;
while(tabnum < 11)
{
if(line[i] == '\t')
{
++tabnum;
if(tabnum == 2)
{
k = i;
}
if(tabnum == 3)
{
contig.assign(line, k + 1, i - k - 1);
if(contig == "*" || contig == "0")
{
break;
}
}
if(tabnum == 5)
{
map_quality.assign(line, i + 1, 1);
if(map_quality == "*" || map_quality == "0")
{
break;
}
}
if(tabnum == 11)
{
unique_tag.clear();
unique_tag.assign(line, i + 1, 6);
break;
}
}
++i;
if(i < line.size())
{
continue;
}
else
{
unique_tag.clear();
break;
}
}
if(contig == "*" || contig == "0" || map_quality == "*" || map_quality == "0")
{
unique_tag.clear();
continue;
}
else if(unique_tag == "XT:A:U")
{
wc.contig = contig;
wc.tag = true;
wc.gi = gi;
wc.reads = 1;
pair<map<string, cr>::iterator, bool> retu = contig2read.insert(make_pair(contig, wc));
if(retu.second)
{
pair<map<string, int>::iterator, bool> ret = retu.first->second.gi_map.insert(make_pair(gi, 1));
}
else
{
if(retu.first->second.tag == true)
{
++retu.first->second.reads;
pair<map<string, int>::iterator, bool> ret = retu.first->second.gi_map.insert(make_pair(gi, 1));
if(ret.second)
{
retu.first->second.tag = false;
}
else
{
++ret.first->second;
}
}
else
{
++retu.first->second.reads;
pair<map<string, int>::iterator, bool> ret = retu.first->second.gi_map.insert(make_pair(gi, 1));
if(ret.second)
{
continue;
}
else
{
++ret.first->second;
}
}
}
}
else
{
continue;
}
}
}