The framework implements many individual modular components of simulation workflows such as for building coordinates, for applying force fields parameters, performing bootstrapped analysis of simulation results, and even setting up and running full free energy simulations via Yank and OpenMM ; we refer to these modular components as "protocols". These protocols can be chained together to form a larger workflow. Each individual protocol must define the set of inputs that they require as well as the outputs which they will produce. The protocols may then be chained together at a granular level, whereby individual outputs of a previous protocol may be used as inputs to protocols further along in the workflow, allowing diverse and complex workflows to be constructed from a limited set of simple protocol building blocks (Figure ). A full list of protocols and guidance on combining them to form property estimation workflows is provided in the frameworks documentation . Each protocol which may be used in the workflow engine is defined as a Python object which is completely decoupled from the workflow engine and hence may be used outside of workflows. An example of initializing a protocol which will perform a simulation, and one which will then analyze the output of that simulation is shown in Figure .