예제 #1
0
def main():
    # set graphs directory
    graphPath = str(cur+'/NetworkFiles/')
    
    # create a new window
    window = MyDotWindow()    
    window.connect('destroy',gtk.main_quit)
    window.show()
    
    #create the main graph instance of a graph class
    mainGraph = Graph()
    
    #START THE MAIN LOOP
    menuInput = ""
    subMenuInput = ''
    
    # create vascularNetwork instance
    vascularNetwork = VascularNetwork()
    filename = None
    k = None
    while menuInput != "q":
        menuInput = ""
        print ""
        print '====================================='
        print '#    VascularNetworkCreator_v2.3    #'
        print '====================================='
        print " [a] - add vessel to network"
        print " [d] - delete vessel in network"
        print " [n] - new network"
        print " [b] - set boundary conditions"
        print " [f] - set global fluid properties"
        print " [l] - load network"
        print " [s] - save network"
        print " [u] - update XML form CSV file(s)"
        print " [g] - print network graph"
        print " [p] - print network informations"
        print " [q] - quit"
        print ""
        print '  current network: ', filename
        while  menuInput not in ("l","b","q","a","s","g","f","d","u",'n','p'):
            menuInput = raw_input("what to do? ")
        
        if menuInput == "a": 
            print "Add new vessel"
            
            existing = False
            vesselId = raw_input(" enter the vessel id:  ")
            while True:
                try:
                    vesselId = int(vesselId)
                    if vesselId not in vascularNetwork.vessels:
                        break
                    else:
                        existing = True
                except ValueError:
                    print "TYPE-ERROR: vessel id must be type(int) not type(string)"
                    vesselId = raw_input(" enter non existing id: ")
                if existing == True:
                    print " the vessel id exists already enter a new one"
                    vesselId = raw_input(" enter non existing id: ")
                    existing = False
            
            
            if vascularNetwork.vessels != {}:
                                    
                existing = False
                mother = raw_input(" enter existing mother id:  ")
                while True:
                    try:
                        mother = int(mother)
                        if mother in vascularNetwork.vessels.keys() and vascularNetwork.vessels[mother].rightDaughter == None:
                            break
                        else:
                            existing = True
                    except ValueError:
                        print "TYPE-ERROR: mother id must be type(int) not type(string)"
                        mother = raw_input(" enter existing mother id:  ")
                    if existing == True:
                        if mother not in vascularNetwork.vessels: print " there exists no vessel with this id"
                        else: print "   only bifurcations possible!"
                        mother = raw_input(" enter existing mother id:  ")
                        existing = False
                    
                if vascularNetwork.vessels[mother].leftDaughter == None: vascularNetwork.vessels[mother].leftDaughter = vesselId
                else: vascularNetwork.vessels[mother].rightDaughter = vesselId
                                
            vascularNetwork.addVessel(vesselId)
            print " define vessel compliance!"
            
            
            inputType = '0'
            print "     available compliance types:"
            print ""
            # get all defined boundaryConditions from constants-dict save as bcTypes
            complianceTypes = vesselComplianceElements.keys()
            compTypes = ['default (Hayashi)']
            for compType in complianceTypes: 
                compTypes.append(compType)
            # show all compliance types in the compTypes
            index = 0
            for key in compTypes:
                print "       [",str(index).rjust(2),"]    ",key
                index = index+1
            # get user input and check if it was correct to define the bcType 
            existing = False
            inputType = raw_input ("      choose type ")
            while True:
                # check if right input
                try:
                    inputType = int(inputType)
                    if inputType in np.linspace(0,len(compTypes)-1,len(compTypes)):
                        break
                    else:
                        existing = True
                # if not int but string
                except ValueError:
                    print "      TYPE-ERROR: vessel id must be type(int) not type(string)"
                    inputType = (raw_input ("      choose type "))
                # if int but to low or high
                if existing == True:
                    print "       the type does not exist"
                    inputType = (raw_input ("      choose type "))
                    existing = False
            
            compType = compTypes[int(inputType)] 
            
            if compType != 'default (Hayashi)':
                vesselData = {'complianceType':compType}
                vesselComplianceElements[compType]
                                    
                print ""
                print "      set values for the Compliance: ", compType
                question = True
                for arg in vesselComplianceElements[compType]:
                    if arg != 'complianceType':
                        currValue = raw_input (str("            set value for "+str(arg)+' '))
                        test = True
                        try: float(currValue)
                        except:
                            print '            VALUE or TYPE ERROR, set to None'
                            test = False
                        if test == True: vesselData[arg] = (float(currValue))
                        else: vesselData[arg] = None
                vascularNetwork.updateNetwork({'vesselData':  { vesselId : vesselData}})
            
            mainGraph.update_graph(vascularNetwork, window)
                    
        if menuInput == "d":
            print "Delete a vessel and all its daugthers"
            if vascularNetwork.vessels.keys() != []:
                
                existing = False
                vesselId = raw_input(" enter existing vessel id: ")
                while True:
                    try:
                        vesselId = int(vesselId)
                        if vesselId in vascularNetwork.vessels:
                            break
                        else: 
                            existing = True
                    except ValueError:
                        print "TYPE-ERROR: vessel id must be type(int) not type(string)"
                        vesselId = raw_input(" enter existing vessel id: ")
                    if existing == True:
                        print " the vessel does not exist"
                        vesselId = raw_input(" enter existing vessel id: ")
                        existing = False
                
                #travers the tree starting with the vessel and collect all ids
                toDelete = findAllDaughters(vascularNetwork,vesselId)
                
                toDelete.append(vesselId)
                
                for vesselToDelete in toDelete:
                    vascularNetwork.deleteVessel(vesselToDelete)
                
                # empty the graph to redraw it
                if vascularNetwork.vessels.keys() == []:
                    mainGraph.update_graph(None, window)
                    vascularNetwork = VascularNetwork()
                else:
                    mainGraph.update_graph(vascularNetwork, window)
                
            else:
                print " there are no vessels to delete"
                
        elif menuInput == "n":
            print "new network"
            question = raw_input(" are u sure to delete all current data? [y] - yes: ")
            if question == 'y':
                # delete vascularNetwork
                del vascularNetwork
                # create vascularNetwork instance
                mainGraph.update_graph(None, window)
                vascularNetwork = VascularNetwork()
                    
        elif menuInput == "p":
            vascularNetwork.showVessels()
            vascularNetwork.showNetwork()
                        
        elif menuInput == "g":
            print mainGraph.getGraph()
            
        elif menuInput == "b":
            subMenuInput = ''
            
            while  subMenuInput not in ['1','2','3','4','5','b']:
                if vascularNetwork.getVariableValue('vessels') == {}:
                    print " there are no vessels defined and thus no boundarys available";break
                else:
                    # evaluate boundarys in Network
                    boundarys = []
                    notDefinedBoundarys = []
                    
                    boundarys.extend(vascularNetwork.boundaryVessels)
                    if vascularNetwork.root != None and vascularNetwork.root not in boundarys: 
                        boundarys.append(vascularNetwork.root)
                        
                    boundarysSaved = vascularNetwork.boundaryConditions.keys()
                    
                    # update saved boundary conditions
                    for boundarysCurrent in boundarys:
                        if boundarysCurrent not in boundarysSaved:
                            print " boundary added to vascularNetwork"
                            vascularNetwork.boundaryConditions[boundarysCurrent] = []
                            boundarysSaved.append(boundarysCurrent)
                            
                        if vascularNetwork.boundaryConditions[boundarysCurrent] == []:
                            notDefinedBoundarys.append(boundarysCurrent)
                        
                    nonBoundarys = list(set(boundarys).symmetric_difference(set(boundarysSaved)))
                    for nonBoundary in nonBoundarys:
                        print " boundary removed from vacularNetwork"
                        del(vascularNetwork.boundaryConditions[nonBoundary])
                        if nonBoundary in notDefinedBoundarys: notDefinedBoundarys.remove(nonBoundary)
                        
                    vascularNetwork.evaluateConnections()
                    print ""
                    print "    sub menu: boundary conditions"
                    print ""
                    print "     [1] - show  boundary conditions"
                    print "     [2] - add   boundary condition "
                    print "     [3] - del   boundary condition "
                    print "     [4] - load  boundary conditions from CSV"
                    print "     [5] - write boundary conditions to CSV"
                    print "     [b] - back to the main menu"
                    print ""     
                    subMenuInput = raw_input("     what to do? ") 
                    
                    if subMenuInput == '1':
                        print "     boundary conditions"
                        pprint.pprint(vascularNetwork.boundaryConditions)
                        subMenuInput = ''
                        
                    elif subMenuInput == '2' and vascularNetwork.root != []:
                        
                        print "     add   boundary condition"
                        print ""
                        
                        definedBoundarys = list(set(notDefinedBoundarys).symmetric_difference(set(vascularNetwork.boundaryConditions.keys())))
                        print "     vessels with defined boundary condition:"
                        print "       ",'  '.join(str(i) for i in definedBoundarys)
                        
                        print "     vessels with undefined boundary condition:"
                        print "       ",'  '.join(str(i) for i in notDefinedBoundarys)
                        print ""
                                            
                        existing = False
                        vesselId = raw_input(" enter existing vessel id: ")
                        while True:
                            try:
                                vesselId = int(vesselId)
                                if vesselId in vascularNetwork.vessels:
                                    break
                                else:
                                    existing = True
                            except ValueError:
                                print " TYPE-ERROR: vessel id must be type(int) not type(string)"
                                vesselId = raw_input(" enter existing vessel id: ")
                            if existing == True:
                                print " the vessel does not exist"
                                vesselId = raw_input(" enter existing vessel id: ")
                                existing = False
                                                
                        inputType = '0'
                        print "     add boundary condition type:"
                        print ""
                        # get all defined boundaryConditions from constants-dict save as bcTypes
                        bcTypesAll = bcTagsClassReferences.keys()
                        bcTypes = []
                        for bcType in bcTypesAll: 
                            if "_" is not bcType[0]:
                                bcTypes.append(bcType)
                        bcTypes.sort()
                        # show all boundaryConditions in the bcTypes
                        index = 0
                        for key in bcTypes:
                            print "       [",str(index).rjust(2),"]    ",key
                            index = index+1
                        # get user input and check if it was correct to define the bcType 
                        existing = False
                        inputType = raw_input ("      choose type ")
                        while True:
                            # check if right input
                            try:
                                inputType = int(inputType)
                                if inputType in np.linspace(0,len(bcTypes)-1,len(bcTypes)):
                                    break
                                else:
                                    existing = True
                            # if not int but string
                            except ValueError:
                                print "      TYPE-ERROR: vessel id must be type(int) not type(string)"
                                inputType = (raw_input ("      choose type "))
                            # if int but to low or high
                            if existing == True:
                                print "       the type does not exist"
                                inputType = (raw_input ("      choose type "))
                                existing = False
                        
                        bcType = bcTypes[int(inputType)] 
                        
                        boundaryInstance = eval(bcTagsClassReferences[bcType])()
                        boundaryDataDict = {}
                        boundaryDataDict['name']= bcType
                        
                        print ""
                        print "      set values for the BC condition: ", bcType
                        print "          enter 'b' for the first value to skip this procedure"
                        question = True
                        for arg in bcTags[bcType]:
                            if question == True: 
                                currValue = raw_input (str("            set value for "+str(arg)+' '))
                                if currValue == 'b': question=False
                                test = True
                                try: float(currValue)
                                except:
                                    print '            VALUE or TYPE ERROR, set to None'
                                    test = False
                                if test == True: boundaryDataDict[arg] = (float(currValue))
                                else: boundaryDataDict[arg] = None
                            else: boundaryDataDict[arg] = None
                        if len(vascularNetwork.boundaryConditions.keys()) == 1:
                            print "      set position of the BC condition"
                            position = '2'
                            while position not in ['1','0']:
                                position = raw_input ("          enter '0' for the start or '1' for the end of the vessel ")
                            if position == '1':
                                #bcType = ''.join(['_',bcType])
                                boundaryDataDict['name']= ''.join(['_',bcType])
                        
                        print bcType,boundaryDataDict
                        
                        boundaryInstances = []
                        boundaryInstance.update(boundaryDataDict)
                        boundaryInstances.append(boundaryInstance)
                        
                        if vesselId not in vascularNetwork.boundaryConditions.keys():
                            vascularNetwork.boundaryConditions[vesselId] = boundaryInstances
                        else:
                            vascularNetwork.boundaryConditions[vesselId].extend(boundaryInstances)
                        
                        #if vascularNetwork.getVariableValue('root') != None:
                        mainGraph.update_graph(vascularNetwork, window)
                        subMenuInput = ''
                            
                    
                    elif subMenuInput == '3' and vascularNetwork.root != []:
                        print "     delete boundary condition"
                        print ""
                        pprint.pprint(vascularNetwork.boundaryConditions)
                        
                        vesselId = -1
                        while vesselId not in vascularNetwork.boundaryConditions.keys():
                            vesselId = int(raw_input ("      choose vessel id "))
                        
                        bcs = vascularNetwork.boundaryConditions[vesselId]
                        if bcs != []:                 
                            print ""
                            index = 0
                            for bc in bcs:
                                print "       [",str(index).rjust(2),"]    ",bc.name
                                index = index+1
                            print ""
                            inType = '0'
                            while inType not in np.linspace(0,len(bcs)-1,len(bcs)):
                                inType = int(raw_input ("      choose condition to delete "))
                             
                            print ""
                            print "     boundary condition ",bcs[inType]," removed!"
                            print ""
                            vascularNetwork.boundaryConditions[vesselId].remove(bcs[inType])
                            
                            mainGraph.update_graph(vascularNetwork, window)
                        else:
                            print "     nothing to delete!"
                        subMenuInput = ''
                    
                    elif subMenuInput == '4' and vascularNetwork.root != []:
                        print "     load  boundary conditions from CSV"
                        print ""
                        filename = enterFilename(filename,'')
                        boundaryConditions,boundaryConditionPolyChaos = readBCFromCSV(filename = ''.join([filename,'BC','.csv']))
                        vascularNetwork.update({'boundaryConditions':boundaryConditions,
                                                'boundaryConditionPolyChaos':boundaryConditionPolyChaos})
                        
                        mainGraph.update_graph(vascularNetwork, window)
                                                                
                    elif subMenuInput == '5' and vascularNetwork.root != []:
                        print "     write boundary conditions to CSV"
                        print ""
                        filename = enterFilename(filename,'')
                        boundaryConditions = vascularNetwork.getVariableValue('boundaryConditions')
                        boundaryConditionPolyChaos = deepcopy(vascularNetwork.getVariableValue('boundaryConditionPolyChaos'))
                        writeBCToCSV(boundaryConditions,boundaryConditionPolyChaos,filename = ''.join([filename,'BC','.csv']))         
                        
                    elif subMenuInput == 'b':
                        break
        
        elif menuInput == "f":
            
            subMenuInput = ''
            while  subMenuInput not in ["1","2","b"]:
                print ""
                print "    sub menu: set global fluid properties"
                print ""
                print "     [1] - set all"
                print "     [2] - set individual"
                print "     [b] - back to the main menu"
                print ""
                print "    current fluid properties:"
                for key,value in vascularNetwork.globalFluid.iteritems():
                    print "     {0:20}     {1:10}  {2:10}".format(key,value,variableUnits[key])
                print ""
                subMenuInput = raw_input("    what to do? ")
                
                if subMenuInput == '1':
                    print "     set all fluid properties"
                    
                    for key in vascularNetwork.globalFluid.keys():
                        inputType = "1"
                        typeFalse = False
                        while typeFalse == False:
                            try: 
                                inputType = raw_input("      type value for property: {} with unit {} : ".format(key,variableUnits[key]))
                                inputType = float(inputType)
                                typeFalse = True
                                vascularNetwork.globalFluid[key] = inputType
                            except: pass
                    subMenuInput = ''
                    
                elif subMenuInput == '2':
                    print "     set individual fluid property:"
                    i = 0
                    properties = vascularNetwork.globalFluid.keys()
                    for property_i in properties:
                        print "          [",i,'] - ',property_i
                        i = 1+i
                    inputType = 0
                    while inputType not in [str(i) for i in range(0,len(properties))]:
                        inputType = raw_input("      choose property to set ")
                    
                    inputProperty = ""   
                    inputFalse = False
                    while inputFalse == False:
                        try: 
                            inputProperty = raw_input("      type value for property: {} with unit {} : ".format(properties[int(inputType)],variableUnits[properties[int(inputType)]]))
                            inputProperty = float(inputProperty)
                            vascularNetwork.globalFluid[properties[int(inputType)]] = inputProperty
                            inputFalse = True
                        except: pass
                    subMenuInput = ''
                     
                elif subMenuInput == 'b':
                    break
                
            
        elif menuInput == "l":
            try:
                FILE = open('.recentFilenames.pickle',"rb")
                # store pickle
                recentFilenames = cPickle.load(FILE)
                FILE.close()
            except:
                recentFilenames = []
                
            subMenuInput = ''
            print ""
            print "    sub menu: load data"
            print ""
            print "     [1] - load network from XML"
            print "     [2] - load vessel data from CSV"
            print "     [3] - load vessel data and boundary conditions from CSV"
            print "     [4] - load network from SolutionData"
            print "     [b] - back to the main menu"
            print ""
            while  subMenuInput not in ["1","2","3","b"]:
                subMenuInput = raw_input("what to do? ")
            
                print ""
                print "         resent used networks"
                i = 1
                for name in recentFilenames:
                    print "          [",i,'] - ',name
                    i = 1+i
                print ""
                if subMenuInput == '1':
                    print "     load from XML"
                    
                    filename = enterFilename(filename,'.xml',recentFilenames = recentFilenames)
                    if filename == None:break
                    # delete the old network
                    del vascularNetwork
                    #load the new network
                    vascularNetwork = loadNetworkFromXML(filename= filename)
                    if vascularNetwork == None:
                        mainGraph.update_graph(None, window)
                        vascularNetwork = VascularNetwork()
                        filename = None
                        break
                    mainGraph.update_graph(vascularNetwork, window)
                    filename, value = filename.split(".",1)
                    break
                
                elif subMenuInput == '2':
                    print "     load vessel data from CSV - non existing vessels are added automatically"
                    print ""
                    filename = enterFilename(filename,'.csv',recentFilenames = recentFilenames)
                    if filename == None:break
                    vascularNetwork.updateNetwork(readVesselDataFromCSV(filename=filename))
                    
                    mainGraph.update_graph(vascularNetwork, window)
                    filename, value = filename.split(".",1)
                    break
                
                elif subMenuInput == '3':
                    print "     load vessel data and boundary conditions from CSV"
                    filename = enterFilename(filename,'.csv',recentFilenames = recentFilenames)
                    if filename == None:break
                    vascularNetwork.updateNetwork(readVesselDataFromCSV(filename=filename))
                    mainGraph.update_graph(vascularNetwork, window)
                    
                    
                    filename, value = filename.split(".",1)
                    boundaryConditions,boundaryConditionPolyChaos = readBCFromCSV(filename = ''.join([filename,'BC','.csv']))
                    vascularNetwork.update({'boundaryConditions':boundaryConditions,
                                            'boundaryConditionPolyChaos':boundaryConditionPolyChaos})
                    
                    mainGraph.update_graph(vascularNetwork, window)
                    break
                
                elif subMenuInput == '4':
                    print "     load network from SolutionData"
                    try:
                        networkName,dataSetNumber = chooseSolutionDataCase()
                        vascularNetwork,solData,Description = loadSolutionDataFile(networkName,[dataSetNumber])
                        mainGraph.update_graph(vascularNetwork, window)
                        
                        filename, value = filename.split(".",1)
                    except: " ERROR occured could not open requested network, maybe the class description is out dated"
                    break
                
                elif subMenuInput == 'b':
                    break
            
            if filename != None:    
                if filename not in recentFilenames: recentFilenames.insert(0,filename)
                else: 
                    recentFilenames.remove(filename)
                    recentFilenames.insert(0,filename)
                if len(recentFilenames) > 9: recentFilenames.pop(-1)
                            
                FILE = open('.recentFilenames.pickle',"w")
                # store pickle
                cPickle.dump(recentFilenames, FILE, protocol=2)
                FILE.close()
            
        elif menuInput == "s":
            subMenuInput = ''
            print ""
            print "    sub menu: save data"
            print ""
            print "     [1] - write to XML"
            print "     [2] - write vessel data to CSV"
            print "     [3] - write vessel data and boundary conditions to CSV"
            print "     [4] - write graph to .png and .dot files"
            print "     [b] - back to the main menu"
            print ""
            while subMenuInput not in ["1","2","3","b"]:
                subMenuInput = raw_input("what to do? ")
                     
                if subMenuInput == '1':
                    print "     write to XML"
                    filename = enterFilename(filename,'.xml')
                    if filename == None:break
                    writeNetworkToXML(vascularNetwork,filename = filename)
                    filename, value = filename.split(".",1)
                    break
                    
                elif subMenuInput == '2':
                    print "     write vessel data to CSV"
                    filename = enterFilename(filename,'.csv') 
                    if filename == None:break
                    writeVesselDataToCSV(vessels = vascularNetwork.vessels, filename = filename)
                    filename, value = filename.split(".",1)
                    break
                
                elif subMenuInput == '3':
                    print "     write vessel data and boundary conditions to CSV"
                    filename = enterFilename(filename,'.csv') 
                    if filename == None:break
                    writeVesselDataToCSV(vessels = vascularNetwork.vessels, filename = filename)
                    filename, value = filename.split(".",1)
                    boundaryConditions = vascularNetwork.getVariableValue('boundaryConditions')
                    boundaryConditionPolyChaos = deepcopy(vascularNetwork.getVariableValue('boundaryConditionPolyChaos'))
                    writeBCToCSV(boundaryConditions,boundaryConditionPolyChaos,filename = ''.join([filename,'BC','.csv']))  
                    break
                
                elif subMenuInput == '4':
                    print "     write graph to .png and .dot files"
                    pictureName = str(raw_input("     enter pictureName (only!):"))
                    if pictureName == "":
                        pictureName = 'pydotTest'
                    mainGraph.graph.write(graphPath+filename+'/'+pictureName+'.dot')
                    mainGraph.graph.write_png(graphPath+filename+'/'+pictureName+'.png')
                    break
                    
                if subMenuInput == 'b':
                    break
        
        elif menuInput == "u":
            subMenuInput = ''
            print ""
            print "    sub menu: update XML from CSV"
            print ""
            print "     load from XML"
            
            filename = enterFilename(filename,'.xml')
            if filename == None:break
            # delete the old network
            del vascularNetwork
            #load the new network
            vascularNetwork = loadNetworkFromXML(filename= filename)
            if vascularNetwork == None:
                vascularNetwork = VascularNetwork()
                break
            
            mainGraph.update_graph(vascularNetwork, window)
            
            filename, value = filename.split(".",1)
            
            print "     load vessel data from CSV - non existing vessels are added automatically"
            filenameCSV = ''.join([filename,'.csv'])
            vascularNetwork.updateNetwork(readVesselDataFromCSV(filename=filenameCSV))
            print "     load boundaryData from csv as well? press [u]" 
            subMenuInput = raw_input("yes [u]? ")
            if subMenuInput == 'u':
                boundaryConditions,boundaryConditionPolyChaos = readBCFromCSV(filename = ''.join([filename,'BC','.csv']))
                vascularNetwork.update({'boundaryConditions':boundaryConditions,
                                        'boundaryConditionPolyChaos':boundaryConditionPolyChaos})          
            
            try: mainGraph.update_graph(vascularNetwork, window)
            except:mainGraph.update_graph(None, window)
            
            print "     write to XML"
            filenameXML = ''.join([filename,'.xml'])
            writeNetworkToXML(vascularNetwork,filename = filenameXML)
