,
197 "artificial sequence",
198 "eukaryotic synthetic construct",
254 "environmental_sample",
331 "restricted access",
332 "missing: control sample",
333 "missing: sample group",
334 "missing: synthetic construct",
335 "missing: lab stock",
336 "missing: third party data",
337 "missing: data agreement established pre-2023",
338 "missing: endangered species",
339 "missing: human-identifiable",
368 autotsfbp = sfbl.before_begin();
370 for(; dbp != dbp_end; ++dbp) {
371 if(dbp->mType !=
type)
373 for(
const auto& tdbp : dbp->GetSubBlocks()) {
374 const FeatBlk* fbp = tdbp.GetFeatData();
375 if(! fbp || fbp->
key!=
"source")
377tsfbp = sfbl.emplace_after(tsfbp);
380tsfbp->quals = fbp->
quals;
392 if(! line || *line ==
'\0')
395 for(p = line, q = line; *p !=
'\0'; p++)
396 if(*p !=
' '&& *p !=
'\t')
404 for(
autosfbp = sfbl.begin(); sfbp != sfbl.end(); ++sfbp) {
406 for(
auto& cur : sfbp->quals) {
407 if(cur->IsSetQual()) {
410 if(cur->IsSetVal()) {
420 for(
autosfbp = sfbl.begin(); sfbp != sfbl.end(); ++sfbp) {
421 for(
const auto& cur : sfbp->quals) {
424 if(cur->GetQual() == *
b)
441namstr.append(
value);
442namstr.append(
")");
444 mod->SetSubtype(subtype);
447mods.push_front(
mod);
451 static void CollectSubNames(
SourceFeatBlk& sfbp,
Int4use_what,
const Char* name,
const Char* cultivar,
const Char* isolate,
const Char* serotype,
const Char* serovar,
const Char* specimen_voucher,
const Char* strain,
const Char* sub_species,
const Char* sub_strain,
const Char* variety,
const Char* ecotype)
494s.reserve(s.size() +
i);
522 const Char* cultivar;
523 const Char* isolate;
524 const Char* organelle;
525 const Char* serotype;
526 const Char* serovar;
527 const Char* ecotype;
528 const Char* specimen_voucher;
530 const Char* sub_species;
531 const Char* sub_strain;
532 const Char* variety;
540 for(
autosfbp = sfbl.begin(); sfbp != sfbl.end(); ++sfbp) {
544organelle =
nullptr;
548specimen_voucher =
nullptr;
550sub_species =
nullptr;
551sub_strain =
nullptr;
553genomename =
nullptr;
555 for(
auto& cur : sfbp->quals) {
556 if(! cur->IsSetQual())
559 const string& qual_str = cur->GetQual();
560 char* val_ptr = cur->IsSetVal() ? cur->SetVal().data() :
nullptr;
562 if(qual_str ==
"db_xref") {
564 if(! q || q[1] ==
'\0')
573 if(qual_str ==
"focus") {
577 if(qual_str ==
"transgenic") {
581 if(qual_str ==
"cultivar") {
585 if(qual_str ==
"isolate") {
590 if(qual_str ==
"mol_type") {
597 if(qual_str ==
"organelle") {
602 if(qual_str ==
"serotype") {
606 if(qual_str ==
"serovar") {
610 if(qual_str ==
"ecotype") {
614 if(qual_str ==
"specimen_voucher") {
615specimen_voucher = val_ptr;
618 if(qual_str ==
"strain") {
623 if(qual_str ==
"sub_species") {
624sub_species = val_ptr;
627 if(qual_str ==
"sub_strain") {
628sub_strain = val_ptr;
631 if(qual_str ==
"variety") {
635 if(qual_str ==
"submitter_seqid") {
636 if(sfbp->submitter_seqid) {
637 MemFree(sfbp->submitter_seqid);
646 if(qual_str !=
"organism"||
647! val_ptr || val_ptr[0] ==
'\0')
657str_to_find.assign(val_ptr, p);
659str_to_find.assign(val_ptr);
703sfbp->name = name ?
StringSave(name) :
nullptr;
705 if(sfbp->genomename)
707sfbp->genomename = genomename;
709 if(strain && ! sfbp->strain)
711 if(isolate && ! sfbp->isolate)
713 if(organelle && ! sfbp->organelle)
716 CollectSubNames(*sfbp, use_what, name, cultivar, isolate, serotype, serovar, specimen_voucher, strain, sub_species, sub_strain, variety, ecotype);
724 autosfbp = sfbl.cbegin();
725 for(; sfbp != sfbl.cend(); ++sfbp) {
726 if(sfbp->focus && sfbp->skip)
730 if(sfbp != sfbl.cend())
731 return(sfbp->location);
739 autosfbp = sfbl.cbegin();
740 for(; sfbp != sfbl.cend(); ++sfbp) {
748 if(sfbp != sfbl.cend())
749 return(sfbp->location);
764 for(
autosfbp = sfbl.cbegin(); sfbp != sfbl.cend(); ++sfbp) {
765 if(! sfbp->location || sfbp->location[0] ==
'\0')
770 for(
const auto& cur : sfbp->quals) {
771 if(cur->GetQual() !=
"partial")
784 if(p > sfbp->location)
786 if((p == sfbp->location || *p ==
'('|| *p ==
')'||
787*p ==
':'|| *p ==
','|| *p ==
'.') &&
788(*q ==
'\0'|| *q ==
'('|| *q ==
')'|| *q ==
','||
789*q ==
':'|| *q ==
'.')) {
797 for(
count= 0, p = sfbp->location; *p !=
'\0'; p++) {
800 else if(*p ==
'>'|| *p ==
'<')
806 else if(*p ==
'.'&& p[1] ==
'.')
808 else if(*p ==
'.'&& p[1] !=
'.') {
809 for(q = p + 1; *q >=
'0'&& *q <=
'9';)
811 if(q == p || *q !=
':')
818 if(invalid ||
count!= 0) {
833 autosfbp = sfbl.cbegin();
834 for(; sfbp != sfbl.cend(); ++sfbp) {
835 if(! sfbp->location || sfbp->location[0] ==
'\0')
837 for(p = sfbp->location + 1; *p !=
'\0'; p++) {
840 for(
r=
nullptr, q = p - 1;; q--) {
841 if(q == sfbp->location) {
842 if(*q !=
'_'&& (*q < '0' || *q >
'9') &&
843(*q < 'a' || *q >
'z') && (*q < 'A' || *q >
'Z'))
855 if(*q !=
'_'&& (*q < '0' || *q >
'9') &&
856(*q < 'a' || *q >
'z') && (*q < 'A' || *q >
'Z')) {
878 if(sfbp == sfbl.cend())
880 return(sfbp->location);
888 if(! name || *name ==
'\0')
914 for(
autotsfbp = sfbl.begin(); tsfbp != sfbl.end(); ++tsfbp) {
915 if(! tsfbp->location || tsfbp->location[0] ==
'\0'||
916! tsfbp->name || tsfbp->name[0] ==
'\0')
921 for(p = loc; *p !=
'\0'; p++)
922 if(*p ==
','|| *p ==
'('|| *p ==
')'|| *p ==
':'||
923*p ==
';'|| *p ==
'^')
925 for(p = loc, q = loc; *p !=
'\0';) {
926 if(*p ==
'>'|| *p ==
'<') {
937 if(q > loc && *(q - 1) ==
' ')
941q = (*loc ==
' ') ? (loc + 1) : loc;
948 for(
r= q; *
r>=
'0'&& *
r<=
'9';)
956}
else if(*
r==
'.'&&
r[1] ==
'.') {
960 for(q = ++
r; *
r>=
'0'&& *
r<=
'9';)
966 if(
min> 0 &&
max> 0) {
970 for(
autotmmp = mml.begin();; ++tmmp) {
971 if(min < tmmp->
min) {
972mml.insert_after(tmmp, *tmmp);
976 if(
next(tmmp) == mml.end()) {
977mml.insert_after(tmmp, newval);
991 autommp = mml.begin();
993 if(mmp == mml.end() || mmp->min != 1)
996 for(
max= mmp->max; mmp != mml.end(); ++mmp)
997 if(mmp->max >
max&& mmp->min <=
max+ 1)
1000 if((
size_t)
max<
len)
1007 for(
autotsfbp = sfbl.begin(); tsfbp != sfbl.end(); ++tsfbp,
i++) {
1021 if(
count> 2 ||
i>
count|| (tgs != 1 && sporg != 1))
1029 char* p =
nullptr;
1030 bool whole=
false;
1032 for(
autosfbp = sfbl.cbegin(); sfbp != sfbl.cend(); ++sfbp) {
1035 else if(sfbp->focus)
1054 if(div && *div !=
'\0') {
1063 for(
autosfbp = sfbl.cbegin(); sfbp != sfbl.cend(); ++sfbp) {
1067 if(syntgndiv == 0) {
1084 if(syntgndiv == 2 && ! got)
1101 boolfocus =
false;
1102 for(
autotsfbp = sfbl.cbegin(); tsfbp != sfbl.cend(); ++tsfbp) {
1126 for(
autotsfbp = sfbl.cbegin(); tsfbp != sfbl.cend(); ++tsfbp) {
1130taxname = tsfbp->name;
1133 if(tsfbp->tg && tsfbp->full)
1139 if(same ==
false&& tgfull ==
false&& focus ==
false)
1142 autotsfbp =
next(sfbl.cbegin());
1143 if(tsfbp == sfbl.cend() || ! tgs)
1146 for(; tsfbp != sfbl.cend(); ++tsfbp)
1153 if(tsfbp == sfbl.cend())
1171 for(
autotsfbp = sfbl.cbegin(); tsfbp != sfbl.cend(); ++tsfbp) {
1181 if(same &&
count> 0)
1185 autotsfbp = sfbl.cbegin();
1186 for(; tsfbp != sfbl.cend(); ++tsfbp) {
1187 if(! tsfbp->focus || ! tsfbp->name)
1194 if(tsfbp != sfbl.cend())
1197 if(same ||
count!= 0)
1201pat =
"1.."+ to_string(
len);
1202 for(tsfbp = sfbl.cbegin(); tsfbp != sfbl.cend(); ++tsfbp) {
1203 if(! tsfbp->name || ! tsfbp->location || tsfbp->skip)
1209 StringEqu(tsfbp->location, pat.c_str()))
1221 if(tsfbp == sfbl.cend())
1224 for(tsfbp = sfbl.cbegin(); tsfbp != sfbl.cend(); ++tsfbp) {
1225 if(tsfbp->full && tsfbp->tg && ! tsfbp->skip)
1229 if(tsfbp != sfbl.cend())
1237 if((mmp.
min== 1 && (
size_t)mmp.
max==
len) || mmp.
skip)
1245MinMaxList::const_iterator tmmp;
1247 autommp = mml.begin();
1249 for(; mmp != mml.end(); ++mmp) {
1252 for(tmmp =
next(mmp); tmmp != mml.end(); ++tmmp) {
1257 if(tmmp->min <= mmp->max && tmmp->max >= mmp->min)
1260 if(tmmp != mml.end())
1263 if(mmp == mml.end())
1267ss <<
"\""<< mmp->orgname <<
"\" at "<< mmp->min <<
".."<< mmp->max
1268<<
" vs \""<< tmmp->orgname <<
"\" at "<< tmmp->min <<
".."<< tmmp->max;
1275 if(sfbl.empty() ||
next(sfbl.cbegin()) == sfbl.cend())
1278 autotsfbp =
next(sfbl.cbegin());
1279 for(; tsfbp != sfbl.cend(); ++tsfbp)
1282 if(tsfbp == sfbl.cend())
1285 for(tsfbp = sfbl.cbegin(); tsfbp != sfbl.cend(); ++tsfbp)
1286 if(tsfbp->full && tsfbp->tg)
1288 if(tsfbp != sfbl.cend())
1291 autosfbp = sfbl.cbegin();
1292 for(; sfbp != sfbl.cend(); ++sfbp) {
1293 if(! sfbp->full || sfbp->tg)
1306 if(sfbp == sfbl.cend())
1308 return(sfbp->name);
1315 const Char* cultivar;
1316 const Char* isolate;
1317 const Char* serotype;
1318 const Char* serovar;
1319 const Char* ecotype;
1320 const Char* specimen_voucher;
1321 const Char* strain;
1322 const Char* sub_species;
1323 const Char* sub_strain;
1324 const Char* variety;
1326 for(
autosfbp = sfbl.begin(); sfbp != sfbl.end(); ++sfbp) {
1327 if(sfbp->bio_src.NotEmpty())
1334 if(sfbp->orgname.NotEmpty()) {
1339t_org_ref->
Assign(*org_ref);
1342 if(t_org_ref->
Equals(*org_ref))
1343sfbp->lookup =
false;
1345sfbp->lookup =
true;
1349sfbp->orgname.Reset();
1351cultivar =
nullptr;
1353serotype =
nullptr;
1356specimen_voucher =
nullptr;
1358sub_species =
nullptr;
1359sub_strain =
nullptr;
1363 switch(
mod->GetSubtype()) {
1365cultivar =
mod->GetSubname().c_str();
1368isolate =
mod->GetSubname().c_str();
1371serotype =
mod->GetSubname().c_str();
1374serovar =
mod->GetSubname().c_str();
1377ecotype =
mod->GetSubname().c_str();
1380specimen_voucher =
mod->GetSubname().c_str();
1383strain =
mod->GetSubname().c_str();
1386sub_species =
mod->GetSubname().c_str();
1389sub_strain =
mod->GetSubname().c_str();
1392variety =
mod->GetSubname().c_str();
1397 CollectSubNames(*sfbp, use_what, sfbp->name, cultivar, isolate, serotype, serovar, specimen_voucher, strain, sub_species, sub_strain, variety, ecotype);
1401sfbp->bio_src->SetOrg(*org_ref);
1403 for(
autotsfbp =
next(sfbp); tsfbp != sfbl.end(); ++tsfbp) {
1407tsfbp->lookup = sfbp->lookup;
1410tsfbp->bio_src->Assign(*sfbp->bio_src);
1427SourceFeatBlkList::iterator what)
1429 if(what == sfbl.begin())
1432 auto prev= sfbl.begin();
1434 for(; tsfbp != sfbl.end(); ++tsfbp) {
1435 if(tsfbp == what) {
1436sfbl.splice_after(sfbl.before_begin(), sfbl,
prev);
1446 for(
auto prev= sfbl.begin(), tsfbp =
next(
prev); tsfbp != sfbl.end();) {
1447 if(! tsfbp->useit) {
1452 booldifferent =
false;
1453 for(
const auto& cur : tsfbp->quals) {
1454 const string& cur_qual = cur->GetQual();
1455 if(cur_qual ==
"focus")
1458 boolfound =
false;
1459 for(
const auto&
next: sfbl.front().quals) {
1460 const string& next_qual =
next->GetQual();
1462 if(next_qual ==
"focus"|| next_qual != cur_qual)
1465 if(! cur->IsSetVal() && !
next->IsSetVal()) {
1470 if(cur->IsSetVal() &&
next->IsSetVal() &&
1471cur->GetVal() ==
next->GetVal()) {
1489tsfbp = sfbl.erase_after(
prev);
1495SourceFeatBlkList::iterator res)
1497 if(res == sfbl.end())
1500 autosfbp = sfbl.begin();
1501 auto& sfb = sfbl.emplace_front();
1503sfb.name = res->name ?
StringSave(res->name) :
nullptr;
1504sfb.namstr = res->namstr ?
StringSave(res->namstr) :
nullptr;
1505sfb.location = res->location ?
StringSave(res->location) :
nullptr;
1506sfb.full = res->full;
1507sfb.focus = res->focus;
1508sfb.lookup = res->lookup;
1509sfb.genome = res->genome;
1512sfb.bio_src->Assign(*res->bio_src);
1515 if(res->orgname.NotEmpty())
1516sfb.orgname->Assign(*res->orgname);
1518sfb.quals = res->quals;
1520 for(TQualVector::iterator cur = sfb.quals.begin(); cur != sfb.quals.end();) {
1521 const string& cur_qual = (*cur)->GetQual();
1522 if(cur_qual ==
"focus") {
1528 for(; tsfbp != sfbl.end(); ++tsfbp) {
1529 if(tsfbp == res || ! tsfbp->useit)
1532 boolfound =
false;
1533 for(
const auto&
next: tsfbp->quals) {
1534 const string& next_qual =
next->GetQual();
1536 if(next_qual ==
"focus"|| next_qual != cur_qual)
1539 if(! (*cur)->IsSetVal() && !
next->IsSetVal()) {
1544 if((*cur)->IsSetVal() &&
next->IsSetVal() &&
1545(*cur)->GetVal() ==
next->GetVal()) {
1555 if(tsfbp == sfbl.end())
1561cur = sfb.quals.erase(cur);
1570SourceFeatBlkList::iterator res;
1572 if(
next(sfbl.begin()) == sfbl.end()) {
1573 if(! sfbl.front().full) {
1580 Int4count_noskip = 0;
1582 for(
autotsfbp = sfbl.begin(); tsfbp != sfbl.end(); ++tsfbp) {
1588 if(! tsfbp->skip) {
1596 if(count_noskip == 1) {
1602 for(
autotsfbp = sfbl.begin(); tsfbp != sfbl.end(); ++tsfbp) {
1603 if(count_noskip != 0 && tsfbp->skip)
1605tsfbp->useit =
true;
1606 if(res == sfbl.end())
1613 autotsfbp = sfbl.begin();
1614 for(; tsfbp != sfbl.end(); ++tsfbp) {
1618 if(tsfbp != sfbl.end()) {
1624 for(tsfbp = sfbl.begin(); tsfbp != sfbl.end(); ++tsfbp) {
1632 if(res != sfbl.end()) {
1635 for(tsfbp = sfbl.begin(); tsfbp != sfbl.end(); ++tsfbp) {
1638tsfbp->useit =
true;
1644 if(count_noskip > 0) {
1645 for(tsfbp = sfbl.begin(); tsfbp != sfbl.end(); ++tsfbp) {
1648 if(res != tsfbp && tsfbp->skip)
1649tsfbp->useit =
false;
1656 for(tsfbp = sfbl.begin(); tsfbp != sfbl.end(); ++tsfbp) {
1662 if(res != sfbl.end()) {
1687 boolfound =
false;
1688 for(
const auto& subtype : bio.
GetSubtype()) {
1689 if(subtype->GetSubtype() ==
type) {
1713vector<string> modnames;
1718 if(it.num !=
mod->GetSubtype())
1721modnames.push_back(it.name);
1727 for(
const auto& cur : quals) {
1728 if(! cur->IsSetQual() || cur->GetQual() ==
"organism")
1731 const string& cur_qual = cur->GetQual();
1732 const Char* val_ptr = cur->IsSetVal() ? cur->GetVal().c_str() :
nullptr;
1734 if(cur_qual ==
"note") {
1741 if(cur_qual != *
b)
1744 if(! val_ptr || val_ptr[0] ==
'\0')
1756 if(**
b!=
'\0'&& cur_qual == *
b) {
1762 if(cur_qual ==
"organism"||
1763(taxserver != 0 && cur_qual ==
"type_material"))
1766 if(find(modnames.begin(), modnames.end(), cur_qual) != modnames.end())
1770 if(cur_qual == it.name) {
1783 if(qual->
GetQual() !=
"db_xref")
1786 const string& val_buf(qual->
GetVal());
1788 autopos = val_buf.find(
':');
1789 if(pos == string::npos)
1792 stringdb(val_buf.substr(0, pos));
1793 string t(val_buf.substr(pos + 1));
1829qual->
SetVal(db +
':'+
t);
1866 if(
t.front() !=
'0'&&
t.find_first_not_of(
"0123456789") == string::npos)
1869 tag->SetTag().SetStr(
t);
1886 boolis_syn =
false;
1887 boolis_pat =
false;
1896 autosfbp = sfbl.begin();
1897 for(; sfbp != sfbl.end(); ++sfbp) {
1898 if(sfbp->bio_src.Empty())
1903 if(! sfbp->lookup) {
1904 if(is_syn && ! sfbp->tg)
1911 if(is_syn ==
false&& is_pat ==
false) {
1912 const Char* taxname =
nullptr;
1924 booldropped =
false;
1925 for(
auto& cur : sfbp->quals) {
1926 if(! cur->IsSetQual() || cur->GetQual().empty())
1929 const string& cur_qual = cur->GetQual();
1930 stringcq = cur_qual;
1931 if(cq ==
"geo_loc_name") {
1934 if(cq ==
"db_xref") {
1936 if(dbtag.
Empty())
1939bio.
SetOrg().SetDb().push_back(dbtag);
1943 const Char* val_ptr = cur->IsSetVal() ? cur->GetVal().c_str() :
nullptr;
1944 if(cq ==
"organelle") {
1945 if(! val_ptr || val_ptr[0] ==
'\0')
1948 const char* p =
StringChr(val_ptr,
':');
1956string_view val_str(val_ptr, p - val_ptr);
1986 if(cq !=
"country"||
1987! val_ptr || val_ptr[0] ==
'\0')
1994 for(p = tco; *p ==
' '|| *p ==
'\t';)
1999 for(q = p + 1; *q !=
'\0';)
2001 for(q--; *q ==
' '|| *q ==
'\t';)
2007 if(! valid_country) {
2010 if(! valid_country)
2027 else if(oldgen > -1)
2036 if(sfbp != sfbl.end())
2046 returnc ==
' '|| c ==
'\t';
2058 for(
const auto& descr : bioseq.
GetDescr().
Get()) {
2059 if(! descr->IsSource())
2062 const CBioSource& bio_src = descr->GetSource();
2070std::remove_copy_if(taxname.begin(), taxname.end(), std::back_inserter(orgdescr),
is_a_space_char);
2075std::remove_copy_if(common.begin(), common.end(), std::back_inserter(commdescr),
is_a_space_char);
2078 autotsfbp = sfbl.cbegin();
2079 for(; tsfbp != sfbl.cend(); ++tsfbp) {
2080 if(tsfbp->name ==
nullptr|| tsfbp->name[0] ==
'\0')
2083 size_tname_len = strlen(tsfbp->name);
2085std::remove_copy_if(tsfbp->name, tsfbp->name + name_len, std::back_inserter(orgfeat),
is_a_space_char);
2096 if(orgdescr == orgfeat || commdescr == orgfeat) {
2102 if(tsfbp == sfbl.cend()) {
2115 autosfbp = sfbl.cbegin();
2116 for(; sfbp != sfbl.cend(); ++sfbp) {
2117 if(! sfbp->lookup || sfbp->bio_src.Empty() || ! sfbp->bio_src->IsSetOrg())
2121 if(sfbp->bio_src->GetOrg().IsSetOrgname() &&
2122sfbp->bio_src->GetOrg().GetOrgname().IsSetLineage())
2123p = sfbp->bio_src->GetOrg().GetOrgname().GetLineage().c_str();
2125 if(! p || *p ==
'\0') {
2135 if(sfbp == sfbl.cend())
2150 for(
autosfbp = sfbl.begin(); sfbp != sfbl.end(); ++sfbp) {
2151 if(sfbp->lookup || sfbp->bio_src.Empty() ||
2152! sfbp->bio_src->IsSetOrg() || ! sfbp->bio_src->GetOrg().IsSetTaxname() ||
2153! sfbp->name || *sfbp->name ==
'\0'||
2154sfbp->bio_src->GetOrg().GetTaxname().empty())
2157 COrgName& orgname = sfbp->bio_src->SetOrg().SetOrgname();
2166 const string& taxname = sfbp->bio_src->GetOrg().GetTaxname();
2169 boolfound =
false;
2170 for(
const auto& descr : bioseq.
GetDescr().
Get()) {
2171 if(! descr->IsSource())
2174 const CBioSource& bio_src = descr->GetSource();
2193 "Taxonomy lookup for organism name \"%s\" failed, and no matching organism exists in OS/ORGANISM lines, so lineage has been set to \"Unclassified\".",
2195p =
"Unclassified";
2197 if(lineage.empty()) {
2200 "Taxonomy lookup for organism name \"%s\" failed, and the matching organism from OS/ORGANISM lines has no lineage, so lineage has been set to \"Unclassified\".",
2202p =
"Unclassified";
2204p = lineage.c_str();
2208 for(
autotsfbp =
next(sfbp); tsfbp != sfbl.end(); ++tsfbp) {
2209 if(tsfbp->lookup || tsfbp->bio_src.Empty() ||
2210! tsfbp->bio_src->IsSetOrg() || ! tsfbp->bio_src->GetOrg().IsSetTaxname() ||
2211! tsfbp->name || *tsfbp->name ==
'\0'||
2212tsfbp->bio_src->GetOrg().GetTaxname().empty() ||
2217 COrgName& torgname = tsfbp->bio_src->SetOrg().SetOrgname();
2239 autotsfbp = sfbl.cbegin();
2240 for(; tsfbp != sfbl.cend(); ++tsfbp)
2243 if(tsfbp == sfbl.cend())
2246name = tsfbp->moltype;
2247 for(ret =
true, tsfbp = sfbl.cbegin(); tsfbp != sfbl.cend(); ++tsfbp) {
2248 if(! tsfbp->moltype) {
2250p = tsfbp->location;
2258}
else if(ret && !
StringEqu(name, tsfbp->moltype))
2276 if(sfbl.empty() || ! ibp)
2282 autosfbp = sfbl.cbegin();
2283 for(envs = 0, sources = 0; sfbp != sfbl.cend(); ++sfbp, sources++) {
2284 boolenv_found =
false;
2285 for(
const auto& cur : sfbp->quals) {
2286 if(cur->IsSetQual() && cur->GetQual() ==
"environmental_sample") {
2296 if(! sfbp->full || ! sfbp->name || sfbp->name[0] ==
'\0')
2310 if(! skip && envs != sources) {
2361 if(ppp.empty() ||
count< 1)
2368 const auto& pp = ppp.front();
2373subs.push_back(sub);
2378subs.push_back(sub);
2380 if(! pp.fwd_name.empty()) {
2384subs.push_back(sub);
2387 if(! pp.rev_name.empty()) {
2391subs.push_back(sub);
2402 for(
const auto& tppp : ppp) {
2403len_fs += (tppp.fwd_seq.size() + 1);
2404len_rs += (tppp.rev_seq.size() + 1);
2405 if(! tppp.fwd_name.empty()) {
2406len_fn += (tppp.fwd_name.size() + 1);
2409 if(! tppp.rev_name.empty()) {
2410len_rn += (tppp.rev_name.size() + 1);
2415str_fs.reserve(len_fs);
2416str_rs.reserve(len_rs);
2418str_fn.reserve(len_fn +
count- num_fn + 1);
2420str_rn.reserve(len_rn +
count- num_rn + 1);
2422 for(
const auto& tppp : ppp) {
2423str_fs.append(
",");
2424str_fs.append(tppp.fwd_seq);
2425str_rs.append(
",");
2426str_rs.append(tppp.rev_seq);
2428str_fn.append(
",");
2429 if(! tppp.fwd_name.empty())
2430str_fn.append(tppp.fwd_name);
2433str_rn.append(
",");
2434 if(! tppp.rev_name.empty())
2435str_rn.append(tppp.rev_name);
2439 if(! str_fs.empty()) {
2447subs.push_back(sub);
2449 if(! str_rs.empty()) {
2457subs.push_back(sub);
2459 if(! str_fn.empty()) {
2466subs.push_back(sub);
2469 if(! str_rn.empty()) {
2476subs.push_back(sub);
2495 boolgot_problem =
false;
2496 autotppp = ppp.before_begin();
2497 autosfbp = sfbl.begin();
2498 for(; sfbp != sfbl.end(); ++sfbp) {
2499 if(sfbp->quals.empty() || sfbp->bio_src.Empty())
2503 for(
const auto& cur : sfbp->quals) {
2504 if(cur->GetQual() !=
"PCR_primers"||
2505! cur->IsSetVal() || cur->GetVal().empty())
2509tppp = ppp.emplace_after(tppp);
2512std::vector<Char> val_buf(cur->GetVal().begin(), cur->GetVal().end());
2513val_buf.push_back(0);
2515 for(comma =
false, bad_start =
false, p = &val_buf[0]; *p !=
'\0';) {
2518 if(p != &val_buf[0]) {
2541 if(
r> q && *(
r- 1) ==
' ')
2551 if(! q || *q ==
'\0')
2559 if(! tppp->fwd_name.empty())
2560tppp->fwd_name +=
':';
2561tppp->fwd_name += q;
2568 if(tppp->fwd_seq.empty())
2571tppp->fwd_seq +=
':';
2574tppp->fwd_name +=
':';
2583 if(! tppp->rev_name.empty())
2584tppp->rev_name +=
':';
2585tppp->rev_name += q;
2592 if(tppp->rev_seq.empty())
2595tppp->rev_seq +=
':';
2598tppp->rev_name +=
':';
2625got_problem =
true;
2631got_problem =
true;
2637got_problem =
true;
2643got_problem =
true;
2649got_problem =
true;
2653 if(tppp->fwd_seq.empty() || tppp->rev_seq.empty()) {
2655got_problem =
true;
2669 if(sfbp == sfbl.end())
2677 const char* Mmm[] = {
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
nullptr};
2697 for(
autosfbp = sfbl.cbegin(); sfbp != sfbl.cend(); ++sfbp) {
2698 if(sfbp->quals.empty() || sfbp->bio_src.Empty())
2701 for(
const auto& cur : sfbp->quals) {
2703 if(cur->GetQual() !=
"collection_date"||
2704! cur->IsSetVal() || cur->GetVal().empty())
2707 val= (
char*)cur->GetVal().c_str();
2712 for(num_slash = 0, p =
val; *p !=
'\0'; p++)
2716 if(num_slash > 1) {
2726 for(
val= (
char*)cur->GetVal().c_str();;) {
2734 for(q =
val; *q ==
'0';)
2736 for(p = (
char*)q; *p !=
'\0'; p++)
2737 if(*p < '0' || *p >
'9')
2743}
else if(
len== 8) {
2744 if(
val[3] !=
'-')
2750 if(p[0] >=
'a'&& p[0] <=
'z')
2752 if(p[1] >=
'A'&& p[1] <=
'Z')
2754 if(p[2] >=
'A'&& p[2] <=
'Z')
2757 for(
b= Mmm, month = 1; *
b;
b++, month++)
2765 for(q =
val+ 4; *q ==
'0';)
2767 for(p = (
char*)q; *p !=
'\0'; p++)
2768 if(*p < '0' || *p >
'9')
2774 if(year > date.
GetYear() ||
2779}
else if(
len== 11) {
2780 if(
val[2] !=
'-'||
val[6] !=
'-')
2786 if(p[0] <
'0'|| p[0] >
'3'|| p[1] <
'0'|| p[1] >
'9')
2794 if(p[0] >=
'a'&& p[0] <=
'z')
2796 if(p[1] >=
'A'&& p[1] <=
'Z')
2798 if(p[2] >=
'A'&& p[2] <=
'Z')
2801 for(
b= Mmm, month = 1; *
b;
b++, month++)
2807 if(day < 1 || day > 31)
2809 else if(month == 2 && day > 29)
2811 else if((month == 4 || month == 6 || month == 9 || month == 11) && day > 30)
2816 for(q =
val+ 7; *q ==
'0';)
2818 for(p = (
char*)q; *p !=
'\0'; p++)
2819 if(*p < '0' || *p >
'9')
2825 if(year > date.
GetYear() ||
2834}
else if(
len== 7 ||
len== 10 ||
len== 14 ||
len== 17 ||
2839 for(p =
val; *p !=
'\0'; p++) {
2840 if((*p < 'a' || *p >
'z') && (*p < 'A' || *p >
'Z') &&
2841(*p < '0' || *p >
'9') && *p !=
'-'&& *p !=
'/'&&
2848 else if(*p ==
'T')
2850 else if(*p ==
'Z')
2853 if(
len== 7 ||
len== 10) {
2865 if((
len== 14 && num_colon > 0) ||
2866(
len== 17 && num_colon > 1) ||
2867(
len== 20 && num_colon > 2))
2886q =
"is not of the format DD-Mmm-YYYY, Mmm-YYYY, or YYYY";
2888q =
"has an illegal day value for the stated month";
2890q =
"has invalid characters";
2892q =
"has too many time values";
2894q =
"has too many Zulu indicators";
2896q =
"has too many hour and minute delimiters";
2898q =
"has not yet occured";
2916 if(sfbl.empty() ||
next(sfbl.cbegin()) == sfbl.cend())
2919 autosfbp = sfbl.cbegin();
2920 for(; sfbp != sfbl.cend(); ++sfbp) {
2932 if(sfbp != sfbl.cend())
2943 boolmetatax =
false;
2944 boolmetalin =
false;
2954 if(! metalin && ! metatax)
2958 if(! taxname || taxname[0] == 0)
2959taxname =
"unknown";
2961 if(metalin && metatax) {
2966}
else if(! metalin)
2986 autotsfbp = sfbl.cbegin();
2987 for(; tsfbp != sfbl.cend(); ++tsfbp) {
2989 if(! tsfbp->submitter_seqid)
2993 if(tsfbp->submitter_seqid[0] ==
'\0') {
2999ssid = tsfbp->submitter_seqid;
3000 else if(!
StringEqu(ssid, tsfbp->submitter_seqid)) {
3006 if(tsfbp != sfbl.cend())
3009 if(count_feat == count_qual)
3098mml.emplace_front();
3129 FtaErrPost(sev,
ERR_SOURCE_TransSingleOrgName,
"Use of /transgenic requires at least two source features with differences among /organism, /strain, /organelle, and /isolate, between the host and foreign organisms.");
3130}
else if(
i> 0) {
3134}
else if(
i== 2) {
3136}
else if(
i== 3) {
3162}
else if(
i== 2) {
3189 for(
autotsfbp = sfbl.cbegin(); tsfbp != sfbl.cend(); ++tsfbp)
3205 if(sfbl.front().lookup ==
false)
3208 if(sfbl.front().focus)
3209sfbl.front().bio_src->SetIs_focus();
3211sfbl.front().bio_src->ResetIs_focus();
3213 autotsfbp = sfbl.begin();
3214 for(; tsfbp != sfbl.end(); ++tsfbp) {
3218feat->
SetData().SetBiosrc(*tsfbp->bio_src);
3222 GetSeqLocation(*feat, tsfbp->location, seqid, &err, pp,
"source");
3229 if(! tsfbp->quals.empty()) {
3239seq_feats.push_back(feat);
3242 if(tsfbp != sfbl.end())
bool fta_strings_same(const char *s1, const char *s2)
void ShrinkSpaces(char *line)
void fta_sort_biosource(objects::CBioSource &bio)
const COrgName & GetOrgname(void) const
bool IsSetOrgname(void) const
static bool WasValid(const string &country)
static bool IsValid(const string &country)
@OrgMod.hpp User-defined methods of the data storage class.
bool IsSetOrgMod(void) const
namespace ncbi::objects::
#define ERR_SOURCE_InconsistentMolType
#define ERR_SOURCE_MissingMolType
#define ERR_SOURCE_FocusAndTransposonNotAllowed
#define ERR_SOURCE_ExcessCoverage
#define ERR_SOURCE_IncompleteCoverage
#define ERR_SOURCE_InvalidDbXref
#define ERR_SOURCE_TransSingleOrgName
#define ERR_QUALIFIER_PCRprimerEmbeddedComma
#define ERR_SOURCE_OrganelleQualMultToks
#define ERR_SOURCE_UnwantedQualifiers
#define ERR_SOURCE_PartialLocation
#define ERR_SOURCE_DifferentSubmitterSeqids
#define ERR_SOURCE_FormerCountry
#define ERR_SOURCE_OrganismIncomplete
#define ERR_SOURCE_MultipleOrganismWithFocus
#define ERR_SOURCE_UnusualOrgName
#define ERR_ORGANISM_UnclassifiedLineage
#define ERR_SERVER_NoLineageFromTaxon
#define ERR_SOURCE_MissingSourceFeatureForDescr
#define ERR_SOURCE_MissingEnvSampQual
#define ERR_DIVISION_TGNnotTransgenic
#define ERR_SOURCE_MultipleSubmitterSeqids
#define ERR_ORGANISM_OrgNameLacksMetagenome
#define ERR_SOURCE_ManySourceFeats
#define ERR_SOURCE_FocusQualMissing
#define ERR_SOURCE_InvalidCollectionDate
#define ERR_SOURCE_UnusualLocation
#define ERR_DIVISION_TransgenicNotSYN_TGN
#define ERR_QUALIFIER_InvalidPCRprimer
#define ERR_SOURCE_LackingSubmitterSeqids
#define ERR_SOURCE_OrganelleIllegalClass
#define ERR_SOURCE_MultipleMolTypes
#define ERR_SOURCE_BadLocation
#define ERR_SOURCE_FocusQualNotFullLength
#define ERR_SOURCE_MultiOrgOverlap
#define ERR_FEATURE_Dropped
#define ERR_SOURCE_MultipleTransgenicQuals
#define ERR_SOURCE_InconsistentEnvSampQual
#define ERR_ORGANISM_SynOrgNameNotSYNdivision
#define ERR_QUALIFIER_MissingPCRprimerSeq
#define ERR_SOURCE_FocusQualNotNeeded
#define ERR_SOURCE_PartialQualifier
#define ERR_SOURCE_FocusAndTransgenicQuals
#define ERR_ORGANISM_NoSourceFeatMatch
#define ERR_SOURCE_TransgenicTooShort
#define ERR_ORGANISM_LineageLacksMetagenome
#define ERR_SOURCE_ObsoleteDbXref
#define ERR_SOURCE_InvalidLocation
#define ERR_SOURCE_FeatureMissing
#define ERR_SOURCE_SingleSourceTooShort
#define ERR_SOURCE_InvalidCountry
#define ERR_SOURCE_NoOrganismQual
forward_list< PcrPrimers > PcrPrimersList
static void RemoveSourceFeatSpaces(SourceFeatBlkList &sfbl)
static bool CheckMoltypeConsistency(const SourceFeatBlkList &sfbl, string &moltype)
static void FTASubSourceAdd(CBioSource &bio, const Char *val, CSubSource::ESubtype type)
static void SourceFeatRemoveDups(SourceFeatBlkList &sfbl)
static void CheckCollectionDate(const SourceFeatBlkList &sfbl, Parser::ESource source)
static void PopulateSubNames(string &namstr, const Char *name, const Char *value, COrgMod::ESubtype subtype, TOrgModList &mods)
static const char * GenomicSourceFeatQual[]
static const char * OrganelleFirstToken[]
static Int4 CheckFocusInOrgs(const SourceFeatBlkList &sfbl, size_t len, int *status)
static const char * unusual_toks[]
static const char * special_orgs[]
static void CheckQualsInSourceFeat(CBioSource &bio, TQualVector &quals, Uint1 taxserver)
static const char * SourceSubSources[]
static const char * DENLRSourceDbxrefTag[]
#define USE_SPECIMEN_VOUCHER
static void PropagateSuppliedLineage(const CBioseq &bioseq, SourceFeatBlkList &sfbl, Uint1 taxserver)
static void PickTheDescrSource(SourceFeatBlkList &sfbl)
static const char * NullTermValues[]
static void CheckMetagenome(CBioSource &bio)
static Int4 CheckTransgenicSourceFeats(const SourceFeatBlkList &sfbl)
static void SourceFeatDerive(SourceFeatBlkList &sfbl, SourceFeatBlkList::iterator res)
static bool CompareDescrFeatSources(const SourceFeatBlkList &sfbl, const CBioseq &bioseq, const string &source)
static const char * NLRSourceDbxrefTag[]
static void CollectSubNames(SourceFeatBlk &sfbp, Int4 use_what, const Char *name, const Char *cultivar, const Char *isolate, const Char *serotype, const Char *serovar, const Char *specimen_voucher, const Char *strain, const Char *sub_species, const Char *sub_strain, const Char *variety, const Char *ecotype)
static bool CheckSubmitterSeqidQuals(const SourceFeatBlkList &sfbl, char *acc)
#define BIOSOURCES_THRESHOLD
static const char * exempt_quals[]
static const char * SourceBadQuals[]
static const char * source_genomes[]
static bool UpdateRawBioSource(SourceFeatBlkList &sfbl, Parser::ESource source, IndexblkPtr ibp, Uint1 taxserver)
static bool ParsePcrPrimers(SourceFeatBlkList &sfbl)
static bool CheckSourceFeatLocFuzz(const SourceFeatBlkList &sfbl)
static SourceFeatBlkList CollectSourceFeats(DataBlkCIter dbp, DataBlkCIter dbp_end, Int2 type)
static void SourceFeatMoveOneUp(SourceFeatBlkList &sfbl, SourceFeatBlkList::iterator what)
static const char * ObsoleteSourceDbxrefTag[]
static void PopulatePcrPrimers(CBioSource &bio, PcrPrimersList &ppp, Int4 count)
static bool CheckNeedSYNFocus(const SourceFeatBlkList &sfbl)
static const char * DESourceDbxrefTag[]
static const CharUInt1 SourceOrgMods[]
static void CheckForExemption(SourceFeatBlkList &sfbl)
static char * CheckPcrPrimersTag(char *str)
static char * CheckForUnusualFullLengthOrgs(const SourceFeatBlkList &sfbl)
static bool IfSpecialFeat(const MinMax &mmp, size_t len)
static void CreateRawBioSources(ParserPtr pp, SourceFeatBlkList &sfbl, Int4 use_what)
static char * CheckSourceFeatFocusAndTransposon(const SourceFeatBlkList &sfbl)
static const char * ESourceDbxrefTag[]
static char * CheckSourceFeatLocAccs(const SourceFeatBlkList &sfbl, char *acc)
bool fta_if_special_org(const Char *name)
static bool CheckForENV(const SourceFeatBlkList &sfbl, IndexblkPtr ibp, Parser::ESource source)
forward_list< MinMax > MinMaxList
forward_list< SourceFeatBlk > SourceFeatBlkList
static void RemoveStringSpaces(char *line)
static bool is_a_space_char(Char c)
static bool SourceFeatStructFillIn(IndexblkPtr ibp, SourceFeatBlkList &sfbl, Int4 use_what)
static bool CheckSYNTGNDivision(const SourceFeatBlkList &sfbl, char *div)
static CRef< CDbtag > GetSourceDbtag(CRef< CGb_qual > &qual, Parser::ESource source)
static Int4 CheckSourceFeatCoverage(SourceFeatBlkList &sfbl, MinMaxList &mml, size_t len)
static void AddOrgMod(COrg_ref &org_ref, const Char *val, COrgMod::ESubtype type)
static bool CheckSourceLineage(const SourceFeatBlkList &sfbl, Parser::ESource source, bool is_pat)
static char * CheckWholeSourcesVersusFocused(const SourceFeatBlkList &sfbl)
static char * CheckSourceOverlap(const MinMaxList &mml, size_t len)
void ParseSourceFeat(ParserPtr pp, DataBlkCIter dbp, DataBlkCIter dbp_end, const CSeq_id &seqid, Int2 type, const CBioseq &bioseq, const string &source, TSeqFeatList &seq_feats)
static char * CheckSourceFeatOrgs(const SourceFeatBlkList &sfbl, int *status)
std::list< CRef< objects::COrgMod > > TOrgModList
std::list< CRef< objects::CSeq_feat > > TSeqFeatList
TDataBlkList::const_iterator DataBlkCIter
int fta_atoi(string_view sv)
bool fta_StartsWith(const char *s1, string_view s2)
bool StringEquN(const char *s1, const char *s2, size_t n)
bool StringEqu(const char *s1, const char *s2)
size_t StringLen(const char *s)
#define FtaErrPost(sev, level,...)
void fta_fix_orgref(ParserPtr pp, COrg_ref &org_ref, bool *drop, char *organelle)
static DLIST_TYPE *DLIST_NAME() prev(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
static DLIST_TYPE *DLIST_NAME() next(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
static const char * str(char *buf, int n)
static const char location[]
#define TAX_ID_FROM(T, value)
virtual void Assign(const CSerialObject &source, ESerialRecursionMode how=eRecursive)
Set object to copy of another one.
virtual bool Equals(const CSerialObject &object, ESerialRecursionMode how=eRecursive) const
Check if both objects contain the same values.
void Reset(void)
Reset reference object.
bool NotEmpty(void) const THROWS_NONE
Check if CRef is not empty â pointing to an object and has a non-null value.
bool Empty(void) const THROWS_NONE
Check if CRef is empty â not pointing to any object, which means having a null value.
uint8_t Uint1
1-byte (8-bit) unsigned integer
int16_t Int2
2-byte (16-bit) signed integer
int32_t Int4
4-byte (32-bit) signed integer
char Char
Alias for char.
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
static int StringToInt(const CTempString str, TStringToNumFlags flags=0, int base=10)
Convert string to int.
static bool StartsWith(const CTempString str, const CTempString start, ECase use_case=eCase)
Check if a string starts with a specified prefix value.
static bool EqualNocase(const CTempString s1, SIZE_TYPE pos, SIZE_TYPE n, const char *s2)
Case-insensitive equality of a substring with another string.
@ fConvErr_NoThrow
Do not throw an exception on error.
@ eNocase
Case insensitive compare.
@ eCurrent
Use current time. See also CCurrentTime.
const TSubtype & GetSubtype(void) const
Get the Subtype member data.
void SetSubtype(TSubtype value)
Assign a value to Subtype data member.
bool IsSetOrg(void) const
Check if a value has been assigned to Org data member.
bool CanGetOrg(void) const
Check if it is safe to call GetOrg method.
list< CRef< CSubSource > > TSubtype
void SetOrigin(TOrigin value)
Assign a value to Origin data member.
const TOrg & GetOrg(void) const
Get the Org member data.
void SetGenome(TGenome value)
Assign a value to Genome data member.
void SetOrg(TOrg &value)
Assign a value to Org data member.
void SetName(const TName &value)
Assign a value to Name data member.
EGenome
biological context
TSubtype & SetSubtype(void)
Assign a value to Subtype data member.
@ eSubtype_fwd_primer_seq
sequence (possibly more than one; semicolon-separated)
@ eSubtype_rev_primer_name
@ eSubtype_fwd_primer_name
@ eSubtype_rev_primer_seq
sequence (possibly more than one; semicolon-separated)
@ eOrigin_artificial
artificially engineered
TYear GetYear(void) const
Get the Year member data.
TMonth GetMonth(void) const
Get the Month member data.
TDay GetDay(void) const
Get the Day member data.
const TMod & GetMod(void) const
Get the Mod member data.
bool CanGetMod(void) const
Check if it is safe to call GetMod method.
const TLineage & GetLineage(void) const
Get the Lineage member data.
bool CanGetDiv(void) const
Check if it is safe to call GetDiv method.
const TDiv & GetDiv(void) const
Get the Div member data.
void ResetLineage(void)
Reset Lineage data member.
bool IsSetCommon(void) const
common name Check if a value has been assigned to Common data member.
bool IsSetLineage(void) const
lineage with semicolon separators Check if a value has been assigned to Lineage data member.
const TTaxname & GetTaxname(void) const
Get the Taxname member data.
const TCommon & GetCommon(void) const
Get the Common member data.
bool CanGetTaxname(void) const
Check if it is safe to call GetTaxname method.
void SetTaxname(const TTaxname &value)
Assign a value to Taxname data member.
bool CanGetOrgname(void) const
Check if it is safe to call GetOrgname method.
bool IsSetOrgname(void) const
Check if a value has been assigned to Orgname data member.
bool IsSetTaxname(void) const
preferred formal name Check if a value has been assigned to Taxname data member.
TMod & SetMod(void)
Assign a value to Mod data member.
void SetOrgname(TOrgname &value)
Assign a value to Orgname data member.
void SetLineage(const TLineage &value)
Assign a value to Lineage data member.
const TOrgname & GetOrgname(void) const
Get the Orgname member data.
@ eSubtype_nat_host
natural host of this specimen
@ eSubtype_metagenome_source
@ eSubtype_specimen_voucher
@ eSubtype_culture_collection
const TVal & GetVal(void) const
Get the Val member data.
void SetData(TData &value)
Assign a value to Data data member.
void SetExp_ev(TExp_ev value)
Assign a value to Exp_ev data member.
void SetVal(const TVal &value)
Assign a value to Val data member.
const TQual & GetQual(void) const
Get the Qual member data.
@ eExp_ev_experimental
any reasonable experimental check
@ eExp_ev_not_experimental
similarity, pattern, etc
const Tdata & Get(void) const
Get the member data.
bool IsSetDescr(void) const
descriptors Check if a value has been assigned to Descr data member.
const TDescr & GetDescr(void) const
Get the Descr member data.
where boath are integers</td > n< td ></td > n</tr > n< tr > n< td > tse</td > n< td > optional</td > n< td > String</td > n< td class=\"description\"> TSE option controls what blob is whole
bool GetSeqLocation(CSeq_feat &feat, string_view location, const CSeq_id &seqid, bool *hard_err, ParserPtr pp, string_view name)
constexpr bool empty(list< Ts... >) noexcept
const GenericPointer< typename T::ValueType > T2 value
const CharType(& source)[N]
double r(size_t dimension_, const Int4 *score_, const double *prob_, double theta_)
optional< string > location
MinMax(const char *o, Int4 i, Int4 x, bool s)
vector< IndexblkPtr > entrylist
CBioSource::EGenome genome
CRef< CBioSource > bio_src
optional< string > GetTheQualValue(TQualVector &qlist, const Char *qual)
Int2 StringMatchIcase(const Char **array, string_view text)
Int2 MatchArrayString(const char **array, string_view text)
Char * StringIStr(const Char *where, const Char *what)
std::vector< CRef< objects::CGb_qual > > TQualVector
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4