1
// -*- Mode: C++; tab-width: 2; -*-
3
// --------------------------------------------------------------------------
4
// OpenMS Mass Spectrometry Framework
5
// --------------------------------------------------------------------------
6
// Copyright (C) 2003-2011 -- Oliver Kohlbacher, Knut Reinert
8
// This library is free software; you can redistribute it and/or
9
// modify it under the terms of the GNU Lesser General Public
10
// License as published by the Free Software Foundation; either
11
// version 2.1 of the License, or (at your option) any later version.
13
// This library is distributed in the hope that it will be useful,
14
// but WITHOUT ANY WARRANTY; without even the implied warranty of
15
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
// Lesser General Public License for more details.
18
// You should have received a copy of the GNU Lesser General Public
19
// License along with this library; if not, write to the Free Software
20
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
// --------------------------------------------------------------------------
23
// $Maintainer: Andreas Bertsch $
24
// $Authors: Andreas Bertsch $
25
// --------------------------------------------------------------------------
28
#include <OpenMS/ANALYSIS/ID/PILISModel.h>
29
#include <OpenMS/ANALYSIS/ID/PILISModelGenerator.h>
31
#include <OpenMS/CHEMISTRY/IsotopeDistribution.h>
32
#include <OpenMS/CHEMISTRY/AASequence.h>
33
#include <OpenMS/CHEMISTRY/ModificationsDB.h>
34
#include <OpenMS/SYSTEM/File.h>
43
#define TRAINING_DEBUG
49
#define INIT_CHARGE_DEBUG
50
#undef INIT_CHARGE_DEBUG
52
#define MIN_DECIMAL_VALUE 1e-8
57
// - New proton activation function, e.g. which handles internal sc occupancy
58
// and multiple e.g. P in a peptide
59
// - Pathway length scaling through root function, e.g. for loss models ????
63
// New QXP pathway handling
64
// New XXD yk-2 enhancement
66
// XPHXXX yk-2 enhancement
72
PILISModel::PILISModel()
73
: DefaultParamHandler("PILISModel"),
76
defaults_.setValue("upper_mz", 2000.0, "Max m/z value of product ions in the simulated spectrum");
77
defaults_.setValue("lower_mz", 200.0, "Lowest m/z value of product ions in the simulated spectrum");
78
defaults_.setValue("charge_remote_threshold", 0.3, "If the probability for the proton at the N-terminus is lower than this value, enable charge-remote pathways");
79
defaults_.setValue("charge_directed_threshold", 0.3, "Limit the proton availability at the N-terminus to at least this value for charge-directed pathways");
80
defaults_.setValue("model_depth", 10, "The number of explicitly modeled backbone cleavages from N-terminus and C-terminus, would be 9 for the default value", StringList::create("advanced"));
81
defaults_.setValue("visible_model_depth", 50, "The maximal possible size of a peptide to be modeled", StringList::create("advanced"));
84
defaults_.setValue("precursor_mass_tolerance", 3.0, "Mass tolerance of the precursor peak, used to identify the precursor peak and its loss peaks for training");
85
defaults_.setValue("fragment_mass_tolerance", 0.3, "Peak mass tolerance of the product ions, used to identify the ions for training");
87
// modification parameters
88
vector<String> all_mods;
89
ModificationsDB::getInstance()->getAllSearchModifications(all_mods);
90
defaults_.setValue("variable_modifications", StringList::create("Oxidation (M),Carbamyl (K)"), "Modifications which should be included in the model, represented by PSI-MOD accessions.");
91
defaults_.setValidStrings("variable_modifications", all_mods);
92
defaults_.setValue("fixed_modifications", StringList::create(""), "Modifications which should replace the unmodified amino acid, represented by PSI-MOD accessions.");
93
defaults_.setValidStrings("fixed_modifications", all_mods);
96
defaults_.setValue("min_enhancement_factor", 2.0, "Minimal factor for bxyz backbone cleavages.", StringList::create("advanced"));
98
defaults_.setValue("min_y_ion_intensity", 0.0, "Minimal intensity for y ions.", StringList::create("advanced"));
99
defaults_.setValue("min_b_ion_intensity", 0.0, "Minimal intensity for b ions.", StringList::create("advanced"));
100
defaults_.setValue("min_a_ion_intensity", 0.0, "Minimal intensity for a ions.", StringList::create("advanced"));
101
defaults_.setValue("min_y_loss_intensity", 0.0, "Minimal intensity for y ions with neutral loss.", StringList::create("advanced"));
102
defaults_.setValue("min_b_loss_intensity", 0.0, "Minimal intensity for b ions with neutral loss.", StringList::create("advanced"));
104
defaults_.setValue("side_chain_activation", 0.2, "Additional activation of proton sitting at side chain, especially important at lysine and histidine residues");
105
defaults_.setValue("pseudo_counts", 1e-15, "Value which is added for every transition trained of the underlying hidden Markov model", StringList::create("advanced"));
106
defaults_.setValue("max_isotope", 2, "Maximal isotope peak which is reported by the model, 0 means all isotope peaks are reported");
108
defaults_.setValue("max_fragment_charge_training", 2, "Maximal allowed charge states for ions to be considered for training");
109
defaults_.setValue("max_fragment_charge", 4, "Maximal charge state allowed for fragment ions");
114
PILISModel::~PILISModel()
118
PILISModel::PILISModel(const PILISModel& model)
119
: DefaultParamHandler(model),
121
prot_dist_(model.prot_dist_),
123
valid_(model.valid_),
124
peaks_(model.peaks_),
125
spectra_aligner_(model.spectra_aligner_),
126
precursor_model_cr_(model.precursor_model_cr_),
127
precursor_model_cd_(model.precursor_model_cd_),
129
a_ion_losses_cr_(model.a_ion_losses_cr_),
130
a_ion_losses_cd_(model.a_ion_losses_cd_),
132
b_ion_losses_cr_(model.b_ion_losses_cr_),
133
b_ion_losses_cd_(model.b_ion_losses_cd_),
135
b2_ion_losses_cr_(model.b2_ion_losses_cr_),
136
b2_ion_losses_cd_(model.b2_ion_losses_cd_),
138
y_ion_losses_cr_(model.y_ion_losses_cr_),
139
y_ion_losses_cd_(model.y_ion_losses_cd_)
143
PILISModel& PILISModel::operator = (const PILISModel& model)
147
DefaultParamHandler::operator=(model);
149
prot_dist_ = model.prot_dist_;
151
valid_ = model.valid_;
152
peaks_ = model.peaks_;
153
spectra_aligner_ = model.spectra_aligner_;
154
precursor_model_cr_ = model.precursor_model_cr_;
155
precursor_model_cd_ = model.precursor_model_cd_;
157
a_ion_losses_cr_ = model.a_ion_losses_cr_;
158
a_ion_losses_cd_ = model.a_ion_losses_cd_;
160
b_ion_losses_cr_ = model.b_ion_losses_cr_;
161
b_ion_losses_cd_ = model.b_ion_losses_cd_;
163
b2_ion_losses_cr_ = model.b2_ion_losses_cr_;
164
b2_ion_losses_cd_ = model.b2_ion_losses_cd_;
166
y_ion_losses_cr_ = model.y_ion_losses_cr_;
167
y_ion_losses_cd_ = model.y_ion_losses_cd_;
172
void PILISModel::init(bool generate_models)
176
PILISModelGenerator gen;
177
Param gen_param(gen.getParameters());
178
gen_param.setValue("variable_modifications", (StringList)param_.getValue("variable_modifications"));
179
gen_param.setValue("fixed_modifications", (StringList)param_.getValue("fixed_modifications"));
180
gen_param.setValue("model_depth", param_.getValue("model_depth"));
181
gen_param.setValue("visible_model_depth", param_.getValue("visible_model_depth"));
182
gen.setParameters(gen_param);
187
Param pre_param(precursor_model_cr_.getParameters());
188
pre_param.setValue("fragment_mass_tolerance", (DoubleReal)param_.getValue("fragment_mass_tolerance"));
189
pre_param.setValue("variable_modifications", (StringList)param_.getValue("variable_modifications"));
190
pre_param.setValue("fixed_modifications", (StringList)param_.getValue("fixed_modifications"));
191
pre_param.setValue("pseudo_counts", (DoubleReal)param_.getValue("pseudo_counts"));
192
pre_param.setValue("C_term_H2O_loss", "true");
193
pre_param.setValue("ion_name", "p");
194
precursor_model_cr_.setParameters(pre_param);
195
precursor_model_cd_.setParameters(pre_param);
199
precursor_model_cr_.generateModel();
200
precursor_model_cd_.generateModel();
203
pre_param.setValue("C_term_H2O_loss", "false");
204
pre_param.setValue("enable_double_losses", "false");
205
pre_param.setValue("ion_name", "b");
206
b_ion_losses_cr_.setParameters(pre_param);
207
b_ion_losses_cd_.setParameters(pre_param);
210
b_ion_losses_cr_.generateModel();
211
b_ion_losses_cd_.generateModel();
214
pre_param.setValue("C_term_H2O_loss", "false");
215
pre_param.setValue("enable_double_losses", "false");
216
pre_param.setValue("ion_name", "b2");
217
b2_ion_losses_cr_.setParameters(pre_param);
218
b2_ion_losses_cd_.setParameters(pre_param);
221
b2_ion_losses_cr_.generateModel();
222
b2_ion_losses_cd_.generateModel();
225
pre_param.setValue("C_term_H2O_loss", "false");
226
pre_param.setValue("enable_double_losses", "false");
227
pre_param.setValue("ion_name", "a");
228
a_ion_losses_cr_.setParameters(pre_param);
229
a_ion_losses_cd_.setParameters(pre_param);
232
a_ion_losses_cr_.generateModel();
233
a_ion_losses_cd_.generateModel();
236
pre_param.setValue("C_term_H2O_loss", "true");
237
pre_param.setValue("ion_name", "y");
238
y_ion_losses_cr_.setParameters(pre_param);
239
y_ion_losses_cd_.setParameters(pre_param);
242
y_ion_losses_cr_.generateModel();
243
y_ion_losses_cd_.generateModel();
253
void PILISModel::readFromFile(const String& filename)
256
if (!File::readable(filename))
258
throw Exception::FileNotReadable(__FILE__, __LINE__, __PRETTY_FUNCTION__, filename);
260
if (File::empty(filename))
262
throw Exception::FileEmpty(__FILE__, __LINE__, __PRETTY_FUNCTION__, filename);
268
file.load(filename, true);
270
TextFile::Iterator it_begin(file.begin()), it_end(file.begin());
271
it_begin = file.search(it_begin, "BASE_MODEL_BEGIN");
272
it_end = file.search(it_begin, "BASE_MODEL_END");
273
parseHMMModel_(++it_begin, it_end, hmm_, param_);
275
// seek to next interval
276
it_begin = file.search(it_end, "PRECURSOR_MODEL_CR_BEGIN");
277
it_end = file.search(it_begin, "PRECURSOR_MODEL_CR_END");
279
HiddenMarkovModel precursor_model_cr_hmm;
280
parseHMMModel_(++it_begin, it_end, precursor_model_cr_hmm, p);
281
precursor_model_cr_.setHMM(precursor_model_cr_hmm);
282
precursor_model_cr_.setParameters(p);
284
it_begin = file.search(it_end, "PRECURSOR_MODEL_CD_BEGIN");
285
it_end = file.search(it_begin, "PRECURSOR_MODEL_CD_END");
287
HiddenMarkovModel precursor_model_cd_hmm;
288
parseHMMModel_(++it_begin, it_end, precursor_model_cd_hmm, p);
289
precursor_model_cd_.setHMM(precursor_model_cd_hmm);
290
precursor_model_cd_.setParameters(p);
294
it_begin = file.search(it_end, "BION_LOSS_MODEL_CR_BEGIN");
295
it_end = file.search(it_begin, "BION_LOSS_MODEL_CR_END");
297
HiddenMarkovModel b_ion_loss_hmm_cr;
298
parseHMMModel_(++it_begin, it_end, b_ion_loss_hmm_cr, p);
299
b_ion_losses_cr_.setHMM(b_ion_loss_hmm_cr);
300
b_ion_losses_cr_.setParameters(p);
302
it_begin = file.search(it_end, "BION_LOSS_MODEL_CD_BEGIN");
303
it_end = file.search(it_begin, "BION_LOSS_MODEL_CD_END");
305
HiddenMarkovModel b_ion_loss_hmm_cd;
306
parseHMMModel_(++it_begin, it_end, b_ion_loss_hmm_cd, p);
307
b_ion_losses_cd_.setHMM(b_ion_loss_hmm_cd);
308
b_ion_losses_cd_.setParameters(p);
310
it_begin = file.search(it_end, "B2ION_LOSS_MODEL_CR_BEGIN");
311
it_end = file.search(it_begin, "B2ION_LOSS_MODEL_CR_END");
313
HiddenMarkovModel b2_ion_loss_hmm_cr;
314
parseHMMModel_(++it_begin, it_end, b2_ion_loss_hmm_cr, p);
315
b2_ion_losses_cr_.setHMM(b2_ion_loss_hmm_cr);
316
b2_ion_losses_cr_.setParameters(p);
318
it_begin = file.search(it_end, "B2ION_LOSS_MODEL_CD_BEGIN");
319
it_end = file.search(it_begin, "B2ION_LOSS_MODEL_CD_END");
321
HiddenMarkovModel b2_ion_loss_hmm_cd;
322
parseHMMModel_(++it_begin, it_end, b2_ion_loss_hmm_cd, p);
323
b2_ion_losses_cd_.setHMM(b2_ion_loss_hmm_cd);
324
b2_ion_losses_cd_.setParameters(p);
327
it_begin = file.search(it_end, "AION_LOSS_MODEL_CR_BEGIN");
328
it_end = file.search(it_begin, "AION_LOSS_MODEL_CR_END");
330
HiddenMarkovModel a_ion_loss_hmm_cr;
331
parseHMMModel_(++it_begin, it_end, a_ion_loss_hmm_cr, p);
332
a_ion_losses_cr_.setHMM(a_ion_loss_hmm_cr);
333
a_ion_losses_cr_.setParameters(p);
335
it_begin = file.search(it_end, "AION_LOSS_MODEL_CD_BEGIN");
336
it_end = file.search(it_begin, "AION_LOSS_MODEL_CD_END");
338
HiddenMarkovModel a_ion_loss_hmm_cd;
339
parseHMMModel_(++it_begin, it_end, a_ion_loss_hmm_cd, p);
340
a_ion_losses_cd_.setHMM(a_ion_loss_hmm_cd);
341
a_ion_losses_cd_.setParameters(p);
344
it_begin = file.search(it_end, "YION_LOSS_MODEL_CR_BEGIN");
345
it_end = file.search(it_begin, "YION_LOSS_MODEL_CR_END");
347
HiddenMarkovModel y_ion_loss_hmm_cr;
348
parseHMMModel_(++it_begin, it_end, y_ion_loss_hmm_cr, p);
349
y_ion_losses_cr_.setHMM(y_ion_loss_hmm_cr);
350
y_ion_losses_cr_.setParameters(p);
352
it_begin = file.search(it_end, "YION_LOSS_MODEL_CD_BEGIN");
353
it_end = file.search(it_begin, "YION_LOSS_MODEL_CD_END");
355
HiddenMarkovModel y_ion_loss_hmm_cd;
356
parseHMMModel_(++it_begin, it_end, y_ion_loss_hmm_cd, p);
357
y_ion_losses_cd_.setHMM(y_ion_loss_hmm_cd);
358
y_ion_losses_cd_.setParameters(p);
364
void PILISModel::writeGraphMLFile(const String& filename)
366
hmm_.writeGraphMLFile(filename);
370
void PILISModel::writeToFile(const String& filename)
373
cerr << "writing to file '" << filename << "'" << endl;
376
ofstream out(filename.c_str());
377
out << "BASE_MODEL_BEGIN" << endl;
378
writeParameters_(out, param_);
380
out << "BASE_MODEL_END" << endl;
382
out << "PRECURSOR_MODEL_CR_BEGIN" << endl;
383
writeParameters_(out, precursor_model_cr_.getParameters());
384
precursor_model_cr_.getHMM().write(out);
385
out << "PRECURSOR_MODEL_CR_END" << endl;
387
out << "PRECURSOR_MODEL_CD_BEGIN" << endl;
388
writeParameters_(out, precursor_model_cd_.getParameters());
389
precursor_model_cd_.getHMM().write(out);
390
out << "PRECURSOR_MODEL_CD_END" << endl;
392
out << "BION_LOSS_MODEL_CR_BEGIN" << endl;
393
writeParameters_(out, b_ion_losses_cr_.getParameters());
394
b_ion_losses_cr_.getHMM().write(out);
395
out << "BION_LOSS_MODEL_CR_END" << endl;
397
out << "BION_LOSS_MODEL_CD_BEGIN" << endl;
398
writeParameters_(out, b_ion_losses_cd_.getParameters());
399
b_ion_losses_cd_.getHMM().write(out);
400
out << "BION_LOSS_MODEL_CD_END" << endl;
402
out << "B2ION_LOSS_MODEL_CR_BEGIN" << endl;
403
writeParameters_(out, b2_ion_losses_cr_.getParameters());
404
b2_ion_losses_cr_.getHMM().write(out);
405
out << "B2ION_LOSS_MODEL_CR_END" << endl;
407
out << "B2ION_LOSS_MODEL_CD_BEGIN" << endl;
408
writeParameters_(out, b2_ion_losses_cd_.getParameters());
409
b2_ion_losses_cd_.getHMM().write(out);
410
out << "B2ION_LOSS_MODEL_CD_END" << endl;
412
out << "AION_LOSS_MODEL_CR_BEGIN" << endl;
413
writeParameters_(out, a_ion_losses_cr_.getParameters());
414
a_ion_losses_cr_.getHMM().write(out);
415
out << "AION_LOSS_MODEL_CR_END" << endl;
417
out << "AION_LOSS_MODEL_CD_BEGIN" << endl;
418
writeParameters_(out, a_ion_losses_cd_.getParameters());
419
a_ion_losses_cd_.getHMM().write(out);
420
out << "AION_LOSS_MODEL_CD_END" << endl;
422
out << "YION_LOSS_MODEL_CR_BEGIN" << endl;
423
writeParameters_(out, y_ion_losses_cr_.getParameters());
424
y_ion_losses_cr_.getHMM().write(out);
425
out << "YION_LOSS_MODEL_CR_END" << endl;
427
out << "YION_LOSS_MODEL_CD_BEGIN" << endl;
428
writeParameters_(out, y_ion_losses_cd_.getParameters());
429
y_ion_losses_cd_.getHMM().write(out);
430
out << "YION_LOSS_MODEL_CD_END" << endl;
435
void PILISModel::train(const RichPeakSpectrum& in_spec, const AASequence& peptide, UInt charge)
439
cerr << "PILISModel: cannot train, initialize model from file first, e.g. data/PILIS/PILIS_model_default.dat" << endl;
443
if (peptide.size() >= (Size)param_.getValue("visible_model_depth"))
445
cerr << "PILISModel: cannot train peptide " << peptide << " of length " << peptide.size() << " (max for this model is " << param_.getValue("visible_model_depth") << ", as defined by parameter \"visible_model_depth\")" << endl;
449
RichPeakSpectrum train_spec = in_spec;
450
train_spec.sortByPosition();
452
#ifdef TRAINING_DEBUG
453
cout << "peptide: " << peptide << "(z=" << charge << ")" << endl;
456
// get proton distribution
457
vector<DoubleReal> bb_charge_full, sc_charge_full;
458
prot_dist_.getProtonDistribution(bb_charge_full, sc_charge_full, peptide, charge, Residue::YIon);
459
prot_dist_.setPeptideProtonDistribution(bb_charge_full, sc_charge_full);
461
// get start probabilities
462
vector<DoubleReal> bb_init, sc_init, cr_init;
463
DoubleReal precursor_init(0);
464
bool is_charge_remote = getInitialTransitionProbabilities_(bb_init, cr_init, sc_init, precursor_init, bb_charge_full, sc_charge_full, peptide);
466
// clear the main Hidden Markov Model
467
hmm_.clearInitialTransitionProbabilities();
468
hmm_.clearTrainingEmissionProbabilities();
470
//DoubleReal harge_sum(0);
471
vector<AASequence> prefixes, suffixes;
473
DoubleReal pep_weight(peptide.getMonoWeight());
474
DoubleReal peptide_mz((pep_weight + charge)/(DoubleReal)charge);
477
// 1. set proton distribution,
478
// 2. initial training intensities,
479
// 3. train the model
480
for (Size i = 0; i != peptide.size() - 1; ++i)
482
String pos_name, prefix_size(i + 1), suffix_size(peptide.size() - 1 - i);
484
if (i < floor((peptide.size() - 1.0)/2.0))
486
pos_name = prefix_size;
490
pos_name = "k-"+suffix_size;
493
AASequence prefix(peptide.getPrefix(i + 1)), suffix(peptide.getSuffix(peptide.size() - i - 1));
494
AASequence aa1_seq, aa2_seq;
495
aa1_seq += &peptide[i];
496
aa2_seq += &peptide[i + 1];
497
String aa1(aa1_seq.toString()), aa2(aa2_seq.toString());
499
// calc PAs and get b/y ratios for bxyz pathway
500
vector<DoubleReal> b_cr_ints(charge, 0), y_cr_ints(charge, 0), b_sc_ints(charge, 0), y_sc_ints(charge, 0), b_ints(charge, 0), y_ints(charge, 0), a_ints(charge, 0), ay_ints(charge, 0);
501
prot_dist_.getChargeStateIntensities(peptide, prefix, suffix, charge, Residue::BIon, b_ints, y_ints, ProtonDistributionModel::ChargeDirected);
503
prot_dist_.getChargeStateIntensities(peptide, prefix, suffix, charge, Residue::AIon, a_ints, ay_ints, ProtonDistributionModel::ChargeDirected);
505
if (!is_charge_remote)
507
hmm_.setInitialTransitionProbability("BB"+pos_name, bb_init[i]);
508
hmm_.setInitialTransitionProbability(aa1+aa2+"_bxyz"+pos_name, bb_init[i]);
509
hmm_.setInitialTransitionProbability(aa1+aa2+"_axyz"+pos_name, bb_init[i]);
512
prefixes.push_back(prefix);
513
suffixes.push_back(suffix);
515
if ((aa1 == "D" || aa1 == "E" || pos_name == "k-1" || pos_name == "k-2") && is_charge_remote)
517
hmm_.setInitialTransitionProbability("CR"+pos_name, cr_init[i]);
518
prot_dist_.getChargeStateIntensities(peptide, prefix, suffix, charge, Residue::BIon, b_cr_ints, y_cr_ints, ProtonDistributionModel::ChargeRemote);
519
//cerr << "ChargeStats: CR=" << CR_charges[i] << ", " << peptide.getPrefix(i+1) << "-" << peptide.getSuffix(peptide.size() - 1 - i) << ", " << charge << endl;
522
if ((aa1 == "K" || aa1 == "H" || aa1 == "R") && is_charge_remote)
524
prot_dist_.getChargeStateIntensities(peptide, prefix, suffix, charge, Residue::BIon, b_sc_ints, y_sc_ints, ProtonDistributionModel::SideChain);
525
hmm_.setInitialTransitionProbability("SC"+pos_name, /*sc_charge_full[i]*/ sc_init[i]);
526
//cerr << "ChargeStats: SC=" << SC_charges[i] << ", " << peptide.getPrefix(i+1) << "-" << peptide.getSuffix(peptide.size() - 1 - i) << ", " << charge << endl;
530
UInt max_fragment_charge_training = param_.getValue("max_fragment_charge_training");
531
Map<int, DoubleReal> sum_a, sum_b, sum_y;
532
DoubleReal sum_a_ints(0.0), sum_b_ints(0.0), sum_y_ints(0.0);
533
for (UInt z = 1; z <= max_fragment_charge_training && z <= charge; ++z)
538
DoubleReal charge_remote_threshold((DoubleReal)param_.getValue("charge_remote_threshold"));
539
DoubleReal avail_bb_sum_prefix = getAvailableBackboneCharge_(prefix, Residue::BIon, z);
540
DoubleReal avail_bb_sum_suffix = getAvailableBackboneCharge_(suffix, Residue::YIon, z);
542
if (prefix.size() != 2)
544
DoubleReal pre_weight = prefix.getMonoWeight(Residue::BIon);
546
if (avail_bb_sum_prefix <= charge_remote_threshold)
548
//cerr << "Train b-ion losses, CR (avail=" << avail_bb_sum_prefix << ", z=" << z << ", prefix=" << prefix << endl;
549
sum_b[z] += b_ion_losses_cr_.train(in_spec, prefix, pre_weight, z, pep_weight);
553
//cerr << "Train b-ion losses, CD (avail=" << avail_bb_sum_prefix << ", z=" << z << ", prefix=" << prefix << endl;
554
sum_b[z] += b_ion_losses_cd_.train(in_spec, prefix, pre_weight, z, pep_weight);
559
DoubleReal pre_weight = prefix.getMonoWeight(Residue::BIon);
561
if (avail_bb_sum_prefix <= charge_remote_threshold)
563
sum_b[z] += b2_ion_losses_cr_.train(in_spec, prefix, pre_weight, z, pep_weight);
567
sum_b[z] += b2_ion_losses_cd_.train(in_spec, prefix, pre_weight, z, pep_weight);
571
DoubleReal a_pre_weight = prefix.getMonoWeight(Residue::AIon);
572
if (avail_bb_sum_prefix <= charge_remote_threshold)
574
sum_a[z] += a_ion_losses_cr_.train(in_spec, prefix, a_pre_weight, z, pep_weight);
578
sum_a[z] += a_ion_losses_cd_.train(in_spec, prefix, a_pre_weight, z, pep_weight);
581
DoubleReal suf_weight = suffix.getMonoWeight(Residue::YIon);
582
if (avail_bb_sum_suffix <= charge_remote_threshold)
584
//cerr << "Train y-ion losses, CR (avail=" << avail_bb_sum_suffix << ", z=" << z << ", suffix=" << suffix << endl;
585
sum_y[z] += y_ion_losses_cr_.train(in_spec, suffix, suf_weight, z, pep_weight);
589
//cerr << "Train y-ion losses, CD (avail=" << avail_bb_sum_suffix << ", z=" << z << ", suffix=" << suffix << endl;
590
sum_y[z] += y_ion_losses_cd_.train(in_spec, suffix, suf_weight, z, pep_weight);
593
sum_a_ints += sum_a[z];
594
sum_b_ints += sum_b[z];
595
sum_y_ints += sum_y[z];
598
// end state is always needed
599
hmm_.setTrainingEmissionProbability("end"+pos_name, 0.5/(DoubleReal(peptide.size() - 1)));
600
if (!is_charge_remote)
602
//hmm_.setTrainingEmissionProbability("AA"+pos_name, sum_a_ints + sum_b_ints + sum_y_ints);
603
hmm_.enableTransition("AA" + pos_name, aa1 + aa2 + "_bxyz" + pos_name);
604
hmm_.enableTransition("AA" + pos_name, aa1 + aa2 + "_axyz" + pos_name);
606
// now enable the states
607
hmm_.enableTransition("BB"+pos_name, "AA"+pos_name);
608
hmm_.enableTransition("BB"+pos_name, "end"+pos_name);
611
hmm_.enableTransition(aa1+aa2+"_bxyz" + pos_name, "bxyz"+pos_name);
612
hmm_.enableTransition(aa1+aa2+"_bxyz" + pos_name, "end"+pos_name);
614
DoubleReal pre_emission_prob(0), suf_emission_prob(0);
615
for (UInt z = 1; z <= max_fragment_charge_training && z <= charge; ++z)
617
pre_emission_prob += b_ints[z - 1] * sum_b[z];
618
suf_emission_prob += y_ints[z - 1] * sum_y[z];
620
hmm_.setTransitionProbability("bxyz" + pos_name, "bxyz_" + pos_name + "-prefix", 1.0);
621
hmm_.setTransitionProbability("bxyz" + pos_name, "bxyz_" + pos_name + "-suffix", 1.0);
622
hmm_.enableTransition("bxyz_" + pos_name + "-prefix", "bxyz_" + pos_name + "-prefix-ions");
623
hmm_.enableTransition("bxyz_" + pos_name + "-prefix", "end" + pos_name);
624
hmm_.enableTransition("bxyz_" + pos_name + "-suffix", "bxyz_" + pos_name + "-suffix-ions");
625
hmm_.enableTransition("bxyz_" + pos_name + "-suffix", "end" + pos_name);
627
hmm_.setTrainingEmissionProbability("bxyz_" + pos_name + "-prefix-ions", pre_emission_prob);
628
hmm_.setTrainingEmissionProbability("bxyz_" + pos_name + "-suffix-ions", suf_emission_prob);
631
hmm_.enableTransition(aa1+aa2+"_axyz"+pos_name, "axyz"+pos_name);
632
hmm_.enableTransition(aa1+aa2+"_axyz"+pos_name, "end"+pos_name);
634
pre_emission_prob = 0;
635
suf_emission_prob = 0;
636
for (UInt z = 1; z <= max_fragment_charge_training && z <= charge; ++z)
638
pre_emission_prob += a_ints[z - 1] * sum_a[z];
639
//suf_emission_prob += ay_ints[z] * sum_y[z]; // TODO test if this can be done, or ruins the a-ion intensities
641
hmm_.setTransitionProbability("axyz" + pos_name, "axyz_" + pos_name + "-prefix", 1.0);
642
hmm_.enableTransition("axyz_" + pos_name + "-prefix", "axyz_" + pos_name + "-prefix-ions");
643
hmm_.enableTransition("axyz_" + pos_name + "-prefix", "end" + pos_name);
644
hmm_.setTrainingEmissionProbability("axyz_" + pos_name + "-prefix-ions", pre_emission_prob);
648
const String cr_aa("DE");
649
for (String::ConstIterator it = cr_aa.begin(); it != cr_aa.end(); ++it)
651
if (is_charge_remote && aa1 == String(*it))
653
hmm_.enableTransition("CR"+pos_name, "A"+pos_name);
654
hmm_.enableTransition("CR"+pos_name, "end"+pos_name);
656
DoubleReal pre_emission_prob(0), suf_emission_prob(0);
657
for (UInt z = 1; z <= max_fragment_charge_training && z <= charge; ++z)
659
pre_emission_prob += b_cr_ints[z - 1] * sum_b[z];
660
suf_emission_prob += y_cr_ints[z - 1] * sum_y[z];
663
//hmm_.setTrainingEmissionProbability("A"+pos_name, pre_emission_prob + suf_emission_prob);
664
hmm_.enableTransition("A" + pos_name, aa2 + "_" + String(*it) + pos_name);
666
hmm_.setTransitionProbability(String(*it) + pos_name, String(*it) + "_" + pos_name + "-prefix", 1.0);
667
hmm_.enableTransition(String(*it) + "_" + pos_name + "-prefix", String(*it) + "_" + pos_name + "-prefix-ions");
668
hmm_.enableTransition(String(*it) + "_" + pos_name + "-prefix", "end" + pos_name);
669
hmm_.setTrainingEmissionProbability(String(*it) + "_" + pos_name + "-prefix-ions", pre_emission_prob);
671
hmm_.setTransitionProbability(String(*it) + pos_name, String(*it) + "_" + pos_name + "-suffix", 1.0);
672
hmm_.enableTransition(String(*it) + "_" + pos_name + "-suffix", String(*it) + "_" + pos_name + "-suffix-ions");
673
hmm_.enableTransition(String(*it) + "_" + pos_name + "-suffix", "end" + pos_name);
674
hmm_.setTrainingEmissionProbability(String(*it) + "_" + pos_name + "-suffix-ions", suf_emission_prob);
676
hmm_.setInitialTransitionProbability(aa2+"_" + String(*it) + pos_name, cr_init[i]);
677
hmm_.enableTransition(aa2+"_" + String(*it) + pos_name, String(*it) + pos_name);
678
hmm_.enableTransition(aa2+"_" + String(*it) + pos_name, "end" + pos_name);
682
if (is_charge_remote && !peptide.has("D") && !peptide.has("E"))
685
if (pos_name == "k-1")
687
hmm_.enableTransition("CRk-1", "Ak-1");
688
hmm_.enableTransition("CRk-1", "endk-1");
690
DoubleReal pre_emission_prob(0), suf_emission_prob(0);
691
for (UInt z = 1; z <= max_fragment_charge_training && z <= charge; ++z)
693
pre_emission_prob += b_cr_ints[z - 1] * sum_b[z];
694
suf_emission_prob += y_cr_ints[z - 1] * sum_y[z];
697
//hmm_.setTrainingEmissionProbability("Ak-1", pre_emission_prob + suf_emission_prob);
698
hmm_.enableTransition("Ak-1", aa1 + "_bk-1");
701
hmm_.setTransitionProbability("bk-1", "bk-1_-prefix", 1.0);
702
hmm_.enableTransition("bk-1_-prefix", "bk-1_-prefix-ions");
703
hmm_.enableTransition("bk-1_-prefix", "endk-1");
704
hmm_.setTrainingEmissionProbability("bk-1_-prefix-ions", pre_emission_prob);
706
hmm_.setTransitionProbability("bk-1", "bk-1_-suffix", 1.0);
707
hmm_.enableTransition("bk-1_-suffix", "bk-1_-suffix-ions");
708
hmm_.enableTransition("bk-1_-suffix", "endk-1");
709
hmm_.setTrainingEmissionProbability("bk-1_-suffix-ions", suf_emission_prob);
711
hmm_.setTransitionProbability("bk-1", "bk-1_-ions", 1.0);
713
hmm_.setInitialTransitionProbability(aa1+"_bk-1", cr_init[i]);
714
hmm_.enableTransition(aa1+"_bk-1", "bk-1");
715
hmm_.enableTransition(aa1+"_bk-1", "endk-1");
718
if (pos_name == "k-2")
720
hmm_.enableTransition("CRk-2", "Ak-2");
721
hmm_.enableTransition("CRk-2", "endk-2");
723
DoubleReal pre_emission_prob(0), suf_emission_prob(0);
724
for (UInt z = 1; z <= max_fragment_charge_training && z <= charge; ++z)
726
pre_emission_prob += b_cr_ints[z - 1] * sum_b[z];
727
suf_emission_prob += y_cr_ints[z - 1] * sum_y[z];
730
//hmm_.setTrainingEmissionProbability("Ak-2", pre_emission_prob + suf_emission_prob);
731
hmm_.enableTransition("Ak-2", aa1 + "_bk-2");
734
hmm_.setTransitionProbability("bk-2", "bk-2_-prefix", 1.0);
735
hmm_.enableTransition("bk-2_-prefix", "bk-2_-prefix-ions");
736
hmm_.enableTransition("bk-2_-prefix", "endk-2");
737
hmm_.setTrainingEmissionProbability("bk-2_-prefix-ions", pre_emission_prob);
739
hmm_.setTransitionProbability("bk-2", "bk-2_-suffix", 1.0);
740
hmm_.enableTransition("bk-2_-suffix", "bk-2_-suffix-ions");
741
hmm_.enableTransition("bk-2_-suffix", "endk-2");
742
hmm_.setTrainingEmissionProbability("bk-2_-suffix-ions", suf_emission_prob);
744
hmm_.setTransitionProbability("bk-2", "bk-2_-ions", 1.0);
746
hmm_.setInitialTransitionProbability(aa1+"_bk-2", cr_init[i]);
747
hmm_.enableTransition(aa1+"_bk-2", "bk-2");
748
hmm_.enableTransition(aa1+"_bk-2", "endk-2");
752
const String sc_aa("KRH");
753
for (String::ConstIterator it = sc_aa.begin(); it != sc_aa.end(); ++it)
755
if (is_charge_remote && aa1 == String(*it))
758
hmm_.enableTransition("SC"+pos_name, "ASC"+pos_name);
759
hmm_.enableTransition("SC"+pos_name, "end"+pos_name);
761
DoubleReal pre_emission_prob(0), suf_emission_prob(0);
762
for (UInt z = 1; z <= max_fragment_charge_training && z <= charge; ++z)
764
pre_emission_prob += b_sc_ints[z - 1] * sum_b[z];
765
suf_emission_prob += y_sc_ints[z - 1] * sum_y[z];
768
//hmm_.setTrainingEmissionProbability("ASC"+pos_name, pre_emission_prob + suf_emission_prob);
769
hmm_.enableTransition("ASC" + pos_name, aa2 + "_" + String(*it) + pos_name);
771
hmm_.setTransitionProbability(String(*it) + pos_name, String(*it) + "_" + pos_name + "-prefix", 1.0);
772
hmm_.setTransitionProbability(String(*it) + pos_name, String(*it) + "_" + pos_name + "-suffix", 1.0);
774
hmm_.enableTransition(String(*it) + "_" + pos_name + "-prefix", String(*it) + "_" + pos_name + "-prefix-ions");
775
hmm_.enableTransition(String(*it) + "_" + pos_name + "-prefix", "end" + pos_name);
776
hmm_.enableTransition(String(*it) + "_" + pos_name + "-suffix", String(*it) + "_" + pos_name + "-suffix-ions");
777
hmm_.enableTransition(String(*it) + "_" + pos_name + "-suffix", "end" + pos_name);
779
hmm_.setTrainingEmissionProbability(String(*it) + "_" + pos_name + "-prefix-ions", pre_emission_prob);
780
hmm_.setTrainingEmissionProbability(String(*it) + "_" + pos_name + "-suffix-ions", suf_emission_prob);
783
hmm_.setInitialTransitionProbability(aa2 + "_" + String(*it) + pos_name, sc_init[i]);
784
hmm_.enableTransition(aa2+"_" + String(*it) + pos_name, String(*it) + pos_name);
785
hmm_.enableTransition(aa2+"_" + String(*it) + pos_name, "end"+pos_name);
791
if (is_charge_remote)
793
precursor_model_cr_.train(in_spec, peptide, peptide_mz, charge, pep_weight);
797
precursor_model_cd_.train(in_spec, peptide, peptide_mz, charge, pep_weight);
800
// now train the model with the data set
802
hmm_.disableTransitions();
807
void PILISModel::evaluate()
810
precursor_model_cr_.evaluate();
811
precursor_model_cd_.evaluate();
812
a_ion_losses_cr_.evaluate();
813
a_ion_losses_cd_.evaluate();
814
b_ion_losses_cr_.evaluate();
815
b_ion_losses_cd_.evaluate();
816
b2_ion_losses_cr_.evaluate();
817
b2_ion_losses_cd_.evaluate();
818
y_ion_losses_cr_.evaluate();
819
y_ion_losses_cd_.evaluate();
821
hmm_.setVariableModifications((StringList)param_.getValue("variable_modifications"));
822
hmm_.estimateUntrainedTransitions();
825
void PILISModel::getSpectrum(RichPeakSpectrum& spec, const AASequence& peptide, UInt charge)
829
cerr << "PILISModel: cannot simulate, initialize model from file first, e.g. data/PILIS/PILIS_model_default.dat" << endl;
833
if (peptide.size() > (Size)param_.getValue("visible_model_depth"))
835
cerr << "PILISModel: cannot generate spectra of peptide '" << peptide << "' of length " << peptide.size() << " (max of this model is " << param_.getValue("visible_model_depth") << ", as defined by \"visible_model_depth\")" << endl;
839
// calc proton distribution
840
vector<DoubleReal> sc_charge_full, bb_charge_full;
841
//cerr << "getProtonDistribution: " << peptide << " " << charge << endl;
842
prot_dist_.getProtonDistribution(bb_charge_full, sc_charge_full, peptide, charge, Residue::YIon);
843
prot_dist_.setPeptideProtonDistribution(bb_charge_full, sc_charge_full);
845
#ifdef INIT_CHARGE_DEBUG
846
for (Size i = 0; i != bb_charge_full.size() - 1; ++i)
848
cerr << "i: bb=" << bb_charge_full[i] << ", sc=" << sc_charge_full[i] << endl;
852
hmm_.clearInitialTransitionProbabilities();
853
hmm_.clearTrainingEmissionProbabilities();
856
vector<DoubleReal> bb_init, sc_init, cr_init;
857
DoubleReal precursor_init(0);
858
bool is_charge_remote = getInitialTransitionProbabilities_(bb_init, cr_init, sc_init, precursor_init, bb_charge_full, sc_charge_full, peptide);
859
#ifdef INIT_CHARGE_DEBUG
860
cerr << "is_charge_remote=" << is_charge_remote << endl;
861
for (Size i = 0; i != bb_init.size(); ++i)
863
cerr << "bb=" << bb_init[i] << ", cr=" << cr_init[i] << ", sc=" << sc_init[i] << endl;
865
cerr << "precursor_init=" << precursor_init << endl;
868
vector<AASequence> suffixes, prefixes;
869
vector<String> pos_names;
871
vector<vector<DoubleReal> > all_b_cr_ints, all_y_cr_ints, all_b_sc_ints, all_y_sc_ints, all_b_ints, all_y_ints, all_a_ints, all_ay_ints;
873
for (Size i = 0; i != peptide.size() - 1; ++i)
875
String pos_name, y_name1, b_name1, a_name1, y_name, b_name;
876
String y_name2, b_name2, a_name2;
877
String i_plus1(i+1), pep_size_i(peptide.size() - 1 - i);
879
if (i < floor((peptide.size() - 1.0)/2.0))
885
pos_name = "k-"+pep_size_i;
888
AASequence prefix(peptide.getPrefix(i + 1)), suffix(peptide.getSuffix(peptide.size() - 1 - i));
889
suffixes.push_back(suffix);
890
prefixes.push_back(prefix);
891
pos_names.push_back(pos_name);
893
AASequence aa1_seq, aa2_seq;
894
aa1_seq += &peptide[i];
895
aa2_seq += &peptide[i + 1];
896
String aa1(aa1_seq.toString()), aa2(aa2_seq.toString());
898
hmm_.setInitialTransitionProbability("BB"+pos_name, bb_init[i]);
900
vector<DoubleReal> b_cr_ints(charge, 0), y_cr_ints(charge, 0), b_sc_ints(charge, 0), y_sc_ints(charge, 0), b_ints(charge, 0), y_ints(charge, 0), a_ints(charge, 0), ay_ints(charge, 0);
901
if ((aa1 == "D" || aa1 == "E" || pos_name == "k-1" || pos_name == "k-2") && is_charge_remote)
903
hmm_.setInitialTransitionProbability("CR"+pos_name, cr_init[i]);
904
prot_dist_.getChargeStateIntensities(peptide, prefix, suffix, charge, Residue::BIon, b_cr_ints, y_cr_ints, ProtonDistributionModel::ChargeRemote);
907
if ((aa1 == "K" || aa1 == "H" || aa1 == "R") && is_charge_remote)
909
hmm_.setInitialTransitionProbability("SC"+pos_name, sc_init[i]);
910
prot_dist_.getChargeStateIntensities(peptide, prefix, suffix, charge, Residue::BIon, b_sc_ints, y_sc_ints, ProtonDistributionModel::SideChain);
913
prot_dist_.getChargeStateIntensities(peptide, prefix, suffix, charge, Residue::BIon, b_ints, y_ints, ProtonDistributionModel::ChargeDirected);
914
prot_dist_.getChargeStateIntensities(peptide, prefix, suffix, charge, Residue::AIon, a_ints, ay_ints, ProtonDistributionModel::ChargeDirected);
918
#ifdef INIT_CHARGE_DEBUG
919
cerr << prefix << " - " << suffix << " ";
920
for (Size ions_charge = 0; ions_charge != b_ints.size(); ++ions_charge)
922
cerr << b_ints[ions_charge] << " - " << y_ints[ions_charge] << " | ";
928
all_a_ints.push_back(a_ints);
929
all_ay_ints.push_back(ay_ints);
930
all_b_ints.push_back(b_ints);
931
all_b_cr_ints.push_back(b_cr_ints);
932
all_y_cr_ints.push_back(y_cr_ints);
933
all_b_sc_ints.push_back(b_sc_ints);
934
all_y_sc_ints.push_back(y_sc_ints);
935
all_y_ints.push_back(y_ints);
937
// now enable the states
938
hmm_.enableTransition("BB"+pos_name, "AA"+pos_name);
939
hmm_.enableTransition("BB"+pos_name, "end"+pos_name);
941
hmm_.enableTransition("AA"+pos_name, aa1+aa2+"_bxyz"+pos_name);
942
hmm_.enableTransition(aa1+aa2+"_bxyz"+pos_name, "bxyz"+pos_name);
943
hmm_.enableTransition(aa1+aa2+"_bxyz"+pos_name, "end"+pos_name);
945
hmm_.setTransitionProbability("bxyz" + pos_name, "bxyz_" + pos_name + "-prefix", 1.0);
946
hmm_.setTransitionProbability("bxyz" + pos_name, "bxyz_" + pos_name + "-suffix", 1.0);
948
hmm_.enableTransition("bxyz_" + pos_name + "-prefix", "bxyz_" + pos_name + "-prefix-ions");
949
hmm_.enableTransition("bxyz_" + pos_name + "-prefix", "end" + pos_name);
950
hmm_.enableTransition("bxyz_" + pos_name + "-suffix", "bxyz_" + pos_name + "-suffix-ions");
951
hmm_.enableTransition("bxyz_" + pos_name + "-suffix", "end" + pos_name);
955
hmm_.enableTransition("AA"+pos_name, aa1+aa2+"_axyz"+pos_name);
956
hmm_.enableTransition(aa1+aa2+"_axyz"+pos_name, "axyz"+pos_name);
957
hmm_.enableTransition(aa1+aa2+"_axyz"+pos_name, "end"+pos_name);
958
hmm_.setTransitionProbability("axyz" + pos_name, "axyz_" + pos_name + "-prefix", 1.0);
959
hmm_.enableTransition("axyz_" + pos_name + "-prefix", "axyz_" + pos_name + "-prefix-ions");
960
hmm_.enableTransition("axyz_" + pos_name + "-prefix", "end" + pos_name);
962
const String cr_aa("DE");
963
for (String::ConstIterator it = cr_aa.begin(); it != cr_aa.end(); ++it)
965
if (is_charge_remote && aa1 == String(*it))
967
hmm_.setTransitionProbability(String(*it) + pos_name, String(*it) + "_" + pos_name + "-prefix", 1.0);
968
hmm_.setTransitionProbability(String(*it) + pos_name, String(*it) + "_" + pos_name + "-suffix", 1.0);
970
hmm_.enableTransition(String(*it) + "_" + pos_name + "-prefix", String(*it) + "_" + pos_name + "-prefix-ions");
971
hmm_.enableTransition(String(*it) + "_" + pos_name + "-prefix", "end" + pos_name);
972
hmm_.enableTransition(String(*it) + "_" + pos_name + "-suffix", String(*it) + "_" + pos_name + "-suffix-ions");
973
hmm_.enableTransition(String(*it) + "_" + pos_name + "-suffix", "end" + pos_name);
975
hmm_.enableTransition("CR"+pos_name, "A"+pos_name);
976
hmm_.enableTransition("CR"+pos_name, "end"+pos_name);
977
hmm_.enableTransition("A"+pos_name, aa2+"_" + String(*it) + pos_name);
978
hmm_.enableTransition(aa2+"_" + String(*it) + pos_name, String(*it) + pos_name);
979
hmm_.enableTransition(aa2+"_" + String(*it) + pos_name, "end"+pos_name);
983
if (!peptide.has("D") && !peptide.has("E") && is_charge_remote)
985
if (pos_name == "k-1")
987
hmm_.setTransitionProbability("bk-1", "bk-1_-prefix", 1.0);
988
hmm_.setTransitionProbability("bk-1", "bk-1_-suffix", 1.0);
990
hmm_.enableTransition("bk-1_-prefix", "bk-1_-prefix-ions");
991
hmm_.enableTransition("bk-1_-prefix", "endk-1" );
992
hmm_.enableTransition("bk-1_-suffix", "bk-1_-suffix-ions");
993
hmm_.enableTransition("bk-1_-suffix", "endk-1");
995
hmm_.enableTransition("CRk-1", "Ak-1");
996
hmm_.enableTransition("CRk-1", "endk-1");
997
hmm_.enableTransition("Ak-1", aa1+"_bk-1");
999
hmm_.enableTransition(aa1 + "_bk-1", "bk-1");
1000
hmm_.enableTransition(aa1 + "_bk-1", "endk-1");
1003
if (pos_name == "k-2")
1005
hmm_.setTransitionProbability("bk-2", "bk-2_-prefix", 1.0);
1006
hmm_.setTransitionProbability("bk-2", "bk-2_-suffix", 1.0);
1008
hmm_.enableTransition("bk-2_-prefix", "bk-2_-prefix-ions");
1009
hmm_.enableTransition("bk-2_-prefix", "endk-2" );
1010
hmm_.enableTransition("bk-2_-suffix", "bk-2_-suffix-ions");
1011
hmm_.enableTransition("bk-2_-suffix", "endk-2");
1013
hmm_.enableTransition("CRk-2", "Ak-2");
1014
hmm_.enableTransition("CRk-2", "endk-2");
1015
hmm_.enableTransition("Ak-2", aa1+"_bk-2");
1017
hmm_.enableTransition(aa1 + "_bk-2", "bk-2");
1018
hmm_.enableTransition(aa1 + "_bk-2", "endk-2");
1022
const String sc_aa("HKR");
1023
for (String::ConstIterator it = sc_aa.begin(); it != sc_aa.end(); ++it)
1025
if (is_charge_remote && aa1 == String(*it))
1027
hmm_.setTransitionProbability(String(*it) + pos_name, String(*it) + "_" + pos_name + "-prefix", 1.0);
1028
hmm_.setTransitionProbability(String(*it) + pos_name, String(*it) + "_" + pos_name + "-suffix", 1.0);
1030
hmm_.enableTransition(String(*it) + "_" + pos_name + "-prefix", String(*it) + "_" + pos_name + "-prefix-ions");
1031
hmm_.enableTransition(String(*it) + "_" + pos_name + "-prefix", "end" + pos_name);
1032
hmm_.enableTransition(String(*it) + "_" + pos_name + "-suffix", String(*it) + "_" + pos_name + "-suffix-ions");
1033
hmm_.enableTransition(String(*it) + "_" + pos_name + "-suffix", "end" + pos_name);
1037
hmm_.enableTransition("SC"+pos_name, "ASC"+pos_name);
1038
hmm_.enableTransition("SC"+pos_name, "end"+pos_name);
1039
hmm_.enableTransition("ASC"+pos_name, aa2+"_" + String(*it) + pos_name);
1040
hmm_.enableTransition(aa2+"_" + String(*it) + pos_name, String(*it) + pos_name);
1041
hmm_.enableTransition(aa2+"_" + String(*it) + pos_name, "end"+pos_name);
1046
//cerr << "Collecting peaks..." << endl;
1048
Map<HMMState*, DoubleReal> tmp;
1049
hmm_.calculateEmissionProbabilities(tmp);
1051
// clear peaks from last spectrum
1054
//stringstream peptide_ss;
1055
//peptide_ss << peptide;
1056
//hmm_.writeGraphMLFile(String("model_graph_train_"+peptide_ss.str()+"_"+String(charge)+".graphml").c_str());
1058
UInt max_isotope = (UInt)param_.getValue("max_isotope");
1059
UInt max_fragment_charge = (UInt)param_.getValue("max_fragment_charge");
1060
DoubleReal charge_remote_threshold = (DoubleReal)param_.getValue("charge_remote_threshold");
1061
for (Size i = 0; i != prefixes.size(); ++i)
1065
aa_seq += peptide[i].getOneLetterCode();
1066
aa = aa_seq.toString();
1068
vector<DoubleReal> pre_path_intensities, suf_path_intensities;
1069
pre_path_intensities.push_back(tmp[hmm_.getState("bxyz_" + pos_names[i] + "-prefix-ions")]);
1070
suf_path_intensities.push_back(tmp[hmm_.getState("bxyz_" + pos_names[i] + "-suffix-ions")]);
1071
#ifdef INIT_CHARGE_DEBUG
1072
cerr << prefixes[i] << " - " << suffixes[i] << ": bxyz=" << pre_path_intensities.back() << "|" << suf_path_intensities.back() << " ";
1075
const String cr_and_sc("DEHKR");
1076
for (String::ConstIterator it = cr_and_sc.begin(); it != cr_and_sc.end(); ++it)
1078
if (aa == String(*it))
1080
pre_path_intensities.push_back(tmp[hmm_.getState(String(*it) + "_" + pos_names[i] + "-prefix-ions")]);
1081
suf_path_intensities.push_back(tmp[hmm_.getState(String(*it) + "_" + pos_names[i] + "-suffix-ions")]);
1082
#ifdef INIT_CHARGE_DEBUG
1083
cerr << ": " << aa << "=" << pre_path_intensities.back() << "|" << suf_path_intensities.back() << " ";
1088
if (i == peptide.size() - 2)
1090
pre_path_intensities.push_back(tmp[hmm_.getState("bk-1_-prefix-ions")]);
1091
suf_path_intensities.push_back(tmp[hmm_.getState("bk-1_-suffix-ions")]);
1093
if (i == peptide.size() - 3)
1095
pre_path_intensities.push_back(tmp[hmm_.getState("bk-2_-prefix-ions")]);
1096
suf_path_intensities.push_back(tmp[hmm_.getState("bk-2_-suffix-ions")]);
1099
pre_path_intensities.push_back(tmp[hmm_.getState("axyz_" + pos_names[i] + "-prefix-ions")]);
1100
suf_path_intensities.push_back(tmp[hmm_.getState("axyz_" + pos_names[i] + "-suffix-ions")]);
1102
vector<vector<vector<DoubleReal> > > prefix_intensities, suffix_intensities;
1103
prefix_intensities.push_back(all_b_ints);
1104
suffix_intensities.push_back(all_y_ints);
1105
const String sc_aa("HKR");
1106
if (sc_aa.hasSubstring(aa))
1108
prefix_intensities.push_back(all_b_sc_ints);
1109
suffix_intensities.push_back(all_y_sc_ints);
1111
const String cr_aa("DE");
1112
if (cr_aa.hasSubstring(aa))
1114
prefix_intensities.push_back(all_b_cr_ints);
1115
suffix_intensities.push_back(all_y_cr_ints);
1118
if (i == peptide.size() - 2 || i == peptide.size() - 3)
1120
prefix_intensities.push_back(all_b_cr_ints);
1121
suffix_intensities.push_back(all_y_cr_ints);
1124
prefix_intensities.push_back(all_a_ints);
1125
suffix_intensities.push_back(all_ay_ints);
1127
for (Size int_it = 0; int_it != pre_path_intensities.size(); ++int_it)
1129
if (pre_path_intensities[int_it] < MIN_DECIMAL_VALUE && suf_path_intensities[int_it] < MIN_DECIMAL_VALUE)
1133
DoubleReal prefix_weight = prefixes[i].getMonoWeight(Residue::BIon);
1134
DoubleReal suffix_weight = suffixes[i].getMonoWeight(Residue::YIon);
1135
IsotopeDistribution prefix_id;
1137
if (int_it != pre_path_intensities.size() - 1)
1139
prefix_id = prefixes[i].getFormula(Residue::BIon).getIsotopeDistribution(max_isotope);
1143
prefix_id = prefixes[i].getFormula(Residue::AIon).getIsotopeDistribution(max_isotope);
1145
IsotopeDistribution suffix_id = suffixes[i].getFormula(Residue::YIon).getIsotopeDistribution(max_isotope);
1147
for (UInt z = 1; z <= charge && z <= max_fragment_charge; ++z)
1149
if (prefix_intensities[int_it][i][z - 1] > MIN_DECIMAL_VALUE)
1151
vector<RichPeak1D> b_loss_peaks;
1152
DoubleReal avail_bb_sum_prefix(0);
1154
if (int_it != pre_path_intensities.size() - 1)
1156
avail_bb_sum_prefix = getAvailableBackboneCharge_(prefixes[i], Residue::BIon, z);
1157
if (avail_bb_sum_prefix <= charge_remote_threshold)
1159
if (i == 1) // second BB position
1161
b2_ion_losses_cr_.getIons(b_loss_peaks, prefixes[i], prefix_intensities[int_it][i][z - 1] * pre_path_intensities[int_it]);
1165
b_ion_losses_cr_.getIons(b_loss_peaks, prefixes[i], prefix_intensities[int_it][i][z - 1] * pre_path_intensities[int_it]);
1172
b2_ion_losses_cd_.getIons(b_loss_peaks, prefixes[i], prefix_intensities[int_it][i][z - 1] * pre_path_intensities[int_it]);
1176
b_ion_losses_cd_.getIons(b_loss_peaks, prefixes[i], prefix_intensities[int_it][i][z - 1] * pre_path_intensities[int_it]);
1182
avail_bb_sum_prefix = getAvailableBackboneCharge_(prefixes[i], Residue::AIon, z);
1183
if (avail_bb_sum_prefix <= charge_remote_threshold)
1185
a_ion_losses_cr_.getIons(b_loss_peaks, prefixes[i], prefix_intensities[int_it][i][z - 1] * pre_path_intensities[int_it]);
1189
a_ion_losses_cd_.getIons(b_loss_peaks, prefixes[i], prefix_intensities[int_it][i][z - 1] * pre_path_intensities[int_it]);
1193
for (vector<RichPeak1D>::const_iterator it = b_loss_peaks.begin(); it != b_loss_peaks.end(); ++it)
1195
String b_ion_name = it->getMetaValue("IonName");
1196
#ifdef INIT_CHARGE_DEBUG
1197
cerr << b_ion_name << " " << it->getMZ() << " " << it->getIntensity() << endl;
1199
vector<String> split;
1200
b_ion_name.split('-', split);
1203
b_ion_name += String(i + 1);
1207
b_ion_name = split[0] + String(i + 1) + "-";
1208
for (Size j = 1; j != split.size(); ++j)
1210
b_ion_name += split[j];
1214
b_ion_name += String(z, '+');
1215
if (int_it != pre_path_intensities.size() - 1)
1217
addPeaks_(prefix_weight, z, it->getMZ(), it->getIntensity(), spec, prefix_id, b_ion_name);
1221
addPeaks_(prefix_weight - 28.0, z, it->getMZ(), it->getIntensity(), spec, prefix_id, b_ion_name);
1226
if (suffix_intensities[int_it][i][z - 1] > MIN_DECIMAL_VALUE && int_it != suf_path_intensities.size() - 1) // no ay
1228
vector<RichPeak1D> y_loss_peaks;
1229
DoubleReal avail_bb_sum_suffix = getAvailableBackboneCharge_(suffixes[i], Residue::YIon, z);
1230
if (avail_bb_sum_suffix <= charge_remote_threshold)
1232
y_ion_losses_cr_.getIons(y_loss_peaks, suffixes[i], suffix_intensities[int_it][i][z - 1] * suf_path_intensities[int_it]);
1236
y_ion_losses_cd_.getIons(y_loss_peaks, suffixes[i], suffix_intensities[int_it][i][z - 1] * suf_path_intensities[int_it]);
1239
for (vector<RichPeak1D>::const_iterator it = y_loss_peaks.begin(); it != y_loss_peaks.end(); ++it)
1241
String y_ion_name = it->getMetaValue("IonName");
1242
#ifdef INIT_CHARGE_DEBUG
1243
cerr << y_ion_name << " " << it->getMZ() << " " << it->getIntensity() << endl;
1245
vector<String> split;
1246
y_ion_name.split('-', split);
1249
y_ion_name += String(peptide.size() - i - 1);
1253
y_ion_name = split[0] + String(peptide.size() - i - 1) + "-";
1254
for (Size j = 1; j != split.size(); ++j)
1256
y_ion_name += split[j];
1260
y_ion_name += String(z, '+');
1261
addPeaks_(suffix_weight, z, it->getMZ(), it->getIntensity(), spec, suffix_id, y_ion_name);
1268
hmm_.disableTransitions();
1270
// precursor intensities
1271
vector<RichPeak1D> pre_peaks;
1272
if (is_charge_remote)
1274
precursor_model_cr_.getIons(pre_peaks, peptide, precursor_init);
1278
precursor_model_cd_.getIons(pre_peaks, peptide, precursor_init);
1281
DoubleReal weight = peptide.getMonoWeight();
1282
IsotopeDistribution id(max_isotope);
1283
id.estimateFromPeptideWeight(weight);
1284
for (vector<RichPeak1D>::const_iterator it = pre_peaks.begin(); it != pre_peaks.end(); ++it)
1286
addPeaks_(weight, charge, it->getMZ(), it->getIntensity(), spec, id, it->getMetaValue("IonName"));
1289
// now build the spectrum with the peaks
1290
DoubleReal intensity_max(0);
1291
for (Map<DoubleReal, vector<RichPeak1D> >::ConstIterator it = peaks_.begin(); it != peaks_.end(); ++it)
1293
if (it->second.size() == 1 && it->second.begin()->getIntensity() != 0)
1295
spec.push_back(*it->second.begin());
1296
if (intensity_max < spec.back().getIntensity())
1298
intensity_max = spec.back().getIntensity();
1304
DoubleReal int_sum(0);
1305
p = *it->second.begin();
1307
for (vector<RichPeak1D>::const_iterator pit = it->second.begin(); pit != it->second.end(); ++pit)
1309
int_sum += pit->getIntensity();
1310
if (String(pit->getMetaValue("IonName")) != "")
1312
names.insert(pit->getMetaValue("IonName"));
1317
for (set<String>::const_iterator nit = names.begin(); nit != names.end(); ++nit)
1321
p.setMetaValue("IonName", name);
1322
p.setIntensity(int_sum);
1324
if (intensity_max < int_sum)
1326
intensity_max = int_sum;
1331
spec.sortByPosition();
1333
RichPeakSpectrum new_spec;
1334
// add up peak intensities which are close together
1335
vector<RichPeak1D> close_peaks;
1336
for (RichPeakSpectrum::ConstIterator it = spec.begin(); it != spec.end(); ++it)
1339
if (close_peaks.empty())
1341
close_peaks.push_back(*it);
1345
// include peak in cluster
1346
if (it->getPosition() - close_peaks.begin()->getMZ() < 0.1)
1348
close_peaks.push_back(*it);
1354
if (close_peaks.size() > 1)
1356
DoubleReal mz(0), intensity(0);
1358
for (vector<RichPeak1D>::const_iterator pit = close_peaks.begin(); pit != close_peaks.end(); ++pit)
1361
intensity += pit->getIntensity();
1362
String p_name = pit->getMetaValue("IonName");
1366
if (pit != close_peaks.end() - 1)
1373
peak.setPosition(mz / (DoubleReal)close_peaks.size());
1374
peak.setIntensity(intensity);
1375
peak.setMetaValue("IonName", name);
1376
new_spec.push_back(peak);
1378
// clear the actual cluster and actual peak
1379
close_peaks.clear();
1380
close_peaks.push_back(*it);
1383
// cluster has only one peak, add it to the spec and start new cluster
1384
new_spec.push_back(*close_peaks.begin());
1385
close_peaks.clear();
1386
close_peaks.push_back(*it);
1392
DoubleReal min_y_int((DoubleReal)param_.getValue("min_y_ion_intensity"));
1393
DoubleReal min_b_int((DoubleReal)param_.getValue("min_b_ion_intensity"));
1394
DoubleReal min_a_int((DoubleReal)param_.getValue("min_a_ion_intensity"));
1395
DoubleReal min_y_loss_int((DoubleReal)param_.getValue("min_y_loss_intensity"));
1396
DoubleReal min_b_loss_int((DoubleReal)param_.getValue("min_b_loss_intensity"));
1399
for (RichPeakSpectrum::Iterator it = spec.begin(); it != spec.end(); ++it)
1401
it->setIntensity(it->getIntensity() / intensity_max);
1403
String ion_name(it->getMetaValue("IonName"));
1406
if (ion_name.hasSubstring("y") && (charge > 2 || !ion_name.hasSubstring("++")))
1408
if (ion_name.hasSubstring("H2O") || ion_name.hasSubstring("NH3"))
1410
if (it->getIntensity() < min_y_loss_int)
1412
it->setIntensity(min_y_loss_int);
1417
if (it->getIntensity() < min_y_int)
1419
it->setIntensity(min_y_int);
1424
if (ion_name.hasSubstring("b") && (charge > 2 || !ion_name.hasSubstring("++")))
1427
if (ion_name.hasSubstring("H2O") || ion_name.hasSubstring("NH3"))
1429
if (it->getIntensity() < min_b_loss_int)
1431
it->setIntensity(min_b_loss_int);
1436
if (it->getIntensity() < min_b_int)
1438
it->setIntensity(min_b_int);
1443
if (ion_name.hasSubstring("a") && (charge > 2 || !ion_name.hasSubstring("++")))
1445
if (it->getIntensity() < min_a_int)
1447
it->setIntensity(min_a_int);
1456
DoubleReal PILISModel::getAvailableBackboneCharge_(const AASequence& ion, Residue::ResidueType res_type, int charge)
1458
DoubleReal bb_sum(0);
1459
vector<DoubleReal> bb_charges, sc_charges;
1460
prot_dist_.getProtonDistribution(bb_charges, sc_charges, ion, charge, res_type);
1462
for (vector<DoubleReal>::const_iterator it = bb_charges.begin(); it != bb_charges.end(); ++it)
1467
// activation of protons sitting at lysine and histidine side chains
1468
DoubleReal side_chain_activation(param_.getValue("side_chain_activation"));
1469
for (Size i = 0; i != ion.size(); ++i)
1471
if (ion[i].getOneLetterCode() != "R")
1473
bb_sum += side_chain_activation * sc_charges[i];
1482
if (bb_sum < (DoubleReal)param_.getValue("charge_directed_threshold") * charge)
1484
bb_sum = (DoubleReal)param_.getValue("charge_directed_threshold") * charge;
1490
bool PILISModel::getInitialTransitionProbabilities_(std::vector<DoubleReal>& bb_init,
1491
std::vector<DoubleReal>& cr_init,
1492
std::vector<DoubleReal>& sc_init,
1493
DoubleReal& precursor_init,
1494
const vector<DoubleReal>& bb_charges,
1495
const vector<DoubleReal>& sc_charges,
1496
const AASequence& peptide)
1498
bool is_charge_remote(false);
1500
DoubleReal bb_sum(0), bb_sum_orig(0);
1501
for (vector<DoubleReal>::const_iterator it = bb_charges.begin(); it != bb_charges.end(); ++it)
1511
#ifdef INIT_CHARGE_DEBUG
1512
cerr << "bb_sum=" << bb_sum << endl;
1514
bb_sum_orig = bb_sum;
1516
if (bb_sum < (DoubleReal)param_.getValue("charge_remote_threshold"))
1518
is_charge_remote = true;
1521
if (bb_sum < (DoubleReal)param_.getValue("charge_directed_threshold"))
1523
bb_sum = (DoubleReal)param_.getValue("charge_directed_threshold");
1526
// side-chain activiation
1527
DoubleReal side_chain_activation(param_.getValue("side_chain_activation"));
1528
for (Size i = 0; i != peptide.size(); ++i)
1530
if (peptide[i].getOneLetterCode() != "R")
1532
bb_sum += side_chain_activation * sc_charges[i];
1541
#ifdef INIT_CHARGE_DEBUG
1542
cerr << "bb_sum after side-chain-activiation=" << bb_sum << endl;
1545
vector<DoubleReal> bb_charges_all = bb_charges;
1546
sort(bb_charges_all.begin(), bb_charges_all.end());
1547
DoubleReal bb_charges_median = bb_charges_all[(Size)(bb_charges_all.size()/2.0)];
1548
#ifdef INIT_CHARGE_DEBUG
1549
cerr << "bb_charges_median=" << bb_charges_median << endl;
1552
DoubleReal min_enhancement_factor = param_.getValue("min_enhancement_factor");
1553
DoubleReal blocker_sum(1.0);
1554
for (Size i = 0; i != peptide.size() - 1; ++i)
1556
DoubleReal bb_enhance_factor(max(min_enhancement_factor, sqrt(bb_charges[i+1] / bb_charges_median)));
1557
#ifdef INIT_CHARGE_DEBUG
1558
cerr << "bb_enhance_factor=" << bb_enhance_factor << endl;
1561
if (sc_charges[i] != 0)
1563
blocker_sum += 10.0 * sc_charges[i];
1566
bb_init.push_back(/*bb_charges[i+1] **/ bb_sum * bb_enhance_factor / blocker_sum);
1567
String aa(peptide[i].getOneLetterCode());
1568
if ((aa == "K" || aa == "R" || aa == "H"))
1570
sc_init.push_back(sc_charges[i] /* * bb_charges_median*/);
1574
sc_init.push_back(0.0);
1577
if (is_charge_remote && (aa == "D" || aa == "E" || i == peptide.size() - 2 || i == peptide.size() - 3))
1579
cr_init.push_back(((1 - bb_sum_orig) /** bb_charges_median*/));
1583
cr_init.push_back(0.0);
1586
precursor_init = (1 - bb_sum) /** bb_charges_median*//*bb_avg*/ / 10.0;
1588
// normalize the initial probability values
1589
DoubleReal init_prob_sum(0);
1590
for (Size i = 0; i != bb_init.size(); ++i)
1592
init_prob_sum += bb_init[i] + sc_init[i] + cr_init[i];
1594
init_prob_sum += precursor_init;
1596
for (Size i = 0; i != bb_init.size(); ++i)
1598
bb_init[i] /= init_prob_sum;
1599
sc_init[i] /= init_prob_sum;
1600
cr_init[i] /= init_prob_sum;
1602
precursor_init /= init_prob_sum;
1604
return is_charge_remote;
1607
void PILISModel::addPeaks_(DoubleReal mz, int charge, DoubleReal offset, DoubleReal intensity, RichPeakSpectrum& /*spectrum*/, const IsotopeDistribution& id, const String& name)
1609
if (intensity < MIN_DECIMAL_VALUE)
1613
static RichPeak1D p;
1615
for (IsotopeDistribution::ConstIterator it = id.begin(); it != id.end(); ++it, ++i)
1617
DoubleReal pos = (mz + i + charge + offset) / (DoubleReal)charge;
1619
if (it == id.begin())
1621
p.setMetaValue("IonName", String(name.c_str()));
1624
if (pos >= (DoubleReal)param_.getValue("lower_mz") && pos <= (DoubleReal)param_.getValue("upper_mz"))
1626
p.setIntensity(intensity * it->second);
1627
peaks_[p.getMZ()].push_back(p);
1630
if (it == id.begin())
1632
p.setMetaValue("IonName", String(""));
1639
void PILISModel::parseHMMModel_(const TextFile::ConstIterator& begin, const TextFile::ConstIterator& end, HiddenMarkovModel& hmm, Param& param)
1647
for (TextFile::ConstIterator it = begin; it != end; ++it)
1651
//cerr << line << endl;
1657
vector<String> split;
1658
line.split(' ', split, true);
1660
if ( !split.empty() )
1662
String id = split[0];
1667
if (split.size() != 2 && split[2] == "false")
1671
hmm.addNewState(new HMMState(split[1], hidden));
1672
//cerr << "added new state: '" << split[1] << "', " << hidden << endl;
1676
if (id == "Synonym")
1679
//hmm.addSynonymTransition(split[1], split[2], split[3], split[4]);
1680
hmm.addSynonymTransition(split[3], split[4], split[1], split[2]);
1684
if (id == "Transition")
1686
hmm.setTransitionProbability(split[1], split[2], split[3].toFloat());
1690
if (id == "Parameter")
1692
// Parameter charge_remote_threshold 0.3 float
1693
if (split[split.size() - 1] == "float")
1695
param.setValue(split[1], split[2].toDouble());
1697
else if (split[split.size() - 1] == "int")
1699
param.setValue(split[1], split[2].toInt());
1701
else if (split[split.size() - 1] == "string_list")
1704
for (Size i = 2; i < split.size() - 1; ++i)
1706
tmp_list += split[i];
1708
param.setValue(split[1], StringList::create(tmp_list));
1710
else if (split[split.size() - 1] == "string")
1712
param.setValue(split[1], split[2]);
1716
throw Exception::InvalidParameter(__FILE__, __LINE__, __PRETTY_FUNCTION__, line);
1721
//hmm_.disableTransitions();
1722
//hmm.buildSynonyms();
1723
hmm.disableTransitions();
1725
//cerr << hmm_.getNumberOfStates() << endl;
1730
void PILISModel::writeParameters_(ostream& os, const Param& param)
1732
for (Param::ParamIterator it = param.begin(); it != param.end(); ++it)
1735
if (it->value.valueType() == DataValue::DOUBLE_VALUE)
1737
os << it->name << " \"" << it->value << "\" float" << endl;
1740
if (it->value.valueType() == DataValue::INT_VALUE)
1742
os << it->name << " \"" << it->value << "\" int" << endl;
1745
if (it->value.valueType() == DataValue::STRING_LIST)
1747
StringList value = (StringList)it->value;
1749
tmp.concatenate(value.begin(), value.end(), ",");
1750
os << it->name << " \"" << tmp << "\" string_list" << endl;
1753
if (it->value.valueType() == DataValue::STRING_VALUE)
1755
os << it->name << " \"" << it->value << "\" string" << endl;
1758
throw Exception::InvalidParameter(__FILE__, __LINE__, __PRETTY_FUNCTION__, "Value-type of parameter " + it->name + " not implemented!");
1763
void PILISModel::updateMembers_()
1765
DoubleReal pseudo_counts = (DoubleReal)param_.getValue("pseudo_counts");
1766
hmm_.setPseudoCounts(pseudo_counts);
1768
// pass parameters to precursor model
1769
Param precursor_param_cr(precursor_model_cr_.getParameters());
1770
precursor_param_cr.setValue("pseudo_counts", pseudo_counts);
1771
precursor_model_cr_.setParameters(precursor_param_cr);
1773
Param precursor_param_cd = precursor_model_cd_.getParameters();
1774
precursor_param_cd.setValue("pseudo_counts", pseudo_counts);
1775
precursor_model_cd_.setParameters(precursor_param_cd);
1777
Param b_ion_losses_param_cr = b_ion_losses_cr_.getParameters();
1778
b_ion_losses_param_cr.setValue("pseudo_counts", pseudo_counts);
1779
b_ion_losses_cr_.setParameters(b_ion_losses_param_cr);
1781
Param b_ion_losses_param_cd = b_ion_losses_cd_.getParameters();
1782
b_ion_losses_param_cd.setValue("pseudo_counts", pseudo_counts);
1783
b_ion_losses_cd_.setParameters(b_ion_losses_param_cd);
1786
Param b2_ion_losses_param_cr = b2_ion_losses_cr_.getParameters();
1787
b2_ion_losses_param_cr.setValue("pseudo_counts", pseudo_counts);
1788
b2_ion_losses_cr_.setParameters(b2_ion_losses_param_cr);
1790
Param b2_ion_losses_param_cd = b2_ion_losses_cd_.getParameters();
1791
b2_ion_losses_param_cd.setValue("pseudo_counts", pseudo_counts);
1792
b2_ion_losses_cd_.setParameters(b2_ion_losses_param_cd);
1795
Param y_ion_losses_param_cr = y_ion_losses_cr_.getParameters();
1796
y_ion_losses_param_cr.setValue("pseudo_counts", pseudo_counts);
1797
y_ion_losses_cr_.setParameters(y_ion_losses_param_cr);
1799
Param y_ion_losses_param_cd = y_ion_losses_cd_.getParameters();
1800
y_ion_losses_param_cd.setValue("pseudo_counts", pseudo_counts);
1801
y_ion_losses_cd_.setParameters(y_ion_losses_param_cd);
1804
Param a_ion_losses_param_cr = a_ion_losses_cr_.getParameters();
1805
a_ion_losses_param_cr.setValue("pseudo_counts", pseudo_counts);
1806
a_ion_losses_cr_.setParameters(a_ion_losses_param_cr);
1808
Param a_ion_losses_param_cd = a_ion_losses_cd_.getParameters();
1809
a_ion_losses_param_cd.setValue("pseudo_counts", pseudo_counts);
1810
a_ion_losses_cd_.setParameters(a_ion_losses_param_cd);
1812
} // namespace OpenMS