Commit b0dd2305 authored by Francesco Carraro's avatar Francesco Carraro
Browse files

moved fit functions reading from xml file to web request

parent 57886335
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -168,7 +168,6 @@ namespace INAF.Apps.Uwp.SLabDataManager
                .AddTransient<SplineProcessingHelper>()
                .AddTransient<ZoomHelper>()
                .AddTransient<XmlAssetConfigReader>()
                .AddTransient<XmlAssetFitFunctionsReader>()
                .AddTransient<XmlAssetSmoothingDefaultBoundariesReader>()
                .AddTransient<XmlHelper>()
                .AddTransient<XmlSpectrumFileReader>()
+0 −44
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8" ?>
<fit>
	<!-- FUNCTIONS -->
	<functions>
		<function name="Straight line">
			<helperClass>LinearFitHelper</helperClass>
			<methodName>straightLine</methodName>
		</function>
		<function name="Linear spline">
			<helperClass>SplineFitHelper</helperClass>
			<methodName>buildSpline1DFitInterpolant</methodName>
			<parameter name="Regularization constant">
				<default>0.0001</default>
				<minimum>0.0001</minimum>
				<maximum>1</maximum>
			</parameter>
			<explanation>"Param:Regularization constant passed by user;Meaning:Value must be >= 0"</explanation>
		</function>
		<function name="Cubic spline">
			<helperClass>SplineFitHelper</helperClass>
			<methodName>buildSpline1DFitCubicInterpolant</methodName>
			<parameter name="Number of basis functions">
				<default>4</default>
				<minimum>4</minimum>
				<maximum>100</maximum>
			</parameter>
			<explanation>"Param:Number of basis functions;Meaning:Value must be >= 4"</explanation>
		</function>
		<function name="Hermite spline">
			<helperClass>SplineFitHelper</helperClass>
			<methodName>buildSpline1DFitHermiteInterpolant</methodName>
			<parameter name="Number of basis functions">
				<default>4</default>
				<minimum>4</minimum>
				<maximum>100</maximum>
			</parameter>
			<explanation>"Param:Number of basis functions;Meaning:Value must be >= 4"</explanation>
		</function>
	</functions>
	<!-- SETTINGS -->
	<settings>
		<numOfPointsForMissingPoints>30</numOfPointsForMissingPoints>
	</settings>
</fit>
 No newline at end of file
+3 −0
Original line number Diff line number Diff line
@@ -33,6 +33,9 @@
		<operation type="GetMinerals">Materials/GetMinerals</operation>
		<operation type="GetRocks">Materials/GetRocks</operation>
		<operation type="GetSampleDataValues">Materials/GetSampleDataValues</operation>
		<!-- USER SETTINGS -->
		<operation type="GetFitFunctions">UserSettings/GetFitFunctions</operation>
		<operation type="GetUserSetting">UserSettings/GetUserSetting</operation>
		<!-- EXTSERVICES -->
		<operation type="GetMeteorClasses">ExtServices/GetMeteorClasses</operation>
	</operationUrls>
+0 −141
Original line number Diff line number Diff line
using INAF.Apps.Uwp.SLabDataManager.ViewModels.UserControlViewModels;
using INAF.Libraries.NetStandard.Extensions;
using INAF.Libraries.NetStandard.Math.Helpers;
using INAF.Libraries.NetStandard.Math.Models;
using INAF.Libraries.Uwp.Logging;
using INAF.Libraries.Uwp.Xml;
using System;
using System.Threading.Tasks;
using Windows.Data.Xml.Dom;
using Windows.Storage;

namespace INAF.Apps.Uwp.SLabDataManager.Helpers.FileReaders
{
    public sealed class XmlAssetFitFunctionsReader
    {
        private readonly FitMethodsHelper fitMethodsHelper;
        private readonly SegmentsFitViewModel segmentsFitViewModel;
        private readonly XmlHelper xmlHelper;
        private readonly Logger logger;

        public XmlAssetFitFunctionsReader(FitMethodsHelper fitMethodsHelper,
                                          SegmentsFitViewModel segmentsFitViewModel,
                                          XmlHelper xmlHelper,
                                          Logger logger)
        {
            this.fitMethodsHelper = fitMethodsHelper;
            this.segmentsFitViewModel = segmentsFitViewModel;
            this.xmlHelper = xmlHelper;
            this.logger = logger;
        }

