source: tags/ms_r16q3/SL/FILTER/AP_filter.cxx

Last change on this file was 15176, checked in by westram, 8 years ago
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.3 KB
Line 
1// =============================================================== //
2//                                                                 //
3//   File      : AP_filter.cxx                                     //
4//   Purpose   :                                                   //
5//                                                                 //
6//   Institute of Microbiology (Technical University Munich)       //
7//   http://www.arb-home.de/                                       //
8//                                                                 //
9// =============================================================== //
10
11#include "AP_filter.hxx"
12#include <arbdb.h>
13
14// ------------------
15//      AP_filter
16
17void AP_filter::init(size_t size) {
18    filter_mask        = new bool[size];
19    filter_len         = size;
20    update             = AP_timer();
21    simplify_type      = AWT_FILTER_SIMPLIFY_NOT_INITIALIZED;
22    simplify[0]        = 0; // silence cppcheck-warning
23    bootstrap          = NULL;
24    filterpos_2_seqpos = NULL;
25#if defined(ASSERTION_USED)
26    checked_for_validity = false;
27#endif
28}
29
30
31AP_filter::AP_filter(size_t size) {
32    make_permeable(size);
33}
34
35AP_filter::AP_filter(const AP_filter& other)
36    : filter_mask(new bool[other.filter_len]),
37      filter_len(other.filter_len),
38      real_len(other.real_len),
39      update(other.update),
40      simplify_type(other.simplify_type),
41      bootstrap(NULL),
42      filterpos_2_seqpos(NULL)
43{
44    memcpy(filter_mask, other.filter_mask, filter_len*sizeof(*filter_mask));
45    memcpy(simplify, other.simplify, sizeof(simplify)*sizeof(*simplify));
46    if (other.bootstrap) {
47        bootstrap = new size_t[real_len];
48        memcpy(bootstrap, other.bootstrap, real_len*sizeof(*bootstrap));
49    }
50    if (other.filterpos_2_seqpos) {
51        filterpos_2_seqpos = new size_t[real_len];
52        memcpy(filterpos_2_seqpos, other.filterpos_2_seqpos, real_len*sizeof(*filterpos_2_seqpos));
53    }
54#if defined(ASSERTION_USED)
55    checked_for_validity = other.checked_for_validity;
56#endif
57}
58
59AP_filter::~AP_filter() {
60    delete [] bootstrap;
61    delete [] filter_mask;
62    delete [] filterpos_2_seqpos;
63}
64
65AP_filter::AP_filter(const char *ifilter, const char *zerobases, size_t size) {
66    if (!ifilter || !*ifilter) {
67        make_permeable(size);
68    }
69    else {
70        init(size);
71
72        bool   char2mask[256];
73        size_t i;
74
75        for (i = 0; i<256; ++i) char2mask[i] = true;
76        if (zerobases) {
77            for (i = 0; zerobases[i]; ++i) char2mask[safeCharIndex(zerobases[i])] = false;
78        }
79        else {
80            char2mask['0'] = false;
81        }
82
83        real_len = 0;
84        for (i = 0; i < size && ifilter[i]; ++i) {
85            real_len += int(filter_mask[i] = char2mask[safeCharIndex(ifilter[i])]);
86        }
87        for (; i < size; i++) {
88            filter_mask[i] = true;
89            real_len++;
90        }
91    }
92}
93
94void AP_filter::make_permeable(size_t size) {
95    init(size);
96    real_len = filter_len;
97    for (size_t i = 0; i < size; i++) filter_mask[i] = true;
98}
99
100char *AP_filter::to_string() const {
101    af_assert(checked_for_validity);
102
103    char *data = ARB_alloc<char>(filter_len+1);
104
105    for (size_t i=0; i<filter_len; ++i) {
106        data[i] = "01"[filter_mask[i]];
107    }
108    data[filter_len] = 0;
109
110    return data;
111}
112
113
114void AP_filter::enable_simplify(AWT_FILTER_SIMPLIFY type) {
115    if (type != simplify_type) {
116        int i;
117        for (i=0; i<32; i++) {
118            simplify[i] = '.';
119        }
120        for (; i<256; i++) {
121            simplify[i] = i;
122        }
123        switch (type) {
124            case AWT_FILTER_SIMPLIFY_DNA:
125                simplify[(unsigned char)'g'] = 'a';
126                simplify[(unsigned char)'G'] = 'A';
127                simplify[(unsigned char)'u'] = 'c';
128                simplify[(unsigned char)'t'] = 'c';
129                simplify[(unsigned char)'U'] = 'C';
130                simplify[(unsigned char)'T'] = 'C';
131                break;
132            case AWT_FILTER_SIMPLIFY_PROTEIN:
133                af_assert(0);                           // not implemented or impossible!?
134                break;
135            case AWT_FILTER_SIMPLIFY_NONE:
136                break;
137            default:
138                af_assert(0);
139                break;
140        }
141
142        simplify_type = type;
143    }
144}
145
146void AP_filter::calc_filterpos_2_seqpos() {
147    af_assert(checked_for_validity);
148    af_assert(real_len>0);
149
150    delete [] filterpos_2_seqpos;
151    filterpos_2_seqpos = new size_t[real_len];
152    size_t i, j;
153    for (i=j=0; i<filter_len; ++i) {
154        if (filter_mask[i]) {
155            filterpos_2_seqpos[j++] = i;
156        }
157    }
158}
159
160void AP_filter::enable_bootstrap() {
161    af_assert(checked_for_validity);
162    af_assert(real_len>0);
163
164    delete [] bootstrap;
165    bootstrap = new size_t[real_len];
166
167    af_assert(filter_len < RAND_MAX);
168
169    for (size_t i = 0; i<real_len; ++i) {
170        int r = GB_random(real_len);
171        af_assert(r >= 0);     // otherwise overflow in random number generator
172        bootstrap[i] = r;
173    }
174}
175
176char *AP_filter::blowup_string(char *filtered_string, char fillChar) const {
177    /*! blow up 'filtered_string' to unfiltered length
178     * by inserting 'fillChar' at filtered positions
179     */
180    af_assert(checked_for_validity);
181
182    char   *blownup = ARB_alloc<char>(filter_len+1);
183    size_t  f       = 0;
184
185    for (size_t i = 0; i<filter_len; ++i) {
186        blownup[i] = use_position(i) ? filtered_string[f++] : fillChar;
187    }
188
189    return blownup;
190}
191
192
193// -------------------
194//      AP_weights
195
196AP_weights::AP_weights(const AP_filter *fil)
197    : len(fil->get_filtered_length()),
198      weights(NULL)
199{
200}
201
202AP_weights::AP_weights(const GB_UINT4 *w, size_t wlen, const AP_filter *fil)
203    : len(fil->get_filtered_length()),
204      weights(NULL)
205{
206    ARB_alloc_aligned(weights, len);
207
208    af_assert(wlen == fil->get_length());
209
210    size_t i, j;
211    for (j=i=0; j<wlen; ++j) {
212        if (fil->use_position(j)) {
213            weights[i++] = w[j];
214        }
215    }
216    af_assert(j <= fil->get_length());
217    af_assert(i == fil->get_filtered_length());
218}
219
220AP_weights::AP_weights(const AP_weights& other)
221    : len(other.len),
222      weights(NULL)
223{
224    if (other.weights != NULL) {
225        ARB_alloc_aligned(weights, len);
226        memcpy(weights, other.weights, len*sizeof(*weights));
227    }
228}
229
230AP_weights::~AP_weights() {
231    free(weights);
232}
233
234long AP_timer() {
235    static long time = 0;
236    return ++time;
237}
238
239
Note: See TracBrowser for help on using the repository browser.