OpenMS
TOPPASVertex.h
Go to the documentation of this file.
1 // --------------------------------------------------------------------------
2 // OpenMS -- Open-Source Mass Spectrometry
3 // --------------------------------------------------------------------------
4 // Copyright The OpenMS Team -- Eberhard Karls University Tuebingen,
5 // ETH Zurich, and Freie Universitaet Berlin 2002-2023.
6 //
7 // This software is released under a three-clause BSD license:
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above copyright
11 // notice, this list of conditions and the following disclaimer in the
12 // documentation and/or other materials provided with the distribution.
13 // * Neither the name of any author or any participating institution
14 // may be used to endorse or promote products derived from this software
15 // without specific prior written permission.
16 // For a full list of authors, refer to the file AUTHORS.
17 // --------------------------------------------------------------------------
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 // ARE DISCLAIMED. IN NO EVENT SHALL ANY OF THE AUTHORS OR THE CONTRIBUTING
22 // INSTITUTIONS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
25 // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
27 // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
28 // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 //
30 // --------------------------------------------------------------------------
31 // $Maintainer: Johannes Veit $
32 // $Authors: Johannes Junker, Chris Bielow $
33 // --------------------------------------------------------------------------
34 
35 #pragma once
36 
37 // ------------- DEBUGGING ----------------
38 
39 // ---- Uncomment to enable debug mode ----
40 //#define TOPPAS_DEBUG
41 // ----------------------------------------
42 
43 #ifdef TOPPAS_DEBUG
44 #define __DEBUG_BEGIN_METHOD__ \
45  { \
46  for (int dbg_indnt_cntr = 0; dbg_indnt_cntr < global_debug_indent_; ++dbg_indnt_cntr) \
47  { \
48  std::cout << " "; \
49  } \
50  std::cout << "BEGIN [" << topo_nr_ << "] " << OPENMS_PRETTY_FUNCTION << std::endl; \
51  ++global_debug_indent_; \
52  }
53 
54 #define __DEBUG_END_METHOD__ \
55  { \
56  --global_debug_indent_; \
57  if (global_debug_indent_ < 0) global_debug_indent_ = 0; \
58  for (int dbg_indnt_cntr = 0; dbg_indnt_cntr < global_debug_indent_; ++dbg_indnt_cntr) \
59  { \
60  std::cout << " "; \
61  } \
62  std::cout << "END [" << topo_nr_ << "] " << OPENMS_PRETTY_FUNCTION << std::endl; \
63  }
64 #else
65 #define __DEBUG_BEGIN_METHOD__ {}
66 #define __DEBUG_END_METHOD__ {}
67 #endif
68 
69 // ----------------------------------------
70 
71 // OpenMS_GUI config
72 #include <OpenMS/VISUAL/OpenMS_GUIConfig.h>
73 
75 
76 #include <QPainter>
77 #include <QPainterPath>
78 #include <QtWidgets/QGraphicsSceneMouseEvent>
79 #include <QtWidgets/QGraphicsSceneContextMenuEvent>
80 #include <QtWidgets/QGraphicsItem>
81 #include <QtCore/QProcess>
82 #include <QtWidgets/QMenu>
83 #include <QStringList>
84 
85 namespace OpenMS
86 {
87  class TOPPASEdge;
88 
100  class OPENMS_GUI_DLLAPI TOPPASVertex :
101  public QObject,
102  public QGraphicsItem
103  {
104  Q_OBJECT
105  Q_INTERFACES(QGraphicsItem)
106 
107 public:
109  typedef QList<TOPPASEdge *> EdgeContainer;
111  typedef EdgeContainer::iterator EdgeIterator;
113  typedef EdgeContainer::const_iterator ConstEdgeIterator;
114 
119  {
120  public:
121  TOPPASFilenames() = default;
122  TOPPASFilenames(const QStringList& filenames);
123  int size() const;
124  const QStringList& get() const;
125  const QString& operator[](int i) const;
126 
128 
129  void set(const QStringList& filenames);
130  void set(const QString& filename, int i);
131  void push_back(const QString& filename);
132  void append(const QStringList& filenames);
134 
135  QStringList getSuffixCounts() const;
136 
137  private:
138  /*
139  @brief Check length of filename and throw Exception::FileNotWritable() if too long
140 
141  @param filename Full path to file (using relative paths will circumvent the effectiveness)
142  @throw Exception::FileNotWritable() if too long (>=255 chars)
143  */
144  void check_(const QString& filename);
145  QStringList filenames_;
146  };
147 
150  {
152  TOPPASEdge* edge = nullptr;
153  };
154 
159  typedef std::map<Int, VertexRoundPackage> RoundPackage;
160  typedef RoundPackage::const_iterator RoundPackageConstIt;
161  typedef RoundPackage::iterator RoundPackageIt;
162 
164  typedef std::vector<RoundPackage> RoundPackages;
165 
168  {
171  DFS_BLACK
172  };
173 
176  {
179  TV_UNFINISHED_INBRANCH
180  };
181 
187  ~TOPPASVertex() override = default;
191  void paint(QPainter* painter, const QStyleOptionGraphicsItem* /*option*/, QWidget* /*widget*/, bool round_shape = true);
192 
196  bool buildRoundPackages(RoundPackages & pkg, String & error_msg);
197 
199  bool isUpstreamFinished() const;
200 
202  QRectF boundingRect() const override = 0;
204  QPainterPath shape() const final;
206  ConstEdgeIterator outEdgesBegin() const;
208  ConstEdgeIterator outEdgesEnd() const;
210  ConstEdgeIterator inEdgesBegin() const;
212  ConstEdgeIterator inEdgesEnd() const;
214  Size incomingEdgesCount();
216  Size outgoingEdgesCount();
218  void addInEdge(TOPPASEdge * edge);
220  void addOutEdge(TOPPASEdge * edge);
222  void removeInEdge(TOPPASEdge * edge);
224  void removeOutEdge(TOPPASEdge * edge);
226  DFS_COLOR getDFSColor();
228  void setDFSColor(DFS_COLOR color);
230  TOPPASVertex::SUBSTREESTATUS getSubtreeStatus() const;
232  bool isTopoSortMarked() const;
234  void setTopoSortMarked(bool b);
236  UInt getTopoNr() const;
238  virtual void setTopoNr(UInt nr);
241  virtual void reset(bool reset_all_files = false);
243  virtual void markUnreachable();
245  bool isReachable() const;
247  bool isFinished() const;
250  virtual void run();
252  virtual bool invertRecylingMode();
254  bool isRecyclingEnabled() const;
256  void setRecycling(const bool is_enabled);
257 
258  // get the name of the vertex (to be overridden by derived classes)
259  virtual String getName() const = 0;
260 
266  QStringList getFileNames(int param_index, int round) const;
267 
269  QStringList getFileNames() const;
270 
271  // get the output structure directly
272  const RoundPackages & getOutputFiles() const;
273 
274 
276  bool allInputsReady() const;
277 
278 
279 public slots:
280 
282  virtual void inEdgeHasChanged();
284  virtual void outEdgeHasChanged();
285 
286 signals:
287 
289  void clicked();
291  void released();
293  void hoveringEdgePosChanged(const QPointF & new_pos);
295  void newHoveringEdge(const QPointF & pos);
297  void finishHoveringEdge();
299  void somethingHasChanged();
301  void itemDragged(qreal dx, qreal dy);
304  void parameterChanged(const bool invalidates_running_pipeline);
305 
306 protected:
307 
309  EdgeContainer in_edges_;
311  EdgeContainer out_edges_;
313  bool edge_being_created_{false};
315  QColor pen_color_{Qt::black};
317  QColor brush_color_{ Qt::lightGray};
319  DFS_COLOR dfs_color_{DFS_WHITE};
321  bool topo_sort_marked_{false};
327  int round_total_{-1};
329  int round_counter_{0};
331  bool finished_{false};
333  bool reachable_{true};
335  bool allow_output_recycling_{false};
336 
337 
338 #ifdef TOPPAS_DEBUG
339  // Indentation level for nicer debug output
340  static int global_debug_indent_;
341 #endif
342 
344 
345  void mouseReleaseEvent(QGraphicsSceneMouseEvent * e) override;
346  void mousePressEvent(QGraphicsSceneMouseEvent * e) override;
347  void mouseDoubleClickEvent(QGraphicsSceneMouseEvent * e) override;
348  void mouseMoveEvent(QGraphicsSceneMouseEvent * e) override;
349  void contextMenuEvent(QGraphicsSceneContextMenuEvent * event) override;
351 
353  virtual void moveNewEdgeTo_(const QPointF & pos);
356 
358  void debugOut_(const String &
359 #ifdef TOPPAS_DEBUG
360  message
361 #endif
362  ) const
363  {
364 #ifdef TOPPAS_DEBUG
365  for (int i = 0; i < global_debug_indent_; ++i)
366  {
367  std::cout << " ";
368  }
369  std::cout << "[" << topo_nr_ << "] " << message << std::endl;
370 #endif
371  }
372 
373  };
374 }
375 
A more convenient string class.
Definition: String.h:60
An edge representing a data flow in TOPPAS.
Definition: TOPPASEdge.h:62
Definition: TOPPASVertex.h:119
TOPPASFilenames(const QStringList &filenames)
void append(const QStringList &filenames)
void push_back(const QString &filename)
const QString & operator[](int i) const
void set(const QStringList &filenames)
const QStringList & get() const
void set(const QString &filename, int i)
QStringList filenames_
filenames passed from upstream node in this round
Definition: TOPPASVertex.h:145
void check_(const QString &filename)
The base class of the different vertex classes.
Definition: TOPPASVertex.h:103
TOPPASVertex()
Default Constructor.
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:325
bool isUpstreamFinished() const
check if all upstream nodes are ready to go ( 'finished_' is true)
std::map< Int, VertexRoundPackage > RoundPackage
Definition: TOPPASVertex.h:159
~TOPPASVertex() override=default
Destructor.
TOPPASVertex & operator=(const TOPPASVertex &rhs)
Assignment operator.
std::vector< RoundPackage > RoundPackages
all information a node needs to process all rounds
Definition: TOPPASVertex.h:164
bool buildRoundPackages(RoundPackages &pkg, String &error_msg)
SUBSTREESTATUS
The color of a vertex during depth-first search.
Definition: TOPPASVertex.h:176
@ TV_ALLFINISHED
all downstream nodes are done (including the ones which are feed by a parallel subtree)
Definition: TOPPASVertex.h:177
@ TV_UNFINISHED
some direct downstream node is not done
Definition: TOPPASVertex.h:178
QList< TOPPASEdge * > EdgeContainer
The container for in/out edges.
Definition: TOPPASVertex.h:109
EdgeContainer::const_iterator ConstEdgeIterator
A const iterator for in/out edges.
Definition: TOPPASVertex.h:113
String get3CharsNumber_(UInt number) const
Returns a three character string (i.e. 001 instead of 1) for the given number.
RoundPackage::iterator RoundPackageIt
Definition: TOPPASVertex.h:161
TOPPASFilenames filenames
filenames passed from upstream node in this round
Definition: TOPPASVertex.h:151
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:358
DFS_COLOR
The color of a vertex during depth-first search.
Definition: TOPPASVertex.h:168
@ DFS_GRAY
Definition: TOPPASVertex.h:170
@ DFS_WHITE
Definition: TOPPASVertex.h:169
EdgeContainer::iterator EdgeIterator
A mutable iterator for in/out edges.
Definition: TOPPASVertex.h:111
UInt topo_nr_
The number in a topological sort of the entire graph.
Definition: TOPPASVertex.h:323
void mouseReleaseEvent(QGraphicsSceneMouseEvent *e) override
void mouseMoveEvent(QGraphicsSceneMouseEvent *e) override
RoundPackage::const_iterator RoundPackageConstIt
Definition: TOPPASVertex.h:160
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:150
unsigned int UInt
Unsigned integer type.
Definition: Types.h:94
size_t Size
Size type e.g. used as variable which can hold result of size()
Definition: Types.h:127
T round(T x)
Rounds the value.
Definition: MathFunctions.h:210
static String number(double d, UInt n)
Definition: StringUtils.h:217
Main OpenMS namespace.
Definition: FeatureDeconvolution.h:48