Skip to main content

Topics

This section allows you to view all Topics made by this member. Note that you can only see Topics made in areas you currently have access to.

Topics - krista

1
XCMS / Gaussian shape peak filtering
Hi,

A while back, Tony Larson posted code on the old Google groups forum. The code went through each mzRT feature and checked for a Gaussian fit for each peak. I have found it is stricter that the 'fitgauss=TRUE' in centWave and using XCMS < 3.0, I implement the code after I do the peakPicking. I am trying to implement this in XCMS > 3.0, but have run into one final hiccup when I try to reinsert my results back into the XCMSnExp object.

The code follows. I have left the 'old code' in the file for now, but commented out. I have managed to figure out how to get the data I want out of the mzML files, but I am stuck at the end (comment says 'STUCK HERE'). It seems like I should be able to use chromPeaks <- to set my answer. It will allow me to do this, but then I lose all the chromatography information that is needed in downstream processing.

Any thoughts? This is the final step keeping me from switching to XCMS > 3.0, so I hope to get it working.

Cheers,
Krista

Code: [Select]
#xdata <- peakShape_XCMS3(my_data,cor.val=0.9, useNoise = setNoise)

#and then proceed with retention time correction and correspondence/grouping
# Decreasing cor.val will allow more non-gaussian peaks through the filter

#original file version from the Google Groups for xcms from Tony Larson
#KL corrected this version 8/23/2011 for XCMS < 3
#KL updating to using XCMS3, 10/30/2018

#original peakShape function to remove non-gaussian peaks from an xcmsSet
#code originally had cor.val = 0.9; 0.5 is too low (not doing enough pruning)
#object is updated to be an XCMSnExp class

