11#include "../pappsoexception.h"
12#include "../exception/exceptionnotpossible.h"
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 = mass_spectrum_csp->getPrecursorSpectrumIndex();
71 qDebug() <<
"The precursor_spectrum_index:" << precursor_spectrum_index;
73 if(precursor_spectrum_index == std::numeric_limits<std::size_t>::max())
96 if(mass_spectrum_csp->getMsLevel() <= 1)
99 "msrundatasettree.cpp -- ERROR the MS level needs to be > 1 in a "
100 "fragmentation spectrum.");
106 if(parent_node_p ==
nullptr)
111 .arg(
"msrundatasettree.cpp -- ERROR could not find "
112 "a tree node matching the index."));
123 parent_node_p->
m_children.push_back(new_node_p);
127 m_indexNodeMap.insert(std::pair<std::size_t, MsRunDataSetTreeNode *>(
128 mass_spectrum_csp->getMassSpectrumId().getSpectrumIndex(), new_node_p));
137 double ion_mobility_value = -1;
146 QVariant ion_mobility_variant_value =
149 if(ion_mobility_variant_value.isValid())
153 ion_mobility_value = ion_mobility_variant_value.toDouble(&ok);
158 "The data are Bruker timsTOF data but failed to convert valid "
159 "QVariant 1/K0 value to double.");
177 ion_mobility_variant_value = mass_spectrum_csp->getParameterValue(
180 if(!ion_mobility_variant_value.isValid())
183 "The data are Bruker timsTOF data but failed to get correct "
184 "ion mobility data. Inconsistency found.");
190 ion_mobility_value = mass_spectrum_csp->getDtInMilliSeconds();
193 if(ion_mobility_value != -1)
206const std::map<std::size_t, MsRunDataSetTreeNode *> &
219 throw(
"Cannot be that the node pointer is nullptr");
221 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();
244const std::vector<MsRunDataSetTreeNode *> &
263 node->accept(visitor);
270 std::vector<MsRunDataSetTreeNode *>::const_iterator nodes_begin_iterator,
271 std::vector<MsRunDataSetTreeNode *>::const_iterator nodes_end_iterator)
277 using Iterator = std::vector<MsRunDataSetTreeNode *>::const_iterator;
279 Iterator iter = nodes_begin_iterator;
283 std::size_t node_count = std::distance(nodes_begin_iterator, nodes_end_iterator);
287 while(iter != nodes_end_iterator)
298 (*iter)->accept(visitor);
314 if(iterNode !=
nullptr)
332 if(iterNode !=
nullptr)
340std::vector<MsRunDataSetTreeNode *>
345 std::vector<MsRunDataSetTreeNode *> nodes;
350 node->flattenedView(nodes,
true );
357std::vector<MsRunDataSetTreeNode *>
360 std::vector<MsRunDataSetTreeNode *> nodes;
374 std::size_t
depth = 0;
391 node->flattenedView(nodes, with_descendants);
411 node->flattenedViewMsLevelNodes(ms_level,
depth, nodes, with_descendants);
429 node =
findNode(product_spectrum_index);
437std::vector<MsRunDataSetTreeNode *>
440 std::vector<MsRunDataSetTreeNode *> nodes;
446 if(precursor_node ==
nullptr)
455std::vector<MsRunDataSetTreeNode *>
462 if(precision_ptr ==
nullptr)
465 std::vector<MsRunDataSetTreeNode *> product_nodes;
473 node->productNodesByPrecursorMz(
mz, precision_ptr, product_nodes);
478 std::vector<MsRunDataSetTreeNode *> precursor_nodes;
480 for(
auto &&node : product_nodes)
482 precursor_nodes.push_back(
findNode(node->mcsp_massSpectrum->getPrecursorSpectrumIndex()));
485 return precursor_nodes;
496 using NodeVector = std::vector<MsRunDataSetTreeNode *>;
498 using MapPair = std::pair<double, NodeVector>;
499 using MapIterator = DoubleNodeVectorMap::iterator;
512 qFatal(
"Programming error.");
522 MapIterator found_iterator = map_p->find(time);
524 if(found_iterator != map_p->end())
528 found_iterator->second.push_back(node_p);
538 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));
587 double ion_mobility_value = -1;
596 QVariant ion_mobility_variant_value =
599 if(ion_mobility_variant_value.isValid())
603 ion_mobility_value = ion_mobility_variant_value.toDouble(&ok);
608 "The data are Bruker timsTOF data but failed to convert valid "
609 "QVariant 1/K0 value to double.");
627 ion_mobility_variant_value = mass_spectrum_csp->getParameterValue(
630 if(!ion_mobility_variant_value.isValid())
633 "The data are Bruker timsTOF data but failed to get correct "
634 "ion mobility data. Inconsistency found.");
640 ion_mobility_value = mass_spectrum_csp->getDtInMilliSeconds();
643 if(ion_mobility_value != -1)
656 std::size_t precursor_spectrum_index)
673 if(mass_spec_data_node_p ==
nullptr)
676 "msrundatasettree.cpp -- ERROR could not find a a "
677 "tree node matching the index.");
693 using NodeVector = std::vector<MsRunDataSetTreeNode *>;
695 using MapIterator = DoubleNodeVectorMap::const_iterator;
708 qFatal(
"Programming error.");
710 std::size_t added_nodes = 0;
715 MapIterator start_iterator = map_p->lower_bound(start);
717 if(start_iterator == map_p->end())
722 MapIterator end_iterator = map_p->upper_bound(end);
727 for(MapIterator iterator = start_iterator; iterator != end_iterator; ++iterator)
736 for(
auto &&node_p : node_vector)
738 nodes.push_back(node_p);
754 using NodeVector = std::vector<MsRunDataSetTreeNode *>;
755 using NodeVectorIterator = NodeVector::iterator;
758 using MapIterator = DoubleNodeVectorMap::const_iterator;
771 qFatal(
"Programming error.");
773 std::size_t removed_vector_items = 0;
782 MapIterator first_end_iterator = (*map_p).upper_bound(start);
787 for(MapIterator iterator = map_p->begin(); iterator != first_end_iterator; ++iterator)
798 for(
auto &&node_p : node_vector)
800 NodeVectorIterator iterator = std::find(nodes.begin(), nodes.end(), node_p);
802 if(iterator != nodes.end())
806 nodes.erase(iterator);
808 ++removed_vector_items;
820 MapIterator second_first_iterator = map_p->upper_bound(end);
821 if(second_first_iterator != map_p->begin())
822 --second_first_iterator;
824 for(MapIterator iterator = second_first_iterator; iterator != map_p->end(); ++iterator)
833 for(
auto &&node_p : node_vector)
835 NodeVectorIterator iterator = std::find(nodes.begin(), nodes.end(), node_p);
837 if(iterator != nodes.end())
841 nodes.erase(iterator);
843 ++removed_vector_items;
848 return removed_vector_items;
861 qDebug() <<
"Special case, start and end are equal:" << start;
869 using MapIterator = DoubleNodeVectorMap::const_iterator;
890 qFatal(
"Programming error.");
895 std::size_t added_mass_spectra = 0;
900 MapIterator start_iterator = map_p->lower_bound(start);
902 if(start_iterator == map_p->end())
904 qDebug() <<
"The start iterator is end()!";
916 MapIterator end_iterator = map_p->upper_bound(end);
919 if(!std::distance(start_iterator, end_iterator))
921 qDebug() <<
"No range of mass spectra could be selected.";
925 if(end_iterator == map_p->end())
946 for(MapIterator iterator = start_iterator; iterator != end_iterator; ++iterator)
956 for(
auto &&node_p : node_vector)
959 node_p->getQualifiedMassSpectrum();
964 if(qualified_mass_spectrum_csp ==
nullptr ||
965 qualified_mass_spectrum_csp.get() ==
nullptr)
968 "The QualifiedMassSpectrumCstSPtr cannot be nullptr.");
977 mass_spectra.push_back(qualified_mass_spectrum_csp);
979 ++added_mass_spectra;
985 return added_mass_spectra;
995 using QualMassSpectraVectorIterator = QualMassSpectraVector::iterator;
998 using MapIterator = DoubleNodeVectorMap::const_iterator;
1019 qFatal(
"Programming error.");
1021 std::size_t removed_vector_items = 0;
1033 MapIterator first_end_iterator = (*map_p).lower_bound(start);
1046 for(MapIterator iterator = map_p->begin(); iterator != first_end_iterator; ++iterator)
1057 for(
auto &&node_p : node_vector)
1059 QualMassSpectraVectorIterator iterator =
1060 std::find(mass_spectra.begin(), mass_spectra.end(), node_p->getQualifiedMassSpectrum());
1062 if(iterator != mass_spectra.end())
1066 mass_spectra.erase(iterator);
1068 ++removed_vector_items;
1081 MapIterator second_first_iterator = map_p->upper_bound(end);
1090 for(MapIterator iterator = second_first_iterator; iterator != map_p->end(); ++iterator)
1099 for(
auto &&node_p : node_vector)
1101 QualMassSpectraVectorIterator iterator =
1102 std::find(mass_spectra.begin(), mass_spectra.end(), node_p->getQualifiedMassSpectrum());
1104 if(iterator != mass_spectra.end())
1108 mass_spectra.erase(iterator);
1110 ++removed_vector_items;
1115 return removed_vector_items;
1134 std::size_t
depth = 1;
1135 std::size_t tmp_depth = 0;
1136 std::size_t greatest_depth = 0;
1140 tmp_depth = node->depth(
depth);
1144 if(tmp_depth > greatest_depth)
1145 greatest_depth = tmp_depth;
1148 return greatest_depth;
1156 std::size_t cumulative_node_count = 0;
1160 node->size(cumulative_node_count);
1165 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)
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
@ IonMobOneOverK0Begin
1/K0 range's begin value
@ IonMobOneOverK0
1/kO value