def main():
    # set graphs directory
    graphPath = str(cur+'/../vascular1Dflow_v0.2/NetworkFiles/')
    
    # create a new window
    window = MyDotWindow()    
    window.connect('destroy',gtk.main_quit)
    window.show()
    
    #create the main graph instance of a graph class
    mainGraph = Graph()
    
    #START THE MAIN LOOP
    menuInput = ""
    subMenuInput = ''
    
    # create vascularNetwork instance
    vascularNetwork = VascularNetwork()
    filename = None
    networkTopologyMode = True
    networkTopologyModes = {0: 'node Description', 1:'mother-daugther Description'}
    k = None
    while menuInput != "q":
        menuInput = ""
        print ""
        print "vnc 2.1 - menu"
        print ""
        print " [a] - add vessel to network"
        print " [d] - delete vessel in network"
        print " [n] - new network"
        print " [b] - set boundary conditions"
        print " [l] - load network"
        print " [s] - save network"
        print " [u] - update XML form CSV file"
        print " [g] - print network graph"
        print " [f] - print network informations"
        print " [m] - change network topology mode; current: ", networkTopologyModes[networkTopologyMode]
        print " [q] - quit"
        print ""
        print '  current network: ', filename
        while  menuInput not in ("l","b","q","a","s","g","f","d","u",'n','m'): #(menuInput != "l") and (menuInput != "b") and (menuInput != "q") and (menuInput != "a") and (menuInput != "s") and (menuInput != "g") and (menuInput != "d") and (menuInput != "f"):
            menuInput = raw_input("what to do? ")
        
        if menuInput == "a": 
            print "Add new vessel"
            
            existing = False
            vesselID = raw_input(" enter the vessel id:  ")
            while True:
                try:
                     vesselID = int(vesselID)
                     if vesselID not in vascularNetwork.vessels:
                         break
                     else:
                         existing = True
                except ValueError:
                    print "TYPE-ERROR: vessel id must be type(int) not type(string)"
                    vesselID = raw_input(" enter non existing id: ")
                if existing == True:
                    print " the vessel id exists already enter a new one"
                    vesselID = raw_input(" enter non existing id: ")
                    existing = False
            
            
            if not networkTopologyMode:
                # define start node ony bifurctaion are allowed
                startNode = int(raw_input(" enter starting node:  "))
                while bifTest(vascularNetwork.vessels, startNode) == False:
                    print "   only bifurcations possible!"
                    startNode = int(raw_input(" enter starting node:  "))
                # define end node
                endNode = int(raw_input (" enter ending node:    "))
                # create vessel obj and save them in vessels-dict
                
                dataDict = {'end': endNode, 'start': startNode}
                vascularNetwork.addVessel(vesselID, dataDict)
                
            else:
                if vascularNetwork.vessels != {}:
