digraph G { ratio="fill"; size="10,6!"; margin=0; dpi=180; rankdir="LR"; graph [fontname = "Ubuntu"]; node [fontname = "Ubuntu"]; edge [fontname = "Ubuntu"]; node [shape=ellipse]; compound=true; citygml [label="CityGML", shape=box3d]; trees [label="Trees.shp", shape=note]; floors [label="Floors.csv", shape=note]; dreso [label="DreSo.csv", shape=note]; lib [label="Physics.lib", shape=component]; weather [label="Weather.csv", shape=component]; simstadt [label="SimStadt", style=filled, shape=cylinder]; citygml -> simstadt; trees -> citygml [label="add-trees.py"]; dreso -> citygml [label="?"]; floors -> citygml [label="add-floor.py"]; lib -> simstadt [label="window_ratio.py"]; weather -> simstadt; shp [label="Results.shp", shape=note]; subgraph cluster_1 { label="Demands"; node [shape=note]; csv1 [label="Heat.csv"]; csv2 [label="Cooling.csv"]; csv3 [label="Water.csv"]; color=lightgrey; } optimizer [label="TUM optimizer.py", style=filled, shape=cylinder]; gis [label="ArcGIS", style=filled, shape=cylinder]; csv3 -> optimizer [ltail=cluster_1]; csv3 -> gis [ltail=cluster_1]; simstadt -> shp; simstadt -> csv1; simstadt -> csv2; simstadt -> csv3; shp -> gis; optimizer -> lib [style=dotted]; optimizer -> floors [style=dotted]; gis -> trees [style=dotted]; { rank=min; floors; trees; dreso} { rank=max; gis; optimizer} }