Moved system commands from hooke_cli to plugin.system.
[hooke.git] / hooke / libhooke.py
old mode 100755 (executable)
new mode 100644 (file)
index 73534f2..a1d623f
@@ -1,4 +1,6 @@
 #!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
 '''
 libhooke.py
 
@@ -10,8 +12,6 @@ With algorithms contributed by Francesco Musiani (University of Bologna, Italy)
 This program is released under the GNU General Public License version 2.
 '''
 
-import libhookecurve as lhc
-
 import scipy
 import numpy
 import xml.dom.minidom
@@ -20,237 +20,20 @@ import os.path
 import string
 import csv
 
-HOOKE_VERSION=['0.8.3_devel', 'Seinei', '2008-04-16']
-WX_GOOD=['2.6','2.8']
-
-class PlaylistXML(object):
-        '''
-        This module allows for import/export of an XML playlist into/out of a list of HookeCurve objects
-        '''
-
-        def __init__(self):
-
-            self.playlist=None #the DOM object representing the playlist data structure
-            self.playpath=None #the path of the playlist XML file
-            self.plaything=None
-            self.hidden_attributes=['curve'] #This list contains hidden attributes that we don't want to go into the playlist.
-
-        def export(self, list_of_hooke_curves, generics):
-            '''
-            Creates an initial playlist from a list of files.
-            A playlist is an XML document with the following syntaxis:
-            <playlist>
-            <element path="/my/file/path/"/ attribute="attribute">
-            <element path="...">
-            </playlist>
-            '''
-
-            #create the output playlist, a simple XML document
-            impl=xml.dom.minidom.getDOMImplementation()
-            #create the document DOM object and the root element
-            newdoc=impl.createDocument(None, "playlist",None)
-            top_element=newdoc.documentElement
-
-            #save generics variables
-            playlist_generics=newdoc.createElement("generics")
-            top_element.appendChild(playlist_generics)
-            for key in generics.keys():
-                newdoc.createAttribute(key)
-                playlist_generics.setAttribute(key,str(generics[key]))
-
-            #save curves and their attributes
-            for item in list_of_hooke_curves:
-                #playlist_element=newdoc.createElement("curve")
-                playlist_element=newdoc.createElement("element")
-                top_element.appendChild(playlist_element)
-                for key in item.__dict__:
-                    if not (key in self.hidden_attributes):
-                        newdoc.createAttribute(key)
-                        playlist_element.setAttribute(key,str(item.__dict__[key]))
-
-            self.playlist=newdoc
-
-        def load(self,filename):
-            '''
-            loads a playlist file
-            '''
-            myplay=file(filename)
-            self.playpath=filename
-
-            #the following 3 lines are needed to strip newlines. otherwise, since newlines
-            #are XML elements too (why?), the parser would read them (and re-save them, multiplying
-            #newlines...)
-            #yes, I'm an XML n00b
-            the_file=myplay.read()
-            the_file_lines=the_file.split('\n')
-            the_file=''.join(the_file_lines)
-
-            self.playlist=xml.dom.minidom.parseString(the_file)
-
-            #inner parsing functions
-            def handlePlaylist(playlist):
-                list_of_files=playlist.getElementsByTagName("element")
-                generics=playlist.getElementsByTagName("generics")
-                return handleFiles(list_of_files), handleGenerics(generics)
-
-            def handleGenerics(generics):
-                generics_dict={}
-                if len(generics)==0:
-                    return generics_dict
-
-                for attribute in generics[0].attributes.keys():
-                    generics_dict[attribute]=generics[0].getAttribute(attribute)
-                return generics_dict
-
-            def handleFiles(list_of_files):
-                new_playlist=[]
-                for myfile in list_of_files:
-                    #rebuild a data structure from the xml attributes
-                    the_curve=lhc.HookeCurve(myfile.getAttribute('path'))
-                    for attribute in myfile.attributes.keys(): #extract attributes for the single curve
-                        the_curve.__dict__[attribute]=myfile.getAttribute(attribute)
-                    new_playlist.append(the_curve)
-
-                return new_playlist #this is the true thing returned at the end of this function...(FIXME: clarity)
-
-            return handlePlaylist(self.playlist)
-
 
