void BaseLabeler::recomputeConsensus_(const FeatureMapSim & simulated_features) { // iterate over all given features stored in the labeling consensus and try to find the corresponding feature in // in the feature map // build index for faster access Map<String, IntList> id_map; Map<UInt64, Size> features_per_labeled_map; for (Size i = 0; i < simulated_features.size(); ++i) { if (simulated_features[i].metaValueExists("parent_feature")) { LOG_DEBUG << "Checking [" << i << "]: " << simulated_features[i].getPeptideIdentifications()[0].getHits()[0].getSequence().toString() << " with charge " << simulated_features[i].getCharge() << " (" << simulated_features[i].getMetaValue("charge_adducts") << ")" << " parent was " << simulated_features[i].getMetaValue("parent_feature") << std::endl; id_map[simulated_features[i].getMetaValue("parent_feature")].push_back((Int)i); UInt64 map_index = 0; if (simulated_features[i].metaValueExists("map_index")) { map_index = simulated_features[i].getMetaValue("map_index"); } ++features_per_labeled_map[map_index]; } } for (Map<String, IntList>::iterator it = id_map.begin(); it != id_map.end(); ++it) { LOG_DEBUG << it->first << " " << it->second << std::endl; } // new consensus map ConsensusMap new_cm; // initialize submaps in consensus map for (Map<UInt64, Size>::Iterator it = features_per_labeled_map.begin(); it != features_per_labeled_map.end(); ++it) { new_cm.getFileDescriptions()[it->first].size = it->second; new_cm.getFileDescriptions()[it->first].unique_id = simulated_features.getUniqueId(); } for (ConsensusMap::iterator cm_iter = consensus_.begin(); cm_iter != consensus_.end(); ++cm_iter) { bool complete = true; LOG_DEBUG << "Checking consensus feature containing: " << std::endl; // check if we have all elements of current CF in the new feature map (simulated_features) for (ConsensusFeature::iterator cf_iter = (*cm_iter).begin(); cf_iter != (*cm_iter).end(); ++cf_iter) { complete &= id_map.has(String((*cf_iter).getUniqueId())); LOG_DEBUG << "\t" << String((*cf_iter).getUniqueId()) << std::endl; } if (complete) { // get all elements sorted by charge state; since the same charge can be achieved by different // adduct compositions we use the adduct-string as indicator to find the groups Map<String, std::set<FeatureHandle, FeatureHandle::IndexLess> > charge_mapping; for (ConsensusFeature::iterator cf_iter = (*cm_iter).begin(); cf_iter != (*cm_iter).end(); ++cf_iter) { IntList feature_indices = id_map[String((*cf_iter).getUniqueId())]; for (IntList::iterator it = feature_indices.begin(); it != feature_indices.end(); ++it) { UInt64 map_index = 0; if (simulated_features[*it].metaValueExists("map_index")) { map_index = simulated_features[*it].getMetaValue("map_index"); } if (charge_mapping.has(simulated_features[*it].getMetaValue("charge_adducts"))) { charge_mapping[simulated_features[*it].getMetaValue("charge_adducts")].insert(FeatureHandle(map_index, simulated_features[*it])); } else { LOG_DEBUG << "Create new set with charge composition " << simulated_features[*it].getMetaValue("charge_adducts") << std::endl; std::set<FeatureHandle, FeatureHandle::IndexLess> fh_set; fh_set.insert(FeatureHandle(map_index, simulated_features[*it])); charge_mapping.insert(std::make_pair(simulated_features[*it].getMetaValue("charge_adducts"), fh_set)); } } } // create new consensus feature from derived features (separated by charge, if charge != 0) for (Map<String, std::set<FeatureHandle, FeatureHandle::IndexLess> >::const_iterator charge_group_it = charge_mapping.begin(); charge_group_it != charge_mapping.end(); ++charge_group_it) { ConsensusFeature cf; cf.setCharge((*(*charge_group_it).second.begin()).getCharge()); cf.setMetaValue("charge_adducts", charge_group_it->first); std::vector<PeptideIdentification> ids; for (std::set<FeatureHandle, FeatureHandle::IndexLess>::const_iterator fh_it = (charge_group_it->second).begin(); fh_it != (charge_group_it->second).end(); ++fh_it) { cf.insert(*fh_it); // append identifications Size f_index = simulated_features.uniqueIdToIndex(fh_it->getUniqueId()); std::vector<PeptideIdentification> ids_feature = simulated_features[f_index].getPeptideIdentifications(); ids.insert(ids.end(), ids_feature.begin(), ids_feature.end()); } cf.computeMonoisotopicConsensus(); cf.setPeptideIdentifications(ids); new_cm.push_back(cf); } } } new_cm.setProteinIdentifications(simulated_features.getProteinIdentifications()); consensus_.swap(new_cm); consensus_.applyMemberFunction(&UniqueIdInterface::ensureUniqueId); }