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.

Warning

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 run_server.py. Tell server to log to file in case of failure:

setup_timestamp_logging()

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):
    shutil.rmtree(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,
                                                 storage_backend,
                                                 working_directory=working_directory)

# Tell the server to start listening for incoming
# estimation requests.
property_server.start_listening_loop()

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

python run_server.py

The server will wait for requests until killed.

Submitting Estimation Requests

Create the file run_client.py 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 = smirnoff.ForceField('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)

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

# Wait for the results synchronously.
results = request.results(True)
logging.info('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)