J. Taroni 2018

In this notebook, we’ll clean diffuse intrinsic pontine glioma (DIPG) data. There is no DIPG data in recount2, so this is another use case for this project.

We’ll be working with two datasets stored in the greenelab/rheum-plier-data repository:

Citations:

Paugh BS, Broniscer A, Qu C, et al. Genome-wide analyses identify recurrent amplifications of receptor tyrosine kinases and cell-cycle regulatory genes in diffuse intrinsic pontine glioma. J Clin Oncol. 2011;29(30):3999-4006.

Buczkowicz P, Hoeman C, Rakopoulos P, et al. Genomic analysis of diffuse intrinsic pontine gliomas identifies three molecular subgroups and recurrent activating ACVR1 mutations. Nat Genet. 2014;46(5):451-6.

Set up

# magrittr pipe
`%>%` <- dplyr::`%>%`
# we need the function that aggregates duplicate gene identifiers to the
# mean value
source(file.path("util", "test_LV_differences.R"))

Directory setup

# directory that holds the gene expression files
exprs.dir <- file.path("data", "expression_data")
# directory that holds the sample metadata
sample.info.dir <- file.path("data", "sample_info")

Read in and clean data

GSE50021

We have the series matrix for GSE50021, which contains both the expression values and the metadata

series.mat.file <- file.path(exprs.dir, "GSE50021_series_matrix.txt")
# expression matrix -- everything but the comment lines that begin with !
ma.data <- 
  readr::read_delim(series.mat.file, 
                    delim = "\t", 
                    comment = "!",
                    col_names = TRUE, 
                    skip = 1)
Parsed with column specification:
cols(
  .default = col_double(),
  ID_REF = col_character()
)
See spec(...) for full column specifications.

|=========================                                                                                                               |  18%    1 MB
|==========================                                                                                                              |  19%    2 MB
|===========================                                                                                                             |  20%    2 MB
|============================                                                                                                            |  20%    2 MB
|=============================                                                                                                           |  21%    2 MB
|==============================                                                                                                          |  22%    2 MB
|===============================                                                                                                         |  23%    2 MB
|================================                                                                                                        |  23%    2 MB
|=================================                                                                                                       |  24%    2 MB
|==================================                                                                                                      |  25%    2 MB
|===================================                                                                                                     |  25%    2 MB
|====================================                                                                                                    |  26%    2 MB
|=====================================                                                                                                   |  27%    2 MB
|======================================                                                                                                  |  28%    3 MB
|=======================================                                                                                                 |  28%    3 MB
|========================================                                                                                                |  29%    3 MB
|=========================================                                                                                               |  30%    3 MB
|==========================================                                                                                              |  31%    3 MB
|===========================================                                                                                             |  31%    3 MB
|============================================                                                                                            |  32%    3 MB
|=============================================                                                                                           |  33%    3 MB
|==============================================                                                                                          |  34%    3 MB
|===============================================                                                                                         |  34%    3 MB
|================================================                                                                                        |  35%    3 MB
|=================================================                                                                                       |  36%    3 MB
|==================================================                                                                                      |  37%    3 MB
|===================================================                                                                                     |  37%    4 MB
|====================================================                                                                                    |  38%    4 MB
|=====================================================                                                                                   |  39%    4 MB
|======================================================                                                                                  |  40%    4 MB
|=======================================================                                                                                 |  40%    4 MB
|========================================================                                                                                |  41%    4 MB
|=========================================================                                                                               |  42%    4 MB
|==========================================================                                                                              |  43%    4 MB
|===========================================================                                                                             |  43%    4 MB
|=============================================================                                                                           |  44%    4 MB
|==============================================================                                                                          |  45%    4 MB
|===============================================================                                                                         |  46%    4 MB
|================================================================                                                                        |  46%    4 MB
|=================================================================                                                                       |  47%    5 MB
|==================================================================                                                                      |  48%    5 MB
|===================================================================                                                                     |  48%    5 MB
|====================================================================                                                                    |  49%    5 MB
|=====================================================================                                                                   |  50%    5 MB
|======================================================================                                                                  |  51%    5 MB
|=======================================================================                                                                 |  51%    5 MB
|========================================================================                                                                |  52%    5 MB
|=========================================================================                                                               |  53%    5 MB
|==========================================================================                                                              |  54%    5 MB
|===========================================================================                                                             |  54%    5 MB
|============================================================================                                                            |  55%    5 MB
|=============================================================================                                                           |  56%    6 MB
|==============================================================================                                                          |  57%    6 MB
|===============================================================================                                                         |  57%    6 MB
|================================================================================                                                        |  58%    6 MB
|=================================================================================                                                       |  59%    6 MB
|==================================================================================                                                      |  60%    6 MB
|===================================================================================                                                     |  60%    6 MB
|====================================================================================                                                    |  61%    6 MB
|=====================================================================================                                                   |  62%    6 MB
|======================================================================================                                                  |  63%    6 MB
|=======================================================================================                                                 |  63%    6 MB
|========================================================================================                                                |  64%    6 MB
|=========================================================================================                                               |  65%    6 MB
|==========================================================================================                                              |  66%    7 MB
|===========================================================================================                                             |  66%    7 MB
|============================================================================================                                            |  67%    7 MB
|=============================================================================================                                           |  68%    7 MB
|==============================================================================================                                          |  69%    7 MB
|===============================================================================================                                         |  69%    7 MB
|================================================================================================                                        |  70%    7 MB
|=================================================================================================                                       |  71%    7 MB
|==================================================================================================                                      |  72%    7 MB
|===================================================================================================                                     |  72%    7 MB
|====================================================================================================                                    |  73%    7 MB
|=====================================================================================================                                   |  74%    7 MB
|======================================================================================================                                  |  74%    7 MB
|=======================================================================================================                                 |  75%    8 MB
|========================================================================================================                                |  76%    8 MB
|=========================================================================================================                               |  77%    8 MB
|==========================================================================================================                              |  77%    8 MB
|===========================================================================================================                             |  78%    8 MB
|============================================================================================================                            |  79%    8 MB
|=============================================================================================================                           |  80%    8 MB
|==============================================================================================================                          |  80%    8 MB
|===============================================================================================================                         |  81%    8 MB
|================================================================================================================                        |  82%    8 MB
|=================================================================================================================                       |  83%    8 MB
|==================================================================================================================                      |  83%    8 MB
|===================================================================================================================                     |  84%    9 MB
|====================================================================================================================                    |  85%    9 MB
|=====================================================================================================================                   |  86%    9 MB
|=======================================================================================================================                 |  86%    9 MB
|========================================================================================================================                |  87%    9 MB
|=========================================================================================================================               |  88%    9 MB
|==========================================================================================================================              |  89%    9 MB
|===========================================================================================================================             |  89%    9 MB
|============================================================================================================================            |  90%    9 MB
|=============================================================================================================================           |  91%    9 MB
|==============================================================================================================================          |  92%    9 MB
|===============================================================================================================================         |  92%    9 MB
|================================================================================================================================        |  93%    9 MB
|=================================================================================================================================       |  94%   10 MB
|==================================================================================================================================      |  95%   10 MB
|===================================================================================================================================     |  95%   10 MB
|====================================================================================================================================    |  96%   10 MB
|=====================================================================================================================================   |  97%   10 MB
|======================================================================================================================================  |  98%   10 MB
|======================================================================================================================================= |  98%   10 MB
|========================================================================================================================================|  99%   10 MB
|=========================================================================================================================================| 100%   10 MB

