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); }
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); }
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); }