Source: calculateprefixandsuffixmass.js

/**
 * @function calculatePrefixAndSuffixMass
 * @description Function calculates both prefix and suffix masses
 */
calculatePrefixAndSuffixMass = function(){
	const WATER = "H2O";
	let protSequence = '';
	
	/**
	 * @function getPrefixMassList
	 * @description Returns prefix mass list
	 * @param {String} sequence - Contains Protein sequence
	 * @param {Array} massShiftList - Contains list of mass shifts
	 * @param {Float} massShift_in - Contains mass shift based on the Ion Types selected
	 */
	this.getPrefixMassList = function(sequence,massShiftList,massShift_in){
		let seqln = sequence.length;
		let emptyMassList = [] ;
		massShiftList = massShiftList.slice();
		if(seqln != 0)
		{
			let prefixMassList = new Array(seqln);
			let shiftListln = massShiftList.length;
			for(let i=0;i<seqln;i++)
			{
				// Get Calculated AminoAcidDistribution from aminoAcidDistributuion.js 
				//evaluate the return value for the case when the user enters wrong character by mistake
				let AcidMass;
				
				try{
					AcidMass = getAminoAcidDistribution(sequence[i])[0].mass;

					if(i == 0)
					{
						// Add 1 to i as the seq start from 0 but the peak id starts from 1
						if(shiftListln != 0)
						{
							AcidMass = this.addMassShift(i,massShiftList,AcidMass);
						}
						let tempObj = {position:(i+1),mass:AcidMass} ;
						prefixMassList[i] = tempObj;
					}
					else
					{
						let mass = prefixMassList[i-1].mass + AcidMass;
						if(shiftListln != 0)
						{
							mass = this.addMassShift(i,massShiftList,mass);
						}
						// Add 1 to i as the seq start from 0 but the peak id starts from 1
						let tempObj = {position:(i+1),mass:mass};
						prefixMassList[i] = tempObj;
					}
				}
				catch(error){
					//invalid character entered for protein sequence
					//window.alert("Error! Invalid amino acid in the sequence.")
					$('#errorAlertModal').modal('show');
					break;
				}

			}
			// Adding Mass Shift based on selection of Ion
			// let utilFunctionsObj = new utilFunctions();
			// let ionMassShiftVal = utilFunctionsObj.getNTerminusMassShiftVal();
			for(let j=0;j<seqln;j++)
			{
				prefixMassList[j].mass = prefixMassList[j].mass + massShift_in;
			}
		
			completeCalData.prefixmasslist = prefixMassList;
			return prefixMassList;
		}
		return emptyMassList;
	}
	/**
	 * @function getSuffixMassList
	 * @description Returns suffix mass list
	 * @param {String} sequence - Contains Protein sequence
	 * @param {Array} massShiftList - Contains list of mass shifts
	 * @param {Float} massShift_in - Contains mass shift based on the Ion Types selected
	 */
	this.getSuffixMassList = function(sequence,massShiftList,massShift_in){
		let seqln = sequence.length;
		let emptyMassList = [];
		// As the elements starts from 0
		if(seqln != 0)
		{
			temp_seqln = seqln-1;
			let shiftListln = massShiftList.length;
			let suffixMassList = new Array(seqln);
			for(let i=temp_seqln ; i >= 0 ; i--)
			{
				// Get Calculated AminoAcidDistribution from aminoAcidDistributuion.js
				let AcidMass = getAminoAcidDistribution(sequence[i])[0].mass;
				if(i == temp_seqln)
				{
					// Add 1 to i as the seq start from 0 but the peak id starts from 1
					let position = temp_seqln - i;
					// Adding water mass for suffix, indirectly this will add water mass to all the masses
					let mass = AcidMass;//
					if(suffixMassList != 0)
					{
						mass = this.addMassShift(i,massShiftList,mass)
					}
					let tempObj = {position:(position+1),mass:mass} ;
					suffixMassList[position] = tempObj;
				}
				else
				{
					//Don't add water here
					let position = temp_seqln - i;
					let mass = suffixMassList[(position-1)].mass + AcidMass;
					if(suffixMassList != 0)
					{
						mass = this.addMassShift(i,massShiftList,mass)
					}
					// Add 1 to i as the seq start from 0 but the peak id starts from 1
					let tempObj = {position:(position+1),mass:mass};
					suffixMassList[position] = tempObj;
				}
			}
			// let utilFunctionsObj = new utilFunctions();
			// let ionMassShift = utilFunctionsObj.getCTerminusMassShiftVal();
			for(let j=0;j<seqln;j++)
			{
				suffixMassList[j].mass = suffixMassList[j].mass + massShift_in  ;
			}
			completeCalData.suffixmasslist = suffixMassList;
			return suffixMassList;
		}
		return emptyMassList ;
	}
	/**
	 * @function getTotalSeqMass
	 * @description Returns total mass of the sequence
	 * @param {String} seq - Contains Protein sequence
	 * @param {Array} massShiftList - Contains list of mass shifts
	 */
	this.getTotalSeqMass = function(seq,massShiftList){
		let mass = 0 ;
		let len = seq.length;
		for(let i=0;i<len;i++)
		{
			mass = mass + getAminoAcidDistribution(seq[i])[0].mass;
		}
		let shiftlen = massShiftList.length;
		for(let j=0;j<shiftlen;j++)
		{
			mass = mass + massShiftList[j].mass;
		}
		mass = mass + this.addWaterMass();

		return mass ;
	}
	// Function to add mass shift
	/**
	 * @function addMassShift
	 * @description Returns the current mass after adding mass shift 
	 * @param {Integer} position - Contains position at which the mass shift needed to be added
	 * @param {Array} massShiftList - List of mass shifts along with position
	 * @param {Float} mass - Mass to which the mass shift to be added
	 */
	this.addMassShift = function(position,massShiftList,mass){
		let len = massShiftList.length;
		for(let i=0;i<len ; i++)
		{
			if(position == massShiftList[i].position)
			{
				mass = mass + massShiftList[i].mass ;
				return mass ;
			}
		}
		return mass ;
	}
	// Function to add water to SuffixMass List
	/**
	 * @function addWaterMass
	 * @description Function to add mass of water to the suffix mass list
	 */
	this.addWaterMass = function(){
		mass = getAminoAcidDistribution(WATER)[0].mass ;
		return mass ;
	}
}