Bacterial Stress Responses in Synthetic Biological Systems

by

Jia Yue Zhang

A thesis submitted in conformity with the requirements for the degree of Master of Science Graduate Department of Cell and Systems Biology University of Toronto

c Copyright 2019 by Jia Yue Zhang Bacterial Stress Responses in Synthetic Biological Systems

Jia Yue Zhang Master of Science Graduate Department of Cell and Systems Biology University of Toronto 2019

Abstract

Synthetic biology applies engineering principles to rationally design artificial biological systems, often constructed from combinations of naturally-occurring functional units found in a variety of organisms. For some real-world applications, it is important that these systems are designed to sense their environment, allowing for condition-dependent behaviour. Every organism has some form of stress response system enabling it to respond to a fluctuating environment; in Escherichia coil this includes the σ-factors, a protein family that initiates transcription. Preliminary work presented in this thesis is aimed to adapt select σS-controlled gene promoters to serve as stress sensors in synthetic biology. Results obtained in the probiotic E. coli Nissle 1917 strain demonstrate that several gene promoters displayed clear and significant up-regulation in promoter activation when exposed to additional varying concentrations of salts and acidic stress. Overall, this result provides an initial characterization for the adaptation of stress-responsive promoters as sensors.

ii iii

Acknowledgements

To my supervisor, David McMillen; words cannot describe everything you have done for me over the last two years and a bit; for taking a chance on me, believing in me, sup- porting me, guiding me, and most importantly, understanding when times were difficult. I am forever grateful for the opportunities you have provided me and the knowledge I have collected along the way.

To my committee, Keith Pardee and Dana Philpott, as well as external examiner, George Espie, for your time and valuable feedback.

To my fellow lab mates, Brendan Hussey, Zhe Tang, Louis Dacquay, Kauan Ribeiro, Richard Kil, and Jordan Ang, for teaching me everything possible and sharing your wis- dom.

To University of Toronto, and Medicine by Design, for the generous funding.

To Mr.Chung, My high school biology and physics teacher, who sparked that initial in- terest of science in me and for believing in me then when no one else did.

To my friend Cynthia Quan, for the extensive emotional support over the last few weeks; to Olatunji Oni and Neythen Treloar, for the countless technical support in Python and LaTeX; and to everyone else along the way, for all you have done for me.

To my parents, for bearing with me throughout this especially difficult and stressful time, I know I can be very moody and demanding some times. I love you both.

Lastly, to my grandma, this degree is for you.

Thanks everyone. Contents

1 Introduction1 1.1 Synthetic Biology...... 1 1.1.1 Sensing in Synthetic Biology...... 2 1.2 Sensing Stress...... 3 1.3 Bacterial Stress Response...... 4 1.4 Project Hypothesis...... 5

2 Material and Methods7 2.1 Selection of Candidate Sequences...... 7 2.2 Strain Selection and Preparation...... 8 2.3 Plasmid Backbone Selection...... 8 2.4 Design and Construction of the Stress Responsive Vectors...... 9 2.4.1 Exponential Amplification and Gibson Assembly...... 9 2.4.2 Transformations...... 10 2.5 Experimental Controls...... 11 2.5.1 Design and Construction of the Constitutive Construct...... 12 2.6 Alternative Construct Designs...... 14 2.6.1 Reporter Protein Modification...... 14 2.6.2 Double Reporter with Constitutive Expression...... 15 2.7 Continuous Measurements with Dose Responses...... 16

iv CONTENTS v

2.7.1 Sodium Chloride Dose Responses...... 17 2.7.2 Potassium Chloride Dose Responses...... 17 2.7.3 pH Downshift - Acidic Stress...... 18 2.8 ...... 18

3 Results and Discussion 20 3.1 Selection of Candidate Sequences...... 20 3.2 Strain Selection...... 21 3.3 Development of Preliminary Testing Protocols...... 22 3.4 Normalization of Experimental Data...... 23 3.5 Continuous Measurements...... 24 3.5.1 Preliminary Testing...... 25 3.5.2 Constitutive Expression Control...... 25 3.5.3 Biological Replicates...... 27 3.5.4 Sodium Chloride Dose Response...... 28 3.5.5 Potassium Chloride Dose Response...... 34 3.5.6 pH Downshift - Acidic Stress...... 38 3.6 Measurements of Alternative Constructs...... 43 3.7 Turbidostat...... 43

4 Conclusion and Future Directions 45

A Supplementary Information 48 A.1 List of Parts Sequences...... 48 A.2 Schematic of the Plasmid Backbone...... 57 A.3 List of Primers...... 58 A.4 Protocol for Preparation of Electrocompetent E coli Cells...... 60 A.5 Protocol for Preparation of Chemicalcompetent E coli Cells...... 61 CONTENTS vi

B Supplemental Figures 64 B.1 Preliminary Experimental Results...... 64 B.2 Complete Time Series of Final Experimental Results...... 65 B.3 Alternative Construct Experimental Results...... 68 B.4 gad Genes Fluorescence Results...... 69 B.5 Growth Curves of all Stress Responsive Constructs...... 70 B.6 Picture of at High Salt Concentrations...... 74

C Script 75

D Turbidostat 77 D.1 Turbidostat Apparatus...... 77 D.2 Turbidostat Script...... 78 D.2.1 Mother Board Control Script Written in Python Language.... 78 D.2.2 Basic Control Script of the Turbidostat Written in Python Language 80 D.3 Turbidostat Growth Curve...... 84

E Data Analysis Scripts 85 E.1 Data Normalization Script Written in Python Language...... 85 E.2 NaCl Stress Tests Plotting Script Written in Python Language...... 88 E.3 KCl Stress Tests Plotting Script Written in Python Language...... 96 E.4 Acid Stress Tests Plotting Script Written in Python Language...... 104

Bibliography 116 List of Figures

1.1 Regulation of RpoS activity...... 4

2.1 General schematic overview of the first-generation construct design with GFP reporter...... 10 2.2 General schematic overview of the second-generation construct design with RFP reporter...... 14 2.3 General schematic overview of the third-generation construct design with double reporters...... 15

3.1 Continuous Measurement of the Stress Responsive Promoter Constructs with Salt Stress Induced by the Addition of Sodium Chloride...... 31 3.2 Continuous Measurement of the Stress Responsive Promoter Constructs with Salt Stress Induced by the Addition of Potassium Chloride...... 37 3.3 Continuous Measurement of the Stress Responsive Promoter Constructs (a) dps and (b) yciG with Salt Stress Induced by the Addition of 200 mM Potassium Chloride...... 38 3.4 Continuous Measurement of the Stress Responsive Promoter Constructs with pH Downshift Induced by the Addition of MES Buffer...... 42

A.1 Schematic of the Plasmid Backbone Chosen for This Project: pANG539. 57

B.1 Preliminary experimental results from the first initial run...... 64

vii LIST OF FIGURES viii

B.2 Complete Time Series of NaCl Experiments shown in Figure 3.1..... 65 B.3 Complete Time Series of KCl Experiments shown in Figure 3.2...... 66 B.4 Complete Time Series of pH Downshift Experiments shown in Figure 3.4 67 B.5 Continuous Measurement of the Stress Responsive Promoter Constructs with Salt, Acid, and Oxidative Stress...... 68 B.6 gad Genes Fluorescence Measurements of All Conditions...... 69 B.7 Growth Curve of All Constructs with NaCl Stress in Nissle...... 71 B.8 Growth Curve of All Constructs with KCl Stress in Nissle...... 72 B.9 Growth Curve of All Constructs with Acidic Stress With the Addition of MES buffer in Nissle...... 73 B.10 Picture of Experimental Plate...... 74

C.1 Tecan Infinite M1000 Pro Microplate Reader Script Written For Continu- ous Measurements...... 76

D.1 Picture of the turbidostat apparatus set up...... 77 D.2 Steady State Growth Curve of Wildtype E. coli Nissle in Turbidostat.. 84 Chapter 1

Introduction

1.1 Synthetic Biology

Synthetic biology is an emerging scientific field that combines the study of various disci- plines to build artificial biological systems. Synthetic biology aims to apply engineering principles to the fundamental components of cell biology in an effort to rationally ma- nipulate the existing properties of cells in controlled ways for user-specified purposes. To construct these artificial systems, it is often necessary to co-opt the utility of functional units from naturally occurring biological systems. These functional units are isolated to elicit a specific biological function, and they are tested and characterized individually so they can act as modular parts in a novel biological system. For this reason, these standardized units of function are referred to as biological parts. Parts can be used to build devices or systems, and collectively they are referred to as the synthetic biology toolkit [1]. In recent years, the toolkit has greatly expanded in parts for increasingly wide-ranging organisms [2,3,4,5,6]. The most fundamental elements that can be as- signed a function within the toolbox are promoter and terminator sequences [2], involved in the initiation and termination of transcription, respectively.

1 Chapter 1. Introduction 2

1.1.1 Sensing in Synthetic Biology

With the eventual goal of deploying such engineered artificial biological systems for real- world applications, it is important that these artificially designed systems are able to sense their environment. Often, when these systems are constructed in the lab, they are designed and built under ideal conditions: easily-transformable bacterial strains, nutri- tious growth media, antibiotics, sterile environment, temperature control, etc. However, beyond lab design, the exact environmental conditions in which these engineered systems will reside are generally unknown. How natural organisms survive in the wild has been an extensively researched area of biology. As we enter a new scientific era with increasingly more genetically engineered materials, it is important to study the implications of these new artificial systems in the natural environment, so that systems can be designed to react to specific environmental cues in conditional ways, changing behaviour in their responses.

One way synthetic biology may be utilized in environmental sensing is the develop- ment and standardization of the artificial organisms referred to as “smart probiotics” for health care applications. They are probiotic bacteria that have been engineered to express genetically encoded sensors [7]. These sensors are designed to sense the levels of one or more biomarkers, compute biological outputs from the sensors’ chemical or physi- cal inputs, determine whether or not it fits the profile of a disease or condition, then use the biological outputs to trigger the genetic circuits to mount a response, for example to produce and deliver a precise dose of a therapeutic [7]. Such “sense-compute-respond” cellular behaviours have been adapted from electrical engineering, and undergo a heavy design-build-test-learn cycle which allows continuous improvement and provides valuable knowledge with each iteration [7]. Chapter 1. Introduction 3

1.2 Sensing Stress

An important class of conditions to sense are environmental stressors, which can be harmful and damaging to an engineered organism. Examples of harmful environmental signals may include: oxidative stress, temperature fluctuations, pH shift, osmotic shock, lack of nutrients, metabolites, growth phase, density, etc. [8,9, 10, 11, 12, 13, 14, 15]. There are many applicable fields for the incorporation of engineered artificial organisms. For example, in biotechnology and metabolic engineering, certain states of a bioreactor such as crowding or accumulation of metabolites could bring undue stress to the cells, and interfere with their ability to produce desired compounds [16]. If the state of stress can be sensed by cells within the bioreactor via sensors, it would allow such engineered cells to compute and determine a course of action to mitigate said stress, or triggering a switch of production pathways [17, 18, 19, 20, 21].

Another possible direction for the application of stress sensing can be found in health care, as the disease state of an individual often causes homeostatic imbalances which could present as stress to the cells. One example would be inflammatory bowel disease (IBD). IBD is a group of chronic diseases characterized by flares of chronic and relapsing inflammation of the gastrointestinal tract that affects millions of people worldwide. The two main idiopathic conditions are: ulcerative colitis (localized to the colon) and Crohn’s disease (can affect the entire gastrointestinal tract). An inflamed gut poses a threat to the gut flora as it disrupts the gut environment, which can be potentially characterized as stress to its resident microbes. If the state of stress can be recognized by the engineered organisms via sensors, a biological signal then could be programmed to be triggered and produced, to inform the host of the existence of the stressor, or even possibly encoding a genetic circuit that can compute and mitigate said stress. “Smart probiotics” that would combine sensing of an intestinal state representing disease or disruption, with a condition-dependent therapeutic response are currently under development [7]. Chapter 1. Introduction 4

1.3 Bacterial Stress Response

Every organism has their own stress response systems that enable them to survive ad- verse and fluctuating conditions. One example is the bacterial stress response system of Escherichia coli. E. coli is a facultative anaerobic, Gram-negative bacterium that has a evolved stress sensing and response regulon RpoS (RNA polymerase, sigma S, also known as σS) belonging to the sigma factor protein family. Sigma factors are multi- domain dissociable subunits of bacterial RNA polymerase (RNAP) that play critical roles in transcription initiation.

Figure 1.1: Regulation of RpoS activity. In stationary phase and under stress conditions, stable RpoS can bind free core RNA polymerase; this protects RpoS from degradation and allows the transcription of RpoS-dependent genes. Reproduced from Battesti et al. (2011) [22] with permission from Annual Reviews. (Order Detail ID: 72017924) Chapter 1. Introduction 5

During this process, RpoS binds to the core to form the holoenzyme, enabling spe- cific binding of RNA polymerase to promoter sequences (Figure 1.1)[22, 23]. The RpoS regulon is a specialized alternative sigma factor regulon involving a regulator and a set of related genes, with the functional capability of activating stress responses that help the cell achieve a resistant state and survive the stress [22]. To trigger the in- duction of RpoS synthesis and down-regulate RpoS protein degradation in response to environmental stress, a regulatory cascade involving the molecule (p)ppGpp (guanosine tetraphosphate and guanosine pentaphosphate, two related alarmone nucleotides com- monly grouped together) from the stringent response appears to be required [22, 24, 25]. Upon exposure to stresses, the cellular concentration of (p)ppGpp increases, which stimu- lates rpoS transcription and translation while simultaneously inhibiting proteolytic degra- dation of RpoS, which contributes to the accumulation of RpoS. As RpoS increases, the approximately 10% of E. coli genes that are under the control of RpoS are also transcrip- tionally activated. From previously analyzed genome-wide microarray data of the E. coli stress response network, a set of 140 positively σS-controlled genes were identified, all of which display an up-regulation in transcription to induction of RpoS, under three stress conditions: entry into stationary phase, additional salt, and acidic stress. This set of genes was referred to as the core set, and it presents a viable pool of naturally occurring potential stress sensors [24].

1.4 Project Hypothesis

In this project, it is hypothesized that E. coli’s own native stress response system, though not yet fully characterized, could still be adapted and used as stress sensors in synthetic biology. Considering possible applications in the health care field, the most suitable microorganism would be a probiotic strain of E. coli. The research presented in this Chapter 1. Introduction 6 thesis will test this hypothesis by selecting stress responsive promoter candidate regions and documenting their reporter protein expression output in the face of applied stressors. Chapter 2

Material and Methods

2.1 Selection of Candidate Sequences

From the core set of 140 σS-controlled genes, a collection of 7 genes were selected based on their degree of stress-induced transcriptional activation under imposed stress conditions of interest (stationary phase, salt stress, and acidic stress) [24]. Since the promoter sequences of the chosen genes are not currently annotated on the public sequence database (NCBI) for Escherichia coli, the potential promoter-containing regions were of interest. For each such region of interest, the sequence was extracted in the following manner:

1. National Center for Biotechnology Information website was accessed

2. The name of the gene was searched for under the Gene database

3. The gene most closely resembling the target gene was selected, usually the top search result

4. The gene was confirmed to belong to Escherichia coli (strain K-12, substrain MG1655, since it is the most annotated strain)

5. The genomic sequences were located, and a region was selected that ran from the base immediately after the stop codon of the previous gene in the genome, to the

7 Chapter 2. Material and Methods 8

last base before the start codon of the gene of interest

6. The sequence was copied and its genomic location noted

The full upstream (before the start codon) sequences obtained in this fashion are listed in Appendix A.1. Strictly speaking, these are not promoter sequences, but potential promoter-containing sequences from the intergenic regions upstream of our genes of in- terest. For brevity, however, we will from here on often refer to these sequences as the “promoters” being tested for their ability to regulate the stress-responsive expression of our reporter genes.

2.2 Strain Selection and Preparation

The Escherichia coli strain Nissle 1917 (from here on: Nissle) was selected as the ex- perimental candidate for this research. However, E. coli cloning strain DH5α was also used for the purpose of bacterial cloning. Newly obtained protocol for electrocompetent E. coli cells were prepared as outlined in Appendix A.4, and protocol used to make the initial chemically competent E. coli cells were prepared as outlined in Appendix A.5.

2.3 Plasmid Backbone Selection pANG539 (a plasmid designed by past lab member Jordan Ang) was chosen as the backbone for the constructs. This plasmid is ideal because it is a minimalist cloning vector with the Hok/sok type I toxin-antitoxin system for potential future in vivo testing without antibiotics, ParMRC plasmid partitioning apparatus, low copy p15A origin of replication, ampicillin resistance gene, and a synthetic insulator region for cloning via PCR. Plasmid sequence and schematics can be found in Appendix A.1 and Appendix A.2, respectively. Chapter 2. Material and Methods 9

2.4 Design and Construction of the Stress Respon-

sive Vectors

