Skip to content

Commit 3b45672

Browse files
authored
Merge pull request #114 from Meredith-Lab/smarts-df
Move SMARTS patterns to a .csv file
2 parents 4244ec8 + 343a7bb commit 3b45672

File tree

12 files changed

+170
-84
lines changed

12 files changed

+170
-84
lines changed

.Rbuildignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@ README.Rmd
1515
^Meta$
1616
^cran-comments\.md$
1717
^CRAN-SUBMISSION$
18+
^data-raw$

DESCRIPTION

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,6 @@ Config/testthat/edition: 3
4646
Encoding: UTF-8
4747
Roxygen: list(markdown = TRUE)
4848
RoxygenNote: 7.3.2
49+
Depends:
50+
R (>= 2.10)
51+
LazyData: true

NEWS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# volcalc (development version)
22

33
* adds a `validate = TRUE` option to `calc_vol()` and `get_fx_groups()` that returns `NA`s when there are suspected errors in parsing SMILES or .mol files. This is unfortunately not available on Windows due to differences in the windows version of `ChemmineOB`
4+
* adds a dataset, `smarts_simpol1`, describing how functional groups are defined for the SIMPOL.1 and Meredith et al. methods
45
* `KEGGREST` is no longer a dependency of `volcalc` (previously used in `get_mol_kegg()`)
56

67
# volcalc 2.1.2

R/data.R

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#' Search patterns used for SIMPOL.1 functional groups
2+
#'
3+
#' This dataframe documents how functional groups for the SIMPOL.1 and Meredith
4+
#' et al. method are defined using SMARTS strings or `ChemmineR` functions.
5+
#'
6+
#' @format
7+
#' \describe{
8+
#' \item{method}{Either "simpol1" for functional groups only used with the SIMPOL.1 method, or "meredith" for additional groups used in the Meredith et al. method.}
9+
#' \item{functional_groups}{These correspond to matching column names in the results of [get_fx_groups()].}
10+
#' \item{description}{Functional group description from Table 5 of Pankow & Asher (2008)}
11+
#' \item{smarts}{SMARTS strings used to capture groups, when applicable}
12+
#' \item{fun}{The function used to capture the functional group. When `smarts` is not `NA`, this is always "[ChemmineR::smartsSearchOB]". Other groups are captured with other `ChemmineR` functions or as calculations using other functional groups.}
13+
#' \item{notes}{Notes including how any functional group counts are corrected when there is overlap. E.g. when one SMARTS pattern is a subset of another pattern, but the two groups are counted separately without overlap in the SIMPOL.1 method.}
14+
#' }
15+
#'
16+
#' @references
17+
#' Meredith L, Ledford S, Riemer K, Geffre P, Graves K, Honeker L, LeBauer D,
18+
#' Tfaily M, Krechmer J. 2023. Automating methods for estimating metabolite
19+
#' volatility. Frontiers in Microbiology. \doi{10.3389/fmicb.2023.1267234}
20+
#'
21+
#' Pankow, J.F., Asher, W.E. 2008. SIMPOL.1: a simple group
22+
#' contribution method for predicting vapor pressures and enthalpies of
23+
#' vaporization of multifunctional organic compounds. Atmos. Chem. Phys.
24+
#' \doi{10.5194/acp-8-2773-2008}
25+
#'
26+
"smarts_simpol1"

R/get_fx_groups.R

Lines changed: 38 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,16 @@
1717
#' risk! Validation is not available on Windows. See **Details** for more
1818
#' information.
1919
#'
20-
#' @details It is unfortunately difficult to capture errors and warnings
21-
#' produced by the command line tool OpenBabel used by `ChemmineOB`, a
22-
#' dependency of `volcalc`. These errors and warnings are printed to the R
23-
#' console, but they are *not* R errors and do not stop code from running and
24-
#' producing potentially incorrect data. `validate = TRUE` checks the output
25-
#' of certain OpenBabel procedures for the *symptoms* of these errors, namely
26-
#' missing values for InChI and molecular formula. Unfortunately, since InChI
20+
#' @details For more details on how functional groups are defined, see the
21+
#' [smarts_simpol1] data set.
22+
#'
23+
#' It is unfortunately difficult to capture errors and warnings produced by
24+
#' the command line tool OpenBabel used by `ChemmineOB`, a dependency of
25+
#' `volcalc`. These errors and warnings are printed to the R console, but they
26+
#' are *not* R errors and do not stop code from running and producing
27+
#' potentially incorrect data. `validate = TRUE` checks the output of certain
28+
#' OpenBabel procedures for the *symptoms* of these errors, namely missing
29+
#' values for InChI and molecular formula. Unfortunately, since InChI
2730
#' generation is not available with the Windows version of `ChemmineOB`, this
2831
#' validation step cannot be performed on Windows and `validate = TRUE` will
2932
#' simply print a warning that can be silenced by setting `validate = FALSE`.
@@ -97,48 +100,7 @@ Set `validate = FALSE` to silence this warning.")
97100
carbon_dbl_count <- tibble::add_row(carbon_dbl_count, n = 0)
98101
}
99102

