141 const std::size_t beginning,
142 const std::size_t length)
147 const QString &protein_seq = protein_ptr->
getSequence();
149 if((qsizetype)(beginning + length) <= protein_seq.size())
155 length2 = protein_seq.size() - beginning;
159 QString sequence_str = protein_seq.sliced(protein_seq.size() - beginning - length2, length2);
161 SpOMSProtein sequence(
"sub_sequence", sequence_str, m_aaCode);
164 std::vector<AaPosition> aa_positions;
168 m_scenario.reserve(length2 + 1, spectrum.size());
169 m_interest_cells.reserve(spectrum.size());
170 m_interest_cells.at(0).n_row = 0;
171 m_interest_cells.at(0).score = 0;
172 m_interest_cells.at(0).beginning = 0;
173 m_interest_cells.at(0).tree_id = 0;
174 for(std::size_t i = 1; i < m_interest_cells.size(); i++)
176 m_interest_cells.at(i).n_row = 0;
178 m_interest_cells.at(i).beginning = 0;
179 m_interest_cells.at(i).tree_id = 0;
182 for(std::size_t iter = m_interest_cells.size(); iter < spectrum.size(); iter++)
184 m_interest_cells.push_back({0, m_scorevalues.get(
ScoreType::init), 0, 0});
187 m_scenario.resetScenario();
189 for(std::size_t row_number = 1; row_number <= length2; row_number++)
192 qDebug() <<
"row_number - 1=" << row_number - 1 <<
" sequence.size()=" << sequence.size();
194 updateAlignmentMatrix(sequence,
202 saveBestAlignment(sequence, spectrum, protein_seq.size() - beginning);
207 if(m_scenario.getBestScore() >
211 if(checkSequenceDiversity(sequence.
getSequence(), 5, 2))
215 m_best_corrected_alignment.score = 0;
216 for(std::size_t iter : m_best_alignment.peaks)
222 else if(std::find(m_best_alignment.peaks.begin(),
223 m_best_alignment.peaks.end(),
225 m_best_alignment.peaks.end())
231 std::vector<std::vector<std::size_t>> corrections = correction_tree.
getPeaks();
232 if(corrections.size() > 0)
234 m_best_alignment.score =
238 for(
auto peaks_to_remove : corrections)
241 correctAlign(sequence,
245 protein_seq.size() - beginning);
249 m_best_alignment = m_best_corrected_alignment;
257 m_best_alignment.score = 0;
264 QObject::tr(
"SemiGlobalAlignment::preciseAlign failed :\n%1").arg(err.
qwhat()));
272 std::vector<std::size_t> &peaks_to_remove,
275 std::vector<AaPosition> aa_positions;
277 std::vector<std::size_t> final_peaks_to_remove;
281 key_cell_init.
n_row = 0;
285 std::fill(m_interest_cells.begin(), m_interest_cells.end(), key_cell_init);
287 m_interest_cells.at(0).score = 0;
289 m_scenario.resetScenario();
291 for(qsizetype row_number = 1; row_number <= sequence.size(); row_number++)
293 qDebug() << row_number - 1 <<
" " << sequence.size();
294 qDebug() <<
"sequence[row_number - 1].aa" << (char)sequence[row_number - 1].aa;
296 aa_positions = spectrum.
getAaPositions(sequence[row_number - 1].code, peaks_to_remove);
298 updateAlignmentMatrix(sequence, row_number, aa_positions, spectrum,
false, protein_ptr);
305 qDebug() << m_scenario.getBestScore();
306 if(m_scenario.getBestScore() >
313 saveBestAlignment(sequence, spectrum, offset);
315 for(std::size_t iter : m_best_alignment.peaks)
326 else if(std::find(m_best_alignment.peaks.begin(),
327 m_best_alignment.peaks.end(),
333 std::vector<std::vector<std::size_t>> corrections = correction_tree.
getPeaks();
334 if(corrections.size() > 0)
336 for(
auto new_peaks_to_remove : corrections)
338 final_peaks_to_remove = std::vector<std::size_t>(new_peaks_to_remove);
339 final_peaks_to_remove.insert(
340 final_peaks_to_remove.end(), peaks_to_remove.begin(), peaks_to_remove.end());
341 correctAlign(sequence, protein_ptr, spectrum, final_peaks_to_remove, offset);
344 else if(m_scenario.getBestScore() > m_best_corrected_alignment.score)
346 m_best_corrected_alignment = m_best_alignment;
355 std::size_t beginning,
357 const std::vector<double> &shifts)
359 std::size_t current_SPC = m_best_alignment.SPC;
360 int current_best_score = m_best_alignment.score;
361 m_best_post_processed_alignment.score = 0;
362 for(
double precursor_mass_error : shifts)
364 SpOMSSpectrum corrected_spectrum(spectrum, precursor_mass_error);
365 preciseAlign(corrected_spectrum, protein_ptr, beginning, length);
366 if(m_best_alignment.score >= m_best_post_processed_alignment.score)
368 m_best_post_processed_alignment = m_best_alignment;
371 if(m_best_post_processed_alignment.SPC > current_SPC &&
372 m_best_post_processed_alignment.score >= current_best_score)
374 m_best_alignment = m_best_post_processed_alignment;
381 const std::size_t row_number,
382 const std::vector<AaPosition> &aa_positions,
384 const bool fast_align,
390 int score_found, score_shift, best_score, alt_score, tree_id;
392 std::size_t best_column,
shift, beginning, missing_aas, length, perfect_shift_origin;
393 KeyCell *current_cell_ptr, *tested_cell_ptr;
394 AlignType alignment_type, temp_align_type;
396 double smallest_aa_mass = m_aaCode.getMass((std::uint8_t)1);
398 m_updated_cells.reserve(aa_positions.size());
406 qDebug() << (char)sequence.at(row_number - 2).aa;
407 qDebug() <<
"condition" << condition;
408 condition += 2 << sequence.at(row_number - 2).code;
410 qDebug() <<
"condition" << condition;
414 for(std::vector<AaPosition>::const_iterator aa_position = aa_positions.begin();
415 aa_position != aa_positions.end();
420 if(((condition & aa_position->condition) != 0) ||
423 current_cell_ptr = &m_interest_cells.at(aa_position->r_peak);
424 if(spectrum.
peakType(aa_position->r_peak) ==
437 best_column = aa_position->r_peak;
438 best_score = current_cell_ptr->
score + (row_number - current_cell_ptr->
n_row) *
441 tree_id = current_cell_ptr->
tree_id;
445 if(aa_position->l_support)
447 tested_cell_ptr = &m_interest_cells.at(aa_position->l_peak);
448 if(aa_position->l_peak == 0)
450 alt_score = tested_cell_ptr->
score + score_found;
454 if(tested_cell_ptr->
n_row == row_number - 1)
456 alt_score = tested_cell_ptr->
score +
457 (row_number - tested_cell_ptr->
n_row - 1) *
463 alt_score = tested_cell_ptr->
score +
464 (row_number - tested_cell_ptr->
n_row - 1) *
469 if(alt_score >= best_score)
472 best_score = alt_score;
473 best_column = aa_position->l_peak;
487 tree_id = m_location_saver.getNextTree();
493 tree_id = tested_cell_ptr->
tree_id;
501 while(shift < aa_position->next_l_peak)
503 tested_cell_ptr = &m_interest_cells.at(aa_position->next_l_peak -
shift);
505 if(perfectShiftPossible(sequence,
507 tested_cell_ptr->
n_row,
509 aa_position->next_l_peak -
shift,
510 aa_position->r_peak))
512 alt_score = tested_cell_ptr->
score +
513 (row_number - tested_cell_ptr->
n_row - 1) *
520 alt_score = tested_cell_ptr->
score +
521 (row_number - tested_cell_ptr->
n_row - 1) *
526 if(alt_score > best_score)
528 alignment_type = temp_align_type;
529 best_score = alt_score;
530 best_column = aa_position->next_l_peak -
shift;
532 tree_id = tested_cell_ptr->
tree_id;
539 tested_cell_ptr = &m_interest_cells.at(0);
541 perfect_shift_origin =
542 perfectShiftPossibleFrom0(sequence, spectrum, row_number, aa_position->r_peak);
543 if(perfect_shift_origin != row_number)
545 alt_score = tested_cell_ptr->
score + score_found;
550 alt_score = tested_cell_ptr->
score + score_shift;
555 if(alt_score > best_score)
557 alignment_type = temp_align_type;
558 best_score = alt_score;
561 std::floor(spectrum.
getMZShift(0, aa_position->l_peak) / smallest_aa_mass);
575 tree_id = m_location_saver.getNextTree();
580 if(best_column != aa_position->r_peak)
582 m_updated_cells.push_back(
583 {aa_position->r_peak, {row_number, best_score, beginning, tree_id}});
587 if(best_score > m_location_saver.getMinScore(tree_id) && fast_align)
590 row_number - beginning + 1 +
591 std::ceil(spectrum.
getMissingMass(aa_position->r_peak) / smallest_aa_mass) +
594 m_location_saver.addLocation(beginning, length, tree_id, best_score, protein_ptr);
602 m_scenario.saveOrigin(row_number,
604 perfect_shift_origin,
611 m_scenario.saveOrigin(row_number,
613 m_interest_cells.at(best_column).n_row,
624 m_updated_cells.push_back({0, {row_number, 0, 0, 0}});
627 while(m_updated_cells.size() > 0)
629 qDebug() << m_interest_cells.size() <<
" " << m_updated_cells.back().first;
630 m_interest_cells.at(m_updated_cells.back().first) = m_updated_cells.back().second;
631 m_updated_cells.pop_back();
635 catch(
const std::exception &stderr)
638 QObject::tr(
"updateAlignmentMatrix failed std::exception :\n%1 %2")
640 .arg(stderr.what()));
645 QObject::tr(
"updateAlignmentMatrix failed :\n%1").arg(err.
qwhat()));
775 m_best_alignment.m_peptideModel.reset();
776 m_best_alignment.peaks.clear();
777 m_best_alignment.shifts.clear();
778 std::size_t previous_row;
779 std::size_t previous_column = 0;
780 std::size_t perfect_shift_end;
781 std::pair<std::vector<ScenarioCell>,
int> best_alignment = m_scenario.getBestAlignment();
782 m_best_alignment.score = best_alignment.second;
783 std::vector<SpOMSAa> skipped_aa;
786 if(best_alignment.first.front().previous_row > offset)
789 QString(
"best_alignment.first.front().previous_row > offset %1 %2")
791 .arg(best_alignment.first.front().previous_row));
793 if(best_alignment.first.back().previous_row > offset)
796 QString(
"best_alignment.first.back().previous_row > offset %1 %2")
798 .arg(best_alignment.first.back().previous_row));
800 m_best_alignment.beginning = offset - best_alignment.first.front().previous_row;
801 m_best_alignment.end = offset - best_alignment.first.back().previous_row;
807 for(
auto cell : best_alignment.first)
809 switch(cell.alignment_type)
812 aa_model.
m_aminoAcid = sequence.at(previous_row - 1).aa;
815 m_best_alignment.m_peptideModel.push_back(aa_model);
816 if(previous_row > cell.previous_row + 1)
818 skipped_mass = sequence.at(previous_row - 1)
821 sequence.
sliced(cell.previous_row, previous_row - cell.previous_row - 1);
824 for(
auto aa : skipped_aa)
827 m_best_alignment.m_peptideModel.push_back(aa_model);
828 skipped_mass += aa.mass;
830 m_best_alignment.m_peptideModel.back().m_massDifference =
831 spectrum.
getMZShift(cell.previous_column, previous_column) - skipped_mass;
833 m_best_alignment.peaks.push_back(cell.previous_column);
836 aa_model.
m_aminoAcid = sequence.at(previous_row - 1).aa;
839 m_best_alignment.m_peptideModel.push_back(aa_model);
843 aa_model.
m_aminoAcid = sequence.at(previous_row - 1).aa;
847 m_best_alignment.m_peptideModel.push_back(aa_model);
848 m_best_alignment.peaks.push_back(cell.previous_column);
849 m_best_alignment.shifts.push_back(
850 spectrum.
getMZShift(cell.previous_column, previous_column) -
851 sequence.at(previous_row - 1).mass);
854 m_best_alignment.peaks.push_back(cell.previous_column);
855 skipped_aa = sequence.
sliced(cell.previous_row, previous_row - cell.previous_row);
856 std::reverse(skipped_aa.begin(), skipped_aa.end());
859 for(
auto aa : skipped_aa)
862 m_best_alignment.m_peptideModel.push_back(aa_model);
866 previous_row = cell.previous_row;
867 previous_column = cell.previous_column;
868 m_best_alignment.peaks.push_back(cell.previous_column);
871 previous_row = cell.previous_row;
872 previous_column = cell.previous_column;
874 std::reverse(m_best_alignment.peaks.begin(), m_best_alignment.peaks.end());
875 std::reverse(m_best_alignment.m_peptideModel.begin(), m_best_alignment.m_peptideModel.end());
879 MzRange zero(0, m_precision_ptr);
880 m_best_alignment.begin_shift = spectrum.
getMZShift(0, m_best_alignment.peaks.front());
881 m_best_alignment.end_shift = spectrum.
getMissingMass(m_best_alignment.peaks.back());
882 if(zero.
contains(m_best_alignment.end_shift))
884 m_best_alignment.end_shift = 0;
889 m_best_alignment.SPC = 0;
890 for(
auto peak : m_best_alignment.peaks)
892 switch(spectrum.at(peak).type)
895 qDebug() << peak <<
"native";
896 m_best_alignment.SPC += 1;
899 qDebug() << peak <<
"both";
900 m_best_alignment.SPC += 2;
903 qDebug() << peak <<
"synthetic";
906 qDebug() << peak <<
"symmetric";
907 m_best_alignment.SPC += 1;
914 if(m_best_alignment.end_shift > 0)
916 perfect_shift_end = perfectShiftPossibleEnd(sequence,
918 best_alignment.first.front().previous_row,
919 m_best_alignment.peaks.back());
920 if(perfect_shift_end != best_alignment.first.front().previous_row)
923 sequence.
sliced(best_alignment.first.front().previous_row,
924 perfect_shift_end - best_alignment.first.front().previous_row);
927 for(
auto aa = skipped_aa.begin(); aa != skipped_aa.end(); aa++)
930 m_best_alignment.m_peptideModel.push_back(aa_model);
932 m_best_alignment.beginning = offset - perfect_shift_end;
933 m_best_alignment.end_shift = 0;
943 if(m_best_alignment.end_shift > 0)
945 m_best_alignment.m_peptideModel.setNterShift(m_best_alignment.end_shift);
948 std::reverse(m_best_alignment.m_peptideModel.begin(), m_best_alignment.m_peptideModel.end());
949 if(m_best_alignment.begin_shift > 0)
951 m_best_alignment.m_peptideModel.setCterShift(m_best_alignment.begin_shift);
954 m_best_alignment.m_peptideModel.setPrecursorMass(spectrum.
getPrecursorMass());