├── NGF ├── __init__.py ├── features.license.txt ├── features.py ├── layers.py ├── models.py ├── preprocessing.py ├── sparse.py └── utils.py ├── README.md ├── data ├── Karthikeyan_MeltingPoints_data.npy ├── Karthikeyan_MeltingPoints_labels.npy ├── Melting_Points_(Karthikeyan).txt ├── data.license.txt ├── delaney.csv ├── delaney_data.npy └── delaney_labels.npy ├── examples.py ├── license.txt └── utils.py /NGF/__init__.py: -------------------------------------------------------------------------------- 1 | __all__ = ['layers', 'models', 'preprocessing', 'sparse'] -------------------------------------------------------------------------------- /NGF/features.license.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 by the President and Fellows of Harvard University 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /NGF/features.py: -------------------------------------------------------------------------------- 1 | ''' Generate features vectors for atoms and bonds 2 | 3 | # Source 4 | This code is adapted from 5 | - https://github.com/HIPS/neural-fingerprint/blob/2e8ef09/neuralfingerprint/features.py 6 | - https://github.com/HIPS/neural-fingerprint/blob/2e8ef09/neuralfingerprint/util.py 7 | 8 | # Copyright 9 | This code is governed by the licence at: 10 | https://github.com/HIPS/neural-fingerprint/blob/2e8ef09/license.txt 11 | which is copied to ./features.license.txt 12 | ''' 13 | 14 | import numpy as np 15 | from rdkit import Chem 16 | 17 | def one_of_k_encoding(x, allowable_set): 18 | if x not in allowable_set: 19 | raise Exception("input {0} not in allowable set{1}:".format(x, allowable_set)) 20 | return map(lambda s: x == s, allowable_set) 21 | 22 | def one_of_k_encoding_unk(x, allowable_set): 23 | """Maps inputs not in the allowable set to the last element.""" 24 | if x not in allowable_set: 25 | x = allowable_set[-1] 26 | return map(lambda s: x == s, allowable_set) 27 | 28 | def atom_features(atom): 29 | return np.array(one_of_k_encoding_unk(atom.GetSymbol(), 30 | ['C', 'N', 'O', 'S', 'F', 'Si', 'P', 'Cl', 'Br', 'Mg', 'Na', 31 | 'Ca', 'Fe', 'As', 'Al', 'I', 'B', 'V', 'K', 'Tl', 'Yb', 32 | 'Sb', 'Sn', 'Ag', 'Pd', 'Co', 'Se', 'Ti', 'Zn', 'H', # H? 33 | 'Li', 'Ge', 'Cu', 'Au', 'Ni', 'Cd', 'In', 'Mn', 'Zr', 34 | 'Cr', 'Pt', 'Hg', 'Pb', 'Unknown']) + 35 | one_of_k_encoding_unk(atom.GetDegree(), [0, 1, 2, 3, 4, 5]) + 36 | one_of_k_encoding_unk(atom.GetTotalNumHs(), [0, 1, 2, 3, 4]) + 37 | one_of_k_encoding_unk(atom.GetImplicitValence(), [0, 1, 2, 3, 4, 5]) + 38 | [atom.GetIsAromatic()]) 39 | 40 | def bond_features(bond): 41 | bt = bond.GetBondType() 42 | return np.array([bt == Chem.rdchem.BondType.SINGLE, 43 | bt == Chem.rdchem.BondType.DOUBLE, 44 | bt == Chem.rdchem.BondType.TRIPLE, 45 | bt == Chem.rdchem.BondType.AROMATIC, 46 | bond.GetIsConjugated(), 47 | bond.IsInRing()]) 48 | 49 | def num_atom_features(): 50 | # Return length of feature vector using a very simple molecule. 51 | m = Chem.MolFromSmiles('CC') 52 | alist = m.GetAtoms() 53 | a = alist[0] 54 | return len(atom_features(a)) 55 | 56 | def num_bond_features(): 57 | # Return length of feature vector using a very simple molecule. 58 | simple_mol = Chem.MolFromSmiles('CC') 59 | Chem.SanitizeMol(simple_mol) 60 | return len(bond_features(simple_mol.GetBonds()[0])) 61 | -------------------------------------------------------------------------------- /NGF/layers.py: -------------------------------------------------------------------------------- 1 | ''' Defines layers to build convolutional graph networks. 2 | ''' 3 | 4 | from __future__ import print_function 5 | 6 | from numpy import inf, ndarray 7 | from copy import deepcopy 8 | 9 | from keras import layers 10 | from keras.utils.layer_utils import layer_from_config 11 | import theano.tensor as T 12 | import keras.backend as K 13 | 14 | from .utils import filter_func_args, mol_shapes_to_dims 15 | 16 | def temporal_padding(x, paddings=(1, 0), padvalue=0): 17 | '''Pad the middle dimension of a 3D tensor 18 | with `padding[0]` values left and `padding[1]` values right. 19 | 20 | Modified from keras.backend.temporal_padding 21 | https://github.com/fchollet/keras/blob/3bf913d/keras/backend/theano_backend.py#L590 22 | 23 | TODO: Implement for tensorflow (supposebly more easy) 24 | ''' 25 | if not isinstance(paddings, (tuple, list, ndarray)): 26 | paddings = (paddings, paddings) 27 | 28 | input_shape = x.shape 29 | output_shape = (input_shape[0], 30 | input_shape[1] + sum(paddings), 31 | input_shape[2]) 32 | output = T.zeros(output_shape) 33 | 34 | # Set pad value and set subtensor of actual tensor 35 | output = T.set_subtensor(output[:, :paddings[0], :], padvalue) 36 | output = T.set_subtensor(output[:, paddings[1]:, :], padvalue) 37 | output = T.set_subtensor(output[:, paddings[0]:x.shape[1] + paddings[0], :], x) 38 | return output 39 | 40 | def neighbour_lookup(atoms, edges, maskvalue=0, include_self=False): 41 | ''' Looks up the features of an all atoms neighbours, for a batch of molecules. 42 | 43 | # Arguments: 44 | atoms (K.tensor): of shape (batch_n, max_atoms, num_atom_features) 45 | edges (K.tensor): of shape (batch_n, max_atoms, max_degree) with neighbour 46 | indices and -1 as padding value 47 | maskvalue (numerical): the maskingvalue that should be used for empty atoms 48 | or atoms that have no neighbours (does not affect the input maskvalue 49 | which should always be -1!) 50 | include_self (bool): if True, the featurevector of each atom will be added 51 | to the list feature vectors of its neighbours 52 | 53 | # Returns: 54 | neigbour_features (K.tensor): of shape (batch_n, max_atoms(+1), max_degree, 55 | num_atom_features) depending on the value of include_self 56 | 57 | # Todo: 58 | - make this function compatible with Tensorflow, it should be quite trivial 59 | because there is an equivalent of `T.arange` in tensorflow. 60 | ''' 61 | 62 | # The lookup masking trick: We add 1 to all indices, converting the 63 | # masking value of -1 to a valid 0 index. 64 | masked_edges = edges + 1 65 | # We then add a padding vector at index 0 by padding to the left of the 66 | # lookup matrix with the value that the new mask should get 67 | masked_atoms = temporal_padding(atoms, (1,0), padvalue=maskvalue) 68 | 69 | 70 | # Import dimensions 71 | atoms_shape = K.shape(masked_atoms) 72 | batch_n = atoms_shape[0] 73 | lookup_size = atoms_shape[1] 74 | num_atom_features = atoms_shape[2] 75 | 76 | edges_shape = K.shape(masked_edges) 77 | max_atoms = edges_shape[1] 78 | max_degree = edges_shape[2] 79 | 80 | # create broadcastable offset 81 | offset_shape = (batch_n, 1, 1) 82 | offset = K.reshape(T.arange(batch_n, dtype=K.dtype(masked_edges)), offset_shape) 83 | offset *= lookup_size 84 | 85 | # apply offset to account for the fact that after reshape, all individual 86 | # batch_n indices will be combined into a single big index 87 | flattened_atoms = K.reshape(masked_atoms, (-1, num_atom_features)) 88 | flattened_edges = K.reshape(masked_edges + offset, (batch_n, -1)) 89 | 90 | # Gather flattened 91 | flattened_result = K.gather(flattened_atoms, flattened_edges) 92 | 93 | # Unflatten result 94 | output_shape = (batch_n, max_atoms, max_degree, num_atom_features) 95 | output = T.reshape(flattened_result, output_shape) 96 | 97 | if include_self: 98 | return K.concatenate([K.expand_dims(atoms, dim=2), output], axis=2) 99 | return output 100 | 101 | class NeuralGraphHidden(layers.Layer): 102 | ''' Hidden Convolutional layer in a Neural Graph (as in Duvenaud et. al., 103 | 2015). This layer takes a graph as an input. The graph is represented as by 104 | three tensors. 105 | 106 | - The atoms tensor represents the features of the nodes. 107 | - The bonds tensor represents the features of the edges. 108 | - The edges tensor represents the connectivity (which atoms are connected to 109 | which) 110 | 111 | It returns the convolved features tensor, which is very similar to the atoms 112 | tensor. Instead of each node being represented by a num_atom_features-sized 113 | vector, each node now is represented by a convolved feature vector of size 114 | conv_width. 115 | 116 | # Example 117 | Define the input: 118 | ```python 119 | atoms0 = Input(name='atom_inputs', shape=(max_atoms, num_atom_features)) 120 | bonds = Input(name='bond_inputs', shape=(max_atoms, max_degree, num_bond_features)) 121 | edges = Input(name='edge_inputs', shape=(max_atoms, max_degree), dtype='int32') 122 | ``` 123 | 124 | The `NeuralGraphHidden` can be initialised in three ways: 125 | 1. Using an integer `conv_width` and possible kwags (`Dense` layer is used) 126 | ```python 127 | atoms1 = NeuralGraphHidden(conv_width, activation='relu', bias=False)([atoms0, bonds, edges]) 128 | ``` 129 | 2. Using an initialised `Dense` layer 130 | ```python 131 | atoms1 = NeuralGraphHidden(Dense(conv_width, activation='relu', bias=False))([atoms0, bonds, edges]) 132 | ``` 133 | 3. Using a function that returns an initialised `Dense` layer 134 | ```python 135 | atoms1 = NeuralGraphHidden(lambda: Dense(conv_width, activation='relu', bias=False))([atoms0, bonds, edges]) 136 | ``` 137 | 138 | Use `NeuralGraphOutput` to convert atom layer to fingerprint 139 | 140 | # Arguments 141 | inner_layer_arg: Either: 142 | 1. an int defining the `conv_width`, with optional kwargs for the 143 | inner Dense layer 144 | 2. An initialised but not build (`Dense`) keras layer (like a wrapper) 145 | 3. A function that returns an initialised keras layer. 146 | kwargs: For initialisation 1. you can pass `Dense` layer kwargs 147 | 148 | # Input shape 149 | List of Atom and edge tensors of shape: 150 | `[(samples, max_atoms, atom_features), (samples, max_atoms, max_degrees, 151 | bond_features), (samples, max_atoms, max_degrees)]` 152 | where degrees referes to number of neighbours 153 | 154 | # Output shape 155 | New atom featuers of shape 156 | `(samples, max_atoms, conv_width)` 157 | 158 | # References 159 | - [Convolutional Networks on Graphs for Learning Molecular Fingerprints](https://arxiv.org/abs/1509.09292) 160 | 161 | ''' 162 | 163 | def __init__(self, inner_layer_arg, **kwargs): 164 | # Initialise based on one of the three initialisation methods 165 | 166 | # Case 1: Check if inner_layer_arg is conv_width 167 | if isinstance(inner_layer_arg, (int, long)): 168 | self.conv_width = inner_layer_arg 169 | dense_layer_kwargs, kwargs = filter_func_args(layers.Dense.__init__, 170 | kwargs, overrule_args=['name']) 171 | self.create_inner_layer_fn = lambda: layers.Dense(self.conv_width, **dense_layer_kwargs) 172 | 173 | # Case 2: Check if an initialised keras layer is given 174 | elif isinstance(inner_layer_arg, layers.Layer): 175 | assert inner_layer_arg.built == False, 'When initialising with a keras layer, it cannot be built.' 176 | _, self.conv_width = inner_layer_arg.get_output_shape_for((None, None)) 177 | # layer_from_config will mutate the config dict, therefore create a get fn 178 | self.create_inner_layer_fn = lambda: layer_from_config(dict( 179 | class_name=inner_layer_arg.__class__.__name__, 180 | config=inner_layer_arg.get_config())) 181 | 182 | # Case 3: Check if a function is provided that returns a initialised keras layer 183 | elif callable(inner_layer_arg): 184 | example_instance = inner_layer_arg() 185 | assert isinstance(example_instance, layers.Layer), 'When initialising with a function, the function has to return a keras layer' 186 | assert example_instance.built == False, 'When initialising with a keras layer, it cannot be built.' 187 | _, self.conv_width = example_instance.get_output_shape_for((None, None)) 188 | self.create_inner_layer_fn = inner_layer_arg 189 | 190 | else: 191 | raise ValueError('NeuralGraphHidden has to be initialised with 1). int conv_widht, 2). a keras layer instance, or 3). a function returning a keras layer instance.') 192 | 193 | super(NeuralGraphHidden, self).__init__(**kwargs) 194 | 195 | def build(self, inputs_shape): 196 | 197 | # Import dimensions 198 | (max_atoms, max_degree, num_atom_features, num_bond_features, 199 | num_samples) = mol_shapes_to_dims(mol_shapes=inputs_shape) 200 | 201 | self.max_degree = max_degree 202 | 203 | # Add the dense layers (that contain trainable params) 204 | # (for each degree we convolve with a different weight matrix) 205 | self.trainable_weights = [] 206 | self.inner_3D_layers = [] 207 | for degree in range(max_degree): 208 | 209 | # Initialise inner layer, and rename it 210 | inner_layer = self.create_inner_layer_fn() 211 | inner_layer_type = inner_layer.__class__.__name__.lower() 212 | inner_layer.name = self.name + '_inner_' + inner_layer_type + '_' + str(degree) 213 | 214 | # Initialise TimeDistributed layer wrapper in order to parallelise 215 | # dense layer across atoms (3D) 216 | inner_3D_layer_name = self.name + '_inner_timedistributed_' + str(degree) 217 | inner_3D_layer = layers.TimeDistributed(inner_layer, name=inner_3D_layer_name) 218 | 219 | # Build the TimeDistributed layer (which will build the Dense layer) 220 | inner_3D_layer.build((None, max_atoms, num_atom_features+num_bond_features)) 221 | 222 | # Store inner_3D_layer and it's weights 223 | self.inner_3D_layers.append(inner_3D_layer) 224 | self.trainable_weights += inner_3D_layer.trainable_weights 225 | 226 | def call(self, inputs, mask=None): 227 | atoms, bonds, edges = inputs 228 | 229 | # Import dimensions 230 | num_samples = atoms._keras_shape[0] 231 | max_atoms = atoms._keras_shape[1] 232 | num_atom_features = atoms._keras_shape[-1] 233 | num_bond_features = bonds._keras_shape[-1] 234 | 235 | # Create a matrix that stores for each atom, the degree it is 236 | atom_degrees = K.sum(K.not_equal(edges, -1), axis=-1, keepdims=True) 237 | 238 | # For each atom, look up the features of it's neighbour 239 | neighbour_atom_features = neighbour_lookup(atoms, edges, include_self=True) 240 | 241 | # Sum along degree axis to get summed neighbour features 242 | summed_atom_features = K.sum(neighbour_atom_features, axis=-2) 243 | 244 | # Sum the edge features for each atom 245 | summed_bond_features = K.sum(bonds, axis=-2) 246 | 247 | # Concatenate the summed atom and bond features 248 | summed_features = K.concatenate([summed_atom_features, summed_bond_features], axis=-1) 249 | 250 | # For each degree we convolve with a different weight matrix 251 | new_features_by_degree = [] 252 | for degree in range(self.max_degree): 253 | 254 | # Create mask for this degree 255 | atom_masks_this_degree = K.cast(K.equal(atom_degrees, degree), K.floatx()) 256 | 257 | # Multiply with hidden merge layer 258 | # (use time Distributed because we are dealing with 2D input/3D for batches) 259 | # Add keras shape to let keras now the dimensions 260 | summed_features._keras_shape = (None, max_atoms, num_atom_features+num_bond_features) 261 | new_unmasked_features = self.inner_3D_layers[degree](summed_features) 262 | 263 | # Do explicit masking because TimeDistributed does not support masking 264 | new_masked_features = new_unmasked_features * atom_masks_this_degree 265 | 266 | new_features_by_degree.append(new_masked_features) 267 | 268 | # Finally sum the features of all atoms 269 | new_features = layers.merge(new_features_by_degree, mode='sum') 270 | 271 | return new_features 272 | 273 | def get_output_shape_for(self, inputs_shape): 274 | 275 | # Import dimensions 276 | (max_atoms, max_degree, num_atom_features, num_bond_features, 277 | num_samples) = mol_shapes_to_dims(mol_shapes=inputs_shape) 278 | 279 | return (num_samples, max_atoms, self.conv_width) 280 | 281 | @classmethod 282 | def from_config(cls, config): 283 | # Use layer build function to initialise new NeuralHiddenLayer 284 | inner_layer_config = config.pop('inner_layer_config') 285 | # create_inner_layer_fn = lambda: layer_from_config(inner_layer_config.copy()) 286 | def create_inner_layer_fn(): 287 | return layer_from_config(deepcopy(inner_layer_config)) 288 | 289 | layer = cls(create_inner_layer_fn, **config) 290 | return layer 291 | 292 | def get_config(self): 293 | config = super(NeuralGraphHidden, self).get_config() 294 | 295 | # Store config of (a) inner layer of the 3D wrapper 296 | inner_layer = self.inner_3D_layers[0].layer 297 | config['inner_layer_config'] = dict(config=inner_layer.get_config(), 298 | class_name=inner_layer.__class__.__name__) 299 | return config 300 | 301 | 302 | class NeuralGraphOutput(layers.Layer): 303 | ''' Output Convolutional layer in a Neural Graph (as in Duvenaud et. al., 304 | 2015). This layer takes a graph as an input. The graph is represented as by 305 | three tensors. 306 | 307 | - The atoms tensor represents the features of the nodes. 308 | - The bonds tensor represents the features of the edges. 309 | - The edges tensor represents the connectivity (which atoms are connected to 310 | which) 311 | 312 | It returns the fingerprint vector for each sample for the given layer. 313 | 314 | According to the original paper, the fingerprint outputs of each hidden layer 315 | need to be summed in the end to come up with the final fingerprint. 316 | 317 | # Example 318 | Define the input: 319 | ```python 320 | atoms0 = Input(name='atom_inputs', shape=(max_atoms, num_atom_features)) 321 | bonds = Input(name='bond_inputs', shape=(max_atoms, max_degree, num_bond_features)) 322 | edges = Input(name='edge_inputs', shape=(max_atoms, max_degree), dtype='int32') 323 | ``` 324 | 325 | The `NeuralGraphOutput` can be initialised in three ways: 326 | 1. Using an integer `fp_length` and possible kwags (`Dense` layer is used) 327 | ```python 328 | fp_out = NeuralGraphOutput(fp_length, activation='relu', bias=False)([atoms0, bonds, edges]) 329 | ``` 330 | 2. Using an initialised `Dense` layer 331 | ```python 332 | fp_out = NeuralGraphOutput(Dense(fp_length, activation='relu', bias=False))([atoms0, bonds, edges]) 333 | ``` 334 | 3. Using a function that returns an initialised `Dense` layer 335 | ```python 336 | fp_out = NeuralGraphOutput(lambda: Dense(fp_length, activation='relu', bias=False))([atoms0, bonds, edges]) 337 | ``` 338 | 339 | Predict for regression: 340 | ```python 341 | main_prediction = Dense(1, activation='linear', name='main_prediction')(fp_out) 342 | ``` 343 | 344 | # Arguments 345 | inner_layer_arg: Either: 346 | 1. an int defining the `fp_length`, with optional kwargs for the 347 | inner Dense layer 348 | 2. An initialised but not build (`Dense`) keras layer (like a wrapper) 349 | 3. A function that returns an initialised keras layer. 350 | kwargs: For initialisation 1. you can pass `Dense` layer kwargs 351 | 352 | # Input shape 353 | List of Atom and edge tensors of shape: 354 | `[(samples, max_atoms, atom_features), (samples, max_atoms, max_degrees, 355 | bond_features), (samples, max_atoms, max_degrees)]` 356 | where degrees referes to number of neighbours 357 | 358 | # Output shape 359 | Fingerprints matrix 360 | `(samples, fp_length)` 361 | 362 | # References 363 | - [Convolutional Networks on Graphs for Learning Molecular Fingerprints](https://arxiv.org/abs/1509.09292) 364 | 365 | ''' 366 | 367 | def __init__(self, inner_layer_arg, **kwargs): 368 | # Initialise based on one of the three initialisation methods 369 | 370 | # Case 1: Check if inner_layer_arg is fp_length 371 | if isinstance(inner_layer_arg, (int, long)): 372 | self.fp_length = inner_layer_arg 373 | dense_layer_kwargs, kwargs = filter_func_args(layers.Dense.__init__, 374 | kwargs, overrule_args=['name']) 375 | self.create_inner_layer_fn = lambda: layers.Dense(self.fp_length, **dense_layer_kwargs) 376 | 377 | # Case 2: Check if an initialised keras layer is given 378 | elif isinstance(inner_layer_arg, layers.Layer): 379 | assert inner_layer_arg.built == False, 'When initialising with a keras layer, it cannot be built.' 380 | _, self.fp_length = inner_layer_arg.get_output_shape_for((None, None)) 381 | self.create_inner_layer_fn = lambda: inner_layer_arg 382 | 383 | # Case 3: Check if a function is provided that returns a initialised keras layer 384 | elif callable(inner_layer_arg): 385 | example_instance = inner_layer_arg() 386 | assert isinstance(example_instance, layers.Layer), 'When initialising with a function, the function has to return a keras layer' 387 | assert example_instance.built == False, 'When initialising with a keras layer, it cannot be built.' 388 | _, self.fp_length = example_instance.get_output_shape_for((None, None)) 389 | self.create_inner_layer_fn = inner_layer_arg 390 | 391 | else: 392 | raise ValueError('NeuralGraphHidden has to be initialised with 1). int conv_widht, 2). a keras layer instance, or 3). a function returning a keras layer instance.') 393 | 394 | super(NeuralGraphOutput, self).__init__(**kwargs) 395 | 396 | def build(self, inputs_shape): 397 | 398 | # Import dimensions 399 | (max_atoms, max_degree, num_atom_features, num_bond_features, 400 | num_samples) = mol_shapes_to_dims(mol_shapes=inputs_shape) 401 | 402 | # Add the dense layer that contains the trainable parameters 403 | # Initialise dense layer with specified params (kwargs) and name 404 | inner_layer = self.create_inner_layer_fn() 405 | inner_layer_type = inner_layer.__class__.__name__.lower() 406 | inner_layer.name = self.name + '_inner_'+ inner_layer_type 407 | 408 | # Initialise TimeDistributed layer wrapper in order to parallelise 409 | # dense layer across atoms 410 | inner_3D_layer_name = self.name + '_inner_timedistributed' 411 | self.inner_3D_layer = layers.TimeDistributed(inner_layer, name=inner_3D_layer_name) 412 | 413 | # Build the TimeDistributed layer (which will build the Dense layer) 414 | self.inner_3D_layer.build((None, max_atoms, num_atom_features+num_bond_features)) 415 | 416 | # Store dense_3D_layer and it's weights 417 | self.trainable_weights = self.inner_3D_layer.trainable_weights 418 | 419 | 420 | def call(self, inputs, mask=None): 421 | atoms, bonds, edges = inputs 422 | 423 | # Import dimensions 424 | num_samples = atoms._keras_shape[0] 425 | max_atoms = atoms._keras_shape[1] 426 | num_atom_features = atoms._keras_shape[-1] 427 | num_bond_features = bonds._keras_shape[-1] 428 | 429 | # Create a matrix that stores for each atom, the degree it is, use it 430 | # to create a general atom mask (unused atoms are 0 padded) 431 | # We have to use the edge vector for this, because in theory, a convolution 432 | # could lead to a zero vector for an atom that is present in the molecule 433 | atom_degrees = K.sum(K.not_equal(edges, -1), axis=-1, keepdims=True) 434 | general_atom_mask = K.cast(K.not_equal(atom_degrees, 0), K.floatx()) 435 | 436 | # Sum the edge features for each atom 437 | summed_bond_features = K.sum(bonds, axis=-2) 438 | 439 | # Concatenate the summed atom and bond features 440 | atoms_bonds_features = K.concatenate([atoms, summed_bond_features], axis=-1) 441 | 442 | # Compute fingerprint 443 | atoms_bonds_features._keras_shape = (None, max_atoms, num_atom_features+num_bond_features) 444 | fingerprint_out_unmasked = self.inner_3D_layer(atoms_bonds_features) 445 | 446 | # Do explicit masking because TimeDistributed does not support masking 447 | fingerprint_out_masked = fingerprint_out_unmasked * general_atom_mask 448 | 449 | # Sum across all atoms 450 | final_fp_out = K.sum(fingerprint_out_masked, axis=-2) 451 | 452 | return final_fp_out 453 | 454 | def get_output_shape_for(self, inputs_shape): 455 | 456 | # Import dimensions 457 | (max_atoms, max_degree, num_atom_features, num_bond_features, 458 | num_samples) = mol_shapes_to_dims(mol_shapes=inputs_shape) 459 | 460 | return (num_samples, self.fp_length) 461 | 462 | @classmethod 463 | def from_config(cls, config): 464 | # Use layer build function to initialise new NeuralGraphOutput 465 | inner_layer_config = config.pop('inner_layer_config') 466 | create_inner_layer_fn = lambda: layer_from_config(deepcopy(inner_layer_config)) 467 | 468 | layer = cls(create_inner_layer_fn, **config) 469 | return layer 470 | 471 | def get_config(self): 472 | config = super(NeuralGraphOutput, self).get_config() 473 | 474 | # Store config of inner layer of the 3D wrapper 475 | inner_layer = self.inner_3D_layer.layer 476 | config['inner_layer_config'] = dict(config=inner_layer.get_config(), 477 | class_name=inner_layer.__class__.__name__) 478 | return config 479 | 480 | class NeuralGraphPool(layers.Layer): 481 | ''' Pooling layer in a Neural graph, for each atom, takes the max for each 482 | feature between the atom and it's neighbours 483 | 484 | # Input shape 485 | List of Atom and edge tensors of shape: 486 | `[(samples, max_atoms, atom_features), (samples, max_atoms, max_degrees, 487 | bond_features), (samples, max_atoms, max_degrees)]` 488 | where degrees referes to number of neighbours 489 | 490 | # Output shape 491 | New atom features (of same shape:) 492 | `(samples, max_atoms, atom_features)` 493 | ''' 494 | def __init__(self, **kwargs): 495 | super(NeuralGraphPool, self).__init__(**kwargs) 496 | 497 | def call(self, inputs, mask=None): 498 | atoms, bonds, edges = inputs 499 | 500 | # For each atom, look up the featues of it's neighbour 501 | neighbour_atom_features = neighbour_lookup(atoms, edges, maskvalue=-inf, 502 | include_self=True) 503 | 504 | # Take max along `degree` axis (2) to get max of neighbours and self 505 | max_features = K.max(neighbour_atom_features, axis=2) 506 | 507 | atom_degrees = K.sum(K.not_equal(edges, -1), axis=-1, keepdims=True) 508 | general_atom_mask = K.cast(K.not_equal(atom_degrees, 0), K.floatx()) 509 | 510 | return max_features * general_atom_mask 511 | 512 | def get_output_shape_for(self, inputs_shape): 513 | 514 | # Only returns `atoms` tensor 515 | return inputs_shape[0] 516 | 517 | 518 | class AtomwiseDropout(layers.Layer): 519 | ''' Performs dropout over an atom feature vector where each atom will get 520 | the same dropout vector. 521 | 522 | Eg. With an input of `(batch_n, max_atoms, atom_features)`, a dropout mask of 523 | `(batch_n, atom_features)` will be generated, and repeated `max_atoms` times 524 | 525 | # Arguments 526 | p: float between 0 and 1. Fraction of the input units to drop. 527 | 528 | ''' 529 | def __init__(self, p, **kwargs): 530 | self.dropout_layer = layers.Dropout(p) 531 | self.uses_learning_phase = self.dropout_layer.uses_learning_phase 532 | self.supports_masking = True 533 | super(AtomwiseDropout, self).__init__(**kwargs) 534 | 535 | def _get_noise_shape(self, x): 536 | return None 537 | 538 | def call(self, inputs, mask=None): 539 | # Import (symbolic) dimensions 540 | max_atoms = K.shape(inputs)[1] 541 | 542 | # By [farizrahman4u](https://github.com/fchollet/keras/issues/3995) 543 | ones = layers.Lambda(lambda x: (x * 0 + 1)[:, 0, :], output_shape=lambda s: (s[0], s[2]))(inputs) 544 | dropped = self.dropout_layer(ones) 545 | dropped = layers.RepeatVector(max_atoms)(dropped) 546 | return layers.Lambda(lambda x: x[0] * x[1], output_shape=lambda s: s[0])([inputs, dropped]) 547 | 548 | def get_config(self): 549 | config = super(AtomwiseDropout, self).get_config() 550 | config['p'] = self.dropout_layer.p 551 | return config 552 | 553 | #TODO: Add GraphWiseDropout layer, that creates masks for each degree separately. -------------------------------------------------------------------------------- /NGF/models.py: -------------------------------------------------------------------------------- 1 | ''' Defines functions to automate construction of complex neural graph networks. 2 | ''' 3 | from __future__ import division, print_function, absolute_import 4 | 5 | from keras.regularizers import l1l2 6 | from keras.layers import Input, merge, Dense, Dropout, BatchNormalization 7 | from keras import models 8 | 9 | from .layers import NeuralGraphHidden, NeuralGraphOutput, NeuralGraphPool, AtomwiseDropout 10 | from .utils import zip_mixed, is_iterable 11 | 12 | def build_graph_conv_model(max_atoms, max_degree, num_atom_features, 13 | num_bond_features, learning_type, output_size=1, 14 | optimizer='adagrad', **kwargs): 15 | ''' Builds and compiles a graph convolutional network with a regular neural 16 | network on top for regression. 17 | 18 | Especially usefull when using the sklearn `KerasClassifier` wrapper 19 | 20 | # Arguments 21 | max_atoms, max_degree, num_atom_features, num_bond_features (int): The 22 | dimensionalities used to create input layers. 23 | learning_type (str): Intended use of model, affects loss function and final 24 | activation function used. allowed: 'regression', 'binary_class', 25 | 'multi_class' 26 | output_size (int): size of prediciton layer 27 | optimizer (str/keras.optimizer): used to compile the model 28 | kwargs: Used to call `build_graph_conv_net` 29 | 30 | # Returns: 31 | keras Model: compiled for learning_type 32 | 33 | ''' 34 | 35 | # Define the input layers 36 | atoms = Input(name='atom_inputs', shape=(max_atoms, num_atom_features)) 37 | bonds = Input(name='bond_inputs', shape=(max_atoms, max_degree, num_bond_features)) 38 | edges = Input(name='edge_inputs', shape=(max_atoms, max_degree), dtype='int32') 39 | 40 | # Get output of main net 41 | net_output = build_graph_conv_net([atoms, bonds, edges], **kwargs) 42 | 43 | # Add final prediction layer 44 | learning_type = learning_type.lower() 45 | if learning_type == 'regression': 46 | final_activation = 'linear' 47 | loss='mse' 48 | elif learning_type == 'binary_class': 49 | final_activation = 'sigmoid' 50 | loss='binary_crossentropy' 51 | elif learning_type == 'multi_class': 52 | final_activation = 'softmax' 53 | loss='categorical_crossentropy' 54 | else: 55 | raise Exception('Invalid argument for learning type ({})'.format(learning_type)) 56 | main_prediction = Dense(output_size, activation=final_activation, name='main_prediction')(net_output) 57 | 58 | # Build and compile the model 59 | model = models.Model(input=[atoms, bonds, edges], output=[main_prediction]) 60 | model.compile(optimizer=optimizer, loss=loss) 61 | 62 | return model 63 | 64 | def build_graph_conv_net(data_input, 65 | conv_layer_sizes=[], fp_layer_size=1024, net_layer_sizes=[], 66 | conv_activation='relu', fp_activation='softmax', net_activation='relu', 67 | conv_bias=True, fp_bias=True, net_bias=True, 68 | conv_l1=0, fp_l1=0, net_l1=0, 69 | conv_l2=0, fp_l2=0, net_l2=0, 70 | conv_dropout=0, fp_dropout=0, net_dropout=0, 71 | conv_batchnorm=0, fp_batchnorm=0, net_batchnorm=0, 72 | conv_kwargs={}, fp_kwargs={}, net_kwargs={}, 73 | fp_merge_mode='sum', atomwise_dropout=True, 74 | graphpool=False): 75 | ''' Builds a graph convolutional network with a regular neural network on 76 | top. 77 | 78 | # Arguments 79 | data_input (tuple): The Input feature layers (as `[atoms, bonds, edges]`) 80 | 81 | # Layer sizes 82 | conv_layer_sizes (list): list of int sizes for each hidden layer in the graph 83 | fp_layer_size (int/list): list of int sizes for each output layer in the 84 | graph network. Should be either of length 1, or len(conv_layer_sizes)+1. 85 | When of lenght 1 (or as plain int), only one output layer will be 86 | added on top of the convolutional network. 87 | Otherwise, the first output layer will be connected to the unconvolved 88 | atom inputs, and the subsequent layers will be aligned with the 89 | hidden graph layers. In this case, use `None` for hidden layers 90 | where no fingerprint output is desired 91 | net_layer_sizes (list): list of int sizes for each hidden layer in the 92 | regular network on top of the graph network 93 | 94 | # Layer options 95 | All layer options are analougusly specified for the `NeuralGraphHidden` 96 | layers (prefix `conv_`), the `NeuralGraphOutput` layers (previx `fp_`) 97 | and the `Dense` layers of the regular net (prefix `net_`) respectively. 98 | 99 | All arguments can be specified as a single value or as a list of values, 100 | If a single value is specified, it will be used for all respective layers. 101 | If multiple values are specified, the list should have the same length 102 | as the layer_sizes list for the corresponding layers. 103 | 104 | activation (string/function): name of activation function to use, 105 | or alternatively, elementwise Theano function (see `keras.layers.Dense`) 106 | bias (bool): wether or not to use bias 107 | l1 (float): amount of l1 regularisation (use 0 for no l1 regularisation) 108 | l2 (float): amount of l2 regularisation (use 0 for no l2 regularisation) 109 | dropout (float): p value for dropout (use 0 for no dropout) 110 | batchnorm (float): epsilon value for batchnorm (use 0 for no batchnorm) 111 | kwargs (dict): other arguments that will be passed to the `Dense` layers 112 | of the regular network, or to the inner `Dense` layers of the 113 | `NeuralGraph` layers 114 | 115 | fp_merge_mode (str): If multiple fingerprint ouput layers are specified, 116 | this arguments specifies how they are combined. (see `keras.layers.merge`) 117 | Note that if `fp_merge_mode='sum', all `fp_layer_size` should be equal. 118 | atomwise_dropout (bool): If true, the same atoms will be dropped out in 119 | each batch, this should be done because the weights are also shared 120 | between atoms in each batch. But could be turned of to investigate its 121 | effect 122 | graphpool (bool): If True, apply graphpool after each hidden graphlayer, 123 | can also be specified as a list 124 | 125 | # Returns: 126 | output (keras tensor): Ouput of final layer of network. Add a prediciton 127 | layer and use functional API to turn into a model 128 | ''' 129 | 130 | # ======= Process network parameters ======= 131 | # Rename for consistency 132 | fp_layer_sizes = fp_layer_size 133 | 134 | # Ensure fp_layer_sizes is a list 135 | if not is_iterable(fp_layer_sizes): 136 | fp_layer_sizes = [fp_layer_sizes] 137 | 138 | # Merge all parameter into tuples for each layer 139 | conv_layers = zip_mixed(conv_layer_sizes, conv_activation, conv_bias, 140 | conv_l1, conv_l2, conv_dropout, conv_batchnorm, 141 | conv_kwargs, graphpool, repeat_classes=[dict, str]) 142 | fp_layers = zip_mixed(fp_layer_sizes, fp_activation, fp_bias, 143 | fp_l1, fp_l2, fp_dropout, fp_batchnorm, 144 | fp_kwargs, repeat_classes=[dict, str]) 145 | net_layers = zip_mixed(net_layer_sizes, net_activation, net_bias, 146 | net_l1, net_l2, net_dropout, net_batchnorm, 147 | net_kwargs, repeat_classes=[dict, str]) 148 | 149 | # Ensure fp_layers is of length conv_layers+1 150 | if len(fp_layer_sizes) != len(conv_layer_sizes)+1: 151 | assert len(fp_layer_sizes) == 1, 'Incorrect amount of fingerprint layers specified. Either specify 1 or len(conv_layer_sizes)+1 ({}) fp_layer_sizes ({})'.format(len(conv_layer_sizes)+1, len(fp_layer_sizes)) 152 | # Add None for fp_layer_sizes and add None-tuples to fp_layers to align 153 | # fp layers with conv_layers (the one layer provided will be the last layer) 154 | fp_layer_sizes = [None]*len(conv_layer_sizes) + list(fp_layer_sizes) 155 | fp_layers = [(None, )*len(fp_layers[0])] *len(conv_layer_sizes) + fp_layers 156 | 157 | 158 | # Check zip result is the same length as specified sizes 159 | assert len(conv_layers) == len(conv_layer_sizes), 'If `conv_`-layer-arguments are specified as a list, they should have the same length as `conv_layer_sizes` (length {0}), found an argument of lenght {1}'.format(len(conv_layer_sizes), len(conv_layers)) 160 | assert len(fp_layers) == len(fp_layer_sizes), 'If `fp`-layer-arguments are specified as a list, they should have the same length as `fp_layer_sizes` (len {0}), found an argument of lenght {1}'.format(len(fp_layer_sizes), len(fp_layers)) 161 | assert len(net_layers) == len(net_layer_sizes), 'If `net_`-layer-arguments are specified as a list, they should have the same length as `net_layer_sizes` (length {0}), found an argument of lenght {1}'.format(len(net_layer_sizes), len(net_layers)) 162 | 163 | # ======= Build the network ======= 164 | 165 | # The inputs and outputs 166 | atoms, bonds, edges = data_input 167 | fingerprint_outputs = [] 168 | 169 | def ConvDropout(p_dropout): 170 | ''' Defines the standard Dropout layer for convnets 171 | ''' 172 | if atomwise_dropout: 173 | return AtomwiseDropout(p_dropout) 174 | return Dropout(p_dropout) 175 | 176 | # Add first output layer directly to atom inputs 177 | fp_size, fp_activation, fp_bias, fp_l1, fp_l2, fp_dropout, fp_batchnorm, fp_kwargs = fp_layers.pop(0) 178 | if fp_size: 179 | fp_atoms_in = atoms 180 | 181 | if fp_batchnorm: 182 | fp_atoms_in = BatchNormalization(fp_batchnorm)(fp_atoms_in) 183 | if fp_dropout: 184 | fp_atoms_in = ConvDropout(fp_dropout)(fp_atoms_in) 185 | 186 | fp_out = NeuralGraphOutput(fp_size, activation=fp_activation, bias=fp_bias, 187 | W_regularizer=l1l2(fp_l1, fp_l2), 188 | b_regularizer=l1l2(fp_l1, fp_l2), 189 | **fp_kwargs)([fp_atoms_in, bonds, edges]) 190 | fingerprint_outputs.append(fp_out) 191 | 192 | # Add Graph convolutional layers 193 | convolved_atoms = [atoms] 194 | for conv_layer, fp_layer in zip(conv_layers, fp_layers): 195 | 196 | # Import parameters 197 | (conv_size, conv_activation, conv_bias, conv_l1, conv_l2, conv_dropout, 198 | conv_batchnorm, conv_kwargs, graphpool) = conv_layer 199 | fp_size, fp_activation, fp_bias, fp_l1, fp_l2, fp_dropout, fp_batchnorm, fp_kwargs = fp_layer 200 | 201 | # Add hidden layer 202 | atoms_in = convolved_atoms[-1] 203 | 204 | if conv_batchnorm: 205 | atoms_in = BatchNormalization(conv_batchnorm)(atoms_in) 206 | if conv_dropout: 207 | atoms_in = ConvDropout(conv_dropout)(atoms_in) 208 | 209 | # Use inner_layer_fn init method of `NeuralGraphHidden`, because it is 210 | # the most powerfull (e.g. allows custom activation functions) 211 | def inner_layer_fn(): 212 | return Dense(conv_size, activation=conv_activation, bias=conv_bias, 213 | W_regularizer=l1l2(conv_l1, conv_l2), 214 | b_regularizer=l1l2(conv_l1, conv_l2), **conv_kwargs) 215 | atoms_out = NeuralGraphHidden(inner_layer_fn)([atoms_in, bonds, edges]) 216 | 217 | if graphpool: 218 | atoms_out = NeuralGraphPool()([atoms_out, bonds, edges]) 219 | 220 | # Export 221 | convolved_atoms.append(atoms_out) 222 | 223 | # Add output layer (if specified) 224 | if fp_size: 225 | fp_atoms_in = atoms_out 226 | 227 | if fp_batchnorm: 228 | fp_atoms_in = BatchNormalization(fp_batchnorm)(fp_atoms_in) 229 | if fp_dropout: 230 | fp_atoms_in = ConvDropout(fp_dropout)(fp_atoms_in) 231 | 232 | fp_out = NeuralGraphOutput(fp_size, activation=fp_activation, bias=fp_bias, 233 | W_regularizer=l1l2(fp_l1, fp_l2), 234 | b_regularizer=l1l2(fp_l1, fp_l2), 235 | **fp_kwargs)([fp_atoms_in, bonds, edges]) 236 | 237 | # Export 238 | fingerprint_outputs.append(fp_out) 239 | 240 | 241 | 242 | # Merge fingerprint 243 | if len(fingerprint_outputs) > 1: 244 | final_fp = merge(fingerprint_outputs, mode=fp_merge_mode) 245 | else: 246 | final_fp = fingerprint_outputs[-1] 247 | 248 | # Add regular Neural net 249 | net_outputs = [final_fp] 250 | for net_layer in net_layers: 251 | 252 | # Import parameters 253 | layer_size, net_activation, net_bias, net_l1, net_l2, net_dropout, net_batchnorm, net_kwargs = net_layer 254 | 255 | # Add regular nn layers 256 | net_in = net_outputs[-1] 257 | 258 | if net_batchnorm: 259 | net_in = BatchNormalization(net_batchnorm)(net_in) 260 | if net_dropout: 261 | net_in = Dropout(net_dropout)(net_in) 262 | 263 | net_out = Dense(layer_size, activation=net_activation, bias=net_bias, 264 | W_regularizer=l1l2(net_l1, net_l2), 265 | b_regularizer=l1l2(net_l1, net_l2), **net_kwargs)(net_in) 266 | 267 | # Export 268 | net_outputs.append(net_out) 269 | 270 | return net_outputs[-1] -------------------------------------------------------------------------------- /NGF/preprocessing.py: -------------------------------------------------------------------------------- 1 | ''' Code to generate graph tensor features for molecules (in SMILES form) 2 | ''' 3 | from __future__ import division, print_function 4 | from functools import partial 5 | from multiprocessing import cpu_count, Pool 6 | 7 | import numpy as np 8 | 9 | from rdkit import Chem 10 | from keras.utils.generic_utils import Progbar 11 | 12 | from . import features 13 | 14 | def padaxis(array, new_size, axis, pad_value=0, pad_right=True): 15 | ''' Padds one axis of an array to a new size 16 | 17 | This is just a wrapper for np.pad, more usefull when only padding a single axis 18 | 19 | # Arguments: 20 | array: the array to pad 21 | new_size: the new size of the specified axis 22 | axis: axis along which to pad 23 | pad_value: pad value, 24 | pad_right: boolean, pad on the right or left side 25 | 26 | # Returns: 27 | padded_array: np.array 28 | 29 | ''' 30 | add_size = new_size - array.shape[axis] 31 | assert add_size >= 0, 'Cannot pad dimension {0} of size {1} to smaller size {2}'.format(axis, array.shape[axis], new_size) 32 | pad_width = [(0,0)]*len(array.shape) 33 | 34 | #pad after if int is provided 35 | if pad_right: 36 | pad_width[axis] = (0, add_size) 37 | else: 38 | pad_width[axis] = (add_size, 0) 39 | 40 | return np.pad(array, pad_width=pad_width, mode='constant', constant_values=pad_value) 41 | 42 | def tensorise_smiles(smiles, max_degree=5, max_atoms=None): 43 | '''Takes a list of smiles and turns the graphs in tensor representation. 44 | 45 | # Arguments: 46 | smiles: a list (or iterable) of smiles representations 47 | max_atoms: the maximum number of atoms per molecule (to which all 48 | molecules will be padded), use `None` for auto 49 | max_degree: max_atoms: the maximum number of neigbour per atom that each 50 | molecule can have (to which all molecules will be padded), use `None` 51 | for auto 52 | 53 | **NOTE**: It is not recommended to set max_degree to `None`/auto when 54 | using `NeuralGraph` layers. Max_degree determines the number of 55 | trainable parameters and is essentially a hyperparameter. 56 | While models can be rebuilt using different `max_atoms`, they cannot 57 | be rebuild for different values of `max_degree`, as the architecture 58 | will be different. 59 | 60 | For organic molecules `max_degree=5` is a good value (Duvenaud et. al, 2015) 61 | 62 | 63 | # Returns: 64 | atoms: np.array, An atom feature np.array of size `(molecules, max_atoms, atom_features)` 65 | bonds: np.array, A bonds np.array of size `(molecules, max_atoms, max_neighbours)` 66 | edges: np.array, A connectivity array of size `(molecules, max_atoms, max_neighbours, bond_features)` 67 | TODO: 68 | * Arguments for sparse vector encoding 69 | 70 | ''' 71 | 72 | # import sizes 73 | n = len(smiles) 74 | n_atom_features = features.num_atom_features() 75 | n_bond_features = features.num_bond_features() 76 | 77 | # preallocate atom tensor with 0's and bond tensor with -1 (because of 0 index) 78 | # If max_degree or max_atoms is set to None (auto), initialise dim as small 79 | # as possible (1) 80 | atom_tensor = np.zeros((n, max_atoms or 1, n_atom_features)) 81 | bond_tensor = np.zeros((n, max_atoms or 1, max_degree or 1, n_bond_features)) 82 | edge_tensor = -np.ones((n, max_atoms or 1, max_degree or 1), dtype=int) 83 | 84 | for mol_ix, s in enumerate(smiles): 85 | 86 | #load mol, atoms and bonds 87 | mol = Chem.MolFromSmiles(s) 88 | assert mol is not None, 'Could not parse smiles {}'.format(s) 89 | atoms = mol.GetAtoms() 90 | bonds = mol.GetBonds() 91 | 92 | # If max_atoms is exceeded, resize if max_atoms=None (auto), else raise 93 | if len(atoms) > atom_tensor.shape[1]: 94 | assert max_atoms is None, 'too many atoms ({0}) in molecule: {1}'.format(len(atoms), s) 95 | atom_tensor = padaxis(atom_tensor, len(atoms), axis=1) 96 | bond_tensor = padaxis(bond_tensor, len(atoms), axis=1) 97 | edge_tensor = padaxis(edge_tensor, len(atoms), axis=1, pad_value=-1) 98 | 99 | rdkit_ix_lookup = {} 100 | connectivity_mat = {} 101 | 102 | for atom_ix, atom in enumerate(atoms): 103 | # write atom features 104 | atom_tensor[mol_ix, atom_ix, : n_atom_features] = features.atom_features(atom) 105 | 106 | # store entry in idx 107 | rdkit_ix_lookup[atom.GetIdx()] = atom_ix 108 | 109 | # preallocate array with neighbour lists (indexed by atom) 110 | connectivity_mat = [ [] for _ in atoms] 111 | 112 | for bond in bonds: 113 | # lookup atom ids 114 | a1_ix = rdkit_ix_lookup[bond.GetBeginAtom().GetIdx()] 115 | a2_ix = rdkit_ix_lookup[bond.GetEndAtom().GetIdx()] 116 | 117 | # lookup how many neighbours are encoded yet 118 | a1_neigh = len(connectivity_mat[a1_ix]) 119 | a2_neigh = len(connectivity_mat[a2_ix]) 120 | 121 | # If max_degree is exceeded, resize if max_degree=None (auto), else raise 122 | new_degree = max(a1_neigh, a2_neigh) + 1 123 | if new_degree > bond_tensor.shape[2]: 124 | assert max_degree is None, 'too many neighours ({0}) in molecule: {1}'.format(new_degree, s) 125 | bond_tensor = padaxis(bond_tensor, new_degree, axis=2) 126 | edge_tensor = padaxis(edge_tensor, new_degree, axis=2, pad_value=-1) 127 | 128 | # store bond features 129 | bond_features = np.array(features.bond_features(bond), dtype=int) 130 | bond_tensor[mol_ix, a1_ix, a1_neigh, :] = bond_features 131 | bond_tensor[mol_ix, a2_ix, a2_neigh, :] = bond_features 132 | 133 | #add to connectivity matrix 134 | connectivity_mat[a1_ix].append(a2_ix) 135 | connectivity_mat[a2_ix].append(a1_ix) 136 | 137 | #store connectivity matrix 138 | for a1_ix, neighbours in enumerate(connectivity_mat): 139 | degree = len(neighbours) 140 | edge_tensor[mol_ix, a1_ix, : degree] = neighbours 141 | 142 | return atom_tensor, bond_tensor, edge_tensor 143 | 144 | def concat_mol_tensors(mol_tensors_list, match_degree=True, match_max_atoms=False): 145 | '''Concatenates a list of molecule tensors 146 | 147 | # Arguments: 148 | mol_tensor_list: list of molecule tensors (e.g. list of 149 | `(atoms, bonds, edges)`-triplets) 150 | match_degree: bool, if True, the degrees of all tensors should match, 151 | if False, unmatching degrees will be padded to align them. 152 | match_max_atoms: bool, simular to match_degree but for max_atoms 153 | 154 | # Retuns: 155 | a single molecule tensor (as returned by `tensorise_smiles`) 156 | ''' 157 | 158 | assert isinstance(mol_tensors_list, (tuple, list)), 'Provide a list or tuple of molecule tensors to concatenate' 159 | 160 | # get max_atoms (#1) of atoms (#0) tensor of first batch (#0) 161 | # and max_degree (#2) of bonds (#1) tensor of first batch (#0) 162 | max_atoms = mol_tensors_list[0][0].shape[1] 163 | max_degree = mol_tensors_list[0][1].shape[2] 164 | 165 | 166 | # Obtain the max_degree and max_atoms of all tensors in the list 167 | for atoms, bonds, edges in mol_tensors_list: 168 | assert bonds.shape[0] == edges.shape[0] == atoms.shape[0], "batchsize doesn't match within tensor" 169 | assert bonds.shape[1] == edges.shape[1] == atoms.shape[1], "max_atoms doesn't match within tensor" 170 | assert bonds.shape[2] == edges.shape[2], "degree doesn't match within tensor" 171 | 172 | if match_max_atoms: 173 | assert max_atoms == atoms.shape[1], '`max_atoms` of molecule tensors does not match, set `match_max_atoms` to False to adjust' 174 | else: 175 | max_atoms = max(max_atoms, atoms.shape[1]) 176 | 177 | if match_degree: 178 | assert max_degree == bonds.shape[2], '`degree` of molecule tensors does not match, set `match_degree` to False to adjust' 179 | else: 180 | max_degree = max(max_degree, bonds.shape[2]) 181 | 182 | # Pad if necessary and separate tensors 183 | atoms_list = [] 184 | bonds_list = [] 185 | edges_list = [] 186 | for atoms, bonds, edges in mol_tensors_list: 187 | 188 | atoms = padaxis(atoms, max_atoms, axis=1) 189 | bonds = padaxis(bonds, max_atoms, axis=1) 190 | edges = padaxis(edges, max_atoms, axis=1, pad_value=-1) 191 | 192 | bonds = padaxis(bonds, max_degree, axis=2) 193 | edges = padaxis(edges, max_degree, axis=2, pad_value=-1) 194 | 195 | atoms_list.append(atoms) 196 | bonds_list.append(bonds) 197 | edges_list.append(edges) 198 | 199 | #stack along batch-size axis 200 | atoms = np.concatenate(atoms_list, axis=0) 201 | bonds = np.concatenate(bonds_list, axis=0) 202 | edges = np.concatenate(edges_list, axis=0) 203 | 204 | return atoms, bonds, edges 205 | 206 | 207 | def tensorise_smiles_mp(smiles, max_degree=5, max_atoms=None, workers=cpu_count()-1, chunksize=3000, verbose=True): 208 | ''' Multiprocess implementation of `tensorise_smiles` 209 | 210 | # Arguments: 211 | See `tensorise_smiles` documentation 212 | 213 | # Additional arguments: 214 | workers: int, num parallel processes 215 | chunksize: int, num molecules tensorised per worker, bigger chunksize is 216 | preffered as each process will preallocate np.arrays 217 | 218 | # Returns: 219 | See `tensorise_smiles` documentation 220 | 221 | # TODO: 222 | - fix python keyboardinterrupt bug: 223 | https://noswap.com/blog/python-multiprocessing-keyboardinterrupt 224 | - replace progbar with proper logging 225 | ''' 226 | 227 | pool = Pool(processes=workers) 228 | 229 | # Create an iterator 230 | #http://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks 231 | def chunks(l, n): 232 | """Yield successive n-sized chunks from l.""" 233 | for i in range(0, len(l), n): 234 | yield l[i:i + n] 235 | smiles_chunks = chunks(smiles, chunksize) 236 | 237 | # MAP: Tensorise in parallel 238 | map_function = partial(tensorise_smiles, max_degree=max_degree, max_atoms=max_atoms) 239 | if verbose: 240 | print('Tensorising molecules in batches...') 241 | pbar = Progbar(len(smiles), width=50) 242 | tensor_list = [] 243 | for tensors in pool.imap(map_function, smiles_chunks): 244 | pbar.add(tensors[0].shape[0]) 245 | tensor_list.append(tensors) 246 | print('Merging batch tensors... ', end='') 247 | else: 248 | tensor_list = pool.map(map_function, smiles_chunks) 249 | if verbose: 250 | print('[DONE]') 251 | 252 | # REDUCE: Concatenate the obtained tensors 253 | pool.close() 254 | pool.join() 255 | return concat_mol_tensors(tensor_list, match_degree=max_degree!=None, match_max_atoms=max_atoms!=None) -------------------------------------------------------------------------------- /NGF/sparse.py: -------------------------------------------------------------------------------- 1 | ''' Classes for sparse vectors, lists of related tensors and tensors describing 2 | molecular graphs 3 | ''' 4 | from __future__ import division, print_function, absolute_import 5 | 6 | import numpy as np 7 | import pickle as pkl 8 | 9 | from .utils import mol_dims_to_shapes, mol_shapes_to_dims 10 | 11 | class SparseTensor(object): 12 | ''' An immutable class for sparse tensors of any shape, type and sparse value. 13 | 14 | # Arguments 15 | nonsparse_indices (nested int-array): List of arrays with indices for 16 | nonsparse elements at each dimension 17 | nonsparse_values (int-array): array of corresponding values 18 | default_value (of same dtype): The value that will be used for the non- 19 | sparse indices 20 | dtype (str/np.dtype): dtype, if `None`, dtype of nonsparse_values will be 21 | used 22 | main_axis (int): Axis along which `len` and `__getitem__ ` will work. 23 | assume sorted (bool): Only set to true if `nonsparse_indices[main_axis]` 24 | is sorted! (To speed up initialisation) 25 | 26 | # Attributes 27 | shape (tuple): The sparse tensor has no real shape, `tensor.as_array()` 28 | takes a `shape` argument. However, the tensor does have a mimimum 29 | size for each dimension (determined by the nonsparse element at the 30 | furthest position on that dimension) 31 | dtype (str/dtype): Can be changed after the tensor is created 32 | ndims (int): number of dimensions 33 | 34 | # Notes 35 | - This class is optimised for storage of data. The idea is that one of the 36 | dimensions is declared to be the `main_axis`. (This would be the axis 37 | along which the different datapoints are defined). All indexing occurs 38 | along this axis. 39 | - This class is not optimised for tensor operations, use `as_array` / numpy 40 | for that 41 | - Is best initialised trough the classmethod `from_array` 42 | - As the object is like an immutable object, there is no support for 43 | assignment or retrieval of individual entries. Use 44 | `tensor.as_array()[indices]` instead. 45 | - Currently, code is mainly optimised for retrieval of (relatively small) 46 | batches. 47 | 48 | # TODO, possible optimisations: 49 | - discard main index but use lookup when storing 50 | - build new lookup during __getitem__ and pass on init of new tensor to 51 | avoid expensive rebuilding 52 | ''' 53 | def __init__(self, nonsparse_indices, nonsparse_values, default_value=0, 54 | max_shape=None, dtype=None, main_axis=0, assume_sorted=False): 55 | 56 | # Assert valid index and convert negative indices to positive 57 | ndims = len(nonsparse_indices) 58 | main_axis = range(ndims)[main_axis] 59 | 60 | self.main_axis = main_axis 61 | self.default_value = default_value 62 | 63 | # Sort if necessary 64 | if not assume_sorted and len(nonsparse_values): 65 | nonsparse_entries = zip(nonsparse_values, *nonsparse_indices) 66 | sorted(nonsparse_entries, key=lambda x: x[main_axis+1]) 67 | sorted_entries = zip(*nonsparse_entries) 68 | nonsparse_values = list(sorted_entries[0]) 69 | nonsparse_indices = list(sorted_entries[1:]) 70 | 71 | self.nonsparse_indices = [np.array([]) for _ in range(ndims)] 72 | self.nonsparse_values = np.array([]) 73 | 74 | # Convert indices and values to numpy array and check dimensionality 75 | for i, ind in enumerate(nonsparse_indices): 76 | assert len(ind) == len(nonsparse_values), 'nonsparse_indices (size{0} @index {1}) should be of same length as nonsparse_values (size {2})'.format(len(ind), i, len(nonsparse_values)) 77 | nonsparse_indices[i] = np.array(ind, dtype='int') 78 | self.nonsparse_indices = nonsparse_indices 79 | self.nonsparse_values = np.array(nonsparse_values) 80 | 81 | # Calculate and set the shape 82 | if len(self.nonsparse_values): 83 | self.true_shape = tuple([max(inds)+1 for inds in nonsparse_indices]) 84 | else: 85 | self.true_shape = tuple([0]*ndims) 86 | 87 | # Setting dtype will alter self.nonsparse_values 88 | dtype = dtype or self.nonsparse_values.dtype 89 | self.dtype = dtype 90 | 91 | # Setting max_shape will check if shape matches with nonsparse entries 92 | self.max_shape = max_shape or [None]*ndims 93 | 94 | # Build lookup for quick indexing along the main_axis 95 | # lookup defines first position of that element 96 | self.lookup = np.searchsorted(nonsparse_indices[self.main_axis], 97 | range(self.shape[self.main_axis]+1)) 98 | 99 | @property 100 | def max_shape(self): 101 | return self._max_shape 102 | 103 | @max_shape.setter 104 | def max_shape(self, max_shape): 105 | for true_s, max_s, in zip(self.true_shape, max_shape): 106 | assert (max_s is None) or (max_s>=true_s) , 'Cannot set max_shape {} smaller than true shape {}'.format(max_shape, self.true_shape) 107 | self._max_shape = tuple(max_shape) 108 | 109 | @property 110 | def shape(self): 111 | return tuple([true_s if max_s==None else max_s 112 | for true_s, max_s in zip(self.true_shape, self.max_shape)]) 113 | 114 | @property 115 | def ndims(self): 116 | return len(self.nonsparse_indices) 117 | 118 | @property 119 | def dtype(self): 120 | return self._dtype 121 | 122 | @dtype.setter 123 | def dtype(self, dtype): 124 | self._dtype = np.dtype(dtype) 125 | self.nonsparse_values = self.nonsparse_values.astype(self.dtype) 126 | 127 | def _nonsparse_entries(self, keys): 128 | ''' Returns indices and values required to create a new SparseTensor 129 | given the provided keys (along main_axis) 130 | 131 | # Arguments: 132 | keys (int/list): The keys for which to return the nonspare entries 133 | 134 | # Returns: 135 | indices (np.array): the new nonsparse indices (concatenated) 136 | values (np.array): the corresponding values (concatenated) 137 | 138 | # Note: 139 | mainly meant for internal use. Helper function of `self.__getitem__` 140 | 141 | ''' 142 | if isinstance(keys, int): 143 | 144 | while keys < 0: 145 | keys += len(self) 146 | 147 | start_stop = self.lookup[keys:keys+2] 148 | if len(start_stop): 149 | inds = range(*start_stop) 150 | else: 151 | inds = [] 152 | 153 | indices = [indices[inds] for indices in self.nonsparse_indices] 154 | values = self.nonsparse_values[inds] 155 | 156 | return indices, values 157 | 158 | elif isinstance(keys, (list, tuple, np.ndarray)): 159 | 160 | indices = [[] for _ in range(self.ndims)] 161 | values = [] 162 | 163 | for g, key in enumerate(keys): 164 | add_indices, add_values = self._nonsparse_entries(key) 165 | values.append(add_values) 166 | for i in range(self.ndims): 167 | if i == self.main_axis: 168 | # For the main_axis, rewrite the keys in chronological 169 | # order (e.g. respect the ordering provided by keys) 170 | indices[i].append(np.array([g]*len(add_values))) 171 | else: 172 | indices[i].append(add_indices[i]) 173 | 174 | indices = [np.concatenate(inds) for inds in indices] 175 | values = np.concatenate(values) 176 | 177 | return indices, values 178 | 179 | else: 180 | raise ValueError 181 | 182 | # Magic funcions 183 | def __len__(self): 184 | return self.shape[self.main_axis] 185 | 186 | def __getitem__(self, keys): 187 | '''Gets the requested datapoints (along main axis) as SparseTensor 188 | 189 | # Arguments: 190 | keys (int, slice, list-like): Only one dimensional indexing is allowed 191 | 192 | # Returns: 193 | tensor (selfDataTensor): A new `SparseTensor` that corresponds 194 | to the requested keys 195 | ''' 196 | 197 | # Ensure keys is of usable type 198 | if isinstance(keys, slice): 199 | start, stop, step = keys.indices(len(self)) 200 | keys = range(start, stop, step) 201 | if isinstance(keys, (tuple, list, np.ndarray)): 202 | if len(keys) == 0: 203 | raise IndexError('Cannot index `SparseTensor` with empty slice (`[]`)') 204 | else: 205 | assert isinstance(keys[0], int), 'Indexing is only allowed along the main axis ({})'.format(self.main_axis) 206 | elif isinstance(keys, int): 207 | pass 208 | else: 209 | raise IndexError('Only int, list, np.ndarray or slice (`:`) allowed for indexing `SparseTensor`') 210 | 211 | # Copy properties of self to be passed to child object (make them mutatable) 212 | indices, values = self._nonsparse_entries(keys) 213 | max_shape = list(self.max_shape) 214 | main_axis = int(self.main_axis) 215 | 216 | # If getting a single element, drop singleton dimension 217 | if isinstance(keys, int): 218 | indices.pop(main_axis) 219 | max_shape.pop(main_axis) 220 | # Determining the new main axis is actually a trivial decision 221 | main_axis = min(main_axis, len(max_shape)-1) 222 | 223 | return self.__class__(dtype=self.dtype, 224 | nonsparse_indices=indices, nonsparse_values=values, 225 | main_axis=main_axis, default_value=self.default_value, 226 | max_shape=max_shape) 227 | 228 | def __repr__(self): 229 | return "%s(dtype='%s', nonsparse_indices=%r, nonsparse_values=%r, main_axis=%r, default_value=%r, max_shape=%r)" % ( 230 | self.__class__.__name__, self.dtype, 231 | [list(ind) for ind in self.nonsparse_indices], 232 | list(self.nonsparse_values), self.main_axis, self.default_value, 233 | self.max_shape) 234 | 235 | def __str__(self): 236 | return "%s(dtype='%s', shape=%s, default_value=%s)" % ( 237 | self.__class__.__name__, self.dtype, self.shape, self.default_value) 238 | 239 | def __eq__(self, other): 240 | ''' Returns true if the sparse matrix can be expressed as other (by 241 | forcing it into the same shape). 242 | 243 | If shapes cannot match, raises 244 | 245 | Note that `sparse.as_array(full_shape) == sparse` will have good performance, 246 | because it uses this method, but `sparse == sparse.as_array(full_shape)` 247 | will not work well, because numpy (1.11.2) will try to do the comparison 248 | instead of calling this method. 249 | ''' 250 | 251 | if isinstance(other, SparseTensor): 252 | other = other.as_array() 253 | shape = [max(s, o) for s,o in zip(self.shape, other.shape)] 254 | else: 255 | other = np.array(other) 256 | shape = other.shape 257 | 258 | return self.as_array(shape) == other 259 | 260 | def __ne__(self, other): 261 | return np.invert(self == other) 262 | 263 | # Export and import functionality 264 | @classmethod 265 | def from_array(cls, arr, dtype=None, main_axis=0, default_value=0, 266 | max_shape=None): 267 | ''' Turns a regular array or array-like into a SparseTensor 268 | 269 | # Arguments: 270 | arr (array-like): The array to convert into a SparseTensor 271 | dtype (str/np.dtype): The datatype to use. If none is provided then 272 | `np.array(arr).dtype` will be used 273 | default_value (of same dtype): The nonsparse value to filter out 274 | 275 | # Returns: 276 | tensor (SparseTensor): s.t. `tensor.as_array(arr.shape) == arr` 277 | 278 | ''' 279 | 280 | arr = np.array(arr) 281 | 282 | nonsparse_indices = list(np.where(arr != default_value)) 283 | nonsparse_values = arr[nonsparse_indices] 284 | 285 | # Assume_sorted if main_axis=0 because of np.where 286 | assume_sorted = main_axis==0 287 | 288 | return cls(dtype=arr.dtype, nonsparse_indices=nonsparse_indices, 289 | nonsparse_values=nonsparse_values, main_axis=0, 290 | max_shape=max_shape, default_value=default_value, 291 | assume_sorted=assume_sorted) 292 | 293 | 294 | def as_array(self, shape=None): 295 | '''Returns the SparseTensor as a nonsparse np.array 296 | 297 | # Arguments: 298 | shape (tuple/list): option to overwrite `self.max_shape` for 299 | this call. Array returned will have this shape. 300 | 301 | If None, `self.shape` will be used. (note that `self.shape` is 302 | defined by `self.max_shape`, or `self.true_shape` where `self.max_shape` 303 | is None). None values can also be used for individual dimensions 304 | wihin the shape tuple/list. 305 | 306 | Note that `shape` should be at least as big as `self.true_shape`. 307 | 308 | # Returns: 309 | out (np.array): nonsparse array of self.dtype 310 | 311 | ''' 312 | 313 | if not shape: 314 | shape = [None] * self.ndims 315 | 316 | # Overwrite None with self.shape 317 | shape = [true_s if s==None else s for s, true_s in zip(shape, self.shape)] 318 | # Check if obtained shape matches with self.true_shape 319 | assert np.all([s >=true_s for s, true_s in zip(shape, self.true_shape)]), 'shape ({}) should be at least {}'.format(shape, self.true_shape) 320 | 321 | out = np.zeros(shape, dtype=self.dtype) 322 | out.fill(self.default_value) 323 | out[self.nonsparse_indices] = self.nonsparse_values 324 | 325 | return out 326 | 327 | def to_config(self, jsonify=False): 328 | ''' Returns a dict that can be used to recreate the file efficiently 329 | 330 | # Arguments: 331 | jsonify (bool): If True, dict will be jsonifiably (no `np.arrays`) 332 | 333 | # Returns: 334 | config (dict): that can be used in `SparseTensor.from_config` 335 | 336 | ''' 337 | if jsonify: 338 | nonsparse_indices = [i.tolist() for i in self.nonsparse_indices] 339 | nonsparse_values = self.nonsparse_values.tolist() 340 | else: 341 | nonsparse_indices = self.nonsparse_indices 342 | nonsparse_values = self.nonsparse_values 343 | 344 | return dict(nonsparse_indices=nonsparse_indices, nonsparse_values=nonsparse_values, 345 | default_value=self.default_value, dtype=str(self.dtype), 346 | main_axis=self.main_axis, max_shape=self.max_shape,) 347 | 348 | @classmethod 349 | def from_config(cls, config): 350 | ''' Returns a SparseTensor based on the `config` dict 351 | ''' 352 | return cls(nonsparse_indices=config['nonsparse_indices'], 353 | nonsparse_values=config['nonsparse_values'], 354 | default_value=config['default_value'], dtype=config['dtype'], 355 | main_axis=config['main_axis'], max_shape=config['max_shape'], 356 | assume_sorted=True) 357 | 358 | class TensorList(object): 359 | ''' Helperclass to cluster tensors together, acts as a single list by propageting 360 | calls and slicing trough it's members. 361 | 362 | # Arguments: 363 | tensors (list of iterables): Should have the same length 364 | 365 | # Example: 366 | ``` 367 | >>> tensors = TensorList([np.zeros((5,4)), np.ones((5,2,2)), -np.ones((5,))]) 368 | >>> tensors.shape 369 | [(5, 4), (5, 2, 2), (5,)] 370 | >>> tensors[0:1] 371 | [array([[ 0., 0., 0., 0.]]), array([[[ 1., 1.], [ 1., 1.]]]), array([-1.])] 372 | ``` 373 | ''' 374 | 375 | def __init__(self, tensors): 376 | lengths = set([len(t) for t in tensors]) 377 | assert len(lengths) == 1, 'Length of all tensors should be the same' 378 | self.length = list(lengths)[0] 379 | self.tensors = tensors 380 | 381 | def map(self, fn): 382 | ''' Apply function to all tensors and return result 383 | ''' 384 | return [fn(t) for t in self.tensors] 385 | 386 | def apply(self, fn): 387 | ''' Apply function to all tensors and replace with 388 | ''' 389 | self.tensors = self.map(fn) 390 | 391 | def __getitem__(self, key): 392 | return [t[key] for t in self.tensors] 393 | 394 | @property 395 | def shape(self): 396 | return [t.shape for t in self.tensors] 397 | 398 | def __repr__(self): 399 | return "%s(tensors=%r)" % (self.__class__.__name__, self.tensors) 400 | 401 | def __len__(self): 402 | return self.length 403 | 404 | class GraphTensor(TensorList): 405 | ''' Datacontainer for (molecular) graph tensors. 406 | 407 | This datacontainer mainly has advantages for indexing. The three tensors 408 | describing the graph are grouped in a tensorlist so that `graph_tensor[x]` 409 | will return atoms[x], bonds[x], edges[x] 410 | 411 | Furthermore, this container allows for sparse dimensions. A sparse dimension 412 | means that for each batch, that dimension is minimized to the maximum 413 | length that occurs within that batch. 414 | 415 | # Arguments: 416 | mol_tensors (tuple): tuple of np.array of nonspares mol tensors 417 | (atoms, bonds, edges) 418 | sparse_max_atoms (bool): Wether or not max_atoms should be a sparse 419 | dimension. 420 | sparse_max_degree (bool): Wether or not max_degree should be a sparse 421 | dimension. 422 | 423 | ''' 424 | def __init__(self, mol_tensors, sparse_max_atoms=True, sparse_max_degree=False): 425 | 426 | self.sparse_max_atoms = sparse_max_atoms 427 | self.sparse_max_degree = sparse_max_degree 428 | 429 | (max_atoms, max_degree, num_atom_features, num_bond_features, 430 | num_molecules) = mol_shapes_to_dims(mol_tensors) 431 | 432 | # Set sparse dimension sizes to None 433 | num_molecules = None 434 | if sparse_max_atoms: 435 | max_atoms = None 436 | if sparse_max_degree: 437 | max_degree = None 438 | 439 | max_shapes = mol_dims_to_shapes(max_atoms, max_degree, num_atom_features, 440 | num_bond_features) 441 | 442 | # Convert into SparseTensors 443 | atoms, bonds, edges = mol_tensors 444 | atoms = SparseTensor.from_array(atoms, max_shape=max_shapes[0]) 445 | bonds = SparseTensor.from_array(bonds, max_shape=max_shapes[1]) 446 | edges = SparseTensor.from_array(edges, max_shape=max_shapes[2], default_value=-1) 447 | 448 | # Initialise with result 449 | super(GraphTensor, self).__init__([atoms, bonds, edges]) 450 | 451 | def __getitem__(self, keys): 452 | 453 | # Make sure we don't lose the num_molecules dimension 454 | if isinstance(keys, int): 455 | keys = [keys] 456 | 457 | # Get each sliced tensor as a new `SparseTensor` object 458 | sliced_tensors = [t[keys] for t in self.tensors] 459 | 460 | # Make sure that max_atoms and max_degree match across all tensors, 461 | # (for isolated nodes (atoms), this is not always the case) 462 | # Use the max value across all tensors 463 | max_atoms_vals = [t.shape[1] for t in sliced_tensors] 464 | max_degree_vals = [t.shape[2] for t in sliced_tensors[1:]] 465 | 466 | max_atoms = max(max_atoms_vals) 467 | max_degree = max(max_degree_vals) 468 | 469 | # Return tensors with the matching shapes 470 | shapes = mol_dims_to_shapes(max_atoms, max_degree, None, None, len(keys)) 471 | return [t.as_array(shape) for t, shape in zip(sliced_tensors, shapes)] 472 | 473 | @property 474 | def max_shape(self): 475 | return [t.max_shape for t in self.tensors] 476 | 477 | @property 478 | def true_shape(self): 479 | return [t.max_shape for t in self.tensors] 480 | 481 | class EpochIterator(object): 482 | ''' Iterates over a dataset. (designed for keras fit_generator) 483 | 484 | # Arguments: 485 | data (tuple): Tuple of data to iterate trough, usually `(x_data, y_data)`, 486 | though a tuple of any length can be passed. The iterables inside the 487 | tuple should support list-indexing. 488 | batch_size (int): Number of datapoints yielded per batch 489 | epochs (int/None): maximum number of epochs after which a `StopIteration` 490 | is raised (None for infinite generator) 491 | shuffle (bool): Wether to shuffle at the onset of each epoch 492 | 493 | # Yields 494 | batch (tuple): tuple corresponding to the `data` tuple that contains a 495 | slice of length `batch_size` (except possibly on last batch of epoch) 496 | 497 | # Example 498 | using `keras.models.model` 499 | >>> model.fit_generator(EpochIterator(np.array(zip(data, labels))) 500 | 501 | # Note 502 | designed for use with keras `model.fit_generator` 503 | ''' 504 | def __init__(self, data, batch_size=1, epochs=None, shuffle=True): 505 | self.data = TensorList(data) 506 | self.epochs = epochs or np.inf 507 | self.batch_size = batch_size 508 | self.shuffle = shuffle 509 | 510 | # Initialise counters 511 | self.reset() 512 | 513 | def __iter__(self): 514 | return self 515 | 516 | def next(self): 517 | # At the end of an epoch, raise Stopiteration, or reset counter 518 | if self.i >= len(self.data): 519 | if self.epoch >= self.epochs: 520 | raise StopIteration 521 | else: 522 | self.i = 0 523 | self.epoch += 1 524 | 525 | # At the begin of an epoch, shuffle the order of the data 526 | if self.i==0 and self.shuffle: 527 | np.random.shuffle(self.indices) 528 | 529 | # Get the indices for this batch, and update counter i 530 | use_inds = self.indices[self.i:self.i+self.batch_size] 531 | self.i += len(use_inds) 532 | 533 | # Return as tuple 534 | return tuple(self.data[use_inds]) 535 | 536 | def reset(self): 537 | ''' Resets the counters of the iterator 538 | ''' 539 | self.i = 0 540 | self.epoch = 1 541 | self.indices = range(len(self.data)) 542 | 543 | 544 | def unit_tests_sparse_tensor(seed=None): 545 | 546 | np.random.seed(seed) 547 | 548 | arr = np.random.randint(3, size=(2000,30,5,8)) 549 | sparse = SparseTensor.from_array(arr) 550 | 551 | singleton_shape = arr.shape[1:] 552 | full_shape = (None,) + singleton_shape 553 | 554 | print('Testing: `as_array` should return same as input to `from_array`') 555 | assert np.all(sparse.as_array(full_shape) == arr) 556 | 557 | print('Testing: Integer indexing should be identical to numpy') 558 | assert np.all(sparse[0].as_array(singleton_shape) == arr[0]) 559 | 560 | print('Testing: Negative integer indexing should be identical to numpy') 561 | assert np.all(sparse[len(sparse)-1].as_array(singleton_shape) == sparse[-1].as_array(singleton_shape) ) 562 | 563 | print('Testing: List indexing should be identical to numpy') 564 | get_inds = [2,-1,3,6,0,0,1] 565 | assert np.all(sparse[get_inds].as_array(full_shape) == arr[get_inds]) 566 | 567 | print('Testing: Slice indexing should be identical to numpy') 568 | assert np.all(sparse[::-1].as_array(full_shape) == arr[::-1]) 569 | 570 | print('Testing: Various indexing testcases that should return same array as sparse') 571 | assert np.all(sparse.as_array(full_shape) == sparse[:].as_array(full_shape)) 572 | assert np.all(sparse.as_array(full_shape) == sparse[0:len(sparse)+10].as_array(full_shape)) 573 | 574 | print('Testing: Equality functions return `True` for all entries when comparing sparse with sparse') 575 | assert np.all(sparse == sparse.as_array(full_shape)) 576 | # assert np.all(sparse.as_array(full_shape) == sparse) 577 | 578 | print('Testing: Equality functions return `True` for all entries when comparing sparse with original array') 579 | assert np.all(arr == sparse.as_array(full_shape)) 580 | # assert np.all(sparse.as_array(full_shape) == arr) 581 | 582 | print('Testing: Equality functions should return same boolean array as numpy') 583 | assert np.all((arr[0] == 0) == (sparse[0] == 0)) 584 | assert np.all((arr[0] == arr[3]) == (sparse[0] == sparse[3])) 585 | 586 | print('Testing: Inequality functions return `False` for all entries when comparing sparse with sparse') 587 | assert not np.all(sparse != sparse.as_array(full_shape)) 588 | # assert not np.all(sparse.as_array(full_shape) != sparse) 589 | 590 | print('Testing: Inequality functions return `False` for all entries when comparing sparse with original array') 591 | assert not np.all(arr != sparse.as_array(full_shape)) 592 | assert not np.all(sparse.as_array(full_shape) != arr) 593 | 594 | print('Testing: Ineuality functions should return same boolean array as numpy') 595 | assert np.all((arr[0] != 0) == (sparse[0] != 0)) 596 | assert np.all((arr[0] != arr[3]) == (sparse[0] != sparse[3])) 597 | 598 | print('Testing: `repr` can reproduce sparse') 599 | assert np.all(eval(repr(sparse)) == sparse) 600 | 601 | print('Testing: `from_config` can reproduce `sparse.to_config`') 602 | assert np.all(SparseTensor.from_config(sparse.to_config(False)) == sparse) 603 | assert np.all(SparseTensor.from_config(sparse.to_config(True)) == sparse) 604 | 605 | print('Testing: unpickled pickles object reproduces itself') 606 | assert np.all(pkl.loads(pkl.dumps(sparse)) == sparse) 607 | assert np.all(pkl.loads(pkl.dumps(sparse)) == sparse.as_array()) 608 | 609 | def unit_tests_graph_tensor(seed=None): 610 | np.random.seed(seed) 611 | 612 | # Parameters for generative model 613 | num_molecules=50 614 | max_atoms = 40 615 | max_degree = 6 616 | num_atom_features = 62 617 | num_bond_features = 8 618 | 619 | # Generate/simulate graph tensors 620 | atoms = np.zeros((num_molecules, max_atoms, num_atom_features)) 621 | bonds = np.zeros((num_molecules, max_atoms, max_degree, num_bond_features)) 622 | edges = np.zeros((num_molecules, max_atoms, max_degree)) -1 623 | 624 | # Generate atoms for each molecule 625 | for i, n_atoms in enumerate(np.random.randint(1, max_atoms, size=num_molecules)): 626 | atoms[i, 0:n_atoms, :] = np.random.randint(3, size=(n_atoms, num_atom_features)) 627 | 628 | # Generator neighbours/bonds for each atom 629 | for a, degree in enumerate(np.random.randint(max_degree, size=n_atoms)): 630 | bonds[i, a, 0:degree, :] = np.random.randint(3, size=(degree, num_bond_features)) 631 | edges[i, a, 0:degree] = np.random.randint(max_degree, size=degree) 632 | 633 | mols = GraphTensor([atoms, bonds, edges], sparse_max_atoms=True, 634 | sparse_max_degree=True) 635 | 636 | max_atoms_sizes = set([]) 637 | max_degree_sizes = set([]) 638 | num_atom_features_sizes = set([]) 639 | num_bond_features_sizes = set([]) 640 | num_molecules_sizes = set([]) 641 | 642 | for i in range(len(mols)): 643 | # This asserts the shapes match within the tensors 644 | (max_atoms, max_degree, num_atom_features, num_bond_features, 645 | num_molecules) = mol_shapes_to_dims(mols[i]) 646 | 647 | max_atoms_sizes.add(max_atoms) 648 | max_degree_sizes.add(max_degree) 649 | num_atom_features_sizes.add(num_atom_features) 650 | num_bond_features_sizes.add(num_bond_features) 651 | num_molecules_sizes.add(num_molecules) 652 | 653 | print('Testing: max_atoms is varying in size') 654 | assert len(max_atoms_sizes) > 1 655 | 656 | print('Testing: max_degree is varying in size') 657 | assert len(max_degree_sizes) > 1 658 | 659 | print('Testing: num_atom_features is constant in size') 660 | assert len(num_atom_features_sizes) == 1 661 | 662 | print('Testing: num_bond_features is constant in size') 663 | assert len(num_bond_features_sizes) == 1 664 | 665 | print('Testing: num_molecules is constant in size') 666 | assert len(num_molecules_sizes) == 1 667 | 668 | def unit_test_epoch_iterator(seed=None): 669 | 670 | np.random.seed(seed) 671 | 672 | n_datapoints = 50 673 | batch_size = 13 674 | epochs = 100 675 | 676 | x_data = np.random.rand(n_datapoints, 3, 6, 2) 677 | y_data = np.random.rand(n_datapoints, 8) 678 | 679 | it = EpochIterator((x_data, y_data), epochs=epochs, batch_size=batch_size) 680 | 681 | x_lengths = [] 682 | y_lengths = [] 683 | epochs = [] 684 | for x, y in it: 685 | x_lengths.append(len(x)) 686 | y_lengths.append(len(y)) 687 | epochs.append(it.epoch) 688 | 689 | x_lengths = np.array(x_lengths) 690 | y_lengths = np.array(y_lengths) 691 | 692 | seen = x_lengths.cumsum() 693 | true_epoch1 = np.floor(seen / n_datapoints).astype(int) 694 | true_epoch2 = np.array([0] + list(true_epoch1[:-1])) 695 | iter_epochs = np.array(epochs) - epochs[0] 696 | 697 | print('Testing: x and y lengths match') 698 | assert np.all(x_lengths == y_lengths) 699 | 700 | print('Testing: epoch are correct size') 701 | assert np.all(iter_epochs == true_epoch1) or np.all(iter_epochs == true_epoch2) 702 | 703 | 704 | def unit_tests(seed=None): 705 | print("\n{:=^100}".format(' Unit tests for `SparseTensor` ')) 706 | unit_tests_sparse_tensor(seed=seed) 707 | 708 | print("\n{:=^100}".format(' Unit tests for `GraphTensor` ')) 709 | unit_tests_graph_tensor(seed=seed) 710 | 711 | print("\n{:=^100}".format(' Unit tests for `EpochIterator` ')) 712 | unit_test_epoch_iterator(seed=seed) 713 | print('All unit tests passed!') 714 | 715 | if __name__ == '__main__': 716 | unit_tests() -------------------------------------------------------------------------------- /NGF/utils.py: -------------------------------------------------------------------------------- 1 | ''' Utilities used within the NGF module 2 | ''' 3 | from __future__ import print_function 4 | 5 | import inspect 6 | from itertools import cycle 7 | 8 | def filter_func_args(fn, args, invalid_args=[], overrule_args=[]): 9 | '''Separate a dict of arguments into one that a function takes, and the rest 10 | 11 | # Arguments: 12 | fn: arbitrary function 13 | args: dict of arguments to separate 14 | invalid_args: list of arguments that will be removed from args 15 | overrule_args: list of arguments that will be returned in other_args, 16 | even if they are arguments that `fn` takes 17 | 18 | # Returns: 19 | fn_args, other_args: tuple of separated arguments, ones that the function 20 | takes, and the others (minus `invalid_args`) 21 | ''' 22 | 23 | fn_valid_args = inspect.getargspec(fn)[0] 24 | fn_args = {} 25 | other_args = {} 26 | for arg, val in args.iteritems(): 27 | if not arg in invalid_args: 28 | if (arg in fn_valid_args) and (arg not in overrule_args): 29 | fn_args[arg] = val 30 | else: 31 | other_args[arg] = val 32 | return fn_args, other_args 33 | 34 | def is_iterable(obj): 35 | try: 36 | iter(obj) 37 | return True 38 | except TypeError: 39 | return False 40 | 41 | def zip_mixed(*mixed_iterables, **kwargs): 42 | ''' Zips a mix of iterables and non-iterables, non-iterables are repeated 43 | for each entry. 44 | 45 | # Arguments 46 | mixed_iterables (any type): unnamed arguments (just like `zip`) 47 | repeat_classes (list): named argument, which classes to repeat even though, 48 | they are in fact iterable 49 | 50 | ''' 51 | 52 | repeat_classes = tuple(kwargs.get('repeat_classes', [])) 53 | mixed_iterables = list(mixed_iterables) 54 | 55 | for i, item in enumerate(mixed_iterables): 56 | if not is_iterable(item): 57 | mixed_iterables[i] = cycle([item]) 58 | 59 | if isinstance(item, repeat_classes): 60 | mixed_iterables[i] = cycle([item]) 61 | 62 | return zip(*mixed_iterables) 63 | 64 | def mol_dims_to_shapes(max_atoms, max_degree, num_atom_features, num_bond_features, num_molecules=None): 65 | ''' Helper function, returns shape for molecule tensors given dim sizes 66 | ''' 67 | atoms_shape = (num_molecules, max_atoms, num_atom_features) 68 | bonds_shape = (num_molecules, max_atoms, max_degree, num_bond_features) 69 | edges_shape = (num_molecules, max_atoms, max_degree) 70 | return [atoms_shape, bonds_shape, edges_shape] 71 | 72 | def mol_shapes_to_dims(mol_tensors=None, mol_shapes=None): 73 | ''' Helper function, returns dim sizes for molecule tensors given tensors or 74 | tensor shapes 75 | ''' 76 | 77 | if not mol_shapes: 78 | mol_shapes = [t.shape for t in mol_tensors] 79 | 80 | num_molecules0, max_atoms0, num_atom_features = mol_shapes[0] 81 | num_molecules1, max_atoms1, max_degree1, num_bond_features = mol_shapes[1] 82 | num_molecules2, max_atoms2, max_degree2 = mol_shapes[2] 83 | 84 | num_molecules_vals = [num_molecules0, num_molecules1, num_molecules2] 85 | max_atoms_vals = [max_atoms0, max_atoms1, max_atoms2] 86 | max_degree_vals = [max_degree1, max_degree2] 87 | 88 | assert len(set(num_molecules_vals))==1, 'num_molecules does not match within tensors (found: {})'.format(num_molecules_vals) 89 | assert len(set(max_atoms_vals))==1, 'max_atoms does not match within tensors (found: {})'.format(max_atoms_vals) 90 | assert len(set(max_degree_vals))==1, 'max_degree does not match within tensors (found: {})'.format(max_degree_vals) 91 | 92 | return max_atoms1, max_degree1, num_atom_features, num_bond_features, num_molecules1 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Keras Neural Graph Fingerprint 2 | 3 | This repository is an implementation of [Convolutional Networks on Graphs for Learning Molecular Fingerprints][NGF-paper] in Keras. 4 | 5 | It includes a preprocessing function to convert molecules in smiles representation 6 | into molecule tensors. 7 | 8 | Next to this, it includes two custom layers for Neural Graphs in Keras, allowing 9 | flexible Keras fingerprint models. See [examples.py](examples.py) for an examples 10 | 11 | ## Related work 12 | 13 | There are several implementations of this paper publicly available: 14 | - by [HIPS][1] using autograd 15 | - by [debbiemarkslab][2] using theano 16 | - by [GUR9000] [3] using keras 17 | - by [ericmjl][4] using autograd 18 | - by [DeepChem][5] using tensorflow 19 | 20 | The closest implementation is the implementation by GUR9000 in Keras. However this 21 | repository represents moleculs in a fundamentally different way. The consequences 22 | are described in the sections below. 23 | 24 | ## Molecule Representation 25 | 26 | ### Atom, bond and edge tensors 27 | This codebase uses tensor matrices to represent molecules. Each molecule is 28 | described by a combination of the following three tensors: 29 | 30 | - **atom matrix**, size: `(max_atoms, num_atom_features)` 31 | This matrix defines the atom features. 32 | 33 | Each column in the atom matrix represents the feature vector for the atom at 34 | the index of that column. 35 | 36 | - **edge matrix**, size: `(max_atoms, max_degree)` 37 | This matrix defines the connectivity between atoms. 38 | 39 | Each column in the edge matrix represent the neighbours of an atom. The 40 | neighbours are encoded by an integer representing the index of their feature 41 | vector in the atom matrix. 42 | 43 | As atoms can have a variable number of neighbours, not all rows will have a 44 | neighbour index defined. These entries are filled with the masking value of 45 | `-1`. (This explicit edge matrix masking value is important for the layers 46 | to work) 47 | 48 | - **bond tensor** size: `(max_atoms, max_degree, num_bond_features)` 49 | This matrix defines the atom features. 50 | 51 | The first two dimensions of this tensor represent the bonds defined in the 52 | edge tensor. The column in the bond tensor at the position of the bond index 53 | in the edge tensor defines the features of that bond. 54 | 55 | Bonds that are unused are masked with 0 vectors. 56 | 57 | 58 | ### Batch representations 59 | 60 | This codes deals with molecules in batches. An extra dimension is added to all 61 | of the three tensors at the first index. Their respective sizes become: 62 | 63 | - **atom matrix**, size: `(num_molecules, max_atoms, num_atom_features)` 64 | - **edge matrix**, size: `(num_molecules, max_atoms, max_degree)` 65 | - **bond tensor** size: `(num_molecules, max_atoms, max_degree, num_bond_features)` 66 | 67 | As molecules have different numbers of atoms, max_atoms needs to be defined for 68 | the entire dataset. Unused atom columns are masked by 0 vectors. 69 | 70 | ### Strong and weak points 71 | The obvious downside of this representation is that there is a lot of masking, 72 | resulting in a waste of computation power. 73 | 74 | The alternative is to represent the entire dataset as a bag of atoms as in the 75 | authors [original implementation](https://github.com/HIPS/neural-fingerprint). For 76 | larger datasets, this is infeasable. In [GUR9000's implementation] (https://github.com/GUR9000/KerasNeuralFingerprint) 77 | the same approach is used, but each batch is pre-calculated as a bag of atoms. 78 | The downside of this is that each epoch uses the exact same composition of batches, 79 | decreasing the stochasticity. Furthermore, Keras recognises the variability in batch- 80 | size and will not run. In his implementation GUR9000 included a modified version 81 | of Keras to correct for this. 82 | 83 | The tensor representation used in this repository does not have these downsides, 84 | and allows for many modificiations of Duvenauds algorithm (there is a lot to explore). 85 | 86 | Their representation may be optimised for the regular algorithm, but at a first 87 | glance, the tensor implementation seems to perform reasonably fast (check out 88 | [the examples](examples.py)). 89 | 90 | ## NeuralGraph layers 91 | The two workhorses are defined in [NGF/layers.py](NGF/layers.py). 92 | 93 | `NeuralGraphHidden` takes a set of molecules (represented by `[atoms, bonds, edges]`), 94 | and returns the convolved feature vectors of the higher layers. Only the feature 95 | vectors change at each iteration, so for higher layers only the `atom` tensor needs 96 | to be replaced by the convolved output of the previous `NeuralGraphHidden`. 97 | 98 | `NeuralGraphOutput` takes a set of molecules (represented by `[atoms, bonds, edges]`), 99 | and returns the fingerprint output for that layer. According to the [original paper][NGF-paper], 100 | the fingerprints of all layers need to be summed. But these are neural nets, so 101 | feel free to play around with the architectures! 102 | 103 | ### Initialisation 104 | The NeuralGraph layers have an internal (`Dense`) layer of the output size 105 | (`conv_width` for `NeuralGraphHidden` or `fp_length` for `NeuralGraphOutput`). 106 | This inner layer accounts for the trainable parameters, activation function, etc. 107 | 108 | There are three ways to initialise the inner layer and it's parameters: 109 | 110 | 1. Using an integer `conv_width` and possible kwags (`Dense` layer is used) 111 | ```python 112 | atoms1 = NeuralGraphHidden(conv_width, activation='relu', bias=False)([atoms0, bonds, edges]) 113 | ``` 114 | 115 | 2. Using an initialised `Dense` layer 116 | ```python 117 | atoms1 = NeuralGraphHidden(Dense(conv_width, activation='relu', bias=False))([atoms0, bonds, edges]) 118 | ``` 119 | 120 | 3. Using a function that returns an initialised `Dense` layer 121 | ```python 122 | atoms1 = NeuralGraphHidden(lambda: Dense(conv_width, activation='relu', bias=False))([atoms0, bonds, edges]) 123 | ``` 124 | 125 | In the case of `NeuralGraphOutput`, all these three methods would be identical. 126 | For `NeuralGraphHidden`, these methods are equal, but can be slightly different. 127 | The reason is that a `NeuralGraphHidden` has a dense layer for each `degree`. 128 | 129 | The following will not work for `NeuralGraphHidden`: 130 | ```python 131 | atoms1 = NeuralGraphHidden(conv_width, activation='relu', bias=False, W_regularizer=l2(0.01))([atoms0, bonds, edges]) 132 | ``` 133 | 134 | The reason is that the same `l2` object will be passed to each internal layer, 135 | wheras an `l2` object can obly be assigned to one layer. 136 | 137 | Method 2. will work, because a new layer is instanciated based on the configuration 138 | of the passed layer. 139 | 140 | Method 3. will work if a function is provided that returns a new `l2` object each 141 | time it is called (as would be the case for the given lambda function). 142 | 143 | 144 | ## NeuralGraph models 145 | For convienience, two builder functions are included that can build a variety 146 | of Neural Graph models by specifiying it's parameters. See [NGF/models.py](NGF/models.py). 147 | 148 | The examples in [examples.py](examples.py) should help you along the way. 149 | NGF 150 | You can store and load the trained models. Make sure to specify the custom classes: 151 | ```python 152 | model = load_model('model.h5', custom_objects={'NeuralGraphHidden':NeuralGraphHidden, 'NeuralGraphOutput':NeuralGraphOutput}) 153 | ``` 154 | 155 | ## Dependencies 156 | - [**RDKit**](http://www.rdkit.org/) This dependency is nescecairy to convert molecules into tensor 157 | representatins, once this step is conducted, the new data can be stored, and RDkit 158 | is no longer a dependency. 159 | - [**Keras**](https://keras.io/) Requires keras 1.x for building, training and evaluating the models. 160 | - [**NumPy**](http://www.numpy.org/) 161 | 162 | ## Acknowledgements 163 | - Implementation is based on [Duvenaud et al., 2015][NGF-paper]. 164 | - Feature extraction scripts were copied from [the original implementation][1] 165 | - Data preprocessing scripts were copied from [GRU2000][3] 166 | - The usage of the Keras functional API was inspired by [GRU2000][3] 167 | - Graphpool layer adopted from [Han, et al., 2016][DeepChem-paper] 168 | 169 | [NGF-paper]: https://arxiv.org/abs/1509.09292 170 | [DeepChem-paper]:https://arxiv.org/abs/1611.03199 171 | [keiserlab]: //http://www.keiserlab.org/ 172 | [1]: https://github.com/HIPS/neural-fingerprint 173 | [2]: https://github.com/debbiemarkslab/neural-fingerprint-theano 174 | [3]: https://github.com/GUR9000/KerasNeuralFingerprint 175 | [4]: https://github.com/ericmjl/graph-fingerprint 176 | [5]: https://github.com/deepchem/deepchem -------------------------------------------------------------------------------- /data/Karthikeyan_MeltingPoints_data.npy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keiserlab/keras-neural-graph-fingerprint/cab0edb32f8e616bb654174c940f743a14d47bbb/data/Karthikeyan_MeltingPoints_data.npy -------------------------------------------------------------------------------- /data/Karthikeyan_MeltingPoints_labels.npy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keiserlab/keras-neural-graph-fingerprint/cab0edb32f8e616bb654174c940f743a14d47bbb/data/Karthikeyan_MeltingPoints_labels.npy -------------------------------------------------------------------------------- /data/data.license.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 by Gregor Urban 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the Software), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, andor sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /data/delaney.csv: -------------------------------------------------------------------------------- 1 | Compound ID,ESOL predicted log solubility in mols per litre,Minimum Degree,Molecular Weight,Number of H-Bond Donors,Number of Rings,Number of Rotatable Bonds,Polar Surface Area,measured log solubility in mols per litre,smiles 2 | Amigdalin,-0.9740000000000001,1,457.4320000000001,7,3,7,202.31999999999996,-0.77,OCC3OC(OCC2OC(OC(C#N)c1ccccc1)C(O)C(O)C2O)C(O)C(O)C3O 3 | Fenfuram,-2.885,1,201.22500000000002,1,2,2,42.24,-3.3,Cc1occc1C(=O)Nc2ccccc2 4 | citral,-2.5789999999999997,1,152.237,0,0,4,17.07,-2.06,CC(C)=CCCC(C)=CC(=O) 5 | Picene,-6.617999999999999,2,278.354,0,5,0,0.0,-7.87,c1ccc2c(c1)ccc3c2ccc4c5ccccc5ccc43 6 | Thiophene,-2.2319999999999998,2,84.14299999999999,0,1,0,0.0,-1.33,c1ccsc1 7 | benzothiazole,-2.733,2,135.191,0,2,0,12.89,-1.5,c2ccc1scnc1c2 8 | "2,2,4,6,6'-PCB",-6.545,1,326.437,0,2,1,0.0,-7.32,Clc1cc(Cl)c(c(Cl)c1)c2c(Cl)cccc2Cl 9 | Estradiol,-4.138,1,272.388,2,4,0,40.46,-5.03,CC12CCC3C(CCc4cc(O)ccc34)C2CCC1O 10 | Dieldrin,-4.533,1,380.913,0,5,0,12.53,-6.29,ClC4=C(Cl)C5(Cl)C3C1CC(C2OC12)C3C4(Cl)C5(Cl)Cl 11 | Rotenone,-5.246,1,394.42300000000023,0,5,3,63.22,-4.42,COc5cc4OCC3Oc2c1CC(Oc1ccc2C(=O)C3c4cc5OC)C(C)=C 12 | 2-pyrrolidone,0.243,1,85.10600000000001,1,1,0,29.1,1.07,O=C1CCCN1 13 | 2-Chloronapthalene,-4.063,1,162.61899999999997,0,2,0,0.0,-4.14,Clc1ccc2ccccc2c1 14 | 1-Pentene ,-2.01,1,70.135,0,0,2,0.0,-2.68,CCCC=C 15 | Primidone,-1.8969999999999998,1,218.256,2,2,2,58.2,-2.64,CCC1(C(=O)NCNC1=O)c2ccccc2 16 | Tetradecane,-5.45,1,198.39399999999995,0,0,11,0.0,-7.96,CCCCCCCCCCCCCC 17 | 2-Chloropropane,-1.585,1,78.542,0,0,0,0.0,-1.41,CC(C)Cl 18 | 2-Methylbutanol,-1.0270000000000001,1,88.14999999999999,1,0,2,20.23,-0.47,CCC(C)CO 19 | Benzonitrile,-2.03,1,103.12399999999997,0,1,0,23.79,-1.0,N#Cc1ccccc1 20 | Diazinon,-3.989,1,304.35200000000003,0,1,7,53.47,-3.64,CCOP(=S)(OCC)Oc1cc(C)nc(n1)C(C)C 21 | 2-Undecanol,-3.096,1,172.312,1,0,8,20.23,-2.94,CCCCCCCCCC(C)O 22 | "2,2',3,4,6-PCB",-6.627000000000001,1,326.437,0,2,1,0.0,-7.43,Clc1ccc(c(Cl)c1)c2c(Cl)ccc(Cl)c2Cl 23 | Lenacil,-3.355,1,234.29899999999995,1,3,1,54.86,-4.593999999999999,O=c2[nH]c1CCCc1c(=O)n2C3CCCCC3 24 | Phorate,-3.747,1,260.38599999999997,0,0,8,18.46,-4.11,CCOP(=S)(OCC)SCSCC 25 | Phenacetin,-2.342,1,179.219,1,1,3,38.33,-2.35,CCOc1ccc(NC(=O)C)cc1 26 | Dinitramine,-4.479,1,322.243,1,1,5,115.54000000000002,-5.47,CCN(CC)c1c(cc(c(N)c1N(=O)=O)C(F)(F)F)N(=O)=O 27 | 1-Heptanol,-1.751,1,116.204,1,0,5,20.23,-1.81,CCCCCCCO 28 | Theophylline,-1.452,1,180.16699999999997,1,2,0,72.68,-1.39,Cn1c(=O)n(C)c2nc[nH]c2c1=O 29 | Butethal,-1.974,1,212.249,2,1,4,75.27000000000001,-1.661,CCCCC1(CC)C(=O)NC(=O)NC1=O 30 | "P,P'-DDE",-6.553,1,318.0300000000001,0,2,2,0.0,-6.9,ClC(Cl)=C(c1ccc(Cl)cc1)c2ccc(Cl)cc2 31 | Methyl octanoate,-2.608,1,158.24099999999999,0,0,6,26.3,-3.17,CCCCCCCC(=O)OC 32 | "1,4-Diethylbenzene ",-3.633,1,134.22199999999998,0,1,2,0.0,-3.75,CCc1ccc(CC)cc1 33 | Terbufos,-4.367,1,288.44,0,0,7,18.46,-4.755,CCOP(=S)(OCC)SCSC(C)(C)C 34 | Phenmedipham,-4.229,1,300.314,2,2,3,76.66,-4.805,COC(=O)Nc1cccc(OC(=O)Nc2cccc(C)c2)c1 35 | "1,1-Dichloroethylene",-1.939,1,96.94399999999999,0,0,0,0.0,-1.64,ClC(=C)Cl 36 | 1-Methylfluorene,-4.478,1,180.25000000000003,0,3,0,0.0,-5.22,Cc1cccc2c1Cc3ccccc32 37 | Valeraldehyde,-1.103,1,86.13399999999999,0,0,3,17.07,-0.85,CCCCC=O 38 | Diphenylamine,-3.8569999999999998,2,169.227,1,2,2,12.03,-3.5039999999999996,N(c1ccccc1)c2ccccc2 39 | Fenothiocarb,-3.2969999999999997,1,253.367,0,1,6,29.540000000000003,-3.927,CN(C)C(=O)SCCCCOc1ccccc1 40 | Piperophos,-4.637,1,353.4900000000001,0,1,9,38.77,-4.15,CCCOP(=S)(OCCC)SCC(=O)N1CCCCC1C 41 | 1-Iodoheptane,-3.904,1,226.101,0,0,5,0.0,-4.81,CCCCCCCI 42 | 3-Chlorobiphenyl,-4.685,1,188.657,0,2,1,0.0,-4.88,c1c(Cl)cccc1c2ccccc2 43 | 4-Pentene-1-ol,-0.7909999999999999,1,86.134,1,0,3,20.23,-0.15,OCCCC=C 44 | Cyclobutyl-5-spirobarbituric acid,-0.527,1,168.15200000000002,2,2,0,75.27,-1.655,O=C2NC(=O)C1(CCC1)C(=O)N2 45 | menthol,-2.782,1,156.269,1,1,1,20.23,-2.53,CC(C)C1CCC(C)CC1O 46 | Isopropyl formate,-0.684,1,88.106,0,0,2,26.3,-0.63,CC(C)OC=O 47 | 2-Heptanol ,-1.6780000000000002,1,116.20399999999998,1,0,4,20.23,-1.55,CCCCCC(C)O 48 | p-Bromoacetanilide,-3.012,1,214.06199999999998,1,1,1,29.1,-3.083,CC(=O)Nc1ccc(Br)cc1 49 | brompyrazone,-3.005,1,266.098,1,2,1,60.910000000000004,-3.127,c1ccccc1n2ncc(N)c(Br)c2(=O) 50 | nifedipine,-4.248,1,346.33900000000017,1,2,4,107.77,-4.76,COC(=O)C1=C(C)NC(=C(C1c2ccccc2N(=O)=O)C(=O)OC)C 51 | "2,7-dimethylquinoline",-3.342,1,157.216,0,2,0,12.89,-1.94,c2c(C)cc1nc(C)ccc1c2 52 | 1-Octyne ,-2.509,1,110.19999999999999,0,0,4,0.0,-3.66,CCCCCCC#C 53 | cyclobarbital,-2.421,1,236.27099999999993,2,2,2,75.27000000000001,-2.17,CCC1(C(=O)NC(=O)NC1=O)C2=CCCCC2 54 | Chrysene,-5.568,2,228.29399999999998,0,4,0,0.0,-8.057,c1ccc2c(c1)ccc3c4ccccc4ccc23 55 | Bromacil,-3.4189999999999996,1,261.11899999999997,1,1,2,54.86,-2.523,CCC(C)n1c(=O)[nH]c(C)c(Br)c1=O 56 | "2,2',3,3',5,6-PCB",-7.185,1,360.88200000000006,0,2,1,0.0,-8.6,Clc1cccc(c1Cl)c2c(Cl)c(Cl)cc(Cl)c2Cl 57 | 2-Methylphenol,-2.281,1,108.13999999999999,1,1,0,20.23,-0.62,Cc1ccccc1O 58 | "2,2,5-Trimethylhexane",-3.6310000000000002,1,128.259,0,0,2,0.0,-5.05,CC(C)CCC(C)(C)C 59 | "1,4-Dimethylnaphthalene ",-4.147,1,156.228,0,2,0,0.0,-4.14,Cc1ccc(C)c2ccccc12 60 | 6-Methylchrysene,-5.931,1,242.321,0,4,0,0.0,-6.57,Cc1cc2c3ccccc3ccc2c4ccccc14 61 | 2-Pentanone,-0.846,1,86.13399999999999,0,0,2,17.07,-0.19,CCCC(=O)C 62 | "2,2',3,3',5,5',6,6'-PCB",-8.304,1,429.77200000000016,0,2,1,0.0,-9.15,Clc1cc(Cl)c(Cl)c(c1Cl)c2c(Cl)c(Cl)cc(Cl)c2Cl 63 | Methyl butyrate,-1.545,1,116.15999999999998,0,0,3,26.3,-0.82,CCCOC(=O)CC 64 | Triamcinolone,-2.734,1,394.43900000000014,4,4,2,115.06000000000002,-3.68,CC34CC(O)C1(F)C(CCC2=CC(=O)C=CC12C)C3CC(O)C4(O)C(=O)CO 65 | p-Aminophenol,-1.2309999999999999,1,109.12799999999999,2,1,0,46.25,-0.8,Nc1ccc(O)cc1 66 | Benznidazole,-2.3209999999999997,1,260.253,1,2,5,90.06,-2.81,O=C(Cn1ccnc1N(=O)=O)NCc2ccccc2 67 | "Atovaquone(0,430mg/ml) - neutral",-6.269,1,366.84400000000016,1,4,2,54.37,-5.931,OC4=C(C1CCC(CC1)c2ccc(Cl)cc2)C(=O)c3ccccc3C4=O 68 | Trietazine,-3.233,1,229.71499999999997,1,1,5,53.940000000000005,-4.06,CCNc1nc(Cl)nc(n1)N(CC)CC 69 | Pyrazinamide,-0.674,1,123.11499999999998,1,1,1,68.87,-0.667,NC(=O)c1cnccn1 70 | Carbromal,-2.198,1,237.09699999999998,2,0,3,72.19,-2.68,CCC(Br)(CC)C(=O)NC(N)=O 71 | "2,2'-PCB",-4.984,1,223.102,0,2,1,0.0,-5.27,Clc1ccccc1c2ccccc2Cl 72 | nitrofurantoin,-1.2429999999999999,1,238.15899999999996,1,2,3,118.04999999999998,-3.38,O=C2CN(N=Cc1ccc(o1)N(=O)=O)C(=O)N2 73 | Nitrofen,-5.361000000000001,1,284.09799999999996,0,2,3,52.37,-5.46,Clc2ccc(Oc1ccc(cc1)N(=O)=O)c(Cl)c2 74 | Camphor,-2.158,1,152.237,0,2,0,17.07,-1.96,CC1(C)C2CCC1(C)C(=O)C2 75 | 5-Allyl-5-phenylbarbital,-2.36,1,244.25,2,2,3,75.27000000000001,-2.369,O=C1NC(=O)NC(=O)C1(CC=C)c1ccccc1 76 | Pentyl propanoate,-1.899,1,130.18699999999998,0,0,4,26.3,-2.25,CCCCC(=O)OCC 77 | Isopentyl acetate,-1.817,1,130.18699999999998,0,0,3,26.3,-1.92,CC(C)CCOC(=O)C 78 | 3-Hexanoyloxymethylphenyltoin,-4.1530000000000005,1,380.444,1,3,8,75.71,-5.886,O=C1N(COC(=O)CCCCC)C(=O)C(N1)(c2ccccc2)c3ccccc3 79 | "2,3',5-PCB",-5.7620000000000005,1,257.547,0,2,1,0.0,-6.01,Clc1cccc(c1)c2cc(Cl)ccc2Cl 80 | 1-Bromopropane,-1.949,1,122.993,0,0,1,0.0,-1.73,CCCBr 81 | Propiconazole,-4.603,1,342.2260000000001,0,3,5,49.17,-3.4930000000000003,CCCC1COC(Cn2cncn2)(O1)c3ccc(Cl)cc3Cl 82 | Formothion,-2.0869999999999997,1,257.27299999999997,0,0,6,55.84,-1.995,COP(=S)(OC)SCC(=O)N(C)C=O 83 | 4-methylpteridine,-1.24,1,146.15299999999996,0,2,0,51.56,-0.466,Cc1ncnc2nccnc12 84 | Thiourea,0.32899999999999996,1,76.12400000000001,2,0,0,52.04,0.32,NC(=S)N 85 | p-Xylene ,-3.035,1,106.16799999999999,0,1,0,0.0,-2.77,Cc1ccc(C)cc1 86 | "1,2-Diethylbenzene",-3.6010000000000004,1,134.22199999999998,0,1,2,0.0,-3.28,CCc1ccccc1CC 87 | Hexachloroethane,-4.215,1,236.74,0,0,0,0.0,-3.67,ClC(Cl)(Cl)C(Cl)(Cl)Cl 88 | Flucythrinate,-6.877999999999999,1,451.46900000000005,0,3,9,68.55000000000001,-6.876,CC(C)C(C(=O)OC(C#N)c1cccc(Oc2ccccc2)c1)c3ccc(OC(F)F)cc3 89 | 1-Nitropropane,-0.816,1,89.09399999999998,0,0,2,43.14,-0.8,CCCN(=O)=O 90 | Menthone,-2.516,1,154.253,0,1,1,17.07,-2.35,CC(C)C1CCC(C)CC1=O 91 | RTI 24,-4.423,1,273.723,1,3,1,45.230000000000004,-5.36,CCN2c1cc(Cl)ccc1NC(=O)c3cccnc23 92 | "2,3-Dichloronitrobenzene",-3.322,1,192.00100000000003,0,1,1,43.14,-3.48,O=N(=O)c1c(Cl)c(Cl)ccc1 93 | thiamylal,-3.063,1,254.35500000000002,2,1,5,58.2,-3.46,CCCC(C)C1(CC=C)C(=O)NC(=S)NC1=O 94 | Fluoranthene,-4.957,2,202.25599999999997,0,4,0,0.0,-6.0,c1ccc2c(c1)c3cccc4cccc2c34 95 | Propylisopropylether,-1.354,1,102.17699999999998,0,0,3,9.23,-1.34,CCCOC(C)C 96 | "1,3-Dimethylnaphthalene",-4.147,1,156.22799999999998,0,2,0,0.0,-4.29,Cc1cc(C)c2ccccc2c1 97 | diethylstilbestrol,-5.074,1,268.356,2,2,4,40.46,-4.07,CCC(=C(CC)c1ccc(O)cc1)c2ccc(O)cc2 98 | Chlorothalonil,-3.995,1,265.914,0,1,0,47.58,-5.64,c1(C#N)c(Cl)c(C#N)c(Cl)c(Cl)c(Cl)1 99 | "2,3',4',5-PCB",-6.312,1,291.992,0,2,1,0.0,-7.25,Clc1ccc(Cl)c(c1)c2ccc(Cl)c(Cl)c2 100 | styrene oxide,-1.8259999999999998,2,120.15099999999995,0,2,1,12.53,-1.6,C1OC1c2ccccc2 101 | Isopropylbenzene ,-3.265,1,120.19499999999995,0,1,1,0.0,-3.27,CC(C)c1ccccc1 102 | Deoxycorticosterone,-3.9389999999999996,1,330.4680000000001,1,4,2,54.370000000000005,-3.45,CC12CCC3C(CCC4=CC(=O)CCC34C)C2CCC1C(=O)CO 103 | chlorquinox,-4.438,1,267.93,0,2,0,25.78,-5.43,c2(Cl)c(Cl)c(Cl)c1nccnc1c2(Cl) 104 | L-arabinose,0.601,1,150.13,4,1,0,90.15,0.39,C1OC(O)C(O)C(O)C1O 105 | Dichloromethane,-1.156,1,84.93299999999999,0,0,0,0.0,-0.63,ClCCl 106 | 1-Ethylnaphthalene ,-4.1,1,156.22799999999998,0,2,1,0.0,-4.17,CCc1cccc2ccccc12 107 | Methyl formate,-0.048,1,60.05200000000001,0,0,1,26.3,0.58,COC=O 108 | o-Nitrophenol,-2.318,1,139.10999999999999,1,1,1,63.37,-1.74,Oc1ccccc1N(=O)=O 109 | thymine,-0.78,1,126.115,2,1,0,65.72,-1.506,Cc1c[nH]c(=O)[nH]c1=O 110 | 2-Methylpropane,-1.891,1,58.123999999999995,0,0,0,0.0,-2.55,CC(C)C 111 | Inosine,-0.8340000000000001,1,268.22900000000004,4,3,2,133.75,-1.23,OCC1OC(C(O)C1O)n2cnc3c(O)ncnc23 112 | Ioxynil,-4.615,1,370.91499999999996,1,1,0,44.019999999999996,-3.61,Oc1c(I)cc(C#N)cc1I 113 | Niclosamide,-5.032,1,327.1230000000001,2,2,3,92.47,-4.7,Oc1ccc(Cl)cc1C(=O)Nc2ccc(cc2Cl)N(=O)=O 114 | Pentane,-2.261,1,72.151,0,0,2,0.0,-3.18,CCCCC 115 | Phenol,-1.9909999999999999,1,94.11299999999999,1,1,0,20.23,0.0,c1ccccc1O 116 | 2-aminoanthracene,-3.7889999999999997,1,193.249,1,3,0,26.02,-5.17,Nc3ccc2cc1ccccc1cc2c3 117 | theobromine,-1.05,1,180.16699999999997,1,2,0,72.68,-2.523,Cn1cnc2n(C)c(=O)[nH]c(=O)c12 118 | Isoquinoline,-2.531,2,129.16199999999998,0,2,0,12.89,-1.45,c1ccc2cnccc2c1 119 | Anilofos,-5.106,1,367.86,0,1,7,38.77,-4.4319999999999995,COP(=S)(OC)SCC(=O)N(C(C)C)c1ccc(Cl)cc1 120 | Hexylbenzene ,-4.22,1,162.276,0,1,5,0.0,-5.21,CCCCCCc1ccccc1 121 | 2-Chlorobiphenyl,-4.5280000000000005,1,188.657,0,2,1,0.0,-4.54,Clc1ccccc1c2ccccc2 122 | 2-Methyl-1-Pentene,-2.3480000000000003,1,84.16199999999999,0,0,2,0.0,-3.03,CCCC(=C)C 123 | "2,3,4-Trimethylpentane",-3.2760000000000002,1,114.23199999999999,0,0,2,0.0,-4.8,CC(C)C(C)C(C)C 124 | Pentachlorobenzene,-5.167999999999999,1,250.339,0,1,0,0.0,-5.65,Clc1cc(Cl)c(Cl)c(Cl)c1Cl 125 | m-Nitrophenol,-2.318,1,139.10999999999999,1,1,1,63.37,-1.01,Oc1cccc(c1)N(=O)=O 126 | 1-Decene,-3.781,1,140.26999999999998,0,0,7,0.0,-5.51,CCCCCCCCC=C 127 | Glyceryl triacetate,-1.285,1,218.20499999999998,0,0,5,78.9,-0.6,CC(=O)OCC(COC(=O)C)OC(=O)C 128 | dimethirimol,-3.57,1,209.29299999999998,1,1,4,49.25000000000001,-2.24,CCCCc1c(C)nc(nc1O)N(C)C 129 | Cyfluthrin,-6.84,1,434.29400000000015,0,3,6,59.32000000000001,-7.337000000000001,CC1(C)C(C=C(Cl)Cl)C1C(=O)OC(C#N)c2ccc(F)c(Oc3ccccc3)c2 130 | Pyridine,-1.4809999999999999,2,79.10199999999998,0,1,0,12.89,0.76,c1ccncc1 131 | 1-Bromoheptane,-3.366,1,179.101,0,0,5,0.0,-4.43,CCCCCCCBr 132 | "3,4-Dimethylpyridine",-2.0669999999999997,1,107.15599999999999,0,1,0,12.89,0.36,Cc1ccncc1C 133 | Fludrocortisone,-3.1719999999999997,1,380.45600000000013,3,4,2,94.83,-3.43,CC34CC(O)C1(F)C(CCC2=CC(=O)CCC12C)C3CCC4(O)C(=O)CO 134 | ethiofencarb,-2.855,1,225.313,1,1,4,38.33,-2.09,CCSCc1ccccc1OC(=O)NC 135 | Malonic acid diethylester,-1.413,1,160.16899999999998,0,0,4,52.60000000000001,-0.82,CCOC(=O)CC(=O)OCC 136 | d-Limonene,-3.429,1,136.238,0,1,1,0.0,-4.26,CC1=CCC(CC1)C(C)=C 137 | Indan,-3.057,2,118.17899999999997,0,2,0,0.0,-3.04,C1Cc2ccccc2C1 138 | p-t-Butylphenol,-3.1919999999999997,1,150.22099999999998,1,1,0,20.23,-2.41,CC(C)(C)c1ccc(O)cc1 139 | Cyclopropyl-5-spirobarbituric acid,-0.08800000000000001,1,154.125,2,2,0,75.27,-1.886,O=C2NC(=O)C1(CC1)C(=O)N2 140 | m-Chloroiodobenzene,-4.3839999999999995,1,238.45499999999998,0,1,0,0.0,-3.55,Clc1cccc(I)c1 141 | 1-Bromonapthalene,-4.434,1,207.07,0,2,0,0.0,-4.35,Brc1cccc2ccccc12 142 | trans-2-Pentene ,-2.076,1,70.135,0,0,1,0.0,-2.54,CC/C=C/C 143 | "2,6-Dimethylpyridine",-2.0980000000000003,1,107.156,0,1,0,12.89,0.45,Cc1cccc(C)n1 144 | Trichloroethylene,-2.312,1,131.389,0,0,0,0.0,-1.96,ClC=C(Cl)Cl 145 | 1-Napthylamine,-2.721,1,143.189,1,2,0,26.02,-1.92,Nc1cccc2ccccc12 146 | m-Xylene ,-3.035,1,106.16799999999999,0,1,0,0.0,-2.82,Cc1cccc(C)c1 147 | 2-hydroxypteridine,-1.4040000000000001,1,148.125,1,2,0,71.79,-1.9469999999999998,Oc2ncc1nccnc1n2 148 | Methanol,0.441,1,32.042,1,0,0,20.23,1.57,CO 149 | Amobarbital,-2.312,1,226.27599999999998,2,1,4,75.27000000000001,-2.468,CCC1(CCC(C)C)C(=O)NC(=O)NC1=O 150 | 2-Butanone,-0.491,1,72.107,0,0,1,17.07,0.52,CCC(=O)C 151 | 5-fluorouracil,-0.792,1,130.078,2,1,0,65.72,-1.077,Fc1c[nH]c(=O)[nH]c1=O 152 | tubercidin,-0.892,1,266.257,4,3,2,126.65,-1.95,Nc1ncnc2n(ccc12)C3OC(CO)C(O)C3O 153 | "1,3-Benzenediol",-1.59,1,110.11199999999998,2,1,0,40.46,0.81,Oc1cccc(O)c1 154 | 1-Hexanol,-1.3969999999999998,1,102.17699999999999,1,0,4,20.23,-1.24,CCCCCCO 155 | 1-Chloropentane,-2.294,1,106.596,0,0,3,0.0,-2.73,CCCCCCl 156 | "1,3-Butadiene",-1.376,1,54.09199999999999,0,0,1,0.0,-1.87,C=CC=C 157 | Propyl acetate,-1.125,1,102.13299999999998,0,0,2,26.3,-0.72,CCCOC(=O)C 158 | "5,6,7,8-tetrahydro-2-naphthol",-3.0860000000000003,1,148.205,1,2,0,20.23,-1.99,Oc2ccc1CCCCc1c2 159 | chloroacetamide,-0.106,1,93.513,1,0,1,43.09,-0.02,NC(=O)CCl 160 | Iodofenphos,-6.148,1,413.0,0,1,4,27.69,-6.62,COP(=S)(OC)Oc1cc(Cl)c(I)cc1Cl 161 | 4-Chlorotoluene,-3.2969999999999997,1,126.586,0,1,0,0.0,-3.08,Cc1ccc(Cl)cc1 162 | Metribuzin,-2.324,1,214.29399999999998,1,1,1,73.8,-2.253,CSc1nnc(c(=O)n1N)C(C)(C)C 163 | Tricresyl phosphate,-6.39,1,368.3690000000001,0,3,6,44.760000000000005,-6.01,Cc1ccc(OP(=O)(Oc2cccc(C)c2)Oc3ccccc3C)cc1 164 | Caproaldehyde,-1.4569999999999999,1,100.16099999999999,0,0,4,17.07,-1.3,CCCCCC=O 165 | Butamben,-3.0389999999999997,1,193.24599999999998,1,1,4,52.32,-3.082,CCCCOC(=O)c1ccc(N)cc1 166 | RTI 3,-3.049,1,255.277,1,3,0,68.45,-3.043,O2c1cc(C)ccc1N(C)C(=O)c3cc(N)cnc23 167 | Nerol,-2.603,1,154.253,1,0,4,20.23,-2.46,CC(C)=CCC/C(C)=C\CO 168 | "2,4'-PCB",-5.142,1,223.102,0,2,1,0.0,-5.28,Clc1ccc(cc1)c2ccccc2Cl 169 | 3-Octanoyloxymethylphenytoin,-4.84,1,408.498,1,3,10,75.71,-6.523,O=C1N(COC(=O)CCCCCCC)C(=O)C(N1)(c2ccccc2)c3ccccc3 170 | Nitroethane,-0.462,1,75.067,0,0,1,43.14,-0.22,CCN(=O)=O 171 | Ethalfluralin,-5.063,1,333.266,0,1,6,89.51999999999998,-6.124,CCN(CC(C)=C)c1c(cc(cc1N(=O)=O)C(F)(F)F)N(=O)=O 172 | "1,2,3,4-Tetrachlorobenzene",-4.546,1,215.894,0,1,0,0.0,-4.57,Clc1ccc(Cl)c(Cl)c1Cl 173 | Meprobamate,-1.376,1,218.25299999999996,2,0,6,104.63999999999999,-1.807,CCCC(C)(COC(N)=O)COC(N)=O 174 | pregnenolone,-4.342,1,316.48500000000007,1,4,1,37.3,-4.65,CC(=O)C3CCC4C2CC=C1CC(O)CCC1(C)C2CCC34C 175 | Iodomethane,-1.646,1,141.939,0,0,0,0.0,-1.0,CI 176 | cycloheximide,-1.5319999999999998,1,281.35200000000003,2,2,3,83.47,-1.13,CC1CC(C)C(=O)C(C1)C(O)CC2CC(=O)NC(=O)C2 177 | 3-Heptanoyloxymethylphenytoin,-4.496,1,394.471,1,3,9,75.71,-6.301,O=C1N(COC(=O)CCCCCC)C(=O)C(N1)(c2ccccc2)c3ccccc3 178 | isophorone,-2.015,1,138.20999999999998,0,1,0,17.07,-1.06,CC1=CC(=O)CC(C)(C)C1 179 | Butabarbital,-1.9580000000000002,1,212.24899999999997,2,1,3,75.27000000000001,-2.39,O=C1NC(=O)NC(=O)C1(CC)C(C)CC 180 | 5-Nonanone,-2.329,1,142.242,0,0,6,17.07,-2.58,CCCCC(=O)CCCC 181 | Glutethimide,-2.591,1,217.268,1,2,2,46.17,-2.3369999999999997,CCC1(CCC(=O)NC1=O)c2ccccc2 182 | 3-Methylpentane,-2.6,1,86.178,0,0,2,0.0,-3.68,CCC(C)CC 183 | Etofenprox,-6.896,1,376.49600000000004,0,3,9,27.69,-8.6,CCOc1ccc(cc1)C(C)(C)COCc3cccc(Oc2ccccc2)c3 184 | Methaqualone,-3.8810000000000002,1,250.30100000000002,0,3,1,34.89,-2.925,Cc1ccccc1n3c(C)nc2ccccc2c3=O 185 | Chloroacetonitrile,-0.44799999999999995,1,75.498,0,0,0,23.79,-0.092,ClCC#N 186 | Trichloronate,-5.225,1,333.60400000000004,0,1,5,18.46,-5.752000000000001,CCOP(=S)(CC)Oc1cc(Cl)c(Cl)cc1Cl 187 | Ethisterone,-3.858,1,312.45300000000003,1,4,0,37.3,-5.66,CC12CCC(=O)C=C1CCC3C2CCC4(C)C3CCC4(O)C#C 188 | Pyridazine,-0.619,2,80.08999999999999,0,1,0,25.78,1.1,c1ccnnc1 189 | "1,2,3,5-Tetrachlorobenzene",-4.621,1,215.894,0,1,0,0.0,-4.63,Clc1cc(Cl)c(Cl)c(Cl)c1 190 | Diosgenin,-5.681,1,414.63000000000017,1,6,0,38.69,-7.32,C1C(O)CCC2(C)CC3CCC4(C)C5(C)CC6OCC(C)CC6OC5CC4C3C=C21 191 | o-Aminophenol,-1.465,1,109.12799999999999,2,1,0,46.25,-0.72,Nc1ccccc1O 192 | Ethyl nonanoate,-3.3160000000000003,1,186.295,0,0,8,26.3,-3.8,CCCCCCCCC(=O)OCC 193 | metalaxyl,-2.87,1,279.336,0,1,5,55.84,-1.601,COCC(=O)N(C(C)C(=O)OC)c1c(C)cccc1C 194 | Propoxur,-2.4090000000000003,1,209.24499999999998,1,1,3,47.56,-2.05,CNC(=O)Oc1ccccc1OC(C)C 195 | 2-Chlorobutane,-1.94,1,92.569,0,0,1,0.0,-1.96,CCC(C)Cl 196 | 2-Napthol,-3.08,1,144.17299999999997,1,2,0,20.23,-2.28,Oc1ccc2ccccc2c1 197 | Oxadiazon,-5.265,1,345.22600000000017,0,2,3,57.26,-5.696000000000001,CC(C)Oc1cc(c(Cl)cc1Cl)n2nc(oc2=O)C(C)(C)C 198 | 1-Hexyne ,-1.801,1,82.14599999999999,0,0,2,0.0,-2.36,CCCCC#C 199 | 1-Nonyne ,-2.864,1,124.22699999999999,0,0,5,0.0,-4.24,CCCCCCCC#C 200 | 2-Chlorotoluene,-3.2969999999999997,1,126.586,0,1,0,0.0,-3.52,Cc1ccccc1Cl 201 | Diisopropyl ether ,-1.281,1,102.17699999999999,0,0,2,9.23,-1.1,CC(C)OC(C)C 202 | Dapsone,-2.464,1,248.307,2,2,2,86.18,-3.094,Nc1ccc(cc1)S(=O)(=O)c2ccc(N)cc2 203 | Methyl hydrazine,0.5429999999999999,1,46.073,2,0,0,38.05,1.34,CNN 204 | Propyne,-0.672,1,40.065000000000005,0,0,0,0.0,-0.41,CC#C 205 | Phoxim,-4.5569999999999995,1,298.304,0,1,7,63.839999999999996,-4.862,CCOP(=S)(OCC)ON=C(C#N)c1ccccc1 206 | Propetamphos,-2.826,1,281.314,1,0,7,56.790000000000006,-3.408,CCNP(=S)(OC)OC(=CC(=O)OC(C)C)C 207 | Acrolein,-0.184,1,56.064,0,0,1,17.07,0.57,C=CC=O 208 | Hypoxanthine,-0.6559999999999999,1,136.114,2,2,0,74.43,-2.296,O=c1[nH]cnc2nc[nH]c12 209 | 6-hydroxyquinoline,-2.725,1,145.161,1,2,0,33.120000000000005,-2.16,Oc2ccc1ncccc1c2 210 | Fluorobenzene,-2.5140000000000002,1,96.10399999999998,0,1,0,0.0,-1.8,Fc1ccccc1 211 | 1-Chloropropane,-1.585,1,78.542,0,0,1,0.0,-1.47,CCCCl 212 | Ethyl acetate,-0.77,1,88.106,0,0,1,26.3,-0.04,CCOC(=O)C 213 | "2,2-Dimethylpentane",-2.938,1,100.20499999999998,0,0,1,0.0,-4.36,CCCC(C)(C)C 214 | Pentamethylbenzene,-3.9930000000000003,1,148.249,0,1,0,0.0,-4.0,Cc1cc(C)c(C)c(C)c1C 215 | eucalyptol,-2.5789999999999997,1,154.253,0,3,0,9.23,-1.64,CC12CCC(CC1)C(C)(C)O2 216 | dibutyl sebacate,-4.726,1,314.46600000000007,0,0,15,52.60000000000001,-3.8960000000000004,CCCCOC(=O)CCCCCCCCC(=O)OCCCC 217 | "4,4'-PCB",-5.2989999999999995,1,223.102,0,2,1,0.0,-6.56,Clc1ccc(cc1)c2ccc(Cl)cc2 218 | "2,3-Dimethylpyridine",-2.0669999999999997,1,107.156,0,1,0,12.89,0.38,Cc1cccnc1C 219 | Carvone,-2.042,1,150.22099999999998,0,1,1,17.07,-2.06,CC(=C)C1CC=C(C)C(=O)C1 220 | Carbophenthion,-5.827999999999999,1,342.875,0,1,8,18.46,-5.736000000000001,CCOP(=S)(OCC)SCSc1ccc(Cl)cc1 221 | "Etoposide (148-167,25mg/ml)",-3.292,1,588.5620000000001,3,7,5,160.83,-3.571,COc1cc(cc(OC)c1O)C6C2C(COC2=O)C(OC4OC3COC(C)OC3C(O)C4O)c7cc5OCOc5cc67 222 | Perylene,-6.007000000000001,2,252.31599999999997,0,5,0,0.0,-8.804,c1cc2cccc3c4cccc5cccc(c(c1)c23)c54 223 | "2,4-Dinitrotoluene",-2.6039999999999996,1,182.135,0,1,2,86.28,-2.82,Cc1ccc(cc1N(=O)=O)N(=O)=O 224 | 2-bromonaphthalene,-4.434,1,207.07000000000002,0,2,0,0.0,-4.4,c1c(Br)ccc2ccccc12 225 | Formetanate,-1.8459999999999999,1,221.26,1,1,3,53.93,-2.34,CNC(=O)Oc1cccc(N=CN(C)C)c1 226 | 6-methoxypteridine,-1.589,1,162.15200000000002,0,2,1,60.790000000000006,-1.139,COc2cnc1ncncc1n2 227 | nevirapine,-3.397,1,266.30400000000003,1,4,1,58.120000000000005,-3.19,Cc3ccnc4N(C1CC1)c2ncccc2C(=O)Nc34 228 | Isazofos,-3.76,1,313.747,0,1,7,58.4,-3.658,CCOP(=S)(OCC)Oc1nc(Cl)n(n1)C(C)C 229 | "2-Methyl-1,3-Butadiene ",-1.714,1,68.11900000000001,0,0,1,0.0,-2.03,CC(=C)C=C 230 | linalool,-2.399,1,154.253,1,0,4,20.23,-1.99,CC(C)=CCCC(O)(C)C=C 231 | Fenthion,-4.265,1,278.335,0,1,5,27.69,-4.57,COP(=S)(OC)Oc1ccc(SC)c(C)c1 232 | Cyclohexanol ,-1.261,1,100.161,1,1,0,20.23,-0.44,OC1CCCCC1 233 | 5-Allyl-5-methylbarbital,-1.013,1,182.17899999999997,2,1,2,75.27000000000001,-1.16,O=C1NC(=O)NC(=O)C1(C)CC=C 234 | Epiandrosterone,-3.8819999999999997,1,290.447,1,4,0,37.3,-4.16,CC34CCC1C(CCC2CC(O)CCC12C)C3CCC4=O 235 | mannitol,0.647,1,182.172,6,0,5,121.38000000000001,0.06,OCC(O)C(O)C(O)C(O)CO 236 | 4-Methylbiphenyl,-4.4239999999999995,1,168.239,0,2,1,0.0,-4.62,Cc1ccc(cc1)c2ccccc2 237 | Atrazine,-3.069,1,215.68800000000002,2,1,4,62.730000000000004,-3.85,CCNc1nc(Cl)nc(NC(C)C)n1 238 | Phenylthiourea,-1.7009999999999998,1,152.22199999999998,2,1,1,38.05,-1.77,NC(=S)Nc1ccccc1 239 | 4-Heptanone,-1.62,1,114.18799999999999,0,0,4,17.07,-1.3,CCCC(=O)CCC 240 | "3,3-Dimethyl-2-butanone",-1.25,1,100.16099999999999,0,0,0,17.07,-0.72,CC(=O)C(C)(C)C 241 | 4-Chlorophenol ,-2.761,1,128.558,1,1,0,20.23,-0.7,Oc1ccc(Cl)cc1 242 | Cyclohexanone,-0.996,1,98.14500000000001,0,1,0,17.07,-0.6,O=C1CCCCC1 243 | m-Methylaniline,-1.954,1,107.156,1,1,0,26.02,-0.85,Cc1cccc(N)c1 244 | Trichloroacetonitrile,-2.019,1,144.388,0,0,0,23.79,-2.168,ClC(Cl)(Cl)C#N 245 | norflurazon,-4.029,1,303.67100000000005,1,2,2,46.92,-4.046,CNc2cnn(c1cccc(c1)C(F)(F)F)c(=O)c2Cl 246 | 2-Decanone,-2.617,1,156.269,0,0,7,17.07,-3.3,CCCCCCCCC(=O)C 247 | Ipazine,-3.497,1,243.74200000000002,1,1,5,53.940000000000005,-3.785,CCN(CC)c1nc(Cl)nc(NC(C)C)n1 248 | Benzocaine,-2.383,1,165.19199999999998,1,1,2,52.32,-2.616,CCOC(=O)c1ccc(N)cc1 249 | "1,2,4-Trichlorobenzene",-4.083,1,181.449,0,1,0,0.0,-3.59,Clc1ccc(Cl)c(Cl)c1 250 | Triazolam,-3.948,1,343.2170000000001,0,4,1,43.07,-4.09,Cc3nnc4CN=C(c1ccccc1Cl)c2cc(Cl)ccc2n34 251 | "1,2-Benzenediol",-1.635,1,110.11199999999998,2,1,0,40.46,0.62,Oc1ccccc1O 252 | Reverse Transcriptase inhibitor 1,-2.7939999999999996,1,254.29299999999998,0,3,1,49.330000000000005,-2.62,CCN2c1ncccc1N(C)C(=O)c3cccnc23 253 | Dimethyl sulfide,-0.758,1,62.137,0,0,0,0.0,-0.45,CSC 254 | 2-Bromotoluene,-3.667,1,171.03699999999998,0,1,0,0.0,-2.23,Cc1ccccc1Br 255 | O-Ethyl carbamate,-0.218,1,89.09400000000001,1,0,1,52.32,0.85,CCOC(=O)N 256 | megestrol acetate,-4.417,1,384.5160000000002,0,4,2,60.440000000000005,-5.35,CC(=O)OC3(CCC4C2C=C(C)C1=CC(=O)CCC1(C)C2CCC34C)C(C)=O 257 | "2,4-Dimethyl-3-pentanol",-1.6469999999999998,1,116.20399999999998,1,0,2,20.23,-1.22,CC(C)C(O)C(C)C 258 | Napthalene,-3.468,2,128.17399999999995,0,2,0,0.0,-3.6,c1ccc2ccccc2c1 259 | N-Ethylaniline,-2.3890000000000002,1,121.18299999999995,1,1,2,12.03,-1.7,CCNc1ccccc1 260 | Phenytoin,-3.057,1,252.27300000000002,2,3,2,58.2,-4.0969999999999995,O=C1NC(=O)C(N1)(c2ccccc2)c3ccccc3 261 | "7,12-Dimethylbenz(a)anthracene",-6.297000000000001,1,256.348,0,4,0,0.0,-7.02,Cc1c2ccccc2c(C)c3ccc4ccccc4c13 262 | Dialifor,-5.026,1,393.85400000000016,0,2,8,55.84,-6.34,CCOP(=S)(OCC)SC(CCl)N1C(=O)c2ccccc2C1=O 263 | Methoxychlor,-5.537999999999999,1,345.6529999999999,0,2,4,18.46,-6.89,COc1ccc(cc1)C(c2ccc(OC)cc2)C(Cl)(Cl)Cl 264 | TEFLUBENZURON,-5.462000000000001,1,381.1120000000001,2,2,2,58.2,-7.28,Fc1cccc(F)c1C(=O)NC(=O)Nc2cc(Cl)c(F)c(Cl)c2F 265 | 3-Pentanoyloxymethylphenytoin,-3.81,1,366.41700000000003,1,3,7,75.71,-4.678,O=C1N(COC(=O)CCCC)C(=O)C(N1)(c2ccccc2)c3ccccc3 266 | Monuron,-2.6710000000000003,1,198.653,1,1,1,32.34,-2.89,CN(C)C(=O)Nc1ccc(Cl)cc1 267 | Flutriafol,-3.569,1,301.296,1,3,4,50.94,-3.37,OC(Cn1cncn1)(c2ccc(F)cc2)c3ccccc3F 268 | triamcinolone diacetate,-3.8760000000000003,1,478.51300000000026,2,4,4,127.20000000000002,-4.13,CC(=O)OCC(=O)C3(O)C(CC4C2CCC1=CC(=O)C=CC1(C)C2(F)C(O)CC34C)OC(C)=O 269 | 1-Bromobutane,-2.303,1,137.01999999999998,0,0,2,0.0,-2.37,CCCCBr 270 | "1,2,4,5-Tetrabromobenzene",-6.001,1,393.69800000000004,0,1,0,0.0,-6.98,Brc1cc(Br)c(Br)cc1Br 271 | 4-Methyl-2-pentanone,-1.1840000000000002,1,100.16099999999999,0,0,2,17.07,-0.74,CC(C)CC(=O)C 272 | cycloate,-3.35,1,215.36199999999994,0,1,3,20.310000000000002,-3.4,CCSC(=O)N(CC)C1CCCCC1 273 | 4-Chloroanisole,-3.057,1,142.585,0,1,1,9.23,-2.78,COc1ccc(Cl)cc1 274 | Deltamethrin,-7.44,1,505.20600000000024,0,3,6,59.32000000000001,-8.402000000000001,CC1(C)C(C=C(Br)Br)C1C(=O)OC(C#N)c2cccc(Oc3ccccc3)c2 275 | Talbutal,-2.06,1,224.26,2,1,4,75.27000000000001,-2.016,CCC(C)C1(CC=C)C(=O)NC(=O)NC1=O 276 | Fenitrothion,-3.845,1,277.238,0,1,5,70.83000000000001,-4.04,COP(=S)(OC)Oc1ccc(N(=O)=O)c(C)c1 277 | 1-Iodonapthalene,-4.888999999999999,1,254.07000000000002,0,2,0,0.0,-4.55,Ic1cccc2ccccc12 278 | Sorbitol,0.647,1,182.172,6,0,5,121.38000000000001,1.09,OCC(O)C(O)C(O)C(O)CO 279 | Ethanethiol,-0.968,1,62.137,1,0,0,0.0,-0.6,CCS 280 | "1,1,2-Trichloroethane",-1.9609999999999999,1,133.405,0,0,1,0.0,-1.48,ClCC(Cl)Cl 281 | Pyrolan,-3.141,1,245.282,0,2,2,47.36000000000001,-2.09,CN(C)C(=O)Oc1cc(C)nn1c2ccccc2 282 | o-Hydroxybenzamide,-1.942,1,137.13799999999998,2,1,1,63.32000000000001,-1.82,NC(=O)c1ccccc1O 283 | o-Nitrotoluene,-2.589,1,137.138,0,1,1,43.14,-2.33,Cc1ccccc1N(=O)=O 284 | "5,5-Diisopropylbarbital",-1.942,1,212.249,2,1,2,75.27000000000001,-2.766,O=C1NC(=O)NC(=O)C1(C(C)C)C(C)C 285 | 2-Ethyltoluene,-3.2960000000000003,1,120.19499999999996,0,1,1,0.0,-3.21,CCc1ccccc1C 286 | 1-Chloroheptane,-3.003,1,134.65,0,0,5,0.0,-4.0,CCCCCCCCl 287 | Barbital,-1.265,1,184.19499999999996,2,1,2,75.27000000000001,-2.4,O=C1NC(=O)NC(=O)C1(CC)CC 288 | Bibenzyl ,-4.301,2,182.266,0,2,3,0.0,-4.62,C(Cc1ccccc1)c2ccccc2 289 | "1,1,2,2-Tetrachloroethane",-2.549,1,167.85,0,0,1,0.0,-1.74,ClC(Cl)C(Cl)Cl 290 | RTI 23,-4.228,1,283.331,1,3,2,54.46,-5.153,CCN2c1cc(OC)cc(C)c1NC(=O)c3cccnc23 291 | 2-Methylphenanthrene,-4.87,1,192.261,0,3,0,0.0,-5.84,Cc1ccc2c(ccc3ccccc32)c1 292 | dibutylphthalate,-4.378,1,278.348,0,1,8,52.60000000000001,-4.4,CCCCOC(=O)c1ccccc1C(=O)OCCCC 293 | tetrachloroguaiacol,-4.2989999999999995,1,261.919,1,1,1,29.46,-4.02,COc1c(O)c(Cl)c(Cl)c(Cl)c1Cl 294 | Dimecron,-2.426,1,299.6909999999999,0,0,8,65.07000000000001,0.523,CCN(CC)C(=O)C(=CCOP(=O)(OC)OC)Cl 295 | Equilin,-3.555,1,268.356,1,4,0,37.3,-5.282,CC34CCC1C(=CCc2cc(O)ccc12)C3CCC4=O 296 | Chlorimuron-ethyl (ph 7),-3.719,1,414.82700000000017,1,2,8,127.79,-4.5760000000000005,CCOC(=O)c1ccccc1S(=O)(=O)NN(C=O)c2nc(Cl)cc(OC)n2 297 | p-Nitroanisole,-2.522,1,153.13699999999997,0,1,2,52.37,-2.41,COc1ccc(cc1)N(=O)=O 298 | 1-Chlorohexane,-2.648,1,120.623,0,0,4,0.0,-3.12,CCCCCCCl 299 | "2,2',3,3',4,4',5,5'-PCB",-8.468,1,429.77200000000016,0,2,1,0.0,-9.16,Clc1cc(c(Cl)c(Cl)c1Cl)c2cc(Cl)c(Cl)c(Cl)c2Cl 300 | Raffinose,0.496,1,504.43800000000005,11,3,8,268.67999999999995,-0.41,OCC1OC(CO)(OC2OC(COC3OC(CO)C(O)C(O)C3O)C(O)C(O)C2O)C(O)C1O 301 | hexacosane,-9.702,1,366.7180000000002,0,0,23,0.0,-8.334,CCCCCCCCCCCCCCCCCCCCCCCCCC 302 | RTI 5,-3.471,1,253.30499999999995,0,3,1,36.44,-3.324,CCN2c1ccccc1N(C)C(=O)c3cccnc23 303 | "1,1-Dichloroethane",-1.5759999999999998,1,98.96000000000001,0,0,0,0.0,-1.29,CC(Cl)Cl 304 | Sulfanilamide,-0.9540000000000001,1,172.20899999999997,2,1,1,86.18,-1.34,Nc1ccc(cc1)S(N)(=O)=O 305 | Isopropalin,-5.306,1,309.36600000000004,0,1,8,89.51999999999998,-6.49,CCCN(CCC)c1c(cc(cc1N(=O)=O)C(C)C)N(=O)=O 306 | Lindane,-4.0089999999999995,1,290.832,0,1,0,0.0,-4.64,ClC1C(Cl)C(Cl)C(Cl)C(Cl)C1Cl 307 | Isofenphos,-4.538,1,345.4010000000002,1,1,8,56.790000000000006,-4.194,CCOP(=S)(NC(C)C)Oc1ccccc1C(=O)OC(C)C 308 | "1,2,3-Trichlorobenzene",-4.008,1,181.44899999999998,0,1,0,0.0,-4.0,Clc1cccc(Cl)c1Cl 309 | Tetrachloromethane,-2.6069999999999998,1,153.823,0,0,0,0.0,-2.31,ClC(Cl)(Cl)Cl 310 | "3,4-Dichloronitrobenzene",-3.448,1,192.001,0,1,1,43.14,-3.2,O=N(=O)c1cc(Cl)c(Cl)cc1 311 | Cyclooctanol,-2.14,1,128.215,1,1,0,20.23,-1.29,OC1CCCCCCC1 312 | 17a-Methyltestosterone,-4.073,1,302.4580000000001,1,4,0,37.3,-3.9989999999999997,CC1(O)CCC2C3CCC4=CC(=O)CCC4(C)C3CCC21C 313 | Dulcin,-2.167,1,180.20699999999997,2,1,3,64.35,-2.17,CCOc1ccc(NC(N)=O)cc1 314 | "trans-1,4-Dimethylcyclohexane",-3.305,1,112.216,0,1,0,0.0,-4.47,C/C1CCC(\C)CC1 315 | "1,7-phenantroline",-2.9939999999999998,2,180.20999999999998,0,3,0,25.78,-2.68,c1cnc2c(c1)ccc3ncccc23 316 | Methyl t-butyl ether ,-0.9840000000000001,1,88.14999999999999,0,0,0,9.23,-0.24,COC(C)(C)C 317 | Anethole,-3.2539999999999996,1,148.20499999999998,0,1,2,9.23,-3.13,COc1ccc(C=CC)cc1 318 | 1-Hexadecanol,-4.94,1,242.44699999999992,1,0,14,20.23,-7.0,CCCCCCCCCCCCCCCCO 319 | uracil,-0.441,1,112.088,2,1,0,65.72,-1.4880000000000002,O=c1cc[nH]c(=O)[nH]1 320 | adenine,-1.255,1,135.13,2,2,0,80.47999999999999,-2.12,Nc1ncnc2nc[nH]c12 321 | "2,2',3,4,5-PCB",-6.709,1,326.437,0,2,1,0.0,-7.21,Clc1cc(Cl)c(cc1Cl)c2cccc(Cl)c2Cl 322 | Ancymidol,-2.181,1,256.30499999999995,1,3,4,55.24,-2.596,COc1ccc(cc1)C(O)(C2CC2)c3cncnc3 323 | Benzo(b)fluoranthene,-6.007000000000001,2,252.31599999999997,0,5,0,0.0,-8.23,c1ccc2c(c1)c3cccc4c3c2cc5ccccc54 324 | Carbanilide,-3.611,1,212.25199999999998,2,2,2,41.13,-3.15,O=C(Nc1ccccc1)Nc2ccccc2 325 | phenobarbital,-2.272,1,232.239,2,2,2,75.27000000000001,-2.322,CCC1(C(=O)NC(=O)NC1=O)c2ccccc2 326 | "2',3,4-PCB",-5.686,1,257.547,0,2,1,0.0,-6.29,Clc1ccc(cc1)c2cccc(Cl)c2Cl 327 | Isoproturon,-2.867,1,206.289,1,1,2,32.34,-3.536,CC(C)c1ccc(NC(=O)N(C)C)cc1 328 | Azintamide,-2.231,1,259.762,0,1,5,46.09,-1.716,CCN(CC)C(=O)CSc1ccc(Cl)nn1 329 | "2,2-Dimethyl-1-butanol",-1.365,1,102.17699999999998,1,0,2,20.23,-1.04,CCC(C)(C)CO 330 | Ethyl pentanoate,-1.899,1,130.18699999999998,0,0,4,26.3,-1.75,CCCOC(=O)CCC 331 | "2,4,6-Trinitrotoluene",-2.6060000000000003,1,227.13199999999998,0,1,3,129.42000000000002,-3.22,Cc1c(cc(cc1N(=O)=O)N(=O)=O)N(=O)=O 332 | Bensulide,-4.99,1,397.52400000000006,1,1,10,64.63,-4.2,CC(C)OP(=S)(OC(C)C)SCCNS(=O)(=O)c1ccccc1 333 | Cycloheptane,-2.9160000000000004,2,98.18900000000001,0,1,0,0.0,-3.51,C1CCCCCC1 334 | Propyl formate,-0.757,1,88.10599999999998,0,0,3,26.3,-0.49,CCCOC=O 335 | 2-Isopropyltoluene,-3.585,1,134.22199999999995,0,1,1,0.0,-3.76,CC(C)c1ccccc1C 336 | m-Chloroaniline,-2.392,1,127.574,1,1,0,26.02,-1.37,Nc1cccc(Cl)c1 337 | "2,4-Dimethylpentane",-2.938,1,100.20499999999998,0,0,2,0.0,-4.26,CC(C)CC(C)C 338 | Dibenzofurane,-4.2010000000000005,2,168.195,0,3,0,13.14,-4.6,o1c2ccccc2c3ccccc13 339 | ethofumesate,-3.1839999999999997,1,286.34900000000005,0,2,4,61.830000000000005,-3.42,CCOC2Oc1ccc(OS(C)(=O)=O)cc1C2(C)C 340 | Fluometuron,-3.065,1,232.20499999999996,1,1,1,32.34,-3.43,CN(C)C(=O)Nc1cccc(c1)C(F)(F)F 341 | Acridine,-3.846,2,179.22199999999998,0,3,0,12.89,-3.67,c3ccc2nc1ccccc1cc2c3 342 | Cortisone,-2.8930000000000002,1,360.45000000000016,2,4,2,91.67,-3.11,CC12CC(=O)C3C(CCC4=CC(=O)CCC34C)C2CCC1(O)C(=O)CO 343 | glucose,0.501,1,180.156,5,1,1,110.38000000000001,0.74,OCC1OC(O)C(O)C(O)C1O 344 | 3-Methylphenol,-2.313,1,108.13999999999999,1,1,0,20.23,-0.68,Cc1cccc(O)c1 345 | Indapamide,-4.345,1,365.84200000000004,2,3,3,92.5,-3.5860000000000003,CC2Cc1ccccc1N2NC(=O)c3ccc(Cl)c(c3)S(N)(=O)=O 346 | Lovastatin,-4.731,1,404.54700000000025,1,3,6,72.83,-6.005,CCC(C)C(=O)OC2CC(C)C=C3C=CC(C)C(CCC1CC(O)CC(=O)O1)C23 347 | "1,4-Dinitrobenzene",-2.281,1,168.10799999999995,0,1,2,86.28,-3.39,O=N(=O)c1ccc(cc1)N(=O)=O 348 | Reposal,-2.781,1,262.30899999999997,2,3,2,75.27000000000001,-2.696,CCC1(C(=O)NC(=O)NC1=O)C2=CCC3CCC2C3 349 | Ethyl decanoate,-3.6710000000000003,1,200.32199999999997,0,0,9,26.3,-4.1,CCCCCCCCCC(=O)OCC 350 | Fenuron,-1.847,1,164.208,1,1,1,32.34,-1.6,CN(C)C(=O)Nc1ccccc1 351 | Ethyl propyl ether,-1.072,1,88.14999999999999,0,0,3,9.23,-0.66,CCCOCC 352 | 2-Propanol,-0.261,1,60.096000000000004,1,0,0,20.23,0.43,CC(C)O 353 | 2-Methylnapthalene,-3.802,1,142.201,0,2,0,0.0,-3.77,Cc1ccc2ccccc2c1 354 | Chlorodibromethane,-2.54,1,208.28,0,0,0,0.0,-1.9,ClC(Br)Br 355 | Hexestrol,-4.854,1,270.372,2,2,5,40.46,-4.43,CCC(C(CC)c1ccc(O)cc1)c2ccc(O)cc2 356 | Malathion,-3.391,1,330.3640000000001,0,0,9,71.06,-3.37,CCOC(=O)CC(SP(=S)(OC)OC)C(=O)OCC 357 | Benzylchloride,-2.887,1,126.58599999999996,0,1,1,0.0,-2.39,ClCc1ccccc1 358 | t-Crotonaldehyde,-0.604,1,70.09100000000001,0,0,1,17.07,0.32,C/C=C/C=O 359 | Chlorbromuron,-3.938,1,293.548,1,1,2,41.57,-3.924,CON(C)C(=O)Nc1ccc(Br)c(Cl)c1 360 | "9,10-Dimethylanthracene",-5.228,1,206.28799999999998,0,3,0,0.0,-6.57,Cc1c2ccccc2c(C)c3ccccc13 361 | Methyl hexanoate,-1.899,1,130.18699999999998,0,0,4,26.3,-1.87,CCCCCC(=O)OC 362 | Dimefuron,-3.8310000000000004,1,338.79500000000013,1,2,2,80.37,-4.328,CN(C)C(=O)Nc1ccc(c(Cl)c1)n2nc(oc2=O)C(C)(C)C 363 | p-Fluoroacetanilide,-2.181,1,153.156,1,1,1,29.1,-1.78,CC(=O)Nc1ccc(F)cc1 364 | alachlor,-3.319,1,269.77199999999993,0,1,6,29.54,-3.26,CCc1cccc(CC)c1N(COC)C(=O)CCl 365 | Cyclohexene,-2.16,2,82.146,0,1,0,0.0,-2.59,C1CCC=CC1 366 | Hydrocortisone ,-3.159,1,362.4660000000002,3,4,2,94.83,-3.09,CC12CC(O)C3C(CCC4=CC(=O)CCC34C)C2CCC1(O)C(=O)CO 367 | Pyrimidine,-0.884,2,80.08999999999999,0,1,0,25.78,1.1,c1cncnc1 368 | p-Chloronitrobenzene,-2.9010000000000002,1,157.55599999999998,0,1,1,43.14,-2.92,Clc1ccc(cc1)N(=O)=O 369 | Methyl propionate,-0.836,1,88.106,0,0,1,26.3,-0.14,CCC(=O)OC 370 | o-Chloronitrobenzene,-2.775,1,157.55599999999998,0,1,1,43.14,-2.55,Clc1ccccc1N(=O)=O 371 | Neburon,-4.157,1,275.179,1,1,4,32.34,-4.77,CCCCN(C)C(=O)Nc1ccc(Cl)c(Cl)c1 372 | Buthidazole,-2.398,1,256.33099999999996,1,2,1,69.56,-1.8769999999999998,CN1CC(O)N(C1=O)c2nnc(s2)C(C)(C)C 373 | Nitrobenzene,-2.2880000000000003,1,123.11099999999996,0,1,1,43.14,-1.8,O=N(=O)c1ccccc1 374 | Iodobenzene,-3.8,1,204.01000000000002,0,1,0,0.0,-3.01,Ic1ccccc1 375 | Metolazone,-3.7769999999999997,1,365.8420000000001,2,3,2,92.5,-3.78,CC2Nc1cc(Cl)c(cc1C(=O)N2c3ccccc3C)S(N)(=O)=O 376 | Methocarbamol,-1.4280000000000002,1,241.24299999999994,2,1,6,91.00999999999999,-0.985,COc1ccccc1OCC(O)COC(N)=O 377 | butachlor,-4.3469999999999995,1,311.85300000000007,0,1,9,29.54,-4.19,CCCCOCN(C(=O)CCl)c1c(CC)cccc1CC 378 | "2,3-Dichlorophenol",-3.1439999999999997,1,163.003,1,1,0,20.23,-1.3,Oc1cccc(Cl)c1Cl 379 | Propyl butyrate,-1.1909999999999998,1,102.13299999999998,0,0,2,26.3,-1.92,CCCC(=O)OC 380 | Propanil,-3.6439999999999997,1,218.08299999999997,1,1,2,29.1,-3.0,CCC(=O)Nc1ccc(Cl)c(Cl)c1 381 | Triamterene,-3.051,1,253.26900000000003,3,3,1,129.62,-2.404,Nc3nc(N)c2nc(c1ccccc1)c(N)nc2n3 382 | Ethyl hexanoate,-2.254,1,144.21399999999997,0,0,5,26.3,-2.35,CCCCCC(=O)OCC 383 | chloralose,-1.8869999999999998,1,309.529,3,2,2,88.38000000000001,-1.84,OCC(O)C2OC1OC(OC1C2O)C(Cl)(Cl)Cl 384 | Amitraz,-5.5329999999999995,1,293.41400000000004,0,2,4,27.96,-5.47,CN(C=Nc1ccc(C)cc1C)C=Nc2ccc(C)cc2C 385 | Prometon,-3.448,1,225.296,2,1,5,71.96000000000001,-2.478,COc1nc(NC(C)C)nc(NC(C)C)n1 386 | 1-Octene ,-3.073,1,112.216,0,0,5,0.0,-4.44,CCCCCCC=C 387 | p-Methylaniline ,-1.954,1,107.156,1,1,0,26.02,-1.21,Cc1ccc(N)cc1 388 | aminothiazole,-1.226,1,100.14599999999999,1,1,0,38.91,-0.36,Nc1nccs1 389 | Metolcarb,-1.9469999999999998,1,151.165,1,1,1,38.33,-1.8030000000000002,c1ccccc1(OC(=O)NC) 390 | 3-Hexanol,-1.324,1,102.17699999999999,1,0,3,20.23,-0.8,CCCC(O)CC 391 | 9-anthrol,-4.148,1,194.23299999999998,1,3,0,20.23,-4.73,c3ccc2c(O)c1ccccc1cc2c3 392 | 2-Methylanthracene,-4.87,1,192.261,0,3,0,0.0,-6.96,Cc1ccc2cc3ccccc3cc2c1 393 | "1,2,3-Trimethylbenzene ",-3.312,1,120.195,0,1,0,0.0,-3.2,Cc1cccc(C)c1C 394 | Aminocarb,-2.677,1,208.26099999999997,1,1,2,41.57,-2.36,CNC(=O)Oc1ccc(N(C)C)c(C)c1 395 | 2-Nonanol,-2.387,1,144.258,1,0,6,20.23,-2.74,CCCCCCCC(C)O 396 | Methyldymron,-3.863,1,268.36,1,2,3,32.34,-3.35,CN(C(=O)NC(C)(C)c1ccccc1)c2ccccc2 397 | 3-Hexanone,-1.266,1,100.16099999999999,0,0,3,17.07,-0.83,CCCC(=O)CC 398 | bromoxynil,-3.793,1,276.91499999999996,1,1,0,44.019999999999996,-3.33,Oc1c(Br)cc(C#N)cc1Br 399 | "3,4-PCB",-5.223,1,223.102,0,2,1,0.0,-6.39,Clc1ccc(cc1Cl)c2ccccc2 400 | Mefenacet,-4.504,1,298.367,0,3,4,42.43000000000001,-4.873,CN(C(=O)COc1nc2ccccc2s1)c3ccccc3 401 | 5-hydroxyquinoline,-2.725,1,145.161,1,2,0,33.120000000000005,-2.54,Oc1cccc2ncccc12 402 | Carboxin,-2.927,1,235.30800000000002,1,2,2,38.33,-3.14,CC1=C(SCCO1)C(=O)Nc2ccccc2 403 | Ethoxyzolamide,-3.085,1,258.324,1,2,3,82.28,-3.81,CCOc2ccc1nc(sc1c2)S(N)(=O)=O 404 | Pentachlorophenol,-4.835,1,266.33799999999997,1,1,0,20.23,-4.28,Oc1c(Cl)c(Cl)c(Cl)c(Cl)c1Cl 405 | Bromochloromethane,-1.5190000000000001,1,129.384,0,0,0,0.0,-0.89,ClCBr 406 | metharbital,-1.6580000000000001,1,198.22199999999998,1,1,2,66.48,-2.23,CCC1(CC)C(=O)NC(=O)N(C)C1=O 407 | deoxycorticosterone acetate,-4.4719999999999995,1,372.5050000000002,0,4,3,60.440000000000005,-4.63,CC(=O)OCC(=O)C3CCC4C2CCC1=CC(=O)CCC1(C)C2CCC34C 408 | benzylurea,-1.5090000000000001,1,150.18099999999998,2,1,2,55.120000000000005,-0.95,NC(=O)NCc1ccccc1 409 | Chlortoluron,-3.048,1,212.67999999999998,1,1,1,32.34,-3.483,CN(C)C(=O)Nc1ccc(C)c(Cl)c1 410 | Linuron,-3.5810000000000004,1,249.09699999999998,1,1,2,41.57,-3.592,CON(C)C(=O)Nc1ccc(Cl)c(Cl)c1 411 | Cycloheptanol,-1.7,1,114.188,1,1,0,20.23,-0.88,OC1CCCCCC1 412 | Thiamphenicol,-1.936,1,356.2270000000001,3,1,6,103.70000000000002,-2.154,CS(=O)(=O)c1ccc(cc1)C(O)C(CO)NC(=O)C(Cl)Cl 413 | thiopental,-2.96,1,242.34400000000002,2,1,4,58.2,-3.36,CCCC(C)C1(CC)C(=O)NC(=S)NC1=O 414 | acetazolamide,-0.7929999999999999,1,222.251,2,1,2,115.03999999999999,-2.36,CC(=O)Nc1nnc(s1)S(N)(=O)=O 415 | p-Nitrophenol,-2.318,1,139.10999999999999,1,1,1,63.37,-0.74,Oc1ccc(cc1)N(=O)=O 416 | Aldrin,-5.511,1,364.914,0,4,0,0.0,-6.307,ClC1=C(Cl)C2(Cl)C3C4CC(C=C4)C3C1(Cl)C2(Cl)Cl 417 | Tetrahydrofurane ,-0.62,2,72.107,0,1,0,9.23,0.49,C1CCOC1 418 | o-Nitroaniline,-2.2769999999999997,1,138.126,1,1,1,69.16,-1.96,Nc1ccccc1N(=O)=O 419 | "2,2',3,3'-PCB",-6.079,1,291.99199999999996,0,2,1,0.0,-7.28,Clc1cccc(c1Cl)c2cccc(Cl)c2Cl 420 | phenylbutazone,-4.0760000000000005,1,308.38100000000003,0,3,5,40.620000000000005,-3.81,CCCCC1C(=O)N(N(C1=O)c2ccccc2)c3ccccc3 421 | "2,6-Dinitrotoluene",-2.553,1,182.135,0,1,2,86.28,-3.0,Cc1c(cccc1N(=O)=O)N(=O)=O 422 | Progesterone,-4.17,1,314.46900000000005,0,4,1,34.14,-4.42,CC(=O)C1CCC2C3CCC4=CC(=O)CCC4(C)C3CCC12C 423 | Chlorazine,-3.6630000000000003,1,257.76899999999995,0,1,6,45.150000000000006,-4.4110000000000005,CCN(CC)c1nc(Cl)nc(n1)N(CC)CC 424 | captafol,-4.365,1,349.06600000000014,0,2,3,37.38,-5.4,ClC(Cl)C(Cl)(Cl)SN2C(=O)C1CC=CCC1C2=O 425 | "1,2,4-tribromobenzene",-5.144,1,314.802,0,1,0,0.0,-4.5,c1(Br)c(Br)cc(Br)cc1 426 | Oxazepam,-3.517,1,286.718,2,3,1,61.690000000000005,-3.952,OC3N=C(c1ccccc1)c2cc(Cl)ccc2NC3=O 427 | Secobarbital,-2.415,1,238.28699999999995,2,1,5,75.27000000000001,-2.356,O=C1NC(=O)NC(=O)C1(C(C)CCC)CC=C 428 | Carvacrol,-3.2239999999999998,1,150.22099999999998,1,1,1,20.23,-2.08,c1(O)c(C)ccc(C(C)C)c1 429 | rhodanine,-0.396,1,133.197,1,1,0,29.1,-1.77,C1SC(=S)NC1(=O) 430 | Morin,-2.7310000000000003,1,302.23800000000006,5,3,1,131.35999999999999,-3.083,Oc1ccc(c(O)c1)c3oc2cc(O)cc(O)c2c(=O)c3O 431 | Kepone,-5.112,1,490.6390000000001,0,6,0,17.07,-5.2589999999999995,ClC1(C(=O)C2(Cl)C3(Cl)C14Cl)C5(Cl)C2(Cl)C3(Cl)C(Cl)(Cl)C45Cl 432 | Disulfiram,-3.862,1,296.5520000000001,0,0,4,6.48,-4.86,CCN(CC)C(=S)SSC(=S)N(CC)CC 433 | Cyclohexane,-2.477,2,84.162,0,1,0,0.0,-3.1,C1CCCCC1 434 | Dienochlor,-7.848,1,474.64,0,2,1,0.0,-7.278,ClC1=C(Cl)C(Cl)(C(=C1Cl)Cl)C2(Cl)C(=C(Cl)C(=C2Cl)Cl)Cl 435 | chlordimeform,-3.1639999999999997,1,196.68099999999998,0,1,2,15.6,-2.86,CN(C)C=Nc1ccc(Cl)cc1C 436 | Equilenin,-3.927,1,266.34,1,4,0,37.3,-5.24,CC34CCc1c(ccc2cc(O)ccc12)C3CCC4=O 437 | 1-Octanol,-2.105,1,130.23100000000002,1,0,6,20.23,-2.39,CCCCCCCCO 438 | Diethyl sulfide,-1.598,1,90.191,0,0,2,0.0,-1.34,CCSCC 439 | "1,2-Dichloroethane",-1.374,1,98.96000000000001,0,0,1,0.0,-1.06,ClCCCl 440 | 2-Chloro-2-methylbutane,-2.278,1,106.59599999999999,0,0,1,0.0,-2.51,CCC(C)(C)Cl 441 | 1-Chloro-2-bromoethane,-1.7380000000000002,1,143.411,0,0,1,0.0,-1.32,ClCCBr 442 | p-Nitroaniline,-1.936,1,138.126,1,1,1,69.16,-2.37,Nc1ccc(cc1)N(=O)=O 443 | Lactose,1.071,1,342.297,8,2,4,189.52999999999997,-0.244,OCC1OC(OC2C(O)C(O)C(O)OC2CO)C(O)C(O)C1O 444 | RTI 2,-3.125,1,268.32,0,3,2,49.330000000000005,-2.86,CCN2c1ncccc1N(CC)C(=O)c3cccnc23 445 | Chlorobenzene,-2.975,1,112.55899999999997,0,1,0,0.0,-2.38,Clc1ccccc1 446 | 1-Nonene ,-3.427,1,126.243,0,0,6,0.0,-5.05,CCCCCCCC=C 447 | p-Bromoiodobenzene,-4.754,1,282.90599999999995,0,1,0,0.0,-4.56,Brc1ccc(I)cc1 448 | 3-Methyl-3-pentanol,-1.308,1,102.17699999999998,1,0,2,20.23,-0.36,CCC(C)(O)CC 449 | Pentylbenzene,-3.8989999999999996,1,148.249,0,1,4,0.0,-4.64,CCCCCc1ccccc1 450 | allantoin,0.652,1,158.117,4,1,1,113.32,-1.6,NC(=O)NC1NC(=O)NC1=O 451 | Glafenine,-5.052,1,372.80800000000016,3,3,6,91.67999999999999,-4.571000000000001,OCC(O)COC(=O)c1ccccc1Nc2ccnc3cc(Cl)ccc23 452 | DDD,-6.007999999999999,1,320.04600000000005,0,2,3,0.0,-7.2,ClC(Cl)C(c1ccc(Cl)cc1)c2ccc(Cl)cc2 453 | testosterone acetate,-4.449,1,330.4680000000001,0,4,1,43.370000000000005,-5.184,CC(=O)OC3CCC4C2CCC1=CC(=O)CCC1(C)C2CCC34C 454 | 1-Chloronapthalene,-4.063,1,162.61899999999997,0,2,0,0.0,-3.93,Clc1cccc2ccccc12 455 | RTI 19,-4.007,1,252.31699999999995,0,3,1,23.55,-4.749,CCN2c1ccccc1N(C)C(=O)c3ccccc23 456 | 2-Hexanol,-1.324,1,102.17699999999998,1,0,3,20.23,-0.89,CCCCC(C)O 457 | Propylcyclopentane,-3.16,1,112.21600000000001,0,1,2,0.0,-4.74,CCCC1CCCC1 458 | Etomidate,-3.359,1,244.294,0,2,4,44.12,-4.735,CCOC(=O)c1cncn1C(C)c2ccccc2 459 | "3,4-Dichlorophenol",-3.352,1,163.00300000000001,1,1,0,20.23,-1.25,Oc1ccc(Cl)c(Cl)c1 460 | Cypermethrin,-6.775,1,416.30400000000014,0,3,6,59.32000000000001,-8.017000000000001,CC1(C)C(C=C(Cl)Cl)C1C(=O)OC(C#N)c2cccc(Oc3ccccc3)c2 461 | Benzoxazole,-2.214,2,119.12299999999998,0,2,0,26.03,-1.16,c2ccc1ocnc1c2 462 | 1-Pentanol,-1.042,1,88.14999999999999,1,0,3,20.23,-0.6,CCCCCO 463 | "N,N-Diethylaniline",-3.16,1,149.237,0,1,3,3.24,-3.03,CCN(CC)c1ccccc1 464 | "1,3-Difluorobenzene",-2.636,1,114.094,0,1,0,0.0,-2.0,Fc1cccc(F)c1 465 | 3-chloropropionitrile,-0.522,1,89.525,0,0,1,23.79,-0.29,ClCCC#N 466 | t-Pentylbenzene,-3.867,1,148.249,0,1,1,0.0,-4.15,CC(C)(C)Cc1ccccc1 467 | 5-Ethyl-5-phenylbarbital,-2.272,1,232.239,2,2,2,75.27000000000001,-2.322,O=C1NC(=O)NC(=O)C1(CC)c1ccccc1 468 | o-Chloroiodobenzene,-4.3839999999999995,1,238.45499999999998,0,1,0,0.0,-3.54,Clc1ccccc1I 469 | Benzotriazole,-2.21,2,119.127,1,2,0,41.57,-0.78,c2ccc1[nH]nnc1c2 470 | Carbofuran,-3.05,1,221.25599999999994,1,2,1,47.56,-2.8,CNC(=O)Oc1cccc2CC(C)(C)Oc12 471 | "2,6-Dimethylphenol",-2.589,1,122.16699999999999,1,1,0,20.23,-1.29,Cc1cccc(C)c1O 472 | 3-Methyl-2-butanol,-0.9540000000000001,1,88.14999999999999,1,0,1,20.23,-0.18,CC(C)C(C)O 473 | benzhydrol,-3.033,1,184.238,1,2,2,20.23,-2.55,c1ccccc1C(O)c2ccccc2 474 | Methyl decanoate,-3.3160000000000003,1,186.295,0,0,8,26.3,-4.69,CCCCCCCCCC(=O)OC 475 | Dicapthon,-4.188,1,297.656,0,1,5,70.83000000000001,-4.31,COP(=S)(OC)Oc1ccc(cc1Cl)N(=O)=O 476 | 1-Bromo-2-methylpropane,-2.2880000000000003,1,137.01999999999998,0,0,1,0.0,-2.43,CC(C)CBr 477 | Iodoethane,-2.066,1,155.966,0,0,0,0.0,-1.6,CCI 478 | Pirimicarb,-2.34,1,238.29099999999997,0,1,2,58.56000000000001,-1.95,CN(C)C(=O)Oc1nc(nc(C)c1C)N(C)C 479 | 1-Bromohexane,-3.012,1,165.074,0,0,4,0.0,-3.81,CCCCCCBr 480 | 2-Methylpentane,-2.6,1,86.178,0,0,2,0.0,-3.74,CCCC(C)C 481 | Tetrafluthrin,-6.3389999999999995,1,418.7360000000001,0,2,4,26.3,-7.321000000000001,Cc1c(F)c(F)c(COC(=O)C2C(C=C(Cl)C(F)(F)F)C2(C)C)c(F)c1F 482 | Metolachlor,-3.431,1,283.7989999999999,0,1,6,29.54,-2.73,CCc1cccc(C)c1N(C(C)COC)C(=O)CCl 483 | nifuroxime,-1.8430000000000002,1,156.09699999999998,1,1,2,88.87,-2.19,ON=Cc1ccc(o1)N(=O)=O 484 | Fluvalinate,-8.057,1,502.9200000000002,1,3,8,71.35,-8.003,CC(C)C(Nc1ccc(cc1Cl)C(F)(F)F)C(=O)OC(C#N)c2cccc(Oc3ccccc3)c2 485 | Amitrole,-0.674,1,84.082,2,1,0,67.59,0.522,Nc1nc[nH]n1 486 | Tribromomethane,-2.904,1,252.731,0,0,0,0.0,-1.91,BrC(Br)Br 487 | Trichlorfon,-1.8659999999999999,1,257.437,1,0,3,55.760000000000005,-0.22,COP(=O)(OC)C(O)C(Cl)(Cl)Cl 488 | Phosalone,-5.024,1,367.8160000000001,0,2,7,53.6,-5.233,CCOP(=S)(OCC)SCn1c(=O)oc2cc(Cl)ccc12 489 | Phenylmethanol,-1.699,1,108.13999999999997,1,1,1,20.23,-0.4,OCc1ccccc1 490 | Coumatetralyl,-5.194,1,292.33400000000006,1,4,1,50.44,-2.84,O=c2c(C3CCCc4ccccc43)c(O)c1ccccc1o2 491 | 4-Bromophenol,-3.1319999999999997,1,173.00900000000001,1,1,0,20.23,-1.09,Oc1ccc(Br)cc1 492 | 2-Bromopropane,-1.949,1,122.993,0,0,0,0.0,-1.59,CC(C)Br 493 | "2,2,4-Trimethylpentane",-3.2760000000000002,1,114.23199999999999,0,0,1,0.0,-4.74,CC(C)CC(C)(C)C 494 | "1,3,5-Trinitrobenzene",-2.324,1,213.10499999999996,0,1,3,129.42000000000002,-2.89,O=N(=O)c1cc(cc(c1)N(=O)=O)N(=O)=O 495 | Nimetazepam,-3.557,1,295.29800000000006,0,3,2,75.81,-3.7960000000000003,CN2C(=O)CN=C(c1ccccc1)c3cc(ccc23)N(=O)=O 496 | Propane,-1.5530000000000002,1,44.096999999999994,0,0,0,0.0,-1.94,CCC 497 | Minoxidil,-1.8090000000000002,1,209.25299999999996,2,2,1,95.10999999999999,-1.989,Nc1cc(nc(N)n1=O)N2CCCCC2 498 | 1-aminoacridine,-3.542,1,194.23700000000002,1,3,0,38.91,-4.22,Nc2cccc3nc1ccccc1cc23 499 | Benzo(k)fluoranthene,-6.007000000000001,2,252.31599999999997,0,5,0,0.0,-8.49,c1ccc2cc3c4cccc5cccc(c3cc2c1)c45 500 | Dicofol,-6.268,1,370.49,1,2,2,20.23,-5.666,OC(c1ccc(Cl)cc1)(c2ccc(Cl)cc2)C(Cl)(Cl)Cl 501 | Acenapthene,-3.792,2,154.21199999999996,0,3,0,0.0,-4.63,C1Cc2cccc3cccc1c23 502 | Dialifos,-5.026,1,393.85400000000016,0,2,8,55.84,-6.34,CCOP(=S)(OCC)SC(CCl)N2C(=O)c1ccccc1C2=O 503 | "1,4-Dibromobenzene",-4.298,1,235.90599999999998,0,1,0,0.0,-4.07,Brc1ccc(Br)cc1 504 | Methazole,-3.6010000000000004,1,261.064,0,2,1,57.14,-2.82,Cn2c(=O)on(c1ccc(Cl)c(Cl)c1)c2=O 505 | p-Phenylphenol,-3.701,1,170.211,1,2,1,20.23,-3.48,Oc1ccc(cc1)c2ccccc2 506 | pyracarbolid,-2.83,1,217.26800000000003,1,2,2,38.33,-2.56,CC1=C(CCCO1)C(=O)Nc2ccccc2 507 | Ethyl vinyl ether,-0.857,1,72.10700000000001,0,0,2,9.23,-0.85,CCOC=C 508 | 1-Butyne,-1.092,1,54.09199999999999,0,0,0,0.0,-1.24,CCC#C 509 | 4-methoxypteridine,-1.589,1,162.15200000000002,0,2,1,60.790000000000006,-1.11,COc1ncnc2nccnc12 510 | 3-Methyl-3-heptanol,-2.017,1,130.23099999999997,1,0,4,20.23,-1.6,CCCCC(C)(O)CC 511 | "1,4-Dichlorobenzene",-3.5580000000000003,1,147.00400000000002,0,1,0,0.0,-3.27,Clc1ccc(Cl)cc1 512 | 3-Ethanoyloxymethylphenytoin,-2.7230000000000003,1,324.33600000000007,1,3,4,75.71,-4.47,O=C1N(COC(=O)C)C(=O)C(N1)(c2ccccc2)c3ccccc3 513 | "Sparsomycin (3,8mg/ml)",-1.57,1,361.4450000000001,4,1,8,132.11999999999998,-1.9809999999999999,CSCS(=O)CC(CO)NC(=O)C=Cc1c(C)[nH]c(=O)[nH]c1=O 514 | 3-methylindole,-2.9810000000000003,1,131.17799999999997,1,2,0,15.79,-2.42,Cc1c[nH]c2ccccc12 515 | 2-methoxypteridine,-1.589,1,162.152,0,2,1,60.790000000000006,-1.11,COc2ncc1nccnc1n2 516 | Dioxacarb,-1.614,1,223.22799999999995,1,2,2,56.790000000000006,-1.57,CNC(=O)Oc1ccccc1C2OCCO2 517 | isocarbamid,-1.508,1,185.22699999999998,2,1,2,61.440000000000005,-2.15,C1N(C(=O)NCC(C)C)C(=O)NC1 518 | Acetonitrile,0.152,1,41.053,0,0,0,23.79,0.26,CC#N 519 | Fenoxycarb,-4.662,1,301.34200000000004,1,2,7,56.790000000000006,-4.7,CCOC(=O)NCCOc2ccc(Oc1ccccc1)cc2 520 | acetyl sulfisoxazole,-2.024,1,293.34800000000007,1,2,3,89.43,-3.59,CC(=O)N(S(=O)c1ccc(N)cc1)c2onc(C)c2C 521 | "1,1,1,2-Tetrachloroethane",-2.7939999999999996,1,167.85,0,0,0,0.0,-2.18,ClCC(Cl)(Cl)Cl 522 | 1-Butanol,-0.688,1,74.12299999999999,1,0,2,20.23,0.0,CCCCO 523 | Siduron,-3.779,1,232.32700000000003,2,2,2,41.13,-4.11,CC1CCCCC1NC(=O)Nc2ccccc2 524 | "1,3,5-Trichlorobenzene",-4.159,1,181.449,0,1,0,0.0,-4.48,Clc1cc(Cl)cc(Cl)c1 525 | Furfural,-1.391,1,96.08499999999998,0,1,1,30.21,-0.1,O=Cc1ccco1 526 | 3-Methylbutan-1-ol,-1.0270000000000001,1,88.14999999999999,1,0,2,20.23,-0.51,CC(C)CCO 527 | piperonal,-2.033,1,150.13299999999998,0,2,1,35.53,-1.63,O=Cc2ccc1OCOc1c2 528 | 2-Methylpropene,-1.5730000000000002,1,56.108000000000004,0,0,0,0.0,-2.33,CC(=C)C 529 | Benzaldehyde,-1.999,1,106.12399999999997,0,1,1,17.07,-1.19,O=Cc1ccccc1 530 | "2,3-Dimethyl-1,3-Butadiene",-2.052,1,82.146,0,0,1,0.0,-2.4,CC(=C)C(=C)C 531 | Benfuracarb,-5.132999999999999,1,410.53600000000023,0,2,8,68.31,-4.71,CCOC(=O)CCN(SN(C)C(=O)Oc1cccc2CC(C)(C)Oc21)C(C)C 532 | RTI 10,-2.7710000000000004,1,226.235,0,3,0,42.43,-3.6719999999999997,O2c1ccccc1N(C)C(=O)c3cccnc23 533 | Fluorene ,-4.125,2,166.22299999999998,0,3,0,0.0,-5.0,C1c2ccccc2c3ccccc13 534 | Methylcyclohexane ,-2.891,1,98.18900000000001,0,1,0,0.0,-3.85,CC1CCCCC1 535 | sulfaguanidine,-0.706,1,214.25,4,1,2,122.05999999999999,-1.99,NC(=N)NS(=O)(=O)c1ccc(N)cc1 536 | Methylparaben,-2.441,1,152.149,1,1,1,46.53,-1.827,COC(=O)c1ccc(O)cc1 537 | 2-Methyltetrahydrofurane,-1.034,1,86.134,0,1,0,9.23,0.11,CC1CCCO1 538 | Santonin,-2.43,1,246.30599999999995,0,3,0,43.370000000000005,-3.09,CC3C2CCC1(C)C=CC(=O)C(=C1C2OC3=O)C 539 | Salicin,-0.975,1,286.28,5,2,4,119.61000000000001,-0.85,OCC2OC(Oc1ccccc1CO)C(O)C(O)C2O 540 | 1-Iodopropane,-2.4859999999999998,1,169.993,0,0,1,0.0,-2.29,CCCI 541 | Ametryn,-3.43,1,227.337,2,1,5,62.730000000000004,-3.04,CCNc1nc(NC(C)C)nc(SC)n1 542 | 1-Propanol,-0.33399999999999996,1,60.096,1,0,1,20.23,0.62,CCCO 543 | Hydroxyprogesterone-17a,-3.8760000000000003,1,330.4680000000001,1,4,1,54.37,-3.8169999999999997,CC(=O)C1(O)CCC2C3CCC4=CC(=O)CCC4(C)C3CCC21C 544 | 2-Pentanol,-0.97,1,88.14999999999999,1,0,2,20.23,-0.29,CCCC(C)O 545 | benzoin,-3.148,1,212.248,1,2,3,37.3,-2.85,OC(C(=O)c1ccccc1)c2ccccc2 546 | "2,4-Dimethylphenol",-2.6210000000000004,1,122.16699999999999,1,1,0,20.23,-1.19,Cc1ccc(O)c(C)c1 547 | m-Chloronitrobenzene ,-2.9010000000000002,1,157.55599999999998,0,1,1,43.14,-2.77,Clc1cccc(c1)N(=O)=O 548 | ampyrone,-1.192,1,203.245,1,2,1,52.95,-0.624,Cc2c(N)c(=O)n(c1ccccc1)n2C 549 | "2,2',4,5'-PCB",-6.23,1,291.99199999999996,0,2,1,0.0,-6.57,Clc1ccc(c(Cl)c1)c2cc(Cl)ccc2Cl 550 | "Hexachloro-1,3-butadiene",-4.546,1,260.762,0,0,1,0.0,-4.92,ClC(=C(Cl)C(=C(Cl)Cl)Cl)Cl 551 | Terbutryn,-3.75,1,241.364,2,1,4,62.730000000000004,-4.0,CCNc1nc(NC(C)(C)C)nc(SC)n1 552 | 3-Methyl-2-pentanol,-1.308,1,102.17699999999999,1,0,3,20.23,-0.71,CCC(C)CCO 553 | 2-methylpteridine,-1.24,1,146.153,0,2,0,51.56,-0.12,Cc2ncc1nccnc1n2 554 | Danazol,-4.5569999999999995,1,337.4630000000001,1,5,0,46.260000000000005,-5.507000000000001,CC23Cc1cnoc1C=C2CCC4C3CCC5(C)C4CCC5(O)C#C 555 | 1-Iodobutane,-2.841,1,184.01999999999998,0,0,2,0.0,-2.96,CCCCI 556 | 2-Bromonapthalene,-4.434,1,207.07,0,2,0,0.0,-4.4,Brc1ccc2ccccc2c1 557 | "Digoxin (L1=41,8mg/mL, L2=68,2mg/mL, Z=40,1mg/mL)",-5.312,1,780.9490000000001,6,8,7,203.05999999999997,-4.081,CC1OC(CC(O)C1O)OC2C(O)CC(OC2C)OC8C(O)CC(OC7CCC3(C)C(CCC4C3CC(O)C5(C)C(CCC45O)C6=CC(=O)OC6)C7)OC8C 558 | Benzyltrifluoride,-3.0989999999999998,1,146.111,0,1,0,0.0,-2.51,FC(F)(F)c1ccccc1 559 | Dihexyl phthalate,-5.757999999999999,1,334.45600000000024,0,1,12,52.60000000000001,-6.144,CCCCCCOC(=O)c1ccccc1C(=O)OCCCCCC 560 | Dibenzothiophene,-4.5969999999999995,2,184.263,0,3,0,0.0,-4.38,c1ccc2c(c1)sc3ccccc23 561 | "2,3',4,4'-PCB",-6.709,1,326.437,0,2,1,0.0,-7.8,Clc1ccc(c(Cl)c1)c2ccc(Cl)c(Cl)c2Cl 562 | "2,2',3,3',4,4'-PCB",-7.192,1,360.88200000000006,0,2,1,0.0,-8.01,Clc1ccc(c(Cl)c1Cl)c2ccc(Cl)c(Cl)c2Cl 563 | Warfarin,-3.9130000000000003,1,308.3330000000001,1,3,4,67.50999999999999,-3.8930000000000002,CC(=O)CC(c1ccccc1)c3c(O)c2ccccc2oc3=O 564 | hydrobenzoin,-2.645,1,214.264,2,2,3,40.46,-1.93,c1ccccc1C(O)C(O)c2ccccc2 565 | Dimethyl phthalate,-2.347,1,194.18599999999995,0,1,2,52.60000000000001,-1.66,COC(=O)c1ccccc1C(=O)OC 566 | Ethyl octanoate,-2.9619999999999997,1,172.26799999999997,0,0,7,26.3,-3.39,CCCCCCCC(=O)OCC 567 | Diethyldisulfide,-2.364,1,122.258,0,0,3,0.0,-2.42,CCSSCC 568 | "1,2-Diethoxyethane ",-0.833,1,118.176,0,0,5,18.46,-0.77,CCOCCOCC 569 | "1,2,4,5-Tetrachlorobenzene",-4.621,1,215.894,0,1,0,0.0,-5.56,Clc1cc(Cl)c(Cl)cc1Cl 570 | p-benzidine,-2.613,1,184.242,2,2,1,52.04,-2.7,Nc1ccc(cc1)c2ccc(N)cc2 571 | 1-Heptene,-2.718,1,98.189,0,0,4,0.0,-3.73,CCCCCC=C 572 | Ethirimol,-2.7319999999999998,1,209.29299999999998,2,1,5,57.78,-3.028,CCCCc1c(C)nc(NCC)[nH]c1=O 573 | Pentobarbital,-2.312,1,226.27599999999995,2,1,4,75.27000000000001,-2.39,O=C1NC(=O)NC(=O)C1(CC)C(C)CCC 574 | o-Chloroaniline,-2.392,1,127.574,1,1,0,26.02,-1.52,Nc1ccccc1Cl 575 | 3-Chloroanisole,-3.057,1,142.58499999999998,0,1,1,9.23,-2.78,COc1cccc(Cl)c1 576 | Pebulate,-3.1310000000000002,1,203.35099999999997,0,0,6,20.310000000000002,-3.53,CCCCN(CC)C(=O)SCCC 577 | Butyl acetate,-1.111,1,102.13299999999998,0,0,4,26.3,-1.37,CCCCOC=O 578 | Prednisolone,-2.9739999999999998,1,360.4500000000002,3,4,2,94.83,-3.18,CC12CC(O)C3C(CCC4=CC(=O)C=CC34C)C2CCC1(O)C(=O)CO 579 | Bromodichloromethane,-2.176,1,163.82899999999998,0,0,0,0.0,-1.54,BrC(Cl)Cl 580 | adrenosterone,-2.99,1,300.3980000000001,0,4,0,51.21,-3.48,CC34CC(=O)C1C(CCC2=CC(=O)CCC12C)C3CCC4(=O) 581 | p-terphenyl,-5.7410000000000005,2,230.31,0,3,2,0.0,-7.11,c1ccc(cc1)c2ccc(cc2)c3ccccc3 582 | p-Hydroxybenzaldehyde ,-2.003,1,122.12299999999998,1,1,1,37.3,-0.96,Oc1ccc(C=O)cc1 583 | Bromomethane,-1.109,1,94.939,0,0,0,0.0,-0.79,CBr 584 | Perfluidone,-4.945,1,379.38100000000003,1,2,4,80.31,-3.8,Cc1cc(ccc1NS(=O)(=O)C(F)(F)F)S(=O)(=O)c2ccccc2 585 | Coumachlor,-4.553999999999999,1,342.7780000000001,1,3,4,67.50999999999999,-5.8389999999999995,CC(=O)CC(c1ccc(Cl)cc1)c2c(O)c3ccccc3oc2=O 586 | 2-Ethylnaphthalene,-4.1,1,156.22799999999998,0,2,1,0.0,-4.29,CCc1ccc2ccccc2c1 587 | 5-methylcytosine,-0.257,1,125.13099999999999,2,1,0,71.77000000000001,-1.4580000000000002,Nc1c(C)c[nH]c(=O)n1 588 | "2,3,4,5,6-PCB",-6.785,1,326.437,0,2,1,0.0,-7.92,Clc2c(Cl)c(Cl)c(c1ccccc1)c(Cl)c2Cl 589 | benodanil,-4.245,1,323.133,1,2,2,29.1,-4.21,c1c(NC(=O)c2ccccc2(I))cccc1 590 | Riboflavin,-1.865,1,376.36900000000014,5,3,5,161.56,-3.685,Cc3cc2nc1c(=O)[nH]c(=O)nc1n(CC(O)C(O)C(O)CO)c2cc3C 591 | o-Fluorobromobenzene,-3.467,1,175.0,0,1,0,0.0,-2.7,Fc1ccccc1Br 592 | "2,4-Dichlorophenol ",-3.22,1,163.003,1,1,0,20.23,-1.55,Oc1ccc(Cl)cc1Cl 593 | Permethrin,-7.129,1,391.2940000000001,0,3,6,35.53,-6.291,CC1(C)C(C=C(Cl)Cl)C1C(=O)OCc2cccc(Oc3ccccc3)c2 594 | piroxicam,-3.4730000000000003,1,331.353,2,3,2,99.60000000000001,-4.16,CN2C(=C(O)c1ccccc1S2(=O)=O)C(=O)Nc3ccccn3 595 | 3-Propanoyloxymethylphenytoin,-3.128,1,338.36300000000006,1,3,5,75.71,-4.907,O=C1N(COC(=O)CC)C(=O)C(N1)(c2ccccc2)c3ccccc3 596 | Cyclopentane ,-2.0380000000000003,2,70.135,0,1,0,0.0,-2.64,C1CCCC1 597 | o-Toluidine,-1.922,1,107.156,1,1,0,26.02,-2.21,Cc1ccccc1N 598 | Estragole,-3.074,1,148.205,0,1,3,9.23,-2.92,c1(OC)ccc(CC=C)cc1 599 | karbutilate,-2.655,1,279.34,2,1,2,70.67,-2.93,CN(C)C(=O)Nc1cccc(OC(=O)NC(C)(C)C)c1 600 | 3-Methyl-1-Butene,-1.994,1,70.135,0,0,1,0.0,-2.73,CC(C)C=C 601 | 2-Hydroxypyridine,-1.655,1,95.101,1,1,0,33.120000000000005,1.02,Oc1ccccn1 602 | Ethane,-1.1320000000000001,1,30.07,0,0,0,0.0,-1.36,CC 603 | "1,2-Dichlorobenzene",-3.4819999999999998,1,147.00399999999996,0,1,0,0.0,-3.05,Clc1ccccc1Cl 604 | mercaptobenzothiazole,-3.411,1,167.25799999999998,1,2,0,12.89,-3.18,Sc2nc1ccccc1s2 605 | "2,2',3,3',4,4',5,5',6,6'-PCB",-9.589,1,498.66200000000026,0,2,1,0.0,-11.6,Clc1c(Cl)c(Cl)c(c(Cl)c1Cl)c2c(Cl)c(Cl)c(Cl)c(Cl)c2Cl 606 | Methoxsalen,-3.25,1,216.19199999999995,0,3,1,52.58,-3.6639999999999997,COc2c1occc1cc3ccc(=O)oc23 607 | Acetamide,0.494,1,59.068,1,0,0,43.09,1.58,CC(=O)N 608 | 1-Methylnaphthalene,-3.802,1,142.201,0,2,0,0.0,-3.7,Cc1cccc2ccccc12 609 | Napropamide,-4.088,1,271.36,0,2,5,29.540000000000003,-3.57,CCN(CC)C(=O)C(C)Oc1cccc2ccccc12 610 | "3,3-Dimethyl-2-butanol",-1.2919999999999998,1,102.17699999999999,1,0,0,20.23,-0.62,CC(O)C(C)(C)C 611 | Methyl pentanoate,-1.545,1,116.15999999999998,0,0,3,26.3,-1.36,CCCC(=O)OCC 612 | Menadione,-2.667,1,172.18299999999996,0,2,0,34.14,-3.03,CC2=CC(=O)c1ccccc1C2=O 613 | Phenanthrene,-4.518,2,178.23399999999998,0,3,0,0.0,-5.26,c1ccc2c(c1)ccc3ccccc32 614 | "2,4-Dimethylpyridine",-2.0980000000000003,1,107.15599999999999,0,1,0,12.89,0.38,Cc1ccnc(C)c1 615 | 1-Nonanol,-2.46,1,144.258,1,0,7,20.23,-3.01,CCCCCCCCCO 616 | Dibromomethane,-1.883,1,173.83499999999998,0,0,0,0.0,-1.17,BrCBr 617 | Dexamethasone,-3.4,1,392.4670000000002,3,4,2,94.83,-3.59,CC1CC2C3CCC4=CC(=O)C=CC4(C)C3(F)C(O)CC2(C)C1(O)C(=O)CO 618 | "2,6-Dimethylnaphthalene ",-4.147,1,156.228,0,2,0,0.0,-4.89,Cc1ccc2cc(C)ccc2c1 619 | Butylate,-3.4530000000000003,1,217.378,0,0,5,20.310000000000002,-3.68,CCSC(=O)N(CC(C)C)CC(C)C 620 | nitroglycerin,-2.029,1,227.08499999999998,0,0,8,157.11,-2.22,O=N(=O)OCC(CON(=O)=O)ON(=O)=O 621 | m-Nitroaniline,-1.936,1,138.126,1,1,1,69.16,-2.19,Nc1cccc(c1)N(=O)=O 622 | 1-Chlorobutane,-1.94,1,92.56899999999999,0,0,2,0.0,-2.03,CCCCCl 623 | triforine,-3.715,1,430.9340000000001,2,1,6,64.68,-4.19,ClC(Cl)(Cl)C(NC=O)N1C=CN(C=C1)C(NC=O)C(Cl)(Cl)Cl 624 | Fluridone,-4.249,1,329.32099999999997,0,3,2,22.0,-4.445,Cn2cc(c1ccccc1)c(=O)c(c2)c3cccc(c3)C(F)(F)F 625 | 6-aminochrysene,-4.849,1,243.309,1,4,0,26.02,-6.2,Nc3cc2c1ccccc1ccc2c4ccccc34 626 | Estrone,-3.872,1,270.372,1,4,0,37.3,-3.955,CC12CCC3C(CCc4cc(O)ccc34)C2CCC1=O 627 | RTI 17,-4.227,1,269.373,0,3,1,19.37,-4.706,CCN2c1ccccc1N(C)C(=S)c3cccnc23 628 | "1,2-Propylene oxide",-0.358,1,58.08,0,1,0,12.53,-0.59,CC1CO1 629 | Nitrazepam,-3.4730000000000003,1,281.271,1,3,2,84.6,-3.7960000000000003,O=C3CN=C(c1ccccc1)c2cc(ccc2N3)N(=O)=O 630 | "1,3-diethylthiourea",-1.028,1,132.232,2,0,2,24.06,-1.46,CCNC(=S)NCC 631 | "2,3,5-Trichlorophenol",-3.78,1,197.44799999999998,1,1,0,20.23,-2.67,Oc1cc(Cl)cc(Cl)c1Cl 632 | Propyl propanoate,-1.545,1,116.15999999999998,0,0,3,26.3,-1.34,CCCCC(=O)OC 633 | Aniline ,-1.632,1,93.12899999999999,1,1,0,26.02,-0.41,Nc1ccccc1 634 | "1,5-Dimethlnapthalene",-4.147,1,156.228,0,2,0,0.0,-4.678999999999999,Cc1cccc2c(C)cccc12 635 | hydrochlorothiazide,-1.72,1,297.745,3,2,1,118.35999999999999,-2.63,NS(=O)(=O)c2cc1c(NCNS1(=O)=O)cc2Cl 636 | Acenapthylene,-3.682,2,152.19599999999994,0,3,0,0.0,-3.96,C1=Cc2cccc3cccc1c23 637 | Ethyl butyrate,-2.254,1,144.21399999999997,0,0,5,26.3,-1.28,CCCCCOC(=O)CC 638 | Atratone,-3.185,1,211.26899999999998,2,1,5,71.96000000000001,-2.084,CCNc1nc(NC(C)C)nc(OC)n1 639 | Benzo(a)pyrene,-6.007000000000001,2,252.31599999999997,0,5,0,0.0,-8.699,c1ccc2c(c1)cc3ccc4cccc5ccc2c3c45 640 | Bromoethane,-1.5290000000000001,1,108.966,0,0,0,0.0,-1.09,CCBr 641 | 3-Hexyne,-1.933,1,82.14599999999999,0,0,0,0.0,-1.99,CCC#CCC 642 | Digitoxin,-6.114,1,764.9499999999999,5,8,7,182.82999999999998,-5.292999999999999,CC1OC(CC(O)C1O)OC2C(O)CC(OC2C)OC8C(O)CC(OC7CCC3(C)C(CCC4C3CCC5(C)C(CCC45O)C6=CC(=O)OC6)C7)OC8C 643 | 2-Methyl-1-Butene,-1.994,1,70.13499999999999,0,0,1,0.0,-2.73,CCC(=C)C 644 | 8-quinolinol,-2.725,1,145.16099999999997,1,2,0,33.120000000000005,-2.42,Oc1cccc2cccnc12 645 | "1,2,3,4-Tetrahydronapthalene",-3.447,2,132.20599999999996,0,2,0,0.0,-4.37,C1CCc2ccccc2C1 646 | phenolphthalein,-4.59,1,318.32800000000003,2,4,2,66.76,-2.9,Oc1ccc(cc1)C2(OC(=O)c3ccccc23)c4ccc(O)cc4 647 | "1,3,5-Tribromobenzene",-5.27,1,314.802,0,1,0,0.0,-5.6,Brc1cc(Br)cc(Br)c1 648 | Ronnel,-5.247000000000001,1,321.549,0,1,4,27.69,-5.72,COP(=S)(OC)Oc1cc(Cl)c(Cl)cc1Cl 649 | methylthiouracil,-0.547,1,142.18300000000002,2,1,0,48.65,-2.436,Cc1cc(=O)[nH]c(=S)[nH]1 650 | Eugenol,-2.675,1,164.204,1,1,3,29.46,-1.56,COc1cc(CC=C)ccc1O 651 | 5-Allyl-5-isopropylbarbital,-1.706,1,210.23299999999998,2,1,3,75.27000000000001,-1.7080000000000002,O=C1NC(=O)NC(=O)C1(C(C)C)CC=C 652 | Pyrene,-4.957,2,202.25599999999997,0,4,0,0.0,-6.176,c1cc2ccc3cccc4ccc(c1)c2c34 653 | "1,1-Diethoxyethane ",-0.899,1,118.176,0,0,4,18.46,-0.43,CCOC(C)OCC 654 | Clomazone,-3.077,1,239.702,0,2,2,29.54,-2.338,CC1(C)CON(Cc2ccccc2Cl)C1=O 655 | 2-Butoxyethanol,-0.775,1,118.17599999999999,1,0,5,29.46,-0.42,CCCCOCCO 656 | Quintozene,-5.098,1,295.336,0,1,1,43.14,-5.82,Clc1c(Cl)c(Cl)c(N(=O)=O)c(Cl)c1Cl 657 | Androsterone,-3.8819999999999997,1,290.447,1,4,0,37.3,-4.402,CC12CCC(O)CC1CCC3C2CCC4(C)C3CCC4=O 658 | Flurochloridone,-4.749,1,312.118,0,2,2,20.310000000000002,-4.047,FC(F)(F)c1cccc(c1)N2CC(CCl)C(Cl)C2=O 659 | Quinoline,-2.6630000000000003,2,129.16199999999998,0,2,0,12.89,-1.3,c1ccc2ncccc2c1 660 | methyl gallate,-1.913,1,184.147,3,1,1,86.99000000000001,-1.24,COC(=O)c1cc(O)c(O)c(O)c1 661 | fluconazole,-2.418,1,306.276,1,3,5,81.64999999999999,-1.8,OC(Cn1cncn1)(Cn2cncn2)c3ccc(F)cc3F 662 | Chlorzoxazone,-2.679,1,169.567,1,2,0,46.0,-2.8310000000000004,Clc2ccc1oc(=O)[nH]c1c2 663 | "2,2',3,4,4',5',6-PCB",-7.898,1,395.3270000000001,0,2,1,0.0,-7.92,Clc1ccc(c(Cl)c1)c2c(Cl)c(Cl)c(Cl)c(Cl)c2Cl 664 | alloxan,0.436,1,142.07,2,1,0,92.34,-1.25,O=C1NC(=O)C(=O)C(=O)N1 665 | "1,3-Dichloropropane",-1.618,1,112.98700000000001,0,0,2,0.0,-1.62,ClCCCCl 666 | m-Fluorobromobenzene,-3.467,1,175.0,0,1,0,0.0,-2.67,Fc1cccc(Br)c1 667 | p-Chlorobromobenzene,-3.928,1,191.45499999999998,0,1,0,0.0,-3.63,Clc1ccc(Br)cc1 668 | "2,3-Dimethylbutane",-2.5839999999999996,1,86.178,0,0,1,0.0,-3.65,CC(C)C(C)C 669 | 1-Butene,-1.655,1,56.108,0,0,1,0.0,-1.94,CCC=C 670 | "2,2',3,4,5,5'-PCB",-7.343,1,360.88200000000006,0,2,1,0.0,-7.68,Clc1ccc(Cl)c(c1)c2cc(Cl)c(Cl)c(Cl)c2Cl 671 | cytosine,0.051,1,111.104,2,1,0,71.77000000000001,-1.155,Nc1cc[nH]c(=O)n1 672 | "1,1,2-Trichlorotrifluoroethane",-3.077,1,187.37500000000003,0,0,1,0.0,-3.04,FC(F)(Cl)C(F)(Cl)Cl 673 | Propionitrile,-0.26899999999999996,1,55.07999999999999,0,0,0,23.79,0.28,CCC#N 674 | "O,P'-DDD",-6.007999999999999,1,320.04600000000005,0,2,3,0.0,-6.51,ClC(Cl)C(c1ccc(Cl)cc1)c2ccccc2Cl 675 | o-Nitroanisole,-2.346,1,153.13699999999997,0,1,2,52.37,-1.96,COc1ccccc1N(=O)=O 676 | Prasterone,-3.5639999999999996,1,288.43100000000004,1,4,0,37.3,-4.12,CC34CCC1C(CC=C2CC(O)CCC12C)C3CCC4=O 677 | Procymidone,-3.464,1,284.142,0,3,1,37.38,-4.8,CC12CC2(C)C(=O)N(C1=O)c3cc(Cl)cc(Cl)c3 678 | Benzo[ghi]perylene,-6.446000000000001,2,276.338,0,6,0,0.0,-9.017999999999999,c1cc2ccc3ccc4ccc5cccc6c(c1)c2c3c4c56 679 | Dinoseb,-3.715,1,240.21499999999995,1,1,4,106.51000000000002,-3.38,CCC(C)c1cc(cc(N(=O)=O)c1O)N(=O)=O 680 | meconin,-0.825,1,196.20199999999997,0,2,2,44.760000000000005,-1.899,c1c(OC)c(OC)C2C(=O)OCC2c1 681 | Glycerol,0.688,1,92.09400000000001,3,0,2,60.69,1.12,OCC(O)CO 682 | Guaiacol,-1.9409999999999998,1,124.13899999999997,1,1,1,29.46,-1.96,COc1ccccc1O 683 | chlorpyrifos,-4.9719999999999995,1,350.591,0,1,6,40.58,-5.67,CCOP(=S)(OCC)Oc1nc(Cl)c(Cl)cc1Cl 684 | 9-Methylanthracene,-4.87,1,192.261,0,3,0,0.0,-5.89,Cc1c2ccccc2cc3ccccc13 685 | Antipyrene,-1.733,1,188.23000000000002,0,2,1,26.93,0.715,Cc1cc(=O)n(c2ccccc2)n1C 686 | Methyl butyl ether ,-1.072,1,88.14999999999999,0,0,3,9.23,-0.99,CCCCOC 687 | 7-methylpteridine,-1.24,1,146.153,0,2,0,51.56,-0.8540000000000001,Cc2cnc1cncnc1n2 688 | simazine,-2.8110000000000004,1,201.661,2,1,4,62.730000000000004,-4.55,CCNc1nc(Cl)nc(NCC)n1 689 | "N,N-Dimethylacetamide",0.12300000000000001,1,87.12199999999999,0,0,0,20.310000000000002,1.11,CN(C)C(=O)C 690 | Simetryn,-2.6889999999999996,1,213.31,0,1,3,45.150000000000006,-2.676,CSc1nc(nc(n1)N(C)C)N(C)C 691 | Ethylene,-0.815,1,28.053999999999995,0,0,0,0.0,-0.4,C=C 692 | "3,3-Dimethyl-1-butanol",-1.365,1,102.17699999999999,1,0,1,20.23,-0.5,CC(C)(C)CCO 693 | 5-Allyl-5-ethylbarbital,-1.368,1,196.20599999999996,2,1,3,75.27000000000001,-1.614,O=C1NC(=O)NC(=O)C1(CC)CC=C 694 | "2,3,4-Trichlorophenol",-3.705,1,197.448,1,1,0,20.23,-2.67,Oc1ccc(Cl)c(Cl)c1Cl 695 | Anisole,-2.3680000000000003,1,108.13999999999997,0,1,1,9.23,-1.85,COc1ccccc1 696 | chloropropylate,-5.093,1,339.21800000000013,1,2,4,46.53,-4.53,c1ccc(Cl)cc1C(c2ccc(Cl)cc2)(O)C(=O)OC(C)C 697 | aldosterone,-3.0660000000000003,1,360.45000000000005,2,4,3,91.67000000000002,-3.85,CC13CCC(=O)C=C1CCC4C2CCC(C(=O)CO)C2(CC(O)C34)C=O 698 | Difenoxuron,-3.928,1,286.331,1,2,4,50.800000000000004,-4.16,COc2ccc(Oc1ccc(NC(=O)N(C)C)cc1)cc2 699 | 4-Ethyltoluene,-3.3280000000000003,1,120.19499999999996,0,1,1,0.0,-3.11,CCc1ccc(C)cc1 700 | Diisopropylsulfide,-2.162,1,118.24499999999999,0,0,2,0.0,-2.24,CC(C)SC(C)C 701 | "1,3-Dinitrobenzene",-2.281,1,168.10799999999995,0,1,2,86.28,-2.29,O=N(=O)c1cccc(c1)N(=O)=O 702 | Ethion,-5.471,1,384.4870000000002,0,0,12,36.92,-5.54,CCOP(=S)(OCC)SCSP(=S)(OCC)OCC 703 | probarbital,-1.6030000000000002,1,198.22199999999998,2,1,2,75.27000000000001,-2.21,CCC1(C(C)C)C(=O)NC(=O)NC1=O 704 | cortisone acetate,-3.426,1,402.48700000000025,1,4,3,97.74000000000001,-4.21,CC(=O)OCC(=O)C3(O)CCC4C2CCC1=CC(=O)CCC1(C)C2C(=O)CC34C 705 | Metronidazole,-0.8590000000000001,1,171.15599999999998,1,1,3,81.19,-1.22,Cc1ncc(N(=O)=O)n1CCO 706 | p-Chloroaniline,-2.392,1,127.574,1,1,0,26.02,-1.66,Nc1ccc(Cl)cc1 707 | "2,2-Dimethylpentanol",-1.719,1,116.20399999999998,1,0,3,20.23,-1.52,CCCC(C)(C)CO 708 | Furane,-1.837,2,68.07499999999999,0,1,0,13.14,-0.82,c1ccoc1 709 | Methoproptryne,-3.259,1,271.39,2,1,8,71.96000000000001,-2.928,COCCCNc1nc(NC(C)C)nc(SC)n1 710 | Norea,-2.47,1,222.33199999999994,1,3,1,32.34,-3.1710000000000003,CN(C)C(=O)NC1CC2CC1C3CCCC23 711 | t-Butylbenzene ,-3.554,1,134.22199999999998,0,1,0,0.0,-3.66,CC(C)(C)c1ccccc1 712 | kebuzone,-2.645,1,322.36400000000003,0,3,5,57.690000000000005,-3.27,CC(=O)CCC1C(=O)N(N(C1=O)c2ccccc2)c3ccccc3 713 | prednisolone acetate,-3.5069999999999997,1,402.48700000000014,2,4,3,100.90000000000002,-4.37,CC(=O)OCC(=O)C3(O)CCC4C2CCC1=CC(=O)C=CC1(C)C2C(O)CC34C 714 | Methyl propyl ether ,-0.718,1,74.12299999999999,0,0,2,9.23,-0.39,CCCOC 715 | Isopropyl acetate,-1.1909999999999998,1,102.133,0,0,1,26.3,-0.55,CC(C)OC(=O)C 716 | Bromobenzene,-3.345,1,157.01,0,1,0,0.0,-2.55,Brc1ccccc1 717 | Ethyl-p-hydroxybenzoate ,-2.761,1,166.176,1,1,2,46.53,-2.35,CCOC(=O)c1ccc(O)cc1 718 | 3-Butanoyloxymethylphenytoin,-3.469,1,352.39000000000004,1,3,6,75.71,-5.071000000000001,O=C1N(COC(=O)CCC)C(=O)C(N1)(c2ccccc2)c3ccccc3 719 | testosterone propionate,-4.87,1,344.4950000000001,0,4,2,43.370000000000005,-5.37,CCC(=O)OC3CCC4C2CCC1=CC(=O)CCC1(C)C2CCC34C 720 | Coronene,-6.885,2,300.36000000000007,0,7,0,0.0,-9.332,c1cc2ccc3ccc4ccc5ccc6ccc1c7c2c3c4c5c67 721 | allopurinol,-0.84,1,136.114,2,2,0,74.43,-2.266,O=c1[nH]cnc2[nH]ncc12 722 | Chloroethylene,-1.188,1,62.499,0,0,0,0.0,-1.75,ClC=C 723 | diphenamid,-3.147,1,239.318,0,2,3,20.310000000000002,-2.98,CN(C)C(=O)C(c1ccccc1)c2ccccc2 724 | Tetrabromomethane,-4.063,1,331.62699999999995,0,0,0,0.0,-3.14,BrC(Br)(Br)Br 725 | RTI 22,-4.408,1,296.374,1,3,2,48.47,-4.871,CCN2c1cc(N(C)C)cc(C)c1NC(=O)c3cccnc23 726 | phthalimide,-1.882,1,147.13299999999998,1,2,0,46.17,-2.61,O=C1NC(=O)c2ccccc12 727 | Fenarimol,-4.1080000000000005,1,331.202,1,3,3,46.010000000000005,-4.38,OC(c1ccc(Cl)cc1)(c2cncnc2)c3ccccc3Cl 728 | Methyl benzoate ,-2.4619999999999997,1,136.14999999999998,0,1,1,26.3,-1.85,COC(=O)c1ccccc1 729 | 1-methyluracil,-0.375,1,126.115,1,1,0,54.86,-0.807,Cn1ccc(=O)[nH]c1=O 730 | oxyphenbutazone,-3.739,1,324.38000000000005,1,3,5,60.85000000000001,-3.73,CCCCC1C(=O)N(N(C1=O)c2ccc(O)cc2)c3ccccc3 731 | "2,2',3,5'-PCB",-6.155,1,291.9920000000001,0,2,1,0.0,-6.47,Clc1ccc(Cl)c(c1)c2cccc(Cl)c2Cl 732 | Quinethazone,-2.184,1,289.7440000000001,3,2,2,101.28999999999999,-3.29,CCC2NC(=O)c1cc(c(Cl)cc1N2)S(N)(=O)=O 733 | Diuron,-3.301,1,233.09799999999998,1,1,1,32.34,-3.8,CN(C)C(=O)Nc1ccc(Cl)c(Cl)c1 734 | Cyclopentene ,-1.72,2,68.11900000000001,0,1,0,0.0,-2.1,C1CC=CC1 735 | alloxantin,0.919,1,286.156,6,2,1,191.0,-1.99,C1(=O)NC(=O)NC(=O)C1(O)C2(O)C(=O)NC(=O)NC2(=O) 736 | Nonane,-3.678,1,128.259,0,0,6,0.0,-5.88,CCCCCCCCC 737 | 2-Chlorophenol,-2.553,1,128.558,1,1,0,20.23,-1.06,Oc1ccccc1Cl 738 | 5-Methylchrysene,-5.931,1,242.321,0,4,0,0.0,-6.59,c1cccc2c3c(C)cc4ccccc4c3ccc12 739 | Phenetole,-2.66,1,122.16699999999996,0,1,2,9.23,-2.33,CCOc1ccccc1 740 | ethyl cinnamate,-3.0980000000000003,1,176.215,0,1,3,26.3,-3.0,CCOC(=O)C=Cc1ccccc1 741 | Terbacil,-3.033,1,216.66799999999998,1,1,0,54.86,-2.484,Cc1[nH]c(=O)n(c(=O)c1Cl)C(C)(C)C 742 | Clonazepam,-3.707,1,315.716,1,3,2,84.6,-3.4989999999999997,Clc1ccccc1C2=NCC(=O)Nc3ccc(cc23)N(=O)=O 743 | p-Toluenesulfonamide ,-1.815,1,171.22099999999998,1,1,1,60.16,-1.74,Cc1ccc(cc1)S(=O)(=O)N 744 | Chlorbufam,-3.6289999999999996,1,223.659,1,1,2,38.33,-2.617,CC(OC(=O)Nc1cccc(Cl)c1)C#C 745 | 2-Methylheptane,-3.3080000000000003,1,114.23199999999999,0,0,4,0.0,-5.08,CCCCCC(C)C 746 | Cyhalothrin,-6.905,1,449.8560000000001,0,3,6,59.32000000000001,-8.176,CC1(C)C(C=C(Cl)C(F)(F)F)C1C(=O)OC(C#N)c2cccc(Oc3ccccc3)c2 747 | Apazone,-2.9,1,300.3620000000001,0,3,2,56.220000000000006,-3.5380000000000003,CCCC1C(=O)N3N(C1=O)c2cc(C)ccc2N=C3N(C)C 748 | Diazepam,-4.05,1,284.74600000000004,0,3,1,32.67,-3.7539999999999996,CN2C(=O)CN=C(c1ccccc1)c3cc(Cl)ccc23 749 | 2-Methyl-3-pentanol,-1.308,1,102.17699999999999,1,0,2,20.23,-0.7,CCC(O)C(C)C 750 | fensulfothion,-3.283,1,308.36100000000005,0,1,7,44.760000000000005,-2.3,CCOP(=S)(OCC)Oc1ccc(cc1)S(C)=O 751 | borneol,-2.423,1,154.253,1,2,0,20.23,-2.32,CC1(C)C2CCC1(C)C(O)C2 752 | Testosterone,-3.659,1,288.431,1,4,0,37.3,-4.02,CC12CCC3C(CCC4=CC(=O)CCC34C)C2CCC1O 753 | Heptane,-2.97,1,100.205,0,0,4,0.0,-4.53,CCCCCCC 754 | 1-Napthol,-3.08,1,144.17299999999997,1,2,0,20.23,-2.22,Oc1cccc2ccccc12 755 | "cis-1,2-Dimethylcyclohexane",-3.305,1,112.216,0,1,0,0.0,-4.3,C/C1CCCCC1\C 756 | Trimazosin,-3.958,1,435.48100000000034,2,3,6,132.5,-3.638,COc2cc1c(N)nc(nc1c(OC)c2OC)N3CCN(CC3)C(=O)OCC(C)(C)O 757 | Cholanthrene,-5.942,2,254.33199999999997,0,5,0,0.0,-7.85,C1Cc2c3c1cccc3cc4c2ccc5ccccc54 758 | Medrogestone,-4.593,1,340.5070000000001,0,4,1,34.14,-5.27,CC(=O)C3(C)CCC4C2C=C(C)C1=CC(=O)CCC1(C)C2CCC34C 759 | 2-Heptanone,-1.554,1,114.18799999999999,0,0,4,17.07,-1.45,CCCCCC(=O)C 760 | Acephate,-0.41600000000000004,1,183.16899999999998,1,0,3,55.4,0.54,COP(=O)(NC(C)=O)SC 761 | DEF,-4.074,1,314.5220000000001,0,0,12,17.07,-5.14,CCCCSP(=O)(SCCCC)SCCCC 762 | phthalamide,-0.636,1,149.149,1,2,0,46.17,-2.932,c1cC2C(=O)NC(=O)C2cc1 763 | Trichlomethiazide,-2.98,1,380.66200000000003,3,2,2,118.35999999999999,-2.68,NS(=O)(=O)c2cc1c(NC(NS1(=O)=O)C(Cl)Cl)cc2Cl 764 | 2-Methy-2-Butene,-1.994,1,70.13499999999999,0,0,0,0.0,-2.56,CC=C(C)C 765 | "1,2,4-Trimethylbenzene",-3.343,1,120.195,0,1,0,0.0,-3.31,Cc1ccc(C)c(C)c1 766 | "2,4,5-Trichlorophenol ",-3.78,1,197.448,1,1,0,20.23,-2.21,Oc1cc(Cl)c(Cl)cc1Cl 767 | phenanthridine,-3.713,2,179.22199999999998,0,3,0,12.89,-2.78,c1ccc2c(c1)cnc3ccccc23 768 | 3-Methyl-3-hexanol,-1.663,1,116.20399999999998,1,0,3,20.23,-0.98,CCCC(C)(O)CC 769 | Octane,-3.324,1,114.232,0,0,5,0.0,-5.24,CCCCCCCC 770 | Anthracene,-4.518,2,178.23399999999995,0,3,0,0.0,-6.35,c1ccc2cc3ccccc3cc2c1 771 | Phenylhydrazine,-1.8659999999999999,1,108.14399999999998,2,1,1,38.05,0.07,NNc1ccccc1 772 | Propionaldehyde,-0.39399999999999996,1,58.08,0,0,1,17.07,0.58,CCC=O 773 | Cyclooctane,-3.355,2,112.21600000000001,0,1,0,0.0,-4.15,C1CCCCCCC1 774 | "5,5-Diallylbarbital",-1.4709999999999999,1,208.21699999999996,2,1,4,75.27000000000001,-2.077,O=C1NC(=O)NC(=O)C1(CC=C)CC=C 775 | Trichloromethane,-1.8119999999999998,1,119.37800000000001,0,0,0,0.0,-1.17,ClC(Cl)Cl 776 | thiouracil,-0.992,1,128.15599999999998,2,1,0,45.75,-2.273,Sc1nccc(=O)[nH]1 777 | Pencycuron,-5.126,1,328.84299999999996,1,3,4,32.34,-5.915,Clc1ccc(CN(C2CCCC2)C(=O)Nc3ccccc3)cc1 778 | 1-Methylcyclohexene ,-2.574,1,96.17300000000002,0,1,0,0.0,-3.27,CC1=CCCCC1 779 | 2-Ethylhexanal,-2.2319999999999998,1,128.21499999999997,0,0,5,17.07,-2.13,CCCCC(CC)C=O 780 | Khellin,-3.603,1,260.24499999999995,0,3,2,61.81,-3.0210000000000004,COc2c1occc1c(OC)c3c(=O)cc(C)oc23 781 | 5-Ethyl-5-(3-methylbutyl)barbital,-2.312,1,226.27599999999995,2,1,4,75.27000000000001,-2.658,O=C1NC(=O)NC(=O)C1(CC)CCC(C)C 782 | Benzo(j)fluoranthene,-6.007000000000001,2,252.31599999999997,0,5,0,0.0,-8.0,c1ccc2c3c(ccc2c1)c4cccc5cccc3c45 783 | 2-Ethylbutanal,-1.5230000000000001,1,100.16099999999999,0,0,3,17.07,-1.52,CCC(CC)C=O 784 | Dipropyl ether,-1.426,1,102.17699999999999,0,0,4,9.23,-1.62,CCCOCCC 785 | 1-Tetradecanol,-4.231,1,214.39299999999994,1,0,12,20.23,-5.84,CCCCCCCCCCCCCCO 786 | "2,3,6-Trichlorophenol",-3.572,1,197.44799999999998,1,1,0,20.23,-2.64,Oc1c(Cl)ccc(Cl)c1Cl 787 | Urea,0.8320000000000001,1,60.056,2,0,0,69.11,0.96,NC(=O)N 788 | 1-Pentyne,-1.446,1,68.11899999999999,0,0,1,0.0,-1.64,CCCC#C 789 | "1,3-Dibromobenzene",-4.298,1,235.90599999999998,0,1,0,0.0,-3.54,Brc1cccc(Br)c1 790 | 1-Octadecanol,-5.649,1,270.50099999999986,1,0,16,20.23,-8.4,CCCCCCCCCCCCCCCCCCO 791 | Acetanilide,-1.857,1,135.16599999999997,1,1,1,29.1,-1.33,CC(=O)Nc1ccccc1 792 | hematein,-1.795,1,300.266,4,4,0,107.22000000000001,-2.7,c1cc(O)c(O)c2OCC3(O)CC4=CC(=O)C(O)=CC4=C3c21 793 | Isonazid,-0.7170000000000001,1,137.14200000000002,2,1,1,68.01,0.009000000000000001,c1nccc(C(=O)NN)c1 794 | hydroxychlordene,-4.156000000000001,1,354.8749999999999,1,3,0,20.23,-5.46,OC1C=CC2C1C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl 795 | Isopentyl formate,-1.449,1,116.15999999999998,0,0,4,26.3,-1.52,CC(C)CCOC=O 796 | Acetophenone,-2.0780000000000003,1,120.15099999999995,0,1,1,17.07,-1.28,CC(=O)c1ccccc1 797 | biquinoline,-4.9030000000000005,2,256.308,0,4,1,25.78,-5.4,c2ccc1nc(ccc1c2)c4ccc3ccccc3n4 798 | Triethyl phosphate,-0.953,1,182.15599999999998,0,0,6,44.760000000000005,0.43,CCOP(=O)(OCC)OCC 799 | D-fenchone,-2.158,1,152.237,0,2,0,17.07,-1.85,CC2(C)C1CCC(C)(C1)C2=O 800 | 7-methoxypteridine,-1.589,1,162.152,0,2,1,60.790000000000006,-0.91,COc2cnc1cncnc1n2 801 | Chlordene,-5.152,1,338.876,0,3,0,0.0,-5.64,ClC2=C(Cl)C3(Cl)C1C=CCC1C2(Cl)C3(Cl)Cl 802 | 2-Nitropropane,-0.743,1,89.094,0,0,1,43.14,-0.62,CC(C)N(=O)=O 803 | Carbazole,-3.8360000000000003,2,167.21099999999998,1,3,0,15.79,-5.27,c1ccc2c(c1)[nH]c3ccccc32 804 | Erythritol,0.675,1,122.11999999999999,4,0,3,80.92,0.7,OCC(O)C(O)CO 805 | Risocaine,-2.7089999999999996,1,179.21899999999997,1,1,3,52.32,-2.452,CCCOC(=O)c1ccc(N)cc1 806 | Azodrin,-0.9490000000000001,1,223.16499999999996,1,0,5,73.86,0.6509999999999999,CNC(=O)C=C(C)OP(=O)(OC)OC 807 | Succinimide,0.282,1,99.089,1,1,0,46.17,0.3,O=C1CCC(=O)N1 808 | "2,3-Dimethylpentane",-2.938,1,100.20499999999998,0,0,2,0.0,-4.28,CCC(C)C(C)C 809 | bupirimate,-3.4930000000000003,1,316.4270000000001,1,1,8,84.42,-4.16,CCCCc1c(C)nc(NCC)nc1OS(=O)(=O)N(C)C 810 | RTI 16,-3.411,1,270.361,0,3,1,32.260000000000005,-4.6339999999999995,CCN2c1ncccc1N(C)C(=S)c3cccnc23 811 | RTI 9,-3.784,1,239.274,0,3,1,29.54,-3.68,O2c1ccccc1N(CC)C(=O)c3ccccc23 812 | Tetrahydropyran ,-0.978,2,86.134,0,1,0,9.23,-0.03,C1CCOCC1 813 | 1-Heptyne,-2.155,1,96.17299999999999,0,0,3,0.0,-3.01,CCCCCC#C 814 | osthole,-4.0760000000000005,1,244.28999999999994,0,2,3,39.44,-4.314,c1cc2ccc(OC)c(CC=C(C)(C))c2oc1=O 815 | 3-Methylcholanthrene,-6.311,1,268.3589999999999,0,5,0,0.0,-7.92,c1cc(C)cc2c1c3cc4cccc5CCc(c45)c3cc2 816 | Ethyl benzoate ,-2.775,1,150.177,0,1,2,26.3,-2.32,CCOC(=O)c1ccccc1 817 | 1-Chloro-2-methylpropane,-1.9240000000000002,1,92.569,0,0,1,0.0,-2.0,ClCC(C)C 818 | Ethinyl estradiol,-4.317,1,296.41,2,4,0,40.46,-4.3,CC34CCC1C(CCc2cc(O)ccc12)C3CCC4(O)C#C 819 | methyl laurate,-4.025,1,214.34899999999996,0,0,10,26.3,-4.69,CCCCCCCCCCCC(=O)OC 820 | Di-n-propylsulfide,-2.307,1,118.24499999999999,0,0,4,0.0,-2.58,CCCSCCC 821 | Napthacene,-5.568,2,228.29399999999998,0,4,0,0.0,-8.6,c1ccc2cc3cc4ccccc4cc3cc2c1 822 | 1-Bromopentane,-2.658,1,151.047,0,0,3,0.0,-3.08,CCCCCBr 823 | trans-2-Heptene ,-2.784,1,98.18899999999998,0,0,3,0.0,-3.82,CCCC/C=C/C 824 | Metranidazole,-0.8590000000000001,1,171.15599999999998,1,1,3,81.19,-1.26,Cc1ncc(N(=O)=O)n1CCO 825 | Pentylcyclopentane,-3.8689999999999998,1,140.26999999999998,0,1,4,0.0,-6.08,CCCCCC1CCCC1 826 | "2,2',3,5,5',6-PCB",-7.261,1,360.88200000000006,0,2,1,0.0,-7.42,Clc1ccc(Cl)c(c1)c2c(Cl)c(Cl)cc(Cl)c2Cl 827 | 5-Ethyl-5-isopropylbarbituric acid,-1.6030000000000002,1,198.22199999999998,2,1,2,75.27000000000001,-2.148,O=C1NC(=O)NC(=O)C1(CC)C(C)C 828 | "1,1,1-Trichloroethane",-2.2319999999999998,1,133.405,0,0,0,0.0,-2.0,CC(Cl)(Cl)Cl 829 | Monolinuron,-2.948,1,214.652,1,1,2,41.57,-2.57,CON(C)C(=O)Nc1ccc(Cl)cc1 830 | Cyclohexyl-5-spirobarbituric acid,-1.405,1,196.206,2,2,0,75.27,-3.06,O=C2NC(=O)C1(CCCCC1)C(=O)N2 831 | dimetan,-2.3040000000000003,1,211.26099999999994,0,1,1,46.61,-0.85,CN(C)C(=O)OC1=CC(=O)CC(C)(C)C1 832 | 4-Bromotoluene,-3.667,1,171.03700000000003,0,1,0,0.0,-3.19,Cc1ccc(Br)cc1 833 | Diethyl ether ,-0.718,1,74.123,0,0,2,9.23,-0.09,CCOCC 834 | Rovral,-4.004,1,330.17100000000005,1,2,2,69.72,-4.376,CC(C)NC(=O)N1CC(=O)N(C1=O)c2cc(Cl)cc(Cl)c2 835 | Benfluralin,-5.205,1,335.28200000000004,0,1,7,89.51999999999998,-5.53,CCCCN(CC)c1c(cc(cc1N(=O)=O)C(F)(F)F)N(=O)=O 836 | "2,4,6-Trimethylphenol",-2.9410000000000003,1,136.194,1,1,0,20.23,-2.05,Cc1cc(C)c(O)c(C)c1 837 | Benzene ,-2.418,2,78.11399999999999,0,1,0,0.0,-1.64,c1ccccc1 838 | p-Chloroiodobenzene,-4.3839999999999995,1,238.45499999999998,0,1,0,0.0,-4.03,Clc1ccc(I)cc1 839 | Metoxuron,-2.6830000000000003,1,228.67899999999997,1,1,2,41.57,-2.5639999999999996,COc1ccc(NC(=O)N(C)C)cc1Cl 840 | propachlor,-3.0180000000000002,1,211.69200000000004,0,1,3,20.310000000000002,-2.48,CC(C)N(C(=O)CCl)c1ccccc1 841 | Styrene,-2.85,1,104.15199999999997,0,1,1,0.0,-2.82,C=Cc1ccccc1 842 | Dimethoxymethane,0.092,1,76.095,0,0,2,18.46,0.48,COCOC 843 | o-Xylene ,-3.0039999999999996,1,106.16799999999999,0,1,0,0.0,-2.8,Cc1ccccc1C 844 | Butan-2-ol,-0.616,1,74.12299999999999,1,0,1,20.23,0.47,CCC(C)O 845 | "1,4-Benzenediol",-1.59,1,110.11199999999998,2,1,0,40.46,-0.17,Oc1ccc(O)cc1 846 | estriol,-3.858,1,288.387,3,4,0,60.69,-4.955,CC34CCC1C(CCc2cc(O)ccc12)C3CC(O)C4O 847 | Benzo(b)fluorene,-5.189,2,216.283,0,4,0,0.0,-8.04,C1c2ccccc2c3cc4ccccc4cc13 848 | hydantoin,0.603,1,100.077,2,1,0,58.2,-0.4,O=C1CNC(=O)N1 849 | 4-hexylresorcinol,-3.4930000000000003,1,194.27399999999992,2,1,5,40.46,-2.59,c1(O)cc(O)ccc1CCCCCC 850 | allicin,-2.045,1,162.27899999999997,0,0,5,17.07,-0.83,C=CCS(=O)SCC=C 851 | Coumaphos,-5.04,1,362.77100000000013,0,2,6,57.9,-5.382000000000001,CCOP(=S)(OCC)Oc2ccc1oc(=O)c(Cl)c(C)c1c2 852 | "5,6-Dimethylchrysene",-6.265,1,256.348,0,4,0,0.0,-7.01,Cc1c(C)c2c3ccccc3ccc2c4ccccc14 853 | Betamethasone-17-valerate,-5.062,1,476.5850000000002,2,4,6,100.90000000000002,-4.71,CCCCC(=O)OC3(C(C)CC4C2CCC1=CC(=O)C=CC1(C)C2(F)C(O)CC34C)C(=O)CO 854 | uric acid,-0.541,1,168.112,4,2,0,114.36999999999998,-3.93,O=c2[nH]c(=O)c1[nH]c(=O)[nH]c1[nH]2 855 | "2,3,4,6-Tetrachlorophenol",-4.203,1,231.89299999999997,1,1,0,20.23,-3.1,Oc1c(Cl)cc(Cl)c(Cl)c1Cl 856 | "1,3-Dichlorobenzene",-3.5580000000000003,1,147.004,0,1,0,0.0,-3.04,Clc1cccc(Cl)c1 857 | DDT,-6.638,1,354.491,0,2,2,0.0,-7.15,Clc1ccc(cc1)C(c2ccc(Cl)cc2)C(Cl)(Cl)Cl 858 | Isobutyl formate,-1.095,1,102.13299999999998,0,0,3,26.3,-1.01,CC(C)COC=O 859 | thioanisole,-2.87,1,124.208,0,1,1,0.0,-2.39,c1ccccc1SC 860 | RTI 13,-4.45,1,322.29,1,3,1,58.120000000000005,-4.207,CCN2c1nc(C)cc(C(F)(F)F)c1NC(=O)c3cccnc23 861 | Hexane ,-2.615,1,86.178,0,0,3,0.0,-3.84,CCCCCC 862 | methyl nicotinate,-1.621,1,137.138,0,1,1,39.19,-0.46,COC(=O)c1cccnc1 863 | Bendroflumethiazide,-3.741,1,421.4220000000001,3,3,3,118.35999999999999,-3.59,NS(=O)(=O)c3cc2c(NC(Cc1ccccc1)NS2(=O)=O)cc3C(F)(F)F 864 | "2,3,3',4,4',5-PCB",-7.425,1,360.88200000000006,0,2,1,0.0,-7.82,Clc1ccc(cc1Cl)c2cc(Cl)c(Cl)c(Cl)c2Cl 865 | Vinclozolin,-4.377,1,286.11400000000003,0,2,2,46.61,-4.925,CC1(OC(=O)N(C1=O)c2cc(Cl)cc(Cl)c2)C=C 866 | Cyanazine,-2.49,1,240.698,2,1,4,86.52,-3.15,CCNc1nc(Cl)nc(NC(C)(C)C#N)n1 867 | Triphenylene,-5.568,2,228.29399999999998,0,4,0,0.0,-6.726,c1ccc2c(c1)c3ccccc3c4ccccc24 868 | Dienestrol,-4.775,1,266.34,2,2,3,40.46,-4.95,CC=C(C(=CC)c1ccc(O)cc1)c2ccc(O)cc2 869 | Di(2-ethylhexyl)-phthalate,-7.117000000000001,1,390.5640000000003,0,1,14,52.60000000000001,-6.96,CCCCC(CC)COC(=O)c1ccccc1C(=O)OCC(CC)CCCC 870 | 2-Ethyl pyridine,-2.051,1,107.15599999999998,0,1,1,12.89,0.51,CCc1ccccn1 871 | Naled,-3.548,1,380.784,0,0,5,44.760000000000005,-2.28,COP(=O)(OC)OC(Br)C(Cl)(Cl)Br 872 | Biphenyl,-4.079,2,154.21199999999996,0,2,1,0.0,-4.345,c1ccc(cc1)c2ccccc2 873 | "2,2',4,4',6,6'-PCB",-7.178999999999999,1,360.88200000000006,0,2,1,0.0,-8.71,Clc1cc(Cl)c(c(Cl)c1)c2c(Cl)cc(Cl)cc2Cl 874 | Altretamine,-2.492,1,210.285,0,1,3,48.39000000000001,-3.364,CN(C)c1nc(nc(n1)N(C)C)N(C)C 875 | "2,4-Dimethyl-2-pentanol ",-1.6469999999999998,1,116.20399999999998,1,0,2,20.23,-0.92,CC(C)CC(C)(C)O 876 | Cycloheptyl-5-spirobarbituric acid,-1.844,1,210.23299999999998,2,2,0,75.27,-3.168,O=C2NC(=O)C1(CCCCCC1)C(=O)N2 877 | Fructose,0.47100000000000003,1,180.156,5,1,2,110.38000000000001,0.64,OCC1OC(O)(CO)C(O)C1O 878 | "3,5-Dimethylphenol",-2.6519999999999997,1,122.16699999999997,1,1,0,20.23,-1.4,Cc1cc(C)cc(O)c1 879 | Barban,-4.16,1,258.104,1,1,2,38.33,-4.37,ClCC#CCOC(=O)Nc1cccc(Cl)c1 880 | p-Chloroacetanilide,-2.642,1,169.611,1,1,1,29.1,-2.843,CC(=O)Nc1ccc(Cl)cc1 881 | "2,2',3,4,5,5',6-PCB",-7.898,1,395.3270000000001,0,2,1,0.0,-8.94,Clc1ccc(Cl)c(c1)c2c(Cl)c(Cl)c(Cl)c(Cl)c2Cl 882 | "2,2-Dimethylbutane",-2.5839999999999996,1,86.17799999999998,0,0,0,0.0,-3.55,CCC(C)(C)C 883 | N-Methylaniline ,-2.097,1,107.15599999999998,1,1,1,12.03,-1.28,CNc1ccccc1 884 | "1,4-Pentadiene ",-1.758,1,68.119,0,0,2,0.0,-2.09,C=CCC=C 885 | Hydrocortisone 21-acetate,-3.6919999999999997,1,404.5030000000002,2,4,3,100.90000000000002,-4.88,CC(=O)OCC(=O)C1(O)CCC2C3CCC4=CC(=O)CCC4(C)C3C(O)CC21C 886 | DNOC,-2.818,1,198.134,1,1,2,106.51000000000002,-1.456,Cc1cc(cc(N(=O)=O)c1O)N(=O)=O 887 | Lorazepam,-3.75,1,321.163,2,3,1,61.690000000000005,-3.6039999999999996,OC3N=C(c1ccccc1Cl)c2cc(Cl)ccc2NC3=O 888 | 3-Chlorophenol,-2.761,1,128.558,1,1,0,20.23,-0.7,Oc1cccc(Cl)c1 889 | m-Chlorobromobenzene,-3.928,1,191.45499999999998,0,1,0,0.0,-3.21,Clc1cccc(Br)c1 890 | chlorothiazide,-1.7519999999999998,1,295.72900000000004,2,2,1,118.69,-3.05,NS(=O)(=O)c2cc1c(N=CNS1(=O)=O)cc2Cl 891 | 5-Methyl-5-ethylbarbituric acid,-0.9109999999999999,1,170.16799999999998,2,1,1,75.27000000000001,-1.228,O=C1NC(=O)NC(=O)C1(C)CC 892 | 2-Phenoxyethanol,-1.761,1,138.16599999999997,1,1,3,29.46,-0.7,OCCOc1ccccc1 893 | Diphenylmethane,-4.09,2,168.239,0,2,2,0.0,-4.08,C(c1ccccc1)c2ccccc2 894 | 3-Octanol,-2.033,1,130.23099999999997,1,0,5,20.23,-1.98,CCCCCC(O)CC 895 | Flumetralin,-6.584,1,421.7340000000001,0,2,6,89.51999999999998,-6.78,CCN(Cc1c(F)cccc1Cl)c2c(cc(cc2N(=O)=O)C(F)(F)F)N(=O)=O 896 | Propazine,-3.3289999999999997,1,229.71500000000003,2,1,4,62.730000000000004,-4.43,CC(C)Nc1nc(Cl)nc(NC(C)C)n1 897 | 2-Methylpentanol,-1.381,1,102.17699999999999,1,0,3,20.23,-1.11,CCCC(C)CO 898 | 2-Methyl-2-hexanol,-1.663,1,116.20399999999998,1,0,3,20.23,-1.08,CCCCC(C)(C)O 899 | Ethylbenzene,-2.988,1,106.16799999999996,0,1,1,0.0,-2.77,CCc1ccccc1 900 | 5-(3-Methyl-2-butenyl)-5-ethylbarbital,-2.126,1,224.25999999999996,2,1,3,75.27000000000001,-2.253,O=C1NC(=O)NC(=O)C1(CC)CC=C(C)C 901 | Heptachlor,-5.26,1,373.3209999999999,0,3,0,0.0,-6.317,ClC1C=CC2C1C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl 902 | butallylonal,-2.766,1,303.156,2,1,4,75.27000000000001,-2.647,CCC(C)C1(CC(Br)=C)C(=O)NC(=O)NC1=O 903 | Fenpropathrin,-6.15,1,349.43000000000006,0,3,5,59.32000000000001,-6.025,CC1(C)C(C(=O)OC(C#N)c2cccc(Oc3ccccc3)c2)C1(C)C 904 | Methoprene,-4.795,1,310.47800000000007,0,0,10,35.53,-5.19,COC(C)(C)CCCC(C)CC=CC(C)=CC(=O)OC(C)C 905 | Ethyl propionate,-1.1909999999999998,1,102.133,0,0,2,26.3,-0.66,CCOC(=O)CC 906 | Prometryn,-3.693,1,241.364,2,1,5,62.730000000000004,-4.1,CSc1nc(NC(C)C)nc(NC(C)C)n1 907 | Buturon,-3.199,1,236.702,1,1,2,32.34,-3.9,CC(C#C)N(C)C(=O)Nc1ccc(Cl)cc1 908 | "2,3-Dimethylnaphthalene",-4.1160000000000005,1,156.22799999999998,0,2,0,0.0,-4.72,Cc1cc2ccccc2cc1C 909 | "2,4',5-PCB",-5.7620000000000005,1,257.547,0,2,1,0.0,-6.25,Clc1ccc(cc1)c2cc(Cl)ccc2Cl 910 | "2,3',4,4',5-PCB",-7.343,1,360.88200000000006,0,2,1,0.0,-7.39,Clc1ccc(c(Cl)c1)c2cc(Cl)c(Cl)c(Cl)c2Cl 911 | 2-cyanoguanidine,0.361,1,84.082,2,0,0,88.19,-0.31,NC(N)=NC#N 912 | Chloropicrin,-1.8659999999999999,1,164.375,0,0,0,43.14,-2.0,ClC(Cl)(Cl)N(=O)=O 913 | "2,6-PCB",-4.984,1,223.102,0,2,1,0.0,-5.21,Clc1cccc(Cl)c1c2ccccc2 914 | p-Methoxybenzaldehyde,-2.252,1,136.14999999999998,0,1,2,26.3,-1.49,COc1ccc(C=O)cc1 915 | 4-Nitroacetanilide,-2.219,1,180.16299999999998,1,1,2,72.24000000000001,-2.6919999999999997,CC(=O)Nc1ccc(cc1)N(=O)=O 916 | Ethyl heptanoate,-2.608,1,158.24099999999999,0,0,6,26.3,-2.74,CCCCCCC(=O)OCC 917 | p-Hydroxyacetanilide,-1.495,1,151.165,2,1,1,49.33,-1.03,CC(=O)Nc1ccc(O)cc1 918 | indazole,-2.34,2,118.13899999999998,1,2,0,28.68,-2.16,c2ccc1[nH]ncc1c2 919 | triamcinolone acetonide,-3.928,1,434.50400000000025,2,5,2,93.06000000000002,-4.31,CC5(C)OC4CC3C2CCC1=CC(=O)C=CC1(C)C2(F)C(O)CC3(C)C4(O5)C(=O)CO 920 | guanine,-0.67,1,151.129,3,2,0,100.44999999999999,-3.583,Nc2nc1[nH]cnc1c(=O)[nH]2 921 | Methyl acetate,-0.41600000000000004,1,74.07900000000001,0,0,0,26.3,0.46,COC(=O)C 922 | Stanolone,-3.8819999999999997,1,290.44699999999995,1,4,0,37.3,-4.743,CC34CCC1C(CCC2CC(=O)CCC12C)C3CCC4O 923 | 1-Hexene-3-ol,-1.199,1,100.16099999999999,1,0,3,20.23,-0.59,CCCC(O)C=C 924 | norbormide,-4.238,1,511.5810000000002,2,7,5,92.18,-3.931,OC(C1=CC2C5C(C1C2=C(c3ccccc3)c4ccccn4)C(=O)NC5=O)(c6ccccc6)c7ccccn7 925 | Dibutyl ether ,-2.135,1,130.231,0,0,6,9.23,-1.85,CCCCOCCCC 926 | 1-Dodecanol,-3.523,1,186.33899999999997,1,0,10,20.23,-4.8,CCCCCCCCCCCCO 927 | RTI 6,-3.335,1,313.36100000000005,2,3,4,81.59000000000002,-3.36,CCN2c1nc(N(C)(CCO))ccc1NC(=O)c3cccnc23 928 | 2-Methyl-2-pentanol,-1.308,1,102.17699999999998,1,0,2,20.23,-0.49,CCCC(C)(C)O 929 | Flucytosine,-0.132,1,129.09399999999997,2,1,0,71.77,-0.972,Nc1nc(=O)[nH]cc1F 930 | stadacaine,-5.127999999999999,1,293.40700000000004,0,1,9,38.77,-3.84,CCCCOc1ccc(C(=O)OCC)c(c1)N(CC)CC 931 | 2-Methyl-2-heptanol,-2.017,1,130.231,1,0,4,20.23,-1.72,CCCCCC(C)(C)O 932 | Hexamethylbenzene,-4.361000000000001,1,162.27599999999998,0,1,0,0.0,-5.23,Cc1c(C)c(C)c(C)c(C)c1C 933 | Thymol,-3.1289999999999996,1,150.22099999999998,1,1,1,20.23,-2.22,CC(C)c1ccc(C)cc1O 934 | Pteridine,-0.9059999999999999,2,132.12599999999998,0,2,0,51.56,0.02,c2cnc1ncncc1n2 935 | Parathion,-3.949,1,291.26500000000004,0,1,7,70.83000000000001,-4.66,CCOP(=S)(OCC)Oc1ccc(cc1)N(=O)=O 936 | Methane,-0.636,0,16.043,0,0,0,0.0,-0.9,C 937 | indoline,-2.195,2,119.16699999999999,1,2,0,12.03,-1.04,c2ccc1NCCc1c2 938 | 1-Nitronapthalene,-3.4139999999999997,1,173.171,0,2,1,43.14,-3.54,O=N(=O)c1cccc2ccccc12 939 | 3-Methyl-2-pentanone,-1.266,1,100.16099999999999,0,0,2,17.07,-0.67,CCC(C)C(=O)C 940 | isoguanine,-1.74,1,151.129,3,2,0,100.71000000000001,-3.4010000000000002,Nc1nc(O)nc2nc[nH]c12 941 | bromadiolone,-7.877000000000001,1,527.4140000000002,2,5,6,70.67,-4.445,OC(CC(c1ccccc1)c3c(O)c2ccccc2oc3=O)c4ccc(cc4)c5ccc(Br)cc5 942 | Nitromethane,-0.042,1,61.040000000000006,0,0,0,43.14,0.26,CN(=O)=O 943 | Triallate,-4.578,1,304.66999999999996,0,0,4,20.310000000000002,-4.88,CC(C)N(C(C)C)C(=O)SCC(Cl)=C(Cl)Cl 944 | "1,5-Hexadiene ",-2.112,1,82.14599999999999,0,0,3,0.0,-2.68,C=CCCC=C 945 | Indole,-2.654,2,117.15099999999997,1,2,0,15.79,-1.52,c2ccc1[nH]ccc1c2 946 | Androstenedione,-3.3930000000000002,1,286.415,0,4,0,34.14,-3.69,CC34CCC1C(CCC2=CC(=O)CCC12C)C3CCC4=O 947 | 1-Hexene,-2.364,1,84.16199999999999,0,0,3,0.0,-3.23,CCCCC=C 948 | Xipamide,-3.642,1,354.8150000000001,3,2,3,109.48999999999998,-3.79,Cc1cccc(C)c1NC(=O)c2cc(c(Cl)cc2O)S(N)(=O)=O 949 | Ethylcyclohexane,-3.245,1,112.21600000000001,0,1,1,0.0,-4.25,CCC1CCCCC1 950 | 2-Nonanone,-2.263,1,142.242,0,0,6,17.07,-2.58,CCCCCCCC(=O)C 951 | Mebendazole,-4.118,1,295.298,2,3,3,84.07999999999998,-3.88,COC(=O)Nc2nc1ccc(cc1[nH]2)C(=O)c3ccccc3 952 | Chloropham,-3.5439999999999996,1,213.66400000000002,1,1,2,38.33,-3.38,CC(C)OC(=O)Nc1cccc(Cl)c1 953 | RTI 12,-3.446,1,288.73800000000006,0,3,1,49.330000000000005,-4.114,CCN2c1nc(Cl)ccc1N(C)C(=O)c3cccnc23 954 | Carbaryl,-3.0869999999999997,1,201.225,1,2,1,38.33,-3.2239999999999998,CNC(=O)Oc1cccc2ccccc12 955 | Ethyne,-0.252,1,26.037999999999997,0,0,0,0.0,0.29,C#C 956 | "3,5-Dimethylpyridine",-2.0980000000000003,1,107.15599999999998,0,1,0,12.89,0.38,Cc1cncc(C)c1 957 | "1,4-Cyclohexadiene",-1.8419999999999999,2,80.12999999999998,0,1,0,0.0,-2.06,C1C=CCC=C1 958 | Mecarbam,-3.738,1,329.3800000000001,0,0,8,65.07000000000001,-2.5180000000000002,CCOC(=O)N(C)C(=O)CSP(=S)(OCC)OCC 959 | 1-Phenylethanol,-1.919,1,122.16699999999996,1,1,1,20.23,-0.92,CC(O)c1ccccc1 960 | "1,2-Dichloropropane",-1.794,1,112.98700000000001,0,0,1,0.0,-1.6,CC(Cl)CCl 961 | 2-Ethyl-2-hexanal,-2.081,1,126.19899999999998,0,0,4,17.07,-2.46,CCCC=C(CC)C=O 962 | Disulfoton,-3.975,1,274.413,0,0,9,18.46,-4.23,CCOP(=S)(OCC)SCCSCC 963 | methyltestosterone acetate,-4.863,1,344.4950000000001,0,4,1,43.370000000000005,-5.284,CC(=O)OC3(C)CCC4C2CCC1=CC(=O)CCC1(C)C2CCC34C 964 | "2,4,6-PCB",-5.604,1,257.547,0,2,1,0.0,-6.14,Clc1ccc(cc1)c2c(Cl)cccc2Cl 965 | difluron,-4.692,1,310.687,2,2,2,58.2,-6.02,Fc1cccc(F)c1C(=O)NC(=O)Nc2ccc(Cl)cc2 966 | Triclosan,-5.645,1,289.54499999999996,1,2,2,29.46,-4.46,Oc1cc(Cl)ccc1Oc2ccc(Cl)cc2Cl 967 | diisooctyl phthalate,-7.117000000000001,1,390.5640000000002,0,1,14,52.60000000000001,-6.6370000000000005,c1(C(=O)OCCCCCC(C)(C))c(C(=O)OCCCCCC(C)(C))cccc1 968 | Corticosterone,-3.4539999999999997,1,346.46700000000016,2,4,2,74.6,-3.24,CC12CC(O)C3C(CCC4=CC(=O)CCC34C)C2CCC1C(=O)CO 969 | "1,3,5-Trimethylbenzene ",-3.375,1,120.19499999999998,0,1,0,0.0,-3.4,Cc1cc(C)cc(C)c1 970 | dioctyl phthalate,-7.148,1,390.56400000000036,0,1,16,52.60000000000001,-5.115,CCCCCCCCOC(=O)c1ccccc1C(=O)OCCCCCCCC 971 | 1-Pentadecanol,-4.586,1,228.41999999999993,1,0,13,20.23,-6.35,CCCCCCCCCCCCCCCO 972 | "2,2',6,6'-PCB",-5.915,1,291.99199999999996,0,2,1,0.0,-7.39,Clc1cccc(Cl)c1c2c(Cl)cccc2Cl 973 | "5,5-Dimethylbarbituric acid",-0.556,1,156.141,2,1,0,75.27000000000001,-1.742,O=C1NC(=O)NC(=O)C1(C)C 974 | 2-Iodopropane,-2.4859999999999998,1,169.993,0,0,0,0.0,-2.09,CC(C)I 975 | "1,2-Dinitrobenzene",-2.281,1,168.10799999999995,0,1,2,86.28,-3.1,O=N(=O)c1ccccc1N(=O)=O 976 | 3-Methyl-2-butanone,-0.912,1,86.13399999999999,0,0,1,17.07,-0.12,CC(C)C(=O)C 977 | Hexadecane,-6.159,1,226.44799999999992,0,0,13,0.0,-8.4,CCCCCCCCCCCCCCCC 978 | "1,8-Cineole",-2.5789999999999997,1,154.253,0,3,0,9.23,-1.74,CC12CCC(CC1)C(C)(C)O2 979 | Tricyclazole,-2.8680000000000003,1,189.24300000000002,0,3,0,30.19,-2.07,Cc2cccc3sc1nncn1c23 980 | 2-Octanone,-1.909,1,128.21499999999997,0,0,5,17.07,-2.05,CCCCCCC(=O)C 981 | Methyl nonanoate,-2.9619999999999997,1,172.268,0,0,7,26.3,-3.38,CCCCCCCCC(=O)OC 982 | "1,4-Difluorobenzene",-2.636,1,114.094,0,1,0,0.0,-1.97,Fc1ccc(F)cc1 983 | Thalidomide,-1.944,1,258.233,1,3,1,83.55000000000001,-2.676,O=C1N(C2CCC(=O)NC2=O)C(=O)c3ccccc13 984 | Trifluralin,-5.205,1,335.28200000000004,0,1,7,89.51999999999998,-5.68,CCCN(CCC)c1c(cc(cc1N(=O)=O)C(F)(F)F)N(=O)=O 985 | Ethanol,0.02,1,46.069,1,0,0,20.23,1.1,CCO 986 | Cyclopentyl-5-spirobarbituric acid,-0.966,1,182.179,2,2,0,75.27,-2.349,O=C2NC(=O)C1(CCCC1)C(=O)N2 987 | Carbetamide,-2.29,1,236.271,2,1,4,67.42999999999999,-1.83,c1c(NC(=O)OC(C)C(=O)NCC)cccc1 988 | phenothrin,-6.763,1,350.4580000000001,0,3,6,35.53,-5.24,CC(C)=CC3C(C(=O)OCc2cccc(Oc1ccccc1)c2)C3(C)C 989 | Cycluron,-2.6289999999999996,1,198.30999999999992,1,1,1,32.34,-2.218,CN(C)C(=O)NC1CCCCCCC1 990 | Mirex,-6.155,1,545.5460000000002,0,6,0,0.0,-6.8,ClC1(C2(Cl)C3(Cl)C4(Cl)C5(Cl)C1(Cl)C3(Cl)Cl)C5(Cl)C(Cl)(Cl)C24Cl 991 | 1-Bromooctane,-3.721,1,193.128,0,0,6,0.0,-5.06,CCCCCCCCBr 992 | Benomyl,-2.9019999999999997,1,290.323,2,2,4,85.25,-4.883,CCCCNC(=O)n1c(NC(=O)OC)nc2ccccc12 993 | aminopyrine,-2.129,1,231.299,0,2,2,30.17,-0.364,CN(C)c2c(C)n(C)n(c1ccccc1)c2=O 994 | 3-Pentanol,-0.97,1,88.15,1,0,2,20.23,-0.24,CCC(O)CC 995 | p-Nitrotoluene,-2.64,1,137.138,0,1,1,43.14,-2.49,Cc1ccc(cc1)N(=O)=O 996 | 4-Methylpentanol,-1.381,1,102.17699999999999,1,0,3,20.23,-1.14,CC(C)CCCO 997 | Norethisterone,-2.6689999999999996,1,314.42500000000007,2,4,0,57.53,-4.57,CC34CCC1C(CCC2=CC(=O)CCC12O)C3CCC4(O)C#C 998 | bromopropylate,-5.832999999999999,1,428.12000000000006,1,2,4,46.53,-4.93,CC(C)OC(=O)C(O)(c1ccc(Br)cc1)c2ccc(Br)cc2 999 | Pyrazon,-2.603,1,221.647,1,2,1,60.91,-2.878,Nc2cnn(c1ccccc1)c(=O)c2Cl 1000 | 2-Methylbutan-2-ol,-0.9540000000000001,1,88.14999999999998,1,0,1,20.23,0.15,CCC(C)(C)O 1001 | p-Cresol,-2.313,1,108.13999999999999,1,1,0,20.23,-0.73,Cc1ccc(O)cc1 1002 | Ethyl formate,-0.402,1,74.07900000000001,0,0,2,26.3,0.15,CCOC=O 1003 | "N,N-Dimethylaniline",-2.542,1,121.18299999999995,0,1,1,3.24,-1.92,CN(C)c1ccccc1 1004 | Decalin,-3.715,2,138.254,0,2,0,0.0,-5.19,C1CCC2CCCCC2C1 1005 | Butanethiol ,-1.676,1,90.19099999999999,1,0,2,0.0,-2.18,CCCCS 1006 | Benzo(e)pyrene,-6.007000000000001,2,252.31599999999997,0,5,0,0.0,-7.8,c1ccc2c(c1)c3cccc4ccc5cccc2c5c43 1007 | Tetrachloroethylene,-3.063,1,165.834,0,0,0,0.0,-2.54,ClC(=C(Cl)Cl)Cl 1008 | 3-Pentanone,-0.912,1,86.134,0,0,2,17.07,-0.28,CCC(=O)CC 1009 | Acrylonitrile,-0.354,1,53.06399999999999,0,0,0,23.79,0.15,C=CC#N 1010 | Flumethasone,-3.5389999999999997,1,410.4570000000002,3,4,2,94.83,-5.6129999999999995,CC1CC2C3CC(F)C4=CC(=O)C=CC4(C)C3(F)C(O)CC2(C)C1(O)C(=O)CO 1011 | 2-Hexanone,-1.2,1,100.16099999999999,0,0,3,17.07,-0.8,CCCCC(=O)C 1012 | Terbumeton,-3.505,1,225.296,2,1,4,71.96000000000001,-3.239,CCNc1nc(NC(C)(C)C)nc(OC)n1 1013 | 3-Methylheptane,-3.3080000000000003,1,114.23199999999999,0,0,4,0.0,-5.16,CCCCC(C)CC 1014 | "1,2-Dibromoethane",-2.102,1,187.862,0,0,1,0.0,-1.68,BrCCBr 1015 | Isoprocarb,-2.734,1,193.24599999999998,1,1,2,38.33,-2.863,CNC(=O)Oc1ccccc1C(C)C 1016 | Niridazole,-1.9480000000000002,1,214.20600000000002,1,2,2,88.37,-3.22,O=C1NCCN1c2ncc(s2)N(=O)=O 1017 | Benzo(a)fluorene,-5.189,2,216.283,0,4,0,0.0,-6.68,C1c2ccccc2c3ccc4ccccc4c13 1018 | 2-Chloroanisole,-2.912,1,142.58499999999998,0,1,1,9.23,-2.46,COc1ccccc1Cl 1019 | Bromophos,-5.604,1,366.0,0,1,4,27.69,-6.09,COP(=S)(OC)Oc1cc(Cl)c(Br)cc1Cl 1020 | Quinonamid,-3.988,1,332.57000000000005,1,2,3,63.24,-5.03,ClC(Cl)CC(=O)NC2=C(Cl)C(=O)c1ccccc1C2=O 1021 | "P,P'-DDD",-6.007999999999999,1,320.04600000000005,0,2,3,0.0,-7.2,ClC(Cl)C(c1ccc(Cl)cc1)c2ccc(Cl)cc2 1022 | Methyl acrylate,-0.878,1,86.09,0,0,1,26.3,-0.22,COC(=O)C=C 1023 | Chloroxuron,-4.477,1,290.75,1,2,3,41.57000000000001,-4.89,CN(C)C(=O)Nc2ccc(Oc1ccc(Cl)cc1)cc2 1024 | Azobenzene,-4.034,2,182.226,0,2,2,24.72,-4.45,N(=Nc1ccccc1)c2ccccc2 1025 | 4-Isopropyltoluene,-3.617,1,134.22199999999998,0,1,1,0.0,-3.77,CC(C)c1ccc(C)cc1 1026 | "2,6-Dichlorophenol",-3.012,1,163.003,1,1,0,20.23,-1.79,Oc1c(Cl)cccc1Cl 1027 | Sucrose,0.31,1,342.297,8,2,5,189.52999999999997,0.79,OCC2OC(OC1(CO)OC(CO)C(O)C1O)C(O)C(O)C2O 1028 | d-inositol,-0.887,1,180.156,6,1,0,121.38000000000001,0.35,OC1C(O)C(O)C(O)C(O)C1O 1029 | Dyphylline,-0.847,1,254.24599999999995,2,2,3,102.28,-0.17,Cn2c(=O)n(C)c1ncn(CC(O)CO)c1c2=O 1030 | Chloramphenicol,-2.613,1,323.13200000000006,3,1,6,112.70000000000002,-2.1109999999999998,OCC(NC(=O)C(Cl)Cl)C(O)c1ccc(cc1)N(=O)=O 1031 | 3-Ethyl-3-pentanol,-1.663,1,116.204,1,0,3,20.23,-0.85,CCC(O)(CC)CC 1032 | Epitostanol,-4.545,1,306.51500000000004,1,5,0,20.23,-5.41,CC45CCC2C(CCC3CC1SC1CC23C)C4CCC5O 1033 | "1,2-Dibromobenzene",-4.172,1,235.90599999999998,0,1,0,0.0,-3.5,Brc1ccccc1Br 1034 | "2,4,6-Trichlorophenol",-3.648,1,197.44799999999998,1,1,0,20.23,-2.34,Oc1c(Cl)cc(Cl)cc1Cl 1035 | oryzalin,-3.784,1,346.3650000000001,1,1,8,149.67999999999998,-5.16,CCCN(CCC)c1c(cc(cc1N(=O)=O)S(N)(=O)=O)N(=O)=O 1036 | RTI 20,-3.6630000000000003,1,255.29199999999997,0,3,2,20.310000000000002,-4.7989999999999995,C2c1ccccc1N(CCF)C(=O)c3ccccc23 1037 | "2,4-Dimethyl-3-pentanone",-1.7519999999999998,1,114.18799999999997,0,0,2,17.07,-1.3,CC(C)C(=O)C(C)C 1038 | 5-(3-Methyl-2-butenyl)-5-isoPrbarbital,-2.465,1,238.28699999999998,2,1,3,75.27000000000001,-2.593,O=C1NC(=O)NC(=O)C1(C(C)C)CC=C(C)C 1039 | gentisin,-1.2919999999999998,1,262.261,2,3,1,75.99000000000001,-2.943,c1c(O)C2C(=O)C3cc(O)ccC3OC2cc1(OC) 1040 | Caffeine,-1.4980000000000002,1,194.19399999999996,0,2,0,61.82,-0.8759999999999999,Cn1cnc2n(C)c(=O)n(C)c(=O)c12 1041 | Spironolactone,-3.842,1,416.58300000000025,0,5,1,60.44,-4.173,CC(=O)SC4CC1=CC(=O)CCC1(C)C5CCC2(C)C(CCC23CCC(=O)O3)C45 1042 | "3,4-Dimethylphenol",-2.6210000000000004,1,122.16699999999999,1,1,0,20.23,-1.38,Cc1ccc(O)cc1C 1043 | Diphenyl ether ,-4.254,2,170.211,0,2,2,9.23,-3.96,O(c1ccccc1)c2ccccc2 1044 | "2,2',4,4',5,5'-PCB",-7.343,1,360.88200000000006,0,2,1,0.0,-8.56,Clc1cc(Cl)c(cc1Cl)c2cc(Cl)c(Cl)cc2Cl 1045 | nicotinamide,-0.9640000000000001,1,122.12699999999997,1,1,1,55.980000000000004,0.61,NC(=O)c1cccnc1 1046 | Thiophenol ,-2.758,1,110.18099999999997,1,1,0,0.0,-2.12,Sc1ccccc1 1047 | XMC,-2.688,1,179.219,1,1,1,38.33,-2.5810000000000004,CNC(=O)Oc1cc(C)cc(C)c1 1048 | Chlordane,-6.039,1,409.7819999999999,0,3,0,0.0,-6.86,ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl 1049 | Dimethyldisulfide,-1.524,1,94.20400000000001,0,0,1,0.0,-1.44,CSSC 1050 | Benzamide,-1.501,1,121.13899999999995,1,1,1,43.09,-0.96,NC(=O)c1ccccc1 1051 | o-Chlorobromobenzene,-3.84,1,191.45499999999998,0,1,0,0.0,-3.19,Clc1ccccc1Br 1052 | Monotropitoside,-1.493,1,446.40500000000003,6,3,6,184.6,-0.742,COC(=O)c1ccccc1OC2OC(COC3OCC(O)C(O)C3O)C(O)C(O)C2O 1053 | 3-Heptanol ,-1.6780000000000002,1,116.20399999999998,1,0,4,20.23,-1.47,CCCCC(O)CC 1054 | RTI 15,-3.891,1,268.32,1,3,1,58.120000000000005,-4.553999999999999,CCN2c1nc(C)cc(C)c1NC(=O)c3cccnc23 1055 | "3,5-Dichlorophenol",-3.428,1,163.003,1,1,0,20.23,-1.34,Oc1cc(Cl)cc(Cl)c1 1056 | 1-Methylphenanthrene,-4.87,1,192.261,0,3,0,0.0,-5.85,Cc1cccc2c1ccc3ccccc32 1057 | 2-Ethyl-1-hexanol,-2.089,1,130.231,1,0,5,20.23,-2.11,CCCCC(CC)CO 1058 | Diallate,-3.827,1,270.225,0,0,4,20.310000000000002,-4.2860000000000005,CC(C)N(C(C)C)C(=O)SCC(=CCl)Cl 1059 | Toluene ,-2.713,1,92.14099999999999,0,1,0,0.0,-2.21,Cc1ccccc1 1060 | Nitrapyrin,-3.833,1,230.909,0,1,0,12.89,-3.76,Clc1cccc(n1)C(Cl)(Cl)Cl 1061 | Cycloheptene,-2.5989999999999998,2,96.173,0,1,0,0.0,-3.18,C1CCC=CCC1 1062 | Thiram,-2.444,1,240.44400000000002,0,0,0,6.48,-3.9,CN(C)C(=S)SSC(=S)N(C)C 1063 | Griseofulvin,-3.3280000000000003,1,352.7700000000001,0,3,3,71.06,-3.2460000000000004,COC1=CC(=O)CC(C)C13Oc2c(Cl)c(OC)cc(OC)c2C3=O 1064 | 1-Decanol,-2.8139999999999996,1,158.285,1,0,8,20.23,-3.63,CCCCCCCCCCO 1065 | "3,3-Dimethylpentane",-2.938,1,100.20499999999998,0,0,2,0.0,-4.23,CCC(C)(C)CC 1066 | vamidothion,-1.446,1,287.34299999999996,1,0,8,64.63000000000001,1.1440000000000001,CNC(=O)C(C)SCCSP(=O)(OC)(OC) 1067 | "2,3,4,5-Tetrachlorophenol",-4.335,1,231.893,1,1,0,20.23,-3.15,Oc1cc(Cl)c(Cl)c(Cl)c1Cl 1068 | Butyraldehyde,-0.7490000000000001,1,72.107,0,0,2,17.07,-0.01,CCCC=O 1069 | dexamethasone acetate,-3.9330000000000003,1,434.5040000000003,2,4,3,100.9,-4.9,CC4CC3C2CCC1=CC(=O)C=CC1(C)C2(F)C(O)CC3(C)C4(O)C(=O)COC(C)=O 1070 | Butane,-1.9069999999999998,1,58.123999999999995,0,0,1,0.0,-2.57,CCCC 1071 | o-Methoxyphenol,-1.9409999999999998,1,124.13899999999997,1,1,1,29.46,-1.96,COc1ccccc1O 1072 | Fluoromethalone,-3.5069999999999997,1,376.46800000000013,2,4,1,74.6,-4.099,CC1CC2C3CCC(O)(C(=O)C)C3(C)CC(O)C2(F)C4(C)C=CC(=O)C=C14 1073 | Pentachloroethane,-3.3819999999999997,1,202.29500000000002,0,0,0,0.0,-2.6,ClC(Cl)C(Cl)(Cl)Cl 1074 | Diethyl phthalate ,-3.016,1,222.23999999999995,0,1,4,52.60000000000001,-2.35,CCOC(=O)c1ccccc1C(=O)OCC 1075 | 2-Methylpropan-1-ol,-0.672,1,74.12299999999999,1,0,1,20.23,0.1,CC(C)CO 1076 | Isobutylbenzene,-3.57,1,134.22199999999998,0,1,2,0.0,-4.12,CC(C)Cc1ccccc1 1077 | Diiodomethane,-2.958,1,267.835,0,0,0,0.0,-2.34,ICI 1078 | 4-Heptanol,-1.6780000000000002,1,116.204,1,0,4,20.23,-1.4,CCCC(O)CCC 1079 | Pentyl acetate,-1.8330000000000002,1,130.18699999999998,0,0,4,26.3,-1.89,CCCCCOC(=O)C 1080 | "2,3,5,6-Tetrachlorophenol",-4.203,1,231.893,1,1,0,20.23,-3.37,Oc1c(Cl)c(Cl)cc(Cl)c1Cl 1081 | Propylbenzene ,-3.281,1,120.19499999999995,0,1,2,0.0,-3.37,CCCc1ccccc1 1082 | "1,2-Dichlorotetrafluoroethane",-2.697,1,170.92000000000002,0,0,1,0.0,-2.74,FC(F)(Cl)C(F)(F)Cl 1083 | 2-butenal,-0.604,1,70.09100000000001,0,0,1,17.07,0.32,CC=CC=O 1084 | tetramethylurea,-0.495,1,116.16399999999999,0,0,0,23.550000000000004,0.94,CN(C)C(=O)N(C)C 1085 | "1,2,4,5-Tetramethylbenzene",-3.6639999999999997,1,134.22199999999998,0,1,0,0.0,-4.59,Cc1cc(C)c(C)cc1C 1086 | norethindrone acetate,-4.2410000000000005,1,340.4630000000001,0,4,1,43.370000000000005,-4.8,CC(=O)OC3(CCC4C2CCC1=CC(=O)CCC1C2CCC34C)C#C 1087 | Ditalimfos,-3.992,1,299.28800000000007,0,2,5,55.84,-3.35,CCOP(=S)(OCC)N2C(=O)c1ccccc1C2=O 1088 | salicylanilide,-3.782,1,213.23600000000002,2,2,2,49.33,-3.59,c1ccccc1NC(=O)c2c(O)cccc2 1089 | Sulfallate,-3.2539999999999996,1,223.79399999999998,0,0,4,3.24,-3.39,CCN(CC)C(=S)SCC(Cl)=C 1090 | Chloroethane,-1.165,1,64.515,0,0,0,0.0,-1.06,ClCC 1091 | Mefluidide,-3.165,1,310.297,2,1,3,75.27000000000001,-3.24,CC(=O)Nc1cc(NS(=O)(=O)C(F)(F)F)c(C)cc1C 1092 | Piperine,-3.659,1,285.343,0,3,3,38.77,-3.46,O=C(C=CC=Cc2ccc1OCOc1c2)N3CCCCC3 1093 | cis-2-Pentene,-2.076,1,70.135,0,0,1,0.0,-2.54,CC/C=C\C 1094 | thiofanox,-2.7,1,218.32199999999997,1,0,3,50.69,-1.62,CNC(=O)ON=C(CSC)C(C)(C)C 1095 | Cyclooctyl-5-spirobarbituric acid,-2.2840000000000003,1,224.25999999999996,2,2,0,75.27,-2.9819999999999998,O=C2NC(=O)C1(CCCCCCC1)C(=O)N2 1096 | butacarb,-4.6419999999999995,1,263.381,1,1,1,38.33,-4.24,c1(C(C)(C)C)cc(C(C)(C)C)cc(OC(=O)NC)c1 1097 | Eriodictyol,-3.1519999999999997,1,288.255,4,3,1,107.22000000000001,-3.62,Oc2cc(O)c1C(=O)CC(Oc1c2)c3ccc(O)c(O)c3 1098 | Benzophenone,-3.612,1,182.222,0,2,2,17.07,-3.12,O=C(c1ccccc1)c2ccccc2 1099 | Eicosane,-7.5760000000000005,1,282.5559999999999,0,0,17,0.0,-8.172,CCCCCCCCCCCCCCCCCCCC 1100 | hydrazobenzene,-3.492,2,184.242,2,2,3,24.06,-2.92,N(Nc1ccccc1)c2ccccc2 1101 | 2-Ethyl-1-butanol,-1.381,1,102.17699999999999,1,0,3,20.23,-1.17,CCC(CC)CO 1102 | 4-hydroxypyridine,-1.655,1,95.10099999999998,1,1,0,33.120000000000005,1.02,Oc1ccncc1 1103 | "cis 1,2-Dichloroethylene",-1.561,1,96.94400000000002,0,0,0,0.0,-1.3,Cl\C=C/Cl 1104 | Methylcyclopentane,-2.452,1,84.162,0,1,0,0.0,-3.3,CC1CCCC1 1105 | 4-Methyl-2-pentanol,-1.308,1,102.17699999999998,1,0,2,20.23,-0.8,CC(C)CC(C)O 1106 | RTI 11,-3.125,1,254.28900000000002,1,3,0,55.56,-3.928,O2c1ccc(N)cc1N(C)C(=O)c3cc(C)ccc23 1107 | "2,2-Dimethylpropanol",-1.011,1,88.14999999999999,1,0,0,20.23,-0.4,CC(C)(C)CO 1108 | Triadimefon,-4.132,1,293.754,0,2,4,57.010000000000005,-3.61,CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n2cncn2 1109 | Isocarboxazid,-2.251,1,231.25500000000002,2,2,4,67.16,-2.461,Cc1cc(no1)C(=O)NNCc2ccccc2 1110 | Propylene,-1.235,1,42.080999999999996,0,0,0,0.0,-1.08,CC=C 1111 | Dichlorophen,-4.9239999999999995,1,269.127,2,2,2,40.46,-3.9530000000000003,Oc1ccc(Cl)cc1Cc2cc(Cl)ccc2O 1112 | Desmedipham,-4.1819999999999995,1,300.314,2,2,4,76.66,-4.632,CCOC(=O)Nc2cccc(OC(=O)Nc1ccccc1)c2 1113 | Anthraquinone,-3.34,1,208.21599999999998,0,3,0,34.14,-5.19,O=C1c2ccccc2C(=O)c3ccccc13 1114 | 2-Octanol,-2.033,1,130.231,1,0,5,20.23,-2.09,CCCCCCC(C)O 1115 | Oxycarboxin,-2.169,1,267.306,1,2,2,72.47,-2.281,CC1=C(C(=O)Nc2ccccc2)S(=O)(=O)CCO1 1116 | Butylbenzene,-3.585,1,134.22199999999998,0,1,3,0.0,-4.06,CCCCc1ccccc1 1117 | parabanic acid,1.091,1,114.05999999999999,2,1,0,75.27,-0.4,O=C1NC(=O)C(=O)N1 1118 | Abate,-6.678,1,466.47900000000016,0,2,10,55.38000000000001,-6.237,COP(=S)(OC)Oc1ccc(Sc2ccc(OP(=S)(OC)OC)cc2)cc1 1119 | Chlorthalidone,-2.5639999999999996,1,338.7720000000001,3,3,2,109.49000000000001,-3.451,NS(=O)(=O)c1cc(ccc1Cl)C2(O)NC(=O)c3ccccc23 1120 | Isobutyl acetate,-1.463,1,116.15999999999998,0,0,2,26.3,-1.21,CC(C)COC(=O)C 1121 | "2,2,3-Trimethylbutane",-2.9219999999999997,1,100.20499999999998,0,0,0,0.0,-4.36,CC(C)C(C)(C)C 1122 | "2,3,3',4,4'6-PCB",-7.746,1,395.3270000000001,0,2,1,0.0,-7.66,Clc1ccc(c(Cl)c1Cl)c2c(Cl)cc(Cl)c(Cl)c2Cl 1123 | Phthalonitrile,-1.7169999999999999,1,128.13399999999996,0,1,0,47.58,-2.38,N#Cc1ccccc1C#N 1124 | m-Nitrotoluene,-2.64,1,137.138,0,1,1,43.14,-2.44,Cc1cccc(c1)N(=O)=O 1125 | halothane,-2.608,1,197.381,0,0,0,0.0,-1.71,FC(F)(F)C(Cl)Br 1126 | Oxamyl,-0.9079999999999999,1,219.266,1,0,1,70.99999999999999,0.106,CNC(=O)ON=C(SC)C(=O)N(C)C 1127 | Thiometon,-3.323,1,246.35899999999998,0,0,7,18.46,-3.091,CCSCCSP(=S)(OC)OC 1128 | 2-Methylbutane,-2.245,1,72.151,0,0,1,0.0,-3.18,CCC(C)C 1129 | Stirofos,-4.32,1,365.96400000000006,0,1,5,44.760000000000005,-4.522,COP(=O)(OC)OC(=CCl)c1cc(Cl)c(Cl)cc1Cl 1130 | -------------------------------------------------------------------------------- /data/delaney_data.npy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keiserlab/keras-neural-graph-fingerprint/cab0edb32f8e616bb654174c940f743a14d47bbb/data/delaney_data.npy -------------------------------------------------------------------------------- /data/delaney_labels.npy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keiserlab/keras-neural-graph-fingerprint/cab0edb32f8e616bb654174c940f743a14d47bbb/data/delaney_labels.npy -------------------------------------------------------------------------------- /examples.py: -------------------------------------------------------------------------------- 1 | ''' Examples that demonstrate some of the functionality in the NGF module 2 | ''' 3 | from __future__ import division, print_function, absolute_import 4 | 5 | from keras.layers import Input, merge, Dense 6 | from keras import models 7 | 8 | import utils 9 | from NGF.preprocessing import tensorise_smiles, tensorise_smiles_mp 10 | from NGF.layers import NeuralGraphHidden, NeuralGraphOutput 11 | from NGF.models import build_graph_conv_model 12 | from NGF.sparse import GraphTensor, EpochIterator 13 | 14 | # ============================================================================== 15 | # ================================ Load the data =============================== 16 | # ============================================================================== 17 | print("{:=^100}".format(' Data preprocessing ')) 18 | data, labels = utils.load_delaney() 19 | 20 | # Tensorise data 21 | X_atoms, X_bonds, X_edges = tensorise_smiles_mp(data) 22 | print('Atoms:', X_atoms.shape) 23 | print('Bonds:', X_bonds.shape) 24 | print('Edges:', X_edges.shape) 25 | 26 | # Load sizes from data shape 27 | num_molecules = X_atoms.shape[0] 28 | max_atoms = X_atoms.shape[1] 29 | max_degree = X_bonds.shape[2] 30 | num_atom_features = X_atoms.shape[-1] 31 | num_bond_features = X_bonds.shape[-1] 32 | 33 | # ============================================================================== 34 | # =============== Example 1: Building a 3-layer graph convnet ================= 35 | # ============================================================================== 36 | print("{:=^100}".format(' Example 1 ')) 37 | 38 | # Parameters 39 | conv_width = 8 40 | fp_length = 62 41 | 42 | # Define the input layers 43 | atoms0 = Input(name='atom_inputs', shape=(max_atoms, num_atom_features)) 44 | bonds = Input(name='bond_inputs', shape=(max_atoms, max_degree, num_bond_features)) 45 | edges = Input(name='edge_inputs', shape=(max_atoms, max_degree), dtype='int32') 46 | 47 | # Define the convoluted atom feature layers 48 | atoms1 = NeuralGraphHidden(conv_width, activation='relu', bias=False)([atoms0, bonds, edges]) 49 | atoms2 = NeuralGraphHidden(conv_width, activation='relu', bias=False)([atoms1, bonds, edges]) 50 | 51 | # Define the outputs of each (convoluted) atom featuer layer to fingerprint 52 | fp_out0 = NeuralGraphOutput(fp_length, activation='softmax')([atoms0, bonds, edges]) 53 | fp_out1 = NeuralGraphOutput(fp_length, activation='softmax')([atoms1, bonds, edges]) 54 | fp_out2 = NeuralGraphOutput(fp_length, activation='softmax')([atoms2, bonds, edges]) 55 | 56 | # Sum outputs to obtain fingerprint 57 | final_fp = merge([fp_out0, fp_out1, fp_out2], mode='sum') 58 | 59 | # Build and compile model for regression. 60 | main_prediction = Dense(1, activation='linear', name='main_prediction')(final_fp) 61 | model = models.Model(input=[atoms0, bonds, edges], output=[main_prediction]) 62 | model.compile(optimizer='adagrad', loss='mse') 63 | 64 | # Show summary 65 | model.summary() 66 | 67 | # Train the model 68 | model.fit([X_atoms, X_bonds, X_edges], labels, nb_epoch=20, batch_size=32, validation_split=0.2) 69 | 70 | # ============================================================================== 71 | # ============ Example 2: Initialising layers in different ways =============== 72 | # ============================================================================== 73 | print("{:=^100}".format(' Example 2 ')) 74 | 75 | # Parameters 76 | conv_width = 8 77 | fp_length = 62 78 | 79 | # Define the input layers 80 | atoms0 = Input(name='atom_inputs', shape=(max_atoms, num_atom_features)) 81 | bonds = Input(name='bond_inputs', shape=(max_atoms, max_degree, num_bond_features)) 82 | edges = Input(name='edge_inputs', shape=(max_atoms, max_degree), dtype='int32') 83 | 84 | # Define the convoluted atom feature layers 85 | # All methods of initialisation are equaivalent! 86 | atoms1 = NeuralGraphHidden(lambda: Dense(conv_width, activation='relu', bias=False))([atoms0, bonds, edges]) 87 | atoms2 = NeuralGraphHidden(Dense(conv_width, activation='relu', bias=False))([atoms1, bonds, edges]) 88 | 89 | # Define the outputs of each (convoluted) atom featuer layer to fingerprint 90 | # All methods of initialisation are equaivalent! 91 | fp_out0 = NeuralGraphOutput(Dense(fp_length, activation='softmax'))([atoms0, bonds, edges]) 92 | fp_out1 = NeuralGraphOutput(fp_length, activation='softmax')([atoms1, bonds, edges]) 93 | fp_out2 = NeuralGraphOutput(lambda: Dense(fp_length, activation='softmax'))([atoms2, bonds, edges]) 94 | 95 | # Sum outputs to obtain fingerprint 96 | final_fp = merge([fp_out0, fp_out1, fp_out2], mode='sum') 97 | 98 | # Build and compile model for regression. 99 | main_prediction = Dense(1, activation='linear', name='main_prediction')(final_fp) 100 | model2 = models.Model(input=[atoms0, bonds, edges], output=[main_prediction]) 101 | model2.compile(optimizer='adagrad', loss='mse') 102 | 103 | # Show summary 104 | model2.summary() 105 | 106 | # ============================================================================== 107 | # ================== Example 3: Using the model functions ===================== 108 | # ============================================================================== 109 | print("{:=^100}".format(' Example 3 ')) 110 | 111 | model3 = build_graph_conv_model(max_atoms, max_degree, num_atom_features, num_bond_features, 112 | learning_type='regression', conv_layer_sizes=[conv_width, conv_width], 113 | fp_layer_size=[fp_length, fp_length, fp_length], 114 | conv_activation='relu', fp_activation='softmax', 115 | conv_bias=False) 116 | # Show summary 117 | model3.summary() 118 | 119 | # ============================================================================== 120 | # ===================== Example 4: Using sparse tensors ======================= 121 | # ============================================================================== 122 | print("{:=^100}".format(' Example 4 ')) 123 | # Using sparse tensors will improve training speed a lot, because the number of 124 | # max_atoms will be determined by the number molecule with the most atoms within 125 | # a batch, rather than the molecule with the most atoms within the dataset 126 | 127 | # Build the same model, but this time use None for num_atom_features, to allow 128 | # variation of this variable per batch. 129 | model4 = build_graph_conv_model(None, max_degree, num_atom_features, num_bond_features, 130 | learning_type='regression', conv_layer_sizes=[conv_width, conv_width], 131 | fp_layer_size=[fp_length, fp_length, fp_length], 132 | conv_activation='relu', fp_activation='softmax', 133 | conv_bias=False) 134 | 135 | # Show summary 136 | model4.summary() 137 | 138 | # Convert the atom features into GraphTensors, by default, these are sparse 139 | # along the max_atoms dimension. 140 | X_mols = GraphTensor([X_atoms, X_bonds, X_edges]) 141 | 142 | # Build a generator and train the model 143 | my_generator = EpochIterator((X_mols, labels), batch_size=128) 144 | model4.fit_generator(my_generator, nb_epoch=20, samples_per_epoch=len(labels)) 145 | -------------------------------------------------------------------------------- /license.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 The Regents of the University of California. 4 | 5 | All Rights Reserved. 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in all 15 | copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 | SOFTWARE. -------------------------------------------------------------------------------- /utils.py: -------------------------------------------------------------------------------- 1 | ''' Utilities for loading the sample data 2 | 3 | # Source 4 | Imported from https://github.com/GUR9000/KerasNeuralFingerprint/blob/8f50d80/KerasNeuralfingerprint/utils.py 5 | 6 | # Copyright 7 | This code is governed by the licence at: 8 | https://github.com/GUR9000/KerasNeuralFingerprint/blob/8f50d80/license.txt 9 | which is copied to data/data.license.txt 10 | ''' 11 | 12 | from __future__ import print_function 13 | 14 | import csv 15 | import numpy as np 16 | import itertools as it 17 | 18 | def read_csv(filename, nrows, input_name, target_name): 19 | data = ([], []) 20 | with open(filename) as file: 21 | reader = csv.DictReader(file) 22 | for row in it.islice(reader, nrows): 23 | data[0].append(row[input_name]) 24 | data[1].append(float(row[target_name])) 25 | return map(np.array, data) 26 | 27 | def permute_data(data, labels=None, FixSeed=None, return_permutation=False, permutation = None): 28 | """Returns: 29 | data, labels (if both given) otherwise just data , permutation [iff return_permutation==True]""" 30 | if FixSeed!=None: 31 | np.random.seed(int(FixSeed)) 32 | s = np.shape(data)[0] 33 | if permutation is None: 34 | per = np.random.permutation(np.arange(s)) 35 | else: 36 | per = permutation 37 | if type(data)==type([]): 38 | cpy = [data[i] for i in per] 39 | else: 40 | cpy = data[per] #creates a copy! (fancy indexing) 41 | if labels is not None: 42 | if type(labels)==type([]): 43 | cpyl = [labels[i] for i in per] 44 | else: 45 | cpyl = labels[per] 46 | if not return_permutation: 47 | return cpy, cpyl 48 | else: 49 | return cpy, cpyl, per 50 | if not return_permutation: 51 | return cpy 52 | else: 53 | return cpy,per 54 | 55 | def load_delaney(file = 'data/delaney.csv', target_name = 'measured log solubility in mols per litre'): 56 | ''' 57 | returns: data, labels 58 | ''' 59 | 60 | _alldata = read_csv(file, 1128, input_name='smiles', target_name=target_name) 61 | assert len(_alldata[0])==len(_alldata[1]) 62 | data, labels = permute_data(_alldata[0], _alldata[1], FixSeed=12345) 63 | assert len(data)==len(labels) 64 | return data, labels 65 | 66 | def load_Karthikeyan_MeltingPoints(file = 'data/Melting_Points_(Karthikeyan).txt', target_name='MTP'): 67 | ''' 68 | returns: data, labels 69 | ''' 70 | _alldata = read_csv(file, 4451, input_name='SMILES', target_name=target_name) 71 | assert len(_alldata[0])==len(_alldata[1]) 72 | data, labels = permute_data(_alldata[0], _alldata[1], FixSeed=12345) 73 | assert len(data)==len(labels) 74 | return data, labels --------------------------------------------------------------------------------