#                    mother = int(raw_input(" enter existing mother id:  "))
#                    while mother not in vascularNetwork.vessels or (mother in vascularNetwork.vessels and vascularNetwork.vessels[mother].rightDaughter != None):
#                        if mother not in vascularNetwork.vessels: print " there exists no vessel with this ID"
#                        else: print "   only bifurcations possible!"
#                        mother = int(raw_input(" enter existing mother id: "))
                        
                    existing = False
                    mother = raw_input(" enter existing mother id:  ")
                    while True:
                        try:
                             mother = int(mother)
                             if mother in vascularNetwork.vessels and vascularNetwork.vessels[mother].rightDaughter == None:
                                 break
                             else:
                                 existing = True
                        except ValueError:
                            print "TYPE-ERROR: mother id must be type(int) not type(string)"
                            mother = raw_input(" enter existing mother id:  ")
                        if existing == True:
                            if mother not in vascularNetwork.vessels: print " there exists no vessel with this id"
                            else: print "   only bifurcations possible!"
                            mother = raw_input(" enter existing mother id:  ")
                            existing = False
                        
                    if vascularNetwork.vessels[mother].leftDaughter == None: vascularNetwork.vessels[mother].leftDaughter = vesselID
                    else: vascularNetwork.vessels[mother].rightDaughter = vesselID
                    vascularNetwork.vessels[mother].end = None
                
                vascularNetwork.addVessel(vesselID)
            mainGraph.update_graph(vascularNetwork, window)
                    
        if menuInput == "d":
            print "Delete a vessel and all its daugthers"
            if vascularNetwork.vessels.keys() != []:
                
