コード例 #1
0
ファイル: ExcelReader.cs プロジェクト: kingofcrabs/APDilution
        private List <DilutionInfo> GetDilutionInfos(DilutionInfo rawDilutionInfo,
                                                     int stdParallelCnt,
                                                     int sampleParallelCnt,
                                                     List <int> remainingWellIDs,
                                                     ref int parallelCnt,
                                                     ref int firstWellID4Parallel)
        {
            List <DilutionInfo> dilutionInfos = new List <DilutionInfo>();

            parallelCnt = stdParallelCnt;
            int dilutionTimes    = rawDilutionInfo.dilutionTimes;
            int mrdDilutionTimes = ExcelReader.MRDTimes;

            if (mrdDilutionTimes != 1 && dilutionTimes % mrdDilutionTimes != 0 && !Configurations.Instance.IsGradualPipetting)
            {
                throw new Exception(string.Format("分析号{0}的稀释倍数{1}不能整除mrd倍数{2}",
                                                  rawDilutionInfo.analysisNo, dilutionTimes, mrdDilutionTimes));
            }

            string     animalNo   = rawDilutionInfo.analysisNo;
            SampleType sampleType = rawDilutionInfo.type;
            int        seqNo      = rawDilutionInfo.seqIDinThisType;
            uint       orgVolume  = rawDilutionInfo.orgVolume;

            if (remainingWellIDs.Count == 0)
            {
                throw new Exception(string.Format("在进行到分析号为:{0}号样本时已经没有足够孔位。",
                                                  rawDilutionInfo.analysisNo));
            }

            //IsQC(sampleType)


            firstWellID4Parallel = IsQC(sampleType) ? GetFirstWellID4QC(sampleType, parallelCnt, rawDilutionInfo.analysisNo) : remainingWellIDs.Min();
            if (sampleType == SampleType.Norm)
            {
                parallelCnt = sampleParallelCnt;
            }

            for (int i = 0; i < parallelCnt; i++)
            {
                int wellID = firstWellID4Parallel + i * 8;
                if (!remainingWellIDs.Contains(wellID))
                {
                    throw new Exception(string.Format("样品:{0}需要孔位:{1}", animalNo, wellID));
                }
                remainingWellIDs.Remove(wellID);
                DilutionInfo dilutionInfo = new DilutionInfo(sampleType, orgVolume,
                                                             dilutionTimes,
                                                             seqNo, wellID, 1, animalNo);
                dilutionInfos.Add(dilutionInfo);
            }


            return(dilutionInfos);
        }
コード例 #2
0
        private string GetDilutionDescription(DilutionInfo dilutionInfo)
        {
            switch (dilutionInfo.type)
            {
            //case SampleType.Norm:
            //    return (ExcelReader.OrgSTDConc/dilutionInfo.dilutionTimes).ToString();
            case SampleType.STD:
            //return (ExcelReader.OrgSTDConc / dilutionInfo.dilutionTimes).ToString();
            case SampleType.HQC:
            case SampleType.LQC:
            case SampleType.MQC:
            case SampleType.Norm:
                return(((int)(dilutionInfo.dilutionTimes)).ToString());

            default:
                return("");
            }
        }