All constructs were designed (Figure 2.1) with NEBuilder Assembly Tool from New Eng- land BioLabs Inc. (NEB) and built using Gibson Assembly. Primers were generated by the NEBuilder Assembly Tool during design, and ordered from Eurofins Genomics, based on the promoter region sequence of each gene of interest (list of primers can be found in Appendix A.3. To amplify and isolate each promoter region needed for Gibson Assembly, forward and reverse primers spanning the promoter region were subjected to polymerase chain reaction (PCR) against genomic DNA of Escherichia coli; creating a total of 7 promoter sequences with overhangs. The reporter protein, superfolder green fluorescent protein (sfGFP) with synthetic terminator L2S2P21, was also amplified via PCR with primers containing overhangs for bridging the promoter region and the backbone (all sequences of parts can be found in Appendix A.1. Blunt end primers were generated and ordered for the amplification of the linearized backbone for insertion within the synthetic insulator region.

2.4.1 Exponential Amplification and Gibson Assembly

All components were exponentially amplified using NEB Q5 High-Fidelity 2× Master Mix in a 50 µL reaction. PCR was followed by a DpnI restriction enzyme digestion, with the addition of 1 µL enzyme and 2 µL NEB CutSmart Buffer to the PCR product, and incubated for 1 hour at 37 ◦C, to eliminate the original methylated DNA strand. All PCR products were then loaded onto a 1.2% agarose gel with SYBR safe DNA gel stain, and run for 45 minutes at 110 V in TAE buffer. The fragments were confirmed to be the correct size via blue light illumination, then cut out and extracted from the gel for purification with the NEB Monarch DNA Gel Extraction Kit. Each promoter region Chapter 2. Material and Methods 10

Figure 2.1: General schematic overview of the first-generation construct design with GFP reporter was then assembled into vector pANG539, expressing sfGFP downstream, via Gibson Assembly, using the NEBuilder HiFi DNA Assembly Master Mix in a 10 µL reaction mixture. The reaction was incubated at 50 ◦C for 15 minutes then stored at 4 ◦C until use.

2.4.2 Transformations

Following the assembly, the plasmids were transformed into the E. coli cloning strain DH5α via heat shock individually, following the same protocol for all plasmids. 50 µL of chemically competent DH5α cells were thawed completely on ice, mixed with 2 µL of the assembled product, then incubated on ice for an additional 30 minutes. The cells were then heat shocked for 45 seconds at 42 ◦C, placed on ice immediately after for 2 minutes, then incubated in a shaking at 37 ◦C with the addition of 950 µL of room temperature Super Optimal broth with Catabolite repression (SOC media) for 1 hour; for the recovery of the cells as well as the expression of ampR gene. Following incubation, the cells were centrifuged at 2000 g for 2 minutes to pellet, 800 µL of the media was removed, the cells were resuspended in the remaining media, then plated on Luria-Bertani (LB) media agar with 100 µg/mL carbenicillin (in place of ampicillin). Plates were allowed to grow overnight at 37 ◦C. Chapter 2. Material and Methods 11

Three colonies from each construct’s selection plate were cultured separately overnight in LB media with 100 µg/mL carbenicillin at 37 ◦C, shaking at 250 RPM in 50 mL conical falcon tubes. The plasmid DNA was then extracted and purified using the NEB Monarch Plasmid Miniprep Kit, and sequenced by Eurofin Genomics with sequencing primers designed from the upstream and downstream insulator regions to cover each ligation point. Positively confirmed DNA samples of each vector were then transformed into electrocompetent Nissle cells. 50 µL of electrocompetent Nissle cells were thawed completely on ice, mixed with 2 µL of the purified, sequence-confirmed DNA sample of each plasmid separately, and incubated on ice for 10 minutes. The cells and DNA were then transferred to a 1 mm electroporation and pulsed at 1800V for 5 ms. 950 µL of room temperature SOC media was added to the cuvette, gently mixed by pipetting up and down before transferring to a 2 mL microcentrifuge tube, and incubated at 37 ◦C in a shaking incubator for 1 hour. Following incubation, the cells were centrifuged at 2000 g for 2 minutes to pellet, 800 µL of the media was removed, the cells were resuspended in the remaining media, then plated on LB agar with 100 µg/mL carbenicillin and allowed to grow overnight at 37 ◦C. Colonies were selected from the agar selection plates the following day and cultured in LB media with 100 µg/mL carbenicillin overnight. A fraction of the culture was then mixed in a 1:1 ratio with 50% glycerol and stored in -80 ◦C freezer for future experimentation.

2.5 Experimental Controls

To properly calibrate the experimental procedures, experimental controls are needed to minimize the effects of extraneous environmental variables that could influence the one being tested. This helps to reinforce the inference that changes in the dependent variable are specifically due to changes in the independent variable (the ability to infer causal- ity). To achieve this, a constitutive expression plasmid was designed and constructed Chapter 2. Material and Methods 12

to accompany all experimental protocols, as well as negative controls consisting of an unstressed growth condition of the stress responsive constructs, wild type unmodified E. coli Nissle, and growth media only.

2.5.1 Design and Construction of the Constitutive Construct

A plasmid with constitutive expression of GFP was designed to consist of the following components (with sequences available in Appendix A.1):

1. A strong synthetic constitutive promoter (Registry of Standard Biological Parts, parts.igem.org, part number: BBa J23100)

2. A medium strength synthetic ribosomal binding site (RBS) (part number: BBa B0032)

3. An identical superfolder green fluorescence protein with synthetic terminator L2S2P21

4. pANG539 backbone with same insertion location within the synthetic insulator region

Site-directed mutagenesis was used to construct the constitutive plasmid, given the in- tent to maintain all components identical to the experimental constructs, except for the promoter and ribosome binding site. The insertion method of mutagenesis was utilized by considering the sfGFP within the pANG539 original backbone together as the new backbone, and the synthetic constitutive promoter (35 base pairs) as well as the synthetic ribosomal binding site (27 base pairs) combined as the insert (62 base pairs in total). The following protocol was adapted from the Q5 Site-Directed Mutagenesis Kit Protocol (NEB), with modifications made to increase efficiency.

Primers were designed with the NEBaseChanger Tool (New England Biolabs) and ordered from Eurofins Genomics. The primer pairs were then subjected to touchdown Chapter 2. Material and Methods 13 polymerase chain reaction against a randomly selected, previously constructed, and pos- itively sequence-confirmed stress responsive construct, for the amplification of the new backbone - sfgfp and pANG539. The PCR product was then loaded onto a 1% agarose gel with SYBR safe DNA gel stain and ran for 45 minutes at 110 V in TAE buffer. The fragment sizes were confirmed to be correct via blue light illumination before being ex- tracted from the gel for purification with NEB Monarch DNA Gel Extraction Kit. The purified PCR product was then subjected to a 10 µL reaction of Kinase, Ligase and DpnI (KLD) Treatment, with the addition of 2 µL PCR product instead of 1 µL. The reaction was mixed by pipetting up and down, and incubated at 23 ◦C for 30 minutes before transferring to ice for termination of the reaction. The reaction mixture was then purified with NEB Monarch PCR and DNA Cleanup Kit (New England Biolabs Canada) for the elimination of salts prior to electroporation.

For transformation, 50 µL of electrocompetent DH5α cells were thawed completely on ice, combined with 5 µL of purified, KLD treated constitutive plasmid, and incubated on ice for 10 minutes. The cells and DNA were then transferred to a 1 mm electroporation cuvette and pulsed at 1800V for 5 ms. 950 µL of room temperature SOC media was added to the cuvette, gently mixed by pipetting up and down before transferring to a 2 mL microcentrifuge tube, and incubated at 37 ◦C in a shaking incubator for 1 hour. Following incubation, the cells were centrifuged at 2000 g for 2 minutes to pellet, 800 µL of the media was removed, the cells were resuspended in the remaining media, then plated on LB agar with 100 µg/mL carbenicillin and allowed to grow overnight at 37 ◦C. Six colonies were selected from the agar selection plates the following day and cultured in LB media with 100 µg/mL carbenicillin at 250 RPM overnight. The plasmid DNA was then extracted and purified using the NEB Monarch Plasmid Miniprep Kit (New England Biolabs Canada), and sequenced by Eurofins Genomics. Positively sequence confirmed samples were then transformed into electrocompetent Nissle cells following the Chapter 2. Material and Methods 14

Figure 2.2: General schematic overview of the second-generation construct design with RFP reporter same electro-transformation protocol. Colonies were selected from the end agar selection plates and cultured in LB media with 100 µg/mL carbenicillin at 250 RPM overnight. A fraction of the culture was then mixed 1:1 ratio with 50% glycerol and stored in -80 ◦C freezer for future experimentation.

2.6 Alternative Construct Designs

Two alternative constructs were designed and built to enable the possibility of reducing fluorescence interference from the coloured media upon measurements, experimenting with an alternative culturing method, as well as future in vivo experiments. The first design being with an alternative reporter protein (Figure 2.2), red fluorescence protein (RFP); and the second design, the original GFP reporter with the addition of a constitu- tive promoter expressing a second reporter, mCherry fluorescence protein, on the same plasmid construct (Figure 2.3).

2.6.1 Reporter Protein Modification

For modification of the original construct design with an alternative reporter protein (Figure 2.2), Gibson Assembly was utilized to combine the new reporter protein RFP while considering each stress responsive promoter within pANG539 as the new back- Chapter 2. Material and Methods 15

Figure 2.3: General schematic overview of the third-generation construct design with double reporters

bone. Primers were generated based on said design using the NEBuilder Assembly Tool (New England Biolabs), for a two fragment Gibson Assembly, and ordered from Eu- rofins Genomics. Amplification of the new backbone (stress responsive promoter within pANG539) was performed against the original specific stress responsive promoter con- structs to obtain the new backbone, and amplification of RFP was performed against an existing construct containing said protein provided by fellow lab member Brendan Hussey. The amplification, extraction, assembly, and transformation were completed according to protocols previously described for the original plasmid construction, and sequences were confirmed by using two different sequencing primers in both forward and reverse direction covering the junctions of the assembly. The positively sequence-confirmed RFP constructs were then transformed into Nissle as previously stated and glycerol stocked for experimentation.

2.6.2 Double Reporter with Constitutive Expression

For possible future in vivo experiments and analysis via flow cytometry (which requires a step to screen and filter desired cells based on a distinct colour profile, separate from any observed stress response), a third variation of the original construct was designed as follows (Figure 2.3). A synthetic strong constitutive promoter expressing mCherry fluorescence protein was inserted on the anti-sense strand within the synthetic insulator Chapter 2. Material and Methods 16 region on the original GFP designs. Gibson Assembly was used for construction, uti- lizing the original GFP reporter designs as the new backbone, and obtaining the part of a synthetic strong constitutive promoter (part: BBa J23100 with synthetic riboso- mal binding site, part: BBa B0032) expressing mCherry fluorescence protein from an existing plasmid in the lab, pANG536, previously built by Jordan Ang. Primers were designed using NEBuilder Assembly Tool (NEB), for a two fragment Gibson Assembly, and ordered from Eurofin Genomics. Amplification of all parts was performed according to the previously outlined PCR protocol, and the extraction, assembly, transformations were completed based on previously described protocols for plasmid construction, and sequences were confirmed by using primers that bridged both assembly junctions. The positive sequence confirmed double reporter constructs were then transformed into Nissle as previously stated and glycerol stocked for experimentation.

2.7 Continuous Measurements with Dose Responses

All methods described below were for experimentation using the original designs (ex- pressing sfGFP under the control of the candidate sequences), unless otherwise stated. Continuous measurements of optical density at 600nm, as well as fluorescence intensity with excitation at 485nm and emission at 525nm for sfGFP were carried out over a period of 18 hours, at 240 seconds intervals, with double orbital shaking, and gain gated at 100, in a black Nunc MicroWell 96-Well Optical-Bottom Plates (Thermo Fisher Scientific), with the Tecan Infinite M1000 Pro Microplate Reader. (For script, see AppendixC) Each 96 well plate was separated into 3 lanes × 4 sections, with the first 3 subjected to differ- ent test conditions (C1-C3), and the last one for negative controls. Within each section, the 3 lanes represent 3 biological replicates (R1-R3) of each construct, for experimental accuracy (Table 2.1). Chapter 2. Material and Methods 17

2.7.1 Sodium Chloride Dose Responses

All 7 stress responsive constructs, the constitutive expression control, as well as wild- type Nissle were cultured overnight from glycerol stocked samples in triplicates, in 1 mL LB media with 100 µg/mL carbenicillin (except for the wild-type Nissle) at 37 ◦C and 250 RPM shaking. The cultures were then used to sub-inoculate fresh media under same conditions at a 1:200 dilution ratio the following day, and allowed to grow under the same previous condition for 3-4 hours to reach exponential phase. Two separate 96 well plates were prepared on separate days in order to incorporate all dose response conditions, as each plate can only test three conditions. However, all 96 well plates were prepared in a similar fashion with the only difference being the additional added stress condition (Table 2.1). Each well, except for the negative controls, consist of the same following elements: 100 µL EZ Rich Defined Synthetic Media (Teknova Inc.) with 100 µg/mL carbenicillin added prior to final plating (with certain wells having adjusted final volume of media to accommodate the additional added stress without compromising final stress concen- tration), 1 µL of the appropriate construct containing Nissle cells, and the appropriate amount of the sodium chloride (NaCl) to achieve desired final stress concentration from a 6M stock. Plate 1 consisted of the following conditions: C1=0 mM, C2=200 mM, and C3=400 mM. Plate 2 consisted of the following conditions: C1=600 mM, C2=800 mM, C3=1000 mM. The plate was then covered with Breathe-Easy sealing membrane (Sigma Aldrich) and inserted into the plate reader. Measurements were done continuously as previously described, with script available in AppendixC.

2.7.2 Potassium Chloride Dose Responses

The potassium chloride (KCl) dose response tests were carried out with the same protocol and same two-plate layout as NaCl, except for the substitute of KCl as the additional stress, from a stock of 4.5M. Measurements were completed with the sames script found in AppendixC. Chapter 2. Material and Methods 18

Table 2.1: 96 Well Microplate Layout

R1 R2 R3 R1 R2 R3 R1 R2 R3 Constitutive Control 2 poxB Condition 1 dps Condition 2 osmY Condition 3 yciG Nissle with Media ibpA gadA Nissle with Carb gadB Media Only Constitutive Control 1 Media with Carb C1 C1 C1 C2 C2 C2 C3 C3 C3

2.7.3 pH Downshift - Acidic Stress

To achieve a downshift in pH as the additional added stress, 2-(N-morpholino)ethanesulfonic acid (MES) buffer (1M stock) was used to induce the acidic stress. EZ Rich Defined Syn- thetic Media was determined to have a pH level of 7 upon measurement with pH paper. As stated previously in literature, with 100 mM and 170 mM final concentration of MES buffer in media, a pH of 5.5 and pH 5 would be achieved, and this was confirmed with pH paper prior to measurements. One 96 well plate was used for acidic stress dose re- sponse testing with the following conditions: C1=0 mM (pH 7), C2=100 mM (pH 5.5), C3=170 mM (pH 5). All other protocols were completed as outline above.

2.8 Turbidostat

A turbidostat is a feedback controlled, continuous culturing device that maintains an approximately constant user-defined optical density by continuously using an ongoing OD measurement device (for example, a laser diode/sensor pair) and a feedback loop to introduce diluting media as necessary to bring the OD back to the set level. A single module of the turbidostat (AKA syphonstat) was obtained from its creator Chris Takahashi from the Klavins lab at the University of Washington [26]. It consists of a motherboard housed around a 3D printed glass holder with a magnetic stir plate motor on the bottom, a pinch valve, a network of tubes connecting to the tube Chapter 2. Material and Methods 19 , the media inlet cap, the air pump and PTFE filters (Picture in Appendix D.1). Following that, the turbidostat was tested for its functionality in growing and main- taining a steady culture. Growth of wild-type Nissle and Nissle with a constitutive GFP expressing plasmid in LB and enriched M9 media (M9 salts, supplemented with 1 mM thiamine hydrochloride, 0.4% glycerol, 0.2% casamino acids, 2 mM MgSO4, and 0.1 mM CaCl2), as well as a M9 media variant with 0.2% glucose, were experimented with. Chapter 3

Results and Discussion

3.1 Selection of Candidate Sequences

From the core set of 140 positively σS-controlled genes [24], a collection of 7 genes were selected based on their expression ratios (average relative mRNA rpoS+/rpoS− mutant ratio) under the following stress conditions: OD 4.0 (transition into stationary phase), hyperosmotic shift with NaCl at a final concentration of 300 mM, and pH downshift to pH 5 with MES buffer (Table 3.1). This collection included one gene (ibpA) selected from a more recent study [27] which used a different colitis mice model, and two genes (gadA and gadB) that were presented in both studies to be highly up-regulated. The promoter sequence (or upstream intergenic region) of each gene, rather than the gene itself, was of primary interest. This is due to their potential ability to be used to produce protein outputs that would be up-regulated by the native stress response systems.

Since the promoter sequences of the chosen genes are not currently annotated on public sequence database (NCBI) for Escherichia coli, the region spanning the start codon of the gene of interest, and the base-pair immediately following the stop codon of the previous gene were selected and used for the experiments (a list of all sequences can

20 Chapter 3. Results and Discussion 21

Table 3.1: List of genes chosen from E. coli strain K-12 MG1655 and their descriptions.

Most prominent Gene Name Description Inducible Stress poxB Salt pyruvate dehydrogenase, thiamine triphosphate-binding, FAD-binding dps Salt Stress response DNA-binding protein with ferritin-like domain osmY Salt, Stationary Phase Hyperosmotically inducible periplasmic pro- tein, RpoS-dependent stationaty phase gene yciG Salt Hypothetical protein (uncharacterized), con- tains tandem KGG domain ibpA Oxidative stress Heat shock chaperone gadA Stationary Phase, pH glutamate decarboxylase enzyme, isozyme A, is part of the glutamate-dependent acid resistance system 2 (AR2) which confers resistance to ex- treme acid conditions gadB Stationary Phase, pH glutamate decarboxylase enzyme, isozyme B be found in Appendix A.1). This region was assumed to include a native gene-specific promoter as well as the native ribosome binding site (RBS) sequence.

3.2 Strain Selection

Given that one of the functional goals of this project is to potentially deploy the prod- ucts as gut inflammation biosensors, the best chassis would be a probiotic bacterium with no pathogenesis that can be administered orally. Escherichia coli Nissle 1917 (from here on: Nissle) is a non-pathogenic Gram-negative strain of E. coli used to treat many gastrointestinal disorders. Nissle is the active ingredient of the probiotic drug Mutaflor, discovered by German professor Alfred Nissle. Over the years, the Nissle strain has specifically attracted the attention of synthetic biology pharmaceutical companies such as Synlogic due to its probiotic properties. For the purpose of this project, development of a natural stress biosensor with the eventual objective of introducing it to market, this probiotic bacterium, Nissle, was chosen as the chassis for this project. Previous colonization experiments of Nissle have been performed and were shown to be successful Chapter 3. Results and Discussion 22 in mice guts (data not shown; experiments conducted by former lab member Jordan Ang).

Initial preparation of Nissle competent cells posed a challenge since they are a wild- type strain. The common commercial lab strains have been mutated over time to create features that allow for routine, high-throughput cloning, improved plasmid yield, sta- bility, and more. Such features do not exist within the wild-type strains; therefore, they possess higher resistance to the introduction of foreign DNA. Chemically competent Nissle cells were shown to have very little to no transformation efficiency. However, after obtaining a protocol for higher efficiency electrocompetent cell preparations, and mod- ifying it by down-scaling the production, electrocompetent Nissle cells were eventually produced in small batches.

3.3 Development of Preliminary Testing Protocols

A robust measurement paradigm is critical to achieve reproducibility while eliminating as many variables as possible. As to obtain comparable results with different dose responses as well as stress conditions, the measurements needed to be repeated numerous times, on different days, under different environmental conditions. The initial approach to measurement was based on the standard method: subinoculation of an overnight starter culture, and allowing it to grow for 4-6 hours with measurements taken every hour. However, this traditional approach was infeasible, as RpoS is the primary stress regulator of stationary phase genes [22], and the cells would not reach required density within the measurement period. As well, a fluorescence signal would not be expected in exponential phase cells since rpoS is transcribed in primarily late exponential phase, and testing in our cells confirmed this. Given the properties of the plate reader (Tecan Infinite M1000 Pro Microplate Reader), scripts were designed to measure both OD 600nm as well as fluorescence intensity continuously at a pre-designated intervals (several were Chapter 3. Results and Discussion 23

tested), for an extended period of time (different durations were also tested). This continuous measurement method was made possible as the plate reader contained a sealed and enclosed temperature controlled chamber with shaking capabilities. The final experimental script can be found in AppendixC.

3.4 Normalization of Experimental Data

A normalization step was necessary in order to process all the data collected from the continuous measurements to ensure standardization and to consistently highlight the key features of the data. Due to the large quantities of data points collected (roughly 70,000 points per experimental plate), manual normalization was prone to human error. Several scripts were written in Python in order to efficiently process the data, as well as to produce plots to illustrate the experimental measurements (scripts can be found in AppendixE). For each added stressor condition, the fluorescence measurements were normalized by optical density to account for varying cell populations, and the fluorescence and OD effects from the medium itself, then subtracting the normalized value from cells that have had no stressors added (this allowed for examination of only differential effects from the stressors rather than effects that arose from the growth conditions, and particularly from entry into stationary phase). The following normalization equation was used for all experiments:

F − F F − F ∆F = Stressed Media − No−added−stress Media ODStressed − ODMedia ODNo−added−stress − ODMedia

where F represents the fluorescence measurement, OD represents the optical density at 600nm, “Stressed” quantities refer to measurements of cells exposed to added stressor molecules (salt or acid), “No-added-stress” refers to cells grown in standard media with no addition of stressor molecules, “Media” refers to liquid media with no cells, and ∆F Chapter 3. Results and Discussion 24 refers to the change in fluorescence intensity when stationary phase intracellular stress was subtracted.

The normalization process, combined with poor cell growth, led to large variability in some time series, particularly in the early hours of each experimental run when low optical densities can lead to normalization by near-zero quantities that are inaccurately reported by the plate reader. Therefore, the data presented in this chapter have been truncated to remove the initial regions with large variations, which otherwise overwhelm the later-stage data that is the focus of the experiments. Complete time series of all figures can be found in Appendix B.2.

3.5 Continuous Measurements

Before dose response testing could take place, it was necessary to test whether the expres- sion of the stress responsive construct in wild-type Nissle cells brought on complications or toxicity affected cell growth. The growth curve of all seven constructs were evaluated and compared to wild-type Nissle, and all results were observed to be normal (Appendix B.5). Following that, the stationary phase cells were then used to gauge several other param- eters for measurement, such as the excitation and emission wavelength, and the gain, in order to make sure proper measurements can be taken throughout the entire duration. It is critical to have the correct gain as the setting determines the arbitrary fluorescence unit measured: if it was set too low, high fluorescence signal would exceed measurement parameters and would not be recorded. On the contrary, if it was set too high, the low fluorescence signal would contain noise that would disrupt the data. Chapter 3. Results and Discussion 25

3.5.1 Preliminary Testing

Initial continuous measurements consisted of single replicate dose response testing of all seven original stress responsive promoter constructs (expressing GFP) in Nissle cells, with both additional salt and acid added stress, and wild-type Nissle as a negative control (se- lect data shown in Appendix B.1). The salt stress was induced with the addition of NaCl at the following final concentrations: 10 mM, 100 mM, 150 mM, and 300 mM. These concentrations were chosen based on the literature suggestion of 300 mM, and scaled down to create a gradient. During measurements, these concentrations did display small differences between the amount of fluorescence units measured, however, the range of concentrations could potentially be expanded to a greater extend to see a broader ex- pression. The acid stress was induced by the addition of MES buffer as suggested by

◦ literature, due to its property as a buffer as well as having a pKa value of 6.10 at 25 C, which provides a buffering capacity of pH 5.5-6.7 [28]. The initial concentrations of MES buffer used for testing were as follows: 8.5 mM, 17 mM, 85 mM, and 170 mM. These concentrations were chosen in a similar fashion, based on the literature suggestion of 170 mM. This concentration alters the media to a pH 5, though the final pH at the remaining concentrations was not tested. Therefore, the exact pH shift was not be de- termined. This initial experimental design required improvement since it contained no biological replicates or expression controls. It was difficult to speculate if the stress ex- perienced by the cells was due to the up-regulation of the promoters with the addition of NaCl or MES, a global effect from the cells being in duress, or additional side effects caused by the supplemental salt or acid buffer.

3.5.2 Constitutive Expression Control

To better validate the experimental results, and to eliminate any global effects the cells or plasmid could be experiencing with the addition of stressor molecules, a constitutive ex- Chapter 3. Results and Discussion 26 pression control plasmid was designed and constructed. All components of the construct remained the same, except for the replacement of the stress responsive promoter with a strong synthetic constitutive promoter. Given the constitutive promoter’s ability to have steady expression throughout different cell stages, it was used for comparison with the stress responsive promoters in determination of how they behave under additional added stress.

During construction of the constitutive expression control construct, there were diffi- culties with the mutagenesis process. By following the manufacturer’s protocol, all steps (PCR and KLD treatment) were completed with no issues, but the final transformation yielded no colonies. When the experiment was repeated, the same result was obtained. The competent cells as well as the agar plates used were tested separately for their trans- formation efficiency and selection properties to eliminate faulty materials, and both were determined to be fully functional. Therefore, in order to increase the ligation efficiency during KLD treatment, as well as the transformation yield, the protocol required modifi- cation. A DNA clean up step was added following both the PCR reaction and the KLD treatment in order to remove any impurities, salts, interfering enzymes, and to concen- trate the DNA. By adding this step, the transformation efficiency was greatly increased, which resulted in the growth of colonies when transformed with electrocompetent DH5α cells.

The colonies were then cultured, the plasmid DNA was extracted and sent for se- quencing for confirmation of correct bases. Multiple separate mutagenesis reactions were performed in parallel in an effort to save time. However, the sequencing result displayed two distinct point mutations: one was a base pair addition, the other was a base pair deletion. Duplicate samples of the same reaction results were also sequenced and showed different point mutation results, calling into question the quality of the sequencing re- Chapter 3. Results and Discussion 27 sults. Two separate variations of the constitutive expression control construct were then transformed into Nissle and cultured. Overnight cultures of both were grown and tested for fluorescence yield, and both showed significant fluorescence intensity (at similar levels for each variant). Time constraints did not allow for a repeat of the sequencing to con- firm the exact sequences, though this is planned as future work. Unregulated expression of a protein output is the key requirement for the constitutive control. Here, both pro- moter sequences did clearly show GFP expression, and it was considered unlikely that a stress-responsive variant of an otherwise constitutive promoter sequence could have been created by chance. These two constructs were therefore used as the constitutive expression controls for the experiments reported below (and final sequence confirmation will be carried out before any publication in the literature is attempted). In all results reported below, constitutive control construct 1 has been used; results of constitutive control construct 2 are not shown (but the data was examined and found to be closely related to the construct 1 results).

3.5.3 Biological Replicates

In order to increase the statistical integrity and validity of the experiments, three bio- logical replicates were included in each set of tests for each condition. The biological replicates helped to improve the statistical importance and to assess the level of noise. The replicates were able to accomplish this by providing parallel measurements of bio- logically distinct samples to capture random biological variation([29]). Three replicates of each of the stress-responsive constructs, as well as the constitutive expression controls and negative control, were cultured and glycerol stocked, to ensure that the same repli- cate is used each time, in the same order, for the preparation of every 96 well testing plate. Therefore, when the data analysis is performed, the normalization not only sub- tracts optical density and fluorescence signals from samples that were not exposed to additional added external stress, but also ensures that the subtracted sample was of the Chapter 3. Results and Discussion 28 same biological replicate (i.e. the first column of wells’ data from 200 mM of additional NaCl stress would subtract the first column of wells’ data from 0 mM of additional NaCl stress).

3.5.4 Sodium Chloride Dose Response

A series of dose response testing was completed in order to obtain a better understanding of the effects of NaCl on these stress responsive promoters, as well as to investigate their expression profile, and to characterize their behaviour quantitatively. A greater range of NaCl concentrations were explored for the final testing compared to the initial testing. This provided a broader set of information by comparing expression profiles between the different concentrations, as well as determining the toxicity threshold. The final con- centration of NaCl used ranged from 0-1000 mM with 200 mM intervals. As stated in chapter 2.7.1, since each 96 well plate was only able to test 3 separate stress conditions, with the inclusion of biological replicates, as well as constitutive expression and negative controls, two separate 96 well plates were used to include all testing conditions on sepa- rate consecutive days. Environmental and procedural variability were kept to a minimum by preparing each experiment in the same fashion under the same conditions. Following preparation of each plate, optical density of 600nm and fluorescence intensity (excitation 485nm, emission 525nm) measurement was taken continuously for 18 hours, at an interval of every 4 minutes with shaking, which generated 271 time points for each well during each measurement, on each plate. Both data files were then analyzed as stated above.

In order to eliminate the high initial variability and highlight the more relevant results from later in the growth process, all results presented in this subsection (Figure 3.1) have been truncated to start at hour 3.5. At the same time, data points from measurements conducted at 1000 mM concentration of NaCl were omitted, as it apparently induced cell toxicity (no cell growth was observed in these experiments). Large outlier values in the Chapter 3. Results and Discussion 29 normalized time series were observed at this concentration, likely due to the presence of either dead cells or precipitates: clumping or precipitation were observed at the bottom of the wells at this high salt concentration (Pictured in Appendix B.6). A similar trend towards poor cell growth was also seen for measurements at 800 mM NaCl, creating noise in the time series at this concentration. These points have, however, been included in the plots. All figures in this subsection (Figure 3.1) were generated in the same fashion, with the grey solid line at 0 on the y-axis representing all constructs at 0 mM NaCl. All results have this no-added-stress baseline condition subtracted away to demonstrate only the changes that resulted from the addition of the salt stress (rather than from entry into the stationary phase).

Presented in Figure 3.1a are the results for the constitutive expression control under the addition of NaCl salt stress at increasing concentration increments of 200 mM, start- ing with 0 mM. All coloured lines, except the earliest part of the 200 mM NaCl time series, are in the negative region on the fluorescence intensity scale. This validates the remain- der of the NaCl experiments since it confirms that the addition of NaCl does not appear to induce a global up-regulation of gene expression due to interactions with the cells, the promoter, or the fluorescent reporter. In fact, the effect of increasing exposure to salt is to lower the fluorescence output of our reporter protein, in a concentration-dependent manner: the normalized fluorescence consistently decreases as the NaCl concentration increases from 200 mM to 800 mM. It is not currently clear what causes this effect, but it provides the conclusion that when an up-regulation of fluorescence is observed while expressing the same reporter protein under the control of the select candidate intergenic sequences, the increase is not simply an effect of exposure to NaCl. Chapter 3. Results and Discussion 30

(a) Constitutive Expression Control (b) ibpA

(c) gadA (d) gadB Chapter 3. Results and Discussion 31

(e) dps (f) osmY

(g) yciG (h) poxB

Figure 3.1: Continuous Measurement of the Stress Responsive Promoter Constructs with Salt Stress Induced by the Addition of Sodium Chloride. All figures presented here have been truncated to begin at hour 3.5, and have been normalized as described in the main body of the text (OD-normalized fluorescence values for the no-added-salt condition have been subtracted from the OD-normalized fluorescence values for the salt- added conditions; the result is ∆F , reported on the vertical axis of each plot). The test condition with no additional salt stress added (0 mM NaCl) therefore appears as a flat baseline. Panels (b) to (h) are the seven stress responsive promoter constructs, and panel (a) is the constitutive expression control, as labelled. Chapter 3. Results and Discussion 32

Matching the previously-reported transcriptional results obtained in the E. coli strains MC4100 [24] and NC101 [27] (see Table 3.1), the experiments presented here showed no up-regulation of reporter protein expression from the select intergenic sequences upstream of genes ibpA, gadA, or gadB (Figure 3.1b-3.1d) in Nissle. In each case, exposure to salt reduced the expression of the reporter protein, in a largely concentration-dependent man- ner. (Note, however, that the constitutive expression control suggests that this may not be a specific regulatory response of these sequences to NaCl, but may instead represent a global effect of NaCl, similar to that which reduces the constitutive promoter’s output upon exposure to increasing NaCl concentrations.) The gadA and gadB gene promoters did show high levels of fluorescent reporter expression prior to normalization (results figure can be found in Appendix B.4), but this appears to be due to the known depen- dence of the gad genes’ activity upon entry into stationary phase [30, 31, 32, 24]: once the stationary phase effects are subtracted, the net effect of salt exposure on the gad genes is negative. As well, the gene ibpA is activated by the heat shock sigma factor σ32, and has been shown to protect cells from reactive oxygen species [33, 34, 35, 36], but experimental results presented here showed that its upstream intergenic region does not generate up-regulated activity in Nissle from exposure to NaCl.

Three of the four remaining intergenic sequences (associated with genes dps, osmY, and yciG) all showed up-regulation of fluorescent reporter protein expression, to varying degrees, when exposed to NaCl (Figure3.1h- 3.1g).

The dps intergenic sequence displayed a clear increase in fluorescent reporter ex- pression at 200 mM, 400 mM, and 600 mM NaCl concentrations, though the degree of expression does not uniformly increase with concentration. Expression dropped at a con- centration of 800 mM of NaCl, which could be from a toxicity effect or other influence of the high NaCl concentration. The previous transcriptional study [24] only applied a Chapter 3. Results and Discussion 33

300 mM concentration stress of NaCl, and the 800 mM concentration used in this study may be encountering a limitation in the cells’ ability to handle the imposed stress.

The osmY intergenic sequence-controlled expression also clearly increased upon NaCl exposure, and the quantitative trend showed an increase from 200 mM to 400 mM to 600 mM. Once again, the 800 mM concentration behaved anomalously, with lower ex- pression levels than were seen at 600 mM. Again, this may be an indication that 800 mM concentrations of NaCl are affecting the cells in a way that is not corrected by the nor- malization of the data, or that the cells are failing to handle the stress.

The yciG intergenic sequence yielded a pattern of reporter expression that showed some tendency to be up-regulated by exposure to NaCl, though the pattern of this up- regulation was unusual in both its timing and its concentration dependence. At some NaCl concentration levels (most prominently at 600 mM), there is a substantial decrease in expression between approximately hours 6 and 12 of the run, followed by a substan- tial increase in expression past hour 12. At the end of the 18 hour runs, the highest up-regulation is seen at 600 mM, followed by 200 mM, 400 mM, then 800 mM. It is not clear what causes either the unusual temporal response or the non-monotonic pattern of the maximal response to each NaCl concentration. The gene yciG corresponds to a hypothetical and uncharacterized protein [24], and infers that the chosen intergenic re- gion of this gene may also have unknown properties that are affecting the results of the experiments conducted here.

The final intergenic sequence, from upstream of the poxB gene, did not demonstrate any sustained up-regulation of fluorescent reporter expression (Figure3.1h) in response to varying NaCl concentrations, though the 200 mM concentration showed a brief positive response in the early hours of those runs. The poxB gene had previously been shown to Chapter 3. Results and Discussion 34 have up-regulated NaCl-responsive transcription in the E. coli strain MC4100[24], but no such response was observed in the Nissle strain tested here. It is possible that this represents a strain-specific variation, or the selected candidate intergenic region failed to capture a necessary regulatory element.

3.5.5 Potassium Chloride Dose Response

Dissolved NaCl exposes a cell population to sodium ions, chloride ions, and any osmotic stresses associated with gradients of ionic concentration between the inside and outside of the cells. To begin investigating the question of whether the observed NaCl-dependent responses were caused by sodium, chlorine, or generic osmotic stress, experiments with an alternative salt as a stressor molecule were conducted. Potassium chloride (KCl) is a common NaCl substitute (commercially and academically), and produces the same chlorine ion concentrations while replacing sodium ions with potassium ions. Since the monovalent sodium and potassium cations are known to have different effects on the properties of the plasma membrane [37], similar expression responses are expected from the selected candidate sequences only if the regulatory effect is dominated by the chloride ions in each case. Presented in Figure 3.2 is the experimental results from the KCl dose response testing. It followed the same experimental design as the NaCl stress response testing, with the only difference being the addition of KCl instead of NaCl, at the same concentrations as before.

As with NaCl, the constitutive expression control showed a concentration-dependent reduction in expression upon exposure to KCl (Figure 3.2a). This raises the possibility that this response could be related to the presence of chloride ions or to an overall osmotic stress, but further experiments would be required to determine the exact source of the observed NaCl- and KCl-dependent reductions in expression, as one possibility may be Chapter 3. Results and Discussion 35 that the salt ions were quenching GFP protein or inducing degradation, leading to lower fluorescence signal recorded.

The three intergenic sequences that showed no up-regulation of NaCl both in the previous literature and in our experiments (associated with genes ibpA, gadA, and gadB) continued the same behaviour in response to KCl, showing greater decreases in fluores- cent reporter expression as the KCl concentration increased (Figures 3.2b-3.2d).

The three intergenic sequences that did display up-regulation of expression in response to NaCl showed either no response, or a much weaker response upon exposure to KCl. The dps sequence showed slight up-regulation at early parts of the low-concentration runs, but generally the responses to KCl are negative (Figure 3.2e). Since the large nega- tive values tend to obscure the positive responses when plotted together, the 200 mM runs have been plotted separately in Figure3.3a. The osmY sequence showed up-regulation of expression in response to KCl, but with a very different profile: the NaCl response tended to reach a sustained output level, while the KCl responses tended to peak early in each run, then vanish by the end of the experiment (Figure 3.2f). The yciG sequence no longer demonstrated up-regulation in response to KCl; instead, the reporter output uniformly decreased with increasing KCl concentration (Figure 3.2g). Here again, the large negative values make it difficult to see the smaller positive responses, therefore, the 200 mM runs have been plotted separately in Figure 3.3b. In both the dps and yciG 200 mM KCl runs, one biological replicate demonstrated significantly different behaviour than the other two, for reasons that are not currently known. The poxB intergenic region that showed no response to NaCl exposure behaved similarly upon KCl exposure, with reporter protein fluorescence decreasing uniformly with increasing KCl concentration. Chapter 3. Results and Discussion 36

(a) Constitutive Expression Control (b) ibpA

(c) gadA (d) gadB Chapter 3. Results and Discussion 37

(e) dps (f) osmY

(g) yciG (h) poxB

Figure 3.2: Continuous Measurement of the Stress Responsive Promoter Constructs with Salt Stress Induced by the Addition of Potassium Chloride. All figures presented here have been truncated to begin at hour 4.5, and have been normalized as described in the main body of the text (OD-normalized fluorescence values for the no-added-salt condition have been subtracted from the OD-normalized fluorescence values for the salt- added conditions; the result is ∆F , reported on the vertical axis of each plot). The test condition with no additional stress (no added KCl) therefore appears as a flat baseline. Panels (b) to (h) are the seven stress responsive promoter constructs, and panel (a) is the constitutive expression control, as labelled. Chapter 3. Results and Discussion 38

(a) dps (b) yciG

Figure 3.3: All figures presented here have been truncated to begin at hour 4, and have been normalized as described in the main body of the text (OD-normalized fluorescence values for the no-added-salt condition have been subtracted from the OD-normalized fluorescence values for the salt-added conditions; the result is ∆F , reported on the vertical axis of each plot). The test condition with no additional stress added (0 mM KCl) therefore appears as a flat baseline.

Though it seems that KCl does have a certain effect on these stress responsive pro- moters, further experimentation would be needed to characterize this unique behaviour, as well as differentiate the physiological effects that K+ vs Na+ have on these promoters as well as on Nissle cells.

3.5.6 pH Downshift - Acidic Stress

The final set of conditions examined was acidic stress, where the pH was decreased through the addition of MES buffer. According to previous studies [24, 38], the addition of both 100 mM and 170 mM MES have been found to decrease media pH to pH 5.5 and pH 5, respectively. These conditions were replicated here with the set of seven stress responsive sequences, as well as the constitutive expression control. The only variation from this pH shift experiment compared to the previous salt stress tests was the overall growth and measurement time. A period of 24 hours was measured instead to maximize experimental range, as well as explore an extended pH effect on the cell culture as it Chapter 3. Results and Discussion 39

remains in stationary phase. No significant differences were observed with the extension of growth and measurement duration.

As before, a constitutive promoter’s expression of the same fluorescent reporter pro- tein was tested, to expose any global effects of exposure to the acidic stress, on the cells, promoter, or fluorescent reporter. Figure 3.4a shows that both pH 5 and pH 5.5 condi- tions result in moderate decreases in fluorescence output.

Based on previously-reported transcriptional results in E. coli strain MC4100 [24], the gadA and gadB sequences were the only two of the selected candidates that were ex- pected to show up-regulation when exposed to a downshift in pH. The observed protein expressions in the Nissle strain, however, do not match these previous results (Figures 3.4c& 3.4d): in both sets of runs, there is a transient increase in fluorescent reporter expression upon exposure to the lower-pH conditions, followed by a sustained decrease which continues until the end of each experimental run. The genes gadA and gadB en- code two isozymes of glutamate decarboxylase. As well, these genes have been shown to have varying levels of acid resistance [39, 40]. Evidently, gadA was found to be located in one of the chromosomal clusters of σS-dependent genes, which has also been referred to as the “fitness island for acid adaptation” in E. coli [41]. While gadA and gadB were shown to be strongly σS dependent during the entry into stationary phase [24], the same behaviour was observed here, as well as throughout stationary phase (Appendix B.4), their σS dependence was reduced or even abolished under acid stress conditions, which was seen here when negative fluorescence intensity was obtained when stationary phase normalization was performed (Figure 3.4c& 3.4d), as well as in the literature [24] when reporter fusions were created for the gad genes. One hypothesis for its abolished capa- bilities in activation under acid stress condition could be the lack of its regulatory genes such as gadX, gadW or gadE. The gene gadA has been linked to gadX and gadE within Chapter 3. Results and Discussion 40 the chromosomal cluster, and gadB has been linked to gadC to form an operon. As well, gadE has been identified as a transcriptional activator for several acid resistance genes including gadA. The separation of those promoters from its regulatory genes and activators could be the explanation for their unexpected behaviour here.

The intergenic sequences derived from the genes poxB, osmY, yciG, and ibpA did not respond to acidic stress in previous transcriptional studies [24, 27], and that same be- haviour was observed in experiments conducted here, with none of the sequences yielding sustained up-regulation of expression in response to either pH 5 or pH 5.5 (Figures 3.4h- 3.4b).

The intergenic sequence upstream of the dps gene did, surprisingly, demonstrate some up-regulation in response to pH 5 conditions (Figure 3.4e) despite not having displayed this behaviour in the previous transcriptional study [24]. It is not yet clear whether this is a strain-dependent change associated with testing in Nissle rather than MC4100, which requires further investigation. Chapter 3. Results and Discussion 41

(a) Constitutive Expression Control (b) ibpA

(c) gadA (d) gadB Chapter 3. Results and Discussion 42

(e) dps (f) osmY

(g) yciG (h) poxB

Figure 3.4: Continuous Measurement of the Stress Responsive Promoter Constructs with pH Downshift Induced by the Addition of MES Buffer. All figures presented here have been truncated to begin at hour 3, and have been normalized as described in the main body of the text (OD-normalized fluorescence values for pH have been subtracted from the OD-normalized fluorescence values for the other pH conditions; the result is ∆F , reported on the vertical axis of each plot). The test condition with no additional stress added (0 mM MES, pH 7) was subtracted from calculation, and presented as a flat baseline. Figures b) - h) are the seven stress responsive promoter constructs, and a) is the constitutive expression control, as labeled. Chapter 3. Results and Discussion 43

