/*************************************************************************
* *
* This file is part of the 20n/act project. *
* 20n/act enables DNA prediction for synthetic biology/bioengineering. *
* Copyright (C) 2017 20n Labs, Inc. *
* *
* Please direct all queries to act@20n.com. *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
* *
*************************************************************************/
package com.act.biointerpretation.sars;
import chemaxon.formats.MolExporter;
import chemaxon.formats.MolFormatException;
import chemaxon.formats.MolImporter;
import chemaxon.struc.Molecule;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import static org.junit.Assert.assertEquals;
public class McsCalculatorTest {
private static final String INCHI_IMPORT_SETTINGS = "inchi";
private static final String INCHI_EXPORT_SETTINGS = "inchi:AuxNone";
// Three substrates containing methylpyrene
private static final String METHYLPYRINE_INCHI_1 =
"InChI=1S/C18H14O/c1-11-2-3-12-7-9-16-14(10-19)5-4-13-6-8-15(11)17(12)18(13)16/h2-9,19H,10H2,1H3";
private static final String METHYLPYRINE_INCHI_2 =
"InChI=1S/C18H14O/c1-11-2-3-12-4-5-13-6-7-14(10-19)16-9-8-15(11)17(12)18(13)16/h2-9,19H,10H2,1H3";
private static final String METHYLPYRENE_INCHI_3 =
"InChI=1S/C17H12O/c18-10-14-7-6-13-5-4-11-2-1-3-12-8-9-15(14)17(13)16(11)12/h1-9,18H,10H2";
// Methylpyrene itself.
private static final String METHYLPYRENE_INCHI =
"InChI=1S/C17H12O/c18-10-14-7-6-13-5-4-11-2-1-3-12-8-9-15(14)17(13)16(11)12/h1-9,18H,10H2";
private Molecule methylPyreneMol1;
private Molecule methylPyreneMol2;
private Molecule methylPyreneMol3;
private Molecule methylPyreneMol;
@Before
public void init() throws MolFormatException {
methylPyreneMol1 = MolImporter.importMol(METHYLPYRINE_INCHI_1, INCHI_IMPORT_SETTINGS);
methylPyreneMol2 = MolImporter.importMol(METHYLPYRINE_INCHI_2, INCHI_IMPORT_SETTINGS);
methylPyreneMol3 = MolImporter.importMol(METHYLPYRENE_INCHI_3, INCHI_IMPORT_SETTINGS);
methylPyreneMol = MolImporter.importMol(METHYLPYRENE_INCHI, INCHI_IMPORT_SETTINGS);
}
@Test
public void testMcsCalculatorSimplePairs() throws IOException {
// Arrange
McsCalculator calculator = new McsCalculator(McsCalculator.SAR_OPTIONS);
// Act
Molecule mcs12 = calculator.getMCS(Arrays.asList(methylPyreneMol1, methylPyreneMol2));
Molecule mcs13 = calculator.getMCS(Arrays.asList(methylPyreneMol1, methylPyreneMol3));
Molecule mcs23 = calculator.getMCS(Arrays.asList(methylPyreneMol2, methylPyreneMol3));
// Assert
String mcsInchi12 = MolExporter.exportToFormat(mcs12, INCHI_EXPORT_SETTINGS);
String mcsInchi13 = MolExporter.exportToFormat(mcs13, INCHI_EXPORT_SETTINGS);
String mcsInchi23 = MolExporter.exportToFormat(mcs23, INCHI_EXPORT_SETTINGS);
assertEquals("MCS of one and two should be as expected.", METHYLPYRENE_INCHI, mcsInchi12);
assertEquals("MCS of one and three should be as expected.", METHYLPYRENE_INCHI, mcsInchi13);
assertEquals("MCS of two and three should be as expected.", METHYLPYRENE_INCHI, mcsInchi23);
}
@Test
public void testSarOptionsMatchDifferentBondTypes() throws IOException {
// Arrange
String firstSubstrateInchi =
"InChI=1S/C7H12O2/c8-7(9)6-4-2-1-3-5-6/h6H,1-5H2,(H,8,9)";
String secondSubstrateInchi =
"InChI=1S/C7H10O2/c8-7(9)6-4-2-1-3-5-6/h4H,1-3,5H2,(H,8,9)";
String expectedMcs =
"InChI=1S/C7H10O2/c8-7(9)6-4-2-1-3-5-6/h4H,1-3,5H2,(H,8,9)";
Molecule firstSubstrate = MolImporter.importMol(firstSubstrateInchi, INCHI_IMPORT_SETTINGS);
Molecule secondSubstrate = MolImporter.importMol(secondSubstrateInchi, INCHI_IMPORT_SETTINGS);
McsCalculator calculator = new McsCalculator(McsCalculator.SAR_OPTIONS);
// Act
Molecule mcs = calculator.getMCS(Arrays.asList(firstSubstrate, secondSubstrate));
// Assert
String mcsInchi = MolExporter.exportToFormat(mcs, INCHI_EXPORT_SETTINGS);
assertEquals("MCS should contain the ring despite different bond types in substrates.", expectedMcs, mcsInchi);
}
@Test
public void testReactionOptionsMismatchDifferentBondTypes() throws IOException {
// Arrange
String firstSubstrateInchi =
"InChI=1S/C7H12O2/c8-7(9)6-4-2-1-3-5-6/h6H,1-5H2,(H,8,9)";
String secondSubstrateInchi =
"InChI=1S/C7H10O2/c8-7(9)6-4-2-1-3-5-6/h4H,1-3,5H2,(H,8,9)";
String expectedMcs =
"InChI=1S/C2H4O2/c1-2(3)4/h1H3,(H,3,4)";
Molecule firstSubstrate = MolImporter.importMol(firstSubstrateInchi, INCHI_IMPORT_SETTINGS);
Molecule secondSubstrate = MolImporter.importMol(secondSubstrateInchi, INCHI_IMPORT_SETTINGS);
McsCalculator calculator = new McsCalculator(McsCalculator.REACTION_BUILDING_OPTIONS);
// Act
Molecule mcs = calculator.getMCS(Arrays.asList(firstSubstrate, secondSubstrate));
// Assert
String mcsInchi = MolExporter.exportToFormat(mcs, INCHI_EXPORT_SETTINGS);
assertEquals("MCS should not contain the ring due to different bond types in substrates.", expectedMcs, mcsInchi);
}
@Test
public void testMcsCalculatorManyMolecules() throws IOException {
// Arrange
List<Molecule> molecules = Arrays.asList(methylPyreneMol1, methylPyreneMol1, methylPyreneMol, methylPyreneMol2,
methylPyreneMol3, methylPyreneMol1, methylPyreneMol3, methylPyreneMol, methylPyreneMol2);
McsCalculator calculator = new McsCalculator(McsCalculator.SAR_OPTIONS);
// Act
Molecule mcs = calculator.getMCS(molecules);
// Assert
String mcsInchi = MolExporter.exportToFormat(mcs, INCHI_EXPORT_SETTINGS);
assertEquals("MCS of all molecules should be as expected.", METHYLPYRENE_INCHI, mcsInchi);
}
@Test
public void testMcsCalculatorRingDoesntMatchChain() throws IOException {
// Arrange
String benzeneInchi = "InChI=1/C6H6/c1-2-4-6-5-3-1/h1-6H";
String chainInchi = "InChI=1S/C5H12/c1-3-5-4-2/h3-5H2,1-2H3";
String expectedMcs = "InChI=1S//";
Molecule benzene = MolImporter.importMol(benzeneInchi, INCHI_IMPORT_SETTINGS);
Molecule chain = MolImporter.importMol(chainInchi, INCHI_IMPORT_SETTINGS);
List<Molecule> inputMolecules = Arrays.asList(benzene, chain);
McsCalculator calculator = new McsCalculator(McsCalculator.SAR_OPTIONS);
// Act
Molecule mcs = calculator.getMCS(inputMolecules);
String mcsInchi = MolExporter.exportToFormat(mcs, INCHI_EXPORT_SETTINGS);
// Assert
assertEquals("Mcs should be empty.", expectedMcs, mcsInchi);
}
}