Preface

This is the overview/ notebook of the data analysis for my master thesis. It contains most of the experiments I have conducted. Some paragraphs are rather short. An interpretation using literature is provided in the pdf document. Detailed protocolls are on benchling and in my lab book

Programming

Load function to import iCinac data

In order to import Data from the iCinac efficiently, I wrote up my own function. It supports importing data from a tab-separated file (*.tsv) that has been created using the export function of the iCinac software. A second file can and should be provided that contains the annotations (blocks, treatments, etc.) required for visualization, e.g. using ggplot or statistical tests. The load function has several options that are not all documented and or implemented yet.

#Script for importing iCInac data
#data from cinac has been obtained using export all to one file only one time column
#tab separated data
#add annotations with tab.anno file electrode is required for mapping
load.cinac<-function(filename,tab.anno,meta=TRUE,n.sens=12,one.time=TRUE,
                     vals=8){
  #meta not implemented yet
  #n.sens not fully implemented yet
  #one.time not implemented yet
  #vals not fully implemented yet
  # #loading required packages
  require(dplyr,quietly=TRUE)
  require(tidyr,quietly=TRUE)
  #defining function
  rename.electrodes<- function(path){
    m.path<-m.electrodes
    if (nchar(path)==m.path)  substr(path,m.path-5,m.path-4)
    else substr(path,m.path-5,m.path-3)
  }
  raw1<-read.csv(filename,stringsAsFactors = F)#reading in cinac data
  #extract electrode names
  write.table(raw1[(4*n.sens),],file="./temp", row.names = F,col.names = F,append = F,quote=F)
  electrodes <- read.table("./temp",sep="",stringsAsFactors = F)
  m.electrodes<- median(nchar(electrodes))
  electrodes<-electrodes%>%gather("X","long",1:n.sens)
  electrodes$short<-lapply(electrodes$long,FUN=rename.electrodes)
    #remove electrodes and Meta from raw
  write.table(raw1[-(1:(4*n.sens)),],file="./temp", row.names = F,col.names = F,append = F,quote=F)
  rawCinactable<-read.table("./temp",sep="",header=T) #read in stripped table
  output<-rawCinactable[0,1:(vals+1)] #create empty data frame
  output<-output%>%mutate(electrode=as.character()) #add electrode column
  
  #rearrange table 
  for(i in 1:n.sens){
    tmp<-rawCinactable[,c(1,(((i-1)*8+2):((i-1)*8+9)))]
    tmp<-tmp%>%mutate(electrode=rep(as.character(electrodes$short[i]),length(rawCinactable[,1])))
    names(tmp)<-names(output)
    output<- output%>%bind_rows(.,mutate(tmp))}

  #add annotation
  annotation<-read.table(tab.anno,sep=",",header=TRUE,stringsAsFactors = F)
  annotation$electrode<-as.character(annotation$electrode)
  output<-output%>%left_join(annotation,by="electrode")
  output<-output%>%mutate(trial=filename)
  return(output)
}

This should become a package, once I have implemented all features.

Propagation on different starter cultures

Experimental Design

Colonies of the strains MS22314 and MS22333 were incubated overnight at 30 C 3 different media:

  • M17lac (M17)
  • autoclaved bovine milk (amilk)
  • camel milk, heat treated at 85 C (camel)

Bovine(lowpast) and Camel milk was then innoculated with 0.5 % and the acidification and ORP were monitored

knitr::kable(read.table("11-01-annotation.csv",header=TRUE,sep=","),
 caption = "Experiment on 11 Jan 2017")
Experiment on 11 Jan 2017
electrode Strain Starter Medium Rep
A1 MS22314 M17 lowpast 1
A2 MS22314 M17 camel 1
A3 MS22314 M17 lowpast 2
A4 MS22314 Milk lowpast 1
A5 MS22314 Milk camel 1
A6 MS22314 Milk lowpast 2
A7 MS22333 M17 lowpast 1
A8 MS22333 M17 camel 1
A9 MS22333 M17 lowpast 2
A10 MS22333 Milk lowpast 1
A11 MS22333 Milk camel 1
A12 MS22333 Milk lowpast 2
knitr::kable(read.table("12-01-annotation.csv",header=TRUE,sep=","),
 caption = "Experiment on 12 Jan 2017")