3.6 Measurements of Alternative Constructs

While experimenting with various measurement and culturing methods, alternative ver- sions of the original stress responsive constructs were built as described in Chapter 2.6. Preliminary continuous testing was performed for characterization of the constructs and the results can be found in Appendix B.3. Though these alternative constructs may be useful for future work, they will not be discussed in detail here.

3.7 Turbidostat

In an attempt to decouple the approach to stationary phase from the addition of other external stressors, a single module of the turbidostat from the Klavins lab at University of Washington was obtained [26]. A turbidostat is a feedback controlled, continuous culturing device that maintains an approximately constant user-defined optical density (Pictured in Appendix D.1). This is achieved by utilizing an ongoing OD measurement device, and a feedback loop for diluting media as necessary.

Assembly of the device was straightforward; all parts were connected via different types of wire for easy identification. However, getting it to function as intended took some troubleshooting. First, the Python code that controls the turbidostat, when or- dered to run from the command line, showed a response from the motherboard but no reciprocating action from the pinch valve. After extensive investigations, the lines of code which defined the method chosen to send information to the board was determined to be incompatible with the setup. Once this was corrected, the pinch valve was able to receive commands from the motherboard and the system was functional (Script can be found in Appendix D.2).

With the scripts fully functional, its capabilities of growing and maintaining a steady Chapter 3. Results and Discussion 44 state culture was tested, as well as different culturing methods. Wildtype Nissle was grown in the turbidostat with a pre-set desired steady state density defined by the OD value. OD measurements were taken continuously as the script required an input value for maintaining the OD. Those values were then used to plot a growth curve, and an os- cillating pattern was seen to confirm the functionality of the turbidostat (Appendix D.3).

