NCBI C++ ToolKit
gene_validator.cpp
Go to the documentation of this file.

Go to the SVN repository for this file.

1 /* $Id: gene_validator.cpp 101247 2023-11-20 15:20:49Z stakhovv $
2  * ===========================================================================
3  *
4  * PUBLIC DOMAIN NOTICE
5  * National Center for Biotechnology Information
6  *
7  * This software/database is a "United States Government Work" under the
8  * terms of the United States Copyright Act. It was written as part of
9  * the author's official duties as a United States Government employee and
10  * thus cannot be copyrighted. This software/database is freely available
11  * to the public for use. The National Library of Medicine and the U.S.
12  * Government have not placed any restriction on its use or reproduction.
13  *
14  * Although all reasonable efforts have been taken to ensure the accuracy
15  * and reliability of the software and data, the NLM and the U.S.
16  * Government do not and cannot warrant the performance or results that
17  * may be obtained by using this software or data. The NLM and the U.S.
18  * Government disclaim all warranties, express or implied, including
19  * warranties of performance, merchantability or fitness for any particular
20  * purpose.
21  *
22  * Please cite the author in any work or product based on this material.
23  *
24  * ===========================================================================
25  *
26  * Author: Colleen Bollin
27  *
28  * File Description:
29  * validation of gene features
30  * .......
31  *
32  */
33 #include <ncbi_pch.hpp>
34 #include <corelib/ncbistd.hpp>
35 #include <corelib/ncbistr.hpp>
41 
42 #include <serial/serialbase.hpp>
43 
44 #include <objmgr/seqdesc_ci.hpp>
47 #include <util/sgml_entity.hpp>
48 
49 
52 BEGIN_SCOPE(validator)
53 using namespace sequence;
54 
55 
56 static bool s_IsLocDirSub(
57  const CSeq_loc& loc,
58  const CTSE_Handle& tse,
59  CCacheImpl& cache,
60  CScope* scope);
61 
62 static const char* const sc_BadGeneSynText [] = {
63  "HLA",
64  "alpha",
65  "alternative",
66  "beta",
67  "cellular",
68  "cytokine",
69  "delta",
70  "drosophila",
71  "epsilon",
72  "gamma",
73  "homolog",
74  "mouse",
75  "orf",
76  "partial",
77  "plasma",
78  "precursor",
79  "pseudogene",
80  "putative",
81  "rearranged",
82  "small",
83  "trna",
84  "unknown",
85  "unknown function",
86  "unknown protein",
87  "unnamed",
88 };
91 
93 {
95 
96  const CGene_ref& gene = m_Feat.GetData().GetGene();
97 
98  m_Imp.IncrementGeneCount();
99 
100  if ( (! gene.IsSetLocus() || gene.GetLocus().empty()) &&
101  (! gene.IsSetAllele() || gene.GetAllele().empty()) &&
102  (! gene.IsSetDesc() || gene.GetDesc().empty()) &&
103  (! gene.IsSetMaploc() || gene.GetMaploc().empty()) &&
104  (! gene.IsSetDb() || gene.GetDb().empty()) &&
105  (! gene.IsSetSyn() || gene.GetSyn().empty()) &&
106  (! gene.IsSetLocus_tag() || gene.GetLocus_tag().empty()) ) {
108  "There is a gene feature where all fields are empty");
109  }
110  if ( gene.IsSetLocus() && m_Feat.IsSetComment() && NStr::EqualCase (m_Feat.GetComment(), gene.GetLocus())) {
112  "Comment has same value as gene locus");
113  }
114 
115  if ( gene.IsSetLocus_tag() && !NStr::IsBlank (gene.GetLocus_tag()) ) {
116  const string& locus_tag = gene.GetLocus_tag();
117 
118  for (auto it : locus_tag) {
119  if ( isspace((unsigned char)(it)) != 0 ) {
121  "Gene locus_tag '" + gene.GetLocus_tag() +
122  "' should be a single word without any spaces");
123  break;
124  }
125  }
126 
127  if (gene.IsSetLocus() && !NStr::IsBlank(gene.GetLocus())
128  && NStr::EqualNocase(locus_tag, gene.GetLocus())) {
130  "Gene locus and locus_tag '" + gene.GetLocus() + "' match");
131  }
132  if (m_Feat.IsSetComment() && NStr::EqualCase (m_Feat.GetComment(), locus_tag)) {
134  "Comment has same value as gene locus_tag");
135  }
136  if (m_Feat.IsSetQual()) {
137  for (auto it : m_Feat.GetQual()) {
138  if (it->IsSetQual() && NStr::EqualNocase(it->GetQual(), "old_locus_tag") && it->IsSetVal()) {
139  if (NStr::EqualCase(it->GetVal(), locus_tag)) {
141  "old_locus_tag has same value as gene locus_tag");
143  "Gene locus_tag and old_locus_tag '" + locus_tag + "' match");
144  }
145  if (NStr::Find(it->GetVal(), ",") != string::npos) {
147  "old_locus_tag has comma, multiple old_locus_tags should be split into separate qualifiers");
148  }
149  }
150  }
151  }
152  } else if (m_Imp.DoesAnyGeneHaveLocusTag() &&
153  !s_IsLocDirSub(m_Feat.GetLocation(), m_Imp.GetTSE_Handle(), m_Imp.GetCache(), &m_Scope)) {
155  "Missing gene locus tag");
156  }
157 
158  if ( gene.IsSetDb () ) {
159  m_Imp.ValidateDbxref(gene.GetDb(), m_Feat);
160  }
161 
162  if (m_Imp.IsRefSeq() && gene.IsSetSyn()) {
163  for (auto it : gene.GetSyn()) {
164  if (sc_BadGeneSyn.find (it.c_str()) != sc_BadGeneSyn.end()) {
165  PostErr (m_Imp.IsGpipe() ? eDiag_Info : eDiag_Warning, eErr_SEQ_FEAT_UndesiredGeneSynonym,
166  "Uninformative gene synonym '" + it + "'");
167  }
168  if (gene.IsSetLocus() && !NStr::IsBlank(gene.GetLocus())
169  && NStr::Equal(gene.GetLocus(), it)) {
170  PostErr (m_Imp.IsGpipe() ? eDiag_Info : eDiag_Warning, eErr_SEQ_FEAT_UndesiredGeneSynonym,
171  "gene synonym has same value as gene locus");
172  }
173  }
174  }
175 
176  if (gene.IsSetLocus() && gene.IsSetDesc()
177  && NStr::EqualCase (gene.GetLocus(), gene.GetDesc())
178  && !m_Imp.IsGpipe()) {
180  "gene description has same value as gene locus");
181  }
182 
183  if (!gene.IsSetLocus() && !gene.IsSetDesc() && gene.IsSetSyn() && gene.GetSyn().size() > 0) {
184  PostErr (m_Imp.IsGpipe() ? eDiag_Info : eDiag_Warning, eErr_SEQ_FEAT_UndesiredGeneSynonym,
185  "gene synonym without gene locus or description");
186  }
187 
188  if (gene.IsSetLocus()) {
189  ValidateCharactersInField (gene.GetLocus(), "Gene locus");
190  }
191 
192  // check for SGML
193  if (gene.IsSetLocus() && ContainsSgml(gene.GetLocus())) {
195  "gene locus " + gene.GetLocus() + " has SGML");
196  }
197  if (gene.IsSetLocus_tag() && ContainsSgml(gene.GetLocus_tag())) {
199  "gene locus_tag " + gene.GetLocus_tag() + " has SGML");
200  }
201  if (gene.IsSetDesc()) {
202  string desc = gene.GetDesc();
203  if (ContainsSgml(desc)) {
205  "gene description " + gene.GetDesc() + " has SGML");
206  }
207  }
208  if (gene.IsSetSyn()) {
209  for (auto it : gene.GetSyn()) {
210  if (ContainsSgml(it)) {
212  "gene synonym " + it + " has SGML");
213  }
214  }
215  }
216  x_ValidateOperon();
217 
218  x_ValidateMultiIntervalGene();
219 }
220 
221 
223 {
225 
226  if (NStr::Find(text, "gene split at ") != string::npos &&
227  (!m_Feat.GetData().GetGene().IsSetLocus_tag() || NStr::IsBlank(m_Feat.GetData().GetGene().GetLocus_tag()))) {
228  PostErr(eDiag_Warning, eErr_SEQ_FEAT_ExceptionRequiresLocusTag, "Gene has split exception but no locus_tag");
229  }
230 }
231 
232 
234 {
235  CConstRef<CSeq_feat> operon =
236  GetOverlappingOperon(m_Feat.GetLocation(), m_Scope);
237  if ( !operon || !operon->IsSetQual() ) {
238  return;
239  }
240 
241  string label;
243  if ( label.empty() ) {
244  return;
245  }
246 
247  for (auto qual_iter : operon->GetQual()) {
248  const CGb_qual& qual = *qual_iter;
249  if( qual.CanGetQual() && qual.CanGetVal() ) {
250  if ( NStr::Compare(qual.GetQual(), "operon") == 0 &&
251  NStr::CompareNocase(qual.GetVal(), label) == 0) {
253  "Operon is same as gene - " + qual.GetVal());
254  }
255  }
256  }
257 }
258 
259 
261 {
262  CRef<CSeq_loc> loc(new CSeq_loc());
263  loc->SetInt().SetId().Assign(*(bsh.GetSeqId()));
264  if (from < to) {
265  loc->SetInt().SetFrom(from);
266  loc->SetInt().SetTo(to);
267  } else {
268  loc->SetInt().SetFrom(to);
269  loc->SetInt().SetTo(from);
270  }
271  CRef<CSeq_loc> rev_loc(new CSeq_loc());
272  rev_loc->Assign(*loc);
273  rev_loc->SetInt().SetStrand(eNa_strand_minus);
274 
275  TFeatScores mobile_elements;
278  ITERATE(TFeatScores, m, mobile_elements) {
279  if (m->second->GetLocation().Compare(*loc, CSeq_loc::fCompare_Default) == 0
280  || m->second->GetLocation().Compare(*rev_loc, CSeq_loc::fCompare_Default) == 0) {
281  return true;
282  }
283  }
284  mobile_elements.clear();
287  ITERATE(TFeatScores, m, mobile_elements) {
288  if (m->second->GetLocation().Compare(*loc, CSeq_loc::fCompare_Default) == 0
289  || m->second->GetLocation().Compare(*rev_loc, CSeq_loc::fCompare_Default) == 0) {
290  return true;
291  }
292  }
293 
294  return false;
295 }
296 
297 
299 {
300  const CSeq_loc& loc = m_Feat.GetLocation();
301  CSeq_loc_CI si(loc);
302  if (!si) {
303  return false;
304  }
305  ENa_strand loc_strand = loc.GetStrand();
306  while (si) {
307  TSeqPos gap_start;
308  if (loc_strand == eNa_strand_minus) {
309  gap_start = si.GetRange().GetFrom() + 1;
310  } else {
311  gap_start = si.GetRange().GetTo() + 1;
312  }
313  ++si;
314  if (si) {
315  TSeqPos gap_end;
316  if (loc_strand == eNa_strand_minus) {
317  gap_end = si.GetRange().GetTo();
318  } else {
319  gap_end = si.GetRange().GetFrom();
320  }
321  if (gap_end > 0) {
322  gap_end--;
323  }
324  if (!s_HasMobileElementForInterval(gap_start, gap_end, m_LocationBioseq)) {
325  return false;
326  }
327  }
328  }
329  return true;
330 }
331 
332 
333 static bool s_LocIntervalsSpanOrigin (const CSeq_loc& loc, CBioseq_Handle bsh)
334 {
335  CSeq_loc_CI si(loc);
336  if (!si) {
337  return false;
338  }
339  if(loc.GetStrand() == eNa_strand_minus) {
340  if (si.GetRange().GetFrom() != 0) {
341  return false;
342  }
343  ++si;
344  if (!si || si.GetRange().GetTo() != bsh.GetBioseqLength() - 1) {
345  return false;
346  }
347  ++si;
348  } else {
349  if (si.GetRange().GetTo() != bsh.GetBioseqLength() - 1) {
350  return false;
351  }
352  ++si;
353  if (!si || si.GetRange().GetFrom() != 0) {
354  return false;
355  }
356  ++si;
357  }
358  if (si) {
359  return false;
360  } else {
361  return true;
362  }
363 }
364 
365 
367 {
368  try {
369  const CSeq_loc& loc = m_Feat.GetLocation();
370  CSeq_loc_CI si(loc);
371  if ( !(++si) ) { // if only a single interval
372  return;
373  }
374 
375  if (m_Feat.IsSetExcept() && m_Feat.IsSetExcept_text()
376  && NStr::FindNoCase (m_Feat.GetExcept_text(), "trans-splicing") != string::npos) {
377  //ignore - has exception
378  return;
379  }
380 
381  if (x_AllIntervalGapsAreMobileElements()) {
382  // ignore, "space between" is a mobile element
383  return;
384  }
385 
386  if ( !IsOneBioseq(loc, &m_Scope) ) {
387  return;
388  } else if ( m_LocationBioseq.GetInst().GetTopology() == CSeq_inst::eTopology_circular
389  && s_LocIntervalsSpanOrigin (loc, m_LocationBioseq)) {
390  // spans origin
391  return;
392  } else if (m_Imp.IsSmallGenomeSet()) {
394  "Multiple interval gene feature in small genome set - "
395  "set trans-splicing exception if appropriate");
396  } else {
398  "Gene feature on non-segmented sequence should not "
399  "have multiple intervals");
400  }
401  } catch ( const exception& e ) {
402  if (NStr::Find(e.what(), "Error: Cannot resolve") == string::npos) {
404  string("Exception while validating multi-interval genes. EXCEPTION: ") +
405  e.what());
406  }
407  }
408 }
409 
410 
411 // to be DirSub, must not have ID of type other, must not have WGS keyword or tech, and
412 // must not be both complete and bacterial
413 static bool s_IsLocDirSub(
414  const CSeq_loc& loc,
415  const CTSE_Handle& tse,
416  CCacheImpl& cache,
417  CScope* scope)
418 {
419  if (!loc.GetId()) {
420  for ( CSeq_loc_CI si(loc); si; ++si ) {
421  if (!s_IsLocDirSub(si.GetEmbeddingSeq_loc(), tse, cache, scope)) {
422  return false;
423  }
424  }
425  return true;
426  }
427 
428 
429  if (loc.GetId()->IsOther()) {
430  return false;
431  }
432 
433  CBioseq_Handle bsh = cache.GetBioseqHandleFromLocation (scope, loc, tse);
434  if (!bsh) {
435  return true;
436  }
437 
438  bool rval = true;
440  if ((*it)->IsOther()) {
441  rval = false;
442  }
443  }
444 
445  if (rval) {
446  // look for WGS keyword
447  for (CSeqdesc_CI diter (bsh, CSeqdesc::e_Genbank); diter && rval; ++diter) {
448  FOR_EACH_KEYWORD_ON_GENBANKBLOCK (it, diter->GetGenbank()) {
449  if (NStr::EqualNocase (*it, "WGS")) {
450  rval = false;
451  }
452  }
453  }
454 
455  // look for WGS tech and completeness
456  bool completeness = false;
457 
458  for (CSeqdesc_CI diter (bsh, CSeqdesc::e_Molinfo); diter && rval; ++diter) {
459  if (diter->GetMolinfo().IsSetTech() && diter->GetMolinfo().GetTech() == CMolInfo::eTech_wgs) {
460  rval = false;
461  }
462  if (diter->GetMolinfo().IsSetCompleteness() && diter->GetMolinfo().GetCompleteness() == CMolInfo::eCompleteness_complete) {
463  completeness = true;
464  }
465  }
466 
467  // look for bacterial
468  if (completeness) {
469  for (CSeqdesc_CI diter (bsh, CSeqdesc::e_Source); diter && rval; ++diter) {
470  if (diter->GetSource().IsSetDivision()
471  && NStr::EqualNocase (diter->GetSource().GetDivision(), "BCT")) {
472  rval = false;
473  }
474  }
475  }
476  }
477  return rval;
478 }
479 
480 
481 END_SCOPE(validator)
static CRef< CScope > m_Scope
@ eErr_GENERIC_SgmlPresentInText
@ eErr_SEQ_FEAT_InvalidOperonMatchesGene
@ eErr_SEQ_FEAT_ExceptionRequiresLocusTag
@ eErr_SEQ_FEAT_MissingGeneLocusTag
@ eErr_SEQ_FEAT_LocusTagHasSpace
@ eErr_SEQ_FEAT_MultiIntervalGene
@ eErr_INTERNAL_Exception
@ eErr_SEQ_FEAT_OldLocusTagBadFormat
@ eErr_SEQ_FEAT_RedundantFields
@ eErr_SEQ_FEAT_LocusTagProblem
@ eErr_SEQ_FEAT_GeneRefHasNoData
@ eErr_SEQ_FEAT_LocusTagGeneLocusMatch
@ eErr_SEQ_FEAT_UndesiredGeneSynonym
CBioseq_Handle –.
@Gb_qual.hpp User-defined methods of the data storage class.
Definition: Gb_qual.hpp:61
void Validate() override
bool x_AllIntervalGapsAreMobileElements()
void x_ValidateMultiIntervalGene()
void x_ValidateExceptText(const string &text) override
CScope –.
Definition: scope.hpp:92
CSeqdesc_CI –.
Definition: seqdesc_ci.hpp:65
virtual void x_ValidateExceptText(const string &text)
Cache various information for one validation run.
Definition: cache_impl.hpp:126
CBioseq_Handle GetBioseqHandleFromLocation(CScope *scope, const CSeq_loc &loc, const CTSE_Handle &tse)
Include a standard set of the NCBI C++ Toolkit most basic headers.
The NCBI C++ standard methods for dealing with std::string.
static const char si[8][64]
Definition: des.c:146
Public API for finding the gene(s) on a given feature using the same criteria as the flatfile generat...
static bool s_LocIntervalsSpanOrigin(const CSeq_loc &loc, CBioseq_Handle bsh)
static const char *const sc_BadGeneSynText[]
static bool s_IsLocDirSub(const CSeq_loc &loc, const CTSE_Handle &tse, CCacheImpl &cache, CScope *scope)
DEFINE_STATIC_ARRAY_MAP(TBadGeneSynSet, sc_BadGeneSyn, sc_BadGeneSynText)
CStaticArraySet< const char *, PCase_CStr > TBadGeneSynSet
bool s_HasMobileElementForInterval(TSeqPos from, TSeqPos to, CBioseq_Handle bsh)
unsigned int TSeqPos
Type for sequence locations and lengths.
Definition: ncbimisc.hpp:875
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
Definition: ncbimisc.hpp:815
@ eDiag_Info
Informational message.
Definition: ncbidiag.hpp:651
@ eDiag_Error
Error message.
Definition: ncbidiag.hpp:653
@ eDiag_Warning
Warning message.
Definition: ncbidiag.hpp:652
string GetLabel(const CSeq_id &id)
virtual void Assign(const CSerialObject &source, ESerialRecursionMode how=eRecursive)
Override Assign() to incorporate cache invalidation.
Definition: Seq_loc.cpp:337
void SetInt(TInt &v)
Definition: Seq_loc.hpp:983
@ fCompare_Default
Definition: Seq_loc.hpp:245
@ fFGL_Content
Include its content if there is any.
Definition: feature.hpp:73
bool IsOneBioseq(const CSeq_loc &loc, CScope *scope)
Returns true if all embedded CSeq_ids represent the same CBioseq, else false.
@ eOverlap_Contained
2nd contained within 1st extremes
CConstRef< CSeq_feat > GetOverlappingOperon(const CSeq_loc &loc, CScope &scope)
Definition: sequence.cpp:1600
vector< TFeatScore > TFeatScores
Definition: sequence.hpp:353
void GetOverlappingFeatures(const CSeq_loc &loc, CSeqFeatData::E_Choice feat_type, CSeqFeatData::ESubtype feat_subtype, EOverlapType overlap_type, TFeatScores &feats, CScope &scope, const TBestFeatOpts opts=0, CGetOverlappingFeaturesPlugin *plugin=NULL)
Find all features overlapping the location.
Definition: sequence.cpp:945
CConstRef< CBioseq > GetCompleteBioseq(void) const
Get the complete bioseq.
TSeqPos GetBioseqLength(void) const
CConstRef< CSeq_id > GetSeqId(void) const
Get id which can be used to access this bioseq handle Throws an exception if none is available.
CScope & GetScope(void) const
Get scope this handle belongs to.
#define END_NCBI_SCOPE
End previously defined NCBI scope.
Definition: ncbistl.hpp:103
#define END_SCOPE(ns)
End the previously defined scope.
Definition: ncbistl.hpp:75
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
Definition: ncbistl.hpp:100
#define BEGIN_SCOPE(ns)
Define a new scope.
Definition: ncbistl.hpp:72
static int CompareNocase(const CTempString s1, SIZE_TYPE pos, SIZE_TYPE n, const char *s2)
Case-insensitive compare of a substring with another string.
Definition: ncbistr.cpp:219
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.
Definition: ncbistr.cpp:2984
static bool IsBlank(const CTempString str, SIZE_TYPE pos=0)
Check if a string is blank (has no text).
Definition: ncbistr.cpp:106
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.
Definition: ncbistr.cpp:2882
static bool EqualCase(const CTempString s1, SIZE_TYPE pos, SIZE_TYPE n, const char *s2)
Case-sensitive equality of a substring with another string.
Definition: ncbistr.hpp:5327
static int Compare(const CTempString s1, SIZE_TYPE pos, SIZE_TYPE n, const char *s2, ECase use_case=eCase)
Compare of a substring with another string.
Definition: ncbistr.hpp:5299
static bool EqualNocase(const CTempString s1, SIZE_TYPE pos, SIZE_TYPE n, const char *s2)
Case-insensitive equality of a substring with another string.
Definition: ncbistr.hpp:5355
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.
Definition: ncbistr.hpp:5386
static const char label[]
bool IsSetSyn(void) const
synonyms for locus Check if a value has been assigned to Syn data member.
Definition: Gene_ref_.hpp:756
const TSyn & GetSyn(void) const
Get the Syn member data.
Definition: Gene_ref_.hpp:768
const TDesc & GetDesc(void) const
Get the Desc member data.
Definition: Gene_ref_.hpp:599
bool IsSetLocus_tag(void) const
systematic gene name (e.g., MI0001, ORF0069) Check if a value has been assigned to Locus_tag data mem...
Definition: Gene_ref_.hpp:781
bool IsSetLocus(void) const
Official gene symbol Check if a value has been assigned to Locus data member.
Definition: Gene_ref_.hpp:493
bool IsSetDesc(void) const
descriptive name Check if a value has been assigned to Desc data member.
Definition: Gene_ref_.hpp:587
bool IsSetDb(void) const
ids in other dbases Check if a value has been assigned to Db data member.
Definition: Gene_ref_.hpp:731
bool IsSetAllele(void) const
Official allele designation Check if a value has been assigned to Allele data member.
Definition: Gene_ref_.hpp:540
const TDb & GetDb(void) const
Get the Db member data.
Definition: Gene_ref_.hpp:743
bool IsSetMaploc(void) const
descriptive map location Check if a value has been assigned to Maploc data member.
Definition: Gene_ref_.hpp:634
const TLocus_tag & GetLocus_tag(void) const
Get the Locus_tag member data.
Definition: Gene_ref_.hpp:793
const TLocus & GetLocus(void) const
Get the Locus member data.
Definition: Gene_ref_.hpp:505
const TAllele & GetAllele(void) const
Get the Allele member data.
Definition: Gene_ref_.hpp:552
const TMaploc & GetMaploc(void) const
Get the Maploc member data.
Definition: Gene_ref_.hpp:646
const TVal & GetVal(void) const
Get the Val member data.
Definition: Gb_qual_.hpp:259
bool IsSetQual(void) const
qualifiers Check if a value has been assigned to Qual data member.
Definition: Seq_feat_.hpp:1135
const TQual & GetQual(void) const
Get the Qual member data.
Definition: Seq_feat_.hpp:1147
bool CanGetVal(void) const
Check if it is safe to call GetVal method.
Definition: Gb_qual_.hpp:253
const TQual & GetQual(void) const
Get the Qual member data.
Definition: Gb_qual_.hpp:212
bool CanGetQual(void) const
Check if it is safe to call GetQual method.
Definition: Gb_qual_.hpp:206
ENa_strand
strand of nucleic acid
Definition: Na_strand_.hpp:64
@ eNa_strand_minus
Definition: Na_strand_.hpp:67
@ eCompleteness_complete
complete biological entity
Definition: MolInfo_.hpp:156
@ eTech_wgs
whole genome shotgun sequencing
Definition: MolInfo_.hpp:143
@ e_Genbank
GenBank specific info.
Definition: Seqdesc_.hpp:121
@ e_Molinfo
info on the molecule and techniques
Definition: Seqdesc_.hpp:134
@ e_Source
source of materials, includes Org-ref
Definition: Seqdesc_.hpp:133
static void text(MDB_val *v)
Definition: mdb_dump.c:62
int isspace(Uchar c)
Definition: ncbictype.hpp:69
#define FOR_EACH_SEQID_ON_BIOSEQ(Itr, Var)
FOR_EACH_SEQID_ON_BIOSEQ EDIT_EACH_SEQID_ON_BIOSEQ.
Definition: seq_macros.hpp:308
#define FOR_EACH_KEYWORD_ON_GENBANKBLOCK(Itr, Var)
FOR_EACH_KEYWORD_ON_GENBANKBLOCK EDIT_EACH_KEYWORD_ON_GENBANKBLOCK.
bool ContainsSgml(const string &str)
Modified on Wed Sep 04 14:59:06 2024 by modify_doxy.py rev. 669887