        public async Task readFileAsync()
        {
            StorageFile file = await xmlHelper.getAssetXmlFileAsync("fit.xml");
            if (file == null)
            {
                logger.Write<XmlAssetConfigReader>($"config.xml NOT FOUND!", Serilog.Events.LogEventLevel.Error);
                return;
            }

            XmlDocument dom = await xmlHelper.getXmlDocumentAsync(file);
            if (dom == null)
            {
                logger.Write<XmlAssetConfigReader>($"Error while parsing config.xml!", Serilog.Events.LogEventLevel.Error);
                return;
            }

            /* STEP 1 - read functions for fittings */
            readFunctions(dom);

            /* STEP 2 - read other settings */
            readSettings(dom);
        }

        private FitMethodModel getFunctionValues(IXmlNode node)
        {
            try
            {
                string name = xmlHelper.getNodeAttribute(node, "name");

                IXmlNode helperClassNode = node.SelectSingleNode("helperClass");
                string helperClassName = helperClassNode.InnerText;

                IXmlNode methodNode = node.SelectSingleNode("methodName");
                string methodName = methodNode.InnerText;

                IXmlNode parameterNode = node.SelectSingleNode("parameter");
                if (parameterNode != null)
                {
                    string parameterName = xmlHelper.getNodeAttribute(node, "name");

                    IXmlNode defaultNode = parameterNode.SelectSingleNode("default");
                    string _defaultValue = defaultNode.InnerText;
                    double defaultValue = _defaultValue.ToDoubleInvariant();

                    IXmlNode minimumNode = parameterNode.SelectSingleNode("minimum");
                    string _minimumValue = minimumNode.InnerText;
                    double minimumValue = _minimumValue.ToDoubleInvariant();

                    IXmlNode maximumNode = parameterNode.SelectSingleNode("maximum");
                    string _maximumValue = maximumNode.InnerText;
                    double maximumValue = _maximumValue.ToDoubleInvariant();

                    IXmlNode explanationNode = node.SelectSingleNode("explanation");
                    string explanation = explanationNode.InnerText;

                    return new FitMethodModel(name, helperClassName, methodName, parameterName, defaultValue, minimumValue, maximumValue, explanation);
                }
                else
                    return new FitMethodModel(name, helperClassName, methodName, isEnabledForSmoothing: false);
            }
            catch (Exception ex)
            {
                logger.Write<XmlAssetFitFunctionsReader>($"Error while parsing file - ex: {ex.Message}", Serilog.Events.LogEventLevel.Error);
                return null;
            }
        }

        private void readFunctions(XmlDocument dom)
        {
            try
            {
                XmlNodeList functionNodes = dom.SelectNodes("descendant::function");
                foreach (var node in functionNodes)
                {
                    FitMethodModel fitMethod = getFunctionValues(node);
                    if (fitMethod != null)
                        fitMethodsHelper.add(fitMethod);
                }

                fitMethodsHelper.setIsInitialized(isInitialized: true);
            }
            catch (Exception ex)
            {
                logger.Write<XmlAssetFitFunctionsReader>($"Error while parsing file - ex: {ex.Message}", Serilog.Events.LogEventLevel.Error);
                return;
            }
        }

        private void readSettings(XmlDocument dom)
        {
            try
            {
                IXmlNode settingsNode = dom.SelectSingleNode("descendant::settings");

                if (settingsNode != null)
                {
                    IXmlNode numOfPointsForMissingPoints = settingsNode.SelectSingleNode("descendant::numOfPointsForMissingPoints");
                    string _value = numOfPointsForMissingPoints.InnerText;
                    int value = _value.ToIntInvariant();
                    segmentsFitViewModel.setNumOfPointsForMissingPoints(value);
                }
            }
            catch (Exception ex)
            {
                logger.Write<XmlAssetFitFunctionsReader>($"Error while parsing file - ex: {ex.Message}", Serilog.Events.LogEventLevel.Error);
                return;
            }
        }
    }
}
+22 −0
Original line number Diff line number Diff line
using INAF.Libraries.NetStandard.Math.Models;
using INAF.Libraries.NetStandard.Models.UserSettings;
using INAF.Libraries.NetStandard.SLabCommonModels.Models.WebApp.Responses;
using System.Collections.Generic;
using System.Threading.Tasks;
using static INAF.Libraries.NetStandard.SLabCommonModels.Values.Enums;

namespace INAF.Apps.Uwp.SLabDataManager.Helpers.RemoteOperations
{
    public partial class RemoteOperationsManager
    {
        public async Task<List<FitMethodModel>> getFitFunctionsAsync()
        {
            return await getAsync<List<FitMethodModel>>(RemoteOperationType.GetFitFunctions);
        }

        public async Task<GenericValueStringResponseModel> getUserSettingAsync(string key)
        {
            return await getAsync<GenericValueStringResponseModel>(RemoteOperationType.GetUserSetting, buildArgument(nameof(KeyValueRequestModel.Key), key));
        }
    }
}
Loading