OpenMS  2.4.0
OpenSwathBase.h
Go to the documentation of this file.
1 // --------------------------------------------------------------------------
2 // OpenMS -- Open-Source Mass Spectrometry
3 // --------------------------------------------------------------------------
4 // Copyright The OpenMS Team -- Eberhard Karls University Tuebingen,
5 // ETH Zurich, and Freie Universitaet Berlin 2002-2017.
6 //
7 // This software is released under a three-clause BSD license:
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above copyright
11 // notice, this list of conditions and the following disclaimer in the
12 // documentation and/or other materials provided with the distribution.
13 // * Neither the name of any author or any participating institution
14 // may be used to endorse or promote products derived from this software
15 // without specific prior written permission.
16 // For a full list of authors, refer to the file AUTHORS.
17 // --------------------------------------------------------------------------
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 // ARE DISCLAIMED. IN NO EVENT SHALL ANY OF THE AUTHORS OR THE CONTRIBUTING
22 // INSTITUTIONS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
25 // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
27 // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
28 // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 //
30 // --------------------------------------------------------------------------
31 // $Maintainer: Hannes Roest$
32 // $Authors: Hannes Roest$
33 // --------------------------------------------------------------------------
34 
35 #pragma once
36 
37 // Consumers
40 
41 // Files
45 #include <OpenMS/FORMAT/MzMLFile.h>
54 
55 // Kernel and implementations
61 
62 // Helpers
66 
67 // Algorithms
73 
75 
76 #include <cassert>
77 #include <limits>
78 
79 
81 
82 
83 
84 namespace OpenMS
85 {
86 
88  public TOPPBase
89 {
90 
91 public:
92 
93  TOPPOpenSwathBase(String name, String description, bool official = true) :
94  TOPPBase(name, description, official)
95  {
96  }
97 
98 private:
99 
100  void loadSwathFiles_(const StringList& file_list,
101  const bool split_file,
102  const String& tmp,
103  const String& readoptions,
104  boost::shared_ptr<ExperimentalSettings > & exp_meta,
105  std::vector< OpenSwath::SwathMap > & swath_maps,
106  Interfaces::IMSDataConsumer* plugin_consumer)
107  {
108  SwathFile swath_file;
109  swath_file.setLogType(log_type_);
110 
111  if (split_file || file_list.size() > 1)
112  {
113  // TODO cannot use data reduction here any more ...
114  swath_maps = swath_file.loadSplit(file_list, tmp, exp_meta, readoptions);
115  }
116  else
117  {
118  FileTypes::Type in_file_type = FileHandler::getTypeByFileName(file_list[0]);
119  if (in_file_type == FileTypes::MZML)
120  {
121  swath_maps = swath_file.loadMzML(file_list[0], tmp, exp_meta, readoptions, plugin_consumer);
122  }
123  else if (in_file_type == FileTypes::MZXML)
124  {
125  swath_maps = swath_file.loadMzXML(file_list[0], tmp, exp_meta, readoptions);
126  }
127  else if (in_file_type == FileTypes::SQMASS)
128  {
129  swath_maps = swath_file.loadSqMass(file_list[0], exp_meta);
130  }
131  else
132  {
133  throw Exception::IllegalArgument(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION,
134  "Input file needs to have ending mzML or mzXML");
135  }
136  }
137  }
138 
139 protected:
140 
165  bool loadSwathFiles(const StringList& file_list,
166  boost::shared_ptr<ExperimentalSettings >& exp_meta,
167  std::vector< OpenSwath::SwathMap >& swath_maps,
168  const bool split_file,
169  const String& tmp,
170  const String& readoptions,
171  const String& swath_windows_file,
172  const double min_upper_edge_dist,
173  const bool force,
174  const bool sort_swath_maps,
175  const bool sonar,
176  Interfaces::IMSDataConsumer* plugin_consumer = nullptr)
177  {
178  // (i) Load files
179  loadSwathFiles_(file_list, split_file, tmp, readoptions, exp_meta, swath_maps, plugin_consumer);
180 
181  // (ii) Allow the user to specify the SWATH windows
182  if (!swath_windows_file.empty())
183  {
184  SwathWindowLoader::annotateSwathMapsFromFile(swath_windows_file, swath_maps, sort_swath_maps, force);
185  }
186 
187  for (Size i = 0; i < swath_maps.size(); i++)
188  {
189  LOG_DEBUG << "Found swath map " << i
190  << " with lower " << swath_maps[i].lower
191  << " and upper " << swath_maps[i].upper
192  << " and " << swath_maps[i].sptr->getNrSpectra()
193  << " spectra." << std::endl;
194  }
195 
196  // (iii) Sanity check: there should be no overlap between the windows:
197  std::vector<std::pair<double, double>> sw_windows;
198  for (Size i = 0; i < swath_maps.size(); i++)
199  {
200  if (!swath_maps[i].ms1)
201  {
202  sw_windows.push_back(std::make_pair(swath_maps[i].lower, swath_maps[i].upper));
203  }
204  }
205  // sort by lower bound (first entry in pair)
206  std::sort(sw_windows.begin(), sw_windows.end());
207 
208  for (Size i = 1; i < sw_windows.size(); i++)
209  {
210  double lower_map_end = sw_windows[i-1].second - min_upper_edge_dist;
211  double upper_map_start = sw_windows[i].first;
212  LOG_DEBUG << "Extraction will go up to " << lower_map_end << " and continue at " << upper_map_start << std::endl;
213 
214  if (upper_map_start - lower_map_end > 0.01)
215  {
216  LOG_WARN << "Extraction will have a gap between " << lower_map_end << " and " << upper_map_start << std::endl;
217  if (!force)
218  {
219  LOG_ERROR << "Extraction windows have a gap. Will abort (override with -force)" << std::endl;
220  return false;
221  }
222  }
223 
224  if (sonar) {continue;} // skip next step as expect them to overlap ...
225 
226  if (lower_map_end - upper_map_start > 0.01)
227  {
228  LOG_WARN << "Extraction will overlap between " << lower_map_end << " and " << upper_map_start << "!\n"
229  << "This will lead to multiple extraction of the transitions in the overlapping region "
230  << "which will lead to duplicated output. It is very unlikely that you want this." << "\n"
231  << "Please fix this by providing an appropriate extraction file with -swath_windows_file" << std::endl;
232  if (!force)
233  {
234  LOG_ERROR << "Extraction windows overlap. Will abort (override with -force)" << std::endl;
235  return false;
236  }
237  }
238  }
239  return true;
240  }
241 
255  void prepareChromOutput(Interfaces::IMSDataConsumer ** chromatogramConsumer,
256  const boost::shared_ptr<ExperimentalSettings>& exp_meta,
257  const OpenSwath::LightTargetedExperiment& transition_exp,
258  const String& out_chrom)
259  {
260  if (!out_chrom.empty())
261  {
262  if (out_chrom.hasSuffix(".sqMass"))
263  {
264  bool full_meta = false; // can lead to very large files in memory
265  bool lossy_compression = true;
266  *chromatogramConsumer = new MSDataSqlConsumer(out_chrom, 500, full_meta, lossy_compression);
267  }
268  else
269  {
270  PlainMSDataWritingConsumer * chromConsumer = new PlainMSDataWritingConsumer(out_chrom);
271  int expected_chromatograms = transition_exp.transitions.size();
272  chromConsumer->setExpectedSize(0, expected_chromatograms);
273  chromConsumer->setExperimentalSettings(*exp_meta);
274  chromConsumer->getOptions().setWriteIndex(true); // ensure that we write the index
276 
277  // prepare data structures for lossy compression
279  MSNumpressCoder::NumpressConfig npconfig_int;
280  npconfig_mz.estimate_fixed_point = true; // critical
281  npconfig_int.estimate_fixed_point = true; // critical
282  npconfig_mz.numpressErrorTolerance = -1.0; // skip check, faster
283  npconfig_int.numpressErrorTolerance = -1.0; // skip check, faster
284  npconfig_mz.setCompression("linear");
285  npconfig_int.setCompression("slof");
286  npconfig_mz.linear_fp_mass_acc = 0.05; // set the desired RT accuracy in seconds
287 
288  chromConsumer->getOptions().setNumpressConfigurationMassTime(npconfig_mz);
289  chromConsumer->getOptions().setNumpressConfigurationIntensity(npconfig_int);
290  chromConsumer->getOptions().setCompression(true);
291 
292  *chromatogramConsumer = chromConsumer;
293  }
294  }
295  else
296  {
297  *chromatogramConsumer = new NoopMSDataWritingConsumer("");
298  }
299  }
300 
310  const String& tr_file,
311  const Param& tsv_reader_param)
312  {
313  OpenSwath::LightTargetedExperiment transition_exp;
314  ProgressLogger progresslogger;
315  progresslogger.setLogType(log_type_);
316  if (tr_type == FileTypes::TRAML)
317  {
318  progresslogger.startProgress(0, 1, "Load TraML file");
319  TargetedExperiment targeted_exp;
320  TraMLFile().load(tr_file, targeted_exp);
321  OpenSwathDataAccessHelper::convertTargetedExp(targeted_exp, transition_exp);
322  progresslogger.endProgress();
323  }
324  else if (tr_type == FileTypes::PQP)
325  {
326  progresslogger.startProgress(0, 1, "Load PQP file");
327  TransitionPQPFile().convertPQPToTargetedExperiment(tr_file.c_str(), transition_exp);
328  progresslogger.endProgress();
329  }
330  else if (tr_type == FileTypes::TSV)
331  {
332  progresslogger.startProgress(0, 1, "Load TSV file");
333  TransitionTSVFile tsv_reader;
334  tsv_reader.setParameters(tsv_reader_param);
335  tsv_reader.convertTSVToTargetedExperiment(tr_file.c_str(), tr_type, transition_exp);
336  progresslogger.endProgress();
337  }
338  else
339  {
340  LOG_ERROR << "Provide valid TraML, TSV or PQP transition file." << std::endl;
341  throw Exception::IllegalArgument(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION, "Need to provide valid input file.");
342  }
343  return transition_exp;
344  }
345 
379  String irt_tr_file,
380  std::vector< OpenSwath::SwathMap > & swath_maps,
381  double min_rsq,
382  double min_coverage,
383  const Param& feature_finder_param,
384  const ChromExtractParams& cp_irt,
385  const Param& irt_detection_param,
386  const String & mz_correction_function,
387  Size debug_level,
388  bool sonar,
389  bool load_into_memory,
390  const String& irt_trafo_out,
391  const String& irt_mzml_out)
392  {
393  TransformationDescription trafo_rtnorm;
394 
395  if (!trafo_in.empty())
396  {
397  // get read RT normalization file
398  TransformationXMLFile trafoxml;
399  trafoxml.load(trafo_in, trafo_rtnorm, false);
400  Param model_params = getParam_().copy("model:", true);
401  model_params.setValue("symmetric_regression", "false");
402  model_params.setValue("span", irt_detection_param.getValue("lowess:span"));
403  model_params.setValue("num_nodes", irt_detection_param.getValue("b_spline:num_nodes"));
404  String model_type = irt_detection_param.getValue("alignmentMethod");
405  trafo_rtnorm.fitModel(model_type, model_params);
406  }
407  else if (!irt_tr_file.empty())
408  {
409  // Loading iRT file
410  std::cout << "Will load iRT transitions and try to find iRT peptides" << std::endl;
411  TraMLFile traml;
412  FileTypes::Type tr_type = FileHandler::getType(irt_tr_file);
413  Param tsv_reader_param = TransitionTSVFile().getDefaults();
414  OpenSwath::LightTargetedExperiment irt_transitions = loadTransitionList(tr_type, irt_tr_file, tsv_reader_param);
415 
416  // perform extraction
418  wf.setLogType(log_type_);
419  trafo_rtnorm = wf.performRTNormalization(irt_transitions, swath_maps, min_rsq, min_coverage,
420  feature_finder_param, cp_irt, irt_detection_param, mz_correction_function, irt_mzml_out,
421  debug_level, sonar, load_into_memory);
422 
423  if (!irt_trafo_out.empty())
424  {
425  TransformationXMLFile().store(irt_trafo_out, trafo_rtnorm);
426  }
427  }
428  return trafo_rtnorm;
429  }
430 
431 
432 };
433 
434 }
435 
437 
438 
Definition: OpenSwathBase.h:87
Type
Actual file types enum.
Definition: FileTypes.h:58
msInspect file (.tsv)
Definition: FileTypes.h:87
void setWriteIndex(bool write_index)
Whether to write an index at the end of the file (e.g. indexedmzML file format)
void setCompression(bool compress)
std::vector< LightTransition > transitions
Definition: TransitionExperiment.h:215
static FileTypes::Type getType(const String &filename)
Tries to determine the file type (by name or content)
void setValue(const String &key, const DataValue &value, const String &description="", const StringList &tags=StringList())
Sets a value.
A more convenient string class.
Definition: String.h:58
ChromatogramExtractor parameters.
Definition: OpenSwathWorkflow.h:82
Consumer class that writes MS data to disk using the mzML format.
Definition: MSDataWritingConsumer.h:240
void endProgress() const
Ends the progress display.
OpenSwath::LightTargetedExperiment loadTransitionList(const FileTypes::Type &tr_type, const String &tr_file, const Param &tsv_reader_param)
Loads transition list from TraML / TSV or PQP.
Definition: OpenSwathBase.h:309
Consumer class that perform no operation.
Definition: MSDataWritingConsumer.h:258
std::vector< OpenSwath::SwathMap > loadMzML(const String &file, const String &tmp, boost::shared_ptr< ExperimentalSettings > &exp_meta, const String &readoptions="normal", Interfaces::IMSDataConsumer *plugin_consumer=nullptr)
Loads a Swath run from a single mzML file.
void setExperimentalSettings(const ExperimentalSettings &exp) override
Set experimental settings for the whole file.
void loadSwathFiles_(const StringList &file_list, const bool split_file, const String &tmp, const String &readoptions, boost::shared_ptr< ExperimentalSettings > &exp_meta, std::vector< OpenSwath::SwathMap > &swath_maps, Interfaces::IMSDataConsumer *plugin_consumer)
Definition: OpenSwathBase.h:100
void setCompression(const std::string &compression)
set compression using a string mapping to enum NumpressCompression.
Definition: MSNumpressCoder.h:111
File adapter for HUPO PSI TraML files.
Definition: TraMLFile.h:63
std::vector< OpenSwath::SwathMap > loadMzXML(String file, String tmp, boost::shared_ptr< ExperimentalSettings > &exp_meta, String readoptions="normal")
Loads a Swath run from a single mzXML file.
void store(String filename, const TransformationDescription &transformation)
Stores the data in an TransformationXML file.
Main OpenMS namespace.
Definition: FeatureDeconvolution.h:46
void setParameters(const Param &param)
Sets the parameters.
Base class for TOPP applications.
Definition: TOPPBase.h:150
#define LOG_DEBUG
Macro for general debugging information.
Definition: LogStream.h:460
Configuration class for MSNumpress.
Definition: MSNumpressCoder.h:87
bool loadSwathFiles(const StringList &file_list, boost::shared_ptr< ExperimentalSettings > &exp_meta, std::vector< OpenSwath::SwathMap > &swath_maps, const bool split_file, const String &tmp, const String &readoptions, const String &swath_windows_file, const double min_upper_edge_dist, const bool force, const bool sort_swath_maps, const bool sonar, Interfaces::IMSDataConsumer *plugin_consumer=nullptr)
Load the DIA files into internal data structures.
Definition: OpenSwathBase.h:165
#define LOG_ERROR
Macro to be used if non-fatal error are reported (processing continues)
Definition: LogStream.h:448
#define LOG_WARN
Macro if a warning, a piece of information which should be read by the user, should be logged...
Definition: LogStream.h:452
double linear_fp_mass_acc
desired mass accuracy for *linear* encoding (-1 no effect, use 0.0001 for 0.2 ppm accuracy @ 500 m/z)...
Definition: MSNumpressCoder.h:93
void fitModel(const String &model_type, const Param &params=Param())
Fits a model to the data.
void convertPQPToTargetedExperiment(const char *filename, OpenMS::TargetedExperiment &targeted_exp, bool legacy_traml_id=false)
Read in a PQP file and construct a targeted experiment (TraML structure)
A data consumer that inserts MS data into a SQLite database.
Definition: MSDataSqlConsumer.h:60
virtual void addDataProcessing(DataProcessing d)
Optionally add a data processing method to each chromatogram and spectrum.
const Param & getDefaults() const
Non-mutable access to the default parameters.
std::vector< OpenSwath::SwathMap > loadSqMass(String file, boost::shared_ptr< ExperimentalSettings > &)
Loads a Swath run from a single sqMass file.
Used to load and store TransformationXML files.
Definition: TransformationXMLFile.h:56
void setNumpressConfigurationMassTime(MSNumpressCoder::NumpressConfig config)
Get numpress configuration options for m/z or rt dimension.
A method or algorithm argument contains illegal values.
Definition: Exception.h:648
File adapter for Swath files.
Definition: SwathFile.h:67
void setLogType(LogType type) const
Sets the progress log that should be used. The default type is NONE!
void setNumpressConfigurationIntensity(MSNumpressCoder::NumpressConfig config)
Get numpress configuration options for intensity dimension.
PeakFileOptions & getOptions()
Get the peak file options.
const DataValue & getValue(const String &key) const
Returns a value of a parameter.
Param copy(const String &prefix, bool remove_prefix=false) const
Returns a new Param object containing all entries that start with prefix.
OpenSWATH Peptide Query Parameter (PQP) SQLite DB.
Definition: FileTypes.h:104
TraML (HUPO PSI format) for transitions (.traML)
Definition: FileTypes.h:81
void setExpectedSize(Size expectedSpectra, Size expectedChromatograms) override
Set expected size of spectra and chromatograms to be written.
static void annotateSwathMapsFromFile(const std::string &filename, std::vector< OpenSwath::SwathMap > &swath_maps, bool do_sort, bool force)
Annotate a Swath map using a Swath window file specifying the individual windows. ...
static void convertTargetedExp(const OpenMS::TargetedExperiment &transition_exp_, OpenSwath::LightTargetedExperiment &transition_exp)
convert from the OpenMS TargetedExperiment to the LightTargetedExperiment
Param const & getParam_() const
Return all parameters relevant to this TOPP tool.
TOPPOpenSwathBase(String name, String description, bool official=true)
Definition: OpenSwathBase.h:93
TransformationDescription performCalibration(String trafo_in, String irt_tr_file, std::vector< OpenSwath::SwathMap > &swath_maps, double min_rsq, double min_coverage, const Param &feature_finder_param, const ChromExtractParams &cp_irt, const Param &irt_detection_param, const String &mz_correction_function, Size debug_level, bool sonar, bool load_into_memory, const String &irt_trafo_out, const String &irt_mzml_out)
Perform retention time and m/z calibration.
Definition: OpenSwathBase.h:378
std::vector< String > StringList
Vector of String.
Definition: ListUtils.h:73
Management and storage of parameters / INI files.
Definition: Param.h:74
std::vector< OpenSwath::SwathMap > loadSplit(StringList file_list, String tmp, boost::shared_ptr< ExperimentalSettings > &exp_meta, String readoptions="normal")
Loads a Swath run from a list of split mzML files.
bool estimate_fixed_point
whether to estimate the fixed point or use the one proved with numpressFixedPoint ...
Definition: MSNumpressCoder.h:92
DataProcessing getProcessingInfo_(DataProcessing::ProcessingAction action) const
Returns the data processing information.
Smoothing of the signal to reduce noise.
Definition: DataProcessing.h:63
void convertTSVToTargetedExperiment(const char *filename, FileTypes::Type filetype, OpenMS::TargetedExperiment &targeted_exp)
Read in a tsv/mrm file and construct a targeted experiment (TraML structure)
void startProgress(SignedSize begin, SignedSize end, const String &label) const
Initializes the progress display.
size_t Size
Size type e.g. used as variable which can hold result of size()
Definition: Types.h:127
The interface of a consumer of spectra and chromatograms.
Definition: IMSDataConsumer.h:67
void load(const String &filename, TargetedExperiment &id)
Loads a map from a TraML file.
This class supports reading and writing of OpenSWATH transition lists.
Definition: TransitionTSVFile.h:142
This class supports reading and writing of PQP files.
Definition: TransitionPQPFile.h:57
void load(const String &filename, TransformationDescription &transformation, bool fit_model=true)
Loads the transformation from an TransformationXML file.
Base class for all classes that want to report their progress.
Definition: ProgressLogger.h:54
A description of a targeted experiment containing precursor and production ions.
Definition: TargetedExperiment.h:64
static FileTypes::Type getTypeByFileName(const String &filename)
Determines the file type from a file name.
SqLite format for mass and chromatograms.
Definition: FileTypes.h:103
Execute all steps for retention time and m/z calibration of SWATH-MS data.
Definition: OpenSwathWorkflow.h:230
Generic description of a coordinate transformation.
Definition: TransformationDescription.h:61
TransformationDescription performRTNormalization(const OpenSwath::LightTargetedExperiment &irt_transitions, std::vector< OpenSwath::SwathMap > &swath_maps, double min_rsq, double min_coverage, const Param &feature_finder_param, const ChromExtractParams &cp_irt, const Param &irt_detection_param, const String &mz_correction_function, const String &irt_mzml_out, Size debug_level, bool sonar=false, bool load_into_memory=false)
Perform RT and m/z correction of the input data using RT-normalization peptides.
double numpressErrorTolerance
check error tolerance after encoding, guarantee abs(1.0-(encoded/decoded)) <= this, 0=do not guarantee anything
Definition: MSNumpressCoder.h:90
Definition: TransitionExperiment.h:206
void prepareChromOutput(Interfaces::IMSDataConsumer **chromatogramConsumer, const boost::shared_ptr< ExperimentalSettings > &exp_meta, const OpenSwath::LightTargetedExperiment &transition_exp, const String &out_chrom)
Prepare chromatogram output.
Definition: OpenSwathBase.h:255
MzML file (.mzML)
Definition: FileTypes.h:72
bool hasSuffix(const String &string) const
true if String ends with string, false otherwise
ProgressLogger::LogType log_type_
Type of progress logging.
Definition: TOPPBase.h:881
MzXML file (.mzXML)
Definition: FileTypes.h:64