ARB
arb_probe_match.cxx
Go to the documentation of this file.
1 #include <arbdb.h>
2 #include <PT_com.h>
3 #include <client.h>
4 
5 #include <iostream>
6 
7 using std::cerr;
8 using std::endl;
9 
10 static void help() {
11  cerr <<
12  "Executes a probe match on a running PT server\n"
13  "\n"
14  "Parameters:\n"
15  "\n"
16  " --port <PORT> port of PT server\n"
17  " --sequence <SEQUENCE> probe\n"
18  "\n"
19  " --complementFirst before matching first complement probe (applied before '--alsoRevCompl')\n"
20  " --alsoRevCompl also report matches of reverse-complement probe\n"
21  " (Note: specifying both does report complement plus reverse matches)\n"
22  "\n"
23  " --max-hits <NUM> maximum number of hits (default:1,000,000; 0 means 'unlimited')\n"
24  " --weighted use weighted matching\n"
25  " --weighted-pos use weighted matching with pos&strength\n"
26  " --n-matches <NUM1> accept NUM1 occurrences of 'N' as match (default:2)\n"
27  " --n-match-bound <NUM2> when NUM2 occurrences of 'N' are encountered => all 'N's count as mismatch (default:5)\n"
28  " (inbetween all 'N' above NUM1 count as mismatch)"
29  " --mismatches <NUM> accept NUM mismatches (default:0)\n"
30 
31  << endl;
32 }
33 
38 };
39 
40 int ARB_main(int argc, char ** argv) {
41  const char* port = NULp;
42  const char* sequence = NULp;
43  int alsoRevCompl = 0;
44  int complementFirst = 0;
45  int max_hits = 1000000;
47  int n_accept = 2;
48  int n_limit = 5;
49  int max_mismatches = 0;
50 
51  GB_shell shell;
52 
53  if (argc<2) {
54  help();
55  return 0;
56  }
57 
58  for (int i = 1; i < argc; i++) {
59  int err = 0;
60  if (!strcmp(argv[i], "--help")) {
61  help();
62  return 0;
63  } else if (!strcmp(argv[i], "--alsoRevCompl")) {
64  alsoRevCompl = 1;
65  } else if (!strcmp(argv[i], "--complementFirst")) {
66  complementFirst = 1;
67  } else if (!strcmp(argv[i], "--weighted")) {
69  } else if (!strcmp(argv[i], "--weighted-pos")) {
71  } else if (argc > i+1) {
72  if (!strcmp(argv[i], "--port")) {
73  port = argv[++i];
74  } else if (!strcmp(argv[i], "--sequence")) {
75  sequence = argv[++i];
76  } else if (!strcmp(argv[i], "--max-hits")) {
77  max_hits = atoi(argv[++i]);
78  } else if (!strcmp(argv[i], "--n-matches")) {
79  n_accept = atoi(argv[++i]);
80  } else if (!strcmp(argv[i], "--n-match-bound")) {
81  n_limit = atoi(argv[++i]);
82  } else if (!strcmp(argv[i], "--mismatches")) {
83  max_mismatches = atoi(argv[++i]);
84  } else {
85  err = 1;
86  }
87  } else {
88  err = 1;
89  }
90  if (err) {
91  cerr << "Error: Did not understand argument '" << argv[i]
92  << "'." << endl << endl;
93  help();
94  return 1;
95  }
96  }
97 
98  bool err = false;
99 
100  if (!port) {
101  cerr << "need '--port' parameter" << endl;
102  err = true;
103  }
104  if (!sequence) {
105  cerr << "need '--sequence' parameter" << endl;
106  err = true;
107  }
108  if (max_mismatches < 0 || max_mismatches > 10) {
109  cerr << "mismatches must be between 0 and 10" << endl;
110  err = true;
111  }
112  if (err) {
113  help();
114  return 1;
115  }
116 
117  T_PT_LOCS locs;
118  T_PT_MAIN com;
119  GB_ERROR error = NULp;
120  aisc_com *link = aisc_open(port, com, AISC_MAGIC_NUMBER, &error);
121 
122  if (!error) {
123  if (!link) {
124  error = "Cannot contact PT server [1]";
125  }
126  else if (aisc_create(link, PT_MAIN, com, MAIN_LOCS, PT_LOCS, locs, NULp)) {
127  error = "Cannot contact PT server [2]";
128  }
129  }
130 
131  if (error) {
132  cerr << "Error in arb_probe_match: " << error << endl;
133  return 1;
134  }
135 
136  if (aisc_nput(link, PT_LOCS, locs,
137  LOCS_MATCH_ALSO_REVCOMP, (long)alsoRevCompl,
138  LOCS_COMPLEMENT_FIRST, (long)complementFirst,
139  LOCS_MATCH_MAX_HITS, (long)max_hits,
140  LOCS_MATCH_SORT_BY, (long)sort_by,
141  LOCS_MATCH_N_ACCEPT, (long)n_accept,
142  LOCS_MATCH_N_LIMIT, (long)n_limit,
143  LOCS_MATCH_MAX_MISMATCHES, (long)max_mismatches,
144  LOCS_SEARCHMATCH, sequence,
145  NULp)) {
146  cerr << "Connection to PT server lost" << endl;
147  return 1;
148  }
149 
150  T_PT_MATCHLIST match_list;
151 
152  long match_list_cnt = 0;
153  long matches_truncated = 0;
154 
155  bytestring bs;
156  bs.data = NULp;
157 
158  char *locs_error = NULp;
159 
160  aisc_get(link, PT_LOCS, locs,
161  LOCS_MATCH_LIST, match_list.as_result_param(),
162  LOCS_MATCH_LIST_CNT, &match_list_cnt,
163  LOCS_MATCH_STRING, &bs,
164  LOCS_MATCHES_TRUNCATED, &matches_truncated,
165  LOCS_ERROR, &locs_error,
166  NULp);
167 
168  if (locs_error) {
169  if (*locs_error) cerr << "received error: " << *locs_error << endl;
170  free(locs_error);
171  }
172 
173  if (matches_truncated) {
174  std::cout << "match list was truncated!" << endl;
175  }
176 
177  std::cout << "acc \t"
178  << "start\t"
179  << "stop\t"
180  << "pos\t"
181  << "mis\t"
182  << "wmis\t"
183  << "nmis\t"
184  << "dt\t"
185  << "rev\t"
186  << "seq"
187  << std::endl;
188 
189  while (match_list.exists()) {
190  char *m_acc, *m_sequence;
191  long m_start, m_stop, m_pos, m_mismatches, m_n_mismatches;
192  long m_reversed;
193  double m_wmismatches, m_dt;
194 
195  aisc_get(link, PT_MATCHLIST, match_list,
196  MATCHLIST_FIELD_ACC, &m_acc,
197  MATCHLIST_FIELD_START, &m_start,
198  MATCHLIST_FIELD_STOP, &m_stop,
199  MATCHLIST_POS, &m_pos,
200  MATCHLIST_MISMATCHES, &m_mismatches,
201  MATCHLIST_WMISMATCHES, &m_wmismatches,
202  MATCHLIST_N_MISMATCHES, &m_n_mismatches,
203  MATCHLIST_DT, &m_dt,
204  MATCHLIST_OVERLAY, &m_sequence,
205  MATCHLIST_REVERSED, &m_reversed,
206  MATCHLIST_NEXT, match_list.as_result_param(),
207  NULp);
208 
209  std::cout << m_acc << "\t"
210  << m_start << "\t"
211  << m_stop << "\t"
212  << m_pos << "\t"
213  << m_mismatches << "\t"
214  << m_wmismatches << "\t"
215  << m_n_mismatches << "\t"
216  << m_dt << "\t"
217  << m_reversed << "\t"
218  << m_sequence << "\t"
219  << std::endl;
220  fflush(stdout);
221 
222  free(m_acc);
223  free(m_sequence);
224  }
225 
226  free(bs.data);
227  aisc_close(link, com);
228  return 0;
229 }
230 
231 
int aisc_close(aisc_com *link, AISC_Object &object)
Definition: client.c:249
int aisc_nput(aisc_com *link, int o_type, const AISC_Object &object,...)
Definition: client.c:564
int ARB_main(int argc, char **argv)
fflush(stdout)
SORT_BY_TYPE
T_PT_MAIN com
char * data
Definition: bytestring.h:16
static void error(const char *msg)
Definition: mkptypes.cxx:96
#define AISC_MAGIC_NUMBER
Definition: client_privat.h:51
T_PT_LOCS locs
aisc_com * link
aisc_com * aisc_open(const char *path, AISC_Object &main_obj, long magic, GB_ERROR *error)
Definition: client.c:205
#define NULp
Definition: cxxforward.h:116
int aisc_get(aisc_com *link, int o_type, const AISC_Object &object,...)
Definition: client.c:266
static void help()
int aisc_create(aisc_com *link, int father_type, const AISC_Object &father, int attribute, int object_type, AISC_Object &object,...)
Definition: client.c:593