private IEnumerable <double> ROfRho(ForwardSolverType fst, OpticalProperties op, DoubleRange rho)
        {
            var ops  = op.AsEnumerable();
            var rhos = rho.AsEnumerable();
            var fs   = Factories.SolverFactory.GetForwardSolver(fst);

            return(fs.ROfRho(ops, rhos));
        }
        private IEnumerable <Complex> ROfFxAndFt(ForwardSolverType fst, OpticalProperties op, double fx, DoubleRange ft)
        {
            var ops = op.AsEnumerable();
            var fxs = fx.AsEnumerable();
            var fts = ft.AsEnumerable();
            var fs  = Factories.SolverFactory.GetForwardSolver(fst);

            return(fs.ROfFxAndFt(ops, fxs, fts));
        }
        private IEnumerable <double> ROfFxAndTime(ForwardSolverType fst, OpticalProperties op, double fx, DoubleRange time)
        {
            var ops   = op.AsEnumerable();
            var fxs   = fx.AsEnumerable();
            var times = time.AsEnumerable();
            var fs    = Factories.SolverFactory.GetForwardSolver(fst);

            return(fs.ROfFxAndTime(ops, fxs, times));
        }
Beispiel #4
0
        public void validate_multi_count_returns_multiple_values_for_matched_start_stop()
        {
            var r = new DoubleRange(10D, 10D, 3);

            var values = r.AsEnumerable().ToArray();

            Assert.AreEqual(values.Length, 3);
            for (int i = 0; i < values.Length; i++)
            {
                Assert.AreEqual(values[i], 10D);
            }
        }
        private IEnumerable <double> ROfRho(ForwardSolverType forwardSolverType, OpticalProperties opticalProperties, DoubleRange rho, double noise)
        {
            var ops  = opticalProperties.AsEnumerable();
            var rhos = rho.AsEnumerable();
            var fs   = SolverFactory.GetForwardSolver(forwardSolverType);

            if (noise > 0.0)
            {
                return(fs.ROfRho(ops, rhos).AddNoise(noise));
            }
            return(fs.ROfRho(ops, rhos));
        }
        private IEnumerable <double> ROfFxAndTime(ForwardSolverType forwardSolverType, OpticalProperties opticalProperties, double fx, DoubleRange time, double noise)
        {
            var ops   = opticalProperties.AsEnumerable();
            var fxs   = fx.AsEnumerable();
            var times = time.AsEnumerable();
            var fs    = SolverFactory.GetForwardSolver(forwardSolverType);

            if (noise > 0.0)
            {
                return(fs.ROfFxAndTime(ops, fxs, times).AddNoise(noise));
            }
            return(fs.ROfFxAndTime(ops, fxs, times));
        }
 private IEnumerable <double> ROfFx(ForwardSolverType fst, OpticalProperties op, DoubleRange fx)
 {
     try
     {
         var ops  = op.AsEnumerable();
         var rhos = fx.AsEnumerable();
         var fs   = Factories.SolverFactory.GetForwardSolver(fst);
         return(fs.ROfFx(ops, rhos));
     }
     catch (Exception e)
     {
         throw new Exception("Error in call to ROfFx: " + e.Message + "values fst: " + fst + ", op: " + op + ", rho:" + fx + " source: " + e.Source + " inner: " + e.InnerException);
     }
 }
        public void Test_get_plot_data_powerlaw()
        {
            var postData               = "{\"spectralPlotType\":\"musp\",\"plotName\":\"μs'\",\"tissueType\":\"Skin\",\"absorberConcentration\":[{\"label\":\"Hb\",\"value\":28.4,\"units\":\"μM\"},{\"label\":\"HbO2\",\"value\":22.4,\"units\":\"μM\"},{\"label\":\"H2O\",\"value\":0.7,\"units\":\"vol. frac.\"},{\"label\":\"Fat\",\"value\":0,\"units\":\"vol. frac.\"},{\"label\":\"Melanin\",\"value\":0.0051,\"units\":\"vol. frac.\"}],\"bloodConcentration\":{\"totalHb\":50.8,\"bloodVolume\":0.021844,\"stO2\":0.4409448818897638},\"scatteringType\":\"PowerLaw\",\"powerLawScatterer\":{\"a\":1.2,\"b\":1.42},\"intralipidScatterer\":{\"volumeFraction\":0.01},\"mieScatterer\":{\"particleRadius\":0.5,\"ParticleRefractiveIndexMismatch\":1.4,\"MediumRefractiveIndexMismatch\":1,\"volumeFraction\":0.01},\"xAxis\":{\"start\":650,\"stop\":1000,\"count\":36}}";
            var xAxis                  = new DoubleRange(650, 1000, 36);
            var wavelengths            = xAxis.AsEnumerable().ToArray();
            var spectralPlotParameters = JsonConvert.DeserializeObject <SpectralPlotParameters>(postData);

            _plotFactoryMock.Setup(x => x.GetPlot(PlotType.Spectral, spectralPlotParameters)).Returns("");
            var results = _spectralService.GetPlotData(spectralPlotParameters);

            Assert.AreEqual("", results);
            _plotFactoryMock.Verify(mock => mock.GetPlot(PlotType.Spectral, spectralPlotParameters), Times.Once);
            Assert.AreEqual(wavelengths[4], spectralPlotParameters.Wavelengths[4]);
            Assert.AreEqual(TissueType.Skin, spectralPlotParameters.Tissue.TissueType);
        }
        private IEnumerable <Complex> ROfFxAndFt(ForwardSolverType forwardSolverType, OpticalProperties opticalProperties, double fx, DoubleRange ft, double noise)
        {
            var ops     = opticalProperties.AsEnumerable().ToArray();
            var fxs     = fx.AsEnumerable().ToArray();
            var fts     = ft.AsEnumerable().ToArray();
            var fs      = SolverFactory.GetForwardSolver(forwardSolverType);
            var results = fs.ROfRhoAndFt(ops, fxs, fts).ToArray();

            if (noise > 0.0)
            {
                var realsWithNoise = results.Select(r => r.Real).AddNoise(noise);
                var imagsWithNoise = results.Select(i => i.Imaginary).AddNoise(noise);
                IEnumerable <Complex> resultsWithNoise = realsWithNoise.Zip(imagsWithNoise, (a, b) => new Complex(a, b));
                return(resultsWithNoise);
            }
            return(fs.ROfFxAndFt(ops, fxs, fts));
        }
 private IEnumerable <double> ROfFx(ForwardSolverType forwardSolverType, OpticalProperties opticalProperties, DoubleRange fx, double noise)
 {
     try
     {
         var ops = opticalProperties.AsEnumerable();
         var fxs = fx.AsEnumerable();
         var fs  = SolverFactory.GetForwardSolver(forwardSolverType);
         if (noise > 0.0)
         {
             return(fs.ROfFx(ops, fxs).AddNoise(noise));
         }
         return(fs.ROfFx(ops, fxs));
     }
     catch (Exception e)
     {
         _logger.LogError("Error in call to ROfFx: " + e.Message + "values fst: " + forwardSolverType + ", op: " + opticalProperties + ", rho:" + fx + " source: " + e.Source + " inner: " + e.InnerException);
         throw;
     }
 }
        public void Test_plot_musp()
        {
            _plotSpectralResultsService = new PlotSpectralResultsService(_logger);
            var postData = "{\"spectralPlotType\":\"musp\",\"plotName\":\"μs'\",\"tissueType\":\"Skin\",\"absorberConcentration\":[{\"label\":\"Hb\",\"value\":28.4,\"units\":\"μM\"},{\"label\":\"HbO2\",\"value\":22.4,\"units\":\"μM\"},{\"label\":\"H2O\",\"value\":0.7,\"units\":\"vol. frac.\"},{\"label\":\"Fat\",\"value\":0,\"units\":\"vol. frac.\"},{\"label\":\"Melanin\",\"value\":0.0051,\"units\":\"vol. frac.\"}],\"bloodConcentration\":{\"totalHb\":50.8,\"bloodVolume\":0.021844,\"stO2\":0.4409448818897638},\"scatteringType\":\"PowerLaw\",\"powerLawScatterer\":{\"a\":1.2,\"b\":1.42},\"intralipidScatterer\":{\"volumeFraction\":0.01},\"mieScatterer\":{\"particleRadius\":0.5,\"ParticleRefractiveIndexMismatch\":1.4,\"MediumRefractiveIndexMismatch\":1,\"volumeFraction\":0.01},\"xAxis\":{\"start\":650,\"stop\":1000,\"count\":36}}";
            var spectralPlotParameters = JsonConvert.DeserializeObject <SpectralPlotParameters>(postData);
            var xAxis = new DoubleRange(650, 1000, 36);

            spectralPlotParameters.YAxis       = spectralPlotParameters.PlotName;
            spectralPlotParameters.Wavelengths = xAxis.AsEnumerable().ToArray();
            var chromophoreAbsorbers = new List <IChromophoreAbsorber>();

            foreach (var absorber in spectralPlotParameters.AbsorberConcentration)
            {
                chromophoreAbsorbers.Add(new ChromophoreAbsorber(Enum.Parse <ChromophoreType>(absorber.Label, true), absorber.Value));
            }
            var scatterer = new PowerLawScatterer(1.2, 1.42);

            spectralPlotParameters.Tissue = new Tissue(chromophoreAbsorbers, scatterer, spectralPlotParameters.TissueType);
            var data        = _plotSpectralResultsService.Plot(spectralPlotParameters);
            var muspResults = "{\"Id\":\"SpectralMusp\",\"PlotList\":[{\"Label\":\"Skin μs'\",\"Data\":[[650.0,2.2123013258570863],[660.0,2.1648552221223785],[670.0,2.1191174426328576],[680.0,2.0750023361697605],[690.0,2.0324297212859692],[700.0,1.9913244640761809],[710.0,1.9516160940115432],[720.0,1.9132384539276279],[730.0,1.8761293807044339],[740.0,1.8402304135697998],[750.0,1.8054865273011322],[760.0,1.771845887901413],[770.0,1.7392596285897868],[780.0,1.7076816441795259],[790.0,1.6770684021210169],[800.0,1.6473787686682118],[810.0,1.618573848786806],[820.0,1.5906168385639152],[830.0,1.5634728890045213],[840.0,1.5371089802114051],[850.0,1.5114938050444233],[860.0,1.486597661443283],[870.0,1.4623923526767395],[880.0,1.438851094851493],[890.0,1.415948431076983],[900.0,1.3936601517386393],[910.0,1.3719632203826795],[920.0,1.3508357047609152],[930.0,1.330256712624823],[940.0,1.3102063318948318],[950.0,1.290665574863872],[960.0,1.2716163261240603],[970.0,1.2530412939323394],[980.0,1.2349239647552681],[990.0,1.2172485607551906],[1000.0,1.2]]}]}";

            Assert.AreEqual(muspResults, data);
        }
        public void Test_plot_mua()
        {
            _plotSpectralResultsService = new PlotSpectralResultsService(_logger);
            var postData = "{\"spectralPlotType\":\"mua\",\"plotName\":\"μa\",\"tissueType\":\"Skin\",\"absorberConcentration\":[{\"label\":\"Hb\",\"value\":28.4,\"units\":\"μM\"},{\"label\":\"HbO2\",\"value\":22.4,\"units\":\"μM\"},{\"label\":\"H2O\",\"value\":0.7,\"units\":\"vol. frac.\"},{\"label\":\"Fat\",\"value\":0,\"units\":\"vol. frac.\"},{\"label\":\"Melanin\",\"value\":0.0051,\"units\":\"vol. frac.\"}],\"bloodConcentration\":{\"totalHb\":50.8,\"bloodVolume\":0.021844,\"stO2\":0.4409448818897638},\"scatteringType\":\"PowerLaw\",\"powerLawScatterer\":{\"a\":1.2,\"b\":1.42},\"intralipidScatterer\":{\"volumeFraction\":0.01},\"mieScatterer\":{\"particleRadius\":0.5,\"ParticleRefractiveIndexMismatch\":1.4,\"MediumRefractiveIndexMismatch\":1,\"volumeFraction\":0.01},\"xAxis\":{\"start\":650,\"stop\":1000,\"count\":36}}";
            var spectralPlotParameters = JsonConvert.DeserializeObject <SpectralPlotParameters>(postData);
            var xAxis = new DoubleRange(650, 1000, 36);

            spectralPlotParameters.YAxis       = spectralPlotParameters.PlotName;
            spectralPlotParameters.Wavelengths = xAxis.AsEnumerable().ToArray();
            var chromophoreAbsorbers = new List <IChromophoreAbsorber>();

            foreach (var absorber in spectralPlotParameters.AbsorberConcentration)
            {
                chromophoreAbsorbers.Add(new ChromophoreAbsorber(Enum.Parse <ChromophoreType>(absorber.Label, true), absorber.Value));
            }
            var scatterer = new PowerLawScatterer(1.2, 1.42);

            spectralPlotParameters.Tissue = new Tissue(chromophoreAbsorbers, scatterer, spectralPlotParameters.TissueType);
            var data       = _plotSpectralResultsService.Plot(spectralPlotParameters);
            var muaResults = "{\"Id\":\"SpectralMua\",\"PlotList\":[{\"Label\":\"Skin μa\",\"Data\":[[650.0,0.16765660516524314],[660.0,0.15671650246614327],[670.0,0.14697135542801],[680.0,0.13799908824769305],[690.0,0.12973522277796562],[700.0,0.12260932419347584],[710.0,0.11583351729772583],[720.0,0.11010170400729173],[730.0,0.10472095509441402],[740.0,0.10129111493244414],[750.0,0.099521779546167088],[760.0,0.096959293661164639],[770.0,0.092068432646702891],[780.0,0.087311046148140767],[790.0,0.082850035254262877],[800.0,0.079106164468758858],[810.0,0.076218507603072],[820.0,0.07371667586209707],[830.0,0.0719944590933807],[840.0,0.070298642060247829],[850.0,0.0683344235938162],[860.0,0.066498798013490928],[870.0,0.06488501473536043],[880.0,0.063512933452956943],[890.0,0.062254209691212314],[900.0,0.061061385509031681],[910.0,0.060018918288031978],[920.0,0.059569360145074537],[930.0,0.060352136653759242],[940.0,0.062968288552839938],[950.0,0.06862831638709066],[960.0,0.07645596009583773],[970.0,0.077403147687485074],[980.0,0.075685057055814575],[990.0,0.071645012147578471],[1000.0,0.066587976157675921]]}]}";

            Assert.AreEqual(muaResults, data);
        }
        public void ProcessRequest(HttpContext context)
        {
            String action;
            String jsonString;

            try
            {
                action = context.Request["action"];
                context.Response.ContentType         = "text/json";
                context.Request.InputStream.Position = 0;
                using (var inputStream = new StreamReader(context.Request.InputStream))
                {
                    jsonString = inputStream.ReadToEnd();
                }
            }
            catch (Exception e)
            {
                throw new Exception("Error before action: " + e.Message);
            }
            var serializer = new JavaScriptSerializer();

            switch (action)
            {
            case "getdata":
                try
                {
                    dynamic vtsSettings = serializer.DeserializeObject(jsonString);
                    var     sd          = vtsSettings["solutionDomain"];
                    var     fs          = vtsSettings["forwardSolverEngine"];
                    var     msg         = "";
                    var     op          = new OpticalProperties(double.Parse(vtsSettings["opticalProperties"]["mua"]), double.Parse(vtsSettings["opticalProperties"]["mus"]), double.Parse(vtsSettings["opticalProperties"]["g"]), double.Parse(vtsSettings["opticalProperties"]["n"]));
                    if (sd == "rofrho")
                    {
                        var rho = new DoubleRange(double.Parse(vtsSettings["range"]["startValue"]), double.Parse(vtsSettings["range"]["endValue"]), int.Parse(vtsSettings["range"]["numberValue"]));
                        IEnumerable <double> results = null;
                        results = ROfRho(Enum.Parse(typeof(ForwardSolverType), fs), op, rho);
                        var independentValues = rho.AsEnumerable().ToArray();
                        var rhos = independentValues.Skip(1).Zip(independentValues.Take(independentValues.Length - 1), (first, second) => (first + second) / 2).ToArray();

                        var rOfRhoPoints = rhos.Zip(results, (x, y) => new Point(x, y));
                        var rOfRhoPlot   = new PlotData {
                            Data = rOfRhoPoints, Label = "ROfRho"
                        };
                        var rhoPlot = new Plots {
                            id = "ROfRho", detector = "R(ρ)", legend = "R(ρ)", xaxis = "ρ", yaxis = "Reflectance", plotlist = new List <PlotDataJson>()
                        };
                        rhoPlot.plotlist.Add(new PlotDataJson {
                            data = rOfRhoPlot.Data.Select(item => new List <double> {
                                item.X, item.Y
                            }).ToList(), label = fs + " μa=" + op.Mua + " μs'=" + op.Musp
                        });
                        msg = serializer.Serialize(rhoPlot);
                    }
                    else if (sd == "rofrhoandt")
                    {
                        IEnumerable <double> results = null;
                        var independentAxis          = vtsSettings["independentAxes"]["label"];
                        if (independentAxis == "t")
                        {
                            var rho  = new DoubleRange(double.Parse(vtsSettings["range"]["startValue"]), double.Parse(vtsSettings["range"]["endValue"]), int.Parse(vtsSettings["range"]["numberValue"]));
                            var time = double.Parse(vtsSettings["independentAxes"]["value"]);
                            results = ROfRhoAndTime(Enum.Parse(typeof(ForwardSolverType), fs), op, rho, time);
                            var independentValues = rho.AsEnumerable().ToArray();
                            var rhos         = independentValues.Skip(1).Zip(independentValues.Take(independentValues.Length - 1), (first, second) => (first + second) / 2).ToArray();
                            var rOfRhoPoints = rhos.Zip(results, (x, y) => new Point(x, y));
                            var rOfRhoPlot   = new PlotData {
                                Data = rOfRhoPoints, Label = "ROfRhoAndTime"
                            };
                            var rhoPlot = new Plots {
                                id = "ROfRhoAndTimeFixedTime", detector = "R(ρ,time)", legend = "R(ρ,time)", xaxis = "ρ", yaxis = "Reflectance", plotlist = new List <PlotDataJson>()
                            };
                            rhoPlot.plotlist.Add(new PlotDataJson {
                                data = rOfRhoPlot.Data.Select(item => new List <double> {
                                    item.X, item.Y
                                }).ToList(), label = fs + " μa=" + op.Mua + " μs'=" + op.Musp + " t=" + time
                            });
                            msg = serializer.Serialize(rhoPlot);
                        }
                        else
                        {
                            var time = new DoubleRange(double.Parse(vtsSettings["range"]["startValue"]), double.Parse(vtsSettings["range"]["endValue"]), int.Parse(vtsSettings["range"]["numberValue"]));
                            var rho  = double.Parse(vtsSettings["independentAxes"]["value"]);
                            results = ROfRhoAndTime(Enum.Parse(typeof(ForwardSolverType), fs), op, rho, time);
                            var independentValues = time.AsEnumerable().ToArray();
                            var times             = independentValues.Skip(1).Zip(independentValues.Take(independentValues.Length - 1), (first, second) => (first + second) / 2).ToArray();
                            var dataPoints        = times.Zip(results, (x, y) => new Point(x, y));
                            var dataPlot          = new PlotData {
                                Data = dataPoints, Label = "ROfRhoAndTime"
                            };
                            var rhoPlot = new Plots {
                                id = "ROfRhoAndTimeFixedRho", detector = "R(ρ,time)", legend = "R(ρ,time)", xaxis = "Time", yaxis = "Reflectance", plotlist = new List <PlotDataJson>()
                            };
                            rhoPlot.plotlist.Add(new PlotDataJson {
                                data = dataPlot.Data.Select(item => new List <double> {
                                    item.X, item.Y
                                }).ToList(), label = fs + " μa=" + op.Mua + " μs'=" + op.Musp + " ρ=" + rho
                            });
                            msg = serializer.Serialize(rhoPlot);
                        }
                    }
                    else if (sd == "rofrhoandft")
                    {
                        IEnumerable <Complex> results;
                        var independentAxis = vtsSettings["independentAxes"]["label"];
                        if (independentAxis == "ft")
                        {
                            var rho = new DoubleRange(double.Parse(vtsSettings["range"]["startValue"]), double.Parse(vtsSettings["range"]["endValue"]), int.Parse(vtsSettings["range"]["numberValue"]));
                            var ft  = double.Parse(vtsSettings["independentAxes"]["value"]);
                            results = ROfRhoAndFt(Enum.Parse(typeof(ForwardSolverType), fs), op, rho, ft);
                            var independentValues = rho.AsEnumerable().ToArray();
                            var rhos       = independentValues.Skip(1).Zip(independentValues.Take(independentValues.Length - 1), (first, second) => (first + second) / 2).ToArray();
                            var realPoints = rhos.Zip(results, (x, y) => new Point(x, y.Real));
                            var imagPoints = rhos.Zip(results, (x, y) => new Point(x, y.Imaginary));
                            var realPlot   = new PlotData {
                                Data = realPoints, Label = "ROfRhoAndFt"
                            };
                            var imagPlot = new PlotData {
                                Data = imagPoints, Label = "ROfRhoAndFt"
                            };
                            var rhoPlot = new Plots {
                                id = "ROfRhoAndFtFixedFt", detector = "R(ρ,ft)", legend = "R(ρ,ft)", xaxis = "ρ", yaxis = "Reflectance", plotlist = new List <PlotDataJson>()
                            };
                            rhoPlot.plotlist.Add(new PlotDataJson {
                                data = realPlot.Data.Select(item => new List <double> {
                                    item.X, item.Y
                                }).ToList(), label = fs + " μa=" + op.Mua + " μs'=" + op.Musp + " t=" + ft + "(real)"
                            });
                            rhoPlot.plotlist.Add(new PlotDataJson {
                                data = imagPlot.Data.Select(item => new List <double> {
                                    item.X, item.Y
                                }).ToList(), label = fs + " μa=" + op.Mua + " μs'=" + op.Musp + " t=" + ft + "(imag)"
                            });
                            msg = serializer.Serialize(rhoPlot);
                        }
                        else
                        {
                            var ft  = new DoubleRange(double.Parse(vtsSettings["range"]["startValue"]), double.Parse(vtsSettings["range"]["endValue"]), int.Parse(vtsSettings["range"]["numberValue"]));
                            var rho = double.Parse(vtsSettings["independentAxes"]["value"]);
                            results = ROfRhoAndFt(Enum.Parse(typeof(ForwardSolverType), fs), op, rho, ft);
                            var independentValues = ft.AsEnumerable().ToArray();
                            var times             = independentValues.Skip(1).Zip(independentValues.Take(independentValues.Length - 1), (first, second) => (first + second) / 2).ToArray();
                            var realPoints        = times.Zip(results, (x, y) => new Point(x, y.Real));
                            var imagPoints        = times.Zip(results, (x, y) => new Point(x, y.Imaginary));
                            var realPlot          = new PlotData {
                                Data = realPoints, Label = "ROfRhoAndFt"
                            };
                            var imagPlot = new PlotData {
                                Data = imagPoints, Label = "ROfRhoAndFt"
                            };
                            var rhoPlot = new Plots {
                                id = "ROfRhoAndFtFixedRho", detector = "R(ρ,ft)", legend = "R(ρ,ft)", xaxis = "Time", yaxis = "Reflectance", plotlist = new List <PlotDataJson>()
                            };
                            rhoPlot.plotlist.Add(new PlotDataJson {
                                data = realPlot.Data.Select(item => new List <double> {
                                    item.X, item.Y
                                }).ToList(), label = fs + " μa=" + op.Mua + " μs'=" + op.Musp + " ρ=" + rho + "(real)"
                            });
                            rhoPlot.plotlist.Add(new PlotDataJson {
                                data = imagPlot.Data.Select(item => new List <double> {
                                    item.X, item.Y
                                }).ToList(), label = fs + " μa=" + op.Mua + " μs'=" + op.Musp + " ρ=" + rho + "(imag)"
                            });
                            msg = serializer.Serialize(rhoPlot);
                        }
                    }
                    else if (sd == "roffx")
                    {
                        var fx = new DoubleRange(double.Parse(vtsSettings["range"]["startValue"]), double.Parse(vtsSettings["range"]["endValue"]), int.Parse(vtsSettings["range"]["numberValue"]));
                        IEnumerable <double> results = null;
                        results = ROfFx(Enum.Parse(typeof(ForwardSolverType), fs), op, fx);
                        var independentValues = fx.AsEnumerable().ToArray();
                        var fxs = independentValues.Skip(1).Zip(independentValues.Take(independentValues.Length - 1), (first, second) => (first + second) / 2).ToArray();

                        var rOfFxPoints = fxs.Zip(results, (x, y) => new Point(x, y));
                        var rOfFxPlot   = new PlotData {
                            Data = rOfFxPoints, Label = "ROfFx"
                        };
                        var fxPlot = new Plots {
                            id = "ROfFx", detector = "R(fx)", legend = "R(fx)", xaxis = "fx", yaxis = "Reflectance", plotlist = new List <PlotDataJson>()
                        };
                        fxPlot.plotlist.Add(new PlotDataJson {
                            data = rOfFxPlot.Data.Select(item => new List <double> {
                                item.X, item.Y
                            }).ToList(), label = fs + " μa=" + op.Mua + " μs'=" + op.Musp
                        });
                        msg = serializer.Serialize(fxPlot);
                    }
                    else if (sd == "roffxandt")
                    {
                        IEnumerable <double> results = null;
                        var independentAxis          = vtsSettings["independentAxes"]["label"];
                        if (independentAxis == "t")
                        {
                            var fx   = new DoubleRange(double.Parse(vtsSettings["range"]["startValue"]), double.Parse(vtsSettings["range"]["endValue"]), int.Parse(vtsSettings["range"]["numberValue"]));
                            var time = double.Parse(vtsSettings["independentAxes"]["value"]);
                            results = ROfFxAndTime(Enum.Parse(typeof(ForwardSolverType), fs), op, fx, time);
                            var independentValues = fx.AsEnumerable().ToArray();
                            var fxs         = independentValues.Skip(1).Zip(independentValues.Take(independentValues.Length - 1), (first, second) => (first + second) / 2).ToArray();
                            var rOfFxPoints = fxs.Zip(results, (x, y) => new Point(x, y));
                            var rOfFxPlot   = new PlotData {
                                Data = rOfFxPoints, Label = "ROfFxAndTime"
                            };
                            var fxPlot = new Plots {
                                id = "ROfFxAndTimeFixedTime", detector = "R(fx,time)", legend = "R(fx,time)", xaxis = "fx", yaxis = "Reflectance", plotlist = new List <PlotDataJson>()
                            };
                            fxPlot.plotlist.Add(new PlotDataJson {
                                data = rOfFxPlot.Data.Select(item => new List <double> {
                                    item.X, item.Y
                                }).ToList(), label = fs + " μa=" + op.Mua + " μs'=" + op.Musp + " t=" + time
                            });
                            msg = serializer.Serialize(fxPlot);
                        }
                        else
                        {
                            var time = new DoubleRange(double.Parse(vtsSettings["range"]["startValue"]), double.Parse(vtsSettings["range"]["endValue"]), int.Parse(vtsSettings["range"]["numberValue"]));
                            var fx   = double.Parse(vtsSettings["independentAxes"]["value"]);
                            results = ROfFxAndTime(Enum.Parse(typeof(ForwardSolverType), fs), op, fx, time);
                            var independentValues = time.AsEnumerable().ToArray();
                            var times             = independentValues.Skip(1).Zip(independentValues.Take(independentValues.Length - 1), (first, second) => (first + second) / 2).ToArray();
                            var dataPoints        = times.Zip(results, (x, y) => new Point(x, y));
                            var dataPlot          = new PlotData {
                                Data = dataPoints, Label = "ROfFxAndTime"
                            };
                            var fxPlot = new Plots {
                                id = "ROfFxAndTimeFixedFx", detector = "R(fx,time)", legend = "R(fx,time)", xaxis = "Time", yaxis = "Reflectance", plotlist = new List <PlotDataJson>()
                            };
                            fxPlot.plotlist.Add(new PlotDataJson {
                                data = dataPlot.Data.Select(item => new List <double> {
                                    item.X, item.Y
                                }).ToList(), label = fs + " μa=" + op.Mua + " μs'=" + op.Musp + " ρ=" + fx
                            });
                            msg = serializer.Serialize(fxPlot);
                        }
                    }
                    else if (sd == "roffxandft")
                    {
                        IEnumerable <Complex> results;
                        var independentAxis = vtsSettings["independentAxes"]["label"];
                        if (independentAxis == "ft")
                        {
                            var fx = new DoubleRange(double.Parse(vtsSettings["range"]["startValue"]), double.Parse(vtsSettings["range"]["endValue"]), int.Parse(vtsSettings["range"]["numberValue"]));
                            var ft = double.Parse(vtsSettings["independentAxes"]["value"]);
                            results = ROfFxAndFt(Enum.Parse(typeof(ForwardSolverType), fs), op, fx, ft);
                            var independentValues = fx.AsEnumerable().ToArray();
                            var fxs        = independentValues.Skip(1).Zip(independentValues.Take(independentValues.Length - 1), (first, second) => (first + second) / 2).ToArray();
                            var realPoints = fxs.Zip(results, (x, y) => new Point(x, y.Real));
                            var imagPoints = fxs.Zip(results, (x, y) => new Point(x, y.Imaginary));
                            var realPlot   = new PlotData {
                                Data = realPoints, Label = "ROfFxAndFt"
                            };
                            var imagPlot = new PlotData {
                                Data = imagPoints, Label = "ROfFxAndFt"
                            };
                            var fxPlot = new Plots {
                                id = "ROfFxAndFtFixedFt", detector = "R(fx,ft)", legend = "R(fx,ft)", xaxis = "fx", yaxis = "Reflectance", plotlist = new List <PlotDataJson>()
                            };
                            fxPlot.plotlist.Add(new PlotDataJson {
                                data = realPlot.Data.Select(item => new List <double> {
                                    item.X, item.Y
                                }).ToList(), label = fs + " μa=" + op.Mua + " μs'=" + op.Musp + " t=" + ft + "(real)"
                            });
                            fxPlot.plotlist.Add(new PlotDataJson {
                                data = imagPlot.Data.Select(item => new List <double> {
                                    item.X, item.Y
                                }).ToList(), label = fs + " μa=" + op.Mua + " μs'=" + op.Musp + " t=" + ft + "(imag)"
                            });
                            msg = serializer.Serialize(fxPlot);
                        }
                        else
                        {
                            var ft = new DoubleRange(double.Parse(vtsSettings["range"]["startValue"]), double.Parse(vtsSettings["range"]["endValue"]), int.Parse(vtsSettings["range"]["numberValue"]));
                            var fx = double.Parse(vtsSettings["independentAxes"]["value"]);
                            results = ROfFxAndFt(Enum.Parse(typeof(ForwardSolverType), fs), op, fx, ft);
                            var independentValues = ft.AsEnumerable().ToArray();
                            var times             = independentValues.Skip(1).Zip(independentValues.Take(independentValues.Length - 1), (first, second) => (first + second) / 2).ToArray();
                            var realPoints        = times.Zip(results, (x, y) => new Point(x, y.Real));
                            var imagPoints        = times.Zip(results, (x, y) => new Point(x, y.Imaginary));
                            var realPlot          = new PlotData {
                                Data = realPoints, Label = "ROfFxAndFt"
                            };
                            var imagPlot = new PlotData {
                                Data = imagPoints, Label = "ROfFxAndFt"
                            };
                            var fxPlot = new Plots {
                                id = "ROfFxAndFtFixedFx", detector = "R(fx,ft)", legend = "R(fx,ft)", xaxis = "Time", yaxis = "Reflectance", plotlist = new List <PlotDataJson>()
                            };
                            fxPlot.plotlist.Add(new PlotDataJson {
                                data = realPlot.Data.Select(item => new List <double> {
                                    item.X, item.Y
                                }).ToList(), label = fs + " μa=" + op.Mua + " μs'=" + op.Musp + " fx=" + fx + "(real)"
                            });
                            fxPlot.plotlist.Add(new PlotDataJson {
                                data = imagPlot.Data.Select(item => new List <double> {
                                    item.X, item.Y
                                }).ToList(), label = fs + " μa=" + op.Mua + " μs'=" + op.Musp + " fx=" + fx + "(imag)"
                            });
                            msg = serializer.Serialize(fxPlot);
                        }
                    }
                    context.Response.Write(msg);
                }
                catch (Exception e)
                {
                    throw new Exception("Error during action: " + e.Message);
                }
                break;

            case "getfile":
                string dataLocation = "Modeling/Resources/HankelData/";
                var    hankelPoints = (double[])FileIO.ReadArrayFromBinaryInResources <double>
                                          (dataLocation + @"basepoints.dat", "Vts", 801);
                context.Response.Write(serializer.Serialize(hankelPoints));
                break;

            default:
                break;
            }
        }