ExitCodes main_(int, const char**) { // instance specific location of settings in INI file (e.g. 'TOPP_Skeleton:1:') String ini_location; // path to the log file String logfile(getStringOption_("log")); String xtandem_executable(getStringOption_("xtandem_executable")); String inputfile_name; String outputfile_name; //------------------------------------------------------------- // parsing parameters //------------------------------------------------------------- inputfile_name = getStringOption_("in"); writeDebug_(String("Input file: ") + inputfile_name, 1); if (inputfile_name == "") { writeLog_("No input file specified. Aborting!"); printUsage_(); return ILLEGAL_PARAMETERS; } outputfile_name = getStringOption_("out"); writeDebug_(String("Output file: ") + outputfile_name, 1); if (outputfile_name == "") { writeLog_("No output file specified. Aborting!"); printUsage_(); return ILLEGAL_PARAMETERS; } // write input xml file String temp_directory = QDir::toNativeSeparators((File::getTempDirectory() + "/" + File::getUniqueName() + "/").toQString()); // body for the tmp files { QDir d; d.mkpath(temp_directory.toQString()); } String input_filename(temp_directory + "_tandem_input_file.xml"); String tandem_input_filename(temp_directory + "_tandem_input_file.mzData"); String tandem_output_filename(temp_directory + "_tandem_output_file.xml"); String tandem_taxonomy_filename(temp_directory + "_tandem_taxonomy_file.xml"); //------------------------------------------------------------- // Validate user parameters //------------------------------------------------------------- if (getIntOption_("min_precursor_charge") > getIntOption_("max_precursor_charge")) { LOG_ERROR << "Given charge range is invalid: max_precursor_charge needs to be >= min_precursor_charge." << std::endl; return ILLEGAL_PARAMETERS; } //------------------------------------------------------------- // reading input //------------------------------------------------------------- String db_name(getStringOption_("database")); if (!File::readable(db_name)) { String full_db_name; try { full_db_name = File::findDatabase(db_name); } catch (...) { printUsage_(); return ILLEGAL_PARAMETERS; } db_name = full_db_name; } PeakMap exp; MzMLFile mzml_file; mzml_file.getOptions().addMSLevel(2); // only load msLevel 2 mzml_file.setLogType(log_type_); mzml_file.load(inputfile_name, exp); if (exp.getSpectra().empty()) { throw OpenMS::Exception::FileEmpty(__FILE__, __LINE__, __FUNCTION__, "Error: No MS2 spectra in input file."); } // determine type of spectral data (profile or centroided) SpectrumSettings::SpectrumType spectrum_type = exp[0].getType(); if (spectrum_type == SpectrumSettings::RAWDATA) { if (!getFlag_("force")) { throw OpenMS::Exception::IllegalArgument(__FILE__, __LINE__, __FUNCTION__, "Error: Profile data provided but centroided MS2 spectra expected. To enforce processing of the data set the -force flag."); } } // we need to replace the native id with a simple numbering schema, to be able to // map the IDs back to the spectra (RT, and MZ information) Size native_id(0); for (PeakMap::Iterator it = exp.begin(); it != exp.end(); ++it) { it->setNativeID(++native_id); } // We store the file in mzData file format, because MGF files somehow produce in most // of the cases IDs with charge 2+. We do not use the input file directly // because XTandem sometimes stumbles over misleading substrings in the filename, // e.g. mzXML ... MzDataFile mzdata_outfile; mzdata_outfile.store(tandem_input_filename, exp); XTandemInfile infile; infile.setInputFilename(tandem_input_filename); infile.setOutputFilename(tandem_output_filename); ofstream tax_out(tandem_taxonomy_filename.c_str()); tax_out << "<?xml version=\"1.0\"?>" << "\n"; tax_out << "\t<bioml label=\"x! taxon-to-file matching list\">" << "\n"; tax_out << "\t\t<taxon label=\"OpenMS_dummy_taxonomy\">" << "\n"; tax_out << "\t\t\t<file format=\"peptide\" URL=\"" << db_name << "\" />" << "\n"; tax_out << "\t</taxon>" << "\n"; tax_out << "</bioml>" << "\n"; tax_out.close(); infile.setTaxonomyFilename(tandem_taxonomy_filename); if (getStringOption_("precursor_error_units") == "Da") { infile.setPrecursorMassErrorUnit(XTandemInfile::DALTONS); } else { infile.setPrecursorMassErrorUnit(XTandemInfile::PPM); } if (getStringOption_("fragment_error_units") == "Da") { infile.setFragmentMassErrorUnit(XTandemInfile::DALTONS); } else { infile.setFragmentMassErrorUnit(XTandemInfile::PPM); } if (getStringOption_("default_input_file") != "") { infile.load(getStringOption_("default_input_file")); infile.setDefaultParametersFilename(getStringOption_("default_input_file")); } else { String default_file = File::find("CHEMISTRY/XTandem_default_input.xml"); infile.load(default_file); infile.setDefaultParametersFilename(default_file); } infile.setPrecursorMassTolerancePlus(getDoubleOption_("precursor_mass_tolerance")); infile.setPrecursorMassToleranceMinus(getDoubleOption_("precursor_mass_tolerance")); infile.setFragmentMassTolerance(getDoubleOption_("fragment_mass_tolerance")); infile.setMaxPrecursorCharge(getIntOption_("max_precursor_charge")); infile.setNumberOfThreads(getIntOption_("threads")); infile.setModifications(ModificationDefinitionsSet(getStringList_("fixed_modifications"), getStringList_("variable_modifications"))); infile.setTaxon("OpenMS_dummy_taxonomy"); infile.setOutputResults(getStringOption_("output_results")); infile.setMaxValidEValue(getDoubleOption_("max_valid_expect")); infile.setCleavageSite(getStringOption_("cleavage_site")); infile.setNumberOfMissedCleavages(getIntOption_("missed_cleavages")); infile.setRefine(getFlag_("refinement")); infile.setSemiCleavage(getFlag_("semi_cleavage")); bool allow_isotope_error = getStringOption_("allow_isotope_error") == "yes" ? true : false; infile.setAllowIsotopeError(allow_isotope_error); infile.write(input_filename); //------------------------------------------------------------- // calculations //------------------------------------------------------------- int status = QProcess::execute(xtandem_executable.toQString(), QStringList(input_filename.toQString())); // does automatic escaping etc... if (status != 0) { writeLog_("XTandem problem. Aborting! Calling command was: '" + xtandem_executable + " \"" + input_filename + "\"'.\nDoes the !XTandem executable exist?"); // clean temporary files if (this->debug_level_ < 2) { File::removeDirRecursively(temp_directory); LOG_WARN << "Set debug level to >=2 to keep the temporary files at '" << temp_directory << "'" << std::endl; } else { LOG_WARN << "Keeping the temporary files at '" << temp_directory << "'. Set debug level to <2 to remove them." << std::endl; } return EXTERNAL_PROGRAM_ERROR; } vector<ProteinIdentification> protein_ids; ProteinIdentification protein_id; vector<PeptideIdentification> peptide_ids; // read the output of X!Tandem and write it to idXML XTandemXMLFile tandem_output; tandem_output.setModificationDefinitionsSet(ModificationDefinitionsSet(getStringList_("fixed_modifications"), getStringList_("variable_modifications"))); // find the file, because XTandem extends the filename with a timestamp we do not know (exactly) StringList files; File::fileList(temp_directory, "_tandem_output_file*.xml", files); if (files.size() != 1) { throw Exception::FileNotFound(__FILE__, __LINE__, __PRETTY_FUNCTION__, tandem_output_filename); } tandem_output.load(temp_directory + files[0], protein_id, peptide_ids); // now put the RTs into the peptide_ids from the spectrum ids for (vector<PeptideIdentification>::iterator it = peptide_ids.begin(); it != peptide_ids.end(); ++it) { UInt id = (Int)it->getMetaValue("spectrum_id"); --id; // native IDs were written 1-based if (id < exp.size()) { it->setRT(exp[id].getRT()); double pre_mz(0.0); if (!exp[id].getPrecursors().empty()) pre_mz = exp[id].getPrecursors()[0].getMZ(); it->setMZ(pre_mz); //it->removeMetaValue("spectrum_id"); } else { LOG_ERROR << "XTandemAdapter: Error: id '" << id << "' not found in peak map!" << endl; } } //------------------------------------------------------------- // writing output //------------------------------------------------------------- // handle the search parameters ProteinIdentification::SearchParameters search_parameters; search_parameters.db = getStringOption_("database"); search_parameters.charges = "+" + String(getIntOption_("min_precursor_charge")) + "-+" + String(getIntOption_("max_precursor_charge")); ProteinIdentification::PeakMassType mass_type = ProteinIdentification::MONOISOTOPIC; search_parameters.mass_type = mass_type; search_parameters.fixed_modifications = getStringList_("fixed_modifications"); search_parameters.variable_modifications = getStringList_("variable_modifications"); search_parameters.missed_cleavages = getIntOption_("missed_cleavages"); search_parameters.peak_mass_tolerance = getDoubleOption_("fragment_mass_tolerance"); search_parameters.precursor_tolerance = getDoubleOption_("precursor_mass_tolerance"); protein_id.setSearchParameters(search_parameters); protein_id.setSearchEngineVersion(""); protein_id.setSearchEngine("XTandem"); protein_ids.push_back(protein_id); IdXMLFile().store(outputfile_name, protein_ids, peptide_ids); /// Deletion of temporary files if (this->debug_level_ < 2) { File::removeDirRecursively(temp_directory); LOG_WARN << "Set debug level to >=2 to keep the temporary files at '" << temp_directory << "'" << std::endl; } else { LOG_WARN << "Keeping the temporary files at '" << temp_directory << "'. Set debug level to <2 to remove them." << std::endl; } // some stats LOG_INFO << "Statistics:\n" << " identified MS2 spectra: " << peptide_ids.size() << " / " << exp.size() << " = " << int(peptide_ids.size() * 100.0 / exp.size()) << "% (with e-value < " << String(getDoubleOption_("max_valid_expect")) << ")" << std::endl; return EXECUTION_OK; }
ExitCodes main_(int, const char**) { //input file names String in = getStringOption_("in"); String out = getStringOption_("out"); String out_mzq = getStringOption_("out_mzq"); //prevent loading of fragment spectra PeakFileOptions options; options.setMSLevels(vector<Int>(1, 1)); //reading input data MzMLFile f; f.getOptions() = options; f.setLogType(log_type_); PeakMap exp; f.load(in, exp); exp.updateRanges(); if (exp.getSpectra().empty()) { throw OpenMS::Exception::FileEmpty(__FILE__, __LINE__, __FUNCTION__, "Error: No MS1 spectra in input file."); } // determine type of spectral data (profile or centroided) SpectrumSettings::SpectrumType spectrum_type = exp[0].getType(); if (spectrum_type == SpectrumSettings::RAWDATA) { if (!getFlag_("force")) { throw OpenMS::Exception::IllegalArgument(__FILE__, __LINE__, __FUNCTION__, "Error: Profile data provided but centroided spectra expected. To enforce processing of the data set the -force flag."); } } //load seeds FeatureMap seeds; if (getStringOption_("seeds") != "") { FeatureXMLFile().load(getStringOption_("seeds"), seeds); } //setup of FeatureFinder FeatureFinder ff; ff.setLogType(log_type_); // A map for the resulting features FeatureMap features; // get parameters specific for the feature finder Param feafi_param = getParam_().copy("algorithm:", true); writeDebug_("Parameters passed to FeatureFinder", feafi_param, 3); // Apply the feature finder ff.run(FeatureFinderAlgorithmPicked::getProductName(), exp, features, feafi_param, seeds); features.applyMemberFunction(&UniqueIdInterface::setUniqueId); // DEBUG if (debug_level_ > 10) { FeatureMap::Iterator it; for (it = features.begin(); it != features.end(); ++it) { if (!it->isMetaEmpty()) { vector<String> keys; it->getKeys(keys); LOG_INFO << "Feature " << it->getUniqueId() << endl; for (Size i = 0; i < keys.size(); i++) { LOG_INFO << " " << keys[i] << " = " << it->getMetaValue(keys[i]) << endl; } } } } //------------------------------------------------------------- // writing files //------------------------------------------------------------- //annotate output with data processing info addDataProcessing_(features, getProcessingInfo_(DataProcessing::QUANTITATION)); // write features to user specified output file FeatureXMLFile map_file; // Remove detailed convex hull information and subordinate features // (unless requested otherwise) to reduce file size of feature files // unless debugging is turned on. if (debug_level_ < 5) { FeatureMap::Iterator it; for (it = features.begin(); it != features.end(); ++it) { it->getConvexHull().expandToBoundingBox(); for (Size i = 0; i < it->getConvexHulls().size(); ++i) { it->getConvexHulls()[i].expandToBoundingBox(); } it->getSubordinates().clear(); } } map_file.store(out, features); if (!out_mzq.trim().empty()) { MSQuantifications msq(features, exp.getExperimentalSettings(), exp[0].getDataProcessing()); msq.assignUIDs(); MzQuantMLFile file; file.store(out_mzq, msq); } return EXECUTION_OK; }
ExitCodes main_(int, const char**) override { //------------------------------------------------------------- // parsing parameters //------------------------------------------------------------- // do this early, to see if comet is installed String comet_executable = getStringOption_("comet_executable"); String tmp_param = File::getTemporaryFile(); writeLog_("Comet is writing the default parameter file..."); runExternalProcess_(comet_executable.toQString(), QStringList() << "-p" << tmp_param.c_str()); String inputfile_name = getStringOption_("in"); String out = getStringOption_("out"); //------------------------------------------------------------- // reading input //------------------------------------------------------------- String db_name(getStringOption_("database")); if (!File::readable(db_name)) { String full_db_name; try { full_db_name = File::findDatabase(db_name); } catch (...) { printUsage_(); return ILLEGAL_PARAMETERS; } db_name = full_db_name; } //tmp_dir String tmp_dir = makeAutoRemoveTempDirectory_(); String tmp_pepxml = tmp_dir + "result.pep.xml"; String tmp_pin = tmp_dir + "result.pin"; String default_params = getStringOption_("default_params_file"); String tmp_file; //default params given or to be written if (default_params.empty()) { tmp_file = tmp_dir + "param.txt"; ofstream os(tmp_file.c_str()); createParamFile_(os); os.close(); } else { tmp_file = default_params; } PeakMap exp; MzMLFile mzml_file; mzml_file.getOptions().setMSLevels({2}); // only load msLevel 2 mzml_file.setLogType(log_type_); mzml_file.load(inputfile_name, exp); if (exp.getSpectra().empty()) { throw OpenMS::Exception::FileEmpty(__FILE__, __LINE__, __FUNCTION__, "Error: No MS2 spectra in input file."); } // determine type of spectral data (profile or centroided) SpectrumSettings::SpectrumType spectrum_type = exp[0].getType(); if (spectrum_type == SpectrumSettings::PROFILE) { if (!getFlag_("force")) { throw OpenMS::Exception::IllegalArgument(__FILE__, __LINE__, __FUNCTION__, "Error: Profile data provided but centroided MS2 spectra expected. To enforce processing of the data set the -force flag."); } } //------------------------------------------------------------- // calculations //------------------------------------------------------------- String paramP = "-P" + tmp_file; String paramN = "-N" + File::removeExtension(File::removeExtension(tmp_pepxml)); QStringList arguments; arguments << paramP.toQString() << paramN.toQString() << inputfile_name.toQString(); //------------------------------------------------------------- // run comet //------------------------------------------------------------- // Comet execution with the executable and the arguments StringList TOPPBase::ExitCodes exit_code = runExternalProcess_(comet_executable.toQString(), arguments); if (exit_code != EXECUTION_OK) { return exit_code; } //------------------------------------------------------------- // writing IdXML output //------------------------------------------------------------- // read the pep.xml put of Comet and write it to idXML vector<PeptideIdentification> peptide_identifications; vector<ProteinIdentification> protein_identifications; writeDebug_("load PepXMLFile", 1); PepXMLFile().load(tmp_pepxml, protein_identifications, peptide_identifications); writeDebug_("write idXMLFile", 1); writeDebug_(out, 1); IdXMLFile().store(out, protein_identifications, peptide_identifications); //------------------------------------------------------------- // create (move) optional pin output //------------------------------------------------------------- String pin_out = getStringOption_("pin_out"); if (!pin_out.empty()) { // move the temporary file to the actual destination: if (!File::rename(tmp_pin, pin_out)) { return CANNOT_WRITE_OUTPUT_FILE; } } return EXECUTION_OK; }
ExitCodes main_(int, const char**) override { String tmp_dir = QDir::toNativeSeparators((File::getTempDirectory() + "/" + File::getUniqueName() + "/").toQString()); // body for the tmp files { QDir d; d.mkpath(tmp_dir.toQString()); } String logfile(getStringOption_("log")); String myrimatch_executable(getStringOption_("myrimatch_executable")); //------------------------------------------------------------- // get version of MyriMatch //------------------------------------------------------------- QProcess qp; String myrimatch_version; MyriMatchVersion myrimatch_version_i; // we invoke myrimatch w/o arguments. that yields a return code != 0. but // there is no other way for version 2.1 to get the version number qp.start(myrimatch_executable.toQString(), QStringList(), QIODevice::ReadOnly); // does automatic escaping etc... qp.waitForFinished(); String output(QString(qp.readAllStandardOutput())); vector<String> lines; vector<String> version_split; output.split('\n', lines); // the version number is expected to be in the second line if (lines.size() < 2) { writeLog_("Warning: MyriMatch version output (" + output + ") not formatted as expected!"); return EXTERNAL_PROGRAM_ERROR; } // the version is expected to be something like: // MyriMatch 2.1.111 (2011-12-27) lines[1].split(' ', version_split); if (version_split.size() == 3 && getVersion_(version_split[1], myrimatch_version_i)) { myrimatch_version = version_split[1].removeWhitespaces(); writeDebug_("Setting MyriMatch version to " + myrimatch_version, 1); } else { writeLog_("Warning: MyriMatch version output (" + output + ") not formatted as expected!"); return EXTERNAL_PROGRAM_ERROR; } if (! ( (myrimatch_version_i.myrimatch_major == 2) && // major must be 2 (myrimatch_version_i.myrimatch_minor == 1 || myrimatch_version_i.myrimatch_minor == 2) // minor .1 or .2 )) { writeLog_("Warning: unsupported MyriMatch version (" + myrimatch_version + "). Tested only for MyriMatch 2.1.x and 2.2.x." "\nIf you encounter parameter errors, you can try the flag 'ignoreConfigErrors', but be aware that MyriMatch might be misconfigured."); } //------------------------------------------------------------- // parsing parameters //------------------------------------------------------------- String inputfile_name = File::absolutePath(getStringOption_("in")); String outputfile_name = getStringOption_("out"); String db_name = File::absolutePath(String(getStringOption_("database"))); // building parameter String StringList parameters; if (getFlag_("ignoreConfigErrors")) parameters << "-ignoreConfigErrors"; // Common Identification engine options StringList static_mod_list; StringList dynamic_mod_list; translateModifications(static_mod_list, dynamic_mod_list); if (!static_mod_list.empty()) parameters << "-StaticMods" << ListUtils::concatenate(static_mod_list, " "); if (!dynamic_mod_list.empty()) parameters << "-DynamicMods" << ListUtils::concatenate(dynamic_mod_list, " "); parameters << "-ProteinDatabase" << File::absolutePath(db_name); if (getFlag_("precursor_mass_tolerance_avg")) { parameters << "-AvgPrecursorMzTolerance"; } else { parameters << "-MonoPrecursorMzTolerance"; } String precursor_mass_tolerance_unit = getStringOption_("precursor_mass_tolerance_unit") == "Da" ? " m/z" : " ppm"; parameters << String(getDoubleOption_("precursor_mass_tolerance")) + precursor_mass_tolerance_unit; String fragment_mass_tolerance_unit = getStringOption_("fragment_mass_tolerance_unit"); if (fragment_mass_tolerance_unit == "Da") { fragment_mass_tolerance_unit = "m/z"; } parameters << "-FragmentMzTolerance" << String(getDoubleOption_("fragment_mass_tolerance")) + " " + fragment_mass_tolerance_unit; StringList slf = getStringList_("SpectrumListFilters"); if (slf.size() > 0) { if (myrimatch_version_i.myrimatch_minor <= 1) { // use quotes around the slf arguments (will be added automatically by Qt during call), i.e. "-SpectrumListFilters" "peakPicking false 2-" parameters << "-SpectrumListFilters" << ListUtils::concatenate(slf, ";") << ""; } else { // no quotes -- pass a single argument, i.e. "-SpectrumListFilters peakPicking false 2-" parameters << "-SpectrumListFilters " + ListUtils::concatenate(slf, ";") << ""; } } //parameters << "-ThreadCountMultiplier" << String(getIntOption_("threads")); // MyriMatch does not recognise this, even though it's in the manual. // MyriMatch specific parameters parameters << "-NumChargeStates" << getIntOption_("NumChargeStates"); parameters << "-TicCutoffPercentage" << String(getDoubleOption_("TicCutoffPercentage")); parameters << "-MaxDynamicMods" << getIntOption_("MaxDynamicMods"); parameters << "-MaxResultRank" << getIntOption_("MaxResultRank"); parameters << "-MinTerminiCleavages" << getIntOption_("MinTerminiCleavages"); parameters << "-MaxMissedCleavages" << getIntOption_("MaxMissedCleavages"); String cleavage_rule = getStringOption_("CleavageRules"); if (cleavage_rule.empty()) { cleavage_rule = "Trypsin/P"; } parameters << "-CleavageRules" << cleavage_rule; // advanced parameters parameters << "-MinPeptideMass" << getDoubleOption_("MinPeptideMass"); parameters << "-MaxPeptideMass" << getDoubleOption_("MaxPeptideMass"); parameters << "-MinPeptideLength" << getIntOption_("MinPeptideLength"); parameters << "-MaxPeptideLength" << getIntOption_("MaxPeptideLength"); parameters << "-NumIntensityClasses" << getIntOption_("NumIntensityClasses"); parameters << "-ClassSizeMultiplier" << getDoubleOption_("ClassSizeMultiplier"); parameters << "-MonoisotopeAdjustmentSet" << getStringOption_("MonoisotopeAdjustmentSet"); parameters << "-cpus" << getIntOption_("threads"); // Constant parameters // DecoyPrefix worked only when set through the config file String cfg_file = tmp_dir + "myrimatch.cfg"; ofstream f(cfg_file.c_str()); f << "DecoyPrefix=\"\"\n"; f.close(); parameters << "-cfg" << cfg_file; // path to input file must be the last parameter parameters << inputfile_name; //------------------------------------------------------------- // calculations //------------------------------------------------------------- QStringList qparam; writeDebug_("MyriMatch arguments:", 1); writeDebug_(String("\"") + ListUtils::concatenate(parameters, "\" \"") + "\"", 1); for (Size i = 0; i < parameters.size(); ++i) { qparam << parameters[i].toQString(); } QProcess process; // Bad style, because it breaks relative paths? process.setWorkingDirectory(tmp_dir.toQString()); process.start(myrimatch_executable.toQString(), qparam, QIODevice::ReadOnly); bool success = process.waitForFinished(-1); String myri_msg(QString(process.readAllStandardOutput())); String myri_err(QString(process.readAllStandardError())); writeDebug_(myri_msg, 1); writeDebug_(myri_err, 0); if (!success || process.exitStatus() != 0 || process.exitCode() != 0) { writeLog_("Error: MyriMatch problem! (Details can be seen in the logfile: \"" + logfile + "\")"); writeLog_("Note: This message can also be triggered if you run out of space in your tmp directory"); return EXTERNAL_PROGRAM_ERROR; } //------------------------------------------------------------- // reading MyriMatch output //------------------------------------------------------------- writeDebug_("Reading output of MyriMatch", 5); String exp_name = File::basename(inputfile_name); String pep_file = tmp_dir + File::removeExtension(exp_name) + ".pepXML"; vector<ProteinIdentification> protein_identifications; vector<PeptideIdentification> peptide_identifications; PeakMap exp; if (File::exists(pep_file)) { MzMLFile fh; fh.load(inputfile_name, exp); SpectrumMetaDataLookup lookup; lookup.readSpectra(exp.getSpectra()); PepXMLFile().load(pep_file, protein_identifications, peptide_identifications, exp_name, lookup); } else { writeLog_("Error: MyriMatch problem! No pepXML output file (expected as '" + pep_file + "') was generated by MyriMatch."); writeLog_("Note: This message can be triggered if no MS2 spectra were found or no identifications were made."); writeLog_(" Myrimatch expects MS2 spectra in mzML files to contain the MSn tag. MSSpectrum with MS level 2 is not sufficient. You can use FileConverter to create such an mzML file by converting from mzML --> mzXML --> mzML."); return EXTERNAL_PROGRAM_ERROR; } if (debug_level_ == 0) { QFile(pep_file.toQString()).remove(); QFile(cfg_file.toQString()).remove(); } else { writeDebug_(String("Not removing '") + pep_file + "' for debugging purposes. Please delete manually!", 1); writeDebug_(String("Not removing '") + cfg_file + "' for debugging purposes. Please delete manually!", 1); } //------------------------------------------------------------- // writing results //------------------------------------------------------------- ProteinIdentification::SearchParameters search_parameters; search_parameters.db = getStringOption_("database"); ProteinIdentification::PeakMassType mass_type = getFlag_("precursor_mass_tolerance_avg") == true ? ProteinIdentification::AVERAGE : ProteinIdentification::MONOISOTOPIC; search_parameters.mass_type = mass_type; search_parameters.fixed_modifications = getStringList_("fixed_modifications"); search_parameters.variable_modifications = getStringList_("variable_modifications"); search_parameters.missed_cleavages = getIntOption_("MaxMissedCleavages"); search_parameters.fragment_mass_tolerance = getDoubleOption_("fragment_mass_tolerance"); search_parameters.precursor_mass_tolerance = getDoubleOption_("precursor_mass_tolerance"); search_parameters.precursor_mass_tolerance_ppm = getStringOption_("precursor_mass_tolerance_unit") == "ppm" ? true : false; search_parameters.fragment_mass_tolerance_ppm = getStringOption_("fragment_mass_tolerance_unit") == "ppm" ? true : false; protein_identifications[0].setSearchParameters(search_parameters); protein_identifications[0].setSearchEngineVersion(myrimatch_version); protein_identifications[0].setSearchEngine("MyriMatch"); if (!protein_identifications.empty()) { StringList ms_runs; exp.getPrimaryMSRunPath(ms_runs); protein_identifications[0].setPrimaryMSRunPath(ms_runs); } IdXMLFile().store(outputfile_name, protein_identifications, peptide_identifications); return EXECUTION_OK; }
ExitCodes main_(int argc, const char** argv) { //------------------------------------------------------------- // parameter handling //------------------------------------------------------------- //input/output files String in(getStringOption_("in")), out(getStringOption_("out")); FileHandler fh; FileTypes::Type in_type = fh.getType(in); //------------------------------------------------------------- // loading input //------------------------------------------------------------- PeakMap exp; // keep only MS2 spectra fh.getOptions().addMSLevel(2); fh.loadExperiment(in, exp, in_type, log_type_); writeDebug_(String("Spectra loaded: ") + exp.size(), 2); if (exp.getSpectra().empty()) { throw OpenMS::Exception::FileEmpty(__FILE__, __LINE__, __FUNCTION__, "Error: No MS2 spectra in input file."); } // determine type of spectral data (profile or centroided) SpectrumSettings::SpectrumType spectrum_type = exp[0].getType(); if (spectrum_type == SpectrumSettings::RAWDATA) { if (!getFlag_("force")) { throw OpenMS::Exception::IllegalArgument(__FILE__, __LINE__, __FUNCTION__, "Error: Profile data provided but centroided MS2 spectra expected. To enforce processing of the data set the -force flag."); } } //------------------------------------------------------------- // calculations //------------------------------------------------------------- Param mascot_param = getParam_().copy("Mascot_parameters:", true); MascotGenericFile mgf_file; Param p; // TODO: switch this to mzML (much smaller) p.setValue("internal:format", "Mascot generic", "Sets the format type of the peak list, this should not be changed unless you write the header only.", ListUtils::create<String>("advanced")); p.setValue("internal:HTTP_format", "true", "Write header with MIME boundaries instead of simple key-value pairs. For HTTP submission only.", ListUtils::create<String>("advanced")); p.setValue("internal:content", "all", "Use parameter header + the peak lists with BEGIN IONS... or only one of them.", ListUtils::create<String>("advanced")); mgf_file.setParameters(mascot_param); // get the spectra into string stream writeDebug_("Writing MGF file to stream", 1); stringstream ss; mgf_file.store(ss, in, exp, true); // write in compact format // Usage of a QCoreApplication is overkill here (and ugly too), but we just use the // QEventLoop to process the signals and slots and grab the results afterwards from // the MascotRemotQuery instance char** argv2 = const_cast<char**>(argv); QCoreApplication event_loop(argc, argv2); MascotRemoteQuery* mascot_query = new MascotRemoteQuery(&event_loop); Param mascot_query_param = getParam_().copy("Mascot_server:", true); writeDebug_("Setting parameters for Mascot query", 1); mascot_query->setParameters(mascot_query_param); writeDebug_("Setting spectra for Mascot query", 1); mascot_query->setQuerySpectra(ss.str()); // remove unnecessary spectra ss.clear(); QObject::connect(mascot_query, SIGNAL(done()), &event_loop, SLOT(quit())); QTimer::singleShot(1000, mascot_query, SLOT(run())); writeDebug_("Fire off Mascot query", 1); event_loop.exec(); writeDebug_("Mascot query finished", 1); if (mascot_query->hasError()) { writeLog_("An error occurred during the query: " + mascot_query->getErrorMessage()); delete mascot_query; return EXTERNAL_PROGRAM_ERROR; } // write Mascot response to file String mascot_tmp_file_name(File::getTempDirectory() + "/" + File::getUniqueName() + "_Mascot_response"); QFile mascot_tmp_file(mascot_tmp_file_name.c_str()); mascot_tmp_file.open(QIODevice::WriteOnly); mascot_tmp_file.write(mascot_query->getMascotXMLResponse()); mascot_tmp_file.close(); // clean up delete mascot_query; vector<PeptideIdentification> pep_ids; ProteinIdentification prot_id; // set up mapping between scan numbers and retention times: MascotXMLFile::RTMapping rt_mapping; MascotXMLFile::generateRTMapping(exp.begin(), exp.end(), rt_mapping); // read the response MascotXMLFile().load(mascot_tmp_file_name, prot_id, pep_ids, rt_mapping); writeDebug_("Read " + String(pep_ids.size()) + " peptide ids and " + String(prot_id.getHits().size()) + " protein identifications from Mascot", 5); // for debugging errors relating to unexpected response files if (this->debug_level_ >= 100) { writeDebug_(String("\nMascot Server Response file saved to: '") + mascot_tmp_file_name + "'. If an error occurs, send this file to the OpenMS team.\n", 100); } else { // delete file mascot_tmp_file.remove(); } // keep or delete protein identifications?! vector<ProteinIdentification> prot_ids; if (!getFlag_("keep_protein_links")) { // remove protein links from peptides for (Size i = 0; i < pep_ids.size(); ++i) { std::vector<PeptideHit> hits = pep_ids[i].getHits(); for (Size h = 0; h < hits.size(); ++h) { hits[h].setPeptideEvidences(vector<PeptideEvidence>()); } pep_ids[i].setHits(hits); } // remove proteins std::vector<ProteinHit> p_hit; prot_id.setHits(p_hit); } prot_ids.push_back(prot_id); //------------------------------------------------------------- // writing output //------------------------------------------------------------- IdXMLFile().store(out, prot_ids, pep_ids); return EXECUTION_OK; }