#                vesselID = int(raw_input(" enter the vessel id: "))
#                while (vesselID in vascularNetwork.vessels) == False:
#                    print " the vessel does not exist"
#                    vesselID = int(raw_input(" enter existing vessel id: "))
                
                existing = False
                vesselID = raw_input(" enter existing vessel id: ")
                while True:
                    try:
                         vesselID = int(vesselID)
                         if vesselID in vascularNetwork.vessels:
                             break
                         else:
                             existing = True
                    except ValueError:
                        print "TYPE-ERROR: vessel id must be type(int) not type(string)"
                        vesselID = raw_input(" enter existing vessel id: ")
                    if existing == True:
                        print " the vessel does not exist"
                        vesselID = raw_input(" enter existing vessel id: ")
                        existing = False
                
                #travers the tree starting with the vessel and collect all ids
                toDelete = findAllDaughters(vascularNetwork,vesselID)
                
                toDelete.append(vesselID)
                for vesselToDelete in toDelete:
                    vascularNetwork.deleteVessel(vesselToDelete)
                    
                # empty the graph to redraw it
                mainGraph.update_graph(vascularNetwork, window)
                
            else:
                print " there are no vessels to delete"
                
        elif menuInput == "n":
            print "new network"
            question = raw_input(" are u sure to delete all current data? [n] - yes: ")
            if question == 'n':
                # delet vascularNetwork
                del vascularNetwork
                # create vascularNetwork instance
                vascularNetwork = VascularNetwork()
                mainGraph.update_graph(vascularNetwork, window)
            
        elif menuInput == "m":
            networkTopologyMode = not networkTopologyMode
        
        elif menuInput == "f":
            vascularNetwork.showVessels()
            vascularNetwork.showNetwork()
            vascularNetwork.calculateNetworkResistance()
            
            
        elif menuInput == "g":
            print mainGraph.getGraph()
            
        elif menuInput == "b":
            subMenuInput = ''
            
            print 'create/load/save/delete/show BoundaryCondistions, not implemented yet'
