Towards a Programming Language for Biology Protocols Bill Thies Joint work with Vaishnavi Ananthanarayanan Microsoft Research India Microsoft Research India Established January, 2005 Seven research areas – – – – – – – Algorithms Cryptography, Security & Applied Math Graphics and Visualization Mobility, Networks, and Systems Multilingual Systems Rigorous Software Engineering Technology for Emerging Markets Contributions to Microsoft: – MultiPoint, Netra, Virtual India Currently ~55 full-time staff, growing Collaborations with government, academia, industry, and NGOs in India http://research.microsoft.com/india Microsoft Research India Sadashivnagar, Bangalore “Technology for Emerging Markets” Research Group Goals Understand potential technology users in developing communities Design and evaluate technology and systems that contribute to socio-economic development of poor communities worldwide Computer-skills camp in Nakalabande, Bangalore (MSR India, Stree Jagruti Samiti, St. Joseph’s College) Collaborate with developmentfocused organizations for sustained, scaled impact Multidisciplinary Research Aishwarya Lakshmi Ratan – Society International Development Public Administration and Jonathan Donner – Communications Nimmi Rangaswamy – Group Social Anthropology Indrani Medhi – Design David Hutchful – Individual Human Computer Interaction Kentaro Toyama (Group Lead) – Computer Science Bill Thies - Technology Innovation Computer science Saurabh Panjwani - Computer science Rikin Gandhi – Astrophysics Sample Projects Microfinance & Technology Microfinance PC + mobile Qualitative studies Business analysis Research only Potential of technology to support microfinance Kelsa+ IT and Microentrepreneurs Microenterprise PC + mobile Mixed-method study Research only Information ecology of very small businesses Simultaneous Shared Access Featherweight Multimedia Information access PC Qualitative study Usage analysis Pilot Primary education PC HCI User studies Software SDK General education Electronics HCI User studies Prelim research Free access PCs for lowincome office staff Multi-user systems for educational Paper and cheap electronics for low-cost multimedia Text-Free UI Warana Unwired Digital Green User interfaces PC Design User studies Guidelines Text-free user interfaces for non-literate users Info systems Mobile Intervention Rural kiosks Pilot Substitution of mobile phones for rural PC kiosks Agriculture Video Intervention Control trials Pilot Video and mediated instruction for agriculture extension Interactive DVDs for Education with Kiran, Gaurav, CLT India, Int’l Digital Children’s Library, Pratham Books, … Can we leverage the advanced features of DVD players to extend the reach of interactive educational materials? 1. PowerPoint Presentations on DVD - TV / DVD is cheap, robust, easy to use - We converted one CLT subject to DVD - CLT liked it, moved all content to DVD - In schools, teachers prefer TV / DVD Computer 2. Books and Encyclopedias on DVD - Developed tool to map 90K pages to DVD - Almost done: 1,000 children’s books on 1 DVD - Next: Wikipedia (Hindi full or English subset) RMB 7 per - Usability studies planned in libraries book TV / DVD RMB 7 per 1,000 books Technology for Tuberculosis Treatment with Michael Paik, Innovators In Health, and Operation Asha Can we utilize lightweight mobile devices to ensure that tuberculosis patients receive and take their medication? Biometrics Smart pillbox Phone Key milestones: - Prototype fingerprint + netbook + SMS system Successful 1-week field trials in Delhi, Sep 2009 - Evaluated accuracy of reporting data over mobiles For low-education health workers, live operator is best Towards a Programming Language for Biology Protocols Bill Thies Joint work with Vaishnavi Ananthanarayanan Microsoft Research India Microfluidic Chips • Idea: a whole biology lab on a single chip – Input/output – Sensors: pH, glucose, temperature, etc. – Actuators: mixing, PCR, electrophoresis, cell lysis, etc. • Benefits: – Small sample volumes – High throughput – Low-cost • Applications: – Biochemistry - Cell biology – Biological computing 1 mm 10x real-time Moore’s Law of Microfluidics: Valve Density Doubles Every 4 Months Source: Fluidigm Corporation (http://www.fluidigm.com/images/mlaw_lg.jpg) Moore’s Law of Microfluidics: Valve Density Doubles Every 4 Months Source: Fluidigm Corporation (http://www.fluidigm.com/didIFC.htm) Current Practice: Manage Gate-Level Details from Design to Operation • For every change in the experiment or the chip design: fabricate chip 1. Manually draw in AutoCAD 2. Operate each gate from LabView Abstraction Layers for Microfluidics Silicon Analog Protocol Description Language - architecture-independent protocol description Fluidic Instruction Set Architecture (ISA) - primitives for I/O, storage, transport, mixing C x86 Pentium III, Pentium IV chip 1 chip 2 chip 3 Fluidic Hardware Primitives - valves, multiplexers, mixers, latches transistors, registers, … Abstraction Layers for Microfluidics Contributions Protocol Description Language - architecture-independent protocol description Fluidic Instruction Set Architecture (ISA) - primitives for I/O, storage, transport, mixing BioStream Language [IWBDA 2009] Optimized Compilation [Natural Computing 2007] Demonstrate Portability [DNA 2006] Micado AutoCAD Plugin chip 1 chip 2 chip 3 Fluidic Hardware Primitives - valves, multiplexers, mixers, latches [MIT 2008, ICCD 2009] Digital Sample Control Using Soft Lithography [Lab on a Chip ‘06] Abstraction Layers for Microfluidics Contributions Protocol Description Language - architecture-independent protocol description Fluidic Instruction Set Architecture (ISA) - primitives for I/O, storage, transport, mixing BioStream Language [IWBDA 2009] Optimized Compilation [Natural Computing 2007] Demonstrate Portability [DNA 2006] Micado AutoCAD Plugin chip 1 chip 2 chip 3 Fluidic Hardware Primitives - valves, multiplexers, mixers, latches [MIT 2008, ICCD 2009] Digital Sample Control Using Soft Lithography [Lab on a Chip ‘06] “Immunological detection ... was carried out as described in the Boehringer digoxigenin-nucleic acid detection kit with some modifications.” Problems with Existing Descriptions of Protocols • Incomplete – Cascading references several levels deep – Some information missing completely • Ambiguous – One word can refer to many things – E.g., “inoculate” a culture • Non-uniform – Different words can refer to the same thing – E.g., “harvest”, “pellet down”, “centrifuge” are equivalent • Not suitable for automation Towards a High-Level Programming Language for Biology Protocols In biology publications, can we replace the textual description of the methods used with a computer program? 1. Enable automation via microfluidic chips 2. Improve reproducibility of manual experiments The BioStream Language • BioStream is a protocol language for reuse & automation – Portable – Volume-independent – Initial focus: molecular biology • Implemented as a C library – Used to express 37 protocols, 3800 lines of code – General backend: emit readable instructions for human – Restricted backend: automatic execution on microfluidic chips • Validation – Used to direct actions of scientists in the lab (IISc) – Used to control microfluidic chips (MIT) – Standardizing online Wiki; interest from Berkeley, UW, UMN… Language Primitives • Declaration / measurement / disposal - declare_fluid - declare_column - measure_sample - measure_fluid - volume - discard - transfer - transfer_column - declare_tissue • Combination / mixing - combine - mix - combine_and_mix - addto_column - mixing_table • Centrifugation - centrifuge_pellet - centrifuge_phases - centrifuge_column • Temperature - set_temp - use_or_store - autoclave • Timing - wait - time_constraint - store_until - inoculation - invert_dry • Detection - ce_detect - gas_chromatography - nanodrop - electrophoresis - mount_observe_slide - sequencing Example: Plasmid DNA Extraction I. Original protocol (Source: Klavins Lab) Add 100 ul of 7X Lysis Buffer (Blue) and mix by inverting the tube 4-6 times. Proceed to step 3 within 2 minutes. II. BioStream code FluidSample f1 = measure_and_add(f0, lysis_buffer, 100*uL); FluidSample f2 = mix(f1, INVERT, 4, 6); time_constraint(f1, 2*MINUTES, next_step); III. Auto-generated text output Add 100 ul of 7X Lysis Buffer (Blue). Invert the tube 4-6 times. NOTE: Proceed to the next step within 2 mins. Example: Plasmid DNA Extraction Auto-Generated Dependence Graph 1. Data Types conceptually infinite volume finite volume Stock Fluid declare_fluid instruction Sample Solid FluidSample measure instruction Can measure symbolic volume which is resolved by compiler / runtime system depending on eventual uses SolidSample other instructions 2. Standardizing Ad-Hoc Language • Need to convert qualitative words to quantitative scale • Example: a common scale for mixing – – – – – When a protocol says “mix”, it could mean many things Level 1: tap Level 2: stir Level 3: invert Level 4: vortex / resuspend / dissolve • Similar issues with temperature, timing, opacity, … 3. Separating Instructions from Hints • How to translate abstract directions? – “Remove the medium by aspiration, leaving the bacterial pellet as dry as possible.” Centrifuge(&medium, ...); hint(pellet_dry) Aspirate and remove medium. Leave the pellet as dry as possible. • Hints provide tutorial or self-check information – Can be ignored if rest of protocol is executed correctly • Separating instructions and hints keeps language tractable – Small number of precise instructions – Extensible set of hints 4. Timing Constraints • Precise timing is critical for many biology protocols – Minimum delay: cell growth, enzyme digest, denaturing, etc. – Maximum delay: avoid precipitation, photobleaching, etc. – Exact delay: regular measurements, synchronized steps, etc. • May require parallel execution – Fluid f1 = mix(…); useBetween(f1, 10, 10); – Fluid f2 = mix(…); useBetween(f2, 10, 10); – Fluid f3 = mix(f1, f2); • Addressed via lazy execution f1 f2 10 10 f3 Benchmark Suite Textbook: Alkaline lysis with SDS - Miniprep Academic lab: 2ab Assembly Protocol CTAB DNA Plant Miniprep Ligation Protein insitu localization Restriction digestion DNA Miniprep Non- radioactive in-situ hybridization Plant RNA isolation Transformation 87 133 408 46 120 48 93 163 97 56 Published paper: Splinkerette PCR Touchdown PCR Molecular barcodes SIRT1 Redistribution Transcriptional instability 143 40 145 180 142 Commercial kit: Allprep RNA Protein protocol Plasmid purification DNA Sequencing 150 125 110 OpenWetWare: Miniprep/GET Buffer DNA Extraction - Salting Out Endy: Colony PCR Engineering BioBricks - Restriction Digest Engineering BioBricks - Colony PCR Ethanol precipitation of small DNA fragments Filamentous fungi genomic DNA isolation Knight: Colony PCR Maxiprep Miniprep/Kit-free high-throughput Miniprep/Qiagen kit One-step Miniprep Silver: Restriction Digest Yeast DNA prep DNA Precipitation DNA extraction from tissue Chromosomal DNA extraction from E.coli Blackburn : Yeast Colony PCR PNK Treatment of DNA ends 121 93 61 40 47 52 119 53 168 75 84 62 78 75 68 108 87 90 36 37 protocols 3800 LOC Example: PCR repeat thermocycling Example: Molecular Barcodes Preparation + PCR (2) Example: DNA Sequencing Preparation PCR PCR PCR PCR Analysis Exposing Ambiguity in Original Protocols ? 3. Add 1.5 vol. CTAB to each MCT and vortex. Incubate at 65° C for 10-30 mins 4. Add 1 vol. Phenol:chloroform:isoamylalcohol: 48:48:4 and vortex thoroughly 5. Centrifuge at 13000g at room temperature for 5 mins 6. Transfer aqueous (upper) layer to clean MCT and repeat the extraction using chloroform: Isoamyalcohol: 96:4 Coding protocols in precise language removes ambiguity and enables consistency checking Validating the Language • Eventual validation: automatic execution – But BioStream more capable than most chips today – Need to decouple language research from microfluidics research • Initial validation: human execution – In collaboration with Prof. Utpal Nath’s lab at IISc – Target Plant DNA Isolation, common task for summer intern Original Lab Notes BioStream Code Auto-Generated Protocol Execution in Lab Biologist is never exposed to original lab notes • To the best of our knowledge, first execution of a real biology protocol from a portable programming language Growing a Community Growing a Community Growing a Community Abstraction Layers for Microfluidics Protocol Description Language - architecture-independent protocol description Fluidic Instruction Set Architecture (ISA) - primitives for I/O, storage, transport, mixing chip 1 chip 2 chip 3 Fluidic Hardware Primitives - valves, multiplexers, mixers, latches Example: Mix Instruction • Microfluidic chips have various mixing technologies – Electrokinetic mixing [Levitan et al.] – Droplet mixing [Fair et al.] – Rotary mixing [Quake et al.] • Common attributes: – Ability to mix two samples in equal proportions, store result • Fluidic ISA: mix (int src1, int src2, int dst) – Ex: mix(1, 2, 3) Storage Cells 1 2 3 4 Mixer – To allow for lossy transport, only 1 unit of mixture retained Implementation: Oil-Driven Chip Inputs Storage Cells Background Phase Wash Phase Chip 1 2 8 Oil — Mixing Rotary Implementation: Oil-Driven Chip mix (S1, S2, D) { 1. Load S1 2. Load S2 3. Rotary mixing 4. Store into D } 50x real-time Inputs Storage Cells Background Phase Wash Phase Chip 1 2 8 Oil — Mixing Rotary Implementation 2: Air-Driven Chip Inputs Storage Cells Background Phase Wash Phase Mixing Chip 1 2 8 Oil — Rotary Chip 2 4 32 Air Water In channels Implementation 2: Air-Driven Chip mix (S1, S2, D) { 1. Load S1 2. Load S2 3. Mix / Store into D 4. Wash S1 5. Wash S2 } 50x real-time Inputs Storage Cells Background Phase Wash Phase Mixing Chip 1 2 8 Oil — Rotary Chip 2 4 32 Air Water In channels Demonstration: Gradient Generation Fluid yellow = input (0); Fluid blue = input(1); for (int i=0; i<=4; i++) { mix(yellow, 1-i/4, blue, i/4); } Hidden from programmer: – – – – Location of fluids Details of mixing, I/O Logic of valve control Timing of chip operations 450 Valve Operations Demonstration: Gradient Generation Fluidic ISA input(0, 0); input(1, 1); input(0, 2); mix(1, 2, 3); input(0, 2); mix(2, 3, 1); input(1, 3); input(0, 4); mix(3, 4, 2); input(1, 3); input(0, 4); mix(3, 4, 5); input(1, 4); mix(4, 5, 3); mix(0, 4); 450 Valve Operations Demonstration: Gradient Generation Valve Actuations setValve(0, HIGH); setValve(1, HIGH); wait(2000); setValve(0, HIGH); setValve(1, HIGH); wait(2000); setValve(0, HIGH); setValve(1, HIGH); wait(2000); setValve(0, HIGH); setValve(1, HIGH); wait(2000); setValve(2, LOW); setValve(3, HIGH); setValve(0, HIGH); setValve(1, HIGH); setValve(14, HIGH); setValve(2, LOW); wait(2000); setValve(2, LOW); setValve(3, HIGH); setValve(0, HIGH); setValve(1, HIGH); setValve(14, HIGH); setValve(2, LOW); wait(2000); setValve(2, LOW); setValve(3, HIGH); setValve(0, HIGH); setValve(1, HIGH); setValve(14, HIGH); setValve(2, LOW); wait(2000); setValve(2, LOW); setValve(3, HIGH); setValve(0, HIGH); setValve(1, HIGH); setValve(14, HIGH); setValve(2, LOW); wait(2000); setValve(4, LOW); setValve(5, LOW); setValve(2, LOW); setValve(3, HIGH); wait(1000); setValve(14, HIGH); setValve(2, LOW); setValve(4, LOW); setValve(5, LOW); setValve(2, LOW); setValve(3, HIGH); wait(1000); setValve(14, HIGH); setValve(2, LOW); setValve(4, LOW); setValve(5, LOW); setValve(2, LOW); setValve(3, HIGH); wait(1000); setValve(14, HIGH); setValve(2, LOW); setValve(4, LOW); setValve(5, LOW); setValve(2, LOW); setValve(3, HIGH); wait(1000); setValve(14, HIGH); setValve(2, LOW); setValve(6, HIGH); setValve(7, LOW); setValve(4, LOW); setValve(5, LOW); setValve(4, HIGH); setValve(12, LOW); wait(1000); setValve(6, HIGH); setValve(7, LOW); setValve(4, LOW); setValve(5, LOW); setValve(4, HIGH); setValve(12, LOW); wait(1000); setValve(6, HIGH); setValve(7, LOW); setValve(4, LOW); setValve(5, LOW); setValve(4, HIGH); setValve(12, LOW); wait(1000); setValve(6, HIGH); setValve(7, LOW); setValve(4, LOW); setValve(5, LOW); setValve(4, HIGH); setValve(12, LOW); wait(1000); setValve(8, LOW); setValve(9, HIGH); setValve(6, HIGH); setValve(7, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(4, HIGH); setValve(12, LOW); setValve(8, LOW); setValve(9, HIGH); setValve(6, HIGH); setValve(7, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(4, HIGH); setValve(12, LOW); setValve(8, LOW); setValve(9, HIGH); setValve(6, HIGH); setValve(7, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(4, HIGH); setValve(12, LOW); setValve(8, LOW); setValve(9, HIGH); setValve(6, HIGH); setValve(7, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(4, HIGH); setValve(12, LOW); setValve(10, LOW); setValve(11, HIGH); setValve(8, LOW); setValve(9, HIGH); setValve(19, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(10, LOW); setValve(11, HIGH); setValve(8, LOW); setValve(9, HIGH); setValve(19, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(10, LOW); setValve(11, HIGH); setValve(8, LOW); setValve(9, HIGH); setValve(19, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(10, LOW); setValve(11, HIGH); setValve(8, LOW); setValve(9, HIGH); setValve(19, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(12, LOW); setValve(13, HIGH); setValve(10, LOW); setValve(11, HIGH); wait(2000); setValve(19, LOW); setValve(12, LOW); setValve(13, HIGH); setValve(10, LOW); setValve(11, HIGH); wait(2000); setValve(19, LOW); setValve(12, LOW); setValve(13, HIGH); setValve(10, LOW); setValve(11, HIGH); wait(2000); setValve(19, LOW); setValve(12, LOW); setValve(13, HIGH); setValve(10, LOW); setValve(11, HIGH); wait(2000); setValve(19, LOW); setValve(14, LOW); setValve(15, HIGH); setValve(12, LOW); setValve(13, HIGH); setValve(0, LOW); setValve(1, LOW); wait(2000); setValve(14, LOW); setValve(15, HIGH); setValve(12, LOW); setValve(13, HIGH); setValve(0, LOW); setValve(1, LOW); wait(2000); setValve(14, LOW); setValve(15, HIGH); setValve(12, LOW); setValve(13, HIGH); setValve(0, LOW); setValve(1, LOW); wait(2000); setValve(14, LOW); setValve(15, HIGH); setValve(12, LOW); setValve(13, HIGH); setValve(0, LOW); setValve(1, LOW); wait(2000); setValve(16, LOW); setValve(17, LOW); setValve(14, LOW); setValve(15, HIGH); setValve(2, LOW); setValve(3, HIGH); setValve(0, LOW); setValve(1, LOW); setValve(16, LOW); setValve(17, LOW); setValve(14, LOW); setValve(15, HIGH); setValve(2, LOW); setValve(3, HIGH); setValve(0, LOW); setValve(1, LOW); setValve(16, LOW); setValve(17, LOW); setValve(14, LOW); setValve(15, HIGH); setValve(2, LOW); setValve(3, HIGH); setValve(0, LOW); setValve(1, LOW); setValve(16, LOW); setValve(17, LOW); setValve(14, LOW); setValve(15, HIGH); setValve(2, LOW); setValve(3, HIGH); setValve(0, LOW); setValve(1, LOW); setValve(18, LOW); setValve(19, LOW); setValve(16, LOW); setValve(17, LOW); setValve(4, LOW); setValve(5, HIGH); setValve(2, LOW); setValve(3, HIGH); setValve(18, LOW); setValve(19, LOW); setValve(16, LOW); setValve(17, LOW); setValve(4, LOW); setValve(5, HIGH); setValve(2, LOW); setValve(3, HIGH); setValve(18, LOW); setValve(19, LOW); setValve(16, LOW); setValve(17, LOW); setValve(4, LOW); setValve(5, HIGH); setValve(2, LOW); setValve(3, HIGH); setValve(18, LOW); setValve(19, LOW); setValve(16, LOW); setValve(17, LOW); setValve(4, LOW); setValve(5, HIGH); setValve(2, LOW); setValve(3, HIGH); wait(2000); setValve(18, LOW); setValve(19, LOW); setValve(6, HIGH); setValve(7, LOW); setValve(4, LOW); setValve(5, HIGH); wait(2000); setValve(18, LOW); setValve(19, LOW); setValve(6, HIGH); setValve(7, LOW); setValve(4, LOW); setValve(5, HIGH); wait(2000); setValve(18, LOW); setValve(19, LOW); setValve(6, HIGH); setValve(7, LOW); setValve(4, LOW); setValve(5, HIGH); wait(2000); setValve(18, LOW); setValve(19, LOW); setValve(6, HIGH); setValve(7, LOW); setValve(4, LOW); setValve(5, HIGH); setValve(14, HIGH); setValve(2, LOW); wait(2000); setValve(8, LOW); setValve(9, HIGH); setValve(6, HIGH); setValve(7, LOW); setValve(14, HIGH); setValve(2, LOW); wait(2000); setValve(8, LOW); setValve(9, HIGH); setValve(6, HIGH); setValve(7, LOW); setValve(14, HIGH); setValve(2, LOW); wait(2000); setValve(8, LOW); setValve(9, HIGH); setValve(6, HIGH); setValve(7, LOW); setValve(14, HIGH); setValve(2, LOW); wait(2000); setValve(8, LOW); setValve(9, HIGH); setValve(6, HIGH); setValve(7, LOW); wait(1000); setValve(14, HIGH); setValve(2, LOW); setValve(10, HIGH); setValve(11, LOW); setValve(8, LOW); setValve(9, HIGH); wait(1000); setValve(14, HIGH); setValve(2, LOW); setValve(10, HIGH); setValve(11, LOW); setValve(8, LOW); setValve(9, HIGH); wait(1000); setValve(14, HIGH); setValve(2, LOW); setValve(10, HIGH); setValve(11, LOW); setValve(8, LOW); setValve(9, HIGH); wait(1000); setValve(14, HIGH); setValve(2, LOW); setValve(10, HIGH); setValve(11, LOW); setValve(8, LOW); setValve(9, HIGH); setValve(4, HIGH); setValve(12, LOW); wait(1000); setValve(12, LOW); setValve(13, LOW); setValve(10, HIGH); setValve(11, LOW); setValve(4, HIGH); setValve(12, LOW); wait(1000); setValve(12, LOW); setValve(13, LOW); setValve(10, HIGH); setValve(11, LOW); setValve(4, HIGH); setValve(12, LOW); wait(1000); setValve(12, LOW); setValve(13, LOW); setValve(10, HIGH); setValve(11, LOW); setValve(4, HIGH); setValve(12, LOW); wait(1000); setValve(12, LOW); setValve(13, LOW); setValve(10, HIGH); setValve(11, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(4, HIGH); setValve(12, LOW); setValve(14, LOW); setValve(15, HIGH); setValve(12, LOW); setValve(13, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(4, HIGH); setValve(12, LOW); setValve(14, LOW); setValve(15, HIGH); setValve(12, LOW); setValve(13, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(4, HIGH); setValve(12, LOW); setValve(14, LOW); setValve(15, HIGH); setValve(12, LOW); setValve(13, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(4, HIGH); setValve(12, LOW); setValve(14, LOW); setValve(15, HIGH); setValve(12, LOW); setValve(13, LOW); setValve(19, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(16, HIGH); setValve(17, LOW); setValve(14, LOW); setValve(15, HIGH); setValve(19, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(16, HIGH); setValve(17, LOW); setValve(14, LOW); setValve(15, HIGH); setValve(19, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(16, HIGH); setValve(17, LOW); setValve(14, LOW); setValve(15, HIGH); setValve(19, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(16, HIGH); setValve(17, LOW); setValve(14, LOW); setValve(15, HIGH); wait(2000); setValve(19, LOW); setValve(18, HIGH); setValve(19, LOW); setValve(16, HIGH); setValve(17, LOW); wait(2000); setValve(19, LOW); setValve(18, HIGH); setValve(19, LOW); setValve(16, HIGH); setValve(17, LOW); wait(2000); setValve(19, LOW); setValve(18, HIGH); setValve(19, LOW); setValve(16, HIGH); setValve(17, LOW); wait(2000); setValve(19, LOW); setValve(18, HIGH); setValve(19, LOW); setValve(16, HIGH); setValve(17, LOW); wait(2000); setValve(18, HIGH); setValve(19, LOW); wait(2000); setValve(18, HIGH); setValve(19, LOW); wait(2000); setValve(18, HIGH); setValve(19, LOW); wait(2000); setValve(18, HIGH); setValve(19, LOW); 450 Valve Operations Abstraction Layers for Microfluidics Protocol Description Language - architecture-independent protocol description Fluidic Instruction Set Architecture (ISA) - primitives for I/O, storage, transport, mixing chip 1 chip 2 chip 3 Fluidic Hardware Primitives - valves, multiplexers, mixers, latches Algorithms for Efficient Mixing • Mixing is fundamental operation of microfluidics – – – – Prepare samples for analysis Dilute concentrated substances Control reagant volumes Analogous to ALU operations on microprocessors • How to synthesize complex mixture using simple steps? – Many systems support only 50/50 mixers – Should minimize number of mixes, reagent usage – Note: some mixtures only reachable within error tolerance Interesting scheduling and optimization problem • N Why Not Binary Search? 0 3/8 1 1/2 1/4 3/8 1/2 5 inputs, 4 mixes Why Not Binary Search? 0 3/8 1 1/2 3/4 3/8 4 inputs, 3 mixes 1/2 1/4 3/8 1/2 5 inputs, 4 mixes Min-Mix Algorithm • Simple algorithm yields minimal number of mixes – For any number of reagents, to any reachable concentration – Also minimizes reagent usage on certain chips Min-Mix Algorithm: Key Insights 1. The mixing process can be represented by a tree. A B B A 5/8 A, 3/8 B Min-Mix Algorithm: Key Insights 1. The mixing process can be represented by a tree. d 2-d 3 1/8 2 1/4 1 1/2 A B B A 5/8 A, 3/8 B 2. The contribution of an input sample to the overall mixture is 2-d, where d is the depth of the sample in the tree Min-Mix Algorithm: Key Insights 1. The mixing process can be represented by a tree. d 2-d 3 1/8 1 2 1/4 0 1 1/2 1 A A 5 = 101 B 1 B 1 0 3 = 011 5/8 A, 3/8 B 2. The contribution of an input sample to the overall mixture is 2-d, where d is the depth of the sample in the tree 3. In the optimal mixing tree, a reagent appears at depths corresponding to the binary representation of its overall concentration. Min-Mix Algorithm • Example: mix 5/16 A, 7/16 B, 4/16 C d 2-d 4 1/16 3 1/8 2 1/4 1 1/2 A B A B A A=5 =0101 B B=7 =0111 B B C A B C C=4 =0100 • To mix k fluids with precision 1/n: – Min-mix algorithm: O(k log n) mixes – Binary search: O(k n) mixes [Natural Computing 2007] Abstraction Layers for Microfluidics Protocol Description Language - architecture-independent protocol description Fluidic Instruction Set Architecture (ISA) - primitives for I/O, storage, transport, mixing chip 1 chip 2 chip 3 Fluidic Hardware Primitives - valves, multiplexers, mixers, latches Micado: An AutoCAD Plugin for Microfluidic Chips • Automates design of control layer of microfluidic chips 1. 2. 3. 4. 5. Language for fluidic ISA Infer control valves Infer control sharing Route valves to control ports Generate an interactive GUI • Realistic use by at least 3 microfluidic researchers • Freely available at: http://groups.csail.mit.edu/cag/micado/ Embryonic Cell Culture Courtesy J.P. Urbanski Embryonic Cell Culture Courtesy J.P. Urbanski Metabolite Detector Courtesy J.P. Urbanski Metabolite Detector Courtesy J.P. Urbanski Cell Culture with Waveform Generator Courtesy David Craig Cell Culture with Waveform Generator Courtesy David Craig Research Opportunities • Adapt the language to biologists – Consider ‘natural language’ authoring rather than programming – Share language and protocols on a public wiki • Backends for BioStream – Generate graphical protocol – Schedule separate protocols onto shared hardware, maximizing utilization of shared resource (e.g., thermocycler) • Hardware description language for microfluidic chips – Automate design of the flow layer from a problem description • Program analysis and optimization – Adapt unique (linear) types for microfluidics – Sound scheduling under timing constraints – Dynamic optimization of slow co-processors (lazy vectorization?) Related Work • EXACT: EXperimental ACTions ontology as a formal representation for biology protocols [Soldatova et al., 2009] • Aquacore: ISA and architecture for programmable microfluidics, builds on our prior work [Amin et al., 2007] • Robot Scientist: functional genomics driven by macroscopic laboratory automation [King et al., 2004] • PoBol: RDF-based data exchange standard for BioBricks Conclusions • A high-level programming language for biology protocols is tractable and useful – Improves readability – Enables automation • Vision: a de-facto language for experimental science – Replace ad-hoc language with precise, reusable description – Download a colleague’s code, automatically map to your microfluidic chip or lab setup • Next steps: public release and community-building Courtesy J.P. Urbanski Extra Slides Application to Rural Diagnostics Disposable Enteric Card PATH, Washington U. Micronics, Inc., U. Washington Targets: - E. coli, Shigella, Salmonella, C. jejuni DxBox CARD U. Washington, Micronics, Inc., Nanogen, Inc. Rheonix, Inc. Targets: - malaria (done) - dengue, influenza, Rickettsial diseases, typhoid, measles (under development) Targets: - HPV diagnosis - Detection of specific gene sequences