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

Go to the SVN repository for this file.

1 /* $Id: data_loaders_util.cpp 100739 2023-09-06 13:41:57Z grichenk $
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  * Authors: Mike DiCuccio
27  *
28  * File Description:
29  *
30  */
31 
32 #include <ncbi_pch.hpp>
33 
34 #include <corelib/request_ctx.hpp>
35 
37 #include <objmgr/scope.hpp>
41 
43 #include <objtools/lds2/lds2.hpp>
44 
46 
47 #include <dbapi/driver/drivers.hpp>
48 
49 #ifdef HAVE_NCBI_VDB
52 #endif
53 
55 
58 
59 
60 void CDataLoadersUtil::AddArgumentDescriptions(CArgDescriptions& arg_desc,
61  TLoaders loaders)
62 {
63  arg_desc.SetCurrentGroup("Data source and object manager options");
64 
65  // Local Data Store indexes
66  if (loaders & fLDS2) {
67  arg_desc.AddOptionalKey("lds2", "LDSDatabases",
68  "Comma-separated list of LDS2 databases to use.",
71  }
72 
73  // BLAST database retrieval
74  if (loaders & fBLAST) {
75  arg_desc.AddOptionalKey("blastdb", "BlastDatabases",
76  "Comma-separated list of BLAST databases to use. "
77  "Use na: prefix for nucleotide, "
78  "or aa: for protein.",
81  if(!arg_desc.Exist("d")) arg_desc.AddAlias("d","blastdb");
82  }
83 
84  // ASN Cache options
85  if (loaders & fAsnCache) {
86  arg_desc.AddOptionalKey("asn-cache", "AsnCache",
87  "Comma-separated list of ASN Cache databases to use.",
90  }
91 
92 
93  // ID retrieval options
94  // -r enables all available loaders
95  if (((loaders & fGenbank) && (loaders & fGenbankOffByDefault)) ||
96  (loaders & fVDB) ||
97  (loaders & fSRA)) {
98  if (!arg_desc.Exist("r")) {
99  arg_desc.AddFlag("r",
100  "Enable remote data retrieval");
101  }
102  }
103 
104  if (loaders & fGenbank) {
105  if (loaders & fGenbankOffByDefault) {
106  if ( !arg_desc.Exist("genbank")) {
107  arg_desc.AddFlag("genbank",
108  "Enable remote data retrieval using the Genbank data loader");
109  }
110  }
111  else {
112  if(!arg_desc.Exist("nogenbank")) {
113  arg_desc.AddFlag("nogenbank",
114  "Do not use GenBank data loader.");
115  }
116  }
117  arg_desc.AddOptionalKey("gb-method", "GBMethod",
118  "Semicolon-separated list of Genbank loader method(s)",
121  arg_desc.AddOptionalKey("gb-snp", "enable",
122  "Genbank SNP processor",
124  arg_desc.AddOptionalKey("gb-wgs", "enable",
125  "Genbank WGS processor",
127  arg_desc.AddOptionalKey("gb-cdd", "enable",
128  "Genbank SNP processor",
130  CArgDescriptions::EDependency dep_type = loaders & fGenbankOffByDefault ? CArgDescriptions::eRequires : CArgDescriptions::eExcludes;
131  string dep_arg = loaders & fGenbankOffByDefault ? "genbank" : "nogenbank";
132  arg_desc.SetDependency("gb-method", dep_type, dep_arg);
133  arg_desc.SetDependency("gb-snp", dep_type, dep_arg);
134  arg_desc.SetDependency("gb-wgs", dep_type, dep_arg);
135  arg_desc.SetDependency("gb-cdd", dep_type, dep_arg);
136  }
137 
138 #ifdef HAVE_NCBI_VDB
139  if (loaders & fVDB) {
140  if (loaders & fVDBOnByDefault) {
141  arg_desc.AddFlag("vdb", "Use VDB data loader.",
144 
145  } else {
146  arg_desc.AddFlag("vdb", "Use VDB data loader.");
147  }
148  arg_desc.AddFlag("novdb", "Do not use VDB data loader.");
149  arg_desc.SetDependency("vdb",
151  "novdb");
152  arg_desc.AddOptionalKey("vdb-path", "Path",
153  "Root path for VDB look-up",
155  }
156 
157  // SRA options
158  if (loaders & fSRA) {
159  arg_desc.AddFlag("sra", "Add the SRA data loader with no options.");
160 
161  arg_desc.AddOptionalKey("sra-acc", "AddSra", "Add the SRA data loader, specifying an accession.",
163 
164  arg_desc.AddOptionalKey("sra-file", "AddSra", "Add the SRA data loader, specifying an sra file.",
166 
167  arg_desc.SetDependency("sra", CArgDescriptions::eExcludes, "sra-acc");
168  arg_desc.SetDependency("sra", CArgDescriptions::eExcludes, "sra-file");
169  arg_desc.SetDependency("sra-acc", CArgDescriptions::eExcludes, "sra-file");
170  }
171 #else
172  // still accept explicit -novdb
173  if (loaders & fVDB) {
174  arg_desc.AddFlag("novdb", "Do not use VDB data loader.");
175  }
176 #endif
177 
178  // All remaining arguments as added by the C++ Toolkit application
179  // framework are grouped after the above, by default. If the caller
180  // doesn't like this, merely set the current group to the desired
181  // value (this one, being empty, will be ignored).
182  arg_desc.SetCurrentGroup("General application arguments");
183 }
184 
185 
187  CObjectManager& obj_mgr,
188  int& priority,
189  TLoaders loaders)
190 {
191  bool nogenbank = args.Exist("nogenbank") && args["nogenbank"];
192  if (loaders & fGenbankOffByDefault) {
193  if ((args.Exist("genbank") && args["genbank"]) ||
194  (args.Exist("r") && args["r"])) {
195  nogenbank = false;
196  } else {
197  nogenbank = true;
198  }
199  }
200 
201  if ( ! nogenbank ) {
202  CGBLoaderParams params;
203 
204  CArgValue::TStringArray methods;
205  if (args.Exist("gb-method") && args["gb-method"]) {
206  methods = args["gb-method"].GetStringList();
207  }
208  string gb_methods;
209  ITERATE (CArgValue::TStringArray, it, methods) {
210  if (!gb_methods.empty()) gb_methods += ";";
211  gb_methods += *it;
212  }
213  if (!gb_methods.empty()) {
214  params.SetLoaderMethod(gb_methods);
215  }
216 
217  if (args.Exist("gb-snp") && args["gb-snp"]) {
218  params.SetEnableSNP(args["gb-snp"].AsBoolean());
219  }
220  if (args.Exist("gb-wgs") && args["gb-wgs"]) {
221  params.SetEnableWGS(args["gb-wgs"].AsBoolean());
222  }
223  if (args.Exist("gb-cdd") && args["gb-cdd"]) {
224  params.SetEnableCDD(args["gb-cdd"].AsBoolean());
225  }
226 
227  // pubseqos* drivers require this
229 
230 #ifdef HAVE_PUBSEQ_OS
231  // we may require PubSeqOS readers at some point, so go ahead and make
232  // sure they are properly registered
235 #endif
236 
237  // In order to allow inserting additional data loaders
238  // between the above high-performance loaders and this one,
239  // leave a gap in the priority range.
240  priority = max(priority, 16000);
242  params,
244  priority);
245 
246  LOG_POST(Info << "added loader: GenBank: "
247  << " (" << priority << ")");
248  ++priority;
249  }
250 }
251 
252 
254  CObjectManager& obj_mgr,
255  int& priority,
256  TLoaders loaders)
257 {
258 #ifdef HAVE_NCBI_VDB
260  bool use_vdb_loader = (loaders & fVDBOnByDefault) ||
261  (args.Exist("vdb") && args["vdb"]);
262  if ( !use_vdb_loader ) {
263  string vdbEnabled = reg.Get("Gpipe","enable_vdb");
264  if (vdbEnabled == "Y") {
265  use_vdb_loader = true;
266  }
267  }
268 
269  if (!use_vdb_loader) {
270  if (args.Exist("r") && args["r"]) {
271  use_vdb_loader = true;
272  }
273  }
274 
275  if (args.Exist("novdb") && args["novdb"]) {
276  use_vdb_loader = false;
277  }
278 
279  if (use_vdb_loader) {
280  string vdbpath = reg.Get("Gpipe", "VDB_PATH");
281  if (args.Exist("vdb-path") && args["vdb-path"]) {
282  vdbpath = args["vdb-path"].AsString();
283  }
284  if(vdbpath.empty()){
286  (obj_mgr, CObjectManager::eDefault, priority++);
287  } else {
289  params.m_WGSVolPath = vdbpath;
291  (obj_mgr,params,CObjectManager::eDefault, priority++);
292  }
293  }
294 #endif
295 }
296 
297 
299  CObjectManager& obj_mgr,
300  int& priority)
301 {
302 #ifdef HAVE_NCBI_VDB
303  if ((args.Exist("sra") && args["sra"]) || (args.Exist("r") && args["r"])) {
306  priority++);
307  }
308  else if(args.Exist("sra-acc") && args["sra-acc"]) {
310  args["sra-acc"].AsString(),
312  priority++);
313  }
314  else if(args.Exist("sra-file") && args["sra-file"]) {
315  CDirEntry file_entry(args["sra-file"].AsString());
317  file_entry.GetDir(),
318  file_entry.GetName(),
320  priority++);
321  }
322 #endif
323 }
324 
325 
327  CObjectManager& obj_mgr,
328  int& priority)
329 {
330  typedef vector<string> TDbs;
331 
332  CArgValue::TStringArray blastdbstr;
333  if (args.Exist("blastdb") && args["blastdb"]) {
334  blastdbstr = args["blastdb"].GetStringList();
335  }
336 
337  ITERATE (CArgValue::TStringArray, it, blastdbstr) {
338  TDbs dbs;
339  NStr::Split(*it, ",", dbs);
340  ITERATE(TDbs, i, dbs) {
341  string db = NStr::TruncateSpaces(*i);
342  if (db.empty()) {
343  continue;
344  }
346  if (NStr::StartsWith(db, "na:", NStr::eNocase)) {
347  db.erase(0, 3);
349  } else if (NStr::StartsWith(db, "aa:", NStr::eNocase)) {
350  db.erase(0, 3);
352  }
354  db, dbtype, true,
356  priority);
357  LOG_POST(Info << "added loader: BlastDB: "
358  << (dbtype == CBlastDbDataLoader::eNucleotide ?
359  "nucl" : "protein")
360  << ": " << db
361  << " (" << priority << ")");
362  ++priority;
363  }
364  }
365 }
366 
368  CObjectManager& obj_mgr,
369  int& priority)
370 {
371  typedef vector<string> TDbs;
372 
373  CArgValue::TStringArray lds2dbstr;
374  if (args.Exist("lds2") && args["lds2"]) {
375  lds2dbstr = args["lds2"].GetStringList();
376  }
377 
378  ITERATE (CArgValue::TStringArray, it, lds2dbstr) {
379  TDbs dbs;
380  NStr::Split(*it, ",", dbs);
381  ITERATE(TDbs, i, dbs) {
382  string db = NStr::TruncateSpaces(*i);
383  if (db.empty()) {
384  continue;
385  }
387  db = CDirEntry::NormalizePath(db);
388  if ( !CFile(db).Exists() ) {
389  ERR_POST(Warning << "LDS2 path not found: omitting: " << db);
390  continue;
391  }
392 
393  string alias("lds2_");
394  alias += NStr::NumericToString(priority);
396  db,
397  -1 /* fasta_flags */,
399  priority);
400  LOG_POST(Info << "added loader: LDS2: " << db
401  << " (" << priority << ")");
402  ++priority;
403  }
404  }
405 }
406 
408  CObjectManager& obj_mgr,
409  int& priority)
410 {
411  typedef vector<string> TDbs;
412 
413  CArgValue::TStringArray asn_cache_str;
415  string cachePaths = reg.Get("ASN_CACHE","ASN_CACHE_PATH");
416  if(cachePaths.size() > 0) {
417  asn_cache_str.push_back(cachePaths);
418  LOG_POST(Info << "From config: ASNCache:ASN_CACHE_PATH " << cachePaths);
419  }
420 
421  if (args.Exist("asn-cache") && args["asn-cache"]) {
422  asn_cache_str = args["asn-cache"].GetStringList();
423  }
424  ITERATE (CArgValue::TStringArray, it, asn_cache_str) {
425  TDbs dbs;
426  NStr::Split(*it, ",", dbs);
427  ITERATE(TDbs, i, dbs) {
428  string db = NStr::TruncateSpaces(*i);
429  if (db.empty() || NStr::EqualNocase(db, "NONE")) {
430  continue;
431  }
432  if (CDir(db).Exists()) {
433  try {
435  (obj_mgr, db,
437  priority);
438  LOG_POST(Info << "added loader: ASNCache: " << db
439  << " (" << priority << ")");
440  ++priority;
441  }
442  catch (CException& e) {
443  ERR_POST(Error << "failed to add ASN cache path: "
444  << db << ": " << e);
445  }
446  } else {
447  ERR_POST(Warning << "ASNCache path not found: omitting: " << db);
448  }
449  }
450  }
451 }
452 
453 
455  CObjectManager& obj_mgr)
456 {
457  int priority = 0;
458  x_SetupGenbankDataLoader(args, obj_mgr, priority,
459  fDefault);
460 }
461 
462 
464  CObjectManager& obj_mgr,
465  TLoaders loaders)
466 {
467  //
468  // Object Manager Setup
469  //
470  // Data loaders are configured at priority 1 through N for the
471  // first N data loaders other than ID, and ID at priority 16,000
472  // (except in the unlikely event of N being that large).
473 
474  int priority = 10;
475 
476  //
477  // Local Data Store: highest priority
478  //
479  // Justification:
480  // A local storage is often set up with altered
481  // sequence annotation, and thus may be preferred over
482  // less specialized data stores.
483  if (loaders & fLDS2) {
484  x_SetupLDS2DataLoader(args, obj_mgr, priority);
485  }
486 
487  //
488  // ASN Cache: 2nd priority
489  //
490  // Justification:
491  // The ASN Cache provides very fast access to annotated
492  // sequences, and should be consulted first, with the exception
493  // of any locally altered sequence annotation.
494  if (loaders & fAsnCache) {
495  x_SetupASNCacheDataLoader(args, obj_mgr, priority);
496  }
497 
498  //
499  // BLAST database retrieval: 3rd priority
500  //
501  // Justification:
502  // Any BLAST databases provide very fast access to sequences,
503  // but this data loader does not provide annotation and has
504  // limited descriptors (basically, just deflines and taxid).
505  if (loaders & fBLAST) {
506  x_SetupBlastDataLoader(args, obj_mgr, priority);
507  }
508 
509 #ifdef HAVE_NCBI_VDB
510  // SRA
511  if (loaders & fSRA) {
512  x_SetupSRADataLoader(args, obj_mgr, priority);
513  }
514 
515  // VDB data loader
516  if (loaders & (fVDB | fVDBOnByDefault)) {
517  x_SetupVDBDataLoader(args, obj_mgr, priority, loaders);
518  }
519 #endif
520 
521  //
522  // ID retrieval: last priority
523  //
524  // Justification:
525  // Although ID provides access to fully annotated sequences,
526  // present and historic/archival, the retrieval performance is
527  // significantly lower when compared to the above sources.
528  // (There may be exceptions such as when sequences exist in
529  // and ICache service, but even then, performance is comparable
530  // so there is limited penalty for being last priority.)
531  if (loaders & fGenbank) {
532  x_SetupGenbankDataLoader(args, obj_mgr, priority, loaders);
533  }
534 }
535 
536 
538 {
539  CRef<objects::CObjectManager> object_manager = objects::CObjectManager::GetInstance();
540  CDataLoadersUtil::SetupObjectManager(args, *object_manager);
541  CRef<objects::CScope> scope(new objects::CScope(*object_manager));
542  scope->AddDefaults();
543  return scope;
544 }
545 
546 
547 
Data loader implementation that uses the blast databases.
CArgDescriptions –.
Definition: ncbiargs.hpp:541
CArgs –.
Definition: ncbiargs.hpp:379
static TRegisterLoaderInfo RegisterInObjectManager(CObjectManager &om, const string &db_path, CObjectManager::EIsDefault is_default=CObjectManager::eNonDefault, CObjectManager::TPriority priority=CObjectManager::kPriority_NotSet)
static TRegisterLoaderInfo RegisterInObjectManager(CObjectManager &om, const string &dbname="nr", const EDbType dbtype=eUnknown, bool use_fixed_size_slices=true, CObjectManager::EIsDefault is_default=CObjectManager::eNonDefault, CObjectManager::TPriority priority=CObjectManager::kPriority_NotSet)
Definition: bdbloader.cpp:52
EDbType
Describes the type of blast database to use.
Definition: bdbloader.hpp:57
@ eNucleotide
nucleotide database
Definition: bdbloader.hpp:58
@ eProtein
protein database
Definition: bdbloader.hpp:59
@ eUnknown
protein is attempted first, then nucleotide
Definition: bdbloader.hpp:60
static TRegisterLoaderInfo RegisterInObjectManager(CObjectManager &om, const SLoaderParams &params, CObjectManager::EIsDefault is_default=CObjectManager::eNonDefault, CObjectManager::TPriority priority=CObjectManager::kPriority_NotSet)
Definition: csraloader.cpp:254
static void x_SetupLDS2DataLoader(const CArgs &args, objects::CObjectManager &obj_mgr, int &priority)
static void SetupObjectManager(const CArgs &args, objects::CObjectManager &obj_mgr, TLoaders loaders=fDefault)
Set up the standard object manager data loaders according to the arguments provided above.
static void x_SetupSRADataLoader(const CArgs &args, objects::CObjectManager &obj_mgr, int &priority)
static void x_SetupVDBDataLoader(const CArgs &args, objects::CObjectManager &obj_mgr, int &priority, TLoaders loaders)
static CRef< objects::CScope > GetDefaultScope(const CArgs &args)
static void x_SetupBlastDataLoader(const CArgs &args, objects::CObjectManager &obj_mgr, int &priority)
static void x_SetupGenbankDataLoader(const CArgs &args, objects::CObjectManager &obj_mgr, int &priority, TLoaders loaders)
static void x_SetupASNCacheDataLoader(const CArgs &args, objects::CObjectManager &obj_mgr, int &priority)
static void SetupGenbankDataLoader(const CArgs &args, objects::CObjectManager &obj_mgr)
Set up just the GenBank data loader.
CDirEntry –.
Definition: ncbifile.hpp:262
CDir –.
Definition: ncbifile.hpp:1695
CFile –.
Definition: ncbifile.hpp:1604
static TRegisterLoaderInfo RegisterInObjectManager(CObjectManager &om, CReader *reader=0, CObjectManager::EIsDefault is_default=CObjectManager::eDefault, CObjectManager::TPriority priority=CObjectManager::kPriority_NotSet)
Definition: gbloader.cpp:366
void SetEnableSNP(bool enable)
Definition: gbloader.cpp:164
void SetLoaderMethod(const string &loader_method)
Definition: gbloader.hpp:112
void SetEnableWGS(bool enable)
Definition: gbloader.cpp:179
void SetEnableCDD(bool enable)
Definition: gbloader.cpp:194
static TRegisterLoaderInfo RegisterInObjectManager(CObjectManager &om, CObjectManager::EIsDefault is_default=CObjectManager::eNonDefault, CObjectManager::TPriority priority=CObjectManager::kPriority_NotSet)
Argument-less loader - for compatibility only, unusable.
static CNcbiApplication * Instance(void)
Singleton method.
Definition: ncbiapp.cpp:244
CNcbiRegistry –.
Definition: ncbireg.hpp:913
CObjectManager –.
static TRegisterLoaderInfo RegisterInObjectManager(CObjectManager &om, const SLoaderParams &params, CObjectManager::EIsDefault is_default=CObjectManager::eNonDefault, CObjectManager::TPriority priority=CObjectManager::kPriority_NotSet)
Definition: wgsloader.cpp:85
const CNcbiRegistry & GetConfig(void) const
Get the application's cached configuration parameters (read-only).
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
Definition: ncbimisc.hpp:815
bool Exist(const string &name) const
Check existence of argument description.
Definition: ncbiargs.cpp:1813
EDependency
Dependencies between arguments.
Definition: ncbiargs.hpp:955
vector< string > TStringArray
Some values types can contain several value lists.
Definition: ncbiargs.hpp:293
@ fAllowMultiple
Repeated key arguments are legal (use with AddKey)
Definition: ncbiargs.hpp:635
@ fHidden
Hide it in Usage.
Definition: ncbiargs.hpp:662
@ eRequires
One argument requires another.
Definition: ncbiargs.hpp:956
@ eExcludes
One argument excludes another.
Definition: ncbiargs.hpp:957
@ eBoolean
{'true', 't', 'false', 'f'}, case-insensitive
Definition: ncbiargs.hpp:590
@ eString
An arbitrary string.
Definition: ncbiargs.hpp:589
void DBAPI_RegisterDriver_FTDS(void)
#define ERR_POST(message)
Error posting with file, line number information but without error codes.
Definition: ncbidiag.hpp:186
#define LOG_POST(message)
This macro is deprecated and it's strongly recomended to move in all projects (except tests) to macro...
Definition: ncbidiag.hpp:226
void Error(CExceptionArgs_Base &args)
Definition: ncbiexpt.hpp:1197
void Warning(CExceptionArgs_Base &args)
Definition: ncbiexpt.hpp:1191
void Info(CExceptionArgs_Base &args)
Definition: ncbiexpt.hpp:1185
static string NormalizePath(const string &path, EFollowLinks follow_links=eIgnoreLinks)
Normalize a path.
Definition: ncbifile.cpp:820
static string CreateAbsolutePath(const string &path, ERelativeToWhat rtw=eRelativeToCwd)
Get an absolute path from some, possibly relative, path.
Definition: ncbifile.cpp:665
string GetDir(EIfEmptyPath mode=eIfEmptyPath_Current) const
Get the directory component for this directory entry.
Definition: ncbifile.cpp:475
string GetName(void) const
Get the base entry name with extension (if any).
Definition: ncbifile.hpp:3916
virtual const string & Get(const string &section, const string &name, TFlags flags=0) const
Get the parameter value.
Definition: ncbireg.cpp:262
#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 list< string > & Split(const CTempString str, const CTempString delim, list< string > &arr, TSplitFlags flags=0, vector< SIZE_TYPE > *token_pos=NULL)
Split a string using specified delimiters.
Definition: ncbistr.cpp:3457
static bool StartsWith(const CTempString str, const CTempString start, ECase use_case=eCase)
Check if a string starts with a specified prefix value.
Definition: ncbistr.hpp:5411
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:5352
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.
Definition: ncbistr.hpp:673
static string TruncateSpaces(const string &str, ETrunc where=eTrunc_Both)
Truncate spaces in a string.
Definition: ncbistr.cpp:3182
@ eNocase
Case insensitive compare.
Definition: ncbistr.hpp:1206
int i
T max(T x_, T y_)
The Object manager core.
void GenBankReaders_Register_Pubseq2(void)
void GenBankReaders_Register_Pubseq(void)
Defines CRequestContext class for NCBI C++ diagnostic API.
Modified on Sat Dec 02 09:24:08 2023 by modify_doxy.py rev. 669887