예제 #1
0
        public List <int> GetBestFactors(int dilutionTimes, bool isMRD = false)
        {
            if (dilutionTimes == 1)
            {
                return new List <int>()
                       {
                           1
                       }
            }
            ;
            if (Configurations.Instance.IsGradualPipetting)
            {
                return(GetGradualFactors(dilutionTimes));
            }

            //400's factors

            FactorFinder      finder         = new FactorFinder();
            FactorInfo        rootFactor     = new FactorInfo(dilutionTimes);
            List <FactorInfo> childrenFactor = new List <FactorInfo>();
            List <FactorInfo> finalFactors   = new List <FactorInfo>();

            childrenFactor = finder.GetFactors(rootFactor, possibleFactors, finalFactors);
            List <FactorInfo> thisStepFactorInfos = new List <FactorInfo>();

            for (int i = 1; i < Configurations.Instance.DilutionWells; i++) //4 or 6 steps
            {
                thisStepFactorInfos = new List <FactorInfo>();
                RemoveDuplicated(finalFactors);
                if (finalFactors.Count != 0)
                {
                    break;
                }
                foreach (var childFactor in childrenFactor)
                {
                    thisStepFactorInfos.AddRange(finder.GetFactors(childFactor, possibleFactors, finalFactors));
                }

                childrenFactor = RemoveDuplicated(thisStepFactorInfos);
                if (thisStepFactorInfos.Count == 0)
                {
                    break;
                }
            }
            finalFactors.AddRange(thisStepFactorInfos); //add last step;
            if (finalFactors.Count == 0)
            {
                throw new Exception("Cannot find factors for dilution times: " + dilutionTimes.ToString());
            }
            int minSum = finalFactors.Min(x => x.factors.Sum());
            var best   = finalFactors.Where(x => x.factors.Sum() == minSum).First();

            //if(isMRD)
            //{
            //    int maxSum = finalFactors.Max(x => x.factors.Sum());
            //    best = finalFactors.Where(x => x.factors.Sum() == maxSum).First();
            //}

            return(best.factors.OrderByDescending(x => x).ToList());
        }
예제 #2
0
        private void CheckValidity(List <DilutionInfo> dilutionInfos)
        {
            var normalDilutions = dilutionInfos.Where(x => x.type == SampleType.Norm).ToList();

            if (normalDilutions.Exists(x => x.dilutionTimes <= 0))
            {
                throw new Exception("稀释倍数必须大于0!");
            }
            //if(dilutionInfos.Exists(x=>x.type == SampleType.MatrixBlank && x.dilutionTimes != 0))
            //    throw new Exception("MatrixBlank 稀释倍数必须为0!");
            if (dilutionInfos.Exists(x => x.dilutionTimes > 6250000))
            {
                throw new Exception("稀释倍数必须不大于6.25M!");
            }

            foreach (var dilutionInfo in dilutionInfos)
            {
                if (dilutionInfo.orgVolume * dilutionInfo.dilutionTimes < Configurations.Instance.DilutionVolume)
                {
                    throw new Exception(string.Format("分析号为:{0}的样品体积太少,无法稀释到{1}", dilutionInfo.analysisNo, Configurations.Instance.DilutionVolume));
                }
            }

            FactorFinder factorFinder = new FactorFinder();
            var          validTimes   = factorFinder.GetValidDilutionTimes();

            foreach (var dilutionInfo in dilutionInfos)
            {
                if (!validTimes.Exists(x => x == dilutionInfo.dilutionTimes))
                {
                    throw new Exception(string.Format("分析号:{0}样品的稀释倍数:{1}非法!", dilutionInfo.analysisNo, dilutionInfo.dilutionTimes));
                }
            }
        }