11#include "../pappsoexception.h"
12#include "../exception/exceptionnotpossible.h"
22 : mcsp_msRunId(ms_run_id_csp)
60 if(mass_spectrum_csp ==
nullptr)
61 qFatal(
"Cannot be nullptr");
63 if(mass_spectrum_csp.get() ==
nullptr)
64 qFatal(
"Cannot be nullptr");
71 std::size_t precursor_spectrum_index =
72 mass_spectrum_csp->getPrecursorSpectrumIndex();
76 if(precursor_spectrum_index == std::numeric_limits<std::size_t>::max())
99 if(mass_spectrum_csp->getMsLevel() <= 1)
102 "msrundatasettree.cpp -- ERROR the MS level needs to be > 1 in a "
103 "fragmentation spectrum.");
109 if(parent_node_p ==
nullptr)
112 "msrundatasettree.cpp -- ERROR could not find "
113 "a tree node matching the index.");
124 parent_node_p->
m_children.push_back(new_node_p);
128 m_indexNodeMap.insert(std::pair<std::size_t, MsRunDataSetTreeNode *>(
129 mass_spectrum_csp->getMassSpectrumId().getSpectrumIndex(), new_node_p));
135 mass_spectrum_csp->getRtInMinutes(), new_node_p,
DataKind::rt);
139 double ion_mobility_value = -1;
148 QVariant ion_mobility_variant_value =
149 mass_spectrum_csp->getParameterValue(
152 if(ion_mobility_variant_value.isValid())
156 ion_mobility_value = ion_mobility_variant_value.toDouble(&ok);
161 "The data are Bruker timsTOF data but failed to convert valid "
162 "QVariant 1/K0 value to double.");
180 ion_mobility_variant_value = mass_spectrum_csp->getParameterValue(
183 if(!ion_mobility_variant_value.isValid())
186 "The data are Bruker timsTOF data but failed to get correct "
187 "ion mobility data. Inconsistency found.");
193 ion_mobility_value = mass_spectrum_csp->getDtInMilliSeconds();
196 if(ion_mobility_value != -1)
209const std::map<std::size_t, MsRunDataSetTreeNode *> &
222 throw(
"Cannot be that the node pointer is nullptr");
224 std::map<std::size_t, MsRunDataSetTreeNode *>::const_iterator iterator =
228 [node](
const std::pair<std::size_t, MsRunDataSetTreeNode *> pair) {
229 return pair.second == node;
233 return iterator->first;
235 return std::numeric_limits<std::size_t>::max();
249const std::vector<MsRunDataSetTreeNode *> &
268 node->accept(visitor);
276 std::vector<MsRunDataSetTreeNode *>::const_iterator nodes_begin_iterator,
277 std::vector<MsRunDataSetTreeNode *>::const_iterator nodes_end_iterator)
283 using Iterator = std::vector<MsRunDataSetTreeNode *>::const_iterator;
285 Iterator iter = nodes_begin_iterator;
289 std::size_t node_count =
290 std::distance(nodes_begin_iterator, nodes_end_iterator);
294 while(iter != nodes_end_iterator)
305 (*iter)->accept(visitor);
321 if(iterNode !=
nullptr)
339 if(iterNode !=
nullptr)
347std::vector<MsRunDataSetTreeNode *>
352 std::vector<MsRunDataSetTreeNode *> nodes;
364std::vector<MsRunDataSetTreeNode *>
366 bool with_descendants)
368 std::vector<MsRunDataSetTreeNode *> nodes;
375 "msrundatasettree.cpp -- ERROR the MS level cannot be 0.");
383 std::size_t
depth = 0;
400 node->flattenedView(nodes, with_descendants);
420 node->flattenedViewMsLevelNodes(ms_level,
depth, nodes, with_descendants);
429 std::size_t product_spectrum_index)
439 node =
findNode(product_spectrum_index);
447std::vector<MsRunDataSetTreeNode *>
449 std::size_t precursor_spectrum_index)
451 std::vector<MsRunDataSetTreeNode *> nodes;
457 if(precursor_node ==
nullptr)
460 nodes.assign(precursor_node->
m_children.begin(),
467std::vector<MsRunDataSetTreeNode *>
475 if(precision_ptr ==
nullptr)
477 "msrundatasettree.cpp -- ERROR precision_ptr cannot be nullptr.");
479 std::vector<MsRunDataSetTreeNode *> product_nodes;
487 node->productNodesByPrecursorMz(
mz, precision_ptr, product_nodes);
492 std::vector<MsRunDataSetTreeNode *> precursor_nodes;
494 for(
auto &&node : product_nodes)
496 precursor_nodes.push_back(
497 findNode(node->mcsp_massSpectrum->getPrecursorSpectrumIndex()));
500 return precursor_nodes;
511 using NodeVector = std::vector<MsRunDataSetTreeNode *>;
513 using MapPair = std::pair<double, NodeVector>;
514 using MapIterator = DoubleNodeVectorMap::iterator;
527 qFatal(
"Programming error.");
537 MapIterator found_iterator = map_p->find(time);
539 if(found_iterator != map_p->end())
543 found_iterator->second.push_back(node_p);
553 map_p->insert(MapPair(time, node_vector));
577 if(parent_p ==
nullptr)
594 m_indexNodeMap.insert(std::pair<std::size_t, MsRunDataSetTreeNode *>(
595 mass_spectrum_csp->getMassSpectrumId().getSpectrumIndex(), new_node_p));
601 mass_spectrum_csp->getRtInMinutes(), new_node_p,
DataKind::rt);
605 double ion_mobility_value = -1;
614 QVariant ion_mobility_variant_value =
615 mass_spectrum_csp->getParameterValue(
618 if(ion_mobility_variant_value.isValid())
622 ion_mobility_value = ion_mobility_variant_value.toDouble(&ok);
627 "The data are Bruker timsTOF data but failed to convert valid "
628 "QVariant 1/K0 value to double.");
646 ion_mobility_variant_value = mass_spectrum_csp->getParameterValue(
649 if(!ion_mobility_variant_value.isValid())
652 "The data are Bruker timsTOF data but failed to get correct "
653 "ion mobility data. Inconsistency found.");
659 ion_mobility_value = mass_spectrum_csp->getDtInMilliSeconds();
662 if(ion_mobility_value != -1)
676 std::size_t precursor_spectrum_index)
694 if(mass_spec_data_node_p ==
nullptr)
697 "msrundatasettree.cpp -- ERROR could not find a a "
698 "tree node matching the index.");
714 using NodeVector = std::vector<MsRunDataSetTreeNode *>;
716 using MapIterator = DoubleNodeVectorMap::const_iterator;
729 qFatal(
"Programming error.");
731 std::size_t added_nodes = 0;
736 MapIterator start_iterator = map_p->lower_bound(start);
738 if(start_iterator == map_p->end())
743 MapIterator end_iterator = map_p->upper_bound(end);
748 for(MapIterator iterator = start_iterator; iterator != end_iterator;
758 for(
auto &&node_p : node_vector)
760 nodes.push_back(node_p);
774 using NodeVector = std::vector<MsRunDataSetTreeNode *>;
775 using NodeVectorIterator = NodeVector::iterator;
778 using MapIterator = DoubleNodeVectorMap::const_iterator;
791 qFatal(
"Programming error.");
793 std::size_t removed_vector_items = 0;
802 MapIterator first_end_iterator = (*map_p).upper_bound(start);
807 for(MapIterator iterator = map_p->begin(); iterator != first_end_iterator;
819 for(
auto &&node_p : node_vector)
821 NodeVectorIterator iterator =
822 std::find(nodes.begin(), nodes.end(), node_p);
824 if(iterator != nodes.end())
828 nodes.erase(iterator);
830 ++removed_vector_items;
842 MapIterator second_first_iterator = map_p->upper_bound(end);
843 if(second_first_iterator != map_p->begin())
844 --second_first_iterator;
846 for(MapIterator iterator = second_first_iterator; iterator != map_p->end();
856 for(
auto &&node_p : node_vector)
858 NodeVectorIterator iterator =
859 std::find(nodes.begin(), nodes.end(), node_p);
861 if(iterator != nodes.end())
865 nodes.erase(iterator);
867 ++removed_vector_items;
872 return removed_vector_items;
886 qDebug() <<
"Special case, start and end are equal:" << start;
894 using MapIterator = DoubleNodeVectorMap::const_iterator;
915 qFatal(
"Programming error.");
920 std::size_t added_mass_spectra = 0;
925 MapIterator start_iterator = map_p->lower_bound(start);
927 if(start_iterator == map_p->end())
929 qDebug() <<
"The start iterator is end()!";
941 MapIterator end_iterator = map_p->upper_bound(end);
944 if(!std::distance(start_iterator, end_iterator))
946 qDebug() <<
"No range of mass spectra could be selected.";
950 if(end_iterator == map_p->end())
971 for(MapIterator iterator = start_iterator; iterator != end_iterator;
982 for(
auto &&node_p : node_vector)
985 node_p->getQualifiedMassSpectrum();
990 if(qualified_mass_spectrum_csp ==
nullptr ||
991 qualified_mass_spectrum_csp.get() ==
nullptr)
994 "The QualifiedMassSpectrumCstSPtr cannot be nullptr.");
1003 mass_spectra.push_back(qualified_mass_spectrum_csp);
1005 ++added_mass_spectra;
1011 return added_mass_spectra;
1022 using QualMassSpectraVectorIterator = QualMassSpectraVector::iterator;
1025 using MapIterator = DoubleNodeVectorMap::const_iterator;
1046 qFatal(
"Programming error.");
1048 std::size_t removed_vector_items = 0;
1060 MapIterator first_end_iterator = (*map_p).lower_bound(start);
1073 for(MapIterator iterator = map_p->begin(); iterator != first_end_iterator;
1085 for(
auto &&node_p : node_vector)
1087 QualMassSpectraVectorIterator iterator =
1088 std::find(mass_spectra.begin(),
1090 node_p->getQualifiedMassSpectrum());
1092 if(iterator != mass_spectra.end())
1096 mass_spectra.erase(iterator);
1098 ++removed_vector_items;
1111 MapIterator second_first_iterator = map_p->upper_bound(end);
1120 for(MapIterator iterator = second_first_iterator; iterator != map_p->end();
1130 for(
auto &&node_p : node_vector)
1132 QualMassSpectraVectorIterator iterator =
1133 std::find(mass_spectra.begin(),
1135 node_p->getQualifiedMassSpectrum());
1137 if(iterator != mass_spectra.end())
1141 mass_spectra.erase(iterator);
1143 ++removed_vector_items;
1148 return removed_vector_items;
1167 std::size_t
depth = 1;
1168 std::size_t tmp_depth = 0;
1169 std::size_t greatest_depth = 0;
1173 tmp_depth = node->depth(
depth);
1177 if(tmp_depth > greatest_depth)
1178 greatest_depth = tmp_depth;
1181 return greatest_depth;
1189 std::size_t cumulative_node_count = 0;
1193 node->size(cumulative_node_count);
1198 return cumulative_node_count;
virtual bool shouldStop() const =0
virtual void setNodesToProcessCount(std::size_t)=0
void flattenedView(std::vector< MsRunDataSetTreeNode * > &nodes, bool with_descendants=false)
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