R/plot_mirror.R

Defines functions plot_mirror

Documented in plot_mirror

#' @author Yiming Zhao
#' @title plot_mirror
#' @description plot_mirror function in this package
#'
#' @param fileName filename
#'
#' @param f.msms f.msms
#'
#' @param xmlurl modifications.xml path
#' @param min_intensity min_intensity=100
#'
#' @param cex cex
#'
#' @param srt srt
#'
#' @param ppm ppm
#'
#' @param PPM_denominator PPM_denominator
#'
#' @param pdf_width pdf_width
#'
#' @param pdf_height pdf_height
#' @param y_ion_col y ion's color
#' @param b_ion_col b ion's color
#' @return NULL
#' @import stringr
#' @import TeachingDemos
#' @import xml2
#' @importFrom MSnbase readMSData pickPeaks
#' @importFrom grDevices dev.off pdf
#' @importFrom graphics abline axis lines par plot segments text
#' @importFrom utils read.table

#' @export



# Mirror image drawing method
plot_mirror <- function(fileName,f.msms,xmlurl,min_intensity=100,cex=1,srt=0,
                        ppm=20,PPM_denominator=1E6,pdf_width=20,pdf_height=10,
                        y_ion_col="red",b_ion_col="blue"){
  pdf(file=paste(fileName,sep="",".pdf"), width=pdf_width, height=pdf_height)

  # Processing modfication.xml files
  # And read site, title, composition and merge into f.unimod.
  Modifications = f.msms$`Modifications`[1]
  if(Modifications=="Unmodified"){
      Modifications = f.msms$`Modifications`[2]
  }
  modifications = read_modifications(xmlurl,Modifications)

  f.atom_MW = structure(list(Element = structure(c(20L, 4L, 24L, 9L, 11L, 1L,
  28L, 2L, 31L, 3L, 18L, 29L, 25L, 6L, 32L, 36L, 14L, 23L, 12L,
  16L, 26L, 19L, 30L, 15L, 17L, 38L, 7L, 10L, 37L, 27L, 35L, 33L,
  5L, 13L, 22L, 34L, 8L, 21L), .Label = c("13C", "15N", "18O",
  "2H", "Ag", "Al", "As", "Au", "B", "Br", "C", "Ca", "Cd", "Cl",
  "Co", "Cr", "Cu", "F", "Fe", "H", "Hg", "I", "K", "Li", "Mg",
  "Mn", "Mo", "N", "Na", "Ni", "O", "P", "Pd", "Pt", "Ru", "S",
  "Se", "Zn"), class = "factor"), Monoisotopic = c(1.007825035,
  2.014101779, 7.016003, 11.0093055, 12, 13.00335483, 14.003074,
  15.00010897, 15.99491463, 17.9991603, 18.99840322, 22.9897677,
  23.9850423, 26.9815386, 30.973762, 31.9720707, 34.96885272, 38.9637074,
  39.9625906, 51.9405098, 54.9380471, 55.9349393, 57.9353462, 58.9331976,
  62.9295989, 63.9291448, 74.9215942, 78.9183361, 79.9165196, 97.9054073,
  101.9043485, 105.903478, 106.905092, 113.903357, 126.904473,
  194.964766, 196.966543, 201.970617)), class = "data.frame", row.names = c(NA,
   -38L))

  f.unimod = structure(list(AA = structure(1:25,
  .Label = c("A", "B", "C",
  "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "P", "Q",
  "R", "S", "T", "U", "V", "W", "X", "Y", "Z"), class = "factor"),
  weight = c(71.03711, 111.03203, 103.00919, 115.02694, 129.04259,
 147.06841, 57.02146, 137.05891, 113.08406, 173.03242, 128.09496,
 113.08406, 131.04049, 114.04293, 97.05276, 128.05858, 156.10111,
 87.03203, 101.04768, 113.08406, 99.06841, 186.07931, 113.04768,
 163.06333, 103.00919), location = structure(c(1L, 1L, 1L,
 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "M", class = "factor")),
 class = "data.frame", row.names = c(NA,-25L))

  modfication = as.character(modifications$modfication[1])
  monoisotopic = f.atom_MW$Monoisotopic[which(f.atom_MW$Element==modfication)]
  mod = modifications$mod[1]
  mod=paste("(",mod,")", sep="")
  f.unimod$weight = as.numeric(f.unimod$weight)

  l = vector()
  for (i in 1:nrow(f.unimod)){
    for (j in 1:nrow(modifications)){
      if(f.unimod$AA[i] == modifications$Modified_amino_acids[j]){
        l = c(l,i)
      }
    }
  }
  f = f.unimod[l,]
  f$AA =  as.factor(paste(f$AA,mod,sep = ''))
  f$weight = f$weight + monoisotopic
  f$location = f$location
  f.unimod = rbind(f.unimod,f)

  H=f.atom_MW$Monoisotopic[which(f.atom_MW$Element=="H")]
  O=f.atom_MW$Monoisotopic[which(f.atom_MW$Element=="O")]
  H2O=H*2+O


  f.msms_u = subset(f.msms, Modifications %in% "Unmodified")
  f.msms_m = subset(f.msms, ! Modifications %in% "Unmodified")

  l1.masses = strsplit(f.msms_m$mz,split=";")
  l1.intensity = strsplit(f.msms_m$intensity,split=";")
  mod.ms2 = data.frame(l1.masses, l1.intensity, stringsAsFactors = F)
  colnames(mod.ms2) = c('mass','intensity')

  l1.masses = strsplit(f.msms_u$mz,split=";")
  l1.intensity = strsplit(f.msms_u$intensity,split=";")
  unmod.ms2 = data.frame(l1.masses, l1.intensity, stringsAsFactors = F)
  colnames(unmod.ms2) = c('mass','intensity')
  mod.ms2$mass<-as.numeric(mod.ms2$mass) # Keeping precision
  mod.ms2$intensity<-as.numeric(mod.ms2$intensity)
  unmod.ms2$mass<-as.numeric(unmod.ms2$mass) # Keeping precision
  unmod.ms2$intensity<-as.numeric(unmod.ms2$intensity)

  min_intensity=max(max(mod.ms2$intensity),max(unmod.ms2$intensity))/
    min_intensity
  # calculate theoretical b and y ions for given sequence pair
  # input amino acid weight, theoretical weight
  # fu: unmod
  # fm: mod
  fu.mz_b_final = data.frame()
  fm.mz_b_final = data.frame()
  fu.mz_y_final = data.frame()
  fm.mz_y_final = data.frame()

  # ### read unimod file for AA mono weights
  #f.unimod = read.table(f_aaweight, sep = "\t", header = TRUE)
  f.unimod$AA_loc = paste(f.unimod$AA,f.unimod$location,sep="_")
  f.unimod=f.unimod[,c("weight", "AA_loc")]

  ### calculate MW for b/y ions for unmod peptide
  fu.seq = data.frame(AA=unlist(strsplit(f.msms_u$Sequence, split="")),
                      index=1:nchar(f.msms_u$Sequence),stringsAsFactors = F)
  fu.seq$loc="M"
  fu.seq$AA_loc = paste(fu.seq$AA,fu.seq$loc,sep="_")
  fu.mz = merge(fu.seq, f.unimod, by="AA_loc",all.x=T)
  # MW for b ion
  fu.mz_b = fu.mz[with(fu.mz, order(index)),]
  fu.mz_b$accu_weight = cumsum(fu.mz_b$weight)
  # MW for y ion
  fu.mz_y = fu.mz[with(fu.mz, order(-index)),]
  fu.mz_y$accu_weight = cumsum(fu.mz_y$weight)

  ### calculate MW for b ions for mod peptide
  fm.seq = data.frame(AA=unlist(strsplit(f.msms_m$Sequence, split="")),
                      index=1:nchar(f.msms_m$Sequence),stringsAsFactors = FALSE)
  fm.mod_length = nchar(unlist(strsplit(f.msms_m$`Modified sequence`,
                                        split=mod, fixed=TRUE))[1])
  fm.seq$AA[fm.mod_length] = paste(fm.seq$AA[fm.mod_length], mod, sep="")
  fm.seq$loc="M"
  fm.seq$AA_loc = paste(fm.seq$AA,fm.seq$loc,sep="_")
  fm.mz = merge(fm.seq, f.unimod, by="AA_loc",all.x=TRUE)
  # MW for b ion
  fm.mz_b = fm.mz[with(fm.mz, order(index)),]
  fm.mz_b$accu_weight = cumsum(fm.mz_b$weight)
  # MW for y ion
  fm.mz_y = fm.mz[with(fm.mz, order(-index)),]
  fm.mz_y$accu_weight = cumsum(fm.mz_y$weight)

  ##############################################
  # Ion m/z calculation
  # calculate m/z for b/y ions         ***
  # Unmodified and modified charge must be the same
  ##############################################
  ms2_charge_u = f.msms_u$Charge - 1
  for ( charge in 1:ms2_charge_u ) {
    #ion_b = (residues + H*z)/z
    fu.mz_b$mz_b = (fu.mz_b$accu_weight + 1.007*charge) / charge
    # ion_y = (residues+h2o+H*z)/z
    fu.mz_y$mz_y = (fu.mz_y$accu_weight + H2O + H*charge) / charge

    fu.mz_b$charge = charge
    fu.mz_y$charge = charge

    if( nrow(fu.mz_b_final)==0 ){
      fu.mz_b_final = fu.mz_b
      fu.mz_y_final = fu.mz_y
    }else{
      fu.mz_b_final = rbind(fu.mz_b_final, fu.mz_b)
      fu.mz_y_final = rbind(fu.mz_y_final, fu.mz_y)
    }
  }
  ms2_charge_m = f.msms_m$Charge - 1
  for (charge in 1:ms2_charge_m) {
    fm.mz_b$mz_b = (fm.mz_b$accu_weight + 1.007*charge) / charge
    fm.mz_y$mz_y = (fm.mz_y$accu_weight + H2O + H*charge) / charge
    fm.mz_b$charge = charge
    fm.mz_y$charge = charge
    if( nrow(fm.mz_b_final)==0 ){
      fm.mz_b_final = fm.mz_b
      fm.mz_y_final = fm.mz_y
    }else{
      fm.mz_b_final = rbind(fm.mz_b_final, fm.mz_b)
      fm.mz_y_final = rbind(fm.mz_y_final, fm.mz_y)
    }
  }


  # Comparison between reasoning values in X columns in fu.psm fm.psm and actual values in mod unmod
  # Difference value
  # ppm=(theoretical accurate molecular weight (single isotope) - measured molecular weight (single isotope))
  # Theoretical accurate molecular weight (single isotope)*1000000
  # m = actual value       M = theoretical value
  # m/z = (1 - 20/1000000)*M/z    ||  m/z = (1 + 20/1000000)* M/z
  # First calculate the numerical range by 20ppm, only match the highest peak in the range.

  # Find out the scope of the actual quality
  # weight_min weight_max
  fu.mz_b_final$mz_b_min = (1 - ppm/PPM_denominator) * fu.mz_b_final$mz_b
  fu.mz_b_final$mz_b_max = (1 + ppm/PPM_denominator) * fu.mz_b_final$mz_b
  fu.mz_y_final$mz_y_min = (1 - ppm/PPM_denominator) * fu.mz_y_final$mz_y
  fu.mz_y_final$mz_y_max = (1 + ppm/PPM_denominator) * fu.mz_y_final$mz_y

  fm.mz_b_final$mz_b_min = (1 - ppm/PPM_denominator) * fm.mz_b_final$mz_b
  fm.mz_b_final$mz_b_max = (1 + ppm/PPM_denominator) * fm.mz_b_final$mz_b
  fm.mz_y_final$mz_y_min = (1 - ppm/PPM_denominator) * fm.mz_y_final$mz_y
  fm.mz_y_final$mz_y_max = (1 + ppm/PPM_denominator) * fm.mz_y_final$mz_y

  # unmod: fu b/y ion PSM
  fu.mz_b_psm = data.frame(mz = seq(1:nrow(fu.mz_b_final)))
  fu.mz_y_psm = data.frame(mz = seq(1:nrow(fu.mz_y_final)))
  
  for(i in 1:nrow(unmod.ms2)){
    mz = unmod.ms2$mass[i]
    fu.mz_b_psm$mz = ifelse(mz>fu.mz_b_final$mz_b_min & mz <
                              fu.mz_b_final$mz_b_max, unmod.ms2$intensity[i], 0)
    fu.mz_y_psm$mz = ifelse(mz>fu.mz_y_final$mz_y_min & mz <
                              fu.mz_y_final$mz_y_max, unmod.ms2$intensity[i], 0)
    names(fu.mz_b_psm)[names(fu.mz_b_psm) == "mz"] <- mz
    names(fu.mz_y_psm)[names(fu.mz_y_psm) == "mz"] <- mz
  }

  fu.mz_b_psm_colsum = colSums(fu.mz_b_psm)
  fu.mz_y_psm_colsum = colSums(fu.mz_y_psm)
  fu.mz_b_psm_colsum_index = which(fu.mz_b_psm_colsum >0 )
  fu.mz_y_psm_colsum_index = which(fu.mz_y_psm_colsum >0 )
  fu.mz_b_psm = fu.mz_b_psm[fu.mz_b_psm_colsum_index]
  fu.mz_y_psm = fu.mz_y_psm[fu.mz_y_psm_colsum_index]

  # leave the MZ with the largest intensity if multiple MZs match the same ion
  # find the max per row and retain the columns with the max
  rowmax <- apply(fu.mz_b_psm, 1, max)
  index_b = vector()
  for(i in 1:length(rowmax)){
    if(rowmax[i]>0){
      index = which(fu.mz_b_psm[i,] == rowmax[i] )
      index_b = c(index_b, index)
    }
  }
  fu.mz_b_psm = fu.mz_b_psm[index_b]

  rowmax <- apply(fu.mz_y_psm, 1, max)
  index_y = vector()

  for(i in 1:length(rowmax)){
    if(rowmax[i]>0){
      index = which(fu.mz_y_psm[i,] == rowmax[i] )
      index_y = c(index_y, index)
    }
  }
  fu.mz_y_psm = fu.mz_y_psm[index_y]

  # Remove superfluous columns
  l = vector()
  for (i in 1:length(fu.mz_b_psm)) {
    if(lengths(strsplit(names(fu.mz_b_psm[i]),'\\.'))>2){
      #print(names(fu.mz_b_psm[i]))
      #fu.mz_b_psm = fu.mz_b_psm[,-i]
      l <- c(l,i)
    }
  }
  l = sort(l,decreasing = TRUE)
  for (i in l) {
    fu.mz_b_psm = fu.mz_b_psm[,-i]
  }

  l = vector()
  for (i in 1:length(fu.mz_y_psm)) {
    if(lengths(strsplit(names(fu.mz_y_psm[i]),'\\.'))>2){
      #print(names(fu.mz_y_psm[i]))
      l <- c(l,i)
    }
  }
  l = sort(l,decreasing = TRUE)
  for (i in l) {
    fu.mz_y_psm = fu.mz_y_psm[,-i]
  }


  ### combine
  fu.mz_b_final = cbind(fu.mz_b_final, fu.mz_b_psm)
  fu.mz_y_final = cbind(fu.mz_y_final, fu.mz_y_psm)

  #####################################
  
  ##################################
  # mod: fm b/y ion PSM
  fm.mz_b_psm = data.frame(mz = seq(1:nrow(fm.mz_b_final)))
  fm.mz_y_psm = data.frame(mz = seq(1:nrow(fm.mz_y_final)))
  for(i in 1:nrow(mod.ms2)){
    mz = mod.ms2$mass[i]
    fm.mz_b_psm$mz = ifelse(mz>fm.mz_b_final$mz_b_min & mz <
                              fm.mz_b_final$mz_b_max, mod.ms2$intensity[i], 0)
    fm.mz_y_psm$mz = ifelse(mz>fm.mz_y_final$mz_y_min & mz <
                              fm.mz_y_final$mz_y_max, mod.ms2$intensity[i], 0)
    names(fm.mz_b_psm)[names(fm.mz_b_psm) == "mz"] <- mz
    names(fm.mz_y_psm)[names(fm.mz_y_psm) == "mz"] <- mz
  }

  fm.mz_b_psm_colsum = colSums(fm.mz_b_psm)
  fm.mz_y_psm_colsum = colSums(fm.mz_y_psm)
  fm.mz_b_psm_colsum_index = which(fm.mz_b_psm_colsum >0 )
  fm.mz_y_psm_colsum_index = which(fm.mz_y_psm_colsum >0 )
  fm.mz_b_psm = fm.mz_b_psm[fm.mz_b_psm_colsum_index]
  fm.mz_y_psm = fm.mz_y_psm[fm.mz_y_psm_colsum_index]

  # leave the MZ with the largest intensity if multiple MZs match the same ion
  # find the max per row and retain the columns with the max
  rowmax <- apply(fm.mz_b_psm, 1, max)
  index_b = vector()
  for(i in 1:length(rowmax)){
    if(rowmax[i]>0){
      index = which(fm.mz_b_psm[i,] == rowmax[i] )
      index_b = c(index_b, index)
    }
  }
  fm.mz_b_psm = fm.mz_b_psm[index_b]

  rowmax <- apply(fm.mz_y_psm, 1, max)
  index_y = vector()
  for(i in 1:length(rowmax)){
    if(rowmax[i]>0){
      index = which(fm.mz_y_psm[i,] == rowmax[i] )
      index_y = c(index_y, index)
    }
  }
  fm.mz_y_psm = fm.mz_y_psm[index_y]

  # Remove superfluous columns
  l = vector()
  for (i in 1:length(fm.mz_b_psm)) {
    if(lengths(strsplit(names(fm.mz_b_psm[i]),'\\.'))>2){
      #print(names(fm.mz_b_psm[i]))
      l <- c(l,i)
    }
  }
  l = sort(l,decreasing = TRUE)
  for (i in l) {
    fm.mz_b_psm = fm.mz_b_psm[,-i]
  }

  l = vector()
  for (i in 1:length(fm.mz_y_psm)) {
    if(lengths(strsplit(names(fm.mz_y_psm[i]),'\\.'))>2){
      #print(names(fm.mz_y_psm[i]))
      l <- c(l,i)
    }
  }
  l = sort(l,decreasing = TRUE)
  for (i in l) {
    fm.mz_y_psm = fm.mz_y_psm[,-i]
  }




  ### combine
  fm.mz_b_final = cbind(fm.mz_b_final, fm.mz_b_psm)
  fm.mz_y_final = cbind(fm.mz_y_final, fm.mz_y_psm)


  # m/z whose intensity is too low is not displayed and does not match b/y ion
  # The default definition of too low intensity is 1% of the highest peak.
  ## Remove matching b y ions with too low kurtosis
  # fu.mz_b_final
  l = vector()
  for (j in 11:length(fu.mz_b_final)) {
    for (i in 1:nrow(fu.mz_b_final)) {
      if(fu.mz_b_final[i,j] < min_intensity && fu.mz_b_final[i,j] >0){
        l <- c(l,j)
      }
    }
  }
  l = sort(l,decreasing = TRUE)
  for (i in l) {
    fu.mz_b_final = fu.mz_b_final[,-i]
  }
  # fu.mz_y_final
  l = vector()
  for (j in 11:length(fu.mz_y_final)) {
    for (i in 1:nrow(fu.mz_y_final)) {
      if(fu.mz_y_final[i,j] < min_intensity && fu.mz_y_final[i,j] >0){
        l <- c(l,j)
      }
    }
  }
  l = sort(l,decreasing = TRUE)
  for (i in l) {
    fu.mz_y_final = fu.mz_y_final[,-i]
  }

  # fm.mz_b_final
  l = vector()
  for (j in 11:length(fm.mz_b_final)) {
    for (i in 1:nrow(fm.mz_b_final)) {
      if(fm.mz_b_final[i,j] < min_intensity && fm.mz_b_final[i,j] >0){
        l <- c(l,j)
      }
    }
  }
  l = sort(l,decreasing = TRUE)
  for (i in l) {
    fm.mz_b_final = fm.mz_b_final[,-i]
  }

  # fm.mz_y_final
  l = vector()
  for (j in 11:length(fm.mz_y_final)) {
    for (i in 1:nrow(fm.mz_y_final)) {
      if(fm.mz_y_final[i,j] < min_intensity && fm.mz_y_final[i,j] >0){
        l <- c(l,j)
      }
    }
  }
  l = sort(l,decreasing = TRUE)
  for (i in l) {
    fm.mz_y_final = fm.mz_y_final[,-i]
  }
  # Remove ms2 with too low kurtosis
  l = vector()
  for (i in 1:nrow(mod.ms2)) {
    if(mod.ms2$intensity[i]<min_intensity){
      l <- c(l,i)
    }
  }
  l = sort(l,decreasing = TRUE)
  for (i in l) {
    mod.ms2 = mod.ms2[-i,]
  }

  l = vector()
  for (i in 1:nrow(unmod.ms2)) {
    if(unmod.ms2$intensity[i]<min_intensity){
      l <- c(l,i)
    }
  }
  l = sort(l,decreasing = TRUE)
  for (i in l) {
    unmod.ms2 = unmod.ms2[-i,]
  }

  # The values in msms do not need to be drawn
  # First perform mod.ms2 and unmod.ms2 scaling to keep the upper and lower frames consistent.,
  # And change the intensity of unmod.ms2 to a negative number
  if(max(unmod.ms2$intensity)>max(mod.ms2$intensity)){
    ratio = max(unmod.ms2$intensity)/max(mod.ms2$intensity)
    unmod.ms2$intensity_adj = unmod.ms2$intensity/ratio * -1  #Adjusted to a negative value
    mod.ms2$intensity_adj = mod.ms2$intensity
    fu.mz_b_final[,11:length(fu.mz_b_final)] =
      fu.mz_b_final[,11:length(fu.mz_b_final)]/ratio *-1
    fu.mz_y_final[,11:length(fu.mz_y_final)] =
      fu.mz_y_final[,11:length(fu.mz_y_final)]/ratio *-1
  }else{
    ratio = max(mod.ms2$intensity)/max(unmod.ms2$intensity)
    mod.ms2$intensity_adj = mod.ms2$intensity/ratio
    unmod.ms2$intensity_adj = unmod.ms2$intensity * -1
    fm.mz_b_final[,11:length(fm.mz_b_final)] =
      fm.mz_b_final[,11:length(fm.mz_b_final)]/ratio
    fm.mz_y_final[,11:length(fm.mz_y_final)] =
      fm.mz_y_final[,11:length(fm.mz_y_final)]/ratio
    fu.mz_b_final[,11:length(fu.mz_b_final)] =
      fu.mz_b_final[,11:length(fu.mz_b_final)] * -1
    fu.mz_y_final[,11:length(fu.mz_y_final)] =
      fu.mz_y_final[,11:length(fu.mz_y_final)] * -1
  }
  f.psm = rbind(mod.ms2, unmod.ms2)

  # max of MS1 masses
  n.ms1.mass = max(max(f.psm$mass),max(fm.mz_b_final$mz_b),
                   max(fm.mz_y_final$mz_y),max(fu.mz_b_final$mz_b),
                   max(fu.mz_y_final$mz_y))
  # max of MS2 mod
  n.ms2.max.intensity = max(f.psm$intensity_adj)
  # min of MS2 unmod
  n.ms2.min.intensity = min(f.psm$intensity_adj)

  ############################################
  # Drawing
  options(scipen=22)
  #outer margin
  #par(oma=c(0,4,0,4))
  par(pty="m",omd=c(0.1,0.9,0.1,0.9))
  # margin
  #par(mar=c(4,2,2,2))
  par(xaxs = "i", yaxs = "i")
  graphics::plot(f.psm$mass, f.psm$intensity_adj, type = "h",las=1,xlab="m/z",
                 ylab="",yaxt="n",xaxt="n", xlim=c(0, n.ms1.mass),
                 ylim=c(n.ms2.min.intensity*1.7, n.ms2.max.intensity*1.7))

  options(scipen=200)

  abline(h = 0)
  # label x axis
  axis(side = 1,at=seq(0, n.ms1.mass, by=200))

  # label y axis (positive)
  axis_y_positive = seq(0,signif(n.ms2.max.intensity,digits=2),
                        signif(n.ms2.max.intensity,digits=2)/4)
  axis_y_positive_real = seq(0,n.ms2.max.intensity,n.ms2.max.intensity/4)
  axis(side = 2,las = 1,at = axis_y_positive,labels =
         format(axis_y_positive,scientific=F))
  axis(side = 4,las = 1,at = axis_y_positive_real,
       labels = c("0%","25%","50%","75%","100%"))

  # label y axis (negative)
  axis_y_negative = seq(0,signif(n.ms2.min.intensity,digits=2),
                        signif(n.ms2.min.intensity,digits=2)/4)
  axis_y_negative2 = seq(0,n.ms2.min.intensity,n.ms2.min.intensity/4)
  axis_y_negative_real = seq(0,signif(max(unmod.ms2$intensity),digits=2),
                             signif(max(unmod.ms2$intensity),digits=2)/4)
  axis_y_negative = axis_y_negative[2:length(axis_y_negative)]
  axis_y_negative_real = axis_y_negative_real[2:length(axis_y_negative_real)]
  axis_y_negative2 = axis_y_negative2[2:length(axis_y_negative2)]
  axis(side = 2,las = 1,at = axis_y_negative,labels =
         format(axis_y_negative_real,scientific=F))
  axis(side = 4,las = 1,at = axis_y_negative2,labels =
         c("25%","50%","75%","100%"))

  # Draw matching b y ions and mark them at the top of the column
  # y ion index order adjustment
  for (i in 1:nrow(fu.mz_y_final)) {
    fu.mz_y_final$index[i] = nrow(fu.mz_y_final)/
      max(fu.mz_y_final$charge) -fu.mz_y_final$index[i] +1
  }
  for (i in 1:nrow(fm.mz_y_final)) {
    fm.mz_y_final$index[i] = nrow(fm.mz_y_final)/
      max(fm.mz_y_final$charge) -fm.mz_y_final$index[i] +1
  }
  # Traverse the column first and then traverse the row
  for (i in 11:length(fm.mz_b_final)) {
    for (j in 1:nrow(fm.mz_b_final)) {
      if(fm.mz_b_final[j,i] != 0){
        if(fm.mz_b_final$charge[j]==1){
          lines(as.numeric(names(fm.mz_b_final[i])),
                fm.mz_b_final[j,i], type = "h",las=1, col=b_ion_col)
          text(as.numeric(names(fm.mz_b_final[i])),fm.mz_b_final[j,i],
               paste('b',fm.mz_b_final$index[j],'+',sep = ''),
               cex = cex,col=b_ion_col,pos = 3,srt=srt)
        }else if(fm.mz_b_final$charge[j]==2){
          lines(as.numeric(names(fm.mz_b_final[i])), fm.mz_b_final[j,i],
                type = "h",las=1, col=b_ion_col)
          text(as.numeric(names(fm.mz_b_final[i])),fm.mz_b_final[j,i],
               paste('b',fm.mz_b_final$index[j],'++',sep = ''),cex = cex,
               col=b_ion_col,pos = 3,srt=srt)
        }else if(fm.mz_b_final$charge[j]==3){
          lines(as.numeric(names(fm.mz_b_final[i])), fm.mz_b_final[j,i],
                type = "h",las=1, col=b_ion_col)
          text(as.numeric(names(fm.mz_b_final[i])),fm.mz_b_final[j,i],
               paste('b',fm.mz_b_final$index[j],'+++',sep = ''),
               cex = cex,col=b_ion_col,pos = 3,srt=srt)
        }
      }
    }
  }
  for (i in 11:length(fm.mz_y_final)) {
    for (j in 1:nrow(fm.mz_y_final)) {
      if(fm.mz_y_final[j,i] != 0){
        if(fm.mz_y_final$charge[j]==1){
          lines(as.numeric(names(fm.mz_y_final[i])), fm.mz_y_final[j,i],
                type = "h",las=1, col=y_ion_col)
          text(as.numeric(names(fm.mz_y_final[i])),fm.mz_y_final[j,i],
               paste('y',fm.mz_y_final$index[j],'+ ',sep = ''),
               cex = cex, col=y_ion_col,pos = 3,srt=srt)
        }else if(fm.mz_y_final$charge[j]==2){
          lines(as.numeric(names(fm.mz_y_final[i])), fm.mz_y_final[j,i],
                type = "h",las=1, col=y_ion_col)
          text(as.numeric(names(fm.mz_y_final[i])),fm.mz_y_final[j,i],
               paste('y',fm.mz_y_final$index[j],'++',sep = ''),
               cex = cex, col=y_ion_col,pos = 3,srt=srt)
        }else if(fm.mz_y_final$charge[j]==3){
          lines(as.numeric(names(fm.mz_y_final[i])), fm.mz_y_final[j,i],
                type = "h",las=1, col=y_ion_col)
          text(as.numeric(names(fm.mz_y_final[i])),fm.mz_y_final[j,i],
               paste('y',fm.mz_y_final$index[j],'+++',sep = ''),
               cex = cex, col=y_ion_col,pos = 3,srt=srt)
        }
      }
    }
  }
  for (i in 11:length(fu.mz_b_final)) {
    for (j in 1:nrow(fu.mz_b_final)) {
      if(fu.mz_b_final[j,i] != 0){
        if(fu.mz_b_final$charge[j]==1){
          lines(as.numeric(names(fu.mz_b_final[i])), fu.mz_b_final[j,i],
                type = "h",las=1, col=b_ion_col)
          text(as.numeric(names(fu.mz_b_final[i])),fu.mz_b_final[j,i],
               paste('b',fu.mz_b_final$index[j],'+',sep = ''),
               cex = cex, col=b_ion_col,pos = 1,srt=srt)
        }else if(fu.mz_b_final$charge[j]==2){
          lines(as.numeric(names(fu.mz_b_final[i])), fu.mz_b_final[j,i],
                type = "h",las=1, col=b_ion_col)
          text(as.numeric(names(fu.mz_b_final[i])),fu.mz_b_final[j,i],
               paste('b',fu.mz_b_final$index[j],'++',sep = ''),
               cex = cex, col=b_ion_col,pos = 1,srt=srt)
        }else if(fu.mz_b_final$charge[j]==3){
          lines(as.numeric(names(fu.mz_b_final[i])), fu.mz_b_final[j,i],
                type = "h",las=1, col=b_ion_col)
          text(as.numeric(names(fu.mz_b_final[i])),fu.mz_b_final[j,i],
               paste('b',fu.mz_b_final$index[j],'+++',sep = ''),
               cex = cex, col=b_ion_col,pos = 1,srt=srt)
        }
      }
    }
  }
  for (i in 11:length(fu.mz_y_final)) {
    for (j in 1:nrow(fu.mz_y_final)) {
      if(fu.mz_y_final[j,i] != 0){
        if(fu.mz_y_final$charge[j]==1){
          lines(as.numeric(names(fu.mz_y_final[i])), fu.mz_y_final[j,i],
                type = "h",las=1, col=y_ion_col)
          text(as.numeric(names(fu.mz_y_final[i])),fu.mz_y_final[j,i],
               paste('y',fu.mz_y_final$index[j],'+',sep = ''),
               cex = cex, col=y_ion_col,pos = 1,srt=srt)
        }else if(fu.mz_y_final$charge[j]==2){
          lines(as.numeric(names(fu.mz_y_final[i])), fu.mz_y_final[j,i],
                type = "h",las=1, col=y_ion_col)
          text(as.numeric(names(fu.mz_y_final[i])),fu.mz_y_final[j,i],
               paste('y',fu.mz_y_final$index[j],'++',sep = ''),
               cex = cex, col=y_ion_col,pos = 1,srt=srt)
        }else if(fu.mz_y_final$charge[j]==3){
          lines(as.numeric(names(fu.mz_y_final[i])), fu.mz_y_final[j,i],
                type = "h",las=1, col=y_ion_col)
          text(as.numeric(names(fu.mz_y_final[i])),fu.mz_y_final[j,i],
               paste('y',fu.mz_y_final$index[j],'+++',sep = ''),
               cex = cex, col=y_ion_col,pos = 1,srt=srt)
        }
      }
    }
  }




  # For the child ion with a charge of 2, delete it first.
  # Proteomicsdb only matches amino acids with a charge of 1.
  fm.mz_b_final = fm.mz_b_final[which(fm.mz_b_final$charge==1),]
  fm.mz_y_final = fm.mz_y_final[which(fm.mz_y_final$charge==1),]
  fu.mz_b_final = fu.mz_b_final[which(fu.mz_b_final$charge==1),]
  fu.mz_y_final = fu.mz_y_final[which(fu.mz_y_final$charge==1),]


  tag1 <- array(0)
  for(k in 1:nrow(fm.mz_b_final)){
    tag1[k] <- 0
  }
  tag2 <- array(0)
  for(k in 1:nrow(fu.mz_b_final)){
    tag2[k] <- 0
  }




  for(i in 1:nrow(fm.mz_b_final)){  # 140%
    par(new = TRUE)
    if(i<nrow(fm.mz_b_final)){

      segments(x0=fm.mz_b_final$mz_b[i], y0=n.ms2.max.intensity*1.35,
               x1=fm.mz_b_final$mz_b[i], y1=n.ms2.max.intensity*1.45)
      segments(x0=fu.mz_b_final$mz_b[i], y0=n.ms2.min.intensity*1.35,
               x1=fu.mz_b_final$mz_b[i], y1=n.ms2.min.intensity*1.45)


      # Last manual assignment
      segments(fm.mz_b_final$mz_b[nrow(fm.mz_b_final)-1],
               n.ms2.max.intensity*1.4, fm.mz_b_final$mz_b[
                 nrow(fm.mz_b_final)-1]+0.25*(n.ms1.mass-fm.mz_b_final$mz_b[
                   nrow(fm.mz_b_final)-1]), n.ms2.max.intensity*1.4)
      segments(fm.mz_b_final$mz_b[nrow(fm.mz_b_final)-1]+0.75*(
        n.ms1.mass-fm.mz_b_final$mz_b[nrow(fm.mz_b_final)-1]),
        n.ms2.max.intensity*1.4,n.ms1.mass,n.ms2.max.intensity*1.4)

      segments(fu.mz_b_final$mz_b[nrow(fu.mz_b_final)-1],
               n.ms2.min.intensity*1.4, fu.mz_b_final$mz_b[
                 nrow(fu.mz_b_final)-1]+0.25*(n.ms1.mass-fu.mz_b_final$mz_b[
                   nrow(fu.mz_b_final)-1]), n.ms2.min.intensity*1.4)
      segments(fu.mz_b_final$mz_b[nrow(fu.mz_b_final)-1]+0.75*(
        n.ms1.mass-fu.mz_b_final$mz_b[nrow(fu.mz_b_final)-1]),
        n.ms2.min.intensity*1.4,n.ms1.mass,n.ms2.min.intensity*1.4)


      # Add black line for the first time in 25%  75%
      if(i==1){
        segments(0,n.ms2.max.intensity*1.4,0.25*fm.mz_b_final$mz_b[i],
                 n.ms2.max.intensity*1.4)
        segments(0.75*fm.mz_b_final$mz_b[i],n.ms2.max.intensity*1.4,
                 fm.mz_b_final$mz_b[i],n.ms2.max.intensity*1.4)

        segments(0,n.ms2.min.intensity*1.4,0.25*fu.mz_b_final$mz_b[i],
                 n.ms2.min.intensity*1.4)
        segments(0.75*fu.mz_b_final$mz_b[i],n.ms2.min.intensity*1.4,
                 fu.mz_b_final$mz_b[i],n.ms2.min.intensity*1.4)

      }else{
        segments(fm.mz_b_final$mz_b[i-1], n.ms2.max.intensity*1.4,
                 fm.mz_b_final$mz_b[i-1]+0.25*(
                   fm.mz_b_final$mz_b[i]-fm.mz_b_final$mz_b[i-1]),
                 n.ms2.max.intensity*1.4)
        segments(fm.mz_b_final$mz_b[i-1]+0.75*(
          fm.mz_b_final$mz_b[i]-fm.mz_b_final$mz_b[i-1]),
        n.ms2.max.intensity*1.4, fm.mz_b_final$mz_b[i], n.ms2.max.intensity*1.4)

        segments(fu.mz_b_final$mz_b[i-1], n.ms2.min.intensity*1.4,
                 fu.mz_b_final$mz_b[i-1]+0.25*(
                   fu.mz_b_final$mz_b[i]-fu.mz_b_final$mz_b[i-1]),
                 n.ms2.min.intensity*1.4)
        segments(fu.mz_b_final$mz_b[i-1]+0.75*(
          fu.mz_b_final$mz_b[i]-fu.mz_b_final$mz_b[i-1]),
        n.ms2.min.intensity*1.4, fu.mz_b_final$mz_b[i], n.ms2.min.intensity*1.4)

      }




    }
    if(i==1){
      shadowtext(x=fm.mz_b_final$mz_b[i]/2, y=n.ms2.max.intensity*1.4,
                 labels=fm.mz_b_final$AA[i], col="black", bg="white")
      shadowtext(x=fu.mz_b_final$mz_b[i]/2, y=n.ms2.min.intensity*1.4,
                 labels=fu.mz_b_final$AA[i], col="black", bg="white")

    }else{
      shadowtext(x=fm.mz_b_final$mz_b[i-1]+(
        fm.mz_b_final$mz_b[i]-fm.mz_b_final$mz_b[i-1])/2,
        y=n.ms2.max.intensity*1.4, labels=fm.mz_b_final$AA[i],
        col="black", bg="white")
      shadowtext(x=fu.mz_b_final$mz_b[i-1]+(
        fu.mz_b_final$mz_b[i]-fu.mz_b_final$mz_b[i-1])/2,
        y=n.ms2.min.intensity*1.4, labels=fu.mz_b_final$AA[i],
        col="black", bg="white")
    }

  }

  #140% Matching 
  for(i in 1:nrow(fm.mz_b_final)){
    # In order to prevent the need for TRUE/FALSE values, 
    # you can not use the missing value error, traversing from subscript 2

    # Match and add color
    for (j in 11:length(fm.mz_b_final)) {
      if(fm.mz_b_final[i,j] != 0){
        segments(x0=fm.mz_b_final$mz_b[i], y0=n.ms2.max.intensity*1.35,
                 x1=fm.mz_b_final$mz_b[i], y1=n.ms2.max.intensity*1.45,
                 col = b_ion_col,lwd = 3)
        tag1[i] = fm.mz_b_final$mz_b[i]
      }
    }
    for (j in 11:length(fu.mz_b_final)) {
      if(fu.mz_b_final[i,j] != 0){
        segments(x0=fu.mz_b_final$mz_b[i], y0=n.ms2.min.intensity*1.35,
                 x1=fu.mz_b_final$mz_b[i], y1=n.ms2.min.intensity*1.45,
                 col = b_ion_col,lwd = 3)
        tag2[i] = fu.mz_b_final$mz_b[i]
      }
    }
    for (j in 2:length(tag1)) {
      if(tag1[j] > 0 && tag1[j-1] != 0 && fm.mz_b_final$mz_b[i-1] == tag1[j-1]
         && fm.mz_b_final$mz_b[i]== tag1[j]){
        segments(tag1[i-1], n.ms2.max.intensity*1.4, tag1[i-1]+0.25*(
          tag1[i]-tag1[i-1]), n.ms2.max.intensity*1.4,col = b_ion_col,lwd = 3)
        segments(tag1[i-1]+0.75*(tag1[i]-tag1[i-1]), n.ms2.max.intensity*1.4,
                 tag1[i], n.ms2.max.intensity*1.4,col = b_ion_col,lwd = 3)

        shadowtext(x=fm.mz_b_final$mz_b[i-1]+(
          fm.mz_b_final$mz_b[i]-fm.mz_b_final$mz_b[i-1])/2,
          y=n.ms2.max.intensity*1.4, labels=fm.mz_b_final$AA[i],
          col=b_ion_col, bg="white")
      }
    }
    #140% Match and mark 
    for (j in 2:length(tag2)) {
      if(tag2[j] > 0 && tag2[j-1] != 0 && fu.mz_b_final$mz_b[i-1] == tag2[j-1]
         && fu.mz_b_final$mz_b[i]== tag2[j]){
        segments(tag2[i-1], n.ms2.min.intensity*1.4, tag2[i-1]+
                0.25*(tag2[i]-tag2[i-1]), n.ms2.min.intensity*1.4,col = b_ion_col,lwd = 3)
        segments(tag2[i-1]+0.75*(tag2[i]-tag2[i-1]), n.ms2.min.intensity*1.4,
                 tag2[i], n.ms2.min.intensity*1.4,col = b_ion_col,lwd = 3)
        shadowtext(x=fu.mz_b_final$mz_b[i-1]+(
          fu.mz_b_final$mz_b[i]-fu.mz_b_final$mz_b[i-1])/2,
          y=n.ms2.min.intensity*1.4, labels=fu.mz_b_final$AA[i],
          col=b_ion_col, bg="white")
      }
    }
  }


  tag1 <- array(0)
  for(k in 1:nrow(fm.mz_y_final)){
    tag1[k] <- 0
  }
  tag2 <- array(0)
  for(k in 1:nrow(fu.mz_y_final)){
    tag2[k] <- 0
  }

  for(i in 1:nrow(fm.mz_y_final)){  # 125%
    par(new = TRUE)
    if(i<nrow(fm.mz_y_final)){
      segments(x0=fm.mz_y_final$mz_y[i], y0=n.ms2.max.intensity*1.2,
               x1=fm.mz_y_final$mz_y[i], y1=n.ms2.max.intensity*1.3)
      segments(x0=fu.mz_y_final$mz_y[i], y0=n.ms2.min.intensity*1.2,
               x1=fu.mz_y_final$mz_y[i], y1=n.ms2.min.intensity*1.3)

      segments(fm.mz_y_final$mz_y[nrow(fm.mz_y_final)-1],
            n.ms2.max.intensity*1.25, fm.mz_y_final$mz_y[nrow(fm.mz_y_final)-1]
               +0.25*(n.ms1.mass-fm.mz_y_final$mz_y[nrow(fm.mz_y_final)-1]),
            n.ms2.max.intensity*1.25)
      segments(fm.mz_y_final$mz_y[nrow(fm.mz_y_final)-1]+0.75*(
        n.ms1.mass-fm.mz_y_final$mz_y[nrow(fm.mz_y_final)-1]),
        n.ms2.max.intensity*1.25,n.ms1.mass,n.ms2.max.intensity*1.25)

      segments(fu.mz_y_final$mz_y[nrow(fu.mz_y_final)-1],
            n.ms2.min.intensity*1.25, fu.mz_y_final$mz_y[nrow(fu.mz_y_final)-1]
               +0.25*(n.ms1.mass-fu.mz_y_final$mz_y[nrow(fu.mz_y_final)-1]),
            n.ms2.min.intensity*1.25)
      segments(fu.mz_y_final$mz_y[nrow(fu.mz_y_final)-1]+0.75*(
        n.ms1.mass-fu.mz_y_final$mz_y[nrow(fu.mz_y_final)-1]),
        n.ms2.min.intensity*1.25,n.ms1.mass,n.ms2.min.intensity*1.25)


      # 25% 75% black line
      if(i==1){
        segments(0,n.ms2.max.intensity*1.25,fm.mz_y_final$mz_y[i]*0.25,
                 n.ms2.max.intensity*1.25)
        segments(fm.mz_y_final$mz_y[i]*0.75,n.ms2.max.intensity*1.25,
                 fm.mz_y_final$mz_y[i],n.ms2.max.intensity*1.25)

        segments(0,n.ms2.min.intensity*1.25,fu.mz_y_final$mz_y[i]*0.25,
                 n.ms2.min.intensity*1.25)
        segments(fu.mz_y_final$mz_y[i]*0.75,n.ms2.min.intensity*1.25,
                 fu.mz_y_final$mz_y[i],n.ms2.min.intensity*1.25)
      }else{
        segments(fm.mz_y_final$mz_y[i-1], n.ms2.max.intensity*1.25,
                 fm.mz_y_final$mz_y[i-1]+(
                   fm.mz_y_final$mz_y[i]-fm.mz_y_final$mz_y[i-1])*0.25,
                 n.ms2.max.intensity*1.25)
        segments(fm.mz_y_final$mz_y[i-1]+(
          fm.mz_y_final$mz_y[i]- fm.mz_y_final$mz_y[i-1])*0.75,
      n.ms2.max.intensity*1.25, fm.mz_y_final$mz_y[i], n.ms2.max.intensity*1.25)

        segments(fu.mz_y_final$mz_y[i-1], n.ms2.min.intensity*1.25,
                 fu.mz_y_final$mz_y[i-1]+(
                   fu.mz_y_final$mz_y[i]-fu.mz_y_final$mz_y[i-1])*0.25,
                 n.ms2.min.intensity*1.25)
        segments(fu.mz_y_final$mz_y[i-1]+(
          fu.mz_y_final$mz_y[i]-fu.mz_y_final$mz_y[i-1])*0.75,
      n.ms2.min.intensity*1.25, fu.mz_y_final$mz_y[i], n.ms2.min.intensity*1.25)

      }



    }
    if(i==1){
      shadowtext(x=fm.mz_y_final$mz_y[i]/2, y=n.ms2.max.intensity*1.25,
                 labels=fm.mz_y_final$AA[i], col="black", bg="white")
      shadowtext(x=fu.mz_y_final$mz_y[i]/2, y=n.ms2.min.intensity*1.25,
                 labels=fu.mz_y_final$AA[i], col="black", bg="white")
    }else{
      shadowtext(x=fm.mz_y_final$mz_y[i-1]+(
        fm.mz_y_final$mz_y[i]-fm.mz_y_final$mz_y[i-1])/2,
        y=n.ms2.max.intensity*1.25, labels=fm.mz_y_final$AA[i], col="black",
        bg="white")
      shadowtext(x=fu.mz_y_final$mz_y[i-1]+(
        fu.mz_y_final$mz_y[i]-fu.mz_y_final$mz_y[i-1])/2,
        y=n.ms2.min.intensity*1.25, labels=fu.mz_y_final$AA[i], col="black",
        bg="white")
    }

  }


  for(i in 1:nrow(fm.mz_y_final)){

    # Match and add color
    for (j in 11:length(fm.mz_y_final)) {
      if(fm.mz_y_final[i,j] != 0){
        segments(x0=fm.mz_y_final$mz_y[i], y0=n.ms2.max.intensity*1.2,
                 x1=fm.mz_y_final$mz_y[i], y1=n.ms2.max.intensity*1.3,
                 col = y_ion_col,lwd = 3)
        tag1[i] = fm.mz_y_final$mz_y[i]
      }
    }
    for (j in 11:length(fu.mz_y_final)) {
      if(fu.mz_y_final[i,j] != 0){
        segments(x0=fu.mz_y_final$mz_y[i], y0=n.ms2.min.intensity*1.2,
                 x1=fu.mz_y_final$mz_y[i], y1=n.ms2.min.intensity*1.3,
                 col = y_ion_col,lwd = 3)
        tag2[i] = fu.mz_y_final$mz_y[i]
      }
    }
    for (j in 2:length(tag1)) {
      if(tag1[j] > 0 && tag1[j-1] != 0 && fm.mz_y_final$mz_y[i-1] == tag1[j-1]
         && fm.mz_y_final$mz_y[i]== tag1[j]){
        segments(tag1[i-1], n.ms2.max.intensity*1.25,
                 tag1[i-1]+0.25*(tag1[i]-tag1[i-1]), n.ms2.max.intensity*1.25,
                 col = y_ion_col,lwd = 3)
        segments(tag1[i-1]+0.75*(tag1[i]-tag1[i-1]), n.ms2.max.intensity*1.25,
                 tag1[i], n.ms2.max.intensity*1.25,col = y_ion_col,lwd = 3)

        shadowtext(x=fm.mz_y_final$mz_y[i-1]+(
          fm.mz_y_final$mz_y[i]-fm.mz_y_final$mz_y[i-1])/2,
          y=n.ms2.max.intensity*1.25, labels=fm.mz_y_final$AA[i], col=y_ion_col,
          bg="white")
      }
    }
    for (j2 in 2:length(tag2)) {
      if(tag2[j2] > 0 && tag2[j2-1] != 0 && fu.mz_y_final$mz_y[i-1] ==tag2[j2-1]
         && fu.mz_y_final$mz_y[i]== tag2[j2]){
        segments(tag2[i-1], n.ms2.min.intensity*1.25, tag2[i-1]+
              0.25*(tag2[i]-tag2[i-1]), n.ms2.min.intensity*1.25,col = y_ion_col,lwd = 3)
        segments(tag2[i-1]+0.75*(tag2[i]-tag2[i-1]), n.ms2.min.intensity*1.25,
                 tag2[i], n.ms2.min.intensity*1.25,col = y_ion_col,lwd = 3)
        shadowtext(x=fu.mz_y_final$mz_y[i-1]+(
          fu.mz_y_final$mz_y[i]-fu.mz_y_final$mz_y[i-1])/2,
          y=n.ms2.min.intensity*1.25, labels=fu.mz_y_final$AA[i], col=y_ion_col,
          bg="white")
      }
    }
  }

  rawfile=unlist(strsplit(f.msms_m[1,1], "\\\\|/|;|=", fixed = FALSE))[
    length(unlist(strsplit(f.msms_m[1,1], "\\\\|/|;|=", fixed = FALSE)))]
  shadowtext(n.ms1.mass/2,n.ms2.max.intensity*1.6,labels =
               paste("File:",rawfile,"    Scan:",f.msms_m$`Scan number`,
                     "    RT(min):",round(f.msms_m$`Retention time`,1),
                     "    m/z:",f.msms_m$`m/z`,
                     paste("    Charge:",f.msms_m$Charge,"+",sep = ""),
                     "    Gene name(s):",f.msms_m$`Gene Names`),col = "black",
             bg = "white")
  shadowtext(n.ms1.mass/2,n.ms2.min.intensity*1.6,labels =
               paste("File:",rawfile,"    Scan:",f.msms_u$`Scan number`,
                     "    RT(min):",round(f.msms_u$`Retention time`,1),
                     "    m/z:",f.msms_u$`m/z`,
                     paste("    Charge:",f.msms_u$Charge,"+",sep = ""),
                     "    Gene name(s):",f.msms_u$`Gene Names`),col = "black",
             bg = "white")


  dev.off()
}
zym530902730/rplot documentation built on May 26, 2019, 5:40 p.m.