Пример #1
0
        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);
        }
Пример #2
0
        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;
 }
Пример #4
0
        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;
        }
Пример #5
0
        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);
        }
Пример #6
0
        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(";");
        }
Пример #7
0
        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(";");
        }
Пример #8
0
        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);
        }
Пример #9
0
        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));
        }