#           
#            while  subMenuInput not in ['1','2','3','4','5','b']:         
#                # evaluate boundarys in Network
#                boundarys = []
#                notDefinedBoundarys = []
#                
#                boundarys.extend(vascularNetwork.ends)
#                if vascularNetwork.root != [] and vascularNetwork.root[0] not in boundarys: 
#                    boundarys.extend(vascularNetwork.root)
#                    
#                boundarysSaved = vascularNetwork.boundaryConditions.keys()
#                
#                # update saved boundary conditions
#                for boundarysCurrent in boundarys:
#                    if boundarysCurrent not in boundarysSaved:
#                        print " boundary added to vascularNetwork"
#                        vascularNetwork.boundaryConditions[boundarysCurrent] = {}
#                        boundarysSaved.append(boundarysCurrent)
#                        
#                    if vascularNetwork.boundaryConditions[boundarysCurrent] == {}:
#                        notDefinedBoundarys.append(boundarysCurrent)
#                    
#                nonBoundarys = list(set(boundarys).symmetric_difference(set(boundarysSaved)))
#                for nonBoundary in nonBoundarys:
#                    print " boundary removed from vacularNetwork"
#                    del(vascularNetwork.boundaryConditions[nonBoundary])
#                    if nonBoundary in notDefinedBoundarys: notDefinedBoundarys.remove(nonBoundary)
#                    
#                vascularNetwork.evaluateConnections()
#                print ""
#                print "    sub menu: boundary conditions"
#                print ""
#                print "     [1] - show  boundary conditions"
#                print "     [2] - add   boundary condition "
#                print "     [3] - del   boundary condition "
#                print "     [4] - load  boundary conditions from CSV"
#                print "     [5] - write boundary conditions to CSV"
#                print "     [b] - back to the main menu"
#                print ""     
#                subMenuInput = raw_input("     what to do? ") 
#                
#                if subMenuInput == '1':
#                    print "     boundary conditions"
#                    pprint.pprint(vascularNetwork.boundaryConditions)
#                    subMenuInput = ''
#                    
#                elif subMenuInput == '2' and vascularNetwork.root != []:
#                    
#                    print "     add   boundary condition"
#                    print ""
#                    
#                    definedBoundarys = list(set(notDefinedBoundarys).symmetric_difference(set(vascularNetwork.boundaryConditions.keys())))
#                    print "     vessels with defined boundary condition:"
#                    print "       ",'  '.join(str(i) for i in definedBoundarys)
#                    
#                    print "     vessels with undefined boundary condition:"
#                    print "       ",'  '.join(str(i) for i in notDefinedBoundarys)
#                    print ""
#                                        
#                    existing = False
#                    vesselID = raw_input(" enter existing vessel id: ")
#                    while True:
#                        try:
#                             vesselID = int(vesselID)
#                             if vesselID in vascularNetwork.vessels:
#                                 break
#                             else:
#                                 existing = True
#                        except ValueError:
#                            print " TYPE-ERROR: vessel id must be type(int) not type(string)"
#                            vesselID = raw_input(" enter existing vessel id: ")
#                        if existing == True:
#                            print " the vessel does not exist"
#                            vesselID = raw_input(" enter existing vessel id: ")
#                            existing = False
#                    
#                    
#                    inType = '0'
#                    print "     add boundary condition type"
#                    print ""
#                    print "      'Qa'   'Q2a'   'Qm'   'Q2m'   'Pa'    'P2a'   'Pm'   'P2m'   'Ue' "
#                    print "       [1]    [2]    [3]     [4]     [5]     [6]     [7]    [8]     [9]"
#                    print ""
#                    print "      'Rt'    'R'    'WK2'  'WK3'   'QPhy'  'Lnet'  'Fou'   'D'    'PhyQ' "
#                    print "      [10]    [11]   [12]    [13]    [14]    [15]    [16]   [17]    [18]"
#                    print ""
#                    
#                    types = ['Qa','Q2a','Qm','Q2m','Pa','P2a','Pm','P2m','Ue','Rt','R','WK2','WK3','QPhy','Lnet','Fou','D','PhyQ']
#                    
#                    existing = False
#                    inType = raw_input ("      choose type ")
#                    while True:
#                        try:
#                             inType = int(inType)
#                             if inType in np.linspace(1,18,18):
#                                 break
#                             else:
#                                 existing = True
#                        except ValueError:
#                            print "      TYPE-ERROR: vessel id must be type(int) not type(string)"
#                            inType = (raw_input ("      choose type "))
#                        if existing == True:
#                            print "       the type does not exist"
#                            inType = (raw_input ("      choose type "))
#                            existing = False
#                    
#                    
#                    type = types[int(inType)-1]
#                     
#                    bcTags = {'Rt':['Rt'],
#                              'R':['Rc'],
#                              'WK2':['Rc','C'],
#                              'WK3':['Rc','C','R1','RT'],
#                              'QPhy':['Q0_a','Npulse','freq','Tpulse','Tspace'],
#                              'Qa':['Q0_a','Npulse','freq'],
#                              'Q2a':['Q0_a','Npulse','freq','Tpulse'],
#                              'Qm':['Q0_m','Tmean','Traise'],
#                              'Q2m':['Q0_m','Tmean','Traise'],
#                              'Ue':['Upeak','C','Traise'],
#                              'Pa':['P0_a','Npulse','freq'],
#                              'P2a':['P0_a','Npulse','freq','Tpulse'],
#                              'Pm':['P0_m','Tmean','Traise'],
#                              'P2m':['P0_m','Tmean','Traise'],
#                              'Fou':['P0_m','Tmean','Traise','scale','Npulse','Tpulse'],
#                              'D':[''],
#                              'PhyQ':[''],
#                              'Lnet':['Z','C']}
#                    
#                    
#                    bcList = []
#                    print "      set values for the BC condition"
#                    print "          enter 'b' for the first value to skip this procedure"
#                    question = True
#                    for arg in bcTags[type]:
#                        if question == True: 
#                            currValue = raw_input (str("            set value for "+str(arg)+' '))
#                            if currValue == 'b': question=False
#                            test = True
#                            try: float(currValue)
#                            except:
#                                print '            VALUE or TYPE ERROR, set to None'
#                                test = False
#                            if test == True: bcList.append(float(currValue))
#                            else: bcList.append(None)
#                        else: bcList.append(None)
#                    if len(vascularNetwork.boundaryConditions.keys()) == 1:
#                        print "      set position of the BC condition"
#                        position = '2'
#                        while position not in ['1','0']:
#                            position = raw_input ("          enter '0' for the start or '1' for the end of the vessel ")
#                        if position == '1':
#                            type = ''.join(['_',type])
#                    
#                    vascularNetwork.boundaryConditions[vesselID].update({type : bcList})
#                    mainGraph.update_graph(vascularNetwork, window)
#                    subMenuInput = ''
#                        
#                elif subMenuInput == '3' and vascularNetwork.root != []:
#                    print "     delete boundary condition"
#                    print ""
#                    pprint.pprint(vascularNetwork.boundaryConditions)
#                    
#                    vesselID = -1
#                    while vesselID not in vascularNetwork.boundaryConditions.keys():
#                        vesselID = int(raw_input ("      choose vessel id "))
#                    
#                    bcs = vascularNetwork.boundaryConditions[vesselID].keys()
#                    if bcs != []:                 
#                        print ""
#                        print '        ','  '.join(str(' '+i+' ') for i in bcs)
#                        print '        ','   '.join(str('['+str(int(i))+']') for i in np.linspace(1,len(bcs),len(bcs)))
#                        print ""
#                        inType = '0'
#                        while inType not in np.linspace(1,len(bcs),len(bcs)):
#                            inType = int(raw_input ("      choose condition to delete "))
#                            
#                        vascularNetwork.boundaryConditions[vesselID].pop(bcs[inType-1])
#                        print ""
#                        print "     boundary condition ",bcs[inType-1]," removed!"
#                        print ""
#                        mainGraph.update_graph(vascularNetwork, window)
#                    else:
#                        print "     nothing to delete!"
#                    subMenuInput = ''
#                
#                elif subMenuInput == '4' and vascularNetwork.root != []:
#                    
#                    print "     load  boundary conditions from CSV"
#                    print ""
#                    filename = enterFilename(filename,'')
#                    vascularNetwork.boundaryConditions = readBCFromCSV(filename = ''.join([filename,'BC','.csv']))
#                    mainGraph.update_graph(vascularNetwork, window)
#                                                           
#                elif subMenuInput == '5' and vascularNetwork.root != []:
#                    print "     write boundary conditions to CSV"
#                    print ""
#                    filename = enterFilename(filename,'')
#                    writeBCToCSV(vascularNetwork.boundaryConditions,filename = ''.join([filename,'BC','.csv']))
#                                                         
#                    
#                elif subMenuInput == 'b':
#                    break
            
        elif menuInput == "l":
            try:
                FILE = open('recentFilenames.pickle',"rb")
                # store pickle
                recentFilenames = cPickle.load(FILE)
                FILE.close()
            except:
                recentFilenames = []
                
            subMenuInput = ''
            print ""
            print "    sub menu: load data"
            print ""
            print "     [1] - load network from XML"
            print "     [2] - load vessel data from CSV"
            print "     [3] - load vessel data and boundary conditions from CSV"
            print "     [b] - back to the main menu"
            print ""
            while  subMenuInput not in ["1","2","3","b"]:
                subMenuInput = raw_input("what to do? ")
            
                print ""
                print "         resent used networks"
                i = 1
                for name in recentFilenames:
                    print "          [",i,'] - ',name
                    i = 1+i
                print ""
                if subMenuInput == '1':
                    print "     load from XML"
                    
                    filename = enterFilename(filename,'.xml',recentFilenames = recentFilenames)
                    if filename == None:break
                    # delete the old network
                    del vascularNetwork
                    #load the new network
                    vascularNetwork = loadNetworkFromXML(filename= filename)
                    if vascularNetwork == None:
                        vascularNetwork = VascularNetwork()
                        mainGraph.update_graph(vascularNetwork, window)
                        filename = None
                        break
                    
                    mainGraph.update_graph(vascularNetwork, window)
                    filename, value = filename.split(".",1)
                    break
                
                elif subMenuInput == '2':
                    print "     load vessel data from CSV - non existing vessels are added automatically"
                    print ""
                    filename = enterFilename(filename,'.csv',recentFilenames = recentFilenames)
                    if filename == None:break
                    vascularNetwork.updateNetwork(readVesselDataFromCSV(filename=filename))
                    
                    mainGraph.update_graph(vascularNetwork, window)
                    filename, value = filename.split(".",1)
                    break
                
                elif subMenuInput == '3':
                    print "     load vessel data and boundary conditions from CSV"
                    filename = enterFilename(filename,'.csv',recentFilenames = recentFilenames)
                    if filename == None:break
                    vascularNetwork.updateNetwork(readVesselDataFromCSV(filename=filename))
                    mainGraph.update_graph(vascularNetwork, window)
                    filename, value = filename.split(".",1)
                    
                    vascularNetwork.boundaryConditions = readBCFromCSV(filename = ''.join([filename,'BC','.csv']))
                    mainGraph.update_graph(vascularNetwork, window)
                    break
                
                elif subMenuInput == 'b':
                    break
            
            if filename != None:    
                if filename not in recentFilenames: recentFilenames.insert(0,filename)
                else: 
                    recentFilenames.remove(filename)
                    recentFilenames.insert(0,filename)
                if len(recentFilenames) > 5: recentFilenames.pop(-1)
                            
                FILE = open('recentFilenames.pickle',"w")
                # store pickle
                cPickle.dump(recentFilenames, FILE, protocol=2)
                FILE.close()
            
        elif menuInput == "s":
            subMenuInput = ''
            print ""
            print "    sub menu: save data"
            print ""
            print "     [1] - write to XML"
            print "     [2] - write vessel data to CSV"
            print "     [3] - write vessel data and boundary conditions to CSV"
            print "     [4] - write graph to .png and .dot files"
            print "     [b] - back to the main menu"
            print ""
            while subMenuInput not in ["1","2","3","b"]:
                subMenuInput = raw_input("what to do? ")
                     
                if subMenuInput == '1':
                    print "     write to XML"
                    filename = enterFilename(filename,'.xml')
                    if filename == None:break
                    writeNetworkToXML(vascularNetwork,filename = filename)
                    filename, value = filename.split(".",1)
                    break
                    
                elif subMenuInput == '2':
                    print "     write vessel data to CSV"
                    filename = enterFilename(filename,'.csv') 
                    if filename == None:break
                    writeVesselDataToCSV(vessels = vascularNetwork.vessels, filename = filename)
                    filename, value = filename.split(".",1)
                    break
                
                elif subMenuInput == '3':
                    print "     write vessel data and boundary conditions to CSV"
                    filename = enterFilename(filename,'.csv') 
                    if filename == None:break
                    writeVesselDataToCSV(vessels = vascularNetwork.vessels, filename = filename)
                    filename, value = filename.split(".",1)
                    writeBCToCSV(vascularNetwork.boundaryConditions,filename = ''.join([filename,'BC','.csv']))
                    break
                
                elif subMenuInput == '4':
                    print "     write graph to .png and .dot files"
                    pictureName = str(raw_input("     enter pictureName (only!):"))
                    if pictureName == "":
                        pictureName = 'pydotTest'
                    mainGraph.graph.write(graphPath+filename+'/'+pictureName+'.dot')
                    mainGraph.graph.write_png(graphPath+filename+'/'+pictureName+'.png')
                    break
                    
                if subMenuInput == 'b':
                    break
        
        elif menuInput == "u":
            subMenuInput = ''
            print ""
            print "    sub menu: update XML from CSV"
            print ""
            print "     load from XML"
            
            filename = enterFilename(filename,'.xml')
            if filename == None:break
            # delete the old network
            del vascularNetwork
            #load the new network
            vascularNetwork = loadNetworkFromXML(filename= filename)
            if vascularNetwork == None:
                vascularNetwork = VascularNetwork()
                break
            
            mainGraph.update_graph(vascularNetwork, window)
            
            filename, value = filename.split(".",1)
            
            print "     load vessel data from CSV - non existing vessels are added automatically"
            filenameCSV = ''.join([filename,'.csv'])
            vascularNetwork.updateNetwork(readVesselDataFromCSV(filename=filenameCSV))
            
            mainGraph.update_graph(vascularNetwork, window)
            
            print "     write to XML"
            filenameXML = ''.join([filename,'.xml'])
            writeNetworkToXML(vascularNetwork,filename = filenameXML)