100-
# *_pattern are SMARTS strings: https://www.daylight.com/dayhtml_tutorials/languages/smarts/smarts_examples.html
101-
carbon_dbl_bonds_pattern <- "C=C" #non-aromatic carbon double bonds
102-
CCCO_pattern <- "C(C=C[AR1])(=O)[AR1]" #C=C-C=O in a non-aromatic ring
103-
# ether_alkyl_pattern <- "[OD2]([C!R1])[C!R1]" #currently unused--ether_alkly calculated as total - other ethers
104-
ether_alicyclic_pattern <- "[OD2]([C!R0])[C!R0]"
105-
ether_aromatic_pattern <- "O(c)[C,c]" #only one of the carbons has to be aromatic
106-
nitro_pattern <- "[$([NX3](=O)=O),$([NX3+](=O)[O-])][!#8]"
107-
hydroxyl_aromatic_pattern <- "[OX2H]c"
108-
nitrate_pattern <- "[$([NX3](=[OX1])(=[OX1])O),$([NX3+]([OX1-])(=[OX1])O)]"
109-
110-
#TODO need patterns for amines that don't pick up amides
111-
amine_primary_pattern <- "[NX3;H2;!$(NC=[!#6]);!$(NC#[!#6])][#6X4]"
112-
amine_secondary_pattern <- "[NX3H1!$(NC=[!#6])!$(NC#[!#6])]([#6X4])[#6X4]"
113-
amine_tertiary_pattern <- "[NX3H0!$(NC=[!#6])!$(NC#[!#6])]([#6X4])([#6X4])[#6X4]"
114-
amine_aromatic_pattern <- "[NX3;!$(NO)]c"
115-
116-
amide_primary_pattern <- "[CX3;$([R0][#6]),$([H1R0])](=[OX1])[#7X3H2]"
117-
amide_secondary_pattern <- "[CX3;$([R0][#6]),$([H1R0])](=[OX1])[#7X3H1][#6;!$(C=[O,N,S])]"
118-
amide_tertiary_pattern <-
119-
"[CX3;$([R0][#6]),$([H1R0])](=[OX1])[#7X3H0]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])]"
120-
121-
# amide_total_pattern <- "[CX3;$([R0][#6]),$([H1R0])](=[OX1])[#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])]"
122-
123-
carbonylperoxynitrate_pattern <- "*C(=O)OO[N+1](=O)[O-1]"
124-
peroxide_pattern <- "[OX2D2][OX2D2]" #this captures carbonylperoxynitrates too
125-
hydroperoxide_pattern <- "[OX2][OX2H,OX1-]" #this captures peroxyacids too
126-
carbonylperoxyacid_pattern <- "[CX3;$([R0][#6]),$([H1R0])](=[OX1])[OX2][$([OX2H]),$([OX1-])]"
127-
nitroester_pattern <- "C(=O)(OC)C~[NX3](-,=[OX1])-,=[OX1]"
128-
# This captures OH groups on a ring that also has a nitro group (para, ortho, or meta). Need to correct aromatic hydroxyl count later.
129-
nitrophenol_pattern <-
130-
"[OX2H][$(c1ccccc1[$([NX3](=O)=O),$([NX3+](=O)[O-])]),$(c1cccc(c1)[$([NX3](=O)=O),$([NX3+](=O)[O-])]),$(c1ccc(cc1)[$([NX3](=O)=O),$([NX3+](=O)[O-])])]"
131-
phosphoric_acid_pattern <-
132-
"[$(P(=[OX1])([$([OX2H]),$([OX1-]),$([OX2]P)])([$([OX2H]),$([OX1-]),$([OX2]P)])[$([OX2H]),$([OX1-]),$([OX2]P)]),$([P+]([OX1-])([$([OX2H]),$([OX1-]),$([OX2]P)])([$([OX2H]),$([OX1-]),$([OX2]P)])[$([OX2H]),$([OX1-]),$([OX2]P)])]"
133-
phosphoric_ester_pattern <-
134-
"[$(P(=[OX1])([OX2][#6])([$([OX2H]),$([OX1-]),$([OX2][#6])])[$([OX2H]),$([OX1-]),$([OX2][#6]),$([OX2]P)]),$([P+]([OX1-])([OX2][#6])([$([OX2H]),$([OX1-]),$([OX2][#6])])[$([OX2H]),$([OX1-]),$([OX2][#6]),$([OX2]P)])]"
135-
sulfate_pattern <-
136-
"[$([#16X4](=[OX1])(=[OX1])([OX2H,OX1H0-])[OX2][#6]),$([#16X4+2]([OX1-])([OX1-])([OX2H,OX1H0-])[OX2][#6])]"
137-
#sulfonate groups; sulfonate ions, and conjugate acid, sulfonic acids
138-
sulfonate_pattern <-
139-
"[#16X4](=[OX1])(=[OX1])([#6])[*$([O-1]),*$([OH1]),*$([OX2H0])]"
140-
thiol_pattern <- "[#16X2H]"
141-
carbothioester_pattern <- "S([#6])[CX3](=O)[#6]"
103+
smarts <- smarts_patterns_simpol1
142104

