WhatsThis update
[mussa.git] / qui / mussa_setup_dialog / MussaSetupWidget.cpp
index e896e538db653f748bc49b56e6808ae679df629d..c116a9a2e12fc6e9983760a6f80f83906cd69961 100644 (file)
@@ -8,44 +8,66 @@
 
 #include <list>
 
+using namespace std;
+
+#include <boost/filesystem/path.hpp>
+namespace fs = boost::filesystem;
+
 //#include "qui/mussa_setup_dialog/SequenceSetupWidget.hpp"
 #include "qui/mussa_setup_dialog/SequenceSetupFrame.hpp"
 #include "qui/mussa_setup_dialog/MussaSetupWidget.hpp"
 #include "qui/mussa_setup_dialog/SetupInfo.hpp"
 #include "alg/mussa.hpp"
+#include "mussa_exceptions.hpp"
 
 MussaSetupWidget::MussaSetupWidget(QWidget *parent)
   : QWidget(parent),
-    analysisNameLineEdit(0),
-    windowLineEdit(0),
-    thresholdLineEdit(0),
-    numOfSequencesSpinBox(0),
-    createPushButton(0),
-    cancelPushButton(0),
+    analysisNameLineEdit(new QLineEdit),
+    windowEdit(new QSpinBox),
+    thresholdEdit(new QSpinBox),
+    numOfSequencesSpinBox(new QSpinBox),
+    createPushButton(new QPushButton(tr("Create"))),
+    cancelPushButton(new QPushButton(tr("Cancel"))),
     seqSetupFrame(0)
 {
-  
-  // Analysis name
   analysisNameLineEdit = new QLineEdit;
+  windowEdit = new QSpinBox;
+  thresholdEdit = new QSpinBox;
+  numOfSequencesSpinBox = new QSpinBox;
+  createPushButton = new QPushButton(tr("Create"));
+  cancelPushButton = new QPushButton(tr("Cancel"));
+    
+  // Analysis name
   QLabel *analysisNameLabel = new QLabel(tr("Analysis Name"));
   analysisNameLabel->setBuddy(analysisNameLineEdit);
+  analysisNameLabel->setWhatsThis("Meaningful name for your analysis ");
+  analysisNameLineEdit->setWhatsThis("Meaningful name for your analysis ");
 
   // Window
-  windowLineEdit = new QLineEdit;
-  QLabel *windowLabel = new QLabel(tr("Window"));
-  windowLabel->setBuddy(windowLineEdit);
+  windowEdit->setMinimum(1);
+  windowEdit->setValue(30);
+  windowEdit->setWhatsThis("Sliding window size to use in analysis.\n\nSee Mussagl Manual for more information by selecting the 'Help > Mussagl Manual' menu option. ");
+  QLabel *windowLabel = new QLabel(tr("Window (nt)"));
+  windowLabel->setBuddy(windowEdit);
+  windowLabel->setWhatsThis("Sliding window size to use in analysis.\n\nSee Mussagl Manual for more information by selecting the 'Help > Mussagl Manual' menu option. ");
 
   // Threshold
-  thresholdLineEdit = new QLineEdit;
-  QLabel *thresholdLabel = new QLabel(tr("Threshold"));
-  thresholdLabel->setBuddy(thresholdLineEdit);
+  thresholdEdit->setMinimum(1);
+  thresholdEdit->setMaximum(windowEdit->value());
+  thresholdEdit->setValue(21);
+  thresholdEdit->setWhatsThis("Threshold of minimum number of matches required in a window to be considered a match.\n\nSee Mussagl Manual for more information by selecting the 'Help > Mussagl Manual' menu option. ");
+  QLabel *thresholdLabel = new QLabel(tr("Threshold (nt)"));
+  thresholdLabel->setBuddy(thresholdEdit);
+  thresholdLabel->setWhatsThis("Threshold of minimum number of matches required in a window to be considered a match.\n\nSee Mussagl Manual for more information by selecting the 'Help > Mussagl Manual' menu option. ");
+  connect(windowEdit, SIGNAL(valueChanged(int)),
+          this, SLOT(updateThreshold(int)));
 
   // Number of sequences
-  numOfSequencesSpinBox = new QSpinBox;
   QLabel *numOfSequencesLabel = new QLabel(tr("Number of sequences"));
   numOfSequencesLabel->setBuddy(numOfSequencesSpinBox);
+  numOfSequencesLabel->setWhatsThis("Number of sequences to include in analysis. ");
   numOfSequencesSpinBox->setMinimum(1);
-
+  numOfSequencesSpinBox->setWhatsThis("Number of sequences to include in analysis. ");
 
   //Sequence setup frame
   seqSetupFrame = new SequenceSetupFrame;
@@ -53,15 +75,13 @@ MussaSetupWidget::MussaSetupWidget(QWidget *parent)
   connect(numOfSequencesSpinBox, SIGNAL(valueChanged(int)),
          seqSetupFrame, SLOT(changeSequenceCount(int)));
 
-  numOfSequencesSpinBox->setValue(1);
+  numOfSequencesSpinBox->setValue(2);
 
   // Create Experiment Button
-  createPushButton = new QPushButton(tr("Create"));
   connect(createPushButton, SIGNAL(pressed()),
          this, SLOT(mussaCreatePushed()));
   
   // Cancle Button
-  cancelPushButton = new QPushButton(tr("Cancel"));
   connect(cancelPushButton, SIGNAL(pressed()),
          this, SLOT(mussaCancelPushed()));
 
@@ -74,13 +94,14 @@ MussaSetupWidget::MussaSetupWidget(QWidget *parent)
   row1Layout->addWidget(analysisNameLabel);
   row1Layout->addWidget(analysisNameLineEdit);
 
-  row2Layout->addWidget(windowLabel);
-  row2Layout->addWidget(windowLineEdit);
   row2Layout->addWidget(thresholdLabel);
-  row2Layout->addWidget(thresholdLineEdit);
+  row2Layout->addWidget(thresholdEdit);
+  row2Layout->addWidget(windowLabel);
+  row2Layout->addWidget(windowEdit);
   row2Layout->addWidget(numOfSequencesLabel);
   row2Layout->addWidget(numOfSequencesSpinBox);
 
+  buttonLayout->addStretch(1);
   buttonLayout->addWidget(createPushButton);
   buttonLayout->addWidget(cancelPushButton);
 
@@ -89,7 +110,6 @@ MussaSetupWidget::MussaSetupWidget(QWidget *parent)
   mainLayout->addWidget(seqSetupFrame);
   mainLayout->addLayout(buttonLayout);
   setLayout(mainLayout);
-
 }
 
 void MussaSetupWidget::mussaCreatePushed()