Experiment on 12 Jan 2017
electrode Strain Starter Medium Rep
A12 MS22314 camel lowpast 1
A11 MS22314 camel lowpast 2
A6 MS22314 camel camel 1
A5 MS22314 camel camel 2
A8 MS22314 M17 camel 2
A10 MS22314 Milk camel 2
A4 MS22333 camel lowpast 1
A3 MS22333 camel lowpast 2
A2 MS22333 camel camel 1
A9 MS22333 camel camel 2
A7 MS22333 M17 camel 2
A1 MS22333 Milk camel 2
knitr::kable(read.table("12-01-annotation.csv",header=TRUE,sep=","),
 caption = "Experiment on 18 Jan 2017")
Experiment on 18 Jan 2017
electrode Strain Starter Medium Rep
A12 MS22314 camel lowpast 1
A11 MS22314 camel lowpast 2
A6 MS22314 camel camel 1
A5 MS22314 camel camel 2
A8 MS22314 M17 camel 2
A10 MS22314 Milk camel 2
A4 MS22333 camel lowpast 1
A3 MS22333 camel lowpast 2
A2 MS22333 camel camel 1
A9 MS22333 camel camel 2
A7 MS22333 M17 camel 2
A1 MS22333 Milk camel 2

Results

The iCinac software crashed while conducting one round of experiments, causing those straight lines with rapid drops. However plots of the data are shown below:

#importing data and annotations
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
dat.inc<-bind_rows(load.cinac(filename = "bensc-11-01-17-milk.tsv", tab.anno = "11-01-annotation.csv"), load.cinac(filename = "bensc-12-01-17-milk.tsv", tab.anno = "12-01-annotation.csv"), dat.1801<-load.cinac("bensc-18-01-17.tsv","18-01-annotation.csv"))
#removing NAs
dat.inc$nas<-is.na(dat.inc$Treatm)
dat.inc$Treatm[dat.inc$nas]<-""
#factorizing results
col_names <- names(read.table("18-01-annotation.csv",header=TRUE,sep=","))
dat.inc[col_names] <- lapply(dat.inc[col_names] , factor)
#plotting it out
require(ggplot2,quietly=TRUE)
ggplot(dat.inc)+
  geom_line(aes(x=Time.min.,y=pH.u_pH.,
                group=interaction(Strain,Starter,Medium,Rep,trial),
                color=Medium,
                linetype= Treatm
                ))+
  scale_color_discrete()+
  facet_grid(Strain~Starter) +theme_bw()

ggplot(dat.inc)+
  geom_line(aes(x=Time.min.,y=pHComp_ORP.mVolts.,
                group=interaction(Strain,Starter,Medium,Rep,trial),
                color=Medium,
                linetype= Treatm
                ))+
  scale_color_discrete()+
  facet_grid(Strain~Starter)+theme_bw()

Conclusions

  • It is quite clear that the MG1363 lost its plasmid.
  • Biological replicates are quite similiar, even when innoculum was frozen.
  • There could to be a carry over of nutrients on M17.
  • Washing the cells with maximum recovery eluent (spindown) produces similar results
  • While acidification is quite similar, redox potentials vary.
  • MS22314 showes a very different behaviour when grown propagated on autoclaved milk.

Supplementation of amino acids

To investigate whether the probable dependence on amino acid availability was due to shortage of a single amino acid, The effect of supplementation of different levels of amino acids was investigated in a few experiments.

Preliminary test - AA mix

A stock solution was prepared, containing arginine, leucine, phenylalanine, tyrosine, proline, and glycine (500 mg in 40 ml). 75 ml of heat treated camel milk were supplemented with 6 ml of amino acid stock solution and with washed cells, obtained from 375 µl M17lac. The results are shown in the graph below

dat.3101<-load.cinac(filename = "bensc-31-01.tsv",tab.anno = "31-01-annotation.csv",n.sens = 1)
col_names <- names(read.table("31-01-annotation.csv",header=TRUE,sep=","))
dat.inc[col_names] <- lapply(dat.inc[col_names] , factor)
gg.a<-ggplot()+
  geom_line(data=dat.3101,
            aes(x=Time.min.,y=pHComp_ORP.mVolts.))+theme_bw()+
  scale_x_continuous(limits=c(0,1000))
