17 #include <QtCore/QVariant>
18 #include <QtCore/QTimer>
23 #include <QtCore/QSignalMapper>
24 #include <QtGui/QComboBox>
51 #define COL_TYPE_HIDDEN 2
54 #define COL_OBJECT_HIDDEN 5
57 #define InvalidIndex std::numeric_limits< unsigned C_INT32 >::max()
69 mpValidatorHeader(NULL),
70 mpValidatorLast(NULL),
73 mpExperimentSet(NULL),
74 mpExperimentSetCopy(NULL),
79 mpValidatorName(NULL),
80 mCrossValidation(false),
83 mpComboDelegate(NULL),
85 mTypeWithoutTimeItems(),
88 setObjectName(QString::fromUtf8(name));
127 virtual State
validate(QString & input,
int & pos)
const
162 size_t NewFirst = input.toULong();
166 while (NewFirst > Last)
169 if (First <= NewFirst && NewFirst <= Last)
184 mpContext->mpEditFirst->setText(QString::number(First));
185 mpContext->mpEditLast->setText(QString::number(Last));
254 qWarning(
"CQExperimentData::slotFirst(): Not implemented yet");
258 if (mpEditFirst->text() !=
"")
259 Row = mpEditFirst->text().toULong();
276 if (mpEditLast->text() !=
"")
277 Row = mpEditLast->text().toULong();
280 Row = mpEditFirst->text().toULong();
299 qWarning(
"CQExperimentData::slotHeader(): Not implemented yet");
323 mpBtnSteadystate->setFocus();
328 mpBtnTimeCourse->setFocus();
344 size_t i, imax = mpTable->rowCount();
347 for (i = 0; i < imax; i++)
361 mpEditSeparator->setEnabled(!checked);
364 mpCheckTab->setFocus();
366 mpEditSeparator->setFocus();
368 if (mpEditSeparator->isEnabled() &&
369 mpEditSeparator->text().isEmpty())
370 mpEditSeparator->setText(
",");
377 mpEditHeader->setEnabled(checked);
381 this->mpEditHeader->setText(
"");
395 pExperiment->
setLastRow((
unsigned C_INT32) Last);
405 mpBoxExperiment->setCurrentRow(mpBoxExperiment->count() - 1);
417 if (pCurrentItem != NULL)
418 Name =
TO_UTF8(pCurrentItem->text());
426 if (pCurrentItem != NULL)
429 mShown = mpBoxExperiment->currentRow();
434 size_t CurrentLine = 1;
451 QMessageBox::Ok, QMessageBox::Ok);
461 size_t index = mpBoxExperiment->currentRow();
469 if (mpBoxExperiment->count() > 1)
471 if (mpBoxExperiment->count() > (int)index + 1)
472 mpBoxExperiment->setCurrentRow((
int)(index + 1));
474 mpBoxExperiment->setCurrentRow((
int)(index - 1));
488 disconnect(mpCheckTo, SIGNAL(toggled(
bool)),
this, SLOT(
slotCheckTo(
bool)));
489 disconnect(mpCheckFrom, SIGNAL(toggled(
bool)),
this, SLOT(
slotCheckFrom(
bool)));
499 if (Next < mpExperimentSetCopy->size())
502 mpCheckTo->setChecked(
false);
505 connect(mpCheckFrom, SIGNAL(toggled(
bool)),
this, SLOT(
slotCheckFrom(
bool)));
506 connect(mpCheckTo, SIGNAL(toggled(
bool)),
this, SLOT(
slotCheckTo(
bool)));
515 "Data Files (*.txt *.csv);;All Files (*)",
518 if (File.isNull())
return;
520 std::map<std::string, std::string>::const_iterator it =
mFileMap.begin();
521 std::map<std::string, std::string>::const_iterator end =
mFileMap.end();
524 for (; it != end; ++it)
525 if (it->second ==
TO_UTF8(File))
527 for (i = 0; i < mpBoxFile->count(); i++)
528 if (it->first ==
TO_UTF8(mpBoxFile->item(i)->text()))
530 mpBoxFile->setCurrentRow(i);
547 mpBoxFile->setCurrentRow(mpBoxFile->count() - 1);
557 while (mpBtnExperimentAdd->isEnabled());
559 mpBoxExperiment->setCurrentRow(0);
568 mpBoxExperiment->clear();
575 std::vector< std::string >::const_iterator it = ExperimentNames.begin();
576 std::vector< std::string >::const_iterator end = ExperimentNames.end();
578 for (; it != end; ++it)
579 mpBoxExperiment->addItem(
FROM_UTF8((*it)));
582 if (mpBoxExperiment->count())
583 mpBoxExperiment->setCurrentRow(0);
589 mpBoxExperiment->clear();
599 size_t index = mpBoxFile->currentRow();
603 std::string FileName =
mFileMap[
TO_UTF8(mpBoxFile->item((
int) index)->text())];
606 if (mpBoxFile->count() > 1)
608 if (mpBoxFile->count() > (int)index + 1)
609 mpBoxFile->setCurrentRow((
int)(index + 1));
611 mpBoxFile->setCurrentRow((
int)(index - 1));
619 QListWidgetItem * pItem = mpBoxFile->takeItem((
int) index);
669 if (QString::number(pSet->
getWeight()) != mpEditWeight->text())
671 pSet->
setWeight(mpEditWeight->text().toDouble());
674 if (QString::number(pSet->
getThreshold()) != mpEditThreshold->text())
692 setWindowTitle(
"Validation Data");
694 mpEditWeight->show();
695 mpLblThreshold->show();
696 mpEditThreshold->show();
697 mpLineCrossValidation->show();
699 mpEditWeight->setText(QString::number(static_cast< CCrossValidationSet * >(pExperimentSet)->getWeight()));
700 mpEditThreshold->setText(QString::number(static_cast< CCrossValidationSet * >(pExperimentSet)->getThreshold()));
705 mpEditWeight->hide();
706 mpLblThreshold->hide();
707 mpEditThreshold->hide();
708 mpLineCrossValidation->hide();
711 if (!pExperimentSet)
return false;
733 for (i = 0; i < imax; i++)
741 std::vector< std::string >::const_iterator it = FileNames.begin();
742 std::vector< std::string >::const_iterator end = FileNames.end();
744 std::string FileName;
749 for (; it != end; ++it)
760 if (mpBoxFile->count())
761 mpBoxFile->setCurrentRow(0);
784 mpTable->setItemDelegateForColumn(
COL_BTN, pButtonDelegate);
785 connect(pButtonDelegate, SIGNAL(clicked(
const QModelIndex &)),
this, SLOT(
slotModelObject(
const QModelIndex &)));
789 while (*pWeightMethod !=
"")
790 mpBoxWeightMethod->insertItem(mpBoxWeightMethod->count(),
FROM_UTF8(*pWeightMethod++));
832 int i, imax = mpTable->rowCount();
834 for (i = 0; i < imax; i++)
836 if ((timeRow != -1 && timeRow != i) ||
837 mpBtnSteadystate->isChecked())
852 mpCheckTo->blockSignals(
true);
853 mpCheckFrom->blockSignals(
true);
854 mpBtnSteadystate->blockSignals(
true);
855 mpEditSeparator->blockSignals(
true);
856 mpCheckTab->blockSignals(
true);
857 mpCheckNormalizeWeightsPerExperiment->blockSignals(
true);
861 mpEditName->setText(
"");
862 mpEditSeparator->setText(
"");
863 mpCheckTab->setChecked(
true);
864 mpEditFirst->setText(
"");
865 mpEditLast->setText(
"");
866 mpEditHeader->setText(
"");
867 mpCheckHeader->setChecked(
false);
868 mpBtnTimeCourse->setChecked(
true);
869 mpCheckNormalizeWeightsPerExperiment->setChecked(
true);
870 mpCheckFrom->setChecked(
false);
871 mpCheckTo->setChecked(
false);
880 mpEditSeparator->setText(
"");
881 mpCheckTab->setChecked(
true);
886 mpCheckTab->setChecked(
false);
891 mpEditFirst->setText(Row);
893 "" : QString::number(pExperiment->
getLastRow());
894 mpEditLast->setText(Row);
898 mpEditHeader->setText(
"");
899 mpCheckHeader->setChecked(
false);
903 mpEditHeader->setText(QString::number(pExperiment->
getHeaderRow()));
904 mpCheckHeader->setChecked(
true);
908 mpBtnTimeCourse->setChecked(
true);
910 mpBtnSteadystate->setChecked(
true);
918 mpTable->horizontalHeaderItem(
COL_SCALE)->setText(
"Epsilon");
922 mpTable->horizontalHeaderItem(
COL_SCALE)->setText(
"Weight");
933 if (Next < mpExperimentSetCopy->getExperimentCount())
936 mpCheckTo->setChecked(
false);
945 mpCheckTo->blockSignals(
false);
946 mpCheckFrom->blockSignals(
false);
947 mpBtnSteadystate->blockSignals(
false);
948 mpEditSeparator->blockSignals(
false);
949 mpCheckTab->blockSignals(
false);
950 mpCheckNormalizeWeightsPerExperiment->blockSignals(
false);
959 if (!pExperiment)
return false;
966 if (Next < mpExperimentSetCopy->getExperimentCount() && mpCheckTo->isChecked())
974 QString value = mpEditName->text();
975 int pos = value.length();
981 int current = mpBoxExperiment->currentRow();
982 mpBoxExperiment->blockSignals(
true);
983 mpBoxExperiment->item(
mShown)->setText(value);
984 mpBoxExperiment->setCurrentRow(current);
985 mpBoxExperiment->blockSignals(
false);
989 if (mpCheckTab->isChecked())
994 value = mpEditFirst->text();
995 pos = value.length();
1001 value = mpEditLast->text();
1002 pos = value.length();
1008 value = mpEditHeader->text();
1009 pos = value.length();
1011 if (mpCheckHeader->isChecked() &&
1017 mpCheckHeader->setChecked(
false);
1020 if (mpBtnTimeCourse->isChecked())
1046 std::string Current =
TO_UTF8(mpBoxExperiment->currentItem()->text());
1054 mpBoxExperiment->blockSignals(
true);
1055 mpBoxExperiment->clear();
1058 std::vector< std::string >::const_iterator it = ExperimentNames.begin();
1059 std::vector< std::string >::const_iterator end = ExperimentNames.end();
1063 for (i = 0; it != end; ++it, i++)
1065 mpBoxExperiment->addItem(
FROM_UTF8((*it)));
1069 mpBoxExperiment->setCurrentRow(mpBoxExperiment->count() - 1);
1072 if (*it == Shown)
mShown = i;
1075 mpBoxExperiment->blockSignals(
false);
1128 mpTable->clearContents();
1129 mpTable->setRowCount(0);
1137 const std::vector<std::string> & ColumnNames = pExperiment->
getColumnNames();
1139 size_t OldRowCount = mpTable->rowCount();
1140 size_t i, imax = ColumnNames.size();
1141 mpTable->setRowCount((
int)(imax));
1146 QTableWidgetItem *pItem = NULL;
1149 assert(pDataModel != NULL);
1151 for (i = 0; i < imax; i++)
1154 if (OldRowCount <= i)
1157 pItem =
new QTableWidgetItem();
1158 pItem->setFlags(pItem->flags() & ~Qt::ItemIsEditable);
1159 mpTable->setItem((
int) i,
COL_NAME, pItem);
1162 pItem =
new QTableWidgetItem();
1163 mpTable->setItem((
int) i,
COL_TYPE, pItem);
1166 pItem =
new QTableWidgetItem();
1167 pItem->setFlags(pItem->flags() & ~Qt::ItemIsEditable);
1171 pItem =
new QTableWidgetItem();
1172 mpTable->setItem(i,
COL_BTN, pItem);
1175 pItem =
new QTableWidgetItem();
1176 pItem->setFlags(pItem->flags() & ~Qt::ItemIsEditable);
1177 mpTable->setItem((
int) i,
COL_OBJECT, pItem);
1180 pItem =
new QTableWidgetItem();
1181 pItem->setFlags(pItem->flags() & ~Qt::ItemIsEditable);
1185 pItem =
new QTableWidgetItem(
"");
1186 mpTable->setItem((
int) i,
COL_SCALE, pItem);
1194 mpBtnTimeCourse->isChecked() &&
1195 mpTable->item((
int) i,
COL_NAME)->text().contains(
"time", Qt::CaseInsensitive))
1207 mpTable->item((
int) i,
COL_TYPE_HIDDEN)->setText(QString::number(Type));
1210 pItem = mpTable->item(i,
COL_BTN);
1215 pItem->setFlags(pItem->flags() & ~Qt::ItemIsEditable & ~Qt::ItemIsEnabled);
1216 mpTable->closePersistentEditor(pItem);
1220 pItem->setFlags(pItem->flags() | Qt::ItemIsEditable | Qt::ItemIsEnabled);
1221 mpTable->openPersistentEditor(pItem);
1225 QTableWidgetItem * pItem;
1234 mpTable->item((
int) i,
COL_OBJECT)->setText(
"not found");
1240 mpTable->item((
int) i,
COL_OBJECT)->setText(
"");
1245 pItem = mpTable->item((
int) i,
COL_SCALE);
1250 pItem->setFlags(pItem->flags() & ~Qt::ItemIsEditable);
1258 Qt::ItemFlags FlagMask = Qt::NoItemFlags;
1260 if ((isnan(DefaultScale) && isnan(Scale)) ||
1261 DefaultScale == Scale)
1262 ScaleText =
"(" + QString::number(DefaultScale) +
")";
1264 ScaleText = QString::number(Scale);
1266 pItem->setText(ScaleText);
1267 pItem->setFlags(pItem->flags() & ~FlagMask);
1273 mpTable->resizeColumnsToContents();
1274 mpTable->resizeRowsToContents();
1282 if (OldType == NewType)
return;
1284 bool BtnEnabled =
true;
1288 mpTable->item(row,
COL_TYPE_HIDDEN)->setText(QString::number(NewType));
1293 assert(pDataModel != NULL);
1336 QTableWidgetItem * pItem = mpTable->item(row,
COL_BTN);
1340 pItem->setFlags(pItem->flags() | Qt::ItemIsEditable | Qt::ItemIsEnabled);
1341 mpTable->openPersistentEditor(pItem);
1345 pItem->setFlags(pItem->flags() & ~Qt::ItemIsEditable & ~Qt::ItemIsEnabled);
1346 mpTable->closePersistentEditor(pItem);
1380 size_t CurrentLine = 1;
1388 C_INT32 i, imax = mpTable->rowCount();
1390 for (i = 0; i < imax; i++)
1392 QTableWidgetItem * pItem = mpTable->item(i,
COL_SCALE);
1398 pItem->setFlags(pItem->flags() & ~Qt::ItemIsEditable);
1402 QString ScaleText = pItem->text();
1405 if (ScaleText ==
"" || ScaleText[0] ==
'(')
1410 ScaleText =
"(" + QString::number(DefaultWeight) +
")";
1411 pItem->setText(ScaleText);
1414 pItem->setFlags(pItem->flags() | Qt::ItemIsEditable);
1425 if (mpCheckTab->isChecked())
1439 size_t i, imax = mpTable->rowCount();
1440 bool FoundTime =
false;
1441 bool Changed =
false;
1445 for (i = 0; i < imax; i++)
1453 if (ObjectMap.
getRole(i) != Type)
1465 QString ScaleText = mpTable->item((
int) i,
COL_SCALE)->text();
1468 if (ScaleText ==
"")
1469 ScaleText = QString::number(std::numeric_limits<C_FLOAT64>::quiet_NaN());
1472 ScaleText[0] !=
'(' &&
1473 QString::number(ObjectMap.
getScale(i)) != ScaleText)
1475 ObjectMap.
setScale(i, ScaleText.toDouble());
1487 mpCheckFrom->setFocus();
1489 size_t Current = this->mpBoxExperiment->currentRow();
1505 mpEditFirst->setText(Row);
1508 mpEditLast->setText(Row);
1521 disconnect(mpCheckFrom, SIGNAL(toggled(
bool)),
this, SLOT(
slotCheckFrom(
bool)));
1522 mpCheckFrom->setChecked(checked);
1523 connect(mpCheckFrom, SIGNAL(toggled(
bool)),
this, SLOT(
slotCheckFrom(
bool)));
1530 if (!pExperiment)
return false;
1563 mpCheckTo->setFocus();
1570 if (Next < mpExperimentSetCopy->getExperimentCount())
1584 mpBtnSteadystate->setEnabled(
true);
1585 mpBtnTimeCourse->setEnabled(
true);
1587 if (mpCheckHeader->isChecked()) mpEditHeader->setEnabled(
true);
1589 mpCheckHeader->setEnabled(
true);
1591 if (!mpCheckTab->isChecked()) mpEditSeparator->setEnabled(
true);
1593 mpCheckTab->setEnabled(
true);
1594 mpTable->setEnabled(
true);
1595 mpBoxWeightMethod->setEnabled(
true);
1597 mpCheckNormalizeWeightsPerExperiment->setEnabled(
true);
1628 mpBtnSteadystate->setEnabled(
false);
1629 mpBtnTimeCourse->setEnabled(
false);
1630 mpEditHeader->setEnabled(
false);
1631 mpCheckHeader->setEnabled(
false);
1632 mpEditSeparator->setEnabled(
false);
1633 mpCheckTab->setEnabled(
false);
1634 mpTable->setEnabled(
false);
1635 mpBoxWeightMethod->setEnabled(
false);
1636 mpCheckNormalizeWeightsPerExperiment->setEnabled(
false);
1646 size_t Next = Current + 1;
1649 while (Next < mpExperimentSetCopy->getExperimentCount() && mpCheckTo->isChecked())
1672 size_t CurrentLine = 1;
1673 pNext->
read(File, CurrentLine);
1680 if (Next == Current)
break;
1696 mpTable->horizontalHeaderItem(
COL_SCALE)->setText(
"Epsilon");
1700 mpTable->horizontalHeaderItem(
COL_SCALE)->setText(
"Weight");
1706 size_t Next = Current + 1;
1709 while (Next < mpExperimentSetCopy->getExperimentCount() && mpCheckTo->isChecked())
1732 size_t CurrentLine = 1;
1733 pNext->
read(File, CurrentLine);
1740 if (Next == Current)
break;
friend class CQExperimentDataValidator
std::vector< std::string > getFileNames() const
void slotTypeChanged(int row, int index)
const std::string & getFileName() const
CCopasiObject * getDataObject(const CCopasiObjectName &CN) const
CQExperimentDataValidator * mpValidatorFirst
bool setExperimentType(const CCopasiTask::Type &type)
C_FLOAT64 getScale(const size_t &index) const
virtual std::string getObjectDisplayName(bool regular=true, bool richtext=false) const
bool setScale(const size_t &index, const C_FLOAT64 &scale)
bool getFirstUnusedSection(size_t &First, size_t &Last)
CQExperimentDataValidator(QLineEdit *parent, const char *name, CQExperimentData *pContext, const Type &type)
void slotExprimentType(bool isSteadyState)
const unsigned C_INT32 & getFirstRow() const
virtual CCopasiObjectName getCN() const
bool isLikePreviousExperiment(CExperiment *pExperiment)
CQComboDelegate * mpComboDelegate
const std::string & getObjectName() const
bool validateLast(const size_t &index, const size_t &value)
CExperiment::Type getRole(const size_t &index) const
std::map< std::string, std::string > mFileMap
const std::string & getFileName() const
void slotExperimentDelete()
CCopasiObject * get(const std::string &key)
C_FLOAT64 getDefaultScale(const size_t &index) const
static std::string getAllMessageText(const bool &chronological=true)
void slotFileChanged(QListWidgetItem *pCurrentItem, QListWidgetItem *pPreviousItem)
CCopasiDataModel * mpDataModel
bool setHeaderRow(const unsigned C_INT32 &headerRow)
void slotCheckTo(bool checked)
#define COL_OBJECT_HIDDEN
static std::string fileName(const std::string &path)
bool setFileName(const std::string &fileName)
static StandardButton information(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons=Ok, StandardButton defaultButton=NoButton)
CExperiment * getExperiment(const size_t &index)
const WeightMethod & getWeightMethod() const
void slotCheckNormalizeWeightsPerExperiment(bool flag)
CQExperimentDataValidator * mpValidatorName
size_t guessColumnNumber() const
void setNormalizeWeightsPerExperiment(bool flag)
static bool filter(const ObjectClasses &classes, const CCopasiObject *pObject)
std::map< std::string, std::string > mKeyMap
static CConfigurationFile * getConfiguration()
bool removeParameter(const std::string &name)
const std::vector< std::string > & getColumnNames() const
QIntValidator * mpIntValidator
bool setFileName(const std::string &fileName)
virtual void saved() const
const C_FLOAT64 & getWeight() const
CExperiment * addExperiment(const CExperiment &experiment)
virtual State revalidate()
CQExperimentData * mpContext
CExperiment * mpExperiment
bool getNextUnusedSection(size_t &First, size_t &Last)
bool validateFirst(const size_t &index, const size_t &value)
bool setSeparator(const std::string &seperator)
unsigned int mOldWeightMethod
bool setRole(const size_t &index, const CExperiment::Type &role)
bool saveExperiment(CExperiment *pExperiment, const bool &full)
static const QIcon & icon(const IconID &id)
void setWeight(const C_FLOAT64 &weight)
CExperimentObjectMap & getObjectMap()
static CCopasiVector< CCopasiDataModel > * getDatamodelList()
void slotExperimentChanged(QListWidgetItem *pCurrentItem, QListWidgetItem *pPreviousItem)
static QString getOpenFileName(QWidget *parent=0, const char *name=0, const QString &startWith=QString::null, const QString &filter=QString::null, const QString &caption=QString::null, QString *pSelectedFilter=NULL, QFileDialog::Options options=0)
virtual void loadTable(CExperiment *pExperiment, const bool &guess)
CExperimentFileInfo * mpFileInfo
const unsigned C_INT32 & getHeaderRow() const
CCopasiParameter * getParameter(const std::string &name)
static const std::string WeightMethodName[]
void slotWeightMethod(int weightMethod)
virtual State validate(QString &input, int &pos) const
CType toEnum(const char *attribute, const char **enumNames, const CType &enumDefault)
void slotModelObjectDelayed()
void slotModelObject(const QModelIndex &index)
QStringList mTypeWithoutTimeItems
size_t keyToIndex(const std::string &key) const
void setTypeItems(const int &timeRow)
void enableEdit(const bool &enable)
const CCopasiTask::Type & getExperimentType() const
virtual bool load(CExperimentSet *pExperimentSet, CCopasiDataModel *pDataModel)
static CKeyFactory * getKeyFactory()
void setThreshold(const unsigned C_INT32 &threshold)
void updateFittedPoints()
const unsigned C_INT32 & getThreshold() const
std::vector< std::string > getExperimentNames() const
std::string StringPrint(const char *format,...)
bool fl(const C_FLOAT64 &d1, const C_FLOAT64 &d2)
void slotCheckTab(bool checked)
bool compile(const std::vector< CCopasiContainer * > listOfContainer=CCopasiContainer::EmptyList)
const std::string & getSeparator() const
CExperimentSet * mpExperimentSet
CQExperimentDataValidator * mpValidatorHeader
virtual bool loadExperiment(CExperiment *pExperiment)
bool setNumColumns(const unsigned C_INT32 &cols)
void setItems(int row, const QStringList *pComboItems)
CQExperimentData(QWidget *parent=0, const char *name=0, bool modal=false, Qt::WindowFlags fl=0)
void selectModelObject(const int &row)
std::string getObjectCN(const size_t &index) const
bool setFirstRow(const unsigned C_INT32 &firstRow)
static CLocaleString fromUtf8(const std::string &utf8)
virtual State validate(QString &input, int &pos) const
CExperimentSet * mpExperimentSetCopy
bool setNumCols(const size_t &numCols)
const unsigned C_INT32 & getLastRow() const
bool validateHeader(const size_t &index, const size_t &value)
bool setLastRow(const unsigned C_INT32 &lastRow)
bool setObjectName(const std::string &name)
CExperiment * getExperiment(const std::string &name)
bool getNormalizeWeightsPerExperiment() const
bool setObjectCN(const size_t &index, const std::string &objectCN)
State setColor(const State &state) const
static const std::string TypeName[]
bool saveTable(CExperiment *pExperiment)
void slotCheckFrom(bool checked)
size_t getExperimentCount() const
CQExperimentDataValidator * mpValidatorLast
static const CCopasiObject * getObjectSingle(QWidget *pParent, const CQSimpleSelectionTree::ObjectClasses &classes, const CCopasiObject *pCurrentObject=NULL)
bool setWeightMethod(const WeightMethod &weightMethod)
void slotCheckHeader(bool checked)
void removeExperiment(const size_t &index)
bool read(std::istream &in, size_t ¤tLine)