/// <summary> /// Initialize for any structure hilighting /// </summary> void InitializeStructureHilighting() { QueryColumn qc = null; if (StructureHighlightingInitialized) { return; } // Structure match hilighting / orienting try { do { qc = Query.GetFirstStructureCriteriaColumn(); if (qc == null) { break; } if (Lex.IsUndefined(qc.Criteria)) { break; } ParsedSingleCriteria psc = MqlUtil.ParseQueryColumnCriteria(qc); if (psc == null || Lex.IsUndefined(psc.Value)) { break; } ParsedStructureCriteria pssc = ParsedStructureCriteria.ConvertFromPscToPssc(psc); StructureDisplayFormat sdf = StructureDisplayFormat.Deserialize(qc.DisplayFormatString); // get any hilighting info from format if (pssc.SearchType == StructureSearchType.Substructure) { string chime = MoleculeMx.MolfileStringToChimeString(qc.MolString); if (!String.IsNullOrEmpty(chime)) { AlignStructureToQuery = Lex.Contains(psc.Value2, "Orient") || Lex.Contains(psc.Value2, "Align=True"); HighlightStructureMatches = !(Lex.Contains(psc.Value2, "NoHighlight") || Lex.Contains(psc.Value2, "Highlight=false")); MoleculeMx cs = new MoleculeMx(MoleculeFormat.Chime, chime); StrMatcher = new StructureMatcher(); StrMatcher.SetSSSQueryMolecule(cs); // set query used for highlighting } } else if (pssc.SearchType == StructureSearchType.SmallWorld && pssc.SmallWorldParameters != null) { SmallWorldPredefinedParameters swp = pssc.SmallWorldParameters; HighlightStructureMatches = swp.Highlight; AlignStructureToQuery = swp.Align; //SmallWorldDepictions = null; // depiction cache } else if (pssc.SearchType == StructureSearchType.Related) // { string chime = MoleculeMx.MolfileStringToChimeString(qc.MolString); if (!String.IsNullOrEmpty(chime)) { AlignStructureToQuery = Lex.Contains(psc.Value2, "Orient") || Lex.Contains(psc.Value2, "Align=True"); HighlightStructureMatches = !(Lex.Contains(psc.Value2, "NoHighlight") || Lex.Contains(psc.Value2, "Highlight=false")); MoleculeMx cs = new MoleculeMx(MoleculeFormat.Chime, chime); StrMatcher = new StructureMatcher(); StrMatcher.SetSSSQueryMolecule(cs); // set query used for SSS highlighting } } else if (sdf.Highlight || sdf.Align) // other cases { HighlightStructureMatches = sdf.Highlight; AlignStructureToQuery = sdf.Align; } else { break; // no hilighting / orienting } StructureHighlightQc = qc; StructureHighlightPssc = pssc; } while (false); } catch (Exception ex) // log & ignore any errors { string msg = DebugLog.FormatExceptionMessage(ex); if (qc != null) { msg += "\r\n" + "Criteria: " + qc.Criteria + "\r\n" + "Molstring: " + qc.MolString; } DebugLog.Message(msg); return; } // Atom number display (not currently used) SS.I.DisplayAtomNumbers = (int)AtomNumberDisplayMode.None; // see if need to display atom numbers for (int ti = 1; ti < Rf.Tables.Count; ti++) { ResultsTable rt = Rf.Tables[ti]; MetaTable mt = rt.MetaTable; if (mt.Name.IndexOf("todo: table that needs atom number display") >= 0) { SS.I.DisplayAtomNumbers = (int)AtomNumberDisplayMode.All; break; } } StructureHighlightingInitialized = true; return; }
/// <summary> /// NextRow - Return the next matching row value object /// </summary> /// <returns></returns> public override Object[] NextRow() { throw new NotImplementedException(); #if false string cid = ""; Molecule substituent = null; Stopwatch swTotal = Stopwatch.StartNew(); Stopwatch sw = Stopwatch.StartNew(); if (Eqp.SearchKeySubset == null || Eqp.SearchKeySubset.Count == 0) { return(null); } // Get the structures for the set of keys if (CidToStructureDict == null) { CidToStructureDict = MoleculeUtil.SelectMoleculesForCidList(Eqp.SearchKeySubset); KeyListPos = -1; MapPos = -1; int msTime = (int)sw.ElapsedMilliseconds; if (RGroupDecomp.Debug) { DebugLog.Message("Select " + Eqp.SearchKeySubset.Count + " structures time(ms): " + msTime); } } // Get the next match while (true) { if (KeyListPos < 0 || MapPos + 1 >= MapCount) { // go to next structure & set up mapping KeyListPos++; if (KeyListPos >= Eqp.SearchKeySubset.Count) { return(null); } cid = Eqp.SearchKeySubset[KeyListPos]; if (!CidToStructureDict.ContainsKey(cid)) { continue; } MoleculeMx cs = CidToStructureDict[cid]; string molFile = cs.GetMolfileString(); //string chime = cs.ChimeString; // debug if (RGroupDecomp.Debug) { DebugLog.StopwatchMessage("t1", sw); } if (DebugMx.False) // debug { //molFile = FileUtil.ReadFile(@"C:\Downloads\RGroupTarget.mol"); string targetSmiles = "CC1Cn2cc(c(= O)c3c2c(c(c(c3)F)Cl)S1)C(= O)O"; string targetChime = "CYAAFQwADfwQ19aXPcZERR45lQkn08$hZNXzeJ2yaAhDnxxJou4Gq9od8VG1ykiO63fQpvM8W4C6MR$O3VaZjQwrGr5weW3y^BeUEezndoIivvAbQN58EEHVMAsdPaF4LIsqsf$OCBUPHI5njBB2LIBy3i2cwbrD8T8kFVBVWkTCfIUFUtblI0G7vYiEL^svUWCT^m6tF18I7ISJUp^7WkuzpT9LrBSJLmMl5hHXog$68Q6YPb0^Xp0ftxmy7FDSF^sWib6^JrUMhrHtLfJ3yVMTm9RIrvvKMRQvKqq4G1Ooze5pdlpSdzp7MFl0K1zx4tdnNFoUO1kRPpyZks61qbBz2tU0L$svvojoU4yUlf$^MFF0nqSfGVW2PKv9TReb$knLXffdAAhqBN310WUfdJDoQBNX1a5L2uj9ybNNRLYpaZN1p6WYp2WI^ntQEVTBaJF1Uu28N4o2xudURpVITTKO7omUtpgLoaoOQHazmZG3k^aHPUOQfE0d27eAbE^uxcQUAB"; molFile = CdkMol.Util.MoleculeTofMolfileString(CdkMol.Util.ChimeStringToMolecule(targetChime)); } Molecule target = CdkMol.Util.MolfileStringToMolecule(molFile); if (RGroupDecomp.Debug) { DebugLog.StopwatchMessage("t2", sw); } MapCount = RGroupDecomp.ProcessTargetMolecule(target); // process & get number of maps if (MapCount > 1) { MapCount = MapCount; // debug, seems to always be 1 } MapPos = -1; if (RGroupDecomp.Debug) { DebugLog.StopwatchMessage("t3", sw); } } // Get the substituent for each RGroup for the next mapping MapPos++; // get data for next mapping for (int si = 0; si < Substituents.Length; si++) // clear substituents { Substituents[si] = null; } for (int fi = 0; fi < RgTotalCount; fi++) { Molecule fragment = RGroupDecomp.GetIthMappingFragment(MapPos, fi); if (fragment == null) { break; // must have reached the end } if (RGroupDecomp.Debug) { DebugLog.StopwatchMessage("t4", sw); } int ri = CdkMol.Util.GetFragmentRGroupAssignment(fragment); if (ri >= 0 && ri < Substituents.Length) { Substituents[ri] = fragment; } } if (RGroupDecomp.Debug) { DebugLog.StopwatchMessage("t5", sw); } // Fill in the Vo object[] vo = new object[Qt.SelectedCount]; for (int ci = 0; ci < SelectList.Count; ci++) { MetaColumn mc = SelectList[ci]; string name = mc.Name.ToLower(); if (mc.IsKey) { vo[ci] = Eqp.SearchKeySubset[KeyListPos]; } else if (Lex.Eq(name, "Core")) { vo[ci] = CoreChemicalStructure; } else if (Lex.Eq(name, "Terminate_Option")) { vo[ci] = TerminateOptionString; } else if (Lex.Eq(name, "Map_Number")) { vo[ci] = (MapPos + 1).ToString(); } else if (Lex.Eq(name, "Map")) { if (RGroupDecomp.Debug) { DebugLog.StopwatchMessage("t6", sw); } MoleculeMx cs = null; try // hilight core molecule { if (StrMatcher == null) // initialize matcher with core structure if not done yet { StrMatcher = new StructureMatcher(); string molfile2 = CdkMol.Util.RemoveRGroupAttachmentPointAtoms(CoreChemicalStructure.GetMolfileString()); if (RGroupDecomp.Debug) { DebugLog.StopwatchMessage("t7", sw); } MoleculeMx cs2 = new MoleculeMx(MoleculeFormat.Molfile, molfile2); StrMatcher.SetSSSQueryMolecule(cs2); // set core query used for highlighting if (RGroupDecomp.Debug) { DebugLog.StopwatchMessage("t8", sw); } } Molecule alignedTarget = RGroupDecomp.GetAlignedTargetForMapping(MapPos); if (RGroupDecomp.Debug) { DebugLog.StopwatchMessage("t9", sw); } string chime = CdkMol.Util.MoleculeToChimeString(alignedTarget); if (RGroupDecomp.Debug) { DebugLog.StopwatchMessage("t10", sw); } cs = new MoleculeMx(MoleculeFormat.Chime, chime); cs = StrMatcher.HighlightMatchingSubstructure(cs); } catch (Exception ex) { ex = ex; } vo[ci] = cs; // store value if (RGroupDecomp.Debug) { DebugLog.StopwatchMessage("t11", sw); } } else if (Lex.Eq(name, "Is_Map_Complete")) { vo[ci] = "Yes"; // always complete for PP //else vo[ci] = "No"; } else { // must be a substituent if (RGroupDecomp.Debug) { DebugLog.StopwatchMessage("t12", sw); } int ri = name.IndexOf("_"); if (ri < 0 || !int.TryParse(name.Substring(1, ri - 1), out ri)) { continue; // in case of bogus name } substituent = Substituents[ri]; if (substituent == null) { vo[ci] = null; // no mapping found continue; } if (name.EndsWith("_structure")) { string chime = CdkMol.Util.MoleculeToChimeString(substituent); MoleculeMx cs = new MoleculeMx(MoleculeFormat.Chime, chime); vo[ci] = cs; } else if (name.EndsWith("_smiles")) { string smiles = CdkMol.Util.MoleculeToSmilesString(substituent); vo[ci] = smiles; } else if (name.EndsWith("_formula")) { string mf = CdkMol.Util.GetMolFormulaDotDisconnect(substituent); vo[ci] = mf; } else if (name.EndsWith("_weight")) { vo[ci] = CdkMol.Util.GetMolWeight(substituent); } else if (name.EndsWith("_substno")) { vo[ci] = ri; } if (RGroupDecomp.Debug) { DebugLog.StopwatchMessage("t13", sw); } } } int msTime = (int)sw.ElapsedMilliseconds; if (RGroupDecomp.Debug) { DebugLog.StopwatchMessage("Total Time for Cid: " + cid, swTotal); } return(vo); } #endif }