9 Seahorse Analysis
9.1 Data
The experimental data is derived from a paper we published a couple of years ago. Please check-out the paper where this data was published at:
Look up in the paper: - what type of cells have been used? - what compounds were injected during the assays?
For most of the experiments PBMCs have been used. For some experiments RAW264.7 cells were used or monocytes. The dataset we use in this tutorial was an experiment with PBMCs.
We used injections of FCCP, AM/rot, and monensin. Also Hoechst was included, but this was only used for nuclei staining
Let’s load the data first. We use the revive_xfplate()
function form the seahtrue package and the excel file that is included with the package.
Explore the data that we just loaded.
What is the structure of seahtrue_output_donor_A
?
And what is the structure of the rate_data
and raw_data
tibbles?
The data is a nested tibble. The nested rate_data
tibble contains the ocr and ecar data, with for each well
the measurements and group annotation and the OCR_wave_bc
and ECAR_wave_bc
data columns “…._bc” in the columns names means the data is allready background corrected (bc)). The raw_data
contains the O2 and pH readings in the experiment, those are used to calculate the OCR and ECAR).
9.2 Plate map
To dive a bit deeper into a single seahtrue
experiment, we will first generate an overview of what the experimental set-up was.
Explore the experimental set-up. Remember that a Seahorse experiment is a 96-well plate based experiment, so we will see 96 wells in the plate map.
In the plate map, you see that the corners are colored dark brown The background wells do not contain cells. What is the purpose of these background wells?
There is drift in O2 and pH signals even when there is no sample (cells) in a well. This signal should be substracted from the wells that do contain samples.
What do the numbers 50.000 to 300.000 in the legend of the plate map?
These are the number of cells that have been plated in each well, so 50.000 cells/well to 300.000 cells/well
What is the reason why we performed an experiment like this?
In this way, we can check the linearity of the signals and determine the best plating density for our following experiments where we want to compare different conditions or interventions.
9.3 Oxygen consumption rate (OCR)
Now we will plot the OCRs for this experiment.
If we assume that the basal OCR should not be lower than 20 pmol/min (below this value we reach the detection limit), which cell densities are suitable for a Seahorse experiment in this case.
from 150.000 cells/well
Now check out the parameters that we can set for the sketch_rate()
function by using the below code:
plot the ECAR using this sketch_rate()
functions. What do you observe after monensin is injected in the ECAR plot? Look up online how monensin acts on cells why it is doing this with ECAR. What did we observe in OCR? Can you explain that?
We see that after monensin injection, ECAR increases. This is because glycolysis is increased because cell membrane transporters are activated that increase ATP demand. OCR does not change much, because the mitochondrial activity is allready blocked by AM/rot
9.4 Plotting basal and maximal respiration
Pluck the injection_info
table from the seahtrue_output_donor_A
dataset to see what how the injections were defined in the experimental set-up before running the seahorse.
This is not a typical mito-stress test experiment, where we inject oligomycin, FCCP and antimycinA/rotenone sequentially. Instead we inject only FCCP and antimycinA/rotenone.
To get the maximal and basal respiration out of the ocr rate table, we need to do some calculations. We first make some assumptions and defintions:
We call each interval between two injections or between start and an injection or between an injection and the end a
phase
Each phase has a unique name that is named after the injection that was last. The first phase after the start is called
init_ocr
and we also typically have the phasesom_ocr
,fccp_ocr
andamrot_ocr
. Phases are marked with either_ocr
or_ecar
, because these are distinct parameters.To calculate respiration parameters, like basal respiration (= basal_ocr), we define the following:
- basal_ocr = init_ocr - amrot_ocr.
- max_ocr = fccp_ocr - amrot_ocr
- spare_ocr = fccp_ocr - init_ocr
- proton_leak = om_ocr = amrot_ocr
- atp_linked = init_ocr - om_ocr
We also use indices to have relative parameters:
- spare_ocr_index = (spare_ocr / basal_ocr)*100
- basal_ocr_index = (basal_ocr / max_ocr)*100
- leak_index = (proton_leak / basal_ocr)*100
- coupling_index = (atp_linked / basal_ocr)*100) %>%
Another important assumption is that we are not using average values to represent each phase, but intead we use a specific measurement. The reason for this is that we assume that for all phases, except FCCP, three measurements are needed in time to get to steady-state. For FCCP injection, we assume that it reaches steady-state fast, or at least its maximal ocr, so we take the first measurement after injection as the measurement representing the FCCP phase.
Let’s now put that into R code. We call the type of experiment we did in this dataset a maximal capacity
(maxcap
) test.
We also injected monensin, which can maximize ECAR, but we don’t need it for OCR calculations.
Now for each well we have the parameters related to the phases that we defined in the parameter set.
Next we want to calculate the respiration parameters and indices.
With this data, we can plot our typical basal and maximal bar/scatter plots that we see in papers, presentations and theses.
The plot above shows maximal ocr
. Now make your own plot with 1) basal_ocr
and 2) all groups except background. Make sure to order the group legend tidyly and have reable x-axis labels.
9.5 Functional omics with Seahorse analysis - ATP interpretations
Next, we will continue with the transformation of OCR and ECAR to ATP units. The calculations are based on the Mookerjee et al paper in J Biol Chem:
The calculations are performed under the hood in the calculate_space()
function of the seahtrue package.
For these excercises we will work with a similar dataset as the seahtrue_output_donor_A
, but now from a different individual. This is seahtrue_output_donor_C
. Since there is a difference in the Seahorse tracjectory this is a nice example to learn how to interpret seahorse experiments.
First, load the new data.
Now lets calculate the atp space for both donors and combine the data for plotting:
Verify that the correct measurements were put as arguments for the calculate_space()
function
Since we do not take the average of the three measurements for each phase, because we think that the cells reach a steady state after injection after a certain time interval, we take one measurement for each phase. In this experiment, we injected fccp, AM/rot and monension consecutively. The fccp injection typically give the highest value allready after one measurement so we take measurement 4 (m4). for the others we take the third measurement in the phase (m3, m9 and m12)
param_set_ocr = c(init_ocr = “m3”, fccp_ocr = “m4”, amrot_ocr = “m9”, mon_ocr = “m12”),
Now plot the trajectory and compare the two trajectories.
Now that we generated the trajectory through ATP space, explain what you observe. How does the trajectory change for each individual? What is the biggest difference between donor A and C
please discuss with one of your lecturers
Next, we will plot the ATP space. For this we will use the plot_bioenergetic_space()
function. The space plot shows the total allowed ATP generation at the condition that the cells are in. The dot is the position in the space in the initial (basal) phase.
Explain the difference between the two spaces between donor A and B. Also, what does the dashed line represent?
please discuss with one of your lecturers
The following exercise is a bit more advanced, it requires some R skills, but gives insights in the relevance of the bioenergetic space.
We have another dataset where we isolated T cells from an individual and stimulated the cells with CD3/CD28 (= IC). Also, we injected a number of chemical compounds. Please focus for now on the “IC + 1.5 uM BAM15” and “1.5 uM BAM15” group. Instead of the uncoupler FCCP we now used BAM15 instead which is more gentle on the cell membrane.
Keep the fccp_ocr
and fccp_ecar
nomenclature for your param_sets. The function does not recognize bam15_ocr
or bam15_ecar
.
Find out which measurements you should use to calculate the space.
Filter out well C10. This is a technical outlier.
Use “agilent” as the atp conversion model.
Plot the ATP space for the activated and non-activated T cells.
- What do you observe?
- What does it mean when the basal J_ATP (the dot in the space) is more closer to the dashed line?
We want to see the difference between activate T cells and not activated, so we should take the measurement 9 where the cells were activated or not (at measurement three both groups are still the same!).