/// <summary> /// Compare two <see cref="IChemObject"/> classes and return the difference as an <see cref="IDifference"/>. /// </summary> /// <param name="first">the first of the two classes to compare</param> /// <param name="second">the second of the two classes to compare</param> /// <returns>an <see cref="IDifference"/> representation of the difference between the first and second <see cref="IChemObject"/>.</returns> public static IDifference Difference(IChemObject first, IChemObject second) { if (!(first is IAtomType && second is IAtomType)) { return(null); } var firstElem = (IAtomType)first; var secondElem = (IAtomType)second; var totalDiff = new ChemObjectDifference("AtomTypeDiff"); totalDiff.AddChild(StringDifference.Construct("N", firstElem.AtomTypeName, secondElem.AtomTypeName)); totalDiff.AddChild(BondOrderDifference.Construct("MBO", firstElem.MaxBondOrder, secondElem.MaxBondOrder)); totalDiff .AddChild(DoubleDifference.Construct("BOS", firstElem.BondOrderSum, secondElem.BondOrderSum)); totalDiff .AddChild(IntegerDifference.Construct("FC", firstElem.FormalCharge, secondElem.FormalCharge)); totalDiff.AddChild(AtomTypeHybridizationDifference.Construct("H", firstElem.Hybridization, secondElem.Hybridization)); totalDiff.AddChild(IntegerDifference.Construct("NC", firstElem.FormalNeighbourCount, secondElem.FormalNeighbourCount)); totalDiff.AddChild(DoubleDifference.Construct("CR", firstElem.CovalentRadius, secondElem.CovalentRadius)); totalDiff.AddChild(IntegerDifference.Construct("V", firstElem.Valency, secondElem.Valency)); totalDiff.AddChild(IsotopeDiff.Difference(first, second)); if (totalDiff.ChildCount() > 0) { return(totalDiff); } else { return(null); } }
/// <summary> /// Compare two <see cref="IChemObject"/> classes and return the difference as an <see cref="IDifference"/>. /// </summary> /// <param name="first">the first of the two classes to compare</param> /// <param name="second">the second of the two classes to compare</param> /// <returns>an <see cref="IDifference"/> representation of the difference between the first and second <see cref="IChemObject"/>.</returns> public static IDifference Difference(IChemObject first, IChemObject second) { if (!(first is IBond && second is IBond)) { return(null); } IBond firstB = (IBond)first; IBond secondB = (IBond)second; IDifferenceList totalDiff = new ChemObjectDifference("BondDiff"); totalDiff.AddChild(BondOrderDifference.Construct("order", firstB.Order, secondB.Order)); totalDiff.AddChild(IntegerDifference.Construct("atomCount", firstB.Atoms.Count, secondB.Atoms.Count)); if (firstB.Atoms.Count == secondB.Atoms.Count) { totalDiff.AddChild(AtomDiff.Difference(firstB.Begin, secondB.Begin)); totalDiff.AddChild(AtomDiff.Difference(firstB.End, secondB.End)); for (int i = 2; i < firstB.Atoms.Count; i++) { totalDiff.AddChild(AtomDiff.Difference(firstB.Atoms[i], secondB.Atoms[i])); } } totalDiff.AddChild(ElectronContainerDiff.Difference(first, second)); if (totalDiff.ChildCount() > 0) { return(totalDiff); } else { return(null); } }