//TODO include run information for each peptide //includes all MSMS derived peptides into the graph --consensusXML Size ProteinResolver::includeMSMSPeptides_(ConsensusMap & consensus, vector<PeptideEntry> & peptide_nodes) { Size found_peptide = 0; for (Size pep = 0; pep != consensus.size(); ++pep) { ConsensusFeature & feature = consensus.at(pep); // get all peptide identifications const vector<PeptideIdentification> & pep_id = feature.getPeptideIdentifications(); for (Size cons_pep = 0; cons_pep < pep_id.size(); ++cons_pep) { String seq = pep_id.at(cons_pep).getHits().front().getSequence().toUnmodifiedString(); Size peptide_entry = findPeptideEntry_(seq, peptide_nodes); if (peptide_entry != peptide_nodes.size()) { if (!peptide_nodes.at(peptide_entry).experimental) { ++found_peptide; } //should be changed -- for consensus peptide_identification is the consensus and peptide_hit is the PeptideIdentification. PeptideHit is only top hit at the moment peptide_nodes.at(peptide_entry).peptide_identification = pep; peptide_nodes.at(peptide_entry).peptide_hit = cons_pep; //only top hit is used at the moment peptide_nodes.at(peptide_entry).experimental = true; // get intensity of the feature peptide_nodes.at(peptide_entry).intensity = feature.getIntensity(); peptide_nodes.at(peptide_entry).origin = feature.getMetaValue("file_origin"); } } } return found_peptide; }
ExitCodes main_(int, const char **) { String in = getStringOption_("in"), out = getStringOption_("out"); FileTypes::Type in_type = FileHandler::getType(in); if (in_type == FileTypes::FEATUREXML) { FeatureMap<> features; FeatureXMLFile().load(in, features); for (FeatureMap<>::Iterator feat_it = features.begin(); feat_it != features.end(); ++feat_it) { resolveConflict_(feat_it->getPeptideIdentifications()); } addDataProcessing_(features, getProcessingInfo_(DataProcessing::FILTERING)); FeatureXMLFile().store(out, features); } else // consensusXML { ConsensusMap consensus; ConsensusXMLFile().load(in, consensus); for (ConsensusMap::Iterator cons_it = consensus.begin(); cons_it != consensus.end(); ++cons_it) { resolveConflict_(cons_it->getPeptideIdentifications()); } addDataProcessing_(consensus, getProcessingInfo_(DataProcessing::FILTERING)); ConsensusXMLFile().store(out, consensus); } return EXECUTION_OK; }
void SeedListGenerator::generateSeedLists(const ConsensusMap& consensus, Map<UInt64, SeedList>& seed_lists) { seed_lists.clear(); // iterate over all consensus features... for (ConsensusMap::ConstIterator cons_it = consensus.begin(); cons_it != consensus.end(); ++cons_it) { DPosition<2> point(cons_it->getRT(), cons_it->getMZ()); // for each sub-map in the consensus map, add a seed at the position of // this consensus feature: for (ConsensusMap::FileDescriptions::const_iterator file_it = consensus.getFileDescriptions().begin(); file_it != consensus.getFileDescriptions().end(); ++file_it) seed_lists[file_it->first].push_back(point); // for each feature contained in the consensus feature, remove the seed of // the corresponding map: for (ConsensusFeature::HandleSetType::const_iterator feat_it = cons_it->getFeatures().begin(); feat_it != cons_it->getFeatures().end(); ++feat_it) { seed_lists[feat_it->getMapIndex()].pop_back(); } // this leaves seeds for maps where no feature was found near the // consensus position } }
boost::shared_ptr<IsobaricQuantitationMethod> IBSpectraFile::guessExperimentType_(const ConsensusMap& cm) { if (cm.getExperimentType() != "labeled_MS2" && cm.getExperimentType() != "itraq") { throw Exception::InvalidParameter(__FILE__, __LINE__, __PRETTY_FUNCTION__, "Given ConsensusMap does not hold any isobaric quantification data."); } // we take the mapcount as approximation if (cm.getFileDescriptions().size() == 4) { return boost::shared_ptr<IsobaricQuantitationMethod>(new ItraqFourPlexQuantitationMethod); } else if (cm.getFileDescriptions().size() == 6) { return boost::shared_ptr<IsobaricQuantitationMethod>(new TMTSixPlexQuantitationMethod); } else if (cm.getFileDescriptions().size() == 8) { return boost::shared_ptr<IsobaricQuantitationMethod>(new ItraqEightPlexQuantitationMethod); } else { throw Exception::InvalidParameter(__FILE__, __LINE__, __PRETTY_FUNCTION__, "Could not guess isobaric quantification data from ConsensusMap due to non-matching number of input maps."); } }
void MapAlignmentAlgorithmPoseClustering::align(const ConsensusMap & map, TransformationDescription & trafo) { // TODO: move this to updateMembers_? (if consensusMap prevails) // TODO: why does superimposer work on consensus map??? const ConsensusMap & map_model = reference_; ConsensusMap map_scene = map; // run superimposer to find the global transformation TransformationDescription si_trafo; superimposer_.run(map_model, map_scene, si_trafo); // apply transformation to consensus features and contained feature // handles for (Size j = 0; j < map_scene.size(); ++j) { //Calculate new RT double rt = map_scene[j].getRT(); rt = si_trafo.apply(rt); //Set RT of consensus feature centroid map_scene[j].setRT(rt); //Set RT of consensus feature handles map_scene[j].begin()->asMutable().setRT(rt); } //run pairfinder to find pairs ConsensusMap result; //TODO: add another 2map interface to pairfinder? std::vector<ConsensusMap> input(2); input[0] = map_model; input[1] = map_scene; pairfinder_.run(input, result); // calculate the local transformation si_trafo.invert(); // to undo the transformation applied above TransformationDescription::DataPoints data; for (ConsensusMap::Iterator it = result.begin(); it != result.end(); ++it) { if (it->size() == 2) // two matching features { ConsensusFeature::iterator feat_it = it->begin(); double y = feat_it->getRT(); double x = si_trafo.apply((++feat_it)->getRT()); // one feature should be from the reference map: if (feat_it->getMapIndex() != 0) { data.push_back(make_pair(x, y)); } else { data.push_back(make_pair(y, x)); } } } trafo = TransformationDescription(data); trafo.fitModel("linear"); }
void FeatureGroupingAlgorithm::transferSubelements(const vector<ConsensusMap>& maps, ConsensusMap& out) const { // accumulate file descriptions from the input maps: // cout << "Updating file descriptions..." << endl; out.getFileDescriptions().clear(); // mapping: (map index, original id) -> new id map<pair<Size, UInt64>, Size> mapid_table; for (Size i = 0; i < maps.size(); ++i) { const ConsensusMap& consensus = maps[i]; for (ConsensusMap::FileDescriptions::const_iterator desc_it = consensus.getFileDescriptions().begin(); desc_it != consensus.getFileDescriptions().end(); ++desc_it) { Size counter = mapid_table.size(); mapid_table[make_pair(i, desc_it->first)] = counter; out.getFileDescriptions()[counter] = desc_it->second; } } // look-up table: input map -> unique ID -> consensus feature // cout << "Creating look-up table..." << endl; vector<map<UInt64, ConsensusMap::ConstIterator> > feat_lookup(maps.size()); for (Size i = 0; i < maps.size(); ++i) { const ConsensusMap& consensus = maps[i]; for (ConsensusMap::ConstIterator feat_it = consensus.begin(); feat_it != consensus.end(); ++feat_it) { // do NOT use "id_lookup[i][feat_it->getUniqueId()] = feat_it;" here as // you will get "attempt to copy-construct an iterator from a singular // iterator" in STL debug mode: feat_lookup[i].insert(make_pair(feat_it->getUniqueId(), feat_it)); } } // adjust the consensus features: // cout << "Adjusting consensus features..." << endl; for (ConsensusMap::iterator cons_it = out.begin(); cons_it != out.end(); ++cons_it) { ConsensusFeature adjusted = ConsensusFeature( static_cast<BaseFeature>(*cons_it)); // remove sub-features for (ConsensusFeature::HandleSetType::const_iterator sub_it = cons_it->getFeatures().begin(); sub_it != cons_it->getFeatures().end(); ++sub_it) { UInt64 id = sub_it->getUniqueId(); Size map_index = sub_it->getMapIndex(); ConsensusMap::ConstIterator origin = feat_lookup[map_index][id]; for (ConsensusFeature::HandleSetType::const_iterator handle_it = origin->getFeatures().begin(); handle_it != origin->getFeatures().end(); ++handle_it) { FeatureHandle handle = *handle_it; Size new_id = mapid_table[make_pair(map_index, handle.getMapIndex())]; handle.setMapIndex(new_id); adjusted.insert(handle); } } *cons_it = adjusted; } }
ExitCodes main_(int, const char **) override { String in = getStringOption_("in"); String out = getStringOption_("out"); String algo_type = getStringOption_("algorithm_type"); String acc_filter = getStringOption_("accession_filter"); String desc_filter = getStringOption_("description_filter"); double ratio_threshold = getDoubleOption_("ratio_threshold"); ConsensusXMLFile infile; infile.setLogType(log_type_); ConsensusMap map; infile.load(in, map); //map normalization if (algo_type == "robust_regression") { map.sortBySize(); vector<double> results = ConsensusMapNormalizerAlgorithmThreshold::computeCorrelation(map, ratio_threshold, acc_filter, desc_filter); ConsensusMapNormalizerAlgorithmThreshold::normalizeMaps(map, results); } else if (algo_type == "median") { ConsensusMapNormalizerAlgorithmMedian::normalizeMaps(map, ConsensusMapNormalizerAlgorithmMedian::NM_SCALE, acc_filter, desc_filter); } else if (algo_type == "median_shift") { ConsensusMapNormalizerAlgorithmMedian::normalizeMaps(map, ConsensusMapNormalizerAlgorithmMedian::NM_SHIFT, acc_filter, desc_filter); } else if (algo_type == "quantile") { if (acc_filter != "" || desc_filter != "") { LOG_WARN << endl << "NOTE: Accession / description filtering is not supported in quantile normalization mode. Ignoring filters." << endl << endl; } ConsensusMapNormalizerAlgorithmQuantile::normalizeMaps(map); } else { cerr << "Unknown algorithm type '" << algo_type.c_str() << "'." << endl; return ILLEGAL_PARAMETERS; } //annotate output with data processing info and save output file addDataProcessing_(map, getProcessingInfo_(DataProcessing::NORMALIZATION)); infile.store(out, map); return EXECUTION_OK; }
void MapAlignmentTransformer::transformSingleConsensusMap(ConsensusMap & cmap, const TransformationDescription & trafo) { for (ConsensusMap::Iterator cmit = cmap.begin(); cmit != cmap.end(); ++cmit) { applyToConsensusFeature_(*cmit, trafo); } // adapt RT values of unassigned peptides: if (!cmap.getUnassignedPeptideIdentifications().empty()) { transformSinglePeptideIdentification( cmap.getUnassignedPeptideIdentifications(), trafo); } }
void ConsensusMapNormalizerAlgorithmThreshold::normalizeMaps(ConsensusMap& map, const vector<double>& ratios) { ConsensusMap::Iterator cf_it; ProgressLogger progresslogger; progresslogger.setLogType(ProgressLogger::CMD); progresslogger.startProgress(0, map.size(), "normalizing maps"); for (cf_it = map.begin(); cf_it != map.end(); ++cf_it) { progresslogger.setProgress(cf_it - map.begin()); ConsensusFeature::HandleSetType::const_iterator f_it; for (f_it = cf_it->getFeatures().begin(); f_it != cf_it->getFeatures().end(); ++f_it) { f_it->asMutable().setIntensity(f_it->getIntensity() * ratios[f_it->getMapIndex()]); } } progresslogger.endProgress(); }
void QuantitativeExperimentalDesign::mergeConsensusMaps_(ConsensusMap & out, const String & experiment, StringList & file_paths) { ConsensusMap map; LOG_INFO << "Merge consensus maps: " << endl; UInt counter = 1; for (StringList::Iterator file_it = file_paths.begin(); file_it != file_paths.end(); ++file_it, ++counter) { //load should clear the map ConsensusXMLFile().load(*file_it, map); for (ConsensusMap::iterator it = map.begin(); it != map.end(); ++it) { it->setMetaValue("experiment", DataValue(experiment)); } out += map; } LOG_INFO << endl; }
void ConsensusMapNormalizerAlgorithmQuantile::setNormalizedIntensityValues(const vector<vector<double> >& feature_ints, ConsensusMap& map) { //assumes the input map and feature_ints are in the same order as in the beginning, //although feature_ints has normalized values now (but the same ranks as before) Size number_of_maps = map.getColumnHeaders().size(); ConsensusMap::ConstIterator cf_it; vector<Size> progress_indices(number_of_maps); for (cf_it = map.begin(); cf_it != map.end(); ++cf_it) { ConsensusFeature::HandleSetType::const_iterator f_it; for (f_it = cf_it->getFeatures().begin(); f_it != cf_it->getFeatures().end(); ++f_it) { Size map_idx = f_it->getMapIndex(); double intensity = feature_ints[map_idx][progress_indices[map_idx]++]; f_it->asMutable().setIntensity(intensity); } } }
void QuantitativeExperimentalDesign::applyDesign2Quantifier(PeptideAndProteinQuant & quantifier, TextFile & file, StringList & file_paths) { // vector< pair<PeptideAndProteinQuant::PeptideData,PeptideAndProteinQuant::ProteinQuant> >& result) //create mapping from experimental setting to all respective file names map<String, StringList> design2FileBaseName; mapFiles2Design_(design2FileBaseName, file); //filter out all non-existing files map<String, StringList> design2FilePath; findRelevantFilePaths_(design2FileBaseName, design2FilePath, file_paths); //determine wether we deal with idXML or featureXML FileTypes::Type in_type = FileHandler::getType(file_paths.front()); if (in_type == FileTypes::FEATUREXML) { FeatureMap<> features; for (map<String, StringList>::iterator iter = design2FilePath.begin(); iter != design2FilePath.end(); ++iter) { mergeFeatureMaps_(features, iter->first, iter->second); } LOG_INFO << "Number of proteinIdentifications: " << features.getProteinIdentifications().size() << endl; ProteinIdentification & proteins = features.getProteinIdentifications()[0]; quantifier.quantifyPeptides(features); quantifier.quantifyProteins(proteins); } else { ConsensusMap consensus; for (map<String, StringList>::iterator iter = design2FilePath.begin(); iter != design2FilePath.end(); ++iter) { mergeConsensusMaps_(consensus, iter->first, iter->second); } LOG_INFO << "Number of proteinIdentifications: " << consensus.getProteinIdentifications().size() << endl; ProteinIdentification & proteins = consensus.getProteinIdentifications()[0]; quantifier.quantifyPeptides(consensus); quantifier.quantifyProteins(proteins); } }
void EDTAFile::store(const String& filename, const ConsensusMap& map) const { TextFile tf; // search for maximum number of sub-features (since this determines the number of columns) Size max_sub(0); for (Size i = 0; i < map.size(); ++i) { max_sub = std::max(max_sub, map[i].getFeatures().size()); } // write header String header("RT\tm/z\tintensity\tcharge"); for (Size i = 1; i <= max_sub; ++i) { header += "\tRT" + String(i) + "\tm/z" + String(i) + "\tintensity" + String(i) + "\tcharge" + String(i); } tf.addLine(header); for (Size i = 0; i < map.size(); ++i) { ConsensusFeature f = map[i]; // consensus String entry = String(f.getRT()) + "\t" + f.getMZ() + "\t" + f.getIntensity() + "\t" + f.getCharge(); // sub-features ConsensusFeature::HandleSetType handle = f.getFeatures(); for (ConsensusFeature::HandleSetType::const_iterator it = handle.begin(); it != handle.end(); ++it) { entry += String("\t") + it->getRT() + "\t" + it->getMZ() + "\t" + it->getIntensity() + "\t" + it->getCharge(); } // missing sub-features for (Size j = handle.size(); j < max_sub; ++j) { entry += "\tNA\tNA\tNA\tNA"; } tf.addLine(entry); } tf.store(filename); }
void ProteinInference::infer(ConsensusMap & consensus_map, const UInt reference_map) { // we infer Proteins for every IdentificationRun separately. If you want this combined, then // do that before calling this function // Each ProteinIdentification will be augmented with the quantification (where possible) for (size_t i = 0; i < consensus_map.getProteinIdentifications().size(); ++i) { infer_(consensus_map, i, reference_map); } }
void MetaDataBrowser::add(ConsensusMap & map) { //identifier add(static_cast<DocumentIdentifier &>(map)); // protein identifications for (Size i = 0; i < map.getProteinIdentifications().size(); ++i) { add(map.getProteinIdentifications()[i]); } //unassigned peptide ids for (Size i = 0; i < map.getUnassignedPeptideIdentifications().size(); ++i) { add(map.getUnassignedPeptideIdentifications()[i]); } add(static_cast<MetaInfoInterface &>(map)); treeview_->expandItem(treeview_->findItems(QString::number(0), Qt::MatchExactly, 1).first()); }
ExitCodes main_(int, const char **) { String in = getStringOption_("in"); String out = getStringOption_("out"); String algo_type = getStringOption_("algorithm_type"); double ratio_threshold = getDoubleOption_("ratio_threshold"); ConsensusXMLFile infile; infile.setLogType(log_type_); ConsensusMap map; infile.load(in, map); //map normalization if (algo_type == "robust_regression") { map.sortBySize(); vector<double> results = ConsensusMapNormalizerAlgorithmThreshold::computeCorrelation(map, ratio_threshold); ConsensusMapNormalizerAlgorithmThreshold::normalizeMaps(map, results); } else if (algo_type == "median") { ConsensusMapNormalizerAlgorithmMedian::normalizeMaps(map); } else if (algo_type == "quantile") { ConsensusMapNormalizerAlgorithmQuantile::normalizeMaps(map); } else { cerr << "Unknown algorithm type '" << algo_type.c_str() << "'." << endl; return ILLEGAL_PARAMETERS; } //annotate output with data processing info and save output file addDataProcessing_(map, getProcessingInfo_(DataProcessing::NORMALIZATION)); infile.store(out, map); return EXECUTION_OK; }
void IsobaricChannelExtractor::registerChannelsInOutputMap_(ConsensusMap& consensus_map) { // register the individual channels in the output consensus map Int index = 0; for (IsobaricQuantitationMethod::IsobaricChannelList::const_iterator cl_it = quant_method_->getChannelInformation().begin(); cl_it != quant_method_->getChannelInformation().end(); ++cl_it) { ConsensusMap::FileDescription channel_as_map; // label is the channel + description provided in the Params channel_as_map.label = quant_method_->getName() + "_" + cl_it->name; // TODO(aiche): number of features need to be set later channel_as_map.size = consensus_map.size(); // add some more MetaInfo channel_as_map.setMetaValue("channel_name", cl_it->name); channel_as_map.setMetaValue("channel_id", cl_it->id); channel_as_map.setMetaValue("channel_description", cl_it->description); channel_as_map.setMetaValue("channel_center", cl_it->center); consensus_map.getFileDescriptions()[index++] = channel_as_map; } }
void ConsensusMapNormalizerAlgorithmQuantile::extractIntensityVectors(const ConsensusMap& map, vector<vector<double> >& out_intensities) { //reserve space for out_intensities (unequal vector lengths, 0-features omitted) Size number_of_maps = map.getColumnHeaders().size(); out_intensities.clear(); out_intensities.resize(number_of_maps); for (UInt i = 0; i < number_of_maps; i++) { ConsensusMap::ColumnHeaders::const_iterator it = map.getColumnHeaders().find(i); if (it == map.getColumnHeaders().end()) throw Exception::ElementNotFound(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION, String(i)); out_intensities[i].reserve(it->second.size); } //fill out_intensities ConsensusMap::ConstIterator cf_it; for (cf_it = map.begin(); cf_it != map.end(); ++cf_it) { ConsensusFeature::HandleSetType::const_iterator f_it; for (f_it = cf_it->getFeatures().begin(); f_it != cf_it->getFeatures().end(); ++f_it) { out_intensities[f_it->getMapIndex()].push_back(f_it->getIntensity()); } } }
void FeatureGroupingAlgorithmLabeled::group(const std::vector<FeatureMap<> > & maps, ConsensusMap & out) { //check that the number of maps is ok if (maps.size() != 1) throw Exception::IllegalArgument(__FILE__, __LINE__, __PRETTY_FUNCTION__, "Exactly one map must be given!"); if (out.getFileDescriptions().size() != 2) throw Exception::IllegalArgument(__FILE__, __LINE__, __PRETTY_FUNCTION__, "Two file descriptions must be set in 'out'!"); //initialize LabeledPairFinder LabeledPairFinder pm; pm.setParameters(param_.copy("", true)); //convert to consensus map std::vector<ConsensusMap> input(1); ConsensusMap::convert(0, maps[0], input[0]); //run pm.run(input, out); }
void IsobaricQuantifier::computeLabelingStatistics_(ConsensusMap& consensus_map_out) { // number of total quantified spectra stats_.number_ms2_total = consensus_map_out.size(); // Labeling efficiency statistics for (size_t i = 0; i < consensus_map_out.size(); ++i) { // is whole scan empty?! if (consensus_map_out[i].getIntensity() == 0) ++stats_.number_ms2_empty; // look at single reporters for (ConsensusFeature::HandleSetType::const_iterator it_elements = consensus_map_out[i].begin(); it_elements != consensus_map_out[i].end(); ++it_elements) { if (it_elements->getIntensity() == 0) { String ch_index = consensus_map_out.getFileDescriptions()[it_elements->getMapIndex()].getMetaValue("channel_name"); ++stats_.empty_channels[ch_index]; } } } LOG_INFO << "IsobaricQuantifier: skipped " << stats_.number_ms2_empty << " of " << consensus_map_out.size() << " selected scans due to lack of reporter information:\n"; consensus_map_out.setMetaValue("isoquant:scans_noquant", stats_.number_ms2_empty); consensus_map_out.setMetaValue("isoquant:scans_total", consensus_map_out.size()); LOG_INFO << "IsobaricQuantifier: channels with signal\n"; for (std::map<String, Size>::const_iterator it_m = stats_.empty_channels.begin(); it_m != stats_.empty_channels.end(); ++it_m) { LOG_INFO << " channel " << it_m->first << ": " << (consensus_map_out.size() - it_m->second) << " / " << consensus_map_out.size() << " (" << ((consensus_map_out.size() - it_m->second) * 100 / consensus_map_out.size()) << "%)\n"; consensus_map_out.setMetaValue(String("isoquant:quantifyable_ch") + it_m->first, (consensus_map_out.size() - it_m->second)); } }
void FeatureGroupingAlgorithmQT::group_(const vector<MapType>& maps, ConsensusMap& out) { // check that the number of maps is ok: if (maps.size() < 2) { throw Exception::IllegalArgument(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION, "At least two maps must be given!"); } QTClusterFinder cluster_finder; cluster_finder.setParameters(param_.copy("", true)); cluster_finder.run(maps, out); StringList ms_run_locations; // add protein IDs and unassigned peptide IDs to the result map here, // to keep the same order as the input maps (useful for output later): for (typename vector<MapType>::const_iterator map_it = maps.begin(); map_it != maps.end(); ++map_it) { // add protein identifications to result map: out.getProteinIdentifications().insert( out.getProteinIdentifications().end(), map_it->getProteinIdentifications().begin(), map_it->getProteinIdentifications().end()); // add unassigned peptide identifications to result map: out.getUnassignedPeptideIdentifications().insert( out.getUnassignedPeptideIdentifications().end(), map_it->getUnassignedPeptideIdentifications().begin(), map_it->getUnassignedPeptideIdentifications().end()); } // canonical ordering for checking the results: out.sortByQuality(); out.sortByMaps(); out.sortBySize(); return; }
void IsobaricQuantifier::quantify(const ConsensusMap& consensus_map_in, ConsensusMap& consensus_map_out) { // precheck incoming map if (consensus_map_in.empty()) { LOG_WARN << "Warning: Empty iTRAQ container. No quantitative information available!" << std::endl; return; } // create output map based on input, we will cleanup the channels while iterating over it consensus_map_out = consensus_map_in; // init stats stats_.reset(); stats_.channel_count = quant_method_->getNumberOfChannels(); // apply isotope correction if requested by user if (isotope_correction_enabled_) { stats_ = IsobaricIsotopeCorrector::correctIsotopicImpurities(consensus_map_in, consensus_map_out, quant_method_); } else { LOG_WARN << "Warning: Due to deactivated isotope-correction labeling statistics will be based on raw intensities, which might give too optimistic results." << std::endl; } // compute statistics and embed into output map computeLabelingStatistics_(consensus_map_out); // apply normalization if requested if (normalization_enabled_) { IsobaricNormalizer normalizer(quant_method_); normalizer.normalize(consensus_map_out); } }
FGA* ptr = 0; FGA* nullPointer = 0; START_SECTION((FeatureGroupingAlgorithm())) ptr = new FGA(); TEST_NOT_EQUAL(ptr, nullPointer) END_SECTION START_SECTION((virtual ~FeatureGroupingAlgorithm())) delete ptr; END_SECTION START_SECTION((virtual void group(const vector< FeatureMap > &maps, ConsensusMap &out)=0)) FGA fga; vector< FeatureMap > in; ConsensusMap map; fga.group(in,map); TEST_EQUAL(map.getFileDescriptions()[0].filename, "bla") END_SECTION START_SECTION((static void registerChildren())) { TEST_STRING_EQUAL(Factory<FeatureGroupingAlgorithm>::registeredProducts()[0],FeatureGroupingAlgorithmLabeled::getProductName()); TEST_STRING_EQUAL(Factory<FeatureGroupingAlgorithm>::registeredProducts()[1],FeatureGroupingAlgorithmUnlabeled::getProductName()); TEST_EQUAL(Factory<FeatureGroupingAlgorithm>::registeredProducts().size(), 3) } END_SECTION START_SECTION((void transferSubelements(const vector<ConsensusMap>& maps, ConsensusMap& out) const)) { vector<ConsensusMap> maps(2);
void MapAlignmentEvaluationAlgorithmPrecision::evaluate(const ConsensusMap & consensus_map_in, const ConsensusMap & consensus_map_gt, const double & rt_dev, const double & mz_dev, const Peak2D::IntensityType & int_dev, const bool use_charge, double & out) { //Precision = 1/N * sum ( gt_subtend_tilde_tool_i / tilde_tool_i ) ConsensusMap cons_map_gt; /* = consensus_map_gt; */ for (Size i = 0; i < consensus_map_gt.size(); ++i) { if (consensus_map_gt[i].size() >= 2) { cons_map_gt.push_back(consensus_map_gt[i]); } } ConsensusMap cons_map_tool = consensus_map_in; std::vector<Size> gt_subtend_tilde_tool; //holds the numerators of the sum std::vector<Size> tilde_tool; //holds the denominators of the sum Size gt_subtend_tilde_tool_i = 0; //filling material for the vectors Size tilde_tool_i = 0; Size cons_tool_size = 0; //size of the actual consensus feature of the tool Size gt_i_subtend_tool_j = 0; //size of the intersection of the actual cons. feat. of the tool with the c.f. of GT double precision = 0; //holds the output double sum = 0; //intermediate step: the sum //loop over all consensus features of the ground truth for (Size i = 0; i < cons_map_gt.size(); ++i) //N = cons_map_gt.size() { ConsensusFeature & gt_elem = cons_map_gt[i]; //for every i = 1, ..., N: gt_subtend_tilde_tool_i = 0; tilde_tool_i = 0; //loop over all consensus features of the tool's consensus map for (Size j = 0; j < cons_map_tool.size(); ++j) { ConsensusFeature & tool_elem = cons_map_tool[j]; cons_tool_size = cons_map_tool[j].size(); gt_i_subtend_tool_j = 0; //loop over all features in the ith consensus feature of the gt for (HandleIterator gt_it = gt_elem.begin(); gt_it != gt_elem.end(); ++gt_it) { //loop over all features in the jth consensus feature of the tool's map for (HandleIterator tool_it = tool_elem.begin(); tool_it != tool_elem.end(); ++tool_it) { //++cons_tool_size; if (isSameHandle(*tool_it, *gt_it, rt_dev, mz_dev, int_dev, use_charge)) { ++gt_i_subtend_tool_j; break; } } } if ((cons_tool_size >= 2) && (gt_i_subtend_tool_j > 0)) { gt_subtend_tilde_tool_i += gt_i_subtend_tool_j; tilde_tool_i += cons_tool_size; } } gt_subtend_tilde_tool.push_back(gt_subtend_tilde_tool_i); tilde_tool.push_back(tilde_tool_i); } for (Size k = 0; k < gt_subtend_tilde_tool.size(); ++k) { double fraction = 0; //intermediate step: the fraction if (gt_subtend_tilde_tool[k] != 0) { fraction = double(gt_subtend_tilde_tool[k]) / double(tilde_tool[k]); } sum += fraction; } precision = (1.0 / double(cons_map_gt.size())) * sum; out = precision; }
ExitCodes main_(int, const char**) { //------------------------------------------------------------- // parameter handling //------------------------------------------------------------- StringList in = getStringList_("in"); String edta = getStringOption_("pos"); String out = getStringOption_("out"); String out_sep = getStringOption_("out_separator"); String out_TIC_debug = getStringOption_("auto_rt:out_debug_TIC"); StringList in_header = getStringList_("in_header"); // number of out_debug_TIC files and input files must be identical /*if (out_TIC_debug.size() > 0 && in.size() != out_TIC_debug.size()) { LOG_FATAL_ERROR << "Error: number of input file 'in' and auto_rt:out_debug_TIC files must be identical!" << std::endl; return ILLEGAL_PARAMETERS; }*/ // number of header files and input files must be identical if (in_header.size() > 0 && in.size() != in_header.size()) { LOG_FATAL_ERROR << "Error: number of input file 'in' and 'in_header' files must be identical!" << std::endl; return ILLEGAL_PARAMETERS; } if (!getFlag_("auto_rt:enabled") && !out_TIC_debug.empty()) { LOG_FATAL_ERROR << "Error: TIC output file requested, but auto_rt is not enabled! Either do not request the file or switch on 'auto_rt:enabled'." << std::endl; return ILLEGAL_PARAMETERS; } double rttol = getDoubleOption_("rt_tol"); double mztol = getDoubleOption_("mz_tol"); Size rt_collect = getIntOption_("rt_collect"); //------------------------------------------------------------- // loading input //------------------------------------------------------------- MzMLFile mzml_file; mzml_file.setLogType(log_type_); MSExperiment<Peak1D> exp, exp_pp; EDTAFile ed; ConsensusMap cm; ed.load(edta, cm); StringList tf_single_header0, tf_single_header1, tf_single_header2; // header content, for each column std::vector<String> vec_single; // one line for each compound, multiple columns per experiment vec_single.resize(cm.size()); for (Size fi = 0; fi < in.size(); ++fi) { // load raw data mzml_file.load(in[fi], exp); exp.sortSpectra(true); if (exp.empty()) { LOG_WARN << "The given file does not contain any conventional peak data, but might" " contain chromatograms. This tool currently cannot handle them, sorry." << std::endl; return INCOMPATIBLE_INPUT_DATA; } // try to detect RT peaks (only for the first input file -- all others should align!) // cm.size() might change in here... if (getFlag_("auto_rt:enabled") && fi == 0) { ConsensusMap cm_local = cm; // we might have different RT peaks for each map if 'auto_rt' is enabled cm.clear(false); // reset global list (about to be filled) // compute TIC MSChromatogram<> tic = exp.getTIC(); MSSpectrum<> tics, tic_gf, tics_pp, tics_sn; for (Size ic = 0; ic < tic.size(); ++ic) { // rewrite Chromatogram to MSSpectrum (GaussFilter requires it) Peak1D peak; peak.setMZ(tic[ic].getRT()); peak.setIntensity(tic[ic].getIntensity()); tics.push_back(peak); } // smooth (no PP_CWT here due to efficiency reasons -- large FWHM take longer!) double fwhm = getDoubleOption_("auto_rt:FHWM"); GaussFilter gf; Param p = gf.getParameters(); p.setValue("gaussian_width", fwhm * 2); // wider than FWHM, just to be sure we have a fully smoothed peak. Merging two peaks is unlikely p.setValue("use_ppm_tolerance", "false"); gf.setParameters(p); tic_gf = tics; gf.filter(tic_gf); // pick peaks PeakPickerHiRes pp; p = pp.getParameters(); p.setValue("signal_to_noise", getDoubleOption_("auto_rt:SNThreshold")); pp.setParameters(p); pp.pick(tic_gf, tics_pp); if (tics_pp.size()) { LOG_INFO << "Found " << tics_pp.size() << " auto-rt peaks at: "; for (Size ipp = 0; ipp != tics_pp.size(); ++ipp) LOG_INFO << " " << tics_pp[ipp].getMZ(); } else { LOG_INFO << "Found no auto-rt peaks. Change threshold parameters!"; } LOG_INFO << std::endl; if (!out_TIC_debug.empty()) // if debug file was given { // store intermediate steps for debug MSExperiment<> out_debug; out_debug.addChromatogram(toChromatogram(tics)); out_debug.addChromatogram(toChromatogram(tic_gf)); SignalToNoiseEstimatorMedian<MSSpectrum<> > snt; snt.init(tics); for (Size is = 0; is < tics.size(); ++is) { Peak1D peak; peak.setMZ(tic[is].getMZ()); peak.setIntensity(snt.getSignalToNoise(tics[is])); tics_sn.push_back(peak); } out_debug.addChromatogram(toChromatogram(tics_sn)); out_debug.addChromatogram(toChromatogram(tics_pp)); // get rid of "native-id" missing warning for (Size id = 0; id < out_debug.size(); ++id) out_debug[id].setNativeID(String("spectrum=") + id); mzml_file.store(out_TIC_debug, out_debug); LOG_DEBUG << "Storing debug AUTO-RT: " << out_TIC_debug << std::endl; } // add target EICs: for each m/z with no/negative RT, add all combinations of that m/z with auto-RTs // duplicate m/z entries will be ignored! // all other lines with positive RT values are copied unaffected //do not allow doubles std::set<double> mz_doubles; for (ConsensusMap::Iterator cit = cm_local.begin(); cit != cm_local.end(); ++cit) { if (cit->getRT() < 0) { if (mz_doubles.find(cit->getMZ()) == mz_doubles.end()) { mz_doubles.insert(cit->getMZ()); } else { LOG_INFO << "Found duplicate m/z entry (" << cit->getMZ() << ") for auto-rt. Skipping ..." << std::endl; continue; } ConsensusMap cm_RT_multiplex; for (MSSpectrum<>::ConstIterator itp = tics_pp.begin(); itp != tics_pp.end(); ++itp) { ConsensusFeature f = *cit; f.setRT(itp->getMZ()); cm.push_back(f); } } else { // default feature with no auto-rt LOG_INFO << "copying feature with RT " << cit->getRT() << std::endl; cm.push_back(*cit); } } // resize, since we have more positions now vec_single.resize(cm.size()); } // search for each EIC and add up Int not_found(0); Map<Size, double> quant; String description; if (fi < in_header.size()) { HeaderInfo info(in_header[fi]); description = info.header_description; } if (fi == 0) { // two additional columns for first file (theoretical RT and m/z) tf_single_header0 << "" << ""; tf_single_header1 << "" << ""; tf_single_header2 << "RT" << "mz"; } // 5 entries for each input file tf_single_header0 << File::basename(in[fi]) << "" << "" << "" << ""; tf_single_header1 << description << "" << "" << "" << ""; tf_single_header2 << "RTobs" << "dRT" << "mzobs" << "dppm" << "intensity"; for (Size i = 0; i < cm.size(); ++i) { //std::cerr << "Rt" << cm[i].getRT() << " mz: " << cm[i].getMZ() << " R " << cm[i].getMetaValue("rank") << "\n"; double mz_da = mztol * cm[i].getMZ() / 1e6; // mz tolerance in Dalton MSExperiment<>::ConstAreaIterator it = exp.areaBeginConst(cm[i].getRT() - rttol / 2, cm[i].getRT() + rttol / 2, cm[i].getMZ() - mz_da, cm[i].getMZ() + mz_da); Peak2D max_peak; max_peak.setIntensity(0); max_peak.setRT(cm[i].getRT()); max_peak.setMZ(cm[i].getMZ()); for (; it != exp.areaEndConst(); ++it) { if (max_peak.getIntensity() < it->getIntensity()) { max_peak.setIntensity(it->getIntensity()); max_peak.setRT(it.getRT()); max_peak.setMZ(it->getMZ()); } } double ppm = 0; // observed m/z offset if (max_peak.getIntensity() == 0) { ++not_found; } else { // take median for m/z found std::vector<double> mz; MSExperiment<>::Iterator itm = exp.RTBegin(max_peak.getRT()); SignedSize low = std::min<SignedSize>(std::distance(exp.begin(), itm), rt_collect); SignedSize high = std::min<SignedSize>(std::distance(itm, exp.end()) - 1, rt_collect); MSExperiment<>::AreaIterator itt = exp.areaBegin((itm - low)->getRT() - 0.01, (itm + high)->getRT() + 0.01, cm[i].getMZ() - mz_da, cm[i].getMZ() + mz_da); for (; itt != exp.areaEnd(); ++itt) { mz.push_back(itt->getMZ()); //std::cerr << "ppm: " << itt.getRT() << " " << itt->getMZ() << " " << itt->getIntensity() << std::endl; } if ((SignedSize)mz.size() > (low + high + 1)) LOG_WARN << "Compound " << i << " has overlapping peaks [" << mz.size() << "/" << low + high + 1 << "]" << std::endl; if (!mz.empty()) { double avg_mz = std::accumulate(mz.begin(), mz.end(), 0.0) / double(mz.size()); //std::cerr << "avg: " << avg_mz << "\n"; ppm = (avg_mz - cm[i].getMZ()) / cm[i].getMZ() * 1e6; } } // appending the second column set requires separator String append_sep = (fi == 0 ? "" : out_sep); vec_single[i] += append_sep; // new line if (fi == 0) { vec_single[i] += String(cm[i].getRT()) + out_sep + String(cm[i].getMZ()) + out_sep; } vec_single[i] += String(max_peak.getRT()) + out_sep + String(max_peak.getRT() - cm[i].getRT()) + out_sep + String(max_peak.getMZ()) + out_sep + String(ppm) + out_sep + String(max_peak.getIntensity()); } if (not_found) LOG_INFO << "Missing peaks for " << not_found << " compounds in file '" << in[fi] << "'.\n"; } //------------------------------------------------------------- // create header //------------------------------------------------------------- vec_single.insert(vec_single.begin(), ListUtils::concatenate(tf_single_header2, out_sep)); vec_single.insert(vec_single.begin(), ListUtils::concatenate(tf_single_header1, out_sep)); vec_single.insert(vec_single.begin(), ListUtils::concatenate(tf_single_header0, out_sep)); //------------------------------------------------------------- // writing output //------------------------------------------------------------- TextFile tf; for (std::vector<String>::iterator v_it = vec_single.begin(); v_it != vec_single.end(); ++v_it) { tf.addLine(*v_it); } tf.store(out); return EXECUTION_OK; }
ExitCodes main_(int, const char**) { //------------------------------------------------------------- // parameter handling //------------------------------------------------------------- //file list StringList file_list = getStringList_("in"); //file type FileHandler fh; FileTypes::Type force_type; if (getStringOption_("in_type").size() > 0) { force_type = FileTypes::nameToType(getStringOption_("in_type")); } else { force_type = fh.getType(file_list[0]); } //output file names and types String out_file = getStringOption_("out"); //------------------------------------------------------------- // calculations //------------------------------------------------------------- bool annotate_file_origin = getFlag_("annotate_file_origin"); if (force_type == FileTypes::FEATUREXML) { FeatureMap<> out; for (Size i = 0; i < file_list.size(); ++i) { FeatureMap<> map; FeatureXMLFile fh; fh.load(file_list[i], map); if (annotate_file_origin) { for (FeatureMap<>::iterator it = map.begin(); it != map.end(); ++it) { it->setMetaValue("file_origin", DataValue(file_list[i])); } } out += map; } //------------------------------------------------------------- // writing output //------------------------------------------------------------- //annotate output with data processing info addDataProcessing_(out, getProcessingInfo_(DataProcessing::FORMAT_CONVERSION)); FeatureXMLFile f; f.store(out_file, out); } else if (force_type == FileTypes::CONSENSUSXML) { ConsensusMap out; ConsensusXMLFile fh; fh.load(file_list[0], out); //skip first file for (Size i = 1; i < file_list.size(); ++i) { ConsensusMap map; ConsensusXMLFile fh; fh.load(file_list[i], map); if (annotate_file_origin) { for (ConsensusMap::iterator it = map.begin(); it != map.end(); ++it) { it->setMetaValue("file_origin", DataValue(file_list[i])); } } out += map; } //------------------------------------------------------------- // writing output //------------------------------------------------------------- //annotate output with data processing info addDataProcessing_(out, getProcessingInfo_(DataProcessing::FORMAT_CONVERSION)); ConsensusXMLFile f; f.store(out_file, out); } else if (force_type == FileTypes::TRAML) { TargetedExperiment out; for (Size i = 0; i < file_list.size(); ++i) { TargetedExperiment map; TraMLFile fh; fh.load(file_list[i], map); out += map; } //------------------------------------------------------------- // writing output //------------------------------------------------------------- //annotate output with data processing info Software software; software.setName("FileMerger"); software.setVersion(VersionInfo::getVersion()); out.addSoftware(software); TraMLFile f; f.store(out_file, out); } else { // we might want to combine different types, thus we only // query in_type (which applies to all files) // and not the suffix or content of a single file force_type = FileTypes::nameToType(getStringOption_("in_type")); //rt bool rt_auto_number = getFlag_("raw:rt_auto"); bool rt_filename = getFlag_("raw:rt_filename"); bool rt_custom = false; DoubleList custom_rts = getDoubleList_("raw:rt_custom"); if (custom_rts.size() != 0) { rt_custom = true; if (custom_rts.size() != file_list.size()) { writeLog_("Custom retention time list must have as many elements as there are input files!"); printUsage_(); return ILLEGAL_PARAMETERS; } } //ms level bool user_ms_level = getFlag_("raw:user_ms_level"); MSExperiment<> out; out.reserve(file_list.size()); UInt rt_auto = 0; UInt native_id = 0; std::vector<MSChromatogram<ChromatogramPeak> > all_chromatograms; for (Size i = 0; i < file_list.size(); ++i) { String filename = file_list[i]; //load file MSExperiment<> in; fh.loadExperiment(filename, in, force_type, log_type_); if (in.empty() && in.getChromatograms().empty()) { writeLog_(String("Warning: Empty file '") + filename + "'!"); continue; } out.reserve(out.size() + in.size()); //warn if custom RT and more than one scan in input file if (rt_custom && in.size() > 1) { writeLog_(String("Warning: More than one scan in file '") + filename + "'! All scans will have the same retention time!"); } for (MSExperiment<>::const_iterator it2 = in.begin(); it2 != in.end(); ++it2) { //handle rt Real rt_final = it2->getRT(); if (rt_auto_number) { rt_final = ++rt_auto; } else if (rt_custom) { rt_final = custom_rts[i]; } else if (rt_filename) { if (!filename.hasSubstring("rt")) { writeLog_(String("Warning: cannot guess retention time from filename as it does not contain 'rt'")); } for (Size i = 0; i < filename.size(); ++i) { if (filename[i] == 'r' && ++i != filename.size() && filename[i] == 't' && ++i != filename.size() && isdigit(filename[i])) { String rt; while (i != filename.size() && (filename[i] == '.' || isdigit(filename[i]))) { rt += filename[i++]; } if (rt.size() > 0) { // remove dot from rt3892.98.dta // ^ if (rt[rt.size() - 1] == '.') { // remove last character rt.erase(rt.end() - 1); } } try { float tmp = rt.toFloat(); rt_final = tmp; } catch (Exception::ConversionError) { writeLog_(String("Warning: cannot convert the found retention time in a value '" + rt + "'.")); } } } } // none of the rt methods were successful if (rt_final == -1) { writeLog_(String("Warning: No valid retention time for output scan '") + rt_auto + "' from file '" + filename + "'"); } out.addSpectrum(*it2); out.getSpectra().back().setRT(rt_final); out.getSpectra().back().setNativeID(native_id); if (user_ms_level) { out.getSpectra().back().setMSLevel((int)getIntOption_("raw:ms_level")); } ++native_id; } // if we had only one spectrum, we can annotate it directly, for more spectra, we just name the source file leaving the spectra unannotated (to avoid a long and redundant list of sourceFiles) if (in.size() == 1) { out.getSpectra().back().setSourceFile(in.getSourceFiles()[0]); in.getSourceFiles().clear(); // delete source file annotated from source file (its in the spectrum anyways) } // copy experimental settings from first file if (i == 0) { out.ExperimentalSettings::operator=(in); } else // otherwise append { out.getSourceFiles().insert(out.getSourceFiles().end(), in.getSourceFiles().begin(), in.getSourceFiles().end()); // could be emtpty if spectrum was annotated above, but that's ok then } // also add the chromatograms for (std::vector<MSChromatogram<ChromatogramPeak> >::const_iterator it2 = in.getChromatograms().begin(); it2 != in.getChromatograms().end(); ++it2) { all_chromatograms.push_back(*it2); } } // set the chromatograms out.setChromatograms(all_chromatograms); //------------------------------------------------------------- // writing output //------------------------------------------------------------- //annotate output with data processing info addDataProcessing_(out, getProcessingInfo_(DataProcessing::FORMAT_CONVERSION)); MzMLFile f; f.setLogType(log_type_); f.store(out_file, out); } return EXECUTION_OK; }
void group(const vector< FeatureMap >&, ConsensusMap& map) { map.getFileDescriptions()[0].filename = "bla"; map.getFileDescriptions()[0].size = 5; }
ExitCodes main_(int, const char **) { //load input features FeatureMap input; FeatureXMLFile().load(getStringOption_("in"), input); //load truth consensusXML ConsensusMap truth; ConsensusXMLFile().load(getStringOption_("truth"), truth); //parameters double mz_tol = getDoubleOption_("mz_tol"); double rt_tol = getDoubleOption_("rt_tol"); //seek manual feature in automatic feature map UInt matched_pairs = 0; UInt half_matched_pairs = 0; vector<double> t_ratio, i_ratio, rt_diffs, mz_diffs; for (Size t = 0; t < truth.size(); ++t) { if (truth[t].size() != 2) { cerr << "Error: consensus feature must contain exactly two elements!" << endl; continue; } vector<Feature> best_matches(2); vector<UInt> match_counts(2, 0); vector<Peak2D> elements(2); elements[0] = *(truth[t].getFeatures().begin()); elements[1] = *(++(truth[t].getFeatures().begin())); double mz_tol_charged = mz_tol / truth[t].getCharge(); for (Size e = 0; e < 2; ++e) { double best_score = 0.0; for (Size i = 0; i < input.size(); ++i) { const Feature & f_i = input[i]; if (fabs(f_i.getRT() - elements[e].getRT()) < rt_tol && fabs(f_i.getMZ() - elements[e].getMZ()) < mz_tol_charged) { ++match_counts[e]; double score = (1.0 - fabs(f_i.getMZ() - elements[e].getMZ()) / mz_tol_charged) * (1.0 - fabs(f_i.getRT() - elements[e].getRT()) / rt_tol); if (score > best_score) { best_score = score; best_matches[e] = f_i; } } } } //not matched if (match_counts[0] == 0 && match_counts[1] == 0) { } //half matched else if ((match_counts[0] > 0 && match_counts[1] == 0) || (match_counts[0] == 0 && match_counts[1] > 0)) { ++half_matched_pairs; } //matched else { ++matched_pairs; double a_r = best_matches[0].getIntensity() / best_matches[1].getIntensity(); t_ratio.push_back(a_r); double m_r = elements[0].getIntensity() / elements[1].getIntensity(); i_ratio.push_back(m_r); rt_diffs.push_back(best_matches[1].getRT() - best_matches[0].getRT()); mz_diffs.push_back((best_matches[1].getMZ() - best_matches[0].getMZ()) * truth[t].getCharge()); } } cout << endl; cout << "pair detection statistics:" << endl; cout << "==========================" << endl; cout << "truth pairs: " << truth.size() << endl; cout << "input features: " << input.size() << endl; cout << endl; cout << "found: " << matched_pairs << " (" << String::number(100.0 * matched_pairs / truth.size(), 2) << "%)" << endl; cout << "half found : " << half_matched_pairs << " (" << String::number(100.0 * half_matched_pairs / truth.size(), 2) << "%)" << endl; cout << "not found : " << truth.size() - (matched_pairs + half_matched_pairs) << " (" << String::number(100.0 - 100.0 * (matched_pairs + half_matched_pairs) / truth.size(), 2) << "%)" << endl; cout << endl; cout << "relative pair ratios: " << fiveNumberQuotients(i_ratio, t_ratio, 3) << endl; cout << "pair distance RT : " << fiveNumbers(rt_diffs, 2) << endl; cout << "pair distance m/z: " << fiveNumbers(mz_diffs, 2) << endl; return EXECUTION_OK; }
features[9].setMZ(6.0f); features[9].setCharge(1); features[9].setOverallQuality(1); START_SECTION((virtual void run(const std::vector<ConsensusMap>& input_maps, ConsensusMap& result_map))) LabeledPairFinder pm; Param p; p.setValue("rt_estimate","false"); p.setValue("rt_pair_dist",0.4); p.setValue("rt_dev_low",1.0); p.setValue("rt_dev_high",2.0); p.setValue("mz_pair_dists",ListUtils::create<double>(4.0)); p.setValue("mz_dev",0.6); pm.setParameters(p); ConsensusMap output; TEST_EXCEPTION(Exception::IllegalArgument,pm.run(vector<ConsensusMap>(),output)); vector<ConsensusMap> input(1); MapConversion::convert(5,features,input[0]); output.getColumnHeaders()[5].label = "light"; output.getColumnHeaders()[5].filename = "filename"; output.getColumnHeaders()[8] = output.getColumnHeaders()[5]; output.getColumnHeaders()[8].label = "heavy"; pm.run(input,output); TEST_EQUAL(output.size(),1); ABORT_IF(output.size()!=1) TEST_REAL_SIMILAR(output[0].begin()->getMZ(),1.0f); TEST_REAL_SIMILAR(output[0].begin()->getRT(),1.0f); TEST_REAL_SIMILAR(output[0].rbegin()->getMZ(),5.0f);
ExitCodes main_(int, const char**) { vector<ProteinIdentification> prot_ids; vector<PeptideIdentification> pep_ids; ProteinHit temp_protein_hit; //------------------------------------------------------------- // parsing parameters //------------------------------------------------------------- String inputfile_id = getStringOption_("id"); String inputfile_feature = getStringOption_("feature"); String inputfile_consensus = getStringOption_("consensus"); String inputfile_raw = getStringOption_("in"); String outputfile_name = getStringOption_("out"); //~ bool Ms1(getFlag_("MS1")); //~ bool Ms2(getFlag_("MS2")); bool remove_duplicate_features(getFlag_("remove_duplicate_features")); //------------------------------------------------------------- // fetch vocabularies //------------------------------------------------------------ ControlledVocabulary cv; cv.loadFromOBO("PSI-MS", File::find("/CV/psi-ms.obo")); cv.loadFromOBO("QC", File::find("/CV/qc-cv.obo")); QcMLFile qcmlfile; //------------------------------------------------------------- // MS aqiusition //------------------------------------------------------------ String base_name = QFileInfo(QString::fromStdString(inputfile_raw)).baseName(); cout << "Reading mzML file..." << endl; MzMLFile mz_data_file; MSExperiment<Peak1D> exp; MzMLFile().load(inputfile_raw, exp); //---prep input exp.sortSpectra(); UInt min_mz = std::numeric_limits<UInt>::max(); UInt max_mz = 0; std::map<Size, UInt> mslevelcounts; qcmlfile.registerRun(base_name,base_name); //TODO use UIDs //---base MS aquisition qp String msaq_ref = base_name + "_msaq"; QcMLFile::QualityParameter qp; qp.id = msaq_ref; ///< Identifier qp.cvRef = "QC"; ///< cv reference qp.cvAcc = "QC:0000004"; try { //~ const ControlledVocabulary::CVTerm& test = cv.getTermByName("MS aquisition result details"); //~ cout << test.name << test.id << endl; const ControlledVocabulary::CVTerm& term = cv.getTerm(qp.cvAcc); //~ const ControlledVocabulary::CVTerm& term = cv.getTerm("0000004"); qp.name = term.name; ///< Name } catch (...) { qp.name = "mzML file"; ///< Name } qcmlfile.addRunQualityParameter(base_name, qp); //---file origin qp qp = QcMLFile::QualityParameter(); qp.name = "mzML file"; ///< Name qp.id = base_name + "_run_name"; ///< Identifier qp.cvRef = "MS"; ///< cv reference qp.cvAcc = "MS:1000577"; qp.value = base_name; qcmlfile.addRunQualityParameter(base_name, qp); qp = QcMLFile::QualityParameter(); qp.name = "instrument model"; ///< Name qp.id = base_name + "_instrument_name"; ///< Identifier qp.cvRef = "MS"; ///< cv reference qp.cvAcc = "MS:1000031"; qp.value = exp.getInstrument().getName(); qcmlfile.addRunQualityParameter(base_name, qp); qp = QcMLFile::QualityParameter(); qp.name = "completion time"; ///< Name qp.id = base_name + "_date"; ///< Identifier qp.cvRef = "MS"; ///< cv reference qp.cvAcc = "MS:1000747"; qp.value = exp.getDateTime().getDate(); qcmlfile.addRunQualityParameter(base_name, qp); //---precursors at QcMLFile::Attachment at; at.cvRef = "QC"; ///< cv reference at.cvAcc = "QC:0000044"; at.qualityRef = msaq_ref; at.id = base_name + "_precursors"; ///< Identifier try { const ControlledVocabulary::CVTerm& term = cv.getTerm(at.cvAcc); at.name = term.name; ///< Name } catch (...) { at.name = "precursors"; ///< Name } at.colTypes.push_back("MS:1000894_[sec]"); //RT at.colTypes.push_back("MS:1000040"); //MZ for (Size i = 0; i < exp.size(); ++i) { mslevelcounts[exp[i].getMSLevel()]++; if (exp[i].getMSLevel() == 2) { if (exp[i].getPrecursors().front().getMZ() < min_mz) { min_mz = exp[i].getPrecursors().front().getMZ(); } if (exp[i].getPrecursors().front().getMZ() > max_mz) { max_mz = exp[i].getPrecursors().front().getMZ(); } std::vector<String> row; row.push_back(exp[i].getRT()); row.push_back(exp[i].getPrecursors().front().getMZ()); at.tableRows.push_back(row); } } qcmlfile.addRunAttachment(base_name, at); //---aquisition results qp qp = QcMLFile::QualityParameter(); qp.cvRef = "QC"; ///< cv reference qp.cvAcc = "QC:0000006"; ///< cv accession for "aquisition results" qp.id = base_name + "_ms1aquisition"; ///< Identifier qp.value = String(mslevelcounts[1]); try { const ControlledVocabulary::CVTerm& term = cv.getTerm(qp.cvAcc); qp.name = term.name; ///< Name } catch (...) { qp.name = "number of ms1 spectra"; ///< Name } qcmlfile.addRunQualityParameter(base_name, qp); qp = QcMLFile::QualityParameter(); qp.cvRef = "QC"; ///< cv reference qp.cvAcc = "QC:0000007"; ///< cv accession for "aquisition results" qp.id = base_name + "_ms2aquisition"; ///< Identifier qp.value = String(mslevelcounts[2]); try { const ControlledVocabulary::CVTerm& term = cv.getTerm(qp.cvAcc); qp.name = term.name; ///< Name } catch (...) { qp.name = "number of ms2 spectra"; ///< Name } qcmlfile.addRunQualityParameter(base_name, qp); qp = QcMLFile::QualityParameter(); qp.cvRef = "QC"; ///< cv reference qp.cvAcc = "QC:0000008"; ///< cv accession for "aquisition results" qp.id = base_name + "_Chromaquisition"; ///< Identifier qp.value = String(exp.getChromatograms().size()); try { const ControlledVocabulary::CVTerm& term = cv.getTerm(qp.cvAcc); qp.name = term.name; ///< Name } catch (...) { qp.name = "number of chromatograms"; ///< Name } qcmlfile.addRunQualityParameter(base_name, qp); at = QcMLFile::Attachment(); at.cvRef = "QC"; ///< cv reference at.cvAcc = "QC:0000009"; at.qualityRef = msaq_ref; at.id = base_name + "_mzrange"; ///< Identifier try { const ControlledVocabulary::CVTerm& term = cv.getTerm(at.cvAcc); at.name = term.name; ///< Name } catch (...) { at.name = "MS MZ aquisition ranges"; ///< Name } at.colTypes.push_back("QC:0000010"); //MZ at.colTypes.push_back("QC:0000011"); //MZ std::vector<String> rowmz; rowmz.push_back(String(min_mz)); rowmz.push_back(String(max_mz)); at.tableRows.push_back(rowmz); qcmlfile.addRunAttachment(base_name, at); at = QcMLFile::Attachment(); at.cvRef = "QC"; ///< cv reference at.cvAcc = "QC:0000012"; at.qualityRef = msaq_ref; at.id = base_name + "_rtrange"; ///< Identifier try { const ControlledVocabulary::CVTerm& term = cv.getTerm(at.cvAcc); at.name = term.name; ///< Name } catch (...) { at.name = "MS RT aquisition ranges"; ///< Name } at.colTypes.push_back("QC:0000013"); //MZ at.colTypes.push_back("QC:0000014"); //MZ std::vector<String> rowrt; rowrt.push_back(String(exp.begin()->getRT())); rowrt.push_back(String(exp.getSpectra().back().getRT())); at.tableRows.push_back(rowrt); qcmlfile.addRunAttachment(base_name, at); //---ion current stability ( & tic ) qp at = QcMLFile::Attachment(); at.cvRef = "QC"; ///< cv reference at.cvAcc = "QC:0000022"; at.qualityRef = msaq_ref; at.id = base_name + "_tics"; ///< Identifier try { const ControlledVocabulary::CVTerm& term = cv.getTerm(at.cvAcc); at.name = term.name; ///< Name } catch (...) { at.name = "MS TICs"; ///< Name } at.colTypes.push_back("MS:1000894_[sec]"); at.colTypes.push_back("MS:1000285"); UInt max = 0; Size below_10k = 0; for (Size i = 0; i < exp.size(); ++i) { if (exp[i].getMSLevel() == 1) { UInt sum = 0; for (Size j = 0; j < exp[i].size(); ++j) { sum += exp[i][j].getIntensity(); } if (sum > max) { max = sum; } if (sum < 10000) { ++below_10k; } std::vector<String> row; row.push_back(exp[i].getRT()); row.push_back(sum); at.tableRows.push_back(row); } } qcmlfile.addRunAttachment(base_name, at); qp = QcMLFile::QualityParameter(); qp.id = base_name + "_ticslump"; ///< Identifier qp.cvRef = "QC"; ///< cv reference qp.cvAcc = "QC:0000023"; qp.value = String((100 / exp.size()) * below_10k); try { const ControlledVocabulary::CVTerm& term = cv.getTerm(qp.cvAcc); qp.name = term.name; ///< Name } catch (...) { qp.name = "percentage of tic slumps"; ///< Name } qcmlfile.addRunQualityParameter(base_name, qp); //------------------------------------------------------------- // MS id //------------------------------------------------------------ if (inputfile_id != "") { IdXMLFile().load(inputfile_id, prot_ids, pep_ids); cerr << "idXML read ended. Found " << pep_ids.size() << " peptide identifications." << endl; ProteinIdentification::SearchParameters params = prot_ids[0].getSearchParameters(); vector<String> var_mods = params.variable_modifications; //~ boost::regex re("(?<=[KR])(?=[^P])"); String msid_ref = base_name + "_msid"; QcMLFile::QualityParameter qp; qp.id = msid_ref; ///< Identifier qp.cvRef = "QC"; ///< cv reference qp.cvAcc = "QC:0000025"; try { const ControlledVocabulary::CVTerm& term = cv.getTerm(qp.cvAcc); qp.name = term.name; ///< Name } catch (...) { qp.name = "MS identification result details"; ///< Name } qcmlfile.addRunQualityParameter(base_name, qp); at = QcMLFile::Attachment(); at.cvRef = "QC"; ///< cv reference at.cvAcc = "QC:0000026"; at.qualityRef = msid_ref; at.id = base_name + "_idsetting"; ///< Identifier try { const ControlledVocabulary::CVTerm& term = cv.getTerm(at.cvAcc); at.name = term.name; ///< Name } catch (...) { at.name = "MS id settings"; ///< Name } at.colTypes.push_back("MS:1001013"); //MS:1001013 db name MS:1001016 version MS:1001020 taxonomy at.colTypes.push_back("MS:1001016"); at.colTypes.push_back("MS:1001020"); std::vector<String> row; row.push_back(String(prot_ids.front().getSearchParameters().db)); row.push_back(String(prot_ids.front().getSearchParameters().db_version)); row.push_back(String(prot_ids.front().getSearchParameters().taxonomy)); at.tableRows.push_back(row); qcmlfile.addRunAttachment(base_name, at); UInt spectrum_count = 0; Size peptide_hit_count = 0; UInt runs_count = 0; Size protein_hit_count = 0; set<String> peptides; set<String> proteins; Size missedcleavages = 0; for (Size i = 0; i < pep_ids.size(); ++i) { if (!pep_ids[i].empty()) { ++spectrum_count; peptide_hit_count += pep_ids[i].getHits().size(); const vector<PeptideHit>& temp_hits = pep_ids[i].getHits(); for (Size j = 0; j < temp_hits.size(); ++j) { peptides.insert(temp_hits[j].getSequence().toString()); } } } for (set<String>::iterator it = peptides.begin(); it != peptides.end(); ++it) { for (String::const_iterator st = it->begin(); st != it->end() - 1; ++st) { if (*st == 'K' || *st == 'R') { ++missedcleavages; } } } for (Size i = 0; i < prot_ids.size(); ++i) { ++runs_count; protein_hit_count += prot_ids[i].getHits().size(); const vector<ProteinHit>& temp_hits = prot_ids[i].getHits(); for (Size j = 0; j < temp_hits.size(); ++j) { proteins.insert(temp_hits[j].getAccession()); } } qp = QcMLFile::QualityParameter(); qp.cvRef = "QC"; ///< cv reference qp.cvAcc = "QC:0000037"; ///< cv accession qp.id = base_name + "_misscleave"; ///< Identifier qp.value = missedcleavages; try { const ControlledVocabulary::CVTerm& term = cv.getTerm(qp.cvAcc); qp.name = term.name; ///< Name } catch (...) { qp.name = "total number of missed cleavages"; ///< Name } qcmlfile.addRunQualityParameter(base_name, qp); qp = QcMLFile::QualityParameter(); qp.cvRef = "QC"; ///< cv reference qp.cvAcc = "QC:0000032"; ///< cv accession qp.id = base_name + "_totprot"; ///< Identifier qp.value = protein_hit_count; try { const ControlledVocabulary::CVTerm& term = cv.getTerm(qp.cvAcc); qp.name = term.name; ///< Name } catch (...) { qp.name = "total number of identified proteins"; ///< Name } qcmlfile.addRunQualityParameter(base_name, qp); qp = QcMLFile::QualityParameter(); qp.cvRef = "QC"; ///< cv reference qp.cvAcc = "QC:0000033"; ///< cv accession qp.id = base_name + "_totuniqprot"; ///< Identifier qp.value = String(proteins.size()); try { const ControlledVocabulary::CVTerm& term = cv.getTerm(qp.cvAcc); qp.name = term.name; ///< Name } catch (...) { qp.name = "total number of uniquely identified proteins"; ///< Name } qcmlfile.addRunQualityParameter(base_name, qp); qp = QcMLFile::QualityParameter(); qp.cvRef = "QC"; ///< cv reference qp.cvAcc = "QC:0000029"; ///< cv accession qp.id = base_name + "_psms"; ///< Identifier qp.value = String(spectrum_count); try { const ControlledVocabulary::CVTerm& term = cv.getTerm(qp.cvAcc); qp.name = term.name; ///< Name } catch (...) { qp.name = "total number of PSM"; ///< Name } qcmlfile.addRunQualityParameter(base_name, qp); qp = QcMLFile::QualityParameter(); qp.cvRef = "QC"; ///< cv reference qp.cvAcc = "QC:0000030"; ///< cv accession qp.id = base_name + "_totpeps"; ///< Identifier qp.value = String(peptide_hit_count); try { const ControlledVocabulary::CVTerm& term = cv.getTerm(qp.cvAcc); qp.name = term.name; ///< Name } catch (...) { qp.name = "total number of identified peptides"; ///< Name } qcmlfile.addRunQualityParameter(base_name, qp); qp = QcMLFile::QualityParameter(); qp.cvRef = "QC"; ///< cv reference qp.cvAcc = "QC:0000031"; ///< cv accession qp.id = base_name + "_totuniqpeps"; ///< Identifier qp.value = String(peptides.size()); try { const ControlledVocabulary::CVTerm& term = cv.getTerm(qp.cvAcc); qp.name = term.name; ///< Name } catch (...) { qp.name = "total number of uniquely identified peptides"; ///< Name } qcmlfile.addRunQualityParameter(base_name, qp); at = QcMLFile::Attachment(); at.cvRef = "QC"; ///< cv reference at.cvAcc = "QC:0000038"; at.qualityRef = msid_ref; at.id = base_name + "_massacc"; ///< Identifier try { const ControlledVocabulary::CVTerm& term = cv.getTerm(at.cvAcc); at.name = term.name; ///< Name } catch (...) { at.name = "delta ppm tables"; } //~ delta ppm QC:0000039 RT MZ uniqueness ProteinID MS:1000885 target/decoy Score PeptideSequence MS:1000889 Annots string Similarity Charge UO:0000219 TheoreticalWeight UO:0000221 Oxidation_(M) at.colTypes.push_back("RT"); at.colTypes.push_back("MZ"); at.colTypes.push_back("Score"); at.colTypes.push_back("PeptideSequence"); at.colTypes.push_back("Charge"); at.colTypes.push_back("TheoreticalWeight"); at.colTypes.push_back("delta_ppm"); for (UInt w = 0; w < var_mods.size(); ++w) { at.colTypes.push_back(String(var_mods[w]).substitute(' ', '_')); } std::vector<double> deltas; //~ prot_ids[0].getSearchParameters(); for (vector<PeptideIdentification>::iterator it = pep_ids.begin(); it != pep_ids.end(); ++it) { if (it->getHits().size() > 0) { std::vector<String> row; row.push_back(it->getRT()); row.push_back(it->getMZ()); PeptideHit tmp = it->getHits().front(); //TODO depends on score & sort vector<UInt> pep_mods; for (UInt w = 0; w < var_mods.size(); ++w) { pep_mods.push_back(0); } for (AASequence::ConstIterator z = tmp.getSequence().begin(); z != tmp.getSequence().end(); ++z) { Residue res = *z; String temp; if (res.getModification().size() > 0 && res.getModification() != "Carbamidomethyl") { temp = res.getModification() + " (" + res.getOneLetterCode() + ")"; //cout<<res.getModification()<<endl; for (UInt w = 0; w < var_mods.size(); ++w) { if (temp == var_mods[w]) { //cout<<temp; pep_mods[w] += 1; } } } } row.push_back(tmp.getScore()); row.push_back(tmp.getSequence().toString().removeWhitespaces()); row.push_back(tmp.getCharge()); row.push_back(String((tmp.getSequence().getMonoWeight() + tmp.getCharge() * Constants::PROTON_MASS_U) / tmp.getCharge())); double dppm = /* std::abs */ (getMassDifference(((tmp.getSequence().getMonoWeight() + tmp.getCharge() * Constants::PROTON_MASS_U) / tmp.getCharge()), it->getMZ(), true)); row.push_back(String(dppm)); deltas.push_back(dppm); for (UInt w = 0; w < var_mods.size(); ++w) { row.push_back(pep_mods[w]); } at.tableRows.push_back(row); } } qcmlfile.addRunAttachment(base_name, at); qp = QcMLFile::QualityParameter(); qp.cvRef = "QC"; ///< cv reference qp.cvAcc = "QC:0000040"; ///< cv accession qp.id = base_name + "_mean_delta"; ///< Identifier qp.value = String(OpenMS::Math::mean(deltas.begin(), deltas.end())); try { const ControlledVocabulary::CVTerm& term = cv.getTerm(qp.cvAcc); qp.name = term.name; ///< Name } catch (...) { qp.name = "mean delta ppm"; ///< Name } qcmlfile.addRunQualityParameter(base_name, qp); qp = QcMLFile::QualityParameter(); qp.cvRef = "QC"; ///< cv reference qp.cvAcc = "QC:0000041"; ///< cv accession qp.id = base_name + "_median_delta"; ///< Identifier qp.value = String(OpenMS::Math::median(deltas.begin(), deltas.end(), false)); try { const ControlledVocabulary::CVTerm& term = cv.getTerm(qp.cvAcc); qp.name = term.name; ///< Name } catch (...) { qp.name = "median delta ppm"; ///< Name } qcmlfile.addRunQualityParameter(base_name, qp); qp = QcMLFile::QualityParameter(); qp.cvRef = "QC"; ///< cv reference qp.cvAcc = "QC:0000035"; ///< cv accession qp.id = base_name + "_ratio_id"; ///< Identifier qp.value = String(double(pep_ids.size()) / double(mslevelcounts[2])); try { const ControlledVocabulary::CVTerm& term = cv.getTerm(qp.cvAcc); qp.name = term.name; ///< Name } catch (...) { qp.name = "id ratio"; ///< Name } qcmlfile.addRunQualityParameter(base_name, qp); } //------------------------------------------------------------- // MS quantitation //------------------------------------------------------------ FeatureMap map; String msqu_ref = base_name + "_msqu"; if (inputfile_feature != "") { FeatureXMLFile f; f.load(inputfile_feature, map); cout << "Read featureXML file..." << endl; //~ UInt fiter = 0; map.sortByRT(); map.updateRanges(); qp = QcMLFile::QualityParameter(); qp.cvRef = "QC"; ///< cv reference qp.cvAcc = "QC:0000045"; ///< cv accession qp.id = msqu_ref; ///< Identifier try { const ControlledVocabulary::CVTerm& term = cv.getTerm(qp.cvAcc); qp.name = term.name; ///< Name } catch (...) { qp.name = "MS quantification result details"; ///< Name } qcmlfile.addRunQualityParameter(base_name, qp); qp = QcMLFile::QualityParameter(); qp.cvRef = "QC"; ///< cv reference qp.cvAcc = "QC:0000046"; ///< cv accession qp.id = base_name + "_feature_count"; ///< Identifier qp.value = String(map.size()); try { const ControlledVocabulary::CVTerm& term = cv.getTerm(qp.cvAcc); qp.name = term.name; ///< Name } catch (...) { qp.name = "number of features"; ///< Name } qcmlfile.addRunQualityParameter(base_name, qp); } if (inputfile_feature != "" && !remove_duplicate_features) { QcMLFile::Attachment at; at = QcMLFile::Attachment(); at.cvRef = "QC"; ///< cv reference at.cvAcc = "QC:0000047"; at.qualityRef = msqu_ref; at.id = base_name + "_features"; ///< Identifier try { const ControlledVocabulary::CVTerm& term = cv.getTerm(at.cvAcc); at.name = term.name; ///< Name } catch (...) { at.name = "features"; ///< Name } at.colTypes.push_back("MZ"); at.colTypes.push_back("RT"); at.colTypes.push_back("Intensity"); at.colTypes.push_back("Charge"); at.colTypes.push_back("Quality"); at.colTypes.push_back("FWHM"); at.colTypes.push_back("IDs"); UInt fiter = 0; map.sortByRT(); //ofstream out(outputfile_name.c_str()); while (fiter < map.size()) { std::vector<String> row; row.push_back(map[fiter].getMZ()); row.push_back(map[fiter].getRT()); row.push_back(map[fiter].getIntensity()); row.push_back(map[fiter].getCharge()); row.push_back(map[fiter].getOverallQuality()); row.push_back(map[fiter].getWidth()); row.push_back(map[fiter].getPeptideIdentifications().size()); fiter++; at.tableRows.push_back(row); } qcmlfile.addRunAttachment(base_name, at); } else if (inputfile_feature != "" && remove_duplicate_features) { QcMLFile::Attachment at; at = QcMLFile::Attachment(); at.cvRef = "QC"; ///< cv reference at.cvAcc = "QC:0000047"; at.qualityRef = msqu_ref; at.id = base_name + "_features"; ///< Identifier try { const ControlledVocabulary::CVTerm& term = cv.getTerm(at.cvAcc); at.name = term.name; ///< Name } catch (...) { at.name = "features"; ///< Name } at.colTypes.push_back("MZ"); at.colTypes.push_back("RT"); at.colTypes.push_back("Intensity"); at.colTypes.push_back("Charge"); FeatureMap map, map_out; FeatureXMLFile f; f.load(inputfile_feature, map); UInt fiter = 0; map.sortByRT(); while (fiter < map.size()) { FeatureMap map_tmp; for (UInt k = fiter; k <= map.size(); ++k) { if (abs(map[fiter].getRT() - map[k].getRT()) < 0.1) { //~ cout << fiter << endl; map_tmp.push_back(map[k]); } else { fiter = k; break; } } map_tmp.sortByMZ(); UInt retif = 1; map_out.push_back(map_tmp[0]); while (retif < map_tmp.size()) { if (abs(map_tmp[retif].getMZ() - map_tmp[retif - 1].getMZ()) > 0.01) { cout << "equal RT, but mass different" << endl; map_out.push_back(map_tmp[retif]); } retif++; } } qcmlfile.addRunAttachment(base_name, at); } if (inputfile_consensus != "") { cout << "Reading consensusXML file..." << endl; ConsensusXMLFile f; ConsensusMap map; f.load(inputfile_consensus, map); //~ String CONSENSUS_NAME = "_consensus.tsv"; //~ String combined_out = outputfile_name + CONSENSUS_NAME; //~ ofstream out(combined_out.c_str()); at = QcMLFile::Attachment(); qp.name = "consensuspoints"; ///< Name //~ qp.id = base_name + "_consensuses"; ///< Identifier qp.cvRef = "QC"; ///< cv reference qp.cvAcc = "QC:xxxxxxxx"; ///< cv accession "featuremapper results" at.colTypes.push_back("Native_spectrum_ID"); at.colTypes.push_back("DECON_RT_(sec)"); at.colTypes.push_back("DECON_MZ_(Th)"); at.colTypes.push_back("DECON_Intensity"); at.colTypes.push_back("Feature_RT_(sec)"); at.colTypes.push_back("Feature_MZ_(Th)"); at.colTypes.push_back("Feature_Intensity"); at.colTypes.push_back("Feature_Charge"); for (ConsensusMap::const_iterator cmit = map.begin(); cmit != map.end(); ++cmit) { const ConsensusFeature& CF = *cmit; for (ConsensusFeature::const_iterator cfit = CF.begin(); cfit != CF.end(); ++cfit) { std::vector<String> row; FeatureHandle FH = *cfit; row.push_back(CF.getMetaValue("spectrum_native_id")); row.push_back(CF.getRT()); row.push_back(CF.getMZ()); row.push_back(CF.getIntensity()); row.push_back(FH.getRT()); row.push_back(FH.getMZ()); row.push_back(FH.getCharge()); at.tableRows.push_back(row); } } qcmlfile.addRunAttachment(base_name, at); } //------------------------------------------------------------- // finalize //------------------------------------------------------------ qcmlfile.store(outputfile_name); return EXECUTION_OK; }