library(patRoon)

# Generate analysis file information for all files in a directory,
# assign replicate group names to all triplicates and specify which
# should be used for blank subtraction.
anaInfo <- generateAnalysisInfo("../data",
                                groups = c(rep("blank", 3),
                                           rep("influent-A", 3),
                                           rep("effluent-A", 3),
                                           rep("influent-B", 3),
                                           rep("effluent-B", 3)),
                                blanks = "blank")

convertMSFiles(anaInfo = anaInfo, from = "thermo", to = "mzML",
               algorithm = "pwiz", centroid = "vendor")
# also export to mzXML: necessary for enviPick
convertMSFiles(anaInfo = anaInfo, from = "thermo", to = "mzXML",
               algorithm = "pwiz", centroid = "vendor")

doGroupAndFilter <- function(feat)
{
    fGroups <- groupFeatures(feat, algorithm = "openms") # all feature data is grouped with OpenMS
    fGroups <- filter(fGroups, absMinIntensity = 1E5, relMinReplicateAbundance = 1,
                      maxReplicateIntRSD = 0.75, blankThreshold = 5, removeBlanks = TRUE)
    return(fGroups)
}

featuresOpenMS <- findFeatures(anaInfo, algorithm = "openms", noiseThrInt = 4E3,
                               chromFWHM = 3, minFWHM = 1, maxFWHM = 30,
                               chromSNR = 5, mzPPM = 5)
fGroupsOpenMS <- doGroupAndFilter(featuresOpenMS)

param <- xcms::CentWaveParam(ppm = 5,
                             snthresh = 5,
                             peakwidth = c(1, 20),
                             noise = 8E3,
                             prefilter = c(3, 3E4))
featuresXCMS <- findFeatures(anaInfo, algorithm = "xcms3", param = param)
fGroupsXCMS <- doGroupAndFilter(featuresXCMS)

# we can use default settings here as enviPick is already Orbitrap optimized
featuresEnviPick <- findFeatures(anaInfo, "envipick")
fGroupsEnviPick <- doGroupAndFilter(featuresEnviPick)

# compare grouped feature data, using OpenMS for correlation
# amongst algorithms
fGroupsComp <- comparison(OpenMS = fGroupsOpenMS,
                          XCMS = fGroupsXCMS,
                          enviPick = fGroupsEnviPick,
                          groupAlgo = "openms")

# combine all features
fGroupsCons <- consensus(fGroupsComp)
# only keep features present in all three algorithms
fGroupsConsOverlap <- consensus(fGroupsComp, absMinAbundance = 3)
# isolate unique features to XCMS
fGroupsConsUniqueXCMS <- consensus(fGroupsComp, uniqueFrom = "XCMS")

# inspection of results
plotVenn(fGroupsComp) # display unique/overlap
reportHTML(fGroupsConsUniqueXCMS) # inspect unique XCMS features

# annotation
doAnnotation <- function(fg)
{
    mspl <- generateMSPeakLists(fg, "mzr", precursorMzWindow = 0.5)
    mspl <- filter(mspl, relMSMSIntThr = 0.02, topMSMSPeaks = 10)
    
    forms <- generateFormulas(fg, "genform", mspl, adduct = "[M+H]+", elements = "CHNOPSClBr",
                              calculateFeatures = FALSE)
    comps <- generateCompounds(fg, mspl, "metfrag", adduct = "[M+H]+", database = "comptox")
    
    return(list(mslists = mspl, formulas = forms, compounds = comps))
}

annOpenMS <- doAnnotation(fGroupsOpenMS)
annXCMS <- doAnnotation(fGroupsXCMS)
annEnviPick <- doAnnotation(fGroupsEnviPick)
annCons <- doAnnotation(fGroupsCons)
annConsOverlap <- doAnnotation(fGroupsConsOverlap)

# suspect screening
suspects <- read.csv("suspects.csv")
doSusScreen <- function(fGroups)
{
    screenSuspects(fGroups, suspects, mzWindow = 0.002,
                   rtWindow = 6, adduct = "[M+H]+")
}

scrOpenMS <- doSusScreen(fGroupsOpenMS)
scrXCMS <- doSusScreen(fGroupsXCMS)
scrEnviPick <- doSusScreen(fGroupsEnviPick)
scrCons <- doSusScreen(fGroupsCons)
scrConsOverlap <- doSusScreen(fGroupsConsOverlap)
