root/trunk/CONVERTALN/convert.cxx

Revision 8607, 6.3 KB (checked in by westram, 5 weeks ago)

merge from e4fix [8135] [8136] [8137] [8138] [8139] [8140] [8141] [8142] [8143] [8144] [8222]
this revives the reverted patches [8129] [8130] [8131] [8132]

  • fixes
    • some free/delete mismatches
    • wrong definition of ORF objects (Level was no bit value)
    • amino consensus (failed for columns only containing 'C')
  • rename
    • AA_sequence_term -> orf_term
    • ED4_sequence_terminal_basic -> ED4_abstract_sequence_terminal
  • cleaned up hierarchy dumps
  • tweaked is_terminal()/to_terminal()
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1// ================================================================
2//
3// File      : convert.cxx
4// Purpose   : some helpers for global data handling
5//
6// ================================================================
7
8#include "embl.h"
9#include "genbank.h"
10#include "macke.h"
11
12FormatReaderPtr FormatReader::create(const FormattedFile& in) {
13    switch (in.type()) {
14        case GENBANK:   return new GenbankReader(in.name());
15        case SWISSPROT:
16        case EMBL:      return new EmblSwissprotReader(in.name());
17        case MACKE:     return new MackeReader(in.name());
18        default: throw_unsupported_input_format(in.type());
19    }
20    return NULL;
21}
22
23class ConvertibleData {
24    const InputFormat& in;
25
26    mutable OutputFormatPtr embl;
27    mutable OutputFormatPtr gbk;
28    mutable OutputFormatPtr macke;
29
30public:
31    ConvertibleData(const InputFormat& in_) : in(in_) {}
32
33    Format format() const { return in.format(); }
34
35    const Embl&    to_embl(const Seq& seq) const;
36    const GenBank& to_genbank(const Seq& seq) const;
37    const Macke&   to_macke(const Seq& seq) const;
38};
39
40#if defined(WARN_TODO)
41#warning refactor below
42#endif
43
44const Embl& ConvertibleData::to_embl(const Seq& seq) const {
45    Format inType = in.format();
46
47    if (inType == EMBL) return dynamic_cast<const Embl&>(in);
48
49    embl = new Embl;
50
51    bool ok = true;
52    switch (inType) {
53        case GENBANK: ok = gtoe(dynamic_cast<const GenBank&>(in), dynamic_cast<Embl&>(*embl), seq); break;
54        case MACKE:   ok = mtoe(dynamic_cast<const Macke&>(in), dynamic_cast<Embl&>(*embl), seq); break;
55        default: throw_conversion_not_implemented(inType, EMBL);
56    }
57    if (!ok) throw_conversion_failure(inType, EMBL);
58
59    ca_assert(!embl.isNull());
60    return dynamic_cast<const Embl&>(*embl);
61}
62
63const GenBank& ConvertibleData::to_genbank(const Seq& seq) const {
64    Format inType = in.format();
65
66    if (inType == GENBANK) return dynamic_cast<const GenBank&>(in);
67
68    gbk = new GenBank;
69
70    bool ok = true;
71    switch (inType) {
72        case EMBL:  ok = etog(dynamic_cast<const Embl&>(in), dynamic_cast<GenBank&>(*gbk), seq); break;
73        case MACKE: ok = mtog(dynamic_cast<const Macke&>(in), dynamic_cast<GenBank&>(*gbk), seq); break;
74        default: throw_conversion_not_implemented(inType, GENBANK);
75    }
76    if (!ok) throw_conversion_failure(inType, GENBANK);
77
78    ca_assert(!gbk.isNull());
79    return dynamic_cast<const GenBank&>(*gbk);
80}
81
82const Macke& ConvertibleData::to_macke(const Seq& seq) const {
83    Format inType = in.format();
84
85    if (inType == MACKE) return dynamic_cast<const Macke&>(in);
86
87    macke = new Macke;
88
89    bool ok = true;
90    switch (inType) {
91        case EMBL:    ok = etom(dynamic_cast<const Embl&>(in), dynamic_cast<Macke&>(*macke), seq); break;
92        case GENBANK: ok = gtom(dynamic_cast<const GenBank&>(in), dynamic_cast<Macke&>(*macke)); break;
93        default: throw_conversion_not_implemented(inType, MACKE);
94    }
95    if (!ok) throw_conversion_failure(inType, MACKE);
96
97    ca_assert(!macke.isNull());
98    return dynamic_cast<const Macke&>(*macke);
99}
100
101static void write_to_embl(FileWriter& write, const ConvertibleData& data, const Seq& seq) {
102    const Embl& embl = data.to_embl(seq);
103    embl_out(embl, seq, write);
104    write.seq_done();
105}
106static void write_to_genbank(FileWriter& write, const ConvertibleData& data, const Seq& seq) {
107    const GenBank& gbk = data.to_genbank(seq);
108    genbank_out(gbk, seq, write);
109    write.seq_done();
110}
111static void write_to_macke(FileWriter& write, const ConvertibleData& data, const Seq& seq, int phase, bool first) {
112    Format       inType = data.format();
113    const Macke& macke  = data.to_macke(seq);
114    switch (phase) {
115        case 0:
116            macke_seq_display_out(macke, write, inType, first);
117            break;
118        case 1:
119            macke_seq_info_out(macke, write);
120            break;
121        case 2:
122            macke_seq_data_out(seq, macke, write);
123            write.seq_done(); // count only in one and last phase!
124            break;
125    }
126}
127
128static void to_macke(const FormattedFile& in, const char *outf) {
129    FormatReaderPtr    reader = FormatReader::create(in);
130    FileWriter         write(outf);
131    SmartPtr<Warnings> suppress;
132
133    macke_out_header(write);
134
135    for (int phase = 0; phase<3; ++phase) {
136        bool first = true;
137        while (1) {
138            Seq seq;
139            if (!reader->read_one_entry(seq)) break;
140            write_to_macke(write, reader->get_data(), seq, phase, first);
141
142            first = false;
143        }
144        if (phase<2) {
145            if (phase == 0) {
146                write.out("#-\n");
147                suppress = new Warnings;  // no warning messages for phase 1+2
148            }
149            reader->rewind();
150        }
151    }
152}
153
154void convert(const FormattedFile& in, const FormattedFile& out) {
155    if (str_equal(in.name(), out.name()))
156        throw_error(30, "Input file and output file must be different file");
157
158    bool converted = true;
159    switch (out.type()) {
160        case EMBL:
161        case SWISSPROT:
162        case GENBANK: {
163            Format inType = in.type();
164            Format ouType = out.type();
165            if ((inType == GENBANK   && ouType == SWISSPROT) ||
166                (inType == SWISSPROT && ouType == GENBANK)   ||
167                (inType == EMBL      && ouType == SWISSPROT) ||
168                (inType == SWISSPROT && ouType == EMBL))
169            {
170                converted = false;
171                break;
172            }
173
174            FormatReaderPtr reader = FormatReader::create(in);
175            FileWriter      write(out.name());
176
177            while (1) {
178                Seq seq;
179                if (!reader->read_one_entry(seq)) break;
180                if (ouType == GENBANK) {
181                    write_to_genbank(write, reader->get_data(), seq);
182                }
183                else {
184                    write_to_embl(write, reader->get_data(), seq);
185                }
186            }
187            break;
188        }
189        case MACKE:     to_macke(in, out.name()); break;
190        case GCG:       to_gcg(in, out.name()); break;
191        case NEXUS:     to_paup(in, out.name()); break;
192        case PHYLIP:    to_phylip(in, out.name(), false); break;
193        case FASTDNAML: to_phylip(in, out.name(), true); break;
194        case PRINTABLE: to_printable(in, out.name()); break;
195
196        default: converted = false; break;
197    }
198    if (!converted) {
199        throw_conversion_not_supported(in.type(), out.type());
200    }
201}
Note: See TracBrowser for help on using the browser.