Overview

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:

  • photosynthetic parameters inferred from carbon dioxide and water fluxes using an infrared gas analyzer (IRGA)
  • timeseries of individual ion peaks: small molecules, known top compounds from each species, other ions of interest
  • a clustering analysis of timeseries for all peaks to group ions by their emission patterns

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)

A PTR-Quadrupole (actual instrument used is a PTR-TOF)

Experimental

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)$time

Three 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.

Plants

Plant identity, infloresence compostion (after experiment ended, at 2017-08-11 09:40), and light intensity. Plants watered at 2017-08-09 ~10:30 and 2017-08-11 08:10.
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

PTR-MS parameters

PTR-MS parameters. TPS settings of 2017-04-07. *Inlet flow set to 150 scmm until 2017-08-09 13:10.
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

Results

IRGA

Photosynthesis parameters

Photosynthesis parameters calculated with the vonCaemmerer and Farquhar (1981) model. Results of fx FT_PS_LiCor_equations() on each of the rows of the FT waves.
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

Photosynthesis plots

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 + cscale

Photosynthesis interpretation

Anet : net CO2 assimilation rate

  • Infloresences were net photosynthetic during the day, emitted CO<sub2~ through respiration at night
  • After normalizing by number of open flowers, Anet is similar
  • Responses <30 min

E: water transpiration rate

  • Water transpiration was higher during the day than night - opened stomata?
  • Responses <30 min

Ue: standardized flow of air entering the cuvette

  • Slight (4%)

PTR-MS ion timecourses

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"))

Top volatiles

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)

Stacked plots

dailyplot(HOOKpeaks)

dailyplot(KAALpeaks)

Top volatiles interpretation

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.

All ions

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)