143105
fx_groups_df <-
144106
dplyr::tibble(
@@ -154,43 +116,42 @@ Set `validate = FALSE` to silence this warning.")
154116
rings_aromatic = as.integer(rings$AROMATIC),
155117
rings_total = as.integer(rings$RINGS),
156118
rings_aliphatic = NA_integer_, #calculated below
157-
carbon_dbl_bonds_aliphatic = ChemmineR::smartsSearchOB(compound_sdf, carbon_dbl_bonds_pattern),
158-
CCCO_aliphatic_ring = ChemmineR::smartsSearchOB(compound_sdf, CCCO_pattern), # C=C-C=O in a non-aromatic ring
119+
carbon_dbl_bonds_aliphatic = ChemmineR::smartsSearchOB(compound_sdf, smarts$carbon_dbl_bonds_aliphatic),
120+
CCCO_aliphatic_ring = ChemmineR::smartsSearchOB(compound_sdf, smarts$CCCO_aliphatic_ring),
159121
hydroxyl_total = groups$ROH,
160-
hydroxyl_aromatic = ChemmineR::smartsSearchOB(compound_sdf, hydroxyl_aromatic_pattern, uniqueMatches = FALSE),
122+
hydroxyl_aromatic = ChemmineR::smartsSearchOB(compound_sdf, smarts$hydroxyl_aromatic, uniqueMatches = FALSE),
161123
hydroxyl_aliphatic = NA_integer_, #calculated below
162124
aldehydes = groups$RCHO,
163125
ketones = groups$RCOR,
164126
carbox_acids = groups$RCOOH,
165127
ester = groups$RCOOR,
166128
ether_total = groups$ROR,
167-
# ether_alkyl = ChemmineR::smartsSearchOB(compound_sdf, ether_alkyl_pattern),
168-
ether_alkyl = NA_integer_,
169-
ether_alicyclic = ChemmineR::smartsSearchOB(compound_sdf, ether_alicyclic_pattern),
170-
ether_aromatic = ChemmineR::smartsSearchOB(compound_sdf, ether_aromatic_pattern),
171-
nitrate = ChemmineR::smartsSearchOB(compound_sdf, nitrate_pattern),
172-
nitro = ChemmineR::smartsSearchOB(compound_sdf, nitro_pattern),
173-
amine_primary = ChemmineR::smartsSearchOB(compound_sdf, amine_primary_pattern),
174-
amine_secondary = ChemmineR::smartsSearchOB(compound_sdf, amine_secondary_pattern),
175-
amine_tertiary = ChemmineR::smartsSearchOB(compound_sdf, amine_tertiary_pattern),
176-
amine_aromatic = ChemmineR::smartsSearchOB(compound_sdf, amine_aromatic_pattern),
177-
amide_primary = ChemmineR::smartsSearchOB(compound_sdf, amide_primary_pattern),
178-
amide_secondary = ChemmineR::smartsSearchOB(compound_sdf, amide_secondary_pattern),
179-
amide_tertiary = ChemmineR::smartsSearchOB(compound_sdf, amide_tertiary_pattern),
180-
carbonylperoxynitrate = ChemmineR::smartsSearchOB(compound_sdf, carbonylperoxynitrate_pattern),
181-
peroxide = ChemmineR::smartsSearchOB(compound_sdf, peroxide_pattern),
182-
hydroperoxide = ChemmineR::smartsSearchOB(compound_sdf, hydroperoxide_pattern),
183-
carbonylperoxyacid = ChemmineR::smartsSearchOB(compound_sdf, carbonylperoxyacid_pattern),
184-
nitrophenol = ChemmineR::smartsSearchOB(compound_sdf, nitrophenol_pattern),
185-
nitroester = ChemmineR::smartsSearchOB(compound_sdf, nitroester_pattern),
129+
ether_alkyl = NA_integer_, #calculated below
130+
ether_alicyclic = ChemmineR::smartsSearchOB(compound_sdf, smarts$ether_alicyclic),
131+
ether_aromatic = ChemmineR::smartsSearchOB(compound_sdf, smarts$ether_aromatic),
132+
nitrate = ChemmineR::smartsSearchOB(compound_sdf, smarts$nitrate),
133+
nitro = ChemmineR::smartsSearchOB(compound_sdf, smarts$nitro),
134+
amine_primary = ChemmineR::smartsSearchOB(compound_sdf, smarts$amine_primary),
135+
amine_secondary = ChemmineR::smartsSearchOB(compound_sdf, smarts$amine_secondary),
136+
amine_tertiary = ChemmineR::smartsSearchOB(compound_sdf, smarts$amine_tertiary),
137+
amine_aromatic = ChemmineR::smartsSearchOB(compound_sdf, smarts$amine_aromatic),
138+
amide_primary = ChemmineR::smartsSearchOB(compound_sdf, smarts$amide_primary),
139+
amide_secondary = ChemmineR::smartsSearchOB(compound_sdf, smarts$amide_secondary),
140+
amide_tertiary = ChemmineR::smartsSearchOB(compound_sdf, smarts$amide_tertiary),
141+
carbonylperoxynitrate = ChemmineR::smartsSearchOB(compound_sdf, smarts$carbonylperoxynitrate),
142+
peroxide = ChemmineR::smartsSearchOB(compound_sdf, smarts$peroxide),
143+
hydroperoxide = ChemmineR::smartsSearchOB(compound_sdf, smarts$hydroperoxide),
144+
carbonylperoxyacid = ChemmineR::smartsSearchOB(compound_sdf, smarts$carbonylperoxyacid),
145+
nitrophenol = ChemmineR::smartsSearchOB(compound_sdf, smarts$nitrophenol),
146+
nitroester = ChemmineR::smartsSearchOB(compound_sdf, smarts$nitroester),
186147

187148
# Additional groups from Meredith et al. 2023
188-
phosphoric_acids = ChemmineR::smartsSearchOB(compound_sdf, phosphoric_acid_pattern),
189-
phosphoric_esters = ChemmineR::smartsSearchOB(compound_sdf, phosphoric_ester_pattern),
190-
sulfates = ChemmineR::smartsSearchOB(compound_sdf, sulfate_pattern),
191-
sulfonates = ChemmineR::smartsSearchOB(compound_sdf, sulfonate_pattern),
192-
thiols = ChemmineR::smartsSearchOB(compound_sdf, thiol_pattern),
193-
carbothioesters = ChemmineR::smartsSearchOB(compound_sdf, carbothioester_pattern),
149+
phosphoric_acids = ChemmineR::smartsSearchOB(compound_sdf, smarts$phosphoric_acids),
150+
phosphoric_esters = ChemmineR::smartsSearchOB(compound_sdf, smarts$phosphoric_esters),
151+
sulfates = ChemmineR::smartsSearchOB(compound_sdf, smarts$sulfates),
152+
sulfonates = ChemmineR::smartsSearchOB(compound_sdf, smarts$sulfonates),
153+
thiols = ChemmineR::smartsSearchOB(compound_sdf, smarts$thiols),
154+
carbothioesters = ChemmineR::smartsSearchOB(compound_sdf, smarts$carbothioesters),
194155
oxygens = atoms[["O"]] %||% 0L,
195156
chlorines = atoms[["Cl"]] %||% 0L,
196157
nitrogens = atoms[["N"]] %||% 0L,

R/sysdata.rda

822 Bytes
Binary file not shown.

data-raw/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
In the future, if new methods are added, create a separate .csv file named smarts_<method>.csv.
2+
To turn this into a user-facing dataset, edit `make_data.R` to add another `usethis::use_data()` and document it by adding a new entry to `R/data.R`. To also use this in internal data, it needs to be added as an argument to `usethis::use_data(..., internal = TRUE)` since only one sysdata.rda can exist for holding internal data. E.g. `usethis::use_data(smarts_patterns_simpol1, smarts_patterns_newmethod, internal = TRUE, overwrite = TRUE)`
3+
4+
Be sure to run the code in `make_data.R` and to run `devtools::document()` to update data and documentation.

data-raw/make_data.R

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
## code to prepare `smarts` dataset goes here
2+
smarts_simpol1 <- readr::read_csv("data-raw/smarts_simpol1.csv")
3+
4+
#create user-facing data.frame
5+
usethis::use_data(smarts_simpol1, overwrite = TRUE)
6+
7+
#create internal named list with just SMARTS strings
8+
just_smarts_simpol1 <-
9+
smarts_simpol1 %>%
10+
dplyr::filter(!is.na(smarts))
11+
smarts_patterns_simpol1 <- as.list(just_smarts_simpol1$smarts)
12+
names(smarts_patterns_simpol1) <- just_smarts_simpol1$functional_group
13+
14+
usethis::use_data(smarts_patterns_simpol1, internal = TRUE, overwrite = TRUE)

data-raw/smarts_simpol1.csv

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
method,functional_group,description,smarts,fun,notes
2+
simpol1,carbons_asa,carbon number on the acid-side of an amide,NA,NA,Not possible to capture with SMARTS
3+
simpol1,rings_aromatic,aromatic ring,NA,ChemmineR::rings,
4+
simpol1,rings_total,,NA,ChemmineR::rings,
5+
simpol1,rings_aliphatic,non-aromatic ring,NA,rings_total - rings_aromatic,
6+
simpol1,carbon_dbl_bonds_aliphatic,C=C (non-aromatic),C=C,ChemmineR::smartsSearchOB,
7+
simpol1,CCCO_aliphatic_ring,C=C-C=O in non-aromatic ring,C(C=C[AR1])(=O)[AR1],ChemmineR::smartsSearchOB,
8+
simpol1,hydroxyl_total,,NA,ChemmineR::groups,
9+
simpol1,hydroxyl_aromatic,"aromatic hydroxyl (e.g., phenol)",[OX2H]c,ChemmineR::smartsSearchOB,"This pattern also captures nitrophenols, so the number of nitrophenols is subtracted"
10+
simpol1,hydroxyl_aliphatic,hydroxyl (alkyl),NA,hydroxyl_total - hydroxyl_aromatic,
11+
simpol1,aldehydes,aldehyde,NA,ChemmineR::groups,
12+
simpol1,ketones,ketone,NA,ChemmineR::groups,
13+
simpol1,carbox_acids,carboxylic acid,NA,ChemmineR::groups,
14+
simpol1,ester,ester,NA,ChemmineR::groups,"This also captures carbonylperoxynitrates and nitroesters, so the number of carbonylperoxynitrates and nitroesters are subtracted"
15+
simpol1,ether_total,,NA,ChemmineR::groups,
16+
simpol1,ether_alkyl,ether,NA,ether_total - ether_alicyclic - ether_aromatic,
17+
simpol1,ether_alicyclic,ether (alicyclic),[OD2]([C!R0])[C!R0],ChemmineR::smartsSearchOB,
18+
simpol1,ether_aromatic,"ether, aromatic","O(c)[C,c]",ChemmineR::smartsSearchOB,Only one of the carbons has to be aromatic
19+
simpol1,nitrate,nitrate,"[$([NX3](=[OX1])(=[OX1])O),$([NX3+]([OX1-])(=[OX1])O)]",ChemmineR::smartsSearchOB,"This pattern also captures carbonylperoxynitrates, so the number of carbonylperoxynitrates is subtracted"
20+
simpol1,nitro,nitro,"[$([NX3](=O)=O),$([NX3+](=O)[O-])][!#8]",ChemmineR::smartsSearchOB,
21+
simpol1,amine_primary,"amine, primary",[NX3;H2;!$(NC=[!#6]);!$(NC#[!#6])][#6X4],ChemmineR::smartsSearchOB,
22+
simpol1,amine_secondary,"amine, secondary",[NX3H1!$(NC=[!#6])!$(NC#[!#6])]([#6X4])[#6X4],ChemmineR::smartsSearchOB,
23+
simpol1,amine_tertiary,"amine, tertiary",[NX3H0!$(NC=[!#6])!$(NC#[!#6])]([#6X4])([#6X4])[#6X4],ChemmineR::smartsSearchOB,
24+
simpol1,amine_aromatic,"amine, aromatic",[NX3;!$(NO)]c,ChemmineR::smartsSearchOB,
25+
simpol1,amide_primary,"amide, primary","[CX3;$([R0][#6]),$([H1R0])](=[OX1])[#7X3H2]",ChemmineR::smartsSearchOB,
26+
simpol1,amide_secondary,"amide, secondary","[CX3;$([R0][#6]),$([H1R0])](=[OX1])[#7X3H1][#6;!$(C=[O,N,S])]",ChemmineR::smartsSearchOB,
27+
simpol1,amide_tertiary,"amide, tertiary","[CX3;$([R0][#6]),$([H1R0])](=[OX1])[#7X3H0]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])]",ChemmineR::smartsSearchOB,
28+
simpol1,carbonylperoxynitrate,carbonylperoxynitrate,*C(=O)OO[N+1](=O)[O-1],ChemmineR::smartsSearchOB,
29+
simpol1,peroxide,peroxide,[OX2D2][OX2D2],ChemmineR::smartsSearchOB,"This pattern also captures carbonylperoxynitrates, so the number of carbonylperoxinitrates is subtracted"
30+
simpol1,hydroperoxide,hydroperoxide,"[OX2][OX2H,OX1-]",ChemmineR::smartsSearchOB,"This pattern also captures peroxyacids, so the number of carbonylperoxyacids is subtracted"
31+
simpol1,carbonylperoxyacid,carbonylperoxyacid,"[CX3;$([R0][#6]),$([H1R0])](=[OX1])[OX2][$([OX2H]),$([OX1-])]",ChemmineR::smartsSearchOB,
32+
simpol1,nitrophenol,nitrophenol,"[OX2H][$(c1ccccc1[$([NX3](=O)=O),$([NX3+](=O)[O-])]),$(c1cccc(c1)[$([NX3](=O)=O),$([NX3+](=O)[O-])]),$(c1ccc(cc1)[$([NX3](=O)=O),$([NX3+](=O)[O-])])]",ChemmineR::smartsSearchOB,
33+
simpol1,nitroester,nitroester,"C(=O)(OC)C~[NX3](-,=[OX1])-,=[OX1]",ChemmineR::smartsSearchOB,"This pattern captures OH groups on a ring that also has a nitro group (para, ortho, or meta)"
34+
meredith,phosphoric_acids,,"[$(P(=[OX1])([$([OX2H]),$([OX1-]),$([OX2]P)])([$([OX2H]),$([OX1-]),$([OX2]P)])[$([OX2H]),$([OX1-]),$([OX2]P)]),$([P+]([OX1-])([$([OX2H]),$([OX1-]),$([OX2]P)])([$([OX2H]),$([OX1-]),$([OX2]P)])[$([OX2H]),$([OX1-]),$([OX2]P)])]",ChemmineR::smartsSearchOB,"This pattern also captures phosphoric esthers, so the number of phosphoric esters is subtracted"
35+
meredith,phosphoric_esters,,"[$(P(=[OX1])([OX2][#6])([$([OX2H]),$([OX1-]),$([OX2][#6])])[$([OX2H]),$([OX1-]),$([OX2][#6]),$([OX2]P)]),$([P+]([OX1-])([OX2][#6])([$([OX2H]),$([OX1-]),$([OX2][#6])])[$([OX2H]),$([OX1-]),$([OX2][#6]),$([OX2]P)])]",ChemmineR::smartsSearchOB,
36+
meredith,sulfates,,"[$([#16X4](=[OX1])(=[OX1])([OX2H,OX1H0-])[OX2][#6]),$([#16X4+2]([OX1-])([OX1-])([OX2H,OX1H0-])[OX2][#6])]",ChemmineR::smartsSearchOB,
37+
meredith,sulfonates,,"[#16X4](=[OX1])(=[OX1])([#6])[*$([O-1]),*$([OH1]),*$([OX2H0])]",ChemmineR::smartsSearchOB,This pattern captures sulfonate ions and their conjugate acids (sulfonic acids)
38+
meredith,thiols,,[#16X2H],ChemmineR::smartsSearchOB,
39+
meredith,carbothioesters,,S([#6])[CX3](=O)[#6],ChemmineR::smartsSearchOB,

data/smarts_simpol1.rda

1.66 KB
Binary file not shown.

0 commit comments

Comments
 (0)