M9 media was also experimented with due to it being a clear coloured media which reduces interference when fluorescence measurements are required. However, when ex- perimenting with M9 media, all approximately 14 mL of culture in the tube evaporated when left to grow overnight. Due to the slower growth rate presented by the M9 me- dia and the constant aeration of the culture by the turbidostat, the overnight culture evaporated before a desired density of population was reached. Though EZ Rich Defined Media could be used as a substitute, the substantial increase in price is not ideal for large volume culturing. Therefore, to eliminate the need of expensive clear-coloured media, as well as the potential threat of LB medias fluorescence signal interfering with the GFP reading, the RFP variant of the stress response promoter constructs were designed and built, as previously described. Chapter 4

Conclusion and Future Directions

Synthetic biology is an interdisciplinary approach to biology that seek to standardize biological components and develop them into parts that can be assembled into novel bi- ological systems for complex purposes. Among the different directions application could take, it is often important for these artificially assembled organisms to sense their envi- ronment. The goal of this project was to adapt E. coli’s own stress responsive system for the purpose of stress sensing. A collection of stress responsive promoter containing intergenic regions from the RpoS regulon were selected and tested for their ability to express GFP when exposed to varying amounts of external stressors (NaCl, KCl, and pH downshift).

Intergenic upstream sequences associated with genes poxB, ibpA, gadA, and gadB did not display any induced activity (fluorescent reporter protein production) under all imposed stress conditions and concentrations, despite previous literature results showing elevated transcript levels under NaCl (poxB) and acid (gadA, gadB) stress [24]. (ibpA had previously been shown to respond to oxidative stress [27], a condition that was ex- plored but without obtaining sufficiently conclusive results to include here; ibpA was tested against salts and acid stress to examine the possibility that cross-over between

45 Chapter 4. Conclusion and Future Directions 46

different stress response systems might result in it responding to those stresses.) Con- versely, as described in literature, intergenic regions associated with genes dps, osmY and yciG presented clear up-regulation of protein expression under all induced stress conditions of salts and acid.

Further characterization is required to improve our current understanding of the func- tionality and behaviour of the candidate parts we have examined here, before they would be ready for incorporation into the growing synthetic biology “toolbox”. Future work may include a bioinformatic analysis and truncation screening to identify and isolate the specific promoter sequences and consensus regulatory sequences included in the selected upstream intergenic regions. As well as an genomic analysis of sequence variabilities of the chosen intergenic regions across the different strains used in this project as well as literature (E. coli strain Nissle, K-12 MG1655, and MC4100). Using the turbidostat at high cell densities may be able to simulate stationary phase growth conditions while maintaining the population at a more consistent state over time: rather than having the cells grow under constantly-changing conditions in the small wells of a plate, it may be possible to maintain them in more constant near-stationary conditions, creating a better-controlled environment for testing. At the same time, different exposure time of the construct containing cells to the added stressors can also be experimented. To further confirm the production of the desired reporter protein, a quantitative protein analysis with SDS-PAGE and Western Blot can also be proposed with protein samples from vary- ing growth phases for comparison. Furthermore, it may be worthwhile to investigate the possible addition of the potentially necessary transcriptional regulators for the gad genes into the existing design, and the addition of a secondary copy of the rpoS gene outside of the native E. coli chromosome.

The data we have gathered here, while somewhat preliminary, does clearly establish Chapter 4. Conclusion and Future Directions 47 the potential of our candidate sequences to be used in synthetic biology circuits as sensors of salt and acid stress sensors. More generally, the results establish the utility of using even imperfectly characterized genes and their associated regulatory regions as elements in synthetic designs. Importantly, all of the results have been obtained in the E. coli Nissle 1917 strain, an organism that has gained a great deal of attention in synthetic biology for its combination of probiotic activity and access to the well-established suite of tools for E. coli genetic manipulation. With further testing and characterization, we expect that several of our candidates will serve as helpful options for synthetic biology designers to incorporate into their systems. Appendix A

Supplementary Information

A.1 List of Parts Sequences

The following sequences are presented in fasta file format.

>poxB intergenic promoter region. Gene ID 4490-06-01. Location 911,181...911,050. TCGCCTTATGCCCGATGATATTCCTTTCATCGGGCTATTTAACCGTTAGTGC CTCCTTTCTCTCCCATCCCTTCCCCCTCCGTCAGATGAACTAAACTTGTTAC CGTTATCACATTCAGGAGATGGAGAACC Found at https://www.ncbi.nlm.nih.gov/gene/946132

>dps intergenic promoter region. Gene ID 945101. Location 849,209...848,912 ATTTACATTTCTGCATGGTTATGCATAACCATGCAGAATTTCTCGCTACTTT TCCTCTACACCGTCTTTATATATCGAATTATGCAAAAGCATATTTATTCCGA AAATTCCTGGCGAGCAGATAAATAAGAATTGTTCTTATCAATATATCTAAC TCATTGAATCTTTATTAGTTTTGTTTTTCACGCTTGTTACCACTATTAGTGT GATAGGAACAGCCAGAATAGCGGAACACATAGCCGGTGCTATACTTAATCT CGTTAATTACTGGGACATAACATCAAGAGGATATGAAATT

48 Appendix A. Supplementary Information 49

Found at https://www.ncbi.nlm.nih.gov/gene/945101

>osmY intergenic promoter region. Gene ID 4497-12-24. Location 4,611,004...4,611,395 TGCCTCCAGGGCGCGGTAGCCGCTGCGCCCTGTCAATTTCCCTTCCTTATT AGCCGCTTACGGAATGTTCTTAAAACATTCACTTTTGCTTATGTTTTCGCTG ATATCCCGAGCGGTTTCAAAATTGTGATCTATATTTAACAAAGTGATGACA TTTCTGACGGCGTTAAATACCGTTCAATGCGTAGATATCAGTATCTAAAGC CGTCGATTGTCATTCTACCGATATTAATAACTGATTCAGAGGCTGTAATGG TCGTTATTCATCACTCATCGCTTTTGTGATGGCGACCATTGACTTCTGTAG AGGGTGAAGTCTCTCCCTATTCAGCAATGCAACCTCGTGTTGCCAGGCTCA AATTACGAGCAAACATACAGGAATAAATCG Found at https://www.ncbi.nlm.nih.gov/gene/948895

>yciG intergenic promoter region. Gene ID 4494-02-17. Location 1,316,415...1,316,036 TCCCACAGCCGCCAGTTCCGCTGGCGGCATTTTAACTTTCTTTAATGAAGC CGGAAAAATCCTAAATTCATTTAATATTTATCTTTTTACCGTTTCGCTTACC CCGGTCGAACGTCAACTTACGTCATTTTTCCGCCCAACAGTAATATAATCAA ACAAATTAATCCCGCAACATAACACCAGTAAAATCAATAATTTTCTCTAAGT CACTTATTCCTCAGGTAATTGTTAATATATCCAGAATGTTCCTCAAAATATA TTTTCCCTCTATCTTCTCGTTGCGCTTAATTTGACTAATTCTCATTAGCGAC TAATTTTAATGAGTGTCGACACACAACACTCATATTAATGAAACAATGCAA CGCAACGGGAGAAATAAC Found at https://www.ncbi.nlm.nih.gov/gene/947489

>ibpA intergenic promoter region. Gene ID 4496-01-29. Location 3,867,727...3,867,421 AATAAATTCATCTGTTGATCGTGGGTGTTGGCCTGATGAGTTATAGCGATC CCTTGCTGAAAATAACATCATCATTACGTCGCACTGTGGCGGCTATCGCAC Appendix A. Supplementary Information 50

TTTAACGTTTCGTGCTGCCCCCTCAGTCTATGCAATAGACCATAAACTGCAA AAAAAAGTCCGCTGATAAGGCTTGAAAAGTTCATTTCCAGACCCATTTTTA CATCGTAGCCGATGAGGACGCGCCTGATGGGTGTTCTGGCTACCTGACCTG TCCATTGTGGAAGGTCTTACATTCTCGCTGATTTCAGGAGCTATTGATT Found at https://www.ncbi.nlm.nih.gov/gene/948200

>gadA intergenic promoter region. Gene ID 4495-08-09. Location 3,667,790...3,667,581 TTAATTTGATCGCCCGAACAGCAATGTTTGGGCGATTTTTATTACGATAAT AAAGTCTGTTTTTAATATTATCATGTTAAATGTTTATATTATAAAAAGTCG TTTTTCTGCTTAGGATTTTGTTATTTAAATTAAGCCTGTAATGCCTTGCTTC CATTGCGGATAAATCCTACTTTTTTATTGCCTTCAAATAAATTTAAGGAGTT CGAA Found at https://www.ncbi.nlm.nih.gov/gene/948027

>gadB intergenic promoter region. Gene ID 4490-03-19. Location 1,572,406...1,572,046 TAACAGCCCCGTCAACACATCGTTGGCGGGGATTTTAGCAATATTCGCTAT TTTTATGTAATAATTTTATAAATGCGTTCAAAATAATAATCAAGTACTAATA GTGATATTTTAAGGTCTGATTTTTACGTGATAATTCAGGAGACACAGAATG CGCATAAAAATAACAGCATAAAACACCTTACCACCACCCAAGAATTTCATAT TGTATTGTTTTTCAATGAAAAAATATTATTCGCGTAATATCTCACGATAAA TAACATTAGGATTTTGTTATTTAAACACGAGTCCTTTGCACTTGCTTACTTT ATCGATAAATCCTACTTTTTTAATGCGATCCAATCATTTTAAGGAGTTTAAA Found at https://www.ncbi.nlm.nih.gov/gene/946058

>Synthetic consitutive promoter. Part ID: BBa J23100 TTGACGGCTAGCTCAGTCCTAGGTACAGTGCTAGC Appendix A. Supplementary Information 51

>Synthetic RBS. Part ID: BBa B0032 TACTAGAGTCACACAGGAAAGTACTAG

>sfgfp ATGAGCAAAGGCGAAGAACTGTTTACCGGCGTGGTGCCGATTCTGGTGGAA CTGGATGGCGATGTGAACGGCCATAAATTTAGCGTGCGCGGCGAAGGCGAA GGCGATGCGACCAACGGCAAACTGACCCTGAAATTTATTTGCACCACCGGC AAACTGCCGGTGCCGTGGCCGACCCTGGTGACCACCCTGACCTATGGCGTG CAGTGCTTTAGCCGCTATCCGGATCACATGAAACGCCATGATTTTTTTAAA AGCGCGATGCCGGAAGGCTATGTGCAGGAACGCACCATTAGCTTTAAAGAT GATGGCACCTATAAAACCCGCGCGGAAGTGAAATTTGAAGGCGATACCCTG GTGAACCGCATTGAACTGAAAGGCATTGATTTTAAAGAAGATGGCAACATT CTGGGCCATAAACTGGAATATAACTTTAACAGCCATAACGTGTATATTACC GCGGATAAACAGAAAAACGGCATTAAAGCGAACTTTAAAATTCGCCATAAC GTGGAAGATGGCAGCGTGCAGCTGGCGGATCATTATCAGCAGAACACCCCG ATTGGCGATGGCCCGGTGCTGCTGCCGGATAACCATTATCTGAGCACCCAG AGCGTGCTGAGCAAAGATCCGAACGAAAAACGCGATCACATGGTGCTGCTG GAATTTGTGACCGCGGCGGGCATTACCCATGGCATGGATGAACTGTATAAA TAA

>mrfp ATGGCTTCCTCCGAAGACGTTATCAAAGAGTTCATGCGTTTCAAAGTTCGT ATGGAAGGTTCCGTTAACGGTCACGAGTTCGAAATCGAAGGTGAAGGTGAA GGTCGTCCGTACGAAGGTACCCAGACCGCTAAACTGAAAGTTACCAAAGGT GGTCCGCTGCCGTTCGCTTGGGACATCCTGTCCCCGCAGTTCCAGTACGGT TCCAAAGCTTACGTTAAACACCCGGCTGACATCCCGGACTACCTGAAACTG TCCTTCCCGGAAGGTTTCAAATGGGAACGTGTTATGAACTTCGAAGACGGT Appendix A. Supplementary Information 52

GGTGTTGTTACCGTTACCCAGGACTCCTCCCTGCAAGACGGTGAGTTCATC TACAAAGTTAAACTGCGTGGTACCAACTTCCCGTCCGACGGTCCGGTTATG CAGAAAAAAACCATGGGTTGGGAAGCTTCCACCGAACGTATGTACCCGGAA GACGGTGCTCTGAAAGGTGAAATCAAAATGCGTCTGAAACTGAAAGACGGT GGTCACTACGACGCTGAAGTTAAAACCACCTACATGGCTAAAAAACCGGTT CAGCTGCCGGGTGCTTACAAAACCGACATCAAACTGGACATCACCTCCCAC AACGAAGACTACACCATCGTTGAACAGTACGAACGTGCTGAAGGTCGTCAC TCCACCGGTGCTTAATAA

>mCherry ATGGTGAGCAAGGGCGAGGAGGATAACATGGCCATCATCAAGGAGTTCATG CGCTTCAAGGTGCACATGGAGGGCTCCGTGAACGGCCACGAGTTCGAGATC GAGGGCGAGGGCGAGGGCCGCCCCTACGAGGGCACCCAGACCGCCAAGCTG AAGGTGACCAAGGGTGGCCCCCTGCCCTTCGCCTGGGACATCCTGTCCCCT CAGTTCATGTACGGCTCCAAGGCCTACGTGAAGCACCCCGCCGACATCCCC GACTACTTGAAGCTGTCCTTCCCCGAGGGCTTCAAGTGGGAGCGCGTGATG AACTTCGAGGACGGCGGCGTGGTGACCGTGACCCAGGACTCCTCCTTGCAG GACGGCGAGTTCATCTACAAGGTGAAGCTGCGCGGCACCAACTTCCCCTCC GACGGCCCCGTAATGCAGAAGAAGACCATGGGCTGGGAGGCCTCCTCCGAG CGGATGTACCCCGAGGACGGCGCCCTGAAGGGCGAGATCAAGCAGAGGCTG AAGCTGAAGGACGGCGGCCACTACGACGCTGAGGTCAAGACCACCTACAAG GCCAAGAAGCCCGTGCAGCTGCCCGGCGCCTACAACGTCAACATCAAGTTG GACATCACCTCCCACAACGAGGACTACACCATCGTGGAACAGTACGAACGC GCCGAGGGCCGCCACTCCACCTAA

>Synthetic terminator. Part ID: L2S2P21 CTCGGTACCAAATTCCAGAAAAGAGGCCTCCCGAAAGGGGGGCCTTTTTTC Appendix A. Supplementary Information 53

GTTTTGGTCC

>Synthetic terminator. Part ID: BBa B1006 AAAAAAAAACCCCGCCCCTGACAGGGCGGGGTTTTTTTT