コード例 #3
0
ファイル: ExcelReader.cs プロジェクト: kingofcrabs/APDilution
        private List <DilutionInfo> ReadImpl(Application app, string sFilePath, ref List <DilutionInfo> rawDilutionInfos)
        {
            Workbook  wb                  = app.Workbooks.Open(sFilePath);
            Worksheet ws                  = (Worksheet)wb.Worksheets.get_Item(1);
            int       rowsint             = ws.UsedRange.Cells.Rows.Count;           //total rows
            Range     rngNormalSampleInfo = ws.Cells.get_Range("A2", "E" + rowsint); //item
            Range     rngStartConc        = ws.Cells.get_Range("H1");
            Range     rngSTDParallel      = ws.Cells.get_Range("H2");
            Range     rngSampleParallel   = ws.Cells.get_Range("H3");
            Range     rngMRDTimes         = ws.Cells.get_Range("H4");
            Range     rngAssayName        = ws.Cells.get_Range("H5");

            if (rngSTDParallel.Value2 == null)
            {
                throw new Exception("STD复孔数未设置!");
            }

            if (rngSampleParallel.Value2 == null)
            {
                throw new Exception("样本复孔数未设置!");
            }

            if (rngStartConc.Value2 == null)
            {
                throw new Exception("STD起始浓度未设置!");
            }


            if (rngMRDTimes.Value2 == null)
            {
                throw new Exception("MRD倍数未设置!");
            }

            if (rngAssayName.Value2 == null)
            {
                throw new Exception("方法名未设置!");
            }


            int stdParallelCnt    = int.Parse(rngSTDParallel.Value2.ToString());
            int sampleParallelCnt = int.Parse(rngSampleParallel.Value2.ToString());

            OrgSTDConc        = int.Parse(rngStartConc.Value2.ToString());
            STDParallelCnt    = stdParallelCnt;
            SampleParallelCnt = sampleParallelCnt;
            MRDTimes          = int.Parse(rngMRDTimes.Value2.ToString());
            string assayName = rngAssayName.Value2.ToString();

            if (Configurations.Instance.AssayName != assayName)
            {
                throw new Exception(string.Format("设置方法名为:{0},文件中方法名为:{1},不一致!",
                                                  Configurations.Instance.AssayName,
                                                  assayName));
            }


            if (STDParallelCnt < 2 || STDParallelCnt > 12)
            {
                throw new Exception("STD复孔数必须介于2~12之间!");
            }
            if (SampleParallelCnt < 2 || STDParallelCnt > 12)
            {
                throw new Exception("Sample复孔数必须介于2~12之间!");
            }

            Dictionary <int, NormalSampleInfo> sampleID_Info = new Dictionary <int, NormalSampleInfo>();
            List <DilutionInfo> dilutionInfos    = new List <DilutionInfo>();
            List <int>          remainingWellIDs = new List <int>();

            for (int i = 0; i < 96; i++)
            {
                remainingWellIDs.Add(i + 1);
            }

            object[,] arryItem = (object[, ])rngNormalSampleInfo.Value2;
            int lastWellIDOccupied = 1;
            int maxParallelCnt     = 0;

            rawDilutionInfos = new List <DilutionInfo>();
            int expectedColumnCnt = Configurations.Instance.IsGradualPipetting ? 3 : 5;

            for (int i = 1; i <= rowsint - 1; i++)
            {
                if (arryItem[i, 1] == null)
                {
                    break;
                }
                string animalNo = arryItem[i, 1].ToString();
                if (arryItem.GetLength(1) < expectedColumnCnt)
                {
                    throw new Exception(string.Format("样品号为:{0}的样本信息不全!", animalNo));
                }

                int    sampleID      = int.Parse(arryItem[i, 2].ToString());
                int    dilutionTimes = int.Parse(arryItem[i, 3].ToString());
                string sVolume       = ((int)Configurations.Instance.DilutionVolume).ToString();

                if (!Configurations.Instance.IsGradualPipetting)
                {
                    sVolume = arryItem[i, 4].ToString();
                }
                uint volume = uint.Parse(sVolume);
                if (volume < 20)
                {
                    throw new Exception(string.Format("样品号为:{0}的样本,体积太少!", animalNo));
                }
                rawDilutionInfos.Add(new DilutionInfo(ParseSampleType(animalNo), volume,
                                                      dilutionTimes, sampleID, 0, 1, animalNo));
            }
            CheckDuplicated(rawDilutionInfos);
            List <DilutionInfo> normalSamples = new List <DilutionInfo>();

            if (Configurations.Instance.IsGradualPipetting) //put normal samples to the end
            {
                normalSamples = rawDilutionInfos.Where(x => x.type == SampleType.Norm).ToList();
                if (normalSamples.Count > 2)
                {
                    throw new Exception("普通样本数不得大于2!");
                }
                rawDilutionInfos = rawDilutionInfos.Except(normalSamples).ToList();
            }


            var QCs = rawDilutionInfos.Where(x => IsFirstQC(x)).ToList();

            if (QCs.Count != 0)
            {
                rawDilutionInfos = rawDilutionInfos.Except(QCs).ToList();
                rawDilutionInfos.InsertRange(0, QCs);
            }

            QCs = rawDilutionInfos.Where(x => IsSecondQC(x)).ToList();
            if (QCs.Count != 0)
            {
                rawDilutionInfos = rawDilutionInfos.Except(QCs).ToList();
                rawDilutionInfos.InsertRange(rawDilutionInfos.Count, QCs);
            }

            for (int i = 0; i < rawDilutionInfos.Count; i++)
            {
                int                 parallelCnt          = 0;
                int                 firstWellID4Parallel = 0;
                DilutionInfo        rawDilutionInfo      = rawDilutionInfos[i];
                List <DilutionInfo> tmpDilutionInfos     = GetDilutionInfos(rawDilutionInfo,
                                                                            stdParallelCnt, sampleParallelCnt, remainingWellIDs, ref parallelCnt, ref firstWellID4Parallel);
                if (parallelCnt > maxParallelCnt)
                {
                    maxParallelCnt = parallelCnt;
                }
                //lastWellIDOccupied =
                bool isLastWellOfColumn = IsLastWellOfColumn(firstWellID4Parallel);
                if (isLastWellOfColumn)
                {
                    lastWellIDOccupied = firstWellID4Parallel + 8 * (maxParallelCnt - 1);
                    remainingWellIDs.RemoveAll(x => x <= lastWellIDOccupied);
                    maxParallelCnt = 0;
                }

                if (Configurations.Instance.IsGradualPipetting && (i + 1) == rawDilutionInfos.Count)//jump the whole columns
                {
                    int regionID       = (firstWellID4Parallel + 7) / 8;
                    int lastIDOfRegion = regionID * 8;
                    lastWellIDOccupied = lastIDOfRegion + 8 * (maxParallelCnt - 1);
                    remainingWellIDs.RemoveAll(x => x <= lastWellIDOccupied);
                    maxParallelCnt = 0;
                }
                dilutionInfos.AddRange(tmpDilutionInfos);
            }

            if (Configurations.Instance.IsGradualPipetting) //append normal samples
            {
                rawDilutionInfos.AddRange(normalSamples);
                if (remainingWellIDs.Count / 24 < normalSamples.Count)
                {
                    throw new Exception(string.Format("只剩{0} 个孔位,不够稀释{1}个样品。", remainingWellIDs.Count, normalSamples.Count));
                }

                int normSartWellID = remainingWellIDs.Min();
                foreach (var normalSample in normalSamples)
                {
                    int gradualWellsNeeded = Utility.GetNeededGradualWellsCount(normalSample.dilutionTimes);
                    for (int i = 0; i < gradualWellsNeeded; i++)
                    {
                        for (int parallelOffSet = 0; parallelOffSet < sampleParallelCnt; parallelOffSet++)
                        {
                            int wellID = normSartWellID + i * sampleParallelCnt + parallelOffSet;
                            dilutionInfos.Add(new DilutionInfo(normalSample.type,
                                                               normalSample.orgVolume,
                                                               normalSample.dilutionTimes,
                                                               normalSample.seqIDinThisType,
                                                               wellID,
                                                               i + 1));
                        }
                    }
                    normSartWellID += gradualWellsNeeded * sampleParallelCnt;
                }
            }
            dilutionInfos = dilutionInfos.OrderBy(x => x.destWellID).ToList();
            return(dilutionInfos);
        }
コード例 #4
0
ファイル: ExcelReader.cs プロジェクト: kingofcrabs/APDilution
 private bool IsSecondQC(DilutionInfo dilutionInfo)
 {
     return(IsQC(dilutionInfo.type) && dilutionInfo.analysisNo.Contains("2"));
 }
コード例 #5
0
ファイル: ExcelReader.cs プロジェクト: kingofcrabs/APDilution
 private bool IsFirstQC(DilutionInfo dilutionInfo)
 {
     return(IsQC(dilutionInfo.type) && dilutionInfo.analysisNo.Contains("1"));
 }