Mercurial > repos > melpetera > testtest
diff Testtest/GCMS-test_spectrum.R @ 0:40de28c7d3fb draft
Uploaded
author | melpetera |
---|---|
date | Thu, 23 Nov 2017 08:50:14 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Testtest/GCMS-test_spectrum.R Thu Nov 23 08:50:14 2017 -0500 @@ -0,0 +1,135 @@ +# author: Pauline Ribeyre + + +############# +# find ions # +############# + +is_ion_present <- function(GC_results, rt, mz_list) { + # Looks for a ion in the pseudospectra. + # + # Args: + # GC_results: result of a test by runGC(). + # rt: retention time of the ion to look for. + # mz_list: list of the ion's isotopes' m/z. + # + # Returns: + # The number of times the ion was found in the pseudospectra. + + delta_rt <- ions_delta_rt + delta_mz <- ions_delta_mz + + res = 0 + + pseudospectra <- GC_results$PseudoSpectra + for (peak in pseudospectra) { # check all the peaks + if (peak$rt >= rt - delta_rt && peak$rt <= rt + delta_rt) { # check if the retention time matches + + ps <- peak$pspectrum + found_ion <- rep(NA, length(mz_list)) + + for (i in 1:length(mz_list)) { # check the presence of all the ions given in parameter + + ion <- mz_list[i][[1]] + found_ion[i] <- sum((ps[,"mz"] >= ion - delta_mz) & (ps[,"mz"] <= ion + delta_mz)) + + } # end for + + if (length(which(found_ion > 1)) > 0) { + stop("The ion was found more than 1 time in the same pseudospectrum.") + } + + if (sum(found_ion) == length(mz_list)) { + res <- res + 1 + } + + } # end if + } # end for + + return (res) + +} + + +############## +# duplicates # +############## + +count_duplicates_function <- function(GC_results) { + # Counts the number of ions that have been found in more than one pseudospectra (slow). + # + # Args: + # GC_results: result of a test by runGC(). + # + # Returns: + # The number of duplicates. + + delta_rt <- duplicates_delta_rt + delta_mz <- duplicates_delta_mz + + pseudospectra <- GC_results$PseudoSpectra + + # order by pseudospectrum rt + rts <- sapply(pseudospectra, function(x) x$rt) + rts_order <- order(rts) + + duplicates <- NULL # record all the duplicates we find + already_counted <- NULL # record which duplicates have already been counted + + for (pspec in 1:length(rts)) { # for each pseudospectrum + + i <- rts_order[pspec] + this_rt <- rts[i] + + # number of following pseudospectra to consider + k <- 0 + while (pspec + k + 1 < length(rts_order) && rts[rts_order[pspec + k + 1]] < this_rt + delta_rt) { # check if the retention time matches + k <- k + 1 + } + + mzs <- lapply(pseudospectra[rts_order[pspec:(pspec + k)]], function(x) x$pspectrum) + mzs_sorted <- NULL + for (j in 1:(k + 1)) { + mzs_sorted <- rbind(mzs_sorted, t(sapply(1:length(mzs[[j]][,1]), function(n) c(rts[rts_order[pspec + j - 1]], mzs[[j]][,1][n])))) + } + mzs_sorted <- mzs_sorted[order(mzs_sorted[,2]),] # column 1: rt ; column 2: m/z + + i <- 1 + while (i <= nrow(mzs_sorted)) { # for each m/z + + j <- 1 + this_already_counted <- nrow(merge(data.frame(t(mzs_sorted[i,])), data.frame(already_counted))) > 0 + + if (is.null(already_counted) || !this_already_counted) { + this_mz <- mzs_sorted[i,2] + already_counted <- rbind(already_counted, mzs_sorted[i,]) + same_ion <- 1 # count how many times this m/z appears + + while (j <= nrow(mzs_sorted) - i && mzs_sorted[i+j,2] >= this_mz - delta_mz && mzs_sorted[i+j,2] <= this_mz + delta_mz) { # check if the m/z matches + this_already_counted <- nrow(merge(data.frame(t(mzs_sorted[i+j,])), data.frame(already_counted))) > 0 + + if (!this_already_counted) { # do not count a duplicate more than once + same_ion <- same_ion + 1 + already_counted <- rbind(already_counted, mzs_sorted[i+j,]) # record which duplicates have already been counted + this_mz <- mzs_sorted[i+j,2] + } + + j <- j + 1 + } + + # first/min m/z, last/max m/z, rt where we started, number of duplicates + if (same_ion > 1) + duplicates <- rbind(duplicates, c(mzs_sorted[i,2], this_mz, mzs_sorted[i,1], same_ion)) + } + i <- i + j + } + + } + + if (is.null(duplicates)) + duplicates <- c(0, 0, 0, 0) + + return (duplicates) + +} +