peakShape_XCMS3 <- function(object, cor.val=0.9, useNoise = setNoise)
{
require(xcms)

#files <- object@filepaths #old code
files <- fileNames(object)
 
#peakmat <- object@peaks #old code
peakmat <- chromPeaks(object) #extract everything

peakmat.new <- matrix(-1,1,ncol(peakmat))
colnames(peakmat.new) <- colnames(peakmat)

for(f in 1:length(files))
        {
        #xraw <- xcmsRaw(files[f], profstep=0) #old code
        raw_data <- readMSData(files[f],msLevel = 1, mode = "onDisk") #use 'onDisk' to make the next step faster
        sub.peakmat <- peakmat[which(peakmat[,"sample"]==f),,drop=F]
        corr <- numeric()
        for (p in 1:nrow(sub.peakmat))
                {
                #old code
                #tempEIC <-
                    #as.integer(rawEIC(xraw,mzrange=c(sub.peakmat[p,"mzmin"]-0.001,sub.peakmat[p,"mzmax"]+0.001))$intensity)
                #minrt.scan <- which.min(abs(xraw@scantime-sub.peakmat[p,"rtmin"]))[1]
                #maxrt.scan <- which.min(abs(xraw@scantime-sub.peakmat[p,"rtmax"]))[1]
                #eics <- tempEIC[minrt.scan:maxrt.scan]
          
                mzRange = c(sub.peakmat[p,"mzmin"]-0.001,sub.peakmat[p,"mzmax"]+0.001)
                subsetOnMZ <- filterMz(raw_data, mz = mzRange)
                
                #now set the Rt range...use sub.peakmat min and max RT
                rtRange = c(sub.peakmat[p,"rtmin"],sub.peakmat[p,"rtmax"])
                subsetOnMZandRT <- filterRt(subsetOnMZ, rt = rtRange)
 
                eics <- intensity(subsetOnMZandRT) #get the intensity values
                eics[sapply(eics, function(x) length(x)==0)] <- 0 #if empty in a scan, convert to 0
                eics <- as.integer(unlist(eics)) #use as.double for Lumos

                #filter out features that are less than the noise level I have already set...
                setThreshold <- which(eics < useNoise)
                eics <- eics[-setThreshold]
                rm(setThreshold)

                #remove any NA (easier bc downstream leaving it in causes issues)
                eics <- eics[!is.na(eics)]
                
                getIdx <- which(eics == min(eics))[1] #if multiple values, just need the first match
                #set min to 0 and normalise
                eics <- eics-eics[getIdx]
                
                if(max(eics,na.rm=TRUE)>0)
                        {
                        eics <- eics/max(eics, na.rm=TRUE)
                        }
                #fit gauss and let failures to fit through as corr=1
                fit <- try(nls(y ~ SSgauss(x, mu, sigma, h),
                               data.frame(x = 1:length(eics), y = eics)),silent=T)
                
                if(class(fit) == "try-error")
                        {
                        corr[p] <- 1
                        } else {
                        #calculate correlation of eics against gaussian fit
                        if (length(which(!is.na(eics - fitted(fit)))) > 4 &&
                            length(!is.na(unique(eics)))>4 &&
                            length(!is.na(unique(fitted(fit))))>4)
                                {
                                cor <- NULL
                                options(show.error.messages = FALSE)
                                cor <- try(cor.test(eics,fitted(fit),method="pearson",use="complete"))
                                options(show.error.messages = TRUE)
                                if (!is.null(cor))
                                        {
                                        if(cor$p.value <= 0.05) {
                                          corr[p] <- cor$estimate
                                        } else {
                                          corr[p] <- 0 }
                                        }
                                  else corr[p] <- 0
                                } else corr[p] <- 0
                        }
                } #this ends to the 'p' loop (going through one mzRT feature at a time)
        
        filt.peakmat <- sub.peakmat[which(corr >= cor.val),]
        peakmat.new <- rbind(peakmat.new, filt.peakmat)
        n.rmpeaks <- nrow(sub.peakmat)-nrow(filt.peakmat)
        cat("Peakshape evaluation: sample ",
            basename(files[f]),"
            ",n.rmpeaks,"/",nrow(sub.peakmat)," peaks removed","\n")
        
        if (.Platform$OS.type == "windows") flush.console()
        
        
        } #this ends the 'f' loop (going through one file at a time())

peakmat.new <- peakmat.new[-1,] #all but the first row that is all -1
object.new <- object #copy to a new object

#object.new@peaks <- peakmat.new #old code
chromPeaks(object.new) <- peakmat.new #STUCK HERE...why doesn't this work?

return(object.new)
} #this ends the function itself

2
XCMS / replacement for getEIC in XCMS3
I am in the process of updating to use XCMS3. So far, I like XCMS3 and most of the transition to XCMS3 has been easy in terms of how to set peak picking, retention time correction, and defining correspondence across a set of files (the old 'grouping'). However, one thing I miss is the ability to plot all of our mzRT features into a PDF that we could use to assess how well our parameters were working. I find multiple examples to extract a pre-determined mz / RT combination in the vignettes provided with XCMS3. Therefore, if I know the mz and retention time for a single peak, I can easily plot it. However, what I cannot figure out is out to get all the peaks across my set of samples.

I used to use the code listed below. In the example, xgF is the data after peak picking, group, retention time correction, and fillPeaks.

Any thoughts?
Cheers,
Krista


Quote
xs.fill <- xgF
#
xeic.raw <- getEIC(xs.fill, rt = "raw", groupidx= 1:nrow(xs.fill@groups))
xeic.corrected <- getEIC(xs.fill, rt = "corrected", groupidx= 1:nrow(xs.fill@groups))

#colorList should be as long as the number of possible levels in the dataset...
colorList <- c("deepskyblue","magenta","forestgreen","darkorchid","firebrick", "gold")

#plot first feature from diffreport (not sorted after pval!!)
cairo_pdf(file = fName_peaksPicked,onefile=TRUE)
for (i in 1:nrow(xs.fill@groups)){
  #for (i in 1:5){
 
  par(mfrow= c(2,1))
  #rt row data
  plot(xeic.raw, xs.fill,groupidx=i,col=colorList)
  #rt corrected data
  plot(xeic.corrected, xs.fill,groupidx=i,col=colorList)
 
}
dev.off()

My sessionInfo()
R version 3.5.1 (2018-07-02)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C
[5] LC_TIME=English_United States.1252

attached base packages:
[1] parallel stats graphics grDevices utils datasets methods base

other attached packages:
[1] CAMERA_1.36.0 xcms_3.2.0 MSnbase_2.6.4 ProtGenerics_1.12.0 mzR_2.14.0
[6] Rcpp_0.12.19 BiocParallel_1.14.2 Biobase_2.40.0 BiocGenerics_0.26.0

loaded via a namespace (and not attached):
 [1] lattice_0.20-35 snow_0.4-3 digest_0.6.18 foreach_1.4.4
 [5] plyr_1.8.4 backports_1.1.2 acepack_1.4.1 mzID_1.18.0
 [9] stats4_3.5.1 ggplot2_3.0.0 BiocInstaller_1.30.0 pillar_1.3.0
[13] zlibbioc_1.26.0 rlang_0.2.2 lazyeval_0.2.1 rstudioapi_0.8
[17] data.table_1.11.8 S4Vectors_0.18.3 rpart_4.1-13 Matrix_1.2-14
[21] checkmate_1.8.5 preprocessCore_1.42.0 splines_3.5.1 stringr_1.3.1
[25] foreign_0.8-71 htmlwidgets_1.3 igraph_1.2.2 munsell_0.5.0
[29] compiler_3.5.1 pkgconfig_2.0.2 base64enc_0.1-3 multtest_2.36.0
[33] pcaMethods_1.72.0 htmltools_0.3.6 nnet_7.3-12 tibble_1.4.2
[37] gridExtra_2.3 htmlTable_1.12 RANN_2.6 Hmisc_4.1-1
[41] IRanges_2.14.12 codetools_0.2-15 XML_3.98-1.16 crayon_1.3.4
[45] MASS_7.3-50 grid_3.5.1 MassSpecWavelet_1.46.0 RBGL_1.56.0
[49] gtable_0.2.0 affy_1.58.0 magrittr_1.5 scales_1.0.0
[53] graph_1.58.2 stringi_1.2.4 impute_1.54.0 affyio_1.50.0
[57] doParallel_1.0.14 limma_3.36.5 latticeExtra_0.6-28 Formula_1.2-3
[61] RColorBrewer_1.1-2 iterators_1.0.10 tools_3.5.1 survival_2.42-6
[65] yaml_2.2.0 colorspace_1.3-2 cluster_2.0.7-1 vsn_3.48.1
[69] MALDIquant_1.18 knitr_1.20


3
Job opportunities / Postdoctoral Investigator in Environmental Metabolomics
We invite applications for one or more postdoctoral researchers in the area of environmental metabolomics and/or environmental analytical chemistry. The Kujawinski lab uses analytical chemistry to explore the intersection of microbial biology and chemistry within marine systems. Potential projects include: use of metabolomics to understand the physiology of model marine organisms, comparison of laboratory and field data to infer the contribution of model organisms to marine organic matter cycling, and others. The successful applicant will be trained in all aspects of environmental sample analysis, including sample processing, mass spectrometry, and data analysis. A PhD in chemical oceanography, biogeochemistry, analytical chemistry or a related field is required. Experience with mass spectrometry and downstream data analysis as well as knowledge of programming tools such as MATLAB, Python, and R would be advantageous. Candidates with interests in linking chemical and biological datasets are especially encouraged to apply. The position is available for one year, renewable for a maximum of two years. Review of applications will begin Feb 1, 2018 and continue until one position is filled. Inquiries should be addressed to ekujawinski@whoi.edu.







4
Job opportunities / Graduate Research Assistants in Microbial Metabolomics
We invite applications for multiple graduate research assistants in the area of environmental microbial metabolomics and/or environmental analytical chemistry.
Background: Graduate students in the Kujawinski lab at the Woods Hole Oceanographic Institution (Woods Hole, Massachusetts, USA) are enrolled primarily in the MIT/WHOI Joint Program in Applied Ocean Sciences and Engineering. The research group uses analytical chemistry to explore the intersection of microbial biology and chemistry within Earth’s systems, with a specific focus on the oceans. We have access to sophisticated mass spectrometry tools as well as computational resources and develop new tools through which to interrogate the chemical composition of microbes and their environments. We collaborate with biologists in oceanography, soil science and human systems in order to place our work in the broadest context.
My philosophy: Graduate students in my research group are full colleagues in our intellectual enterprise (see projects listed on this website). Students are expected to develop their own research questions and to participate in the research group activities to the fullest. Thus, I support independent creative individuals who are eager to answer sophisticated science questions at the cutting edge of environmental chemistry and microbiology. To the best of my ability, I provide financial support for laboratory research, field activities and networking opportunities. I encourage my students to explore non-traditional career opportunities and to seek out additional training resources, as their time and interests allow, with the goal of training well-rounded scientists for their chosen careers.
Who succeeds: The lab is based on chemistry and so most of our members have training in the chemical arts. However, we welcome chemically-minded individuals with a physical science degree. We develop data analysis pipelines, when needed, and so students are encouraged to learn computer programming in MATLAB, R and/or Python. In my experience, students who have taken at least a year off after their undergraduate studies are more prepared for graduate school, so I give preference to individuals who have experience beyond their undergraduate degree. That said, excellent applications from graduating seniors are always considered.

For additional information about graduate school at WHOI, click here. Questions should be addressed to Elizabeth Kujawinski (ekjuawinski@whoi.edu).





5
Job opportunities / Postdoctoral Investigator in Environmental Metabolomics
We invite applications for a postdoctoral researcher in the area of environmental metabolomics and/or environmental analytical chemistry. The Kujawinski lab at the Woods Hole Oceanographic Institution (Woods Hole, Massachusetts, USA) uses analytical chemistry to explore the intersection of microbial biology and chemistry within marine systems. The funded project involves complex mixture analysis by qualitative and quantitative mass spectrometry, with a focus on development of new tools for analysis of metabolites dissolved in seawater. The successful applicant will be trained in all aspects of environmental sample analysis, including sample processing, mass spectrometry, and data analysis. A PhD in chemical oceanography, biogeochemistry, analytical chemistry or a related field is required. Experience with mass spectrometry and downstream data analysis as well as knowledge of programming tools such as MATLAB, Python, and R would be advantageous. Candidates with interests in linking chemical and biological datasets are especially encouraged to apply. The position is available for one year, renewable for a maximum of two years. Inquiries should be addressed to ekujawinski@whoi.edu. Please apply online through the Human Resources Department.







6
XCMS / findmzROI: link information here with output from findPeaks.centWave
Hi folks,

I would like to compare the results from findmzROI with the output from findPeaks.centWave.

In my dataset, I know we have peaks that are not being resolved with our LC method. I would like to know how many different m/z values this is. Here, by not resolved, I mean I have many isomers that span multiple minutes in our LC run. I am most of the way through this thanks to some of the code and responses on this forum. However, I have found some undocumented output from findPeaks.centWave and am hoping that someone knows a little more about the behind the scenes steps to help me understand the output. Here's what I have done:

1. Find the list of ROIs using findmzROI as described by HP Benton (available here)
2. Run findPeaks.Centwave using my parameters of choice and verbose.columns = TRUE.

After step 1, I have a list of features (mz, mzmin,mzmax, scmin, scmax, length, intensity).
After step 2, I have everything described in the help, and a few additional columns: lmin, lmax, sample.

What I would like to do is to directly tie my results from step 1 with the shorter list in step #2. However, I don't see any obvious index/marker that does this. I could search with some narrow m/z and retention time window, but I would rather know which ROI corresponds to which feature without setting some bounds on search parameters.

I hoped that 'f' (described as the 'region number of m/z ROI where peak was localised') would be helpful, but I am not sure how to use this information.

Thanks in advance for thoughts on this.

From sessionInfo()
R version 3.0.3 (2014-03-06)
XCMS_1.38.0
7
XCMS / centwave: prefilter = c(K,I) or noise
Hello,

In the documentation on findPeaks.centWave  there seem to be two different parameters to set an intensity threshold during the ROI detection step.

1) prefilter = c(K,I) which keeps mass traces if they contain at least K peaks with intensity >= I.
2) noise = which is described as an optional parameter to remove centroids with intensity < noise