Gene identifier conversion

# The GPL information from GEO, which was made public on Jul 18, 2011 and 
# last updated on Jan 18, 2013
gpl.info.df <- readr::read_tsv(file.path(exprs.dir, "GPL13938-11302.txt"),
                               comment = "#")
Parsed with column specification:
cols(
  .default = col_character(),
  Entrez_Gene_ID = col_integer(),
  GI = col_integer(),
  Array_Address_Id = col_integer(),
  Probe_Start = col_integer()
)
See spec(...) for full column specifications.
number of columns of result is not a multiple of vector length (arg 1)6 parsing failures.
row # A tibble: 5 x 5 col     row col   expected   actual     file                                      expected   <int> <chr> <chr>      <chr>      <chr>                                     actual 1  6771 NA    29 columns 27 columns 'data/expression_data/GPL13938-11302.txt' file 2  6772 NA    29 columns 27 columns 'data/expression_data/GPL13938-11302.txt' row 3  8712 NA    29 columns 27 columns 'data/expression_data/GPL13938-11302.txt' col 4  9671 NA    29 columns 27 columns 'data/expression_data/GPL13938-11302.txt' expected 5 19712 NA    29 columns 27 columns 'data/expression_data/GPL13938-11302.txt'
... ................................. ... ............................................................................. ........ .......................................................................................................................................................................................................... ...... ................................................................................................................ .... ................................................................................................................ ... ................................................................................................................ ... ................................................................................................................ ........ .........................................................................................................................
See problems(...) for more details.
annot.gse50021.df <- gpl.info.df %>%
  # from the GEO information, grab just the probe identifier and the gene
  # symbol columns
  dplyr::select(c(ID, Symbol)) %>%
  # only ILMN IDs (probes) in both
  dplyr::inner_join(ma.data, by = c("ID"  = "ID_REF")) %>%
  # collapsing duplicate symbols later will require the symbols to be in the
  # first column, called "Gene", with no additional columns
  dplyr::mutate(Gene = Symbol) %>%
  dplyr::select(-ID, -Symbol) %>%
  dplyr::select(Gene, dplyr::everything())

Collapse duplicate symbols and write to file.

# summarize to mean
annot.mean.df <- PrepExpressionDF(annot.gse50021.df)
readr::write_tsv(annot.mean.df, file.path(exprs.dir, "GSE50021_mean_agg.pcl"))

Sample metadata

As mentioned above, metadata is also extracted from the series matrix file. We do this for a single line at a time that we’ve picked based on the relevance to any downstream analysis we might do (contact information, for example, does not help us in this context).

We’ll write a custom function specifically for this context and environment

# given a line number of the series matrix file (series.mat.file),
# get the values
GetSampleAttributes <- function(skip.value) {
  conn <- file(series.mat.file)
  open(conn)
  sample.attributes <- read.table(conn, skip = skip.value, nrow = 1)
  close(conn)
  return(sample.attributes)
}
# sample accession e.g., GSMXXXXX
sample.accession <- GetSampleAttributes(skip.value = 79)
# source name
source.name <- GetSampleAttributes(skip.value = 85)
# tissue
tissue <- GetSampleAttributes(skip.value = 88)
# gender
gender <- GetSampleAttributes(skip.value = 89)
# age at diagnosis
age.dx <- GetSampleAttributes(skip.value = 90)
# overall survival
survival <- GetSampleAttributes(skip.value = 91)
# get those lines into data.frame format
smpl.info.df <- as.data.frame(t(dplyr::bind_rows(sample.accession, 
                                                 source.name, 
                                                 tissue,
                                                 gender,
                                                 age.dx,
                                                 survival))[-1, ]) 
Unequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vector
colnames(smpl.info.df) <- c("sample_accession", "source_name", "tissue",
                            "gender", "age_at_diagnosis_yrs", 
                            "overall_survival_yrs")
# strip extraneous strings
smpl.info.df <- smpl.info.df %>%
  dplyr::mutate(tissue = gsub("cell type: ", "", tissue),
                gender = gsub("gender: ", "", gender),
                age_at_diagnosis_yrs = gsub("age at dx \\(years\\): ", "", 
                                            age_at_diagnosis_yrs),
                overall_survival_yrs = gsub("os \\(years\\): ", "", 
                                            overall_survival_yrs))
# change "N/A" to NA
smpl.info.df[which(smpl.info.df == "N/A", arr.ind = TRUE)] <- NA

Write the cleaned metadata to a TSV file.

readr::write_tsv(smpl.info.df, 
                 file.path(sample.info.dir, "GSE50021_cleaned_metadata.tsv"))

Clean up the workspace a bit before working with the next dataset.

to.keep <- c("%>%", "exprs.dir", "sample.info.dir", "PrepExpressionDF")
rm(list = setdiff(ls(), to.keep))

E-GEOD-26576

We used an Entrez ID BrainArray package to process this data set and we need gene symbols to work with PLIER.

# SCANfast processed PCL
gse26576.file <- file.path(exprs.dir, 
                           "DIPG_E-GEOD-26576_hgu133plus2_SCANfast.pcl")
# read in the PCL file, remove the trailing "_at" added by Brainarray (these
# are Entrez gene identifiers), drop the Entrez IDs with _at appended, reordered
# such that the gene identifiers are the first column
gse26576.df <- readr::read_tsv(gse26576.file) %>%
  dplyr::mutate(EntrezID = sub("_at", "", X1)) %>%
  dplyr::select(-X1) %>%
  dplyr::select(EntrezID, dplyr::everything())
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  .default = col_double(),
  X1 = col_character()
)
See spec(...) for full column specifications.

Gene identifier conversion

# extract the Entrez ID Gene symbol mapping from org.Hs.eg.db
symbol.obj <- org.Hs.eg.db::org.Hs.egSYMBOL
mapped.genes <- AnnotationDbi::mappedkeys(symbol.obj)
symbol.list <- as.list(symbol.obj[mapped.genes])
symbol.df <- as.data.frame(cbind(names(symbol.list), unlist(symbol.list)))
colnames(symbol.df) <- c("EntrezID", "GeneSymbol")

Join the annotation data.frame to the expression data.frame

annot.gse26576.df <- symbol.df %>%
  dplyr::inner_join(gse26576.df, by = "EntrezID")
Column `EntrezID` joining factor and character vector, coercing into character vector
rm(symbol.df)

Are there any duplicates?

any(duplicated(annot.gse26576.df$GeneSymbol))
[1] FALSE

No, so we don’t need to do anything else. Write the data.frame that includes gene symbols to file.

gse26576.output.file <- 
  file.path(exprs.dir, 
            "DIPG_E-GEOD-26576_hgu133plus2_SCANfast_with_GeneSymbol.pcl")
readr::write_tsv(annot.gse26576.df, path = gse26576.output.file)

Sample Metadata

meta.gse26576.file <- file.path(sample.info.dir, "E-GEOD-26576.sdrf.txt")
meta.gse26576.df <- readr::read_tsv(meta.gse26576.file)
Duplicated column names deduplicated: 'Term Source REF' => 'Term Source REF_1' [13], 'Term Accession Number' => 'Term Accession Number_1' [14], 'Term Source REF' => 'Term Source REF_2' [16], 'Term Accession Number' => 'Term Accession Number_2' [17], 'Protocol REF' => 'Protocol REF_1' [24], 'Protocol REF' => 'Protocol REF_2' [27], 'Term Source REF' => 'Term Source REF_3' [30], 'Protocol REF' => 'Protocol REF_3' [31], 'Protocol REF' => 'Protocol REF_4' [32], 'Protocol REF' => 'Protocol REF_5' [35], 'Term Source REF' => 'Term Source REF_4' [43], 'Term Accession Number' => 'Term Accession Number_3' [44], 'Term Source REF' => 'Term Source REF_5' [46], 'Term Accession Number' => 'Term Accession Number_4' [47]Parsed with column specification:
cols(
  .default = col_character(),
  `Characteristics[age at diagnosis (years)]` = col_double(),
  `Characteristics[age at diagonosis (years)]` = col_double(),
  `Characteristics[survival (years)]` = col_double()
)
See spec(...) for full column specifications.

The sample-data relationship files from ArrayExpress (specifically, their column names) are pretty tidyverse-unfriendly.

cleaned.meta.df <- data.frame(
  sample_id = gsub(" 1", "", meta.gse26576.df$`Source Name`),
  sample_file = meta.gse26576.df$`Array Data File`,
  sample_title = meta.gse26576.df$`Comment [Sample_title]`,
  age_at_diagnosis = meta.gse26576.df$`Characteristics[age at diagnosis (years)]`,
  disease_state = meta.gse26576.df$`Characteristics[disease]`,
  histology = meta.gse26576.df$`Characteristics[histology]`,
  sample_collection = meta.gse26576.df$`Characteristics[sample collection]`,
  material_type = meta.gse26576.df$`Material Type`
) %>%
  # get rid of the genomic DNA samples
  dplyr::filter(material_type == "total RNA") %>%
  dplyr::select(-material_type)

