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
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.
Colonies of the strains MS22314 and MS22333 were incubated overnight at 30 C 3 different media:
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")
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")
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")
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 |
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()
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.
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.
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")
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))
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.
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")
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 |
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)
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))
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.
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.
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")
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 |
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.
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.
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.
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")
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 |
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)
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.