# Source: addIonsToGraph.js

    /**
     * Generates Corresponding graph on to the html by calling addSpectrum from invokespectrum.js
     * @param {Array} peakDataList - Contains Peak list data
     * @param {Array} distributionList - Contains envelope data
     * @param {Float} prec_mz - contains mass to which the graph has to be zoomed
     */
    function generateCorrespondingGraph(peakDataList,distributionList,prec_mz){
        let ionData = null;
        let graphFeatures = new GraphFeatures();
        ms2_graph = addSpectrum("spectrum",peakDataList,distributionList,prec_mz,ionData,graphFeatures);
    }
    /**
     * Generating Mono Mass Graph with calculated masses
     * @param {Array} monoMassList - Contians the mono Mass list data
     * @param {Float} prec_mz - Contains mass to which the graph has to be zoomed
     */
    function generateMonoMassGraph(monoMassList,prec_mz){
        let ionData = [];
        //Draw MonoMass Graph
        const monoMassList_mz = monoMassList.map((element)=>{
            let tempElement = {
                "mz":element.mass,
                "intensity":element.intensity,
                "charge": element.charge,
                "peakId": element.peakId,
                "ion": element.ion,
                "position": element.position,
                "massError": element.massError,
                "thMass": element.thMass,
                "PPMerror": element.PPMerror,
                "matchedInd": element.matchedInd
            };
            let tempIonData = {"mz":element.mass,"intensity":element.intensity,"ion": element.ion};
            ionData.push(tempIonData);
            return tempElement;
        });
        let graphFeatures = new GraphFeatures();
        graphFeatures.showSequence = true;
        let prefixSequenceData = [];
        let suffixSequeceData = [];
        completeCalData.prefixmasslist.forEach((eachElem,index)=>{
            eachElem["acid"] = completeCalData.sequence[index];
            prefixSequenceData.push(eachElem);
        });
        let len = completeCalData.sequence.length;
        completeCalData.suffixmasslist.forEach((eachElem,index)=>{
            eachElem["acid"] = completeCalData.sequence[len-index-1];
            suffixSequeceData.push(eachElem);
        })
        graphFeatures.addErrorPlot = true;
        graphFeatures.prefixSequenceData = prefixSequenceData;
        graphFeatures.suffixSequeceData = suffixSequeceData;
        graphFeatures.svgHeight = graphFeatures.svgHeight + graphFeatures.adjustableHeightVal + graphFeatures.heightForErrorPlot;
        graphFeatures.padding.head = graphFeatures.padding.head + graphFeatures.adjustableHeightVal;
        graphFeatures.padding.bottom = graphFeatures.padding.bottom + graphFeatures.heightForErrorPlot;
        graphFeatures.adjustableIonPosition = 10;
        let errorListData = completeCalData.matchedandunmatcheddata.map((element)=>{
            let errorListObj = {"theoretical_mass":element.thMass,"mass_error":element.massError};
            return errorListObj;
        })
        graphFeatures.errorListData = errorListData;
        graphFeatures.errorThreshHoldVal = getAbsoluteMaxValfromList(graphFeatures.errorListData);

        addSpectrum("monoMassGraph",monoMassList_mz,null,prec_mz,ionData,graphFeatures);
    }
    /**
     * Function return the max error value from the list
     * @param {Array} errorDataList - Contains list of error data to plot on the error graph
     */
    function getAbsoluteMaxValfromList(errorDataList){
        let max = 0;
        errorDataList.forEach((element)=>{
            let val = Math.abs(element.mass_error);
            if(max < val) max = val;
        })
        //Getting the round off fraction value
        max = max * 100;
        max = Math.ceil(max)/100;
        return max;
    }