public override bool IsLargerThan(HasseNode smallobj) { if (this.HasNodeType(HasseNodeTypes.ROOT)) { return(false); } if (smallobj.HasNodeType(HasseNodeTypes.ROOT)) { return(true); } bool retval = this.hFingerprint.IsLargerThan(((FingerprintChemHasseNode )smallobj).hFingerprint); // if (retval == true) System.Diagnostics.Debugger.Break(); return(retval); }
public override bool IsLargerThan(HasseNode smallobj) { if (smallobj.HasNodeType(HasseNode.HasseNodeTypes.MAX_COMMON_FRAGMENT)) { System.Diagnostics.Debugger.Break(); } if (smallobj.NodeType == HasseNode.HasseNodeTypes.ROOT) { return(true); } if (this.NodeType == HasseNode.HasseNodeTypes.ROOT) { return(false); } bool IsPossiblyLargerThanByFingerprint = ContainsFingerprintOf(((ChemHasseNode)smallobj).fingerprint()); if (TrustFingerprints) { if (IsPossiblyLargerThanByFingerprint) { ; } // is likely to be larger, but we are not sure, needs to be checked else { return(false); // if fingerprints work as they should we are guaranteed that IsLargerThan must be false } } // todo take a away those checks that fingerprints work if (IsPossiblyLargerThanByFingerprint) { // can be a substructure match but need not be //if (matcher.countMatches(smallMol) == 0) //{ // System.Diagnostics.Debug.WriteLine("a fingerprint contained in b fingerprint - but a was not substruc of b"); // System.Diagnostics.Debug.WriteLine("a\t" + smallMol.smiles()); // System.Diagnostics.Debug.WriteLine("b\t" + molecule.smiles()); //} } else { //if (matcher.countMatches(smallMol) != 0) // System.Diagnostics.Debugger.Break(); //we have a match where fp says we certainly have not! } return(ChemObject.IsLargerThan(smallobj)); }
public override bool IsLargerThan(HasseNode smallobj) { if (this.HasNodeType(HasseNodeTypes.ROOT)) { return false; } if (smallobj.HasNodeType(HasseNodeTypes.ROOT)) { return true; } bool retval= this.hFingerprint.IsLargerThan(((FingerprintChemHasseNode )smallobj).hFingerprint ); // if (retval == true) System.Diagnostics.Debugger.Break(); return retval; }
private bool addNode(HasseNode newNode, HasseNode[] AboveTheseNodes, HasseNode[] BelowTheseNodes) { // should return true if node was inserted // or false if corresponding node already exist bool debug = Convert.ToBoolean(DEBUGLEVEL & LOG_INSERTIONS); bool dbgTimings = Convert.ToBoolean(DEBUGLEVEL & LOG_ALL_TIMINGS); sw.Reset(); sw.Start(); if (newNode.Size() < MINIMUM_FRAGMENT_SIZE) return false; // do not add identical objects if (HasseDiagramNodes.ContainsKey(newNode.KeyString)) { // is already there - we will update type, set name, redraw image, then return. HasseDiagramNodes[newNode.KeyString].AddNodeType(newNode.NodeType); if(newNode.HasNodeType ( HasseNode.HasseNodeTypes.REAL )){ string n = newNode.GetName(); HasseDiagramNodes[newNode.KeyString].SetName(n); //if (CREATE_NODE_IMAGE) HasseDiagramNodes[newNode.KeyString].CreateImage(); System.Diagnostics.Debug.WriteLineIf(debug, " Skipping add of " + newNode.KeyString); } return false; } //if (CREATE_NODE_IMAGE) newNode.CreateImage(); CountAdditions += 1; if (DEBUGLEVEL > 0) { System.Diagnostics.Debug.WriteLine("Add Node " + newNode.KeyString + " " + CountAdditions.ToString()); } // loop elements of new object /* foreach (HasseNode Element in newNode.getElementarySubobjects().Values) { if (USE_ELEMENTS) { // add to diagram nodes list if not already there if (!HasseDiagramNodes.ContainsKey(Element.KeyString)) { HasseDiagramNodes.Add(Element.KeyString, Element); //Element.CreateImage(); this.MakeEdge(RootNode, Element); } } // add to elements collection if not there already if (!ElementaryHasseNodes.ContainsKey(Element.KeyString)) ElementaryHasseNodes.Add(Element.KeyString, Element); } */ System.Diagnostics.Debug.WriteLineIf(dbgTimings, " ticks add 1 (init) " + sw.ElapsedTicks.ToString()); sw.Reset(); sw.Start(); System.Diagnostics.Debug.WriteLineIf(debug, "=== Start LUB and GLB for " + newNode.KeyString + " ==="); if (CountAdditions == -1) System.Diagnostics.Debugger.Break(); HasseNodeCollection NodesInGreatestLowerBound = null; HasseNodeCollection NodesInLeastUpperBound = null; FindLUBAndGLB(newNode, ref NodesInLeastUpperBound, ref NodesInGreatestLowerBound); System.Diagnostics.Debug.WriteLineIf(dbgTimings, " ticks 2 (got lub and glb) " + sw.ElapsedTicks.ToString()); sw.Reset(); sw.Start(); System.Diagnostics.Debug.WriteLineIf(debug, "=== Done LUB and GLB ======="); List<HasseEdge> NewlyFormedEdges = InsertNodeBetweenGlbAndLub( newNode, NodesInLeastUpperBound, NodesInGreatestLowerBound, debug); System.Diagnostics.Debug.WriteLineIf(dbgTimings, " ticks 3 (inserted new) " + sw.ElapsedTicks.ToString()); sw.Reset(); sw.Start(); if (Convert.ToBoolean(CHECK_LEVEL & CHECK_ALL)) newNode.validate(); if (MAKE_MCS_AT_ONCE) { FindCommonFragments(newNode); } System.Diagnostics.Debug.WriteLineIf(dbgTimings, " ticks 4 (made MCS)" + sw.ElapsedTicks.ToString()); // The node may be there already, just added, as element if it is both element and real // if (!newNode.HasNodeType(HasseNode.HasseNodeTypes.ELEMENT)) HasseDiagramNodes.Add(newNode.KeyString, newNode); return true; }
private bool addNode(HasseNode newNode, HasseNode[] AboveTheseNodes, HasseNode[] BelowTheseNodes) { // should return true if node was inserted // or false if corresponding node already exist bool debug = Convert.ToBoolean(DEBUGLEVEL & LOG_INSERTIONS); bool dbgTimings = Convert.ToBoolean(DEBUGLEVEL & LOG_ALL_TIMINGS); sw.Reset(); sw.Start(); if (newNode.Size() < MINIMUM_FRAGMENT_SIZE) { return(false); } // do not add identical objects if (HasseDiagramNodes.ContainsKey(newNode.KeyString)) { // is already there - we will update type, set name, redraw image, then return. HasseDiagramNodes[newNode.KeyString].AddNodeType(newNode.NodeType); if (newNode.HasNodeType(HasseNode.HasseNodeTypes.REAL)) { string n = newNode.GetName(); HasseDiagramNodes[newNode.KeyString].SetName(n); //if (CREATE_NODE_IMAGE) HasseDiagramNodes[newNode.KeyString].CreateImage(); System.Diagnostics.Debug.WriteLineIf(debug, " Skipping add of " + newNode.KeyString); } return(false); } //if (CREATE_NODE_IMAGE) newNode.CreateImage(); CountAdditions += 1; if (DEBUGLEVEL > 0) { System.Diagnostics.Debug.WriteLine("Add Node " + newNode.KeyString + " " + CountAdditions.ToString()); } // loop elements of new object /* * foreach (HasseNode Element in newNode.getElementarySubobjects().Values) * { * if (USE_ELEMENTS) * { * // add to diagram nodes list if not already there * if (!HasseDiagramNodes.ContainsKey(Element.KeyString)) * { * HasseDiagramNodes.Add(Element.KeyString, Element); * //Element.CreateImage(); * this.MakeEdge(RootNode, Element); * } * } * // add to elements collection if not there already * if (!ElementaryHasseNodes.ContainsKey(Element.KeyString)) * ElementaryHasseNodes.Add(Element.KeyString, Element); * } */ System.Diagnostics.Debug.WriteLineIf(dbgTimings, " ticks add 1 (init) " + sw.ElapsedTicks.ToString()); sw.Reset(); sw.Start(); System.Diagnostics.Debug.WriteLineIf(debug, "=== Start LUB and GLB for " + newNode.KeyString + " ==="); if (CountAdditions == -1) { System.Diagnostics.Debugger.Break(); } HasseNodeCollection NodesInGreatestLowerBound = null; HasseNodeCollection NodesInLeastUpperBound = null; FindLUBAndGLB(newNode, ref NodesInLeastUpperBound, ref NodesInGreatestLowerBound); System.Diagnostics.Debug.WriteLineIf(dbgTimings, " ticks 2 (got lub and glb) " + sw.ElapsedTicks.ToString()); sw.Reset(); sw.Start(); System.Diagnostics.Debug.WriteLineIf(debug, "=== Done LUB and GLB ======="); List <HasseEdge> NewlyFormedEdges = InsertNodeBetweenGlbAndLub( newNode, NodesInLeastUpperBound, NodesInGreatestLowerBound, debug); System.Diagnostics.Debug.WriteLineIf(dbgTimings, " ticks 3 (inserted new) " + sw.ElapsedTicks.ToString()); sw.Reset(); sw.Start(); if (Convert.ToBoolean(CHECK_LEVEL & CHECK_ALL)) { newNode.validate(); } if (MAKE_MCS_AT_ONCE) { FindCommonFragments(newNode); } System.Diagnostics.Debug.WriteLineIf(dbgTimings, " ticks 4 (made MCS)" + sw.ElapsedTicks.ToString()); // The node may be there already, just added, as element if it is both element and real // if (!newNode.HasNodeType(HasseNode.HasseNodeTypes.ELEMENT)) HasseDiagramNodes.Add(newNode.KeyString, newNode); return(true); }
private void WriteNode(HasseNode N) { //System.Diagnostics.Debug.WriteLine(((ChemHasseNode)N).GetName()); //DotFile.WriteLine("node[shape = rounded];"); DotFile.Write(DoubleQuoted(N.KeyString)); DotFile.Write(" ["); // start node attributes switch (LabelMode) { case labelMode.NO_LABELS: DotFile.Write(" label=\"\" "); //empty label break; case labelMode.USE_NODE_ID: DotFile.Write(" label=" + DoubleQuoted(N.GetID().ToString())); break; case labelMode.USE_MOLNAME: if (((ChemHasseNode)N).GetName() != "") { DotFile.Write(" label=" + DoubleQuoted(((ChemHasseNode)N).GetName())); } else { DotFile.Write(" label=" + DoubleQuoted(N.GetID().ToString())); } break; case labelMode.USE_NODE_KEY: // need not do anything, the node key is shown by default break; case labelMode.USE_NODE_LABEL: DotFile.Write(" label=" + DoubleQuoted(N.LabelText)); break; default: throw new Exception("unhandled labelmode"); } if (N.DrawingColor!="" ) DotFile.Write(" color=" + N.DrawingColor + " "); if (UseImage && N.ImageFileName.Length > 0) { DotFile.Write(" image=\"" + N.ImageFileName + "\""); } if (N.HasNodeType (HasseNode.HasseNodeTypes.REAL) || N.NodeType == HasseNode.HasseNodeTypes.ROOT ) { DotFile.Write(" shape=ellipse "); } else { DotFile.Write(" shape=none "); } DotFile.Write("] "); // end node attributes DotFile.WriteLine(";"); }
private void WriteNode(HasseNode N) { //System.Diagnostics.Debug.WriteLine(((ChemHasseNode)N).GetName()); //DotFile.WriteLine("node[shape = rounded];"); DotFile.Write(DoubleQuoted(N.KeyString)); DotFile.Write(" ["); // start node attributes switch (LabelMode) { case labelMode.NO_LABELS: DotFile.Write(" label=\"\" "); //empty label break; case labelMode.USE_NODE_ID: DotFile.Write(" label=" + DoubleQuoted(N.GetID().ToString())); break; case labelMode.USE_MOLNAME: if (((ChemHasseNode)N).GetName() != "") { DotFile.Write(" label=" + DoubleQuoted(((ChemHasseNode)N).GetName())); } else { DotFile.Write(" label=" + DoubleQuoted(N.GetID().ToString())); } break; case labelMode.USE_NODE_KEY: // need not do anything, the node key is shown by default break; case labelMode.USE_NODE_LABEL: DotFile.Write(" label=" + DoubleQuoted(N.LabelText)); break; default: throw new Exception("unhandled labelmode"); } if (N.DrawingColor != "") { DotFile.Write(" color=" + N.DrawingColor + " "); } if (UseImage && N.ImageFileName.Length > 0) { DotFile.Write(" image=\"" + N.ImageFileName + "\""); } if (N.HasNodeType(HasseNode.HasseNodeTypes.REAL) || N.NodeType == HasseNode.HasseNodeTypes.ROOT) { DotFile.Write(" shape=ellipse "); } else { DotFile.Write(" shape=none "); } DotFile.Write("] "); // end node attributes DotFile.WriteLine(";"); }
public override bool IsLargerThan(HasseNode smallobj) { if (smallobj.HasNodeType(HasseNode.HasseNodeTypes.MAX_COMMON_FRAGMENT)) System.Diagnostics.Debugger.Break(); if (smallobj.NodeType == HasseNode.HasseNodeTypes.ROOT) { return true; } if (this.NodeType == HasseNode.HasseNodeTypes.ROOT) { return false; } bool IsPossiblyLargerThanByFingerprint = ContainsFingerprintOf(((ChemHasseNode)smallobj).fingerprint()); if (TrustFingerprints) { if (IsPossiblyLargerThanByFingerprint) { ; } // is likely to be larger, but we are not sure, needs to be checked else { return false; // if fingerprints work as they should we are guaranteed that IsLargerThan must be false } } // todo take a away those checks that fingerprints work if (IsPossiblyLargerThanByFingerprint) { // can be a substructure match but need not be //if (matcher.countMatches(smallMol) == 0) //{ // System.Diagnostics.Debug.WriteLine("a fingerprint contained in b fingerprint - but a was not substruc of b"); // System.Diagnostics.Debug.WriteLine("a\t" + smallMol.smiles()); // System.Diagnostics.Debug.WriteLine("b\t" + molecule.smiles()); //} } else { //if (matcher.countMatches(smallMol) != 0) // System.Diagnostics.Debugger.Break(); //we have a match where fp says we certainly have not! } return ChemObject.IsLargerThan(smallobj); }
public static void chemtest() { //IndigoTests T = new IndigoTests(); //T.test1(); Indigo indigo = new Indigo(); /* * ChemHasseNode L_ALA = new ChemHasseNode("N[C@@H](C)C(=O)O", HasseNode.HasseNodeTypes.REAL, allNodes); * ChemHasseNode D_ALA = new ChemHasseNode("N[C@H](C)C(=O)O", HasseNode.HasseNodeTypes.REAL, allNodes); * d=L_ALA.GetDifferenceString (D_ALA); * d = D_ALA.GetDifferenceString(L_ALA); */ // HasseDiagram HDM = new HasseDiagram(HasseNodeFactory.NodeType.CHEM ); HasseDiagram HDM = new HasseDiagram(HasseNodeFactory.NodeType.FINGERPRINTCHEM); HasseNodeCollection elements = new HasseNodeCollection(); //ChemHasseNode A = (ChemHasseNode)HDM.AddNode("c1ccccccc[nH]1"); // azonine //ChemHasseNode B = (ChemHasseNode)HDM.AddNode("C12=C(C=NC=C1)NC1=C2C=CC=C1"); // pyrido indol //ChemHasseNode C = (ChemHasseNode)HDM.AddNode("c1cccc2[nH]ccc21"); // indol //FingerprintChemHasseNode A = (FingerprintChemHasseNode)HDM.AddNode("C"); // //FingerprintChemHasseNode B = (FingerprintChemHasseNode)HDM.AddNode("CC"); // //FingerprintChemHasseNode C = (FingerprintChemHasseNode)HDM.AddNode("CN"); // // ChemHasseNode A = (ChemHasseNode)HDM.AddNode(@"[NH3+]C"); //ChemHasseNode B = (ChemHasseNode)HDM.AddNode(@"[NH2]CC"); //bool tst = A.IsLargerThan(B); //tst = B.IsLargerThan(A); //A.GetMaxCommonFragments(A, B); //tst = A.IsLargerThan(C); //tst = C.IsLargerThan(A); // pyridoindol larger than azonine System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.BelowNormal; System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sw.Start(); int count = 0; //foreach (IndigoObject item in indigo.iterateSDFile(@"C:\temp\benzodiazepines.sdf")) //foreach (IndigoObject item in indigo.iterateSDFile(@"C:\temp\monoamtrain_x.sdf")) //foreach (IndigoObject item in indigo.iterateSDFile(@"C:\HassePub\Datasets\Jorissen\compounds_1st.sdf")) //foreach (IndigoObject item in indigo.iterateSDFile(@"C:\HassePub\Datasets\benzodiazepines_v4.sdf")) // foreach (IndigoObject item in indigo.iterateSDFile(@"C:\HassePub\Datasets\small_set.sdf")) // foreach (IndigoObject item in indigo.iterateSDFile(@"C:\HassePub\Datasets\chembl_pyridines.sdf")) //foreach (IndigoObject item in indigo.iterateSDFile(@"C:\HassePub\Datasets\ChEBI_anilines_480-500.sdf")) //foreach (IndigoObject item in indigo.iterateSDFile(@"C:\HassePub\Datasets\ChEBI_valines.sdf")) foreach (IndigoObject item in indigo.iterateSDFile(@"C:\HassePub\Datasets\ChEBI_valines_v21.sdf")) // in pub { if (item.isChiral() == false) { continue; } count++; //System.Diagnostics.Debugger.Break(); if (count > 24) { break; //24 for valines in pub } // HasseNode N = HDM.CreateNewNode(item); //if (N.IsValid()) //{ System.Diagnostics.Stopwatch sw2 = new System.Diagnostics.Stopwatch(); sw2.Start(); try { HasseNode N = HDM.CreateNewNode(item.molfile()); if (item.hasProperty("CHEMBL ID")) { string ChemblID = item.getProperty("CHEMBL ID"); N.SetName(ChemblID); } else if (item.hasProperty("ChEBI ID")) { string ChebiID = item.getProperty("ChEBI ID"); N.SetName(ChebiID); } else { N.SetName(count.ToString()); } HDM.AddNode(N); System.Diagnostics.Debug.WriteLine("--- " + N.KeyString); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine("WARNING: could not add node: " + ex.ToString()); } } List <HasseNode> subset = new List <HasseNode>(); /* * foreach (HasseNode N in HDM.HasseDiagramNodes.Values) * { * if (N.NodeType != HasseNode.HasseNodeTypes.ROOT) * { * float weight = N.Weight(); * N.SetName("w=" + weight.ToString()); * float w = 5F * weight / 29F; * if (w < 1) w = 1F; * if (w > 3.5) w = 3.5F; * // N.CreateImage(w); * N.CreateImage(); * //if (weight > 20) subset.Add(N); * } * * } */ //DotFileWriter DW = new DotFileWriter(HDM.HasseDiagramNodes, subset, "C:\\temp\\testdotfile.dot"); DotFileWriter DW = new DotFileWriter(HDM.HasseDiagramNodes, "C:\\temp\\testdotfile.dot"); int cnt = 0; foreach (HasseNode N in HDM.HasseDiagramNodes.Values) { if ((N.GetType() == typeof(ChemHasseNode) || N.GetType() == typeof(FingerprintChemHasseNode)) && N.NodeType != HasseNode.HasseNodeTypes.ROOT) { cnt++; N.SetName(cnt.ToString()); if (N.GetType() == typeof(ChemHasseNode)) { ((ChemHasseNode )N).CreateImage(); } if (N.GetType() == typeof(FingerprintChemHasseNode)) { ((FingerprintChemHasseNode)N).CreateImage(); } } } DW.SetLabelsToNumericSequence(); DW.SetDrawingColors(); DW.LabelMode = labelMode.NO_LABELS; // for figure 5 DW.directionMode = graphDirection.RIGHT; //DW.LabelMode = labelMode.USE_NODE_LABEL; //DW.LabelMode = labelMode.USE_NODE_ID; DW.UseImage = true; DW.WriteEdgeLabels = false; sw.Stop(); System.Diagnostics.Debug.WriteLine(sw.ElapsedMilliseconds.ToString()); DW.WriteDotFile(); System.Diagnostics.Debug.WriteLine("Nodes: " + HDM.HasseDiagramNodes.Count()); System.Diagnostics.Debug.WriteLine("Diffs: " + HDM.DifferenceNodes.Count()); System.Diagnostics.Debug.WriteLine("Hash: " + HDM.RootNode.HashString()); foreach (HasseNode N in HDM.HasseDiagramNodes.Values) { if (N.HasNodeType(HasseNode.HasseNodeTypes.FRAGMENT)) { ; } // System.Diagnostics.Debug.WriteLine(N.KeyString + " " + N.Weight().ToString() ); } System.Diagnostics.Debug.WriteLine(HasseDiagramStats.Report(HDM.HasseDiagramNodes, HDM.RootNode)); }