26 #include "../../exception/exceptionnotpossible.h"
59 : m_rtPoints(rt_points){};
83 : m_ms2MedianFilter(10), m_ms2MeanFilter(15), m_ms1MeanFilter(1)
88 msrun_reader_sp.get()->readSpectrumCollection(handler);
94 return (a.retentionTime < b.retentionTime);
100 : m_ms2MedianFilter(other.m_ms2MedianFilter),
101 m_ms2MeanFilter(other.m_ms2MeanFilter),
102 m_ms1MeanFilter(other.m_ms1MeanFilter)
127 m_ms2MedianFilter = ms2MedianFilter;
134 m_ms2MeanFilter = ms2MeanFilter;
141 m_ms1MeanFilter = ms1MeanFilter;
145 const std::vector<MsRunRetentionTimeSeamarkPoint<T>> &
153 const std::vector<double> &
156 return m_alignedRetentionTimeVector;
163 return m_valuesCorrected;
166 const std::vector<RtPoint> &
169 return m_ms1RetentionTimeVector;
178 getCommonDeltaRt(common_points, other_seamarks);
179 return common_points;
185 std::size_t ms2_spectrum_index)
189 msp_msrunReader.get()->acquireDevice();
193 msp_msrunReader.get()->qualifiedMassSpectrum(ms2_spectrum_index,
false);
199 m_allMs2Points.push_back(ms2point);
210 if(msp_msrunReader ==
nullptr)
213 QObject::tr(
"ERROR : msp_msrunReader == nullptr"));
216 if(m_retentionTimeReferenceMethod ==
217 ComputeRetentionTimeReference::maximum_intensity)
221 std::sort(m_allMs2Points.begin(),
222 m_allMs2Points.end(),
224 if(a.entityHash == b.entityHash)
226 return (a.precursorIntensity > b.precursorIntensity);
228 return (
a.entityHash <
b.entityHash);
232 std::unique(m_allMs2Points.begin(),
233 m_allMs2Points.end(),
235 return (a.entityHash == b.entityHash);
238 auto it = m_allMs2Points.begin();
241 m_seamarks.push_back(
242 {it->entityHash, it->retentionTime, it->precursorIntensity});
246 msp_msrunReader =
nullptr;
247 m_allMs2Points.clear();
249 std::sort(m_seamarks.begin(),
253 return (a.entityHash < b.entityHash);
266 auto it = other_seamarks.begin();
270 while((it != other_seamarks.end()) &&
271 (it->entityHash < seamark.entityHash))
275 if(it == other_seamarks.end())
277 if(it->entityHash == seamark.entityHash)
280 seamark.retentionTime, seamark.retentionTime - it->retentionTime));
285 if((m_ms2MedianFilter.getHalfWindowSize() * 2 + 1) >= delta_rt.size())
288 QObject::tr(
"ERROR : MS2 alignment of MS run '%1' (%2)' not possible : "
289 "\ntoo few MS2 points (%3) in common")
290 .arg(msp_msrunReader.get()->getMsRunId().get()->getXmlId())
291 .arg(msp_msrunReader.get()->getMsRunId().get()->getFileName())
292 .arg(delta_rt.size()));
296 if((m_ms2MeanFilter.getHalfWindowSize() * 2 + 1) >= delta_rt.size())
299 QObject::tr(
"ERROR : MS2 alignment of MS run '%1' (%2)' not possible : "
300 "\ntoo few MS2 points (%3) in common")
301 .arg(msp_msrunReader.get()->getMsRunId().get()->getXmlId())
302 .arg(msp_msrunReader.get()->getMsRunId().get()->getFileName())
303 .arg(delta_rt.size()));
321 return m_alignedRetentionTimeVector.front();
323 return m_ms1RetentionTimeVector.front().retentionTime;
331 return m_alignedRetentionTimeVector.back();
333 return m_ms1RetentionTimeVector.back().retentionTime;
340 double original_retention_time)
const
342 if(m_alignedRetentionTimeVector.size() < 3)
345 QObject::tr(
"ERROR : too few aligned points to compute aligned "
346 "retention time (%1)")
347 .arg(m_ms1RetentionTimeVector.size()));
349 if(m_alignedRetentionTimeVector.size() != m_ms1RetentionTimeVector.size())
352 QObject::tr(
"ERROR : m_alignedRetentionTimeVector.size() %1 != %2 "
353 "m_ms1RetentionTimeVector.size()")
354 .arg(m_alignedRetentionTimeVector.size())
355 .arg(m_ms1RetentionTimeVector.size()));
358 std::find_if(m_ms1RetentionTimeVector.begin(),
359 m_ms1RetentionTimeVector.end(),
360 [original_retention_time](
const RtPoint &rt_point) {
361 return original_retention_time < rt_point.retentionTime;
363 double rt1_a, rt2_a, rt1_b, rt2_b;
364 if(it_plus == m_ms1RetentionTimeVector.end())
368 if(it_plus == m_ms1RetentionTimeVector.begin())
372 auto it_minus = it_plus - 1;
374 rt1_a = it_minus->retentionTime;
375 rt2_a = it_plus->retentionTime;
377 double ratio = (original_retention_time - rt1_a) / (rt2_a - rt1_a);
379 auto itref = m_alignedRetentionTimeVector.begin() +
380 std::distance(m_ms1RetentionTimeVector.begin(), it_minus);
386 return (((rt2_b - rt1_b) * ratio) + rt1_b);
390 const std::vector<MsRunRetentionTimeSeamarkPoint<T>>
393 std::vector<MsRunRetentionTimeSeamarkPoint<T>> other_seamarks = m_seamarks;
394 for(
auto &seamark : other_seamarks)
396 seamark.retentionTime =
397 translateOriginal2AlignedRetentionTime(seamark.retentionTime);
399 return other_seamarks;
406 return (m_alignedRetentionTimeVector.size() > 0);
414 std::vector<MsRunRetentionTimeSeamarkPoint<T>> other_seamarks;
415 if(msrun_retention_time_reference.
isAligned())
421 other_seamarks = msrun_retention_time_reference.
getSeamarks();
424 if((m_ms1MeanFilter.getHalfWindowSize() * 2 + 1) >=
425 m_ms1RetentionTimeVector.size())
428 QObject::tr(
"ERROR : MS1 alignment of MS run '%1' (%2)' not possible : "
429 "\ntoo few MS1 points (%3)")
430 .arg(msp_msrunReader.get()->getMsRunId().get()->getXmlId())
431 .arg(msp_msrunReader.get()->getMsRunId().get()->getFileName())
432 .arg(m_ms1RetentionTimeVector.size()));
435 qDebug() << m_seamarks[0].entityHash <<
" " << m_seamarks[0].retentionTime
436 <<
" " << other_seamarks[0].entityHash
437 << other_seamarks[0].retentionTime <<
" ";
440 getCommonDeltaRt(common_points, other_seamarks);
444 qDebug() << common_points.front().x <<
" " << common_points.front().y;
445 m_ms2MedianFilter.
filter(common_points);
447 m_ms2MeanFilter.
filter(common_points);
450 qDebug() << common_points.front().x <<
" " << common_points.front().y;
455 first_point.
x = m_ms1RetentionTimeVector.front().retentionTime - (double)1;
456 if(first_point.
x < 0)
461 m_ms1RetentionTimeVector.front().retentionTime -
464 common_points.push_back(first_point);
467 last_point.
x = m_ms1RetentionTimeVector.back().retentionTime + 1;
468 last_point.
y = m_ms1RetentionTimeVector.back().retentionTime -
470 common_points.push_back(last_point);
471 common_points.
sortX();
475 m_alignedRetentionTimeVector.clear();
477 qDebug() << common_points.front().x <<
" " << common_points.front().y;
479 Trace ms1_aligned_points;
481 linearRegressionMs2toMs1(ms1_aligned_points, common_points);
486 m_ms1MeanFilter.filter(ms1_aligned_points);
491 for(
DataPoint &data_point : ms1_aligned_points)
493 data_point.y = (data_point.x - data_point.y);
499 double correction_parameter =
500 (m_ms1RetentionTimeVector.back().retentionTime -
501 m_ms1RetentionTimeVector.front().retentionTime) /
502 (ms1_aligned_points.size());
504 correction_parameter = correction_parameter / (double)4;
505 correctNewTimeValues(ms1_aligned_points, correction_parameter);
507 m_alignedRetentionTimeVector = ms1_aligned_points.yValues();
510 return ms1_aligned_points;
517 const Trace &common_points)
521 std::vector<DataPoint>::const_iterator itms2 = common_points.begin();
522 std::vector<DataPoint>::const_iterator itms2next = itms2 + 1;
523 if(itms2next == common_points.end())
527 QObject::tr(
"ERROR : MS1 alignment of MS run '%1' (%2)' not possible : "
528 "\ntoo few common points (%3)")
529 .arg(msp_msrunReader.get()->getMsRunId().get()->getXmlId())
530 .arg(msp_msrunReader.get()->getMsRunId().get()->getFileName())
531 .arg(common_points.size()));
533 qDebug() <<
"() itms2->x=" << itms2->x <<
" itms2->y=" << itms2->y;
535 for(
RtPoint &original_rt_point : m_ms1RetentionTimeVector)
538 ms1_point.
x = original_rt_point.retentionTime;
540 while(ms1_point.
x > itms2next->x)
546 double ratio = (itms2next->x - itms2->x);
549 ratio = (ms1_point.
x - itms2->x) / ratio;
559 ms1_point.
y = itms2->y + ((itms2next->y - itms2->y) * ratio);
563 ms1_aligned_points.push_back(ms1_point);
570 double correction_parameter)
573 m_valuesCorrected = 0;
574 auto new_it(ms1_aligned_points.begin());
575 auto new_nextit(ms1_aligned_points.begin());
577 for(; new_nextit != ms1_aligned_points.end(); ++new_nextit, ++new_it)
579 if(new_nextit->y < new_it->y)
582 new_nextit->y = new_it->y + correction_parameter;
588 template <
typename T>
592 return msp_msrunReader;