library(reshape2)
library(ggplot2)
library(limma)
library(knitr)
inputDirectory <- "/home/saket/Desktop/Meningioma_input_Gpr/"
outputDirectory <- "/home/saket/Desktop/Meningioma_input_Gpr/HCvsMG2_noSexCorrected_version1/"
targetFile <- paste(inputDirectory,"Meningioma_targets_batcheffects.csv",sep="")
shouldperformCA <- FALSE #TRUE #TRUE|FALSE
CAgenesCount <- 1 #Number of gene to select along the axes from CA biplot
CAaxis <- "both" ##pos|neg|both
## Limma Config
limmaCy5 <- "F635 Median"
limmaCy5b <- "B635 Median"
limmalogFCcutoff <- 0.5
limmaShortlistLength <- 36130
limmaBValueCutoff <- -30## B-statistic is the log-posterior odds of differential expression. B=0, implies 50-50 chance of gene being DE
## B-value is the posteriro probablity of DE. Hence cannot be trustd: https://www.biostars.org/p/89187/
limmaAdjPValueCutoff <- 0.05##Adj P value is adjusted for FDR
limmaBackgroundCorrectionMethod <- "nec"
limmaNormalizationMethod <- "quantile"
limmaNegativeControlsRegexp <- "BSA|Hela cell lysate|p300-BHC"
limmaControlsRegexp <- paste(limmaNegativeControlsRegexp,
"empty|Empty|CONTROL|H2A|H2B|H3|H4|GST10n|GST50n|GST100n|GST500n",
sep="|")
limmaSampleRegexp1 <- "Control.*"
limmaSample1 <- "Control"
limmaSampleRegexp2 <- "MG_Grade_II_.*"
limmaSample2 <- "MGGrade2"
limmaBackgroundOffset <- 100
limmatwoSampleRegexp <- paste(limmaSampleRegexp1, limmaSampleRegexp2, sep="|")
limmaDesignCoefficient <- "HCvsMG2_noSexCorrected"
############################Constants###########################################3
plotForegroundIntensitiesForCohort <- function(object, title, takeLog=TRUE){
control <- grepl("Control_.*", colnames(object))
grade1 <- grepl("MG_Grade_I_.*", colnames(object))
grade2 <- grepl("MG_Grade_II_.*", colnames(object))
c <- object[, control]
g1<- object[, grade1]
g2<- object[, grade2]
c <- log2(rowMeans(as.data.frame(c$E, row.names=0)))
g1 <- log2(rowMeans(as.data.frame(g1$E, row.names=0)))
g2 <- log2(rowMeans(as.data.frame(g2$E, row.names=0)))
k <- list(c,g1,g2)
grp <- c(rep("Control",length(c)),
rep("Grade1",length(c)),
rep("Grade2",length(c)))
df <- data.frame(x=unlist(k), grp=grp)
if (takeLog){
g = ggplot(df,aes(x = grp, y = log2(x) )) + geom_boxplot(aes(fill=factor(grp))) + scale_colour_manual(breaks = c("Control", "Grade1", "Grade2"),
labels = c("Control", "Grade1", "Grade2"),
values = c("#E69F00", "#56B4E9", "#009E73"))+ xlab("Cohort") + ylab("log2 foreground intensities") + ggtitle(title)
}
if (takeLog == FALSE){
g = ggplot(df,aes(x = grp, y = x)) + geom_boxplot(aes(fill=factor(grp))) + scale_colour_manual(breaks = c("Control", "Grade1", "Grade2"),
labels = c("Control", "Grade1", "Grade2"),
values = c("#E69F00", "#56B4E9", "#009E73"))+ xlab("Cohort") + ylab("log2 foreground intensities") + ggtitle(title)
}
print(g)
ggsave(filename=paste(outputDirectory,title,".png", sep=""), plot=g)
}
plotForegroundIntensities <- function(object, title){
neg <- as.data.frame(object$E)
g = ggplot(data = melt(neg), aes(x=variable, y=log2(value)) ) + geom_boxplot(aes(fill=variable)) +xlab("Samples 1-85") + ylab("log2 foreground") + ggtitle(title)
print(g)
ggsave(filename=paste(outputDirectory,title,".png", sep=""), plot=g)
}
writeTopTable <- function(fit2){
fn <- paste(outputDirectory, limmaDesignCoefficient, ".csv", sep="")
tt<-topTable(fit2, coef=limmaDesignCoefficient,
adjust = "BH",
n = limmaShortlistLength)
write.csv(tt, fn)
return(tt)
}
targets <- read.csv(targetFile, header=T)
#f <- factor(targets$Condition, levels = unique(targets$Condition))
f<-paste(targets$Condition, targets$Sex, sep=".")
f<-factor(f,levels=c("Control.Male","Control.Female","MGGrade1.Male", "MGGrade1.Female", "MGGrade2.Male", "MGGrade2.Female"))
design <- model.matrix(~0+f)
colnames(design) <- levels(f)
cont.matrix <- makeContrasts(HCvsMG1_noSexCorrected=(MGGrade1.Female+MGGrade1.Male)/2-(Control.Female+Control.Male)/2,
HCvsMG2_noSexCorrected=(MGGrade2.Female+MGGrade1.Male)/2-(Control.Female+Control.Male)/2,
HCvsMG_noSexCorrected=((MGGrade2.Female+MGGrade1.Male)/2 + (MGGrade1.Female+MGGrade1.Male)/2)/2 -(Control.Female+Control.Male)/2,
levels=design
)
## Read images treating G,Gb as Cy5,Cy5b as explained in the beginning
RG <- read.maimages( targets$FileName,
source="genepix.custom",
green.only=TRUE,
columns=list(G=limmaCy5,Gb=limmaCy5b)
)
## Custom background: LocalFeature
## Read Control_H-02_2000153953.gpr
## Custom background: LocalFeature
## Read Control_H-03_2000153943.gpr
## Custom background: LocalFeature
## Read Control_H-19_2000154008.gpr
## Custom background: LocalFeature
## Read Control_H-23_2000154009.gpr
## Custom background: LocalFeature
## Read Control_H-25_2000153952.gpr
## Custom background: LocalFeature
## Read Control_H-35_2000153942.gpr
## Custom background: LocalFeature
## Read Control_H-41_2000154026.gpr
## Custom background: LocalFeature
## Read Control_HV-56_2000155735.gpr
## Custom background: LocalFeature
## Read Control_HV-59_2000155740.gpr
## Custom background: LocalFeature
## Read Control_HV-64_2000144456.gpr
## Custom background: LocalFeature
## Read MG_Grade_I_CF_4450_2000153801.gpr
## Custom background: LocalFeature
## Read MG_Grade_I_CH_24953_2000153787.gpr
## Custom background: LocalFeature
## Read MG_Grade_I_CJ_4231_2000153790.gpr
## Custom background: LocalFeature
## Read MG_Grade_I_CJ_9179_2000153906.gpr
## Custom background: LocalFeature
## Read MG_Grade_I_CJ_14742_2000153789.gpr
## Custom background: LocalFeature
## Read MG_Grade_I_CJ_20619_2000153788.gpr
## Custom background: LocalFeature
## Read MG_Grade_I_CJ_26538_2000153915.gpr
## Custom background: LocalFeature
## Read MG_Grade_I_CJ_29452_2000153786.gpr
## Custom background: LocalFeature
## Read MG_Grade_I_CJ_29583_2000153908.gpr
## Custom background: LocalFeature
## Read MG_Grade_I_CJ_29822_2000153909.gpr
## Custom background: LocalFeature
## Read MG_Grade_II_CH_17967_2000153914.gpr
## Custom background: LocalFeature
## Read MG_Grade_II_CJ_3577_2000153910.gpr
## Custom background: LocalFeature
## Read MG_Grade_II_CJ_15491_2000153803.gpr
## Custom background: LocalFeature
## Read MG_Grade_II_CJ_15753_2000153802.gpr
rownames(RG) <- RG$genes$ID
RG <- RG[order(rownames(RG)), ]
types <- data.frame(SpotType=c("Gene","Negative"),
ID=c("*","*"),
Name=c("*", limmaNegativeControlsRegexp),
col=c("blue", "red")
)
status <- controlStatus(types, RG$genes)
## Matching patterns for: ID Name
## Found 38400 Gene
## Found 192 Negative
## Setting attributes: values col
filterByID <- grep(limmaControlsRegexp, RG$genes[,"ID"])
filterByName <- grep(limmaControlsRegexp, RG$genes[,"Name"])
filterByNameAndID <- union(filterByID, filterByName)
RG.bc.nec <- nec(RG,
status=status,
negctrl="Negative",
regular="Gene",
robust=FALSE,
offset=limmaBackgroundOffset
)
RG.bc.nba <- normalizeBetweenArrays(RG.bc.nec, method=limmaNormalizationMethod)
RG.final <- RG.bc.nba[-filterByNameAndID,]
negatives<- grep("empty|Empty|CONTROL|BSA|Hela cell lysate|p300-BHC",RG$genes[,"ID"])
RG.negatives <- RG[negatives, ]
corfit <- duplicateCorrelation(RG.final,
design,
ndups=2,
spacing=1
)
## Loading required package: statmod
plotForegroundIntensitiesForCohort(RG, "Variation of log2 foreground intensities across all spots of all array types[Raw values]")
## Saving 7 x 5 in image

