Exemple #1
0
        public IList <Core.DomainModel.Nuclide> GetNuclides()
        {
            IList <Core.DomainModel.Nuclide> nuclides = null;

            string sqlCommandText = ModuleConfiguration.SQL_CMD_SelectNiclides;

            var dbResult = this.dmlOperable.ExeReader(sqlCommandText, null);

            if (dbResult != null && dbResult.Count > 0)
            {
                nuclides = new List <Core.DomainModel.Nuclide>();

                Core.DomainModel.Nuclide nuclide = null;

                for (int i = 0; i < dbResult.Count; i++)
                {
                    nuclide = new Core.DomainModel.Nuclide()
                    {
                        ID           = dbResult[i]["ID"].ToString(),
                        Name         = (string)dbResult[i]["Name"],
                        Category     = dbResult[i]["Category"] == null ? 0 : int.Parse(dbResult[i]["Category"].ToString()),//(int?)dbResult[i]["Category"],
                        Type         = dbResult[i]["Type"] == null ? 0 : int.Parse(dbResult[i]["Type"].ToString()),
                        SerialNumber = (string)dbResult[i]["No"],
                        Symbol       = (string)dbResult[i]["Symbol"],
                        HalfLife     = dbResult[i]["HalfLife"] == null ? 0 : double.Parse(dbResult[i]["HalfLife"].ToString()),//(int?)dbResult[i]["HalfLife"],
                        HalfLifeUnit = (string)dbResult[i]["HalfLifeUnit"],
                        //Description = (string)dbResult[i]["Description"]
                        EnergyChannels = new List <EnergyChannel>(),
                    };

                    if (dbResult[i]["Energy1"] != null)
                    {
                        nuclide.EnergyChannels.Add(new EnergyChannel()
                        {
                            Index = 1, Energy = (float?)dbResult[i]["Energy1"], BranchingRatio = (float?)dbResult[i]["BranchingRatio1"], Channel = (float?)dbResult[i]["Channel1"]
                        });
                    }

                    if (dbResult[i]["Energy2"] != null)
                    {
                        nuclide.EnergyChannels.Add(new EnergyChannel()
                        {
                            Index = 2, Energy = (float?)dbResult[i]["Energy2"], BranchingRatio = (float?)dbResult[i]["BranchingRatio2"], Channel = (float?)dbResult[i]["Channel2"]
                        });
                    }

                    if (dbResult[i]["Energy3"] != null)
                    {
                        nuclide.EnergyChannels.Add(new EnergyChannel()
                        {
                            Index = 3, Energy = (float?)dbResult[i]["Energy3"], BranchingRatio = (float?)dbResult[i]["BranchingRatio3"], Channel = (float?)dbResult[i]["Channel3"]
                        });
                    }

                    nuclides.Add(nuclide);
                }
            }

            return(nuclides);
        }
Exemple #2
0
        public Core.DomainModel.Nuclide SetNuclide(string ID, Core.DomainModel.Nuclide Nuclide)
        {
            string sqlCommandText = ModuleConfiguration.SQL_CMD_UpdateNuclide;

            IDictionary <string, object> sqlParams = new Dictionary <string, object>()
            {
                { "@ID", Nuclide.ID },
                { "@No", Nuclide.SerialNumber },
                { "@Name", Nuclide.Name },
                { "@Symbol", Nuclide.Symbol },
                { "@Type", Nuclide.Type },
                { "@Category", Nuclide.Category },
                { "@HalfLife", Nuclide.HalfLife },
                { "@HalfLifeUnit", Nuclide.HalfLifeUnit },
                { "@Description", Nuclide.Description },
            };

            if (Nuclide.EnergyChannels != null && Nuclide.EnergyChannels.Count > 0)
            {
                for (int i = 0; i < Nuclide.EnergyChannels.Count; i++)
                {
                    sqlParams.Add($"@Energy{Nuclide.EnergyChannels[i].Index}", Nuclide.EnergyChannels[i].Energy);
                    sqlParams.Add($"@Channel{Nuclide.EnergyChannels[i].Index}", Nuclide.EnergyChannels[i].Channel);
                    sqlParams.Add($"@BranchingRatio{Nuclide.EnergyChannels[i].Index}", Nuclide.EnergyChannels[i].BranchingRatio);
                }
            }

            this.dmlOperable.ExeSql(sqlCommandText, sqlParams);

            return(Nuclide);
        }
