Getting Started

The propertyestimator currently exists as two key components:

  • a client object which the user can use to request the estimation of data sets of physical properties.

  • a server object which accepts requests from a client and performs the estimations.


These instructions are still a work in progress, and may not run as expected.

Creating an Estimator Server

The PropertyEstimatorServer class creates objects that handle property estimation of all of the properties in a dataset given a set.

Create the file Tell server to log to file in case of failure:


Create directory structure to store intermediary results:

# Set the name of the directory in which all temporary files
# will be generated.
working_directory = 'working_directory'

# Remove any existing data.
if path.isdir(working_directory):

Set up a calculation backend. Different backends will take different optional arguments, but here is an example that will launch a backend with a single worker process:

# Create a calculation backend to perform workflow
# calculations on.
calculation_backend = DaskLocalCluster(1)

Set up storage the storage backend which will cache any generated simulation data:

# Create a backend to handle storing and retrieving
# cached simulation data.
storage_backend = LocalFileStorage()

Start the server running:

# Create a server instance.
property_server = server.PropertyEstimatorServer(calculation_backend,

# Tell the server to start listening for incoming
# estimation requests.

To start the server, call the following command from the command line:


The server will wait for requests until killed.

Submitting Estimation Requests

Create the file Load in the data set of properties to estimate, and the force field parameters to use in the calculations:

# Load in the data set of interest.
data_set = ThermoMLDataSet.from_file(get_data_filename('properties/single_density.xml'))

# Load in the force field to use.
force_field_source = SmirnoffForceFieldSource.from_path('smirnoff99Frosst-1.1.0.offxml')

Create the client object and use it to send the estimation request to the server:

# Create the client object.
property_estimator = client.PropertyEstimatorClient()
# Submit the request to a running server.
result = property_estimator.request_estimate(data_set, force_field_source)

Query the result until all of the properties have either been estimated or have errored:

# Wait for the results synchronously.
results = request.results(True)'The server has returned a response: {}'.format(result))

Save the results to a file:

with open('results.json', 'w') as file:

    json_results = json.dump(results, file, sort_keys=True, indent=2,
                             separators=(',', ': '), cls=TypedJSONEncoder)