Example #1
0
    //Merge Peaklists merge_lower and merge_upper
    void PeakListCollection::mergePeakLists_(unsigned int merge_lower, unsigned int merge_upper, std::vector<PeakList>& c,
                                             double drt, double dmz, double dz, double dint = 0.)
    {

        PeakList newPeakList; //Peaklists will be merged into newPeakList
        std::vector<map_item> newCorrespondenceMapColumn; //correspondenceMap information will be merged in here

        //get assignments via StableMarriage
        StableMarriage sm(c[merge_lower], c[merge_upper], drt, dmz, dz, dint);

        //set limit: do not assign Peaks with distance larger than 1. Note: normalization constants
        //drt and dmz must be adjusted properly.
        sm.setLimit(1.);

        StableMarriage::Assignment assign = sm.getAssignment();

        //process peaks with a partner
        for(unsigned int i = 0; i < assign.ass12.size(); i++){
            if(assign.ass12[i] > -1){
                //write matched Peaks into newPeaklist

                //calculate average Rt, Mz and Intensity values
                //Peak1: PL: merge_lower ; Item: i ; plContent: correspondenceMap_[merge_lower][i].size()
                //Peak2: PL: merge_upper ; Item: assign.ass12[i] ; plContent: correspondenceMap_[merge_upper][assign.ass12[i]].size()

                //Number of peaks merged into single peak = size of originInformation vector
                double plc_lower = correspondenceMap_[merge_lower][i].size();
                double plc_upper = correspondenceMap_[merge_upper][assign.ass12[i]].size();

                double avRt = (c[merge_lower][i].getRt()*plc_lower +
                               c[merge_upper][assign.ass12[i]].getRt()*plc_upper) /
                              (plc_lower + plc_upper);
                double avMz = (c[merge_lower][i].getMz()*plc_lower +
                               c[merge_upper][assign.ass12[i]].getMz()*plc_upper) /
                              (plc_lower + plc_upper);
                double avInt = (c[merge_lower][i].getAbundance()*plc_lower +
                                c[merge_upper][assign.ass12[i]].getAbundance()*plc_upper) /
                               (plc_lower + plc_upper);

                //create temporary peak and fill with averaged values
                Peak temp;
                temp.setCharge(c[merge_lower][i].getCharge()); //charge is assumed to be equal
                temp.setRt(avRt);
                temp.setMz(avMz);
                temp.setAbundance(avInt);

                //add temporary peak to peaklist
                newPeakList.push_back(temp);


                //write origin information of matched peaks

                map_item tempItem;

                //copy all origin information from merge_lower
                for(unsigned int j = 0; j < correspondenceMap_[merge_lower][i].size(); j++){
                    tempItem.push_back(correspondenceMap_[merge_lower][i][j]);
                }

                //copy all origin information from merge_upper
                for(unsigned int j = 0; j < correspondenceMap_[merge_upper][assign.ass12[i]].size(); j++){
                    tempItem.push_back(correspondenceMap_[merge_upper][assign.ass12[i]][j]);
                }

                //add item to column
                newCorrespondenceMapColumn.push_back(tempItem);

            }
        }

        //process PeakList merge_lower
        for(unsigned int i = 0; i < assign.ass12.size(); i++){
            if(assign.ass12[i] == -1){

                newPeakList.push_back(c[merge_lower][i]);

                map_item tempItem;
                //copy all origin information
                for(unsigned int j = 0; j < correspondenceMap_[merge_lower][i].size(); j++){
                    tempItem.push_back(correspondenceMap_[merge_lower][i][j]);
                }

                newCorrespondenceMapColumn.push_back(tempItem);

            }
        }

        //process PeakList merge_upper
        for(unsigned int i = 0; i < assign.ass21.size(); i++){
            if(assign.ass21[i] == -1){

                newPeakList.push_back(c[merge_upper][i]);

                map_item tempItem;
                //copy all origin information
                for(unsigned int j = 0; j < correspondenceMap_[merge_upper][i].size(); j++){
                    tempItem.push_back(correspondenceMap_[merge_upper][i][j]);
                }
                newCorrespondenceMapColumn.push_back(tempItem);

            }
        }

        //refresh correspondence map

        //erase merged columns
        correspondenceMap_.erase(correspondenceMap_.begin()+merge_upper);
        correspondenceMap_.erase(correspondenceMap_.begin()+merge_lower);

        //add new column
        correspondenceMap_.push_back(newCorrespondenceMapColumn);


        //refresh peaklist collection c

        //erase merged peaklists
        c.erase(c.begin()+merge_upper);
        c.erase(c.begin()+merge_lower);

        //add new peaklist
        c.push_back(newPeakList);

        //update plContent_
        plContent_.push_back(plContent_[merge_lower] + plContent_[merge_upper]);
        plContent_.erase(plContent_.begin()+merge_upper);
        plContent_.erase(plContent_.begin()+merge_lower);



        return;
    }