public void WhenCandidateHasUnkownElement_GeneratesNoHits()
		{
			var fragger = new MetFrag(Encoding.Default.GetString(Resources.Digoxin_with_unknown_element));
			var results = fragger.metFrag(TestConfig.ExactMass, TestConfig.Peaks, TestConfig.Mode, TestConfig.MzAbs, TestConfig.MzPpm, CancellationToken.None).ToList();

			Assert.That(results.Count, Is.EqualTo(1));
			Assert.That(results[0].FragmentPics.Count(), Is.EqualTo(0));
		}
		public void WhenNoPeaksAreGiven_GeneratesNoHits()
		{
			var fragger = new MetFrag(Encoding.Default.GetString(Resources.Dihydrohydroxyciguatoxin));
			var results = fragger.metFrag(TestConfig.ExactMass, "", TestConfig.Mode, TestConfig.MzAbs, TestConfig.MzPpm, CancellationToken.None).ToList();

			Assert.That(results.Count, Is.EqualTo(1));
			Assert.That(results[0].FragmentPics.Count(), Is.EqualTo(0));
		}
		public void Negative_GainsAndLosesHydrogen()
		{
			const string peaks = @"113.076583862305 3.40501737594604
117.040496826172 3.55244660377502
118.999359130859 4.39520215988159
124.740966796875 2.43928718566895
142.267822265625 2.85816287994385";
			var fragger = new MetFrag(Encoding.Default.GetString(Resources.Melibiose));
			var results = fragger.metFrag(double.MaxValue, peaks, -1, mzAbs, mzPpm, CancellationToken.None).ToList();

			Assert.That(results.Count, Is.EqualTo(1));
			var frags = results[0].FragmentPics.ToList();
			Assert.That(frags.Count, Is.EqualTo(6));
			Assert.That(frags[0], new FragConstraint("C4H7O4", "", 119.0344));
			Assert.That(frags[1], new FragConstraint("C4H6O4", "+H", 119.0344));
			Assert.That(frags[2], new FragConstraint("C4H8O4", "-H", 119.0344));
			Assert.That(frags[3], new FragConstraint("C4H6O4", "-H", 117.0188));
			Assert.That(frags[4], new FragConstraint("C5H8O3", "+H", 117.0552));
			Assert.That(frags[5], new FragConstraint("C5H6O3", "-H", 113.0239));
		}
		public void Positive_GainsAndLosesHydrogen()
		{
			const string peaks = @"121.065101623535 91
180.260803222656 112
133.076599121094 441
179.09489440918 765
171.044692993164 283";
			var fragger = new MetFrag(Encoding.Default.GetString(Resources.Norsalsolinol));
			var results = fragger.metFrag(double.MaxValue, peaks, 1, mzAbs, mzPpm, CancellationToken.None).ToList();

			Assert.That(results.Count, Is.EqualTo(1));
			var frags = results[0].FragmentPics.ToList();
			Assert.That(frags.Count, Is.EqualTo(7));
			Assert.That(frags[0], new FragConstraint("C10H13NO2", "", 179.0946));
			Assert.That(frags[1], new FragConstraint("C9H10N", "+H", 133.0891));
			Assert.That(frags[2], new FragConstraint("C9H8O", "+H", 133.0653));
			Assert.That(frags[3], new FragConstraint("C8H7NO", "", 133.0528));
			Assert.That(frags[4], new FragConstraint("C8H10N", "+H", 121.0891));			 
			Assert.That(frags[5], new FragConstraint("C8H11N", "", 121.0891));
			Assert.That(frags[6], new FragConstraint("C7H6O2", "-H", 121.029));
		}
		private void BioMolecules_CreatesExpectedNumberOfFragments()
		{
			var peaksToUse = @"100.397850036621 6084.7646484375
111.041725158691 89713.7109375
112.049331665039 20392.29296875
115.121894836426 7023.431640625
125.057731628418 55243.30078125
126.065040588379 19947.212890625
126.586647033691 7430.0810546875
127.432609558105 9791.2099609375
130.686874389648 6125.7294921875
133.519241333008 6250.6025390625
139.073135375977 27194.77734375
140.081024169922 8653.3701171875
141.052490234375 85327.2109375
154.907775878906 7291.3662109375
155.068099975586 82133.109375
169.083847045898 77232.203125
170.09147644043 33127.890625
178.624557495117 34086.44140625
183.099609375 46221.48046875
184.106597900391 13683.2734375
185.078720092773 99354.1953125
187.058700561523 7701.8564453125
199.094619750977 78201.640625
199.97981262207 6970.1728515625
201.763946533203 9139.736328125
205.904205322266 7815.9130859375
213.110275268555 124392.3515625
226.469482421875 7387.001953125
227.125961303711 46340.45703125
229.105331420898 70555.1015625
235.869552612305 6644.9130859375
243.120620727539 45280.11328125
245.080383300781 6373.5869140625
257.139770507813 85038.3515625
263.521484375 30267.38671875
267.500640869141 7684.5
271.152374267578 109083.7265625
272.155822753906 14334.482421875
273.023498535156 6279.8740234375
273.131652832031 46495.15234375
275.341491699219 7122.2392578125
280.299743652344 8165.2646484375
287.147369384766 65601.890625
301.162475585938 114764.4296875
302.164978027344 9164.154296875
303.142547607422 10162.73828125
315.1787109375 39774.31640625
315.193908691406 2338.04077148438
317.157653808594 43387.875
330.478851318359 6405.681640625
331.174163818359 14949.921875
336.116638183594 66353.78125
345.18896484375 30641.76953125
351.135986328125 7979.638671875
359.208770751953 9361.5390625
361.183563232422 61034.578125
375.199493408203 20278.478515625
389.215484619141 144133.21875
390.218841552734 16875.31640625
391.195587158203 10765.55859375
403.2373046875 7835.2333984375
405.210510253906 94771.1171875
406.212066650391 15495.28515625
407.217956542969 7172.7373046875
433.242797851563 38040.390625
463.212585449219 7296.9775390625
463.502777099609 11091.3154296875
477.049591064453 6946.8330078125
485.83154296875 10096.712890625
513.268432617188 11768.0068359375
527.283508300781 96462.8671875
528.289245605469 18344.2578125
540.370361328125 6746.7958984375
553.298706054688 39186.1015625
554.300170898438 9778.431640625
567.3154296875 134498.140625
568.318603515625 52262.67578125
581.3310546875 17197.34375
619.9345703125 8013.0400390625
623.527465820313 7393.41796875
634.746765136719 11545.482421875
637.441528320313 50469.31640625
638.072387695313 12601.759765625
638.375793457031 14698.759765625
638.446655273438 24503.33984375
639.271606445313 95686.96875
639.302062988281 82458.1484375
639.409240722656 12545069
640.283447265625 38409.87109375
640.412353515625 4322288
640.67236328125 21821.986328125
640.758728027344 18302.59765625
641.057983398438 12969.8701171875
643.178955078125 10643.67578125
646.502868652344 21642.703125";
			var fragger = new MetFrag(Encoding.Default.GetString(Resources.Nonoxynol));
			var results = fragger.metFrag(TestConfig.ExactMass, peaksToUse, TestConfig.Mode, TestConfig.MzAbs, TestConfig.MzPpm, CancellationToken.None).ToList();

			Assert.That(results.Count, Is.EqualTo(4));
			Assert.That(results[0].FragmentPics.Count(), Is.EqualTo(4));
			Assert.That(results[1].FragmentPics.Count(), Is.EqualTo(4));
			Assert.That(results[2].FragmentPics.Count(), Is.EqualTo(4));
			Assert.That(results[3].FragmentPics.Count(), Is.EqualTo(4));
		}
		private static void AssertResults(string peaksToUse, byte[] sdfBytes, IEnumerable<Tuple<int, int>> expected)
		{
			var fragger = new MetFrag(Encoding.Default.GetString(sdfBytes));
			var results = fragger.metFrag(TestConfig.ExactMass, peaksToUse, TestConfig.Mode, TestConfig.MzAbs, TestConfig.MzPpm, CancellationToken.None);

			var resultTuples = results.ToList().Select(row => Tuple.Create(Convert.ToInt32(row.ID), row.FragmentPics.Count()));
			CollectionAssert.AreEquivalent(expected, resultTuples);
		}
		private void Biomolecules_Compound_528_GeneratesExpectedNumberOfFragments()
		{
			var peaksToUse = @"102.223709106445 3210.46923828125
109.74959564209 3258.2373046875
111.347877502441 3622.7626953125
126.423698425293 3760.78759765625
135.749435424805 3437.94580078125
139.073059082031 11373.1259765625
149.730972290039 3446.09326171875
149.934875488281 3356.4697265625
151.096466064453 6603.8251953125
153.052429199219 15212.22265625
154.625671386719 4323.99462890625
156.099334716797 17933.58203125
166.083923339844 27749.3125
169.052032470703 7839.13916015625
169.06526184082 9693.599609375
169.083633422852 960484.875
170.086303710938 4417.09423828125
171.04508972168 8310.52734375
174.853546142578 3689.14111328125
178.616241455078 14135.0908203125
186.110153198242 82545.78125
191.1884765625 3792.20068359375
193.539337158203 2928.16357421875
194.05256652832 3195.65576171875
196.094589233398 436245.53125
198.056106567383 10465.3837890625
198.979934692383 4609.01904296875
200.125869750977 239590.109375
201.780685424805 4804.7412109375
210.109939575195 17231.0234375
212.071975708008 4897.8544921875
218.138671875 19326.67578125
223.080139160156 3454.17236328125
226.105163574219 1077427.375
226.138916015625 6267.35546875
227.108108520508 9400.05078125
228.066436767578 66124.921875
240.120620727539 18978.65625
241.128707885742 59685.7890625
242.082382202148 24625.2578125
257.082000732422 8046.85791015625
258.077362060547 174270.25
262.049163818359 3310.32373046875
263.557312011719 11641.001953125
272.092987060547 64867.05078125
274.093078613281 830.994750976563
274.108642578125 50666.91015625
276.126831054688 6096.8759765625
316.249267578125 4243.96337890625
319.161010742188 4038.40966796875
323.728179931641 3614.86181640625
324.229095458984 3384.89599609375
328.155670166016 9943.76171875
330.135040283203 106208.4609375
336.0947265625 33201.1953125
336.258331298828 3417.14111328125
344.150451660156 17088.328125
356.847930908203 4898.21240234375
358.166259765625 163220.796875
368.100372314453 3360.1171875
372.743530273438 3510.92236328125
374.160827636719 6473.884765625
378.499359130859 3736.86474609375
388.123504638672 6655.21826171875
388.176635742188 50415.32421875
390.138244628906 85968.2734375
400.10693359375 3835.88427734375
403.123352050781 3748.4169921875
406.132232666016 10317.5361328125
419.234588623047 3820.03466796875
420.148712158203 44647.453125
422.164428710938 300265.3125
430.658172607422 3244.580078125
440.176879882813 3332.71240234375
463.493530273438 4825.72265625
473.44482421875 3562.62060546875
485.704467773438 5128.36962890625
505.448028564453 3554.8486328125
506.185699462891 34175.1796875
508.200256347656 15585.77734375
510.431457519531 3322.82275390625
553.191772460938 6261.05419921875
554.188293457031 62017.9765625";

			var fragger = new MetFrag(Encoding.Default.GetString(Resources.Alpha_Trisaccharide));
			var results = fragger.metFrag(TestConfig.ExactMass, peaksToUse, TestConfig.Mode, TestConfig.MzAbs, TestConfig.MzPpm, CancellationToken.None).ToList();

			Assert.That(results.Count, Is.EqualTo(4));
			Assert.That(results[0].FragmentPics.Count(), Is.EqualTo(15));
			Assert.That(results[1].FragmentPics.Count(), Is.EqualTo(4));
			Assert.That(results[2].FragmentPics.Count(), Is.EqualTo(13));
			Assert.That(results[3].FragmentPics.Count(), Is.EqualTo(6));
		}
		public void DoesNotCrash_WithCompoundThatHasCrazyRingStructure()
		{
			var fragger = new MetFrag(Encoding.Default.GetString(Resources.Dihydrohydroxyciguatoxin));
			fragger.metFrag(TestConfig.ExactMass, TestConfig.Peaks, TestConfig.Mode, TestConfig.MzAbs, TestConfig.MzPpm, CancellationToken.None).ToList();
		}
		public void MolecularFormulas_AreAsExpected()
		{
			var peaksToUse = @"218.292037963867 4814.0087890625
251.08984375 4636.91015625
255.294479370117 4333.99462890625
262.05908203125 4842.00537109375
263.503967285156 17012.8515625
316.170104980469 9390.609375
330.142669677734 5896.49560546875
336.126068115234 30484.8515625
388.176727294922 98447.6875
420.146850585938 30213.833984375
422.163482666016 35773.4296875
436.082305908203 5405.27880859375
445.210327148438 7284.78369140625
454.136291503906 138159.09375
485.711242675781 5883.47705078125
492.739959716797 4392.4541015625
671.27001953125 52046.59375
673.223999023438 13191.6015625
699.439758300781 7179.86279296875
708.473022460938 5404.1103515625
709.756103515625 4595.73779296875
746.69970703125 6625.22314453125
765.3642578125 12489.841796875
765.697509765625 18657.2578125
787.299255371094 11979.267578125
925.471130371094 5533.615234375
1001.71899414063 5344.462890625
1006.49475097656 43394.28515625
1006.99371337891 32465.154296875
1070.025390625 8782.123046875
1071.01171875 109050.328125
1071.51245117188 75879.2734375
1108.54565429688 21520.17578125
1108.66394042969 7866.89990234375
1109.04162597656 20998.587890625
1136.55224609375 10964.8427734375
1137.05126953125 8957.07421875
1137.54138183594 8071.50927734375
1201.56555175781 5949.6748046875
1216.61267089844 24844.447265625
1217.12524414063 23370.1796875
1217.60144042969 929436.875
1218.10131835938 1008759.75
1218.60095214844 140482.171875
1854.02758789063 11936.041015625
1941.10046386719 6494.98876953125
1942.84094238281 8874.51953125";

			var fragger = new MetFrag(Encoding.Default.GetString(Resources.Digoxin));
			var results = fragger.metFrag(TestConfig.ExactMass, peaksToUse, TestConfig.Mode, TestConfig.MzAbs, TestConfig.MzPpm, CancellationToken.None).ToList();

			Assert.That(results.Count, Is.EqualTo(5));

			// Note (Steve): These now only allow +/- 1 hydrogen (because the tree depth is always 1).

			CollectionAssert.AreEquivalent(results[0].FragmentPics.Select(p => Clean(p.MolecularFormula)), new[] { "C18H27O9", "C18H29O9", "C15H23O8" });
			CollectionAssert.AreEquivalent(results[0].FragmentPics.Select(p => p.NeutralChange), new[] { "+H", "-H", "-H" });

			CollectionAssert.AreEquivalent(results[1].FragmentPics.Select(p => Clean(p.MolecularFormula)), new[] { "C18H27O9", "C18H29O9", "C15H23O8" });
			CollectionAssert.AreEquivalent(results[1].FragmentPics.Select(p => p.NeutralChange), new[] { "+H", "-H", "-H" });

			CollectionAssert.AreEquivalent(results[2].FragmentPics.Select(p => Clean(p.MolecularFormula)), new[] { "C24H30NO7" });
			CollectionAssert.AreEquivalent(results[2].FragmentPics.Select(p => p.NeutralChange), new[] { "+H" });

			CollectionAssert.AreEquivalent(results[3].FragmentPics.Select(p => Clean(p.MolecularFormula)), new[] { "C21H32O10", "C15H23O8", "C10H14O8" });
			CollectionAssert.AreEquivalent(results[3].FragmentPics.Select(p => p.NeutralChange), new[] { "+H", "-H", "" });

			CollectionAssert.AreEquivalent(results[4].FragmentPics.Select(p => Clean(p.MolecularFormula)), new[] { "C35H57O18", "C35H56O18", "C28H47O18", "C22H29O6" });
			CollectionAssert.AreEquivalent(results[4].FragmentPics.Select(p => p.NeutralChange), new[] { "", "+H", "", "-H" });
		}