>pANG539 circular plasmid backbone, indexed at the beginning of the synthetic insula- tor region GACGTCTGCAGTTTTATTCTCTCGCCAGCACTGTAATAGGCACTAAGCGTG CGTACACCTTAATCACCGCTTCATGCTAAGGTCCTGGCTGCATGCCATTGT AATAGCCACCAAAAGAGTGATGATAGTCATGGGTTCGAGAAACAAGGCAGT TCCGGGCTGAAAGTAGCGCCGGGTGTCACGCTAGGAGGCAATTCTATAAGA ATGCACACTGCACAAACACCCCATGTCGATACTGAACGAATCGACGCACAC TCCCTTCCTTGCCTGATTGTATCCGCATCTGATGCTACCGTGGTTGAGTTAC GCGACTTCCAGAGAAGAAGACTACTGACTTGAGCGTTCCGACTCAACACGC TAGGGACGTGAAGTCGATTCCTTCGATGCATTTTTGCCTTGCGACAGACCT CCTACTTAGATTGCCACACGCCACGCGTAGTGAGACATACACGTTCGTTGG GTTCACAACATAGCGTTCCATGAGGGCTAGAATTACCTACCGGCCTTCTAG AGGCATCAAATAAAACGAAAGGCTCAGTCGAAAGACTGGGCCTTTCGTTTT ATCTGTTGTTTGTCGGTGAACGCTCTCCTGAGTAGGACAAATCCGCCGCCC TAGACCTAGGGATATATTCCGCTTCCTCGCTCACTGACTCGCTACGCTCGG TCGTTCGACTGCGGCGAGCGGAAATGGCTTACGAACGGGGCGGAGATTTCC TGGAAGATGCCAGGAAGATACTTAACAGGGAAGTGAGAGGGCCGCGGCAA AGCCGTTTTTCCATAGGCTCCGCCCCCCTGACAAGCATCACGAAATCTGAC GCTCAAATCAGTGGTGGCGAAACCCGACAGGACTATAAAGATACCAGGCGT TTCCCCCTGGCGGCTCCCTCGTGCGCTCTCCTGTTCCTGCCTTTCGGTTTAC CGGTGTCATTCCGCTGTTATGGCCGCGTTTGTCTCATTCCACGCCTGACAC TCAGTTCCGGGTAGGCAGTTCGCTCCAAGCTGGACTGTATGCACGAACCCC Appendix A. Supplementary Information 54

CCGTTCAGTCCGACCGCTGCGCCTTATCCGGTAACTATCGTCTTGAGTCCA ACCCGGAAAGACATGCAAAAGCACCACTGGCAGCAGCCACTGGTAATTGAT TTAGAGGAGTTAGTCTTGAAGTCATGCGCCGGTTAAGGCTAAACTGAAAGG ACAAGTTTTGGTGACTGCGCTCCTCCAAGCCAGTTACCTCGGTTCAAAGAG TTGGTAGCTCAGAGAACCTTCGAAAAACCGCCCTGCAAGGCGGTTTTTTCG TTTTCAGAGCAAGAGATTACGCGCAGACCAAAACGATCTCAAGAAGATCAT CTTATTAATCAGATAAAATATTACTAGATTTCAGTGCAATTTATCTCTTCAA ATGTAGCACCTGAAGTCAGCCCCATACGATATAAGTTGTTACTAGTGCTTG GATTCTCACCAATAAAAAACGCCCGGCGGCAACCGAGCGTTCTGAACAAAT CCAGATGGAGTTCTGAGGTCATTACTGGATCTATCAACAGGAGTCCAAGCG AGCTCGACAGTTACCAATGCTTAATCAGTGAGGCACCTATCTCAGCGATCT GTCTATTTCGTTCATCCATAGTTGCCTGACTCCCCGTCGTGTAGATAACTAC GATACGGGAGGGCTTACCATCTGGCCCCAGTGCTGCAATGATACCGCGAGA CCCACGCTCACCGGCTCCAGATTTATCAGCAATAAACCAGCCAGCCGGAAG GGCCGAGCGCAGAAGTGGTCCTGCAACTTTATCCGCCTCCATCCAGTCTAT TAATTGTTGCCGGGAAGCTAGAGTAAGTAGTTCGCCAGTTAATAGTTTGCG CAACGTTGTTGCCATTGCTACAGGCATCGTGGTGTCACGCTCGTCGTTTGG TATGGCTTCATTCAGCTCCGGTTCCCAACGATCAAGGCGAGTTACATGATC CCCCATGTTGTGCAAAAAAGCGGTTAGCTCCTTCGGTCCTCCGATCGTTGT CAGAAGTAAGTTGGCCGCAGTGTTATCACTCATGGTTATGGCAGCACTGCA TAATTCTCTTACTGTCATGCCATCCGTAAGATGCTTTTCTGTGACTGGTGA GTACTCAACCAAGTCATTCTGAGAATAGTGTATGCGGCGACCGAGTTGCTC TTGCCCGGCGTCAACACGGGATAATACCGCGCCACATAGCAGAACTTTAAA AGTGCTCATCATTGGAAAACGTTCTTCGGGGCGAAAACTCTCAAGGATCTT ACCGCTGTTGAGATCCAGTTCGATGTAACCCACTCGTGCACCCAACTGATC TTCAGCATCTTTTACTTTCACCAGCGTTTCTGGGTGAGCAAAAACAGGAAG GCAAAATGCCGCAAAAAAGGGAATAAGGGCGACACGGAAATGTTGAATACT Appendix A. Supplementary Information 55

CATACTCTTCCTTTTTCAATATTATTGAAGCATTTATCAGGGTTATTGTCTC ATGAGCGGATACATATTTGAATGTATTTAGAAAAATAAACAAATAGGGGTT CCGCGCACATTTCCCCGAAAAGTGCCACCTGACGTCTAAGAAACCATTATT ATCATGACATTAACCTATAAAAATAGGCGTATCACGAGGCCCTTTCGTCTT CTAGACAACATCAGCAAGGAGAAAGGGGCTACCGGCGAACCAGCAGCCCCT TTATAAAGGCGCTTCAGTAGTCAGACCAGCATCAGTCCTGAAAAGGCGGGC CTGCGCCCGCCTCCAGGTTGCTACTTACCGGATTCGTAAGCCATGAAAGCC GCCACCTCCCTGTGTCCGTCTCTGTAACGAATCTCGCACAGCGATTTTCGT GTCAGATAAGTGAATATCAACAGTGTGAGACACACGATCAACACACACCAG ACAAGGGAACTTCGTGGTAGTTTCATGGCCTTCTTCTCCTTGCGCAAAGCG CGGTAAGAGGCTATCCTGATGTGGACTAGACATAGGGATGCCTCGTGGTGG TTAATGAAAATTAACTTACTACGGGGCTATCTTCTTTCTGCCACACAACACG GCAACAAACCACCTTCACGTCATGAGGCAGAAAGCCTCAAGCGCCGGGCAC ATCATAGCCCATATACCTGCACGCTGACCACACTCACTTTCCCTGAAAATAA TCCGCTCATTCAGACCGTTCACGGGAAATCCGTGTGATTGTTGCCGCATCA CGCTGCCTCCCGGAGTTTGTCTCGAGCACTTTTGTTACCCGCCAAACAAAA CCCAAAAACAACCCATACCCAACCCAATAAAACACCAAAACAAGACAAATAA TCATTGATTGATGGTTGAAATGGGGTAAACTTGACAAACAAACCCACTTAA AACCCAAAACATACCCAAACACACACCAAAAAAACACCATAAGGAGTTTTA TAAATGTTGGTATTCATTGATGACGGTTCAACAAACATCAAACTACAGTGG CAGGAAAGCGACGGAACAATTAAACAGCACATTAGCCCGAACAGCTTCAAA CGCGAGTGGGCAGTCTCTTTTGGTGATAAAAAGGTCTTTAACTACACACTG AACGGCGAACAGTATTCATTTGATCCAATCAGCCCGGATGCTGTAGTCACA ACCAATATCGCATGGCAATACAGCGACGTTAATGTCGTTGCAGTGCATCAC GCCTTACTGACCAGTGGTCTGCCGGTAAGCGAAGTGGATATTGTTTGCACA CTTCCTCTGACAGAGTATTACGACAGAAATAACCAACCCAATACGGAAAAT ATTGAGCGTAAGAAAGCAAACTTCCGGAAAAAAATTACATTAAATGGCGGG Appendix A. Supplementary Information 56

GATACATTCACAATAAAAGATGTAAAAGTCATGCCTGAATCTATACCGGCA GGTTATGAAGTTCTACAAGAACTGGATGAGTTAGATTCTTTATTAATTATA GATCTCGGGGGCACCACATTAGATATTTCTCAGGTAATGGGGAAATTATCG GGGATCAGTAAAATATACGGAGACTCATCTCTTGGTGTCTCTCTGGTTACA TCTGCAGTAAAAGATGCCCTTTCTCTTGCGAGAACAAAAGGAAGTAGCTAT CTTGCTGACGATATAATCATTCACAGAAAAGATAATAACTATCTGAAGCAA CGAATTAATGATGAGAACAAAATATCAATAGTCACCGAAGCAATGAATGAA GCACTTCGTAAACTTGAGCAACGTGTATTAAATACGCTCAATGAATTTTCT GGTTATACTCATGTTATGGTTATAGGCGGTGGCGCAGAATTAATATGCGAT GCAGTAAAAAAACACACACAGATTCGTGATGAACGTTTTTTCAAAACCAAT AACTCTCAATATGATTTAGTTAACGGTATGTATCTCATAGGTAATTAATGA TGGACAAGCGCAGAACCATTGCCTTCAAACTAAATCCAGATGTAAATCAAA CAGATAAAATTGTTTGTGATACACTGGACAGTATCCCGCAAGGGGAACGAA GCCGCCTTAACCGGGCCGCACTGACGGCAGGTCTGGCCTTATACAGACAAG ATCCCCGGACCCCTTTCCTTTTATGTGAGCTGCTGACGAAAGAAACCACAT TTTCAGATATCGTGAATATATTGAGATCGCTATTTCCAAAAGAGATGGCCG ATTTTAATTCTTCAATAGTCACTCAATCCTCTTCACAACAAGAGCAAAAAAG TGATGAAGAGACCAAAAAAAATGCGATGAAGCTAATAAATTAATTCAATTA TTATTGAGTTCCCTTTATCCACTATCAGGCTGGATAAAGGGAACTCAATCA AGTTATTTTCTTACCAGTCATTACATAATCGTTATTATGAAATAATCGTTTG CACTGTCTCTGTTATTCAGGCAATTTCAATAAAGGCACTTGCTCACGCTCT GTCATTTTCTGAAACTCTTCATGCTG Appendix A. Supplementary Information 57

A.2 Schematic of the Plasmid Backbone

Figure A.1: Schematic of the Plasmid Backbone Chosen for This Project: pANG539 Appendix A. Supplementary Information 58

A.3 List of Primers

Primer Name Primer Sequence

poxB-Gib-fwd CTATAAGAATGCACACTGCATCGCCTTATGCCCGATGATATTC poxB-Gib-rev CTTTGCTCATGGTTCTCCATCTCCTGAATG GFP-poxB-fwd ATGGAGAACCATGAGCAAAGGCGAAGAAC GFP-pA539-rev GTATCGACATGGGGTGTTTGGGACCAAAACGAAAAAAGG pANG539-fwd CAAACACCCCATGTCGATACTGAACGAATCG pANG539-rev TGCAGTGTGCATTCTTATAG dps-Gib-fwd CTATAAGAATGCACACTGCAATTTACATTTCTGCATGGTTATG dps-gib-rev CTTTGCTCATAATTTCATATCCTCTTGATGTTATG GFP-dps-fwd GATATGAAATTATGAGCAAAGGCGAAGAAC osmY-Gib-fwd CTATAAGAATGCACACTGCATTCTTGCCTCCAGGGCGC osmY-Gib-rev CTTTGCTCATCGATTTATTCCTGTATGTTTGCTCGTAATTTGAG GFP-osmY-fwd GAATAAATCGATGAGCAAAGGCGAAGAAC yciG-Gib-fwd CTATAAGAATGCACACTGCATCCCACAGCCGCCAGTTC yciG-Gib-rev CTTTGCTCATGTTATTTCTCCCGTTGCGTTGC GFP-yciG-fwd GAGAAATAACATGAGCAAAGGCGAAGAAC ibpA-Gib-fwd CTATAAGAATGCACACTGCAAATAAATTCATCTGTTGATCGTG ibpA-Gib-rev CTTTGCTCATAATCAATAGCTCCTGAAATC GFP-ibpA-fwd GCTATTGATTATGAGCAAAGGCGAAGAAC gadA-Gib-fwd CTATAAGAATGCACACTGCATTAATTTGATCGCCCGAAC gadA-Gib-rev CTTTGCTCATTTCGAACTCCTTAAATTTATTTG GFP-gadA-fwd GGAGTTCGAAATGAGCAAAGGCGAAGAAC gadB-Gib-fwd CTATAAGAATGCACACTGCATAACAGCCCCGTCAACAC gadB-Gib-rev CTTTGCTCATTTTAAACTCCTTAAAATGATTGGATCG GFP-gadB-fwd GGAGTTTAAAATGAGCAAAGGCGAAGAAC Zhang-001 GGAAGACGGTGCTCTGAAAG Zhang-002 AGCGGACCACCTTTGGTAACTTTC Ins0508F TTTATTCTCTCGCCAGCACTG Ins0457R GTGCATTCTTATAGAATTGCCTCC Zhang-101 CTAAGGTCCTGGCTGCATGCAAAAAAAACCCCGCCCTG Zhang-102 CTCTTTTGGTGGCTATTACAATGTTGACGGCTAGCTCAGTC Appendix A. Supplementary Information 59

Zhang-103 CATTGTAATAGCCACCAAAAGAGTG Zhang-104 GCATGCAGCCAGGACCTTAG Zhang-105 TGGATGAACTGTATAAATAATAACTCGGTACCAAATTCCA Zhang-106 AGGACTGAGCTAGCCGTCAATGCAGTGTGCATTCTTATAGA Zhang-107 CTATAAGAATGCACACTGCATTGACGGCTAGCTCAGTCCT Zhang-108 TGGAATTTGGTACCGAGTTATTATTTATACAGTTCATCCATGCCA Zhang-109 TAGCTACTAGAGTCACACAGGAAAGTACTAGATGAGCAAAGGCGAAGAAC Zhang-110 GCACTGTACCTAGGACTGAGCTAGCCGTCAATGCAGTGTGCATTCTTATAG Appendix A. Supplementary Information 60

A.4 Protocol for Preparation of Electrocompetent E

coli Cells

Pre- the following:

• 200 mL of LB media, store at room temperature

• 500 mL of MilliQ water, store at 4◦C

• 100 mL of 10% glycerol, store at 4◦C

Preparation procedure:

1. A 10 mL culture of LB media was inoculated with a streak of glycerol stocked Nissle and allowed to grow overnight at 37◦C in a shaking incubator at 250 RPM.

2. Inoculate 200 mL of LB media with the overnight starter culture at a dilution of 100× and incubate at 37◦C in a shaking incubator at 250 RPM. Measure OD 600 nm every hour, then every 15-20 minutes obove 0.2. When OD 600 nm equalls 0.5-0.7 (log phase growth, roughly 3 h), remove the cells and place on ice.

3. Chill culture for 20-30 min, swirling occasionally for even cooling.

4. Split the 200 mL culture evenly into four 50 mL Falcon tubes (previously chilled).

