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;
		}