/* * 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.io.namespace; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import org.eurocarbdb.MolecularFramework.sugar.BaseType; import org.eurocarbdb.MolecularFramework.sugar.GlycoEdge; import org.eurocarbdb.MolecularFramework.sugar.GlycoGraph; import org.eurocarbdb.MolecularFramework.sugar.GlycoGraphAlternative; import org.eurocarbdb.MolecularFramework.sugar.GlycoNode; import org.eurocarbdb.MolecularFramework.sugar.GlycoconjugateException; import org.eurocarbdb.MolecularFramework.sugar.Linkage; import org.eurocarbdb.MolecularFramework.sugar.LinkageType; import org.eurocarbdb.MolecularFramework.sugar.Modification; 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.GlycoTraverserTree; import org.eurocarbdb.MolecularFramework.util.visitor.GlycoVisitor; import org.eurocarbdb.MolecularFramework.util.visitor.GlycoVisitorException; import org.eurocarbdb.resourcesdb.GlycanNamescheme; import org.eurocarbdb.resourcesdb.ResourcesDbException; import org.eurocarbdb.resourcesdb.glycoconjugate_derived.EcdbAnomer; import org.eurocarbdb.resourcesdb.glycoconjugate_derived.EcdbBaseType; import org.eurocarbdb.resourcesdb.glycoconjugate_derived.EcdbModification; import org.eurocarbdb.resourcesdb.glycoconjugate_derived.EcdbMonosaccharide; import org.eurocarbdb.resourcesdb.glycoconjugate_derived.EcdbSuperclass; import org.eurocarbdb.resourcesdb.io.MonosaccharideConversion; import org.eurocarbdb.resourcesdb.io.MonosaccharideExchangeObject; import org.eurocarbdb.resourcesdb.io.SubstituentExchangeObject; /** * @author Logan * */ public class GlycoVisitorFromGlycoCTIsolated implements GlycoVisitor { private Sugar m_objNewSugar = null; private MonosaccharideConversion m_objConverter = null; private GlycoGraph m_objUnit = null; private HashMap<GlycoNode,GlycoNode> m_hashResidues = new HashMap<GlycoNode,GlycoNode>(); private GlycanNamescheme m_strSchema = GlycanNamescheme.GLYCOSCIENCES; private GlycoTraverser m_objTraverser = null; private SugarUnitRepeat m_objRepeat = null; private UnderdeterminedSubTree m_objSubTree = null; private ArrayList<AlternativeMapping> m_aAlternative = new ArrayList<AlternativeMapping>(); private GlycoGraphAlternative m_objAlternative = null; /** * @param residueTranslator */ public GlycoVisitorFromGlycoCTIsolated(MonosaccharideConversion a_objTranslator) { super(); this.m_objConverter = a_objTranslator; } public GlycoVisitorFromGlycoCTIsolated(MonosaccharideConversion a_objTranslator, GlycanNamescheme a_strSchema) { super(); this.m_objConverter = a_objTranslator; this.m_strSchema = a_strSchema; } /** * @throws GlycoVisitorException * @see de.glycosciences.MolecularFrameWork.util.GlycoVisitor#getTraverser(de.glycosciences.MolecularFrameWork.util.GlycoVisitor) */ public GlycoTraverser getTraverser(GlycoVisitor a_objVisitor) throws GlycoVisitorException { return new GlycoTraverserTree(a_objVisitor); } /** * @see de.glycosciences.MolecularFrameWork.util.GlycoVisitor#clear() */ public void clear() { this.m_objNewSugar = null; this.m_objUnit = null; this.m_hashResidues.clear(); this.m_objRepeat = null; this.m_objSubTree = null; this.m_aAlternative.clear(); this.m_objAlternative = null; } /** * @return */ public Sugar getNormalizedSugar() { return this.m_objNewSugar; } /** * @see de.glycosciences.MolecularFrameWork.util.GlycoVisitor#visit(de.glycosciences.MolecularFrameWork.sugar.Linkage) */ public void visit(GlycoEdge a_objLinkage) throws GlycoVisitorException { // nothing to do } /** * @see org.eurocarbdb.MolecularFramework.util.visitor.GlycoVisitor#visit(org.eurocarbdb.MolecularFramework.sugar.SugarUnitCyclic) */ public void visit(SugarUnitCyclic a_objCyclic) throws GlycoVisitorException { if ( this.m_objTraverser.getState() == GlycoTraverser.ENTER ) { try { GlycoNode t_objStart = this.m_hashResidues.get(a_objCyclic.getCyclicStart()); GlycoEdge t_objEdge = a_objCyclic.getParentEdge(); if ( t_objEdge == null ) { throw new GlycoVisitorException("Critical error in cyclic unit, no parent edge."); } GlycoNode t_objParent = this.m_hashResidues.get(a_objCyclic.getParentNode()); if ( t_objStart == null || t_objParent == null ) { throw new GlycoVisitorException("Critical error in cyclic unit."); } // copy linkage t_objEdge = t_objEdge.copy(); // reset to unvalidated Linkage t_objLinkage; for (Iterator<Linkage> t_iterLinkages = t_objEdge.getGlycosidicLinkages().iterator(); t_iterLinkages.hasNext();) { t_objLinkage = t_iterLinkages.next(); t_objLinkage.setParentLinkageType(LinkageType.UNVALIDATED); t_objLinkage.setChildLinkageType(LinkageType.UNVALIDATED); } this.m_objUnit.addEdge(t_objParent,t_objStart,t_objEdge); } catch (GlycoconjugateException e) { throw new GlycoVisitorException("Could not create cyclic residue : " + e.getMessage(),e); } } } /** * @see org.eurocarbdb.MolecularFramework.util.visitor.GlycoVisitor#visit(org.eurocarbdb.MolecularFramework.sugar.UnvalidatedGlycoNode) */ public void visit(UnvalidatedGlycoNode a_objUnvalidated) throws GlycoVisitorException { throw new GlycoVisitorException("UnvalidatedGlycoNode are not allowed for this visitor."); } /** * @see de.glycosciences.MolecularFrameWork.util.GlycoVisitor#visit(de.glycosciences.MolecularFrameWork.sugar.SugarUnitRepeat) */ public void visit(SugarUnitRepeat a_objRepeate) throws GlycoVisitorException { if ( this.m_objTraverser.getState() == GlycoTraverser.ENTER ) { GlycoVisitorFromGlycoCTIsolated t_objVisitor = new GlycoVisitorFromGlycoCTIsolated( this.m_objConverter , this.m_strSchema); SugarUnitRepeat t_objUnit = t_objVisitor.start(a_objRepeate); this.m_hashResidues.put( a_objRepeate , t_objUnit ); try { this.m_objUnit.addNode(t_objUnit); } catch (GlycoconjugateException e) { throw new GlycoVisitorException("Could not create Repeat : ",e); } this.copyParentLinkage(a_objRepeate.getParentEdge(),t_objUnit); } } /** * @see org.eurocarbdb.MolecularFramework.util.visitor.GlycoVisitor#visit(org.eurocarbdb.MolecularFramework.sugar.SugarUnitAlternative) */ public void visit(SugarUnitAlternative a_objAlternative) throws GlycoVisitorException { if ( this.m_objTraverser.getState() == GlycoTraverser.ENTER ) { SugarUnitAlternative t_objCopy = new SugarUnitAlternative(); this.copyParentLinkage(a_objAlternative.getParentEdge(),t_objCopy); for (Iterator<GlycoGraphAlternative> t_iterGraphs = a_objAlternative.getAlternatives().iterator(); t_iterGraphs.hasNext();) { GlycoGraphAlternative t_objGraph = t_iterGraphs.next(); GlycoVisitorFromGlycoCTIsolated t_objVisitor = new GlycoVisitorFromGlycoCTIsolated( this.m_objConverter , this.m_strSchema); GlycoGraphAlternative t_objGraphCopy = t_objVisitor.start(t_objGraph,t_objCopy); this.m_aAlternative.add( new AlternativeMapping( a_objAlternative,t_objGraph, t_objCopy, t_objGraphCopy, t_objVisitor.getResidueMapping())); } this.m_hashResidues.put( a_objAlternative , t_objCopy ); try { this.m_objUnit.addNode(t_objCopy); } catch (GlycoconjugateException e) { throw new GlycoVisitorException("Could not create alternative : ",e); } } } /** * @see de.glycosciences.MolecularFrameWork.util.GlycoVisitor#visit(de.glycosciences.MolecularFrameWork.sugar.NonMonosaccharide) */ public void visit(NonMonosaccharide a_objResidue) throws GlycoVisitorException { if ( this.m_objTraverser.getState() == GlycoTraverser.ENTER ) { UnvalidatedGlycoNode t_objNode = new UnvalidatedGlycoNode(); try { // String t_strName = this.m_objConverter.convertAglycon(a_objResidue.getName(), // GlycanNamescheme.GLYCOCT, // this.m_strSchema); // t_objNode.setName(t_strName); t_objNode.setName(a_objResidue.getName()); } catch (GlycoconjugateException e) { throw new GlycoVisitorException(e.getMessage(),e); } // catch (ResourcesDbException e) // { // throw new GlycoVisitorException(e.getMessage(),e); // } this.m_hashResidues.put(a_objResidue,t_objNode); try { this.m_objUnit.addNode(t_objNode); } catch (GlycoconjugateException e) { throw new GlycoVisitorException(e.getMessage(),e); } // copy linkage this.copyParentLinkage(a_objResidue.getParentEdge(),t_objNode); } } /** * @see de.glycosciences.MolecularFrameWork.util.GlycoVisitor#visit(de.glycosciences.MolecularFrameWork.sugar.Monosaccharide) */ public void visit(Monosaccharide a_objMonosaccharid) throws GlycoVisitorException { if ( this.m_objTraverser.getState() == GlycoTraverser.ENTER ) { // do normalisation try { MonosaccharideExchangeObject t_objData = new MonosaccharideExchangeObject(); t_objData.setBasetype( this.createBaseType(a_objMonosaccharid)); // normalise t_objData = this.m_objConverter.convertMonosaccharide(t_objData, GlycanNamescheme.GLYCOCT, this.m_strSchema); // get name UnvalidatedGlycoNode t_objNonMS = new UnvalidatedGlycoNode(); t_objNonMS.setName(t_objData.getMonosaccharideName()); this.m_hashResidues.put(a_objMonosaccharid,t_objNonMS); this.m_objUnit.addNode(t_objNonMS); // copy parent this.copyParentLinkage(a_objMonosaccharid.getParentEdge(),t_objNonMS); } catch (ResourcesDbException e) { // not a monosaccharide? throw new GlycoVisitorException("Unable to translate " + a_objMonosaccharid.getGlycoCTName() + " : " + e.getMessage(),e); } catch (GlycoconjugateException e) { throw new GlycoVisitorException(e.getMessage(),e); } catch (org.eurocarbdb.resourcesdb.glycoconjugate_derived.GlycoconjugateException e) { throw new GlycoVisitorException(e.getMessage(),e); } } } /** * @see org.eurocarbdb.MolecularFramework.util.visitor.GlycoVisitor#visit(org.eurocarbdb.MolecularFramework.sugar.Substituent) */ public void visit(Substituent a_objSubstituent) throws GlycoVisitorException { if ( this.m_objTraverser.getState() == GlycoTraverser.ENTER ) { // translate Substitutent SubstituentExchangeObject t_objSubst = new SubstituentExchangeObject(GlycanNamescheme.GLYCOCT); t_objSubst.setName( a_objSubstituent.getSubstituentType().getName() ); int t_iCounter = 0; // parents if ( a_objSubstituent.getParentEdge() != null ) { for (Iterator<Linkage> t_iterParents = a_objSubstituent.getParentEdge().getGlycosidicLinkages().iterator(); t_iterParents.hasNext();) { t_iCounter++; Linkage t_objElement = t_iterParents.next(); if ( t_iCounter == 1 ) { t_objSubst.setLinkagetype1( this.createLinkageType(t_objElement.getParentLinkageType()) ); t_objSubst.setSubstituentPosition1(t_objElement.getChildLinkages()); } else if ( t_iCounter == 2 ) { t_objSubst.setLinkagetype2( this.createLinkageType(t_objElement.getParentLinkageType())); t_objSubst.setSubstituentPosition2(t_objElement.getChildLinkages()); } else if ( t_iCounter == 3 ) { t_objSubst.setLinkagetype3( this.createLinkageType(t_objElement.getParentLinkageType())); t_objSubst.setSubstituentPosition3(t_objElement.getChildLinkages()); } else { throw new GlycoVisitorException("Substitutent " + a_objSubstituent.getSubstituentType().getName() + " has too many connections."); } } } // childs for (Iterator<GlycoEdge> t_iterChilds = a_objSubstituent.getChildEdges().iterator(); t_iterChilds.hasNext();) { for (Iterator<Linkage> t_iterLinkages = t_iterChilds.next().getGlycosidicLinkages().iterator();t_iterLinkages.hasNext();) { t_iCounter++; Linkage t_objElement = t_iterLinkages.next(); if ( t_iCounter == 1 ) { t_objSubst.setLinkagetype1( this.createLinkageType(t_objElement.getChildLinkageType()) ); t_objSubst.setSubstituentPosition1(t_objElement.getChildLinkages()); } else if ( t_iCounter == 2 ) { t_objSubst.setLinkagetype2( this.createLinkageType(t_objElement.getChildLinkageType())); t_objSubst.setSubstituentPosition2(t_objElement.getChildLinkages()); } else if ( t_iCounter == 3 ) { t_objSubst.setLinkagetype3( this.createLinkageType(t_objElement.getChildLinkageType())); t_objSubst.setSubstituentPosition3(t_objElement.getChildLinkages()); } else { throw new GlycoVisitorException("Substitutent " + a_objSubstituent.getSubstituentType().getName() + " has too many connections."); } } } // do translation try { t_objSubst = this.m_objConverter.convertSubstituent(t_objSubst,GlycanNamescheme.GLYCOCT,this.m_strSchema); UnvalidatedGlycoNode t_objNew = new UnvalidatedGlycoNode(); t_objNew.setName(t_objSubst.getName()); this.m_hashResidues.put(a_objSubstituent,t_objNew); this.m_objUnit.addNode(t_objNew); // copy parent linkage this.copyParentLinkage(a_objSubstituent.getParentEdge(),t_objNew); } catch (ResourcesDbException e) { throw new GlycoVisitorException("Unable to translate " + a_objSubstituent.getSubstituentType().getName() + " : " + e.getMessage(),e); } catch (GlycoconjugateException e) { throw new GlycoVisitorException(e.getMessage(),e); } } } /** * @param childLinkageType * @return * @throws GlycoVisitorException * @throws org.eurocarbdb.glycoconjugate.GlycoconjugateException */ private org.eurocarbdb.resourcesdb.glycoconjugate_derived.LinkageType createLinkageType(LinkageType a_objLinkageType) throws GlycoVisitorException { try { return org.eurocarbdb.resourcesdb.glycoconjugate_derived.LinkageType.forName(a_objLinkageType.getType()); } catch (org.eurocarbdb.resourcesdb.glycoconjugate_derived.GlycoconjugateException e) { throw new GlycoVisitorException(e.getMessage(),e); } } /** * @param sugar * @throws GlycoVisitorException */ public void start(Sugar a_objSugar) throws GlycoVisitorException { this.clear(); if ( this.m_objConverter != null ) { // create new Sugar object this.m_objNewSugar = new Sugar(); this.m_objUnit = this.m_objNewSugar; // traverse Sugar and copy to new sugar this.m_objTraverser = this.getTraverser(this); this.m_objTraverser.traverseGraph(a_objSugar); // speczial trees try { for (Iterator<UnderdeterminedSubTree> t_iterSpezialTrees = a_objSugar.getUndeterminedSubTrees().iterator(); t_iterSpezialTrees.hasNext();) { GlycoVisitorFromGlycoCTIsolated t_objVisitor = new GlycoVisitorFromGlycoCTIsolated( this.m_objConverter , this.m_strSchema); UnderdeterminedSubTree t_objSubtreeOriginal = t_iterSpezialTrees.next(); UnderdeterminedSubTree t_objSubtree = t_objVisitor.start(t_objSubtreeOriginal); this.m_objNewSugar.addUndeterminedSubTree(t_objSubtree); // copy properties GlycoEdge t_objEdge = t_objSubtreeOriginal.getConnection().copy(); // reset to unvalidated Linkage t_objLinkage; for (Iterator<Linkage> t_iterLinkages = t_objEdge.getGlycosidicLinkages().iterator(); t_iterLinkages.hasNext();) { t_objLinkage = t_iterLinkages.next(); t_objLinkage.setParentLinkageType(LinkageType.UNVALIDATED); t_objLinkage.setChildLinkageType(LinkageType.UNVALIDATED); } t_objSubtree.setConnection( t_objEdge ); t_objSubtree.setProbability( t_objSubtreeOriginal.getProbabilityLower() , t_objSubtreeOriginal.getProbabilityUpper() ); // copy parents for (Iterator<GlycoNode> t_iterParents = t_objSubtreeOriginal.getParents().iterator(); t_iterParents.hasNext();) { GlycoNode t_objParent = this.m_hashResidues.get(t_iterParents.next()); if ( t_objParent == null ) { throw new GlycoVisitorException("Crictial error by adding null as a parent of a UnderdeterminedSubTree."); } this.m_objNewSugar.addUndeterminedSubTreeParent(t_objSubtree, t_objParent); } } // correkt alternative attache positions for (Iterator<AlternativeMapping> t_iterAlternative = this.m_aAlternative.iterator(); t_iterAlternative.hasNext();) { AlternativeMapping t_objAlternative = t_iterAlternative.next(); GlycoNode t_objInnerOld; GlycoNode t_objInnerNew; GlycoNode t_objOuterOld; GlycoNode t_objOuterNew; HashMap<GlycoNode,GlycoNode> t_hMapNew = new HashMap<GlycoNode,GlycoNode>(); HashMap<GlycoNode,GlycoNode> t_hMapOld = t_objAlternative.getGraphOriginal().getLeadOutNodeToNode(); HashMap<GlycoNode,GlycoNode> t_hIntern = t_objAlternative.getMapping(); for (Iterator<GlycoNode> t_iterPositions = t_hMapOld.keySet().iterator(); t_iterPositions.hasNext();) { // for each old lead out t_objOuterOld = t_iterPositions.next(); t_objOuterNew = this.m_hashResidues.get(t_objOuterOld); if ( t_objOuterNew == null ) { throw new GlycoconjugateException("Error child attache position of alternative graph was not translated."); } t_objInnerOld = t_hMapOld.get(t_objOuterOld); t_objInnerNew = t_hIntern.get(t_objInnerOld); if ( t_objOuterNew == null ) { throw new GlycoconjugateException("Error child inner attache position of alternative graph was not translated."); } t_hMapNew.put(t_objOuterNew, t_objInnerNew); } t_objAlternative.getCopy().setLeadOutNodeToNode(t_hMapNew,t_objAlternative.getGraphCopy()); } } catch (GlycoconjugateException e) { throw new GlycoVisitorException(e.getMessage(),e); } } } /** * @param sugar * @throws GlycoVisitorException */ private SugarUnitRepeat start(SugarUnitRepeat a_objSugar) throws GlycoVisitorException { this.clear(); if ( this.m_objConverter != null ) { // create new Sugar object this.m_objRepeat = new SugarUnitRepeat(); this.m_objUnit = this.m_objRepeat; // traverse Sugar and fill Residue Hashmap this.m_objTraverser = this.getTraverser(this); this.m_objTraverser.traverseGraph(a_objSugar); // copie repeat this.m_objRepeat.setMinRepeatCount( a_objSugar.getMinRepeatCount() ); this.m_objRepeat.setMaxRepeatCount( a_objSugar.getMaxRepeatCount() ); try { // repeat linkage GlycoEdge t_objOringal = a_objSugar.getRepeatLinkage(); GlycoEdge t_objInternal = t_objOringal.copy(); Linkage t_objLinkage; for (Iterator<Linkage> t_iterLinkages = t_objInternal.getGlycosidicLinkages().iterator(); t_iterLinkages.hasNext();) { t_objLinkage = t_iterLinkages.next(); t_objLinkage.setParentLinkageType(LinkageType.UNVALIDATED); t_objLinkage.setChildLinkageType(LinkageType.UNVALIDATED); } this.m_objRepeat.setRepeatLinkage(t_objInternal, this.m_hashResidues.get(t_objOringal.getParent()), this.m_hashResidues.get(t_objOringal.getChild())); // speczial trees for (Iterator<UnderdeterminedSubTree> t_iterSpezialTrees = a_objSugar.getUndeterminedSubTrees().iterator(); t_iterSpezialTrees.hasNext();) { GlycoVisitorFromGlycoCTIsolated t_objVisitor = new GlycoVisitorFromGlycoCTIsolated( this.m_objConverter , this.m_strSchema ); UnderdeterminedSubTree t_objSubtreeOriginal = t_iterSpezialTrees.next(); UnderdeterminedSubTree t_objSubtree = t_objVisitor.start(t_objSubtreeOriginal); this.m_objRepeat.addUndeterminedSubTree(t_objSubtree); // copy properties GlycoEdge t_objEdge = t_objSubtreeOriginal.getConnection().copy(); // reset to unvalidated for (Iterator<Linkage> t_iterLinkages = t_objEdge.getGlycosidicLinkages().iterator(); t_iterLinkages.hasNext();) { t_objLinkage = t_iterLinkages.next(); t_objLinkage.setParentLinkageType(LinkageType.UNVALIDATED); t_objLinkage.setChildLinkageType(LinkageType.UNVALIDATED); } t_objSubtree.setConnection( t_objEdge ); t_objSubtree.setProbability( t_objSubtreeOriginal.getProbabilityLower() , t_objSubtreeOriginal.getProbabilityUpper() ); // copy parents for (Iterator<GlycoNode> t_iterParents = t_objSubtreeOriginal.getParents().iterator(); t_iterParents.hasNext();) { GlycoNode t_objParent = this.m_hashResidues.get(t_iterParents.next()); if ( t_objParent == null ) { throw new GlycoVisitorException("Crictial error by adding null as a parent of a UnderdeterminedSubTree."); } this.m_objRepeat.addUndeterminedSubTreeParent(t_objSubtree, t_objParent); } } // correkt alternative attache positions for (Iterator<AlternativeMapping> t_iterAlternative = this.m_aAlternative.iterator(); t_iterAlternative.hasNext();) { AlternativeMapping t_objAlternative = t_iterAlternative.next(); GlycoNode t_objInnerOld; GlycoNode t_objInnerNew; GlycoNode t_objOuterOld; GlycoNode t_objOuterNew; HashMap<GlycoNode,GlycoNode> t_hMapNew = new HashMap<GlycoNode,GlycoNode>(); HashMap<GlycoNode,GlycoNode> t_hMapOld = t_objAlternative.getGraphOriginal().getLeadOutNodeToNode(); HashMap<GlycoNode,GlycoNode> t_hIntern = t_objAlternative.getMapping(); for (Iterator<GlycoNode> t_iterPositions = t_hMapOld.keySet().iterator(); t_iterPositions.hasNext();) { // for each old lead out t_objOuterOld = t_iterPositions.next(); t_objOuterNew = this.m_hashResidues.get(t_objOuterOld); if ( t_objOuterNew == null ) { throw new GlycoconjugateException("Error child attache position of alternative graph was not translated."); } t_objInnerOld = t_hMapOld.get(t_objOuterOld); t_objInnerNew = t_hIntern.get(t_objInnerOld); if ( t_objOuterNew == null ) { throw new GlycoconjugateException("Error child inner attache position of alternative graph was not translated."); } t_hMapNew.put(t_objOuterNew, t_objInnerNew); } t_objAlternative.getCopy().setLeadOutNodeToNode(t_hMapNew,t_objAlternative.getGraphCopy()); } } catch (GlycoconjugateException e) { throw new GlycoVisitorException(e.getMessage(),e); } } return this.m_objRepeat; } /** * @param subtreeOriginal * @return * @throws GlycoVisitorException */ private UnderdeterminedSubTree start(UnderdeterminedSubTree a_objSubtree) throws GlycoVisitorException { this.clear(); if ( this.m_objConverter != null ) { // create new Sugar object this.m_objSubTree = new UnderdeterminedSubTree(); this.m_objUnit = this.m_objSubTree; // traverse Sugar and fill Residue Hashmap this.m_objTraverser = this.getTraverser(this); this.m_objTraverser.traverseGraph(a_objSubtree); } return this.m_objSubTree; } private void copyParentLinkage(GlycoEdge a_objOrigin, GlycoNode a_objNode) throws GlycoVisitorException { if ( a_objOrigin != null ) { GlycoNode t_objParent = this.m_hashResidues.get(a_objOrigin.getParent()); if ( t_objParent == null ) { throw new GlycoVisitorException("Critical error while translating: could not found a parent residue."); } GlycoEdge t_objNewLinkage; try { t_objNewLinkage = a_objOrigin.copy(); Linkage t_objLinkage; for (Iterator<Linkage> t_iterLinkages = t_objNewLinkage.getGlycosidicLinkages().iterator(); t_iterLinkages.hasNext();) { t_objLinkage = t_iterLinkages.next(); t_objLinkage.setParentLinkageType(LinkageType.UNVALIDATED); t_objLinkage.setChildLinkageType(LinkageType.UNVALIDATED); } this.m_objUnit.addEdge(t_objParent,a_objNode,t_objNewLinkage); } catch (GlycoconjugateException e) { throw new GlycoVisitorException(e.getMessage(),e); } } } /** * @param monosaccharid * @return * @throws GlycoconjugateException * @throws org.eurocarbdb.glycoconjugate.GlycoconjugateException */ private EcdbMonosaccharide createBaseType(Monosaccharide a_objMS) throws org.eurocarbdb.resourcesdb.glycoconjugate_derived.GlycoconjugateException, GlycoconjugateException { // anomer & superclass EcdbMonosaccharide t_objMS = new EcdbMonosaccharide( EcdbAnomer.forName( a_objMS.getAnomer().getSymbol().charAt(0) ), EcdbSuperclass.forCAtoms( a_objMS.getSuperclass().getCAtomCount())); // ring Integer t_objStart; Integer t_objEnd; if ( a_objMS.getRingEnd() == Monosaccharide.UNKNOWN_RING ) { t_objEnd = EcdbMonosaccharide.UNKNOWN_RING; } else { if ( a_objMS.getRingEnd() == Monosaccharide.OPEN_CHAIN ) { t_objEnd = EcdbMonosaccharide.OPEN_CHAIN; } else { t_objEnd = a_objMS.getRingEnd(); } } if ( a_objMS.getRingStart() == Monosaccharide.UNKNOWN_RING ) { t_objStart = EcdbMonosaccharide.UNKNOWN_RING; } else { if ( a_objMS.getRingStart() == Monosaccharide.OPEN_CHAIN ) { t_objStart = Monosaccharide.OPEN_CHAIN; } else { t_objStart = a_objMS.getRingStart(); } } t_objMS.setRing(t_objStart,t_objEnd); // basetype for (Iterator<BaseType> t_iterBasetype = a_objMS.getBaseType().iterator(); t_iterBasetype.hasNext();) { t_objMS.addBaseType(EcdbBaseType.forName(t_iterBasetype.next().getName())); } // modification for (Iterator<Modification> t_iterModification = a_objMS.getModification().iterator(); t_iterModification.hasNext();) { t_objMS.addModification( this.createModification(t_iterModification.next())); } return t_objMS; } private EcdbModification createModification(Modification a_objModification) throws org.eurocarbdb.resourcesdb.glycoconjugate_derived.GlycoconjugateException { if ( a_objModification.hasPositionTwo() ) { return new EcdbModification(a_objModification.getName(),a_objModification.getPositionOne(),a_objModification.getPositionTwo()); } return new EcdbModification(a_objModification.getName(),a_objModification.getPositionOne()); } /** * parent and child connections are not translated * @param alternative * @return * @throws GlycoVisitorException */ private GlycoGraphAlternative start(GlycoGraphAlternative a_objAlternative,SugarUnitAlternative a_objAlternativeUnit) throws GlycoVisitorException { this.clear(); if ( this.m_objConverter != null ) { try { // create new Sugar object this.m_objAlternative = new GlycoGraphAlternative(); this.m_objUnit = this.m_objAlternative; a_objAlternativeUnit.addAlternative(this.m_objAlternative); // traverse Sugar and fill Residue Hashmap this.m_objTraverser = this.getTraverser(this); this.m_objTraverser.traverseGraph(a_objAlternative); // copy parent connection information GlycoNode t_objNode = a_objAlternative.getLeadInNode(); if ( t_objNode != null ) { t_objNode = this.m_hashResidues.get(t_objNode); if ( t_objNode == null ) { throw new GlycoVisitorException("Error translating alternative parent attach node."); } a_objAlternativeUnit.setLeadInNode(t_objNode,this.m_objAlternative); } } catch (GlycoconjugateException e) { throw new GlycoVisitorException(e.getMessage(),e); } } return this.m_objAlternative; } private HashMap<GlycoNode,GlycoNode> getResidueMapping() { return this.m_hashResidues; } public void setNameScheme(GlycanNamescheme a_strSchema ) { this.m_strSchema =a_strSchema; } }