diff --git a/GUI/Model/Axis/PointwiseAxisItem.cpp b/GUI/Model/Axis/PointwiseAxisItem.cpp index 6bf8ed5b368b2ae67785627b27d37d6845eab55d..e02f7c9e1aba219195b1c3b8ef74e0486bca0803 100644 --- a/GUI/Model/Axis/PointwiseAxisItem.cpp +++ b/GUI/Model/Axis/PointwiseAxisItem.cpp @@ -25,7 +25,7 @@ namespace { namespace Tag { -const QString NativeUnits("NativeUnits"); +const QString NativeUnits("NativeUnits"); // obsolete since v22.0 const QString BinaryData("BinaryData"); const QString BaseData("BaseData"); @@ -34,7 +34,6 @@ const QString BaseData("BaseData"); PointwiseAxisItem::PointwiseAxisItem(QObject* parent) : BasicAxisItem(parent) - , m_nativeAxisUnits("bin") { } @@ -43,7 +42,6 @@ PointwiseAxisItem::~PointwiseAxisItem() = default; void PointwiseAxisItem::setAxis(const Scale& axis) { m_axis = std::unique_ptr<Scale>(axis.clone()); - m_nativeAxisUnits = QString::fromStdString(axis.unit()); } const Scale* PointwiseAxisItem::axis() const @@ -51,11 +49,6 @@ const Scale* PointwiseAxisItem::axis() const return m_axis.get(); } -QString PointwiseAxisItem::nativeAxisUnits() const -{ - return m_nativeAxisUnits; -} - QByteArray PointwiseAxisItem::serializeBinaryData() const { if (!m_axis) @@ -79,7 +72,7 @@ void PointwiseAxisItem::deserializeBinaryData(const QByteArray& data) void PointwiseAxisItem::writeTo(QXmlStreamWriter* w) const { - XML::writeAttribute(w, XML::Attrib::version, uint(1)); + XML::writeAttribute(w, XML::Attrib::version, uint(2)); // parameters from base class w->writeStartElement(Tag::BaseData); @@ -93,11 +86,6 @@ void PointwiseAxisItem::writeTo(QXmlStreamWriter* w) const w->writeCharacters(a.toBase64()); w->writeEndElement(); } - - // native units - w->writeStartElement(Tag::NativeUnits); - XML::writeAttribute(w, XML::Attrib::value, m_nativeAxisUnits); - w->writeEndElement(); } void PointwiseAxisItem::readFrom(QXmlStreamReader* r) @@ -120,11 +108,6 @@ void PointwiseAxisItem::readFrom(QXmlStreamReader* r) deserializeBinaryData(data); XML::gotoEndElementOfTag(r, tag); - // native units - } else if (tag == Tag::NativeUnits) { - XML::readAttribute(r, XML::Attrib::value, &m_nativeAxisUnits); - XML::gotoEndElementOfTag(r, tag); - } else r->skipCurrentElement(); } @@ -132,7 +115,7 @@ void PointwiseAxisItem::readFrom(QXmlStreamReader* r) void PointwiseAxisItem::updateAxIndicators(const Frame& frame) { - if (!m_axis || nativeAxisUnits() == "bin") + if (!m_axis || m_axis->unit() == "bin") return; if (frame.axis(0).unit() == "rad") { diff --git a/GUI/Model/Axis/PointwiseAxisItem.h b/GUI/Model/Axis/PointwiseAxisItem.h index 51bad66f1f5c03d49da426ca6eb8a4e573dc522d..0726cc2312102bb7b0afb87be64951e145ab6406 100644 --- a/GUI/Model/Axis/PointwiseAxisItem.h +++ b/GUI/Model/Axis/PointwiseAxisItem.h @@ -30,8 +30,6 @@ public: void setAxis(const Scale& axis); const Scale* axis() const; - QString nativeAxisUnits() const; - void updateAxIndicators(const Frame& frame); QByteArray serializeBinaryData() const; @@ -42,7 +40,6 @@ public: private: std::unique_ptr<Scale> m_axis; - QString m_nativeAxisUnits; }; #endif // BORNAGAIN_GUI_MODEL_AXIS_POINTWISEAXISITEM_H diff --git a/GUI/Model/Device/DatafileItem.cpp b/GUI/Model/Device/DatafileItem.cpp index 8e932035dabd405d2694d1c9c8e1991b73b6d0ba..499176ef28bd170eec83412a7c985262c54da3eb 100644 --- a/GUI/Model/Device/DatafileItem.cpp +++ b/GUI/Model/Device/DatafileItem.cpp @@ -34,8 +34,8 @@ const QString BinaryData("BinaryData"); const QString Data("Data"); const QString InstrumentId("InstrumentId"); const QString Name("Name"); -const QString NativeData("NativeData"); -const QString NativeDataUnits("NativeDataUnits"); +const QString NativeData("NativeData"); // obsolete since v22.0 +const QString NativeDataUnits("NativeDataUnits"); // obsolete since v22.0 const QString PresentationType("PresentationType"); } // namespace Tag @@ -117,22 +117,6 @@ size_t DatafileItem::rank() const return data1DItem() ? 1 : 2; } -bool DatafileItem::hasNativeData() const -{ - return nativeDataItem() && nativeDataItem()->c_field(); -} - -DataItem* DatafileItem::nativeDataItem() const -{ - return m_nativeDataItem.get(); -} - -DataItem* DatafileItem::initNativeData() -{ - initDataItem(rank(), m_nativeDataItem); - return m_nativeDataItem.get(); -} - bool DatafileItem::holdsDimensionalData() const { const Frame& frame = dataItem()->c_field()->frame(); @@ -143,11 +127,6 @@ bool DatafileItem::holdsDimensionalData() const return false; } -const Datafield* DatafileItem::nativeDatafield() const -{ - return hasNativeData() ? nativeDataItem()->c_field() : nullptr; -} - //! Sets Datafield to underlying item. void DatafileItem::setTheDatafield(const Datafield& data) @@ -232,14 +211,11 @@ void DatafileItem::updateFileName() { if (DataItem* item = dataItem()) item->setFileName(GUI::Path::intensityDataFileName(realItemName(), "realdata")); - - if (DataItem* item = nativeDataItem()) - item->setFileName(GUI::Path::intensityDataFileName(realItemName(), "nativedata")); } void DatafileItem::writeTo(QXmlStreamWriter* w) const { - XML::writeAttribute(w, XML::Attrib::version, uint(1)); + XML::writeAttribute(w, XML::Attrib::version, uint(2)); // NOTE: The ordering of the XML elements is important in initialization @@ -258,11 +234,6 @@ void DatafileItem::writeTo(QXmlStreamWriter* w) const XML::writeAttribute(w, XML::Attrib::value, m_presentationType); w->writeEndElement(); - // native data units - w->writeStartElement(Tag::NativeDataUnits); - XML::writeAttribute(w, XML::Attrib::value, m_nativeDataUnits); - w->writeEndElement(); - // data if (m_dataItem) { w->writeStartElement(Tag::Data); @@ -270,14 +241,6 @@ void DatafileItem::writeTo(QXmlStreamWriter* w) const m_dataItem->writeTo(w); w->writeEndElement(); } - - // native data - if (m_nativeDataItem) { - w->writeStartElement(Tag::NativeData); - XML::writeAttribute(w, XML::Attrib::type, m_nativeDataItem->TYPE); - m_nativeDataItem->writeTo(w); - w->writeEndElement(); - } } void DatafileItem::readFrom(QXmlStreamReader* r) @@ -317,17 +280,6 @@ void DatafileItem::readFrom(QXmlStreamReader* r) m_dataItem->readFrom(r); XML::gotoEndElementOfTag(r, tag); - // native data - } else if (tag == Tag::NativeData) { - ASSERT(m_dataItem); // read 'm_dataItem' before - initNativeData()->readFrom(r); - XML::gotoEndElementOfTag(r, tag); - - // native data units - } else if (tag == Tag::NativeDataUnits) { - XML::readAttribute(r, XML::Attrib::value, &m_nativeDataUnits); - XML::gotoEndElementOfTag(r, tag); - } else r->skipCurrentElement(); } @@ -337,30 +289,16 @@ void DatafileItem::writeDatafiles(const QString& projectDir) const { if (m_dataItem) m_dataItem->saveDatafield(projectDir); - - if (m_nativeDataItem) - m_nativeDataItem->saveDatafield(projectDir); } QString DatafileItem::readDatafiles(const QString& projectDir, MessageService* messageService) { - QString dataError, nativeDataError; - - if (m_dataItem) - dataError = m_dataItem->loadDatafield(messageService, projectDir, rank()); - - if (m_nativeDataItem) - nativeDataError = m_nativeDataItem->loadDatafield(messageService, projectDir, rank()); - - // return error message - if (dataError.isEmpty() && nativeDataError.isEmpty()) - return {}; - else if (!dataError.isEmpty() && nativeDataError.isEmpty()) - return (dataError); - else if (dataError.isEmpty() && !nativeDataError.isEmpty()) - return (nativeDataError); - else - return (dataError + "\n" + nativeDataError); + if (m_dataItem) { + QString dataError = m_dataItem->loadDatafield(messageService, projectDir, rank()); + if (!dataError.isEmpty()) + return (dataError); + } + return {}; } void DatafileItem::copyTo(DatafileItem* const dest) const @@ -369,9 +307,6 @@ void DatafileItem::copyTo(DatafileItem* const dest) const if (m_dataItem) dest->dataItem()->setDatafield(*dataItem()->c_field()); - - if (m_nativeDataItem) - dest->nativeDataItem()->setDatafield(*nativeDataItem()->c_field()); } std::vector<int> DatafileItem::shape() const @@ -394,8 +329,5 @@ void DatafileItem::updateToInstrument(const InstrumentItem* instrument) return; // instrument == nullptr => unlinking => going back to native data - auto* native_data_item = nativeDataItem(); - auto* data_source = native_data_item ? native_data_item : data_item; - - std::unique_ptr<Datafield> native_data(data_source->c_field()->clone()); + // TODO now the function does nothing. do not remove this function, but give it meaning again } diff --git a/GUI/Model/Device/DatafileItem.h b/GUI/Model/Device/DatafileItem.h index e8291e15e66e38b250f0efaeb0bda3380f0888ab..d27a5d99054e6b70c108be2d5d5fd95052132e41 100644 --- a/GUI/Model/Device/DatafileItem.h +++ b/GUI/Model/Device/DatafileItem.h @@ -51,17 +51,7 @@ public: size_t rank() const; - // native data - - bool hasNativeData() const; - DataItem* nativeDataItem() const; - - DataItem* initNativeData(); - bool holdsDimensionalData() const; - - const Datafield* nativeDatafield() const; - void setTheDatafield(const Datafield& data); // instrument @@ -103,23 +93,10 @@ private: QString m_instrumentId; QString m_name; - QString m_nativeDataUnits = "bin"; QString m_presentationType; // DataItem can be `Data2DItem` and `Data1DItem` (default `Data2DItem`). - /* - "Native_data" is introduced and used in specular mode to keep the original axis - of the dataset. It also stores a copy of original intensity values inside datafield, - but these values are always the same for "data" and "native_data". - - At the moment of loading file to DatafileItem "data" and "native_data" are completely equal. - But after linking DatafileItem to instrument and changing the current units the axis of "data" - is changed. When we unlink DatafileItem from instrument, we restore the original axis from - "native_data", because now there is no other way to transform axis without Frame - coming from instrument. - */ std::unique_ptr<DataItem> m_dataItem; - std::unique_ptr<DataItem> m_nativeDataItem; }; #endif // BORNAGAIN_GUI_MODEL_DEVICE_DATAFILEITEM_H diff --git a/GUI/Model/Device/InstrumentItems.cpp b/GUI/Model/Device/InstrumentItems.cpp index fb69b026e1f0de54c019c9615cc8f80b58133c8b..78d5ef737d2a150c52c49ec762383c9a9cc4f030 100644 --- a/GUI/Model/Device/InstrumentItems.cpp +++ b/GUI/Model/Device/InstrumentItems.cpp @@ -371,7 +371,7 @@ void SpecularInstrumentItem::updateToRealData(const DatafileItem* item) if (shape().size() != item->shape().size()) throw std::runtime_error("Specular instrument type is incompatible with passed data shape"); - const auto& dataAxis = item->nativeDatafield()->axis(0); + const auto& dataAxis = item->dataItem()->c_field()->axis(0); scanItem()->updateToData(dataAxis); scanItem()->grazingScanItem()->updateAxIndicators(makeFrame()); } @@ -393,12 +393,7 @@ bool SpecularInstrumentItem::alignedWith(const DatafileItem* item) const if (!instrumentAxis) return false; - if (!item->hasNativeData()) - return false; - - // TODO remove native data from everywhere - // https://jugit.fz-juelich.de/mlz/bornagain/-/issues/331 - const auto& native_axis = item->nativeDatafield()->axis(0); + const auto& native_axis = item->dataItem()->c_field()->axis(0); return *instrumentAxis == native_axis; } diff --git a/GUI/Model/Job/JobItem.cpp b/GUI/Model/Job/JobItem.cpp index a07850b35ffc796a8bab419fe2d9bc942afc1cbe..cf709399a613dd409a08fbac377d62ed7e695ac3 100644 --- a/GUI/Model/Job/JobItem.cpp +++ b/GUI/Model/Job/JobItem.cpp @@ -301,11 +301,12 @@ DataItem* JobItem::createDiffDataItem() ASSERT(!diffDataItem()); m_diffDataItem.reset(createNewDataItem()); - // use the same axes as real item ASSERT(m_realItem); - GUI::Util::copyContents(m_realItem->dataItem()->axItemX(), m_diffDataItem->axItemX()); + // use the same axes as simulated item (same as external data item if loading pre-22.0 project) + const DataItem* source = m_simulatedDataItem ? simulatedDataItem() : m_realItem->dataItem(); + GUI::Util::copyContents(source->axItemX(), m_diffDataItem->axItemX()); if (rank() == 2) - GUI::Util::copyContents(m_realItem->dataItem()->axItemY(), m_diffDataItem->axItemY()); + GUI::Util::copyContents(source->axItemY(), m_diffDataItem->axItemY()); if (auto* spec_diff = dynamic_cast<Data1DItem*>(diffDataItem())) spec_diff->setDiffPlotStyle(); @@ -405,7 +406,7 @@ void JobItem::cropRealData() void JobItem::writeTo(QXmlStreamWriter* w) const { - XML::writeAttribute(w, XML::Attrib::version, uint(1)); + XML::writeAttribute(w, XML::Attrib::version, uint(2)); // NOTE: The ordering of the XML elements is important in initialization @@ -479,13 +480,6 @@ void JobItem::writeTo(QXmlStreamWriter* w) const XML::writeAttribute(w, XML::Attrib::value, m_comments); w->writeEndElement(); - // real item - if (m_realItem) { - w->writeStartElement(Tag::DatafileItem); - m_realItem->writeTo(w); - w->writeEndElement(); - } - // simulated data if (m_simulatedDataItem) { w->writeStartElement(Tag::SimulatedData); @@ -493,6 +487,13 @@ void JobItem::writeTo(QXmlStreamWriter* w) const w->writeEndElement(); } + // real item + if (m_realItem) { + w->writeStartElement(Tag::DatafileItem); + m_realItem->writeTo(w); + w->writeEndElement(); + } + // fit suite if (m_fitSuiteItem) { w->writeStartElement(Tag::FitSuite); @@ -588,6 +589,12 @@ void JobItem::readFrom(QXmlStreamReader* r) XML::readAttribute(r, XML::Attrib::value, &m_name); XML::gotoEndElementOfTag(r, tag); + // simulated data + } else if (tag == Tag::SimulatedData) { + createSimulatedDataItem(); + m_simulatedDataItem->readFrom(r); + XML::gotoEndElementOfTag(r, tag); + // real item } else if (tag == Tag::DatafileItem) { createDatafileItem(); @@ -596,12 +603,6 @@ void JobItem::readFrom(QXmlStreamReader* r) importMasksFromDatafileItem(); XML::gotoEndElementOfTag(r, tag); - // simulated data - } else if (tag == Tag::SimulatedData) { - createSimulatedDataItem(); - m_simulatedDataItem->readFrom(r); - XML::gotoEndElementOfTag(r, tag); - // fit suite } else if (tag == Tag::FitSuite) { createFitSuiteItem()->readFrom(r); @@ -663,11 +664,7 @@ void JobItem::updateFileName() if (DataItem* item = simulatedDataItem()) item->setFileName(GUI::Path::intensityDataFileName(jobName(), "jobdata")); - if (DatafileItem* real = realItem()) { + if (DatafileItem* real = realItem()) if (DataItem* item = real->dataItem()) item->setFileName(GUI::Path::intensityDataFileName(jobName(), "refdata")); - - if (DataItem* item = real->nativeDataItem()) - item->setFileName(GUI::Path::intensityDataFileName(identifier(), "nativedata")); - } } diff --git a/GUI/Model/Model/DatafilesModel.cpp b/GUI/Model/Model/DatafilesModel.cpp index e005ec1436666b13289105b16e02468aa36eac59..e0fd2959e481c7058e775be8a6dd3ff0ec1e708c 100644 --- a/GUI/Model/Model/DatafilesModel.cpp +++ b/GUI/Model/Model/DatafilesModel.cpp @@ -37,12 +37,10 @@ DatafilesModel::~DatafilesModel() = default; QVector<DataItem*> DatafilesModel::dataItems() const { QVector<DataItem*> result; - for (auto* realData : realItems()) { + for (auto* realData : realItems()) if (auto* data2DItem = realData->dataItem()) result.push_back(data2DItem); - if (auto* native_data_item = realData->nativeDataItem()) - result.push_back(native_data_item); - } + return result; } diff --git a/GUI/Model/Model/JobModel.cpp b/GUI/Model/Model/JobModel.cpp index 5b386d0a9c2c802f61132441491ca23a194c7f66..3f826bc0832f7b16f727ba10f281e57b414cb0be 100644 --- a/GUI/Model/Model/JobModel.cpp +++ b/GUI/Model/Model/JobModel.cpp @@ -125,14 +125,10 @@ QVector<DataItem*> JobModel::dataItems() const if (auto* dataItem = jobItem->simulatedDataItem()) result.push_back(dataItem); - if (auto* real_data = dynamic_cast<DatafileItem*>(jobItem->realItem())) { + if (auto* real_data = dynamic_cast<DatafileItem*>(jobItem->realItem())) if (auto* data_item = real_data->dataItem()) result.push_back(data_item); - if (auto* native_data = real_data->nativeDataItem()) - result.push_back(native_data); - } } - return result; } diff --git a/GUI/Model/Project/LinkInstrumentManager.cpp b/GUI/Model/Project/LinkInstrumentManager.cpp index cbdaa4e223f9b20a71264091ed120061707d4584..59d914415843a5c54395fde1557f9aac3b142515 100644 --- a/GUI/Model/Project/LinkInstrumentManager.cpp +++ b/GUI/Model/Project/LinkInstrumentManager.cpp @@ -98,13 +98,6 @@ bool LinkInstrumentManager::canLinkDataToInstrument(const DatafileItem* realItem return false; } - /* - if (realItem->rank() == 1 && !realItem->hasNativeData()) { - ::warn(parent, "Cannot link, data is empty."); - return false; - } - */ - if (instrumentItem->alignedWith(realItem)) return true; diff --git a/GUI/View/Data/DatafilesSelector.cpp b/GUI/View/Data/DatafilesSelector.cpp index 77c87907d92945ecee722928f631f607f8bfff69..85e9b8f5421c227ba33ca41201a4697f8d531623 100644 --- a/GUI/View/Data/DatafilesSelector.cpp +++ b/GUI/View/Data/DatafilesSelector.cpp @@ -297,8 +297,6 @@ void DatafilesSelector::importData1D() realItem->setTheDatafield(*df); setCurrentItem(realItem); - realItem->initNativeData(); - realItem->nativeDataItem()->setDatafield(*df); realItem->updateFileName(); } catch (std::exception& ex) { m_treeModel->removeDataItem(realItem); diff --git a/Tests/Unit/GUI/TestLinkInstrument.cpp b/Tests/Unit/GUI/TestLinkInstrument.cpp index 9d27153acd628f409abf7d1ce717e983b5cd29d8..f76b3f3f3acbd83a8264ec6617df23e7ad0ce361 100644 --- a/Tests/Unit/GUI/TestLinkInstrument.cpp +++ b/Tests/Unit/GUI/TestLinkInstrument.cpp @@ -81,8 +81,6 @@ TEST(TestLinkInstrument, canLinkToSpecular) instrument->scanItem()->grazingScanItem()->selectListScan(); realData->dataItem()->setOriginalDatafield({frame.clonedAxes()}); - realData->initNativeData(); - realData->nativeDataItem()->setOriginalDatafield({frame.clonedAxes()}); ASSERT_TRUE( document.linkInstrumentManager()->canLinkDataToInstrument(realData, identifier, nullptr));