/* * EuroCarbDB, a framework for carbohydrate bioinformatics * * Copyright (c) 2006-2009, Eurocarb project, or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * A copy of this license accompanies this distribution in the file LICENSE.txt. * * 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 Lesser General Public License * for more details. * * Last commit: $Rev: 1210 $ by $Author: glycoslave $ on $Date:: 2009-06-12 #$ */ package org.eurocarbdb.MolecularFramework.util.visitor; import java.util.ArrayList; import java.util.Iterator; import org.eurocarbdb.MolecularFramework.sugar.GlycoEdge; import org.eurocarbdb.MolecularFramework.sugar.GlycoNode; import org.eurocarbdb.MolecularFramework.sugar.Monosaccharide; import org.eurocarbdb.MolecularFramework.sugar.NonMonosaccharide; import org.eurocarbdb.MolecularFramework.sugar.Substituent; import org.eurocarbdb.MolecularFramework.sugar.Sugar; import org.eurocarbdb.MolecularFramework.sugar.SugarUnitAlternative; import org.eurocarbdb.MolecularFramework.sugar.SugarUnitCyclic; import org.eurocarbdb.MolecularFramework.sugar.SugarUnitRepeat; import org.eurocarbdb.MolecularFramework.sugar.UnderdeterminedSubTree; import org.eurocarbdb.MolecularFramework.sugar.UnvalidatedGlycoNode; import org.eurocarbdb.MolecularFramework.util.traverser.GlycoTraverser; import org.eurocarbdb.MolecularFramework.util.traverser.GlycoTraverserSimple; import org.eurocarbdb.MolecularFramework.util.visitor.GlycoVisitor; import org.eurocarbdb.MolecularFramework.util.visitor.GlycoVisitorException; import org.eurocarbdb.MolecularFramework.util.visitor.GlycoVisitorNodeType; public class GlycoVisitorCountBranchingPoints implements GlycoVisitor { private int m_iBranchingPointsAllResidues; private int m_iBranchingPointsOnlyMonosaccharide; private ArrayList<GlycoNode> m_aBranchingPointResidue = new ArrayList<GlycoNode>(); private ArrayList<GlycoNode> m_aBranchingPointMonosaccharide = new ArrayList<GlycoNode>(); public void visit(Monosaccharide a_objMonosaccharid) throws GlycoVisitorException { ArrayList<GlycoEdge> t_objLinkages = a_objMonosaccharid.getChildEdges(); if ( t_objLinkages.size() > 1 ) { this.m_iBranchingPointsAllResidues++; this.m_aBranchingPointResidue.add(a_objMonosaccharid); } // monosaccharide branching count Integer t_iMonosaccharideCount=0; for (GlycoEdge t_edge : t_objLinkages) { GlycoVisitorNodeType o_tVisitor = new GlycoVisitorNodeType (); if (o_tVisitor.isMonosaccharide(t_edge.getChild())) { t_iMonosaccharideCount++; } else if ( o_tVisitor.isSugarUnitRepeat(t_edge.getChild())) { t_iMonosaccharideCount++; } } if (t_iMonosaccharideCount>1) { this.m_iBranchingPointsOnlyMonosaccharide++; this.m_aBranchingPointMonosaccharide.add(a_objMonosaccharid); } } public void visit(NonMonosaccharide a_objResidue) throws GlycoVisitorException { throw new GlycoVisitorException("NonMonosaccharides are not allowed."); } public GlycoTraverser getTraverser(GlycoVisitor a_objVisitor) throws GlycoVisitorException { return new GlycoTraverserSimple(a_objVisitor); } public void clear() { this.m_iBranchingPointsAllResidues = 0; this.m_iBranchingPointsOnlyMonosaccharide = 0; this.m_aBranchingPointMonosaccharide.clear(); this.m_aBranchingPointResidue.clear(); } public int getBranchingPointsCountResidue() { return this.m_iBranchingPointsAllResidues; } public int getBranchingPointsCountMonosaccharide() { return this.m_iBranchingPointsOnlyMonosaccharide; } public void start(GlycoNode a_objResidue) throws GlycoVisitorException { this.clear(); GlycoTraverser t_objTraverser = this.getTraverser(this); t_objTraverser.traverse(a_objResidue); } public void start(Sugar a_objSugar) throws GlycoVisitorException { this.clear(); GlycoTraverser t_objTraverser = this.getTraverser(this); t_objTraverser.traverseGraph(a_objSugar); for (Iterator<UnderdeterminedSubTree> t_iterUnder = a_objSugar.getUndeterminedSubTrees().iterator(); t_iterUnder.hasNext();) { UnderdeterminedSubTree t_objSubTree = t_iterUnder.next(); t_objTraverser = this.getTraverser(this); t_objTraverser.traverseGraph(t_objSubTree); boolean t_bNewResidue = false; boolean t_bNewMonosaccharide = false; for (Iterator<GlycoNode> t_iterParents = t_objSubTree.getParents().iterator(); t_iterParents.hasNext();) { GlycoNode t_objNode = t_iterParents.next(); GlycoVisitorNodeType t_visType = new GlycoVisitorNodeType(); if ( t_visType.isMonosaccharide(t_objNode )) { if ( t_objNode.getChildEdges().size() == 1 ) { if ( !this.m_aBranchingPointResidue.contains(t_objNode) ) { this.m_aBranchingPointResidue.add(t_objNode); t_bNewResidue = true; } } int t_iMonosaccharideCount = 0; for (GlycoEdge t_edge : t_objNode.getChildEdges()) { GlycoVisitorNodeType o_tVisitor = new GlycoVisitorNodeType (); if (o_tVisitor.isMonosaccharide(t_edge.getChild())) { t_iMonosaccharideCount++; } else if ( o_tVisitor.isSugarUnitRepeat(t_edge.getChild())) { t_iMonosaccharideCount++; } } if ( t_iMonosaccharideCount == 1 ) { if ( !this.m_aBranchingPointMonosaccharide.contains(t_objNode) ) { this.m_aBranchingPointMonosaccharide.add(t_objNode); t_bNewMonosaccharide = true; } } } else { if ( t_objNode.getChildEdges().size() == 1 ) { if ( !this.m_aBranchingPointResidue.contains(t_objNode) ) { this.m_aBranchingPointResidue.add(t_objNode); t_bNewResidue = true; } } } } if ( t_bNewResidue ) { this.m_iBranchingPointsAllResidues++; } if ( t_bNewMonosaccharide ) { this.m_iBranchingPointsOnlyMonosaccharide++; } } } public void visit(Substituent a_objSubstituent) throws GlycoVisitorException { ArrayList<GlycoEdge> t_objLinkages = a_objSubstituent.getChildEdges(); if ( t_objLinkages.size() > 1 ) { this.m_iBranchingPointsAllResidues++; this.m_iBranchingPointsOnlyMonosaccharide++; this.m_aBranchingPointResidue.add(a_objSubstituent); } } public void visit(SugarUnitCyclic a_objCyclic) throws GlycoVisitorException { // nothing to do, cyclic can not have childs } public void visit(SugarUnitAlternative a_objAlternative) throws GlycoVisitorException { throw new GlycoVisitorException("SugarUnitAlternative are not allowed."); } public void visit(UnvalidatedGlycoNode a_objUnvalidated) throws GlycoVisitorException { throw new GlycoVisitorException("UnvalidatedGlycoNodes are not allowed."); } public void visit(GlycoEdge a_objLinkage) throws GlycoVisitorException { // nothing to do } public void visit(SugarUnitRepeat a_objRepeate) throws GlycoVisitorException { GlycoTraverser t_objTraverser = this.getTraverser(this); t_objTraverser.traverseGraph(a_objRepeate); GlycoNode t_objNode = a_objRepeate.getRepeatLinkage().getParent(); GlycoVisitorNodeType t_visType = new GlycoVisitorNodeType(); if ( t_visType.isMonosaccharide(t_objNode)) { if ( t_objNode.getChildEdges().size() == 1 ) { this.m_iBranchingPointsAllResidues++; this.m_aBranchingPointResidue.add(t_objNode); } Integer t_iMonosaccharideCount=0; for (GlycoEdge t_edge : t_objNode.getChildEdges()) { if (t_visType.isMonosaccharide(t_edge.getChild())) { t_iMonosaccharideCount++; } } if (t_iMonosaccharideCount==1) { this.m_iBranchingPointsOnlyMonosaccharide++; this.m_aBranchingPointMonosaccharide.add(t_objNode); } } else { if ( t_objNode.getChildEdges().size() == 1 ) { this.m_iBranchingPointsAllResidues++; this.m_iBranchingPointsOnlyMonosaccharide++; this.m_aBranchingPointResidue.add(t_objNode); } } for (Iterator<UnderdeterminedSubTree> t_iterUnder = a_objRepeate.getUndeterminedSubTrees().iterator(); t_iterUnder.hasNext();) { t_objTraverser = this.getTraverser(this); t_objTraverser.traverseGraph(t_iterUnder.next()); } } }