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); }
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(); } }
/// <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); }