5. Spin (#1) in centrifuge at 1000 g (2300 rpm in F9 4x1000y rotor), 20 min at 4◦C.

6. Place tubes on ice. Decant supernatant immediately as cell pellet begins to lift off quickly. Gently resuspend each pellet in 50 mL ice-cold MilliQ water. (It may be

easier to resuspend in less ddH20 first.)

7. Spin (#2) in centrifuge at 1000 g, 20 min at 4◦C.

8. Place tubes on ice. Decant supernatant. Gently resuspend each pellet in 50 mL of ice-cold MilliQ water. Appendix A. Supplementary Information 61

9. Spin (#3) in centrifuge at 1000 g, 20 min at 4◦C.

10. Place tubes on ice. Decant supernatant. Gently resuspend each pellet in 5 mL ice-cold 10% glycerol. For each pair of Falcon tubes, transfer one of the 5 mL cell suspensions into the other one, therefore you should end up with two 50 mL conical Falcon tubes tubes on ice where each tube contains 10 mL of cells in 10% glycerol.

11. Spin (#4) in centrifuge at 1000 g (2229 rpm in 5810R Eppendorf with A-4-81 rotor), 20 min at 4◦C. At this time put the 0.6 mL eppendorf tubes on ice.

12. Place tubes on ice. Carefully decant supernatant or aspirate with a sterile Pasteur (pellets lose adherence in 10% glycerol). Gently resuspend each cell pellet in as little as possible ice-cold 10% glycerol.

13. With cell suspensions on ice, transfer 100 µL aliquots of cells in each pre-chilled 0.6 ml eppendorf tubes. Ideally, snap freeze tubes containing cells in liquid nitrogen. Store frozen cells at -80◦C

A.5 Protocol for Preparation of Chemicalcompetent

E coli Cells

The following protocol was obtained from Brendan Hussey. Materials:

• Plate of cells to be made competent

• TSS buffer

• LB media

• Ice

Glassware and Equipment: Appendix A. Supplementary Information 62

• Falcon tubes

• 500 µL Eppendorf tubes, on ice 200ml conical flask

• 200 µL pipetman or repeating pipettor 5ml pipette

Preparation:

• Grow a 5 ml overnight culture of cells in LB media. In the morning, dilute this culture back into 25-50 mL of fresh LB media in a 200 mL conical flask. You should aim to dilute the overnight culture by at least 1/100.

• Grow the diluted culture to an OD600 of 0.2 - 0.5. (You will get a very small pellet if you grow 25 mL to OD600 0.2)

• Put eppendorf tubes on ice now so that they are cold when cells are aliquoted into them later. If your culture is X mL, you will need X tubes. At this point you should also make sure that your TSS is being chilled (it should be stored at 4◦C but if you have just made it fresh then put it in an ice bath).

• Split the culture into two 50 ml falcon tubes and incubate on ice for 10 min.

• All subsequent steps should be carried out at 4◦C and the cells should be kept on ice wherever possible

• Centrifuge for 10 minutes at 3000 rpm and 4◦C.

• Remove supernatant. The cell pellets should be sufficiently solid that you can just pour off the supernatant if you are careful. Pipette out any remaining media.

• Resuspend in chilled TSS buffer. The volume of TSS to use is 10% of the culture volume that you spun down. You may need to vortex gently to fully resuspend the culture, keep an eye out for small cell aggregates even after the pellet is completely off the wall. Appendix A. Supplementary Information 63

• Add 100 µL aliquots to your chilled 0.6 mL eppendorfs and store at 80◦C

TSS Buffer To make 50 mL:

• 5 g PEG 8000

• 1.5 mL 1M MgCl2 (or 0.30g MgCl2*6H20) 2.5 mL DMSO

• Add LB to 50 mL

• Filter sterilize (0.22 m filter)

• Store at 4◦C or -20◦C. Appendix B

Supplemental Figures

B.1 Preliminary Experimental Results

(a)

(b)

Figure B.1: Preliminary experimental results from the first initial run

64 Appendix B. Supplemental Figures 65

B.2 Complete Time Series of Final Experimental Re-

sults

(a) Constitutive Control (b) ibpA

(c) gadA (d) gadB

(e) dps (f) osmY

(g) yciG (h) poxB Figure B.2: Complete Time Series of NaCl Experiments shown in Figure 3.1 Appendix B. Supplemental Figures 66

(a) Constitutive Control (b) ibpA

(c) gadA (d) gadB

(e) dps (f) osmY

(g) yciG (h) poxB Figure B.3: Complete Time Series of KCl Experiments shown in Figure 3.2 Appendix B. Supplemental Figures 67

(a) Constitutive Control (b) ibpA

(c) gadA (d) gadB

(e) dps (f) osmY

(g) yciG (h) poxB Figure B.4: Complete Time Series of pH Downshift Experiments shown in Figure 3.4 Appendix B. Supplemental Figures 68

B.3 Alternative Construct Experimental Results

(a) poxB (b) dps

(c) osmY (d) yciG

(e) gadA (f) gadB

Figure B.5: Continuous measurement of the alternative stress responsive promoter con- structs containing RFP reporter with salt, acid, and oxidative stress. Stress conditions induced are outlined in legends on graph. All figures presented here have been trun- cated to begin at hour 2.5, and have been normalized according to described. The test condition with no additional stress added (0 mM) was subtracted from calculation, and presented as a flat baseline. Appendix B. Supplemental Figures 69

B.4 gad Genes Fluorescence Results

(a) gadA NaCl (b) gadB NaCl

(c) gadA KCl (d) gadB KCl

(e) gadA pH Downshift (f) gadB pH Downshift

Figure B.6: gad Genes Fluorescence Measurements of All Conditions Appendix B. Supplemental Figures 70

B.5 Growth Curves of all Stress Responsive Con-

structs Appendix B. Supplemental Figures 71

(a) Constitutive Control (b) ibpA

(c) gadA (d) gadB

(e) dps (f) osmY

(g) yciG (h) poxB

Figure B.7: Growth Curve of All Constructs with NaCl Stress in Nissle. Appendix B. Supplemental Figures 72

(a) Constitutive Control (b) ibpA

(c) gadA (d) gadB

(e) dps (f) osmY

(g) yciG (h) poxB

Figure B.8: Growth Curve of All Constructs with KCl Stress in Nissle. Appendix B. Supplemental Figures 73

(a) Constitutive Control (b) ibpA

(c) gadA (d) gadB

(e) dps (f) osmY

(g) yciG (h) poxB

Figure B.9: Growth Curve of All Constructs with Acidic Stress With the Addition of MES buffer in Nissle. Appendix B. Supplemental Figures 74

B.6 Picture of Microplate at High Salt Concentra-

tions

Figure B.10: Picture taken from the bottom of an experimental plate with high salt concentrations for demonstration of cells clumping that produces interference with mea- surements. Plate layout as following: 3 columns (replicates) of 600 mM NaCl, 3 columns of 800 mM NaCl, 3 columns of 1000 mM NaCl, and 3 columns of various controls. Appendix C

Plate Reader Script

75 Appendix C. Plate Reader Script 76

Figure C.1: Tecan Infinite M1000 Pro Microplate Reader Script Written For Continuous Measurements Appendix D

Turbidostat

D.1 Turbidostat Apparatus

Figure D.1: Picture of the turbidostat apparatus set up

77 Appendix D. Turbidostat 78

D.2 Turbidostat Script

Declaration: All original code was obtained from previous lab member Jordan Ang, who obtained it elsewhere. The majority of the code was not written by this thesis author, however, modifications were made to gain control of the apparatus for our specific set up.

D.2.1 Mother Board Control Script Written in Python Lan-

guage

#!/usr/bin/env python

################################################################### # # This module makes the direct interface with the syphonstat machine (valve + OD measurement) # # A ’Board’ instance will be used by a higher-level controller # # It can only connects to the board, open / close the valve, and read an OD measurement # # The Board instance can also be used in ’VIRTUAL’ mode, to allow the testing and debugging of # controller codes # ##################################################################

## imports import serial # serial is a broadly used library to communicate via serial ports from time import sleep,time import virtual # another module used for simulating virtual syphonstats from math import log10

## the main and only class of the module class Board (object) :

# nothing is done at initiation Appendix D. Turbidostat 79 def __init__ (self) : self.connected = False self.last_OD_value = None self.is_valve_open = False self.port = None self.is_port_virtual = None self.machine_blank = 0.

# method to connect to the board via the port # the valve is closed after connection def connect (self,port_name) : if port_name == ’VIRTUAL’ : self.port = virtual.VirtualPort () self.is_port_virtual = True else : self.port = serial.Serial ( port = port_name , baudrate = 19200, timeout = 1, xonxoff=False, rtscts=False,dsrdtr=True) self.is_port_virtual = False self.connected = True self.open_valve ()

# method to open the valve def open_valve (self) : if self.connected : self.port.setRTS (True) self.is_valve_open = True else : raise Warning ("Not connected, cannot open the valve as was asked.")

# method to close the valve def close_valve (self) : if self.connected : self.port.setRTS (False) self.is_valve_open = False else : raise Warning ("Not connected, cannot close the valve as was asked.")

# method to take a OD measurement def take_OD_measurement (self) : if self.connected : # if normal port... if not self.is_port_virtual : # get a (good) reading from the board self.port.write ( bytearray([0]) ) board_read = self.port.read (8) Appendix D. Turbidostat 80

while len (board_read) != 8 : # try until the reading is successful raise Warning ( "OD read failed." ) sleep (self.reaction_delay) self.port.write ( bytearray([0]) ) board_read = self.port.read (8) # convert into an absorbance value txbytes = board_read[3::-1] #first 4 bytes rxbytes = board_read[7:3:-1] #next 4 bytes tx=int(txbytes.encode(’hex’),16) rx=int(rxbytes.encode(’hex’),16) self.last_OD_value = log10(float(tx)/float(rx)) - self.machine_blank # if virtual port else : self.last_OD_value = self.port.read() return self.last_OD_value else : # if not connected, issue a warning and return None raise Warning ("Not connected, cannot take OD measurement as was asked.") return None

D.2.2 Basic Control Script of the Turbidostat Written in Python Language

#!/usr/bin/env python

# User defined OD_setpoint # Measure OD every fixed period # Decide to open (if close) if OD > OD_setpoint # Decide to close (if open) if OD < OD_setpoint ( 1 - rel_delta_OD ) import sys import board import os.path from time import sleep, time

## read port COMPORT = ’/dev/cu.usbserial-AJV9ONYD’

## Constants PERIOD = 10.0 # frequency of one cycle (one OD measurement, eventually valve open / valve close) DILUTION_FACTOR = 0.1 # how much of the cycle the valve is Appendix D. Turbidostat 81

open in dilution phase MAX_OUTPUT_PERIOD = 120.0 REL_DELTA_OD = 0.05 # OD will switch between OD_setpoint * ( 1 - REL_DELTA_OD/2 ) and OD_setpoint ( 1 + REL_DELTA_OD/2) MAX_DELTA_OD_WITHOUT_OUTPUT = 0.001 BLANK_DURATION = 40.0 MIN_SLEEP = 0.1 TURBI_INDEX=’1’

## PATH and prefix to files PATH_PREFIX = ’C:\\Users\kath\Desktop\\’

#### Parsing calibration params ##with open ( PATH_PREFIX + ’calibration-params/calib-params_T-’ + str(TURBI_INDEX) + ’.txt’ ) as calib_params_file : ## CALIB_PARS = [ float(par) for par in calib_params_file.read().replace(’\n’,’’).split(’,’) ]

## Reading user OD_setpoint def read_OD_setpoint () : return 0.46 ## if not os.path.exists ( PATH_PREFIX + ’OD_setpoint.txt’ ) : ## with open ( PATH_PREFIX + ’OD_setpoint.txt’ , ’w’) as OD_setpoint_file : ## OD_setpoint_file.write ( ’0.3\n’ ) ## user_input = None ## while user_input != "ok" : ## user_input = raw_input ("Write your OD setpoint in the file, write ’ok’ and press enter\n") ## with open ( PATH_PREFIX + ’OD_setpoint.txt’ , ’r’) as OD_setpoint_file : ## OD_setpoint = [ float (OD) for OD in OD_setpoint_file.read().replace(’\n’, ’’).split(’\t’) ] ## return (max(OD_setpoint))

## Initialization of the board the_board = board.Board () the_board.connect ( COMPORT )

## To turn this into a known blank script blank = float (sys.argv[1])

## Blank measurements Appendix D. Turbidostat 82 t_blank = 0.0 blanks = [] user_input = None while user_input != "ok" : user_input = raw_input ( "Place BLANK tube in the chamber.\nWrite ’ok’ and press enter when done.\n" ) while t_blank < BLANK_DURATION : start_time = time () blank = the_board.take_OD_measurement () blanks.append (blank) print ( "BLANK MEASUREMENT = %f" % blank ) sleep ( PERIOD - time() + start_time ) t_blank += time() - start_time # average 5 last blank values if len (blanks) > 5 : blanks = blanks[-5:] blank = float (sum(blanks)) / len(blanks) else : raise Exception ( ’Too few blank values !? Increase blank duration and start again.’ )

## Inoculate or set the tube user_input = None while user_input != "ok" : user_input = raw_input ( "Inoculate or place CELL tube in the chamber.\nWrite ’ok’ and press enter when done.\n" )

## Prepare data writing while os.path.exists ( PATH_PREFIX + ’data_’ + ’1’ + ’.txt’) : user_input = None while user_input != "ok" : user_input = raw_input ("data file exists already, remove it, write ’ok’ and press enter\n") outfile = open ( PATH_PREFIX + ’data_’ + TURBI_INDEX + ’.txt’,’w’) outfile.write ( "rel_time_s,abs_time_s,OD,raw_OD,blank, dilution_phase,OD_min,OD_max\n" ) outfile.close ()

## Main loop time_zero = time () last_output_time = time () - MAX_OUTPUT_PERIOD dilution_phase = False PREVIOUS_OD = 0. Appendix D. Turbidostat 83 while True :

# get absolute time start_time = time ()

# reading OD_setpoint (can be changed live by the user) OD_SETPOINT = read_OD_setpoint () #Set to 0.3 OD_MAX = (1.0 + REL_DELTA_OD/2.) * OD_SETPOINT #3.075 OD_MIN = (1.0 - REL_DELTA_OD/2.) * OD_SETPOINT #2.925 print ( ’OD_MIN = %f , OD_MAX = %f’ % (OD_MIN,OD_MAX) )

# reading OD reading = the_board.take_OD_measurement () OD_machine = reading - blank

# apply correction from calibration OD = OD_machine ## OD = CALIB_PARS[0] * OD_machine * OD_machine * OD_machine + CALIB_PARS[1] * OD_machine * OD_machine + CALIB_PARS[2] * OD_machine print ( ’OD = %f (OD_machine = %f) --- Turbi #%s’ % (OD,OD_machine,TURBI_INDEX) )

# decide what to do based on OD, OD_MIN, OD_MAX if OD < OD_MIN : dilution_phase = False the_board.close_valve () if OD > OD_MAX : dilution_phase = True if dilution_phase : the_board.open_valve () sleep ( DILUTION_FACTOR * PERIOD )

# do the outputs if needed if time () - last_output_time > MAX_OUTPUT_PERIOD or abs(OD-PREVIOUS_OD) > MAX_DELTA_OD_WITHOUT_OUTPUT : outfile = open ( PATH_PREFIX + ’data_’ + TURBI_INDEX + ’.txt’,’a’) to_write = str(time()-time_zero) + "," + str(time()) + "," + str(OD) + "," to_write += str(reading) + "," + str(blank) + "," + str(int(dilution_phase)) + "," to_write += str(OD_MIN) + "," + str(OD_MAX) + "\n" outfile.write ( to_write ) outfile.close () last_output_time = time () PREVIOUS_OD = OD Appendix D. Turbidostat 84

# sleep until end of period sleep ( max ( MIN_SLEEP , PERIOD - time () + start_time ) )

D.3 Turbidostat Growth Curve

Figure D.2: Steady State Growth Curve of Wildtype E. coli Nissle in Turbidostat Appendix E

Data Analysis Scripts

E.1 Data Normalization Script Written in Python Language import numpy as np import matplotlib.pyplot as plt import re import csv from collections import OrderedDict def read_plate(reader):

next(reader) next(reader)

time = next(reader)[1:] time = [float(t)/60**2 for t in time]

next(reader)

dictionary =

for _ in range(96): line = next(reader) dictionary[line[0]] = [float(l) for l in line[1:]]

return dictionary, time def get_average(dictionary, keys):

raw_media = []

85 Appendix E. Data Analysis Scripts 86

for key in keys: raw_media.append(dictionary[key])

raw_media = np.array(raw_media)

average = np.mean(raw_media, 0)

return average def plot(time,final_results,key):

for i in range(4,7): plt.plot(time[46:],np.zeros(225),label = ’0mM’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[46:],final_results[key+str(i)][46:], label = ’200mM’,color=’indianred’) if i in [7,8,9]: plt.plot(time[46:],final_results[key+str(i)][46:], label = ’400mM’,color=’orange’) if i in [10,11,12]: plt.plot(time[46:], final_results[key+str(i)][46:], label = ’600mM’,color=’limegreen’) if i in [13,14,15]: plt.plot(time[46:], final_results[key+str(i)][46:], label = ’800mM’,color=’darkturquoise’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) plt.tight_layout() def read_and_normalise(save_path):

with open(save_path) as file:

reader = csv.reader(file)

OD_results, time = read_plate(reader)

line = next(reader)

GFP_results, time = read_plate(reader)

media_keys = [’G10’, ’G11’, ’G12’, ’H10’, ’H11’, ’H12’]

media_average_OD = get_average(OD_results, media_keys) Appendix E. Data Analysis Scripts 87

media_average_GFP = get_average(GFP_results, media_keys)

sample_keys = [key for key in GFP_results.keys() if key not in media_keys]

normalised_OD_results = normalised_GFP_results =

normalised_results =

for key in sample_keys: OD = np.array(OD_results[key]) normalised_OD = OD - media_average_OD

GFP = np.array(GFP_results[key]) normalised_GFP = GFP - media_average_GFP

normalised_OD_results[key] = normalised_OD normalised_GFP_results[key] = normalised_GFP

normalised_results[key] = normalised_GFP/normalised_OD

return normalised_results, time def read_OD(save_path): with open(save_path) as file:

reader = csv.reader(file)

OD_results, time = read_plate(reader)

line = next(reader)

GFP_results, time = read_plate(reader)

media_keys = [’G10’, ’G11’, ’G12’, ’H10’, ’H11’, ’H12’]

media_average_OD = get_average(OD_results, media_keys)

media_average_GFP = get_average(GFP_results, media_keys)

sample_keys = [key for key in GFP_results.keys() if key not in media_keys]

normalised_OD_results = Appendix E. Data Analysis Scripts 88

normalised_GFP_results =

normalised_results =

for key in sample_keys: OD = np.array(OD_results[key]) normalised_OD = OD - media_average_OD

GFP = np.array(GFP_results[key]) normalised_GFP = GFP - media_average_GFP

normalised_OD_results[key] = normalised_OD normalised_GFP_results[key] = normalised_GFP

normalised_results[key] = normalised_GFP/normalised_OD

return normalised_OD_results, time

E.2 NaCl Stress Tests Plotting Script Written in Python Language import numpy as np import matplotlib.pyplot as plt import re import csv from collections import OrderedDict from analysis_functions import * normalised_results_0_400,time = read_and_normalise(’aug_20_2019_NaCl_0_400.csv’) normalised_results_600_1000,time = read_and_normalise(’aug_21_2019_NaCl_600_1000.csv’) titles = [’poxB’,’dps’,’osmY’,’yciG’,’ibpA’,’gadA’,’gadB’,’Control #1’] wells = [’A’,’B’,’C’,’D’,’E’,’F’,’G’,’H’] final_results = for well in wells: zero_1 = normalised_results_0_400[well+’1’] zero_2 = normalised_results_0_400[well+’2’] Appendix E. Data Analysis Scripts 89

zero_3 = normalised_results_0_400[well+’3’]

for i in range(1,6):

if i in [1,2]: not_zero_1 = normalised_results_0_400[well+str(3*i+1)] not_zero_2 = normalised_results_0_400[well+str(3*i+2)] not_zero_3 = normalised_results_0_400[well+str(3*i+3)]

final_results[well+str(3*i+1)] = not_zero_1 - zero_1 final_results[well+str(3*i+2)] = not_zero_2 - zero_2 final_results[well+str(3*i+3)] = not_zero_3 - zero_3 else: not_zero_1 = normalised_results_600_1000[well+str(3*i-8)] not_zero_2 = normalised_results_600_1000[well+str(3*i-7)] not_zero_3 = normalised_results_600_1000[well+str(3*i-6)]

final_results[well+str(3*i+1)] = not_zero_1 - zero_1 final_results[well+str(3*i+2)] = not_zero_2 - zero_2 final_results[well+str(3*i+3)] = not_zero_3 - zero_3 print(final_results.keys()) plt.figure() plot(time,final_results,’A’) plt.savefig(’poxB_NaCl.png’) plt.figure() plot(time,final_results,’B’) plt.savefig(’dps_NaCl.png’) plt.figure() plot(time,final_results,’C’) plt.savefig(’osmY_NaCl.png’) plt.figure() plot(time,final_results,’D’) plt.savefig(’yciG_NaCl.png’) plt.figure() plot(time,final_results,’E’) plt.savefig(’ibpA_NaCl.png’) plt.figure() plot(time,final_results,’F’) Appendix E. Data Analysis Scripts 90

plt.savefig(’gadA_NaCl.png’)

plt.figure() plot(time,final_results,’G’) plt.savefig(’gadB_NaCl.png’)

plt.figure() plot(time,final_results,’H’) plt.savefig(’Control_1_NaCl.png’)

plt.figure() for i in range(1,10): if i in [1,2,3]: plt.plot(time[46:], normalised_results_0_400[’F’+str(i)][46:], label = ’0mM’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[46:], normalised_results_0_400[’F’+str(i)][46:], label = ’200mM’,color=’indianred’) if i in [7,8,9]: plt.plot(time[46:], normalised_results_0_400[’F’+str(i)][46:], label = ’400mM’,color=’orange’) if i in [1,2,3]: plt.plot(time[46:], normalised_results_600_1000[’F’+str(i)][46:], label = ’600mM’,color=’limegreen’) if i in [4,5,6]: plt.plot(time[46:], normalised_results_600_1000[’F’+str(i)][46:], label = ’800mM’,color=’darkturquoise’) if i in [7,8,9]: plt.plot(time[46:], normalised_results_600_1000[’F’+str(i)][46:], label = ’1000mM’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) plt.tight_layout() plt.savefig(’gadA_NaCl_F.png’) plt.figure() for i in range(1,19): if i in [1,2,3]: plt.plot(time[46:], normalised_results_0_400[’G’+str(i)][46:], label = ’0mM’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[46:], Appendix E. Data Analysis Scripts 91

normalised_results_0_400[’G’+str(i)][46:], label = ’200mM’,color=’indianred’) if i in [7,8,9]: plt.plot(time[46:], normalised_results_0_400[’G’+str(i)][46:], label = ’400mM’,color=’orange’) if i in [1,2,3]: plt.plot(time[46:], normalised_results_600_1000[’G’+str(i)][46:], label = ’600mM’,color=’limegreen’) if i in [4,5,6]: plt.plot(time[46:], normalised_results_600_1000[’G’+str(i)][46:], label = ’800mM’,color=’darkturquoise’) if i in [7,8,9]: plt.plot(time[46:], normalised_results_600_1000[’G’+str(i)][46:], label = ’1000mM’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) plt.tight_layout() plt.savefig(’gadB_NaCl_F.png’) plt.figure() plot(time,final_results,’A’) plt.savefig(’poxB_NaCl_C.png’) plt.figure() plot(time,final_results,’B’) plt.savefig(’dps_NaCl_C.png’) plt.figure() plot(time,final_results,’C’) plt.savefig(’osmY_NaCl_C.png’) plt.figure() plot(time,final_results,’D’) plt.savefig(’yciG_NaCl_C.png’) plt.figure() plot(time,final_results,’E’) plt.savefig(’ibpA_NaCl_C.png’) plt.figure() plot(time,final_results,’F’) Appendix E. Data Analysis Scripts 92 plt.savefig(’gadA_NaCl_C.png’) plt.figure() plot(time,final_results,’G’) plt.savefig(’gadB_NaCl_C.png’) plt.figure() plot(time,final_results,’H’) plt.savefig(’Control_1_NaCl_C.png’) plt.figure() for i in range(1,19): if i in [1,2,3]: plt.plot(time[1:],normalised_OD_400[’A’+str(i)][1:], label = ’0mM’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_400[’A’+str(i)][1:], label = ’200mM’,color=’indianred’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_400[’A’+str(i)][1:], label = ’400mM’,color=’orange’) if i in [1,2,3]: plt.plot(time[1:],normalised_OD_1000[’A’+str(i)][1:], label = ’600mM’,color=’limegreen’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_1000[’A’+str(i)][1:], label = ’800mM’,color=’darkturquoise’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_1000[’A’+str(i)][1:], label = ’1000mM’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) order = [0,6,12,1,7,13] plt.legend([handles[idx] for idx in order], [labels[idx] for idx in order]) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’poxB_NaCl_OD.png’) plt.figure() for i in range(1,19): if i in [1,2,3]: plt.plot(time[1:],normalised_OD_400[’B’+str(i)][1:], label = ’0mM’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_400[’B’+str(i)][1:], label = ’200mM’,color=’indianred’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_400[’B’+str(i)][1:], label = ’400mM’,color=’orange’) if i in [1,2,3]: plt.plot(time[1:],normalised_OD_1000[’B’+str(i)][1:], label = ’600mM’,color=’limegreen’) Appendix E. Data Analysis Scripts 93

if i in [4,5,6]: plt.plot(time[1:],normalised_OD_1000[’B’+str(i)][1:], label = ’800mM’,color=’darkturquoise’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_1000[’B’+str(i)][1:], label = ’1000mM’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) order = [0,6,12,1,7,13] plt.legend([handles[idx] for idx in order], [labels[idx] for idx in order]) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’dps_NaCl_OD.png’) plt.figure() for i in range(1,19): if i in [1,2,3]: plt.plot(time[1:],normalised_OD_400[’C’+str(i)][1:], label = ’0mM’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_400[’C’+str(i)][1:], label = ’200mM’,color=’indianred’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_400[’C’+str(i)][1:], label = ’400mM’,color=’orange’) if i in [1,2,3]: plt.plot(time[1:],normalised_OD_1000[’C’+str(i)][1:], label = ’600mM’,color=’limegreen’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_1000[’C’+str(i)][1:], label = ’800mM’,color=’darkturquoise’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_1000[’C’+str(i)][1:], label = ’1000mM’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) order = [0,6,12,1,7,13] plt.legend([handles[idx] for idx in order], [labels[idx] for idx in order]) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’osmY_NaCl_OD.png’) plt.figure() for i in range(1,19): if i in [1,2,3]: plt.plot(time[1:],normalised_OD_400[’D’+str(i)][1:], label = ’0mM’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_400[’D’+str(i)][1:], label = ’200mM’,color=’indianred’) Appendix E. Data Analysis Scripts 94

if i in [7,8,9]: plt.plot(time[1:],normalised_OD_400[’D’+str(i)][1:], label = ’400mM’,color=’orange’) if i in [1,2,3]: plt.plot(time[1:],normalised_OD_1000[’D’+str(i)][1:], label = ’600mM’,color=’limegreen’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_1000[’D’+str(i)][1:], label = ’800mM’,color=’darkturquoise’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_1000[’D’+str(i)][1:], label = ’1000mM’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) order = [0,6,12,1,7,13] plt.legend([handles[idx] for idx in order], [labels[idx] for idx in order]) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’yciG_NaCl_OD.png’) plt.figure() for i in range(1,19): if i in [1,2,3]: plt.plot(time[1:],normalised_OD_400[’E’+str(i)][1:], label = ’0mM’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_400[’E’+str(i)][1:], label = ’200mM’,color=’indianred’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_400[’E’+str(i)][1:], label = ’400mM’,color=’orange’) if i in [1,2,3]: plt.plot(time[1:],normalised_OD_1000[’E’+str(i)][1:], label = ’600mM’,color=’limegreen’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_1000[’E’+str(i)][1:], label = ’800mM’,color=’darkturquoise’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_1000[’E’+str(i)][1:], label = ’1000mM’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) order = [0,6,12,1,7,13] plt.legend([handles[idx] for idx in order], [labels[idx] for idx in order]) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’ibpA_NaCl_OD.png’) plt.figure() for i in range(1,19): Appendix E. Data Analysis Scripts 95

