OpenMS
Loading...
Searching...
No Matches
TOPPASVertex.h
Go to the documentation of this file.
1// Copyright (c) 2002-present, OpenMS Inc. -- EKU Tuebingen, ETH Zurich, and FU Berlin
2// SPDX-License-Identifier: BSD-3-Clause
3//
4// --------------------------------------------------------------------------
5// $Maintainer: Johannes Veit $
6// $Authors: Johannes Junker, Chris Bielow $
7// --------------------------------------------------------------------------
8
9#pragma once
10
11// ------------- DEBUGGING ----------------
12
13// ---- Uncomment to enable debug mode ----
14//#define TOPPAS_DEBUG
15// ----------------------------------------
16
17#ifdef TOPPAS_DEBUG
18#define __DEBUG_BEGIN_METHOD__ \
19 { \
20 for (int dbg_indnt_cntr = 0; dbg_indnt_cntr < global_debug_indent_; ++dbg_indnt_cntr) \
21 { \
22 std::cout << " "; \
23 } \
24 std::cout << "BEGIN [" << topo_nr_ << "] " << OPENMS_PRETTY_FUNCTION << std::endl; \
25 ++global_debug_indent_; \
26 }
27
28#define __DEBUG_END_METHOD__ \
29 { \
30 --global_debug_indent_; \
31 if (global_debug_indent_ < 0) global_debug_indent_ = 0; \
32 for (int dbg_indnt_cntr = 0; dbg_indnt_cntr < global_debug_indent_; ++dbg_indnt_cntr) \
33 { \
34 std::cout << " "; \
35 } \
36 std::cout << "END [" << topo_nr_ << "] " << OPENMS_PRETTY_FUNCTION << std::endl; \
37 }
38#else
39#define __DEBUG_BEGIN_METHOD__ {}
40#define __DEBUG_END_METHOD__ {}
41#endif
42
43// ----------------------------------------
44
45// OpenMS_GUI config
46#include <OpenMS/VISUAL/OpenMS_GUIConfig.h>
47
49
50#include <QPainter>
51#include <QPainterPath>
52#include <QtWidgets/QGraphicsSceneMouseEvent>
53#include <QtWidgets/QGraphicsSceneContextMenuEvent>
54#include <QtWidgets/QGraphicsItem>
55#include <QtWidgets/QMenu>
56
57#include <QtCore/QProcess>
58#include <QtCore/QStringList>
59
60namespace OpenMS
61{
62 class TOPPASEdge;
63
75 class OPENMS_GUI_DLLAPI TOPPASVertex :
76 public QObject,
77 public QGraphicsItem
78 {
79 Q_OBJECT
80 Q_INTERFACES(QGraphicsItem)
81
82public:
84 typedef QList<TOPPASEdge *> EdgeContainer;
86 typedef EdgeContainer::iterator EdgeIterator;
88 typedef EdgeContainer::const_iterator ConstEdgeIterator;
89
94 {
95 public:
96 TOPPASFilenames() = default;
97 TOPPASFilenames(const QStringList& filenames);
98 int size() const;
99 const QStringList& get() const;
100 const QString& operator[](int i) const;
101
103
104 void set(const QStringList& filenames);
105 void set(const QString& filename, int i);
106 void push_back(const QString& filename);
107 void append(const QStringList& filenames);
109
110 QStringList getSuffixCounts() const;
111
112 private:
113 /*
114 @brief Check length of filename and throw Exception::FileNotWritable() if too long
115
116 @param[in] filename Full path to file (using relative paths will circumvent the effectiveness)
117 @throw Exception::FileNotWritable() if too long (>=255 chars)
118 */
119 void check_(const QString& filename);
120 QStringList filenames_;
121 };
122
125 {
127 TOPPASEdge* edge = nullptr;
128 };
129
134 using RoundPackage = std::map<Int, VertexRoundPackage>;
135 using RoundPackageConstIt = RoundPackage::const_iterator;
136 using RoundPackageIt = RoundPackage::iterator;
137
139 using RoundPackages = std::vector<RoundPackage>;
140
143 {
146 DFS_BLACK
147 };
148
151 {
154 TV_UNFINISHED_INBRANCH
155 };
156
162 ~TOPPASVertex() override = default;
165
167 virtual std::unique_ptr<TOPPASVertex> clone() const = 0;
168
170 void paint(QPainter* painter, const QStyleOptionGraphicsItem* /*option*/, QWidget* /*widget*/, bool round_shape = true);
171
175 bool buildRoundPackages(RoundPackages & pkg, String & error_msg);
176
178 bool isUpstreamFinished() const;
179
181 QRectF boundingRect() const override = 0;
183 QPainterPath shape() const final;
185 ConstEdgeIterator outEdgesBegin() const;
187 ConstEdgeIterator outEdgesEnd() const;
189 ConstEdgeIterator inEdgesBegin() const;
191 ConstEdgeIterator inEdgesEnd() const;
193 Size incomingEdgesCount();
195 Size outgoingEdgesCount();
197 void addInEdge(TOPPASEdge * edge);
199 void addOutEdge(TOPPASEdge * edge);
201 void removeInEdge(TOPPASEdge * edge);
203 void removeOutEdge(TOPPASEdge * edge);
205 DFS_COLOR getDFSColor();
207 void setDFSColor(DFS_COLOR color);
209 TOPPASVertex::SUBSTREESTATUS getSubtreeStatus() const;
211 bool isTopoSortMarked() const;
213 void setTopoSortMarked(bool b);
215 UInt getTopoNr() const;
217 virtual void setTopoNr(UInt nr);
220 virtual void reset(bool reset_all_files = false);
222 virtual void markUnreachable();
224 bool isReachable() const;
226 bool isFinished() const;
229 virtual void run();
231 virtual bool invertRecylingMode();
233 bool isRecyclingEnabled() const;
235 void setRecycling(const bool is_enabled);
236
237 // get the name of the vertex (to be overridden by derived classes)
238 virtual String getName() const = 0;
239
245 QStringList getFileNames(int param_index, int round) const;
246
248 QStringList getFileNames() const;
249
250 // get the output structure directly
251 const RoundPackages & getOutputFiles() const;
252
253
255 bool allInputsReady() const;
256
257
258public slots:
259
261 virtual void inEdgeHasChanged();
263 virtual void outEdgeHasChanged();
264
265signals:
266
268 void clicked();
270 void released();
272 void hoveringEdgePosChanged(const QPointF & new_pos);
274 void newHoveringEdge(const QPointF & pos);
276 void finishHoveringEdge();
278 void somethingHasChanged();
280 void itemDragged(qreal dx, qreal dy);
283 void parameterChanged(const bool invalidates_running_pipeline);
284
285protected:
286
288 EdgeContainer in_edges_;
290 EdgeContainer out_edges_;
292 bool edge_being_created_{false};
294 QColor pen_color_{Qt::black};
296 QColor brush_color_{ Qt::lightGray};
298 DFS_COLOR dfs_color_{DFS_WHITE};
300 bool topo_sort_marked_{false};
306 int round_total_{-1};
308 int round_counter_{0};
310 bool finished_{false};
312 bool reachable_{true};
314 bool allow_output_recycling_{false};
315
316
317#ifdef TOPPAS_DEBUG
318 // Indentation level for nicer debug output
319 static int global_debug_indent_;
320#endif
321
323
324 void mouseReleaseEvent(QGraphicsSceneMouseEvent * e) override;
325 void mousePressEvent(QGraphicsSceneMouseEvent * e) override;
326 void mouseDoubleClickEvent(QGraphicsSceneMouseEvent * e) override;
327 void mouseMoveEvent(QGraphicsSceneMouseEvent * e) override;
328 void contextMenuEvent(QGraphicsSceneContextMenuEvent * event) override;
330
332 virtual void moveNewEdgeTo_(const QPointF & pos);
335
337 void debugOut_(const String &
338#ifdef TOPPAS_DEBUG
339 message
340#endif
341 ) const
342 {
343#ifdef TOPPAS_DEBUG
344 for (int i = 0; i < global_debug_indent_; ++i)
345 {
346 std::cout << " ";
347 }
348 std::cout << "[" << topo_nr_ << "] " << message << std::endl;
349#endif
350 }
351
352 };
353
354} // namespace OpenMS
355
A more convenient string class.
Definition String.h:34
An edge representing a data flow in TOPPAS.
Definition TOPPASEdge.h:36
Definition TOPPASVertex.h:94
TOPPASFilenames(const QStringList &filenames)
const QString & operator[](int i) const
void append(const QStringList &filenames)
const QStringList & get() const
void push_back(const QString &filename)
void set(const QStringList &filenames)
void set(const QString &filename, int i)
QStringList filenames_
filenames passed from upstream node in this round
Definition TOPPASVertex.h:120
void check_(const QString &filename)
The base class of the different vertex classes.
Definition TOPPASVertex.h:78
TOPPASVertex()
Default Constructor.
std::map< Int, VertexRoundPackage > RoundPackage
Definition TOPPASVertex.h:134
QPainterPath shape() const final
Returns a more precise shape.
TOPPASVertex(const TOPPASVertex &rhs)
Copy constructor.
void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override
RoundPackages output_files_
Stores the current output file names for each output parameter.
Definition TOPPASVertex.h:304
bool isUpstreamFinished() const
check if all upstream nodes are ready to go ( 'finished_' is true)
~TOPPASVertex() override=default
Destructor.
RoundPackage::iterator RoundPackageIt
Definition TOPPASVertex.h:136
virtual std::unique_ptr< TOPPASVertex > clone() const =0
Make a copy of this vertex on the heap and return a pointer to it (useful for copying nodes)
std::vector< RoundPackage > RoundPackages
all information a node needs to process all rounds
Definition TOPPASVertex.h:139
bool buildRoundPackages(RoundPackages &pkg, String &error_msg)
SUBSTREESTATUS
The color of a vertex during depth-first search.
Definition TOPPASVertex.h:151
@ TV_ALLFINISHED
all downstream nodes are done (including the ones which are feed by a parallel subtree)
Definition TOPPASVertex.h:152
@ TV_UNFINISHED
some direct downstream node is not done
Definition TOPPASVertex.h:153
QList< TOPPASEdge * > EdgeContainer
The container for in/out edges.
Definition TOPPASVertex.h:84
EdgeContainer::const_iterator ConstEdgeIterator
A const iterator for in/out edges.
Definition TOPPASVertex.h:88
String get3CharsNumber_(UInt number) const
Returns a three character string (i.e. 001 instead of 1) for the given number.
RoundPackage::const_iterator RoundPackageConstIt
Definition TOPPASVertex.h:135
TOPPASVertex & operator=(const TOPPASVertex &rhs)
Assignment operator.
TOPPASFilenames filenames
filenames passed from upstream node in this round
Definition TOPPASVertex.h:126
QRectF boundingRect() const override=0
Returns the bounding rectangle of this item.
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *e) override
void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *, bool round_shape=true)
base paint method for all derived classes. should be called first in child-class paint
void debugOut_(const String &) const
Displays the debug output message, if TOPPAS_DEBUG is defined.
Definition TOPPASVertex.h:337
DFS_COLOR
The color of a vertex during depth-first search.
Definition TOPPASVertex.h:143
@ DFS_GRAY
Definition TOPPASVertex.h:145
@ DFS_WHITE
Definition TOPPASVertex.h:144
EdgeContainer::iterator EdgeIterator
A mutable iterator for in/out edges.
Definition TOPPASVertex.h:86
UInt topo_nr_
The number in a topological sort of the entire graph.
Definition TOPPASVertex.h:302
void mouseReleaseEvent(QGraphicsSceneMouseEvent *e) override
void mouseMoveEvent(QGraphicsSceneMouseEvent *e) override
void mousePressEvent(QGraphicsSceneMouseEvent *e) override
virtual void moveNewEdgeTo_(const QPointF &pos)
Moves the target pos of the edge which is just being created to pos.
Info for one edge and round, to be passed to next node.
Definition TOPPASVertex.h:125
unsigned int UInt
Unsigned integer type.
Definition Types.h:64
size_t Size
Size type e.g. used as variable which can hold result of size()
Definition Types.h:97
Main OpenMS namespace.
Definition openswathalgo/include/OpenMS/OPENSWATHALGO/DATAACCESS/ISpectrumAccess.h:19