This repository contains the code associated with the experiments described in the publication: An Ecosystem for Realizing Underreported Silver Nanoparticle Synthesis Variables. These include libraries for interacting with Unchained Labs' Big Kahuna and Stunner lab automation machines as well as scripts to template, define, and run synthesis and characterization experiments on these machines.
This code depends on the Library Studio and Automation Studio APIs by Unchained Labs. Contact them for access and instructions for installing.
designmanager
depends on the Library Studio API. Copy its Libs
and SDK
directories into this repository's root directory
asmanager
depends on the Automation Studio API/SiLA Client. From the sample SiLA client project provided by Unchained Labs, copy these directories/files into the asmanager
directory:
AutomationStudio/
AutomationStudioRemote/
Dependencies/
ExperimentService/
ExperimentStatusService/
Properties/
RunService/
ViewModels/
ConsoleLogging.cs
ServerDiscovery.cs
ServerInfo.cs
- Clone this repo
git clone https://github.com/sandialabs/np_synthesis_automation.git
- Use the provided conda environment definition
environment.yml
to build the conda environment:
conda env create -f environment.yml
-
Open
designmanager/DesignManager.sln
and build the solution. -
Open
asmanager/SiLAClient.sln
and build the solution. -
Create a
dependencies.yaml
file in theexecution
directory. Populate it with the paths to the built executables:
designmanager: <PATH TO DesignManager.exe (step 3)>
silaclient: <PATH TO SiLAClient.dll (step 4)>
The following instructions describe how to generate an experiment definition from a template, save it to the database, and run it on the Big Kahuna. For more details, refer to the file details
- Ensure the experiment directory has the necessary files
- Define experiment in
design_template.yaml
- Define changing variables in
input.csv
- To create multiple designs from a single template, insert a type: split_design map in the maps to indicate where the previous design should end and a new one should begin
- Automation studio may require a well plate to have a vial with a non-zero volume before it can be drawn from. To work around this, define a dispense step into the plate and add Dummy to the list of that dispense step’s tags
- Define experiment in
- Generate input deck
- Run
python model_execution.py --design --exp_dir <PATH TO EXPERIMENT DIRECTORY> --campaign_dir <PATH TO CAMPAIGN DIRECTORY>
- An optional
--shuffle
flag can be provided to shuffle the input rows - Ensure an
exp_input.csv
file is created, which tracks how input rows line up with stunner output rows - If the design template has no splits, this will generate a
design_input.yaml
in the specified experiment directory. Otherwise, it will generate adesign_input_##.yaml
for each separate design - For notes on running the model_execution script, you can run
python model_execution.py --help
- Run
- Parse input deck to generate design in database
- Run
python model_execution.py --generate --exp_dir <PATH TO EXPERIMENT DIRECTORY> --campaign_dir <PATH TO CAMPAIGN DIRECTORY>
- By default, this expects a file in the experiment directory called
design_input.yaml
- Use the
--design_input
flag to specify the design input file to use (eg.design_input_00.yaml
if the template were split) instead of the default - This will generate an
<EXPERIMENT NAME>_<DATABASE ID>.lsr
,<EXPERIMENT NAME>_<DATABASE ID>_cm.xml
, and<EXPERIMENT NAME>_<DATABASE ID>_prompts.xml
file in the experiment directory
- Run
- Execute BK experiment
- Make sure Automation Studio is closed.
- Run
python model_execution.py --run --exp_dir <PATH TO EXPERIMENT DIRECTORY> --campaign_dir <PATH TO CAMPAIGN DIRECTORY> --design_id <id 1, …>
- One or more design ids can be specified to run in sequence, but this expects a
.lsr
,_cm.xml
, and_prompts.xml
file for each specified id. - Once the run is started, the status will be monitored and printed to console. This process can be killed with ctrl+c. This will not abort the run. To abort, manually do so in Automation Studio.
design_template.yaml
: Defines the template for the experiment design. See designmanager/test_input.yaml
for a sample of possible maps to execute. Templated maps are marked by s1, s2, ... s#
rather than numerical values, indicating that the corresponding row and column from the input.csv
will be used to populate the field.
input.csv
: Defines values for the parameters to populate the design template to create a completed experiment definition. This consists of columns that define dispense volums for relevant chemicals or stunner analysis parameters. Each row represents a single unique sample.
An example of both files can be found in examples/split_design
. This example can be used to generate and run an experiment using the usage instructions.
Data used in the publication is in data
. For more information see our paper.
Reaction inputs and measured resulting properties for 1700+ silver nanoparticle syntheses. Measured properties include Dynamic Light Scattering (DLS) characterized particle sizes and distributions, and UV-Visible Absorption Spectroscopy (UV-VIS) characterized solution absorbance spectra.
Subdirectory: location of the original data file
Glycolic acid concentration (mM): the starting concentration of the precursor stock solution (not the concentration of the precursor in the reaction solution)
Reductant: NaBH4 = sodium borohydride; TSC = trisodium citrate; N2H4 = hydrazine monohydrate
Order of operations permutation: the order of precursor addition for silver nanoparticle synthesis (described in Table 1 of the main manuscript)
Glycolic acid solution volume (mL): the volume of precursor used in silver nanoparticle synthesis
stunner_sample_type: designates each entry as either “S” (sample) or “B” (blank)
sample_name: unique sample identifier
sample_position: sample location on the 4×6 substrate used to hold the silver nanoparticle samples prepared with the Big Kahuna
stunner_position: the corresponding location of each silver nanoparticle sample in the Stunner microfluidic well plate
# peaks: the total number of peaks observed in the DLS spectrum
Intercept: the intercept of the correlation function obtained during DLS aquisition
Z Ave. Dia (nm): (Z-average diameter) the intensity-weighted average particle size calculated using the cumulants method
PdI: (polydispersity index) indicates the heterogeneity or broadness of a particle size distribution.
SD Dia (nm): the standard deviation of the DLS particle size distribution
Diffusion coefficient (um^2/s): calculated from the scattering intensity as a function of time using the Stokes-Einstein equation
Peak of Interest: the “primary” peak in the DLS spectrum as determined by the molecular weight of the analyte
Mean Dia (nm): the average particle diameter of all values recorded
Mode Dia (nm): the particle diameter most frequently recorded
Est. MW (kDa): the estimated molecular weight of the nanoparticle species
Intensity (%): the percentage of the total scattered light intensity of the sample
Mass (%): the percentage of the total mass distribution of the sample
Derived intensity (cps): the intensity of scattered light associated with different populations of particles or molecules within a sample, derived from the raw DLS signal.
Rayleigh ratio R (cm^-1): measure of light scattering intensity (the ratio of scattered light intensity to incident light intensity)
Temperature (°C): the temperature recorded by the Stunner at the time of DLS or UV-Vis measurement
Number of acquisitions used: the number of DLS scans used to provide the final dataset
A280 (10mm): the blank-corrected absorbance at 280 nm with a nominal path length of 10 mm
Reductant age (days): the age of the reductant solution at the time of silver nanoparticle synthesis
Temperature (degrees C): the temperature inside of the Big Kahuna at the time of silver nanoparticle synthesis
Outputs include two distinct data types: scalar features extracted from DLS-based characterization of nanoparticle sizes and distributions, and UV-VIS absorption spectra from 280nm – 700nm.
TODO: put up a bibtex or something after publication