/// <summary> /// Initializes a new instance of the <see cref="ChemicalBasedAnalysisResult"/> class. /// </summary> /// <param name="result"> /// The result. /// </param> /// <param name="newWorkflowResult"> /// The new workflow result. /// </param> public ChemicalBasedAnalysisResult(ChemicalBasedAnalysisResult result, CrossSectionWorkflowResult newWorkflowResult) { // previous results inconclusive, new result conclusive if (!IsConclusive(result.AnalysisStatus)) { this.InitiateFromWorkflowResult(newWorkflowResult); } // new result inconclusive, previous result conclusive or not conclusive else if (!IsConclusive(newWorkflowResult.AnalysisStatus)) { this.AnalysisStatus = result.AnalysisStatus; this.FusionNumber = result.FusionNumber; this.DetectedIsomers = result.DetectedIsomers; this.Target = result.Target; } // both result conclusive, conflict if (CheckConflict(result, newWorkflowResult)) { this.AnalysisStatus = AnalysisStatus.ConflictRuns; this.FusionNumber = result.FusionNumber; this.DetectedIsomers = result.DetectedIsomers; this.Target = result.Target; } // both result conclusive, no conflict IEnumerable<IdentifiedIsomerInfo> newIsomerList = result.DetectedIsomers.Zip(newWorkflowResult.IdentifiedIsomers, (A, B) => FuseIsomerResult(A, B, result.FusionNumber, 1)); this.AnalysisStatus = result.AnalysisStatus; this.FusionNumber = result.FusionNumber + 1; this.DetectedIsomers = newIsomerList; this.Target = result.Target; }
/// <summary> /// Check if there are conflicts in /// </summary> /// <param name="result"> /// The result. /// </param> /// <param name="newWorkflowResult"> /// The new workflow result. /// </param> /// <returns> /// The <see cref="bool"/>. /// </returns> /// <exception cref="InvalidOperationException"> /// </exception> private static bool CheckConflict(ChemicalBasedAnalysisResult result, CrossSectionWorkflowResult newWorkflowResult) { if (!newWorkflowResult.Target.Equals(result.Target)) { throw new InvalidOperationException("Cannot check conflict for results from different chemicals or with different ionization methods"); } if (result.DetectedIsomers.Count() != newWorkflowResult.IdentifiedIsomers.Count()) { return true; } if (result.AnalysisStatus != newWorkflowResult.AnalysisStatus) { return true; } IEnumerable<bool> r = result.DetectedIsomers.Zip(newWorkflowResult.IdentifiedIsomers, CheckConflict); return !r.Select(b => b == false).Any(); }