//Copyright 2017 Ryan Wick //This file is part of Bandage //Bandage 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. //Bandage 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 Bandage. If not, see . #ifndef DEBRUIJNEDGE_H #define DEBRUIJNEDGE_H #include "../ogdf/basic/Graph.h" #include "debruijnnode.h" class GraphicsItemEdge; class DeBruijnEdge { public: //CREATORS DeBruijnEdge(DeBruijnNode * startingNode, DeBruijnNode * endingNode); //ACCESSORS bool isStartingNode(DeBruijnNode * node) const {return node == m_startingNode;} DeBruijnNode * getStartingNode() const {return m_startingNode;} DeBruijnNode * getEndingNode() const {return m_endingNode;} GraphicsItemEdge * getGraphicsItemEdge() const {return m_graphicsItemEdge;} DeBruijnEdge * getReverseComplement() const {return m_reverseComplement;} bool isDrawn() const {return m_drawn;} int getOverlap() const {return m_overlap;} EdgeOverlapType getOverlapType() const {return m_overlapType;} DeBruijnNode * getOtherNode(const DeBruijnNode * node) const; bool testExactOverlap(int overlap) const; void tracePaths(bool forward, int stepsRemaining, std::vector > * allPaths, DeBruijnNode * startingNode, std::vector pathSoFar = std::vector()) const; bool leadsOnlyToNode(bool forward, int stepsRemaining, DeBruijnNode * target, std::vector pathSoFar, bool includeReverseComplement) const; QByteArray getGfaLinkLine() const; bool isPositiveEdge() const; bool isNegativeEdge() const {return !isPositiveEdge();} bool isOwnReverseComplement() const {return this == getReverseComplement();} static bool compareEdgePointers(DeBruijnEdge * a, DeBruijnEdge * b); //MODIFERS void setGraphicsItemEdge(GraphicsItemEdge * gie) {m_graphicsItemEdge = gie;} void setReverseComplement(DeBruijnEdge * rc) {m_reverseComplement = rc;} void setOverlap(int ol) {m_overlap = ol;} void setOverlapType(EdgeOverlapType olt) {m_overlapType = olt;} void reset() {m_graphicsItemEdge = 0; m_drawn = false;} void determineIfDrawn() {m_drawn = edgeIsVisible();} void setExactOverlap(int overlap) {m_overlap = overlap; m_overlapType = EXACT_OVERLAP;} void autoDetermineExactOverlap(); void addToOgdfGraph(ogdf::Graph * ogdfGraph, ogdf::EdgeArray * edgeArray) const; private: DeBruijnNode * m_startingNode; DeBruijnNode * m_endingNode; GraphicsItemEdge * m_graphicsItemEdge; DeBruijnEdge * m_reverseComplement; bool m_drawn; EdgeOverlapType m_overlapType; int m_overlap; bool edgeIsVisible() const; int timesNodeInPath(DeBruijnNode * node, std::vector * path) const; std::vector findNextEdgesInPath(DeBruijnNode * nextNode, bool forward) const; }; #endif // DEBRUIJNEDGE_H