gg.b<-ggplot()+
  geom_line(data=dat.3101,
            aes(x=Time.min.,y=pH.u_pH.))+theme_bw()+
  scale_x_continuous(limits=c(0,1000))
require(grid,quietly=TRUE)
grid.newpage()
pushViewport(viewport(layout=grid.layout(1,2)))
viewport(layout=grid.layout(1,2))
## viewport[GRID.VP.64]
vplayout <- function(x,y)
  viewport(layout.pos.row=x,layout.pos.col=y)
print(gg.a+ggtitle("A"),vp=vplayout(1,1))
print(gg.b+ggtitle("B"),vp=vplayout(1,2))

Compared to the other experiments, the redox potential was decreased and acidification was delayed.

Ornithine and Proline

I suspected that this could be mainly attributed to proline and ornithine. To verify this assumption, fermentations with proline and ornithine were conducted. The experimental setup was the following:

knitr::kable(read.table("01-02-annotation.csv",header=TRUE,sep=","),
 caption = "Experiment on 01 Feb 2017")
Experiment on 01 Feb 2017
Strain Starter Medium Treatm electrode Rep AA Concentration.mM
MS22314 M17 camel wash A6 1 ornithine 2
MS22314 M17 camel wash A4 1 ornithine 50
MS22314 M17 camel wash A7 1 ornithine 10
MS22314 M17 camel wash A3 1 proline 2
MS22314 M17 camel wash A5 1 proline 50
MS22314 M17 camel wash A10 1 proline 10

The results are depicted below. The dashed lines represent the curves from the previous experiment

dat.0102<-load.cinac(filename = "bensc-01-02.tsv",tab.anno = "01-02-annotation.csv",n.sens=6)
gg.a<-ggplot(dat.0102)+
  geom_line(aes(x=Time.min.,y=pHComp_ORP.mVolts.,
                group=interaction(Strain,Starter,Medium,Rep,trial,Treatm,AA,Concentration.mM),
                color=interaction(Concentration.mM,AA,sep=" mM ")))+
  geom_line(data=dat.3101,
            aes(x=Time.min.,y=pHComp_ORP.mVolts.),linetype="dashed")+
  scale_color_brewer("Treatment",type="qual",palette = 3,guide=FALSE)+theme_bw()+
  scale_x_continuous(limits=c(0,1000))
gg.b<-ggplot(dat.0102)+
  geom_line(aes(x=Time.min.,y=pH.u_pH.,
                group=interaction(Strain,Starter,Medium,Rep,trial,Treatm,AA,Concentration.mM),
                color=interaction(Concentration.mM,AA,sep=" mM ")))+
  geom_line(data=dat.3101,
            aes(x=Time.min.,y=pH.u_pH.),linetype="dashed")+
  scale_color_brewer("Treatment",type="qual",palette = 3)+theme_bw()+
  scale_x_continuous(limits=c(0,1000))
grid.newpage()
pushViewport(viewport(layout=grid.layout(1,5)))
viewport(layout=grid.layout(1,2))
## viewport[GRID.VP.92]
vplayout <- function(x,y)
  viewport(layout.pos.row=x,layout.pos.col=y)
print(gg.a+ggtitle("A"),vp=vplayout(1,1:2))
print(gg.b+ggtitle("B"),vp=vplayout(1,3:5))

Conlusion

From these experiments I concluded that I would need to supplement at least 50 mM and that proline and ornithine were not explaining causing the previous observation. Therefore I conducted another experiment supplementing the other AAs at 50 mM.

AA experiment

Experimental Design

In order to conduct this experiment, I had to prepare new freeze stocks from the MS22314 on M17lac. It seemed to me the next day, that this batch lost its ability to grow on milk during propagation. As the 3 controls I was running seemed all fine, I decided to innoculate again with other freeze stocks. In short: The following experiments were innoculated at T0 with not acidifying MS22314 and then again innoculated at T 18h 50 min with MS22333. Data is shown from that time point

The setup was the following:

knitr::kable(read.table("04-03-annotation.csv",header=TRUE,sep=","),
 caption = "Experiment on 04 Feb 2017")
Experiment on 04 Feb 2017
Strain Starter Medium Treatm electrode Rep AA Concentration.mM Sample
MS22333 M17 Past3.5% wash A8 1 his 50 S1
MS22333 M17 Past3.5% wash A1 1 ile 50 S2
MS22333 M17 Past3.5% wash A4 1 lys 50 S3
MS22333 M17 Past3.5% wash A12 1 pro 50 S4
MS22333 M17 Past3.5% wash A10 1 gln 50 S5
MS22333 M17 Past3.5% wash A9 1 arg 50 S6
MS22333 M17 Past3.5% wash A3 1 ser 50 S7
MS22333 M17 Past3.5% wash A11 1 val 50 S8
MS22333 M17 Past3.5% wash A5 1 ort 50 S9
MS22333 M17 Past3.5% wash A2 1 none 0 S10
none M17 Past3.5% A6 1 none 0 S11
MS22333 M17 camel wash A7 1 none 0 S12

Results

dat.aa.0402<-load.cinac(filename = "bensc-04-02.txt",tab.anno = "04-03-annotation.csv",n.sens = 15)
dat.aa.0402<-filter(dat.aa.0402,electrode%in%c("A8","A1","A4","A12","A10","A9","A3","A11","A5","A2","A6","A7"))
dat.aa.0402$nas<-is.na(dat.aa.0402$Treatm)
dat.aa.0402$Treatm[dat.aa.0402$nas]<-""
col_names <- names(read.table("04-03-annotation.csv",header=TRUE,sep=","))
dat.aa.0402[col_names] <- lapply(dat.aa.0402[col_names] , factor)
start.time<-1130
dat.aa.sub<-dat.aa.0402%>%filter(Time.min.>start.time)

#Controls
gg.a<-ggplot() +
geom_line(data=filter(dat.aa.0402,AA=="none"),aes(x=Time.min.,y=pHComp_ORP.mVolts.,
                                                 group=interaction(Strain,Starter,Medium,Rep,trial,Treatm,AA),
                                                 color=interaction(Strain,Medium,sep=" on ")))+
  scale_color_discrete(guide=FALSE)
gg.b<-ggplot() +
  geom_line(data=filter(dat.aa.0402,AA=="none"),aes(x=Time.min.,y=pH.u_pH.,
                                                   group=interaction(Strain,Starter,Medium,Rep,trial,Treatm,AA),
                                                   color=interaction(Strain,Medium,sep=" on ")))+
  scale_color_discrete("Controls")
grid.newpage()
pushViewport(viewport(layout=grid.layout(1,5)))
viewport(layout=grid.layout(1,2))
## viewport[GRID.VP.122]
vplayout <- function(x,y)
  viewport(layout.pos.row=x,layout.pos.col=y)
print(gg.a+theme_bw(),vp=vplayout(1,1:2))
print(gg.b+theme_bw(),vp=vplayout(1,3:5))

#Experiments
ggplot() +
  geom_line(data=filter(dat.aa.sub,AA!="none"),aes(x=Time.min.,y=pHComp_ORP.mVolts.,
                group=interaction(Strain,Starter,Medium,Rep,trial,Treatm,AA)
                ))+
  facet_wrap(~AA)

ggplot() +
  geom_line(data=filter(dat.aa.sub,AA!="none"),aes(x=Time.min.,y=pH.u_pH.,
                                                   group=interaction(Strain,Starter,Medium,Rep,trial,Treatm,AA)
  ))+
  facet_wrap(~AA)

Discussion

  • When plotting in R, it shows that there was actually biological activity in the controls. Therefore the growth curves should be interpreted with caution.
  • Nevertheless, the minimal pH and ORP are summarized below:
sum.0402<-dat.aa.0402%>%group_by(AA,Strain,Medium)%>%summarise_at(c("pH.u_pH.","pHComp_ORP.mVolts."),
                                                                         min)
