source: tags/arb-6.0-rc1/RNACMA/AlignedSequenceLoader.cxx

Last change on this file was 8940, checked in by westram, 13 years ago
  • added MBI copyright
  • fixed include wrappers
  • fixed cppcheck warning
File size: 5.1 KB
Line 
1/*
2 * AlignedSequenceLoader.cxx
3 *
4 *  Created on: Feb 15, 2010
5 *      Author: Breno Faria
6 *
7 *  Institute of Microbiology (Technical University Munich)
8 *  http://www.arb-home.de/
9 */
10
11
12#include "AlignedSequenceLoader.h"
13
14#include <arbdb.h>
15#include <arbdbt.h>
16#include "dbconn.h"
17
18/**
19 * Loads the marked sequences aligned from Arb's DB.
20 * This loader only considers letters given by the following regular
21 * expression: [ACGTUacgtu]
22 */
23AlignedSequenceLoader::AlignedSequenceLoader() {
24
25    GBDATA *gb_main = runningDatabase();
26
27    GB_ERROR error = GB_push_transaction(gb_main);
28    if (error)
29        exit(1);
30
31    seqs = new VecVecType(0);
32
33    char *al_name = GBT_get_default_alignment(gb_main);
34    MSA_len = GBT_get_alignment_len(gb_main, al_name);
35
36    size_t occurrences[MSA_len];
37    for (size_t i = 0; i < MSA_len; i++)
38        occurrences[i] = 0;
39
40    cout << "loading marked species: ";
41    flush( cout);
42    for (GBDATA *gb_species = GBT_first_marked_species(gb_main); gb_species; gb_species
43             = GBT_next_marked_species(gb_species)) {
44
45        GBDATA *gb_ali = GB_entry(gb_species, al_name);
46
47        if (gb_ali) { // existing alignment for this species
48            GBDATA *gb_data = GB_entry(gb_ali, "data");
49
50            if (gb_data) {
51
52                cout << GBT_read_name(gb_species) << " ";
53                flush(cout);
54
55                string sequence = GB_read_string(gb_data);
56
57                string *seq_as_vec = new string[MSA_len];
58                int     k          = 0;
59                for (string::iterator i = sequence.begin(); i != sequence.end(); ++i) {
60                    switch (*i) {
61                        case 'A':
62                        case 'a':
63                            seq_as_vec[k] = "A";
64                            occurrences[k] += 1;
65                            break;
66                        case 'C':
67                        case 'c':
68                            seq_as_vec[k] = "C";
69                            occurrences[k] += 1;
70                            break;
71                        case 'G':
72                        case 'g':
73                            seq_as_vec[k] = "G";
74                            occurrences[k] += 1;
75                            break;
76                        case 'T':
77                        case 't':
78                        case 'U':
79                        case 'u':
80                            seq_as_vec[k] = "T";
81                            occurrences[k] += 1;
82                            break;
83                        default:
84                            seq_as_vec[k] = "-";
85                            break;
86                    }
87                    k++;
88                }
89
90                assert((size_t)k == MSA_len);
91                vector<string> seq_vector(&seq_as_vec[0], &seq_as_vec[k]);
92                delete [] seq_as_vec;
93
94                seqs->push_back(seq_vector);
95            }
96        }
97
98    }
99
100    GB_pop_transaction(gb_main);
101
102    cout << "done. Total number of species: " << seqs->size() << endl;
103    flush(cout);
104
105    cleanSeqs(occurrences, MSA_len);
106}
107
108/**
109 * Returns the aligned seqs.
110 *
111 * @return the aligned seqs.
112 */
113VecVecType* AlignedSequenceLoader::getSequences() {
114    return seqs;
115}
116
117/**
118 * Destructor.
119 */
120AlignedSequenceLoader::~AlignedSequenceLoader() {
121    delete seqs;
122}
123
124/**
125 * Getter for the MSA_len.
126 *
127 * @return the MSA length.
128 */
129size_t AlignedSequenceLoader::getMsaLen() {
130    return MSA_len;
131}
132
133/**
134 * Getter for the position map. The position map maps positions in the clean
135 * sequence to the original positions in the alignment.
136 *
137 * @return the position map.
138 */
139vector<size_t> * AlignedSequenceLoader::getPositionMap() {
140    return position_map;
141}
142
143/**
144 * This method cleans-up the empty positions of the MSA.
145 *
146 *
147 * @param occurrences: a list gathering the number of occurrences of bases at
148 *                     each position of the MSA.
149 * @param len: the length of occurrences.
150 */
151void AlignedSequenceLoader::cleanSeqs(size_t *occurrences, long len) {
152
153    cout << "cleaning-up sequences of empty positions... " << endl;
154    flush( cout);
155
156    size_t num_of_bases = 0;
157    for (int i = 0; i < len; i++) {
158        if (occurrences[i] != 0) {
159            num_of_bases++;
160        }
161    }
162
163    cout << "number of non-empty positions in MSA: " << num_of_bases
164         << ". Filtered out " << len - num_of_bases << " positions." << endl;
165
166    VecVecType *clean_seqs = new VecVecType(0);
167
168    cout << "computing position map..." << endl;
169    position_map = new vector<size_t> (num_of_bases, 0);
170    int j = 0;
171    for (int i = 0; i < len; i++) {
172        if (occurrences[i] != 0) {
173            position_map->at(j) = i;
174            j++;
175        }
176    }
177
178    for (VecVecType::iterator seq = seqs->begin(); seq != seqs->end(); ++seq) {
179        //for every sequence
180        vector<string> sequence(num_of_bases, "");
181        int jj = 0;
182        for (int i = 0; i < len; ++i) {
183            if (occurrences[i] != 0) {
184                sequence.at(jj) = seq->at(i);
185                jj++;
186            }
187        }
188        assert(sequence.size() == num_of_bases);
189        clean_seqs->push_back(sequence);
190    }
191
192    seqs = clean_seqs;
193
194    cout << "clean-up done." << endl;
195
196}
197
Note: See TracBrowser for help on using the repository browser.