@@ -102,48 +122,52 @@ void MussaSetupWidget::mussaCancelPushed()
   emit cancelButtonPushed();
 }
 
-Mussa* MussaSetupWidget::getMussaObject()
+void MussaSetupWidget::updateThreshold(int new_threshold)
 {
-  Mussa *mussa = new Mussa;
-  
-  
+  thresholdEdit->setMaximum(new_threshold);
+}
+
+MussaRef MussaSetupWidget::getMussaObject()
+{
+  MussaRef mussa = Mussa::init();
 
-  std::string seqFile;
-  std::string annotFile;
   int fastaIndex;
   int start;
   int end;
 
-  std::list<SetupInfo *> setupInfoList = seqSetupFrame->getSetupInfo();
-  
-  const int count = setupInfoList.size();
+  list<SetupInfo *> setupInfoList = seqSetupFrame->getSetupInfo();
   
-  SetupInfo *setupInfo = 0;
-  for (int i=0; i < count; i++)
+  for (list<SetupInfo *>::reverse_iterator setup_item = setupInfoList.rbegin();
+       setup_item != setupInfoList.rend();
+       ++setup_item)
   {
-    setupInfo = setupInfoList.back();
-    setupInfoList.pop_back();
-
-    seqFile = setupInfo->getSeqFile();
-    annotFile = setupInfo->getAnnotFile();
-    fastaIndex = setupInfo->getFastaIndex();
-    start = setupInfo->getSubSeqStart();
-    end = setupInfo->getSubSeqEnd();
-    
-    mussa->load_sequence(seqFile, annotFile, fastaIndex, start, end);
-    delete setupInfo;
+    std::string seqName = (*setup_item)->getName();
+    std::string seqNative = (*setup_item)->getSeqFile();
+    std::string annotNative = (*setup_item)->getAnnotFile();
+    fastaIndex = (*setup_item)->getFastaIndex();
+    start = (*setup_item)->getSubSeqStart();
+    end = (*setup_item)->getSubSeqEnd();
+  
+    fs::path seqFile(seqNative, fs::native);
+    fs::path annotFile(annotNative, fs::native);
+    mussa->load_sequence(seqFile, annotFile, fastaIndex, start, end, &seqName);
+  }
+  setupInfoList.clear();
+
+  int win_size = windowEdit->value();
+  int threshold = thresholdEdit->value();
+  std::string name = analysisNameLineEdit->text().toStdString();
+  if (win_size == 0 or threshold == 0) {
+    throw mussa_load_error("must set analysis parameters");
+  } else {
+    mussa->set_name(name);
+    mussa->set_window(win_size);
+    mussa->set_threshold(threshold);
+    mussa->set_analysis_mode(Mussa::TransitiveNway);
+    //mussa->set_entropy(0); // might want to add this at some point
+    mussa->analyze();
   }
-
-  mussa->analyze(0, 0, Mussa::TransitiveNway, 0.0);
 
   return mussa;
 }
 
-//MussaSetupWidget::MussaSetupWidget(const MussaSetupWidget& msw)
-//  : analysisNameLineEdit(msw.analysisNameLineEdit),
-//    windowLineEdit(msw.windowLineEdit),
-//    thresholdLineEdit(msw.thresholdLineEdit),
-//    numOfSequencesLineEdit(msw.numOfSequencesLineEdit),
-//    seqSetupFrame(msw.seqSetupFrame)
-//{
-//}