OpenMS  2.4.0
OpenSwathOSWWriter.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-2018.
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: George Rosenberger $
32 // $Authors: George Rosenberger $
33 // --------------------------------------------------------------------------
34 
35 #pragma once
36 
37 // Interfaces
39 
41 
43 
44 #include <sqlite3.h>
45 
46 #include <fstream>
47 
48 namespace OpenMS
49 {
50 
58  class OPENMS_DLLAPI OpenSwathOSWWriter
59  {
63  bool doWrite_;
65  bool sonar_;
67 
68  public:
69 
70  OpenSwathOSWWriter(const String& output_filename,
71  const String& input_filename = "inputfile",
72  bool ms1_scores = false,
73  bool sonar = false,
74  bool uis_scores = false) :
75  output_filename_(output_filename),
76  input_filename_(input_filename),
77  run_id_(OpenMS::UniqueIdGenerator::getUniqueId()),
78  doWrite_(!output_filename.empty()),
79  use_ms1_traces_(ms1_scores),
80  sonar_(sonar),
81  enable_uis_scoring_(uis_scores)
82  {}
83 
84  static int callback(void * /* NotUsed */, int argc, char **argv, char **azColName)
85  {
86  int i;
87  for(i=0; i<argc; i++)
88  {
89  printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
90  }
91  printf("\n");
92  return(0);
93  }
94 
95  bool isActive() const
96  {
97  return doWrite_;
98  }
99 
104  void writeHeader()
105  {
106  sqlite3 *db;
107  char *zErrMsg = nullptr;
108  int rc;
109 
110  // Open database
111  rc = sqlite3_open(output_filename_.c_str(), &db);
112  if( rc )
113  {
114  fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
115  }
116 
117  // Create SQL structure
118  const char * create_sql =
119  "CREATE TABLE RUN(" \
120  "ID INT PRIMARY KEY NOT NULL," \
121  "FILENAME TEXT NOT NULL); " \
122 
123  "CREATE TABLE FEATURE(" \
124  "ID INT PRIMARY KEY NOT NULL," \
125  "RUN_ID INT NOT NULL," \
126  "PRECURSOR_ID INT NOT NULL," \
127  "EXP_RT REAL NOT NULL," \
128  "NORM_RT REAL NOT NULL," \
129  "DELTA_RT REAL NOT NULL," \
130  "LEFT_WIDTH REAL NOT NULL," \
131  "RIGHT_WIDTH REAL NOT NULL); " \
132 
133  "CREATE TABLE FEATURE_MS1(" \
134  "FEATURE_ID INT NOT NULL," \
135  "AREA_INTENSITY REAL NOT NULL," \
136  "APEX_INTENSITY REAL NOT NULL," \
137  "VAR_MASSDEV_SCORE REAL NULL," \
138  "VAR_MI_SCORE REAL NULL," \
139  "VAR_MI_CONTRAST_SCORE REAL NULL," \
140  "VAR_MI_COMBINED_SCORE REAL NULL," \
141  "VAR_ISOTOPE_CORRELATION_SCORE REAL NULL," \
142  "VAR_ISOTOPE_OVERLAP_SCORE REAL NULL," \
143  "VAR_XCORR_COELUTION REAL NULL," \
144  "VAR_XCORR_COELUTION_CONTRAST REAL NULL," \
145  "VAR_XCORR_COELUTION_COMBINED REAL NULL," \
146  "VAR_XCORR_SHAPE REAL NULL," \
147  "VAR_XCORR_SHAPE_CONTRAST REAL NULL," \
148  "VAR_XCORR_SHAPE_COMBINED REAL NULL); " \
149 
150  "CREATE TABLE FEATURE_MS2(" \
151  "FEATURE_ID INT NOT NULL," \
152  "AREA_INTENSITY REAL NOT NULL," \
153  "TOTAL_AREA_INTENSITY REAL NOT NULL," \
154  "APEX_INTENSITY REAL NOT NULL," \
155  "TOTAL_MI REAL NULL," \
156  "VAR_BSERIES_SCORE REAL NULL," \
157  "VAR_DOTPROD_SCORE REAL NULL," \
158  "VAR_INTENSITY_SCORE REAL NULL," \
159  "VAR_ISOTOPE_CORRELATION_SCORE REAL NULL," \
160  "VAR_ISOTOPE_OVERLAP_SCORE REAL NULL," \
161  "VAR_LIBRARY_CORR REAL NULL," \
162  "VAR_LIBRARY_DOTPROD REAL NULL," \
163  "VAR_LIBRARY_MANHATTAN REAL NULL," \
164  "VAR_LIBRARY_RMSD REAL NULL," \
165  "VAR_LIBRARY_ROOTMEANSQUARE REAL NULL," \
166  "VAR_LIBRARY_SANGLE REAL NULL," \
167  "VAR_LOG_SN_SCORE REAL NULL," \
168  "VAR_MANHATTAN_SCORE REAL NULL," \
169  "VAR_MASSDEV_SCORE REAL NULL," \
170  "VAR_MASSDEV_SCORE_WEIGHTED REAL NULL," \
171  "VAR_MI_SCORE REAL NULL," \
172  "VAR_MI_WEIGHTED_SCORE REAL NULL," \
173  "VAR_MI_RATIO_SCORE REAL NULL," \
174  "VAR_NORM_RT_SCORE REAL NULL," \
175  "VAR_XCORR_COELUTION REAL NULL," \
176  "VAR_XCORR_COELUTION_WEIGHTED REAL NULL," \
177  "VAR_XCORR_SHAPE REAL NULL," \
178  "VAR_XCORR_SHAPE_WEIGHTED REAL NULL," \
179  "VAR_YSERIES_SCORE REAL NULL," \
180  "VAR_ELUTION_MODEL_FIT_SCORE REAL NULL," \
181  "VAR_SONAR_LAG REAL NULL," \
182  "VAR_SONAR_SHAPE REAL NULL," \
183  "VAR_SONAR_LOG_SN REAL NULL," \
184  "VAR_SONAR_LOG_DIFF REAL NULL," \
185  "VAR_SONAR_LOG_TREND REAL NULL," \
186  "VAR_SONAR_RSQ REAL NULL); " \
187 
188  "CREATE TABLE FEATURE_PRECURSOR(" \
189  "FEATURE_ID INT NOT NULL," \
190  "ISOTOPE INT NOT NULL," \
191  "AREA_INTENSITY REAL NOT NULL," \
192  "APEX_INTENSITY REAL NOT NULL);" \
193 
194  "CREATE TABLE FEATURE_TRANSITION(" \
195  "FEATURE_ID INT NOT NULL," \
196  "TRANSITION_ID INT NOT NULL," \
197  "AREA_INTENSITY REAL NOT NULL," \
198  "TOTAL_AREA_INTENSITY REAL NOT NULL," \
199  "APEX_INTENSITY REAL NOT NULL," \
200  "TOTAL_MI REAL NULL," \
201  "VAR_INTENSITY_SCORE REAL NULL," \
202  "VAR_INTENSITY_RATIO_SCORE REAL NULL," \
203  "VAR_LOG_INTENSITY REAL NULL," \
204  "VAR_XCORR_COELUTION REAL NULL," \
205  "VAR_XCORR_SHAPE REAL NULL," \
206  "VAR_LOG_SN_SCORE REAL NULL," \
207  "VAR_MASSDEV_SCORE REAL NULL," \
208  "VAR_MI_SCORE REAL NULL," \
209  "VAR_MI_RATIO_SCORE REAL NULL," \
210  "VAR_ISOTOPE_CORRELATION_SCORE REAL NULL," \
211  "VAR_ISOTOPE_OVERLAP_SCORE REAL NULL); " ;
212 
213 
214  // Execute SQL create statement
215  rc = sqlite3_exec(db, create_sql, callback, nullptr, &zErrMsg);
216  if( rc != SQLITE_OK )
217  {
218  std::string error_message = zErrMsg;
219  sqlite3_free(zErrMsg);
220  throw Exception::IllegalArgument(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION,
221  error_message);
222  }
223 
224  // Insert run_id information
225  std::stringstream sql_run;
226  sql_run << "INSERT INTO RUN (ID, FILENAME) VALUES ("
227  << *(int64_t*)&run_id_ << ", '" // Conversion from UInt64 to int64_t to support SQLite
228  << input_filename_ << "'); ";
229 
230  // Execute SQL insert statement
231  rc = sqlite3_exec(db, sql_run.str().c_str(), callback, nullptr, &zErrMsg);
232  if( rc != SQLITE_OK )
233  {
234  std::string error_message = zErrMsg;
235  sqlite3_free(zErrMsg);
236  throw Exception::IllegalArgument(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION,
237  error_message);
238  }
239 
240  sqlite3_close(db);
241  }
242 
254  String getScore(const Feature& feature, std::string score_name) const
255  {
256  String score = "NULL";
257  if (!feature.getMetaValue(score_name).isEmpty())
258  {
259  score = feature.getMetaValue(score_name).toString();
260  }
261 
262  return(score);
263  }
264 
276  std::vector<String> getSeparateScore(const Feature& feature, std::string score_name) const
277  {
278  std::vector<String> tmp_separated_scores, separated_scores;
279 
280  if (!feature.getMetaValue(score_name).isEmpty())
281  {
282  tmp_separated_scores = ListUtils::create<String>((String)feature.getMetaValue(score_name),';');
283  }
284 
285  for (Size i = 0; i < tmp_separated_scores.size(); ++i)
286  {
287  if (tmp_separated_scores[i] == "")
288  {
289  separated_scores.push_back("NULL");
290  }
291  else
292  {
293  separated_scores.push_back(tmp_separated_scores[i]);
294  }
295  }
296 
297  return(separated_scores);
298  }
299 
315  const OpenSwath::LightTransition* /* transition */,
316  FeatureMap& output, String id) const
317  {
318  std::stringstream sql, sql_feature, sql_feature_ms1, sql_feature_ms1_precursor, sql_feature_ms2, sql_feature_ms2_transition, sql_feature_uis_transition;
319 
320  for (FeatureMap::iterator feature_it = output.begin(); feature_it != output.end(); ++feature_it)
321  {
322  UInt64 uint64_feature_id = feature_it->getUniqueId();
323  int64_t feature_id = *(int64_t*)&uint64_feature_id; // Conversion from UInt64 to int64_t to support SQLite
324 
325  for (std::vector<Feature>::iterator sub_it = feature_it->getSubordinates().begin(); sub_it != feature_it->getSubordinates().end(); ++sub_it)
326  {
327  if (sub_it->metaValueExists("FeatureLevel") && sub_it->getMetaValue("FeatureLevel") == "MS2")
328  {
329  std::string total_mi = "NULL"; // total_mi is not guaranteed to be set
330  if (!sub_it->getMetaValue("total_mi").isEmpty())
331  {
332  total_mi = sub_it->getMetaValue("total_mi").toString();
333  }
334  sql_feature_ms2_transition << "INSERT INTO FEATURE_TRANSITION (FEATURE_ID, TRANSITION_ID, AREA_INTENSITY, TOTAL_AREA_INTENSITY, APEX_INTENSITY, TOTAL_MI) VALUES ("
335  << feature_id << ", "
336  << sub_it->getMetaValue("native_id") << ", "
337  << sub_it->getIntensity() << ", "
338  << sub_it->getMetaValue("total_xic") << ", "
339  << sub_it->getMetaValue("peak_apex_int") << ", "
340  << total_mi << "); ";
341  }
342  else if (sub_it->metaValueExists("FeatureLevel") && sub_it->getMetaValue("FeatureLevel") == "MS1" && sub_it->getIntensity() > 0.0)
343  {
344  std::vector<String> precursor_id;
345  OpenMS::String(sub_it->getMetaValue("native_id")).split(OpenMS::String("Precursor_i"), precursor_id);
346  sql_feature_ms1_precursor << "INSERT INTO FEATURE_PRECURSOR (FEATURE_ID, ISOTOPE, AREA_INTENSITY, APEX_INTENSITY) VALUES ("
347  << feature_id << ", "
348  << precursor_id[1] << ", "
349  << sub_it->getIntensity() << ", "
350  << sub_it->getMetaValue("peak_apex_int") << "); ";
351  }
352  }
353 
354  sql_feature << "INSERT INTO FEATURE (ID, RUN_ID, PRECURSOR_ID, EXP_RT, NORM_RT, DELTA_RT, LEFT_WIDTH, RIGHT_WIDTH) VALUES ("
355  << feature_id << ", '"
356  << *(int64_t*)&run_id_ << "', "
357  << id << ", "
358  << feature_it->getRT() << ", "
359  << feature_it->getMetaValue("norm_RT") << ", "
360  << feature_it->getMetaValue("delta_rt") << ", "
361  << feature_it->getMetaValue("leftWidth") << ", "
362  << feature_it->getMetaValue("rightWidth") << "); ";
363 
364  sql_feature_ms2 << "INSERT INTO FEATURE_MS2 (FEATURE_ID, AREA_INTENSITY, TOTAL_AREA_INTENSITY, APEX_INTENSITY, TOTAL_MI, VAR_BSERIES_SCORE, VAR_DOTPROD_SCORE, VAR_INTENSITY_SCORE, VAR_ISOTOPE_CORRELATION_SCORE, VAR_ISOTOPE_OVERLAP_SCORE, VAR_LIBRARY_CORR, VAR_LIBRARY_DOTPROD, VAR_LIBRARY_MANHATTAN, VAR_LIBRARY_RMSD, VAR_LIBRARY_ROOTMEANSQUARE, VAR_LIBRARY_SANGLE, VAR_LOG_SN_SCORE, VAR_MANHATTAN_SCORE, VAR_MASSDEV_SCORE, VAR_MASSDEV_SCORE_WEIGHTED, VAR_MI_SCORE, VAR_MI_WEIGHTED_SCORE, VAR_MI_RATIO_SCORE, VAR_NORM_RT_SCORE, VAR_XCORR_COELUTION,VAR_XCORR_COELUTION_WEIGHTED, VAR_XCORR_SHAPE, VAR_XCORR_SHAPE_WEIGHTED, VAR_YSERIES_SCORE, VAR_ELUTION_MODEL_FIT_SCORE, VAR_SONAR_LAG, VAR_SONAR_SHAPE, VAR_SONAR_LOG_SN, VAR_SONAR_LOG_DIFF, VAR_SONAR_LOG_TREND, VAR_SONAR_RSQ) VALUES ("
365  << feature_id << ", "
366  << feature_it->getIntensity() << ", "
367  << getScore(*feature_it, "total_xic") << ", "
368  << getScore(*feature_it, "peak_apices_sum") << ", "
369  << getScore(*feature_it, "total_mi") << ", "
370  << getScore(*feature_it, "var_bseries_score") << ", "
371  << getScore(*feature_it, "var_dotprod_score") << ", "
372  << getScore(*feature_it, "var_intensity_score") << ", "
373  << getScore(*feature_it, "var_isotope_correlation_score") << ", "
374  << getScore(*feature_it, "var_isotope_overlap_score") << ", "
375  << getScore(*feature_it, "var_library_corr") << ", "
376  << getScore(*feature_it, "var_library_dotprod") << ", "
377  << getScore(*feature_it, "var_library_manhattan") << ", "
378  << getScore(*feature_it, "var_library_rmsd") << ", "
379  << getScore(*feature_it, "var_library_rootmeansquare") << ", "
380  << getScore(*feature_it, "var_library_sangle") << ", "
381  << getScore(*feature_it, "var_log_sn_score") << ", "
382  << getScore(*feature_it, "var_manhatt_score") << ", "
383  << getScore(*feature_it, "var_massdev_score") << ", "
384  << getScore(*feature_it, "var_massdev_score_weighted") << ", "
385  << getScore(*feature_it, "var_mi_score") << ", "
386  << getScore(*feature_it, "var_mi_weighted_score") << ", "
387  << getScore(*feature_it, "var_mi_ratio_score") << ", "
388  << getScore(*feature_it, "var_norm_rt_score") << ", "
389  << getScore(*feature_it, "var_xcorr_coelution") << ", "
390  << getScore(*feature_it, "var_xcorr_coelution_weighted") << ", "
391  << getScore(*feature_it, "var_xcorr_shape") << ", "
392  << getScore(*feature_it, "var_xcorr_shape_weighted") << ", "
393  << getScore(*feature_it, "var_yseries_score") << ", "
394  << getScore(*feature_it, "var_elution_model_fit_score") << ", "
395  << getScore(*feature_it, "var_sonar_lag") << ", "
396  << getScore(*feature_it, "var_sonar_shape") << ", "
397  << getScore(*feature_it, "var_sonar_log_sn") << ", "
398  << getScore(*feature_it, "var_sonar_log_diff") << ", "
399  << getScore(*feature_it, "var_sonar_log_trend") << ", "
400  << getScore(*feature_it, "var_sonar_rsq") << "); ";
401 
402  if (use_ms1_traces_)
403  {
404  sql_feature_ms1 << "INSERT INTO FEATURE_MS1 (FEATURE_ID, AREA_INTENSITY, APEX_INTENSITY, VAR_MASSDEV_SCORE, VAR_MI_SCORE, VAR_MI_CONTRAST_SCORE, VAR_MI_COMBINED_SCORE, VAR_ISOTOPE_CORRELATION_SCORE, VAR_ISOTOPE_OVERLAP_SCORE, VAR_XCORR_COELUTION, VAR_XCORR_COELUTION_CONTRAST, VAR_XCORR_COELUTION_COMBINED, VAR_XCORR_SHAPE, VAR_XCORR_SHAPE_CONTRAST, VAR_XCORR_SHAPE_COMBINED) VALUES ("
405  << feature_id << ", "
406  << getScore(*feature_it, "ms1_area_intensity") << ", "
407  << getScore(*feature_it, "ms1_apex_intensity") << ", "
408  << getScore(*feature_it, "var_ms1_ppm_diff") << ", "
409  << getScore(*feature_it, "var_ms1_mi_score") << ", "
410  << getScore(*feature_it, "var_ms1_mi_contrast_score") << ", "
411  << getScore(*feature_it, "var_ms1_mi_combined_score") << ", "
412  << getScore(*feature_it, "var_ms1_isotope_correlation") << ", "
413  << getScore(*feature_it, "var_ms1_isotope_overlap") << ", "
414  << getScore(*feature_it, "var_ms1_xcorr_coelution") << ", "
415  << getScore(*feature_it, "var_ms1_xcorr_coelution_contrast") << ", "
416  << getScore(*feature_it, "var_ms1_xcorr_coelution_combined") << ", "
417  << getScore(*feature_it, "var_ms1_xcorr_shape") << ", "
418  << getScore(*feature_it, "var_ms1_xcorr_shape_contrast") << ", "
419  << getScore(*feature_it, "var_ms1_xcorr_shape_combined") << "); ";
420  }
421 
422  if (enable_uis_scoring_)
423  {
424  std::vector<String> id_target_transition_names = getSeparateScore(*feature_it, "id_target_transition_names");
425  std::vector<String> id_target_area_intensity = getSeparateScore(*feature_it, "id_target_area_intensity");
426  std::vector<String> id_target_total_area_intensity = getSeparateScore(*feature_it, "id_target_total_area_intensity");
427  std::vector<String> id_target_apex_intensity = getSeparateScore(*feature_it, "id_target_apex_intensity");
428  std::vector<String> id_target_total_mi = getSeparateScore(*feature_it, "id_target_apex_intensity");
429  std::vector<String> id_target_intensity_score = getSeparateScore(*feature_it, "id_target_intensity_score");
430  std::vector<String> id_target_intensity_ratio_score = getSeparateScore(*feature_it, "id_target_intensity_ratio_score");
431  std::vector<String> id_target_log_intensity = getSeparateScore(*feature_it, "id_target_ind_log_intensity");
432  std::vector<String> id_target_ind_xcorr_coelution = getSeparateScore(*feature_it, "id_target_ind_xcorr_coelution");
433  std::vector<String> id_target_ind_xcorr_shape = getSeparateScore(*feature_it, "id_target_ind_xcorr_shape");
434  std::vector<String> id_target_ind_log_sn_score = getSeparateScore(*feature_it, "id_target_ind_log_sn_score");
435  std::vector<String> id_target_ind_massdev_score = getSeparateScore(*feature_it, "id_target_ind_massdev_score");
436  std::vector<String> id_target_ind_mi_score = getSeparateScore(*feature_it, "id_target_ind_mi_score");
437  std::vector<String> id_target_ind_mi_ratio_score = getSeparateScore(*feature_it, "id_target_ind_mi_ratio_score");
438  std::vector<String> id_target_ind_isotope_correlation = getSeparateScore(*feature_it, "id_target_ind_isotope_correlation");
439  std::vector<String> id_target_ind_isotope_overlap = getSeparateScore(*feature_it, "id_target_ind_isotope_overlap");
440 
441  if ((String)feature_it->getMetaValue("id_target_num_transitions") != "")
442  {
443  int id_target_num_transitions = feature_it->getMetaValue("id_target_num_transitions").toString().toInt();
444 
445  for (int i = 0; i < id_target_num_transitions; ++i)
446  {
447  sql_feature_uis_transition << "INSERT INTO FEATURE_TRANSITION (FEATURE_ID, TRANSITION_ID, AREA_INTENSITY, TOTAL_AREA_INTENSITY, APEX_INTENSITY, TOTAL_MI, VAR_INTENSITY_SCORE, VAR_INTENSITY_RATIO_SCORE, VAR_LOG_INTENSITY, VAR_XCORR_COELUTION, VAR_XCORR_SHAPE, VAR_LOG_SN_SCORE, VAR_MASSDEV_SCORE, VAR_MI_SCORE, VAR_MI_RATIO_SCORE, VAR_ISOTOPE_CORRELATION_SCORE, VAR_ISOTOPE_OVERLAP_SCORE) VALUES ("
448  << feature_id << ", "
449  << id_target_transition_names[i] << ", "
450  << id_target_area_intensity[i] << ", "
451  << id_target_total_area_intensity[i] << ", "
452  << id_target_apex_intensity[i] << ", "
453  << id_target_total_mi[i] << ", "
454  << id_target_intensity_score[i] << ", "
455  << id_target_intensity_ratio_score[i] << ", "
456  << id_target_log_intensity[i] << ", "
457  << id_target_ind_xcorr_coelution[i] << ", "
458  << id_target_ind_xcorr_shape[i] << ", "
459  << id_target_ind_log_sn_score[i] << ", "
460  << id_target_ind_massdev_score[i] << ", "
461  << id_target_ind_mi_score[i] << ", "
462  << id_target_ind_mi_ratio_score[i] << ", "
463  << id_target_ind_isotope_correlation[i] << ", "
464  << id_target_ind_isotope_overlap[i] << "); ";
465  }
466  }
467 
468  std::vector<String> id_decoy_transition_names = getSeparateScore(*feature_it, "id_decoy_transition_names");
469  std::vector<String> id_decoy_area_intensity = getSeparateScore(*feature_it, "id_decoy_area_intensity");
470  std::vector<String> id_decoy_total_area_intensity = getSeparateScore(*feature_it, "id_decoy_total_area_intensity");
471  std::vector<String> id_decoy_apex_intensity = getSeparateScore(*feature_it, "id_decoy_apex_intensity");
472  std::vector<String> id_decoy_total_mi = getSeparateScore(*feature_it, "id_decoy_total_mi");
473  std::vector<String> id_decoy_intensity_score = getSeparateScore(*feature_it, "id_decoy_intensity_score");
474  std::vector<String> id_decoy_intensity_ratio_score = getSeparateScore(*feature_it, "id_decoy_intensity_ratio_score");
475  std::vector<String> id_decoy_log_intensity = getSeparateScore(*feature_it, "id_decoy_ind_log_intensity");
476  std::vector<String> id_decoy_ind_xcorr_coelution = getSeparateScore(*feature_it, "id_decoy_ind_xcorr_coelution");
477  std::vector<String> id_decoy_ind_xcorr_shape = getSeparateScore(*feature_it, "id_decoy_ind_xcorr_shape");
478  std::vector<String> id_decoy_ind_log_sn_score = getSeparateScore(*feature_it, "id_decoy_ind_log_sn_score");
479  std::vector<String> id_decoy_ind_massdev_score = getSeparateScore(*feature_it, "id_decoy_ind_massdev_score");
480  std::vector<String> id_decoy_ind_mi_score = getSeparateScore(*feature_it, "id_decoy_ind_mi_score");
481  std::vector<String> id_decoy_ind_mi_ratio_score = getSeparateScore(*feature_it, "id_decoy_ind_mi_ratio_score");
482  std::vector<String> id_decoy_ind_isotope_correlation = getSeparateScore(*feature_it, "id_decoy_ind_isotope_correlation");
483  std::vector<String> id_decoy_ind_isotope_overlap = getSeparateScore(*feature_it, "id_decoy_ind_isotope_overlap");
484 
485  if ((String)feature_it->getMetaValue("id_decoy_num_transitions") != "")
486  {
487  int id_decoy_num_transitions = feature_it->getMetaValue("id_decoy_num_transitions").toString().toInt();
488 
489  for (int i = 0; i < id_decoy_num_transitions; ++i)
490  {
491  sql_feature_uis_transition << "INSERT INTO FEATURE_TRANSITION (FEATURE_ID, TRANSITION_ID, AREA_INTENSITY, TOTAL_AREA_INTENSITY, APEX_INTENSITY, TOTAL_MI, VAR_INTENSITY_SCORE, VAR_INTENSITY_RATIO_SCORE, VAR_LOG_INTENSITY, VAR_XCORR_COELUTION, VAR_XCORR_SHAPE, VAR_LOG_SN_SCORE, VAR_MASSDEV_SCORE, VAR_MI_SCORE, VAR_MI_RATIO_SCORE, VAR_ISOTOPE_CORRELATION_SCORE, VAR_ISOTOPE_OVERLAP_SCORE) VALUES ("
492  << feature_id << ", "
493  << id_decoy_transition_names[i] << ", "
494  << id_decoy_area_intensity[i] << ", "
495  << id_decoy_total_area_intensity[i] << ", "
496  << id_decoy_apex_intensity[i] << ", "
497  << id_decoy_total_mi[i] << ", "
498  << id_decoy_intensity_score[i] << ", "
499  << id_decoy_intensity_ratio_score[i] << ", "
500  << id_decoy_log_intensity[i] << ", "
501  << id_decoy_ind_xcorr_coelution[i] << ", "
502  << id_decoy_ind_xcorr_shape[i] << ", "
503  << id_decoy_ind_log_sn_score[i] << ", "
504  << id_decoy_ind_massdev_score[i] << ", "
505  << id_decoy_ind_mi_score[i] << ", "
506  << id_decoy_ind_mi_ratio_score[i] << ", "
507  << id_decoy_ind_isotope_correlation[i] << ", "
508  << id_decoy_ind_isotope_overlap[i] << "); ";
509  }
510  }
511  }
512  }
513 
514  if (enable_uis_scoring_)
515  {
516  sql << sql_feature.str() << sql_feature_ms1.str() << sql_feature_ms1_precursor.str() << sql_feature_ms2.str() << sql_feature_uis_transition.str();
517  }
518  else
519  {
520  sql << sql_feature.str() << sql_feature_ms1.str() << sql_feature_ms1_precursor.str() << sql_feature_ms2.str() << sql_feature_ms2_transition.str();
521  }
522 
523  return(sql.str());
524  }
525 
539  void writeLines(const std::vector<String>& to_osw_output)
540  {
541  sqlite3 *db;
542  char *zErrMsg = nullptr;
543  int rc;
544  // char *create_sql;
545 
546  // Open database
547  rc = sqlite3_open(output_filename_.c_str(), &db);
548  if( rc )
549  {
550  fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
551  }
552 
553  sqlite3_exec(db, "BEGIN TRANSACTION", nullptr, nullptr, &zErrMsg);
554 
555  for (Size i = 0; i < to_osw_output.size(); i++)
556  {
557  rc = sqlite3_exec(db, to_osw_output[i].c_str(), callback, nullptr, &zErrMsg);
558  if( rc != SQLITE_OK )
559  {
560  std::string error_message = zErrMsg;
561  sqlite3_free(zErrMsg);
562  throw Exception::IllegalArgument(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION,
563  error_message);
564  }
565  }
566 
567  sqlite3_exec(db, "END TRANSACTION", nullptr, nullptr, &zErrMsg);
568 
569  sqlite3_close(db);
570  }
571 
572  };
573 
574 }
575 
String input_filename_
Definition: OpenSwathOSWWriter.h:61
String getScore(const Feature &feature, std::string score_name) const
Prepare scores for SQLite insertion.
Definition: OpenSwathOSWWriter.h:254
String output_filename_
Definition: OpenSwathOSWWriter.h:60
A more convenient string class.
Definition: String.h:58
void writeLines(const std::vector< String > &to_osw_output)
Write data to disk.
Definition: OpenSwathOSWWriter.h:539
A container for features.
Definition: FeatureMap.h:93
bool sonar_
Definition: OpenSwathOSWWriter.h:65
Main OpenMS namespace.
Definition: FeatureDeconvolution.h:46
bool use_ms1_traces_
Definition: OpenSwathOSWWriter.h:64
static int callback(void *, int argc, char **argv, char **azColName)
Definition: OpenSwathOSWWriter.h:84
Class to write out an OpenSwath OSW SQLite output (PyProphet input)
Definition: OpenSwathOSWWriter.h:58
void writeHeader()
Initializes file by generating SQLite tables.
Definition: OpenSwathOSWWriter.h:104
const DataValue & getMetaValue(const String &name) const
Returns the value corresponding to a string (or DataValue::EMPTY if not found)
String toString() const
Conversion to String.
bool enable_uis_scoring_
Definition: OpenSwathOSWWriter.h:66
A generator for unique ids.
Definition: UniqueIdGenerator.h:59
A method or algorithm argument contains illegal values.
Definition: Exception.h:648
std::vector< String > getSeparateScore(const Feature &feature, std::string score_name) const
Prepare concatenated scores for SQLite insertion.
Definition: OpenSwathOSWWriter.h:276
String prepareLine(const OpenSwath::LightCompound &, const OpenSwath::LightTransition *, FeatureMap &output, String id) const
Prepare a single line (feature) for output.
Definition: OpenSwathOSWWriter.h:314
bool doWrite_
Definition: OpenSwathOSWWriter.h:63
An LC-MS feature.
Definition: Feature.h:70
OPENMS_UINT64_TYPE UInt64
Unsigned integer type (64bit)
Definition: Types.h:77
Definition: TransitionExperiment.h:149
OpenMS::UInt64 run_id_
Definition: OpenSwathOSWWriter.h:62
Definition: TransitionExperiment.h:46
size_t Size
Size type e.g. used as variable which can hold result of size()
Definition: Types.h:127
bool isEmpty() const
Test if the value is empty.
Definition: DataValue.h:372
OpenSwathOSWWriter(const String &output_filename, const String &input_filename="inputfile", bool ms1_scores=false, bool sonar=false, bool uis_scores=false)
Definition: OpenSwathOSWWriter.h:70
bool isActive() const
Definition: OpenSwathOSWWriter.h:95