plotForegroundIntensitiesForCohort(RG.negatives, "Variation of log2 foreground intensities across negative control spots over all array types[Raw values]")
## Saving 7 x 5 in image

plotForegroundIntensitiesForCohort(RG.bc.nba, "Variation of log2 foreground intensities across all spots post background correction and quantile normalisation", FALSE)
## Saving 7 x 5 in image

plotForegroundIntensities(RG, "log2 foreground intensities of all control spots")
## Using as id variables
## Warning: Removed 127 rows containing non-finite values (stat_boxplot).
## Saving 7 x 5 in image
## Warning: Removed 127 rows containing non-finite values (stat_boxplot).

fit <- lmFit(RG.final,
design,
ndups=2,
correlation=corfit$consensus)
fit2 <- contrasts.fit(fit, cont.matrix)
fit2 <- eBayes(fit2)
limmatopTableShortlist <- writeTopTable(fit2)
rawPreprocessedValues <- cbind(RG.final$genes, RG.final$E)
write.csv(limmatopTableShortlist, paste(outputDirectory, "limmatopTableShortlist.csv", sep=""), row.names=FALSE)
write.csv(rawPreprocessedValues, paste(outputDirectory, "rawPreprocessedValues.csv", sep=""), row.names=FALSE)
rawPreprocessedValues <- read.csv(paste(outputDirectory, "rawPreprocessedValues.csv", sep=""))
columnExtract<- paste("ID|Row|Column|Name|Block", limmatwoSampleRegexp, sep="|")
preprocessedValuesSample <- rawPreprocessedValues[, grep(columnExtract,names(rawPreprocessedValues))]
write.csv(preprocessedValuesSample, paste(outputDirectory, "preprocessedValuesSample.csv", sep=""), row.names=FALSE)
limmatopTableShortlist <- read.csv(paste(outputDirectory, "limmatopTableShortlist.csv", sep=""))
preprocessedValuesSample <- read.csv(paste(outputDirectory, "preprocessedValuesSample.csv", sep=""))
limmatopTableShortlist <- limmatopTableShortlist[!duplicated(limmatopTableShortlist$ID),]
limmaOnlyExpressionValues <- merge(preprocessedValuesSample,
limmatopTableShortlist,
by=c("Block","Row","Column","ID","Name"))
limmaOnlyExpressionValues <- limmaOnlyExpressionValues[!duplicated(limmaOnlyExpressionValues$ID),]
write.csv(limmaOnlyExpressionValues, paste(outputDirectory, "limmaOnlyExpressionValues.csv", sep=""), row.names=FALSE)
limmaOnlyExpressionValues <- read.csv(paste(outputDirectory, "limmaOnlyExpressionValues.csv", sep=""))
limmaOnlyExpressionValues <- subset(limmaOnlyExpressionValues,
limmaOnlyExpressionValues$adj.P.Val < limmaAdjPValueCutoff & limmaOnlyExpressionValues$B>limmaBValueCutoff )
limmaOnlyExpressionValues <- subset(limmaOnlyExpressionValues, limmaOnlyExpressionValues$logFC> limmalogFCcutoff | limmaOnlyExpressionValues$logFC< - limmalogFCcutoff)
write.csv(limmaOnlyExpressionValues, paste(outputDirectory, "limma_shortlisted_expandedinfo.csv", sep=""), row.names=FALSE)
limmaOnlyExpressionValues$Name<-NULL
limmaOnlyExpressionValues$Block<-NULL
limmaOnlyExpressionValues$Row<-NULL
limmaOnlyExpressionValues$Column<-NULL
limmaOnlyExpressionValues$logFC <-NULL
limmaOnlyExpressionValues$AveExpr <- NULL
limmaOnlyExpressionValues$t <- NULL
limmaOnlyExpressionValues["P.Value"] <- NULL
limmaOnlyExpressionValues["adj.P.Val"] <- NULL
limmaOnlyExpressionValues["B"] <- NULL
write.csv(limmaOnlyExpressionValues, paste(outputDirectory, "limma_shortlisted.csv",sep=""), row.names=FALSE)
limmaOnlyExpressionValues <- read.csv( paste(outputDirectory, "limma_shortlisted.csv",sep=""))
rownames(limmaOnlyExpressionValues) <- limmaOnlyExpressionValues$ID
output <- paste(outputDirectory, "limma_shortlisted.csv",sep="")
svminput <- paste(outputDirectory, "svm_input.csv", sep="")
cmd <- paste("/home/saket/anaconda/bin/python", "transpose.py", output, sep=" ")
system(cmd)
fn <- read.csv(paste(output, "_transpose.csv", sep=""))
fn$Labels <- fn$ID
fn$Labels <- gsub(limmaSampleRegexp1, "Control", fn$Labels)
fn$Labels <- gsub(limmaSampleRegexp2, "Disease", fn$Labels)
fn$ID <- NULL
write.csv(fn, svminput, row.names=FALSE)
cmd1 <- paste("/home/saket/anaconda/bin/python","orange_results.py", svminput, sep=" ")
system(cmd1)
svmJson <- paste(substr(svminput,1,nchar(svminput)-4), "_average_feature_rankings.json", sep="")
svmOutput <- paste(svminput, "_output.csv", sep="")
cmd2 <- paste("/home/saket/anaconda/bin/python", "orange_results.py", svminput, svmJson, ">", svmOutput, sep = " ")
system(cmd2)
output <- read.csv(svmOutput)
output <- output[,c(1,2,12)]
#kable(output)
selectedGenes <- strsplit(as.character(output[30,]$FeatureList), split=" ")
shortlisted <- limmaOnlyExpressionValues[c(selectedGenes[[1]] ),]
melted <- melt(shortlisted, varnames=c("symbol", "sample"))
## Using ID as id variables
melted$factor<- melted$variable
melted$factor <- gsub(limmaSampleRegexp1, limmaSample1, melted$factor)
melted$factor <- gsub(limmaSampleRegexp2, limmaSample2, melted$factor)
gg = ggplot(melted) + aes(x=factor, y=(value)) + geom_point(aes(color =factor(factor)) ) + facet_wrap(~ID)
print(gg)

