1
/*****************************************************************
2
* Unipro UGENE - Integrated Bioinformatics Suite
3
* Copyright (C) 2008 Unipro, Russia (http://ugene.unipro.ru)
6
* This source code is distributed under the terms of the
7
* GNU General Public License. See the files COPYING and LICENSE
9
*****************************************************************/
11
#include "DNAExportTask.h"
13
#include <core_api/DNAAlphabet.h>
14
#include <core_api/DocumentModel.h>
15
#include <core_api/DocumentFormats.h>
16
#include <core_api/IOAdapter.h>
17
#include <core_api/AppContext.h>
18
#include <core_api/DNATranslation.h>
20
#include <util_text/TextUtils.h>
22
#include <gobjects/DNASequenceObject.h>
23
#include <gobjects/MAlignmentObject.h>
28
DNAExportSequenceTask::DNAExportSequenceTask(const DNAExportTaskSettings& s)
29
: Task("", TaskFlag_DeleteWhenFinished), config(s)
31
setTaskName(tr("Export sequence to '%1'").arg(QFileInfo(s.fileName).fileName()));
32
setVerboseLogMode(true);
34
assert(config.names.size()!=0);
35
assert(config.names.size() == config.sequences.size());
36
assert(config.names.size() == config.alphabets.size());
39
void DNAExportSequenceTask::run() {
40
DocumentFormatRegistry* r = AppContext::getDocumentFormatRegistry();
41
DocumentFormat* f = r->getFormatById(BaseDocumentFormats::PLAIN_FASTA);
42
IOAdapterFactory* iof = AppContext::getIOAdapterRegistry()->getIOAdapterFactoryById(BaseIOAdapters::url2io(config.fileName));
43
std::auto_ptr<Document> doc(f->createNewDocument(iof, config.fileName));
45
//prepare complement if needed
47
QList<DNAAlphabet*> alphabetsPre;
48
QList<QByteArray> sequencesPre;
49
QList<DNATranslation*> aminoTTPre;
51
for (int i=0; i < config.names.size(); i++) {
52
if (config.strand == TriState_Yes || config.strand == TriState_Unknown) {
53
namesPre.append(config.names[i]);
54
alphabetsPre.append(config.alphabets[i]);
55
sequencesPre.append(config.sequences[i]);
56
aminoTTPre.append(config.aminoTranslations[i]);
58
if (config.strand == TriState_No || config.strand == TriState_Unknown) {
59
DNATranslation* complTT = config.complTranslations[i];
61
if (complTT == NULL) {
62
stateInfo.error =tr("compl_tt_not_found");
66
char* data = config.sequences[i].data();
67
int len = config.sequences[i].length();
68
complTT->translate(data, len);
69
TextUtils::reverse(data, len);
70
namesPre.append(config.names[i] + "|rev-compl"); //TODO: check if unique!
71
alphabetsPre.append(config.alphabets[i]);
72
sequencesPre.append(config.sequences[i]);
73
aminoTTPre.append(config.aminoTranslations[i]);
74
config.sequences[i].clear(); //release resources
78
//translate data if needed
80
QList<DNAAlphabet*> alphabets;
81
QList<QByteArray> sequences;
82
for (int i=0; i < namesPre.size(); i++) {
83
DNATranslation* aminoTT = aminoTTPre[i];
84
if (aminoTT != NULL) {
85
for (int j=0, nStrands = config.allAminoStrands ? 3 : 1; j < nStrands; j++) {
86
QByteArray seq = sequencesPre[i];
87
int len = (seq.length() - j)/3;
88
QByteArray res(len, '\0');
89
if (res.isNull() && len != 0) {
90
stateInfo.error =tr("memory_overflow_error");
93
assert(aminoTT->isThree2One());
94
aminoTT->translate(seq.constData() + j, seq.length() - j, res.data(), res.length());
96
sequences.append(res);
97
names.append(namesPre[i] + QString("|transl") + (nStrands == 1 ? QString("") : " " + QString::number(j))); //TODO: check if unique!
98
alphabets.append(aminoTT->getDstAlphabet());
101
names.append(namesPre[i]);
102
alphabets.append(alphabetsPre[i]);
103
sequences.append(sequencesPre[i]);
105
sequencesPre[i].clear(); //release resources
108
//process merge property and construct the object
109
int n = names.size();
113
for (int i=0; i<n; i++) {
114
const QByteArray& seq = sequences[i];
117
size+=config.mergeGap;
120
QByteArray mergedSequence;
121
mergedSequence.reserve(size);
122
DNAAlphabet* al = alphabets[0];
123
const QString& name = names[0];
124
QByteArray gapSequence(config.mergeGap, al->getDefaultSymbol());
125
for (int i=0; i < n; i++) {
126
mergedSequence+=sequences[i];
127
sequences[i].clear(); //release resource
129
mergedSequence+=gapSequence;
132
doc->addObject(new DNASequenceObject(mergedSequence, al, name));
134
for (int i=0; i < names.size(); i++) {
135
DNAAlphabet* al = alphabets[i];
136
const QString& name = names[i];
137
const QByteArray& seq = sequences[i];
138
doc->addObject(new DNASequenceObject(seq, al, name));
142
f->storeDocument(doc.get(), stateInfo);
146
DNAExportAlignmentTask::DNAExportAlignmentTask(const MAlignment& _ma, const QString& _fileName)
147
: Task("", TaskFlag_DeleteWhenFinished), ma(_ma), fileName(_fileName)
149
setTaskName(tr("Export alignment to '%1'").arg(QFileInfo(fileName).fileName()));
150
setVerboseLogMode(true);
152
assert(!ma.isEmpty());
155
void DNAExportAlignmentTask::run() {
156
DocumentFormatRegistry* r = AppContext::getDocumentFormatRegistry();
157
DocumentFormat* f = r->getFormatById(BaseDocumentFormats::CLUSTAL_ALN);
158
IOAdapterFactory* iof = AppContext::getIOAdapterRegistry()->getIOAdapterFactoryById(BaseIOAdapters::url2io(fileName));
159
std::auto_ptr<Document> doc(f->createNewDocument(iof, fileName));
161
doc->addObject(new MAlignmentObject(ma, "Multiple Alignment"));
162
f->storeDocument(doc.get(), stateInfo);