/*
* 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;
}
}