R/Rdisop.R

Defines functions isotopeScore decomposeIsotopes decomposeMass subMolecules addMolecules getMolecule getValid getScore getFormula getIsotope getMass .getElement

Documented in addMolecules decomposeIsotopes decomposeMass getFormula getIsotope getMass getMolecule getScore getValid isotopeScore subMolecules

.getElement <- function(name, elements = NULL) {

    if (!is.list(elements) || length(elements)==0 ) {
        elements <- initializePSE()
    }
    rex <- paste ("^",name,"$", sep="")

    elements [[grep (rex, sapply (elements, function(x) {x$name}))]]
}

getMass <- function(molecule) {
    molecule$exactmass
}

getIsotope <- function(molecule, index) {
    molecule$isotope[[1]][,index]
}

getFormula <- function(molecule) {
    if (is.null(molecule$formula)) {
        lapply(molecule, function(x) {x$formula})
    } else {
        molecule$formula
    }
}

getScore <- function(molecule) {
    if (is.null(molecule$score)) {
        lapply(molecule, function(x) {x$score})
    } else {
        molecule$score
    }
}

getValid <- function(molecule) {
    if (is.null(molecule$valid)) {
        lapply(molecule, function(x) {x$valid})
    } else {
        molecule$valid
    }
}

getMolecule <- function(formula, elements = NULL, z = 0, maxisotopes=10) {
    # Use full PSE unless stated otherwise
    if (!is.list(elements) || length(elements)==0 ) {
        elements <- initializePSE()
    }

    # Remember ordering of element names,
    # but ensure list of elements is ordered
    # by mass
    element_order <- sapply(elements, function(x){x$name})
    elements <- elements[order(sapply(elements, function(x){x$mass}))]

    # Call imslib to parse formula and calculate
    # masses and isotope pattern
    molecule <- .Call("getMolecule",
                      formula, elements, element_order,
                      z, maxisotopes,
                      PACKAGE="Rdisop")

    molecule
}


addMolecules <- function(formula1, formula2,
                         elements = NULL, maxisotopes=10)
{

    # First argument may be vector of formulas,
    # Second is single molecule only!
    if (length(formula2) >1 ) {
        stop("Second formula must be single Molecule")
    }

    # Use full PSE unless stated otherwise
    if (!is.list(elements) || length(elements)==0 ) {
        elements <- initializePSE()
    }

    # Remember ordering of element names,
    # but ensure list of elements is ordered
    # by mass
    element_order <- sapply(elements, function(x){x$name})
    elements <- elements[order(sapply(elements, function(x){x$mass}))]

    # Call imslib to parse formula and calculate
    # masses and isotope pattern
    molecule <- .Call("addMolecules",
                      formula1, formula2,
                      elements, element_order,
                      maxisotopes,
                      PACKAGE="Rdisop")

    molecule
}

subMolecules <- function(formula1, formula2,
                         elements = NULL, maxisotopes=10)
{

    # First argument may be vector of formulas,
    # Second is single molecule only!
    if (length(formula2) >1 ) {
        stop("Second formula must be single Molecule")
    }

    # Use full PSE unless stated otherwise
    if (!is.list(elements) || length(elements)==0 ) {
        elements <- initializePSE()
    }

    # Remember ordering of element names,
    # but ensure list of elements is ordered
    # by mass
    element_order <- sapply(elements, function(x){x$name})
    elements <- elements[order(sapply(elements, function(x){x$mass}))]

    # Call imslib to parse formula and calculate
    # masses and isotope pattern
    molecule <- .Call("subMolecules",
                      formula1, formula2,
                      elements, element_order,
                      maxisotopes,
                      PACKAGE="Rdisop")

    molecule
}


decomposeMass <- function(mass, ppm=2.0, mzabs=0.0001,
                          elements=NULL, filter=NULL, z=0, maxisotopes=10,
                          minElements="C0", maxElements="C999999") {
    decomposeIsotopes(c(mass), c(1), ppm=ppm, mzabs=mzabs,
                      elements=elements, filter=filter, z=z, maxisotopes=maxisotopes,
                      minElements=minElements, maxElements=maxElements)
}

decomposeIsotopes <- function(masses, intensities, ppm=2.0, mzabs=0.0001,
                              elements=NULL, filter=NULL, z=0, maxisotopes=10,
                              minElements="C0", maxElements="C999999")
{
    # Use limited limited CHNOPS unless stated otherwise
    if (!is.list(elements) || length(elements)==0 ) {
        elements <- initializeCHNOPS()
    }


    # If only a single mass is given,
    # intensities are irrelevant
    if (length(masses) == 1) {
        intensities <- 1
    }

    if (length(masses) != length(intensities) )  {
        stop("masses and intensities have different lengths!")
    }

    # Calculate (average) mass difference,
    # guess charge and recalculate
    #
    charge <- 1

    # Remember ordering of element names,
    # but ensure list of elements is ordered
    # by mass
    element_order <- sapply(elements, function(x){x$name})
    elements <- elements[order(sapply(elements, function(x){x$mass}))]

    ##
    ## Calculate relative Error based on masses[1] and mzabs
    ##

    ppm <- ppm + mzabs/masses[1]*1000000
    # Finally ready to make the call...
    molecules <- .Call("decomposeIsotopes",
                       masses, intensities, ppm, elements, element_order, z,
                       maxisotopes,
                       minElements, maxElements,
                       PACKAGE="Rdisop")

    molecules
}

#
# Obtain the similarity score
# between two molecules / isotope Patterns
#
isotopeScore <- function(molecule, masses, intensities,
                         elements=NULL, filter=NULL, z=0) {

	# Use limited limited CHNOPS unless stated otherwise
    	if (!is.list(elements) || length(elements)==0 ) {
        elements <- initializeCHNOPS()
    	}

 	# If only a single mass is given,
    	# intensities are irrelevant
    	if (length(masses) == 1) {
        	intensities <- 1
    	}

    	if (length(masses) != length(intensities) )  {
       	 stop("masses and intensities have different lengths!")
    	}

# 	molecule <- getMolecule(formula)
# 	massintensities<-matrix(NA,ncol=length(masses),nrow=2)
# 	for(i in 1:length(masses))
	{
# 		massintensities[1,i]<-masses[i];
# 		massintensities[2,i]<-intensities[i];
	}
# 	molecule$isotopes <- list(massintensities)
#         scoreMolecule(molecule,elements,filter,z);
	predictedMass<-molecule$isotopes[[1]][1,];
	predictedAbundances<-molecule$isotopes[[1]][2,];
	score <- .Call("calculateScore",predictedMass,predictedAbundances,masses,intensities,PACKAGE="Rdisop")

	score

# 	molecule
}

Try the Rdisop package in your browser

Any scripts or data that you put into this service are public.

Rdisop documentation built on Nov. 8, 2020, 5:40 p.m.