source: tags/arb_5.2/ALIV3/a3_seq.cxx

Last change on this file was 5828, checked in by westram, 15 years ago
  • changed ulong→ULONG and uint→UINT (ulong/uint are missing under OSX)
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.9 KB
Line 
1// -----------------------------------------------------------------------------
2//  Include-Dateien
3// -----------------------------------------------------------------------------
4
5#include <iostream>
6#include <fstream>
7#include <cstdlib>
8#include <ctime>
9
10#include <arbdb.h>
11
12#include "a3_basen.h"
13#include "a3_seq.hxx"
14
15#include <inline.h>
16
17using std::ifstream;
18using std::cout;
19
20// -----------------------------------------------------------------------------
21//  Erzeugen einer Zufallssequenz mit vorgebener Laenge
22// -----------------------------------------------------------------------------
23    static str RandomSequence ( UINT len )
24// -----------------------------------------------------------------------------
25{
26    str seq = new char [len + 1];
27
28    if (seq) {
29        UINT pos = 0;
30
31        while (pos < len) {
32            // Sequenz mit zufaellig ausgewaehlten Basen besetzen
33            seq[pos++] = BCharacter[GB_random(BASEN)];
34        }
35        seq[pos] = 0;
36    }
37   
38    return seq;
39}
40
41// -----------------------------------------------------------------------------
42//  Liefert die Kopie einer Sequenz mit vorgegbener Laenge, aus der
43//  alle ueberfluessigen und unzulaessigen Zeichen entfernt wurden.
44// -----------------------------------------------------------------------------
45    static str CompressSequence ( str  sequence,
46                                  UINT length )
47// -----------------------------------------------------------------------------
48{
49    str compressed = NULL;
50   
51    if (sequence && length)
52    {
53        str tmp = new char [length + 1];
54       
55        if (tmp)
56        {
57            str ptr = tmp;
58           
59            while (*sequence)   // Zeichenweises Lesen der Sequenz
60            {
61                switch (BIndex[safeCharIndex(*sequence)])  // Bearbeitung ist abhaengig vom
62                {                           // Typ des jeweiligen Zeichens
63                    case ADENIN:
64                    case CYTOSIN:
65                    case GUANIN:
66                    case URACIL:
67                    case ONE:               // Zulaessige Zeichen werden uebrnommen
68                    {
69                        *ptr++ = *sequence;
70                        break;
71                    }
72                    case ANY:                   // Aufeinanderfolgende, nicht sequenzierte
73                    {                           // Bereiche werden zusammengefasst.
74
75                        if ((ptr == tmp) ||     // Nur ein ANY-Zeichen
76                            ((ptr > tmp) &&
77                             (BIndex[safeCharIndex(*(ptr - 1))] != ANY))) *ptr++ = *sequence;
78
79                        while(*sequence &&      // Ueberspringen
80                              BIndex[safeCharIndex(*sequence)] == ANY) sequence++;
81
82                        sequence--;
83                        break;
84                    }
85                    case INSERT:    break;      // Insertionen werden uebersprungen
86                    case INVALID:
87                    default:                    // Ungueltige oder sonstige Zeichen werden
88                    {                           // als eine beliebige Base dargestellt
89                        *ptr++ = BCharacter[ONE];
90                        break;
91                    }
92                }
93               
94                sequence++;     // Naechste Base der Sequenz
95            }
96
97            *ptr = 0;           // Neue Sequnez mit 0 abschliessen
98
99            compressed = strdup(tmp);   // Kopie der neuen Sequenz
100           
101            delete tmp;
102        }
103    }
104   
105    return compressed;
106}
107
108// -----------------------------------------------------------------------------
109//  Einlesen einer Sequenz aus eine vorgegebene
110//  Datei mit einer vorgegebene Zeilennummer
111// -----------------------------------------------------------------------------
112    static str ReadSequence ( str  file,
113                              UINT line )
114// -----------------------------------------------------------------------------
115{
116    str seq = NULL;
117   
118    if (file && *file)
119    {
120        ifstream input (file);
121       
122        if (input)
123        {
124            int error = 0;
125            str tmp   = NULL;
126           
127            while (!error && line)      // Ueberlesen bis zur gewuenschten Zeile
128            {
129                if (tmp) delete tmp, tmp = NULL;
130               
131//              if (!input.gets(&tmp)) error = 1;
132
133                line--;
134            }
135
136            if (error && tmp)
137            {
138                if      (line)         delete tmp, tmp = NULL;
139                else if (!input.eof()) delete tmp, tmp = NULL;
140            }
141
142            if (((seq = tmp)              != NULL) &&           // Sequenz zurueckgeben
143                ((tmp = strchr(seq,'\n')) != NULL)) *tmp = 0;   // Vorher LF entfernen
144        }
145    }
146
147    return seq;
148}
149
150// -----------------------------------------------------------------------------
151//  Umwandeln der T-Zeichen einer Sequenz in U-Zeichen
152// -----------------------------------------------------------------------------
153    static void T2U ( str sequence )
154// -----------------------------------------------------------------------------
155{
156    int base;
157   
158    while ((base = *sequence) != 0)     // Zeichenweises Abarbeiten der Sequenz
159    {
160        if (BIndex[base] == URACIL)         // Alle Vorkommen von URACIL durch
161            *sequence = BCharacter[URACIL]; // dasselbe Zeichen ersetzen
162
163        sequence++;
164    }
165}
166
167// -----------------------------------------------------------------------------
168//  Konstruktor zum Erzeugen einer leeren Instanz der Klasse Sequenz
169// -----------------------------------------------------------------------------
170    Sequence::Sequence ( void )
171// -----------------------------------------------------------------------------
172{
173    original   = NULL;
174    origlen    = 0;
175    compressed = NULL;
176    complen    = 0;
177}
178// -----------------------------------------------------------------------------
179//  Konstruktor zum Erzeugen einer Instanz der
180//  Klasse Sequenz aus einer vorgegebenen Sequenz
181// -----------------------------------------------------------------------------
182    Sequence::Sequence ( str seq )
183// -----------------------------------------------------------------------------
184{
185    original   = NULL;
186    origlen    = 0;
187    compressed = NULL;
188    complen    = 0;
189
190    if (seq) original = strdup(seq);    // Sequenz kopieren
191   
192    if (original)
193    {
194        origlen = strlen(original);
195
196        T2U(original);      // T- nach U-Zeichen umwandeln
197
198                                                    // Sequenz kompremieren     
199        if ((compressed = CompressSequence(original,origlen)) != NULL)
200            complen = strlen(compressed);
201    }
202}
203
204// -----------------------------------------------------------------------------
205//  Konstruktor zum Erzeugen einer zufaellig besetzten
206//  Instanz der Klasse Sequenz mit vorgebener Sequenzlaenge
207// -----------------------------------------------------------------------------
208    Sequence::Sequence ( UINT len )
209// -----------------------------------------------------------------------------
210{
211    original   = NULL;
212    origlen    = 0;
213    compressed = NULL;
214    complen    = 0;
215   
216    if ((original = RandomSequence(len)) != NULL)   // Zufaellige Sequenz erzeugen
217    {
218        origlen = len;
219                                                    // Sequenz kompremieren
220        if ((compressed = CompressSequence(original,origlen)) != NULL)
221            complen = strlen(compressed);
222    }
223}
224
225// -----------------------------------------------------------------------------
226//  Konstruktor zum Erzeugen einer Instanz der Klasse Sequenz
227//  aus einer vorgebener Datei mit vorgegebener Zeilennummer
228// -----------------------------------------------------------------------------
229    Sequence::Sequence ( str  file,
230                         UINT line )
231// -----------------------------------------------------------------------------
232{
233    original   = NULL;
234    origlen    = 0;
235    compressed = NULL;
236    complen    = 0;
237   
238    if ((original = ReadSequence(file,line)) != NULL)   // Sequenz einlesen
239    {
240        origlen = strlen(original);
241
242        T2U(original);      // T- nach U-Zeichen umwandeln
243
244                                                    // Sequenz kompremieren     
245        if ((compressed = CompressSequence(original,origlen)) != NULL)
246            complen = strlen(compressed);
247    }
248}
249
250// -----------------------------------------------------------------------------
251//  Kopierkonstruktor der Klasse Sequenz
252// -----------------------------------------------------------------------------
253    Sequence::Sequence ( Sequence &sequence )
254// -----------------------------------------------------------------------------
255{
256    if (sequence.original) original = strdup(sequence.original);
257    origlen = sequence.origlen;
258   
259    if (sequence.compressed) compressed = strdup(sequence.compressed);
260    complen = sequence.complen;
261}
262
263// -----------------------------------------------------------------------------
264//  Destruktor der Klasse Sequenz
265// -----------------------------------------------------------------------------
266    Sequence::~Sequence ( void )
267// -----------------------------------------------------------------------------
268{
269    if (original)   delete original;
270    if (compressed) delete compressed;
271}
272
273// -----------------------------------------------------------------------------
274//  Ersetzen der alten Sequenz
275// -----------------------------------------------------------------------------
276    int Sequence::Set ( str seq )
277// -----------------------------------------------------------------------------
278{
279    int error = 0;
280   
281    if (!seq) error = 1;    // Ungueltige Sequenz
282    else
283    {
284        str tmp = strdup(seq);  // Kopieren der Sequenz
285       
286        if (!tmp) error = 2;    // Kopieren ist schiefgelaufen
287        else
288        {
289            if (original)   delete original;    // Altlasten freigeben
290            if (compressed) delete compressed;
291
292            original = tmp;                     // Sequenz neu besetzen
293            origlen  = strlen(original);
294           
295            T2U(original);      // T- nach U-Zeichen umwandeln
296
297                                                    // Sequenz kompremieren     
298            if ((compressed = CompressSequence(original,origlen)) != NULL)
299                complen = strlen(compressed);
300            else
301                complen = 0;
302        }
303    }
304
305    return error;
306}
307
308// -----------------------------------------------------------------------------
309//  Ausgabefunktion fur eine Instanz der Klasse Sequenz zu debug-Zwecken
310// -----------------------------------------------------------------------------
311    void Sequence::Dump ( void )
312// -----------------------------------------------------------------------------
313{
314    cout << "\noriginal   = " << original;
315    cout << "\noriglen    = " << origlen;
316
317    cout << "\ncompressed = " << compressed;
318    cout << "\ncomplen    = " << complen;
319
320    cout << "\n\n";
321}
Note: See TracBrowser for help on using the repository browser.