Pilot study to investigate temporal patterns in floral volatile emissions in Schiedea hookeri, Schiedea kaalae, and their hybrid. Prior GC-MS analysis and the human nose suggest differences in total volatiles output and composition between broad day and evening sampling periods. PTR-MS allows quantification of these volatile emission rates in real time. This report includes:
The PTR-MS produces ions via proton transfer from hydronium ions (H3O+). The ions are transfered from the source into a drift tube and a time-of-flight mass spectrometer. Analytes undergo soft chemical ionization and do not intiailly fragment, but due to the electric field, ions may fragment in the drift tube. Mono- and sesquiterpenes are known to fragment depending on the strength of this field (Faiola et al., in prep).
A PTR-Quadrupole (actual instrument used is a PTR-TOF)
cuv <- c(1,3,4)
cuvflrs <- c(35,28,54)
cuvsp <- c("KAHO","HOOK","KAAL")
cscale <- scale_color_manual("Species",values=c("green","red","black"))#alphabetical: HOOK,KAAL,KAHO
tzone <- "Etc/GMT+8"
tzfrmt = "%Y-%m-%d %H:%M %Z"
start <- ISOdatetime(2017,8,9,11,9,17,tz=tzone)
steps <- 164027
tp <- seq.POSIXt(from=start, by="sec", length.out=steps)
lightoff <- ISOdatetime(2017,8,9,17,0,0,tz=tzone)
lights <- seq.POSIXt(from=lightoff, by=12 * 60 * 60, length.out=4)
tscale <- scale_x_datetime("Time", breaks=lights, date_minor_breaks="1 hour", date_labels="%H:%M",expand = c(0, 0))
greenhouse <- matrix(c(-117.8475746, 33.6472914), nrow=1)
sunrise <- sunriset(greenhouse, tp[1]-24*60*60, direction="sunrise", POSIXct.out=T)$time
sunset <- sunriset(greenhouse, tp[1]-24*60*60, direction="sunset", POSIXct.out=T)$timeThree plants with open flowers were selected from greenhouse (one of each type). Plants were all watered prior to sampling and placed in a photochamber set to 23 C and with 60% relative humidity. During the photoperiod, plants received about 450 µmol/(m2 s) PAR (see table) at the top of the inflorescence from LED lights (c.f. direct sunlight = 2,000 µmol/(m2 s) PAR).
Flowering inflorescences from each plant were supported with a stake and placed in “cuvettes” made of nylon-6 oven bags (dimensions 40.6 cm x 44.4 cm). An empty bag was used as a blank (cuvette #2). Each cuvette recieved dry zero air at the bottom of the bag from a zero-air generator (critical orifice Reynolds number 33, 25 psi, 12 L/min of air combined to the 4 cuvettes). Air was sampled from the top of the bag. Each cuvette contailed a thermocouple to measure temperature in the bag. The bag was sealed with a twist-tie around the pedicel, input and sampling lines, and thermocouple.
All times are PST (UTC-8). The experiment spanned 45.6 hours, from 2017-08-09 11:09:17 to 2017-08-11 08:43:03, including 2 night periods. The photoperiod was 05:00 - 17:00 , Ambient sunrise and sunset times the day prior were 05:08 - 18:44.
The Fluxtron switched gas flow to the PTR-MS between each cuvette every 4 min, and flow to the IRGA between the blank cuvette and sampled cuvette every 20 s. The IRGA measured CO2 concentration and temperature. The Ionicon PTR-TOF held the settings below for volatiles analysis.
| Cuvette | 1 | 3 | 4 |
|---|---|---|---|
| Species | Hybrid | Schiedea hookeri | Schiedea kaalae |
| Abbreviation | KAHO | HOOK | KAAL |
| Cross direction | KH | HH | KK |
| Cross | 3587-7 x 879-10-1 | 891 | 3587-A x 3587-14 |
| ID | 189-3 | 3-11 | 229-3 |
| Sex | H | H | H |
| Leaves | 2 | 8 | 0 |
| Inflorescences | 1 | 8 | 3 |
| Male phase | 6 | 4 | 15 |
| Female phase | 29 | 24 | 39 |
| Closed | 29 | 153 | 114 |
| Buds | 50 | 30 | 83 |
| Open flowers (male + female) | 35 | 28 | 54 |
| Light intensity, µmol/(m2 s) PAR | 490 | 416 | 460 |
| Parameter | Value |
|---|---|
| MCP | 2100 V |
| inlet temperature | 60 C |
| inlet flow | 140 sccm* |
| H2O flow | 5 sccm |
| ion source current | 3 mA |
| drift tube temperature | 60 C |
| drift tube pressure | 2.8 mbar |
| Us | 150 V |
| Uso | 80 V |
| Udrift | 600 V |
| Ufunnel | 30 V |
| Uout | 7 V |
| Urf | 16 V |
| Variable | Units | Description |
|---|---|---|
| Anet | (mol CO2)/(m2 s) | net CO2 assimilation rate |
| E | (mol H2O)/(m2 s) | water transpiration rate |
| Gsw | (mol H2O)/(m2 s) | stomatal conductance to water vapor |
| Gbw | (mol H2O)//(m2 s) | boundary layer conductance to water vapor |
| Gtw | (mol H2O)/(m2 s) | total conductance to water vapor |
| Ci | (mol CO2)/(mol air) | intercellular CO2 concentration |
| Gtc | (mol CO2)/(m2 s) | total conductance to CO2 |
| Ue | mol/s | standardized flow of air entering the cuvette |
| SVP | kPa | saturated water vapor pressure at Tleaf |
| Wl | (mol H2O)/(mol air) | molar concentration of water vapor within the leaf |
irga.files = paste0("c", cuv, "irgaFlux.txt")
irga <- lapply(irga.files, read.table, header=T, sep="\t", skip=2)
irga <- lapply(irga, function(l) {l$tp <- tp; l})
irga <- lapply(irga, na.omit)
irga <- lapply(irga, blockjumps)
irga <- lapply(irga, medianblocks)
irga <- lapply(irga, fixtz)
names(irga) <- cuvsp
#normailze by number of flowers
irga.normvars <- c("Anet","E","Gsw","Gbw","Gtw","Gtc")
irga.normalize <- function(x,flrs){x[,irga.normvars] <- x[,irga.normvars]/flrs; return(x)}
irgan <- mapply(irga.normalize, irga, cuvflrs, SIMPLIFY=F)
plotvars <- c("Anet"="Anet: net CO2 assimilation rate",
"E"="E: water transpiration rate",
"Ue"="Ue: standardized flow of air entering the cuvette")
mirga <- lapply(irgan, melt, id.vars="tp")
mmirga <- do.call(rbind, lapply(cuvsp, function(x){data.frame(id=x, mirga[[x]])}))
mmirga <- mmirga[mmirga$variable %in% names(plotvars),]Calculated photosynthetic parameters Anet and E normalized by the number of flowers, and the flow of air entering the cuvette Ue.
ggplot(mmirga, mapping=aes(x=tp, y=value, color=id)) + geom_line(size=0.5, alpha=0.8) + facet_wrap(~ variable, scales="free_y", ncol=1, labeller=labeller(variable=plotvars)) + tscale + cscaleAnet : net CO2 assimilation rate
E: water transpiration rate
Ue: standardized flow of air entering the cuvette
ncps.files = paste0("c", cuv, "ncpsFlux.txt")
ncps <- lapply(ncps.files, read.table, header=T, sep="\t", skip=2)
ncps.normalize <- function(x,flrs){x[,] <- x[,]/flrs; return(x)}
ncps <- mapply(ncps.normalize, ncps, cuvflrs, SIMPLIFY=F)
ncps <- lapply(ncps, function(l) {l$tp <- tp; l})
ncps <- lapply(ncps, na.omit)
ncps <- lapply(ncps, blockjumps)
ncps <- lapply(ncps, avgblocks)
ncps <- lapply(ncps, fixtz)
names(ncps) <- cuvsp
mncps <- lapply(ncps, melt, id.vars="tp")
mncps <- do.call(rbind, lapply(cuvsp, function(x){data.frame(id=x, mncps[[x]])}))
mncps$id <- factor(mncps$id,levels(mncps$id)[c(2,3,1)])
mdncps <- mncps
mdncps$day <- format(mncps$tp,"%d")
mdncps$tp <- as.POSIXct(paste("2017-08-10 ", format(mncps$tp,"%H:%M:%S")), tz=tzone)frmla <- read.table("formulas.csv", sep="\t", header=T, stringsAsFactors=F, colClasses=c("factor"="factor", "cycle"="factor"))lineplot <- function(plotpeaks) {
ggplot(mncps[mncps$variable %in% names(plotpeaks),], mapping=aes(x=tp, y=value, color=id)) + geom_line() + facet_wrap(~ variable, scales="free_y", ncol=1, labeller=labeller(variable=plotpeaks)) + tscale + cscale }
dailyplot <- function(plotpeaks) {
ggplot(mdncps[mdncps$variable %in% names(plotpeaks),], mapping=aes(x=tp, y=value, color=id, linetype=day)) + tscale + cscale + geom_line() + scale_linetype_manual(name="Day", values = c("longdash", "solid", "twodash")) + facet_wrap(~ variable, scales="free_y", ncol=1, labeller=labeller(variable=plotpeaks)) }
HOOKpeaks <- c("X129.127"="129: 1-octen-3-ol / 3-octanone / 2,3-heptanedione : HOOK 29.3%, KAAL 13.8%, KAHO 34.7%",
"X101.096"="101: 3-hexen-1-ol : HOOK 27.9%, KAAL 0.2%, KAHO 6.3%",
"X178.032"="178: 2-methylbenzoyl isothiocyanate : HOOK 15.3%, KAAL 0.0%, KAHO 0.7%",
"X107.049"="107: benzaldehyde : HOOK 5.2%, KAAL 0.9%, KAHO 0.7%")
KAALpeaks <- c("X169.122"="169: linalool ketone (pyranoid): HOOK 1.3%, KAAL 39.3%, KAHO 37.8%",
"X171.138"="171: linalool oxide (pyranoid): HOOK 0.2%, KAAL 17.4%, KAHO 3.6%",
"X243.159"="243: Linalool oxide (furanoid) ethyl carbonate: HOOK 0.2%, KAAL 13.9%, KAHO 3.0%",
"X121.065"="121: phenylacetaldehyde : HOOK 0.4%, KAAL 5.9%, KAHO 0.2%",
"X137.132"="137: α-phellandrene / monoterpenes : HOOK 0.1%, KAAL 2.6%, KAHO 0.4%")
lineplot(HOOKpeaks)lineplot(KAALpeaks)dailyplot(HOOKpeaks)dailyplot(KAALpeaks)Therefore some delay is expected at least the first night if the circadian clock for volatiles was syncronized with ambient sunset. On the second night, the plant may respond to the previous day’s shorter artificial photoperiod.
ncpsp <- lapply(ncps, function(x) {x[,!names(x) %in% c("tp","block", "Group.1")]})
frmlas <- setNames(trimws(substr(paste(frmla$mass, frmla$factor, frmla$cycle, frmla$compound, frmla$common), 1, 40)), colnames(ncpsp[[1]]))
rownames(frmla) <- colnames(ncpsp[[1]])
pl <- 1
threshold <- 3e-6
separate <- 0.3
trange <-1:168
prange <- c(29:40,45:339)
hmeth <- "mcquitty"
dmeth <- "DTW"
ncps_plot <- function(pl,threshold,separate,trange,prange,hmeth,dmeth,cluster) {
ncpscut <- ncpsp[[pl]][trange,prange]
ncps.pks <- as.numeric(lapply(names(ncpscut), substr, 2, 7))
#ncpscut <- ncpscut[, c(T,abs(diff(ncps.pks)) > separate)]
ncpscut <- ncpscut[,colMax(ncpscut)>threshold]
ncpscut[ncpscut<0] <- 0
ncpscut <- log(ncpscut+1)
ncpscut.s <- divmax(ncpscut)
ncpscut.tp <- ncps[[pl]]$tp[trange]
ncpscut.frmlas <- frmlas[colnames(ncpscut)]
ncpscut.frmlas <- aggregate(ncpscut.frmlas~round(mass), paste, collapse="/", data=frmla[colnames(ncpscut),])
wmass <- factor(round(frmla[colnames(ncpscut),"mass"]))
ncpscut.st <- as.data.frame(t(ncpscut.s))
ncpscut.st <- aggregate(. ~ wmass, mean, data=ncpscut.st)
rownames(ncpscut.st) <- ncpscut.st$wmass
ncpscut.st$wmass <- NULL
ncpscut.t <- as.data.frame(t(ncpscut))
ncpscut.t <- aggregate(. ~ wmass, mean, data=ncpscut.t)
rownames(ncpscut.t) <- ncpscut.t$wmass
ncpscut.t$wmass <- NULL
print(dim(ncpscut.st))
colside_max <- range01(log(log(rowMax(ncpscut.t)+1)+1))
#colside_mass <- range01(as.numeric(lapply(names(ncpscut), substr, 2, 7)))
sidecols <- colorRampPalette(c("white", "purple"))(512)[round(colside_max*511)+1]
xhclust <- function(data) { hclust(data, method=hmeth) }
xdist <- function(data) { dist(data, method=dmeth) }
if(cluster) {
#heatmap(as.matrix(ncpscut.st), Colv=NA, col=topo.colors(512), hclustfun=xhclust, distfun=xdist, labRow=ncpscut.frmlas[,2], RowSideColors=sidecols, margins=c(5,18))
rownames(ncpscut.st)<-ncpscut.frmlas[,2]
colnames(ncpscut.st)<-ncpscut.tp
hm <- heatmaply(ncpscut.st, k_row = 7, Colv=NA, col=topo.colors(512), hclustfun=xhclust, distfun=xdist, RowSideColors=sidecols, row_dend_left=F)
layout(hm)
} else {
heatmap(t(ncpscut), Colv=NA, Rowv=NA, col=tilecols, RowSideColors=sidecols)
}
}
#ncps_plot(1, 3e-6, 0.3, 1:168, 1:339, "mcquitty", "DTW", T)
print(cuvsp[1]) [1] "KAHO"
ncps_plot(1, 3e-6, 0.3, 1:168, c(29:40,45:339), "mcquitty", "DTW", T) [1] 65 168
print(cuvsp[2]) [1] "HOOK"
ncps_plot(2, 3e-6, 0.3, c(1:65,67:168), c(29:40,45:339), "mcquitty", "DTW", T) [1] 83 167
print(cuvsp[3]) [1] "KAAL"
ncps_plot(3, 3e-6, 0.3, c(1:39,41:168), c(29:40,45:339), "mcquitty", "DTW", T) [1] 70 167
####TODO: time markers
#heatmap(t(ncps1floor[,order(colSums(ncps1floor))]), Colv=NA, Rowv=NA, col=tilecols)