/// <summary> /// Convert to an identity template library. /// </summary> /// <returns>identity template library</returns> internal IdentityTemplateLibrary ToIdentityTemplateLibrary() { var lib = IdentityTemplateLibrary.Empty(); foreach (var mol in templates) { lib.Add(AtomContainerManipulator.Anonymise(mol)); } return(lib); }
/// <summary> /// Layout a macro cycle (the rest of the ring set is untouched). /// </summary> /// <param name="macrocycle">the macrocycle</param> /// <param name="ringset">the ring set the macrocycle belongs to (may only be it's self)</param> /// <returns>layout was successfully, if false caller fall-back to regular polygons</returns> public static bool Layout(IRing macrocycle, IRingSet ringset) { var anon = RoundUpIfNeeded(AtomContainerManipulator.Anonymise(macrocycle)); var coords = TEMPLATES.GetCoordinates(anon); if (coords.Count == 0) { return(false); } var best = new Vector2[anon.Atoms.Count]; var bestOffset = SelectCoords(coords, best, macrocycle, ringset); for (int i = 0; i < macrocycle.Atoms.Count; i++) { macrocycle.Atoms[i].Point2D = best[(bestOffset + i) % macrocycle.Atoms.Count]; macrocycle.Atoms[i].IsPlaced = true; macrocycle.Atoms[i].SetProperty(MACROCYCLE_ATOM_HINT, true); } macrocycle.IsPlaced = true; return(true); }
public static IReadOnlyList <IBitFingerprint> MakeFingerprintsFromSdf(bool anyAtom, bool anyAtomAnyBond, Dictionary <string, int> timings, TextReader fin, int limit) { var fingerPrinter = new HybridizationFingerprinter(HybridizationFingerprinter.DefaultSize, HybridizationFingerprinter.DefaultSearchDepth); fingerPrinter.SetHashPseudoAtoms(true); IAtomContainer query = null; var data = new List <IBitFingerprint>(); try { Trace.TraceInformation("Read data file in ..."); using (var imdl = new EnumerableSDFReader(fin, builder)) { Trace.TraceInformation("ready"); int moleculeCounter = 0; int fingerprintCounter = 0; Trace.TraceInformation($"Generated Fingerprints: {fingerprintCounter} "); foreach (var m in imdl) { if (!(moleculeCounter < limit || limit == -1)) { break; } moleculeCounter++; if (anyAtom && !anyAtomAnyBond) { query = QueryAtomContainerCreator.CreateAnyAtomContainer(m, false); } else { query = AtomContainerManipulator.Anonymise(m); } try { var time = -DateTime.Now.Ticks / 10000; if (anyAtom || anyAtomAnyBond) { data.Add(fingerPrinter.GetBitFingerprint(query)); fingerprintCounter = fingerprintCounter + 1; } else { data.Add(fingerPrinter.GetBitFingerprint(query)); fingerprintCounter = fingerprintCounter + 1; } time += (DateTime.Now.Ticks / 10000); // store the time var bin = ((int)Math.Floor(time / 10.0)).ToString(NumberFormatInfo.InvariantInfo); if (timings.ContainsKey(bin)) { timings[bin] = (timings[bin]) + 1; } else { timings[bin] = 1; } } catch (Exception exc1) { Trace.TraceInformation($"QueryFingerprintError: from molecule:{moleculeCounter} due to:{exc1.Message}"); // OK, just adds a fingerprint with all ones, so that any // structure will match this template, and leave it up // to substructure match to figure things out var allOnesFingerprint = new BitSetFingerprint(fingerPrinter.Length); for (int i = 0; i < fingerPrinter.Length; i++) { allOnesFingerprint.Set(i); } data.Add(allOnesFingerprint); fingerprintCounter = fingerprintCounter + 1; } if (fingerprintCounter % 2 == 0) { Trace.TraceInformation("\b" + "/"); } else { Trace.TraceInformation("\b" + "\\"); } if (fingerprintCounter % 100 == 0) { Trace.TraceInformation("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b" + "Generated Fingerprints: " + fingerprintCounter + " \n"); } }// while Trace.TraceInformation($"...ready with:{moleculeCounter} molecules\nWrite data...of data vector:{data.Count} fingerprintCounter:{fingerprintCounter}"); } } catch (Exception exc) { Console.Out.WriteLine("Could not read Molecules from file" + " due to: " + exc.Message); } return(data); }