Death to stupid mussa pointers
[mussa.git] / qui / mussa_setup_dialog / MussaSetupWidget.cpp
1 #include <QFrame>
2 #include <QLabel>
3 #include <QLineEdit>
4 #include <QSpinBox>
5 #include <QVBoxLayout>
6 #include <QHBoxLayout>
7 #include <QPushButton>
8
9 #include <list>
10
11 using namespace std;
12
13 #include <boost/filesystem/path.hpp>
14 namespace fs = boost::filesystem;
15
16 //#include "qui/mussa_setup_dialog/SequenceSetupWidget.hpp"
17 #include "qui/mussa_setup_dialog/SequenceSetupFrame.hpp"
18 #include "qui/mussa_setup_dialog/MussaSetupWidget.hpp"
19 #include "qui/mussa_setup_dialog/SetupInfo.hpp"
20 #include "alg/mussa.hpp"
21 #include "mussa_exceptions.hpp"
22
23 MussaSetupWidget::MussaSetupWidget(QWidget *parent)
24   : QWidget(parent),
25     createPushButton(tr("Create")),
26     cancelPushButton(tr("Cancel")),
27     seqSetupFrame(0)
28 {
29   
30   // Analysis name
31   QLabel *analysisNameLabel = new QLabel(tr("Analysis Name"));
32   analysisNameLabel->setBuddy(&analysisNameLineEdit);
33
34   // Window
35   QLabel *windowLabel = new QLabel(tr("Window (nt)"));
36   windowLabel->setBuddy(&windowLineEdit);
37
38   // Threshold
39   QLabel *thresholdLabel = new QLabel(tr("Threshold (nt)"));
40   thresholdLabel->setBuddy(&thresholdLineEdit);
41
42   // Number of sequences
43   QLabel *numOfSequencesLabel = new QLabel(tr("Number of sequences"));
44   numOfSequencesLabel->setBuddy(&numOfSequencesSpinBox);
45   numOfSequencesSpinBox.setMinimum(1);
46
47   //Sequence setup frame
48   seqSetupFrame = new SequenceSetupFrame;
49
50   connect(&numOfSequencesSpinBox, SIGNAL(valueChanged(int)),
51           seqSetupFrame, SLOT(changeSequenceCount(int)));
52
53   numOfSequencesSpinBox.setValue(2);
54
55   // Create Experiment Button
56   connect(&createPushButton, SIGNAL(pressed()),
57           this, SLOT(mussaCreatePushed()));
58   
59   // Cancle Button
60   connect(&cancelPushButton, SIGNAL(pressed()),
61           this, SLOT(mussaCancelPushed()));
62
63   // LAYOUT
64   QHBoxLayout *row1Layout = new QHBoxLayout;
65   QHBoxLayout *row2Layout = new QHBoxLayout;
66   QVBoxLayout *mainLayout = new QVBoxLayout;
67   QHBoxLayout *buttonLayout = new QHBoxLayout;
68
69   row1Layout->addWidget(analysisNameLabel);
70   row1Layout->addWidget(&analysisNameLineEdit);
71
72   row2Layout->addWidget(windowLabel);
73   row2Layout->addWidget(&windowLineEdit);
74   row2Layout->addWidget(thresholdLabel);
75   row2Layout->addWidget(&thresholdLineEdit);
76   row2Layout->addWidget(numOfSequencesLabel);
77   row2Layout->addWidget(&numOfSequencesSpinBox);
78
79   buttonLayout->addWidget(&createPushButton);
80   buttonLayout->addWidget(&cancelPushButton);
81
82   mainLayout->addLayout(row1Layout);
83   mainLayout->addLayout(row2Layout);
84   mainLayout->addWidget(seqSetupFrame);
85   mainLayout->addLayout(buttonLayout);
86   setLayout(mainLayout);
87
88 }
89
90 void MussaSetupWidget::mussaCreatePushed()
91 {
92   emit createButtonPushed();
93 }
94
95 void MussaSetupWidget::mussaCancelPushed()
96 {
97   emit cancelButtonPushed();
98 }
99
100 MussaRef MussaSetupWidget::getMussaObject()
101 {
102   MussaRef mussa(new Mussa);
103
104   int fastaIndex;
105   int start;
106   int end;
107
108   list<SetupInfo *> setupInfoList = seqSetupFrame->getSetupInfo();
109   
110   for (list<SetupInfo *>::reverse_iterator setup_item = setupInfoList.rbegin();
111        setup_item != setupInfoList.rend();
112        ++setup_item)
113   {
114     std::string seqName = (*setup_item)->getName();
115     std::string seqNative = (*setup_item)->getSeqFile();
116     std::string annotNative = (*setup_item)->getAnnotFile();
117     fastaIndex = (*setup_item)->getFastaIndex();
118     start = (*setup_item)->getSubSeqStart();
119     end = (*setup_item)->getSubSeqEnd();
120   
121     fs::path seqFile(seqNative, fs::native);
122     fs::path annotFile(annotNative, fs::native);
123     mussa->load_sequence(seqFile, annotFile, fastaIndex, start, end, &seqName);
124   }
125   setupInfoList.clear();
126
127   int win_size = windowLineEdit.text().toInt();
128   int threshold = thresholdLineEdit.text().toInt();
129   std::string name = analysisNameLineEdit.text().toStdString();
130   if (win_size == 0 or threshold == 0) {
131     throw mussa_load_error("must set analysis parameters");
132   } else {
133     mussa->set_name(name);
134     mussa->set_window(win_size);
135     mussa->set_threshold(threshold);
136     mussa->set_analysis_mode(Mussa::TransitiveNway);
137     //mussa->set_entropy(0); // might want to add this at some point
138     mussa->analyze();
139   }
140
141   return mussa;
142 }
143
144 //MussaSetupWidget::MussaSetupWidget(const MussaSetupWidget& msw)
145 //  : analysisNameLineEdit(msw.analysisNameLineEdit),
146 //    windowLineEdit(msw.windowLineEdit),
147 //    thresholdLineEdit(msw.thresholdLineEdit),
148 //    numOfSequencesLineEdit(msw.numOfSequencesLineEdit),
149 //    seqSetupFrame(msw.seqSetupFrame)
150 //{
151 //}