There is information in the sample_title field that can help us fill in the disease_state blanks.

cleaned.meta.df <- cleaned.meta.df %>%
  dplyr::mutate(disease_state = dplyr::case_when(
    grepl("normal", cleaned.meta.df$sample_title) ~ "normal",
    grepl("low", cleaned.meta.df$sample_title) ~ "LGG",
    grepl("DIPG", cleaned.meta.df$sample_title) ~ "DIPG",
    grepl("Glioblastoma", cleaned.meta.df$sample_title) ~ "Glioblastoma"
  ))

The sample_file field will match the headers of the PCL file. Write the cleaned metadata to file.

readr::write_tsv(cleaned.meta.df, 
                 path = file.path(sample.info.dir, 
                                  "E-GEOD-26576_cleaned_metadata.tsv"))
LS0tCnRpdGxlOiAiRElQRzogZGF0YSBjbGVhbmluZyIKb3V0cHV0OiAgIAogIGh0bWxfbm90ZWJvb2s6IAogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgoqKkouIFRhcm9uaSAyMDE4KioKCkluIHRoaXMgbm90ZWJvb2ssIHdlJ2xsIGNsZWFuIGRpZmZ1c2UgaW50cmluc2ljIHBvbnRpbmUgZ2xpb21hIChESVBHKSBkYXRhLgpUaGVyZSBpcyBubyBESVBHIGRhdGEgaW4gcmVjb3VudDIsIHNvIHRoaXMgaXMgYW5vdGhlciB1c2UgY2FzZSBmb3IgdGhpcwpwcm9qZWN0LgoKV2UnbGwgYmUgd29ya2luZyB3aXRoIHR3byBkYXRhc2V0cyBzdG9yZWQgaW4gdGhlCltgZ3JlZW5lbGFiL3JoZXVtLXBsaWVyLWRhdGFgXShodHRwczovL2dpdGh1Yi5jb20vZ3JlZW5lbGFiL3JoZXVtLXBsaWVyLWRhdGEpIApyZXBvc2l0b3J5OgoKKiBbYEUtR0VPRC0yNjU3NmBdKGh0dHBzOi8vd3d3LmViaS5hYy51ay9hcnJheWV4cHJlc3MvZXhwZXJpbWVudHMvRS1HRU9ELTI2NTc2LykKKiBbYEdTRTUwMDIxYF0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9nZW8vcXVlcnkvYWNjLmNnaT9hY2M9R1NFNTAwMjEpCgoqKkNpdGF0aW9uczoqKgoKPiBQYXVnaCBCUywgQnJvbmlzY2VyIEEsIFF1IEMsIGV0IGFsLiBbR2Vub21lLXdpZGUgYW5hbHlzZXMgaWRlbnRpZnkgcmVjdXJyZW50IAphbXBsaWZpY2F0aW9ucyBvZiByZWNlcHRvciB0eXJvc2luZSBraW5hc2VzIGFuZCBjZWxsLWN5Y2xlIHJlZ3VsYXRvcnkgZ2VuZXMgaW4gCmRpZmZ1c2UgaW50cmluc2ljIHBvbnRpbmUgZ2xpb21hLl0oaHR0cHM6Ly9keC5kb2kub3JnLzEwLjEyMDAvSkNPLjIwMTEuMzUuNTY3NykgCl9KIENsaW4gT25jb2wuXyAyMDExOzI5KDMwKTozOTk5LTQwMDYuCgo+IEJ1Y3prb3dpY3ogUCwgSG9lbWFuIEMsIFJha29wb3Vsb3MgUCwgZXQgYWwuIFtHZW5vbWljIGFuYWx5c2lzIG9mIGRpZmZ1c2UgCmludHJpbnNpYyBwb250aW5lIGdsaW9tYXMgaWRlbnRpZmllcyB0aHJlZSBtb2xlY3VsYXIgc3ViZ3JvdXBzIGFuZCByZWN1cnJlbnQgCmFjdGl2YXRpbmcgX0FDVlIxXyBtdXRhdGlvbnMuXShodHRwczovL2R4LmRvaS5vcmcvMTAuMTAzOC9uZy4yOTM2KSBfTmF0IEdlbmV0Ll8gCjIwMTQ7NDYoNSk6NDUxLTYuIAoKIyMgU2V0IHVwCgpgYGB7cn0KIyBtYWdyaXR0ciBwaXBlCmAlPiVgIDwtIGRwbHlyOjpgJT4lYAojIHdlIG5lZWQgdGhlIGZ1bmN0aW9uIHRoYXQgYWdncmVnYXRlcyBkdXBsaWNhdGUgZ2VuZSBpZGVudGlmaWVycyB0byB0aGUKIyBtZWFuIHZhbHVlCnNvdXJjZShmaWxlLnBhdGgoInV0aWwiLCAidGVzdF9MVl9kaWZmZXJlbmNlcy5SIikpCmBgYAoKIyMjIyBEaXJlY3Rvcnkgc2V0dXAKCmBgYHtyfQojIGRpcmVjdG9yeSB0aGF0IGhvbGRzIHRoZSBnZW5lIGV4cHJlc3Npb24gZmlsZXMKZXhwcnMuZGlyIDwtIGZpbGUucGF0aCgiZGF0YSIsICJleHByZXNzaW9uX2RhdGEiKQojIGRpcmVjdG9yeSB0aGF0IGhvbGRzIHRoZSBzYW1wbGUgbWV0YWRhdGEKc2FtcGxlLmluZm8uZGlyIDwtIGZpbGUucGF0aCgiZGF0YSIsICJzYW1wbGVfaW5mbyIpCmBgYAoKIyMgUmVhZCBpbiBhbmQgY2xlYW4gZGF0YQoKIyMjIEdTRTUwMDIxCgpXZSBoYXZlIHRoZSBzZXJpZXMgbWF0cml4IGZvciBgR1NFNTAwMjFgLCB3aGljaCBjb250YWlucyBib3RoIHRoZSBleHByZXNzaW9uCnZhbHVlcyBhbmQgdGhlIG1ldGFkYXRhCgpgYGB7cn0Kc2VyaWVzLm1hdC5maWxlIDwtIGZpbGUucGF0aChleHBycy5kaXIsICJHU0U1MDAyMV9zZXJpZXNfbWF0cml4LnR4dCIpCgojIGV4cHJlc3Npb24gbWF0cml4IC0tIGV2ZXJ5dGhpbmcgYnV0IHRoZSBjb21tZW50IGxpbmVzIHRoYXQgYmVnaW4gd2l0aCAhCm1hLmRhdGEgPC0gCiAgcmVhZHI6OnJlYWRfZGVsaW0oc2VyaWVzLm1hdC5maWxlLCAKICAgICAgICAgICAgICAgICAgICBkZWxpbSA9ICJcdCIsIAogICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSAiISIsCiAgICAgICAgICAgICAgICAgICAgY29sX25hbWVzID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgc2tpcCA9IDEpCmBgYAoKIyMjIyBHZW5lIGlkZW50aWZpZXIgY29udmVyc2lvbgoKYGBge3J9CiMgVGhlIEdQTCBpbmZvcm1hdGlvbiBmcm9tIEdFTywgd2hpY2ggd2FzIG1hZGUgcHVibGljIG9uIEp1bCAxOCwgMjAxMSBhbmQgCiMgbGFzdCB1cGRhdGVkIG9uIEphbiAxOCwgMjAxMwpncGwuaW5mby5kZiA8LSByZWFkcjo6cmVhZF90c3YoZmlsZS5wYXRoKGV4cHJzLmRpciwgIkdQTDEzOTM4LTExMzAyLnR4dCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9ICIjIikKYGBgCgpgYGB7cn0KYW5ub3QuZ3NlNTAwMjEuZGYgPC0gZ3BsLmluZm8uZGYgJT4lCiAgIyBmcm9tIHRoZSBHRU8gaW5mb3JtYXRpb24sIGdyYWIganVzdCB0aGUgcHJvYmUgaWRlbnRpZmllciBhbmQgdGhlIGdlbmUKICAjIHN5bWJvbCBjb2x1bW5zCiAgZHBseXI6OnNlbGVjdChjKElELCBTeW1ib2wpKSAlPiUKICAjIG9ubHkgSUxNTiBJRHMgKHByb2JlcykgaW4gYm90aAogIGRwbHlyOjppbm5lcl9qb2luKG1hLmRhdGEsIGJ5ID0gYygiSUQiICA9ICJJRF9SRUYiKSkgJT4lCiAgIyBjb2xsYXBzaW5nIGR1cGxpY2F0ZSBzeW1ib2xzIGxhdGVyIHdpbGwgcmVxdWlyZSB0aGUgc3ltYm9scyB0byBiZSBpbiB0aGUKICAjIGZpcnN0IGNvbHVtbiwgY2FsbGVkICJHZW5lIiwgd2l0aCBubyBhZGRpdGlvbmFsIGNvbHVtbnMKICBkcGx5cjo6bXV0YXRlKEdlbmUgPSBTeW1ib2wpICU+JQogIGRwbHlyOjpzZWxlY3QoLUlELCAtU3ltYm9sKSAlPiUKICBkcGx5cjo6c2VsZWN0KEdlbmUsIGRwbHlyOjpldmVyeXRoaW5nKCkpCmBgYAoKQ29sbGFwc2UgZHVwbGljYXRlIHN5bWJvbHMgYW5kIHdyaXRlIHRvIGZpbGUuCgpgYGB7cn0KIyBzdW1tYXJpemUgdG8gbWVhbgphbm5vdC5tZWFuLmRmIDwtIFByZXBFeHByZXNzaW9uREYoYW5ub3QuZ3NlNTAwMjEuZGYpCnJlYWRyOjp3cml0ZV90c3YoYW5ub3QubWVhbi5kZiwgZmlsZS5wYXRoKGV4cHJzLmRpciwgIkdTRTUwMDIxX21lYW5fYWdnLnBjbCIpKQpgYGAKCiMjIyMgU2FtcGxlIG1ldGFkYXRhCgpBcyBtZW50aW9uZWQgYWJvdmUsIG1ldGFkYXRhIGlzIGFsc28gZXh0cmFjdGVkIGZyb20gdGhlIHNlcmllcyBtYXRyaXggZmlsZS4KV2UgZG8gdGhpcyBmb3IgYSBzaW5nbGUgbGluZSBhdCBhIHRpbWUgdGhhdCB3ZSd2ZSBwaWNrZWQgYmFzZWQgb24gdGhlIHJlbGV2YW5jZQp0byBhbnkgZG93bnN0cmVhbSBhbmFseXNpcyB3ZSBtaWdodCBkbyAoY29udGFjdCBpbmZvcm1hdGlvbiwgZm9yIGV4YW1wbGUsIApkb2VzIG5vdCBoZWxwIHVzIGluIHRoaXMgY29udGV4dCkuCgpXZSdsbCB3cml0ZSBhIGN1c3RvbSBmdW5jdGlvbiBzcGVjaWZpY2FsbHkgZm9yIHRoaXMgY29udGV4dCBhbmQgZW52aXJvbm1lbnQKCmBgYHtyfQojIGdpdmVuIGEgbGluZSBudW1iZXIgb2YgdGhlIHNlcmllcyBtYXRyaXggZmlsZSAoc2VyaWVzLm1hdC5maWxlKSwKIyBnZXQgdGhlIHZhbHVlcwpHZXRTYW1wbGVBdHRyaWJ1dGVzIDwtIGZ1bmN0aW9uKHNraXAudmFsdWUpIHsKICBjb25uIDwtIGZpbGUoc2VyaWVzLm1hdC5maWxlKQogIG9wZW4oY29ubikKICBzYW1wbGUuYXR0cmlidXRlcyA8LSByZWFkLnRhYmxlKGNvbm4sIHNraXAgPSBza2lwLnZhbHVlLCBucm93ID0gMSkKICBjbG9zZShjb25uKQogIHJldHVybihzYW1wbGUuYXR0cmlidXRlcykKfQoKIyBzYW1wbGUgYWNjZXNzaW9uIGUuZy4sIEdTTVhYWFhYCnNhbXBsZS5hY2Nlc3Npb24gPC0gR2V0U2FtcGxlQXR0cmlidXRlcyhza2lwLnZhbHVlID0gNzkpCgojIHNvdXJjZSBuYW1lCnNvdXJjZS5uYW1lIDwtIEdldFNhbXBsZUF0dHJpYnV0ZXMoc2tpcC52YWx1ZSA9IDg1KQoKIyB0aXNzdWUKdGlzc3VlIDwtIEdldFNhbXBsZUF0dHJpYnV0ZXMoc2tpcC52YWx1ZSA9IDg4KQoKIyBnZW5kZXIKZ2VuZGVyIDwtIEdldFNhbXBsZUF0dHJpYnV0ZXMoc2tpcC52YWx1ZSA9IDg5KQoKIyBhZ2UgYXQgZGlhZ25vc2lzCmFnZS5keCA8LSBHZXRTYW1wbGVBdHRyaWJ1dGVzKHNraXAudmFsdWUgPSA5MCkKCiMgb3ZlcmFsbCBzdXJ2aXZhbApzdXJ2aXZhbCA8LSBHZXRTYW1wbGVBdHRyaWJ1dGVzKHNraXAudmFsdWUgPSA5MSkKCiMgZ2V0IHRob3NlIGxpbmVzIGludG8gZGF0YS5mcmFtZSBmb3JtYXQKc21wbC5pbmZvLmRmIDwtIGFzLmRhdGEuZnJhbWUodChkcGx5cjo6YmluZF9yb3dzKHNhbXBsZS5hY2Nlc3Npb24sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5hbWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlzc3VlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlLmR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vydml2YWwpKVstMSwgXSkgCmNvbG5hbWVzKHNtcGwuaW5mby5kZikgPC0gYygic2FtcGxlX2FjY2Vzc2lvbiIsICJzb3VyY2VfbmFtZSIsICJ0aXNzdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImdlbmRlciIsICJhZ2VfYXRfZGlhZ25vc2lzX3lycyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm92ZXJhbGxfc3Vydml2YWxfeXJzIikKCiMgc3RyaXAgZXh0cmFuZW91cyBzdHJpbmdzCnNtcGwuaW5mby5kZiA8LSBzbXBsLmluZm8uZGYgJT4lCiAgZHBseXI6Om11dGF0ZSh0aXNzdWUgPSBnc3ViKCJjZWxsIHR5cGU6ICIsICIiLCB0aXNzdWUpLAogICAgICAgICAgICAgICAgZ2VuZGVyID0gZ3N1YigiZ2VuZGVyOiAiLCAiIiwgZ2VuZGVyKSwKICAgICAgICAgICAgICAgIGFnZV9hdF9kaWFnbm9zaXNfeXJzID0gZ3N1YigiYWdlIGF0IGR4IFxcKHllYXJzXFwpOiAiLCAiIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlX2F0X2RpYWdub3Npc195cnMpLAogICAgICAgICAgICAgICAgb3ZlcmFsbF9zdXJ2aXZhbF95cnMgPSBnc3ViKCJvcyBcXCh5ZWFyc1xcKTogIiwgIiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGxfc3Vydml2YWxfeXJzKSkKCiMgY2hhbmdlICJOL0EiIHRvIE5BCnNtcGwuaW5mby5kZlt3aGljaChzbXBsLmluZm8uZGYgPT0gIk4vQSIsIGFyci5pbmQgPSBUUlVFKV0gPC0gTkEKYGBgCgpXcml0ZSB0aGUgY2xlYW5lZCBtZXRhZGF0YSB0byBhIFRTViBmaWxlLgoKYGBge3J9CnJlYWRyOjp3cml0ZV90c3Yoc21wbC5pbmZvLmRmLCAKICAgICAgICAgICAgICAgICBmaWxlLnBhdGgoc2FtcGxlLmluZm8uZGlyLCAiR1NFNTAwMjFfY2xlYW5lZF9tZXRhZGF0YS50c3YiKSkKYGBgCgpDbGVhbiB1cCB0aGUgd29ya3NwYWNlIGEgYml0IGJlZm9yZSB3b3JraW5nIHdpdGggdGhlIG5leHQgZGF0YXNldC4KCmBgYHtyfQp0by5rZWVwIDwtIGMoIiU+JSIsICJleHBycy5kaXIiLCAic2FtcGxlLmluZm8uZGlyIiwgIlByZXBFeHByZXNzaW9uREYiKQpybShsaXN0ID0gc2V0ZGlmZihscygpLCB0by5rZWVwKSkKYGBgCgojIyMgRS1HRU9ELTI2NTc2CgpXZSB1c2VkIGFuIEVudHJleiBJRCBCcmFpbkFycmF5IHBhY2thZ2UgdG8gcHJvY2VzcyB0aGlzIGRhdGEgc2V0IGFuZCB3ZSBuZWVkIApnZW5lIHN5bWJvbHMgdG8gd29yayB3aXRoIFBMSUVSLgoKYGBge3J9CiMgU0NBTmZhc3QgcHJvY2Vzc2VkIFBDTApnc2UyNjU3Ni5maWxlIDwtIGZpbGUucGF0aChleHBycy5kaXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAiRElQR19FLUdFT0QtMjY1NzZfaGd1MTMzcGx1czJfU0NBTmZhc3QucGNsIikKCiMgcmVhZCBpbiB0aGUgUENMIGZpbGUsIHJlbW92ZSB0aGUgdHJhaWxpbmcgIl9hdCIgYWRkZWQgYnkgQnJhaW5hcnJheSAodGhlc2UKIyBhcmUgRW50cmV6IGdlbmUgaWRlbnRpZmllcnMpLCBkcm9wIHRoZSBFbnRyZXogSURzIHdpdGggX2F0IGFwcGVuZGVkLCByZW9yZGVyZWQKIyBzdWNoIHRoYXQgdGhlIGdlbmUgaWRlbnRpZmllcnMgYXJlIHRoZSBmaXJzdCBjb2x1bW4KZ3NlMjY1NzYuZGYgPC0gcmVhZHI6OnJlYWRfdHN2KGdzZTI2NTc2LmZpbGUpICU+JQogIGRwbHlyOjptdXRhdGUoRW50cmV6SUQgPSBzdWIoIl9hdCIsICIiLCBYMSkpICU+JQogIGRwbHlyOjpzZWxlY3QoLVgxKSAlPiUKICBkcGx5cjo6c2VsZWN0KEVudHJleklELCBkcGx5cjo6ZXZlcnl0aGluZygpKQpgYGAKCiMjIyMgR2VuZSBpZGVudGlmaWVyIGNvbnZlcnNpb24KCmBgYHtyfQojIGV4dHJhY3QgdGhlIEVudHJleiBJRCBHZW5lIHN5bWJvbCBtYXBwaW5nIGZyb20gb3JnLkhzLmVnLmRiCnN5bWJvbC5vYmogPC0gb3JnLkhzLmVnLmRiOjpvcmcuSHMuZWdTWU1CT0wKbWFwcGVkLmdlbmVzIDwtIEFubm90YXRpb25EYmk6Om1hcHBlZGtleXMoc3ltYm9sLm9iaikKc3ltYm9sLmxpc3QgPC0gYXMubGlzdChzeW1ib2wub2JqW21hcHBlZC5nZW5lc10pCnN5bWJvbC5kZiA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKG5hbWVzKHN5bWJvbC5saXN0KSwgdW5saXN0KHN5bWJvbC5saXN0KSkpCmNvbG5hbWVzKHN5bWJvbC5kZikgPC0gYygiRW50cmV6SUQiLCAiR2VuZVN5bWJvbCIpCmBgYAoKSm9pbiB0aGUgYW5ub3RhdGlvbiBgZGF0YS5mcmFtZWAgdG8gdGhlIGV4cHJlc3Npb24gYGRhdGEuZnJhbWVgCgpgYGB7cn0KYW5ub3QuZ3NlMjY1NzYuZGYgPC0gc3ltYm9sLmRmICU+JQogIGRwbHlyOjppbm5lcl9qb2luKGdzZTI2NTc2LmRmLCBieSA9ICJFbnRyZXpJRCIpCnJtKHN5bWJvbC5kZikKYGBgCgpBcmUgdGhlcmUgYW55IGR1cGxpY2F0ZXM/CgpgYGB7cn0KYW55KGR1cGxpY2F0ZWQoYW5ub3QuZ3NlMjY1NzYuZGYkR2VuZVN5bWJvbCkpCmBgYAoKTm8sIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgZWxzZS4KV3JpdGUgdGhlIGBkYXRhLmZyYW1lYCB0aGF0IGluY2x1ZGVzIGdlbmUgc3ltYm9scyB0byBmaWxlLgoKYGBge3J9CmdzZTI2NTc2Lm91dHB1dC5maWxlIDwtIAogIGZpbGUucGF0aChleHBycy5kaXIsIAogICAgICAgICAgICAiRElQR19FLUdFT0QtMjY1NzZfaGd1MTMzcGx1czJfU0NBTmZhc3Rfd2l0aF9HZW5lU3ltYm9sLnBjbCIpCnJlYWRyOjp3cml0ZV90c3YoYW5ub3QuZ3NlMjY1NzYuZGYsIHBhdGggPSBnc2UyNjU3Ni5vdXRwdXQuZmlsZSkKYGBgCgojIyMjIFNhbXBsZSBNZXRhZGF0YQoKYGBge3J9Cm1ldGEuZ3NlMjY1NzYuZmlsZSA8LSBmaWxlLnBhdGgoc2FtcGxlLmluZm8uZGlyLCAiRS1HRU9ELTI2NTc2LnNkcmYudHh0IikKbWV0YS5nc2UyNjU3Ni5kZiA8LSByZWFkcjo6cmVhZF90c3YobWV0YS5nc2UyNjU3Ni5maWxlKQpgYGAKClRoZSBzYW1wbGUtZGF0YSByZWxhdGlvbnNoaXAgZmlsZXMgZnJvbSBBcnJheUV4cHJlc3MgKHNwZWNpZmljYWxseSwgdGhlaXIgCmNvbHVtbiBuYW1lcykgYXJlIHByZXR0eSB0aWR5dmVyc2UtdW5mcmllbmRseS4KCmBgYHtyfQpjbGVhbmVkLm1ldGEuZGYgPC0gZGF0YS5mcmFtZSgKICBzYW1wbGVfaWQgPSBnc3ViKCIgMSIsICIiLCBtZXRhLmdzZTI2NTc2LmRmJGBTb3VyY2UgTmFtZWApLAogIHNhbXBsZV9maWxlID0gbWV0YS5nc2UyNjU3Ni5kZiRgQXJyYXkgRGF0YSBGaWxlYCwKICBzYW1wbGVfdGl0bGUgPSBtZXRhLmdzZTI2NTc2LmRmJGBDb21tZW50IFtTYW1wbGVfdGl0bGVdYCwKICBhZ2VfYXRfZGlhZ25vc2lzID0gbWV0YS5nc2UyNjU3Ni5kZiRgQ2hhcmFjdGVyaXN0aWNzW2FnZSBhdCBkaWFnbm9zaXMgKHllYXJzKV1gLAogIGRpc2Vhc2Vfc3RhdGUgPSBtZXRhLmdzZTI2NTc2LmRmJGBDaGFyYWN0ZXJpc3RpY3NbZGlzZWFzZV1gLAogIGhpc3RvbG9neSA9IG1ldGEuZ3NlMjY1NzYuZGYkYENoYXJhY3RlcmlzdGljc1toaXN0b2xvZ3ldYCwKICBzYW1wbGVfY29sbGVjdGlvbiA9IG1ldGEuZ3NlMjY1NzYuZGYkYENoYXJhY3RlcmlzdGljc1tzYW1wbGUgY29sbGVjdGlvbl1gLAogIG1hdGVyaWFsX3R5cGUgPSBtZXRhLmdzZTI2NTc2LmRmJGBNYXRlcmlhbCBUeXBlYAopICU+JQogICMgZ2V0IHJpZCBvZiB0aGUgZ2Vub21pYyBETkEgc2FtcGxlcwogIGRwbHlyOjpmaWx0ZXIobWF0ZXJpYWxfdHlwZSA9PSAidG90YWwgUk5BIikgJT4lCiAgZHBseXI6OnNlbGVjdCgtbWF0ZXJpYWxfdHlwZSkKYGBgCgpUaGVyZSBpcyBpbmZvcm1hdGlvbiBpbiB0aGUgYHNhbXBsZV90aXRsZWAgZmllbGQgdGhhdCBjYW4gaGVscCB1cyBmaWxsIGluCnRoZSBgZGlzZWFzZV9zdGF0ZWAgYmxhbmtzLgoKYGBge3J9CmNsZWFuZWQubWV0YS5kZiA8LSBjbGVhbmVkLm1ldGEuZGYgJT4lCiAgZHBseXI6Om11dGF0ZShkaXNlYXNlX3N0YXRlID0gZHBseXI6OmNhc2Vfd2hlbigKICAgIGdyZXBsKCJub3JtYWwiLCBjbGVhbmVkLm1ldGEuZGYkc2FtcGxlX3RpdGxlKSB+ICJub3JtYWwiLAogICAgZ3JlcGwoImxvdyIsIGNsZWFuZWQubWV0YS5kZiRzYW1wbGVfdGl0bGUpIH4gIkxHRyIsCiAgICBncmVwbCgiRElQRyIsIGNsZWFuZWQubWV0YS5kZiRzYW1wbGVfdGl0bGUpIH4gIkRJUEciLAogICAgZ3JlcGwoIkdsaW9ibGFzdG9tYSIsIGNsZWFuZWQubWV0YS5kZiRzYW1wbGVfdGl0bGUpIH4gIkdsaW9ibGFzdG9tYSIKICApKQpgYGAKClRoZSBgc2FtcGxlX2ZpbGVgIGZpZWxkIHdpbGwgbWF0Y2ggdGhlIGhlYWRlcnMgb2YgdGhlIFBDTCBmaWxlLgpXcml0ZSB0aGUgY2xlYW5lZCBtZXRhZGF0YSB0byBmaWxlLgoKYGBge3J9CnJlYWRyOjp3cml0ZV90c3YoY2xlYW5lZC5tZXRhLmRmLCAKICAgICAgICAgICAgICAgICBwYXRoID0gZmlsZS5wYXRoKHNhbXBsZS5pbmZvLmRpciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRS1HRU9ELTI2NTc2X2NsZWFuZWRfbWV0YWRhdGEudHN2IikpCmBgYAoK