diff --git a/GUI/coregui/Models/IntensityDataItem.h b/GUI/coregui/Models/IntensityDataItem.h index 51d5df25f7ddacfd72b5b0d3dd76d93fd4816cb5..5a9077328ce0909b58b07bc71b0a5bb53c6a590f 100644 --- a/GUI/coregui/Models/IntensityDataItem.h +++ b/GUI/coregui/Models/IntensityDataItem.h @@ -42,6 +42,7 @@ public: explicit IntensityDataItem(ParameterizedItem *parent=0); virtual ~IntensityDataItem(); + OutputData<double> *getOutputData() { return m_data.get(); } const OutputData<double> *getOutputData() const { return m_data.get(); } void setOutputData(OutputData<double> *data); diff --git a/GUI/coregui/Models/JobItem.cpp b/GUI/coregui/Models/JobItem.cpp index 9dca64b6d29cdf9d3835c528b5f47e324db25ab7..74a4528e97ab434df491b46662a0b37f189632ea 100644 --- a/GUI/coregui/Models/JobItem.cpp +++ b/GUI/coregui/Models/JobItem.cpp @@ -124,12 +124,11 @@ void JobItem::setStatus(const QString &status) combo_property.setValue(status); setRegisteredProperty(P_STATUS, combo_property.getVariant()); if(status == Constants::STATUS_FAILED) { - Q_ASSERT(0); -// if(IntensityDataItem *intensityItem = getIntensityDataItem()) { -// if(intensityItem->getOutputData()) -// intensityItem->getOutputData()->setAllTo(0.0); -// emit intensityItem->intensityModified(); -// } + if(IntensityDataItem *intensityItem = getIntensityDataItem()) { + if(intensityItem->getOutputData()) + intensityItem->getOutputData()->setAllTo(0.0); + emit intensityItem->intensityModified(); + } } } @@ -259,6 +258,8 @@ InstrumentItem *JobItem::getInstrumentItem(bool from_backup) void JobItem::setResults(const GISASSimulation *simulation) { IntensityDataItem *intensityItem = getIntensityDataItem(); + Q_ASSERT(intensityItem); + JobResultsPresenter::setResults(intensityItem, simulation); diff --git a/GUI/coregui/Models/JobQueueData.cpp b/GUI/coregui/Models/JobQueueData.cpp index 8da5bd77d90561147905ed1ea90f91b645c0d90b..18d817988a66b6b33fc40ae6f00928325c1ea573 100644 --- a/GUI/coregui/Models/JobQueueData.cpp +++ b/GUI/coregui/Models/JobQueueData.cpp @@ -212,11 +212,9 @@ void JobQueueData::onFinishedJob() jobItem->setStatus(runner->getStatus()); if(jobItem->isFailed()) { jobItem->setComments(runner->getFailureMessage()); - delete getSimulation(runner->getIdentifier()); } else { // propagating simulation results GISASSimulation *simulation = getSimulation(runner->getIdentifier()); -// setResults(jobItem, simulation); jobItem->setResults(simulation); } @@ -317,7 +315,7 @@ void JobQueueData::assignForDeletion(JobRunner *runner) void JobQueueData::clearSimulation(const QString &identifier) { -// GISASSimulation *simulation = getSimulation(identifier); + GISASSimulation *simulation = getSimulation(identifier); m_simulations.remove(identifier); - // delete simulation; now owned by IntensityDataItem + delete simulation; } diff --git a/GUI/coregui/Models/JobResultsPresenter.cpp b/GUI/coregui/Models/JobResultsPresenter.cpp index 0d03a676a290bf85b8360cbd3fbd42d4d62b0300..8c7eba4291fc3464c03325d397db2b295eb9b041 100644 --- a/GUI/coregui/Models/JobResultsPresenter.cpp +++ b/GUI/coregui/Models/JobResultsPresenter.cpp @@ -25,10 +25,13 @@ #include "GUIHelpers.h" #include "JobItem.h" #include "IntensityDataIOFactory.h" +#include <QFileInfo> #include <QDebug> -namespace { -QMap<QString, IDetector2D::EAxesUnits> init_units_to_description_map() { +namespace +{ +QMap<QString, IDetector2D::EAxesUnits> init_units_to_description_map() +{ QMap<QString, IDetector2D::EAxesUnits> result; result[Constants::UnitsNbins] = IDetector2D::NBINS; result[Constants::UnitsRadians] = IDetector2D::RADIANS; @@ -38,7 +41,8 @@ QMap<QString, IDetector2D::EAxesUnits> init_units_to_description_map() { return result; } -QMap<IDetector2D::EAxesUnits, QString> init_description_to_units_map() { +QMap<IDetector2D::EAxesUnits, QString> init_description_to_units_map() +{ QMap<IDetector2D::EAxesUnits, QString> result; result[IDetector2D::NBINS] = Constants::UnitsNbins; result[IDetector2D::RADIANS] = Constants::UnitsRadians; @@ -47,27 +51,27 @@ QMap<IDetector2D::EAxesUnits, QString> init_description_to_units_map() { result[IDetector2D::QYQZ] = Constants::UnitsQyQz; return result; } - - } - // ------------------------------------------------------------------------------------------------- QMap<QString, IDetector2D::EAxesUnits> JobResultsPresenter::m_name_to_units -= init_units_to_description_map(); + = init_units_to_description_map(); QMap<IDetector2D::EAxesUnits, QString> JobResultsPresenter::m_units_to_name -= init_description_to_units_map(); + = init_description_to_units_map(); -void JobResultsPresenter::setResults(IntensityDataItem *intensityItem, const GISASSimulation *simulation) +void JobResultsPresenter::setResults(IntensityDataItem *intensityItem, + const GISASSimulation *simulation) { const IDetector2D *detector = simulation->getInstrument().getDetector(); initIntensityItemProperties(intensityItem, detector); - IDetector2D::EAxesUnits selected_units = getAxesUnitsFromName(intensityItem->getSelectedAxesUnits()); + IDetector2D::EAxesUnits selected_units + = getAxesUnitsFromName(intensityItem->getSelectedAxesUnits()); intensityItem->setOutputData(simulation->getDetectorIntensity(selected_units)); + updateAxesTitle(intensityItem); } //! Updates axes of OutputData in IntensityData item to correspond @@ -79,9 +83,11 @@ void JobResultsPresenter::updateDataAxes(IntensityDataItem *intensityItem, Q_ASSERT(intensityItem); Q_ASSERT(instrumentItem); - if(!intensityItem->getOutputData()) return; + if (!intensityItem->getOutputData()) + return; - IDetector2D::EAxesUnits requested_units = getAxesUnitsFromName(intensityItem->getSelectedAxesUnits()); + IDetector2D::EAxesUnits requested_units + = getAxesUnitsFromName(intensityItem->getSelectedAxesUnits()); OutputData<double> *newData = createDetectorMap(instrumentItem, requested_units); newData->setRawDataVector(intensityItem->getOutputData()->getRawDataVector()); @@ -100,12 +106,51 @@ void JobResultsPresenter::saveIntensityData(JobItem *jobItem, const QString &pro QString filename = projectDir + QStringLiteral("/") + dataItem->itemName(); std::unique_ptr<OutputData<double>> dataToSave( - createDetectorMap(jobItem->getInstrumentItem())); + createDetectorMap(jobItem->getInstrumentItem(), IDetector2D::DEFAULT)); dataToSave->setRawDataVector(dataItem->getOutputData()->getRawDataVector()); IntensityDataIOFactory::writeOutputData(*dataToSave, filename.toStdString()); } } +//! Loads intensityData from project directory +//! IntensityDataItem will be initialized to match last selected axes +void JobResultsPresenter::loadIntensityData(JobItem *jobItem, const QString &projectDir) +{ + IntensityDataItem *intensityItem = jobItem->getIntensityDataItem(); + if (intensityItem) { + QString filename = projectDir + "/" + intensityItem->itemName(); + QFileInfo info(filename); + if (info.exists()) { + IntensityDataItem *intensityItem = jobItem->getIntensityDataItem(); + + if (intensityItem) { + DomainObjectBuilder builder; + auto instrument = builder.buildInstrument(*jobItem->getInstrumentItem()); + instrument->initDetector(); + initIntensityItemProperties(intensityItem, instrument->getDetector()); + + std::unique_ptr<OutputData<double>> rawData( + IntensityDataIOFactory::readOutputData(filename.toStdString())); + + IDetector2D::EAxesUnits requested_units + = getAxesUnitsFromName(intensityItem->getSelectedAxesUnits()); + + OutputData<double> *result = instrument->getDetector()->createDetectorMap( + instrument->getBeam(), requested_units); + + result->setRawDataVector(rawData->getRawDataVector()); + intensityItem->setOutputData(result); + } + } else { + jobItem->setStatus(Constants::STATUS_FAILED); + QString warning("Error while loading job from file, intensity data file '"); + warning.append(filename); + warning.append("' was not found"); + jobItem->setComments(warning); + } + } +} + QString JobResultsPresenter::getNameFromAxesUnits(IDetector2D::EAxesUnits units) { return m_units_to_name[units]; @@ -116,7 +161,6 @@ IDetector2D::EAxesUnits JobResultsPresenter::getAxesUnitsFromName(const QString return m_name_to_units[name]; } - // Converts detector default axes units into units most suitable for GUI // SphericalDetector's default units (RADIANS) will be converted to DEGREES // RectangularDetector's default units (MM) will remain the same @@ -132,49 +176,47 @@ JobResultsPresenter::preferableGUIAxesUnits(IDetector2D::EAxesUnits default_unit } //! inits properties of IntensityDataItem for the case of selectable axes units -//! If P_AXES_UNITS is empty, it will be initialized to match the detector void JobResultsPresenter::initIntensityItemProperties(IntensityDataItem *intensityItem, const IDetector2D *detector) { - // selectable units ComboProperty combo = intensityItem->getRegisteredProperty(IntensityDataItem::P_AXES_UNITS) - .value<ComboProperty>(); + .value<ComboProperty>(); - if(combo.getValues().isEmpty()) { - intensityItem->getPropertyAttribute(IntensityDataItem::P_AXES_UNITS).setVisible(); + QString cachedUnits = combo.getCachedValue(); - foreach (auto units, detector->getValidAxesUnits()) { - combo << getNameFromAxesUnits(units); - } + intensityItem->getPropertyAttribute(IntensityDataItem::P_AXES_UNITS).setVisible(); + + foreach (auto units, detector->getValidAxesUnits()) { + combo << getNameFromAxesUnits(units); + } + + if (cachedUnits.isEmpty()) { IDetector2D::EAxesUnits preferrable_units = preferableGUIAxesUnits(detector->getDefaultAxesUnits()); - combo.setValue(getNameFromAxesUnits(preferrable_units)); - intensityItem->setRegisteredProperty(IntensityDataItem::P_AXES_UNITS, combo.getVariant()); + } else { + combo.setValue(cachedUnits); } + intensityItem->setRegisteredProperty(IntensityDataItem::P_AXES_UNITS, combo.getVariant()); } void JobResultsPresenter::updateAxesTitle(IntensityDataItem *intensityItem) { // axes labels - if(intensityItem->getSelectedAxesUnits() == Constants::UnitsRadians) { + if (intensityItem->getSelectedAxesUnits() == Constants::UnitsRadians) { intensityItem->setXaxisTitle("phi_f [rad]"); intensityItem->setYaxisTitle("alpha_f [rad]"); - } - else if(intensityItem->getSelectedAxesUnits() == Constants::UnitsDegrees) { + } else if (intensityItem->getSelectedAxesUnits() == Constants::UnitsDegrees) { intensityItem->setXaxisTitle("phi_f [deg]"); intensityItem->setYaxisTitle("alpha_f [deg]"); - } - else if(intensityItem->getSelectedAxesUnits() == Constants::UnitsQyQz) { + } else if (intensityItem->getSelectedAxesUnits() == Constants::UnitsQyQz) { intensityItem->setXaxisTitle("Qy"); intensityItem->setYaxisTitle("Qz"); - } - else if(intensityItem->getSelectedAxesUnits() == Constants::UnitsMm) { + } else if (intensityItem->getSelectedAxesUnits() == Constants::UnitsMm) { intensityItem->setXaxisTitle("X [mm]"); intensityItem->setYaxisTitle("Y [mm]"); - } - else if(intensityItem->getSelectedAxesUnits() == Constants::UnitsNbins) { + } else if (intensityItem->getSelectedAxesUnits() == Constants::UnitsNbins) { intensityItem->setXaxisTitle("X [nbins]"); intensityItem->setYaxisTitle("Y [nbins]"); } @@ -188,17 +230,16 @@ OutputData<double> *JobResultsPresenter::createDetectorMap(const InstrumentItem auto instrument = builder.buildInstrument(*instrumentItem); instrument->initDetector(); - if(units == IDetector2D::DEFAULT) + if (units == IDetector2D::DEFAULT) units = instrument->getDetector()->getDefaultAxesUnits(); - OutputData<double> *result = instrument->getDetector() - ->createDetectorMap(instrument->getBeam(), units); + OutputData<double> *result + = instrument->getDetector()->createDetectorMap(instrument->getBeam(), units); - if(!result) { + if (!result) { throw GUIHelpers::Error("JobResultsPresenter::createDetectorMap -> Error. " "Can't create detector map."); } return result; } - diff --git a/GUI/coregui/Models/JobResultsPresenter.h b/GUI/coregui/Models/JobResultsPresenter.h index 5f3098e0be1a26367509cb9bd172f291d3c8f250..20e1852ec38782518f1646b00ca45115fc1e9be4 100644 --- a/GUI/coregui/Models/JobResultsPresenter.h +++ b/GUI/coregui/Models/JobResultsPresenter.h @@ -42,6 +42,9 @@ public: //! saves intensity data into project directory static void saveIntensityData(JobItem *jobItem, const QString &projectDir); + //! load intensity data from project directory + static void loadIntensityData(JobItem *jobItem, const QString &projectDir); + private: //! returns axes units names from their domain counterpart static QString getNameFromAxesUnits(IDetector2D::EAxesUnits units); @@ -57,7 +60,7 @@ private: static void updateAxesTitle(IntensityDataItem *intensityItem); static OutputData<double> *createDetectorMap(const InstrumentItem *instrumentItem, - IDetector2D::EAxesUnits units = IDetector2D::DEFAULT); + IDetector2D::EAxesUnits units); //!< correspondance of GUI axes units names to their domain counterpart static QMap<QString, IDetector2D::EAxesUnits> m_name_to_units; diff --git a/GUI/coregui/mainwindow/projectdocument.cpp b/GUI/coregui/mainwindow/projectdocument.cpp index 1552c45de35e9e050b6f9996215c1717d7a0e8fa..861683781388b08f2349470aed709f8964d648b3 100644 --- a/GUI/coregui/mainwindow/projectdocument.cpp +++ b/GUI/coregui/mainwindow/projectdocument.cpp @@ -353,18 +353,7 @@ void ProjectDocument::saveOutputData() Q_ASSERT(m_jobModel); for (int i = 0; i < m_jobModel->rowCount(QModelIndex()); ++i) { JobItem *jobItem = m_jobModel->getJobItemForIndex(m_jobModel->index(i, 0, QModelIndex())); - JobResultsPresenter::saveIntensityData(jobItem, getProjectDir()); - -// IntensityDataItem *dataItem = jobItem->getIntensityDataItem(); -// if (dataItem) { -// QString filename = getProjectDir() + "/" + dataItem->itemName(); -// const OutputData<double> *data = dataItem->getOutputData(); -// if (data) { -// IntensityDataIOFactory::writeOutputData(*data, filename.toStdString()); -// } -// } - } } @@ -373,24 +362,7 @@ void ProjectDocument::loadOutputData() { for (int i = 0; i < m_jobModel->rowCount(QModelIndex()); ++i) { JobItem *jobItem = m_jobModel->getJobItemForIndex(m_jobModel->index(i, 0, QModelIndex())); - IntensityDataItem *dataItem = jobItem->getIntensityDataItem(); - if (dataItem) { - QString filename = getProjectDir() + "/" + dataItem->itemName(); - QFileInfo info(filename); - if (info.exists()) { - IntensityDataItem *intensityItem = jobItem->getIntensityDataItem(); - if(intensityItem) { - intensityItem->setOutputData( - IntensityDataIOFactory::readOutputData(filename.toStdString())); - } - } else { - jobItem->setStatus(Constants::STATUS_FAILED); - QString warning("Error while loading job from file, intensity data file '"); - warning.append(filename); - warning.append("' was not found"); - jobItem->setComments(warning); - } - } + JobResultsPresenter::loadIntensityData(jobItem, getProjectDir()); } }