11#include "../pappsoexception.h"
12#include "../exception/exceptionnotpossible.h"
20 : mcsp_msRunId(ms_run_id_csp)
58 if(mass_spectrum_csp ==
nullptr)
59 qFatal(
"Cannot be nullptr");
61 if(mass_spectrum_csp.get() ==
nullptr)
62 qFatal(
"Cannot be nullptr");
69 std::size_t precursor_spectrum_index =
70 mass_spectrum_csp->getPrecursorSpectrumIndex();
74 if(precursor_spectrum_index == std::numeric_limits<std::size_t>::max())
97 if(mass_spectrum_csp->getMsLevel() <= 1)
100 "msrundatasettree.cpp -- ERROR the MS level needs to be > 1 in a "
101 "fragmentation spectrum.");
107 if(parent_node_p ==
nullptr)
110 "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));
133 mass_spectrum_csp->getRtInMinutes(), new_node_p,
DataKind::rt);
138 mass_spectrum_csp->getDtInMilliSeconds(), new_node_p,
DataKind::dt);
150const std::map<std::size_t, MsRunDataSetTreeNode *> &
163 throw(
"Cannot be that the node pointer is nullptr");
165 std::map<std::size_t, MsRunDataSetTreeNode *>::const_iterator iterator =
169 [node](
const std::pair<std::size_t, MsRunDataSetTreeNode *> pair) {
170 return pair.second == node;
174 return iterator->first;
176 return std::numeric_limits<std::size_t>::max();
190const std::vector<MsRunDataSetTreeNode *> &
209 node->accept(visitor);
217 std::vector<MsRunDataSetTreeNode *>::const_iterator nodes_begin_iterator,
218 std::vector<MsRunDataSetTreeNode *>::const_iterator nodes_end_iterator)
224 using Iterator = std::vector<MsRunDataSetTreeNode *>::const_iterator;
226 Iterator iter = nodes_begin_iterator;
230 std::size_t node_count =
231 std::distance(nodes_begin_iterator, nodes_end_iterator);
235 while(iter != nodes_end_iterator)
246 (*iter)->accept(visitor);
262 if(iterNode !=
nullptr)
280 if(iterNode !=
nullptr)
288std::vector<MsRunDataSetTreeNode *>
293 std::vector<MsRunDataSetTreeNode *> nodes;
298 node->flattenedView(nodes,
true );
305std::vector<MsRunDataSetTreeNode *>
307 bool with_descendants)
309 std::vector<MsRunDataSetTreeNode *> nodes;
316 "msrundatasettree.cpp -- ERROR the MS level cannot be 0.");
324 std::size_t
depth = 0;
341 node->flattenedView(nodes, with_descendants);
361 node->flattenedViewMsLevelNodes(ms_level,
depth, nodes, with_descendants);
370 std::size_t product_spectrum_index)
380 node =
findNode(product_spectrum_index);
388std::vector<MsRunDataSetTreeNode *>
390 std::size_t precursor_spectrum_index)
392 std::vector<MsRunDataSetTreeNode *> nodes;
398 if(precursor_node ==
nullptr)
401 nodes.assign(precursor_node->
m_children.begin(),
408std::vector<MsRunDataSetTreeNode *>
416 if(precision_ptr ==
nullptr)
418 "msrundatasettree.cpp -- ERROR precision_ptr cannot be nullptr.");
420 std::vector<MsRunDataSetTreeNode *> product_nodes;
428 node->productNodesByPrecursorMz(
mz, precision_ptr, product_nodes);
433 std::vector<MsRunDataSetTreeNode *> precursor_nodes;
435 for(
auto &&node : product_nodes)
437 precursor_nodes.push_back(
438 findNode(node->mcsp_massSpectrum->getPrecursorSpectrumIndex()));
441 return precursor_nodes;
452 using NodeVector = std::vector<MsRunDataSetTreeNode *>;
454 using MapPair = std::pair<double, NodeVector>;
455 using MapIterator = DoubleNodeVectorMap::iterator;
468 qFatal(
"Programming error.");
478 MapIterator found_iterator = map_p->find(time);
480 if(found_iterator != map_p->end())
484 found_iterator->second.push_back(node_p);
494 map_p->insert(MapPair(time, node_vector));
518 if(parent_p ==
nullptr)
535 m_indexNodeMap.insert(std::pair<std::size_t, MsRunDataSetTreeNode *>(
536 mass_spectrum_csp->getMassSpectrumId().getSpectrumIndex(), new_node_p));
542 mass_spectrum_csp->getRtInMinutes(), new_node_p,
DataKind::rt);
547 mass_spectrum_csp->getDtInMilliSeconds(), new_node_p,
DataKind::dt);
560 std::size_t precursor_spectrum_index)
578 if(mass_spec_data_node_p ==
nullptr)
581 "msrundatasettree.cpp -- ERROR could not find a a "
582 "tree node matching the index.");
598 using NodeVector = std::vector<MsRunDataSetTreeNode *>;
600 using MapIterator = DoubleNodeVectorMap::const_iterator;
613 qFatal(
"Programming error.");
615 std::size_t added_nodes = 0;
620 MapIterator start_iterator = map_p->lower_bound(start);
622 if(start_iterator == map_p->end())
627 MapIterator end_iterator = map_p->upper_bound(end);
632 for(MapIterator iterator = start_iterator; iterator != end_iterator;
642 for(
auto &&node_p : node_vector)
644 nodes.push_back(node_p);
658 using NodeVector = std::vector<MsRunDataSetTreeNode *>;
659 using NodeVectorIterator = NodeVector::iterator;
662 using MapIterator = DoubleNodeVectorMap::const_iterator;
675 qFatal(
"Programming error.");
677 std::size_t removed_vector_items = 0;
686 MapIterator first_end_iterator = (*map_p).upper_bound(start);
691 for(MapIterator iterator = map_p->begin(); iterator != first_end_iterator;
703 for(
auto &&node_p : node_vector)
705 NodeVectorIterator iterator =
706 std::find(nodes.begin(), nodes.end(), node_p);
708 if(iterator != nodes.end())
712 nodes.erase(iterator);
714 ++removed_vector_items;
726 MapIterator second_first_iterator = map_p->upper_bound(end);
727 if(second_first_iterator != map_p->begin())
728 --second_first_iterator;
730 for(MapIterator iterator = second_first_iterator; iterator != map_p->end();
740 for(
auto &&node_p : node_vector)
742 NodeVectorIterator iterator =
743 std::find(nodes.begin(), nodes.end(), node_p);
745 if(iterator != nodes.end())
749 nodes.erase(iterator);
751 ++removed_vector_items;
756 return removed_vector_items;
770 qDebug() <<
"Special case, start and end are equal:" << start;
778 using MapIterator = DoubleNodeVectorMap::const_iterator;
799 qFatal(
"Programming error.");
804 std::size_t added_mass_spectra = 0;
809 MapIterator start_iterator = map_p->lower_bound(start);
811 if(start_iterator == map_p->end())
813 qDebug() <<
"The start iterator is end()!";
825 MapIterator end_iterator = map_p->upper_bound(end);
828 if(!std::distance(start_iterator, end_iterator))
830 qDebug() <<
"No range of mass spectra could be selected.";
834 if(end_iterator == map_p->end())
855 for(MapIterator iterator = start_iterator; iterator != end_iterator;
865 for(
auto &&node_p : node_vector)
868 node_p->getQualifiedMassSpectrum();
873 if(qualified_mass_spectrum_csp ==
nullptr ||
874 qualified_mass_spectrum_csp.get() ==
nullptr)
877 "The QualifiedMassSpectrumCstSPtr cannot be nullptr.");
886 mass_spectra.push_back(qualified_mass_spectrum_csp);
888 ++added_mass_spectra;
894 return added_mass_spectra;
905 using QualMassSpectraVectorIterator = QualMassSpectraVector::iterator;
908 using MapIterator = DoubleNodeVectorMap::const_iterator;
929 qFatal(
"Programming error.");
931 std::size_t removed_vector_items = 0;
943 MapIterator first_end_iterator = (*map_p).lower_bound(start);
956 for(MapIterator iterator = map_p->begin(); iterator != first_end_iterator;
968 for(
auto &&node_p : node_vector)
970 QualMassSpectraVectorIterator iterator =
971 std::find(mass_spectra.begin(),
973 node_p->getQualifiedMassSpectrum());
975 if(iterator != mass_spectra.end())
979 mass_spectra.erase(iterator);
981 ++removed_vector_items;
994 MapIterator second_first_iterator = map_p->upper_bound(end);
1003 for(MapIterator iterator = second_first_iterator; iterator != map_p->end();
1013 for(
auto &&node_p : node_vector)
1015 QualMassSpectraVectorIterator iterator =
1016 std::find(mass_spectra.begin(),
1018 node_p->getQualifiedMassSpectrum());
1020 if(iterator != mass_spectra.end())
1024 mass_spectra.erase(iterator);
1026 ++removed_vector_items;
1031 return removed_vector_items;
1050 std::size_t
depth = 1;
1051 std::size_t tmp_depth = 0;
1052 std::size_t greatest_depth = 0;
1056 tmp_depth = node->depth(
depth);
1060 if(tmp_depth > greatest_depth)
1061 greatest_depth = tmp_depth;
1064 return greatest_depth;
1072 std::size_t cumulative_node_count = 0;
1076 node->size(cumulative_node_count);
1081 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
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)
bool documentNodeInDtRtMap(double time, MsRunDataSetTreeNode *node_p, DataKind data_kind)
std::vector< MsRunDataSetTreeNode * > flattenedView()
std::size_t getSpectrumCount() const
std::map< std::size_t, MsRunDataSetTreeNode * > m_indexNodeMap
std::vector< MsRunDataSetTreeNode * > m_rootNodes
std::size_t addDataSetTreeNodesInsideDtRtRange(double start, double end, NodeVector &nodes, DataKind data_kind) const
std::map< double, NodeVector > DoubleNodeVectorMap
std::size_t removeDataSetTreeNodesOutsideDtRtRange(double start, double end, NodeVector &nodes, DataKind data_kind) const
std::vector< MsRunDataSetTreeNode * > precursorNodesByPrecursorMz(pappso_double mz, PrecisionPtr precision_ptr)
std::vector< MsRunDataSetTreeNode * > NodeVector
std::size_t addDataSetQualMassSpectraInsideDtRtRange(double start, double end, QualMassSpectraVector &mass_spectra, DataKind data_kind) const
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 removeDataSetQualMassSpectraOutsideDtRtRange(double start, double end, QualMassSpectraVector &mass_spectra, DataKind data_kind) const
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
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