diff --git a/GUI/coregui/Models/BeamItems.cpp b/GUI/coregui/Models/BeamItems.cpp index 60b028f5e682931bfbe11506661a7b34e9413720..271df34bcd76bdb192f433a21ebd12a75416cac2 100644 --- a/GUI/coregui/Models/BeamItems.cpp +++ b/GUI/coregui/Models/BeamItems.cpp @@ -157,15 +157,14 @@ SpecularBeamItem::SpecularBeamItem() : BeamItem(Constants::SpecularBeamType) axis_item->updateIndicators(); }, this); + + inclinationAxisGroup()->mapper()->setOnValueChange([this]() { updateWavelength(); }, this); } SpecularBeamItem::~SpecularBeamItem() = default; double SpecularBeamItem::getInclinationAngle() const { - Q_ASSERT( - dynamic_cast<BeamDistributionItem*>(getItem(P_INCLINATION_ANGLE))->meanValue() - == 0.0); return 0.0; } @@ -203,19 +202,27 @@ void SpecularBeamItem::updateToData(const IAxis& axis, QString units) inclinationAxisGroup()->setCurrentType(Constants::BasicAxisType); auto axis_item = currentInclinationAxisItem(); axis_item->setItemValue(BasicAxisItem::P_NBINS, static_cast<int>(axis.size())); - auto wl_item = static_cast<SpecularBeamWavelengthItem*>(getItem(P_WAVELENGTH)); - wl_item->setToRange(RealLimits::positive()); return; } auto axis_group = inclinationAxisGroup(); - axis_group->setCurrentType(Constants::PointwiseAxisType); - auto axis_item = static_cast<PointwiseAxisItem*>(axis_group->currentItem()); - if (units == Constants::UnitsQyQz) { - auto wl_item = static_cast<SpecularBeamWavelengthItem*>(getItem(P_WAVELENGTH)); - wl_item->setToRange(getLimits(axis.getMax())); - } + auto axis_item = + static_cast<PointwiseAxisItem*>(axis_group->getChildOfType(Constants::PointwiseAxisType)); axis_item->init(axis, units); + axis_group->setCurrentType(Constants::PointwiseAxisType); // calls updateWavelength() + axis_item->updateIndicators(); +} + +void SpecularBeamItem::updateWavelength() +{ + auto item = inclinationAxisGroup()->currentItem(); + auto wl_item = static_cast<SpecularBeamWavelengthItem*>(getItem(P_WAVELENGTH)); + if (auto axis_item = dynamic_cast<PointwiseAxisItem*>(item)) { + auto axis = axis_item->getAxis(); + if (axis && axis_item->getUnitsLabel() == Constants::UnitsQyQz) + wl_item->setToRange(getLimits(axis->getMax())); + } else + wl_item->setToRange(RealLimits::positive()); } // GISAS beam item diff --git a/GUI/coregui/Models/BeamItems.h b/GUI/coregui/Models/BeamItems.h index 73435a2e40974e4b9aa0fa22861fd87b75e5932f..e3605f487354770568318c49932a74a3d4b1e531 100644 --- a/GUI/coregui/Models/BeamItems.h +++ b/GUI/coregui/Models/BeamItems.h @@ -72,6 +72,9 @@ public: void updateFileName(const QString& filename); void updateToData(const IAxis& axis, QString units); + +private: + void updateWavelength(); }; class BA_CORE_API_ GISASBeamItem : public BeamItem diff --git a/GUI/coregui/Models/BeamWavelengthItem.cpp b/GUI/coregui/Models/BeamWavelengthItem.cpp index bd9d8567bd8e84f0a9d9ed0b1c1aed841adf60c4..cb0ce9614205028e9eedb33921a9262cd8f77026 100644 --- a/GUI/coregui/Models/BeamWavelengthItem.cpp +++ b/GUI/coregui/Models/BeamWavelengthItem.cpp @@ -48,7 +48,11 @@ void SpecularBeamWavelengthItem::setToRange(const RealLimits& limits) { SessionItem* valueItem = getGroupItem(P_DISTRIBUTION)->getItem(SymmetricDistributionItem::P_MEAN); - if (!limits.isInRange(wavelength())) - valueItem->setValue(limits.hasUpperLimit() ? limits.upperLimit() : limits.lowerLimit()); + if (!limits.isInRange(wavelength())) { + const double new_value = limits.isLimited() + ? (limits.upperLimit() - limits.lowerLimit()) / 2. + : default_wl; + valueItem->setValue(new_value); + } valueItem->setLimits(limits); } diff --git a/GUI/coregui/Models/JobModelFunctions.cpp b/GUI/coregui/Models/JobModelFunctions.cpp index e8211bfe01269cfde55ac4ba59c3fbe961bc50d2..725b6070586066376c56078f63f961a31d8aa095 100644 --- a/GUI/coregui/Models/JobModelFunctions.cpp +++ b/GUI/coregui/Models/JobModelFunctions.cpp @@ -56,7 +56,7 @@ void cropRealData(JobItem* jobItem); //! Creates necessary fit containers for jobItem intended for fitting. void createFitContainers(JobItem* jobItem); -PointwiseAxisItem* getPointwiseAxisItem(const InstrumentItem* instrument); +PointwiseAxisItem* getPointwiseAxisItem(const SpecularInstrumentItem* instrument); } // namespace void JobModelFunctions::initDataView(JobItem* job_item) @@ -113,23 +113,30 @@ void JobModelFunctions::setupJobItemSampleData(JobItem* jobItem, const MultiLaye } void JobModelFunctions::setupJobItemInstrument(JobItem* jobItem, - const InstrumentItem* instrumentItem) + const InstrumentItem* from) { auto model = jobItem->model(); - SessionItem* instrument = model->copyItem(instrumentItem, jobItem, JobItem::T_INSTRUMENT); - instrument->setItemName(instrumentItem->modelType()); - jobItem->getItem(JobItem::P_INSTRUMENT_NAME)->setValue(instrumentItem->itemName()); - if (auto spec_instrument = dynamic_cast<SpecularInstrumentItem*>(instrument)) { - // updating filename - const auto filename = ItemFileNameUtils::instrumentDataFileName(*spec_instrument); - spec_instrument->beamItem()->updateFileName(filename); - - // copying axis data - auto origin = getPointwiseAxisItem(instrumentItem); - if (origin->containsNonXMLData()) - getPointwiseAxisItem(spec_instrument) - ->init(*origin->getAxis(), origin->getUnitsLabel()); - } + SessionItem* to = model->copyItem(from, jobItem, JobItem::T_INSTRUMENT); + to->setItemName(from->modelType()); + to->setItemValue(InstrumentItem::P_IDENTIFIER, GUIHelpers::createUuid()); + jobItem->getItem(JobItem::P_INSTRUMENT_NAME)->setValue(from->itemName()); + + auto spec_to = dynamic_cast<SpecularInstrumentItem*>(to); + if (!spec_to) + return; + + // updating filename + const auto filename = ItemFileNameUtils::instrumentDataFileName(*spec_to); + spec_to->beamItem()->updateFileName(filename); + + // copying axis data + auto spec_from = static_cast<const SpecularInstrumentItem*>(from); + auto axis_origin = getPointwiseAxisItem(spec_from); + const QString current_axis_type= spec_from->beamItem()->inclinationAxisGroup()->currentType(); + if (current_axis_type == Constants::PointwiseAxisType) + spec_to->beamItem()->updateToData(*axis_origin->getAxis(), axis_origin->getUnitsLabel()); + else if(axis_origin->containsNonXMLData()) + getPointwiseAxisItem(spec_to)->init(*axis_origin->getAxis(), axis_origin->getUnitsLabel()); } //! Setup items intended for storing results of the job. @@ -281,14 +288,10 @@ void createFitContainers(JobItem* jobItem) Constants::MinimizerContainerType, fitSuiteItem->index(), -1, FitSuiteItem::T_MINIMIZER); } -PointwiseAxisItem* getPointwiseAxisItem(const InstrumentItem* instrument) +PointwiseAxisItem* getPointwiseAxisItem(const SpecularInstrumentItem* instrument) { - auto spec_instrument = dynamic_cast<const SpecularInstrumentItem*>(instrument); - if (!spec_instrument) - return nullptr; - return dynamic_cast<PointwiseAxisItem*>( - spec_instrument->beamItem()->inclinationAxisGroup()->getChildOfType( + instrument->beamItem()->inclinationAxisGroup()->getChildOfType( Constants::PointwiseAxisType)); } } // namespace diff --git a/GUI/coregui/Models/JobModelFunctions.h b/GUI/coregui/Models/JobModelFunctions.h index 3e6213e1534814ebfa1cf4c2189802268d392ac7..6a3b9f9ded39b007ca2e78e6c067a414a0501c0a 100644 --- a/GUI/coregui/Models/JobModelFunctions.h +++ b/GUI/coregui/Models/JobModelFunctions.h @@ -35,7 +35,7 @@ BA_CORE_API_ void initDataView(JobItem* jobItem); BA_CORE_API_ void setupJobItemSampleData(JobItem* jobItem, const MultiLayerItem* sampleItem); //! Properly copies instrument into job item -BA_CORE_API_ void setupJobItemInstrument(JobItem* jobItem, const InstrumentItem* instrumentItem); +BA_CORE_API_ void setupJobItemInstrument(JobItem* jobItem, const InstrumentItem* from); BA_CORE_API_ void setupJobItemOutput(JobItem* jobItem); diff --git a/GUI/coregui/Models/PointwiseAxisItem.cpp b/GUI/coregui/Models/PointwiseAxisItem.cpp index 49fe97d0147f77675d332e056d38c8cd784f6b33..907e7459daa82865073a86c27c473dd3c6d19576 100644 --- a/GUI/coregui/Models/PointwiseAxisItem.cpp +++ b/GUI/coregui/Models/PointwiseAxisItem.cpp @@ -51,7 +51,6 @@ void PointwiseAxisItem::init(const IAxis& axis, const QString& units_label) m_axis = std::unique_ptr<IAxis>(axis.clone()); setItemValue(P_NATIVE_UNITS, units_label); findInstrument(); - updateIndicators(); } const IAxis* PointwiseAxisItem::getAxis() const diff --git a/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp b/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp index cfa7191aa109b9ab8ebdb9ebcc6dab371316407b..9bbbfe81074d2d1daf9f55b3d7bf44030ad54a83 100644 --- a/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp +++ b/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp @@ -108,11 +108,10 @@ bool LinkInstrumentManager::canLinkDataToInstrument(const RealDataItem* realData if (!ImportDataUtils::Compatible(*instrumentItem, *realDataItem)) { QMessageBox::warning(nullptr, "Can't link to instrument", "Can't link, data is incompatible with the instrument."); - return false; } - if (!realDataItem->holdsDimensionalData() && instrumentItem->shape() == realDataItem->shape()) + if (instrumentItem->alignedWith(realDataItem)) return true; QString message = @@ -156,11 +155,7 @@ void LinkInstrumentManager::onInstrumentChildChange(InstrumentItem* instrument, if (child == nullptr) return; - if (child->itemName() == BasicAxisItem::P_NBINS - || child->parent()->modelType() == Constants::GroupItemType) - onInstrumentBinningChange(instrument); - else - onInstrumentLayoutChange(instrument); + onInstrumentLayoutChange(instrument); } //! Updates map of instruments on insert/remove InstrumentItem event. @@ -249,22 +244,16 @@ void LinkInstrumentManager::updateRealDataMap() } } -//! Runs through all RealDataItem and break the link, if instrument binning doesn't match the data. - -void LinkInstrumentManager::onInstrumentBinningChange(InstrumentItem* changedInstrument) -{ - for(auto realDataItem : linkedItems(changedInstrument)) - if (!changedInstrument->alignedWith(realDataItem)) - realDataItem->setItemValue(RealDataItem::P_INSTRUMENT_ID, QString()); -} - //! Runs through all RealDataItem and refresh linking to match possible change in detector //! axes definition. void LinkInstrumentManager::onInstrumentLayoutChange(InstrumentItem* changedInstrument) { for (auto realDataItem : linkedItems(changedInstrument)) - realDataItem->linkToInstrument(changedInstrument); + if (!changedInstrument->alignedWith(realDataItem)) + realDataItem->setItemValue(RealDataItem::P_INSTRUMENT_ID, QString()); + else + realDataItem->linkToInstrument(changedInstrument); } //! Returns list of RealDataItem's linked to given instrument. diff --git a/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.h b/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.h index 1a5f5c5369c5e751a4cb2ad8a2c857b3efde3f9e..0ab1b5ef36416e4f7f95257b433fb5f80fb691a6 100644 --- a/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.h +++ b/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.h @@ -46,7 +46,7 @@ public: InstrumentItem* m_instrument; }; - explicit LinkInstrumentManager(QObject* parent = 0); + explicit LinkInstrumentManager(QObject* parent = nullptr); void setModels(InstrumentModel* instrumentModel, RealDataModel* realDataModel); @@ -71,7 +71,6 @@ private slots: void updateLinks(); void updateInstrumentMap(); void updateRealDataMap(); - void onInstrumentBinningChange(InstrumentItem* changedInstrument); void onInstrumentLayoutChange(InstrumentItem* changedInstrument); private: diff --git a/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.cpp b/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.cpp index c3732e7b3007a551272502c60bfed58f59df6fe2..084637ec2740ebd50892bf8c118312268154fae1 100644 --- a/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.cpp +++ b/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.cpp @@ -77,7 +77,7 @@ void SimulationSetupAssistant::checkInstrumentItem(const InstrumentItem* instrum void SimulationSetupAssistant::checkFittingSetup(const InstrumentItem* instrumentItem, const RealDataItem* realData) { - if (!realData || instrumentItem->alignedWith(realData)) + if (!realData || !instrumentItem || instrumentItem->alignedWith(realData)) return; m_isValid = false; diff --git a/Tests/UnitTests/GUI/TestSavingSpecularData.cpp b/Tests/UnitTests/GUI/TestSavingSpecularData.cpp index c84f0cc9a0229e9b385fd9ec6513e919d97c353e..e346d61c82dc5c4c238302a63869e668f005285d 100644 --- a/Tests/UnitTests/GUI/TestSavingSpecularData.cpp +++ b/Tests/UnitTests/GUI/TestSavingSpecularData.cpp @@ -292,6 +292,7 @@ TEST_F(TestSavingSpecularData, test_CopyInstrumentToJobItem) // Checking existance of data on disk QString fname1 = "./" + projectDir + "/" + pointwise_axis_item->fileName(); QString fname2 = "./" + projectDir + "/" + job_axis_item->fileName(); + EXPECT_FALSE(fname1 == fname2); EXPECT_TRUE(ProjectUtils::exists(fname1)); EXPECT_TRUE(ProjectUtils::exists(fname2));