if i in [1,2,3]: plt.plot(time[1:],normalised_OD_400[’F’+str(i)][1:], label = ’0mM’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_400[’F’+str(i)][1:], label = ’200mM’,color=’indianred’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_400[’F’+str(i)][1:], label = ’400mM’,color=’orange’) if i in [1,2,3]: plt.plot(time[1:],normalised_OD_1000[’F’+str(i)][1:], label = ’600mM’,color=’limegreen’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_1000[’F’+str(i)][1:], label = ’800mM’,color=’darkturquoise’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_1000[’F’+str(i)][1:], label = ’1000mM’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) order = [0,6,12,1,7,13] plt.legend([handles[idx] for idx in order], [labels[idx] for idx in order]) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’gadA_NaCl_OD.png’) plt.figure() for i in range(1,19): if i in [1,2,3]: plt.plot(time[1:],normalised_OD_400[’G’+str(i)][1:], label = ’0mM’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_400[’G’+str(i)][1:], label = ’200mM’,color=’indianred’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_400[’G’+str(i)][1:], label = ’400mM’,color=’orange’) if i in [1,2,3]: plt.plot(time[1:],normalised_OD_1000[’G’+str(i)][1:], label = ’600mM’,color=’limegreen’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_1000[’G’+str(i)][1:], label = ’800mM’,color=’darkturquoise’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_1000[’G’+str(i)][1:], label = ’1000mM’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) order = [0,6,12,1,7,13] plt.legend([handles[idx] for idx in order], [labels[idx] for idx in order]) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() Appendix E. Data Analysis Scripts 96 plt.savefig(’gadB_NaCl_OD.png’) plt.figure() for i in range(1,19): if i in [1,2,3]: plt.plot(time[1:],normalised_OD_400[’H’+str(i)][1:], label = ’0mM’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_400[’H’+str(i)][1:], label = ’200mM’,color=’indianred’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_400[’H’+str(i)][1:], label = ’400mM’,color=’orange’) if i in [1,2,3]: plt.plot(time[1:],normalised_OD_1000[’H’+str(i)][1:], label = ’600mM’,color=’limegreen’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_1000[’H’+str(i)][1:], label = ’800mM’,color=’darkturquoise’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_1000[’H’+str(i)][1:], label = ’1000mM’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) order = [0,6,12,1,7,13] plt.legend([handles[idx] for idx in order], [labels[idx] for idx in order]) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’Control_1_NaCl_OD.png’)

E.3 KCl Stress Tests Plotting Script Written in Python Language import numpy as np import matplotlib.pyplot as plt import re import csv from collections import OrderedDict from analysis_functions import * normalised_results_0_400,time = read_and_normalise(’aug_22_2019_KCl_0_400.csv’) normalised_results_600_1000,time = read_and_normalise(’aug_25_2019_KCl_600_1000.csv’) Appendix E. Data Analysis Scripts 97 titles = [’poxB’,’dps’,’osmY’,’yciG’,’ibpA’,’gadA’,’gadB’,’Control #1’] wells = [’A’,’B’,’C’,’D’,’E’,’F’,’G’,’H’] final_results = for well in wells: zero_1 = normalised_results_0_400[well+’1’] zero_2 = normalised_results_0_400[well+’2’] zero_3 = normalised_results_0_400[well+’3’]

for i in range(1,6):

if i in [1,2]: not_zero_1 = normalised_results_0_400[well+str(3*i+1)] not_zero_2 = normalised_results_0_400[well+str(3*i+2)] not_zero_3 = normalised_results_0_400[well+str(3*i+3)]

final_results[well+str(3*i+1)] = not_zero_1 - zero_1 final_results[well+str(3*i+2)] = not_zero_2 - zero_2 final_results[well+str(3*i+3)] = not_zero_3 - zero_3 else: not_zero_1 = normalised_results_600_1000[well+str(3*i-8)] not_zero_2 = normalised_results_600_1000[well+str(3*i-7)] not_zero_3 = normalised_results_600_1000[well+str(3*i-6)]

final_results[well+str(3*i+1)] = not_zero_1 - zero_1 final_results[well+str(3*i+2)] = not_zero_2 - zero_2 final_results[well+str(3*i+3)] = not_zero_3 - zero_3 print(final_results.keys()) plt.figure() plot(time,final_results,’A’) plt.savefig(’poxB_KCl.png’) plt.figure() plot(time,final_results,’B’) plt.savefig(’dps_KCl.png’) plt.figure() plot(time,final_results,’C’) plt.savefig(’osmY_KCl.png’) plt.figure() Appendix E. Data Analysis Scripts 98 plot(time,final_results,’D’) plt.savefig(’yciG_KCl.png’) plt.figure() plot(time,final_results,’E’) plt.savefig(’ibpA_KCl.png’) plt.figure() plot(time,final_results,’F’) plt.savefig(’gadA_KCl.png’) plt.figure() plot(time,final_results,’G’) plt.savefig(’gadB_KCl.png’) plt.figure() plot(time,final_results,’H’) plt.savefig(’Control_1_KCl.png’) plt.figure() for i in range(1,10): if i in [1,2,3]: plt.plot(time[46:], normalised_results_0_400[’F’+str(i)][46:], label = ’0mM’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[46:], normalised_results_0_400[’F’+str(i)][46:], label = ’200mM’,color=’indianred’) if i in [7,8,9]: plt.plot(time[46:], normalised_results_0_400[’F’+str(i)][46:], label = ’400mM’,color=’orange’) if i in [1,2,3]: plt.plot(time[46:], normalised_results_600_1000[’F’+str(i)][46:], label = ’600mM’,color=’limegreen’) if i in [4,5,6]: plt.plot(time[46:], normalised_results_600_1000[’F’+str(i)][46:], label = ’800mM’,color=’darkturquoise’) if i in [7,8,9]: plt.plot(time[46:], normalised_results_600_1000[’F’+str(i)][46:], label = ’1000mM’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) Appendix E. Data Analysis Scripts 99

plt.ylim(-10000,50000) plt.tight_layout() plt.savefig(’gadA_KCl_F.png’)

plt.figure() for i in range(1,19): if i in [1,2,3]: plt.plot(time[46:], normalised_results_0_400[’G’+str(i)][46:], label = ’0mM’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[46:], normalised_results_0_400[’G’+str(i)][46:], label = ’200mM’,color=’indianred’) if i in [7,8,9]: plt.plot(time[46:], normalised_results_0_400[’G’+str(i)][46:], label = ’400mM’,color=’orange’) if i in [1,2,3]: plt.plot(time[46:], normalised_results_600_1000[’G’+str(i)][46:], label = ’600mM’,color=’limegreen’) if i in [4,5,6]: plt.plot(time[46:], normalised_results_600_1000[’G’+str(i)][46:], label = ’800mM’,color=’darkturquoise’) if i in [7,8,9]: plt.plot(time[46:], normalised_results_600_1000[’G’+str(i)][46:], label = ’1000mM’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) plt.tight_layout() plt.savefig(’gadB_KCl_F.png’) plt.figure() plot(time,final_results,’A’) plt.savefig(’poxB_KCl_C.png’) plt.figure() plot(time,final_results,’B’) plt.savefig(’dps_KCl_C.png’) plt.figure() plot(time,final_results,’C’) plt.savefig(’osmY_KCl_C.png’) plt.figure() Appendix E. Data Analysis Scripts 100 plot(time,final_results,’D’) plt.savefig(’yciG_KCl_C.png’) plt.figure() plot(time,final_results,’E’) plt.savefig(’ibpA_KCl_C.png’) plt.figure() plot(time,final_results,’F’) plt.savefig(’gadA_KCl_C.png’) plt.figure() plot(time,final_results,’G’) plt.savefig(’gadB_KCl_C.png’) plt.figure() plot(time,final_results,’H’) plt.savefig(’Control_1_KCl_C.png’) plt.figure() for i in range(1,19): if i in [1,2,3]: plt.plot(time[1:],normalised_OD_400[’A’+str(i)][1:], label = ’0mM’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_400[’A’+str(i)][1:], label = ’200mM’,color=’indianred’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_400[’A’+str(i)][1:], label = ’400mM’,color=’orange’) if i in [1,2,3]: plt.plot(time[1:],normalised_OD_1000[’A’+str(i)][1:], label = ’600mM’,color=’limegreen’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_1000[’A’+str(i)][1:], label = ’800mM’,color=’darkturquoise’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_1000[’A’+str(i)][1:], label = ’1000mM’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) order = [0,6,12,1,7,13] plt.legend([handles[idx] for idx in order], [labels[idx] for idx in order]) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’poxB_KCl_OD.png’) Appendix E. Data Analysis Scripts 101 plt.figure() for i in range(1,19): if i in [1,2,3]: plt.plot(time[1:],normalised_OD_400[’B’+str(i)][1:], label = ’0mM’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_400[’B’+str(i)][1:], label = ’200mM’,color=’indianred’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_400[’B’+str(i)][1:], label = ’400mM’,color=’orange’) if i in [1,2,3]: plt.plot(time[1:],normalised_OD_1000[’B’+str(i)][1:], label = ’600mM’,color=’limegreen’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_1000[’B’+str(i)][1:], label = ’800mM’,color=’darkturquoise’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_1000[’B’+str(i)][1:], label = ’1000mM’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) order = [0,6,12,1,7,13] plt.legend([handles[idx] for idx in order], [labels[idx] for idx in order]) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’dps_KCl_OD.png’) plt.figure() for i in range(1,19): if i in [1,2,3]: plt.plot(time[1:],normalised_OD_400[’C’+str(i)][1:], label = ’0mM’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_400[’C’+str(i)][1:], label = ’200mM’,color=’indianred’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_400[’C’+str(i)][1:], label = ’400mM’,color=’orange’) if i in [1,2,3]: plt.plot(time[1:],normalised_OD_1000[’C’+str(i)][1:], label = ’600mM’,color=’limegreen’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_1000[’C’+str(i)][1:], label = ’800mM’,color=’darkturquoise’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_1000[’C’+str(i)][1:], label = ’1000mM’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) order = [0,6,12,1,7,13] plt.legend([handles[idx] for idx in order], [labels[idx] for idx in order]) plt.xlabel(’Time (Hours)’, fontsize = 14) Appendix E. Data Analysis Scripts 102 plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’osmY_KCl_OD.png’) plt.figure() for i in range(1,19): if i in [1,2,3]: plt.plot(time[1:],normalised_OD_400[’D’+str(i)][1:], label = ’0mM’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_400[’D’+str(i)][1:], label = ’200mM’,color=’indianred’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_400[’D’+str(i)][1:], label = ’400mM’,color=’orange’) if i in [1,2,3]: plt.plot(time[1:],normalised_OD_1000[’D’+str(i)][1:], label = ’600mM’,color=’limegreen’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_1000[’D’+str(i)][1:], label = ’800mM’,color=’darkturquoise’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_1000[’D’+str(i)][1:], label = ’1000mM’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) order = [0,6,12,1,7,13] plt.legend([handles[idx] for idx in order], [labels[idx] for idx in order]) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’yciG_KCl_OD.png’) plt.figure() for i in range(1,19): if i in [1,2,3]: plt.plot(time[1:],normalised_OD_400[’E’+str(i)][1:], label = ’0mM’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_400[’E’+str(i)][1:], label = ’200mM’,color=’indianred’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_400[’E’+str(i)][1:], label = ’400mM’,color=’orange’) if i in [1,2,3]: plt.plot(time[1:],normalised_OD_1000[’E’+str(i)][1:], label = ’600mM’,color=’limegreen’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_1000[’E’+str(i)][1:], label = ’800mM’,color=’darkturquoise’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_1000[’E’+str(i)][1:], label = ’1000mM’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) Appendix E. Data Analysis Scripts 103 order = [0,6,12,1,7,13] plt.legend([handles[idx] for idx in order], [labels[idx] for idx in order]) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’ibpA_KCl_OD.png’) plt.figure() for i in range(1,19): if i in [1,2,3]: plt.plot(time[1:],normalised_OD_400[’F’+str(i)][1:], label = ’0mM’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_400[’F’+str(i)][1:], label = ’200mM’,color=’indianred’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_400[’F’+str(i)][1:], label = ’400mM’,color=’orange’) if i in [1,2,3]: plt.plot(time[1:],normalised_OD_1000[’F’+str(i)][1:], label = ’600mM’,color=’limegreen’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_1000[’F’+str(i)][1:], label = ’800mM’,color=’darkturquoise’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_1000[’F’+str(i)][1:], label = ’1000mM’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) order = [0,6,12,1,7,13] plt.legend([handles[idx] for idx in order], [labels[idx] for idx in order]) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’gadA_KCl_OD.png’) plt.figure() for i in range(1,19): if i in [1,2,3]: plt.plot(time[1:],normalised_OD_400[’G’+str(i)][1:], label = ’0mM’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_400[’G’+str(i)][1:], label = ’200mM’,color=’indianred’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_400[’G’+str(i)][1:], label = ’400mM’,color=’orange’) if i in [1,2,3]: plt.plot(time[1:],normalised_OD_1000[’G’+str(i)][1:], label = ’600mM’,color=’limegreen’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_1000[’G’+str(i)][1:], label = ’800mM’,color=’darkturquoise’) Appendix E. Data Analysis Scripts 104

if i in [7,8,9]: plt.plot(time[1:],normalised_OD_1000[’G’+str(i)][1:], label = ’1000mM’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) order = [0,6,12,1,7,13] plt.legend([handles[idx] for idx in order], [labels[idx] for idx in order]) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’gadB_KCl_OD.png’) plt.figure() for i in range(1,19): if i in [1,2,3]: plt.plot(time[1:],normalised_OD_400[’H’+str(i)][1:], label = ’0mM’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_400[’H’+str(i)][1:], label = ’200mM’,color=’indianred’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_400[’H’+str(i)][1:], label = ’400mM’,color=’orange’) if i in [1,2,3]: plt.plot(time[1:],normalised_OD_1000[’H’+str(i)][1:], label = ’600mM’,color=’limegreen’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD_1000[’H’+str(i)][1:], label = ’800mM’,color=’darkturquoise’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD_1000[’H’+str(i)][1:], label = ’1000mM’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) order = [0,6,12,1,7,13] plt.legend([handles[idx] for idx in order], [labels[idx] for idx in order]) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’Control_1_KCl_OD.png’)

