/** * Copyright (C) 2012-2013 Selventa, Inc. * * This file is part of the OpenBEL Framework. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * The OpenBEL Framework 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 Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the OpenBEL Framework. If not, see <http://www.gnu.org/licenses/>. * * Additional Terms under LGPL v3: * * This license does not authorize you and you are prohibited from using the * name, trademarks, service marks, logos or similar indicia of Selventa, Inc., * or, in the discretion of other licensors or authors of the program, the * name, trademarks, service marks, logos or similar indicia of such authors or * licensors, in any marketing or advertising materials relating to your * distribution of the program or any covered product. This restriction does * not waive or limit your obligation to keep intact all copyright notices set * forth in the program as delivered to you. * * If you distribute the program in whole or in part, or any modified version * of the program, and you assume contractual liability to the recipient with * respect to the program or modified version, then you will indemnify the * authors and licensors of the program for any liabilities that these * contractual assumptions directly impose on those licensors and authors. */ package org.openbel.framework.api; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; import static org.openbel.framework.common.enums.FunctionEnum.ABUNDANCE; import static org.openbel.framework.common.enums.FunctionEnum.CATALYTIC_ACTIVITY; import static org.openbel.framework.common.enums.FunctionEnum.COMPLEX_ABUNDANCE; import static org.openbel.framework.common.enums.FunctionEnum.COMPOSITE_ABUNDANCE; import static org.openbel.framework.common.enums.FunctionEnum.GENE_ABUNDANCE; import static org.openbel.framework.common.enums.FunctionEnum.PROTEIN_ABUNDANCE; import static org.openbel.framework.common.enums.FunctionEnum.RNA_ABUNDANCE; import static org.openbel.framework.common.enums.RelationshipType.ACTS_IN; import static org.openbel.framework.common.enums.RelationshipType.HAS_COMPONENT; import static org.openbel.framework.common.enums.RelationshipType.INCLUDES; import static org.openbel.framework.common.enums.RelationshipType.INCREASES; import static org.openbel.framework.common.enums.RelationshipType.TRANSCRIBED_TO; import static org.openbel.framework.common.enums.RelationshipType.TRANSLATED_TO; import java.util.List; import org.junit.Test; import org.openbel.framework.api.Kam.KamEdge; import org.openbel.framework.api.Kam.KamNode; import org.openbel.framework.api.KamTestUtil.TestKamEdge; import org.openbel.framework.api.KamTestUtil.TestKamNode; import org.openbel.framework.api.internal.KamInfoUtil; import org.openbel.framework.api.internal.KAMCatalogDao.KamInfo; /** * BasicPathFinderTest tests the {@link BasicPathFinder} findPaths, scan, and * interconnect APIs. * * @author Anthony Bargnesi {@code <abargnesi@selventa.com>} */ public class BasicPathFinderTest { /** * Test path finding from geneAbundance(23) to * catalyticActivity(proteinAbundance(23)) with a default max search depth. */ @Test public void testFindPathDefault() { final Kam kam = createTestKAM(); final PathFinder pathFinder = new BasicPathFinder(kam); SimplePath[] pathsFound = pathFinder.findPaths(kam.findNode(1), kam.findNode(5)); assertNotNull(pathsFound); assertEquals(1, pathsFound.length); final List<KamEdge> edges = pathsFound[0].getEdges(); assertEquals(3, edges.size()); final KamEdge[] edgeArray = edges.toArray(new KamEdge[edges.size()]); assertEquals(TRANSCRIBED_TO, edgeArray[0].getRelationshipType()); assertEquals(TRANSLATED_TO, edgeArray[1].getRelationshipType()); assertEquals(ACTS_IN, edgeArray[2].getRelationshipType()); } /** * Test path finding from geneAbundance(23) to * catalyticActivity(proteinAbundance(23)) with a max search depth of 6. */ @Test public void testFindPathLargerDepth() { final Kam kam = createTestKAM(); final PathFinder pathFinder = new BasicPathFinder(kam, 6); SimplePath[] pathsFound = pathFinder.findPaths(kam.findNode(1), kam.findNode(5)); assertNotNull(pathsFound); assertEquals(2, pathsFound.length); List<KamEdge> edges = pathsFound[0].getEdges(); assertEquals(3, edges.size()); KamEdge[] edgeArray = edges.toArray(new KamEdge[edges.size()]); assertEquals(TRANSCRIBED_TO, edgeArray[0].getRelationshipType()); assertEquals(TRANSLATED_TO, edgeArray[1].getRelationshipType()); assertEquals(ACTS_IN, edgeArray[2].getRelationshipType()); edges = pathsFound[1].getEdges(); assertEquals(5, edges.size()); edgeArray = edges.toArray(new KamEdge[edges.size()]); assertEquals(TRANSCRIBED_TO, edgeArray[0].getRelationshipType()); assertEquals(TRANSLATED_TO, edgeArray[1].getRelationshipType()); assertEquals(HAS_COMPONENT, edgeArray[2].getRelationshipType()); assertEquals(HAS_COMPONENT, edgeArray[3].getRelationshipType()); assertEquals(INCREASES, edgeArray[4].getRelationshipType()); } /** * Test path scan out from abundance(22) with a default max search depth. */ @Test public void testScanDefault() { final Kam kam = createTestKAM(); final PathFinder pathFinder = new BasicPathFinder(kam); SimplePath[] pathsFound = pathFinder.scan(kam.findNode("abundance(22)")); assertNotNull(pathsFound); assertEquals(7, pathsFound.length); // test returned paths scanned and their order assertEquals(kam.findNode("abundance(22)"), pathsFound[0].getSource()); assertEquals(kam.findNode("geneAbundance(23)"), pathsFound[0].getTarget()); assertEquals(kam.findNode("abundance(22)"), pathsFound[1].getSource()); assertEquals(kam.findNode("geneAbundance(23)"), pathsFound[1].getTarget()); assertEquals(kam.findNode("abundance(22)"), pathsFound[2].getSource()); assertEquals( kam.findNode("compositeAbundance(abundance(22),abundance(29))"), pathsFound[2].getTarget()); assertEquals(kam.findNode("abundance(22)"), pathsFound[3].getSource()); assertEquals(kam.findNode("geneAbundance(28)"), pathsFound[3].getTarget()); assertEquals(kam.findNode("abundance(22)"), pathsFound[4].getSource()); assertEquals(kam.findNode("abundance(29)"), pathsFound[4].getTarget()); assertEquals(kam.findNode("abundance(22)"), pathsFound[5].getSource()); assertEquals( kam.findNode("complexAbundance(abundance(22),proteinAbundance(28))"), pathsFound[5].getTarget()); assertEquals(kam.findNode("abundance(22)"), pathsFound[6].getSource()); assertEquals(kam.findNode("rnaAbundance(28)"), pathsFound[6].getTarget()); } /** * Test path scan out from abundance(22) with a default max search depth. */ @Test public void testScanSmallDepth() { final Kam kam = createTestKAM(); final PathFinder pathFinder = new BasicPathFinder(kam, 2); SimplePath[] pathsFound = pathFinder.scan(kam.findNode("abundance(22)")); assertNotNull(pathsFound); assertEquals(5, pathsFound.length); // test returned paths scanned and their order assertEquals(kam.findNode("abundance(22)"), pathsFound[0].getSource()); assertEquals(kam.findNode("proteinAbundance(23)"), pathsFound[0].getTarget()); assertEquals(kam.findNode("abundance(22)"), pathsFound[1].getSource()); assertEquals(kam.findNode("proteinAbundance(23)"), pathsFound[1].getTarget()); assertEquals(kam.findNode("abundance(22)"), pathsFound[2].getSource()); assertEquals(kam.findNode("proteinAbundance(28)"), pathsFound[2].getTarget()); assertEquals(kam.findNode("abundance(22)"), pathsFound[3].getSource()); assertEquals(kam.findNode("abundance(29)"), pathsFound[3].getTarget()); assertEquals(kam.findNode("abundance(22)"), pathsFound[4].getSource()); assertEquals(kam.findNode("catalyticActivity(proteinAbundance(28))"), pathsFound[4].getTarget()); } /** * Test interconnect sources of proteinAbundance(23) and * proteinAbundance(28). */ @Test public void testInterconnectDefaultDepth() { final Kam kam = createTestKAM(); final PathFinder pathFinder = new BasicPathFinder(kam); SimplePath[] pathsFound = pathFinder.interconnect(new KamNode[] { kam.findNode("proteinAbundance(23)"), kam.findNode("proteinAbundance(28)") }); assertNotNull(pathsFound); assertEquals(2, pathsFound.length); List<KamEdge> edges = pathsFound[0].getEdges(); assertEquals(4, edges.size()); KamEdge[] edgeArray = edges.toArray(new KamEdge[edges.size()]); assertEquals(ACTS_IN, edgeArray[0].getRelationshipType()); assertEquals(INCREASES, edgeArray[1].getRelationshipType()); assertEquals(HAS_COMPONENT, edgeArray[2].getRelationshipType()); assertEquals(HAS_COMPONENT, edgeArray[3].getRelationshipType()); edges = pathsFound[1].getEdges(); assertEquals(4, edges.size()); edgeArray = edges.toArray(new KamEdge[edges.size()]); assertEquals(HAS_COMPONENT, edgeArray[0].getRelationshipType()); assertEquals(HAS_COMPONENT, edgeArray[1].getRelationshipType()); assertEquals(HAS_COMPONENT, edgeArray[2].getRelationshipType()); assertEquals(HAS_COMPONENT, edgeArray[3].getRelationshipType()); } /** * Test interconnect sources of proteinAbundance(23) and * proteinAbundance(28) with a max search depth of 3. */ @Test public void testInterconnectSmallDepth() { final Kam kam = createTestKAM(); final PathFinder pathFinder = new BasicPathFinder(kam, 3); SimplePath[] pathsFound = pathFinder.interconnect(new KamNode[] { kam.findNode("proteinAbundance(23)"), kam.findNode("proteinAbundance(28)") }); assertNotNull(pathsFound); assertEquals(0, pathsFound.length); } /** * Create a test KAM for testing path finds. * * @return {@link Kam} the test KAM */ private Kam createTestKAM() { KamInfo testKAMInfo = null; try { testKAMInfo = KamInfoUtil.createKamInfo(); } catch (Exception e) { fail(e.getMessage()); } final TestKamNode[] testKamNodes = new TestKamNode[] { new TestKamNode(1, GENE_ABUNDANCE, "geneAbundance(23)"), new TestKamNode(2, RNA_ABUNDANCE, "rnaAbundance(23)"), new TestKamNode(3, PROTEIN_ABUNDANCE, "proteinAbundance(23)"), new TestKamNode( 4, COMPLEX_ABUNDANCE, "complexAbundance(abundance(22),proteinAbundance(23))"), new TestKamNode(5, CATALYTIC_ACTIVITY, "catalyticActivity(proteinAbundance(23))"), new TestKamNode(6, ABUNDANCE, "abundance(29)"), new TestKamNode(7, ABUNDANCE, "abundance(22)"), new TestKamNode( 8, COMPOSITE_ABUNDANCE, "compositeAbundance(abundance(22),abundance(29))"), new TestKamNode( 9, COMPLEX_ABUNDANCE, "complexAbundance(abundance(22),proteinAbundance(28))"), new TestKamNode(10, CATALYTIC_ACTIVITY, "catalyticActivity(proteinAbundance(28))"), new TestKamNode(11, PROTEIN_ABUNDANCE, "proteinAbundance(28)"), new TestKamNode(12, RNA_ABUNDANCE, "rnaAbundance(28)"), new TestKamNode(13, GENE_ABUNDANCE, "geneAbundance(28)"), }; final TestKamEdge[] testKamEdges = new TestKamEdge[] { new TestKamEdge(1, testKamNodes[0], TRANSCRIBED_TO, testKamNodes[1]), new TestKamEdge(2, testKamNodes[1], TRANSLATED_TO, testKamNodes[2]), new TestKamEdge(3, testKamNodes[2], ACTS_IN, testKamNodes[4]), new TestKamEdge(4, testKamNodes[3], HAS_COMPONENT, testKamNodes[2]), new TestKamEdge(5, testKamNodes[3], HAS_COMPONENT, testKamNodes[6]), new TestKamEdge(6, testKamNodes[6], INCREASES, testKamNodes[4]), new TestKamEdge(7, testKamNodes[8], HAS_COMPONENT, testKamNodes[6]), new TestKamEdge(8, testKamNodes[7], INCLUDES, testKamNodes[6]), new TestKamEdge(9, testKamNodes[7], INCLUDES, testKamNodes[5]), new TestKamEdge(10, testKamNodes[7], INCREASES, testKamNodes[9]), new TestKamEdge(11, testKamNodes[8], HAS_COMPONENT, testKamNodes[10]), new TestKamEdge(12, testKamNodes[10], ACTS_IN, testKamNodes[9]), new TestKamEdge(13, testKamNodes[11], TRANSLATED_TO, testKamNodes[10]), new TestKamEdge(14, testKamNodes[12], TRANSCRIBED_TO, testKamNodes[11]), }; return KamTestUtil.createKam(testKAMInfo, testKamNodes, testKamEdges); } }