30 bool accept_missing_data;
38 typedef std::list<FilterDefinitionPtr> FilterDefinitionList;
40 FilterDefinitionList def_filters;
42 static inline const char *getarg(
int& argc,
const char**& argv) {
43 return argc>0 ? (--argc,*argv++) :
NULp;
45 inline const char *expect_arg(
int& argc,
const char**& argv) {
46 const char *arg = getarg(argc, argv);
48 error =
"expected argument missing";
55 "arb_export_seq_filtered -- export sequences filtered by SAI\n"
56 "Usage: arb_export_seq_filtered [switches]\n"
59 " <chars> defines a set of characters (for blocking/passthrough).\n"
60 " It may contain alphanumeric ranges, e.g. '0-5' which is equiv. to '012345'.\n"
61 " To specify a literal '-' put it at start or end of <chars>.\n"
64 "--db <dbname> ARB database to export from\n"
65 "--fasta <outname> name of generated fasta file\n"
67 "--id <aci> specify content for fasta header using ACI\n"
68 " (default: \"readdb(name)\"; see http://help.arb-home.de/aci.html)\n"
70 "--ali <aliname> name of alignment to use (default: use default alignment)\n"
71 "--accept-missing-data silently skip species w/o data (default: abort with error)\n"
72 "--seqpp <aci> specify ACI to postprocess sequence data (default: none; example dot->hyphen: \":.=-\")\n"
74 "--filterby <SAI> filter sequences using <SAI> (SAI has to be stored in database)\n"
75 "--block [allbut] <chars> exclude columns where <SAI> contains any of <chars>\n"
76 "--pass [allbut] <chars> include columns where <SAI> contains any of <chars>\n"
77 " (specifying 'allbut' will invert the set of <chars>)\n"
79 "--min-bases <count> min. base count of exported data (after filtering).\n"
80 " Export of species is skipped if not reached and\n"
81 " a diagnostic message gets written to stderr.\n"
82 "--count-bases <chars> defines base-characters to count (default: \"a-zA-Z\")\n"
87 const char *missing_passBlock() {
return "--filterby has to be followed by --pass or --block"; }
88 const char *missing_filterby() {
return "--pass and --block have to be preceeded by --filterby"; }
91 if (def) def_filters.push_back(def);
95 string arg = expect_arg(argc, argv);
97 bool filter_chars =
true;
99 if (arg ==
"allbut") {
100 filter_chars =
false;
101 arg = expect_arg(argc, argv);
105 if (filterby.empty()) {
106 error = missing_filterby();
117 void parse(
int& argc,
const char**& argv) {
118 const char *arg = getarg(argc, argv);
120 if (strcmp(arg,
"--db") == 0) database = expect_arg(argc, argv);
121 else if (strcmp(arg,
"--fasta") == 0) fasta = expect_arg(argc, argv);
122 else if (strcmp(arg,
"--id") == 0) head_aci = expect_arg(argc, argv);
123 else if (strcmp(arg,
"--seqpp") == 0) seq_aci = expect_arg(argc, argv);
124 else if (strcmp(arg,
"--ali") == 0) aliname = expect_arg(argc, argv);
125 else if (strcmp(arg,
"--count-bases") == 0) bases = expect_arg(argc, argv);
127 else if (strcmp(arg,
"--filterby") == 0) {
128 if (!filterby.empty()) error = missing_passBlock();
129 else filterby = expect_arg(argc, argv);
132 else if (strcmp(arg,
"--block") == 0) store_filterdef(expect_filterdef_args(
BLOCK, argc, argv));
133 else if (strcmp(arg,
"--pass") == 0) store_filterdef(expect_filterdef_args(
PASS, argc, argv));
135 else if (strcmp(arg,
"--accept-missing-data") == 0) accept_missing_data =
true;
137 else if (strcmp(arg,
"--min-bases") == 0) min_bases = atoi(expect_arg(argc, argv));
139 else if (strcmp(arg,
"--help") == 0 || strcmp(arg,
"-h") == 0) helpWanted =
true;
146 void check_required_arguments() {
147 if (database.empty()) error =
"no input database specified";
148 else if (fasta.empty()) error =
"no output file specified";
152 CLI(
int argc,
const char **argv) :
155 accept_missing_data(
false),
160 while (!error && argc>0 && !helpWanted) {
165 if (!error && !filterby.empty()) {
166 error = missing_passBlock();
169 check_required_arguments();
170 if (error) helpWanted =
true;
194 for (FilterDefinitionList::const_iterator d = def_filters.begin(); !err && d != def_filters.end(); ++d) {
223 if (!aliname || !aliname[0]) {
225 error =
"no default alignment defined (use --ali to specify alignment name)";
228 fprintf(stderr,
"Using default alignment '%s'\n", aliname);
241 FILE *out = fopen(outname,
"wt");
283 int main(
int argc,
char **argv) {
285 CLI args(argc, const_cast<const char**>(argv));
298 fprintf(stderr,
"Error in arb_export_seq_filtered: %s\n", error);
int get_min_bases_count() const
GBDATA * GB_open(const char *path, const char *opent)
const char * get_fasta() const
const char * get_basechars() const
void GB_unlink_or_warn(const char *path, GB_ERROR *error)
const char * get_head_aci() const
GBDATA * GBT_get_alignment(GBDATA *gb_main, const char *aliname)
GB_ERROR GB_IO_error(const char *action, const char *filename)
const char * GBS_global_string(const char *templat,...)
long GBT_get_alignment_len(GBDATA *gb_main, const char *aliname)
void set_required_baseCount(const char *basesToCount, int minCount_)
static GB_ERROR export_seq_data(const CLI &args)
GB_ERROR write_fasta(FILE *out)
GB_ERROR GB_await_error()
GB_ERROR add_filters_to(FilteredExport &exporter) const
void do_accept_missing_data()
void set_header_ACI(const char *aci)
static void error(const char *msg)
const char * get_database() const
const char * get_aliname() const
void show_help_if_useful() const
fputs(TRACE_PREFIX, stderr)
CLI(int argc, const char **argv)
int main(int argc, char **argv)
const char * get_seq_aci() const
void set_sequence_ACI(const char *aci)
char * GBT_get_default_alignment(GBDATA *gb_main)
GB_ERROR add_SAI_filter(const FilterDefinition &filterDef) __ATTR__USERESULT
GB_transaction ta(gb_var)
bool shall_accept_missing_data() const
GB_ERROR get_error() const
void GB_close(GBDATA *gbd)