private bool MatchByMass(IAtomContainer ac, double peak, double mzabs, double mzppm, out double matchedMass, out double hydrogenPenalty, out int hydrogensAdded) { matchedMass = 0; hydrogenPenalty = 0; hydrogensAdded = 0; double mass; //speed up and neutral loss matching! if (ac.getProperty("FragmentMass") != null && (string)ac.getProperty("FragmentMass") != "") { mass = double.Parse(ac.getProperty("FragmentMass").ToString(), CultureInfo.InvariantCulture); } else { mass = MolecularFormulaTools.GetMonoisotopicMass(GetMolecularFormula(ac)); } var peakLow = peak - mzabs - PpmTool.GetPPMDeviation(peak, mzppm); var peakHigh = peak + mzabs + PpmTool.GetPPMDeviation(peak, mzppm); //now try to add/remove neutral hydrogens ...at most the treedepth var treeDepth = int.Parse((String)ac.getProperty("TreeDepth")); for (var i = 0; i <= treeDepth; i++) { var hMass = i * hydrogenMass; if ((mass + hMass) >= peakLow && (mass + hMass) <= peakHigh) { matchedMass = Math.Round(mass + hMass, 4); //now add a bond energy equivalent to a H-C bond hydrogenPenalty = (i * 1000); hydrogensAdded = i; return true; } if ((mass - hMass) >= peakLow && (mass - hMass) <= peakHigh) { matchedMass = Math.Round(mass - hMass, 4); //now add a bond energy equivalent to a H-C bond hydrogenPenalty = (i * 1000); hydrogensAdded = -i; return true; } } return false; }
/** * Quick isomorphism check: * ...if the fragment is isomorph to the ones already in the map * ...only the atoms are compared and a list of bonds is stored in a * map with sum formula to fragment * * * @param fragment the fragment to be checked * * @return true, if successful * * @throws CDKException the CDK exception */ private bool isIdentical(IAtomContainer fragment, string currentSumFormula) { var isomorph = false; List<IAtomContainer> fragsToCompare = null; //iterate over list to check for isomorphism if (sumformulaToFragMap.TryGetValue(currentSumFormula, out fragsToCompare)) { isomorph = identicalAtoms(fragment, fragsToCompare); if (isomorph) { //now replace fragment if its "bond energy is less" var bondEnergy = Double.Parse((String)fragment.getProperty("BondEnergy"), CultureInfo.InvariantCulture); foreach (var atomContainer in fragsToCompare) { if (Double.Parse((String)atomContainer.getProperty("BondEnergy"), CultureInfo.InvariantCulture) > bondEnergy) { addFragmentToListMapReplace(fragment, currentSumFormula); } } } //if not in map (with this formula) add it else { addFragmentToListMap(fragment, currentSumFormula); } } else { //sum formula has no entry in map yet addFragmentToListMap(fragment, currentSumFormula); } return isomorph; }
/** * Gets the fragment mass subtracting the neutral loss from it. * It also sets the new FragmentWeight property * * @param fragment the fragment * @param mass the mass * * @return the fragment mass */ private double getFragmentMass(IAtomContainer fragment, double mass) { var massFinal = mass; var nlMass = 0.0; if (fragment.getProperty("FragmentMass") != null && (string)fragment.getProperty("FragmentMass") != "") { if (fragment.getProperty("NlMass") != null && (string)fragment.getProperty("NlMass") != "") { var tempNLMass = fragment.getProperty("NlMass").ToString().Split(','); for (var i = 0; i < tempNLMass.Count(); i++) { nlMass += Convert.ToDouble(tempNLMass[i], CultureInfo.InvariantCulture); } } } massFinal = massFinal - nlMass; fragment.setProperty("FragmentMass", massFinal.ToString(CultureInfo.InvariantCulture)); return massFinal; }
/** * Sets the bond energy. * * @param mol the mol * @param bondEnergy the bond energy * * @return the i atom container */ private IAtomContainer setBondEnergy(IAtomContainer origMol, IAtomContainer mol, Double bondEnergy) { var props = mol.getProperties(); var bondEnergyOrig = (String)origMol.getProperty("BondEnergy"); if (bondEnergyOrig != null) { var sumEnergy = Convert.ToDouble(bondEnergyOrig, CultureInfo.InvariantCulture) + bondEnergy; props.put("BondEnergy", sumEnergy.ToString(CultureInfo.InvariantCulture)); } else { props.put("BondEnergy", bondEnergy.ToString(CultureInfo.InvariantCulture)); } mol.setProperties(props); return mol; }