Exemple #1
0
        public List <GlycanTreeNode> GetNodeinLevel(int argDistance)
        {
            List <GlycanTreeNode> Level = new List <GlycanTreeNode>();

            foreach (GlycanTreeNode T in _tree.FetchAllGlycanNode())
            {
                if (T.DistanceRoot == argDistance)
                {
                    Level.Add(T);
                }
            }
            return(Level);
        }
Exemple #2
0
        public void AddGlycanToStructure(GlycanTreeNode argAddTree, int argParentID)
        {
            GlycanTreeNode Parent = GetGlycanTreeByID(argParentID);

            if (Parent != null)
            {
                foreach (GlycanTreeNode GT in argAddTree.FetchAllGlycanNode())
                {
                    GT.NodeID = _nextID;
                    _nextID++;
                }
                argAddTree.Parent = Parent;
                Parent.AddGlycanSubTree(argAddTree);
                // Parent.UpdateGlycans();
                Parent.SortSubTree();
                _IUPAC = _tree.GetIUPACString();
            }
        }
Exemple #3
0
        /// <summary>
        /// Check if this tree obey N-Linked Core rules: 2 HexNex + 3 Hex, Branching is high man, complex. hybrid
        /// </summary>
        /// <returns></returns>
        public bool isObyeNLinkedCore()
        {
            //Node 1
            GlycanTreeNode CheckNode  = _tree;
            int            NoOfHexNac = 0;
            int            NoOfHex    = 0;
            int            NoOfDeHex  = 0;

            if (CheckNode.GlycanType != Glycan.Type.HexNAc) //1st Node Only can be HexNac
            {
                return(false);
            }
            if (CheckNode.Subtrees != null)  //1st Node can only link to one HexNac and multiple DeHex
            {
                foreach (GlycanTreeNode SubTree in CheckNode.Subtrees)
                {
                    if (SubTree.GlycanType == Glycan.Type.HexNAc)
                    {
                        NoOfHexNac++;
                    }
                    else if (SubTree.GlycanType == Glycan.Type.DeHex)
                    {
                        NoOfDeHex++;
                    }
                }
                if (NoOfHexNac > 1 || (NoOfHexNac + NoOfDeHex != CheckNode.Subtrees.Count))
                {
                    return(false);
                }
            }
            if (CheckNode.Subtrees.Count == NoOfDeHex)
            {
                return(true);
            }

            //Node 2
            CheckNode  = CheckNode.Subtrees[0]; //DeHex will be sort to the end of list
            NoOfHexNac = 0;
            NoOfHex    = 0;
            NoOfDeHex  = 0;
            if (CheckNode.GlycanType != Glycan.Type.HexNAc)//2nd Node Only can be HexNac
            {
                return(false);
            }
            if (CheckNode.Subtrees != null)  //2nd Node can only link to one Hex and multiple DeHex
            {
                foreach (GlycanTreeNode SubTree in CheckNode.Subtrees)
                {
                    if (SubTree.GlycanType == Glycan.Type.Hex)
                    {
                        NoOfHex++;
                    }
                    else if (SubTree.GlycanType == Glycan.Type.DeHex)
                    {
                        NoOfDeHex++;
                    }
                }
                if (NoOfDeHex == CheckNode.Subtrees.Count)
                {
                    return(true);
                }
                if (NoOfHex != 1 || (NoOfHex + NoOfDeHex != CheckNode.Subtrees.Count))
                {
                    return(false);
                }
            }
            else
            {
                return(true);
            }

            //Node 3
            CheckNode  = CheckNode.Subtrees[0]; //DeHex will be sort to the end of list
            NoOfHexNac = 0;
            NoOfHex    = 0;
            NoOfDeHex  = 0;
            if (CheckNode.GlycanType != Glycan.Type.Hex)//3rd Node Only can be Hex
            {
                return(false);
            }
            if (CheckNode.Subtrees != null)  //3rd Node can only link to one HexNac and up to two Hex
            {
                foreach (GlycanTreeNode SubTree in CheckNode.Subtrees)
                {
                    if (SubTree.GlycanType == Glycan.Type.Hex)
                    {
                        NoOfHex++;
                    }
                    else if (SubTree.GlycanType == Glycan.Type.HexNAc)
                    {
                        NoOfHexNac++;
                    }
                }
                if (NoOfHex > 2 || NoOfHexNac > 1)
                {
                    return(false);
                }
                if (NoOfHexNac + NoOfHex != CheckNode.Subtrees.Count)
                {
                    return(false);
                }
                if (CheckNode.Subtrees.Count == 1)
                {
                    if (!(NoOfHex == 1 || NoOfHexNac == 1))
                    {
                        return(false);
                    }
                    if (NoOfHexNac == 1 && CheckNode.Subtrees[0].Subtrees != null) //bisecting no child
                    {
                        return(false);
                    }
                    foreach (GlycanTreeNode ChildTree in CheckNode.FetchAllGlycanNode())
                    {
                        if (ChildTree.Subtrees != null && ChildTree.Subtrees.Count > 1)
                        {
                            return(false);
                        }
                    }
                }
                else
                {
                    if (CheckNode.Subtrees.Count != NoOfHex + NoOfHexNac)
                    {
                        return(false);
                    }
                }
            }
            else
            {
                return(true);
            }

            ////check branch can be either high man, hybrid or complex
            foreach (GlycanTreeNode SubTree in CheckNode.Subtrees)
            {
                if (SubTree.GlycanType == Glycan.Type.Hex)
                {
                    if (SubTree.NoOfTotalGlycan - SubTree.NoOfHex > 0 && SubTree.NoOfHexNac == 0)
                    {
                        return(false);
                    }
                }
                else if (SubTree.GlycanType == Glycan.Type.HexNAc) //Bisecting
                {
                    if (SubTree.Subtrees != null)
                    {
                        return(false);
                    }
                }
                else
                {
                    return(false);
                }
            }
            return(true);
        }