sum.tab<-sum.0402%>%arrange(desc(pHComp_ORP.mVolts.))
names(sum.tab)<-c("AA","Strain","Medium","pH","ORP")
knitr::kable(sum.tab,caption="Minimum pH and ORP. ort is ornithine.",digits=c(0,0,0,2,0))
Minimum pH and ORP. ort is ornithine.
AA Strain Medium pH ORP
none MS22333 camel 4.25 -124
arg MS22333 Past3.5% 8.77 -174
ile MS22333 Past3.5% 5.11 -226
pro MS22333 Past3.5% 4.33 -284
val MS22333 Past3.5% 4.66 -288
ser MS22333 Past3.5% 4.41 -292
his MS22333 Past3.5% 4.74 -299
none MS22333 Past3.5% 4.28 -312
none none Past3.5% 4.59 -316
gln MS22333 Past3.5% 4.25 -319
ort MS22333 Past3.5% 4.19 -322
lys MS22333 Past3.5% 4.49 -327

It seems like there are some interesting differences between the AAs. It would be probably worth repeating the experiments with proper innoculum and serial dillutions, if this turns out to be relevant for me. One thing I noticed here is the difference in oscillations. I have attributed them to be some sort of systematic error during the rapid drop of ORP, however in these experiments, the amplitude is clearly dependent on the supplemented AAs.

Sugar experiment I

I investigated the different sugars. The idea behind this being that the observed ORP might be dependent on the PTS transporters (and Gluc permease) expressed.

Experimental Design

tab<- read.table("./sugar-experiments/10-02-annotation.csv",header=TRUE,sep=",")
names(tab)<- c("Strain","Starter", "Innoc","Lac","Gluc","Galac","Milk","Treatm")
knitr::kable(tab[,-(9:10)],
 caption = "Experiment on 10 Feb 2017")
Experiment on 10 Feb 2017
Strain Starter Innoc Lac Gluc Galac Milk Treatm
MS22333 camel cow85 4.75 0.0 0.0 sod milliQ
MS22333 camel cow85 0.00 1.4 1.4 lac free milliQ
MS22333 camel cow85 0.00 3.6 1.4 lac free MilliQ +2.2g gluc
MS22333 camel cow85 2.20 1.4 1.4 lac free MilliQ +2.2g lac
MS22333 camel cow85 4.75 1.4 0.0 sod MilliQ +1.4g gluc
MS22333 camel cow85 4.75 2.2 0.0 sod MilliQ +2.2g gluc
none none cow85 4.75 0.0 0.0 sod milliQ
none none cow85 0.00 1.4 1.4 lac free milliQ
none none cow85 4.75 2.2 0.0 sod MilliQ +2.2g gluc

Results

This time I propagted the innoculum on camel milk to be safe. One can see that this caused a fairly long lag phase, because of the low cell density in the innoculum. As all 3 negative controls were fine, I used the data anyway.

dat.1002<-load.cinac(filename = "./sugar-experiments/bensc-10-02.txt",
                     tab.anno = "./sugar-experiments/10-02-annotation.csv",n.sens=9)
col_names <- names(read.table("./sugar-experiments/10-02-annotation.csv",header=TRUE,sep=","))
# do do it for some names in a vector named 'col_names'
dat.1002[col_names] <- lapply(dat.1002[col_names] , factor)

ggplot(filter(dat.1002,Time.min.>300)) +
  geom_line(aes(x=Time.min.,y=pH.u_pH.,
                group=interaction(Strain,Starter,Medium,trial,Treatm,Milk.type,Glucose.g.100g,Lactose.g.100g),
                linetype=Strain,
                color=interaction(Glucose.g.100g,Lactose.g.100g,sep=" & ")))+
  scale_color_brewer("Gluc and Lac",type="qual",palette = 3)+theme_bw()

The sub plots represent different lactose levels

ggplot(filter(dat.1002,Time.min.>300)) +
  geom_line(aes(x=Time.min.,y=pHComp_ORP.mVolts.,
                group=interaction(Strain,Starter,Medium,trial,Treatm,Milk.type,Glucose.g.100g,Lactose.g.100g),
                linetype=Strain,
                color=Glucose.g.100g))+
  facet_grid(Lactose.g.100g~1)+theme_bw()

This plot shows the ORP as a function of the pH.