E.4 Acid Stress Tests Plotting Script Written in Python Language import numpy as np import matplotlib.pyplot as plt Appendix E. Data Analysis Scripts 105 import re import csv from collections import OrderedDict from analysis_functions import * normalised_results_MES,time = read_and_normalise(’aug-27-2019-MES.csv’) titles = [’poxB’,’dps’,’osmY’,’yciG’,’ibpA’,’gadA’,’gadB’,’Control #1’] wells = [’A’,’B’,’C’,’D’,’E’,’F’,’G’,’H’] final_results = for well in wells: zero_1 = normalised_results_MES[well+’1’] zero_2 = normalised_results_MES[well+’2’] zero_3 = normalised_results_MES[well+’3’]

for i in range(1,3):

not_zero_1 = normalised_results_MES[well+str(3*i+1)] not_zero_2 = normalised_results_MES[well+str(3*i+2)] not_zero_3 = normalised_results_MES[well+str(3*i+3)]

final_results[well+str(3*i+1)] = not_zero_1 - zero_1 final_results[well+str(3*i+2)] = not_zero_2 - zero_2 final_results[well+str(3*i+3)] = not_zero_3 - zero_3 print(final_results.keys()) plt.figure() for i in range(1,10): plt.plot(time[46:],np.zeros(315),label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[46:],final_results[’A’+str(i)][46:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[46:],final_results[’A’+str(i)][46:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) plt.tight_layout() plt.savefig(’poxB_MES.png’) plt.figure() Appendix E. Data Analysis Scripts 106

for i in range(1,10): plt.plot(time[46:],np.zeros(315),label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[46:],final_results[’B’+str(i)][46:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[46:],final_results[’B’+str(i)][46:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) plt.tight_layout() plt.savefig(’dps_MES.png’)

plt.figure() for i in range(1,10): plt.plot(time[46:],np.zeros(315),label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[46:],final_results[’C’+str(i)][46:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[46:],final_results[’C’+str(i)][46:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) plt.tight_layout() plt.savefig(’osmY_MES.png’) plt.figure() for i in range(1,10): plt.plot(time[46:],np.zeros(315),label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[46:],final_results[’D’+str(i)][46:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[46:],final_results[’D’+str(i)][46:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) plt.tight_layout() plt.savefig(’yciG_MES.png’) plt.figure() Appendix E. Data Analysis Scripts 107

for i in range(1,10): plt.plot(time[46:],np.zeros(315),label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[46:],final_results[’E’+str(i)][46:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[46:],final_results[’E’+str(i)][46:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) plt.tight_layout() plt.savefig(’ibpA_MES.png’)

plt.figure() for i in range(1,10): plt.plot(time[46:],np.zeros(315),label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[46:],final_results[’F’+str(i)][46:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[46:],final_results[’F’+str(i)][46:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) plt.tight_layout() plt.savefig(’gadA_MES.png’) plt.figure() for i in range(1,10): plt.plot(time[46:],np.zeros(315),label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[46:],final_results[’G’+str(i)][46:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[46:],final_results[’G’+str(i)][46:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) plt.tight_layout() plt.savefig(’gadB_MES.png’) plt.figure() Appendix E. Data Analysis Scripts 108

for i in range(1,10): plt.plot(time[46:],np.zeros(315),label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[46:],final_results[’H’+str(i)][46:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[46:],final_results[’H’+str(i)][46:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) plt.tight_layout() plt.savefig(’Positive_Control_1_MES.png’)

plt.figure() for i in range(1,10): if i in [1,2,3]: plt.plot(time[46:], normalised_results_MES[’F’+str(i)][46:], label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[46:], normalised_results_MES[’F’+str(i)][46:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[46:], normalised_results_MES[’F’+str(i)][46:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) plt.tight_layout() plt.savefig(’gadA_MES_F.png’) plt.figure() for i in range(1,10): if i in [1,2,3]: plt.plot(time[46:], normalised_results_MES[’G’+str(i)][46:], label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[46:], normalised_results_MES[’G’+str(i)][46:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[46:], normalised_results_MES[’G’+str(i)][46:], Appendix E. Data Analysis Scripts 109

label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) plt.tight_layout() plt.savefig(’gadB_MES_F.png’)

plt.figure() for i in range(1,10): plt.plot(time[1:],np.zeros(360), label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],final_results[’A’+str(i)][1:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[1:],final_results[’A’+str(i)][1:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) plt.savefig(’poxB_MES_C.png’) plt.tight_layout() plt.figure() for i in range(1,10): plt.plot(time[1:],np.zeros(360), label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],final_results[’B’+str(i)][1:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[1:],final_results[’B’+str(i)][1:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) plt.savefig(’dps_MES_C.png’) plt.tight_layout() plt.figure() for i in range(1,10): plt.plot(time[1:],np.zeros(360), Appendix E. Data Analysis Scripts 110

label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],final_results[’C’+str(i)][1:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[1:],final_results[’C’+str(i)][1:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) plt.savefig(’osmY_MES_C.png’) plt.tight_layout() plt.figure() for i in range(1,10): plt.plot(time[1:],np.zeros(360), label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],final_results[’D’+str(i)][1:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[1:],final_results[’D’+str(i)][1:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) plt.savefig(’yciG_MES_C.png’) plt.tight_layout() plt.figure() for i in range(1,10): plt.plot(time[1:],np.zeros(360), label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],final_results[’E’+str(i)][1:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[1:],final_results[’E’+str(i)][1:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) plt.savefig(’ibpA_MES_C.png’) plt.tight_layout() Appendix E. Data Analysis Scripts 111

plt.figure() for i in range(1,10): plt.plot(time[1:],np.zeros(360), label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],final_results[’F’+str(i)][1:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[1:],final_results[’F’+str(i)][1:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) plt.savefig(’gadA_MES_C.png’) plt.tight_layout()

plt.figure() for i in range(1,10): plt.plot(time[1:],np.zeros(360), label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],final_results[’G’+str(i)][1:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[1:],final_results[’G’+str(i)][1:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) plt.savefig(’gadB_MES_C.png’) plt.tight_layout() plt.figure() for i in range(1,10): plt.plot(time[1:],np.zeros(360), label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],final_results[’H’+str(i)][1:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[1:],final_results[’H’+str(i)][1:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’) plt.ylabel(’∆F (A.U.)0) Appendix E. Data Analysis Scripts 112

plt.savefig(’Control_1_MES_C.png’) plt.tight_layout() plt.figure() for i in range(1,10): if i in [1,2,3]: plt.plot(time[1:], normalised_OD[’A’+str(i)][1:], label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:], normalised_OD[’A’+str(i)][1:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[1:], normalised_OD[’A’+str(i)][1:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’poxB_MES_OD.png’) plt.figure() for i in range(1,10): if i in [1,2,3]: plt.plot(time[1:],normalised_OD[’B’+str(i)][1:], label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD[’B’+str(i)][1:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD[’B’+str(i)][1:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’dps_MES_OD.png’) plt.figure() for i in range(1,10): if i in [1,2,3]: plt.plot(time[1:],normalised_OD[’C’+str(i)][1:], label = ’pH 7’,color=’dimgray’) Appendix E. Data Analysis Scripts 113

if i in [4,5,6]: plt.plot(time[1:],normalised_OD[’C’+str(i)][1:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD[’C’+str(i)][1:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’osmY_MES_OD.png’) plt.figure() for i in range(1,10): if i in [1,2,3]: plt.plot(time[1:],normalised_OD[’D’+str(i)][1:], label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD[’D’+str(i)][1:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD[’D’+str(i)][1:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’yciG_MES_OD.png’) plt.figure() for i in range(1,10): if i in [1,2,3]: plt.plot(time[1:],normalised_OD[’E’+str(i)][1:], label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD[’E’+str(i)][1:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD[’E’+str(i)][1:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’ibpA_MES_OD.png’) Appendix E. Data Analysis Scripts 114

plt.figure() for i in range(1,10): if i in [1,2,3]: plt.plot(time[1:],normalised_OD[’F’+str(i)][1:], label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD[’F’+str(i)][1:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD[’F’+str(i)][1:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’gadA_MES_OD.png’) plt.figure() for i in range(1,10): if i in [1,2,3]: plt.plot(time[1:],normalised_OD[’G’+str(i)][1:], label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD[’G’+str(i)][1:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD[’G’+str(i)][1:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’gadB_MES_OD.png’) plt.figure() for i in range(1,10): if i in [1,2,3]: plt.plot(time[1:],normalised_OD[’H’+str(i)][1:], label = ’pH 7’,color=’dimgray’) if i in [4,5,6]: plt.plot(time[1:],normalised_OD[’H’+str(i)][1:], label = ’pH 5.5’,color=’darkgreen’) if i in [7,8,9]: plt.plot(time[1:],normalised_OD[’H’+str(i)][1:], label = ’pH 5’,color=’gold’) handles, labels = plt.gca().get_legend_handles_labels() Appendix E. Data Analysis Scripts 115 by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys()) plt.xlabel(’Time (Hours)’, fontsize = 14) plt.ylabel(’OD 600nm’, fontsize = 14) plt.tight_layout() plt.savefig(’Control_1_MES_OD.png’) Bibliography

[1] Richard Kelwick, James T MacDonald, Alexander J Webb, and Paul Freemont. Developments in the tools and methodologies of synthetic biology. Frontiers in bioengineering and biotechnology, 2:60, 2014.

[2] Binbin Chen, Hui Ling Lee, Yu Chyuan Heng, Niying Chua, Wei Suong Teo, Won Jae Choi, Susanna Su Jan Leong, Jee Loon Foo, and Matthew Wook Chang. Synthetic biology toolkits and applications in saccharomyces cerevisiae. Biotechnology ad- vances, 36(7):1870–1881, 2018.

[3] Yanfeng Liu, Long Liu, Jianghua Li, Guocheng Du, and Jian Chen. Synthetic biology toolbox and chassis development in bacillus subtilis. Trends in biotechnology, 2018.

[4] Min Yan Teh, Kean Hean Ooi, Shun Xiang Danny Teo, Mohammad Ehsan Bin Man- soor, Wen Zheng Shaun Lim, and Meng How Tan. An expanded synthetic biol- ogy toolkit for gene expression control in acetobacteraceae. ACS synthetic biology, 8(4):708–723, 2019.

[5] Konstantinos Vavitsas, Pierre Crozet, Marcos Hamborg Vinde, Fiona Davies, St´ephaneD Lemaire, and Claudia E Vickers. The synthetic biology toolkit for photosynthetic microorganisms. Plant physiology, pages pp–00345, 2019.

[6] Peng-Fei Xia, Hua Ling, Jee Loon Foo, and Matthew Wook Chang. Synthetic biology toolkits for metabolic engineering of cyanobacteria. Biotechnology journal, page 1800496, 2019.

[7] Brian P Landry and Jeffrey J Tabor. Engineering diagnostic and therapeutic gut bacteria. Microbiology spectrum, 5(5), 2017.

[8] Ann M Bayly, Alexander A Kortt, Peter J Hudson, and Barbara E Power. Large- scale bacterial fermentation and isolation of scfv multimers using a heat-inducible bacterial expression vector. Journal of immunological methods, 262(1-2):217–227, 2002.

[9] Paolo Boccazzi, Zhiyu Zhang, Kazuhiko Kurosawa, Nicolas Szita, Sanchita Bhat- tacharya, Klavs F Jensen, and Anthony J Sinskey. Differential gene expression pro- files and real-time measurements of growth parameters in saccharomyces cerevisiae grown in microliter-scale bioreactors equipped with internal stirring. Biotechnology progress, 22(3):710–717, 2006.

116 Bibliography 117

[10] Quanfeng Liang, Haojun Zhang, Shengnan Li, and Qingsheng Qi. Construction of stress-induced metabolic pathway from glucose to 1, 3-propanediol in escherichia coli. Applied microbiology and biotechnology, 89(1):57–62, 2011.

[11] Tat-Ming Lo, Si Hui Chng, Wei Suong Teo, Han-Saem Cho, and Matthew Wook Chang. A two-layer gene circuit for decoupling cell growth from metabolite produc- tion. Cell systems, 3(2):133–143, 2016.

[12] Joshua K Michener, Kate Thodey, Joe C Liang, and Christina D Smolke. Applica- tions of genetically-encoded biosensors for the construction and control of biosyn- thetic pathways. Metabolic engineering, 14(3):212–222, 2012.

[13] Hoang Long Pham, Adison Wong, Niying Chua, Wei Suong Teo, Wen Shan Yew, and Matthew Wook Chang. Engineering a riboswitch-based genetic platform for the self- directed evolution of acid-tolerant phenotypes. Nature communications, 8(1):411, 2017.

[14] Arun S Rajkumar, Guodong Liu, David Bergenholm, Dushica Arsovska, Mette Kris- tensen, Jens Nielsen, Michael K Jensen, and Jay D Keasling. Engineering of syn- thetic, stress-responsive yeast promoters. Nucleic acids research, 44(17):e136–e136, 2016.

[15] Chen-Yu Tsao, Sara Hooshangi, Hsuan-Chen Wu, James J Valdes, and William E Bentley. Autonomous induction of recombinant proteins by minimally rewiring na- tive quorum sensing regulon of e. coli. Metabolic engineering, 12(3):291–297, 2010.

[16] Jay D Keasling. Synthetic biology and the development of tools for metabolic engi- neering. Metabolic engineering, 14(3):189–195, 2012.

[17] Robert H Dahl, Fuzhong Zhang, Jorge Alonso-Gutierrez, Edward Baidoo, Tanveer S Batth, Alyssa M Redding-Johanson, Christopher J Petzold, Aindrila Mukhopad- hyay, Taek Soon Lee, Paul D Adams, et al. Engineering dynamic pathway regulation using stress-response promoters. Nature biotechnology, 31(11):1039, 2013.

[18] Frank Delvigne, Nathalie Gorret, Peter Neubauer, Ang´eliqueDelafosse, Marie-Laure Collignon, Dominique Toye, Michel Crine, Mathieu Boxus, Philippe Thonart, et al. Characterization of the response of gfp microbial biosensors sensitive to substrate limitation in scale-down bioreactors. Biochemical engineering journal, 55(2):131– 139, 2011.

[19] Man Bock Gu, Prasad S Dhurjati, Tina K Van Dyk, and Robert A LaRossa. A minia- ture bioreactor for sensing toxicity using recombinant bioluminescent escherichia coli cells. Biotechnology progress, 12(3):393–397, 1996.

[20] Sameer P Rupani, Man Bock Gu, Konstantin B Konstantinov, Prasad S Dhurjati, Tina K Van Dyk, and Robert A LaRossa. Characterization of the stress response of a bioluminescent biological sensor in batch and continuous cultures. Biotechnology progress, 12(3):387–392, 1996. Bibliography 118

[21] Karen M Polizzi and Cleo Kontoravdi. Genetically-encoded biosensors for moni- toring cellular stress in bioprocessing. Current opinion in biotechnology, 31:50–56, 2015. [22] Aurelia Battesti, Nadim Majdalani, and Susan Gottesman. The rpos-mediated gen- eral stress response in escherichia coli. Annual review of microbiology, 65:189–213, 2011. [23] Mark Paget. Bacterial sigma factors and anti-sigma factors: structure, function and distribution. Biomolecules, 5(3):1245–1265, 2015. [24] Harald Weber, Tino Polen, Johanna Heuveling, Volker F Wendisch, and Regine Hengge. Genome-wide analysis of the general stress response network in escherichia coli: σs-dependent genes, promoters, and sigma factor selectivity. Journal of bacte- riology, 187(5):1591–1603, 2005. [25] Vasili Hauryliuk, Gemma C Atkinson, Katsuhiko S Murakami, Tanel Tenson, and Kenn Gerdes. Recent functional insights into the role of (p) ppgpp in bacterial physiology. Nature Reviews Microbiology, 13(5):298, 2015. [26] Chris N Takahashi, Aaron W Miller, Felix Ekness, Maitreya J Dunham, and Eric Klavins. A low cost, customizable turbidostat for use in synthetic circuit character- ization. ACS synthetic biology, 4(1):32–38, 2014. [27] Laura G Patwa, Ting-Jia Fan, Sandrine Tchaptchet, Yang Liu, Yves A Lussier, R Balfour Sartor, and Jonathan J Hansen. Chronic intestinal inflammation induces stress-response genes in commensal escherichia coli. Gastroenterology, 141(5):1842– 1851, 2011.

[28] Sigma Aldrich. Buffer reference center. https://www.sigmaaldrich.com/ life-science/core-bioreagents/biological-buffers/learning-center/ buffer-reference-center.html, 2019. accessed:2019-09-18. [29] Paul Blainey, Martin Krzywinski, and Naomi Altman. Points of significance: repli- cation, 2014. [30] Zhuo Ma, Hope Richard, Don L Tucker, Tyrrell Conway, and John W Foster. Col- laborative regulation of escherichia coli glutamate-dependent acid resistance by two arac-like regulators, gadx and gadw (yhiw). Journal of bacteriology, 184(24):7001– 7012, 2002. [31] Angela Tramonti, Paolo Visca, Michele De Canio, Maurizio Falconi, and Daniela De Biase. Functional characterization and regulation of gadx, a gene encoding an arac/xyls-like transcriptional activator of the escherichia coli glutamic acid decar- boxylase system. Journal of bacteriology, 184(10):2603–2613, 2002. [32] Zhuo Ma, Shimei Gong, Hope Richard, Don L Tucker, Tyrrell Conway, and John W Foster. Gade (yhie) activates glutamate decarboxylase-dependent acid resistance in escherichia coli k-12. Molecular microbiology, 49(5):1309–1320, 2003. Bibliography 119

[33] Masanobu Kitagawa, Yoshinobu Matsumura, and Tetsuaki Tsuchido. Small heat shock proteins, ibpa and ibpb, are involved in resistances to heat and superoxide stresses in escherichia coli. FEMS microbiology letters, 184(2):165–171, 2000.

[34] Masanobu Kitagawa, Mizuho Miyakawa, Yoshinobu Matsumura, and Tetsuaki Tsuchido. Escherichia coli small heat shock proteins, ibpa and ibpb, protect en- zymes from inactivation by heat and oxidants. European journal of biochemistry, 269(12):2907–2917, 2002.

[35] Ewelina Matuszewska, Joanna Kwiatkowska, Dorota Kuczy´nska-Wi´snik,and Ewa Laskowska. Escherichia coli heat-shock proteins ibpa/b are involved in resistance to oxidative stress induced by copper. Microbiology, 154(6):1739–1747, 2008.

[36] Shoshy Altuvia, Dalit Weinstein-Fischer, Aixia Zhang, Lisa Postow, and Gisela Storz. A small, stable rna induced by oxidative stress: role as a pleiotropic reg- ulator and antimutator. Cell, 90(1):43–53, 1997.

[37] Akanksha Gandhi, Yuxiang Cui, Mingyang Zhou, and Nagendra P Shah. Effect of kcl substitution on bacterial viability of escherichia coli (atcc 25922) and selected probiotics. Journal of dairy science, 97(10):5939–5951, 2014.

[38] Vaida Seputien˙e,Audriusˇ Daugelaviˇcius,Kestutis Suˇzied˙elis,and Edita Suˇzied˙elien˙e. Acid response of exponentially growing escherichia coli k-12. Microbiological re- search, 161(1):65–74, 2006.

[39] Hope T Richard and John W Foster. Acid resistance in escherichia coli. Advances in applied microbiology, 52:167–186, 2003.

[40] Hope Richard and John W Foster. Escherichia coli glutamate-and arginine- dependent acid resistance systems increase internal ph and reverse transmembrane potential. Journal of bacteriology, 186(18):6032–6041, 2004.

[41] Florence Hommais, Evelyne Krin, Jean-Yves Coppee, Celine Lacroix, Edouard Yeramian, Antoine Danchin, and Philippe Bertin. Gade (yhie): a novel activa- tor involved in the response to acid environment in escherichia coli. Microbiology, 150(1):61–72, 2004.