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); }
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(""); } }
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); }
private bool IsSecondQC(DilutionInfo dilutionInfo) { return(IsQC(dilutionInfo.type) && dilutionInfo.analysisNo.Contains("2")); }
private bool IsFirstQC(DilutionInfo dilutionInfo) { return(IsQC(dilutionInfo.type) && dilutionInfo.analysisNo.Contains("1")); }