I understand both of these ideas. What I don't understand is why there are two ways to set the lower intensity bounds during the ROI detection step. Is there a case where the intensity value in the prefilter would be a different number than the noise parameter? Or, have I misunderstood the two parameters?

Thanks,
Krista
8
metaXCMS / alignment after Common Features
Hello,

I am curious about the order of steps in metaXCMS. As I understand it, the 'find common features' occurs before the alignment/retention time correction step. I am a little confused by this. To me, it seems like you would want to do the alignment & retention time correction across the different datasets first, and then find the common features. Am I missing something here?

Thanks,
Krista
9
XCMS Online / Cloud plot: upregulated vs. downregulated
Hello,

I have just discovered that the Cloud Plots in XCMS Online are a fantastic way to explore features of interest in a dataset. However, the terminology of 'upregulated' and 'downregulated' is potentially a bit confusing. Clearly I have uploaded two datasets which are entered into the online tool as 'Dataset 1' and 'Dataset 2'. Based on the box and whisker plots, 'upregulated' seems to be higher in dataset 2. However, I could not find any documentation actually stating this. I had actually expected upregulated to be higher in dataset 1.

I wonder if the phrasing in the Cloud Plot could be more broadly described in the figures as "higher peak heights in dataset 1 (or 2)"'? My reasoning is as follows. For an experiment in the lab, I the datasets are presumably  (1) one set of experimentally altered samples compared to (2) an un-manipulated control. However, for a set of field samples, the description does not always fit into experiment vs. control. For example, I could have fish from Lake A compared to fish from Lake B. Neither one is a control per se, but there are differences across each lake.

