12#include <QElapsedTimer>
55 if(mass_spectrum_csp ==
nullptr)
56 qFatal(
"Cannot be nullptr");
58 if(mass_spectrum_csp.get() ==
nullptr)
59 qFatal(
"Cannot be nullptr");
66 std::size_t precursor_spectrum_index =
67 mass_spectrum_csp->getPrecursorSpectrumIndex();
71 if(precursor_spectrum_index == std::numeric_limits<std::size_t>::max())
94 if(mass_spectrum_csp->getMsLevel() <= 1)
97 "msrundatasettree.cpp -- ERROR the MS level needs to be > 1 in a "
98 "fragmentation spectrum.");
104 if(parent_node_p ==
nullptr)
107 QString(
"%1 @ %2 - %3\n")
110 .arg(
"msrundatasettree.cpp -- ERROR could not find "
111 "a tree node matching the index."));
122 parent_node_p->
m_children.push_back(new_node_p);
126 m_indexNodeMap.insert(std::pair<std::size_t, MsRunDataSetTreeNode *>(
127 mass_spectrum_csp->getMassSpectrumId().getSpectrumIndex(), new_node_p));
137 double ion_mobility_value = -1;
146 QVariant ion_mobility_variant_value =
147 mass_spectrum_csp->getParameterValue(
150 if(ion_mobility_variant_value.isValid())
154 ion_mobility_value = ion_mobility_variant_value.toDouble(&ok);
159 "The data are Bruker timsTOF data but failed to convert valid "
160 "QVariant 1/K0 value to double.");
178 ion_mobility_variant_value = mass_spectrum_csp->getParameterValue(
181 if(!ion_mobility_variant_value.isValid())
184 "The data are Bruker timsTOF data but failed to get correct "
185 "ion mobility data. Inconsistency found.");
191 ion_mobility_value = mass_spectrum_csp->getDtInMilliSeconds();
194 if(ion_mobility_value != -1)
206const std::map<std::size_t, MsRunDataSetTreeNode *> &
218 throw(
"Cannot be that the node pointer is nullptr");
220 std::map<std::size_t, MsRunDataSetTreeNode *>::const_iterator iterator =
224 [node](
const std::pair<std::size_t, MsRunDataSetTreeNode *> pair) {
225 return pair.second == node;
229 return iterator->first;
231 return std::numeric_limits<std::size_t>::max();
243const std::vector<MsRunDataSetTreeNode *> &
261 node->accept(visitor);
268 std::vector<MsRunDataSetTreeNode *>::const_iterator nodes_begin_iterator,
269 std::vector<MsRunDataSetTreeNode *>::const_iterator nodes_end_iterator)
275 using Iterator = std::vector<MsRunDataSetTreeNode *>::const_iterator;
277 Iterator iter = nodes_begin_iterator;
281 std::size_t node_count =
282 std::distance(nodes_begin_iterator, nodes_end_iterator);
286 while(iter != nodes_end_iterator)
297 (*iter)->accept(visitor);
312 if(iterNode !=
nullptr)
329 if(iterNode !=
nullptr)
336std::vector<MsRunDataSetTreeNode *>
341 std::vector<MsRunDataSetTreeNode *> nodes;
346 node->flattenedView(nodes,
true );
352std::vector<MsRunDataSetTreeNode *>
354 bool with_descendants)
356 std::vector<MsRunDataSetTreeNode *> nodes;
363 "msrundatasettree.cpp -- ERROR the MS level cannot be 0.");
371 std::size_t
depth = 0;
388 node->flattenedView(nodes, with_descendants);
408 node->flattenedViewMsLevelNodes(ms_level,
depth, nodes, with_descendants);
416 std::size_t product_spectrum_index)
426 node =
findNode(product_spectrum_index);
433std::vector<MsRunDataSetTreeNode *>
435 std::size_t precursor_spectrum_index)
437 std::vector<MsRunDataSetTreeNode *> nodes;
443 if(precursor_node ==
nullptr)
446 nodes.assign(precursor_node->
m_children.begin(),
452std::vector<MsRunDataSetTreeNode *>
460 if(precision_ptr ==
nullptr)
462 "msrundatasettree.cpp -- ERROR precision_ptr cannot be nullptr.");
464 std::vector<MsRunDataSetTreeNode *> product_nodes;
472 node->productNodesByPrecursorMz(mz, precision_ptr, product_nodes);
477 std::vector<MsRunDataSetTreeNode *> precursor_nodes;
479 for(
auto &&node : product_nodes)
481 precursor_nodes.push_back(
482 findNode(node->mcsp_massSpectrum->getPrecursorSpectrumIndex()));
485 return precursor_nodes;
495 using NodeVector = std::vector<MsRunDataSetTreeNode *>;
497 using MapPair = std::pair<double, NodeVector>;
498 using MapIterator = DoubleNodeVectorMap::iterator;
511 qFatal(
"Programming error.");
521 MapIterator found_iterator = map_p->find(time);
523 if(found_iterator != map_p->end())
527 found_iterator->second.push_back(node_p);
537 map_p->insert(MapPair(time, node_vector));
560 if(parent_p ==
nullptr)
577 m_indexNodeMap.insert(std::pair<std::size_t, MsRunDataSetTreeNode *>(
578 mass_spectrum_csp->getMassSpectrumId().getSpectrumIndex(), new_node_p));
588 double ion_mobility_value = -1;
597 QVariant ion_mobility_variant_value =
598 mass_spectrum_csp->getParameterValue(
601 if(ion_mobility_variant_value.isValid())
605 ion_mobility_value = ion_mobility_variant_value.toDouble(&ok);
610 "The data are Bruker timsTOF data but failed to convert valid "
611 "QVariant 1/K0 value to double.");
629 ion_mobility_variant_value = mass_spectrum_csp->getParameterValue(
632 if(!ion_mobility_variant_value.isValid())
635 "The data are Bruker timsTOF data but failed to get correct "
636 "ion mobility data. Inconsistency found.");
642 ion_mobility_value = mass_spectrum_csp->getDtInMilliSeconds();
645 if(ion_mobility_value != -1)
658 std::size_t precursor_spectrum_index)
676 if(mass_spec_data_node_p ==
nullptr)
679 "msrundatasettree.cpp -- ERROR could not find a a "
680 "tree node matching the index.");
697 using NodeVector = std::vector<MsRunDataSetTreeNode *>;
699 using MapIterator = DoubleNodeVectorMap::const_iterator;
712 qFatal(
"Programming error.");
714 std::size_t added_nodes = 0;
719 MapIterator start_iterator = map_p->lower_bound(start);
721 if(start_iterator == map_p->end())
726 MapIterator end_iterator = map_p->upper_bound(end);
731 for(MapIterator iterator = start_iterator; iterator != end_iterator;
741 for(
auto &&node_p : node_vector)
743 nodes.push_back(node_p);
760 using NodeVector = std::vector<MsRunDataSetTreeNode *>;
761 using NodeVectorIterator = NodeVector::iterator;
764 using MapIterator = DoubleNodeVectorMap::const_iterator;
777 qFatal(
"Programming error.");
779 std::size_t removed_vector_items = 0;
788 MapIterator first_end_iterator = (*map_p).upper_bound(start);
793 for(MapIterator iterator = map_p->begin(); iterator != first_end_iterator;
805 for(
auto &&node_p : node_vector)
807 NodeVectorIterator iterator =
808 std::find(nodes.begin(), nodes.end(), node_p);
810 if(iterator != nodes.end())
814 nodes.erase(iterator);
816 ++removed_vector_items;
828 MapIterator second_first_iterator = map_p->upper_bound(end);
829 if(second_first_iterator != map_p->begin())
830 --second_first_iterator;
832 for(MapIterator iterator = second_first_iterator; iterator != map_p->end();
842 for(
auto &&node_p : node_vector)
844 NodeVectorIterator iterator =
845 std::find(nodes.begin(), nodes.end(), node_p);
847 if(iterator != nodes.end())
851 nodes.erase(iterator);
853 ++removed_vector_items;
858 return removed_vector_items;
883 using MapIterator = DoubleNodeVectorMap::const_iterator;
904 qFatal(
"Programming error.");
915 std::size_t added_mass_spectra = 0;
920 MapIterator start_iterator = map_p->lower_bound(start);
922 if(start_iterator == map_p->end())
937 MapIterator end_iterator = map_p->upper_bound(end);
940 if(!std::distance(start_iterator, end_iterator))
946 if(end_iterator == map_p->end())
970 for(MapIterator iterator = start_iterator; iterator != end_iterator;
981 for(
auto &&node_p : node_vector)
984 node_p->getQualifiedMassSpectrum();
989 if(qualified_mass_spectrum_csp ==
nullptr ||
990 qualified_mass_spectrum_csp.get() ==
nullptr)
993 "The QualifiedMassSpectrumCstSPtr cannot be nullptr.");
1002 mass_spectra.push_back(qualified_mass_spectrum_csp);
1004 ++added_mass_spectra;
1012 return added_mass_spectra;
1026 QElapsedTimer timer;
1030 using MapIterator = DoubleNodeVectorMap::const_iterator;
1051 qFatal(
"Programming error.");
1053 std::size_t removed_vector_items = 0;
1065 MapIterator first_end_iterator = (*map_p).lower_bound(start);
1079 QSet<QualifiedMassSpectrumCstSPtr> set_of_mass_spectra_to_remove;
1081 for(MapIterator iterator = map_p->begin(); iterator != first_end_iterator;
1088 for(std::size_t index = 0; index < node_vector.size(); ++index)
1090 set_of_mass_spectra_to_remove.insert(
1091 node_vector.at(index)->getQualifiedMassSpectrum());
1093 ++removed_vector_items;
1105 MapIterator second_first_iterator = map_p->upper_bound(end);
1114 for(MapIterator iterator = second_first_iterator; iterator != map_p->end();
1122 for(std::size_t index = 0; index < node_vector.size(); ++index)
1124 set_of_mass_spectra_to_remove.insert(
1125 node_vector.at(index)->getQualifiedMassSpectrum());
1127 ++removed_vector_items;
1136 mass_spectra.begin(),
1139 return set_of_mass_spectra_to_remove.find(ptr) !=
1140 set_of_mass_spectra_to_remove.end();
1142 mass_spectra.end());
1148 return removed_vector_items;
1166 std::size_t
depth = 1;
1167 std::size_t tmp_depth = 0;
1168 std::size_t greatest_depth = 0;
1172 tmp_depth = node->depth(
depth);
1176 if(tmp_depth > greatest_depth)
1177 greatest_depth = tmp_depth;
1180 return greatest_depth;
1187 std::size_t cumulative_node_count = 0;
1191 node->size(cumulative_node_count);
1196 return cumulative_node_count;
virtual bool shouldStop() const =0
virtual void setNodesToProcessCount(std::size_t)=0
QualifiedMassSpectrumCstSPtr mcsp_massSpectrum
MsRunDataSetTreeNode * findNode(std::size_t spectrum_index)
std::vector< MsRunDataSetTreeNode * > m_children
MsRunDataSetTreeNode * findNode(QualifiedMassSpectrumCstSPtr mass_spectrum_csp) const
const std::vector< MsRunDataSetTreeNode * > & getRootNodes() const
MsRunIdCstSPtr mcsp_msRunId
std::vector< QualifiedMassSpectrumCstSPtr > QualMassSpectraVector
std::vector< MsRunDataSetTreeNode * > flattenedViewMsLevel(std::size_t ms_level, bool with_descendants=false)
std::size_t indexNodeMapSize() const
void accept(MsRunDataSetTreeNodeVisitorInterface &visitor)
virtual ~MsRunDataSetTree()
MsRunDataSetTree(MsRunIdCstSPtr ms_run_id_csp)
std::vector< MsRunDataSetTreeNode * > flattenedView()
std::size_t addDataSetQualMassSpectraInsideDtOrRtRange(double start, double end, QualMassSpectraVector &mass_spectra, Enums::DataKind data_kind) const
bool documentNodeInDtRtMap(double time, MsRunDataSetTreeNode *node_p, Enums::DataKind data_kind)
std::size_t removeDataSetTreeNodesOutsideDtOrRtRange(double start, double end, NodeVector &nodes, Enums::DataKind data_kind) const
std::size_t getSpectrumCount() const
std::map< std::size_t, MsRunDataSetTreeNode * > m_indexNodeMap
std::vector< MsRunDataSetTreeNode * > m_rootNodes
std::map< double, NodeVector > DoubleNodeVectorMap
std::vector< MsRunDataSetTreeNode * > precursorNodesByPrecursorMz(pappso_double mz, PrecisionPtr precision_ptr)
std::vector< MsRunDataSetTreeNode * > NodeVector
std::size_t depth() const
MsRunDataSetTreeNode * precursorNodeByProductSpectrumIndex(std::size_t product_spectrum_index)
const std::map< std::size_t, MsRunDataSetTreeNode * > & getIndexNodeMap() const
MsRunDataSetTreeNode * addMassSpectrum(QualifiedMassSpectrumCstSPtr mass_spectrum)
std::size_t massSpectrumIndex(const MsRunDataSetTreeNode *node) const
DoubleNodeVectorMap m_rtDoubleNodeVectorMap
std::vector< MsRunDataSetTreeNode * > productNodesByPrecursorSpectrumIndex(std::size_t precursor_spectrum_index)
std::size_t m_spectrumCount
DoubleNodeVectorMap m_dtDoubleNodeVectorMap
std::size_t addDataSetTreeNodesInsideDtOrRtRange(double start, double end, NodeVector &nodes, Enums::DataKind data_kind) const
std::size_t removeDataSetQualMassSpectraOutsideDtOrRtRange(double start, double end, QualMassSpectraVector &mass_spectra, Enums::DataKind data_kind) const
tries to keep as much as possible monoisotopes, removing any possible C13 peaks and changes multichar...
std::shared_ptr< const MsRunId > MsRunIdCstSPtr
double pappso_double
A type definition for doubles.
std::shared_ptr< const QualifiedMassSpectrum > QualifiedMassSpectrumCstSPtr
@ IonMobOneOverK0Begin
1/K0 range's begin value
@ IonMobOneOverK0
1/kO value
const PrecisionBase * PrecisionPtr