700 likes | 900 Views
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
E N D
Towards a Programming Language for Biology ProtocolsBill ThiesJoint work with Vaishnavi AnanthanarayananMicrosoft 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 Microsoft Research India Sadashivnagar, Bangalore http://research.microsoft.com/india
“Technology for Emerging Markets” Understand potential technology users in developing communities Design and evaluate technology and systems that contribute to socio-economic development of poor communities worldwide Collaborate with development-focused organizations for sustained, scaled impact Research Group Goals Computer-skills camp in Nakalabande, Bangalore (MSR India, Stree Jagruti Samiti, St. Joseph’s College)
Aishwarya Lakshmi Ratan – International Development Public Administration and Jonathan Donner – Communications Nimmi Rangaswamy – Social Anthropology Indrani Medhi – Design Kentaro Toyama (Group Lead) Computer Science – David Hutchful – Human Computer Interaction Rikin Gandhi – Astrophysics Multidisciplinary Research Society Society Group Group Impact Impact Understanding Understanding Individual Individual Bill Thies - Computer science Saurabh Panjwani - Computer science Technology Technology Innovation Innovation
Microfinance & Technology IT and Microentrepreneurs Sample Projects Microfinance PC + mobile Qualitative studies Business analysis Research only Microenterprise PC + mobile Mixed-method study Research only Information ecology of very small businesses Potential of technology to support microfinance Kelsa+ 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 low-income office staff Multi-user systems for educational Paper and cheap electronics for low-cost multimedia Text-Free UI Warana Unwired Digital Green Info systems Mobile Intervention Rural kiosks Pilot AgricultureVideo Intervention Control trials Pilot User interfaces PC Design User studies Guidelines Substitution of mobile phones for rural PC kiosks Video and mediated instruction for agriculture extension Text-free user interfaces for non-literate users
Interactive DVDs for Education with Kiran, Gaurav, CLT India, Int’l Digital Children’s Library, Pratham Books, … 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 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) - Usability studies planned in libraries Can we leverage the advanced features of DVD players to extend the reach of interactive educational materials? Computer TV / DVD RMB 7 per 1,000 books RMB 7 per book
Technology for Tuberculosis Treatment with Michael Paik, Innovators In Health, and Operation Asha 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 Can we utilize lightweight mobile devices to ensure that tuberculosis patients receive and take their medication? Biometrics Smart pillbox Phone
Towards a Programming Language for Biology ProtocolsBill ThiesJoint work with Vaishnavi AnanthanarayananMicrosoft 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 10x real-time 1 mm
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 2. Operate each gate from LabView 1. Manually draw in AutoCAD
Abstraction Layers for Microfluidics Silicon Analog Protocol Description Language - architecture-independent protocol description C Fluidic Instruction Set Architecture (ISA) - primitives for I/O, storage, transport, mixing x86 Pentium III,Pentium IV chip 1 chip 2 chip 3 transistors, registers, … Fluidic Hardware Primitives - valves, multiplexers, mixers, latches
Abstraction Layers for Microfluidics Contributions Protocol Description Language - architecture-independent protocol description BioStream Language [IWBDA 2009] Optimized Compilation [Natural Computing 2007] Fluidic Instruction Set Architecture (ISA) - primitives for I/O, storage, transport, mixing Demonstrate Portability [DNA 2006] Micado AutoCAD Plugin [MIT 2008, ICCD 2009] chip 1 chip 2 chip 3 Digital Sample Control Using Soft Lithography [Lab on a Chip ‘06] Fluidic Hardware Primitives - valves, multiplexers, mixers, latches
Abstraction Layers for Microfluidics Contributions Protocol Description Language - architecture-independent protocol description BioStream Language [IWBDA 2009] Optimized Compilation [Natural Computing 2007] Fluidic Instruction Set Architecture (ISA) - primitives for I/O, storage, transport, mixing Demonstrate Portability [DNA 2006] Micado AutoCAD Plugin [MIT 2008, ICCD 2009] chip 1 chip 2 chip 3 Digital Sample Control Using Soft Lithography [Lab on a Chip ‘06] Fluidic Hardware Primitives - valves, multiplexers, mixers, latches
“Immunological detection ... was carried out as described in the Boehringerdigoxigenin-nucleic acid detection kit with some modifications.”
Problems with ExistingDescriptions 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 ulof 7X Lysis Buffer (Blue) and mix by inverting the tube 4-6 times. Proceed to step 3 within 2 minutes. II. BioStreamcode 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 ulof 7X Lysis Buffer (Blue). Invert the tube 4-6 times. NOTE: Proceed to the next step within 2 mins.
Example: Plasmid DNA Extraction Auto-GeneratedDependence Graph
1. Data Types finite volume conceptually infinite volume Stock Sample FluidSample Solid Fluid SolidSample other instructions measure instruction declare_fluidinstruction Can measure symbolic volume which is resolved by compiler / runtime system depending on eventual uses
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.” • 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 Centrifuge(&medium, ...); hint(pellet_dry) Aspirate and remove medium. Leave the pellet as dry as possible.
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 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 • Add 1.5 vol. CTAB to each MCT and vortex. Incubate at 65° C for 10-30 mins • Add 1 vol. Phenol:chloroform:isoamylalcohol: 48:48:4 and vortex thoroughly • Centrifuge at 13000g at room temperature for 5 mins • Transfer aqueous (upper) layer to clean MCT and repeat the extraction using chloroform: Isoamyalcohol: 96:4 ? • Coding protocols in precise language removes ambiguityand 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. UtpalNath’s lab at IISc • Target Plant DNA Isolation, common task for summer intern 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 Original Lab Notes BioStream Code Auto-Generated Protocol Executionin Lab
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 • Droplet mixing • Rotary mixing • 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) • To allow for lossy transport, only 1 unit of mixture retained • [Levitan et al.] • [Fair et al.] • [Quake et al.]
Implementation: Oil-Driven Chip mix (S1, S2, D) { 1. Load S1 2. Load S2 3. Rotary mixing 4. Store into D } 50x real-time
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
Demonstration: Gradient Generation Hidden from programmer: • Location of fluids • Details of mixing, I/O • Logic of valve control • Timing of chip operations Fluid yellow = input (0); Fluid blue = input(1); for (inti=0; i<=4; i++) { mix(yellow, 1-i/4, blue, i/4); } 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 • ValveActuations setValve(0, HIGH); setValve(1, HIGH); setValve(2, LOW); setValve(3, HIGH); setValve(4, LOW); setValve(5, LOW); setValve(6, HIGH); setValve(7, LOW); setValve(8, LOW); setValve(9, HIGH); setValve(10, LOW); setValve(11, HIGH); setValve(12, LOW); setValve(13, HIGH); setValve(14, LOW); setValve(15, HIGH); setValve(16, LOW); setValve(17, LOW); setValve(18, LOW); setValve(19, LOW); wait(2000); setValve(14, HIGH); setValve(2, LOW); wait(1000); setValve(4, HIGH); setValve(12, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(19, LOW); wait(2000); wait(2000); setValve(14, HIGH); setValve(2, LOW); wait(1000); setValve(4, HIGH); setValve(12, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(19, LOW); wait(2000); setValve(0, LOW); setValve(1, LOW); setValve(2, LOW); setValve(3, HIGH); setValve(4, LOW); setValve(5, HIGH); setValve(6, HIGH); setValve(7, LOW); setValve(8, LOW); setValve(9, HIGH); setValve(10, HIGH); setValve(11, LOW); setValve(12, LOW); setValve(13, LOW); setValve(14, LOW); setValve(15, HIGH); setValve(16, HIGH); setValve(17, LOW); setValve(18, HIGH); setValve(19, LOW); setValve(0, HIGH); setValve(1, HIGH); setValve(2, LOW); setValve(3, HIGH); setValve(4, LOW); setValve(5, LOW); setValve(6, HIGH); setValve(7, LOW); setValve(8, LOW); setValve(9, HIGH); setValve(10, LOW); setValve(11, HIGH); setValve(12, LOW); setValve(13, HIGH); setValve(14, LOW); setValve(15, HIGH); setValve(16, LOW); setValve(17, LOW); setValve(18, LOW); setValve(19, LOW); wait(2000); setValve(14, HIGH); setValve(2, LOW); wait(1000); setValve(4, HIGH); setValve(12, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(19, LOW); wait(2000); wait(2000); setValve(14, HIGH); setValve(2, LOW); wait(1000); setValve(4, HIGH); setValve(12, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(19, LOW); wait(2000); setValve(0, LOW); setValve(1, LOW); setValve(2, LOW); setValve(3, HIGH); setValve(4, LOW); setValve(5, HIGH); setValve(6, HIGH); setValve(7, LOW); setValve(8, LOW); setValve(9, HIGH); setValve(10, HIGH); setValve(11, LOW); setValve(12, LOW); setValve(13, LOW); setValve(14, LOW); setValve(15, HIGH); setValve(16, HIGH); setValve(17, LOW); setValve(18, HIGH); setValve(19, LOW); setValve(0, HIGH); setValve(1, HIGH); setValve(2, LOW); setValve(3, HIGH); setValve(4, LOW); setValve(5, LOW); setValve(6, HIGH); setValve(7, LOW); setValve(8, LOW); setValve(9, HIGH); setValve(10, LOW); setValve(11, HIGH); setValve(12, LOW); setValve(13, HIGH); setValve(14, LOW); setValve(15, HIGH); setValve(16, LOW); setValve(17, LOW); setValve(18, LOW); setValve(19, LOW); wait(2000); setValve(14, HIGH); setValve(2, LOW); wait(1000); setValve(4, HIGH); setValve(12, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(19, LOW); wait(2000); wait(2000); setValve(14, HIGH); setValve(2, LOW); wait(1000); setValve(4, HIGH); setValve(12, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(19, LOW); wait(2000); setValve(0, LOW); setValve(1, LOW); setValve(2, LOW); setValve(3, HIGH); setValve(4, LOW); setValve(5, HIGH); setValve(6, HIGH); setValve(7, LOW); setValve(8, LOW); setValve(9, HIGH); setValve(10, HIGH); setValve(11, LOW); setValve(12, LOW); setValve(13, LOW); setValve(14, LOW); setValve(15, HIGH); setValve(16, HIGH); setValve(17, LOW); setValve(18, HIGH); setValve(19, LOW); setValve(0, HIGH); setValve(1, HIGH); setValve(2, LOW); setValve(3, HIGH); setValve(4, LOW); setValve(5, LOW); setValve(6, HIGH); setValve(7, LOW); setValve(8, LOW); setValve(9, HIGH); setValve(10, LOW); setValve(11, HIGH); setValve(12, LOW); setValve(13, HIGH); setValve(14, LOW); setValve(15, HIGH); setValve(16, LOW); setValve(17, LOW); setValve(18, LOW); setValve(19, LOW); wait(2000); setValve(14, HIGH); setValve(2, LOW); wait(1000); setValve(4, HIGH); setValve(12, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(19, LOW); wait(2000); wait(2000); setValve(14, HIGH); setValve(2, LOW); wait(1000); setValve(4, HIGH); setValve(12, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(19, LOW); wait(2000); setValve(0, LOW); setValve(1, LOW); setValve(2, LOW); setValve(3, HIGH); setValve(4, LOW); setValve(5, HIGH); setValve(6, HIGH); setValve(7, LOW); setValve(8, LOW); setValve(9, HIGH); setValve(10, HIGH); setValve(11, LOW); setValve(12, LOW); setValve(13, LOW); setValve(14, LOW); setValve(15, HIGH); setValve(16, HIGH); setValve(17, LOW); setValve(18, HIGH); setValve(19, LOW); setValve(0, HIGH); setValve(1, HIGH); setValve(2, LOW); setValve(3, HIGH); setValve(4, LOW); setValve(5, LOW); setValve(6, HIGH); setValve(7, LOW); setValve(8, LOW); setValve(9, HIGH); setValve(10, LOW); setValve(11, HIGH); setValve(12, LOW); setValve(13, HIGH); setValve(14, LOW); setValve(15, HIGH); setValve(16, LOW); setValve(17, LOW); setValve(18, LOW); setValve(19, LOW); wait(2000); setValve(14, HIGH); setValve(2, LOW); wait(1000); setValve(4, HIGH); setValve(12, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(19, LOW); wait(2000); wait(2000); setValve(14, HIGH); setValve(2, LOW); wait(1000); setValve(4, HIGH); setValve(12, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(19, LOW); wait(2000); setValve(0, LOW); setValve(1, LOW); setValve(2, LOW); setValve(3, HIGH); setValve(4, LOW); setValve(5, HIGH); setValve(6, HIGH); setValve(7, LOW); setValve(8, LOW); setValve(9, HIGH); setValve(10, HIGH); setValve(11, LOW); setValve(12, LOW); setValve(13, LOW); setValve(14, LOW); setValve(15, HIGH); setValve(16, HIGH); setValve(17, LOW); setValve(18, HIGH); setValve(19, LOW); setValve(0, HIGH); setValve(1, HIGH); setValve(2, LOW); setValve(3, HIGH); setValve(4, LOW); setValve(5, LOW); setValve(6, HIGH); setValve(7, LOW); setValve(8, LOW); setValve(9, HIGH); setValve(10, LOW); setValve(11, HIGH); setValve(12, LOW); setValve(13, HIGH); setValve(14, LOW); setValve(15, HIGH); setValve(16, LOW); setValve(17, LOW); setValve(18, LOW); setValve(19, LOW); wait(2000); setValve(14, HIGH); setValve(2, LOW); wait(1000); setValve(4, HIGH); setValve(12, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(19, LOW); wait(2000); wait(2000); setValve(14, HIGH); setValve(2, LOW); wait(1000); setValve(4, HIGH); setValve(12, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(19, LOW); wait(2000); setValve(0, LOW); setValve(1, LOW); setValve(2, LOW); setValve(3, HIGH); setValve(4, LOW); setValve(5, HIGH); setValve(6, HIGH); setValve(7, LOW); setValve(8, LOW); setValve(9, HIGH); setValve(10, HIGH); setValve(11, LOW); setValve(12, LOW); setValve(13, LOW); setValve(14, LOW); setValve(15, HIGH); setValve(16, HIGH); setValve(17, LOW); setValve(18, HIGH); setValve(19, LOW); setValve(0, HIGH); setValve(1, HIGH); setValve(2, LOW); setValve(3, HIGH); setValve(4, LOW); setValve(5, LOW); setValve(6, HIGH); setValve(7, LOW); setValve(8, LOW); setValve(9, HIGH); setValve(10, LOW); setValve(11, HIGH); setValve(12, LOW); setValve(13, HIGH); setValve(14, LOW); setValve(15, HIGH); setValve(16, LOW); setValve(17, LOW); setValve(18, LOW); setValve(19, LOW); wait(2000); setValve(14, HIGH); setValve(2, LOW); wait(1000); setValve(4, HIGH); setValve(12, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(19, LOW); wait(2000); wait(2000); setValve(14, HIGH); setValve(2, LOW); wait(1000); setValve(4, HIGH); setValve(12, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(19, LOW); wait(2000); setValve(0, LOW); setValve(1, LOW); setValve(2, LOW); setValve(3, HIGH); setValve(4, LOW); setValve(5, HIGH); setValve(6, HIGH); setValve(7, LOW); setValve(8, LOW); setValve(9, HIGH); setValve(10, HIGH); setValve(11, LOW); setValve(12, LOW); setValve(13, LOW); setValve(14, LOW); setValve(15, HIGH); setValve(16, HIGH); setValve(17, LOW); setValve(18, HIGH); setValve(19, LOW); setValve(0, HIGH); setValve(1, HIGH); setValve(2, LOW); setValve(3, HIGH); setValve(4, LOW); setValve(5, LOW); setValve(6, HIGH); setValve(7, LOW); setValve(8, LOW); setValve(9, HIGH); setValve(10, LOW); setValve(11, HIGH); setValve(12, LOW); setValve(13, HIGH); setValve(14, LOW); setValve(15, HIGH); setValve(16, LOW); setValve(17, LOW); setValve(18, LOW); setValve(19, LOW); wait(2000); setValve(14, HIGH); setValve(2, LOW); wait(1000); setValve(4, HIGH); setValve(12, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(19, LOW); wait(2000); wait(2000); setValve(14, HIGH); setValve(2, LOW); wait(1000); setValve(4, HIGH); setValve(12, LOW); setValve(16, HIGH); setValve(18, HIGH); setValve(19, LOW); wait(2000); setValve(0, LOW); setValve(1, LOW); setValve(2, LOW); setValve(3, HIGH); setValve(4, LOW); setValve(5, HIGH); setValve(6, HIGH); setValve(7, LOW); setValve(8, LOW); setValve(9, HIGH); setValve(10, HIGH); setValve(11, LOW); setValve(12, LOW); setValve(13, LOW); setValve(14, LOW); setValve(15, HIGH); setValve(16, HIGH); setValve(17, LOW); 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 • 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 • N • Analogous to ALU operations on microprocessors • Interesting scheduling and optimization problem
Why Not Binary Search? 0 3/8 1 1/2 1/4 1/2 3/8 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 1/2 3/8 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