This is not really a question per se since I mostly wanted to suggested a slightly different phrasing for the cloud plots. However, if I am wrong about 'upregulated' meaning that peak heights are higher in dataset 2 I would like to know.

Thanks,
Krista
10
Other / compare metabolites across experiments
I am hoping to open a broad discussion on the best way to analyze metabolites across experiments. In particular, I am thinking about such comparisons in the context of storing untargeted metabolomics data in a database. My thinking is as follows:

1. Unidentified compounds (i.e. compounds that are not in existing databases) may be present in multiple experiments. In this context, an 'experiment' might be samples collected in the lab or from a set of field sites.
2. The presence/absence of these unidentified compounds across experiments will determine which compounds will be most interesting to identify. For example, a compound at mass X is found in all samples of type A. The mass X is not found in any databases of known compounds, but the frequency that the compound is found means that it is one that I should try to identify.

However, there are some major caveats with this since you have to decide how to align features (both m/z values and retention times) across sample runs and potentially even instruments. This is a major issue. But if we acknowledge the caveats, what is the best way to align metabolites from different experiments in a manner that allows us to store unknown metabolites in a database?

Alternatively, is it better to populate the data base with the m/z values and retention times from each experiment, and then setup a search engine to look within a given error window for m/z values and retention times?

Krista
11
CAMERA / groupCorr, calcIso = TRUE
Hello,