ggplot(dat.1002) +
  geom_line(aes(x=pH.u_pH.,y=pHComp_ORP.mVolts.,
                group=interaction(Strain,Starter,Medium,trial,Treatm,Milk.type,Glucose.g.100g,Lactose.g.100g),
                linetype=Lactose.g.100g,
                color=Glucose.g.100g))+theme_bw()

The thrid plot shows the ORP as a function of the pH.

Discussion

This time the controls turned out to be actually fine. One can see some beginning biological activity from minute 900

One can see that the initial rate of acidification is dependent on the glucose concentration, rather than the lactose concentration. This indicates that catabolite repression works “normally” and there is a preference for glucose. However, this data should be treated with caution, as the lactose levels are given under the assumption that the lactase was completely inactivated by the heat treatment. Especially the similarity between “3.6&0” and “1.4&2.2” indicates that this might not have been the case.

Regardless, the second and the thrid plot indicate that there is not only a change in time but a different functional relationship between pH and observed ORP. As the transport proteins are different for the monosaccharide and disaccharide, while catabolism is fairly identical, this indicates that such membrane proteins might be in direct interaction with the probe.

Sugar experiments II

I repeated the experiments with proper starter cultures. I also supplemented 2 mM arginine in two experiments, as it had been reported elswhere that this would alter the glucose uptake rate. Cells would then use the arginine deiminase pathway to generate ATP. As an additional control, I supplemented NaCl in a concentration that generates a similiar osmotic pressure as the sugars supplemented.

Experimental Design

tab<- read.table("./sugar-experiments/10-02-annotation.csv",header=TRUE,sep=",")
names(tab)<- c("Strain","Starter", "Innoc","Lac","Gluc","Galac","Milk","Treatm")
knitr::kable(tab[,-(9:10)],
 caption = "Experiment on 10 Feb 2017")
Experiment on 10 Feb 2017
Strain Starter Innoc Lac Gluc Galac Milk Treatm
MS22333 camel cow85 4.75 0.0 0.0 sod milliQ
MS22333 camel cow85 0.00 1.4 1.4 lac free milliQ
MS22333 camel cow85 0.00 3.6 1.4 lac free MilliQ +2.2g gluc
MS22333 camel cow85 2.20 1.4 1.4 lac free MilliQ +2.2g lac
MS22333 camel cow85 4.75 1.4 0.0 sod MilliQ +1.4g gluc
MS22333 camel cow85 4.75 2.2 0.0 sod MilliQ +2.2g gluc
none none cow85 4.75 0.0 0.0 sod milliQ
none none cow85 0.00 1.4 1.4 lac free milliQ
none none cow85 4.75 2.2 0.0 sod MilliQ +2.2g gluc

Results

A clear dependence on the arginine supplementation

dat.1302<-load.cinac(filename = "./sugar-experiments/bensc-13-02.txt",
                     tab.anno = "./sugar-experiments/12-02-annotation.csv",n.sens=16)
col_names <- names(read.table("./sugar-experiments/12-02-annotation.csv",header=TRUE,sep=","))
# do do it for some names in a vector named 'col_names'
dat.1302[col_names] <- lapply(dat.1302[col_names] , factor)
dat.1302<-dat.1302%>%filter(Time.min.<1080)
ggplot(dat.1302) +
  geom_line(aes(x=Time.min.,y=pH.u_pH.,
                group=interaction(Sample,Strain,Incubation,Medium,
                                  Gluc.plus,lac.plus,arg.plus,NaCl.plus,electrode),
                linetype=Incubation,
                color=arg.plus))+
  scale_color_discrete("arginine")

ggplot(filter(dat.1302, Incubation!="none")) +
  geom_line(aes(x=pH.u_pH.,y=pHComp_ORP.mVolts.,
                group=interaction(Sample,Strain,Incubation,Medium,
                                  Gluc.plus,lac.plus,arg.plus,NaCl.plus,electrode),
                color=interaction(arg.plus,Gluc.plus,lac.plus,NaCl.plus,sep="   ")))+
  scale_color_brewer("arg gluc lac NaCl",type="qual",palette = 2)+theme_bw()+
  facet_grid(Incubation~Medium)

Discussion

arginine makes a big difference even at low concentrations. Incubation on one sugar makes a difference. Fat content seems to make a difference as well, when glucose is supplemented.