Exemple #3
0
        public Core.DomainModel.Nuclide RecognizeNuclide(IList <double[]> EnergySpectrumData, int ChannelCount, IList <Core.DomainModel.Nuclide> Nuclides, int Algorithm, out IDictionary <int, Core.DomainModel.Nuclide> RecognitionResults)
        {
            Core.DomainModel.Nuclide mostProbableNuclide = null;
            RecognitionResults = null;

            double[] spectrumSumMatrix = new double[ChannelCount], channels = new double[ChannelCount], X, Y;
            double   A = 0, B = 0, C = 0;

            for (int i = 0; i < spectrumSumMatrix.Length; i++)
            {
                spectrumSumMatrix[i] = 0;
                channels[i]          = (i + 1);
            }

            for (int i = 0; i < EnergySpectrumData.Count; i++)
            {
                for (int j = 0; j < EnergySpectrumData[i].Length; j++)
                {
                    spectrumSumMatrix[j] += EnergySpectrumData[i][j];
                }
            }

            //求系数
            MathUtility.SolveLeastSquareCoefficient(channels, spectrumSumMatrix, out A, out B, out C);

            //最小二乘法做曲线平滑
            MathUtility.CurveSmooth(ChannelCount, A, B, C, out X, out Y);

            //if (X != null && Y != null)
            //{
            //寻峰
            List <int> peaks;
            List <int> data = new List <int>();

            for (int i = 0; i < Y.Length; i++)
            {
                data.Add(decimal.ToInt32(decimal.Parse(Y[i].ToString())));
            }

            Peak.Peaks(data.ToArray(), ChannelCount, out peaks);

            //}

            if (peaks == null || peaks.Count <= 0)
            {
                return(null);
            }

            //识别
            double energyAvg, energyVariance;
            Dictionary <string, double> nuclideEnergyVariances = new Dictionary <string, double>();
            List <double> perNuclideEnergyVariacesByPeak;
            double        perNuclideEnergyVariaceMin;

            foreach (var nuclide in Nuclides)
            {
                perNuclideEnergyVariacesByPeak = new List <double>();
                energyAvg = (double)nuclide.EnergyChannels.Average(ec => ec.Energy);

                for (int i = 0; i < peaks.Count; i++)
                {
                    energyVariance = Math.Abs((spectrumSumMatrix[i] / ChannelCount) - energyAvg);
                    perNuclideEnergyVariacesByPeak.Add(energyVariance);
                }

                perNuclideEnergyVariaceMin = perNuclideEnergyVariacesByPeak.Min();

                nuclideEnergyVariances.Add(nuclide.ID, perNuclideEnergyVariaceMin);
            }

            double nuclideEnergyVariaceMin = nuclideEnergyVariances.Min(nv => nv.Value);
            string probableEnergyID        = nuclideEnergyVariances.First(kv => kv.Value == nuclideEnergyVariaceMin).Key;

            mostProbableNuclide = Nuclides.First(n => n.ID == probableEnergyID);

            var rankedNuclides = nuclideEnergyVariances.OrderBy(kv => kv.Value);

            int rank = -1;

            RecognitionResults = new Dictionary <int, Core.DomainModel.Nuclide>();

            foreach (var nuclide in rankedNuclides)
            {
                rank += 1;
                RecognitionResults.Add(rank, Nuclides.FirstOrDefault(n => n.ID == nuclide.Key));
            }

            return(mostProbableNuclide);
        }