I am trying to use CAMERA with LC-MS (FT-ICR) data, and have an interesting problem. Oddly, this problem is only appearing in one ionization mode, so it is apparently a data dependent problem. However, I can't figure out where the problem begins. The actual problem comes while I am at the groupCorr step.

By this point, I have done:
Code: [Select]
xgN<-group.nearest(xs)
xgF <-fillPeaks(xgN,method = "chrom")
xsa <-xsAnnotate(xgF)
xsaF <-groupFWHM(xsa)
xsaFI <-findIsotopes(xsaF)
xsaC <-groupCorr(xsaFI,cor_eic_th=0.75,pval=0.05, graphMethod="hcs",
  calcIso = TRUE, calcCiS = TRUE, calcCaS = FALSE)

I then get an error after  'calculating isotope assignments in 290 groups'. The error is:
 % finished: Error in rbind(resMat, cbind(x = tmp2[, 1], y = tmp2[, 2], cor = 1, ps = i)) :
  number of columns of matrices must match (see arg 2)

traceback() says:

 rbind(resMat, cbind(x = tmp2[, 1], y = tmp2[, 2], cor = 1, ps = i))
8: calcIsotopes(object)
7: calcIsotopes(object)
6: .local(object, cor_eic_th, pval, graphMethod, calcIso, calcCiS,
      calcCaS, psg_list, ...)
5: groupCorr(xsaFI, cor_eic_th = 0.75, pval = 0.05, graphMethod = "hcs",
      calcIso = TRUE, calcCiS = TRUE, calcCaS = FALSE)
4: groupCorr(xsaFI, cor_eic_th = 0.75, pval = 0.05, graphMethod = "hcs",
      calcIso = TRUE, calcCiS = TRUE, calcCaS = FALSE)
3: eval.with.vis(expr, envir, enclos)
2: eval.with.vis(ei, envir)
1: source("Tps4c_pos.r")

If I set calcIso=FALSE, then the analysis proceeds without error.

I have also tried going back a step and running groupCorr on the data without the isotope information, and then it notes there is not isotope/isotope annotation (which makes sense), but the analysis goes to completion:
Code: [Select]
xsaF <-groupFWHM(xsa)
xsaC <-groupCorr(xsaF,cor_eic_th=0.75,pval=0.05, graphMethod="hcs", calcIso = TRUE, calcCiS = TRUE, calcCaS = FALSE)