knitr::kable(output)
| 1 |
0.0282417 |
NM_001014444.1 |
| 2 |
0.0238017 |
NM_001014444.1 NM_003874.1 |
| 3 |
0.0248474 |
NM_001014444.1 NM_003874.1 BC025985.1 |
| 4 |
0.0247386 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 |
| 5 |
0.0207778 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 |
| 6 |
0.0256046 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 |
| 7 |
0.0348610 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 |
| 8 |
0.0361947 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 |
| 9 |
0.0272371 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 |
| 10 |
0.0518193 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 NM_003153.3 |
| 11 |
0.0181245 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 NM_003153.3 BC065370.1 |
| 12 |
0.0244685 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 NM_003153.3 BC065370.1 BC010425.1 |
| 13 |
0.0220887 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 NM_003153.3 BC065370.1 BC010425.1 NM_148910.2 |
| 14 |
0.0280473 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 NM_003153.3 BC065370.1 BC010425.1 NM_148910.2 BC004983.1 |
| 15 |
0.0354082 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 NM_003153.3 BC065370.1 BC010425.1 NM_148910.2 BC004983.1 NM_138957.2 |
| 16 |
0.0169630 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 NM_003153.3 BC065370.1 BC010425.1 NM_148910.2 BC004983.1 NM_138957.2 BC009253.2 |
| 17 |
0.0200899 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 NM_003153.3 BC065370.1 BC010425.1 NM_148910.2 BC004983.1 NM_138957.2 BC009253.2 BC004130.2 |
| 18 |
0.0203854 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 NM_003153.3 BC065370.1 BC010425.1 NM_148910.2 BC004983.1 NM_138957.2 BC009253.2 BC004130.2 NM_002812.3 |
| 19 |
0.0297936 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 NM_003153.3 BC065370.1 BC010425.1 NM_148910.2 BC004983.1 NM_138957.2 BC009253.2 BC004130.2 NM_002812.3 ENST00000261400 |
| 20 |
0.0196037 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 NM_003153.3 BC065370.1 BC010425.1 NM_148910.2 BC004983.1 NM_138957.2 BC009253.2 BC004130.2 NM_002812.3 ENST00000261400 BC033854.1 |
| 21 |
0.0241609 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 NM_003153.3 BC065370.1 BC010425.1 NM_148910.2 BC004983.1 NM_138957.2 BC009253.2 BC004130.2 NM_002812.3 ENST00000261400 BC033854.1 BC009550.1 |
| 22 |
0.0280693 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 NM_003153.3 BC065370.1 BC010425.1 NM_148910.2 BC004983.1 NM_138957.2 BC009253.2 BC004130.2 NM_002812.3 ENST00000261400 BC033854.1 BC009550.1 NM_004264.2 |
| 23 |
0.0280112 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 NM_003153.3 BC065370.1 BC010425.1 NM_148910.2 BC004983.1 NM_138957.2 BC009253.2 BC004130.2 NM_002812.3 ENST00000261400 BC033854.1 BC009550.1 NM_004264.2 BC062437.1 |
| 24 |
0.0253462 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 NM_003153.3 BC065370.1 BC010425.1 NM_148910.2 BC004983.1 NM_138957.2 BC009253.2 BC004130.2 NM_002812.3 ENST00000261400 BC033854.1 BC009550.1 NM_004264.2 BC062437.1 BC073856.1 |
| 25 |
0.0264429 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 NM_003153.3 BC065370.1 BC010425.1 NM_148910.2 BC004983.1 NM_138957.2 BC009253.2 BC004130.2 NM_002812.3 ENST00000261400 BC033854.1 BC009550.1 NM_004264.2 BC062437.1 BC073856.1 NM_018696.2 |
| 26 |
0.0253428 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 NM_003153.3 BC065370.1 BC010425.1 NM_148910.2 BC004983.1 NM_138957.2 BC009253.2 BC004130.2 NM_002812.3 ENST00000261400 BC033854.1 BC009550.1 NM_004264.2 BC062437.1 BC073856.1 NM_018696.2 NM_015726.2 |
| 27 |
0.0210596 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 NM_003153.3 BC065370.1 BC010425.1 NM_148910.2 BC004983.1 NM_138957.2 BC009253.2 BC004130.2 NM_002812.3 ENST00000261400 BC033854.1 BC009550.1 NM_004264.2 BC062437.1 BC073856.1 NM_018696.2 NM_015726.2 NM_014814.1 |
| 28 |
0.0182036 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 NM_003153.3 BC065370.1 BC010425.1 NM_148910.2 BC004983.1 NM_138957.2 BC009253.2 BC004130.2 NM_002812.3 ENST00000261400 BC033854.1 BC009550.1 NM_004264.2 BC062437.1 BC073856.1 NM_018696.2 NM_015726.2 NM_014814.1 NM_139204.1 |
| 29 |
0.0247312 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 NM_003153.3 BC065370.1 BC010425.1 NM_148910.2 BC004983.1 NM_138957.2 BC009253.2 BC004130.2 NM_002812.3 ENST00000261400 BC033854.1 BC009550.1 NM_004264.2 BC062437.1 BC073856.1 NM_018696.2 NM_015726.2 NM_014814.1 NM_139204.1 NM_003732.2 |
| 30 |
0.0253088 |
NM_001014444.1 NM_003874.1 BC025985.1 NM_016475.2 BC021988.1 BC017922.1 NM_004687.3 NM_171830.1 BC015738.1 NM_003153.3 BC065370.1 BC010425.1 NM_148910.2 BC004983.1 NM_138957.2 BC009253.2 BC004130.2 NM_002812.3 ENST00000261400 BC033854.1 BC009550.1 NM_004264.2 BC062437.1 BC073856.1 NM_018696.2 NM_015726.2 NM_014814.1 NM_139204.1 NM_003732.2 BC000786.1 |