61 #define NCBI_USE_ERRCODE_X Objtools_Validator
66 using namespace sequence;
79 m_ValuesToTry.clear();
80 m_RepliesProcessed = 0;
94 m_Feats.push_back(feat);
100 for (
const string& it : m_ValuesToTry) {
103 request_list.push_back(rq);
110 for (
const string& it : m_ValuesToTry) {
121 vector<TTaxError> errs;
123 for (
const auto& e : errs) {
124 for (
const auto& it : m_Descs) {
125 imp.
PostObjErr(e.severity, e.err_type, e.err_msg, *(it.first), it.second);
127 for (
const auto& it : m_Feats) {
128 imp.
PostObjErr(e.severity, e.err_type, e.err_msg, *it);
137 m_Response(eUnrecognized),
222 "Suspect Host Value - a prokaryote, fungus or virus is suspect as a host for a plant or animal" });
243 bool has_number =
false;
244 bool has_letter =
false;
245 for (
char ch :
str) {
254 if (!has_number || !has_letter) {
277 for (
char ch : strain) {
297 return taxname.substr(0, taxname.length() - 3) + strain;
339 if (it->IsSetSubtype() && it->IsSetSubname() &&
352 "Strain '" +
m_Strain +
"' contains taxonomic name information" });
396 if (mod_it->IsSetSubtype()
398 && mod_it->IsSetSubname()) {
399 string qual = mod_it->GetSubname();
407 find->second->AddParent(desc,
ctx);
429 if (mod_it->IsSetSubtype()
431 && mod_it->IsSetSubname()) {
432 string qual = mod_it->GetSubname();
440 find->second->AddParent(feat);
457 if (mod_it->IsSetSubtype()
459 && mod_it->IsSetSubname()) {
460 string qual = mod_it->GetSubname();
489 vector<CRef<COrg_ref> > org_rq_list;
491 for (
auto& it :
m_Map) {
492 it.second->AddRequests(org_rq_list);
501 if (map_it !=
m_Map.
end() && map_it->second->NumRemainingReplies() > 0) {
506 if (map_it->second->MatchTryValue(
val) && map_it->second->NumRemainingReplies() > 0) {
517 string error_message;
518 CTaxon3_reply::TReply::const_iterator reply_it = reply.
GetReply().begin();
519 vector<CRef<COrg_ref> >::const_iterator rq_it =
input.begin();
521 while (reply_it != reply.
GetReply().end() && rq_it !=
input.end()) {
524 error_message =
"Unexpected taxonomy response for " + (*rq_it)->GetTaxname();
525 return error_message;
527 map_it->second->AddReply(**reply_it);
532 if (reply_it != reply.
GetReply().end()) {
543 for (
const auto& rq_it :
m_Map) {
544 if (rq_it.second->NumRemainingReplies() > 0) {
555 for (
auto& rq_it :
m_Map) {
556 rq_it.second->PostErrors(imp);
565 for (
const auto& rq_it :
m_Map) {
566 rq_it.second->ListErrors(errs);
592 string adjusted = host_val;
606 bool changed =
false;
608 for (
auto& m : org_ref.
SetOrgname().SetMod()) {
609 if (m->IsSetSubtype() &&
619 m->SetSubname(new_val);
642 return m_taxon3->SendOrgRefList(list);
648 : m_tax_func(tax_func)
681 if ((*it)->IsSource() && (*it)->GetSource().IsSetOrg()) {
695 if ((*feat_it)->IsSetData() && (*feat_it)->GetData().IsBiosrc()
696 && (*feat_it)->GetData().GetBiosrc().IsSetOrg()) {
698 feat.
Reset(*feat_it);
717 vector< CRef<COrg_ref> > org_rq_list;
720 vector<CConstRef<CSeqdesc> >::const_iterator desc_it =
m_SrcDescs.cbegin();
721 vector<CConstRef<CSeq_entry> >::const_iterator ctx_it =
m_DescCtxs.cbegin();
724 const COrg_ref& org = (*desc_it)->GetSource().GetOrg();
726 org_rq_list.push_back(rq);
733 vector<CConstRef<CSeq_feat> >::const_iterator feat_it =
m_SrcFeats.cbegin();
736 const COrg_ref& org = (*feat_it)->GetData().GetBiosrc().GetOrg();
738 org_rq_list.push_back(rq);
748 const string err_str =
error.IsSetMessage() ?
error.GetMessage() :
"?";
751 string msg =
"Organism not found in taxonomy database";
752 if (
error.IsSetOrg() &&
error.GetOrg().IsSetTaxname() &&
756 msg +=
" (suggested:" +
error.GetOrg().GetTaxname() +
")";
759 }
else if (
NStr::StartsWith(err_str,
"Organism not found. Possible matches")) {
765 "Taxonomy lookup failed with message '" + err_str +
"'"});
768 "Taxonomy lookup failed with message '" + err_str +
"'" });
778 }
else if (reply.
IsData()) {
779 bool is_species_level =
true;
780 bool is_unidentified =
false;
781 bool force_consult =
false;
782 bool has_nucleomorphs =
false;
783 bool is_cyanobacteria =
false;
784 bool has_metagenome_source =
false;
789 const string& taxname_rep = orp_rep.
GetTaxname();
791 is_unidentified =
true;
798 "Organism name is '" + taxname_req
805 if (it->IsSetSubtype() && it->IsSetSubname() &&
807 has_metagenome_source =
true;
814 is_cyanobacteria =
true;
819 if (!is_species_level && !is_wp) {
821 "Taxonomy lookup reports is_species_level FALSE"});
824 if (is_insd_patent && is_unidentified) {
825 force_consult =
false;
827 if (is_cyanobacteria && has_metagenome_source) {
828 force_consult =
false;
833 "Taxonomy lookup reports taxonomy consultation needed"});
836 && !has_nucleomorphs) {
838 "Taxonomy lookup does not have expected nucleomorph flag"});
842 "Taxonomy lookup does not have expected plastid flag"});
850 bool is_insd_patent)
const
852 CTaxon3_reply::TReply::const_iterator reply_it = reply.
GetReply().begin();
855 vector<CConstRef<CSeqdesc> >::const_iterator desc_it =
m_SrcDescs.cbegin();
856 vector<CConstRef<CSeq_entry> >::const_iterator ctx_it =
m_DescCtxs.cbegin();
858 while (reply_it != reply.
GetReply().end()
861 vector<TTaxError> errs;
862 const COrg_ref& orp_req = (*desc_it)->GetSource().GetOrg();
865 is_insd_patent, imp.
IsWP(), errs);
867 imp.
PostObjErr(e.severity, e.err_type, e.err_msg, **desc_it, *ctx_it);
874 vector<CConstRef<CSeq_feat> >::const_iterator feat_it =
m_SrcFeats.cbegin();
875 while (reply_it != reply.
GetReply().cend()
877 vector<TTaxError> errs;
878 const COrg_ref& orp_req = (*feat_it)->GetData().GetBiosrc().GetOrg();
881 is_insd_patent, imp.
IsWP(), errs);
883 imp.
PostErr(e.severity, e.err_type, e.err_msg,* *feat_it);
899 CTaxon3_reply::TReply::const_iterator reply_it = reply.
GetReply().begin();
902 vector<CConstRef<CSeqdesc> >::const_iterator desc_it =
m_SrcDescs.cbegin();
903 vector<CConstRef<CSeq_entry> >::const_iterator ctx_it =
m_DescCtxs.cbegin();
914 while (reply_it != reply.
GetReply().end()
917 vector<TTaxError> errs;
918 const COrg_ref& orp_req = (*desc_it)->GetSource().GetOrg();
921 is_insd_patent, imp.
IsWP(), errs);
923 imp.
PostObjErr(e.severity, e.err_type, e.err_msg, **desc_it, *ctx_it);
930 if (reply_it == reply.
GetReply().end()) {
934 vector<CConstRef<CSeq_feat> >::const_iterator feat_it =
m_SrcFeats.cbegin();
939 while (reply_it != reply.
GetReply().cend() &&
941 vector<TTaxError> errs;
942 const COrg_ref& orp_req = (*feat_it)->GetData().GetBiosrc().GetOrg();
945 is_insd_patent, imp.
IsWP(), errs);
947 imp.
PostErr(e.severity, e.err_type, e.err_msg, **feat_it);
960 string& error_message,
961 bool use_error_orgrefs)
const
963 bool changed =
false;
964 CTaxon3_reply::TReply::const_iterator reply_it = reply.
GetReply().begin();
965 vector<CRef<COrg_ref> >::iterator org_it = org_refs.begin();
966 while (reply_it != reply.
GetReply().end() && org_it != org_refs.end()) {
968 if ((*reply_it)->IsData() &&
969 (*reply_it)->GetData().IsSetOrg()) {
971 cpy->
Assign((*reply_it)->GetData().GetOrg());
972 }
else if (use_error_orgrefs &&
973 (*reply_it)->IsError() &&
974 (*reply_it)->GetError().IsSetOrg() &&
975 (*reply_it)->GetError().GetOrg().IsSetTaxname() &&
976 !
NStr::Equal((*reply_it)->GetError().GetOrg().GetTaxname(),
"Not valid")) {
978 cpy->
Assign((*reply_it)->GetError().GetOrg());
982 if (!cpy->
Equals(**org_it)) {
983 (*org_it)->Assign(*cpy);
990 if (reply_it != reply.
GetReply().end()) {
991 error_message =
"More taxonomy replies than requests!";
992 }
else if (org_it != org_refs.end()) {
993 error_message =
"Not enough taxonomy replies!";
1029 vector<CConstRef<CSeqdesc> >::const_iterator desc_it =
m_SrcDescs.begin();
1030 vector<CConstRef<CSeq_entry> >::const_iterator ctx_it =
m_DescCtxs.begin();
1032 lookup.AddDesc(*desc_it, *ctx_it);
1037 vector<CConstRef<CSeq_feat> >::const_iterator feat_it =
m_SrcFeats.begin();
1039 lookup.AddFeat(*feat_it);
1062 string error_message;
1094 bool changed =
false;
1095 for (
auto org = org_refs.begin(); org != org_refs.end(); org++) {
1110 if (map_it->second.MatchTryValue(
val) && map_it->second.NumRemainingReplies() > 0) {
1122 string error_message;
1131 return error_message;
1151 CTaxon3_reply::TReply::const_iterator reply_it = reply.
GetReply().begin();
1154 while (rq_it->second.NumRemainingReplies() > 0 && reply_it != reply.
GetReply().end()) {
1155 rq_it->second.AddReply(**reply_it);
1158 if (rq_it->second.NumRemainingReplies() > 0) {
1159 error_message =
"Failed to respond to all taxonomy requests for specific host";
1165 if (reply_it != reply.
GetReply().end()) {
1166 error_message =
"Unexpected taxonomy responses for specific host";
1178 bool changed =
false;
1180 for (
auto& m : org_ref.
SetOrgname().SetMod()) {
1181 if (m->IsSetSubtype() &&
1183 m->IsSetSubname()) {
1187 const string& new_val = it->second.SuggestFix();
1189 m->SetSubname(new_val);
1202 string adjusted = host_val;
1240 if (original_orgs.empty())
1245 vector< CRef<COrg_ref> > edited_orgs;
1248 while (
i < original_orgs.size())
1251 vector< CRef<COrg_ref> > tmp_original_orgs(original_orgs.begin() +
i, original_orgs.begin() +
i +
len);
1252 vector< CRef<COrg_ref> > tmp_edited_orgs;
1257 tmp_edited_orgs.push_back(cpy);
1260 string error_message;
1268 edited_orgs.insert(edited_orgs.end(), tmp_edited_orgs.begin(), tmp_edited_orgs.end());
1275 while (
i < spec_host_rq.size())
1278 vector< CRef<COrg_ref> > tmp_spec_host_rq(spec_host_rq.begin() +
i, spec_host_rq.begin() +
i +
len);
1295 size_t num_updated_descs = 0;
1296 for (
size_t n = 0;
n < num_descs;
n++) {
1297 if (!original_orgs[
n]->
Equals(*(edited_orgs[
n]))) {
1299 orig->SetSource().SetOrg().Assign(*(edited_orgs[
n]));
1300 num_updated_descs++;
1305 size_t num_updated_feats = 0;
1307 if (!original_orgs[
n + num_descs]->
Equals(*edited_orgs[
n + num_descs])) {
1311 new_feat->
SetData().SetBiosrc().SetOrg().Assign(*(edited_orgs[
n + num_descs]));
1316 num_updated_feats++;
1319 return (num_updated_descs > 0 || num_updated_feats > 0);
1337 if (spec_host_rq.empty()) {
1341 vector< CRef<COrg_ref> > edited;
1347 if (!tmp_spec_host_reply->IsSetReply() || !tmp_spec_host_reply->GetReply().front()->IsData()) {
1363 val = edited.front()->GetOrgname().GetMod().front()->GetSubname();
1379 if (spec_host_rq.empty()) {
1387 if (tmp_spec_host_reply) {
1390 err_msg =
"Connection to taxonomy failed";
1393 error_msg = err_msg;
1400 vector<TTaxError> errs;
1402 if (errs.size() > 0) {
1403 error_msg = errs.front().err_msg;
1417 vector<TTaxError> errs;
1420 vector< CRef<COrg_ref> > org_rq_list;
1423 org_rq_list.push_back(rq);
1427 if (!reply || !reply->IsSetReply()) {
1429 "Taxonomy service connection failure", org);
1432 false,
false, errs);
1439 if (!org_rq_list.empty()) {
1445 err_msg =
"Connection to taxonomy failed";
1458 if (!org_rq_list.empty()) {
1469 imp.
PostObjErr(e.severity, e.err_type, e.err_msg, org);
@ eErr_SEQ_DESCR_TaxonomyConsultRequired
@ eErr_SEQ_DESCR_TaxonomyServiceProblem
@ eErr_SEQ_DESCR_TaxonomyNucleomorphProblem
@ eErr_SEQ_DESCR_TaxonomyPlastidsProblem
@ eErr_SEQ_DESCR_StrainContainsTaxInfo
@ eErr_SEQ_DESCR_OrganismNotFound
@ eErr_SEQ_DESCR_AmbiguousSpecificHost
@ eErr_SEQ_DESCR_TaxonomyAmbiguousName
@ eErr_SEQ_DESCR_TaxonomyLookupProblem
@ eErr_SEQ_DESCR_BadSpecificHost
@ eErr_SEQ_DESCR_TaxonomyIsSpeciesProblem
static int lookup(const char *name, const struct lookup_int *table)
@OrgMod.hpp User-defined methods of the data storage class.
static string FixHost(const string &value)
static string GetSubtypeName(TSubtype stype, EVocabulary vocabulary=eVocabulary_raw)
const string & GetLineage(void) const
bool IsSetOrgMod(void) const
bool IsSetLineage(void) const
TQualifierRequests::iterator x_FindRequest(const string &val)
string IncrementalUpdate(const vector< CRef< COrg_ref > > &input, const CTaxon3_reply &reply)
virtual CRef< CQualifierRequest > x_MakeNewRequest(const string &orig_val, const COrg_ref &org)=0
virtual void ListErrors(vector< TTaxError > &errs) const
void AddDesc(CConstRef< CSeqdesc > desc, CConstRef< CSeq_entry > ctx)
void AddOrg(const COrg_ref &org)
virtual bool Check(const COrg_ref &) const
void AddFeat(CConstRef< CSeq_feat > feat)
virtual string GetKey(const string &orig_val, const COrg_ref &org) const =0
void AddString(const string &val)
COrgMod::ESubtype m_Subtype
bool IsUpdateComplete() const
void PostErrors(CValidError_imp &imp)
vector< CRef< COrg_ref > > GetRequestList()
bool MatchTryValue(const string &val) const
pair< CConstRef< CSeqdesc >, CConstRef< CSeq_entry > > TDescPair
vector< string > m_ValuesToTry
size_t m_RepliesProcessed
void PostErrors(CValidError_imp &imp)
void AddParent(CConstRef< CSeqdesc > desc, CConstRef< CSeq_entry > ctx)
void AddRequests(vector< CRef< COrg_ref > > &request_list) const
namespace ncbi::objects::
CRef< CQualifierRequest > x_MakeNewRequest(const string &orig_val, const COrg_ref &org) override
bool ApplyToOrg(COrg_ref &org) const override
static string x_DefaultSpecificHostAdjustments(const string &host_val)
CRef< CQualifierRequest > x_MakeNewRequest(const string &orig_val, const COrg_ref &org) override
void ListErrors(vector< TTaxError > &errs) const override
CSpecificHostRequest(const string &orig_val, const COrg_ref &org, bool for_fix=false)
const string & SuggestFix() const
void AddReply(const CT3Reply &reply) override
TResponseFlags m_Response
CRef< CQualifierRequest > x_MakeNewRequest(const string &orig_val, const COrg_ref &org) override
static bool Check(const COrg_ref &org)
static string MakeKey(const string &strain, const string &taxname)
void ListErrors(vector< TTaxError > &errs) const override
static bool x_IgnoreStrain(const string &str)
void AddReply(const CT3Reply &reply) override
static bool x_IsUnwanted(const string &str)
CStrainRequest(const string &strain, const COrg_ref &org)
static bool RequireTaxname(const string &taxname)
void GetTaxFlags(bool &is_species_level, bool &force_consult, bool &has_nucleomorphs) const
bool HasPlastids(void) const
void x_InterpretTaxonomyError(const CT3Error &error, const COrg_ref &org, const EErrType type, vector< TTaxError > &errs) const
CConstRef< CSeq_feat > GetFeat(size_t num) const
vector< CConstRef< CSeq_feat > > m_SrcFeats
vector< CConstRef< CSeq_entry > > m_DescCtxs
static string x_DefaultSpecificHostAdjustments(const string &host_val)
vector< CRef< COrg_ref > > GetTaxonomyLookupRequest() const
void ReportSpecificHostErrors(const CTaxon3_reply &reply, CValidError_imp &imp)
string IncrementalStrainMapUpdate(const vector< CRef< COrg_ref > > &input, const CTaxon3_reply &reply)
CConstRef< CSeq_entry > GetSeqContext(size_t num) const
void FixOneSpecificHost(string &val)
void x_UpdateSpecificHostMapWithReply(const CTaxon3_reply &reply, string &error_message)
TSpecificHostRequests m_SpecificHostRequests
TSpecificHostRequests::iterator x_FindHostFixRequest(const string &val)
CSpecificHostMapForFix m_HostMapForFix
void x_CreateQualifierMap(CQualLookupMap &lookup)
bool m_SpecificHostRequestsBuilt
void ListTaxLookupErrors(const CT3Reply &reply, const COrg_ref &org, CBioSource::TGenome genome, bool is_insd_patent, bool is_wp, vector< TTaxError > &errs) const
void ReportIncrementalTaxLookupErrors(const CTaxon3_reply &reply, CValidError_imp &imp, bool is_insd_patent, size_t offset) const
bool AdjustOrgRefsForSpecificHosts(vector< CRef< COrg_ref > > org_refs)
vector< CConstRef< CSeqdesc > > m_SrcDescs
bool IsSpecificHostMapUpdateComplete() const
CConstRef< CSeqdesc > GetDesc(size_t num) const
CTaxValidationAndCleanup()
bool IsStrainMapUpdateComplete() const
bool x_ApplySpecificHostMap(COrg_ref &org_ref) const
bool AdjustOrgRefsWithSpecificHostReply(vector< CRef< COrg_ref >> requests, const CTaxon3_reply &reply, vector< CRef< COrg_ref >> org_refs)
CSpecificHostMap m_HostMap
void ReportTaxLookupErrors(const CTaxon3_reply &reply, CValidError_imp &imp, bool is_insd_patent) const
void CheckOneOrg(const COrg_ref &org, CBioSource::TGenome genome, CValidError_imp &imp)
taxupdate_func_t m_tax_func
bool AdjustOrgRefsWithTaxLookupReply(const CTaxon3_reply &reply, vector< CRef< COrg_ref > > org_refs, string &error_message, bool use_error_orgrefs=false) const
vector< CRef< COrg_ref > > GetStrainLookupRequest()
string IncrementalSpecificHostMapUpdate(const vector< CRef< COrg_ref > > &input, const CTaxon3_reply &reply)
bool DoTaxonomyUpdate(CSeq_entry_Handle seh, bool with_host)
unique_ptr< ITaxon3 > m_taxon3
CConstRef< CSeq_entry > GetTopReportObject() const
void ReportStrainErrors(CValidError_imp &imp)
vector< CRef< COrg_ref > > GetSpecificHostLookupRequest(bool for_fix)
void Init(const CSeq_entry &se)
bool IsOneSpecificHostValid(const string &val, string &err_msg)
void x_GatherSources(const CSeq_entry &se)
bool m_SpecificHostRequestsUpdated
bool m_StrainRequestsBuilt
void PostErr(EDiagSev sv, EErrType et, const string &msg, const CSerialObject &obj)
void PostObjErr(EDiagSev sv, EErrType et, const string &msg, const CSerialObject &obj, const CSeq_entry *ctx=nullptr)
container_type::const_iterator const_iterator
container_type::iterator iterator
const_iterator begin() const
const_iterator end() const
const_iterator find(const key_type &key) const
static const int chunk_size
Include a standard set of the NCBI C++ Toolkit most basic headers.
The NCBI C++ standard methods for dealing with std::string.
SStrictId_Tax::TId TTaxId
Taxon id type.
#define ERR_POST(message)
Error posting with file, line number information but without error codes.
@ eDiag_Info
Informational message.
@ eDiag_Error
Error message.
@ eDiag_Warning
Warning message.
void Error(CExceptionArgs_Base &args)
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.
CSeq_feat_Handle GetSeq_featHandle(const CSeq_feat &feat, EMissing action=eMissing_Default)
CConstRef< CSeq_entry > GetCompleteSeq_entry(void) const
Complete and get const reference to the seq-entry.
CScope & GetScope(void) const
Get scope this handle belongs to.
void Replace(const CSeq_feat &new_feat) const
Replace the feature with new Seq-feat object.
TObjectType * GetPointer(void) const THROWS_NONE
Get pointer,.
void Reset(void)
Reset reference object.
void Reset(void)
Reset reference object.
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define END_SCOPE(ns)
End the previously defined scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
#define BEGIN_SCOPE(ns)
Define a new scope.
static SIZE_TYPE FindNoCase(const CTempString str, const CTempString pattern, SIZE_TYPE start, SIZE_TYPE end, EOccurrence which=eFirst)
Find the pattern in the specified range of a string using a case insensitive search.
static bool EndsWith(const CTempString str, const CTempString end, ECase use_case=eCase)
Check if a string ends with a specified suffix value.
static bool IsBlank(const CTempString str, SIZE_TYPE pos=0)
Check if a string is blank (has no text).
static void TruncateSpacesInPlace(string &str, ETrunc where=eTrunc_Both)
Truncate spaces in a string (in-place)
static SIZE_TYPE Find(const CTempString str, const CTempString pattern, ECase use_case=eCase, EDirection direction=eForwardSearch, SIZE_TYPE occurrence=0)
Find the pattern in the string.
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.
static enable_if< is_arithmetic< TNumeric >::value||is_convertible< TNumeric, Int8 >::value, string >::type NumericToString(TNumeric value, TNumToStringFlags flags=0, int base=10)
Convert numeric value to string.
static bool Equal(const CTempString s1, SIZE_TYPE pos, SIZE_TYPE n, const char *s2, ECase use_case=eCase)
Test for equality of a substring with another string.
bool IsSetOrg(void) const
Check if a value has been assigned to Org data member.
const TOrg & GetOrg(void) const
Get the Org member data.
const TMod & GetMod(void) const
Get the Mod member data.
const TTaxname & GetTaxname(void) const
Get the Taxname member data.
void SetTaxname(const TTaxname &value)
Assign a value to Taxname data member.
bool IsSetMod(void) const
Check if a value has been assigned to Mod data member.
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.
void SetOrgname(TOrgname &value)
Assign a value to Orgname data member.
const TOrgname & GetOrgname(void) const
Get the Orgname member data.
@ eSubtype_nat_host
natural host of this specimen
@ eSubtype_metagenome_source
bool IsSetData(void) const
the specific data Check if a value has been assigned to Data data member.
const TData & GetData(void) const
Get the Data member data.
void SetData(TData &value)
Assign a value to Data data member.
const TBiosrc & GetBiosrc(void) const
Get the variant data.
bool IsBiosrc(void) const
Check if variant Biosrc is selected.
const TSet & GetSet(void) const
Get the variant data.
bool IsSet(void) const
Check if variant Set is selected.
const TSource & GetSource(void) const
Get the variant data.
bool IsSource(void) const
Check if variant Source is selected.
bool IsData(void) const
Check if variant Data is selected.
const TData & GetData(void) const
Get the variant data.
bool IsSetOrg(void) const
Check if a value has been assigned to Org data member.
const TReply & GetReply(void) const
Get the Reply member data.
bool IsError(void) const
Check if variant Error is selected.
const TError & GetError(void) const
Get the variant data.
const TOrg & GetOrg(void) const
Get the Org 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 orig
function< CRef< CTaxon3_reply >(const vector< CRef< COrg_ref > > &list)> taxupdate_func_t
const struct ncbi::grid::netcache::search::fields::KEY key
static bool Equals(const CVariation::TPlacements &p1, const CVariation::TPlacements &p2)
#define FOR_EACH_SEQFEAT_ON_SEQANNOT(Itr, Var)
FOR_EACH_SEQFEAT_ON_SEQANNOT EDIT_EACH_SEQFEAT_ON_SEQANNOT.
#define FOR_EACH_SEQENTRY_ON_SEQSET(Itr, Var)
FOR_EACH_SEQENTRY_ON_SEQSET EDIT_EACH_SEQENTRY_ON_SEQSET.
#define FOR_EACH_DESCRIPTOR_ON_SEQENTRY
#define FOR_EACH_ANNOT_ON_SEQENTRY
static const char * str(char *buf, int n)
const string kInvalidReplyMsg