There is apparently something happening at the findIsotope step, but I have been trying different parameters with no luck. I suppose I could just use the calcIso=FALSE results, but since I was able to get this to work in negative ion mode, I am perplexed.

I am running:
CAMERA 1.8.2
xcms 1.26.1
R 2.13.1

Any thoughts and/or places where I should be looking?

Thanks in advance,
Krista
12
CAMERA / findIsotopes and ppm
Hello,

I am trying to use the findIsotopes function within CAMERA. I am pretty excited to use this function as it will certainly help decide which features I will focus on for my downstream analysis.

However, I am wondering about the implementation of the 'ppm' variable. Following the syntax on the help page, I am doing the following:

xsaFI <-findIsotopes(xsaF,ppm=1)

The first set of isotopes are:
293.1617 [1][M]+
294.1755 [1][M+1]+

I interpret this as the 294.1755 is the 13C match to the 12C compound that is 293.1617.

However, if you change one of the carbons in the 12C compound to be 13C, the calculated mass would be 294.1650. By my math, the difference (in ppm) between 294.1650 and 294.1755 is 35.7 ppm, which is way more than the 'ppm=1' I requested.

The question is, is the error actually defined somewhere else in the processing? Or, what am I missing?

Thanks,
Krista
13
XCMS / centWave & ROIs
Hello,

I am hoping for some clarification on the ROIs generated by centWave and the features ultimately identified after the wavelet step. In particular, can you have one ROI that ultimately ends up being two features?

I think, from reading the Tautenhahn 2008 paper, the answer is yes (see bottom of page 7 of 16), but can someone confirm that?

Thanks,
Krista
14
XCMS / centWave with LC FT-ICR MS
Hello,

I am trying to use the centWave algorithm to look at LC FT-ICR MS data. The data are collected on a 7 Tesla Thermo LTQ FT. I have been using two different ways to convert the data from RAW files to mzXML files: (1) ReAdW.exe and (2) MSconverter. However, I am getting different behavior with each converter, and am having downstream problems with centwave (which may or may not be related to the format conversion).

When I try to run xcmsSet with method = "centWave" with ppm of 3 on the data converted with the MSConverter, I get 722 data insertion errors, and 291 features. The ReAdW converter results in 0 data insertion errors, but also only finds 5 features. If I look at the individual scans (in Matlab), the ReAdW converter seems to have peaks heights that are too high based on what I see in XCalibur and the ReAdW converter misses peaks that are visible in XCalibur.

In reading through the Google groups forum, it seems that one of the possibilities is that the data are 'poorly centroided' so I went back and collected data in centroid and profile mode, and I still get data insertion errors with the data coming off the instrument in centroid mode (though the actual number of errors does vary). If I lower the ppm to 2, I do get rid of the data insertion errors, but that seems awfully low given the recommendation to use a higher ppm than the instrument is capable of obtaining. Also ,the features visualized using plotPeaks with the ppm = 2, are not all nice peaks since some of the peaks look like one section picked out of an apparently random section of the TIC data.

I tried implementing Tony's peakShape method (Google Groups, 12/3/2009) to remove noise peaks, but it comes back with an error and my R is not good enough to figure out where the problem lies.

Any thoughts?

xr <-xcmsRaw(mzdatafile,profmethod ="bin",profstep=0.1)

xd <- xcmsSet(xr,method = "centWave", snthresh = 10,ppm=3,prefilter = c(3,150),
  peakwidth=c(5,60),mzCenterFun="wMean",integrate = 1,fitgauss= TRUE,noise = 100)

sessionInfo() : R 2.13.1 ; xcms_1.26.1

Thanks,
Krista
15
CAMERA / isotopes - negative ion mode
Hello,

In the forum for XCMS-online, there is some discussion about the notation used to indicate isotopes in negative ion mode. My understanding  is that the output has been changed to have negative isotopes be marked as [M+1]-

However, I am using R/XCMS/CAMERA (not the online version) to identify isotopes in my samples which have been run in negative ion mode. The resulting list presents data such as: [1][M]+ ... which seems to be the 12C version of a compound that is singly-charged. Would it also be possible to change CAMERA to match the output of xcms online (which is far more intuitive for negative ion mode)?

Thanks,
Krista