1 /* Copyright (C) 2007 Miguel Rojasch <miguelrojasch@users.sf.net> 2 * 3 * Contact: cdk-devel@lists.sourceforge.net 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public License 7 * as published by the Free Software Foundation; either version 2.1 8 * of the License, or (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 */ 19 package org.openscience.cdk.tools.manipulator; 20 21 import org.junit.Assert; 22 import org.junit.Test; 23 import org.openscience.cdk.Atom; 24 import org.openscience.cdk.AtomContainer; 25 import org.openscience.cdk.CDKConstants; 26 import org.openscience.cdk.CDKTestCase; 27 import org.openscience.cdk.ChemFile; 28 import org.openscience.cdk.DefaultChemObjectBuilder; 29 import org.openscience.cdk.Isotope; 30 import org.openscience.cdk.config.IsotopeFactory; 31 import org.openscience.cdk.config.Isotopes; 32 import org.openscience.cdk.exception.CDKException; 33 import org.openscience.cdk.formula.MolecularFormula; 34 import org.openscience.cdk.interfaces.IAtom; 35 import org.openscience.cdk.interfaces.IAtomContainer; 36 import org.openscience.cdk.interfaces.IChemObjectBuilder; 37 import org.openscience.cdk.interfaces.IElement; 38 import org.openscience.cdk.interfaces.IIsotope; 39 import org.openscience.cdk.interfaces.IMolecularFormula; 40 import org.openscience.cdk.io.MDLV2000Reader; 41 import org.openscience.cdk.silent.SilentChemObjectBuilder; 42 import org.openscience.cdk.templates.TestMoleculeFactory; 43 import org.openscience.cdk.tools.CDKHydrogenAdder; 44 45 import java.io.IOException; 46 import java.io.InputStream; 47 import java.util.Arrays; 48 import java.util.List; 49 50 import static org.hamcrest.CoreMatchers.is; 51 import static org.hamcrest.MatcherAssert.assertThat; 52 import static org.hamcrest.number.IsCloseTo.closeTo; 53 import static org.junit.Assert.assertFalse; 54 import static org.junit.Assert.assertTrue; 55 import static org.openscience.cdk.tools.manipulator.MolecularFormulaManipulator.*; 56 57 /** 58 * Checks the functionality of the MolecularFormulaManipulator. 59 * 60 * @cdk.module test-formula 61 */ 62 public class MolecularFormulaManipulatorTest extends CDKTestCase { 63 64 private final static IChemObjectBuilder builder = SilentChemObjectBuilder.getInstance(); 65 private IsotopeFactory ifac; 66 67 /** 68 * Constructor for the MolecularFormulaManipulatorTest object. 69 */ MolecularFormulaManipulatorTest()70 public MolecularFormulaManipulatorTest() { 71 72 super(); 73 try { 74 ifac = Isotopes.getInstance(); 75 } catch (IOException e) { 76 e.printStackTrace(); 77 } 78 } 79 80 /** Test atom and isotope count for methyl-group. */ 81 @Test testGetAtomCount_IMolecularFormula()82 public void testGetAtomCount_IMolecularFormula() { 83 84 IMolecularFormula formula = new MolecularFormula(); 85 formula.addIsotope(builder.newInstance(IIsotope.class, "C")); 86 formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 3); 87 88 Assert.assertEquals(2, formula.getIsotopeCount()); 89 90 Assert.assertEquals(4, MolecularFormulaManipulator.getAtomCount(formula)); 91 } 92 93 /** 94 * Test molecular formula's generated from IIsotopes, including hydrogen/deuterium handling. 95 */ 96 @Test testGetElementCount_IMolecularFormula_IElement()97 public void testGetElementCount_IMolecularFormula_IElement() { 98 IMolecularFormula formula = new MolecularFormula(); 99 IIsotope carb = builder.newInstance(IIsotope.class, "C"); 100 IIsotope flu = builder.newInstance(IIsotope.class, "F"); 101 IIsotope h1 = builder.newInstance(IIsotope.class, "H"); 102 IIsotope h2 = builder.newInstance(IIsotope.class, "H"); 103 h2.setExactMass(2.014101778); 104 formula.addIsotope(carb, 2); 105 formula.addIsotope(flu); 106 formula.addIsotope(h1, 3); 107 formula.addIsotope(h2, 4); 108 109 Assert.assertEquals(10, MolecularFormulaManipulator.getAtomCount(formula)); 110 Assert.assertEquals(4, formula.getIsotopeCount()); 111 Assert.assertEquals(3, formula.getIsotopeCount(h1)); 112 Assert.assertEquals(4, formula.getIsotopeCount(h2)); 113 114 Assert.assertEquals(2, 115 MolecularFormulaManipulator.getElementCount(formula, builder.newInstance(IElement.class, carb))); 116 Assert.assertEquals(1, 117 MolecularFormulaManipulator.getElementCount(formula, builder.newInstance(IElement.class, flu))); 118 Assert.assertEquals(7, 119 MolecularFormulaManipulator.getElementCount(formula, builder.newInstance(IElement.class, h1))); 120 } 121 122 /** 123 * Test getIsotopes for hydrogen/deuterium. 124 */ 125 @Test testGetIsotopes_IMolecularFormula_IElement()126 public void testGetIsotopes_IMolecularFormula_IElement() { 127 IMolecularFormula formula = new MolecularFormula(); 128 IIsotope carb = builder.newInstance(IIsotope.class, "C"); 129 IIsotope flu = builder.newInstance(IIsotope.class, "F"); 130 IIsotope h1 = builder.newInstance(IIsotope.class, "H"); 131 IIsotope h2 = builder.newInstance(IIsotope.class, "H"); 132 h2.setExactMass(2.014101778); 133 formula.addIsotope(carb, 1); 134 formula.addIsotope(flu); 135 formula.addIsotope(h1, 1); 136 formula.addIsotope(h2, 2); 137 138 List<IIsotope> isotopes = MolecularFormulaManipulator.getIsotopes(formula, 139 builder.newInstance(IElement.class, "H")); 140 Assert.assertEquals(2, isotopes.size()); 141 } 142 143 @Test testContainsElement_IMolecularFormula_IElement()144 public void testContainsElement_IMolecularFormula_IElement() { 145 IMolecularFormula formula = new MolecularFormula(); 146 IIsotope carb = builder.newInstance(IIsotope.class, "C"); 147 IIsotope flu = builder.newInstance(IIsotope.class, "F"); 148 IIsotope h1 = builder.newInstance(IIsotope.class, "H"); 149 IIsotope h2 = builder.newInstance(IIsotope.class, "H"); 150 h2.setExactMass(2.014101778); 151 formula.addIsotope(carb, 1); 152 formula.addIsotope(flu); 153 formula.addIsotope(h1, 1); 154 formula.addIsotope(h2, 2); 155 156 Assert.assertTrue(MolecularFormulaManipulator.containsElement(formula, builder.newInstance(IElement.class, "C"))); 157 Assert.assertTrue(MolecularFormulaManipulator.containsElement(formula, builder.newInstance(IElement.class, "H"))); 158 Assert.assertTrue(MolecularFormulaManipulator.containsElement(formula, builder.newInstance(IElement.class, "F"))); 159 } 160 161 @Test testGetString_IMolecularFormula_Empty()162 public void testGetString_IMolecularFormula_Empty() { 163 String stringMF = MolecularFormulaManipulator.getString(new MolecularFormula()); 164 Assert.assertNotNull(stringMF); 165 Assert.assertEquals("", stringMF); 166 } 167 168 /** Test if formula re-ordering to a user-specified element order works */ 169 @Test testGetString_IMolecularFormula_arrayString_boolean()170 public void testGetString_IMolecularFormula_arrayString_boolean() { 171 IMolecularFormula formula = new MolecularFormula(); 172 formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 2); 173 formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 2); 174 Assert.assertEquals("C2H2", MolecularFormulaManipulator.getString(formula)); 175 176 String[] newOrder = new String[2]; 177 newOrder[0] = "H"; 178 newOrder[1] = "C"; 179 180 Assert.assertEquals("H2C2", MolecularFormulaManipulator.getString(formula, newOrder, true)); 181 182 } 183 184 /** Test if isotope-list re-ordering to a user-specified element order works */ 185 @Test testPutInOrder_arrayString_IMolecularFormula()186 public void testPutInOrder_arrayString_IMolecularFormula() { 187 IMolecularFormula formula = new MolecularFormula(); 188 formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 2); 189 formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 2); 190 191 String[] newOrder = new String[2]; 192 newOrder[0] = "H"; 193 newOrder[1] = "C"; 194 195 List<IIsotope> list = MolecularFormulaManipulator.putInOrder(newOrder, formula); 196 Assert.assertEquals("H", list.get(0).getSymbol()); 197 Assert.assertEquals("C", list.get(1).getSymbol()); 198 199 newOrder = new String[2]; 200 newOrder[0] = "C"; 201 newOrder[1] = "H"; 202 203 list = MolecularFormulaManipulator.putInOrder(newOrder, formula); 204 Assert.assertEquals("C", list.get(0).getSymbol()); 205 Assert.assertEquals("H", list.get(1).getSymbol()); 206 207 } 208 209 @Test testGetString__String_IMolecularFormula()210 public void testGetString__String_IMolecularFormula() { 211 Assert.assertNotNull(MolecularFormulaManipulator.getMolecularFormula("C10H16", new MolecularFormula())); 212 Assert.assertNotNull(MolecularFormulaManipulator.getMolecularFormula("C10H16", builder)); 213 IMolecularFormula formula = MolecularFormulaManipulator.getMolecularFormula("O3(Fe(O2))3", builder); 214 Assert.assertEquals( formula.getIsotopeCount( new Atom("Fe") ), 3); 215 Assert.assertEquals( formula.getIsotopeCount( new Atom("O") ), 9); 216 } 217 218 /** Test if formula-order is independent of isotope-insertion order */ 219 @Test testGetString_IMolecularFormula()220 public void testGetString_IMolecularFormula() { 221 IMolecularFormula mf1 = new MolecularFormula(); 222 mf1.addIsotope(builder.newInstance(IIsotope.class, "C"), 10); 223 mf1.addIsotope(builder.newInstance(IIsotope.class, "H"), 16); 224 225 Assert.assertEquals("C10H16", MolecularFormulaManipulator.getString(mf1)); 226 227 IMolecularFormula mf2 = new MolecularFormula(); 228 mf2.addIsotope(builder.newInstance(IAtom.class, "H"), 16); 229 mf2.addIsotope(builder.newInstance(IAtom.class, "C"), 10); 230 231 Assert.assertEquals("C10H16", MolecularFormulaManipulator.getString(mf2)); 232 233 Assert.assertEquals(MolecularFormulaManipulator.getString(mf2), MolecularFormulaManipulator.getString(mf1)); 234 235 } 236 237 /** 238 * @cdk.bug 2276507 239 */ 240 @Test testBug2276507()241 public void testBug2276507() { 242 IMolecularFormula mf1 = new MolecularFormula(); 243 mf1.addIsotope(builder.newInstance(IIsotope.class, "C"), 1); 244 mf1.addIsotope(builder.newInstance(IIsotope.class, "H"), 4); 245 246 Assert.assertEquals("CH4", MolecularFormulaManipulator.getString(mf1)); 247 } 248 249 /** 250 * Test setOne parameter for {@link MolecularFormulaManipulator#getString(IMolecularFormula, boolean)} 251 */ 252 @Test testGetString_IMolecularFormula_boolean()253 public void testGetString_IMolecularFormula_boolean() { 254 IMolecularFormula mf1 = new MolecularFormula(); 255 mf1.addIsotope(builder.newInstance(IIsotope.class, "C"), 1); 256 mf1.addIsotope(builder.newInstance(IIsotope.class, "H"), 4); 257 258 Assert.assertEquals("C1H4", MolecularFormulaManipulator.getString(mf1, true)); 259 } 260 261 /** Test if formulae group elements when not inserted simultaneously */ 262 @Test testGetString_Isotopes()263 public void testGetString_Isotopes() { 264 IMolecularFormula mf1 = new MolecularFormula(); 265 mf1.addIsotope(builder.newInstance(IIsotope.class, "C", 12), 9); 266 mf1.addIsotope(builder.newInstance(IIsotope.class, "C", 13), 1); 267 mf1.addIsotope(builder.newInstance(IIsotope.class, "H"), 16); 268 269 Assert.assertEquals("C10H16", MolecularFormulaManipulator.getString(mf1)); 270 } 271 272 @Test testGetMolecularFormula_String_IChemObjectBuilder()273 public void testGetMolecularFormula_String_IChemObjectBuilder() { 274 IMolecularFormula molecularFormula = MolecularFormulaManipulator.getMolecularFormula("C10H16", builder); 275 276 Assert.assertEquals(26, MolecularFormulaManipulator.getAtomCount(molecularFormula)); 277 Assert.assertEquals(2, molecularFormula.getIsotopeCount()); 278 279 } 280 281 /** Test formula summing */ 282 @Test testGetMolecularFormula_String_IMolecularFormula()283 public void testGetMolecularFormula_String_IMolecularFormula() { 284 285 IMolecularFormula mf1 = new MolecularFormula(); 286 mf1.addIsotope(builder.newInstance(IIsotope.class, "C"), 10); 287 mf1.addIsotope(builder.newInstance(IIsotope.class, "H"), 16); 288 289 Assert.assertEquals(26, MolecularFormulaManipulator.getAtomCount(mf1)); 290 Assert.assertEquals(2, mf1.getIsotopeCount()); 291 292 IMolecularFormula mf2 = MolecularFormulaManipulator.getMolecularFormula("C11H17", mf1); 293 294 Assert.assertEquals(54, MolecularFormulaManipulator.getAtomCount(mf2)); 295 Assert.assertEquals(2, mf2.getIsotopeCount()); 296 } 297 298 /** Test formula mass calculation */ 299 @Test testGetMajorIsotopeMolecularFormula_String_IChemObjectBuilder()300 public void testGetMajorIsotopeMolecularFormula_String_IChemObjectBuilder() throws Exception { 301 IMolecularFormula mf2 = MolecularFormulaManipulator.getMajorIsotopeMolecularFormula("C11H17", builder); 302 303 Assert.assertEquals(28, MolecularFormulaManipulator.getAtomCount(mf2)); 304 Assert.assertEquals(2, mf2.getIsotopeCount()); 305 IIsotope carbon = Isotopes.getInstance().getMajorIsotope("C"); 306 IIsotope hydrogen = Isotopes.getInstance().getMajorIsotope("H"); 307 double totalMass = carbon.getExactMass() * 11; 308 totalMass += hydrogen.getExactMass() * 17; 309 Assert.assertEquals(totalMass, MolecularFormulaManipulator.getTotalExactMass(mf2), 0.0000001); 310 } 311 312 /** test @link {@link MolecularFormulaManipulator#removeElement(IMolecularFormula, IElement)} */ 313 @Test testRemoveElement_IMolecularFormula_IElement()314 public void testRemoveElement_IMolecularFormula_IElement() { 315 IMolecularFormula formula = new MolecularFormula(); 316 formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 1); 317 IIsotope fl = builder.newInstance(IIsotope.class, "F"); 318 IIsotope hy2 = builder.newInstance(IIsotope.class, "H"); 319 IIsotope hy1 = builder.newInstance(IIsotope.class, "H"); 320 hy2.setExactMass(2.014101778); 321 formula.addIsotope(fl, 1); 322 formula.addIsotope(hy1, 2); 323 formula.addIsotope(hy2, 1); 324 325 Assert.assertEquals(4, formula.getIsotopeCount()); 326 327 formula = MolecularFormulaManipulator.removeElement(formula, builder.newInstance(IElement.class, "F")); 328 329 Assert.assertEquals(3, formula.getIsotopeCount()); 330 Assert.assertEquals(4, MolecularFormulaManipulator.getAtomCount(formula)); 331 332 formula = MolecularFormulaManipulator.removeElement(formula, builder.newInstance(IElement.class, "H")); 333 334 Assert.assertEquals(1, MolecularFormulaManipulator.getAtomCount(formula)); 335 Assert.assertEquals(1, formula.getIsotopeCount()); 336 337 } 338 339 /** 340 * Test total Exact Mass. 341 */ 342 @Test testGetTotalExactMass_IMolecularFormula()343 public void testGetTotalExactMass_IMolecularFormula() throws Exception { 344 345 IMolecularFormula formula = new MolecularFormula(); 346 IIsotope carb = builder.newInstance(IIsotope.class, "C"); 347 carb.setExactMass(12.00); 348 IIsotope cl = builder.newInstance(IIsotope.class, "Cl"); 349 cl.setExactMass(34.96885268); 350 351 formula.addIsotope(carb); 352 formula.addIsotope(cl); 353 354 double totalExactMass = MolecularFormulaManipulator.getTotalExactMass(formula); 355 356 Assert.assertEquals(46.96885268, totalExactMass, 0.000001); 357 } 358 359 /** 360 * Test total Exact Mass. 361 * 362 * @throws IOException 363 * @throws ClassNotFoundException 364 * @throws CDKException 365 */ 366 @Test testGetTotalExactMassWithCharge_IMolecularFormula()367 public void testGetTotalExactMassWithCharge_IMolecularFormula() throws Exception { 368 369 IMolecularFormula formula = MolecularFormulaManipulator.getMajorIsotopeMolecularFormula("CH5O", builder); 370 371 double totalExactMass = MolecularFormulaManipulator.getTotalExactMass(formula); 372 Assert.assertEquals(33.034040, totalExactMass, 0.0001); 373 374 formula.setCharge(1); 375 double totalExactMass2 = MolecularFormulaManipulator.getTotalExactMass(formula); 376 Assert.assertEquals(33.03349, totalExactMass2, 0.0001); 377 } 378 379 /** 380 * Test total Exact Mass. 381 * 382 * @throws IOException 383 * @throws ClassNotFoundException 384 * @throws CDKException 385 */ 386 @Test testGetTotalExactMassWithChargeNeg_IMolecularFormula()387 public void testGetTotalExactMassWithChargeNeg_IMolecularFormula() throws IOException, ClassNotFoundException { 388 389 IMolecularFormula formula = MolecularFormulaManipulator.getMajorIsotopeMolecularFormula("H2PO4", builder); 390 formula.setCharge(-1); 391 double totalExactMass2 = MolecularFormulaManipulator.getTotalExactMass(formula); 392 Assert.assertEquals(96.96961875390926, totalExactMass2, 0.0001); 393 } 394 395 @Test testGetNaturalExactMass_IMolecularFormula()396 public void testGetNaturalExactMass_IMolecularFormula() throws Exception { 397 IMolecularFormula formula = new MolecularFormula(); 398 formula.addIsotope(builder.newInstance(IIsotope.class, "C")); 399 formula.addIsotope(builder.newInstance(IIsotope.class, "Cl")); 400 401 double expectedMass = 0.0; 402 expectedMass += Isotopes.getInstance().getNaturalMass(builder.newInstance(IElement.class, "C")); 403 expectedMass += Isotopes.getInstance().getNaturalMass(builder.newInstance(IElement.class, "Cl")); 404 405 double totalExactMass = MolecularFormulaManipulator.getNaturalExactMass(formula); 406 Assert.assertEquals(expectedMass, totalExactMass, 0.000001); 407 } 408 409 @Test testGetTotalMassNumber_IMolecularFormula()410 public void testGetTotalMassNumber_IMolecularFormula() throws Exception { 411 IMolecularFormula formula = new MolecularFormula(); 412 formula.addIsotope(builder.newInstance(IIsotope.class, "C")); 413 formula.addIsotope(builder.newInstance(IIsotope.class, "O")); 414 415 double totalExactMass = MolecularFormulaManipulator.getTotalMassNumber(formula); 416 Assert.assertEquals(28, totalExactMass, 0.000001); 417 } 418 419 @Test testGetMajorIsotopeMass_IMolecularFormula()420 public void testGetMajorIsotopeMass_IMolecularFormula() throws Exception { 421 IMolecularFormula formula = new MolecularFormula(); 422 formula.addIsotope(builder.newInstance(IIsotope.class, "C")); 423 formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 4); 424 425 double expectedMass = 0.0; 426 expectedMass += Isotopes.getInstance().getMajorIsotope("C").getExactMass(); 427 expectedMass += 4.0 * Isotopes.getInstance().getMajorIsotope("H").getExactMass(); 428 429 double totalExactMass = MolecularFormulaManipulator.getMajorIsotopeMass(formula); 430 Assert.assertEquals(expectedMass, totalExactMass, 0.000001); 431 } 432 433 /** 434 * Test total Exact Mass. It is necessary to have added the 435 * corresponding isotope before to calculate the exact mass. 436 * 437 */ 438 @Test testBug_1944604()439 public void testBug_1944604() throws Exception { 440 441 IMolecularFormula formula = new MolecularFormula(); 442 IIsotope carb = builder.newInstance(IIsotope.class, "C"); 443 444 formula.addIsotope(carb); 445 446 Assert.assertEquals("C1", MolecularFormulaManipulator.getString(formula, true)); 447 448 double totalExactMass = MolecularFormulaManipulator.getTotalExactMass(formula); 449 450 Assert.assertEquals(12.0, totalExactMass, 0.000001); 451 } 452 453 /** 454 * Test total natural abundance. 455 */ 456 @Test testGetTotalNaturalAbundance_IMolecularFormula()457 public void testGetTotalNaturalAbundance_IMolecularFormula() throws Exception { 458 459 IMolecularFormula formula = new MolecularFormula(); 460 IIsotope carb = builder.newInstance(IIsotope.class, "C"); 461 carb.setNaturalAbundance(98.93); 462 IIsotope cl = builder.newInstance(IIsotope.class, "Cl"); 463 cl.setNaturalAbundance(75.78); 464 formula.addIsotope(carb); 465 formula.addIsotope(cl); 466 467 double totalAbudance = MolecularFormulaManipulator.getTotalNaturalAbundance(formula); 468 469 Assert.assertEquals(0.74969154, totalAbudance, 0.000001); 470 } 471 472 /** 473 * Test total natural abundance. 474 */ 475 @Test testGetTotalNaturalAbundance_IMolecularFormula2()476 public void testGetTotalNaturalAbundance_IMolecularFormula2() throws Exception { 477 478 IMolecularFormula formula1 = new MolecularFormula(); 479 IIsotope br1 = builder.newInstance(IIsotope.class, "Br"); 480 br1.setNaturalAbundance(49.31); 481 IIsotope br2 = builder.newInstance(IIsotope.class, "Br"); 482 br2.setNaturalAbundance(50.69); 483 formula1.addIsotope(br1); 484 formula1.addIsotope(br2); 485 486 Assert.assertEquals(2, formula1.getIsotopeCount(), 0.000001); 487 double totalAbudance = MolecularFormulaManipulator.getTotalNaturalAbundance(formula1); 488 Assert.assertEquals(0.24995235, totalAbudance, 0.000001); 489 } 490 491 @Test testGetTotalNaturalAbundance_IMolecularFormula3()492 public void testGetTotalNaturalAbundance_IMolecularFormula3() throws Exception { 493 IMolecularFormula formula2 = new MolecularFormula(); 494 IIsotope br1 = builder.newInstance(IIsotope.class, "Br"); 495 br1.setNaturalAbundance(50.69); 496 IIsotope br2 = builder.newInstance(IIsotope.class, "Br"); 497 br2.setNaturalAbundance(50.69); 498 formula2.addIsotope(br1); 499 formula2.addIsotope(br2); 500 501 Assert.assertEquals(1, formula2.getIsotopeCount(), 0.000001); 502 double totalAbudance = MolecularFormulaManipulator.getTotalNaturalAbundance(formula2); 503 504 Assert.assertEquals(0.25694761, totalAbudance, 0.000001); 505 } 506 507 @Test testGetTotalNaturalAbundance_IMolecularFormula4()508 public void testGetTotalNaturalAbundance_IMolecularFormula4() throws Exception { 509 IMolecularFormula formula2 = new MolecularFormula(); 510 IIsotope br1 = builder.newInstance(IIsotope.class, "Br"); 511 br1.setNaturalAbundance(50.69); 512 formula2.addIsotope(br1); 513 formula2.addIsotope(br1); 514 515 Assert.assertEquals(1, formula2.getIsotopeCount()); 516 double totalAbudance = MolecularFormulaManipulator.getTotalNaturalAbundance(formula2); 517 518 Assert.assertEquals(0.25694761, totalAbudance, 0.000001); 519 } 520 521 /** Test Double-Bond-Equivalent (DBE) calculation */ 522 @Test testGetDBE_IMolecularFormula()523 public void testGetDBE_IMolecularFormula() throws Exception { 524 IMolecularFormula formula = new MolecularFormula(); 525 formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 10); 526 formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 22); 527 528 Assert.assertEquals(0.0, MolecularFormulaManipulator.getDBE(formula), 0.01); 529 530 formula = new MolecularFormula(); 531 formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 10); 532 formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 16); 533 534 Assert.assertEquals(3.0, MolecularFormulaManipulator.getDBE(formula), 0.01); 535 536 formula = new MolecularFormula(); 537 formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 10); 538 formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 16); 539 formula.addIsotope(builder.newInstance(IIsotope.class, "O")); 540 541 Assert.assertEquals(3.0, MolecularFormulaManipulator.getDBE(formula), 0.01); 542 543 formula = new MolecularFormula(); 544 formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 10); 545 formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 19); 546 formula.addIsotope(builder.newInstance(IIsotope.class, "N")); 547 548 Assert.assertEquals(2.0, MolecularFormulaManipulator.getDBE(formula), 0.01); 549 550 } 551 552 @Test testGetHTML_IMolecularFormula()553 public void testGetHTML_IMolecularFormula() { 554 MolecularFormula formula = new MolecularFormula(); 555 formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 8); 556 formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 10); 557 formula.addIsotope(builder.newInstance(IIsotope.class, "Cl"), 2); 558 formula.addIsotope(builder.newInstance(IIsotope.class, "O"), 2); 559 560 Assert.assertEquals("C<sub>8</sub>H<sub>10</sub>Cl<sub>2</sub>O<sub>2</sub>", 561 MolecularFormulaManipulator.getHTML(formula)); 562 } 563 564 @Test htmlFormulaDoesNotAddSubscriptForSingleElements()565 public void htmlFormulaDoesNotAddSubscriptForSingleElements() { 566 MolecularFormula formula = new MolecularFormula(); 567 formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 1); 568 formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 4); 569 570 Assert.assertEquals("CH<sub>4</sub>", MolecularFormulaManipulator.getHTML(formula)); 571 } 572 573 @Test testGetHTML_IMolecularFormula_boolean_boolean()574 public void testGetHTML_IMolecularFormula_boolean_boolean() { 575 MolecularFormula formula = new MolecularFormula(); 576 formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 10); 577 578 Assert.assertEquals("C<sub>10</sub>", MolecularFormulaManipulator.getHTML(formula, true, false)); 579 formula.setCharge(1); 580 Assert.assertEquals("C<sub>10</sub><sup>+</sup>", MolecularFormulaManipulator.getHTML(formula, true, false)); 581 formula.setCharge(formula.getCharge() - 2); 582 Assert.assertEquals("C<sub>10</sub><sup>–</sup>", MolecularFormulaManipulator.getHTML(formula, true, false)); 583 } 584 585 @Test nullIsotopeLabels()586 public void nullIsotopeLabels() { 587 MolecularFormula formula = new MolecularFormula(); 588 formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 10); 589 590 Assert.assertEquals("C<sub>10</sub>", MolecularFormulaManipulator.getHTML(formula, true, false)); 591 formula.setCharge(1); 592 Assert.assertEquals("C<sub>10</sub><sup>+</sup>", MolecularFormulaManipulator.getHTML(formula, true, true)); 593 formula.setCharge(formula.getCharge() - 2); 594 Assert.assertEquals("C<sub>10</sub><sup>–</sup>", MolecularFormulaManipulator.getHTML(formula, true, true)); 595 } 596 597 @Test testGetHTML_IMolecularFormula_arrayString_boolean_boolean()598 public void testGetHTML_IMolecularFormula_arrayString_boolean_boolean() { 599 IMolecularFormula formula = new MolecularFormula(); 600 formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 2); 601 formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 2); 602 603 String[] newOrder = new String[2]; 604 newOrder[0] = "H"; 605 newOrder[1] = "C"; 606 607 Assert.assertEquals("H<sub>2</sub>C<sub>2</sub>", 608 MolecularFormulaManipulator.getHTML(formula, newOrder, false, false)); 609 } 610 611 @Test testGetHTML_IMolecularFormulaWithIsotope()612 public void testGetHTML_IMolecularFormulaWithIsotope() { 613 MolecularFormula formula = new MolecularFormula(); 614 formula.addIsotope(ifac.getMajorIsotope("C"), 2); 615 formula.addIsotope(ifac.getMajorIsotope("H"), 6); 616 Assert.assertEquals("<sup>12</sup>C<sub>2</sub><sup>1</sup>H<sub>6</sub>", 617 MolecularFormulaManipulator.getHTML(formula, false, true)); 618 } 619 620 @Test testGetHTML_IMolecularFormulaWithIsotopeAndCharge()621 public void testGetHTML_IMolecularFormulaWithIsotopeAndCharge() { 622 MolecularFormula formula = new MolecularFormula(); 623 formula.addIsotope(ifac.getMajorIsotope("C"), 2); 624 formula.addIsotope(ifac.getMajorIsotope("H"), 6); 625 formula.setCharge(1); 626 Assert.assertEquals("<sup>12</sup>C<sub>2</sub><sup>1</sup>H<sub>6</sub><sup>+</sup>", 627 MolecularFormulaManipulator.getHTML(formula, true, true)); 628 } 629 630 @Test testGetMolecularFormula_IAtomContainer()631 public void testGetMolecularFormula_IAtomContainer() { 632 IAtomContainer ac = builder.newInstance(IAtomContainer.class); 633 ac.addAtom(builder.newInstance(IAtom.class, "C")); 634 ac.addAtom(builder.newInstance(IAtom.class, "C")); 635 ac.addAtom(builder.newInstance(IAtom.class, "H")); 636 ac.addAtom(builder.newInstance(IAtom.class, "H")); 637 ac.addAtom(builder.newInstance(IAtom.class, "H")); 638 ac.addAtom(builder.newInstance(IAtom.class, "H")); 639 640 IMolecularFormula mf1 = MolecularFormulaManipulator.getMolecularFormula(ac); 641 642 IMolecularFormula mf2 = new MolecularFormula(); 643 mf2.addIsotope(builder.newInstance(IIsotope.class, "C"), 2); 644 mf2.addIsotope(builder.newInstance(IIsotope.class, "H"), 4); 645 646 Assert.assertEquals(MolecularFormulaManipulator.getAtomCount(mf2), 647 MolecularFormulaManipulator.getAtomCount(mf1)); 648 Assert.assertEquals(mf2.getIsotopeCount(), mf1.getIsotopeCount()); 649 IElement elemC = builder.newInstance(IElement.class, "C"); 650 IElement elemH = builder.newInstance(IElement.class, "H"); 651 Assert.assertEquals(mf2.getIsotopeCount(builder.newInstance(IIsotope.class, elemC)), 652 mf1.getIsotopeCount(builder.newInstance(IIsotope.class, elemC))); 653 Assert.assertEquals(mf2.getIsotopeCount(builder.newInstance(IIsotope.class, elemH)), 654 mf1.getIsotopeCount(builder.newInstance(IIsotope.class, elemH))); 655 Assert.assertEquals(MolecularFormulaManipulator.getElementCount(mf2, elemC), 656 MolecularFormulaManipulator.getElementCount(mf1, elemC)); 657 Assert.assertEquals(MolecularFormulaManipulator.getElementCount(mf2, elemH), 658 MolecularFormulaManipulator.getElementCount(mf1, elemH)); 659 660 } 661 662 @Test testGetMolecularFormula_IAtomNullCharge()663 public void testGetMolecularFormula_IAtomNullCharge() { 664 IAtomContainer ac = builder.newInstance(IAtomContainer.class); 665 ac.addAtom(builder.newInstance(IAtom.class, "C")); 666 ac.getAtom(0).setFormalCharge((Integer) CDKConstants.UNSET); 667 ac.addAtom(builder.newInstance(IAtom.class, "C")); 668 ac.addAtom(builder.newInstance(IAtom.class, "H")); 669 ac.addAtom(builder.newInstance(IAtom.class, "H")); 670 ac.addAtom(builder.newInstance(IAtom.class, "H")); 671 ac.addAtom(builder.newInstance(IAtom.class, "H")); 672 673 IMolecularFormula mf1 = MolecularFormulaManipulator.getMolecularFormula(ac); 674 Assert.assertNotNull(mf1); 675 } 676 677 @Test testGetMolecularFormula_IAtomContainer_withCharge()678 public void testGetMolecularFormula_IAtomContainer_withCharge() { 679 IAtomContainer ac = builder.newInstance(IAtomContainer.class); 680 ac.addAtom(builder.newInstance(IAtom.class, "C")); 681 ac.getAtom(0).setFormalCharge(1); 682 ac.addAtom(builder.newInstance(IAtom.class, "C")); 683 ac.addAtom(builder.newInstance(IAtom.class, "H")); 684 ac.addAtom(builder.newInstance(IAtom.class, "H")); 685 ac.addAtom(builder.newInstance(IAtom.class, "H")); 686 687 IMolecularFormula mf1 = MolecularFormulaManipulator.getMolecularFormula(ac); 688 689 Assert.assertEquals(1, mf1.getCharge(), 0.000); 690 } 691 692 @Test testGetMolecularFormula_IAtomContainer_IMolecularFormula()693 public void testGetMolecularFormula_IAtomContainer_IMolecularFormula() { 694 IAtomContainer ac = builder.newInstance(IAtomContainer.class); 695 ac.addAtom(builder.newInstance(IAtom.class, "C")); 696 ac.addAtom(builder.newInstance(IAtom.class, "C")); 697 ac.addAtom(builder.newInstance(IAtom.class, "H")); 698 ac.addAtom(builder.newInstance(IAtom.class, "H")); 699 ac.addAtom(builder.newInstance(IAtom.class, "H")); 700 ac.addAtom(builder.newInstance(IAtom.class, "H")); 701 702 IMolecularFormula mf1 = MolecularFormulaManipulator.getMolecularFormula(ac, new MolecularFormula()); 703 704 IMolecularFormula mf2 = new MolecularFormula(); 705 mf2.addIsotope(builder.newInstance(IIsotope.class, "C"), 2); 706 mf2.addIsotope(builder.newInstance(IIsotope.class, "H"), 4); 707 708 Assert.assertEquals(MolecularFormulaManipulator.getAtomCount(mf2), 709 MolecularFormulaManipulator.getAtomCount(mf1)); 710 Assert.assertEquals(mf2.getIsotopeCount(), mf1.getIsotopeCount()); 711 IElement elemC = builder.newInstance(IElement.class, "C"); 712 IElement elemH = builder.newInstance(IElement.class, "H"); 713 Assert.assertEquals(mf2.getIsotopeCount(builder.newInstance(IIsotope.class, elemC)), 714 mf1.getIsotopeCount(builder.newInstance(IIsotope.class, elemC))); 715 Assert.assertEquals(mf2.getIsotopeCount(builder.newInstance(IIsotope.class, elemH)), 716 mf1.getIsotopeCount(builder.newInstance(IIsotope.class, elemH))); 717 Assert.assertEquals(MolecularFormulaManipulator.getElementCount(mf2, elemC), 718 MolecularFormulaManipulator.getElementCount(mf1, elemC)); 719 Assert.assertEquals(MolecularFormulaManipulator.getElementCount(mf2, elemH), 720 MolecularFormulaManipulator.getElementCount(mf1, elemH)); 721 722 } 723 724 @Test testGetMolecularFormula_IAtomContainerIMolecularFormula_2()725 public void testGetMolecularFormula_IAtomContainerIMolecularFormula_2() { 726 IAtomContainer ac = builder.newInstance(IAtomContainer.class); 727 ac.addAtom(builder.newInstance(IAtom.class, "C")); 728 ac.addAtom(builder.newInstance(IAtom.class, "C")); 729 ac.addAtom(builder.newInstance(IAtom.class, "H")); 730 ac.addAtom(builder.newInstance(IAtom.class, "H")); 731 ac.addAtom(builder.newInstance(IAtom.class, "H")); 732 ac.addAtom(builder.newInstance(IAtom.class, "H")); 733 734 IMolecularFormula mf0 = new MolecularFormula(); 735 mf0.addIsotope(builder.newInstance(IIsotope.class, "C"), 2); 736 mf0.addIsotope(builder.newInstance(IIsotope.class, "H"), 5); 737 738 IMolecularFormula mf1 = MolecularFormulaManipulator.getMolecularFormula(ac, mf0); 739 740 IMolecularFormula mf2 = new MolecularFormula(); 741 mf2.addIsotope(builder.newInstance(IIsotope.class, "C"), 4); 742 mf2.addIsotope(builder.newInstance(IIsotope.class, "H"), 9); 743 744 Assert.assertEquals(MolecularFormulaManipulator.getAtomCount(mf2), 745 MolecularFormulaManipulator.getAtomCount(mf1)); 746 Assert.assertEquals(mf2.getIsotopeCount(), mf1.getIsotopeCount()); 747 IElement elemC = builder.newInstance(IElement.class, "C"); 748 IElement elemH = builder.newInstance(IElement.class, "H"); 749 Assert.assertEquals(mf2.getIsotopeCount(builder.newInstance(IIsotope.class, elemC)), 750 mf1.getIsotopeCount(builder.newInstance(IIsotope.class, elemC))); 751 Assert.assertEquals(mf2.getIsotopeCount(builder.newInstance(IIsotope.class, elemH)), 752 mf1.getIsotopeCount(builder.newInstance(IIsotope.class, elemH))); 753 Assert.assertEquals(MolecularFormulaManipulator.getElementCount(mf2, elemC), 754 MolecularFormulaManipulator.getElementCount(mf1, elemC)); 755 Assert.assertEquals(MolecularFormulaManipulator.getElementCount(mf2, elemH), 756 MolecularFormulaManipulator.getElementCount(mf1, elemH)); 757 758 } 759 760 @Test testGetAtomContainer_IMolecularFormula()761 public void testGetAtomContainer_IMolecularFormula() { 762 763 IMolecularFormula mf2 = new MolecularFormula(); 764 mf2.addIsotope(builder.newInstance(IIsotope.class, "C"), 2); 765 mf2.addIsotope(builder.newInstance(IIsotope.class, "H"), 4); 766 767 IAtomContainer ac = MolecularFormulaManipulator.getAtomContainer(mf2); 768 769 Assert.assertEquals(6, ac.getAtomCount()); 770 771 } 772 773 @Test testGetAtomContainer_IMolecularFormula_IAtomContainer()774 public void testGetAtomContainer_IMolecularFormula_IAtomContainer() { 775 776 IMolecularFormula mf2 = new MolecularFormula(); 777 mf2.addIsotope(builder.newInstance(IIsotope.class, "C"), 2); 778 mf2.addIsotope(builder.newInstance(IIsotope.class, "H"), 4); 779 780 IAtomContainer ac = MolecularFormulaManipulator 781 .getAtomContainer(mf2, builder.newInstance(IAtomContainer.class)); 782 783 Assert.assertEquals(6, ac.getAtomCount()); 784 785 } 786 787 @Test testGetAtomContainer_String_IChemObjectBuilder()788 public void testGetAtomContainer_String_IChemObjectBuilder() { 789 String mf = "C2H4"; 790 IAtomContainer atomContainer = MolecularFormulaManipulator.getAtomContainer(mf, 791 DefaultChemObjectBuilder.getInstance()); 792 Assert.assertEquals(6, atomContainer.getAtomCount()); 793 } 794 795 /** 796 * @cdk.bug 1296 797 */ 798 @Test testGetAtomContainer_AddsAtomicNumbers()799 public void testGetAtomContainer_AddsAtomicNumbers() { 800 IMolecularFormula mf2 = new MolecularFormula(); 801 mf2.addIsotope(builder.newInstance(IIsotope.class, "C"), 2); 802 mf2.addIsotope(builder.newInstance(IIsotope.class, "H"), 4); 803 IAtomContainer ac = MolecularFormulaManipulator 804 .getAtomContainer(mf2, builder.newInstance(IAtomContainer.class)); 805 Assert.assertEquals(6, ac.getAtomCount()); 806 Assert.assertNotNull(ac.getAtom(0).getAtomicNumber()); 807 for (IAtom atom : ac.atoms()) { 808 if ("C".equals(atom.getSymbol())) 809 Assert.assertEquals(6, atom.getAtomicNumber().intValue()); 810 else if ("H".equals(atom.getSymbol())) 811 Assert.assertEquals(1, atom.getAtomicNumber().intValue()); 812 else 813 Assert.fail("Unexcepted element: " + atom.getSymbol()); 814 } 815 } 816 817 @Test testMolecularFormulaIAtomContainer_to_IAtomContainer2()818 public void testMolecularFormulaIAtomContainer_to_IAtomContainer2() { 819 IAtomContainer ac = builder.newInstance(IAtomContainer.class); 820 ac.addAtom(builder.newInstance(IAtom.class, "C")); 821 ac.addAtom(builder.newInstance(IAtom.class, "C")); 822 ac.addAtom(builder.newInstance(IAtom.class, "H")); 823 ac.addAtom(builder.newInstance(IAtom.class, "H")); 824 ac.addAtom(builder.newInstance(IAtom.class, "H")); 825 ac.addAtom(builder.newInstance(IAtom.class, "H")); 826 827 IMolecularFormula mf2 = new MolecularFormula(); 828 mf2.addIsotope(builder.newInstance(IIsotope.class, "C"), 2); 829 mf2.addIsotope(builder.newInstance(IIsotope.class, "H"), 4); 830 831 IAtomContainer ac2 = MolecularFormulaManipulator.getAtomContainer(mf2, 832 builder.newInstance(IAtomContainer.class)); 833 834 Assert.assertEquals(ac2.getAtomCount(), ac2.getAtomCount()); 835 Assert.assertEquals(ac2.getAtom(0).getSymbol(), ac2.getAtom(0).getSymbol()); 836 Assert.assertEquals(ac2.getAtom(5).getSymbol(), ac2.getAtom(5).getSymbol()); 837 838 } 839 840 @Test testElements_IMolecularFormula()841 public void testElements_IMolecularFormula() { 842 843 IMolecularFormula formula = new MolecularFormula(); 844 formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 1); 845 formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 2); 846 847 IIsotope br1 = builder.newInstance(IIsotope.class, "Br"); 848 br1.setNaturalAbundance(50.69); 849 formula.addIsotope(br1); 850 IIsotope br2 = builder.newInstance(IIsotope.class, "Br"); 851 br2.setNaturalAbundance(50.69); 852 formula.addIsotope(br2); 853 854 List<IElement> elements = MolecularFormulaManipulator.elements(formula); 855 856 Assert.assertEquals(5, MolecularFormulaManipulator.getAtomCount(formula)); 857 Assert.assertEquals(3, elements.size()); 858 } 859 860 @Test testCompare_Charge()861 public void testCompare_Charge() { 862 863 IMolecularFormula formula1 = new MolecularFormula(); 864 formula1.addIsotope(builder.newInstance(IIsotope.class, "C"), 1); 865 formula1.addIsotope(builder.newInstance(IIsotope.class, "H"), 2); 866 867 IMolecularFormula formula2 = new MolecularFormula(); 868 formula2.addIsotope(builder.newInstance(IIsotope.class, "C"), 1); 869 formula2.addIsotope(builder.newInstance(IIsotope.class, "H"), 2); 870 871 IMolecularFormula formula3 = new MolecularFormula(); 872 formula3.addIsotope(builder.newInstance(IIsotope.class, "C"), 1); 873 formula3.addIsotope(builder.newInstance(IIsotope.class, "H"), 2); 874 formula3.setCharge(0); 875 876 Assert.assertTrue(MolecularFormulaManipulator.compare(formula1, formula2)); 877 Assert.assertFalse(MolecularFormulaManipulator.compare(formula1, formula3)); 878 879 } 880 881 @Test testCompare_NumberIsotope()882 public void testCompare_NumberIsotope() { 883 884 IMolecularFormula formula1 = new MolecularFormula(); 885 formula1.addIsotope(builder.newInstance(IIsotope.class, "C"), 1); 886 formula1.addIsotope(builder.newInstance(IIsotope.class, "H"), 2); 887 888 IMolecularFormula formula2 = new MolecularFormula(); 889 formula2.addIsotope(builder.newInstance(IIsotope.class, "C"), 1); 890 formula2.addIsotope(builder.newInstance(IIsotope.class, "H"), 2); 891 892 IMolecularFormula formula3 = new MolecularFormula(); 893 formula3.addIsotope(builder.newInstance(IIsotope.class, "C"), 1); 894 formula3.addIsotope(builder.newInstance(IIsotope.class, "H"), 3); 895 896 Assert.assertTrue(MolecularFormulaManipulator.compare(formula1, formula2)); 897 Assert.assertFalse(MolecularFormulaManipulator.compare(formula1, formula3)); 898 899 } 900 901 @Test testCompare_IMolecularFormula_IMolecularFormula()902 public void testCompare_IMolecularFormula_IMolecularFormula() { 903 904 IMolecularFormula formula1 = new MolecularFormula(); 905 formula1.addIsotope(builder.newInstance(IIsotope.class, "C"), 1); 906 formula1.addIsotope(builder.newInstance(IIsotope.class, "H"), 2); 907 908 IMolecularFormula formula2 = new MolecularFormula(); 909 formula2.addIsotope(builder.newInstance(IIsotope.class, "C"), 1); 910 formula2.addIsotope(builder.newInstance(IIsotope.class, "H"), 2); 911 912 IMolecularFormula formula3 = new MolecularFormula(); 913 formula3.addIsotope(builder.newInstance(IIsotope.class, "C"), 1); 914 IIsotope hyd = builder.newInstance(IIsotope.class, "H"); 915 hyd.setExactMass(2.002334234); 916 formula3.addIsotope(hyd, 2); 917 918 Assert.assertTrue(MolecularFormulaManipulator.compare(formula1, formula2)); 919 Assert.assertFalse(MolecularFormulaManipulator.compare(formula1, formula3)); 920 921 } 922 923 @Test testGetHeavyElements_IMolecularFormula()924 public void testGetHeavyElements_IMolecularFormula() { 925 IMolecularFormula formula = new MolecularFormula(); 926 formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 10); 927 formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 16); 928 Assert.assertEquals(1, MolecularFormulaManipulator.getHeavyElements(formula).size()); 929 } 930 931 @Test testGetHeavyElements_IMolecularFormula_2()932 public void testGetHeavyElements_IMolecularFormula_2() { 933 IMolecularFormula formula = MolecularFormulaManipulator.getMolecularFormula("CH3OH", builder); 934 Assert.assertEquals(2, MolecularFormulaManipulator.getHeavyElements(formula).size()); 935 } 936 937 /** 938 * Test if the elements-ordered-by-probability are in the expected order. 939 */ 940 @Test testGenerateOrderEle()941 public void testGenerateOrderEle() { 942 String[] listElements = new String[]{ 943 // Elements of life 944 "C", "H", "O", "N", "Si", "P", "S", "F", "Cl", 945 946 "Br", "I", "Sn", "B", "Pb", "Tl", "Ba", "In", "Pd", "Pt", "Os", "Ag", "Zr", "Se", "Zn", "Cu", "Ni", 947 "Co", "Fe", "Cr", "Ti", "Ca", "K", "Al", "Mg", "Na", "Ce", "Hg", "Au", "Ir", "Re", "W", "Ta", "Hf", 948 "Lu", "Yb", "Tm", "Er", "Ho", "Dy", "Tb", "Gd", "Eu", "Sm", "Pm", "Nd", "Pr", "La", "Cs", "Xe", "Te", 949 "Sb", "Cd", "Rh", "Ru", "Tc", "Mo", "Nb", "Y", "Sr", "Rb", "Kr", "As", "Ge", "Ga", "Mn", "V", "Sc", 950 "Ar", "Ne", "He", "Be", "Li", 951 952 // rest of periodic table, in atom-number order. 953 "Bi", "Po", "At", "Rn", 954 // row-7 elements (including f-block) 955 "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr", 956 "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", 957 958 // The "odd one out": an unspecified R-group 959 "R"}; 960 961 String[] arrayGenerated = MolecularFormulaManipulator.generateOrderEle(); 962 List<String> listGenerated = Arrays.asList(arrayGenerated); 963 Assert.assertEquals(113, listGenerated.size()); 964 965 for (int i = 0; i < listElements.length; i++) { 966 String element = listElements[i]; 967 Assert.assertTrue("Element missing from generateOrderEle: " + element, listGenerated.contains(element)); 968 } 969 } 970 971 /** 972 * TODO: REACT: Introduce method 973 * 974 * @cdk.bug 2672696 975 */ 976 @Test testGetHillString_IMolecularFormula()977 public void testGetHillString_IMolecularFormula() { 978 IMolecularFormula formula = MolecularFormulaManipulator.getMolecularFormula("CH3OH", builder); 979 String listGenerated = MolecularFormulaManipulator.getHillString(formula); 980 Assert.assertEquals("CH4O", listGenerated); 981 982 formula = MolecularFormulaManipulator.getMolecularFormula("CH3CH2Br", builder); 983 listGenerated = MolecularFormulaManipulator.getHillString(formula); 984 Assert.assertEquals("C2H5Br", listGenerated); 985 986 formula = MolecularFormulaManipulator.getMolecularFormula("HCl", builder); 987 listGenerated = MolecularFormulaManipulator.getHillString(formula); 988 Assert.assertEquals("ClH", listGenerated); 989 990 formula = MolecularFormulaManipulator.getMolecularFormula("HBr", builder); 991 listGenerated = MolecularFormulaManipulator.getHillString(formula); 992 Assert.assertEquals("BrH", listGenerated); 993 } 994 995 /** 996 * Tests that an atom which has not be configured with isotope information, 997 * provides the correct exact mass. 998 * @cdk.bug 1944604 999 */ 1000 @Test testSingleAtomFromSmiles()1001 public void testSingleAtomFromSmiles() throws CDKException { 1002 IAtomContainer mol = new AtomContainer(); 1003 mol.addAtom(new Atom("C")); 1004 1005 // previously performed inside SmilesParser 1006 AtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(mol); 1007 CDKHydrogenAdder.getInstance(DefaultChemObjectBuilder.getInstance()).addImplicitHydrogens(mol); 1008 1009 IMolecularFormula mf = MolecularFormulaManipulator.getMolecularFormula(mol); 1010 double exactMass = MolecularFormulaManipulator.getTotalExactMass(mf); 1011 Assert.assertEquals(16.0313, exactMass, 0.0001); 1012 } 1013 1014 @Test testSingleAtom()1015 public void testSingleAtom() { 1016 String formula = "CH4"; 1017 IMolecularFormula mf = MolecularFormulaManipulator.getMolecularFormula(formula, builder); 1018 Assert.assertEquals(1, 1019 MolecularFormulaManipulator.getIsotopes(mf, mf.getBuilder().newInstance(IElement.class, "C")).size()); 1020 } 1021 1022 @Test testSimplifyMolecularFormula_String()1023 public void testSimplifyMolecularFormula_String() { 1024 String formula = "C1H41.H2O"; 1025 String simplifyMF = MolecularFormulaManipulator.simplifyMolecularFormula(formula); 1026 Assert.assertEquals("C1H43O", simplifyMF); 1027 } 1028 1029 @Test testSimplifyMolecularFormula_String2()1030 public void testSimplifyMolecularFormula_String2() { 1031 String formula = "CH41.H2O"; 1032 String simplifyMF = MolecularFormulaManipulator.simplifyMolecularFormula(formula); 1033 Assert.assertEquals("CH43O", simplifyMF); 1034 } 1035 1036 @Test testSimplifygetMF()1037 public void testSimplifygetMF() { 1038 String formula = "CH4.H2O"; 1039 IMolecularFormula formula1 = new MolecularFormula(); 1040 formula1.addIsotope(builder.newInstance(IIsotope.class, "C"), 1); 1041 formula1.addIsotope(builder.newInstance(IIsotope.class, "H"), 6); 1042 formula1.addIsotope(builder.newInstance(IIsotope.class, "O"), 1); 1043 IMolecularFormula ff = MolecularFormulaManipulator.getMolecularFormula(formula, builder); 1044 Assert.assertTrue(MolecularFormulaManipulator.compare(formula1, 1045 MolecularFormulaManipulator.getMolecularFormula(formula, builder))); 1046 Assert.assertEquals("CH6O", MolecularFormulaManipulator.getString(ff)); 1047 } 1048 1049 @Test testSpace()1050 public void testSpace() { 1051 String formula = "C17H21NO. C7H6O3"; 1052 String simplifyMF = MolecularFormulaManipulator.simplifyMolecularFormula(formula); 1053 Assert.assertEquals("C24H27NO4", simplifyMF); 1054 } 1055 1056 /** Test molecule simplification */ 1057 @Test test0()1058 public void test0() { 1059 String formula = "Fe.(C6H11O7)3"; 1060 String simplifyMF = MolecularFormulaManipulator.simplifyMolecularFormula(formula); 1061 Assert.assertEquals("FeC18H33O21", simplifyMF); 1062 } 1063 1064 /** Test molecule simplification */ 1065 @Test test1()1066 public void test1() { 1067 String formula = "(C6H11O7)3.Fe"; 1068 String simplifyMF = MolecularFormulaManipulator.simplifyMolecularFormula(formula); 1069 Assert.assertEquals("C18H33O21Fe", simplifyMF); 1070 } 1071 1072 /** Test molecule simplification */ 1073 @Test test2()1074 public void test2() { 1075 String formula = "C14H14N2.2HCl"; 1076 String simplifyMF = MolecularFormulaManipulator.simplifyMolecularFormula(formula); 1077 Assert.assertEquals("C14H16N2Cl2", simplifyMF); 1078 } 1079 1080 /** Test molecule simplification */ 1081 @Test test3()1082 public void test3() { 1083 String formula = "(C27H33N3O8)2.2HNO3.3H2O"; 1084 String simplifyMF = MolecularFormulaManipulator.simplifyMolecularFormula(formula); 1085 Assert.assertEquals("C54H74N8O25", simplifyMF); 1086 } 1087 1088 /** Test if formula-comparison is simplify-independant */ 1089 @Test test4()1090 public void test4() { 1091 String formula = "(C27H33N3O8)2.2HNO3.3H2O"; 1092 IMolecularFormula formula1 = new MolecularFormula(); 1093 formula1.addIsotope(builder.newInstance(IIsotope.class, "C"), 54); 1094 formula1.addIsotope(builder.newInstance(IIsotope.class, "H"), 74); 1095 formula1.addIsotope(builder.newInstance(IIsotope.class, "O"), 25); 1096 formula1.addIsotope(builder.newInstance(IIsotope.class, "N"), 8); 1097 IMolecularFormula ff = MolecularFormulaManipulator.getMolecularFormula(formula, builder); 1098 Assert.assertTrue(MolecularFormulaManipulator.compare(formula1, 1099 MolecularFormulaManipulator.getMolecularFormula(formula, builder))); 1100 Assert.assertEquals("C54H74N8O25", MolecularFormulaManipulator.getString(ff)); 1101 } 1102 1103 /** Test if formula-comparison is simplify-independant */ 1104 @Test test5()1105 public void test5() { 1106 String formula = "[SO3]2-"; 1107 IMolecularFormula formula1 = new MolecularFormula(); 1108 formula1.addIsotope(builder.newInstance(IIsotope.class, "S"), 1); 1109 formula1.addIsotope(builder.newInstance(IIsotope.class, "O"), 3); 1110 formula1.setCharge(-2); 1111 IMolecularFormula ff = MolecularFormulaManipulator.getMolecularFormula(formula, builder); 1112 Assert.assertTrue(MolecularFormulaManipulator.compare(formula1, 1113 MolecularFormulaManipulator.getMolecularFormula(formula, builder))); 1114 Assert.assertEquals("[O3S]2-", MolecularFormulaManipulator.getString(ff)); 1115 Assert.assertEquals(-2, ff.getCharge(), 0.00001); 1116 } 1117 1118 /** Test if formula-comparison is simplify-independant */ 1119 @Test test6()1120 public void test6() { 1121 String formula = "(CH3)2"; 1122 IMolecularFormula formula1 = new MolecularFormula(); 1123 formula1.addIsotope(builder.newInstance(IIsotope.class, "C"), 2); 1124 formula1.addIsotope(builder.newInstance(IIsotope.class, "H"), 6); 1125 IMolecularFormula ff = MolecularFormulaManipulator.getMolecularFormula(formula, builder); 1126 Assert.assertTrue(MolecularFormulaManipulator.compare(formula1, 1127 MolecularFormulaManipulator.getMolecularFormula(formula, builder))); 1128 Assert.assertEquals("C2H6", MolecularFormulaManipulator.getString(ff)); 1129 } 1130 1131 /** Test if formula-comparison is simplify-independant */ 1132 @Test testWithH_Initial()1133 public void testWithH_Initial() { 1134 String formula = "HC5H11NO2H"; 1135 IMolecularFormula formula1 = new MolecularFormula(); 1136 formula1.addIsotope(builder.newInstance(IIsotope.class, "C"), 5); 1137 formula1.addIsotope(builder.newInstance(IIsotope.class, "H"), 13); 1138 formula1.addIsotope(builder.newInstance(IIsotope.class, "N"), 1); 1139 formula1.addIsotope(builder.newInstance(IIsotope.class, "O"), 2); 1140 IMolecularFormula ff = MolecularFormulaManipulator.getMolecularFormula(formula, builder); 1141 Assert.assertTrue(MolecularFormulaManipulator.compare(formula1, 1142 MolecularFormulaManipulator.getMolecularFormula(formula, builder))); 1143 Assert.assertEquals("C5H13NO2", MolecularFormulaManipulator.getString(ff)); 1144 } 1145 1146 /** 1147 * @cdk.bug 3071473 1148 */ 1149 @Test testFromMol()1150 public void testFromMol() throws Exception { 1151 String filename = "data/mdl/formulatest.mol"; 1152 InputStream ins = this.getClass().getClassLoader().getResourceAsStream(filename); 1153 MDLV2000Reader reader = new MDLV2000Reader(ins); 1154 ChemFile chemFile = reader.read(new ChemFile()); 1155 reader.close(); 1156 Assert.assertNotNull(chemFile); 1157 List<IAtomContainer> mols = ChemFileManipulator.getAllAtomContainers(chemFile); 1158 IAtomContainer mol = mols.get(0); 1159 1160 AtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(mol); 1161 CDKHydrogenAdder ha = CDKHydrogenAdder.getInstance(DefaultChemObjectBuilder.getInstance()); 1162 ha.addImplicitHydrogens(mol); 1163 AtomContainerManipulator.convertImplicitToExplicitHydrogens(mol); 1164 1165 IMolecularFormula molecularFormula = MolecularFormulaManipulator.getMolecularFormula(mol); 1166 String formula2 = MolecularFormulaManipulator.getString(molecularFormula); 1167 Assert.assertTrue(formula2.equals("C35H64N3O21P3S")); 1168 } 1169 1170 /** 1171 * @cdk.bug 3340660 1172 */ 1173 @Test testHelium()1174 public void testHelium() { 1175 IAtomContainer helium = new AtomContainer(); 1176 helium.addAtom(new Atom("He")); 1177 1178 IMolecularFormula formula = MolecularFormulaManipulator.getMolecularFormula(helium); 1179 Assert.assertNotNull(formula); 1180 Assert.assertEquals("He", MolecularFormulaManipulator.getString(formula)); 1181 } 1182 1183 /** 1184 * @cdk.bug 3340660 1185 */ 1186 @Test testAmericum()1187 public void testAmericum() { 1188 IAtomContainer helium = new AtomContainer(); 1189 helium.addAtom(new Atom("Am")); 1190 1191 IMolecularFormula formula = MolecularFormulaManipulator.getMolecularFormula(helium); 1192 Assert.assertNotNull(formula); 1193 Assert.assertEquals("Am", MolecularFormulaManipulator.getString(formula)); 1194 } 1195 1196 /** 1197 * @cdk.bug 2983334 1198 */ 1199 @Test testImplicitH()1200 public void testImplicitH() throws Exception { 1201 1202 CDKHydrogenAdder adder = CDKHydrogenAdder.getInstance(SilentChemObjectBuilder.getInstance()); 1203 1204 IAtomContainer mol = TestMoleculeFactory.makeBenzene(); 1205 1206 IMolecularFormula f = MolecularFormulaManipulator.getMolecularFormula(mol); 1207 Assert.assertEquals("C6", MolecularFormulaManipulator.getString(f)); 1208 1209 Assert.assertEquals(6, mol.getAtomCount()); 1210 AtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(mol); 1211 adder.addImplicitHydrogens(mol); 1212 Assert.assertEquals(6, mol.getAtomCount()); 1213 f = MolecularFormulaManipulator.getMolecularFormula(mol); 1214 Assert.assertEquals("C6H6", MolecularFormulaManipulator.getString(f)); 1215 1216 } 1217 noNullPointerExceptionForExactMassOfRGroups()1218 @Test public void noNullPointerExceptionForExactMassOfRGroups() throws Exception { 1219 IMolecularFormula formula = new MolecularFormula(); 1220 formula.addIsotope(new Isotope("C")); 1221 formula.addIsotope(new Isotope("H"), 3); 1222 formula.addIsotope(new Isotope("R")); 1223 assertThat(MolecularFormulaManipulator.getTotalExactMass(formula), 1224 closeTo(15.0234, 0.01)); 1225 } 1226 noNullPointerExceptionForMassOfRGroups()1227 @Test public void noNullPointerExceptionForMassOfRGroups() throws Exception { 1228 IMolecularFormula formula = new MolecularFormula(); 1229 formula.addIsotope(new Isotope("C")); 1230 formula.addIsotope(new Isotope("H"), 3); 1231 formula.addIsotope(new Isotope("R")); 1232 assertThat(MolecularFormulaManipulator.getTotalMassNumber(formula), 1233 closeTo(15.0, 0.01)); 1234 } 1235 noNullPointerExceptionForMajorMassOfRGroups()1236 @Test public void noNullPointerExceptionForMajorMassOfRGroups() throws Exception { 1237 IMolecularFormula formula = new MolecularFormula(); 1238 formula.addIsotope(new Isotope("C")); 1239 formula.addIsotope(new Isotope("H"), 3); 1240 formula.addIsotope(new Isotope("R")); 1241 assertThat(MolecularFormulaManipulator.getMajorIsotopeMass(formula), 1242 closeTo(15.0234, 0.01)); 1243 } 1244 noNullPointerForStaticIsotopes()1245 @Test public void noNullPointerForStaticIsotopes() throws Exception { 1246 Isotopes is = Isotopes.getInstance(); 1247 IIsotope carbon = is.getMajorIsotope("C"); 1248 MolecularFormula mf = new MolecularFormula(); 1249 mf.addIsotope(carbon, 10); 1250 MolecularFormulaManipulator.getNaturalExactMass(mf); 1251 } 1252 acceptMinusAsInput()1253 @Test public void acceptMinusAsInput() throws Exception { 1254 IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance(); 1255 IMolecularFormula mf = MolecularFormulaManipulator.getMolecularFormula("[PO4]3–", 1256 bldr); 1257 assertThat(mf.getCharge(), is(-3)); 1258 } 1259 deprotonatePhenol()1260 @Test public void deprotonatePhenol() throws Exception { 1261 IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance(); 1262 IMolecularFormula mf = MolecularFormulaManipulator.getMolecularFormula("C6H6O", bldr); 1263 assertTrue(MolecularFormulaManipulator.adjustProtonation(mf, -1)); 1264 assertThat(MolecularFormulaManipulator.getString(mf), is("[C6H5O]-")); 1265 assertThat(mf.getCharge(), is(-1)); 1266 } 1267 protonatePhenolate()1268 @Test public void protonatePhenolate() throws Exception { 1269 IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance(); 1270 IMolecularFormula mf = MolecularFormulaManipulator.getMolecularFormula("[C6H5O]-", bldr); 1271 assertTrue(MolecularFormulaManipulator.adjustProtonation(mf, +1)); 1272 assertThat(MolecularFormulaManipulator.getString(mf), is("C6H6O")); 1273 assertThat(mf.getCharge(), is(0)); 1274 assertThat(mf.getIsotopeCount(), is(3)); 1275 } 1276 protonatePhenolateMajorIsotopes()1277 @Test public void protonatePhenolateMajorIsotopes() throws Exception { 1278 IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance(); 1279 IMolecularFormula mf = MolecularFormulaManipulator.getMajorIsotopeMolecularFormula("[C6H5O]-", bldr); 1280 assertTrue(MolecularFormulaManipulator.adjustProtonation(mf, +1)); 1281 assertThat(MolecularFormulaManipulator.getString(mf), is("C6H6O")); 1282 assertThat(mf.getCharge(), is(0)); 1283 assertThat(mf.getIsotopeCount(), is(3)); 1284 } 1285 deprontateHCl()1286 @Test public void deprontateHCl() throws Exception { 1287 IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance(); 1288 IMolecularFormula mf = MolecularFormulaManipulator.getMolecularFormula("HCl", bldr); 1289 assertTrue(MolecularFormulaManipulator.adjustProtonation(mf, -1)); 1290 assertThat(MolecularFormulaManipulator.getString(mf), is("[Cl]-")); 1291 assertThat(mf.getCharge(), is(-1)); 1292 assertThat(mf.getIsotopeCount(), is(1)); 1293 } 1294 prontateChloride()1295 @Test public void prontateChloride() throws Exception { 1296 IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance(); 1297 IMolecularFormula mf = MolecularFormulaManipulator.getMolecularFormula("[Cl]-", bldr); 1298 assertTrue(MolecularFormulaManipulator.adjustProtonation(mf, +1)); 1299 assertThat(MolecularFormulaManipulator.getString(mf), is("ClH")); 1300 assertThat(mf.getCharge(), is(0)); 1301 assertThat(mf.getIsotopeCount(), is(2)); 1302 } 1303 deprontateChloride()1304 @Test public void deprontateChloride() throws Exception { 1305 IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance(); 1306 IMolecularFormula mf = MolecularFormulaManipulator.getMolecularFormula("[Cl]-", bldr); 1307 assertFalse(MolecularFormulaManipulator.adjustProtonation(mf, -1)); 1308 } 1309 protonateDeuteratedPhenolate()1310 @Test public void protonateDeuteratedPhenolate() throws Exception { 1311 IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance(); 1312 IMolecularFormula mf = bldr.newInstance(IMolecularFormula.class); 1313 // [C6DH4O]- (parser not good enough ATM so need to create like this) 1314 IIsotope deuterium = Isotopes.getInstance().getIsotope("H", 2); 1315 IIsotope hydrogen = Isotopes.getInstance().getMajorIsotope(1); 1316 mf.addIsotope(deuterium, 1); 1317 mf.addIsotope(hydrogen, 4); 1318 mf.addIsotope(Isotopes.getInstance().getMajorIsotope(6), 6); 1319 mf.addIsotope(Isotopes.getInstance().getMajorIsotope(8), 1); 1320 mf.setCharge(-1); 1321 assertTrue(MolecularFormulaManipulator.adjustProtonation(mf, +1)); 1322 assertThat(MolecularFormulaManipulator.getString(mf), is("C6H6O")); 1323 assertThat(mf.getCharge(), is(0)); 1324 assertThat(mf.getIsotopeCount(), is(4)); 1325 assertThat(mf.getIsotopeCount(deuterium), is(1)); 1326 assertThat(mf.getIsotopeCount(hydrogen), is(5)); 1327 } 1328 testMassNumberDisplay()1329 @Test public void testMassNumberDisplay() throws Exception { 1330 IsotopeFactory ifac = Isotopes.getInstance(); 1331 IIsotope br81 = ifac.getIsotope("Br", 81); 1332 1333 IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance(); 1334 IMolecularFormula mf = bldr.newInstance(IMolecularFormula.class); 1335 1336 mf.addIsotope(new Atom("C"), 7); 1337 mf.addIsotope(new Atom("O"), 3); 1338 mf.addIsotope(new Atom("H"), 3); 1339 mf.addIsotope(new Atom("Br"), 1); 1340 mf.addIsotope(ifac.getIsotope("Br", 81), 1); 1341 1342 assertThat(MolecularFormulaManipulator.getString(mf, false, false), is("C7H3Br2O3")); 1343 assertThat(MolecularFormulaManipulator.getString(mf, false, true), is("C7H3Br[81]BrO3")); 1344 } 1345 1346 @Test testMassNumberDisplayWithDefinedIsotopes()1347 public void testMassNumberDisplayWithDefinedIsotopes() throws Exception { 1348 IsotopeFactory ifac = Isotopes.getInstance(); 1349 1350 IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance(); 1351 IMolecularFormula mf = bldr.newInstance(IMolecularFormula.class); 1352 1353 mf.addIsotope(ifac.getMajorIsotope("C"), 7); 1354 mf.addIsotope(ifac.getMajorIsotope("O"), 3); 1355 mf.addIsotope(ifac.getMajorIsotope("H"), 3); 1356 mf.addIsotope(ifac.getMajorIsotope("Br"), 1); 1357 mf.addIsotope(ifac.getIsotope("Br", 81), 1); 1358 Isotopes.clearMajorIsotopes(mf); 1359 assertThat(MolecularFormulaManipulator.getString(mf, false, false), is("C7H3Br2O3")); 1360 assertThat(MolecularFormulaManipulator.getString(mf, false, true), is("C7H3Br[81]BrO3")); 1361 } 1362 parseMFMass()1363 @Test public void parseMFMass() throws Exception { 1364 String str = "C7H3[81]BrBrO3"; 1365 IChemObjectBuilder builder = SilentChemObjectBuilder.getInstance(); 1366 IMolecularFormula mf = MolecularFormulaManipulator.getMolecularFormula(str, builder); 1367 assertThat(MolecularFormulaManipulator.getString(mf, false, true), 1368 is("C7H3Br[81]BrO3")); 1369 } 1370 1371 @Test testRoundTripCharge()1372 public void testRoundTripCharge() { 1373 String f = "[C3H7]+"; 1374 IMolecularFormula m = 1375 MolecularFormulaManipulator.getMolecularFormula(f, 1376 SilentChemObjectBuilder.getInstance()); 1377 assertThat(MolecularFormulaManipulator.getString(m), is("[C3H7]+")); 1378 } 1379 1380 @Test getMostAbundant()1381 public void getMostAbundant() { 1382 IMolecularFormula mf = new MolecularFormula(); 1383 mf.addIsotope(new Atom("C"), 6); 1384 mf.addIsotope(new Atom("Br"), 6); 1385 IMolecularFormula mamf = MolecularFormulaManipulator.getMostAbundant(mf); 1386 assertThat(MolecularFormulaManipulator.getString(mamf, false, true), 1387 is("[12]C6[79]Br3[81]Br3")); 1388 } 1389 1390 assertMass(String str, double expMass, int flav)1391 private static void assertMass(String str, double expMass, int flav) { 1392 IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance(); 1393 IMolecularFormula mf = 1394 MolecularFormulaManipulator.getMolecularFormula(str, bldr); 1395 double act = MolecularFormulaManipulator.getMass(mf, flav); 1396 assertThat(act, is(closeTo(expMass, 0.01))); 1397 } 1398 1399 @Test C6Br6()1400 public void C6Br6() { 1401 assertMass("C6Br6", 551.485, MolWeight); 1402 assertMass("C6Br6", 545.510, MonoIsotopic); 1403 assertMass("C6Br6", 551.503, MostAbundant); 1404 assertMass("[12]C4[13]C2Br6", 553.427, MolWeight); 1405 assertMass("[12]C4[13]C2Br6", 547.516, MonoIsotopic); 1406 assertMass("[12]C4[13]C2Br6", 553.510, MostAbundant); 1407 } 1408 1409 // Iron has 4 stable isotopes, 54 @ 5.85%, 56 @ 91.57%, 57 @ 2.12%, and 1410 // 58 @ 0.28%. Given 100 iron's we expected ~6 @ 54, ~92 @ 56 and 2 @ 57 1411 @Test getMostAbundantFe100()1412 public void getMostAbundantFe100() { 1413 IMolecularFormula mf = new MolecularFormula(); 1414 mf.addIsotope(new Atom("Fe"), 100); 1415 IMolecularFormula mamf = MolecularFormulaManipulator.getMostAbundant(mf); 1416 assertThat(MolecularFormulaManipulator.getString(mamf, false, true), 1417 is("[54]Fe6[56]Fe92[57]Fe2")); 1418 } 1419 getMassCranbin()1420 @Test public void getMassCranbin() { 1421 IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance(); 1422 IMolecularFormula mf = 1423 MolecularFormulaManipulator.getMolecularFormula("C202H315N55O64S6", 1424 bldr); 1425 Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MolWeight), 1426 closeTo(4730.397, 0.001)); 1427 Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MolWeightIgnoreSpecified), 1428 closeTo(4730.397, 0.001)); 1429 Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MonoIsotopic), 1430 closeTo(4727.140, 0.001)); 1431 Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MostAbundant), 1432 closeTo(4729.147, 0.001)); 1433 } 1434 getMassCranbinSpecIsotopes()1435 @Test public void getMassCranbinSpecIsotopes() { 1436 IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance(); 1437 IMolecularFormula mf = 1438 MolecularFormulaManipulator.getMolecularFormula("[12]C200[13]C2[1]H315[14]N55[16]O64[32]S6", 1439 bldr); 1440 Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MolWeight), 1441 closeTo(4729.147, 0.001)); 1442 Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MolWeightIgnoreSpecified), 1443 closeTo(4730.397, 0.001)); 1444 Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MonoIsotopic), 1445 closeTo(4729.147, 0.001)); 1446 Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MostAbundant), 1447 closeTo(4729.147, 0.001)); 1448 } 1449 getMassCranbinMixedSpecIsotopes()1450 @Test public void getMassCranbinMixedSpecIsotopes() { 1451 IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance(); 1452 IMolecularFormula mf = 1453 MolecularFormulaManipulator.getMolecularFormula("C200[13]C2H315N55O64S6", 1454 bldr); 1455 Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MolWeight), 1456 closeTo(4732.382, 0.001)); 1457 Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MolWeightIgnoreSpecified), 1458 closeTo(4730.397, 0.001)); 1459 Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MonoIsotopic), 1460 closeTo(4729.147, 0.001)); 1461 Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MostAbundant), 1462 closeTo(4731.154, 0.001)); 1463 } 1464 } 1465