1
// =============================================================== //
3
// File : AP_filter.cxx //
6
// Institute of Microbiology (Technical University Munich) //
7
// http://www.arb-home.de/ //
9
// =============================================================== //
11
#include "AP_filter.hxx"
18
void AP_filter::init(size_t size) {
19
filter_mask = new bool[size];
22
simplify_type = AWT_FILTER_SIMPLIFY_NOT_INITIALIZED;
23
simplify[0] = 0; // silence cppcheck-warning
25
filterpos_2_seqpos = NULL;
26
#if defined(ASSERTION_USED)
27
checked_for_validity = false;
32
AP_filter::AP_filter(size_t size) {
36
AP_filter::AP_filter(const AP_filter& other)
37
: filter_mask(new bool[other.filter_len]),
38
filter_len(other.filter_len),
39
real_len(other.real_len),
41
simplify_type(other.simplify_type),
43
filterpos_2_seqpos(NULL)
45
memcpy(filter_mask, other.filter_mask, filter_len*sizeof(*filter_mask));
46
memcpy(simplify, other.simplify, sizeof(simplify)*sizeof(*simplify));
47
if (other.bootstrap) {
48
bootstrap = new size_t[real_len];
49
memcpy(bootstrap, other.bootstrap, real_len*sizeof(*bootstrap));
51
if (other.filterpos_2_seqpos) {
52
filterpos_2_seqpos = new size_t[real_len];
53
memcpy(filterpos_2_seqpos, other.filterpos_2_seqpos, real_len*sizeof(*filterpos_2_seqpos));
55
#if defined(ASSERTION_USED)
56
checked_for_validity = other.checked_for_validity;
60
AP_filter::~AP_filter() {
62
delete [] filter_mask;
63
delete [] filterpos_2_seqpos;
66
AP_filter::AP_filter(const char *ifilter, const char *zerobases, size_t size) {
67
if (!ifilter || !*ifilter) {
76
for (i = 0; i<256; ++i) char2mask[i] = true;
78
for (i = 0; zerobases[i]; ++i) char2mask[safeCharIndex(zerobases[i])] = false;
81
char2mask['0'] = false;
85
for (i = 0; i < size && ifilter[i]; ++i) {
86
real_len += int(filter_mask[i] = char2mask[safeCharIndex(ifilter[i])]);
88
for (; i < size; i++) {
89
filter_mask[i] = true;
95
void AP_filter::make_permeable(size_t size) {
97
real_len = filter_len;
98
for (size_t i = 0; i < size; i++) filter_mask[i] = true;
101
char *AP_filter::to_string() const {
102
af_assert(checked_for_validity);
104
char *data = (char*)malloc(filter_len+1);
106
for (size_t i=0; i<filter_len; ++i) {
107
data[i] = "01"[filter_mask[i]];
109
data[filter_len] = 0;
115
void AP_filter::enable_simplify(AWT_FILTER_SIMPLIFY type) {
116
if (type != simplify_type) {
118
for (i=0; i<32; i++) {
125
case AWT_FILTER_SIMPLIFY_DNA:
126
simplify[(unsigned char)'g'] = 'a';
127
simplify[(unsigned char)'G'] = 'A';
128
simplify[(unsigned char)'u'] = 'c';
129
simplify[(unsigned char)'t'] = 'c';
130
simplify[(unsigned char)'U'] = 'C';
131
simplify[(unsigned char)'T'] = 'C';
133
case AWT_FILTER_SIMPLIFY_PROTEIN:
134
af_assert(0); // not implemented or impossible!?
136
case AWT_FILTER_SIMPLIFY_NONE:
143
simplify_type = type;
147
void AP_filter::calc_filterpos_2_seqpos() {
148
af_assert(checked_for_validity);
149
af_assert(real_len>0);
151
delete [] filterpos_2_seqpos;
152
filterpos_2_seqpos = new size_t[real_len];
154
for (i=j=0; i<filter_len; ++i) {
155
if (filter_mask[i]) {
156
filterpos_2_seqpos[j++] = i;
161
void AP_filter::enable_bootstrap() {
162
af_assert(checked_for_validity);
163
af_assert(real_len>0);
166
bootstrap = new size_t[real_len];
168
af_assert(filter_len < RAND_MAX);
170
for (size_t i = 0; i<real_len; ++i) {
171
int r = GB_random(real_len);
172
af_assert(r >= 0); // otherwise overflow in random number generator
177
char *AP_filter::blowup_string(char *filtered_string, char fillChar) const {
178
/*! blow up 'filtered_string' to unfiltered length
179
* by inserting 'fillChar' at filtered positions
181
af_assert(checked_for_validity);
183
char *blownup = (char*)malloc(filter_len+1);
186
for (size_t i = 0; i<filter_len; ++i) {
187
blownup[i] = use_position(i) ? filtered_string[f++] : fillChar;
194
// -------------------
197
AP_weights::AP_weights(const AP_filter *fil)
198
: len(fil->get_filtered_length())
199
, weights(new GB_UINT4[len])
201
for (size_t i = 0; i<len; ++i) weights[i] = 1;
204
AP_weights::AP_weights(const GB_UINT4 *w, size_t wlen, const AP_filter *fil)
205
: len(fil->get_filtered_length())
206
, weights(new GB_UINT4[len])
208
af_assert(wlen == fil->get_length());
211
for (j=i=0; j<wlen; ++j) {
212
if (fil->use_position(j)) {
216
af_assert(j <= fil->get_length());
217
af_assert(i == fil->get_filtered_length());
220
AP_weights::AP_weights(const AP_weights& other)
222
, weights(new GB_UINT4[len])
224
memcpy(weights, other.weights, len*sizeof(*weights));
227
AP_weights::~AP_weights() {
232
static long time = 0;