-        def save(self,output_filename):
-            '''
-            saves the playlist in a XML file.
-            '''
-            try:
-                outfile=file(output_filename,'w')
-            except IOError:
-                print 'libhooke.py : Cannot save playlist. Wrong path or filename'
-                return
-
-            self.playlist.writexml(outfile,indent='\n')
-            outfile.close()
-
-
-class HookeConfig(object):
-    '''
-    Handling of Hooke configuration file
-
-    Mostly based on the simple-yet-useful examples of the Python Library Reference
-    about xml.dom.minidom
-
-    FIXME: starting to look a mess, should require refactoring
-    '''
-
-    def __init__(self, config_dir=None):
-        self.config={}
-        self.config['plugins']=[]
-        self.config['drivers']=[]
-        self.config['plotmanips']=[]
-        self.config_dir = config_dir
-       if self.config_dir == None:
-            self.config_dir = os.path.abspath(
-               os.path.join(os.path.dirname(os.path.dirname(__file__)),
-                            'conf'))
-
-    def load_config(self, filename):
-        print 'loading config file', os.path.join(self.config_dir, filename)
-        myconfig=file(os.path.join(self.config_dir, filename))
-
-        #the following 3 lines are needed to strip newlines. otherwise, since newlines
-        #are XML elements too, the parser would read them (and re-save them, multiplying
-        #newlines...)
-        #yes, I'm an XML n00b
-        the_file=myconfig.read()
-        the_file_lines=the_file.split('\n')
-        the_file=''.join(the_file_lines)
-
-        self.config_tree=xml.dom.minidom.parseString(the_file)
-
-        def getText(nodelist):
-            #take the text from a nodelist
-            #from Python Library Reference 13.7.2
-            rc = ''
-            for node in nodelist:
-                if node.nodeType == node.TEXT_NODE:
-                    rc += node.data
-            return rc
-
-        def handleConfig(config):
-            display_elements=config.getElementsByTagName("display")
-            plugins_elements=config.getElementsByTagName("plugins")
-            drivers_elements=config.getElementsByTagName("drivers")
-            workdir_elements=config.getElementsByTagName("workdir")
-            defaultlist_elements=config.getElementsByTagName("defaultlist")
-            plotmanip_elements=config.getElementsByTagName("plotmanips")
-            handleDisplay(display_elements)
-            handlePlugins(plugins_elements)
-            handleDrivers(drivers_elements)
-            handleWorkdir(workdir_elements)
-            handleDefaultlist(defaultlist_elements)
-            handlePlotmanip(plotmanip_elements)
-
-        def handleDisplay(display_elements):
-            for element in display_elements:
-                for attribute in element.attributes.keys():
-                    self.config[attribute]=element.getAttribute(attribute)
-
-        def handlePlugins(plugins):
-            for plugin in plugins[0].childNodes:
-                try:
-                    self.config['plugins'].append(str(plugin.tagName))
-                except: #if we allow fancy formatting of xml, there is a text node, so tagName fails for it...
-                    pass
-        #FIXME: code duplication
-        def handleDrivers(drivers):
-            for driver in drivers[0].childNodes:
-                try:
-                    self.config['drivers'].append(str(driver.tagName))
-                except: #if we allow fancy formatting of xml, there is a text node, so tagName fails for it...
-                    pass
-
-        def handlePlotmanip(plotmanips):
-            for plotmanip in plotmanips[0].childNodes:
-                try:
-                    self.config['plotmanips'].append(str(plotmanip.tagName))
-                except: #if we allow fancy formatting of xml, there is a text node, so tagName fails for it...
-                    pass
-
-        def handleWorkdir(workdir):
-            '''
-            default working directory
-            '''
-            wdir=getText(workdir[0].childNodes)
-            self.config['workdir']=wdir.strip()
-
-        def handleDefaultlist(defaultlist):
-            '''
-            default playlist
-            '''
-            dflist=getText(defaultlist[0].childNodes)
-            self.config['defaultlist']=dflist.strip()
-
-        handleConfig(self.config_tree)
-        #making items in the dictionary more machine-readable
-        for item in self.config.keys():
-            try:
-                self.config[item]=float(self.config[item])
-            except TypeError: #we are dealing with a list, probably. keep it this way.
-                try:
-                    self.config[item]=eval(self.config[item])
-                except: #not a list, not a tuple, probably a string?
-                    pass
-            except ValueError: #if we can't get it to a number, it must be None or a string
-                if string.lower(self.config[item])=='none':
-                    self.config[item]=None
-                else:
-                    pass
-
-        return self.config
+HOOKE_VERSION=['0.9.0_devel', 'Kenzo', '2009-09-xx']
+WX_GOOD=['2.6','2.8']
+hookeDir=''
 
 
-    def save_config(self, config_filename):
-        print 'Not Implemented.'
-        pass
+def get_file_path(filename, folders = []):
+    if os.path.dirname(filename) == '' or os.path.isabs(filename) == False:
+        path = ''
+        for folder in folders:
+            path = os.path.join(path, folder)
+        filename = os.path.join(hookeDir, path, filename)
 
+    return filename
 
 class ClickedPoint(object):
     '''
@@ -274,13 +57,12 @@ class ClickedPoint(object):
         '''
 
         #FIXME: a general algorithm using min() is needed!
-        print '---DEPRECATED FIND_GRAPH_COORDS_OLD---'
         best_index=0
         best_dist=10**9 #should be more than enough given the scale
 
         for index in scipy.arange(1,len(xvector),1):
             dist=((self.absolute_coords[0]-xvector[index])**2)+(100*((self.absolute_coords[1]-yvector[index])))**2
-                        #TODO, generalize? y coordinate is multiplied by 100 due to scale differences in the plot
+                #TODO, generalize? y coordinate is multiplied by 100 due to scale differences in the plot
             if dist<best_dist:
                 best_index=index
                 best_dist=dist
@@ -291,7 +73,7 @@ class ClickedPoint(object):
 
     def find_graph_coords(self,xvector,yvector):
         '''
-        Given a clicked point on the plot, finds the nearest point in the dataset that
+        Given a clicked point on the plot, finds the nearest point in the dataset (in X) that
         corresponds to the clicked point.
         '''
         dists=[]